Skip to content

Commit 0090092

Browse files
mcp-tool-shopclaude
andcommitted
feat: add optional press block to tool schema
Non-breaking additive extension: tools can now include an optional press block with boilerplate, contacts, quotes, comparables, and partner offers. All sub-schemas use additionalProperties: false. Seed data added for zip-meta-map: 2 quotes (claim-traced), 2 comparables, 2 partner offers, 1 contact method. Validator updated to check press quote claimRefs resolve. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 4075a92 commit 0090092

4 files changed

Lines changed: 207 additions & 8 deletions

File tree

marketing/data/tools/zip-meta-map.json

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,5 +128,52 @@
128128
],
129129
"constraints": { "maxChars": 700 }
130130
}
131-
]
131+
],
132+
"press": {
133+
"boilerplate": {
134+
"projectDescription": "zip-meta-map is a Python CLI that generates deterministic, JSON Schema-validated indexes of repositories and ZIP archives. It produces structured context for LLM agents with configurable token budgets and CI gating via diff --exit-code. The output is plain JSON consumable by any tool — no vendor lock-in, no runtime dependency.",
135+
"founderBio": "Built by the mcp-tool-shop team — a small group focused on deterministic developer tooling for AI agent infrastructure.",
136+
"preferredNouns": ["tool", "CLI", "indexer"],
137+
"forbiddenPhrases": ["AI-powered", "revolutionary", "game-changer", "magic", "next-generation"]
138+
},
139+
"contacts": [
140+
{
141+
"method": "github-issue",
142+
"value": "https://github.com/mcp-tool-shop-org/zip-meta-map/issues",
143+
"label": "GitHub Issues (preferred)"
144+
}
145+
],
146+
"quotes": [
147+
{
148+
"text": "Same repo, same output, every time. That is the entire design contract.",
149+
"attribution": "mcp-tool-shop team",
150+
"claimRefs": ["claim.zip-meta-map.deterministic-output"]
151+
},
152+
{
153+
"text": "We wrote 246 tests not because we like writing tests, but because determinism demands proof.",
154+
"attribution": "mcp-tool-shop team",
155+
"claimRefs": ["claim.zip-meta-map.246-tests"]
156+
}
157+
],
158+
"comparables": [
159+
{
160+
"target": "tree / find + jq pipelines",
161+
"distinction": "zip-meta-map produces schema-validated JSON with LLM token budgets and CI-grade diffing, not ad-hoc text output."
162+
},
163+
{
164+
"target": "Sourcegraph / code search",
165+
"distinction": "Complementary, not competitive. zip-meta-map provides structural metadata; code search provides content retrieval."
166+
}
167+
],
168+
"partnerOffers": [
169+
{
170+
"type": "integration",
171+
"description": "We will work with LLM tool authors to integrate zip-meta-map indexes as a context source."
172+
},
173+
{
174+
"type": "early-access",
175+
"description": "Pre-release access to new index formats and plan structures before public release."
176+
}
177+
]
178+
}
132179
}

marketing/manifests/marketing.lock.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"schemaVersion": "1.0.0",
3-
"generatedAt": "2026-02-15T21:35:10.751Z",
3+
"generatedAt": "2026-02-15T22:55:51.343Z",
44
"generator": "gen-lock.mjs",
55
"files": [
66
{
@@ -25,8 +25,8 @@
2525
},
2626
{
2727
"path": "marketing/data/tools/zip-meta-map.json",
28-
"sha256": "5977b2dd52eb636ec13c9d1f994ec121372060bf3547bfd11345ab48eb2e9598",
29-
"bytes": 5526
28+
"sha256": "7b62c662704e6aedf8d9d9f698cbcae64f5f8fabd669a73db804aac3282cedc2",
29+
"bytes": 7680
3030
},
3131
{
3232
"path": "marketing/manifests/evidence.manifest.json",
@@ -35,8 +35,8 @@
3535
},
3636
{
3737
"path": "marketing/schema/marketing.schema.json",
38-
"sha256": "f95de57b8821672b6534543e61da3e2b20867cd0ec06dab732b246968a84800f",
39-
"bytes": 9575
38+
"sha256": "97dc4f550b714b5875f0bba698a0106dca66891011dabcf28a65a3705954622d",
39+
"bytes": 13542
4040
}
4141
]
4242
}

marketing/schema/marketing.schema.json

Lines changed: 137 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,141 @@
5353
"enum": ["web", "readme", "hn", "x", "linkedin", "newsletter", "presskit"]
5454
},
5555

56+
"pressContactMethod": {
57+
"type": "string",
58+
"enum": ["email", "x-dm", "linkedin", "github-issue", "form"]
59+
},
60+
61+
"pressContact": {
62+
"type": "object",
63+
"required": ["method", "value"],
64+
"properties": {
65+
"method": { "$ref": "#/$defs/pressContactMethod" },
66+
"value": {
67+
"type": "string",
68+
"description": "Contact value (URL, email, handle)."
69+
},
70+
"label": {
71+
"type": "string",
72+
"description": "Human-readable label for this contact method."
73+
},
74+
"notes": { "type": "string" }
75+
},
76+
"additionalProperties": false
77+
},
78+
79+
"pressQuote": {
80+
"type": "object",
81+
"required": ["text"],
82+
"properties": {
83+
"text": {
84+
"type": "string",
85+
"maxLength": 500,
86+
"description": "Approved quote text."
87+
},
88+
"attribution": {
89+
"type": "string",
90+
"description": "Who said this."
91+
},
92+
"role": {
93+
"type": "string",
94+
"description": "Role or title of the person quoted."
95+
},
96+
"claimRefs": {
97+
"type": "array",
98+
"items": { "$ref": "#/$defs/claimId" },
99+
"description": "Claims this quote supports."
100+
}
101+
},
102+
"additionalProperties": false
103+
},
104+
105+
"pressComparable": {
106+
"type": "object",
107+
"required": ["target", "distinction"],
108+
"properties": {
109+
"target": {
110+
"type": "string",
111+
"description": "What this tool is similar to."
112+
},
113+
"distinction": {
114+
"type": "string",
115+
"description": "How it differs (honest, not dismissive)."
116+
},
117+
"notes": { "type": "string" }
118+
},
119+
"additionalProperties": false
120+
},
121+
122+
"pressPartnerOffer": {
123+
"type": "object",
124+
"required": ["type", "description"],
125+
"properties": {
126+
"type": {
127+
"type": "string",
128+
"enum": ["demo", "co-announcement", "integration", "early-access", "case-study"]
129+
},
130+
"description": {
131+
"type": "string",
132+
"description": "What you are offering."
133+
},
134+
"constraints": {
135+
"type": "string",
136+
"description": "Any limitations or conditions."
137+
}
138+
},
139+
"additionalProperties": false
140+
},
141+
142+
"pressBlock": {
143+
"type": "object",
144+
"description": "Optional press/partner data for a tool. Enables press pages, outreach packs, and partner bundles.",
145+
"properties": {
146+
"boilerplate": {
147+
"type": "object",
148+
"properties": {
149+
"projectDescription": {
150+
"type": "string",
151+
"description": "Extended project description for press use."
152+
},
153+
"founderBio": {
154+
"type": "string",
155+
"description": "Team or founder bio."
156+
},
157+
"preferredNouns": {
158+
"type": "array",
159+
"items": { "type": "string" },
160+
"description": "Preferred terms for the tool (e.g. tool, CLI, indexer)."
161+
},
162+
"forbiddenPhrases": {
163+
"type": "array",
164+
"items": { "type": "string" },
165+
"description": "Phrases to never use in press/marketing (e.g. AI-powered, revolutionary)."
166+
}
167+
},
168+
"additionalProperties": false
169+
},
170+
"contacts": {
171+
"type": "array",
172+
"items": { "$ref": "#/$defs/pressContact" }
173+
},
174+
"quotes": {
175+
"type": "array",
176+
"items": { "$ref": "#/$defs/pressQuote" },
177+
"maxItems": 6
178+
},
179+
"comparables": {
180+
"type": "array",
181+
"items": { "$ref": "#/$defs/pressComparable" }
182+
},
183+
"partnerOffers": {
184+
"type": "array",
185+
"items": { "$ref": "#/$defs/pressPartnerOffer" }
186+
}
187+
},
188+
"additionalProperties": false
189+
},
190+
56191
"constraints": {
57192
"type": "object",
58193
"description": "Soft advisory constraints for a channel or context.",
@@ -197,7 +332,8 @@
197332
"type": "array",
198333
"items": { "$ref": "#/$defs/message" },
199334
"minItems": 1
200-
}
335+
},
336+
"press": { "$ref": "#/$defs/pressBlock" }
201337
},
202338
"additionalProperties": false
203339
},

marketing/scripts/validate.mjs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,23 @@ for (const { ref } of index.tools) {
143143
}
144144
}
145145

146-
console.log(` OK: ${tool.id} (${tool.claims.length} claims, ${tool.messages.length} messages)`);
146+
// Check press quote claimRefs resolve to tool's claims
147+
if (tool.press?.quotes) {
148+
for (const quote of tool.press.quotes) {
149+
if (quote.claimRefs) {
150+
for (const claimRef of quote.claimRefs) {
151+
if (!claimIds.has(claimRef)) {
152+
fail(
153+
`${ref}: press quote references claim ${claimRef} which is not in this tool's claims`,
154+
);
155+
}
156+
}
157+
}
158+
}
159+
}
160+
161+
const pressInfo = tool.press ? `, press: ${tool.press.quotes?.length || 0} quotes` : "";
162+
console.log(` OK: ${tool.id} (${tool.claims.length} claims, ${tool.messages.length} messages${pressInfo})`);
147163
}
148164

149165
// Load campaigns

0 commit comments

Comments
 (0)