multimodel-dev-os 3.2.0 → 3.5.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/.ai/policies/registry-policy.yaml +29 -1
- package/.ai/registries/trusted-keys.yaml +12 -0
- package/.ai/schema/registry-manifest.schema.json +31 -2
- package/.ai/schema/registry-policy.schema.json +37 -1
- package/.ai/schema/trusted-keys.schema.json +69 -0
- package/AGENTS.md +22 -26
- package/MEMORY.md +34 -11
- package/README.md +1 -1
- package/RUNBOOK.md +28 -36
- package/TASKS.md +15 -5
- package/bin/multimodel-dev-os.js +1366 -548
- package/docs/.vitepress/config.js +3 -1
- package/docs/architecture.md +3 -1
- package/docs/index.md +5 -5
- package/docs/npm-publishing.md +5 -5
- package/docs/package-safety.md +3 -2
- package/docs/public/llms-full.txt +5 -1
- package/docs/public/llms.txt +6 -1
- package/docs/public/sitemap.xml +10 -0
- package/docs/registry-policy.md +29 -1
- package/docs/registry-security.md +73 -6
- package/docs/registry-signing.md +70 -0
- package/docs/registry-sync.md +5 -2
- package/docs/registry-trust-store.md +66 -0
- package/docs/release-policy.md +1 -1
- package/docs/security-threat-model.md +96 -0
- package/docs/testing.md +15 -2
- package/docs/trusted-registries.md +1 -1
- package/docs/v3-roadmap.md +11 -6
- package/docs/v3.5.0-readiness.md +46 -0
- package/package.json +1 -1
- package/scripts/install.ps1 +1 -1
- package/scripts/install.sh +1 -1
- package/scripts/verify.js +206 -9
- package/src/cli/help.js +1 -1
- package/src/cli/main.js +626 -81
- package/src/core/policy.js +9 -1
- package/src/registry/provenance.js +114 -0
- package/src/registry/signing.js +392 -0
- package/src/registry/trust-store.js +41 -0
- package/src/registry/verdict.js +51 -0
- package/tests/fixtures/signed-registries/README.md +4 -0
- package/tests/fixtures/signed-registries/revoked-key/catalog.yaml +8 -0
- package/tests/fixtures/signed-registries/revoked-key/expected-verdict.json +7 -0
- package/tests/fixtures/signed-registries/revoked-key/registry-manifest.yaml +14 -0
- package/tests/fixtures/signed-registries/tampered-manifest/catalog.yaml +8 -0
- package/tests/fixtures/signed-registries/tampered-manifest/expected-verdict.json +7 -0
- package/tests/fixtures/signed-registries/tampered-manifest/registry-manifest.yaml +14 -0
- package/tests/fixtures/signed-registries/trusted-keys.yaml +23 -0
- package/tests/fixtures/signed-registries/unsigned-remote-required/catalog.yaml +8 -0
- package/tests/fixtures/signed-registries/unsigned-remote-required/expected-verdict.json +7 -0
- package/tests/fixtures/signed-registries/unsigned-remote-required/registry-manifest.yaml +9 -0
- package/tests/fixtures/signed-registries/unsupported-algorithm/catalog.yaml +8 -0
- package/tests/fixtures/signed-registries/unsupported-algorithm/expected-verdict.json +7 -0
- package/tests/fixtures/signed-registries/unsupported-algorithm/registry-manifest.yaml +14 -0
- package/tests/fixtures/signed-registries/valid-signed-registry/catalog.yaml +8 -0
- package/tests/fixtures/signed-registries/valid-signed-registry/expected-verdict.json +7 -0
- package/tests/fixtures/signed-registries/valid-signed-registry/registry-manifest.yaml +14 -0
- package/tests/fixtures/signed-registries/wrong-key/catalog.yaml +8 -0
- package/tests/fixtures/signed-registries/wrong-key/expected-verdict.json +7 -0
- package/tests/fixtures/signed-registries/wrong-key/registry-manifest.yaml +14 -0
- package/tests/unit/registry-e2e-signature-fixtures.test.js +288 -0
- package/tests/unit/registry-policy.test.js +6 -0
- package/tests/unit/registry-provenance.test.js +185 -0
- package/tests/unit/registry-public-signing.test.js +109 -0
- package/tests/unit/registry-signature-policy.test.js +100 -0
- package/tests/unit/registry-signing.test.js +193 -0
- package/tests/unit/registry-trust-store.test.js +133 -0
|
@@ -12,9 +12,14 @@ require_approval_for_remote_sync: true
|
|
|
12
12
|
# Require SHA256 checksum verification for synced catalog files.
|
|
13
13
|
require_checksum: true
|
|
14
14
|
|
|
15
|
-
# Require cryptographic signature verification (
|
|
15
|
+
# Require cryptographic signature verification (HMAC-SHA256).
|
|
16
|
+
# Requires a signing key at .ai/registry-signing-key (generate with: registry keygen --approved).
|
|
16
17
|
require_signature: false
|
|
17
18
|
|
|
19
|
+
# Require that registry verify checks the local lockfile (.ai/registry-lock.json).
|
|
20
|
+
# When true, verify will fail if no lockfile entry exists for the registry.
|
|
21
|
+
require_lockfile_on_verify: false
|
|
22
|
+
|
|
18
23
|
# Allow installing plugins from registries with trust_level: untrusted.
|
|
19
24
|
allow_untrusted_install: false
|
|
20
25
|
|
|
@@ -49,3 +54,26 @@ allowed_file_extensions:
|
|
|
49
54
|
- ".yaml"
|
|
50
55
|
- ".yml"
|
|
51
56
|
- ".json"
|
|
57
|
+
|
|
58
|
+
# Allow unsigned local registries.
|
|
59
|
+
allow_unsigned_local: true
|
|
60
|
+
|
|
61
|
+
# Allow unsigned bundled registries.
|
|
62
|
+
allow_unsigned_bundled: true
|
|
63
|
+
|
|
64
|
+
# Allow unsigned remote registries.
|
|
65
|
+
allow_unsigned_remote: false
|
|
66
|
+
|
|
67
|
+
# Path to the trusted keys configuration file.
|
|
68
|
+
trusted_keys_file: ".ai/registries/trusted-keys.yaml"
|
|
69
|
+
|
|
70
|
+
# Allowed signature algorithms.
|
|
71
|
+
allowed_signature_algorithms:
|
|
72
|
+
- "ed25519"
|
|
73
|
+
- "hmac-sha256"
|
|
74
|
+
|
|
75
|
+
# Require signature to be from a trusted publisher in the trust store.
|
|
76
|
+
require_trusted_publisher: false
|
|
77
|
+
|
|
78
|
+
# Require provenance lockfile verification.
|
|
79
|
+
provenance_required: true
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# MultiModel Dev OS Trusted Keys
|
|
2
|
+
# Stores trusted public keys for registry publisher verification.
|
|
3
|
+
# Only active keys with matching scopes ('registry' or 'catalog') can verify signatures.
|
|
4
|
+
# Never store private keys in this file or in this repository.
|
|
5
|
+
|
|
6
|
+
trusted_publishers:
|
|
7
|
+
- key_id: example-maintainer-key
|
|
8
|
+
name: "Example Maintainer (Test/Example Key Only)"
|
|
9
|
+
algorithm: ed25519
|
|
10
|
+
public_key: "MCowBQYDK2VwAyEA9vWwyE5+fY0dvEzl9S1UcvtoMkOAIDhDCzZAkP+CVNo="
|
|
11
|
+
scopes: ["registry", "catalog"]
|
|
12
|
+
status: "active"
|
|
@@ -49,8 +49,37 @@
|
|
|
49
49
|
"description": "Version of the safety policy specification this registry conforms to."
|
|
50
50
|
},
|
|
51
51
|
"signature": {
|
|
52
|
-
"type": ["
|
|
53
|
-
"description": "Cryptographic signature of the manifest.
|
|
52
|
+
"type": ["object", "null"],
|
|
53
|
+
"description": "Cryptographic signature block of the manifest.",
|
|
54
|
+
"properties": {
|
|
55
|
+
"algorithm": { "type": "string", "enum": ["ed25519", "hmac-sha256"] },
|
|
56
|
+
"key_id": { "type": "string" },
|
|
57
|
+
"signature": { "type": "string" },
|
|
58
|
+
"signed_fields": {
|
|
59
|
+
"type": "array",
|
|
60
|
+
"items": { "type": "string" }
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"required": ["algorithm", "key_id", "signature", "signed_fields"],
|
|
64
|
+
"additionalProperties": false
|
|
65
|
+
},
|
|
66
|
+
"signatures": {
|
|
67
|
+
"type": "array",
|
|
68
|
+
"description": "List of cryptographic signature blocks of the manifest.",
|
|
69
|
+
"items": {
|
|
70
|
+
"type": "object",
|
|
71
|
+
"properties": {
|
|
72
|
+
"algorithm": { "type": "string", "enum": ["ed25519", "hmac-sha256"] },
|
|
73
|
+
"key_id": { "type": "string" },
|
|
74
|
+
"signature": { "type": "string" },
|
|
75
|
+
"signed_fields": {
|
|
76
|
+
"type": "array",
|
|
77
|
+
"items": { "type": "string" }
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"required": ["algorithm", "key_id", "signature", "signed_fields"],
|
|
81
|
+
"additionalProperties": false
|
|
82
|
+
}
|
|
54
83
|
}
|
|
55
84
|
},
|
|
56
85
|
"additionalProperties": false
|
|
@@ -11,7 +11,14 @@
|
|
|
11
11
|
"allow_untrusted_install",
|
|
12
12
|
"allowed_write_roots",
|
|
13
13
|
"blocked_paths",
|
|
14
|
-
"allowed_file_extensions"
|
|
14
|
+
"allowed_file_extensions",
|
|
15
|
+
"allow_unsigned_local",
|
|
16
|
+
"allow_unsigned_bundled",
|
|
17
|
+
"allow_unsigned_remote",
|
|
18
|
+
"trusted_keys_file",
|
|
19
|
+
"allowed_signature_algorithms",
|
|
20
|
+
"require_trusted_publisher",
|
|
21
|
+
"provenance_required"
|
|
15
22
|
],
|
|
16
23
|
"properties": {
|
|
17
24
|
"allow_remote_registries": {
|
|
@@ -60,6 +67,35 @@
|
|
|
60
67
|
"type": "array",
|
|
61
68
|
"items": { "type": "string" },
|
|
62
69
|
"description": "File extensions permitted for plugin asset files."
|
|
70
|
+
},
|
|
71
|
+
"allow_unsigned_local": {
|
|
72
|
+
"type": "boolean",
|
|
73
|
+
"description": "Whether unsigned local registries are permitted."
|
|
74
|
+
},
|
|
75
|
+
"allow_unsigned_bundled": {
|
|
76
|
+
"type": "boolean",
|
|
77
|
+
"description": "Whether unsigned bundled registries are permitted."
|
|
78
|
+
},
|
|
79
|
+
"allow_unsigned_remote": {
|
|
80
|
+
"type": "boolean",
|
|
81
|
+
"description": "Whether unsigned remote registries are permitted."
|
|
82
|
+
},
|
|
83
|
+
"trusted_keys_file": {
|
|
84
|
+
"type": "string",
|
|
85
|
+
"description": "Path to the trusted keys yaml configuration file."
|
|
86
|
+
},
|
|
87
|
+
"allowed_signature_algorithms": {
|
|
88
|
+
"type": "array",
|
|
89
|
+
"items": { "type": "string" },
|
|
90
|
+
"description": "Cryptographic signature algorithms allowed for manifest verification."
|
|
91
|
+
},
|
|
92
|
+
"require_trusted_publisher": {
|
|
93
|
+
"type": "boolean",
|
|
94
|
+
"description": "Whether signatures must come from a trusted publisher in the trust store."
|
|
95
|
+
},
|
|
96
|
+
"provenance_required": {
|
|
97
|
+
"type": "boolean",
|
|
98
|
+
"description": "Whether a provenance record (lockfile entry) is required."
|
|
63
99
|
}
|
|
64
100
|
},
|
|
65
101
|
"additionalProperties": false
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "MultiModel Dev OS Trusted Keys Schema",
|
|
4
|
+
"description": "JSON schema defining trusted publisher keys for remote registry signature verification",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": [
|
|
7
|
+
"trusted_publishers"
|
|
8
|
+
],
|
|
9
|
+
"properties": {
|
|
10
|
+
"trusted_publishers": {
|
|
11
|
+
"type": "array",
|
|
12
|
+
"items": {
|
|
13
|
+
"type": "object",
|
|
14
|
+
"required": [
|
|
15
|
+
"key_id",
|
|
16
|
+
"name",
|
|
17
|
+
"algorithm",
|
|
18
|
+
"public_key",
|
|
19
|
+
"scopes",
|
|
20
|
+
"status"
|
|
21
|
+
],
|
|
22
|
+
"properties": {
|
|
23
|
+
"key_id": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"description": "Unique identifier of the trusted key."
|
|
26
|
+
},
|
|
27
|
+
"name": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"description": "Name of the publisher associated with the key."
|
|
30
|
+
},
|
|
31
|
+
"algorithm": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"enum": [
|
|
34
|
+
"ed25519",
|
|
35
|
+
"hmac-sha256"
|
|
36
|
+
],
|
|
37
|
+
"description": "Cryptographic signature algorithm."
|
|
38
|
+
},
|
|
39
|
+
"public_key": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"description": "PEM-encoded public key or key string."
|
|
42
|
+
},
|
|
43
|
+
"scopes": {
|
|
44
|
+
"type": "array",
|
|
45
|
+
"items": {
|
|
46
|
+
"type": "string",
|
|
47
|
+
"enum": [
|
|
48
|
+
"registry",
|
|
49
|
+
"catalog"
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
"description": "Allowed scopes for this key."
|
|
53
|
+
},
|
|
54
|
+
"status": {
|
|
55
|
+
"type": "string",
|
|
56
|
+
"enum": [
|
|
57
|
+
"active",
|
|
58
|
+
"revoked",
|
|
59
|
+
"disabled"
|
|
60
|
+
],
|
|
61
|
+
"description": "Key status."
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"additionalProperties": false
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"additionalProperties": false
|
|
69
|
+
}
|
package/AGENTS.md
CHANGED
|
@@ -5,38 +5,34 @@
|
|
|
5
5
|
|
|
6
6
|
## Project Overview
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
description: null
|
|
8
|
+
project: multimodel-dev-os
|
|
9
|
+
stack: Node.js (ES modules), esbuild, Vitest
|
|
10
|
+
description: MultiModel Dev OS is a zero-dependency local CLI and developer configuration standard that enforces structure, memory, tasks, and registry safety boundaries for AI coding agents.
|
|
12
11
|
|
|
13
12
|
## Build Commands
|
|
14
13
|
|
|
15
|
-
<!-- Replace with your actual commands -->
|
|
16
14
|
```
|
|
17
|
-
dev
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
lint: null
|
|
15
|
+
build: npm run build (compiles src/ to bin/multimodel-dev-os.js)
|
|
16
|
+
test: npm test (runs vitest suites)
|
|
17
|
+
verify: node scripts/verify.js (runs strict audit checks)
|
|
21
18
|
```
|
|
22
19
|
|
|
23
20
|
## Coding Conventions
|
|
24
21
|
|
|
25
|
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
- Formatting: null
|
|
22
|
+
- Language: JavaScript (ES Modules, Node.js native API)
|
|
23
|
+
- Framework: Zero runtime dependencies (standard library crypto, fs, path, readline, https, etc.)
|
|
24
|
+
- Style guide: Clear JSDoc typing, deterministic canonical serializations, timing-safe crypto
|
|
25
|
+
- Type checking: JSDoc type comments
|
|
26
|
+
- Formatting: 2-space indentation, single-shebang binary layout
|
|
31
27
|
|
|
32
28
|
## File Structure Rules
|
|
33
29
|
|
|
34
|
-
<!-- Which directories serve which purpose -->
|
|
35
30
|
```
|
|
36
31
|
src/ → Application source code
|
|
37
|
-
|
|
38
|
-
tests/ →
|
|
39
|
-
docs/ →
|
|
32
|
+
bin/ → Standalone built binary (do not edit bin/ directly, edit src/)
|
|
33
|
+
tests/ → Unit test files and mock fixtures
|
|
34
|
+
docs/ → Developer manuals and architecture documentation
|
|
35
|
+
scripts/ → Packaging, compilation, and validation scripts
|
|
40
36
|
```
|
|
41
37
|
|
|
42
38
|
## Boundaries
|
|
@@ -48,6 +44,8 @@ no-touch:
|
|
|
48
44
|
- .env.local
|
|
49
45
|
- node_modules/
|
|
50
46
|
- package-lock.json (do not manually edit)
|
|
47
|
+
- bin/multimodel-dev-os.js (auto-generated by esbuild, modify src/)
|
|
48
|
+
- .ai/registry-signing-key (gitignored private key, generate via keygen)
|
|
51
49
|
```
|
|
52
50
|
|
|
53
51
|
## Agent Roles
|
|
@@ -61,19 +59,17 @@ no-touch:
|
|
|
61
59
|
|
|
62
60
|
## Dependencies
|
|
63
61
|
|
|
64
|
-
|
|
65
|
-
-
|
|
62
|
+
- Runtime: Zero runtime dependencies
|
|
63
|
+
- Dev: esbuild, vitest
|
|
66
64
|
|
|
67
65
|
## Testing Strategy
|
|
68
66
|
|
|
69
|
-
|
|
70
|
-
-
|
|
71
|
-
- Integration tests: null
|
|
72
|
-
- E2E tests: null
|
|
67
|
+
- Unit tests: Vitest coverage for YAML parser, policy engine, signatures, trust store, and URL validators.
|
|
68
|
+
- Verification: Scripts checking binary shebangs, header lines, and path boundaries.
|
|
73
69
|
|
|
74
70
|
## Additional Context
|
|
75
71
|
|
|
76
|
-
<!-- Any other context agents need -->
|
|
77
72
|
- See `MEMORY.md` for project history and decisions
|
|
78
73
|
- See `TASKS.md` for current work items
|
|
79
74
|
- See `RUNBOOK.md` for operational procedures
|
|
75
|
+
|
package/MEMORY.md
CHANGED
|
@@ -9,34 +9,57 @@
|
|
|
9
9
|
|
|
10
10
|
| Date | Decision | Rationale |
|
|
11
11
|
|------|----------|-----------|
|
|
12
|
-
|
|
|
12
|
+
| 2026-06-19 | Modular src/ layout (v3.1.0) | Maintainability + testability over single-file monolith |
|
|
13
|
+
| 2026-06-19 | esbuild for single-file dist (v3.1.0) | Zero-runtime-dep bundle, deterministic builds |
|
|
14
|
+
| 2026-06-19 | HMAC-SHA256 for registry signing (v3.5.0-prep) | No external PKI/GPG; Node built-in crypto only; project-scoped key |
|
|
15
|
+
| 2026-06-19 | Lockfile separate from sources.yaml (v3.5.0-prep) | Clear separation: sources.yaml = config, registry-lock.json = provenance |
|
|
16
|
+
| 2026-06-19 | timingSafeEqual for signature compare (v3.5.0-prep) | Prevents timing-based side-channel attacks |
|
|
17
|
+
| 2026-06-20 | Ed25519 Asymmetric Signatures (v3.5.0-prep Sprint 2) | Provides public-key trust boundary, avoiding private key disclosures. |
|
|
18
|
+
| 2026-06-20 | Trust Store Configuration (v3.5.0-prep Sprint 2) | Local key-based mapping of trusted keys and publishers with scope filters. |
|
|
19
|
+
| 2026-06-20 | Canonical payload via recursive sorting (v3.5.0-prep) | Guarantees stable JSON representations independent of property order. |
|
|
20
|
+
| 2026-06-20 | Structured Verdict Reporting (v3.5.0-prep Sprint 3) | Standardizes verification status output across CLI, lockfile, and audit logs. |
|
|
21
|
+
| 2026-06-20 | Offline E2E Signed Fixtures (v3.5.0-prep Sprint 3) | Validates edge cases without hitting live remote servers. |
|
|
13
22
|
|
|
14
23
|
## Key Patterns
|
|
15
24
|
|
|
16
25
|
<!-- Patterns agents should follow consistently -->
|
|
17
26
|
|
|
18
|
-
-
|
|
27
|
+
- All signing/verification uses Node.js built-in `crypto` — zero runtime deps
|
|
28
|
+
- Registry signing key lives in `.ai/registry-signing-key` (gitignored, 0o600 permissions)
|
|
29
|
+
- Lockfile `.ai/registry-lock.json` is committed to VCS (tamper evidence)
|
|
30
|
+
- CLI handlers follow the pattern: validate → check policy → check --approved → execute
|
|
31
|
+
- `src/` modules are pure ES modules bundled by `scripts/build-cli.js` into `bin/`
|
|
32
|
+
- `scripts/verify.js` must be expanded with assertions for every new module/test file added
|
|
19
33
|
|
|
20
34
|
## Known Issues
|
|
21
35
|
|
|
22
36
|
<!-- Gotchas, workarounds, and technical debt -->
|
|
23
37
|
|
|
24
|
-
-
|
|
38
|
+
- Signing key rotation invalidates all lockfile signatures — users must re-sync after keygen --force
|
|
39
|
+
- `.gitignore` patterns for `.ai/registry-signing-key` use exact path (not wildcard)
|
|
40
|
+
- On Windows, `chmodSync` to `0o600` is a no-op — key security relies on gitignore there
|
|
25
41
|
|
|
26
42
|
## Environment Notes
|
|
27
43
|
|
|
28
44
|
<!-- Environment-specific context (OS quirks, CI setup, etc.) -->
|
|
29
45
|
|
|
30
|
-
- OS:
|
|
31
|
-
- CI:
|
|
32
|
-
- Hosting:
|
|
46
|
+
- OS: Windows (development), Ubuntu + macOS (CI matrix)
|
|
47
|
+
- CI: GitHub Actions, Node 20.x and 22.x
|
|
48
|
+
- Hosting: npm registry (manual publish only — no CI auto-publish)
|
|
33
49
|
|
|
34
50
|
## Session Notes
|
|
35
51
|
|
|
36
52
|
<!-- Recent session summaries — newest first, keep last 5 -->
|
|
37
53
|
|
|
38
|
-
### Session:
|
|
39
|
-
**Date:**
|
|
40
|
-
**Agent:**
|
|
41
|
-
**Summary:**
|
|
42
|
-
**Files changed:**
|
|
54
|
+
### Session: v3.5.0-prep Sprint 3 — Signed Registry E2E Fixtures + Release Readiness
|
|
55
|
+
**Date:** 2026-06-20
|
|
56
|
+
**Agent:** Antigravity
|
|
57
|
+
**Summary:** Implemented `src/registry/verdict.js` module for structured trust verdicts. Created offline E2E signed registry fixtures covering valid, tampered, wrong key, revoked key, unsigned remote, and unsupported algorithm states. Deployed comprehensive E2E tests in `tests/unit/registry-e2e-signature-fixtures.test.js` validating signature blocks, trust store loading, policies, and CLI subprocess outputs. Added threat model `docs/security-threat-model.md` and release readiness checklist `docs/v3.5.0-readiness.md`. Fully updated all verification scripts and sitemaps. All 113 unit tests and 305 verification audit checks pass cleanly.
|
|
58
|
+
**Files changed:** src/registry/verdict.js (new), tests/fixtures/signed-registries/* (new), tests/unit/registry-e2e-signature-fixtures.test.js (new), docs/security-threat-model.md (new), docs/v3.5.0-readiness.md (new), src/cli/main.js, scripts/verify.js, docs/.vitepress/config.js, docs/public/sitemap.xml, docs/public/llms.txt, docs/public/llms-full.txt, docs/registry-security.md, docs/registry-signing.md, CHANGELOG.md
|
|
59
|
+
|
|
60
|
+
### Session: v3.5.0-prep Sprint 2 — Public-Key Registry Signatures + Trust Store
|
|
61
|
+
**Date:** 2026-06-20
|
|
62
|
+
**Agent:** Antigravity
|
|
63
|
+
**Summary:** Implemented Ed25519 signing support, trusted-keys schema, trust store validator/loader, policy configuration updates, lockfile entries with detailed trust/signature verdicts, `registry trust list/show` subcommands, 3 new unit test suites (public-signing, trust-store, signature-policy), and release audit assertions. Verified that all 98 unit tests and 297 release verification checks pass cleanly.
|
|
64
|
+
**Files changed:** src/registry/signing.js, src/registry/trust-store.js (new), .ai/registries/trusted-keys.yaml (new), .ai/schema/trusted-keys.schema.json (new), .ai/schema/registry-manifest.schema.json, src/core/policy.js, .ai/policies/registry-policy.yaml, .ai/schema/registry-policy.schema.json, src/registry/provenance.js, src/cli/main.js, src/cli/help.js, scripts/verify.js, tests/unit/registry-public-signing.test.js (new), tests/unit/registry-trust-store.test.js (new), tests/unit/registry-signature-policy.test.js (new), docs/registry-signing.md (new), docs/registry-trust-store.md (new), docs/registry-security.md, docs/trusted-registries.md, docs/registry-policy.md, docs/architecture.md, docs/registry-sync.md, docs/package-safety.md, docs/v3-roadmap.md, docs/testing.md, CHANGELOG.md
|
|
65
|
+
|
package/README.md
CHANGED
|
@@ -162,7 +162,7 @@ npx multimodel-dev-os@latest handoff build
|
|
|
162
162
|
| **v3.0.2** | Registry Sync Security Hotfix | ✅ Released |
|
|
163
163
|
| **v3.1.0** | Modular Source Layout + Formal Unit Tests | ✅ Released |
|
|
164
164
|
| **v3.2.0** | Stable Modular Build + Package Governance | ✅ Released |
|
|
165
|
-
|
|
165
|
+
| **v3.5.0** | Trusted Registry Signing + Provenance Foundation | ✅ Released |
|
|
166
166
|
|
|
167
167
|
**[Full Roadmap →](https://rizvee.github.io/multimodel-dev-os/v3-roadmap)**
|
|
168
168
|
|
package/RUNBOOK.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Runbook
|
|
2
2
|
|
|
3
|
-
> Operational procedures for
|
|
3
|
+
> Operational procedures for development setup, testing, packaging, and rollback.
|
|
4
4
|
> AI agents reference this before executing critical operations.
|
|
5
5
|
|
|
6
6
|
## Environment Setup
|
|
@@ -10,64 +10,56 @@
|
|
|
10
10
|
```bash
|
|
11
11
|
# 1. Clone the repo
|
|
12
12
|
git clone <repo-url>
|
|
13
|
-
cd
|
|
13
|
+
cd multimodel-dev-os
|
|
14
14
|
|
|
15
|
-
# 2. Install dependencies
|
|
16
|
-
|
|
15
|
+
# 2. Install dev dependencies
|
|
16
|
+
npm install
|
|
17
17
|
|
|
18
|
-
# 3.
|
|
19
|
-
|
|
20
|
-
# Edit .env with your values
|
|
18
|
+
# 3. Build the CLI binary
|
|
19
|
+
npm run build
|
|
21
20
|
|
|
22
|
-
# 4.
|
|
23
|
-
|
|
21
|
+
# 4. Run tests
|
|
22
|
+
npm test
|
|
24
23
|
```
|
|
25
24
|
|
|
26
|
-
## Deploy
|
|
25
|
+
## Deploy / Release
|
|
27
26
|
|
|
28
|
-
|
|
27
|
+
As this is a local CLI utility distributed via npm, deployment is done by compiling the binary and publishing to npm.
|
|
29
28
|
|
|
30
29
|
| Step | Command | Notes |
|
|
31
30
|
|------|---------|-------|
|
|
32
|
-
| 1 |
|
|
33
|
-
| 2 |
|
|
34
|
-
|
|
35
|
-
**Deploy URL:** null
|
|
36
|
-
**Deploy branch:** null
|
|
31
|
+
| 1 | `npm run verify` | Runs unit tests, generated CLI freshness check, and strict code validations |
|
|
32
|
+
| 2 | `$env:MMDO_ALLOW_PUBLISH="true"; npm publish` | Set environment variable to bypass prepublish-guard |
|
|
37
33
|
|
|
38
34
|
## Rollback
|
|
39
35
|
|
|
40
|
-
|
|
36
|
+
To roll back a released npm package or local commit:
|
|
41
37
|
|
|
42
38
|
```bash
|
|
43
|
-
#
|
|
44
|
-
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
**Last known good commit:** null
|
|
48
|
-
|
|
49
|
-
## Incident Response
|
|
39
|
+
# Deprecate the broken package version on npm
|
|
40
|
+
npm deprecate multimodel-dev-os@<version> "Deprecation message detailing reason"
|
|
50
41
|
|
|
51
|
-
|
|
42
|
+
# Revert local repository main branch to last stable tag
|
|
43
|
+
git reset --hard v3.5.0
|
|
44
|
+
```
|
|
52
45
|
|
|
53
|
-
|
|
54
|
-
2. **Communicate:** Notify team at `null`
|
|
55
|
-
3. **Mitigate:** Rollback if necessary (see above)
|
|
56
|
-
4. **Resolve:** Fix the root cause
|
|
57
|
-
5. **Document:** Add post-mortem to `MEMORY.md`
|
|
46
|
+
**Last known good release tag:** `v3.5.0`
|
|
58
47
|
|
|
59
48
|
## Health Checks
|
|
60
49
|
|
|
61
|
-
|
|
50
|
+
Run diagnostics to verify CLI health:
|
|
62
51
|
|
|
63
|
-
| Check | Command
|
|
52
|
+
| Check | Command | Expected |
|
|
64
53
|
|-------|-------------|----------|
|
|
65
|
-
|
|
|
54
|
+
| CLI Help / Version | `node bin/multimodel-dev-os.js --help` | Prints help text displaying current version |
|
|
55
|
+
| Registry Policy Engine | `node bin/multimodel-dev-os.js registry status` | Shows correct policy state and configuration values |
|
|
56
|
+
| Trust Store Integrity | `node bin/multimodel-dev-os.js registry trust verify` | Validates all trusted public key formats in the store |
|
|
57
|
+
| Strict Audit Check | `npm run verify` | Completes successfully with 0 failures |
|
|
66
58
|
|
|
67
59
|
## Secrets & Config
|
|
68
60
|
|
|
69
|
-
<!-- Where secrets are stored (never put actual secrets here) -->
|
|
70
|
-
|
|
71
61
|
| Secret | Location | Rotation |
|
|
72
62
|
|--------|----------|----------|
|
|
73
|
-
|
|
|
63
|
+
| Project Registry Sync Key | `.ai/registry-signing-key` | Run `registry keygen --approved --force` |
|
|
64
|
+
| npm Publish Token | `~/.npmrc` or user environment | Managed in npmjs.com account settings |
|
|
65
|
+
|
package/TASKS.md
CHANGED
|
@@ -7,22 +7,32 @@
|
|
|
7
7
|
|
|
8
8
|
<!-- Active work items — agents pick from here -->
|
|
9
9
|
|
|
10
|
-
- [ ]
|
|
10
|
+
- [ ] Sprint 4 Planning — Trust Store Remote Key Sync & GPG Signatures
|
|
11
11
|
|
|
12
12
|
## Backlog
|
|
13
13
|
|
|
14
14
|
<!-- Upcoming work — not yet started -->
|
|
15
15
|
|
|
16
|
-
- [ ]
|
|
16
|
+
- [ ] Deployed trust key sync capability from verified remote registries
|
|
17
|
+
- [ ] Support GPG-compatible signatures for enterprise environments
|
|
17
18
|
|
|
18
19
|
## In Review
|
|
19
20
|
|
|
20
21
|
<!-- Completed work awaiting review -->
|
|
21
22
|
|
|
22
|
-
- [ ] null
|
|
23
|
-
|
|
24
23
|
## Done
|
|
25
24
|
|
|
26
25
|
<!-- Completed and merged — keep last 10 items, archive the rest -->
|
|
27
26
|
|
|
28
|
-
- [x]
|
|
27
|
+
- [x] Deployed E2E offline signed registry fixtures and unit test validation suite (`registry-e2e-signature-fixtures.test.js`)
|
|
28
|
+
- [x] Implemented verdict module for structured trust verdict reporting (`src/registry/verdict.js`)
|
|
29
|
+
- [x] Created Threat Model documentation (`docs/security-threat-model.md`) and v3.5.0 Release Readiness Checklist (`docs/v3.5.0-readiness.md`)
|
|
30
|
+
- [x] Updated existing docs, config sidebars, sitemaps, and LLM discoverability indices
|
|
31
|
+
- [x] Deployed Ed25519 public key registry signatures (`src/registry/signing.js`)
|
|
32
|
+
- [x] Implemented trusted key store and scope check policies (`src/registry/trust-store.js`)
|
|
33
|
+
- [x] Added `registry trust` CLI subcommand suites (`list`, `show <key_id>`, `verify`)
|
|
34
|
+
- [x] Configured signature validation rules and policy config schemas (`registry-policy.schema.json`)
|
|
35
|
+
- [x] Deployed 113 unit tests with 100% pass rates across Windows, Linux, and macOS
|
|
36
|
+
- [x] Hardened release audit verifier with 305 structural and functional checks passing
|
|
37
|
+
- [x] Implemented HMAC-SHA256 registry signing foundation and provenance lockfile (`src/registry/provenance.js`)
|
|
38
|
+
|