@proofofwork-agency/toolpin 0.2.3 → 0.2.5
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/README.md +17 -14
- package/action.yml +1 -1
- package/dist/cli.js +1 -1
- package/dist/tui/command.js +2 -2
- package/dist/tui/views/panels.js +2 -2
- package/dist/version.js +1 -1
- package/docs/assets/readme/terminal-demo.svg +1 -1
- package/docs/how-to/catch-drift-in-ci.md +6 -6
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://github.com/proofofwork-agency/toolpin/actions/workflows/ci.yml)
|
|
4
4
|
[](LICENSE)
|
|
5
|
-
[](https://www.npmjs.com/package/@proofofwork-agency/toolpin)
|
|
6
6
|
[](https://github.com/proofofwork-agency/toolpin/releases)
|
|
7
7
|
|
|
8
8
|
ToolPin is a review gate for MCP server installs. It helps teams inspect what
|
|
@@ -209,7 +209,7 @@ jobs:
|
|
|
209
209
|
runs-on: ubuntu-latest
|
|
210
210
|
steps:
|
|
211
211
|
- uses: actions/checkout@v4
|
|
212
|
-
- uses: proofofwork-agency/toolpin@v0.2.
|
|
212
|
+
- uses: proofofwork-agency/toolpin@v0.2.5
|
|
213
213
|
with:
|
|
214
214
|
live: "true"
|
|
215
215
|
verify: "true"
|
|
@@ -217,9 +217,9 @@ jobs:
|
|
|
217
217
|
```
|
|
218
218
|
|
|
219
219
|
The checked-in composite Action builds ToolPin from the action source by
|
|
220
|
-
default, then runs `toolpin ci`.
|
|
221
|
-
|
|
222
|
-
|
|
220
|
+
default, then runs `toolpin ci`. Set `toolpin-version` to an npm version
|
|
221
|
+
specifier if you want the Action to install `@proofofwork-agency/toolpin` from
|
|
222
|
+
npm instead.
|
|
223
223
|
|
|
224
224
|
Recommended CI posture for reviewed lockfiles is `toolpin ci --live --verify`
|
|
225
225
|
for capability drift. Use `--skip-live-verification` only as an explicit downgrade
|
|
@@ -252,7 +252,7 @@ for the exact scope and limits.
|
|
|
252
252
|
- ToolPin curated registry source of truth in GitHub:
|
|
253
253
|
<https://github.com/proofofwork-agency/toolpin/blob/main/registry/v0/servers>
|
|
254
254
|
with a GitHub Pages static mirror for docs/browsing:
|
|
255
|
-
<https://proofofwork-agency.github.io/toolpin/registry/v0>
|
|
255
|
+
<https://proofofwork-agency.github.io/toolpin/registry/v0/servers>
|
|
256
256
|
- Custom registry configuration via `.toolpin/registries.json`.
|
|
257
257
|
- Search ranking over name, title, description, package type, transport, and
|
|
258
258
|
repository.
|
|
@@ -268,9 +268,10 @@ for the exact scope and limits.
|
|
|
268
268
|
|
|
269
269
|
## Roadmap
|
|
270
270
|
|
|
271
|
-
The
|
|
271
|
+
The first public release path is complete. Near-term work now focuses on
|
|
272
|
+
adoption and evidence quality:
|
|
272
273
|
|
|
273
|
-
-
|
|
274
|
+
- Keep npm provenance publishing healthy for every release.
|
|
274
275
|
- Keep the GitHub Action pinned and documented for CI adoption.
|
|
275
276
|
- Continue tightening evidence definitions, policy fields, and trust docs.
|
|
276
277
|
|
|
@@ -282,7 +283,7 @@ Longer-term direction:
|
|
|
282
283
|
- Safer secret brokering without plaintext client config.
|
|
283
284
|
- Task-first MCP discovery and stronger tool-description review signals.
|
|
284
285
|
|
|
285
|
-
See [docs/ROADMAP.md](docs/ROADMAP.md) for project direction.
|
|
286
|
+
See [docs/ROADMAP.md](https://github.com/proofofwork-agency/toolpin/blob/main/docs/ROADMAP.md) for project direction.
|
|
286
287
|
|
|
287
288
|
## Contributing
|
|
288
289
|
|
|
@@ -296,7 +297,8 @@ npm run registry:check
|
|
|
296
297
|
```
|
|
297
298
|
|
|
298
299
|
Please read [CONTRIBUTING.md](CONTRIBUTING.md), [SECURITY.md](SECURITY.md), and
|
|
299
|
-
[CLA.md](CLA.md)
|
|
300
|
+
[CLA.md](https://github.com/proofofwork-agency/toolpin/blob/main/CLA.md)
|
|
301
|
+
before opening larger changes.
|
|
300
302
|
|
|
301
303
|
## License
|
|
302
304
|
|
|
@@ -307,11 +309,11 @@ ToolPin is distributed under the Apache License 2.0. See [LICENSE](LICENSE).
|
|
|
307
309
|
- [Hosted documentation](https://proofofwork-agency.github.io/toolpin/)
|
|
308
310
|
- [CLI reference](https://proofofwork-agency.github.io/toolpin/docs/reference/cli)
|
|
309
311
|
- [Threat model](https://proofofwork-agency.github.io/toolpin/docs/concepts/threat-model)
|
|
310
|
-
- [Client config matrix](docs/client-configs.md)
|
|
312
|
+
- [Client config matrix](https://github.com/proofofwork-agency/toolpin/blob/main/docs/client-configs.md)
|
|
311
313
|
- [Catch drift in CI](docs/how-to/catch-drift-in-ci.md)
|
|
312
|
-
- [ToolPin vs. the MCP ecosystem](docs/
|
|
314
|
+
- [ToolPin vs. the MCP ecosystem](https://proofofwork-agency.github.io/toolpin/docs/concepts/comparison)
|
|
313
315
|
- [Security policy](SECURITY.md)
|
|
314
|
-
- [Disclaimer](DISCLAIMER.md)
|
|
316
|
+
- [Disclaimer](https://github.com/proofofwork-agency/toolpin/blob/main/DISCLAIMER.md)
|
|
315
317
|
|
|
316
318
|
## Notice
|
|
317
319
|
|
|
@@ -320,4 +322,5 @@ ToolPin is distributed under the Apache License 2.0. See [LICENSE](LICENSE).
|
|
|
320
322
|
> services. That code can access files, networks, and credentials through the
|
|
321
323
|
> client that runs it. ToolPin's score, evidence tier, and lockfile checks are
|
|
322
324
|
> review aids, not a guarantee that any server is safe. See
|
|
323
|
-
> [DISCLAIMER.md](
|
|
325
|
+
> [DISCLAIMER.md](https://github.com/proofofwork-agency/toolpin/blob/main/DISCLAIMER.md)
|
|
326
|
+
> and the [threat model](https://proofofwork-agency.github.io/toolpin/docs/concepts/threat-model).
|
package/action.yml
CHANGED
|
@@ -35,7 +35,7 @@ inputs:
|
|
|
35
35
|
required: false
|
|
36
36
|
default: ""
|
|
37
37
|
toolpin-version:
|
|
38
|
-
description: Optional npm version specifier for the @proofofwork-agency/toolpin npm package
|
|
38
|
+
description: Optional npm version specifier for the published @proofofwork-agency/toolpin npm package. Leave empty to install from this action source.
|
|
39
39
|
required: false
|
|
40
40
|
default: ""
|
|
41
41
|
policy:
|
package/dist/cli.js
CHANGED
|
@@ -1475,7 +1475,7 @@ Lock and governance
|
|
|
1475
1475
|
toolpin doctor [--file mcp-lock.json] [--scope|-s all|project|global] [--global|-g] [--json]
|
|
1476
1476
|
toolpin secrets audit [--file mcp-lock.json] [--scope|-s all|project|global] [--global|-g] [--json]
|
|
1477
1477
|
toolpin policy digest [--policy .toolpin/policy.json] [--json]
|
|
1478
|
-
toolpin policy check <server> --client|-c <client|all> [--version <server-version>] [--source toolpin|official|docker|all|custom-id] [--policy .toolpin/policy.json]
|
|
1478
|
+
toolpin policy check <server> --client|-c <client|all> [--version <server-version>] [--scope|-s project|global] [--source toolpin|official|docker|all|custom-id] [--policy .toolpin/policy.json] [--json] [--live]
|
|
1479
1479
|
toolpin lock <server> --client|-c <client|all> [--version <server-version>] [--source toolpin|official|docker|all|custom-id] [--scope project|global] [--file mcp-lock.json]
|
|
1480
1480
|
toolpin lock digest [--file mcp-lock.json] [--json]
|
|
1481
1481
|
toolpin lock key-fingerprint --public-key public.pem [--json]
|
package/dist/tui/command.js
CHANGED
|
@@ -8,7 +8,7 @@ export function commandLineFor(commandId, state, server) {
|
|
|
8
8
|
const serverName = server ? shellQuote(server.name) : "<server-name>";
|
|
9
9
|
switch (commandId) {
|
|
10
10
|
case "ingest":
|
|
11
|
-
return `toolpin ingest ${source} --pages
|
|
11
|
+
return `toolpin ingest ${source} --limit 500 --pages 25`;
|
|
12
12
|
case "installed":
|
|
13
13
|
return "toolpin list --scope all --json";
|
|
14
14
|
case "sources":
|
|
@@ -22,7 +22,7 @@ export function commandLineFor(commandId, state, server) {
|
|
|
22
22
|
case "info":
|
|
23
23
|
return `toolpin info ${serverName} ${source}${live}`;
|
|
24
24
|
case "audit":
|
|
25
|
-
return `toolpin audit ${serverName} ${source}${live}`;
|
|
25
|
+
return `toolpin audit server ${serverName} ${source}${live}`;
|
|
26
26
|
case "plan":
|
|
27
27
|
return `toolpin plan ${serverName} --client ${state.client} ${source}${live}`;
|
|
28
28
|
case "install":
|
package/dist/tui/views/panels.js
CHANGED
|
@@ -509,7 +509,7 @@ export function Footer({ state, width }) {
|
|
|
509
509
|
const copyright = "© 2026 Proofofwork Agency · https://github.com/proofofwork-agency/toolpin";
|
|
510
510
|
const copyrightWidth = Math.min(copyright.length, Math.max(0, width - 8));
|
|
511
511
|
const hintWidth = Math.max(10, width - copyrightWidth - 8);
|
|
512
|
-
return (_jsxs(Box, { paddingX: 2, marginTop: 1, flexShrink: 0, flexDirection: "column", children: [
|
|
512
|
+
return (_jsxs(Box, { paddingX: 2, marginTop: 1, flexShrink: 0, flexDirection: "column", children: [_jsxs(Box, { width: Math.max(1, width - 4), justifyContent: "space-between", marginTop: 1, marginBottom: 1, children: [_jsx(Box, { width: hintWidth, children: _jsx(Text, { wrap: "truncate", children: hints.map(([keyName, label], index) => (_jsxs(React.Fragment, { children: [index > 0 ? _jsx(Text, { color: CHROME, children: " | " }) : null, _jsx(Text, { bold: true, color: "white", children: keyName }), _jsxs(Text, { color: MUTED, children: [":", label] })] }, keyName))) }) }), _jsx(Text, { color: CHROME, wrap: "truncate", children: truncate(copyright, copyrightWidth) })] }), _jsx(Box, { width: Math.max(1, width - 4), justifyContent: "flex-end", children: _jsx(TrustStateLegend, { width: Math.max(1, width - 4) }) })] }));
|
|
513
513
|
}
|
|
514
514
|
export function TrustStateLegend({ width }) {
|
|
515
515
|
const compact = width < 118;
|
|
@@ -526,7 +526,7 @@ export function TrustStateLegend({ width }) {
|
|
|
526
526
|
{ label: "UNVERIFIED", color: ERR, text: "weak evidence" },
|
|
527
527
|
{ label: "BLOCKED", color: ERR, text: "stop" },
|
|
528
528
|
];
|
|
529
|
-
return (_jsxs(
|
|
529
|
+
return (_jsxs(Box, { flexDirection: "column", alignItems: "flex-end", marginTop: 1, marginBottom: 1, children: [_jsx(Text, { color: CHROME, children: "trust legend" }), _jsx(Box, { marginTop: 1, marginBottom: 1, flexDirection: compact ? "column" : "row", alignItems: "flex-end", children: items.map((item, index) => (_jsxs(Box, { marginLeft: index > 0 && !compact ? 2 : 0, marginTop: compact && index > 0 ? 1 : 0, children: [_jsx(Box, { marginRight: 1, children: _jsx(Text, { color: item.color, children: "\u2593" }) }), _jsx(Text, { bold: true, color: item.color, children: item.label }), _jsxs(Text, { color: MUTED, children: [" ", item.text] })] }, item.label))) })] }));
|
|
530
530
|
}
|
|
531
531
|
function EmptyPanel({ title }) {
|
|
532
532
|
return (_jsxs(Box, { flexDirection: "column", backgroundColor: SURFACE, paddingX: 2, paddingY: 1, flexGrow: 1, children: [_jsx(ModalTitle, { title: title.toLowerCase(), file: "empty" }), _jsx(Text, { color: MUTED, children: "No server selected. Search and select a server first." })] }));
|
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const TOOLPIN_VERSION = "0.2.
|
|
1
|
+
export const TOOLPIN_VERSION = "0.2.5";
|
|
@@ -112,7 +112,7 @@
|
|
|
112
112
|
<circle class="dot-red" cx="60" cy="53" r="9"/>
|
|
113
113
|
<circle class="dot-yellow" cx="90" cy="53" r="9"/>
|
|
114
114
|
<circle class="dot-green" cx="120" cy="53" r="9"/>
|
|
115
|
-
<text x="160" y="61" class="small">ToolPin
|
|
115
|
+
<text x="160" y="61" class="small">ToolPin - MCP install review gate - toolpin or tpn</text>
|
|
116
116
|
|
|
117
117
|
<g class="frame f1">
|
|
118
118
|
<text x="62" y="126"><tspan class="prompt">$</tspan><tspan class="cmd"> toolpin search contextrelay --source toolpin</tspan></text>
|
|
@@ -41,7 +41,7 @@ jobs:
|
|
|
41
41
|
runs-on: ubuntu-latest
|
|
42
42
|
steps:
|
|
43
43
|
- uses: actions/checkout@v4
|
|
44
|
-
- uses: proofofwork-agency/toolpin@v0.2.
|
|
44
|
+
- uses: proofofwork-agency/toolpin@v0.2.5
|
|
45
45
|
with:
|
|
46
46
|
file: mcp-lock.json
|
|
47
47
|
live: "true"
|
|
@@ -100,7 +100,7 @@ toolpin lock digest --file mcp-lock.json
|
|
|
100
100
|
Use it in CI:
|
|
101
101
|
|
|
102
102
|
```yaml
|
|
103
|
-
- uses: proofofwork-agency/toolpin@v0.2.
|
|
103
|
+
- uses: proofofwork-agency/toolpin@v0.2.5
|
|
104
104
|
with:
|
|
105
105
|
file: mcp-lock.json
|
|
106
106
|
live: "true"
|
|
@@ -122,7 +122,7 @@ toolpin lock verify-signature --policy .toolpin/policy.json --key public.pem --f
|
|
|
122
122
|
Then in CI:
|
|
123
123
|
|
|
124
124
|
```yaml
|
|
125
|
-
- uses: proofofwork-agency/toolpin@v0.2.
|
|
125
|
+
- uses: proofofwork-agency/toolpin@v0.2.5
|
|
126
126
|
with:
|
|
127
127
|
file: mcp-lock.json
|
|
128
128
|
live: "true"
|
|
@@ -139,7 +139,7 @@ trust root are controlled outside the PR path.
|
|
|
139
139
|
To enforce a non-default policy path:
|
|
140
140
|
|
|
141
141
|
```yaml
|
|
142
|
-
- uses: proofofwork-agency/toolpin@v0.2.
|
|
142
|
+
- uses: proofofwork-agency/toolpin@v0.2.5
|
|
143
143
|
with:
|
|
144
144
|
policy: security/toolpin-policy.json
|
|
145
145
|
```
|
|
@@ -147,7 +147,7 @@ To enforce a non-default policy path:
|
|
|
147
147
|
To make CI skip policy enforcement explicitly:
|
|
148
148
|
|
|
149
149
|
```yaml
|
|
150
|
-
- uses: proofofwork-agency/toolpin@v0.2.
|
|
150
|
+
- uses: proofofwork-agency/toolpin@v0.2.5
|
|
151
151
|
with:
|
|
152
152
|
no-policy: "true"
|
|
153
153
|
```
|
|
@@ -156,7 +156,7 @@ To re-run verification before comparing locked plans, use the stricter CI
|
|
|
156
156
|
posture:
|
|
157
157
|
|
|
158
158
|
```yaml
|
|
159
|
-
- uses: proofofwork-agency/toolpin@v0.2.
|
|
159
|
+
- uses: proofofwork-agency/toolpin@v0.2.5
|
|
160
160
|
with:
|
|
161
161
|
live: "true"
|
|
162
162
|
verify: "true"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@proofofwork-agency/toolpin",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.5",
|
|
4
4
|
"description": "Trusted install, lockfile, and governance layer for MCP servers",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"keywords": [
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
"tpn": "./dist/cli.js"
|
|
40
40
|
},
|
|
41
41
|
"scripts": {
|
|
42
|
+
"prebuild": "node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\"",
|
|
42
43
|
"build": "tsc -p tsconfig.json",
|
|
43
44
|
"postbuild": "node -e \"require('fs').chmodSync('dist/cli.js', 0o755)\"",
|
|
44
45
|
"docs:build": "docusaurus build website",
|