@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 +21 -0
- package/README.md +223 -0
- package/bin/mcpt-publishing.mjs +3 -0
- package/docs/CONTRACT.md +109 -0
- package/logo.png +0 -0
- package/package.json +50 -0
- package/profiles/example.json +23 -0
- package/profiles/manifest.json +49 -0
- package/schemas/audit-receipt.schema.json +52 -0
- package/schemas/profile.schema.json +71 -0
- package/schemas/publishing-config.schema.json +50 -0
- package/schemas/receipt.schema.json +91 -0
- package/scripts/lib/github-glue.mjs +101 -0
- package/scripts/lib/provider.mjs +63 -0
- package/scripts/lib/providers/ghcr.mjs +112 -0
- package/scripts/lib/providers/github.mjs +52 -0
- package/scripts/lib/providers/npm.mjs +100 -0
- package/scripts/lib/providers/nuget.mjs +115 -0
- package/scripts/lib/providers/pypi.mjs +102 -0
- package/scripts/lib/receipt-writer.mjs +123 -0
- package/scripts/lib/registry.mjs +65 -0
- package/src/cli/exit-codes.mjs +15 -0
- package/src/cli/help.mjs +34 -0
- package/src/cli/router.mjs +120 -0
- package/src/commands/audit.mjs +238 -0
- package/src/commands/init.mjs +107 -0
- package/src/commands/plan.mjs +36 -0
- package/src/commands/providers.mjs +81 -0
- package/src/commands/publish.mjs +37 -0
- package/src/config/defaults.mjs +14 -0
- package/src/config/loader.mjs +86 -0
- package/src/config/schema.mjs +70 -0
- package/src/receipts/audit-receipt.mjs +53 -0
- package/src/receipts/index-writer.mjs +65 -0
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).
|
package/docs/CONTRACT.md
ADDED
|
@@ -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
|
+
}
|