@cyanheads/mcp-ts-core 0.9.1 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +2 -1
- package/README.md +4 -2
- package/changelog/0.9.x/0.9.2.md +55 -0
- package/dist/cli/init.js +1 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/core/serverManifest.d.ts +8 -2
- package/dist/core/serverManifest.d.ts.map +1 -1
- package/dist/core/serverManifest.js +16 -2
- package/dist/core/serverManifest.js.map +1 -1
- package/dist/linter/rules/format-parity-rules.d.ts.map +1 -1
- package/dist/linter/rules/format-parity-rules.js +134 -106
- package/dist/linter/rules/format-parity-rules.js.map +1 -1
- package/dist/logs/combined.log +7 -7
- package/dist/logs/error.log +5 -5
- package/dist/mcp-server/transports/http/httpTransport.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/httpTransport.js +9 -0
- package/dist/mcp-server/transports/http/httpTransport.js.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/assets/styles.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/assets/styles.js +90 -72
- package/dist/mcp-server/transports/http/landing-page/assets/styles.js.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/connect.d.ts +6 -4
- package/dist/mcp-server/transports/http/landing-page/sections/connect.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/connect.js +76 -19
- package/dist/mcp-server/transports/http/landing-page/sections/connect.js.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/head.d.ts +2 -1
- package/dist/mcp-server/transports/http/landing-page/sections/head.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/head.js +20 -2
- package/dist/mcp-server/transports/http/landing-page/sections/head.js.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/prompts.js +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/prompts.js.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/resources.js +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/resources.js.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/tools.js +23 -16
- package/dist/mcp-server/transports/http/landing-page/sections/tools.js.map +1 -1
- package/dist/mcp-server/transports/http/robotsTxt.d.ts +24 -0
- package/dist/mcp-server/transports/http/robotsTxt.d.ts.map +1 -0
- package/dist/mcp-server/transports/http/robotsTxt.js +39 -0
- package/dist/mcp-server/transports/http/robotsTxt.js.map +1 -0
- package/dist/testing/fuzz.js +1 -1
- package/dist/testing/fuzz.js.map +1 -1
- package/package.json +25 -21
- package/scripts/devcheck.ts +27 -0
- package/scripts/lint-packaging.ts +116 -0
- package/scripts/list-skills.ts +170 -0
- package/skills/field-test/SKILL.md +96 -90
- package/skills/maintenance/SKILL.md +3 -1
- package/skills/multi-server-orchestration/SKILL.md +123 -0
- package/skills/multi-server-orchestration/references/greenfield-buildout.md +215 -0
- package/skills/multi-server-orchestration/references/maintenance-pass.md +119 -0
- package/skills/multi-server-orchestration/references/release-pass.md +189 -0
- package/skills/polish-docs-meta/SKILL.md +1 -1
- package/skills/polish-docs-meta/references/package-meta.md +1 -1
- package/skills/polish-docs-meta/references/readme.md +10 -7
- package/skills/polish-docs-meta/references/server-json.md +2 -2
- package/skills/release-and-publish/SKILL.md +38 -7
- package/skills/setup/SKILL.md +1 -1
- package/templates/AGENTS.md +37 -0
- package/templates/CLAUDE.md +37 -0
- package/templates/_.mcpbignore +13 -0
- package/templates/manifest.json +26 -0
- package/templates/package.json +6 -1
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: greenfield-buildout
|
|
3
|
+
description: >
|
|
4
|
+
Multi-server-orchestration reference for greenfield build-outs. Drives one or more freshly-scaffolded MCP servers through 13 phases: idea seed → design → critical review → setup + repo → first wrap-up (v0.1.0) → polish docs/meta → normalize → optional design extensions → interim wrap-up → build → finish → simplify → final wrap-up. Each phase is a parallel sub-agent fanout (one agent per target) with Bash git for all commit/tag/push steps.
|
|
5
|
+
metadata:
|
|
6
|
+
author: cyanheads
|
|
7
|
+
version: "1.0"
|
|
8
|
+
audience: external
|
|
9
|
+
type: reference
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Greenfield Build-Out — Multi-Server Orchestration
|
|
13
|
+
|
|
14
|
+
Use after reading `../SKILL.md`. This reference handles the full lifecycle for one or more freshly-scaffolded MCP servers — from idea seed through implementation to first published release.
|
|
15
|
+
|
|
16
|
+
## When applicable
|
|
17
|
+
|
|
18
|
+
- One or more new servers from `bunx @cyanheads/mcp-ts-core init <name>` need to be driven through design → build → ship
|
|
19
|
+
- N = 1 works too; the parallelism is optional, the phase pattern is the value
|
|
20
|
+
- Each target should be a freshly-scaffolded project with no implementation yet (only the framework's echo definitions)
|
|
21
|
+
|
|
22
|
+
## Pre-flight (orchestrator)
|
|
23
|
+
|
|
24
|
+
Before spawning any sub-agents:
|
|
25
|
+
|
|
26
|
+
1. **Confirm the target list with the user.** Capture absolute paths and the intended GitHub owner/org for each.
|
|
27
|
+
2. **Name the gold-standard references** the polish phase will anchor on — concrete repos whose README, `server.json`, badges, and agent-protocol shape are the target. Name them explicitly in the relevant fanout prompts; don't let agents pick. Examples from the `@cyanheads/*` ecosystem:
|
|
28
|
+
- **Docs/README/metadata** → `pubmed-mcp-server`
|
|
29
|
+
- **Tabular API + DataCanvas/dataframe surface** → `secedgar-mcp-server`
|
|
30
|
+
|
|
31
|
+
External projects pick analogous anchors from their own ecosystem; skip the phase if no suitable anchor exists.
|
|
32
|
+
3. **Verify each target has `scripts/list-skills.ts` and the `list-skills` package script.** Both ship via `init`; older projects pick them up on the next `maintenance` sync (Phase C).
|
|
33
|
+
4. **Confirm GH credentials** (`gh auth status`). Repo creation in Phase 4 requires this.
|
|
34
|
+
5. **Surface the plan** — scenario, target list, phase summary, gotchas — and get authorization before kicking off Phase 1.
|
|
35
|
+
|
|
36
|
+
## Phase pattern
|
|
37
|
+
|
|
38
|
+
| # | Phase | Mode | Inputs | Outputs |
|
|
39
|
+
|:--|:------|:-----|:-------|:--------|
|
|
40
|
+
| 1 | Seed | orchestrator | Server idea, domain | `docs/idea.md` per target |
|
|
41
|
+
| 2 | Design | fanout | `docs/idea.md` + `design-mcp-server` skill | `docs/design.md` per target |
|
|
42
|
+
| 3 | Critical review | fanout | `docs/design.md` + skill | Hardened `docs/design.md` per target |
|
|
43
|
+
| 4 | Setup + repo | fanout | `setup` skill + GH credentials | Private GH repo, framework scaffolds applied, working tree unstaged |
|
|
44
|
+
| 5 | First wrap-up (v0.1.0) | fanout, Bash git only | Working tree from Phase 4 | Commit + annotated `v0.1.0` tag + push, after user authorizes |
|
|
45
|
+
| 6 | Polish docs/meta | fanout | `polish-docs-meta` skill + named gold-standard repo | Updated README, server.json, package.json, agent protocol per target |
|
|
46
|
+
| 7 | Normalize | orchestrator (or narrow fanout) | Phase 6 outputs | Consistent naming/scripts/badges across targets |
|
|
47
|
+
| 8 | Design extensions (opt) | fanout | New design pattern (e.g., `api-canvas`) | Extended `docs/design.md` per applicable target |
|
|
48
|
+
| 9 | Commit/push extensions | fanout, Bash git only | Phases 6–8 outputs | Commits + pushes, after user authorizes |
|
|
49
|
+
| 10 | Build | fanout | `docs/design.md` | Full implementation + unit tests + green devcheck |
|
|
50
|
+
| 11 | Finish (narrow scope) | fanout | Phase 10 partial state | Remaining errors fixed, missing tests written, echo removed, green devcheck |
|
|
51
|
+
| 12 | Simplify | fanout | `code-simplifier` skill | Cleanups applied; green devcheck |
|
|
52
|
+
| 13 | Final wrap-up (v0.1.x+1) | fanout, Bash git only | Phases 10–12 outputs | Final commit + annotated tag + push, after user authorizes |
|
|
53
|
+
|
|
54
|
+
Skip phases that don't apply. Phase 8 only fires when a subset of targets fits a new design pattern. Phase 9 only runs if Phase 6–8 produced doc changes the build should start from.
|
|
55
|
+
|
|
56
|
+
## Scenario-specific hard rule
|
|
57
|
+
|
|
58
|
+
In addition to the universal hard rules in `../SKILL.md`:
|
|
59
|
+
|
|
60
|
+
> **Repo must be private before any push** (or user must explicitly authorize public). Phase 5/9/13 sub-agents confirm `gh repo view --json visibility` returns `PRIVATE` (or have user authorization noted) before pushing.
|
|
61
|
+
|
|
62
|
+
## Phase details
|
|
63
|
+
|
|
64
|
+
### Phase 1: Seed (orchestrator)
|
|
65
|
+
|
|
66
|
+
Write a small `docs/idea.md` per target before involving sub-agents. Structure: **Domain → Data source → User goals → Tool sketch → Pairs with → Open questions**. Keep it to a page or less — this is the seed the design skill expands.
|
|
67
|
+
|
|
68
|
+
Skip if the user already has a clear, written brief per target. The point is to give the design fanout a concrete starting point so each agent doesn't redo discovery.
|
|
69
|
+
|
|
70
|
+
### Phase 2: Design (fanout)
|
|
71
|
+
|
|
72
|
+
One sub-agent per target. Each agent reads its `docs/idea.md`, reads `design-mcp-server`, probes the upstream API if there is one, and writes `docs/design.md`.
|
|
73
|
+
|
|
74
|
+
**Decisions Log convention.** End the design doc with a "Decisions Log" section recording answered open questions and options declined, with one-line reasoning each. This becomes the audit trail for non-obvious choices and feeds Phase 3 (the reviewer can verify the rationale held up). Preserve it as a default.
|
|
75
|
+
|
|
76
|
+
**Task body (after the orient block):**
|
|
77
|
+
|
|
78
|
+
> Read `docs/idea.md` and the `design-mcp-server` skill. Probe the upstream API if applicable. Write `docs/design.md` following the skill's template. For open questions, default to current modern practices and record the question + your answer (or the option you declined + why) in a Decisions Log section at the bottom. Do not commit.
|
|
79
|
+
|
|
80
|
+
### Phase 3: Critical review (fanout)
|
|
81
|
+
|
|
82
|
+
Fresh sub-agent per target — different conversation, different context. The design author has confirmation bias on its own choices; a second agent reading cold spots what the first justified away.
|
|
83
|
+
|
|
84
|
+
Each agent re-reads `docs/design.md`, re-reads `design-mcp-server`, then surgically tightens: closes gaps, kills bad assumptions, adds material that's missing. Output is an updated `docs/design.md` + a short list of what changed and why.
|
|
85
|
+
|
|
86
|
+
### Phase 4: Setup + repo (fanout)
|
|
87
|
+
|
|
88
|
+
One sub-agent per target. The agent reads the `setup` skill and runs it: agent-protocol file selection, framework docs read, echo cleanup, skill sync to `.claude/skills/`. Then `git init -b main`, `gh repo create` private with description and topics derived from `docs/design.md`, but **no commits**.
|
|
89
|
+
|
|
90
|
+
The `setup` skill's checklist says to commit `chore: scaffold from @cyanheads/mcp-ts-core`. The orchestrator overrides this at the prompt level:
|
|
91
|
+
|
|
92
|
+
> Do NOT `git add`, `git commit`, or `git push` after running the setup skill. Leave the working tree unstaged for review.
|
|
93
|
+
|
|
94
|
+
### Phase 5: First wrap-up — v0.1.0 (fanout, Bash git only)
|
|
95
|
+
|
|
96
|
+
Run only after the user explicitly authorizes commits.
|
|
97
|
+
|
|
98
|
+
One sub-agent per target. Each agent:
|
|
99
|
+
|
|
100
|
+
1. Confirms `gh repo view --json visibility` returns `PRIVATE` (or has noted authorization for public).
|
|
101
|
+
2. Regenerates: `bun run tree`, authors `changelog/0.1.x/0.1.0.md` with YAML frontmatter, runs `bun run changelog:build`. Version-bumps any files that fell out of sync.
|
|
102
|
+
3. Stages and commits with a conventional-commits subject (e.g., `feat: 0.1.0 — initial scaffold` or `chore(release): v0.1.0 — initial scaffold`).
|
|
103
|
+
4. Creates an **annotated** tag `v0.1.0` (`-a`, not lightweight) with a terse message.
|
|
104
|
+
5. Pushes commits and tags to origin.
|
|
105
|
+
|
|
106
|
+
All git calls use Bash, not git-mcp-server. Final report: commit SHA + tag name.
|
|
107
|
+
|
|
108
|
+
### Phase 6: Polish docs/meta (fanout)
|
|
109
|
+
|
|
110
|
+
One sub-agent per target. Each agent reads:
|
|
111
|
+
- Its `docs/design.md`
|
|
112
|
+
- The `polish-docs-meta` skill and its references
|
|
113
|
+
- The **gold-standard repo** named in pre-flight, locally
|
|
114
|
+
|
|
115
|
+
The agent updates README, `server.json`, `package.json` (sponsor links, keywords, scope), Dockerfile, and the chosen agent protocol file to match the gold-standard pattern. Name the gold-standard reference explicitly in the prompt; don't let the agent pick.
|
|
116
|
+
|
|
117
|
+
### Phase 7: Normalize (orchestrator or narrow fanout)
|
|
118
|
+
|
|
119
|
+
After Phase 6, parallel agents will have diverged on incidental choices. Common axes:
|
|
120
|
+
|
|
121
|
+
- Package name scoping (`@scope/name` vs. bare `name`)
|
|
122
|
+
- Script invocation form (`bun run` vs. `bunx` vs. `tsx`)
|
|
123
|
+
- Docker block in README (present vs. absent)
|
|
124
|
+
- Badge set, hero title format
|
|
125
|
+
- Keywords list shape
|
|
126
|
+
|
|
127
|
+
Decide the canonical choice once, then either fix each project yourself (orchestrator) or spawn a narrow fanout with an explicit rule list. Orchestrator-driven is faster when the fixes are small; fanout is faster when N is large and the fix-per-target is non-trivial.
|
|
128
|
+
|
|
129
|
+
### Phase 8: Design extensions (optional fanout)
|
|
130
|
+
|
|
131
|
+
Some servers fit additional design patterns the base design didn't include. Example: tabular API servers (tools that page large row sets) benefit from `DataCanvas` / dataframe-surface tools — documented in `api-canvas`, exemplified by `secedgar-mcp-server`.
|
|
132
|
+
|
|
133
|
+
If a subset of targets fits a pattern, spawn a fanout only for that subset. Each agent reads the relevant skill (`api-canvas`), the gold-standard reference (`secedgar-mcp-server`), and its own `docs/design.md`, then extends the design with the new pattern. This phase produces updated `docs/design.md`, not code.
|
|
134
|
+
|
|
135
|
+
### Phase 9: Commit/push extensions (fanout, Bash git only)
|
|
136
|
+
|
|
137
|
+
If Phases 6–8 produced doc/meta changes that should land before the build phase begins, run a small wrap-up fanout. Conventional commit, no version bump (still pre-build), Bash git only. Runs only after user authorizes.
|
|
138
|
+
|
|
139
|
+
### Phase 10: Build (fanout)
|
|
140
|
+
|
|
141
|
+
The big one. One sub-agent per target builds the full implementation from `docs/design.md`: services, tool definitions, resources, prompts, config, server registration, unit tests for each tool, end-to-end devcheck.
|
|
142
|
+
|
|
143
|
+
**Critical prompt directives:**
|
|
144
|
+
|
|
145
|
+
- "Plan carefully before acting. Think the design through end-to-end before writing files."
|
|
146
|
+
- "Run `bun run devcheck` often to verify your work as you go."
|
|
147
|
+
- "Do NOT use `git` commands."
|
|
148
|
+
- "Do NOT run `field-test`. That's reserved for the user's manual verification later."
|
|
149
|
+
- Orient block — non-negotiable.
|
|
150
|
+
|
|
151
|
+
**Expect context exhaustion on the largest targets.** The agent's work persists to disk even if its session dies, but the agent itself can't continue. Plan Phase 11 as the backstop — not a fallback for failure, a normal next phase.
|
|
152
|
+
|
|
153
|
+
### Phase 11: Finish — narrow-scope fanout
|
|
154
|
+
|
|
155
|
+
After Phase 10, some targets will be incomplete (last few tools missing tests, lingering TS errors, echo definitions not removed, devcheck not yet green). Spawn a narrow fanout — one sub-agent per incomplete target with a concrete punch list.
|
|
156
|
+
|
|
157
|
+
**Punch list format in the prompt:**
|
|
158
|
+
|
|
159
|
+
> Current state: X tools implemented of Y, Z TS errors in `bun run devcheck`, echo definitions still present in `src/mcp-server/tools/definitions/echo.tool.ts`.
|
|
160
|
+
>
|
|
161
|
+
> Your job:
|
|
162
|
+
> 1. Fix the TS errors. Run `bun run devcheck` after each fix.
|
|
163
|
+
> 2. Write tests for tools A, B, C using the pattern in `tests/tools/<existing>.tool.test.ts`.
|
|
164
|
+
> 3. Delete echo definitions and their registrations in `src/index.ts`.
|
|
165
|
+
> 4. Confirm green `bun run devcheck` and `bun run test`.
|
|
166
|
+
|
|
167
|
+
Each finish agent is narrow in scope — one or two problem classes, not a generic "finish it" prompt. Narrow scope is the antidote to context exhaustion.
|
|
168
|
+
|
|
169
|
+
### Phase 12: Simplify (fanout)
|
|
170
|
+
|
|
171
|
+
One sub-agent per target reads the `code-simplifier` skill, then audits the codebase against its principles: cut unnecessary abstractions, remove dead code, replace verbose patterns with idioms, etc. Output: list of changes applied + green devcheck.
|
|
172
|
+
|
|
173
|
+
No commits in this phase.
|
|
174
|
+
|
|
175
|
+
### Phase 13: Final wrap-up (fanout, Bash git only)
|
|
176
|
+
|
|
177
|
+
Run only after the user authorizes. Same shape as Phase 5: per-target sub-agent invokes `git_wrapup_instructions` advice (via Bash git), authors `changelog/0.1.x/<version>.md`, regenerates `CHANGELOG.md` and `docs/tree.md`, version-bumps `package.json` and `server.json`, commits with a conventional subject, creates an annotated tag, pushes.
|
|
178
|
+
|
|
179
|
+
Version bumps live with the change that warrants them per the global protocol's git rules — don't manufacture extra commits.
|
|
180
|
+
|
|
181
|
+
## Gotchas specific to greenfield build-out
|
|
182
|
+
|
|
183
|
+
| # | Gotcha | Mitigation |
|
|
184
|
+
|:--|:-------|:-----------|
|
|
185
|
+
| 1 | Zod 4 signature change — `z.record(z.string())` no longer valid; must be `z.record(z.string(), z.string())` | Caught by devcheck; mention as a hint in build-phase prompts so agents don't burn cycles rediscovering it |
|
|
186
|
+
| 2 | `exactOptionalPropertyTypes` mismatch — Zod-inferred types have `T \| undefined` for optional fields, project domain types may have truly optional | Introduce a mapped widening type at the boundary where they meet; agent will hit this in devcheck |
|
|
187
|
+
| 3 | `format()` ↔ `structuredContent` parity — different MCP clients forward different surfaces (Claude Code reads `structuredContent`, Claude Desktop reads `content[]`) | Build prompts cite the design-mcp-server rule; tests assert both surfaces carry equivalent data |
|
|
188
|
+
| 4 | `setup` skill's checklist tells the agent to commit; orchestrator overrides this | Restate the no-commit constraint in the Phase 4 prompt body verbatim |
|
|
189
|
+
| 5 | `init` defaults package name to the cwd; if the project was scaffolded inside an outer dir, the name is wrong | Verify in Phase 4 prompt: "Check the substituted package name in `package.json`, `server.json`, and the agent protocol matches the intended server name." |
|
|
190
|
+
| 6 | Sub-agent creates GH repo public by default if `gh repo create` omits `--private` | Restate the scenario hard rule in every fanout that touches `gh`: "Repo must be private before any push." |
|
|
191
|
+
| 7 | Wrap-up agents have been observed reporting "pushed" while the remote ref didn't actually land — the push only succeeded on a subsequent op | Verify after every Bash-git fanout: `git ls-remote --tags origin` and `gh repo view --json defaultBranchRef` per target |
|
|
192
|
+
|
|
193
|
+
## Checklist
|
|
194
|
+
|
|
195
|
+
The orchestrator's checklist for a full N-target greenfield build:
|
|
196
|
+
|
|
197
|
+
- [ ] Target list confirmed, GitHub owners/orgs noted, gold-standard references named
|
|
198
|
+
- [ ] `scripts/list-skills.ts` and the `list-skills` package script present in each target
|
|
199
|
+
- [ ] `gh auth status` passes for the orchestrator session
|
|
200
|
+
- [ ] **User authorization captured for commit-bearing phases**
|
|
201
|
+
- [ ] Phase 1 — `docs/idea.md` authored per target
|
|
202
|
+
- [ ] Phase 2 — design fanout — `docs/design.md` with Decisions Log per target
|
|
203
|
+
- [ ] Phase 3 — critical review fanout — `docs/design.md` hardened per target
|
|
204
|
+
- [ ] Phase 4 — setup + repo fanout — repos created private, working tree unstaged, no commits
|
|
205
|
+
- [ ] Phase 5 — v0.1.0 wrap-up fanout (Bash git only) — commits + annotated tags + pushes; verified via `git log` and `git ls-remote --tags origin`
|
|
206
|
+
- [ ] Phase 6 — polish docs/meta fanout against named gold-standard
|
|
207
|
+
- [ ] Phase 7 — normalization — divergent conventions aligned
|
|
208
|
+
- [ ] **If extension applicable:** Phase 8 — design extension fanout (e.g., DataCanvas for tabular servers)
|
|
209
|
+
- [ ] **If Phases 6–8 produced doc changes the build should start from:** Phase 9 — interim wrap-up fanout (Bash git only) after user authorizes
|
|
210
|
+
- [ ] Phase 10 — build fanout — implementation + tests + green devcheck per target
|
|
211
|
+
- [ ] **If any Phase 10 agent didn't finish:** Phase 11 — narrow-scope finish fanout per incomplete target
|
|
212
|
+
- [ ] Phase 12 — simplify fanout — `code-simplifier` pass per target
|
|
213
|
+
- [ ] All targets: green `bun run devcheck` and `bun run test`
|
|
214
|
+
- [ ] Phase 13 — final wrap-up fanout (Bash git only) — version bump, changelog file, regenerated rollup, commit + annotated tag + push; verified
|
|
215
|
+
- [ ] Final read-only verification: tags pushed, repos still private, no stray uncommitted work
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: maintenance-pass
|
|
3
|
+
description: >
|
|
4
|
+
Multi-server-orchestration reference for maintenance passes. Drives parallel `bun update --latest`, changelog investigation (via the changelog skill), framework adoption per the maintenance skill's auto-adopt rule, skill/script sync (Phase A/B/C), and verification across N existing MCP server projects. Optional Bash-git wrap-up fanout commits adoptions after user authorization.
|
|
5
|
+
metadata:
|
|
6
|
+
author: cyanheads
|
|
7
|
+
version: "1.0"
|
|
8
|
+
audience: external
|
|
9
|
+
type: reference
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Maintenance Pass — Multi-Server Orchestration
|
|
13
|
+
|
|
14
|
+
Use after reading `../SKILL.md`. This reference handles parallel `bun update` + changelog investigation + framework adoption + verification across N existing MCP server projects.
|
|
15
|
+
|
|
16
|
+
## When applicable
|
|
17
|
+
|
|
18
|
+
- One or more existing servers built on `@cyanheads/mcp-ts-core` need a coordinated maintenance pass
|
|
19
|
+
- N = 1 still benefits — the value is the fresh-context sub-agent running the full `maintenance` skill end-to-end without context pollution
|
|
20
|
+
- Each target must have a clean working tree (uncommitted work blocks the maintenance skill's verification gate)
|
|
21
|
+
|
|
22
|
+
## Pre-flight (orchestrator)
|
|
23
|
+
|
|
24
|
+
Before spawning any sub-agents:
|
|
25
|
+
|
|
26
|
+
1. **Confirm the target list** with the user. Capture absolute paths.
|
|
27
|
+
2. **Verify each target is a git repo with a clean working tree.** Run `git status` per target. Halt if any is dirty — user fixes locally and re-invokes.
|
|
28
|
+
3. **Verify each target has `scripts/list-skills.ts` and the `list-skills` package script.** Both ship via `init`; older projects pick them up on the next `maintenance` Phase C sync — which is what's about to run. If missing at this moment, that's fine; note it and the sub-agent will pick them up.
|
|
29
|
+
4. **Verify each target has the `maintenance` skill available** (in `skills/` or `.claude/skills/`). If missing, that's a sign the project hasn't been initialized from a recent framework version — flag it; the sub-agent can still work from the package's copy at `node_modules/@cyanheads/mcp-ts-core/skills/maintenance/SKILL.md`.
|
|
30
|
+
5. **Clarify the user authorization scope.** Do they want sub-agents to commit/push at the end, or stop at "changes applied, working tree dirty, awaiting review"? Default is the latter.
|
|
31
|
+
|
|
32
|
+
## Phase pattern
|
|
33
|
+
|
|
34
|
+
| # | Phase | Mode | Inputs | Outputs |
|
|
35
|
+
|:--|:------|:-----|:-------|:--------|
|
|
36
|
+
| 1 | Pre-flight | orchestrator | Target list + auth scope | Verified clean working trees, list-skills/maintenance availability noted |
|
|
37
|
+
| 2 | Maintenance fanout | fanout | `maintenance` skill | Per-target: green devcheck, working tree with framework/dep adoptions, Step 8 numbered summary |
|
|
38
|
+
| 3 | Roll-up | orchestrator | Phase 2 summaries | Consolidated cross-target report presented to user |
|
|
39
|
+
| 4 | (Optional) Wrap-up | fanout, Bash git only | Phase 2 outputs | Per-target commit + push, after user authorizes |
|
|
40
|
+
|
|
41
|
+
Phase 4 is optional — if the user wants to review changes locally first or split adoption decisions across multiple sessions, the orchestration ends at Phase 3 with dirty working trees.
|
|
42
|
+
|
|
43
|
+
## Phase details
|
|
44
|
+
|
|
45
|
+
### Phase 2: Maintenance fanout
|
|
46
|
+
|
|
47
|
+
One sub-agent per target. Each agent runs the `maintenance` skill end-to-end in **Mode A** (full flow from `bun outdated` through verification).
|
|
48
|
+
|
|
49
|
+
**Task body (after the orient block):**
|
|
50
|
+
|
|
51
|
+
> Read `skills/maintenance/SKILL.md` (or `.claude/skills/maintenance/SKILL.md`, whichever exists). Run it end-to-end in Mode A:
|
|
52
|
+
>
|
|
53
|
+
> 1. `bun outdated` — capture the list
|
|
54
|
+
> 2. `bun update --latest` — apply, capturing the `↑ package old → new` lines for Step 3
|
|
55
|
+
> 3. Invoke the `changelog` skill for each updated package
|
|
56
|
+
> 4. If `@cyanheads/mcp-ts-core` updated, do the deeper framework review from Step 4 of the maintenance skill
|
|
57
|
+
> 5. Run Step 5 skill/script sync (Phase A: package → project `skills/`; Phase B: project `skills/` → agent dirs; Phase C: package scripts + pristine refs → project)
|
|
58
|
+
> 6. Adopt changes per Step 6 — **framework changes are auto-adopt every applicable site in this pass**, no scope/effort/marginal-benefit deferrals; third-party libs are cost/benefit
|
|
59
|
+
> 7. `bun run rebuild` → `bun run devcheck` → `bun run test`
|
|
60
|
+
> 8. Produce the Step 8 numbered summary (Updated packages, Breaking changes handled, Features adopted, Skills synced, New/changed skills available, Open decisions, Status)
|
|
61
|
+
>
|
|
62
|
+
> Constraints:
|
|
63
|
+
> - Do NOT run `git` commands. Leave the working tree dirty for orchestrator review.
|
|
64
|
+
> - NEVER `git stash` for any reason. NEVER `git reset --hard`, `git restore .`, `git clean -f`, or `git checkout -- .`.
|
|
65
|
+
> - Halt and report if devcheck or tests can't be made green after adoption.
|
|
66
|
+
> - Output the Step 8 summary verbatim at the end of your run — the orchestrator parses it.
|
|
67
|
+
>
|
|
68
|
+
> If the `maintenance` skill's own version increased in Phase A of the skill sync (skill-version paradox), re-read the synced `skills/maintenance/SKILL.md` and continue from Step 5 onward with the new version.
|
|
69
|
+
|
|
70
|
+
**Expected sub-agent output:** the Step 8 numbered summary plus a `bun run devcheck` / `bun run test` final pass.
|
|
71
|
+
|
|
72
|
+
### Phase 3: Roll-up (orchestrator)
|
|
73
|
+
|
|
74
|
+
The orchestrator collects each sub-agent's Step 8 summary and produces a consolidated cross-target report for the user:
|
|
75
|
+
|
|
76
|
+
1. **Per-target headlines** — short table: target → N packages updated → green/red devcheck → status
|
|
77
|
+
2. **Cross-target patterns** — features adopted across multiple targets, third-party libs updated everywhere, breaking changes that hit a subset
|
|
78
|
+
3. **Open decisions** — any per-target ambiguities flagged. Group by decision so the user can rule once across multiple targets when the choice is the same
|
|
79
|
+
4. **Outliers** — targets where the working-tree diff is unusually large, or where adoption couldn't complete cleanly
|
|
80
|
+
|
|
81
|
+
Wait for user direction before Phase 4 — they may want to inspect diffs locally first.
|
|
82
|
+
|
|
83
|
+
### Phase 4: Wrap-up fanout (optional, Bash git only)
|
|
84
|
+
|
|
85
|
+
Run only after explicit user authorization. Per-target commit decisions are driven by the change shape:
|
|
86
|
+
|
|
87
|
+
- **Pure third-party dependency update** — `chore(deps): update dependencies` (or per-package if the diff is concentrated)
|
|
88
|
+
- **Framework upgrade with adoption changes** — `chore(framework): mcp-ts-core <old> → <new>, adopt <pattern>`
|
|
89
|
+
- **Mixed** — split into atomic commits per the global git rules ("Related changes ship together; unrelated changes split")
|
|
90
|
+
|
|
91
|
+
One sub-agent per target. Each agent:
|
|
92
|
+
|
|
93
|
+
1. Re-confirms the working tree still reflects Phase 2's changes (no manual reverts since)
|
|
94
|
+
2. Stages and commits in atomic units per the global protocol — version bumps ride with the change that warrants them; do not manufacture extra ceremonial commits
|
|
95
|
+
3. Pushes to origin
|
|
96
|
+
|
|
97
|
+
If the maintenance pass should drive a version bump (breaking framework upgrade, or follow-on release intent), see the `release-and-publish` skill — the orchestrator may chain a release scenario as a separate run.
|
|
98
|
+
|
|
99
|
+
## Gotchas specific to maintenance
|
|
100
|
+
|
|
101
|
+
| # | Gotcha | Mitigation |
|
|
102
|
+
|:--|:-------|:-----------|
|
|
103
|
+
| 1 | Aggressive auto-adoption — the `maintenance` skill mandates "every applicable framework site, in this pass" with no scope/effort deferrals | Expected and correct. Diffs per target may be large; surface size in the roll-up so the user can prioritize review |
|
|
104
|
+
| 2 | Skill-version paradox — if `node_modules/@cyanheads/mcp-ts-core/skills/maintenance/SKILL.md` version is newer than the synced project copy, feature-adoption rows added in the new version don't surface | Sub-agent prompt restates the paradox: after Phase A sync completes, re-read the synced `maintenance` SKILL.md and continue from Step 5 |
|
|
105
|
+
| 3 | Per-target adoption divergence is expected — projects on different starting framework versions adopt different things | Don't try to normalize. Surface divergence as informational in the roll-up; the user may run a separate orchestration to bring stragglers forward |
|
|
106
|
+
| 4 | The `changelog` skill may not exist in a target's skill directory yet | Sub-agent falls back to direct `node_modules/<pkg>/CHANGELOG.md` reading, as documented in the maintenance skill's Step 3 |
|
|
107
|
+
| 5 | Sub-agent runs git commands despite instruction | Restate "Do NOT run git commands" + the no-`stash` rule in the prompt body; verify via `git log --oneline -1` per target after Phase 2 |
|
|
108
|
+
| 6 | Targets at the same framework version produce inconsistent adoption choices | Usually means one agent missed a site; spot-check the Step 8 "Features adopted" lists across targets. If a feature shows up for 3 of 4, the 4th likely missed it — spawn a narrow finish-pass agent for that target |
|
|
109
|
+
| 7 | Big monorepo or many adoptions cause context exhaustion in a sub-agent | Narrow the prompt: if a target has many breaking framework changes, split the sub-agent's work into "update deps + verify" and "adopt features" as two phases against that target |
|
|
110
|
+
|
|
111
|
+
## Checklist
|
|
112
|
+
|
|
113
|
+
- [ ] Pre-flight: target list confirmed, clean working trees verified, `list-skills` presence noted per target, `maintenance` skill availability noted per target, auth scope clarified with user
|
|
114
|
+
- [ ] Phase 2: maintenance fanout spawned; each sub-agent returned a Step 8 summary
|
|
115
|
+
- [ ] All targets: green `bun run devcheck` and `bun run test` post-adoption
|
|
116
|
+
- [ ] Phase 3: consolidated roll-up presented to user with per-target headlines, cross-target patterns, open decisions, outliers
|
|
117
|
+
- [ ] **User authorization captured for wrap-up if proceeding to Phase 4**
|
|
118
|
+
- [ ] Phase 4: per-target commits via Bash git, pushed to origin
|
|
119
|
+
- [ ] Final read-only verification: `git log --oneline -3` and `git ls-remote` per target — commits landed, no stray uncommitted work
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: release-pass
|
|
3
|
+
description: >
|
|
4
|
+
Multi-server-orchestration reference for release passes. Drives parallel verification → README polish → wrap-up (version bump, changelog, commit, annotated tag — local only, Bash git emulating git_wrapup_instructions) → publish (push + npm + MCP Registry + GHCR via the release-and-publish skill) → optional GH issue closure across N MCP server projects. Phase 5 runs serial when npm 2FA prompts interactively; parallel when bypass is configured.
|
|
5
|
+
metadata:
|
|
6
|
+
author: cyanheads
|
|
7
|
+
version: "1.0"
|
|
8
|
+
audience: external
|
|
9
|
+
type: reference
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Release Pass — Multi-Server Orchestration
|
|
13
|
+
|
|
14
|
+
Use after reading `../SKILL.md`. This reference handles parallel release work across N MCP server projects — verification gate → README polish → git wrapup (version bump, changelog, commit, annotated tag — local only) → publish (push + npm + MCP Registry + GHCR via the `release-and-publish` skill) → optional GH issue closure.
|
|
15
|
+
|
|
16
|
+
## When applicable
|
|
17
|
+
|
|
18
|
+
- One or more MCP servers built on `@cyanheads/mcp-ts-core` have committed/staged work that needs to ship as a new version
|
|
19
|
+
- Common follow-on to a `maintenance-pass` run where adopted changes need to ship as a patch
|
|
20
|
+
- Works for any version bump scope (patch / minor / major), per target
|
|
21
|
+
|
|
22
|
+
This reference assumes the change to ship is already done — it's the "ship the work" phase, not the "do the work" phase. If targets still need code changes, run those phases first (greenfield build, maintenance, etc.).
|
|
23
|
+
|
|
24
|
+
## Pre-flight (orchestrator)
|
|
25
|
+
|
|
26
|
+
Before spawning any sub-agents:
|
|
27
|
+
|
|
28
|
+
1. **Confirm the target list with the user.** Capture absolute paths and the intended version bump per target (`patch` / `minor` / `major`, or an explicit version string). Mixed bumps across targets are fine.
|
|
29
|
+
2. **Confirm the change shape per target.** What changed since the last release? This drives the conventional-commit subject, the per-version changelog body, and the annotated tag message. For a patch bump with a single concern, one or two lines per target is enough.
|
|
30
|
+
3. **Confirm npm 2FA setup.** Parallel `bun publish` calls don't play nicely with interactive 2FA — OTP prompts from multiple sub-agents interleave and fail. Either:
|
|
31
|
+
- **Bypass configured** — granular access token with "Bypass 2FA for publish" in `~/.npmrc` → Phase 5 can run as a parallel fanout
|
|
32
|
+
- **Not configured** — Phase 5 runs serially, orchestrator-driven, target by target
|
|
33
|
+
- **No npm publish involved** — non-issue
|
|
34
|
+
4. **Capture the GH issue map (optional).** Per target: any issue numbers that this release closes or comments on, plus the intent (close vs. comment-only). Skip if no issues apply.
|
|
35
|
+
5. **Surface the plan and get explicit authorization.** Scenario, target list, version bump per target, 2FA mode for Phase 5, issue map, gotchas in play. Phase 5 is irreversible — no implicit authorization.
|
|
36
|
+
|
|
37
|
+
## Single-target vs. multi-target
|
|
38
|
+
|
|
39
|
+
A typical single-target release flow runs in one session via `git_set_working_dir` + `git_wrapup_instructions` from `git-mcp-server`. This reference translates that into the multi-target parallel pattern:
|
|
40
|
+
|
|
41
|
+
| Single-target (orchestrator session) | Multi-target (parallel sub-agents) |
|
|
42
|
+
|:-------------------------------------|:-----------------------------------|
|
|
43
|
+
| `git_set_working_dir` once | Each sub-agent uses absolute paths with Bash `git` (no session state) |
|
|
44
|
+
| `git_wrapup_instructions` returns playbook + diagnostics | Phase 4 sub-agent prompt enumerates the same steps directly |
|
|
45
|
+
| Orchestrator executes steps in one session | One sub-agent per target executes steps in parallel |
|
|
46
|
+
| `release-and-publish` runs in the same session | Phase 5 sub-agents run the skill end-to-end per target |
|
|
47
|
+
|
|
48
|
+
The orchestrator may still call `git_wrapup_instructions` *serially* against each target during pre-flight to inspect state — that's read-only, no state leak. The constraint is on parallel sub-agents.
|
|
49
|
+
|
|
50
|
+
## Phase pattern
|
|
51
|
+
|
|
52
|
+
| # | Phase | Mode | Inputs | Outputs |
|
|
53
|
+
|:--|:------|:-----|:-------|:--------|
|
|
54
|
+
| 1 | Pre-flight | orchestrator | Target list, bump intent, 2FA mode, issue map | Verified plan, user authorization |
|
|
55
|
+
| 2 | Verification fanout | fanout | Existing target state | Per-target: green `bun run devcheck` + `bun run test:all` (or `test`) |
|
|
56
|
+
| 3 | README review fanout | fanout | Current README + change shape | Per-target: README updates folded in (no commits) |
|
|
57
|
+
| 4 | Wrap-up fanout | fanout, Bash git only | Phase 3 outputs + version bump intent | Per-target: version bumped everywhere, per-version changelog authored, rollup regenerated, commit + annotated tag — **LOCAL ONLY, no push** |
|
|
58
|
+
| 5 | Release publish | fanout OR serial | Phase 4 outputs | Per-target: tags+commits pushed, npm publish, MCP Registry publish, Docker push — via `release-and-publish` |
|
|
59
|
+
| 6 | (Optional) Issue closure fanout | fanout | Phase 5 outputs + issue map | Per-target: relevant GH issues commented and closed |
|
|
60
|
+
|
|
61
|
+
## Phase details
|
|
62
|
+
|
|
63
|
+
### Phase 2: Verification fanout
|
|
64
|
+
|
|
65
|
+
One sub-agent per target. Quick verification gate before any version bump or wrapup.
|
|
66
|
+
|
|
67
|
+
**Task body (after the orient block):**
|
|
68
|
+
|
|
69
|
+
> Run `bun run devcheck`. Then run `bun run test:all` if it exists in `package.json` scripts, otherwise `bun run test`. Both must pass green. Halt and report the failing step's verbatim output if anything fails — do not attempt fixes from inside this phase.
|
|
70
|
+
|
|
71
|
+
Any red target halts the orchestration. The user fixes locally and re-invokes from Phase 2.
|
|
72
|
+
|
|
73
|
+
### Phase 3: README review fanout
|
|
74
|
+
|
|
75
|
+
One sub-agent per target reads the full README plus key adjacent docs, identifies stale or missing content (feature counts, version badges, surface tables, configuration sections, dep version mentions), and folds updates in. No commits — Phase 4 stages everything together.
|
|
76
|
+
|
|
77
|
+
**Task body:**
|
|
78
|
+
|
|
79
|
+
> Read `README.md` from front to back. Identify content stale relative to the current code: tool/resource counts, version badges, feature lists, configuration tables, version mentions in install snippets. Fold updates in naturally — don't rewrite sections that are already accurate. Do NOT commit. Leave changes in the working tree for the next phase.
|
|
80
|
+
>
|
|
81
|
+
> If `polish-docs-meta` skill is available and the change spans more than just the README (e.g., new env vars, new tools), invoke that skill instead — it handles README plus `server.json`, `package.json`, agent protocol, and `.env.example` in one pass.
|
|
82
|
+
>
|
|
83
|
+
> If the README is already accurate, report "no changes needed" and exit cleanly.
|
|
84
|
+
|
|
85
|
+
For a small patch bump, this phase is often a no-op. That's fine.
|
|
86
|
+
|
|
87
|
+
### Phase 4: Wrap-up fanout (Bash git only)
|
|
88
|
+
|
|
89
|
+
Run only after user authorizes commits.
|
|
90
|
+
|
|
91
|
+
One sub-agent per target. The agent executes the wrapup steps via Bash git — the same workflow `git_wrapup_instructions` walks through, but per-target absolute paths instead of session state.
|
|
92
|
+
|
|
93
|
+
**Task body:**
|
|
94
|
+
|
|
95
|
+
> Run the version-bump wrapup via Bash `git` (no `git-mcp-server` tools — see the orchestration skill's Hard Rule 1).
|
|
96
|
+
>
|
|
97
|
+
> 1. **Inspect state:** `git status`, `git log --oneline -5`, `git diff --stat` on the working tree.
|
|
98
|
+
> 2. **Determine the new version:** start from the current `package.json` `version`, apply the bump intent (`[patch/minor/major or explicit string]`). For a patch, e.g., `0.1.1 → 0.1.2`.
|
|
99
|
+
> 3. **Author the changelog:** create `changelog/<major.minor>.x/<version>.md` per the directory-based convention. YAML frontmatter (`summary:` required, ≤350 chars, no markdown; `breaking:` and `security:` optional, default false). Grouped sections: Added / Changed / Fixed / Removed. Use the format reference at `changelog/template.md` — never edit, rename, or move that file.
|
|
100
|
+
> 4. **Regenerate:** `bun run changelog:build` (rebuilds `CHANGELOG.md` rollup) and `bun run tree` (regenerates `docs/tree.md`).
|
|
101
|
+
> 5. **Bump every version-bearing file:** `package.json` `version`, `server.json` `version` at the top level AND every `packages[].version` entry, any README badge that references the version. Use `grep -rn "<current-version>"` to find any you missed; resolve case by case.
|
|
102
|
+
> 6. **Stage and commit.** Conventional Commits subject. Per the global protocol: version bumps ride with the change that warrants them — for a focused patch this is one commit. Subject style: `feat: <version> — <one-line theme>` or `chore(release): v<version> — <theme>`. Plain `-m` only, no heredoc, no `Co-authored-by` or `Generated with` trailers.
|
|
103
|
+
> 7. **Annotated tag** `v<version>` (`-a`, NOT lightweight): terse message with release theme, notable changes, and dep arrows in `pkg ^old → ^new` form if applicable. Not a CHANGELOG copy.
|
|
104
|
+
>
|
|
105
|
+
> **Do NOT push.** Phase 5 handles the push as part of `release-and-publish`'s verification gate flow.
|
|
106
|
+
>
|
|
107
|
+
> **Verify state at the end:**
|
|
108
|
+
> ```bash
|
|
109
|
+
> git log --oneline -1
|
|
110
|
+
> git show v<version> --stat | head -20
|
|
111
|
+
> git status # should be clean
|
|
112
|
+
> ```
|
|
113
|
+
>
|
|
114
|
+
> Constraints: Bash git only. NEVER `git stash`. NEVER `reset --hard` / `restore .` / `clean -f` / `checkout -- .`. No marketing adjectives ("comprehensive", "robust", "enhanced", "seamless", "improved") in commit or tag messages. Be concise and accurate.
|
|
115
|
+
|
|
116
|
+
After this fanout, each target has a clean working tree with the release commit + tag locally; nothing has been pushed.
|
|
117
|
+
|
|
118
|
+
### Phase 5: Release publish
|
|
119
|
+
|
|
120
|
+
Run only after user authorizes the publish. **This phase is irreversible.**
|
|
121
|
+
|
|
122
|
+
Each target invokes the `release-and-publish` skill end-to-end. Execution mode depends on the npm 2FA setup confirmed in pre-flight:
|
|
123
|
+
|
|
124
|
+
| Mode | When | How |
|
|
125
|
+
|:-----|:-----|:----|
|
|
126
|
+
| **Parallel fanout** | npm 2FA bypass configured, OR no npm publish involved | One sub-agent per target runs `release-and-publish` end-to-end |
|
|
127
|
+
| **Serial (orchestrator-driven)** | npm 2FA prompts OTP interactively | Orchestrator invokes `release-and-publish` against each target one at a time; may use `git-mcp-server` tools in this serial mode |
|
|
128
|
+
|
|
129
|
+
**Parallel mode task body:**
|
|
130
|
+
|
|
131
|
+
> Read `skills/release-and-publish/SKILL.md` (or `.claude/skills/release-and-publish/SKILL.md`). Run it end-to-end:
|
|
132
|
+
>
|
|
133
|
+
> 1. Sanity-check wrapup outputs (working tree clean, HEAD tagged `v<version>` from Phase 4)
|
|
134
|
+
> 2. Verification gate: `bun run devcheck`, `bun run rebuild`, `bun run test:all` (or `test`)
|
|
135
|
+
> 3. Push commits and tags to origin via Bash git
|
|
136
|
+
> 4. `bun publish --access public` (npm — uses the configured bypass token)
|
|
137
|
+
> 5. `bun run publish-mcp` if `server.json` exists (MCP Registry)
|
|
138
|
+
> 6. `docker buildx build --platform linux/amd64,linux/arm64 --push ...` if `Dockerfile` exists (GHCR)
|
|
139
|
+
> 7. Report deployed artifact URLs (npm, MCP Registry, GHCR)
|
|
140
|
+
>
|
|
141
|
+
> Honor the skill's retry/halt protocol — transient network errors retry up to 2× with backoff; idempotent-success signals ("version already exists", "cannot publish duplicate version") are treated as success and proceed. Bash git for all git ops. Never skip the verification gate.
|
|
142
|
+
|
|
143
|
+
**Serial mode:** the orchestrator runs `release-and-publish` against each target sequentially in its own session, handling OTP prompts interactively as they appear.
|
|
144
|
+
|
|
145
|
+
After Phase 5, collect per-target status: which destinations succeeded, which (if any) halted with partial state. The user re-invokes Phase 5 for any failed targets only — completed destinations hit the idempotent-success signal and skip naturally.
|
|
146
|
+
|
|
147
|
+
### Phase 6: Issue closure fanout (optional)
|
|
148
|
+
|
|
149
|
+
Only run if pre-flight captured a GH issue map. One sub-agent per target with the per-target issue list.
|
|
150
|
+
|
|
151
|
+
**Task body:**
|
|
152
|
+
|
|
153
|
+
> For each issue in `[per-target issue list]`:
|
|
154
|
+
>
|
|
155
|
+
> 1. `gh issue view <number> --comments` to read the full thread (body + all comments)
|
|
156
|
+
> 2. Compose a closing comment naming what shipped (version `v<version>` and a one-line summary of the fix or feature)
|
|
157
|
+
> 3. `gh issue comment <number> -b "<comment>"` then `gh issue close <number>` — unless the thread suggests the fix is partial or the issue scope has expanded, in which case comment but do NOT close, and flag back to the orchestrator
|
|
158
|
+
>
|
|
159
|
+
> Constraints: read the full thread before commenting — `gh issue view` alone shows only the thread, not the body; for combined view use `gh api repos/<owner>/<repo>/issues/<number>`. No marketing adjectives. Be concise and accurate.
|
|
160
|
+
|
|
161
|
+
Skip Phase 6 for any target whose Phase 5 didn't complete — there's nothing to close if the release didn't ship.
|
|
162
|
+
|
|
163
|
+
## Gotchas specific to release pass
|
|
164
|
+
|
|
165
|
+
| # | Gotcha | Mitigation |
|
|
166
|
+
|:--|:-------|:-----------|
|
|
167
|
+
| 1 | npm 2FA OTP prompts interleave under parallel publish, breaking all in-flight publishes | Confirm bypass setup in pre-flight; fall back to serial mode for Phase 5 if not configured |
|
|
168
|
+
| 2 | Phase 4 sub-agent pushes prematurely | Restate "Do NOT push" in the Phase 4 prompt verbatim; Phase 5 owns the push as part of `release-and-publish`'s flow |
|
|
169
|
+
| 3 | Version bump skipped a file (`server.json`'s per-package entries, README badge, Dockerfile OCI labels) | Phase 4 prompt enumerates every version-bearing file; the `grep -rn "<current-version>"` step catches stragglers |
|
|
170
|
+
| 4 | Sub-agent reports "tag already exists" — a Phase 4 retry race, or a left-over tag from a failed prior run | Inspect with `git tag -l "v<version>"` and `git show v<version>` before re-running; never `git tag -d` without user authorization |
|
|
171
|
+
| 5 | Two targets derive the same version from a shared assumption | Phase 4 prompt always derives version from each target's CURRENT `package.json`, not from a value the orchestrator assumed |
|
|
172
|
+
| 6 | `release-and-publish` halts mid-flow for one target (network blip on docker push) | The skill's retry protocol handles transient errors; non-transient halts produce a partial-state report. Collect per-target status; user re-invokes for failed targets only |
|
|
173
|
+
| 7 | Phase 6 sub-agent picks the wrong issues by guessing from commit messages | Pre-flight captures the explicit issue map per target; sub-agent works from that list, doesn't discover issues itself |
|
|
174
|
+
| 8 | Annotated tag message bloats into a CHANGELOG copy | Restate the rule in Phase 4 prompt: terse release theme + notable changes + dep arrows in `pkg ^old → ^new` form. Length is earned |
|
|
175
|
+
| 9 | Sub-agent uses `git-mcp-server` instead of Bash git in Phase 4 or 5 | Hard Rule 1 restated explicitly in every fanout prompt that touches git |
|
|
176
|
+
| 10 | Failed publish leaves a tag pushed but no npm package — looks shipped, isn't | Collect per-destination status per target in Phase 5 roll-up; surface partial-state targets explicitly to the user before Phase 6 |
|
|
177
|
+
|
|
178
|
+
## Checklist
|
|
179
|
+
|
|
180
|
+
- [ ] Pre-flight: target list confirmed, version bump intent per target, npm 2FA mode confirmed (bypass / serial / N/A), GH issue map captured (or empty), plan surfaced to user
|
|
181
|
+
- [ ] **User authorization captured for the release**
|
|
182
|
+
- [ ] Phase 2: verification fanout — green `bun run devcheck` + tests per target
|
|
183
|
+
- [ ] Phase 3: README review fanout — updates folded, no commits
|
|
184
|
+
- [ ] Phase 4: wrap-up fanout (Bash git only) — version bumped, changelog authored, rollup regenerated, commit + annotated tag per target — **NOT pushed**
|
|
185
|
+
- [ ] Working tree clean per target; `git show v<version>` succeeds per target
|
|
186
|
+
- [ ] Phase 5: release publish — completed per target via `release-and-publish` (parallel or serial based on 2FA mode); per-target status captured
|
|
187
|
+
- [ ] All targets: deployed artifact URLs reported (npm / MCP Registry / GHCR as applicable)
|
|
188
|
+
- [ ] **If GH issue map captured:** Phase 6: issue closure fanout — relevant issues commented and closed per target whose Phase 5 succeeded
|
|
189
|
+
- [ ] Final read-only verification: `git ls-remote --tags origin` shows the new tag per target, versions match across files, npm/registry show the new version, GH issue status matches intent
|
|
@@ -4,7 +4,7 @@ description: >
|
|
|
4
4
|
Finalize documentation and project metadata for a ship-ready MCP server. Use after implementation is complete, tests pass, and devcheck is clean. Safe to run at any stage — each step checks current state and only acts on what still needs work.
|
|
5
5
|
metadata:
|
|
6
6
|
author: cyanheads
|
|
7
|
-
version: "1.
|
|
7
|
+
version: "1.9"
|
|
8
8
|
audience: external
|
|
9
9
|
type: workflow
|
|
10
10
|
---
|
|
@@ -9,7 +9,7 @@ Fields that may still be empty or generic from scaffolding. Check each one and f
|
|
|
9
9
|
| `name` | `{{PACKAGE_NAME}}` (substituted by init) | Verify it's correct. Use scoped name if publishing (`@org/my-server`). |
|
|
10
10
|
| `version` | `0.1.0` | Keep for initial development. Bump via the `release-and-publish` skill. |
|
|
11
11
|
| `mcpName` | _(often missing)_ | Reverse-domain identifier: `"io.github.{owner}/{repo}"`. Used in `server.json` `name` field and Dockerfile OCI labels. |
|
|
12
|
-
| `description` | `""` (empty) | One sentence
|
|
12
|
+
| `description` | `""` (empty) | One **action-first** sentence — lead with the actions/workflows, end with `via MCP. STDIO or Streamable HTTP.` (or the transports that apply). Example: `"Search projects, manage tasks, track teams via MCP. STDIO or Streamable HTTP."` Avoid `"MCP server for/that …"` framings. Appears on npm and in `npm search`; the README header tagline and `server.json` `description` derive from this (server.json drops the `via MCP …` suffix). |
|
|
13
13
|
| `repository` | _(often missing)_ | `{ "type": "git", "url": "git+https://github.com/org/repo.git" }` |
|
|
14
14
|
| `homepage` | _(often missing)_ | Repository URL or docs URL. |
|
|
15
15
|
| `bugs` | _(often missing)_ | `{ "url": "https://github.com/org/repo/issues" }` |
|
|
@@ -9,7 +9,8 @@ Use this section order. Omit sections that don't apply (e.g., skip Docker/Worker
|
|
|
9
9
|
```text
|
|
10
10
|
# {Server Name} ← centered HTML block
|
|
11
11
|
[Public hosted callout if present] ← centered HTML block, directly under badges
|
|
12
|
-
|
|
12
|
+
Framework badge ← solo, spotlight row — `Built on @cyanheads/mcp-ts-core` (cyan-300 #67E8F9)
|
|
13
|
+
Badges rows ← grouped on subsequent rows — npm, Docker, Version, MCP SDK, License, TS, Bun, Coverage
|
|
13
14
|
---
|
|
14
15
|
## Tools ← grouping sentence → summary table → per-tool subsections
|
|
15
16
|
## Resources and prompts (if any) ← single combined table (Type / Name / Description)
|
|
@@ -27,21 +28,23 @@ Badges row ← npm, Docker, Version, Framework, MCP
|
|
|
27
28
|
|
|
28
29
|
### Title Block
|
|
29
30
|
|
|
30
|
-
Centered HTML. The `<h1>` is the server name — use the scoped package name if published under a scope (e.g., `@cyanheads/my-mcp-server`). The `<p>` is a bold one-liner: what the server
|
|
31
|
+
Centered HTML. The `<h1>` is the server name — use the scoped package name if published under a scope (e.g., `@cyanheads/my-mcp-server`). The `<p>` is a bold **action-first** one-liner: lead with what the server _does_, not what it _is_. List the headline actions/workflows, then end with `via MCP. STDIO or Streamable HTTP.` (or whichever transports apply). Avoid `MCP server for/that …` framings — they describe the wrapper instead of the capability. **Nest the surface count as a `<div>` inside the same `<p>`**, separated by `•` (U+2022 bullet) — not as a second `<p>`. This matches the shipping convention across `@cyanheads/*` servers.
|
|
31
32
|
|
|
32
33
|
```html
|
|
33
34
|
<div align="center">
|
|
34
35
|
<h1>@cyanheads/my-mcp-server</h1>
|
|
35
|
-
<p><b>
|
|
36
|
+
<p><b>Search projects, manage tasks, track teams via MCP. STDIO or Streamable HTTP.</b>
|
|
36
37
|
<div>7 Tools • 2 Resources • 1 Prompt</div>
|
|
37
38
|
</p>
|
|
38
39
|
</div>
|
|
39
40
|
|
|
40
41
|
<div align="center">
|
|
41
42
|
|
|
42
|
-
[](https://www.npmjs.com/package/@cyanheads/mcp-ts-core)
|
|
43
44
|
|
|
44
|
-
[](./CHANGELOG.md) [](./LICENSE) [](https://github.com/users/cyanheads/packages/container/package/my-mcp-server)
|
|
46
|
+
|
|
47
|
+
[](https://modelcontextprotocol.io/) [](https://www.npmjs.com/package/@cyanheads/my-mcp-server) [](https://www.typescriptlang.org/)
|
|
45
48
|
|
|
46
49
|
</div>
|
|
47
50
|
```
|
|
@@ -52,10 +55,10 @@ The header tagline must match the `package.json` `description`.
|
|
|
52
55
|
|
|
53
56
|
| Badge | When to include |
|
|
54
57
|
|:------|:----------------|
|
|
58
|
+
| Framework | Always — links to `@cyanheads/mcp-ts-core` on npm. Cyan-300 (`67E8F9`) for dark text. **Solo on its own row** as the spotlight badge. |
|
|
55
59
|
| npm | Published to npm |
|
|
56
60
|
| Docker | Published to ghcr.io or Docker Hub |
|
|
57
61
|
| Version | Always — link to CHANGELOG.md |
|
|
58
|
-
| Framework | Always — links to `@cyanheads/mcp-ts-core` on npm |
|
|
59
62
|
| MCP SDK | Always — show the `@modelcontextprotocol/sdk` version |
|
|
60
63
|
| License | Always |
|
|
61
64
|
| TypeScript | Always |
|
|
@@ -64,7 +67,7 @@ The header tagline must match the `package.json` `description`.
|
|
|
64
67
|
| Status | Optional — Stable, Beta, etc. |
|
|
65
68
|
| Code Coverage | If coverage is tracked |
|
|
66
69
|
|
|
67
|
-
Add a `---` horizontal rule after the badge block.
|
|
70
|
+
**Layout:** Framework badge sits alone on the first row of the badge block — it's the brand link back to the framework and earns its own line. Group the remaining badges across one or two subsequent rows; keep related concerns together (e.g., release/license/runtime on one row, ecosystem/language on another). Add a `---` horizontal rule after the badge block.
|
|
68
71
|
|
|
69
72
|
### Public Hosted Callout (if present)
|
|
70
73
|
|