@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.
- package/CHANGELOG.md +86 -0
- package/README.md +280 -230
- package/contracts/public-api-baseline.json +57 -0
- package/docs/assurance-controls.md +39 -0
- package/docs/atelier-runtime.md +15 -0
- package/docs/blocks/claims.md +15 -9
- package/docs/design.md +12 -6
- package/docs/install.md +26 -4
- package/docs/knowledge-graph.md +8 -4
- package/docs/local-services.md +101 -0
- package/docs/release-engineering.md +75 -10
- package/docs/repo-boundary-guard.md +12 -2
- package/docs/upgrade.md +34 -2
- package/fixtures/projects/sample-workspace/content/source.html.kg.json +4 -1
- package/fixtures/projects/source-formats-workspace/content/data.json.kg.json +4 -1
- package/fixtures/projects/source-formats-workspace/content/logo.png.kg.json +4 -1
- package/fixtures/projects/source-formats-workspace/content/metrics.csv.kg.json +4 -1
- package/fixtures/projects/source-formats-workspace/content/pipeline.yaml.kg.json +4 -1
- package/package.json +13 -6
- package/skills/claude/atelier-local-service/SKILL.md +47 -0
- package/skills/claude/atelier-open/SKILL.md +6 -5
- package/skills/claude/atelier-public-boundary/SKILL.md +31 -0
- package/skills/codex/atelier-local-service/SKILL.md +47 -0
- package/skills/codex/atelier-open/SKILL.md +6 -5
- package/skills/codex/atelier-public-boundary/SKILL.md +31 -0
- package/src/boundary/content-rules.mjs +278 -20
- package/src/boundary/policy.mjs +150 -60
- package/src/cli/execute-command.mjs +36 -0
- package/src/cli/run.mjs +17 -7
- package/src/collaboration/event-ledger.mjs +365 -0
- package/src/collaboration/index.mjs +17 -0
- package/src/collaboration/proposals.mjs +265 -65
- package/src/commands/attestation.mjs +20 -6
- package/src/commands/disclosure.mjs +133 -0
- package/src/commands/distribution.mjs +2 -1
- package/src/commands/extension-pack.mjs +2 -1
- package/src/commands/init.mjs +2 -1
- package/src/commands/server.mjs +1 -4
- package/src/disclosure/content-scan.mjs +193 -0
- package/src/egress/check.mjs +7 -38
- package/src/egress/forbidden-egress.mjs +32 -18
- package/src/graph/graph.mjs +112 -314
- package/src/graph/knowledge-graph.mjs +94 -18
- package/src/harness/context-client.mjs +9 -1
- package/src/index.mjs +12 -0
- package/src/project/config.mjs +66 -7
- package/src/project/file-class.mjs +14 -0
- package/src/project/package-root.mjs +10 -0
- package/src/project/path-match.mjs +38 -15
- package/src/project/private-state.mjs +110 -0
- package/src/server/local-sidecar.mjs +81 -59
- package/src/server/security.mjs +89 -4
- package/src/server/server.mjs +3 -2
- package/src/support/feedback-report.mjs +4 -3
- package/src/upgrade/upgrade.mjs +2 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
+
"version": "0.2.0-alpha.5",
|
|
4
4
|
"private": false,
|
|
5
|
-
"description": "Local
|
|
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": "
|
|
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
|
-
"
|
|
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
|
|
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
|
|
28
|
+
./node_modules/.bin/atelier dev
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
Use the local binary path. Do **not** run `npx atelier
|
|
32
|
-
|
|
33
|
-
|
|
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
|
|
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
|
|
28
|
+
./node_modules/.bin/atelier dev
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
Use the local binary path. Do **not** run `npx atelier
|
|
32
|
-
|
|
33
|
-
|
|
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
|
|
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.
|