@mcptoolshop/mcpt-publishing 1.0.0

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025-2026 MCP Tool Shop
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,223 @@
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/mcp-tool-shop/mcpt-publishing/main/logo.png" alt="mcpt-publishing logo" width="520" />
3
+ </p>
4
+
5
+ <h1 align="center">mcpt-publishing</h1>
6
+
7
+ <p align="center">
8
+ <b>A human-first publishing house for your repos.</b><br/>
9
+ Audit, fix, and publish to npm/NuGet/PyPI/GHCR with receipts you can verify.
10
+ </p>
11
+
12
+ <p align="center">
13
+ <a href="https://github.com/mcp-tool-shop/mcpt-publishing/releases"><img alt="GitHub release" src="https://img.shields.io/github/v/release/mcp-tool-shop/mcpt-publishing?style=flat-square"></a>
14
+ <a href="https://www.npmjs.com/package/@mcptoolshop/mcpt-publishing"><img alt="npm" src="https://img.shields.io/npm/v/@mcptoolshop/mcpt-publishing?style=flat-square"></a>
15
+ <a href="LICENSE"><img alt="License" src="https://img.shields.io/badge/license-MIT-blue?style=flat-square"></a>
16
+ </p>
17
+
18
+ ---
19
+
20
+ ## What it is
21
+
22
+ **mcpt-publishing** is a portable "publishing layer" that sits between your repos and public registries.
23
+
24
+ It answers the annoying questions humans actually have:
25
+
26
+ - *Are my registry pages stale or embarrassing?*
27
+ - *Do tags/releases match what's published?*
28
+ - *Which packages need a metadata refresh right now?*
29
+ - *Can I publish safely, repeatedly, and prove what happened?*
30
+
31
+ Every run produces **receipts**: immutable JSON artifacts with SHA-256 hashes, commit SHAs, and links to registry pages and GitHub releases.
32
+
33
+ ---
34
+
35
+ ## Who this is for
36
+
37
+ **For you if...**
38
+
39
+ - You publish to **npm and/or NuGet** and your pages drift over time (they do).
40
+ - You want a single place to enforce "registry truth" (versions, tags, URLs, READMEs, icons).
41
+ - You want automation that's safe: **plans, PRs, receipts**, and no surprise pushes.
42
+
43
+ **Not for you if...**
44
+
45
+ - You want a marketing site or spotlight engine (this is the plumbing).
46
+ - You want a monolithic CI framework (this is a small toolkit you can embed anywhere).
47
+
48
+ ---
49
+
50
+ ## 60-second quickstart
51
+
52
+ ### Install
53
+
54
+ ```bash
55
+ npm i -D @mcptoolshop/mcpt-publishing
56
+ ```
57
+
58
+ ### Initialize
59
+
60
+ ```bash
61
+ npx mcpt-publishing init
62
+ ```
63
+
64
+ This scaffolds:
65
+
66
+ - `publishing.config.json`
67
+ - `profiles/` (where repos/packages are declared)
68
+ - `reports/` and `receipts/` output folders
69
+
70
+ ### Run an audit
71
+
72
+ ```bash
73
+ npx mcpt-publishing audit
74
+ ```
75
+
76
+ Outputs:
77
+
78
+ - `reports/latest.md` (human-readable)
79
+ - `reports/latest.json` (machine-readable)
80
+ - a receipt under `receipts/`
81
+
82
+ ---
83
+
84
+ ## Core commands
85
+
86
+ ### `mcpt-publishing audit`
87
+
88
+ Checks your publishing surfaces across enabled registries.
89
+
90
+ ```bash
91
+ npx mcpt-publishing audit
92
+ npx mcpt-publishing audit --json
93
+ ```
94
+
95
+ ### `mcpt-publishing plan`
96
+
97
+ Generates a safe plan to fix drift (no network writes). *(coming soon)*
98
+
99
+ ```bash
100
+ npx mcpt-publishing plan
101
+ npx mcpt-publishing plan --repo mcp-tool-shop-org/soundboard-maui
102
+ ```
103
+
104
+ ### `mcpt-publishing apply`
105
+
106
+ Applies the plan as PRs (never pushes to main). *(coming soon)*
107
+
108
+ ```bash
109
+ npx mcpt-publishing apply
110
+ npx mcpt-publishing apply --batch
111
+ ```
112
+
113
+ ### `mcpt-publishing publish`
114
+
115
+ Publishes to a target registry using tokens/secrets. *(coming soon)*
116
+
117
+ ```bash
118
+ npx mcpt-publishing publish --repo mcp-tool-shop-org/soundboard-maui --target npm
119
+ npx mcpt-publishing publish --repo mcp-tool-shop-org/Soundboard.Client --target nuget
120
+ ```
121
+
122
+ ### `mcpt-publishing providers`
123
+
124
+ Shows enabled providers and required env vars.
125
+
126
+ ```bash
127
+ npx mcpt-publishing providers
128
+ ```
129
+
130
+ ### `mcpt-publishing verify-receipt`
131
+
132
+ Validates receipts (schema + immutability). *(coming soon)*
133
+
134
+ ```bash
135
+ npx mcpt-publishing verify-receipt receipts/publish/...
136
+ ```
137
+
138
+ ---
139
+
140
+ ## Optional: assets plugin (logos + images)
141
+
142
+ Core is zero-dependency. Visual updates (logos, icons, OG images) are handled by an optional plugin: *(coming soon)*
143
+
144
+ ```bash
145
+ npm i -D @mcptoolshop/mcpt-publishing-assets
146
+ npx mcpt-publishing assets doctor
147
+ npx mcpt-publishing assets logo --repo mcp-tool-shop-org/mcpt
148
+ ```
149
+
150
+ This plugin depends on `sharp` and is kept separate so installs remain fast and reliable.
151
+
152
+ ---
153
+
154
+ ## Configuration
155
+
156
+ ### `publishing.config.json`
157
+
158
+ Controls paths, enabled registries, and GitHub "glue" behaviors (attach receipts to releases, update pinned health issue, etc.).
159
+
160
+ ### `profiles/`
161
+
162
+ Each profile declares:
163
+
164
+ - the repo
165
+ - the packages it publishes
166
+ - target registries (npm/nuget/pypi/ghcr)
167
+ - any special rules (tag prefix, monorepo paths, etc.)
168
+
169
+ Schemas live in:
170
+
171
+ - `schemas/profile.schema.json`
172
+ - `schemas/receipt.schema.json`
173
+
174
+ Contract + phases: `docs/CONTRACT.md`
175
+
176
+ ---
177
+
178
+ ## Environment variables
179
+
180
+ These are only needed when you publish or call APIs that require auth.
181
+
182
+ | Target | Env var(s) | Notes |
183
+ |--------|------------|-------|
184
+ | npm | `NPM_TOKEN` | Use a granular token with publish rights |
185
+ | NuGet | `NUGET_API_KEY` | Works in CI or locally |
186
+ | GitHub | `GITHUB_TOKEN` / `GH_TOKEN` | For releases/issues/ghcr |
187
+ | PyPI | `PYPI_TOKEN` | If you enable PyPI publishing |
188
+
189
+ ---
190
+
191
+ ## Receipts
192
+
193
+ Receipts are append-only JSON files written under `receipts/`.
194
+
195
+ They include:
196
+
197
+ - commit SHA
198
+ - registry versions
199
+ - URLs
200
+ - SHA-256 hashes of key artifacts
201
+
202
+ If you like receipts, you can plug this into the receipt factory as the "publishing plugin."
203
+
204
+ ---
205
+
206
+ ## Development
207
+
208
+ ```bash
209
+ npm test
210
+ node scripts/audit.mjs
211
+ ```
212
+
213
+ Smoke tests:
214
+
215
+ ```bash
216
+ node scripts/test-providers.mjs
217
+ ```
218
+
219
+ ---
220
+
221
+ ## License
222
+
223
+ MIT — see [LICENSE](LICENSE).
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import { run } from "../src/cli/router.mjs";
3
+ run(process.argv);
@@ -0,0 +1,109 @@
1
+ # Publishing Contract
2
+
3
+ ## Phase 0 — Audit Only
4
+
5
+ **Goal:** Make reality visible and reproducible before automating anything.
6
+
7
+ **Rules:**
8
+ - No publishing
9
+ - No auto-tagging
10
+ - No PR-writing
11
+ - No "fixes" beyond producing the report and the plan
12
+
13
+ **Output:** For every repo/package, answer:
14
+ - What's published?
15
+ - What's true?
16
+ - What's wrong?
17
+ - What do we do next?
18
+
19
+ **Deliverables:**
20
+ - `inventory.md` — complete map of all published artifacts
21
+ - `reports/phase-0-audit.md` — drift + metadata + identity report
22
+ - `profiles/` — one profile per shipping repo
23
+ - `schemas/profile.schema.json` — machine-readable profile contract
24
+
25
+ ## Phase 1 — Registry Truth Sync (complete)
26
+
27
+ - All published npm/NuGet versions tagged in git
28
+ - Metadata fixes published (repo URLs, descriptions, READMEs)
29
+ - GitHub Releases created for front-door packages
30
+ - 7 npm metadata-fix publishes, 25 git tags, 12 GitHub Releases
31
+
32
+ ## Phase 2 — Automated Audit + Storefront (complete)
33
+
34
+ - `scripts/audit.mjs` — automated drift detection with severity engine
35
+ - Weekly GitHub Action updates a pinned "Publishing Health" issue
36
+ - Front-door NuGet packages get icons + rendered READMEs
37
+ - Release strategy locked (see below)
38
+
39
+ ## Phase 3 — Storefront Professionalism (complete)
40
+
41
+ - All repos have logo, README header, LICENSE, homepage, topics
42
+ - RED=0, YELLOW=0 across 26 repos
43
+
44
+ ## Phase 5 — Multi-Registry Publishing + GitHub Glue + Receipts (current)
45
+
46
+ - **Provider plugin system:** `scripts/lib/provider.mjs` base class with `detect()`, `audit()`, `plan()`, `publish()`, `receipt()` methods
47
+ - **Auto-discovery:** `scripts/lib/registry.mjs` scans `providers/*.mjs`, validates interface compliance
48
+ - **Extracted providers:** npm, NuGet, GitHub (context loader) — logic extracted verbatim from audit.mjs
49
+ - **New providers:** PyPI (pypi.org JSON API), GHCR (GitHub Packages API via `gh api`)
50
+ - **Receipt system:** `schemas/receipt.schema.json` + `scripts/lib/receipt-writer.mjs` — immutable JSON receipts at `receipts/publish/<owner>--<name>/<target>/<version>.json`
51
+ - **GitHub Glue:** `scripts/lib/github-glue.mjs` — attaches receipts to releases, updates health issue
52
+ - **Refactored audit.mjs:** thin orchestrator that loads providers, iterates manifest, delegates to providers — output format unchanged
53
+ - Adding a new registry = drop a single `.mjs` file in `scripts/lib/providers/`
54
+
55
+ ### Receipt Schema (v1.0.0)
56
+
57
+ Required fields: `schemaVersion`, `repo` (owner/name), `target` (npm|nuget|pypi|ghcr), `version`, `packageName`, `commitSha` (40-hex), `timestamp` (ISO 8601), `artifacts[]` (name, sha256, size, url). Optional: `metadata{}`.
58
+
59
+ ### Receipt Immutability
60
+
61
+ Receipts are append-only. Once `receipts/publish/<slug>/<target>/<version>.json` is written, it cannot be overwritten. The receipt writer enforces this at the filesystem level.
62
+
63
+ ## Registry Truth Policy
64
+
65
+ Published npm/NuGet versions are **immutable reality**. We never:
66
+ - Unpublish to "fix" a version (npm won't let you anyway)
67
+ - Pretend a published version doesn't exist
68
+ - Override registry state with local state
69
+
70
+ Instead, we reconcile everything else (tags, releases, source files) to match.
71
+
72
+ ## Drift Categories
73
+
74
+ | Category | Meaning | Severity |
75
+ |----------|---------|----------|
76
+ | `published-not-tagged` | Registry has version X, repo tag missing | RED |
77
+ | `tagged-not-released` | Tag exists, GitHub Release missing | YELLOW |
78
+ | `source-mismatch` | Source claims version Y, registry latest is X | RED |
79
+ | `stale` | Everything consistent but old | GRAY |
80
+
81
+ ## Remediation Policy
82
+
83
+ - `published-not-tagged` → add matching `vX.Y.Z` tag
84
+ - `source-mismatch` → reconcile source to registry truth
85
+ - `tagged-not-released` → create GitHub Release (front-door required, internal optional)
86
+ - `stale` → no action unless chosen
87
+
88
+ ## Release Strategy (locked)
89
+
90
+ ### Tag format
91
+ - All packages: `vX.Y.Z` (semver with `v` prefix)
92
+ - Monorepos with multiple packages at the same version: single `vX.Y.Z` tag
93
+ - Monorepos where packages version independently: deferred to Phase 3 (use per-package prefixes)
94
+
95
+ ### Publishing rule
96
+ Every `npm publish` or `dotnet nuget push` MUST have a matching git tag created
97
+ immediately after (or before, if tag-driven). The audit script flags violations as RED.
98
+
99
+ ### Front-door packages
100
+ - Tag required
101
+ - GitHub Release required
102
+ - README must render on registry page
103
+ - Correct repo/project URLs required
104
+
105
+ ### Internal packages
106
+ - Tag required
107
+ - GitHub Release optional
108
+ - README optional (GRAY if missing)
109
+ - Correct repo URL required
package/logo.png ADDED
Binary file
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@mcptoolshop/mcpt-publishing",
3
+ "version": "1.0.0",
4
+ "description": "Publishing health auditor and receipt factory plugin for MCP Tool Shop packages.",
5
+ "type": "module",
6
+ "bin": {
7
+ "mcpt-publishing": "./bin/mcpt-publishing.mjs"
8
+ },
9
+ "files": [
10
+ "bin/",
11
+ "src/",
12
+ "scripts/lib/",
13
+ "schemas/",
14
+ "profiles/manifest.json",
15
+ "profiles/example.json",
16
+ "logo.png",
17
+ "docs/CONTRACT.md",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "scripts": {
22
+ "audit": "node bin/mcpt-publishing.mjs audit",
23
+ "audit:json": "node bin/mcpt-publishing.mjs audit --json",
24
+ "test": "node scripts/test-providers.mjs"
25
+ },
26
+ "engines": {
27
+ "node": ">=22"
28
+ },
29
+ "dependencies": {},
30
+ "keywords": [
31
+ "mcp",
32
+ "publishing",
33
+ "audit",
34
+ "receipts",
35
+ "registry",
36
+ "npm",
37
+ "nuget",
38
+ "drift-detection"
39
+ ],
40
+ "author": "mcp-tool-shop",
41
+ "license": "MIT",
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "git+https://github.com/mcp-tool-shop/mcpt-publishing.git"
45
+ },
46
+ "homepage": "https://github.com/mcp-tool-shop/mcpt-publishing#readme",
47
+ "bugs": {
48
+ "url": "https://github.com/mcp-tool-shop/mcpt-publishing/issues"
49
+ }
50
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "$comment": "Example profile showing one NuGet + one npm entry",
3
+ "repo": {
4
+ "owner": "mcp-tool-shop-org",
5
+ "name": "soundboard-maui"
6
+ },
7
+ "packages": [
8
+ {
9
+ "ecosystem": "nuget",
10
+ "name": "Soundboard.Client",
11
+ "audience": "front-door",
12
+ "versionPolicy": { "truth": "registry", "tagPrefix": "v" },
13
+ "registryUrl": "https://www.nuget.org/packages/Soundboard.Client"
14
+ },
15
+ {
16
+ "ecosystem": "nuget",
17
+ "name": "Soundboard.Maui.Audio",
18
+ "audience": "internal",
19
+ "versionPolicy": { "truth": "registry", "tagPrefix": "v" },
20
+ "registryUrl": "https://www.nuget.org/packages/Soundboard.Maui.Audio"
21
+ }
22
+ ]
23
+ }
@@ -0,0 +1,49 @@
1
+ {
2
+ "$comment": "Machine-readable inventory of all published packages. Source of truth for audit.mjs.",
3
+ "npm": [
4
+ { "name": "@mcptoolshop/mcpt", "repo": "mcp-tool-shop-org/mcpt", "audience": "front-door" },
5
+ { "name": "@mcptoolshop/mcp-tool-registry", "repo": "mcp-tool-shop-org/mcp-tool-registry", "audience": "front-door" },
6
+ { "name": "@mcptoolshop/websketch", "repo": "mcp-tool-shop-org/websketch-cli", "audience": "front-door" },
7
+ { "name": "@mcptoolshop/websketch-ir", "repo": "mcp-tool-shop-org/websketch-ir", "audience": "front-door" },
8
+ { "name": "@mcptoolshop/voice-soundboard-mcp", "repo": "mcp-tool-shop-org/mcp-voice-soundboard", "audience": "front-door" },
9
+ { "name": "@mcptoolshop/voice-soundboard-core", "repo": "mcp-tool-shop-org/mcp-voice-soundboard", "audience": "internal" },
10
+ { "name": "@mcptoolshop/consensus-os", "repo": "mcp-tool-shop-org/ConsensusOS", "audience": "front-door" },
11
+ { "name": "@mcptoolshop/synthesis", "repo": "mcp-tool-shop-org/synthesis", "audience": "front-door" },
12
+ { "name": "@mcptoolshop/prov-engine-js", "repo": "mcp-tool-shop-org/prov-engine-js", "audience": "internal" },
13
+ { "name": "@mcptoolshop/pathway", "repo": "mcp-tool-shop-org/pathway", "audience": "front-door" },
14
+ { "name": "@mcptoolshop/file-forge", "repo": "mcp-tool-shop-org/mcp-file-forge", "audience": "front-door" },
15
+ { "name": "@mcptoolshop/accessibility-suite", "repo": "mcp-tool-shop-org/accessibility-suite", "audience": "front-door" },
16
+ { "name": "@mcptoolshop/a11y-ci", "repo": "mcp-tool-shop-org/accessibility-suite", "audience": "internal" },
17
+ { "name": "@mcptoolshop/a11y-evidence-engine", "repo": "mcp-tool-shop-org/a11y-evidence-engine", "audience": "internal", "deprecated": true },
18
+ { "name": "@mcptoolshop/a11y-mcp-tools", "repo": "mcp-tool-shop-org/a11y-mcp-tools", "audience": "internal", "deprecated": true },
19
+ { "name": "@mcptoolshop/venvkit", "repo": "mcp-tool-shop-org/venvkit", "audience": "front-door" },
20
+ { "name": "@mcptoolshop/voice-engine-dsp", "repo": "mcp-tool-shop-org/mcp-voice-engine", "audience": "internal" },
21
+ { "name": "@mcptoolshop/physics-svg", "repo": "mcp-tool-shop-org/siege-kit", "audience": "internal" },
22
+ { "name": "@mcptoolshop/promo-kit", "repo": "mcp-tool-shop/mcp-tool-shop", "audience": "internal" }
23
+ ],
24
+ "nuget": [
25
+ { "name": "Soundboard.Client", "repo": "mcp-tool-shop-org/soundboard-maui", "audience": "front-door" },
26
+ { "name": "Soundboard.Maui.Audio", "repo": "mcp-tool-shop-org/soundboard-maui", "audience": "internal" },
27
+ { "name": "InControl.Core", "repo": "mcp-tool-shop-org/InControl-Desktop", "audience": "internal" },
28
+ { "name": "InControl.Inference", "repo": "mcp-tool-shop-org/InControl-Desktop", "audience": "internal" },
29
+ { "name": "Attestia.Core", "repo": "mcp-tool-shop-org/Attestia-Desktop", "audience": "internal" },
30
+ { "name": "Attestia.Client", "repo": "mcp-tool-shop-org/Attestia-Desktop", "audience": "internal" },
31
+ { "name": "Attestia.Sidecar", "repo": "mcp-tool-shop-org/Attestia-Desktop", "audience": "internal" },
32
+ { "name": "Gov.Protocol", "repo": "mcp-tool-shop-org/build-governor", "audience": "internal" },
33
+ { "name": "Gov.Common", "repo": "mcp-tool-shop-org/build-governor", "audience": "internal" },
34
+ { "name": "CursorAssist.Canon", "repo": "mcp-tool-shop-org/CursorAssist", "audience": "internal" },
35
+ { "name": "CursorAssist.Trace", "repo": "mcp-tool-shop-org/CursorAssist", "audience": "internal" },
36
+ { "name": "CursorAssist.Engine", "repo": "mcp-tool-shop-org/CursorAssist", "audience": "internal" },
37
+ { "name": "CursorAssist.Policy", "repo": "mcp-tool-shop-org/CursorAssist", "audience": "internal" },
38
+ { "name": "MouseTrainer.Domain", "repo": "mcp-tool-shop-org/MouseTrainer", "audience": "internal" },
39
+ { "name": "MouseTrainer.Simulation", "repo": "mcp-tool-shop-org/MouseTrainer", "audience": "internal" },
40
+ { "name": "MouseTrainer.Audio", "repo": "mcp-tool-shop-org/MouseTrainer", "audience": "internal" },
41
+ { "name": "RunForgeDesktop.Core", "repo": "mcp-tool-shop-org/runforge-desktop", "audience": "internal" },
42
+ { "name": "CodeClone.Domain", "repo": "mcp-tool-shop-org/CodeClone-Desktop", "audience": "internal" },
43
+ { "name": "LinuxDevTyper.Core", "repo": "mcp-tool-shop-org/linux-dev-typer", "audience": "internal" },
44
+ { "name": "DevOpTyper.Content", "repo": "mcp-tool-shop-org/meta-content-system", "audience": "internal" },
45
+ { "name": "VortexKit", "repo": "mcp-tool-shop-org/ScalarScope-Desktop", "audience": "internal" }
46
+ ],
47
+ "pypi": [],
48
+ "ghcr": []
49
+ }
@@ -0,0 +1,52 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/mcp-tool-shop/mcpt-publishing/schemas/audit-receipt.schema.json",
4
+ "title": "Audit Receipt",
5
+ "description": "Record of a publishing health audit run.",
6
+ "type": "object",
7
+ "required": ["schemaVersion", "type", "timestamp", "counts", "totalPackages"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "schemaVersion": {
11
+ "type": "string",
12
+ "const": "1.0.0"
13
+ },
14
+ "type": {
15
+ "type": "string",
16
+ "const": "audit"
17
+ },
18
+ "timestamp": {
19
+ "type": "string",
20
+ "format": "date-time",
21
+ "description": "When the audit ran"
22
+ },
23
+ "counts": {
24
+ "type": "object",
25
+ "required": ["RED", "YELLOW", "GRAY", "INFO"],
26
+ "additionalProperties": false,
27
+ "properties": {
28
+ "RED": { "type": "integer", "minimum": 0 },
29
+ "YELLOW": { "type": "integer", "minimum": 0 },
30
+ "GRAY": { "type": "integer", "minimum": 0 },
31
+ "INFO": { "type": "integer", "minimum": 0 }
32
+ }
33
+ },
34
+ "ecosystems": {
35
+ "type": "object",
36
+ "description": "Package count per ecosystem audited",
37
+ "additionalProperties": { "type": "integer" }
38
+ },
39
+ "totalPackages": {
40
+ "type": "integer",
41
+ "minimum": 0
42
+ },
43
+ "reportFiles": {
44
+ "type": "object",
45
+ "additionalProperties": false,
46
+ "properties": {
47
+ "json": { "type": "string" },
48
+ "markdown": { "type": "string" }
49
+ }
50
+ }
51
+ }
52
+ }
@@ -0,0 +1,71 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/mcp-tool-shop/mcpt-publishing/schemas/profile.schema.json",
4
+ "title": "Publishing Profile",
5
+ "description": "Declares what a repo publishes, where, and how.",
6
+ "type": "object",
7
+ "required": ["repo", "packages"],
8
+ "properties": {
9
+ "repo": {
10
+ "type": "object",
11
+ "required": ["owner", "name"],
12
+ "properties": {
13
+ "owner": {
14
+ "type": "string",
15
+ "description": "GitHub org or user (e.g. mcp-tool-shop-org)"
16
+ },
17
+ "name": {
18
+ "type": "string",
19
+ "description": "GitHub repo name"
20
+ }
21
+ }
22
+ },
23
+ "packages": {
24
+ "type": "array",
25
+ "minItems": 1,
26
+ "items": {
27
+ "type": "object",
28
+ "required": ["ecosystem", "name", "audience"],
29
+ "properties": {
30
+ "ecosystem": {
31
+ "type": "string",
32
+ "enum": ["npm", "nuget", "pypi", "ghcr"]
33
+ },
34
+ "name": {
35
+ "type": "string",
36
+ "description": "Package name/ID as it appears on the registry"
37
+ },
38
+ "audience": {
39
+ "type": "string",
40
+ "enum": ["front-door", "internal"],
41
+ "description": "front-door = meant for strangers; internal = dependency/component"
42
+ },
43
+ "versionPolicy": {
44
+ "type": "object",
45
+ "properties": {
46
+ "truth": {
47
+ "type": "string",
48
+ "const": "registry",
49
+ "description": "Always registry — published versions are immutable reality"
50
+ },
51
+ "tagPrefix": {
52
+ "type": "string",
53
+ "default": "v",
54
+ "description": "Git tag prefix (e.g. v for v1.0.0)"
55
+ }
56
+ }
57
+ },
58
+ "registryUrl": {
59
+ "type": "string",
60
+ "format": "uri",
61
+ "description": "Direct link to the registry page"
62
+ },
63
+ "notes": {
64
+ "type": "string",
65
+ "description": "Anything unusual about this package"
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
@@ -0,0 +1,50 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/mcp-tool-shop/mcpt-publishing/schemas/publishing-config.schema.json",
4
+ "title": "Publishing Config",
5
+ "description": "Configuration for the mcpt-publishing CLI.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "properties": {
9
+ "$schema": {
10
+ "type": "string"
11
+ },
12
+ "profilesDir": {
13
+ "type": "string",
14
+ "default": "profiles",
15
+ "description": "Path to profiles directory (relative to config file or absolute)"
16
+ },
17
+ "receiptsDir": {
18
+ "type": "string",
19
+ "default": "receipts",
20
+ "description": "Path to receipts output directory"
21
+ },
22
+ "reportsDir": {
23
+ "type": "string",
24
+ "default": "reports",
25
+ "description": "Path to reports output directory"
26
+ },
27
+ "github": {
28
+ "type": "object",
29
+ "additionalProperties": false,
30
+ "properties": {
31
+ "updateIssue": {
32
+ "type": "boolean",
33
+ "default": true,
34
+ "description": "Update the pinned Publishing Health issue after audit"
35
+ },
36
+ "attachReceipts": {
37
+ "type": "boolean",
38
+ "default": true,
39
+ "description": "Attach receipt JSON files to GitHub Releases"
40
+ }
41
+ }
42
+ },
43
+ "enabledProviders": {
44
+ "type": "array",
45
+ "items": { "type": "string" },
46
+ "default": [],
47
+ "description": "Allowlist of provider names. Empty array = all providers enabled."
48
+ }
49
+ }
50
+ }