@mnstry/atelier 0.2.0-alpha.1

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 (260) hide show
  1. package/CHANGELOG.md +383 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +5 -0
  4. package/README.md +262 -0
  5. package/SECURITY.md +93 -0
  6. package/TRADEMARKS.md +88 -0
  7. package/announcements/2026-08-06-announcements-channel.v1.json +12 -0
  8. package/announcements/keys/mnstry-announcements.public.v1.json +9 -0
  9. package/bin/atelier.mjs +2 -0
  10. package/bin/mnstry-atelier.mjs +3 -0
  11. package/contracts/analysis-adapter.v1.schema.json +248 -0
  12. package/contracts/atelier-action-intent.v1.schema.json +143 -0
  13. package/contracts/atelier-analysis-adapter.v1.schema.json +360 -0
  14. package/contracts/atelier-attestation.v1.schema.json +239 -0
  15. package/contracts/atelier-boundary-policy.v1.schema.json +339 -0
  16. package/contracts/atelier-claim.v1.schema.json +97 -0
  17. package/contracts/atelier-export.v1.schema.json +1015 -0
  18. package/contracts/atelier-extension-pack.v1.schema.json +290 -0
  19. package/contracts/atelier-kit-manifest.v1.schema.json +273 -0
  20. package/contracts/atelier-lock.v1.schema.json +364 -0
  21. package/contracts/atelier-migration.v1.schema.json +162 -0
  22. package/contracts/atelier-project-config.v1.schema.json +352 -0
  23. package/contracts/atelier-readiness-protocol.v1.schema.json +517 -0
  24. package/contracts/atelier-readiness-run.v1.schema.json +229 -0
  25. package/contracts/atelier-readiness.v1.schema.json +457 -0
  26. package/contracts/compat-baseline.json +10 -0
  27. package/contracts/git-promote-event.v1.schema.json +145 -0
  28. package/contracts/knowledge-source-sidecar.v1.schema.json +157 -0
  29. package/contracts/mnstry-atelier-semantic-profile.v1.json +254 -0
  30. package/docs/announcements.md +101 -0
  31. package/docs/atelier-runtime.md +34 -0
  32. package/docs/attestation.md +201 -0
  33. package/docs/continuity.md +55 -0
  34. package/docs/contract-stability.md +111 -0
  35. package/docs/distributions.md +220 -0
  36. package/docs/install.md +140 -0
  37. package/docs/knowledge-graph.md +140 -0
  38. package/docs/ontology.md +206 -0
  39. package/docs/release-engineering.md +151 -0
  40. package/docs/repo-boundary-guard.md +199 -0
  41. package/docs/tenant-readiness.md +64 -0
  42. package/docs/upgrade.md +124 -0
  43. package/fixtures/analysis/invalid/native-graph.v1.json +4 -0
  44. package/fixtures/analysis/invalid/promoted-claim.v1.json +17 -0
  45. package/fixtures/analysis/invalid/runtime-import.v1.json +20 -0
  46. package/fixtures/analysis/valid/output.claims.v1.json +17 -0
  47. package/fixtures/analysis-adapter/invalid/manifest-hidden-provider.v1.json +24 -0
  48. package/fixtures/analysis-adapter/invalid/output-frontmatter-mutation.v1.json +21 -0
  49. package/fixtures/analysis-adapter/invalid/output-native-graph.v1.json +14 -0
  50. package/fixtures/analysis-adapter/manifest.disabled.v1.json +22 -0
  51. package/fixtures/analysis-adapter/manifest.enabled-local.v1.json +23 -0
  52. package/fixtures/analysis-adapter/output.claims.v1.json +21 -0
  53. package/fixtures/atelier-action-intent/invalid/runtime-mutation-authority.v1.json +16 -0
  54. package/fixtures/atelier-action-intent/invalid/unknown-top-level-field.v1.json +17 -0
  55. package/fixtures/atelier-action-intent/invalid/writes-beyond-clipboard.v1.json +16 -0
  56. package/fixtures/atelier-action-intent/valid/copy-agent-prompt.v1.json +16 -0
  57. package/fixtures/atelier-action-intent/valid/copy-repo-path.v1.json +22 -0
  58. package/fixtures/atelier-analysis-adapter/invalid/hidden-model-provider.v1.json +24 -0
  59. package/fixtures/atelier-analysis-adapter/invalid/inert-with-execute-command.v1.json +24 -0
  60. package/fixtures/atelier-analysis-adapter/invalid/proposals-with-runtime-import.v1.json +30 -0
  61. package/fixtures/atelier-analysis-adapter/valid/manifest-inert.v1.json +24 -0
  62. package/fixtures/atelier-analysis-adapter/valid/proposals-claim-only.v1.json +27 -0
  63. package/fixtures/atelier-attestation/invalid/bad-digest.v1.json +23 -0
  64. package/fixtures/atelier-attestation/invalid/conformance-scope.v1.json +23 -0
  65. package/fixtures/atelier-attestation/invalid/missing-signature.v1.json +22 -0
  66. package/fixtures/atelier-attestation/invalid/unknown-root-field.v1.json +24 -0
  67. package/fixtures/atelier-attestation/keys/roundtrip-issuer.public.v1.json +9 -0
  68. package/fixtures/atelier-attestation/valid/rejected-with-reasons.v1.json +49 -0
  69. package/fixtures/atelier-attestation/valid/signed-admitted.v1.json +35 -0
  70. package/fixtures/atelier-attestation/valid/signed-roundtrip.v1.json +29 -0
  71. package/fixtures/atelier-attestation/valid/unsigned-advisory.v1.json +23 -0
  72. package/fixtures/atelier-claim/invalid/unknown-provider.v1.json +15 -0
  73. package/fixtures/atelier-claim/invalid/unknown-top-level-field.v1.json +16 -0
  74. package/fixtures/atelier-claim/invalid/wrong-schema-const.v1.json +15 -0
  75. package/fixtures/atelier-claim/valid/adapter-style-proposed-relation.v1.json +19 -0
  76. package/fixtures/atelier-claim/valid/codex-proposed-relation.v1.json +16 -0
  77. package/fixtures/atelier-claim/valid/manual-proposed-relation.v1.json +16 -0
  78. package/fixtures/atelier-claim/valid/readiness-proposed-relation.v1.json +18 -0
  79. package/fixtures/atelier-export/invalid/dirty-unforced-empty-taint.v1.json +19 -0
  80. package/fixtures/atelier-export/invalid/object-local-audience-visibility.v1.json +11 -0
  81. package/fixtures/atelier-export/invalid/open-object-class-owner.v1.json +23 -0
  82. package/fixtures/atelier-export/invalid/pricing-legacy-amount.v1.json +23 -0
  83. package/fixtures/atelier-export/invalid/public-disguised-internal-source-ref.v1.json +11 -0
  84. package/fixtures/atelier-export/invalid/public-nested-private-source-ref.v1.json +17 -0
  85. package/fixtures/atelier-export/invalid/public-resolved-private-source-ref.v1.json +13 -0
  86. package/fixtures/atelier-export/invalid/public-resolved-sensitive-source-ref.v1.json +13 -0
  87. package/fixtures/atelier-export/invalid/public-source-ref-missing-provenance.v1.json +20 -0
  88. package/fixtures/atelier-export/invalid/public-source-team-kg.json +12 -0
  89. package/fixtures/atelier-export/invalid/source-node-legacy-visibility.v1.json +21 -0
  90. package/fixtures/atelier-export/invalid/source-node-unknown-field.v1.json +18 -0
  91. package/fixtures/atelier-export/invalid/unresolved-public-source-ref.v1.json +11 -0
  92. package/fixtures/atelier-export/sample-studio-offer.v1.json +397 -0
  93. package/fixtures/atelier-extension-pack/invalid/bundled-slug-collision.v1.json +22 -0
  94. package/fixtures/atelier-extension-pack/invalid/escapes-root.v1.json +22 -0
  95. package/fixtures/atelier-extension-pack/invalid/posture-tampered.v1.json +22 -0
  96. package/fixtures/atelier-extension-pack/invalid/protocols/autonomous-authority.v1.json +118 -0
  97. package/fixtures/atelier-extension-pack/invalid/protocols/offer-map.v1.json +109 -0
  98. package/fixtures/atelier-extension-pack/invalid/redefines-runtime-term.v1.json +19 -0
  99. package/fixtures/atelier-extension-pack/invalid/wrong-namespace.v1.json +19 -0
  100. package/fixtures/atelier-extension-pack/valid/protocols/contract-gate.v1.json +109 -0
  101. package/fixtures/atelier-extension-pack/valid/sample-pack.v1.json +48 -0
  102. package/fixtures/atelier-kit-manifest/invalid/runtime-copy-without-canonical-role.v1.json +53 -0
  103. package/fixtures/atelier-kit-manifest/invalid/telemetry-send-path.v1.json +21 -0
  104. package/fixtures/atelier-kit-manifest/valid/mnstry-atelier.valid.v1.json +76 -0
  105. package/fixtures/atelier-lock/invalid/absolute-contract-path.v1.json +40 -0
  106. package/fixtures/atelier-lock/invalid/runtime-mutation-enabled.v1.json +41 -0
  107. package/fixtures/atelier-lock/invalid/unknown-top-level-field.v1.json +42 -0
  108. package/fixtures/atelier-lock/valid/extension-pack.v1.json +55 -0
  109. package/fixtures/atelier-lock/valid/minimal.v1.json +44 -0
  110. package/fixtures/atelier-migration/invalid/live-apply-mode.v1.json +21 -0
  111. package/fixtures/atelier-migration/invalid/missing-review-evidence.v1.json +20 -0
  112. package/fixtures/atelier-migration/invalid/runtime-mutation-enabled.v1.json +21 -0
  113. package/fixtures/atelier-migration/valid/minimal.v1.json +32 -0
  114. package/fixtures/atelier-project-config/invalid/absolute-repo-path.v1.json +11 -0
  115. package/fixtures/atelier-project-config/invalid/ext-not-object.v1.json +12 -0
  116. package/fixtures/atelier-project-config/invalid/external-kind-read-boundary.v1.json +12 -0
  117. package/fixtures/atelier-project-config/invalid/missing-repos-and-alignment.v1.json +7 -0
  118. package/fixtures/atelier-project-config/invalid/unknown-top-level-field.v1.json +14 -0
  119. package/fixtures/atelier-project-config/valid/alignment-scaffold.v1.json +15 -0
  120. package/fixtures/atelier-project-config/valid/ext-extension-packs.v1.json +36 -0
  121. package/fixtures/atelier-project-config/valid/repo-workspace.v1.json +23 -0
  122. package/fixtures/atelier-project-config/validator-only/ext-member-not-object.v1.json +14 -0
  123. package/fixtures/atelier-readiness/invalid/dry-run-only-false.v1.json +87 -0
  124. package/fixtures/atelier-readiness/invalid/support-bundle-send-path.v1.json +87 -0
  125. package/fixtures/atelier-readiness/invalid/unknown-top-level-field.v1.json +88 -0
  126. package/fixtures/atelier-readiness/valid/ready-workspace.v1.json +84 -0
  127. package/fixtures/boundary-policy/invalid/content-rule-exception-blanket-path.v1.json +67 -0
  128. package/fixtures/boundary-policy/invalid/invalid-actor-private-repo-mapping.v1.json +20 -0
  129. package/fixtures/boundary-policy/invalid/legacy-warning-missing-warning.v1.json +20 -0
  130. package/fixtures/boundary-policy/invalid/missing-repo-coverage.v1.json +19 -0
  131. package/fixtures/boundary-policy/invalid/unknown-key.v1.json +12 -0
  132. package/fixtures/boundary-policy/valid/content-rule-exception.v1.json +67 -0
  133. package/fixtures/boundary-policy/valid/legacy-warning.v1.json +33 -0
  134. package/fixtures/boundary-policy/valid/strict-private-shared.v1.json +40 -0
  135. package/fixtures/git-promote/invalid/provision-named-revocable.v1.json +29 -0
  136. package/fixtures/git-promote/private-to-team.v1.json +29 -0
  137. package/fixtures/knowledge-source-sidecar/invalid/legacy-visibility-field.v1.json +17 -0
  138. package/fixtures/knowledge-source-sidecar/invalid/missing-audience.v1.json +15 -0
  139. package/fixtures/knowledge-source-sidecar/invalid/unknown-relation-kind.v1.json +18 -0
  140. package/fixtures/knowledge-source-sidecar/valid/html-source.v1.json +18 -0
  141. package/fixtures/knowledge-source-sidecar/valid/pdf-evidence.v1.json +18 -0
  142. package/fixtures/projects/neutral-project/atelier.project.json +15 -0
  143. package/fixtures/projects/neutral-project/ops/config/repo-access.v1.json +12 -0
  144. package/fixtures/projects/neutral-project/project-knowledge.graph.json +69 -0
  145. package/fixtures/projects/sample-workspace/atelier.project.json +23 -0
  146. package/fixtures/projects/sample-workspace/boundary-policy.v1.json +59 -0
  147. package/fixtures/projects/sample-workspace/content/README.md +16 -0
  148. package/fixtures/projects/sample-workspace/content/source.html +5 -0
  149. package/fixtures/projects/sample-workspace/content/source.html.kg.json +15 -0
  150. package/fixtures/projects/sample-workspace/repo-access.v1.json +9 -0
  151. package/fixtures/projects/source-formats-workspace/atelier.project.json +23 -0
  152. package/fixtures/projects/source-formats-workspace/content/README.md +17 -0
  153. package/fixtures/projects/source-formats-workspace/content/data.json +7 -0
  154. package/fixtures/projects/source-formats-workspace/content/data.json.kg.json +15 -0
  155. package/fixtures/projects/source-formats-workspace/content/logo.png.kg.json +15 -0
  156. package/fixtures/projects/source-formats-workspace/content/metrics.csv +3 -0
  157. package/fixtures/projects/source-formats-workspace/content/metrics.csv.kg.json +15 -0
  158. package/fixtures/projects/source-formats-workspace/content/pipeline.yaml +4 -0
  159. package/fixtures/projects/source-formats-workspace/content/pipeline.yaml.kg.json +15 -0
  160. package/fixtures/projects/source-formats-workspace/repo-access.v1.json +9 -0
  161. package/fixtures/readiness-protocols/extension-pack/invalid/protocol-missing-path.v1.json +20 -0
  162. package/fixtures/readiness-protocols/extension-pack/valid/with-protocol.v1.json +24 -0
  163. package/fixtures/readiness-protocols/protocol/invalid/missing-check-target.v1.json +103 -0
  164. package/fixtures/readiness-protocols/protocol/invalid/runtime-mutation-enabled.v1.json +107 -0
  165. package/fixtures/readiness-protocols/protocol/valid/minimal.v1.json +100 -0
  166. package/fixtures/readiness-protocols/run/invalid/missing-evidence.v1.json +37 -0
  167. package/fixtures/readiness-protocols/run/invalid/pass-with-blocker.v1.json +22 -0
  168. package/fixtures/readiness-protocols/run/invalid/runtime-mutation-enabled.v1.json +22 -0
  169. package/fixtures/readiness-protocols/run/valid/pass.v1.json +44 -0
  170. package/fixtures/support/invalid/leaky-support.v1.json +13 -0
  171. package/fixtures/support/valid/minimal-safe.v1.json +20 -0
  172. package/package.json +98 -0
  173. package/skills/claude/atelier-open/SKILL.md +68 -0
  174. package/skills/claude/mnstry-readiness/SKILL.md +41 -0
  175. package/skills/codex/atelier-open/SKILL.md +68 -0
  176. package/skills/codex/mnstry-readiness/SKILL.md +41 -0
  177. package/src/analysis/adapter.mjs +20 -0
  178. package/src/analysis/analysis-claim-contract.mjs +335 -0
  179. package/src/attestation/jcs.mjs +64 -0
  180. package/src/attestation/sign.mjs +305 -0
  181. package/src/boundary/content-rules.mjs +262 -0
  182. package/src/boundary/policy.mjs +806 -0
  183. package/src/check-atelier-export-contract.mjs +116 -0
  184. package/src/cli/run.mjs +283 -0
  185. package/src/collaboration/proposals.mjs +262 -0
  186. package/src/commands/analysis.mjs +8 -0
  187. package/src/commands/announcements.mjs +308 -0
  188. package/src/commands/attestation.mjs +198 -0
  189. package/src/commands/boundary.mjs +25 -0
  190. package/src/commands/config.mjs +4 -0
  191. package/src/commands/context.mjs +3 -0
  192. package/src/commands/distribution.mjs +224 -0
  193. package/src/commands/egress.mjs +11 -0
  194. package/src/commands/extension-pack.mjs +209 -0
  195. package/src/commands/feedback.mjs +3 -0
  196. package/src/commands/graph.mjs +3 -0
  197. package/src/commands/init.mjs +130 -0
  198. package/src/commands/lock.mjs +3 -0
  199. package/src/commands/project.mjs +3 -0
  200. package/src/commands/promote.mjs +4 -0
  201. package/src/commands/readiness.mjs +3 -0
  202. package/src/commands/server.mjs +6 -0
  203. package/src/commands/setup.mjs +250 -0
  204. package/src/commands/support.mjs +3 -0
  205. package/src/commands/upgrade.mjs +3 -0
  206. package/src/contracts/corpus.mjs +171 -0
  207. package/src/egress/check.mjs +45 -0
  208. package/src/egress/forbidden-egress.mjs +323 -0
  209. package/src/export/atelier-export-contract.mjs +722 -0
  210. package/src/extension-packs/loader.mjs +491 -0
  211. package/src/graph/graph.mjs +370 -0
  212. package/src/graph/knowledge-graph.mjs +887 -0
  213. package/src/harness/context-client.mjs +144 -0
  214. package/src/harness/context.mjs +27 -0
  215. package/src/index.mjs +88 -0
  216. package/src/project/config.mjs +557 -0
  217. package/src/project/file-class.mjs +113 -0
  218. package/src/project/git-ignore.mjs +31 -0
  219. package/src/project/path-match.mjs +30 -0
  220. package/src/project/repo-identity.mjs +176 -0
  221. package/src/projection/alignment-projection.mjs +169 -0
  222. package/src/projection/policy.mjs +90 -0
  223. package/src/projection/project.mjs +152 -0
  224. package/src/readiness/readiness.mjs +312 -0
  225. package/src/readiness-protocols/bundled-pack.mjs +766 -0
  226. package/src/readiness-protocols/runtime.mjs +419 -0
  227. package/src/server/local-sidecar.mjs +640 -0
  228. package/src/server/security.mjs +229 -0
  229. package/src/server/server.mjs +42 -0
  230. package/src/support/feedback-report.mjs +414 -0
  231. package/src/support/support-bundle.mjs +226 -0
  232. package/src/ui/html-primitives.mjs +104 -0
  233. package/src/upgrade/upgrade.mjs +701 -0
  234. package/src/validate-atelier-export-dry-run.mjs +75 -0
  235. package/templates/atelier.project.example.json +23 -0
  236. package/templates/distribution-workspace/.claude/launch.json +12 -0
  237. package/templates/distribution-workspace/README.md +86 -0
  238. package/templates/distribution-workspace/atelier.project.json +36 -0
  239. package/templates/distribution-workspace/boundary-policy.v1.json +61 -0
  240. package/templates/distribution-workspace/gitignore +29 -0
  241. package/templates/distribution-workspace/governance/repo-boundary-ledger.md +5 -0
  242. package/templates/distribution-workspace/project/README.md +19 -0
  243. package/templates/distribution-workspace/repo-access.v1.json +9 -0
  244. package/templates/launch.json +12 -0
  245. package/templates/private-domain-workspace/.claude/launch.json +12 -0
  246. package/templates/private-domain-workspace/README.md +50 -0
  247. package/templates/private-domain-workspace/atelier.project.json +28 -0
  248. package/templates/private-domain-workspace/boundary-policy.v1.json +54 -0
  249. package/templates/private-domain-workspace/domain/README.md +19 -0
  250. package/templates/private-domain-workspace/gitignore +29 -0
  251. package/templates/private-domain-workspace/governance/repo-boundary-ledger.md +4 -0
  252. package/templates/private-domain-workspace/repo-access.v1.json +9 -0
  253. package/templates/shared-project-workspace/.claude/launch.json +12 -0
  254. package/templates/shared-project-workspace/README.md +51 -0
  255. package/templates/shared-project-workspace/atelier.project.json +28 -0
  256. package/templates/shared-project-workspace/boundary-policy.v1.json +61 -0
  257. package/templates/shared-project-workspace/gitignore +29 -0
  258. package/templates/shared-project-workspace/governance/repo-boundary-ledger.md +5 -0
  259. package/templates/shared-project-workspace/project/README.md +19 -0
  260. package/templates/shared-project-workspace/repo-access.v1.json +9 -0
package/README.md ADDED
@@ -0,0 +1,262 @@
1
+ # MNSTRY Atelier
2
+
3
+ A methodology that creates real transformation cannot scale through static
4
+ content, generic AI, or manual labor. The Atelier is a local-first toolkit for
5
+ authoring that body of work as structured documents machines can validate —
6
+ in plain files, on your machine, under your control.
7
+
8
+ It is built for methodology holders and the studios that serve them: you
9
+ author primitives, sources, and offers in your own repositories; the Atelier
10
+ builds a knowledge graph over them, projects a local review surface, checks
11
+ readiness against published protocols, and validates exports against public
12
+ contracts. The MNSTRY runtime remains the authority for identity, consent,
13
+ visibility, provisioning, bookings, commerce, sessions, audit, and
14
+ client-grade sharing — using it is optional, and everything here works
15
+ without it.
16
+
17
+ ## Status
18
+
19
+ - Version: `0.2.0-alpha.1`
20
+ - Stability: alpha — contracts are under a compatibility gate from the
21
+ `v0.2.0-alpha.0` epoch tag onward; everything else may still move
22
+ - Runtime: Node.js `>=22.18.0 <23`
23
+ - Dependencies: ajv, ajv-formats (JSON Schema validation); nothing else at
24
+ runtime
25
+ - Distribution: `@mnstry/atelier@0.2.0-alpha.1` on npm, published from the
26
+ `v0.2.0-alpha.1` tag. The older `v0.2.0-alpha.0` tag is the contract
27
+ epoch marker, not an install target — it predates the current tree.
28
+ - Telemetry: none. Network egress: none, with one documented exception —
29
+ see "Nothing leaves your machine" below.
30
+
31
+ ## Claims you can check
32
+
33
+ This package makes three promises. None of them asks for your trust — each
34
+ one names the command that proves it.
35
+
36
+ **Nothing leaves your machine, with one exception you can see.** There is no
37
+ telemetry, no update check, no crash reporting, and no send path anywhere in
38
+ the package. The exception: when no actor is configured, `boundary check` and
39
+ `doctor` fall back to the `gh` CLI to resolve your GitHub login, which is an
40
+ authenticated request to GitHub made with your own credentials. Set
41
+ `MNSTRY_ATELIER_ACTOR` and that path is never taken. The only network client
42
+ refuses non-loopback URLs, the served pages carry a policy that authorizes no
43
+ external origin, and a fail-closed gate scans the executable and markup files
44
+ under `src/`, `bin/`, `scripts/`, and `examples/` for egress primitives. Two
45
+ limits worth stating plainly: the gate does not read the `.json` and `.md`
46
+ files under `templates/` and `skills/`, and it does not model
47
+ `child_process`, which is why the `gh` fallback above does not trip it:
48
+
49
+ ```bash
50
+ npm run egress:check
51
+ ```
52
+
53
+ **Compatibility is checked by machinery, not memory.** Documents valid
54
+ against the `v0.2.0-alpha.0` contracts stay valid: every change is checked
55
+ against the baseline tag's validators, and schema widening outside `ext`
56
+ containers is refused by a schema-vs-schema differ. Breaking changes require
57
+ a new contract version and a recorded migration. Known limit: the differ
58
+ compares schemas structurally and does not resolve `$ref` pointers, so a
59
+ `$ref` retargeted at a looser definition is not caught by this gate — the
60
+ fixture tests catch that for contracts with negative fixtures, and closing
61
+ the gap in the differ is tracked work:
62
+
63
+ ```bash
64
+ npm run contract:compat
65
+ ```
66
+
67
+ **Conformance works offline, forever.** Validating a document against the
68
+ published contracts needs this package and nothing else — no account, no
69
+ service, no network:
70
+
71
+ ```bash
72
+ atelier dry-run ./atelier-export.json
73
+ ```
74
+
75
+ `docs/continuity.md` records the distribution commitments behind these
76
+ claims, including the perpetual Apache-2.0 grant on every tagged release you
77
+ receive.
78
+
79
+ ## Quickstart
80
+
81
+ ```bash
82
+ npm install --save-dev @mnstry/atelier@0.2.0-alpha.1
83
+
84
+ npx atelier init --fixture=sample-workspace --target ./sample
85
+ npx atelier graph --project ./sample/atelier.project.json
86
+ npx atelier project --project ./sample/atelier.project.json
87
+ npx atelier readiness --project ./sample/atelier.project.json
88
+ MNSTRY_ATELIER_ACTOR=owner npx atelier boundary check --project ./sample/atelier.project.json
89
+ npx atelier dev --project ./sample/atelier.project.json
90
+ ```
91
+
92
+ `npx` here runs the binary already installed in `./node_modules/.bin`. Always
93
+ install first, and keep the `@mnstry/` scope — the unscoped name `atelier`
94
+ belongs to an unrelated third-party package.
95
+
96
+ `init` scaffolds a fictional sample workspace, `graph` builds the knowledge
97
+ graph from front matter and sidecars, `project` generates the local review
98
+ surface, `dev` serves it on loopback only. From there:
99
+
100
+ ```js
101
+ import { validateAtelierExportDryRun } from '@mnstry/atelier'
102
+
103
+ const report = validateAtelierExportDryRun(exportDocument)
104
+ console.log(report.accepted, report.importable, report.errors)
105
+ ```
106
+
107
+ Real projects start from the `private-domain`, `shared-project`, or
108
+ `distribution` templates instead of the sample fixture.
109
+
110
+ ## What this package does
111
+
112
+ - Initializes neutral local Atelier projects.
113
+ - Builds a front-matter and sidecar-led knowledge graph; a `.kg.json` sidecar
114
+ enrolls any file — Markdown, JSON, YAML, CSV, media — without the kit ever
115
+ parsing the foreign format.
116
+ - Generates and serves a local GUI projection over a loopback-only sidecar.
117
+ - Produces agent-harness context and capability envelopes, and ships neutral
118
+ Codex and Claude skill wrappers for readiness review work.
119
+ - Records proposal metadata without browser apply/write endpoints.
120
+ - Enforces the local source `audience` and runtime `visibility` boundary, and
121
+ rejects unresolved, disguised, or non-public-projectable source references.
122
+ - Enforces Repo Boundary Guard V1 for private domain and shared project
123
+ repos: strict policies fail closed when private or sensitive source is
124
+ placed in a shared repo, when protected local files are staged, or when
125
+ private-domain material appears in shared work without a `git.promote`
126
+ disclosure record.
127
+ - Validates `atelier-export@v1` JSON against the published schema and
128
+ produces deterministic dry-run reports with `accepted`, `importable`, and
129
+ `worstOperationStatus`.
130
+ - Ships the bundled `mnstry-readiness-pack@v1` with twelve claim-first
131
+ readiness protocols, extensible through validated extension packs.
132
+ - Writes and checks `atelier.lock.json`, and applies branch-based,
133
+ review-first upgrades that refuse dirty repos and never silently overwrite
134
+ authored content.
135
+ - Checks first-party source, templates, and examples for forbidden
136
+ non-localhost egress — a fail-closed discipline gate over this repo's own
137
+ code, not a runtime sandbox.
138
+
139
+ ## What this package does not do
140
+
141
+ - It does not write to a MNSTRY runtime database.
142
+ - It does not import, provision, publish, or send anything.
143
+ - It does not contact external services.
144
+ - It does not execute model-assisted analysis or any model provider.
145
+ - It does not include client project content.
146
+
147
+ These limits are the design. An authoring tool for private material earns
148
+ trust by what it refuses to be able to do.
149
+
150
+ ## Your documents and the boundary
151
+
152
+ What you author is yours. Documents live in your repositories, in formats you
153
+ chose, readable without this tool. The one vocabulary the contracts enforce:
154
+ `audience` describes local source readership (`public`, `team`, `operator`,
155
+ `staff`, `private`, `sensitive`); runtime/export `visibility` describes
156
+ runtime exposure and accepts only `private`, `shared`, `platform`, or
157
+ `public`. A public export referencing a source whose audience is not public
158
+ is refused — that check is fixture-pinned and mutation-tested.
159
+
160
+ ## Build a branded distribution
161
+
162
+ The Atelier is designed to be white-labeled. A distribution wraps the CLI
163
+ under its own name, contributes a validated extension pack (branded
164
+ protocols, terms, templates), and themes the projection — while the root
165
+ contracts, guards, and conformance stay canonical underneath. Start by
166
+ copying the worked example:
167
+
168
+ - `examples/loomworks-studio` — a complete fictional distribution: branded
169
+ bin, extension pack, themed workspace template.
170
+ - `docs/distributions.md` — the contract a distribution must honor.
171
+ - `TRADEMARKS.md` — naming rules; Apache-2.0 grants code rights, not brand
172
+ rights. Every distribution carries "powered by MNSTRY Atelier" attribution,
173
+ checked by `atelier distribution check`.
174
+
175
+ ## The MNSTRY relationship
176
+
177
+ The Atelier is the front porch, not the house. Conformance — is this document
178
+ valid against the published contracts? — is public, offline, and free,
179
+ forever. Admission — will MNSTRY's governed runtime accept it for delivery to
180
+ clients? — is a separate, opt-in step: a signed attestation issued by MNSTRY
181
+ against criteria this package publishes (`docs/attestation.md`). You can
182
+ build on the Atelier without ever talking to MNSTRY. If you want your work to
183
+ run on MNSTRY runtimes, the path is admission, and the rejection message is
184
+ part of the contract.
185
+
186
+ ## Feedback and announcements
187
+
188
+ Both channels respect consent by construction. `atelier feedback` writes a
189
+ scanned, redaction-checked report to a local file — there is no send path;
190
+ you choose whether and where to share it. `announcements list` verifies
191
+ project-shipped announcements against a committed public key — pull-only,
192
+ nothing phones home to ask.
193
+
194
+ ## Running the test suite from a fresh clone
195
+
196
+ `npm test` includes one fail-closed check that expects a private denylist
197
+ file (`release-denylist.local.json`, gitignored) used by MNSTRY's release
198
+ lane. On a fresh clone that file is absent, so the check **fails** — it never
199
+ passes silently on missing protection. Expect this, after `npm install`:
200
+
201
+ ```bash
202
+ npm install
203
+ npm test # 509 tests: 508 pass, 1 fail — the denylist check, by design
204
+ ```
205
+
206
+ To acknowledge the missing file and run the rest, which turns that failure
207
+ into a recorded skip:
208
+
209
+ ```bash
210
+ ATELIER_ALLOW_MISSING_DENYLIST=1 npm test # 508 pass, 0 fail, 1 skipped
211
+ ```
212
+
213
+ ## Command reference
214
+
215
+ ```bash
216
+ atelier dry-run ./atelier-export.json
217
+ atelier contract check
218
+ atelier graph --project ./atelier.project.json
219
+ atelier project --project ./atelier.project.json
220
+ atelier readiness --project ./atelier.project.json
221
+ atelier readiness protocols
222
+ atelier readiness journey --project ./atelier.project.json
223
+ atelier readiness run mnstry.readiness:identity-map --project ./atelier.project.json
224
+ atelier readiness packet --project ./atelier.project.json
225
+ atelier readiness export --dry-run --project ./atelier.project.json
226
+ atelier boundary check --project ./atelier.project.json
227
+ atelier boundary check --staged --project ./atelier.project.json
228
+ atelier boundary install-hooks --project ./atelier.project.json
229
+ atelier promote --source-repo tenant-private-domain --target-repo project-alpha --kg-id tenant-private-domain:seed
230
+ atelier lock write --project ./atelier.project.json
231
+ atelier lock check --project ./atelier.project.json
232
+ atelier upgrade --dry-run --project ./atelier.project.json
233
+ atelier upgrade --apply --project ./atelier.project.json --branch codex/atelier-upgrade-YYYYMMDD
234
+ atelier extension-pack validate --project ./atelier.project.json
235
+ atelier attestation verify ./attestation.json
236
+ atelier feedback create --message "what happened"
237
+ atelier announcements list
238
+ atelier distribution check --target ./my-distribution
239
+ atelier dev --project ./atelier.project.json
240
+ ```
241
+
242
+ `upgrade --apply` creates or switches to the requested branch, refuses dirty
243
+ authored repos, preserves unrelated user hooks through composed hook files,
244
+ runs only registered migrations, refreshes generated projections, and leaves
245
+ a Git commit for review. It will not weaken boundary policy, introduce
246
+ telemetry, enable non-localhost egress, run model-assisted analysis, or write/import/apply
247
+ runtime state.
248
+
249
+ ## Sample fixtures
250
+
251
+ Fixtures in this package are fictional and generic. Project-specific adapter
252
+ fixtures belong in their project repositories, not in the published Atelier
253
+ package.
254
+
255
+ ## License and contributing
256
+
257
+ Apache-2.0. See `LICENSE`, `NOTICE` (attribution obligations that survive
258
+ forks), `TRADEMARKS.md` (naming), and `docs/continuity.md` (distribution
259
+ continuity commitments). Contributions are accepted under inbound-equals-
260
+ outbound Apache-2.0 with a DCO sign-off — `CONTRIBUTING.md` is the working
261
+ agreement, including how to contribute without exposing client material or
262
+ your own private methodology.
package/SECURITY.md ADDED
@@ -0,0 +1,93 @@
1
+ # Security policy
2
+
3
+ The Atelier is an authoring tool for private material. Its guarantees are
4
+ enforcement claims, not aspirations — so a way around a guarantee is a
5
+ vulnerability here even when nothing crashes and no data is lost.
6
+
7
+ ## Reporting a vulnerability
8
+
9
+ **Use GitHub private vulnerability reporting**:
10
+ <https://github.com/MNSTRY/atelier/security/advisories/new>. That channel is
11
+ private, gives you a tracked advisory, and lets a fix and a disclosure be
12
+ prepared together.
13
+
14
+ If that is unavailable to you, email **erik@mnstry.ai** with `atelier security`
15
+ in the subject line.
16
+
17
+ Do not open a public issue for a vulnerability, and do not include client
18
+ material, private methodology, or key material in a report. A report needs the
19
+ mechanism, not your real data — if you cannot demonstrate the finding without
20
+ sensitive content, say so and describe the shape instead.
21
+
22
+ ### What to expect
23
+
24
+ Maintenance is small and deliberate, so these are honest targets rather than
25
+ guarantees:
26
+
27
+ - Acknowledgement within 3 business days.
28
+ - An initial assessment — accepted, needs more information, or out of scope,
29
+ with reasoning — within 10 business days.
30
+ - Fixes released as a new tagged version. Where a fix changes a published
31
+ contract, it follows the same compatibility rules as any other change:
32
+ a new contract version and a recorded migration.
33
+ - Credit in the advisory and changelog under the name you choose, or no
34
+ credit if you prefer. You will be asked before being named.
35
+
36
+ Coordinated disclosure is the expectation. Give a fix a reasonable window
37
+ before publishing; you keep the right to publish, and there is no embargo
38
+ you have to sign.
39
+
40
+ ## In scope
41
+
42
+ These are the claims the package makes. Defeating any of them is a
43
+ vulnerability, and the more quietly it can be defeated, the more severe:
44
+
45
+ - **Egress.** Any network send path in first-party code, or any way to make
46
+ the local sidecar reachable off loopback or serve a policy that authorizes
47
+ an external origin.
48
+ - **Boundary guard.** Any way to get private or sensitive source into a
49
+ shared repo, to stage a protected local file, or to promote private-domain
50
+ material without the required disclosure record — while the guard reports
51
+ clean.
52
+ - **Disclosure scanners.** Any way to get denylisted or structurally
53
+ forbidden content past `repo:check` or `release:audit`, including through
54
+ encoding, line splitting, file types the scanner skips, or symlinks.
55
+ - **Audience and visibility.** Any export accepted as `public` that
56
+ references a source whose audience is not public.
57
+ - **Attestation.** Signature or verification flaws in `attestation verify`,
58
+ or announcement verification accepting content the published key did not
59
+ sign.
60
+ - **Upgrade.** Any path where `upgrade --apply` overwrites authored content,
61
+ weakens boundary policy, or runs an unregistered migration.
62
+ - **Contract compatibility.** Any way to widen a schema outside `ext`
63
+ containers without the compatibility gate refusing it.
64
+
65
+ Supply-chain reports about this repository's own release and CI machinery are
66
+ in scope: workflow injection, secret exposure to untrusted code, or a way to
67
+ make a released tarball differ from the reviewed tag.
68
+
69
+ ## Out of scope
70
+
71
+ - **The sidecar is loopback-only and unauthenticated by design.** Someone who
72
+ already has a local account and can reach loopback is inside the trust
73
+ boundary. A way to reach it from off-host is in scope; using it from on-host
74
+ is not.
75
+ - **Local file access.** The Atelier reads and writes files you point it at,
76
+ with your own permissions. That is the design.
77
+ - **Vulnerabilities in your own authored content** or in extension packs and
78
+ distributions maintained outside this repository.
79
+ - **Dependency advisories with no reachable path** through this package.
80
+ Report them anyway if you are unsure — but a bare scanner dump against
81
+ `ajv` with no exploitation path is not a finding.
82
+ - **Missing hardening with no demonstrated impact.** Show the mechanism.
83
+
84
+ ## Supported versions
85
+
86
+ The package is alpha. Only the latest tagged release receives fixes; there
87
+ are no backports to earlier tags. Published contracts carry a separate and
88
+ stronger promise — `docs/contract-stability.md` and `docs/continuity.md`
89
+ record it — and that promise is not weakened by a security fix.
90
+
91
+ ## Received advisories
92
+
93
+ None to date.
package/TRADEMARKS.md ADDED
@@ -0,0 +1,88 @@
1
+ # MNSTRY trademarks
2
+
3
+ The names MNSTRY and MNSTRY Atelier, and the associated logos, are trademarks
4
+ of MNSTRY. The Apache-2.0 license for this package (see LICENSE section 6, "Trademarks")
5
+ grants no trademark rights: you may use, modify, and redistribute the code
6
+ without any right to use these marks except as described in this document.
7
+
8
+ ## What this document binds
9
+
10
+ These terms are conditions on using the MNSTRY marks and on claiming
11
+ Distribution status. They are not conditions on the code. Apache-2.0 governs
12
+ copying, modification, and redistribution, section 4 states those conditions
13
+ in full, and this document adds none: you may redistribute this package,
14
+ modified or not, without displaying the attribution string, so long as you
15
+ make no use of the MNSTRY marks and claim no Distribution status. Everything
16
+ below is the price of carrying the marks, not the price of using the
17
+ software — including the attribution that `atelier distribution check`
18
+ verifies, which checks distributions that have chosen to carry the marks.
19
+
20
+ ## Required attribution
21
+
22
+ Distributions built on this package must display the exact attribution string
23
+
24
+ powered by MNSTRY Atelier
25
+
26
+ in two places:
27
+
28
+ - the distribution's root `README.md` (byte-for-byte match on the phrase;
29
+ the surrounding text is free), and
30
+ - the distribution's user-facing credits or about surface.
31
+
32
+ The README requirement is normative and mechanically checked by
33
+ `atelier distribution check`. As an advisory (reported, non-blocking) signal,
34
+ a distribution's extension-pack manifest may also carry
35
+ `ext["mnstry.atelier/attribution"]` set to the same attribution string, using
36
+ the reserved `ext` container — no schema change is involved. Attribution in
37
+ `--version` output is a distribution-side test convention, not a runtime
38
+ check.
39
+
40
+ ## Quiet software
41
+
42
+ The kit, and anything carrying the "powered by MNSTRY Atelier" attribution, must not
43
+ emit commercially motivated interruptions: no upsells, no calls-to-action, no
44
+ prompts to sign up, upgrade, rate, subscribe, or purchase. Attribution stays a
45
+ passive line — it identifies, it never solicits. MNSTRY binds itself to the
46
+ same standard, including this channel policy: outbound communication is
47
+ limited to user-initiated artifacts, inbound communication is pull-only, and
48
+ there is no telemetry, ever. Violating this clause forfeits the right to carry
49
+ the MNSTRY marks.
50
+
51
+ ## Applications
52
+
53
+ An application powered by this package that ships no CLI carries the
54
+ attribution in its user-facing credits or about surface. The wording
55
+ requirements mirror the distribution rule above: the exact attribution string,
56
+ byte for byte, with the surrounding text free.
57
+
58
+ ## Naming your distribution
59
+
60
+ MNSTRY marks may not appear in product names, package names, or domain names.
61
+ Nominative use is permitted in the form "<YourName> for MNSTRY Atelier", which
62
+ names the compatibility target without implying that MNSTRY publishes or
63
+ endorses your distribution.
64
+
65
+ ## Compatibility claims
66
+
67
+ The sanctioned phrasing for a compatibility claim is:
68
+
69
+ implements atelier contracts v1
70
+
71
+ Conformance is public and offline: anyone can run the published validators in
72
+ this package and reach the same answer (see `docs/attestation.md`). No
73
+ permission is needed to make a truthful compatibility claim in this form, and
74
+ no attestation can substitute for it.
75
+
76
+ ## Certification and admission
77
+
78
+ The phrases "MNSTRY certified" and "MNSTRY admitted" (and equivalents) are
79
+ reserved to holders of a signed MNSTRY attestation that verifies per the
80
+ procedure in `docs/attestation.md`. Self-issued or unsigned attestations
81
+ confer no such claim: an attestation with `"signature": null` is
82
+ non-authoritative by definition, and a signature is only meaningful under a
83
+ key the relying party recognizes as MNSTRY's.
84
+
85
+ ## Questions
86
+
87
+ For trademark questions or permission requests beyond what this document
88
+ covers, contact MNSTRY through the channels listed in the package README.
@@ -0,0 +1,12 @@
1
+ {
2
+ "schema": "mnstry.announcement@v1",
3
+ "announcementId": "announcement:2026-08-06:announcements-channel",
4
+ "publishedAt": "2026-08-06",
5
+ "title": "Signed announcements channel",
6
+ "body": "MNSTRY now publishes announcements as signed JSON documents committed\nunder `announcements/` in this repository. This is a pull-only channel:\nyou receive announcements by running `git pull`, and pulling is the\nconsent act. There is no push channel, no subscription, and no tracking —\nthe kit never fetches announcements or anything else over a network.\n\nEvery announcement is signed with the MNSTRY announcements key. The\npublic half is committed at\n`announcements/keys/mnstry-announcements.public.v1.json`; verify any\nannouncement with:\n\n atelier announcements verify announcements/<file>.json\n\nor list and verify everything at once with\n`atelier announcements list`. A document that does not verify should be\ntreated as not from MNSTRY. See docs/announcements.md for the full\nconvention.",
7
+ "signature": {
8
+ "algorithm": "ed25519",
9
+ "keyId": "mnstry-announcements-2026",
10
+ "value": "iiSYs00uJMhFEb6VSovZohv4zNrdEt3tBv4sqjs7v6XMN7EpxJnzHdBwb8jBGZ5zWp3SZEKsA76VYbarWfvBBA"
11
+ }
12
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "keyId": "mnstry-announcements-2026",
3
+ "algorithm": "ed25519",
4
+ "publicKeyJwk": {
5
+ "crv": "Ed25519",
6
+ "x": "vU_2IhY0vdnvMl9i4pI3N3s77ZReYc3tAujldyG_6Ng",
7
+ "kty": "OKP"
8
+ }
9
+ }
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import './mnstry-atelier.mjs'
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from '../src/cli/run.mjs'
3
+ process.exit(await runCli({ argv: process.argv.slice(2) }))