@cyanheads/mcp-ts-core 0.13.2 → 0.13.4
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/AGENTS.md +12 -10
- package/CLAUDE.md +12 -10
- package/README.md +2 -2
- package/changelog/0.13.x/0.13.3.md +44 -0
- package/changelog/0.13.x/0.13.4.md +65 -0
- package/changelog/template.md +7 -7
- package/dist/config/appRoot.d.ts.map +1 -1
- package/dist/config/appRoot.js +48 -16
- package/dist/config/appRoot.js.map +1 -1
- package/dist/core/app.d.ts +20 -0
- package/dist/core/app.d.ts.map +1 -1
- package/dist/core/app.js +1 -0
- package/dist/core/app.js.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/linter/rules/schema-rules.d.ts +19 -0
- package/dist/linter/rules/schema-rules.d.ts.map +1 -1
- package/dist/linter/rules/schema-rules.js +36 -0
- package/dist/linter/rules/schema-rules.js.map +1 -1
- package/dist/linter/rules/tool-rules.d.ts +17 -0
- package/dist/linter/rules/tool-rules.d.ts.map +1 -1
- package/dist/linter/rules/tool-rules.js +97 -1
- package/dist/linter/rules/tool-rules.js.map +1 -1
- package/dist/mcp-server/handlerContext.d.ts +6 -0
- package/dist/mcp-server/handlerContext.d.ts.map +1 -1
- package/dist/mcp-server/handlerContext.js.map +1 -1
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts.map +1 -1
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.js +17 -9
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.js.map +1 -1
- package/dist/mcp-server/tools/utils/inputPrevalidation.d.ts +114 -0
- package/dist/mcp-server/tools/utils/inputPrevalidation.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/inputPrevalidation.js +428 -0
- package/dist/mcp-server/tools/utils/inputPrevalidation.js.map +1 -0
- package/dist/mcp-server/tools/utils/strictenRecord.d.ts +42 -0
- package/dist/mcp-server/tools/utils/strictenRecord.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/strictenRecord.js +48 -0
- package/dist/mcp-server/tools/utils/strictenRecord.js.map +1 -0
- package/dist/mcp-server/tools/utils/toolDefinition.d.ts +27 -0
- package/dist/mcp-server/tools/utils/toolDefinition.d.ts.map +1 -1
- package/dist/mcp-server/tools/utils/toolDefinition.js +35 -6
- package/dist/mcp-server/tools/utils/toolDefinition.js.map +1 -1
- package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts +28 -4
- package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts.map +1 -1
- package/dist/mcp-server/tools/utils/toolHandlerFactory.js +245 -23
- package/dist/mcp-server/tools/utils/toolHandlerFactory.js.map +1 -1
- package/dist/services/canvas/core/sqlGate.d.ts +14 -1
- package/dist/services/canvas/core/sqlGate.d.ts.map +1 -1
- package/dist/services/canvas/core/sqlGate.js +69 -7
- package/dist/services/canvas/core/sqlGate.js.map +1 -1
- package/dist/services/canvas/index.d.ts +1 -1
- package/dist/services/canvas/index.d.ts.map +1 -1
- package/dist/services/canvas/index.js +1 -1
- package/dist/services/canvas/index.js.map +1 -1
- package/dist/services/canvas/providers/duckdb/DuckdbProvider.d.ts +20 -0
- package/dist/services/canvas/providers/duckdb/DuckdbProvider.d.ts.map +1 -1
- package/dist/services/canvas/providers/duckdb/DuckdbProvider.js +75 -25
- package/dist/services/canvas/providers/duckdb/DuckdbProvider.js.map +1 -1
- package/dist/services/canvas/types.d.ts +6 -1
- package/dist/services/canvas/types.d.ts.map +1 -1
- package/dist/types-global/errors.d.ts.map +1 -1
- package/dist/types-global/errors.js +4 -3
- package/dist/types-global/errors.js.map +1 -1
- package/dist/utils/index.d.ts +3 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/internal/error-handler/errorHandler.d.ts +33 -0
- package/dist/utils/internal/error-handler/errorHandler.d.ts.map +1 -1
- package/dist/utils/internal/error-handler/errorHandler.js +45 -3
- package/dist/utils/internal/error-handler/errorHandler.js.map +1 -1
- package/dist/utils/network/httpError.d.ts +13 -2
- package/dist/utils/network/httpError.d.ts.map +1 -1
- package/dist/utils/network/httpError.js +4 -2
- package/dist/utils/network/httpError.js.map +1 -1
- package/dist/utils/network/pacer.d.ts +117 -0
- package/dist/utils/network/pacer.d.ts.map +1 -0
- package/dist/utils/network/pacer.js +304 -0
- package/dist/utils/network/pacer.js.map +1 -0
- package/dist/utils/network/retry.d.ts +119 -3
- package/dist/utils/network/retry.d.ts.map +1 -1
- package/dist/utils/network/retry.js +176 -35
- package/dist/utils/network/retry.js.map +1 -1
- package/dist/utils/security/rateLimiter.d.ts +19 -1
- package/dist/utils/security/rateLimiter.d.ts.map +1 -1
- package/dist/utils/security/rateLimiter.js +49 -1
- package/dist/utils/security/rateLimiter.js.map +1 -1
- package/dist/utils/telemetry/attributes.d.ts +19 -0
- package/dist/utils/telemetry/attributes.d.ts.map +1 -1
- package/dist/utils/telemetry/attributes.js +30 -0
- package/dist/utils/telemetry/attributes.js.map +1 -1
- package/framework-skills/add-tool/SKILL.md +43 -2
- package/framework-skills/api-canvas/SKILL.md +8 -4
- package/framework-skills/api-config/SKILL.md +4 -4
- package/framework-skills/api-errors/SKILL.md +19 -10
- package/framework-skills/api-linter/SKILL.md +48 -3
- package/framework-skills/api-telemetry/SKILL.md +26 -2
- package/framework-skills/api-utils/SKILL.md +7 -3
- package/framework-skills/api-utils/references/security.md +2 -2
- package/framework-skills/design-mcp-server/SKILL.md +17 -2
- package/framework-skills/field-test/SKILL.md +3 -1
- package/framework-skills/git-wrapup/SKILL.md +90 -68
- package/framework-skills/orchestrations/SKILL.md +3 -3
- package/framework-skills/release-and-publish/SKILL.md +10 -10
- package/framework-skills/release-pr-review/SKILL.md +19 -26
- package/framework-skills/report-issue-framework/SKILL.md +6 -35
- package/framework-skills/report-issue-local/SKILL.md +6 -36
- package/framework-skills/tool-defs-analysis/SKILL.md +4 -4
- package/package.json +7 -7
- package/templates/.github/ISSUE_TEMPLATE/bug_report.yml +2 -2
- package/templates/.github/ISSUE_TEMPLATE/feature_request.yml +2 -2
- package/templates/.github/workflows/codeql.yml +39 -0
- package/templates/AGENTS.md +3 -1
- package/templates/CLAUDE.md +3 -1
- package/templates/changelog/template.md +7 -7
- package/templates/package.json +2 -2
- package/templates/src/index.ts +4 -3
|
@@ -4,7 +4,7 @@ description: >
|
|
|
4
4
|
File a bug or feature request against @cyanheads/mcp-ts-core when you hit a framework issue. Use when a builder, utility, context method, or config behaves contrary to the documented API — not for server-specific application bugs.
|
|
5
5
|
metadata:
|
|
6
6
|
author: cyanheads
|
|
7
|
-
version: "1.
|
|
7
|
+
version: "1.12"
|
|
8
8
|
audience: external
|
|
9
9
|
type: workflow
|
|
10
10
|
---
|
|
@@ -42,18 +42,16 @@ gh api 'repos/cyanheads/mcp-ts-core/issues/<number>/timeline' --paginate \
|
|
|
42
42
|
|
|
43
43
|
## Writing Well-Structured Issues
|
|
44
44
|
|
|
45
|
-
Good issues are
|
|
45
|
+
Good issues are terse and fact-dense. **Budget: a bug reads in ~150 words, a feature in ~250, code and logs excluded.** Every section past the form's required fields must earn its place — a section you could delete without changing the fix is noise. One or two sentences per bullet; if a bullet runs long, split it or cut it.
|
|
46
46
|
|
|
47
|
+
- **Cut what dilutes the signal.** Mechanism walkthroughs (link the PR or doc instead), ceremonial framings ("This issue covers…"), conversation references ("as discussed", "per offline"), restated context the reader already has, and kitchen-sink Additional context blocks. If a paragraph isn't pulling weight, drop it.
|
|
47
48
|
- **Lead with specifics.** Name the tool, function, module, or symptom. "Currently `createApp()` throws `ConfigurationError` when `MCP_HTTP_PORT` is set to `0`" beats "There's a problem with the config." A reader should know what's broken or missing before the end of the first sentence.
|
|
48
49
|
- **Embed library/service links on first mention.** `[Hono](https://hono.dev/)`, `[linkedom](https://github.com/WebReflection/linkedom)`. Link to the canonical repo or homepage so readers can verify the dependency and reach docs in one click.
|
|
49
50
|
- **Use `owner/repo#N` for cross-repo issue references.** GitHub auto-renders them as linked references (e.g. `cyanheads/pubmed-mcp-server#34`). Bare `#N` only works for same-repo issues.
|
|
50
51
|
- **Add a `Related: #N` line** near the top when the issue grows from prior context (discussions, other issues, PRs). Makes provenance clickable.
|
|
51
52
|
- **Cite cross-references once per body.** Link an issue/PR in `Related:`, the description, or Additional context — not all three. The reader sees them all; redundant linking dilutes signal.
|
|
52
|
-
- **Lead design sections with a philosophy sentence.** Bold a short principle before the tradeoff details — e.g. "Philosophy: **fail fast on config errors, degrade gracefully on runtime errors.**" Establishes the lens for the rest of the section.
|
|
53
53
|
- **Prefer Markdown tables for comparisons.** When showing options, tiers, strategies, or tradeoffs — tables are the highest-density format for scanning N rows × M attributes.
|
|
54
|
-
- **Separate `### Scope` from `### Out of scope`.** The latter is as important as the former — it pre-empts scope-creep debates in comments and signals you've thought about the boundaries.
|
|
55
54
|
- **Use `Depends on: owner/repo#N`** to declare ordering explicitly when implementation is blocked on another issue landing first.
|
|
56
|
-
- **Cut what dilutes the signal.** Mechanism walkthroughs (link the PR or doc instead), ceremonial framings ("This issue covers…"), conversation references ("as discussed", "per offline"), and kitchen-sink Additional context blocks. If a paragraph isn't pulling weight, drop it.
|
|
57
55
|
- **Skip collaborator-framing sign-offs.** Lines like "Happy to open a PR", "let me know if you'd like", "willing to contribute", "if that's the preferred flow" read as noise. A PR link beats an offer; if you're the maintainer filing against your own repo, the offer is redundant. End the body at the last substantive point.
|
|
58
56
|
|
|
59
57
|
## Redact Before Posting
|
|
@@ -72,7 +70,7 @@ gh issue create -R cyanheads/mcp-ts-core --template "Bug Report" --web
|
|
|
72
70
|
|
|
73
71
|
### CLI (non-interactive)
|
|
74
72
|
|
|
75
|
-
Structure the `--body` to match the template's form fields
|
|
73
|
+
Structure the `--body` to match the template's form fields. Description is two or three sentences; the reproduction is the minimal code and the observed output, nothing else. Add `### Additional context` only when it changes the fix (a workaround, a related issue, the one log line that matters) — omitted by default.
|
|
76
74
|
|
|
77
75
|
````bash
|
|
78
76
|
gh issue create -R cyanheads/mcp-ts-core \
|
|
@@ -131,10 +129,6 @@ Error: Output validation failed: ...
|
|
|
131
129
|
### Expected behavior
|
|
132
130
|
|
|
133
131
|
Omitting an optional output field should pass validation.
|
|
134
|
-
|
|
135
|
-
### Additional context
|
|
136
|
-
|
|
137
|
-
Any workarounds, related issues, or observations.
|
|
138
132
|
ISSUE
|
|
139
133
|
)"
|
|
140
134
|
````
|
|
@@ -214,7 +208,7 @@ gh issue create -R cyanheads/mcp-ts-core --template "Feature Request" --web
|
|
|
214
208
|
|
|
215
209
|
### CLI (non-interactive)
|
|
216
210
|
|
|
217
|
-
The first three headings are the Feature Request form's own fields, in its order — `Use case` and `Proposed API` are required by the form, so a body without them does not satisfy it.
|
|
211
|
+
The first three headings are the Feature Request form's own fields, in its order — `Use case` and `Proposed API` are required by the form, so a body without them does not satisfy it. `Out of scope` is one or two lines. Nothing else by default: a `Scope`, `Flow`, `Design / Tradeoffs`, or `Depends on` block is added only when the reader cannot act without it, and each stays to a few lines.
|
|
218
212
|
|
|
219
213
|
````bash
|
|
220
214
|
gh issue create -R cyanheads/mcp-ts-core \
|
|
@@ -245,33 +239,9 @@ const result = await withRetry(() => fetchExternal(url), {
|
|
|
245
239
|
|
|
246
240
|
What you tried or evaluated instead, and why it didn't fit.
|
|
247
241
|
|
|
248
|
-
### Scope
|
|
249
|
-
|
|
250
|
-
- Files or modules touched
|
|
251
|
-
- New exports, env vars, or config keys
|
|
252
|
-
- Tier (Tier 1 core / Tier 2 standard / Tier 3 optional peer dep)
|
|
253
|
-
|
|
254
242
|
### Out of scope
|
|
255
243
|
|
|
256
|
-
- What we're deliberately not doing
|
|
257
244
|
- Adjacent work that belongs in a separate issue
|
|
258
|
-
|
|
259
|
-
### Flow (optional)
|
|
260
|
-
|
|
261
|
-
Ordered steps — e.g. `trigger → resolve → fetch → degrade`. Useful when the change spans multiple phases or fallbacks.
|
|
262
|
-
|
|
263
|
-
### Design / Tradeoffs (optional)
|
|
264
|
-
|
|
265
|
-
Philosophy: **one-line principle in bold.**
|
|
266
|
-
|
|
267
|
-
| Option | Strengths | Weaknesses |
|
|
268
|
-
|:---|:---|:---|
|
|
269
|
-
| A | ... | ... |
|
|
270
|
-
| B | ... | ... |
|
|
271
|
-
|
|
272
|
-
### Dependencies (optional)
|
|
273
|
-
|
|
274
|
-
- Depends on: owner/repo#N
|
|
275
245
|
ISSUE
|
|
276
246
|
)"
|
|
277
247
|
````
|
|
@@ -299,3 +269,4 @@ gh issue list -R cyanheads/mcp-ts-core --author @me
|
|
|
299
269
|
- [ ] Primary label assigned (`bug` / `enhancement` / `documentation`)
|
|
300
270
|
- [ ] If bug: version, runtime, repro code, actual vs expected behavior included
|
|
301
271
|
- [ ] If feature: `Use case` and `Proposed API` present (the form's required fields), `Alternatives considered` third; Out of scope defined
|
|
272
|
+
- [ ] Inside the budget — ~150 words for a bug, ~250 for a feature, code and logs excluded — and every section past the form's fields earns its place
|
|
@@ -4,7 +4,7 @@ description: >
|
|
|
4
4
|
File a bug or feature request against this MCP server's own repo. Use for server-specific issues — tool logic, service integrations, config problems, or domain bugs that aren't caused by the framework.
|
|
5
5
|
metadata:
|
|
6
6
|
author: cyanheads
|
|
7
|
-
version: "1.
|
|
7
|
+
version: "1.10"
|
|
8
8
|
audience: external
|
|
9
9
|
type: workflow
|
|
10
10
|
---
|
|
@@ -49,18 +49,16 @@ gh api 'repos/{owner}/{repo}/issues/<number>/timeline' --paginate \
|
|
|
49
49
|
|
|
50
50
|
## Writing Well-Structured Issues
|
|
51
51
|
|
|
52
|
-
Good issues are
|
|
52
|
+
Good issues are terse and fact-dense. **Budget: a bug reads in ~150 words, a feature in ~250, code and logs excluded.** Every section past the form's required fields must earn its place — a section you could delete without changing the fix is noise. One or two sentences per bullet; if a bullet runs long, split it or cut it.
|
|
53
53
|
|
|
54
|
+
- **Cut what dilutes the signal.** Mechanism walkthroughs (link the PR or doc instead), ceremonial framings ("This issue covers…"), conversation references ("as discussed", "per offline"), restated context the reader already has, and kitchen-sink Additional context blocks. If a paragraph isn't pulling weight, drop it.
|
|
54
55
|
- **Lead with specifics.** Name the tool, service, resource, or symptom. "Currently `search_docs` returns an empty array for queries containing `&`" beats "Search is broken." A reader should know what's wrong before the end of the first sentence.
|
|
55
56
|
- **Embed library/service links on first mention.** `[Hono](https://hono.dev/)`, `[Supabase](https://supabase.com/)`. Link to the canonical repo or homepage so readers can verify the dependency and reach docs in one click.
|
|
56
57
|
- **Use `owner/repo#N` for cross-repo issue references.** GitHub auto-renders them as linked references (e.g. `cyanheads/mcp-ts-core#46`). Bare `#N` only works for same-repo issues — useful when the bug depends on or relates to a framework issue.
|
|
57
58
|
- **Add a `Related: #N` line** near the top when the issue grows from prior context (discussions, other issues, PRs). Makes provenance clickable.
|
|
58
59
|
- **Cite cross-references once per body.** Link an issue/PR in `Related:`, the description, or Additional context — not all three. The reader sees them all; redundant linking dilutes signal.
|
|
59
|
-
- **Lead design sections with a philosophy sentence.** Bold a short principle before the tradeoff details — e.g. "Philosophy: **return best-effort data, don't fail the tool call on parsing edge cases.**" Establishes the lens for the rest of the section.
|
|
60
60
|
- **Prefer Markdown tables for comparisons.** When showing options, data sources, strategies, or tradeoffs — tables are the highest-density format for scanning N rows × M attributes.
|
|
61
|
-
- **Separate `### Scope` from `### Out of scope`.** The latter is as important as the former — it pre-empts scope-creep debates in comments and signals you've thought about the boundaries.
|
|
62
61
|
- **Use `Depends on: owner/repo#N`** to declare ordering explicitly when implementation is blocked on an upstream framework change or another issue landing first.
|
|
63
|
-
- **Cut what dilutes the signal.** Mechanism walkthroughs (link the PR or doc instead), ceremonial framings ("This issue covers…"), conversation references ("as discussed", "per offline"), and kitchen-sink Additional context blocks. If a paragraph isn't pulling weight, drop it.
|
|
64
62
|
- **Skip collaborator-framing sign-offs.** Lines like "Happy to open a PR", "let me know if you'd like", "willing to contribute", "if that's the preferred flow" read as noise. A PR link beats an offer; if you're the maintainer filing against your own repo, the offer is redundant. End the body at the last substantive point.
|
|
65
63
|
|
|
66
64
|
## Redact Before Posting
|
|
@@ -79,7 +77,7 @@ gh issue create --template "Bug Report" --web
|
|
|
79
77
|
|
|
80
78
|
### CLI (non-interactive)
|
|
81
79
|
|
|
82
|
-
Structure the `--body` to match the template's form fields
|
|
80
|
+
Structure the `--body` to match the template's form fields. Description is two or three sentences; the reproduction is the exact input and the observed output, nothing else. Add `### Additional context` only when it changes the fix (a workaround, a related issue, the one log line that matters) — omitted by default.
|
|
83
81
|
|
|
84
82
|
````bash
|
|
85
83
|
gh issue create \
|
|
@@ -125,10 +123,6 @@ Error or incorrect output here
|
|
|
125
123
|
### Expected behavior
|
|
126
124
|
|
|
127
125
|
What should have happened.
|
|
128
|
-
|
|
129
|
-
### Additional context
|
|
130
|
-
|
|
131
|
-
Relevant `ctx.log` output, stack traces, or telemetry spans.
|
|
132
126
|
ISSUE
|
|
133
127
|
)"
|
|
134
128
|
````
|
|
@@ -213,7 +207,7 @@ gh issue create --template "Feature Request" --web
|
|
|
213
207
|
|
|
214
208
|
### CLI (non-interactive)
|
|
215
209
|
|
|
216
|
-
The first three headings are the Feature Request form's own fields, in its order — `Use case` and `Proposed behavior` are required by the form, so a body without them does not satisfy it.
|
|
210
|
+
The first three headings are the Feature Request form's own fields, in its order — `Use case` and `Proposed behavior` are required by the form, so a body without them does not satisfy it. `Out of scope` is one or two lines. Nothing else by default: a `Scope`, `Flow`, `Design / Tradeoffs`, or `Depends on` block is added only when the reader cannot act without it, and each stays to a few lines.
|
|
217
211
|
|
|
218
212
|
````bash
|
|
219
213
|
gh issue create \
|
|
@@ -239,34 +233,9 @@ What you want the server to do, then the new behavior or surface. For tool/resou
|
|
|
239
233
|
|
|
240
234
|
What you tried or evaluated instead, and why it didn't fit.
|
|
241
235
|
|
|
242
|
-
### Scope
|
|
243
|
-
|
|
244
|
-
- Files or modules touched
|
|
245
|
-
- New env vars, config keys, or service integrations
|
|
246
|
-
- New or modified tools / resources / prompts
|
|
247
|
-
|
|
248
236
|
### Out of scope
|
|
249
237
|
|
|
250
|
-
- What we're deliberately not doing
|
|
251
238
|
- Adjacent work that belongs in a separate issue
|
|
252
|
-
|
|
253
|
-
### Flow (optional)
|
|
254
|
-
|
|
255
|
-
Ordered steps — e.g. `request → lookup → fallback → respond`. Useful when the change spans multiple phases or fallbacks.
|
|
256
|
-
|
|
257
|
-
### Design / Tradeoffs (optional)
|
|
258
|
-
|
|
259
|
-
Philosophy: **one-line principle in bold.**
|
|
260
|
-
|
|
261
|
-
| Option | Strengths | Weaknesses |
|
|
262
|
-
|:---|:---|:---|
|
|
263
|
-
| A | ... | ... |
|
|
264
|
-
| B | ... | ... |
|
|
265
|
-
|
|
266
|
-
### Dependencies (optional)
|
|
267
|
-
|
|
268
|
-
- Depends on: cyanheads/mcp-ts-core#N (upstream framework change)
|
|
269
|
-
- Depends on: owner/repo#N (other server work)
|
|
270
239
|
ISSUE
|
|
271
240
|
)"
|
|
272
241
|
````
|
|
@@ -311,3 +280,4 @@ gh issue close <number> --reason completed --comment "Fixed in <commit or PR>"
|
|
|
311
280
|
- [ ] Primary label assigned (`bug` / `enhancement` / `documentation`)
|
|
312
281
|
- [ ] If bug: version, runtime, repro steps, actual vs expected behavior included
|
|
313
282
|
- [ ] If feature: `Use case` and `Proposed behavior` present (the form's required fields), `Alternatives considered` third; Out of scope defined
|
|
283
|
+
- [ ] Inside the budget — ~150 words for a bug, ~250 for a feature, code and logs excluded — and every section past the form's fields earns its place
|
|
@@ -4,7 +4,7 @@ description: >
|
|
|
4
4
|
Read-only audit of MCP definition language across an existing surface — tools, resources, prompts, server instructions. Walks every definition file and checks 16 categories the LLM reads to decide whether and how to call: voice & tense, internal leaks, audience leaks, defaults, recovery hints, field descriptions, cross-references, sparsity, examples, structure, mutator observability, unit-bearing numeric names, validator-enforced constraints, annotations truthfulness, single-line strings, exclusive modes in the schema — then a cross-surface pass: naming taxonomy, parameter vocabulary, tool overlap, instructions drift, length outliers. Produces grouped findings with file:line citations and a numbered options list. Use during polish, after a refactor, or before a release. Complements `field-test` (behavior testing) and `security-pass` (security audit).
|
|
5
5
|
metadata:
|
|
6
6
|
author: cyanheads
|
|
7
|
-
version: "1.
|
|
7
|
+
version: "1.6"
|
|
8
8
|
audience: external
|
|
9
9
|
type: audit
|
|
10
10
|
---
|
|
@@ -153,9 +153,9 @@ Field-test catches this in its leak audit; this skill is the more thorough pass.
|
|
|
153
153
|
|
|
154
154
|
**Look in:** tool / resource / prompt `description`.
|
|
155
155
|
|
|
156
|
-
**Check:** single cohesive paragraph. No bullet lists, no blank-line-separated sections, no markdown headers inside the description.
|
|
156
|
+
**Check:** single cohesive paragraph, written as one string literal in source. No bullet lists, no blank-line-separated sections, no markdown headers inside the description; no `+`-joined fragments in the file — a description assembled one sentence per line reads as a list of disconnected claims and grows a line at a time until it is several times its siblings' length.
|
|
157
157
|
|
|
158
|
-
**Smell:** blank lines (`\n\n`) inside a description string, `- bullet` lines, `## Header` lines, "Operations:\n- foo: …" duplicating an enum's `.describe()` text
|
|
158
|
+
**Smell:** blank lines (`\n\n`) inside a description string, `- bullet` lines, `## Header` lines, "Operations:\n- foo: …" duplicating an enum's `.describe()` text, `'…' +` continuation lines under `description:`.
|
|
159
159
|
|
|
160
160
|
#### 11. Mutator observability
|
|
161
161
|
|
|
@@ -218,7 +218,7 @@ The per-file walk misses drift that only shows between files. After it, sweep th
|
|
|
218
218
|
- **Naming taxonomy** — verb prefixes mean one thing each across the surface (`search_` / `find_` / `get_` / `list_` / `lookup_`); the same verb carrying different semantics on different tools is a finding.
|
|
219
219
|
- **Parameter vocabulary** — one name per concept everywhere: `query` vs `q`, `limit` vs `maxResults`, `nctId` vs `nct_id` on sibling tools is a finding.
|
|
220
220
|
- **Tool overlap** — for any pair with adjacent scope, the two descriptions alone must answer "when X vs Y." If an agent can't pick, that's material.
|
|
221
|
-
- **Instructions drift** — if the server sets `instructions`: every tool it names exists, workflow guidance reflects the current surface (new tools that belong in it, renamed or removed ones purged), and nothing contradicts a per-tool description.
|
|
221
|
+
- **Instructions drift** — if the server sets `instructions`: every tool it names exists, workflow guidance reflects the current surface (new tools that belong in it, renamed or removed ones purged), and nothing contradicts a per-tool description. Shape is a finding too: two to three cohesive sentences in one string literal (no `+`-joined fragments, no one-line-per-tool inventory — the catalog already carries that), written for the calling agent only. Operator configuration (`*_BASE_URL`, API keys, ports) belongs in the README and `.env.example`, not here — the agent cannot act on it.
|
|
222
222
|
- **Length outliers** — a description several times longer than its siblings (attention drag), or a one-liner that underspecifies (selection risk).
|
|
223
223
|
|
|
224
224
|
Cross-surface findings use the same finding format, cited at the file:line you'd change (the `instructions` string is a citable location).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cyanheads/mcp-ts-core",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.4",
|
|
4
4
|
"mcpName": "io.github.cyanheads/mcp-ts-core",
|
|
5
5
|
"description": "Agent-native TypeScript framework for MCP servers. Includes runtime infrastructure and agent skills for building, testing, and shipping servers.",
|
|
6
6
|
"files": [
|
|
@@ -200,7 +200,7 @@
|
|
|
200
200
|
"@biomejs/biome": "2.5.13",
|
|
201
201
|
"@cloudflare/vitest-pool-workers": "^0.22.0",
|
|
202
202
|
"@cloudflare/workers-types": "5.20260910.1",
|
|
203
|
-
"@duckdb/node-api": "^1.5.5-r.
|
|
203
|
+
"@duckdb/node-api": "^1.5.5-r.5",
|
|
204
204
|
"@hono/otel": "^1.1.2",
|
|
205
205
|
"@opentelemetry/exporter-metrics-otlp-http": "^0.222.0",
|
|
206
206
|
"@opentelemetry/exporter-trace-otlp-http": "^0.222.0",
|
|
@@ -228,10 +228,10 @@
|
|
|
228
228
|
"depcheck": "^1.4.7",
|
|
229
229
|
"diff": "^9.0.0",
|
|
230
230
|
"execa": "^10.0.1",
|
|
231
|
-
"fast-check": "^4.
|
|
231
|
+
"fast-check": "^4.10.0",
|
|
232
232
|
"fast-xml-parser": "^5.11.1",
|
|
233
233
|
"ignore": "^7.0.9",
|
|
234
|
-
"js-yaml": "^5.4.
|
|
234
|
+
"js-yaml": "^5.4.2",
|
|
235
235
|
"linkedom": "^0.18.13",
|
|
236
236
|
"node-cron": "^4.6.0",
|
|
237
237
|
"openai": "^7.15.0",
|
|
@@ -241,7 +241,7 @@
|
|
|
241
241
|
"pino-pretty": "^13.1.3",
|
|
242
242
|
"repomix": "^1.18.0",
|
|
243
243
|
"sanitize-html": "^2.17.7",
|
|
244
|
-
"tsc-alias": "^1.9.
|
|
244
|
+
"tsc-alias": "^1.9.5",
|
|
245
245
|
"typedoc": "^0.28.20",
|
|
246
246
|
"typescript": "^7.0.2",
|
|
247
247
|
"typescript-v6": "npm:typescript@^6.0.3",
|
|
@@ -306,10 +306,10 @@
|
|
|
306
306
|
"@modelcontextprotocol/server": "^2.0.0",
|
|
307
307
|
"@opentelemetry/api": "^1.9.1",
|
|
308
308
|
"dotenv": "^17.4.2",
|
|
309
|
-
"hono": "^4.13.
|
|
309
|
+
"hono": "^4.13.8",
|
|
310
310
|
"jose": "^6.2.12",
|
|
311
311
|
"pino": "^10.3.1",
|
|
312
|
-
"zod": "^4.6.
|
|
312
|
+
"zod": "^4.6.5"
|
|
313
313
|
},
|
|
314
314
|
"peerDependencies": {
|
|
315
315
|
"@duckdb/node-api": "^1.5.5-r.1",
|
|
@@ -76,7 +76,7 @@ body:
|
|
|
76
76
|
id: description
|
|
77
77
|
attributes:
|
|
78
78
|
label: Description
|
|
79
|
-
description: What happened and what you expected instead.
|
|
79
|
+
description: What happened and what you expected instead — two or three sentences.
|
|
80
80
|
validations:
|
|
81
81
|
required: true
|
|
82
82
|
|
|
@@ -112,6 +112,6 @@ body:
|
|
|
112
112
|
id: context
|
|
113
113
|
attributes:
|
|
114
114
|
label: Additional context
|
|
115
|
-
description:
|
|
115
|
+
description: Only what changes the fix — a workaround, a related issue, the one log line that matters.
|
|
116
116
|
validations:
|
|
117
117
|
required: false
|
|
@@ -17,7 +17,7 @@ body:
|
|
|
17
17
|
id: use-case
|
|
18
18
|
attributes:
|
|
19
19
|
label: Use case
|
|
20
|
-
description: What problem does this solve? Who benefits?
|
|
20
|
+
description: What problem does this solve? Who benefits? Two or three sentences.
|
|
21
21
|
validations:
|
|
22
22
|
required: true
|
|
23
23
|
|
|
@@ -42,6 +42,6 @@ body:
|
|
|
42
42
|
id: context
|
|
43
43
|
attributes:
|
|
44
44
|
label: Additional context
|
|
45
|
-
description:
|
|
45
|
+
description: Only what the reader needs to act — related issues, prior art, a link.
|
|
46
46
|
validations:
|
|
47
47
|
required: false
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# CodeQL static analysis — the one workflow every server carries.
|
|
2
|
+
# Verification (typecheck, lint, tests) is local; this file exists because CodeQL
|
|
3
|
+
# is GitHub-owned end to end and a workflow file is visible in the repo where a
|
|
4
|
+
# repo-level "default setup" is not. Default setup must be OFF for this to run.
|
|
5
|
+
name: CodeQL
|
|
6
|
+
|
|
7
|
+
on:
|
|
8
|
+
push:
|
|
9
|
+
branches: [main]
|
|
10
|
+
pull_request:
|
|
11
|
+
branches: [main]
|
|
12
|
+
schedule:
|
|
13
|
+
- cron: '30 6 * * 1'
|
|
14
|
+
|
|
15
|
+
permissions:
|
|
16
|
+
contents: read
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
analyze:
|
|
20
|
+
name: Analyze
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
timeout-minutes: 15
|
|
23
|
+
permissions:
|
|
24
|
+
security-events: write
|
|
25
|
+
contents: read
|
|
26
|
+
actions: read
|
|
27
|
+
|
|
28
|
+
steps:
|
|
29
|
+
- name: Checkout repository
|
|
30
|
+
uses: actions/checkout@v7
|
|
31
|
+
|
|
32
|
+
- name: Initialize CodeQL
|
|
33
|
+
uses: github/codeql-action/init@v4
|
|
34
|
+
with:
|
|
35
|
+
languages: javascript-typescript, actions
|
|
36
|
+
build-mode: none
|
|
37
|
+
|
|
38
|
+
- name: Perform CodeQL Analysis
|
|
39
|
+
uses: github/codeql-action/analyze@v4
|
package/templates/AGENTS.md
CHANGED
|
@@ -311,7 +311,7 @@ Available skills:
|
|
|
311
311
|
| `code-simplifier` | Post-session cleanup against `git diff` — modernize syntax, consolidate duplication, align with the codebase |
|
|
312
312
|
| `polish-docs-meta` | Finalize docs, README, metadata, and agent protocol for shipping |
|
|
313
313
|
| `git-wrapup` | Land working-tree changes as a commit stack — version bump, changelog, verify, commit by concern, release commit on top. No tag, no push to main; opens the release PR when the project declares release PR mode |
|
|
314
|
-
| `release-pr-review` | Review pass on an open release PR — simplifier + correctness review,
|
|
314
|
+
| `release-pr-review` | Review pass on an open release PR — simplifier + correctness review, fixes as ordinary commits on top of the stack, PR body kept in sync. Release PR mode only |
|
|
315
315
|
| `release-and-publish` | Fast-forward merge (release PR mode) + tag + push + npm + MCP Registry + GH Release + Docker. Picks up from `git-wrapup` |
|
|
316
316
|
| `maintenance` | Investigate changelogs, adopt upstream changes, sync skills to agent dirs |
|
|
317
317
|
| `orchestrations` | Chain task skills into a gated multi-phase pipeline — build-out, QA-fix, update-ship — when you can spawn sub-agents |
|
|
@@ -362,6 +362,8 @@ When you complete a skill's checklist, check the boxes and add a completion time
|
|
|
362
362
|
| `bun run changelog:check` | Verify `CHANGELOG.md` is in sync (used by devcheck) |
|
|
363
363
|
| `bun run bundle` | Build, pack, and clean a `.mcpb` for one-click Claude Desktop install |
|
|
364
364
|
|
|
365
|
+
**CI is one file.** `.github/workflows/codeql.yml` (scaffolded) is the only GitHub Actions workflow: CodeQL is GitHub-owned end to end, and the file runs only while the repo's CodeQL *default setup* is turned off. Verification — `devcheck`, tests, the release gates — runs locally; don't add a workflow that re-runs it.
|
|
366
|
+
|
|
365
367
|
---
|
|
366
368
|
|
|
367
369
|
## Bundling
|
package/templates/CLAUDE.md
CHANGED
|
@@ -311,7 +311,7 @@ Available skills:
|
|
|
311
311
|
| `code-simplifier` | Post-session cleanup against `git diff` — modernize syntax, consolidate duplication, align with the codebase |
|
|
312
312
|
| `polish-docs-meta` | Finalize docs, README, metadata, and agent protocol for shipping |
|
|
313
313
|
| `git-wrapup` | Land working-tree changes as a commit stack — version bump, changelog, verify, commit by concern, release commit on top. No tag, no push to main; opens the release PR when the project declares release PR mode |
|
|
314
|
-
| `release-pr-review` | Review pass on an open release PR — simplifier + correctness review,
|
|
314
|
+
| `release-pr-review` | Review pass on an open release PR — simplifier + correctness review, fixes as ordinary commits on top of the stack, PR body kept in sync. Release PR mode only |
|
|
315
315
|
| `release-and-publish` | Fast-forward merge (release PR mode) + tag + push + npm + MCP Registry + GH Release + Docker. Picks up from `git-wrapup` |
|
|
316
316
|
| `maintenance` | Investigate changelogs, adopt upstream changes, sync skills to agent dirs |
|
|
317
317
|
| `orchestrations` | Chain task skills into a gated multi-phase pipeline — build-out, QA-fix, update-ship — when you can spawn sub-agents |
|
|
@@ -362,6 +362,8 @@ When you complete a skill's checklist, check the boxes and add a completion time
|
|
|
362
362
|
| `bun run changelog:check` | Verify `CHANGELOG.md` is in sync (used by devcheck) |
|
|
363
363
|
| `bun run bundle` | Build, pack, and clean a `.mcpb` for one-click Claude Desktop install |
|
|
364
364
|
|
|
365
|
+
**CI is one file.** `.github/workflows/codeql.yml` (scaffolded) is the only GitHub Actions workflow: CodeQL is GitHub-owned end to end, and the file runs only while the repo's CodeQL *default setup* is turned off. Verification — `devcheck`, tests, the release gates — runs locally; don't add a workflow that re-runs it.
|
|
366
|
+
|
|
365
367
|
---
|
|
366
368
|
|
|
367
369
|
## Bundling
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
# Required. One-line GitHub Release-style headline. 350 character cap — a
|
|
8
8
|
# ceiling, not a target. Default short and scannable. Don't pad, don't stitch
|
|
9
|
-
# unrelated changes with commas/semicolons into an inventory — pick the
|
|
10
|
-
# headline
|
|
9
|
+
# unrelated changes with commas/semicolons into an inventory — pick the one
|
|
10
|
+
# headline the release is about. Quotes required: unquoted YAML treats
|
|
11
11
|
# `: ` inside the value as a key separator and fails GitHub's strict parser.
|
|
12
12
|
summary: ""
|
|
13
13
|
|
|
@@ -119,11 +119,11 @@ security: false
|
|
|
119
119
|
TAG ANNOTATIONS — the annotated tag body renders as the GitHub Release body
|
|
120
120
|
via `gh release create --notes-from-tag`. It is a condensed digest of this
|
|
121
121
|
entry, never a copy, and its format is owned by the `release-and-publish`
|
|
122
|
-
skill (step 4, "Create the annotated tag"):
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
122
|
+
skill (step 4, "Create the annotated tag"): a short subject line without the
|
|
123
|
+
version, flat headline bullets — no Keep-a-Changelog section headers, no
|
|
124
|
+
gates line — at most one deps line, issue backlinks, and the changelog link
|
|
125
|
+
last. In release-PR mode the `git-wrapup` skill authors those bullets as the
|
|
126
|
+
PR body's `## Changes` and the tag copies them.
|
|
127
127
|
-->
|
|
128
128
|
|
|
129
129
|
## Added
|
package/templates/package.json
CHANGED
package/templates/src/index.ts
CHANGED
|
@@ -17,9 +17,10 @@ await createApp({
|
|
|
17
17
|
tools: [echoTool, echoAppTool],
|
|
18
18
|
resources: [echoResource, echoAppUiResource],
|
|
19
19
|
prompts: [echoPrompt],
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
//
|
|
20
|
+
// Server-level orientation forwarded to the model on every initialize: two to three
|
|
21
|
+
// cohesive sentences in one string literal, written for the calling agent (which tool
|
|
22
|
+
// opens a workflow, what chains into what). Operator configuration stays in the README.
|
|
23
|
+
// instructions: 'Resolve a name to an id with example_search, then pass that id to example_get for the full record. Results are paged; follow nextOffset until it is absent.',
|
|
23
24
|
|
|
24
25
|
// Session posture in code rather than in a Dockerfile. MCP_SESSION_MODE still
|
|
25
26
|
// wins when it is set. Add `require: 'stateful'` — `{ default: 'stateful',
|