AGENT SKILL

workspace

Multi-repo campaign coordinator. Same lifecycle as fleet -- scope claims, discovery relay, wave-based execution -- but the unit of work is a repo, not a file. Coordinates campaigns across repositories with shared context.

License 许可
MIT
所属仓库
SethGammon/Citadel
最近更新
2026-11-13
Stars
★ 930
Forks
84

01 前言 Front Matter

name
workspace
effort
high
license
MIT
description
Multi-repo campaign coordinator. Same lifecycle as fleet -- scope claims, discovery relay, wave-based execution -- but the unit of work is a repo, not a file. Coordinates campaigns across repositories with shared context.
auto-trigger
false
last-updated
1774742400000
user-invocable
true
trigger_keywords
[ "workspace", "multi-repo", "cross-repo", "across repos", "multiple repos", "coordinate repos", "add redis and snowflake", "split into repos" ]

02 资源文件 2

03 SKILL.md 正文

/workspace -- Multi-Repo Campaign Coordinator

When to Use

  • Adding infrastructure that spans repos (new database, shared service, API contract)
  • Coordinating changes across a frontend repo, backend repo, and infra repo
  • Breaking a monolith into services (each service becomes a repo-scoped campaign)
  • Any task where changes in repo A depend on or inform changes in repo B

Do not use when:

  • All work is in one repo (use /fleet or /archon)
  • The repos are truly independent with no shared contracts (just run separate campaigns)

Protocol

Step 1: ORIENT

  1. Check for existing workspace session: .planning/workspace/session-{slug}.md — resume if status: active or needs-continue
  2. If starting fresh: identify repos, verify each path is a git repo, read each repo's CLAUDE.md, check .planning/campaigns/ for active campaigns (avoid collisions)
  3. Load prior session context and start watcher:
    node .citadel/scripts/momentum-watch-start.cjs
    node .citadel/scripts/momentum-read.cjs
    
    Skip momentum injection if output is empty.

Step 2: DECOMPOSE

Break the direction into repo-scoped work items (one campaign per repo per wave). Table format: # | Repo | Campaign Direction | Scope | Deps | Wave.

Rules: items with no deps → Wave 1; dependents → Wave 2+. Max 3 repo-campaigns per wave. Scope format: {repo}:{path}.

For each inter-wave dependency, specify the cross-repo contract: what the producer will produce, what the consumer expects, and where the contract lives (shared types package, OpenAPI spec, env var).

Step 3: WORKSPACE SESSION FILE

Create .planning/workspace/session-{slug}.md with frontmatter: version, id, status: active, started, completed_at: null, direction, repos (path + name + branch per repo), wave_count, current_wave: 1, campaigns_total, campaigns_complete: 0.

Body sections: Direction, Repos table (name/path/branch/status), Work Queue (table from Step 2), Cross-Repo Contracts (producer/consumer/contract/location), Wave Execution Log (per wave: status, campaigns, started, completed), Shared Context (discovery relay accumulation).

Step 4: WAVE EXECUTION

For each wave:

4a. Pre-flight

  • Verify all dependency campaigns from prior waves completed successfully
  • Check cross-repo contracts: did producer repos create the expected outputs?
  • If a dependency failed: park the dependent campaign, flag for user decision

4b. Spawn campaigns

For each repo-campaign in this wave:

  1. Create branch: git checkout -b workspace/{slug}/{repo-name}
  2. Spawn agent with direction: /archon for complex (3+ phases), /fleet if parallelizable, /marshal or direct skill for simple (1-2 steps)
  3. Inject context: discovery briefs from prior waves, prior session context (re-read momentum.json via node .citadel/scripts/momentum-read.cjs, inject as === PRIOR SESSION CONTEXT ===, skip if empty), cross-repo contracts, relevant CLAUDE.md sections from other repos

4c. Collect results

Extract HANDOFF blocks, compress into cross-repo discovery brief, write persistent discovery records:

node .citadel/scripts/discovery-write.cjs \
  --session {session-slug} --agent {repo-name}-{campaign-type} \
  --wave {wave-number} --status {success|partial|failed} \
  --scope "{repo-name}:{scope-path}" --handoff "{json-array}" \
  --decisions "{json-array}" --files "{json-array}" --failures "{json-array}"

4d. Discovery relay

Write workspace/briefs/wave{N}-{repo-name}.md for each completed campaign. Also write workspace/briefs/wave{N}-cross-repo.md summarizing:

  • New API endpoints or types created
  • Config changes that affect other repos
  • Contract fulfillment status (did the producer deliver what was promised?)

4e. Contract verification

For each cross-repo contract: verify the producer created the expected output (file + export for types, route existence for endpoints). If verification fails, flag and do not proceed with consumers.

4f. Update session

Mark completed campaigns, update wave status, write discovery relay, advance current_wave.

Step 5: COMPLETION

  1. Run typecheck/build for each repo in isolation (build shared types package first if present)
  2. Set session status: completed, completed_at: {ISO timestamp}
  3. Run node .citadel/scripts/momentum-synthesize.cjs
  4. List all branches created across repos with suggested merge order based on dependency graph
  5. Output HANDOFF

Fringe Cases

  • Repo not a git repo: Skip it. Report which repos were skipped and why.
  • Repo has uncommitted changes: Stash before branching. Record stash ref in session file. Pop on completion or failure.
  • Active campaign in target repo: Do not start a second campaign. Report the conflict and ask the user whether to wait, park the existing campaign, or merge scopes.
  • .planning/workspace/ does not exist: Create it (and workspace/briefs/).
  • Cross-repo contract broken: Park all downstream campaigns. Report which contract failed, which producer was responsible, and what the consumer expected. Do not attempt to fix the producer -- surface the issue for the user or re-run the producer campaign.
  • One repo fails, others succeed: Mark the failed repo-campaign. Do not roll back successful repos. The user decides whether to fix-and-continue or abandon.
  • Repos on different machines or remotes: Not supported. All repos must be locally accessible. If a repo is remote-only, the user must clone it first.
  • Monorepo with multiple packages: Treat each package as a "repo" for scoping purposes. Use {monorepo}:{package-path} as the scope identifier.

Contextual Gates

Disclosure: "Running multi-repo campaign across [repos]. Changes committed to each repo independently." Reversibility: red — coordinates changes across multiple repositories; cross-repo commits are hard to revert in bulk. Trust gates:

  • Familiar (5+ sessions): coordinates multi-repo campaigns autonomously; novices should use /marshal per repo.

Quality Gates

  • [ ] All repos verified as accessible git repositories before starting
  • [ ] Work queue has no scope overlaps within the same repo
  • [ ] Cross-repo contracts specified for every inter-wave dependency
  • [ ] Discovery relay written after each wave
  • [ ] Contract verification run before spawning consumer campaigns
  • [ ] Each repo's typecheck/build passes independently after completion
  • [ ] Session file updated after every wave (not just at the end)
  • [ ] No campaigns left in active state on completion

Exit Protocol

---HANDOFF---
- Workspace: {slug} -- {direction summary}
- Repos: {N} repos, {M} campaigns across {W} waves
- Results: {completed}/{total} campaigns succeeded
- Branches: {list branches ready for review}
- Merge order: {suggested order based on dependency graph}
- Unresolved: {any failed campaigns or broken contracts}
---

04 同仓库更多 Skills

SethGammon
SethGammon/Citadel

wiki

Markdown-first knowledge base where the LLM acts as librarian. Ingests raw sources, compiles and interlinks topic files, self-maintains an index. No vector DB or embeddings required -- uses LLM-native navigation over structured markdown up to ~400K words.

资料检索与研究
★ 930
SethGammon
SethGammon/Citadel

watch

File sentinel that monitors the working directory for changes and marker comments, then auto-triggers appropriate skills. Poll-based via git diff against the last scan commit. Writes intake items for batch processing and routes marker actions through /do. Use for automatic reactions to file changes; do NOT use for one-off inspection or tasks needing human judgment per file.

★ 930
SethGammon
SethGammon/Citadel

verify

Self-test the Citadel hook pipeline from within a live session. Exercises real tool calls (Write, Edit, Bash, Read) and checks that hooks fired, telemetry accumulated, and no errors occurred. Reports HOOK HEALTH: PASS or HOOK HEALTH: FAIL with a per-hook breakdown.

测试与质量
★ 930
SethGammon
SethGammon/Citadel

unharness

Safely leave Citadel using the active adoption receipt. Produces a no-write, reviewable plan, preserves a portable archive, removes only exact owned material, and reports modified or externally registered surfaces as retained or unknown. Legacy installs must be imported before exact leave is claimed.

★ 930
SethGammon
SethGammon/Citadel

triage

GitHub issue and PR investigator. Pulls open issues/PRs, classifies them, searches the codebase for root cause or reviews contributed code, proposes fixes with file:line references, and optionally implements fixes. Use for investigating GitHub issues and reviewing PRs; do NOT use for general code review unrelated to GitHub issues.

开发工程师代码审查
★ 930
SethGammon
SethGammon/Citadel

test-gen

Generate and verify tests — happy path, edge cases, error paths — using the project's own framework and patterns

测试与质量
★ 930