@mcptoolshop/mcpt-publishing 0.2.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/CHANGELOG.md ADDED
@@ -0,0 +1,36 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## [0.2.0] - 2026-02-17
6
+
7
+ ### Added
8
+ - **Real npm publish**: `npm pack` + `npm publish --access public` with SHA-256 receipts
9
+ - **Real NuGet publish**: `dotnet pack` + `dotnet nuget push` with SHA-256 receipts
10
+ - **verify-receipt command**: Validates receipt files against schema with integrity hash
11
+ - **Shell utilities**: Shared `exec`, `hashFile`, `getCommitSha` for providers
12
+ - Exit code 5 (`PUBLISH_FAILURE`) for failed publishes
13
+ - `--repo`, `--target`, `--cwd`, `--dry-run` flags for publish command
14
+ - Pre-flight credential check (fail-fast before any publish starts)
15
+ - CHANGELOG.md
16
+
17
+ ### Changed
18
+ - Version bumped from 1.0.0 to 0.2.0 (1.0.0 was premature — audit-only)
19
+ - Publish command: full orchestrator replacing stub
20
+ - Help text updated with verify-receipt, publish flags, env vars
21
+ - README updated: publish + verify-receipt marked as real
22
+
23
+ ## [1.0.0] - 2026-02-17
24
+
25
+ Initial npm publish. Audit-only with CLI skeleton.
26
+
27
+ ### Added
28
+ - CLI with subcommands: audit, init, providers, plan (stub), publish (stub)
29
+ - Provider plugin system (npm, NuGet, PyPI, GHCR, GitHub)
30
+ - Receipt schema v1.0.0 and immutable receipt writer
31
+ - Audit command with severity engine (RED/YELLOW/GRAY/INFO)
32
+ - Publishing health reports (markdown + JSON)
33
+ - GitHub glue (receipt attachment, health issue updates)
34
+ - Config system with walk-up discovery
35
+ - 28-test smoke suite
36
+ - Zero runtime dependencies
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,237 @@
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 packages to registries and generates immutable receipts.
116
+
117
+ ```bash
118
+ npx mcpt-publishing publish --repo mcp-tool-shop-org/mcpt --target npm
119
+ npx mcpt-publishing publish --repo mcp-tool-shop-org/soundboard-maui --target nuget --cwd /path/to/repo
120
+ npx mcpt-publishing publish --target npm --dry-run
121
+ ```
122
+
123
+ ### `mcpt-publishing providers`
124
+
125
+ Shows enabled providers and required env vars.
126
+
127
+ ```bash
128
+ npx mcpt-publishing providers
129
+ ```
130
+
131
+ ### `mcpt-publishing verify-receipt`
132
+
133
+ Validates receipt files against schema and computes integrity hashes.
134
+
135
+ ```bash
136
+ npx mcpt-publishing verify-receipt receipts/audit/2026-02-17.json
137
+ npx mcpt-publishing verify-receipt receipts/publish/mcp-tool-shop-org--mcpt/npm/1.0.1.json --json
138
+ ```
139
+
140
+ ---
141
+
142
+ ## Optional: assets plugin (logos + images)
143
+
144
+ Core is zero-dependency. Visual updates (logos, icons, OG images) are handled by an optional plugin: *(coming soon)*
145
+
146
+ ```bash
147
+ npm i -D @mcptoolshop/mcpt-publishing-assets
148
+ npx mcpt-publishing assets doctor
149
+ npx mcpt-publishing assets logo --repo mcp-tool-shop-org/mcpt
150
+ ```
151
+
152
+ This plugin depends on `sharp` and is kept separate so installs remain fast and reliable.
153
+
154
+ ---
155
+
156
+ ## Configuration
157
+
158
+ ### `publishing.config.json`
159
+
160
+ Controls paths, enabled registries, and GitHub "glue" behaviors (attach receipts to releases, update pinned health issue, etc.).
161
+
162
+ ### `profiles/`
163
+
164
+ Each profile declares:
165
+
166
+ - the repo
167
+ - the packages it publishes
168
+ - target registries (npm/nuget/pypi/ghcr)
169
+ - any special rules (tag prefix, monorepo paths, etc.)
170
+
171
+ Schemas live in:
172
+
173
+ - `schemas/profile.schema.json`
174
+ - `schemas/receipt.schema.json`
175
+
176
+ Contract + phases: `docs/CONTRACT.md`
177
+
178
+ ---
179
+
180
+ ## Environment variables
181
+
182
+ These are only needed when you publish or call APIs that require auth.
183
+
184
+ | Target | Env var(s) | Notes |
185
+ |--------|------------|-------|
186
+ | npm | `NPM_TOKEN` | Use a granular token with publish rights |
187
+ | NuGet | `NUGET_API_KEY` | Works in CI or locally |
188
+ | GitHub | `GITHUB_TOKEN` / `GH_TOKEN` | For releases/issues/ghcr |
189
+ | PyPI | `PYPI_TOKEN` | If you enable PyPI publishing |
190
+
191
+ ---
192
+
193
+ ## Exit codes
194
+
195
+ | Code | Meaning |
196
+ |------|---------|
197
+ | `0` | Success |
198
+ | `2` | RED-severity drift found (audit) |
199
+ | `3` | Configuration or schema error |
200
+ | `4` | Missing credentials for a requested operation |
201
+ | `5` | One or more publishes failed |
202
+
203
+ ---
204
+
205
+ ## Receipts
206
+
207
+ Receipts are append-only JSON files written under `receipts/`.
208
+
209
+ They include:
210
+
211
+ - commit SHA
212
+ - registry versions
213
+ - URLs
214
+ - SHA-256 hashes of key artifacts
215
+
216
+ If you like receipts, you can plug this into the receipt factory as the "publishing plugin."
217
+
218
+ ---
219
+
220
+ ## Development
221
+
222
+ ```bash
223
+ npm test
224
+ node scripts/audit.mjs
225
+ ```
226
+
227
+ Smoke tests:
228
+
229
+ ```bash
230
+ node scripts/test-providers.mjs
231
+ ```
232
+
233
+ ---
234
+
235
+ ## License
236
+
237
+ 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,51 @@
1
+ {
2
+ "name": "@mcptoolshop/mcpt-publishing",
3
+ "version": "0.2.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
+ "CHANGELOG.md",
19
+ "README.md",
20
+ "LICENSE"
21
+ ],
22
+ "scripts": {
23
+ "audit": "node bin/mcpt-publishing.mjs audit",
24
+ "audit:json": "node bin/mcpt-publishing.mjs audit --json",
25
+ "test": "node scripts/test-providers.mjs"
26
+ },
27
+ "engines": {
28
+ "node": ">=22"
29
+ },
30
+ "dependencies": {},
31
+ "keywords": [
32
+ "mcp",
33
+ "publishing",
34
+ "audit",
35
+ "receipts",
36
+ "registry",
37
+ "npm",
38
+ "nuget",
39
+ "drift-detection"
40
+ ],
41
+ "author": "mcp-tool-shop",
42
+ "license": "MIT",
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "git+https://github.com/mcp-tool-shop/mcpt-publishing.git"
46
+ },
47
+ "homepage": "https://github.com/mcp-tool-shop/mcpt-publishing#readme",
48
+ "bugs": {
49
+ "url": "https://github.com/mcp-tool-shop/mcpt-publishing/issues"
50
+ }
51
+ }
@@ -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
+ }