@mnstry/atelier 0.2.0-alpha.3 → 0.2.0-alpha.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.
Files changed (55) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/README.md +280 -230
  3. package/contracts/public-api-baseline.json +57 -0
  4. package/docs/assurance-controls.md +39 -0
  5. package/docs/atelier-runtime.md +15 -0
  6. package/docs/blocks/claims.md +15 -9
  7. package/docs/design.md +12 -6
  8. package/docs/install.md +26 -4
  9. package/docs/knowledge-graph.md +8 -4
  10. package/docs/local-services.md +101 -0
  11. package/docs/release-engineering.md +75 -10
  12. package/docs/repo-boundary-guard.md +12 -2
  13. package/docs/upgrade.md +34 -2
  14. package/fixtures/projects/sample-workspace/content/source.html.kg.json +4 -1
  15. package/fixtures/projects/source-formats-workspace/content/data.json.kg.json +4 -1
  16. package/fixtures/projects/source-formats-workspace/content/logo.png.kg.json +4 -1
  17. package/fixtures/projects/source-formats-workspace/content/metrics.csv.kg.json +4 -1
  18. package/fixtures/projects/source-formats-workspace/content/pipeline.yaml.kg.json +4 -1
  19. package/package.json +13 -6
  20. package/skills/claude/atelier-local-service/SKILL.md +47 -0
  21. package/skills/claude/atelier-open/SKILL.md +6 -5
  22. package/skills/claude/atelier-public-boundary/SKILL.md +31 -0
  23. package/skills/codex/atelier-local-service/SKILL.md +47 -0
  24. package/skills/codex/atelier-open/SKILL.md +6 -5
  25. package/skills/codex/atelier-public-boundary/SKILL.md +31 -0
  26. package/src/boundary/content-rules.mjs +278 -20
  27. package/src/boundary/policy.mjs +150 -60
  28. package/src/cli/execute-command.mjs +36 -0
  29. package/src/cli/run.mjs +17 -7
  30. package/src/collaboration/event-ledger.mjs +365 -0
  31. package/src/collaboration/index.mjs +17 -0
  32. package/src/collaboration/proposals.mjs +265 -65
  33. package/src/commands/attestation.mjs +20 -6
  34. package/src/commands/disclosure.mjs +133 -0
  35. package/src/commands/distribution.mjs +2 -1
  36. package/src/commands/extension-pack.mjs +2 -1
  37. package/src/commands/init.mjs +2 -1
  38. package/src/commands/server.mjs +1 -4
  39. package/src/disclosure/content-scan.mjs +193 -0
  40. package/src/egress/check.mjs +7 -38
  41. package/src/egress/forbidden-egress.mjs +32 -18
  42. package/src/graph/graph.mjs +112 -314
  43. package/src/graph/knowledge-graph.mjs +94 -18
  44. package/src/harness/context-client.mjs +9 -1
  45. package/src/index.mjs +12 -0
  46. package/src/project/config.mjs +66 -7
  47. package/src/project/file-class.mjs +14 -0
  48. package/src/project/package-root.mjs +10 -0
  49. package/src/project/path-match.mjs +38 -15
  50. package/src/project/private-state.mjs +110 -0
  51. package/src/server/local-sidecar.mjs +81 -59
  52. package/src/server/security.mjs +89 -4
  53. package/src/server/server.mjs +3 -2
  54. package/src/support/feedback-report.mjs +4 -3
  55. package/src/upgrade/upgrade.mjs +2 -1
@@ -1,5 +1,6 @@
1
1
  {
2
- "assetFilename": "data.json",
2
+ "schema": "mnstry.source-sidecar@v1",
3
+ "asset": "data.json",
3
4
  "title": "Sample dataset",
4
5
  "summary": "Neutral JSON dataset described entirely by its sidecar.",
5
6
  "tags": [
@@ -8,6 +9,8 @@
8
9
  "kg": {
9
10
  "id": "source-formats:data-json",
10
11
  "type": "source",
12
+ "domain": "sample",
13
+ "lifecycle": "source",
11
14
  "status": "active",
12
15
  "audience": "team",
13
16
  "relations": {}
@@ -1,5 +1,6 @@
1
1
  {
2
- "assetFilename": "logo.png",
2
+ "schema": "mnstry.source-sidecar@v1",
3
+ "asset": "logo.png",
3
4
  "title": "Sample binary asset",
4
5
  "summary": "Four-byte PNG-magic stub; the graph never reads the asset bytes.",
5
6
  "tags": [
@@ -8,6 +9,8 @@
8
9
  "kg": {
9
10
  "id": "source-formats:logo-png",
10
11
  "type": "artifact",
12
+ "domain": "sample",
13
+ "lifecycle": "source",
11
14
  "status": "active",
12
15
  "audience": "sensitive",
13
16
  "relations": {}
@@ -1,5 +1,6 @@
1
1
  {
2
- "assetFilename": "metrics.csv",
2
+ "schema": "mnstry.source-sidecar@v1",
3
+ "asset": "metrics.csv",
3
4
  "title": "Sample metrics",
4
5
  "summary": "Neutral CSV evidence table described by its sidecar.",
5
6
  "tags": [
@@ -8,6 +9,8 @@
8
9
  "kg": {
9
10
  "id": "source-formats:metrics-csv",
10
11
  "type": "evidence",
12
+ "domain": "sample",
13
+ "lifecycle": "source",
11
14
  "status": "active",
12
15
  "audience": "operator",
13
16
  "relations": {}
@@ -1,5 +1,6 @@
1
1
  {
2
- "assetFilename": "pipeline.yaml",
2
+ "schema": "mnstry.source-sidecar@v1",
3
+ "asset": "pipeline.yaml",
3
4
  "title": "Sample pipeline",
4
5
  "summary": "Neutral YAML file; atelier never parses it, the sidecar speaks for it.",
5
6
  "tags": [
@@ -8,6 +9,8 @@
8
9
  "kg": {
9
10
  "id": "source-formats:pipeline-yaml",
10
11
  "type": "source",
12
+ "domain": "sample",
13
+ "lifecycle": "source",
11
14
  "status": "active",
12
15
  "audience": "public",
13
16
  "relations": {}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@mnstry/atelier",
3
- "version": "0.2.0-alpha.3",
3
+ "version": "0.2.0-alpha.5",
4
4
  "private": false,
5
- "description": "Local CLI that compiles a Git repository into a validated knowledge graph — front-matter ontology, fail-closed audience boundaries, offline contract conformance. No telemetry, no service, no account.",
5
+ "description": "Local toolkit that turns a Git repository into an ontology-governed knowledge graph, enforcement layer, and runtime for people, agents, and tools. No telemetry, service, or account.",
6
6
  "keywords": [
7
7
  "knowledge-graph",
8
8
  "ontology",
@@ -32,8 +32,10 @@
32
32
  "./readiness-protocols": "./src/readiness-protocols/bundled-pack.mjs",
33
33
  "./server": "./src/server/local-sidecar.mjs",
34
34
  "./harness": "./src/harness/context.mjs",
35
+ "./collaboration": "./src/collaboration/index.mjs",
35
36
  "./support": "./src/support/support-bundle.mjs",
36
37
  "./egress": "./src/egress/forbidden-egress.mjs",
38
+ "./disclosure": "./src/disclosure/content-scan.mjs",
37
39
  "./boundary": "./src/boundary/policy.mjs",
38
40
  "./upgrade": "./src/upgrade/upgrade.mjs",
39
41
  "./attestation": "./src/attestation/sign.mjs",
@@ -48,7 +50,7 @@
48
50
  "contract": "node src/check-atelier-export-contract.mjs",
49
51
  "dry-run": "node src/validate-atelier-export-dry-run.mjs fixtures/atelier-export/sample-studio-offer.v1.json",
50
52
  "test": "node --test test/*.test.mjs",
51
- "syntax:check": "find bin src -name '*.mjs' -print0 | xargs -0 -n1 node --check",
53
+ "syntax:check": "node scripts/check-syntax.mjs",
52
54
  "graph:test": "node --test test/graph.test.mjs test/graph-knowledge-graph.test.mjs test/graph-determinism.test.mjs test/graph-source-formats.test.mjs",
53
55
  "project:test": "node --test test/project.test.mjs test/project-config.test.mjs test/projection-policy.test.mjs test/projection-alignment.test.mjs",
54
56
  "server:security:test": "node --test test/server.test.mjs test/server-security.test.mjs test/server-proposals.test.mjs",
@@ -57,19 +59,24 @@
57
59
  "egress:check": "node bin/atelier.mjs egress check",
58
60
  "readiness:test": "node --test test/readiness.test.mjs test/readiness-summary.test.mjs test/readiness-protocol-contract.test.mjs test/readiness-protocols.test.mjs test/readiness-protocol-runtime.test.mjs",
59
61
  "harness:test": "node --test test/harness.test.mjs test/harness-context.test.mjs",
60
- "boundary:test": "node --test test/boundary-policy-contract.test.mjs test/boundary-guard.test.mjs",
62
+ "collaboration:test": "node --test test/collaboration-ledger.test.mjs test/server-proposals.test.mjs",
63
+ "boundary:test": "node --test test/boundary-policy-contract.test.mjs test/boundary-content-rules.test.mjs test/boundary-guard.test.mjs",
61
64
  "upgrade:test": "node --test test/upgrade-contract.test.mjs test/upgrade.test.mjs",
62
65
  "release:audit": "node scripts/check-release-tarball.mjs",
66
+ "release:candidate": "node scripts/release-candidate.mjs",
63
67
  "repo:check": "node scripts/check-repo-disclosure.mjs",
64
68
  "migrations:check": "node scripts/check-breaking-migrations.mjs",
65
69
  "contract:compat": "node scripts/check-contract-compat.mjs",
70
+ "public-api:compat": "node scripts/check-public-api-compat.mjs",
71
+ "assurance:mutation-smoke": "node --test test/assurance-mutations.test.mjs",
66
72
  "consumer:smoke": "node scripts/consumer-smoke.mjs",
67
73
  "distribution:smoke": "node scripts/distribution-smoke.mjs",
68
- "prepublishOnly": "npm run release:audit && npm run repo:check && npm run migrations:check && npm run contract:compat && npm run syntax:check && npm test && npm run consumer:smoke && npm run distribution:smoke"
74
+ "prepublishOnly": "npm run repo:check && npm run migrations:check && npm run contract:compat && npm run public-api:compat && npm run syntax:check && npm test && npm run assurance:mutation-smoke && npm run release:candidate"
69
75
  },
70
76
  "dependencies": {
71
77
  "ajv": "8.20.0",
72
- "ajv-formats": "3.0.1"
78
+ "ajv-formats": "3.0.1",
79
+ "fast-uri": "3.1.5"
73
80
  },
74
81
  "devDependencies": {
75
82
  "@types/node": "^22.0.0"
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: atelier-local-service
3
+ description: Build or repair a durable loopback-only authoring, review, or preview service in an Atelier-backed repository when local state must survive agent commands and fail safely.
4
+ ---
5
+
6
+ # Atelier local service
7
+
8
+ Use this skill for a consumer-owned service that persists repository-backed
9
+ local state. Do not use it to change `atelier dev` itself or to install an
10
+ operating-system service without explicit authorization.
11
+
12
+ Read `docs/local-services.md` from the installed Atelier package or source
13
+ checkout before changing lifecycle code.
14
+
15
+ ## Boundary first
16
+
17
+ Separate the portable mechanism from the consumer adapter before editing:
18
+
19
+ - Atelier invariants: loopback binding, proven ownership, exact stop, ignored
20
+ mode-0600 state, atomic writes, recoverable browser failure, and tests.
21
+ - Consumer details: service identity, port, commands, paths, schema, content,
22
+ and user-facing language.
23
+
24
+ Never promote consumer names, content, structures, examples, or local paths
25
+ into Atelier. Public tests use invented fixtures.
26
+
27
+ ## Workflow
28
+
29
+ 1. Inspect the existing server, process owner, port, persistence file,
30
+ `.gitignore`, health route, save handler, and tests. Preserve the live draft
31
+ before restarting anything.
32
+ 2. Expose repository-owned `start`, `status`, and `stop` commands. Start may
33
+ detach only because the user needs continuity beyond the launching command.
34
+ 3. Bind to loopback. Pair a random runtime identifier with the PID in both the
35
+ private runtime record and health response. Refuse unowned listeners.
36
+ 4. Keep drafts, runtime metadata, and operational logs ignored and owner-only.
37
+ Do not commit live authoring state.
38
+ 5. Make the UI retain the draft when the service disappears. Show the exact
39
+ restart command, snapshot export, and Retry path instead of a generic error.
40
+ 6. Serialize writes without permanently rejecting the queue after one failed
41
+ operation. Keep conflicts and invalid state fail-closed.
42
+ 7. Prove lifecycle ownership, server-loss recovery, later-save recovery,
43
+ permissions, ignore coverage, and fresh-checkout discoverability.
44
+
45
+ Do not claim durability from a passing request alone. Report separately:
46
+ saved file truth, managed-process truth, browser recovery truth, and the
47
+ remaining OS-restart boundary.
@@ -25,14 +25,15 @@ name (`atelier`) and use the port the harness returns. The equivalent manual
25
25
  command is:
26
26
 
27
27
  ```
28
- ./node_modules/.bin/atelier server
28
+ ./node_modules/.bin/atelier dev
29
29
  ```
30
30
 
31
- Use the local binary path. Do **not** run `npx atelier` — this package is not
32
- yet published to npm, and the unscoped name `atelier` belongs to an unrelated
33
- third-party package that `npx` would download and execute.
31
+ Use the local binary path. Do **not** run unscoped `npx atelier`: the unscoped
32
+ name belongs to an unrelated third-party package that `npx` would download and
33
+ execute. From outside an installed workspace, install `@mnstry/atelier` first
34
+ and use the branded `npx mnstry-atelier` command.
34
35
 
35
- `atelier server` resolves its port as **argv > `PORT` env > 8137**, so a
36
+ `atelier dev` resolves its port as **argv > `PORT` env > 8137**, so a
36
37
  supervisor can hand it a free port without a config edit.
37
38
 
38
39
  ## Do not fight for the canonical port
@@ -0,0 +1,31 @@
1
+ ---
2
+ name: atelier-public-boundary
3
+ description: Generalize a lesson from a private or tenant implementation into the public Atelier repository without carrying proprietary material across the trust boundary.
4
+ ---
5
+
6
+ # Atelier public boundary
7
+
8
+ Use this skill whenever a public Atelier change is informed by work in a
9
+ private, client, tenant, or internal repository.
10
+
11
+ ## Extract the invariant, not the source
12
+
13
+ 1. State the reusable failure mode or contract without client vocabulary.
14
+ 2. Identify every source-specific name, path, port, field, content structure,
15
+ example, and operational fact. Keep those in the source repository.
16
+ 3. Re-derive the public mechanism against an invented fixture. Neutral wording
17
+ is not enough if the fixture still reproduces a proprietary structure.
18
+ 4. Keep private disclosure patterns in the ignored denylist or CI secret. Do
19
+ not place them in code, tests, docs, branch names, or commit messages.
20
+ 5. Add a regression test for the general control and run an evidence-backed
21
+ defensive review when a guard changes.
22
+
23
+ ## Required gates
24
+
25
+ Before staging, run the repository's disclosure check. After staging, scan the
26
+ staged index with the private denylist, then inspect the exact diff and release
27
+ tarball. A structural-only pass is useful on an untrusted fork but is not a
28
+ complete maintainer verdict.
29
+
30
+ If the private denylist is unavailable, stop short of claiming the public
31
+ boundary is green. Do not replace it with remembered client names.
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: atelier-local-service
3
+ description: Build or repair a durable loopback-only authoring, review, or preview service in an Atelier-backed repository when local state must survive agent commands and fail safely.
4
+ ---
5
+
6
+ # Atelier local service
7
+
8
+ Use this skill for a consumer-owned service that persists repository-backed
9
+ local state. Do not use it to change `atelier dev` itself or to install an
10
+ operating-system service without explicit authorization.
11
+
12
+ Read `docs/local-services.md` from the installed Atelier package or source
13
+ checkout before changing lifecycle code.
14
+
15
+ ## Boundary first
16
+
17
+ Separate the portable mechanism from the consumer adapter before editing:
18
+
19
+ - Atelier invariants: loopback binding, proven ownership, exact stop, ignored
20
+ mode-0600 state, atomic writes, recoverable browser failure, and tests.
21
+ - Consumer details: service identity, port, commands, paths, schema, content,
22
+ and user-facing language.
23
+
24
+ Never promote consumer names, content, structures, examples, or local paths
25
+ into Atelier. Public tests use invented fixtures.
26
+
27
+ ## Workflow
28
+
29
+ 1. Inspect the existing server, process owner, port, persistence file,
30
+ `.gitignore`, health route, save handler, and tests. Preserve the live draft
31
+ before restarting anything.
32
+ 2. Expose repository-owned `start`, `status`, and `stop` commands. Start may
33
+ detach only because the user needs continuity beyond the launching command.
34
+ 3. Bind to loopback. Pair a random runtime identifier with the PID in both the
35
+ private runtime record and health response. Refuse unowned listeners.
36
+ 4. Keep drafts, runtime metadata, and operational logs ignored and owner-only.
37
+ Do not commit live authoring state.
38
+ 5. Make the UI retain the draft when the service disappears. Show the exact
39
+ restart command, snapshot export, and Retry path instead of a generic error.
40
+ 6. Serialize writes without permanently rejecting the queue after one failed
41
+ operation. Keep conflicts and invalid state fail-closed.
42
+ 7. Prove lifecycle ownership, server-loss recovery, later-save recovery,
43
+ permissions, ignore coverage, and fresh-checkout discoverability.
44
+
45
+ Do not claim durability from a passing request alone. Report separately:
46
+ saved file truth, managed-process truth, browser recovery truth, and the
47
+ remaining OS-restart boundary.
@@ -25,14 +25,15 @@ name (`atelier`) and use the port the harness returns. The equivalent manual
25
25
  command is:
26
26
 
27
27
  ```
28
- ./node_modules/.bin/atelier server
28
+ ./node_modules/.bin/atelier dev
29
29
  ```
30
30
 
31
- Use the local binary path. Do **not** run `npx atelier` — this package is not
32
- yet published to npm, and the unscoped name `atelier` belongs to an unrelated
33
- third-party package that `npx` would download and execute.
31
+ Use the local binary path. Do **not** run unscoped `npx atelier`: the unscoped
32
+ name belongs to an unrelated third-party package that `npx` would download and
33
+ execute. From outside an installed workspace, install `@mnstry/atelier` first
34
+ and use the branded `npx mnstry-atelier` command.
34
35
 
35
- `atelier server` resolves its port as **argv > `PORT` env > 8137**, so a
36
+ `atelier dev` resolves its port as **argv > `PORT` env > 8137**, so a
36
37
  supervisor can hand it a free port without a config edit.
37
38
 
38
39
  ## Do not fight for the canonical port
@@ -0,0 +1,31 @@
1
+ ---
2
+ name: atelier-public-boundary
3
+ description: Generalize a lesson from a private or tenant implementation into the public Atelier repository without carrying proprietary material across the trust boundary.
4
+ ---
5
+
6
+ # Atelier public boundary
7
+
8
+ Use this skill whenever a public Atelier change is informed by work in a
9
+ private, client, tenant, or internal repository.
10
+
11
+ ## Extract the invariant, not the source
12
+
13
+ 1. State the reusable failure mode or contract without client vocabulary.
14
+ 2. Identify every source-specific name, path, port, field, content structure,
15
+ example, and operational fact. Keep those in the source repository.
16
+ 3. Re-derive the public mechanism against an invented fixture. Neutral wording
17
+ is not enough if the fixture still reproduces a proprietary structure.
18
+ 4. Keep private disclosure patterns in the ignored denylist or CI secret. Do
19
+ not place them in code, tests, docs, branch names, or commit messages.
20
+ 5. Add a regression test for the general control and run an evidence-backed
21
+ defensive review when a guard changes.
22
+
23
+ ## Required gates
24
+
25
+ Before staging, run the repository's disclosure check. After staging, scan the
26
+ staged index with the private denylist, then inspect the exact diff and release
27
+ tarball. A structural-only pass is useful on an untrusted fork but is not a
28
+ complete maintainer verdict.
29
+
30
+ If the private denylist is unavailable, stop short of claiming the public
31
+ boundary is green. Do not replace it with remembered client names.