用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/tomevault-io/skills-registry --skill workflow命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | workflow |
| description | > Use when this capability is needed. |
Standard operating procedures for branching, GitHub operations, CI/CD, releases, and Rust workspace scaffolding. This file is the primer + index; depth lives in the reference files at the bottom.
Scope note. This skill carries project-policy (branch names, merge strategies, plan-file structure, release pipeline behavior). Generic cargo command semantics live in the
rustskill'scargo.md. When in doubt: conventions and branch lifecycle here, manifest/workspace mechanics there.
v{x}.{y}.{z}-dev.{i}x.y.z — semver version being developed (this is the patch branch).i — sprint/phase number, 0-indexed. dev.0 is the first sprint of a new patch.v5.1.0-dev.0 is sprint 0 of patch v5.1.0.main ← released, tagged, immutable history (squash commits)
└── v{x}.{y}.{z} ← patch branch; accumulates dev.0..dev.9 via rebase
├── v{x}.{y}.{z}-dev.0 ← sprint 0 (the only one open at any time)
├── v{x}.{y}.{z}-dev.1 ← sprint 1 (cut from patch branch AFTER dev.0 merges)
└── ... ← up to dev.9 (the automated mod-10 cascade)
| Source → Target | Strategy | Why | Approval |
|---|---|---|---|
track / topic → v{x}.{y}.{z}-dev.{i} | --rebase --delete-branch | Tracks are ephemeral; keep linear sprint history | Reviewer |
v{x}.{y}.{z}-dev.{i} → v{x}.{y}.{z} | --rebase | Preserve sprint commit history as a readable tree | Operator |
v{x}.{y}.{z} → main | --squash | Releases are one commit each; triggers release.yml | Operator (explicit) |
Rules.
gh CLI over raw git for all branch/PR operations. GitHub ignores
git-originated operations w.r.t. autodelete and PR lifecycle. Fall back to
git only if gh fails.main or to a version branch. Both are operator-protected
and the release pipeline depends on linear history on main.dev.(N+1) until dev.N is merged. Parallel phase branches hide
cross-cutting drift — the phase structure exists to prevent that.feat({scope}): {description} (the version
is implicit in the head branch name).# Open sprint N
gh pr create --base "v{x}.{y}.{z}" --head "v{x}.{y}.{z}-dev.{N}" --draft
# Close sprint N: rebase-merge into patch branch
gh pr merge "v{x}.{y}.{z}-dev.{N}" --rebase --delete-branch
# Open next sprint
git checkout "v{x}.{y}.{z}"
git pull --rebase origin "v{x}.{y}.{z}"
git checkout -b "v{x}.{y}.{z}-dev.{N+1}"
git push -u origin "v{x}.{y}.{z}-dev.{N+1}"
The final sprint of a patch is followed by a squash-merge of the patch branch
into main. That squash-merge fires the automated release pipeline —
see §IV.
{type}({scope}): {description}
| Type | When |
|---|---|
feat | New capability |
fix | Bug fix |
bug | Bug report (not yet fixed) |
chore | Maintenance, version bumps |
cleanup | Dead code removal, restructuring |
refactor | Code restructuring without behavior change |
docs | Documentation-only change |
bug, enhancement, cleanup, refactor, tracking, documentation.
## Summary
- Bullet points describing what changed and why.
## Issues
- Closes #N
- Fixes #M
## Test Plan
- [ ] <project-appropriate gate 1>
- [ ] <project-appropriate gate 2>
The test plan is project-shaped. Common gates by project type:
| Project type | Gates |
|---|---|
| Marketplace / docs-only | Manual review; frontmatter lint; install-script dry run |
| Rust workspace | cargo fmt --all --check, cargo clippy --workspace --features full -- -D warnings, cargo test --workspace --features full |
| Hybrid (TS + Rust) | The Rust set plus pnpm lint && pnpm test (or equivalent) |
One milestone per patch version: v{x}.{y}.{z}. Attach every issue targeted
for that release. The automated pipeline rolls open issues forward to the
next milestone on release (see §IV.5).
# Create
gh api "repos/${OWNER}/${REPO}/milestones" --method POST -f title="v0.1.5"
# Attach
gh issue edit N --milestone "v0.1.5"
# Triage stale
gh issue close N --comment "Superseded by #M" --reason "not planned"
gh issue close N --comment "Resolved in v0.1.5" --reason "completed"
Every patch v{x}.{y}.{z} is decomposed into ordered sprints. Plans live in
.artifacts/plans/, design docs in .artifacts/docs/. (Adapt the directory
to the project; the structure is what matters.)
Drop the date prefix on versioned artifacts — use frontmatter for the date.
| File | Scope |
|---|---|
v{xyz}.plan.md | Version-level plan (roadmap across all sprints) |
v{xyz}-dev{N}.plan.md | Sprint N plan (scoped to one phase) |
v{xyz}-design.md | Version-level design doc |
v{xyz}-dev{N}-design.md | Sprint-specific design doc (if needed) |
{xyz} is the compact version (e.g., 015 = 0.1.5, 510 = 5.1.0).
Frontmatter (required on versioned plans + designs):
---
title: v0.1.5 Stability Sprint Plan
createdAt: 2026-04-14
version: v0.1.5
phase: 0 # omit for version-level plans
description: One-sentence summary. Helps skim across many plans.
---
Required keys: title, createdAt, version. Optional: phase,
description (recommended), updatedAt.
Non-versioned artifacts (audits, point-in-time research, reports) keep date-prefixed names — they're frozen in time by design:
.artifacts/reports/2026-04-14-v015-audit.md.artifacts/research/2026-04-14-quad-math-audit.mdEvery sprint plan follows the same shape. This forces critical work to land before enhancements and ensures validation ships with every sprint.
1. Critical issues — must-fix blockers, security, data loss, broken pipelines
2. Enhancements — capabilities the sprint adds
3. Optimizations — performance, cleanup, dead-code removal
4. Wiring / Interfaces — CLI/MCP/GUI surface wire-up for new behavior
5. Audit — validation: tests, manual checks, live observation
Even if a section is "N/A for this sprint" say so explicitly. Tracks within a sprint usually map to one of these five sections.
v{xyz}.plan.md is the roadmap. For each sprint, list:
dev.0, dev.1, …).1. Write v{xyz}.plan.md (version roadmap with sprint list).
2. For each sprint N:
a. Open branch v{xyz}-dev.{N} off v{xyz}.
b. Write v{xyz}-dev{N}.plan.md (the 5 sections).
c. Dispatch track PRs against v{xyz}-dev.{N}.
d. When sprint complete + audited, rebase-merge dev.N → v{xyz}. Delete dev branch.
3. When all sprints done, squash-merge v{xyz} → main (operator-approved).
4. release.yml does the rest (tag, release, next-patch, dev.0, sweep, milestone roll).
Rename historical plans cautiously. Old date-prefixed plans are historical record — leave them. Only new plans use the dateless convention.
Source of truth: .github/workflows/release.yml. Read that file if anything
below disagrees with reality — the workflow is canonical.
The pipeline runs on push to main (and on workflow_dispatch). On every
push to main it inspects the HEAD commit subject and proceeds only if it
matches:
vX.Y.Z (operator convention; gh appends (#N) on squash — tolerated), orrelease: vX.Y.Z (back-compat for automation-authored PRs).The extracted version is cross-checked against .claude-plugin/plugin.json.
A stray commit subject can't fire the pipeline against the wrong version — the
job logs ::warning:: and exits cleanly.
| # | Step | Effect |
|---|---|---|
| 1 | Detect release squash commit | Parses HEAD subject, validates against plugin.json |
| 2 | Compute next version (mod-10 cascade) | Z<9 → patch, else Y<9 → minor, else major; emits current, next, tag, branch names |
| 3 | Extract release notes from CHANGELOG.md | Slices the ## v{CURRENT} section; fails the run if missing |
| 4 | Tag v{CURRENT} on main | Idempotent: skips if tag already exists locally or on origin |
| 5 | Create GitHub Release | Idempotent: skips if release exists; uses extracted notes |
| 6 | Cut next patch branch + bump versions | Branches v{NEXT} off main; rewrites .claude-plugin/plugin.json, .claude-plugin/marketplace.json (root + every plugin entry), every skills/*/plugin.json, every skills/*/SKILL.md frontmatter version, and README.md |
| 7 | Commit + push patch branch | chore({PATCH}/version): bump plugin {CURRENT} → {NEXT} |
| 8 | Open draft PR v{NEXT} → main | Title release: v{NEXT}; the empty container for the new patch's sprints |
| 9 | Cut v{NEXT}-dev.0 off v{NEXT} | First sprint branch of the new patch, ready for work |
| 10 | Orphan sweep | Deletes v{CURRENT}-dev.{0..9} from origin |
| 11 | Milestone roll | Creates milestone v{NEXT} if missing; moves every open issue from v{CURRENT} → v{NEXT} |
Every step is idempotent — a partial prior run can be safely re-driven via
workflow_dispatch once the underlying issue is fixed.
v{x}.{y}.{z} must contain a ## v{x}.{y}.{z} section in
CHANGELOG.md. If it's missing, step 3 fails the whole run..claude-plugin/plugin.json version must equal the patch version. (The
version was set automatically when the previous release cut this patch
branch — only intervene if you renumbered manually.)main must require PR + linear history + no
force-push. The pipeline depends on git log -1 --format=%s HEAD returning
the squash subject.v{x}.{y}.{z} (preferred) or release: v{x}.{y}.{z}.
gh appends (#N) on squash; the regex tolerates that suffix.Usually: nothing. Verify the run succeeded:
gh run list --workflow=release.yml --limit 3
gh release view "v{x}.{y}.{z}"
gh pr view "v{next}" # the draft PR should exist
git fetch --prune origin # observe v{next}-dev.0 appearing
If a step failed mid-pipeline, fix the cause and re-dispatch:
gh workflow run release.yml --ref main
The idempotency guards (if tag exists, if release exists, if branch exists, if milestone exists) make re-runs safe.
Current Z | Result |
|---|---|
Z < 9 | Patch bump: (X, Y, Z+1) |
Z == 9 and Y < 9 | Minor bump: (X, Y+1, 0) |
Z == 9 and Y == 9 | Major bump: (X+1, 0, 0) |
The pipeline is named "patch pipeline" but the cascade handles all three. This is intentional — every release looks the same to the operator.
This marketplace's only workflow is release.yml. The patterns below apply
to Rust workspace projects (the axiom family); pull them in when standing
up CI for a new Rust project.
| Workflow | Triggers | Purpose |
|---|---|---|
cargo-clippy.yml | PR (synchronize), push (main + tags) | Lint + SARIF upload |
cargo-test.yml | PR (main), push (main + tags), release | Test matrix: stable + nightly |
cargo-build.yml | push (main + tags) | Multi-target: native + WASM (wasip1, wasip2) |
cargo-publish.yml | release (published) | Sequential crates.io publish |
release.yml | release (published) | GH release notes + crates.io/docs.rs links |
docker.yml | push (tags), workflow_dispatch | Multi-container Docker builds |
fly-io.yml | workflow_dispatch | Deploy to Fly.io |
cleanup.yml | PR (closed) | Branch cleanup |
Templates: references/ci-patterns.md.
max-parallel: 1 on the publish matrix to
serialize crates.io uploads in dependency order.cancel-in-progress: false per workflow/ref group
— interrupting a release mid-flight is worse than queuing.cargo-component for wasm32-wasip2; native cargo build
for wasm32-wasip1 and the wasm32-unknown target.no_std, alloc+nightly feature combos on the nightly
toolchain. Catches feature-gate drift early.env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: full
Cargo command semantics (cargo new, cargo init, the manifest schema,
workspace inheritance, feature-gate syntax) live in rust/cargo.md. This
section covers project-policy for the axiom-family Rust workspaces —
conventions cargo itself doesn't enforce.
crates/*cargo init --lib crates/{name}, then mkdir crates/{name}/wit.references/crate-template.md verbatim. Critical
policy rules:
field.workspace = true).name and description are crate-specific.[lib] bench = false unless the crate carries benchmarks.[package.metadata.docs.rs] and [package.metadata.release] are required.build = "build.rs" with the standard build script.default, full,
std, alloc, nightly, wasm, wasi. Feature propagation rules:
std → enables alloc and propagates /std to all deps.full → enables all optional features AND propagates /full to axiom deps.config = ["dep:axiom-config"]."axiom-config?/serde".[workspace.dependencies]
axiom-{name} = { default-features = false, path = "crates/{name}", version = "{X.Y.Z}" }
[workspace]
members = [..., "crates/{name}"]
crates/axiom/Cargo.toml).
[dependencies]
axiom-{name} = { optional = true, workspace = true }
[features]
{name} = ["dep:axiom-{name}"]
= [..., ]
Re-export in :
No crate within crates/* is imported directly by external consumers.
Consumers depend ONLY on axiom and use feature gates.
# CORRECT
axiom = { version = "{X.Y.Z}", features = ["bot", "engine"] }
# WRONG — never do this externally
axiom-bot = "{X.Y.Z}"
axiom-engine = "{X.Y.Z}"
Exceptions:
clients/* — independent standalone libraries; not part of the SDK surface.components/* — consumers of the axiom SDK (they depend on it like any
external project would).For the cargo-side mechanics of workspace inheritance and feature gates, see
rust/cargo.md §3 (workspaces) and §4 (feature gates).
references/ci-patterns.md — full GitHub Actions templates (Clippy,
Test, Build, Publish, Release, Docker, Cleanup) derived from the production
pzzld-rs implementation. Drop-in starting point for Rust workspace projects.references/crate-template.md — the complete Cargo.toml template for
a new axiom-family crate, plus the feature-gate checklist.references/release-checklist.md — operator pre-flight checklist for
the squash-merge that fires the release pipeline. Pairs with §IV above.rust — language fluency, ownership, async, traits, no_std tiers.rust/cargo.md — every cargo command, the Cargo.toml schema, workspace
mechanics, feature-gate syntax, [profile.*], .cargo/config.toml,
registries. Workflow defers to it for cargo semantics.rust/rustc.md — compiler knobs (codegen flags, target triples, editions,
lints, sanitizers).webassembly — language-agnostic WASM toolchain.wasmtime — Rust-side host embedding.Source: FL03/claude — distributed by TomeVault.
crates/axiom/src/lib.rs#[cfg(feature = "{name}")]
pub use axiom_{name} as {name};
crates/{name}/wit/ with at minimum types.wit,
{name}.wit, world.wit. Even if the crate isn't a wasm component today,
the world file documents the intended surface.