@mnstry/atelier 0.2.0-alpha.11 → 0.2.0-alpha.13

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 (560) hide show
  1. package/CHANGELOG.md +1005 -0
  2. package/README.md +149 -9
  3. package/contracts/atelier-adoption-policy.v2.schema.json +55 -0
  4. package/contracts/atelier-architecture.v1.schema.json +258 -0
  5. package/contracts/atelier-boundary-delegations.v1.schema.json +161 -0
  6. package/contracts/atelier-boundary-owner-keys.v1.schema.json +98 -0
  7. package/contracts/atelier-build.v1.schema.json +1076 -0
  8. package/contracts/atelier-capability.v1.schema.json +1252 -0
  9. package/contracts/atelier-coordination.v1.schema.json +1050 -0
  10. package/contracts/atelier-evidence-navigation.v1.schema.json +603 -0
  11. package/contracts/atelier-harness.v1.schema.json +234 -0
  12. package/contracts/atelier-ingestion.v1.schema.json +806 -0
  13. package/contracts/atelier-inquiry.v1.schema.json +1772 -0
  14. package/contracts/atelier-instruction-adoption.v1.schema.json +490 -0
  15. package/contracts/atelier-interaction.v1.schema.json +553 -0
  16. package/contracts/atelier-judgment.v1.schema.json +690 -0
  17. package/contracts/atelier-knowledge.v1.schema.json +1512 -0
  18. package/contracts/atelier-learning.v1.schema.json +1095 -0
  19. package/contracts/atelier-migration.v3.schema.json +64 -0
  20. package/contracts/atelier-obsidian-generation-manifest.v2.schema.json +372 -0
  21. package/contracts/atelier-personal-workspace-manifest.v1.schema.json +87 -0
  22. package/contracts/atelier-personal-workspace-overlay.v1.schema.json +299 -0
  23. package/contracts/atelier-template-adoption.v1.schema.json +223 -0
  24. package/contracts/atelier-template-profile.v1.schema.json +1168 -0
  25. package/contracts/atelier-trackable.v1.schema.json +781 -0
  26. package/contracts/atelier-upgrade-plan.v3.schema.json +532 -0
  27. package/contracts/compat-baseline.json +1 -1
  28. package/docs/architecture.md +89 -0
  29. package/docs/assurance-controls.md +4 -3
  30. package/docs/blocks/capability-stewardship.md +17 -0
  31. package/docs/blocks/claims.md +16 -3
  32. package/docs/blocks/inquiry-harnesses.md +19 -0
  33. package/docs/blocks/learning-harnesses.md +17 -0
  34. package/docs/capability-stewardship.md +269 -0
  35. package/docs/coordination.md +51 -0
  36. package/docs/decision-practices.md +111 -0
  37. package/docs/decisions.md +29 -0
  38. package/docs/evidence-navigation.md +237 -0
  39. package/docs/exact-upgrades.md +3 -2
  40. package/docs/ingestion.md +181 -0
  41. package/docs/inquiry-harnesses.md +211 -0
  42. package/docs/install.md +80 -3
  43. package/docs/intake-and-guides.md +5 -0
  44. package/docs/integration-contract-decisions.md +24 -2
  45. package/docs/interaction-and-reflection.md +72 -0
  46. package/docs/knowledge-graph.md +20 -0
  47. package/docs/knowledge-health/api.md +30 -0
  48. package/docs/knowledge-health/assessment/api.md +96 -0
  49. package/docs/knowledge-health/assessment/capabilities.md +40 -0
  50. package/docs/knowledge-health/assessment/evaluation.md +27 -0
  51. package/docs/knowledge-health/assessment/facilitator.md +30 -0
  52. package/docs/knowledge-health/assessment/quickstart.md +61 -0
  53. package/docs/knowledge-health/assessment/troubleshooting.md +23 -0
  54. package/docs/knowledge-health/devday/facilitator.md +16 -0
  55. package/docs/knowledge-health/devday/participant-response.md +22 -0
  56. package/docs/knowledge-health/devday/public-default.md +107 -0
  57. package/docs/knowledge-health/devday/quickstart.md +18 -0
  58. package/docs/knowledge-health/devday/support.md +22 -0
  59. package/docs/knowledge-health/exercise.md +17 -0
  60. package/docs/knowledge-health/facilitator.md +20 -0
  61. package/docs/knowledge-health/quickstart.md +94 -0
  62. package/docs/knowledge-health/readme.md +15 -0
  63. package/docs/knowledge-health/support.md +34 -0
  64. package/docs/knowledge-setup.md +248 -0
  65. package/docs/knowledge-workspace.md +264 -0
  66. package/docs/learning-harnesses.md +238 -0
  67. package/docs/learning.md +215 -0
  68. package/docs/local-services.md +242 -26
  69. package/docs/obsidian-contract.md +878 -36
  70. package/docs/obsidian-plugin.md +619 -0
  71. package/docs/obsidian.md +809 -64
  72. package/docs/optional-ingestion.md +83 -0
  73. package/docs/personal-workspace.md +257 -0
  74. package/docs/practical-judgment.md +92 -0
  75. package/docs/progressive-ingestion-acceptance.md +89 -0
  76. package/docs/progressive-ingestion.md +235 -0
  77. package/docs/project-command-inventory.md +1 -0
  78. package/docs/release-engineering.md +56 -1
  79. package/docs/repo-boundary-guard.md +94 -0
  80. package/docs/research-starter-quickstart.md +66 -0
  81. package/docs/research-starter.md +114 -0
  82. package/docs/semantic-ingestion.md +198 -0
  83. package/docs/semantic-operation.md +317 -0
  84. package/docs/skill-steward.md +6 -0
  85. package/docs/template-profile.md +164 -0
  86. package/docs/template-upgrades.md +114 -0
  87. package/docs/trackables.md +111 -0
  88. package/docs/upgrade.md +68 -3
  89. package/fixtures/atelier-architecture/binding/invalid/document.json +19 -0
  90. package/fixtures/atelier-architecture/binding/valid/document.json +19 -0
  91. package/fixtures/atelier-architecture/catalog/invalid/document.json +290 -0
  92. package/fixtures/atelier-architecture/catalog/valid/document.json +343 -0
  93. package/fixtures/atelier-build-contract/attempt/invalid/document.json +20 -0
  94. package/fixtures/atelier-build-contract/attempt/valid/document.json +19 -0
  95. package/fixtures/atelier-build-contract/candidate/invalid/document.json +24 -0
  96. package/fixtures/atelier-build-contract/candidate/valid/document.json +23 -0
  97. package/fixtures/atelier-build-contract/decision/invalid/document.json +31 -0
  98. package/fixtures/atelier-build-contract/decision/valid/document.json +30 -0
  99. package/fixtures/atelier-build-contract/delivery/invalid/document.json +18 -0
  100. package/fixtures/atelier-build-contract/delivery/valid/document.json +17 -0
  101. package/fixtures/atelier-build-contract/gate/invalid/document.json +22 -0
  102. package/fixtures/atelier-build-contract/gate/valid/document.json +21 -0
  103. package/fixtures/atelier-build-contract/ledger/invalid/document.json +270 -0
  104. package/fixtures/atelier-build-contract/ledger/valid/document.json +269 -0
  105. package/fixtures/atelier-build-contract/objective/invalid/document.json +73 -0
  106. package/fixtures/atelier-build-contract/objective/valid/document.json +72 -0
  107. package/fixtures/atelier-build-contract/progress/invalid/document.json +18 -0
  108. package/fixtures/atelier-build-contract/progress/valid/document.json +17 -0
  109. package/fixtures/atelier-capability-contract/adoption/invalid/document.json +71 -0
  110. package/fixtures/atelier-capability-contract/adoption/valid/document.json +70 -0
  111. package/fixtures/atelier-capability-contract/event/invalid/document.json +18 -0
  112. package/fixtures/atelier-capability-contract/event/valid/document.json +17 -0
  113. package/fixtures/atelier-capability-contract/journal/invalid/document.json +382 -0
  114. package/fixtures/atelier-capability-contract/journal/valid/document.json +381 -0
  115. package/fixtures/atelier-capability-contract/notice/invalid/document.json +8 -0
  116. package/fixtures/atelier-capability-contract/notice/valid/document.json +7 -0
  117. package/fixtures/atelier-capability-contract/package/invalid/document.json +59 -0
  118. package/fixtures/atelier-capability-contract/package/valid/document.json +58 -0
  119. package/fixtures/atelier-capability-contract/plan/invalid/document.json +107 -0
  120. package/fixtures/atelier-capability-contract/plan/valid/document.json +106 -0
  121. package/fixtures/atelier-capability-contract/release/invalid/document.json +85 -0
  122. package/fixtures/atelier-capability-contract/release/valid/document.json +84 -0
  123. package/fixtures/atelier-capability-contract/state/invalid/document.json +316 -0
  124. package/fixtures/atelier-capability-contract/state/valid/document.json +315 -0
  125. package/fixtures/atelier-coordination/dependency/invalid/document.json +37 -0
  126. package/fixtures/atelier-coordination/dependency/valid/document.json +36 -0
  127. package/fixtures/atelier-coordination/directive/invalid/document.json +25 -0
  128. package/fixtures/atelier-coordination/directive/valid/document.json +24 -0
  129. package/fixtures/atelier-coordination/disposition/invalid/document.json +34 -0
  130. package/fixtures/atelier-coordination/disposition/valid/document.json +33 -0
  131. package/fixtures/atelier-coordination/outcome/invalid/document.json +39 -0
  132. package/fixtures/atelier-coordination/outcome/valid/document.json +38 -0
  133. package/fixtures/atelier-coordination/recovery/invalid/document.json +34 -0
  134. package/fixtures/atelier-coordination/recovery/valid/document.json +33 -0
  135. package/fixtures/atelier-harness-contract/handoff/invalid/document.json +25 -0
  136. package/fixtures/atelier-harness-contract/handoff/valid/document.json +24 -0
  137. package/fixtures/atelier-ingestion/invalid/authority.json +19 -0
  138. package/fixtures/atelier-ingestion/semantic-baseline.json +26 -0
  139. package/fixtures/atelier-ingestion/semantic-operation.json +75 -0
  140. package/fixtures/atelier-ingestion/valid/plan-input.json +18 -0
  141. package/fixtures/atelier-inquiry-contract/assessment/invalid/document.json +41 -0
  142. package/fixtures/atelier-inquiry-contract/assessment/valid/document.json +40 -0
  143. package/fixtures/atelier-inquiry-contract/bundle/invalid/document.json +51 -0
  144. package/fixtures/atelier-inquiry-contract/bundle/valid/document.json +50 -0
  145. package/fixtures/atelier-inquiry-contract/campaign/invalid/document.json +17 -0
  146. package/fixtures/atelier-inquiry-contract/campaign/valid/document.json +16 -0
  147. package/fixtures/atelier-inquiry-contract/decision/invalid/document.json +22 -0
  148. package/fixtures/atelier-inquiry-contract/decision/valid/document.json +21 -0
  149. package/fixtures/atelier-inquiry-contract/feedback/invalid/document.json +19 -0
  150. package/fixtures/atelier-inquiry-contract/feedback/valid/document.json +18 -0
  151. package/fixtures/atelier-inquiry-contract/handoff/invalid/document.json +92 -0
  152. package/fixtures/atelier-inquiry-contract/handoff/valid/document.json +91 -0
  153. package/fixtures/atelier-inquiry-contract/hypothesis/invalid/document.json +20 -0
  154. package/fixtures/atelier-inquiry-contract/hypothesis/valid/document.json +19 -0
  155. package/fixtures/atelier-inquiry-contract/ledger/invalid/document.json +680 -0
  156. package/fixtures/atelier-inquiry-contract/ledger/valid/document.json +679 -0
  157. package/fixtures/atelier-inquiry-contract/legacy-assessment/invalid/document.json +19 -0
  158. package/fixtures/atelier-inquiry-contract/legacy-assessment/valid/document.json +18 -0
  159. package/fixtures/atelier-inquiry-contract/request/invalid/document.json +50 -0
  160. package/fixtures/atelier-inquiry-contract/request/valid/document.json +49 -0
  161. package/fixtures/atelier-inquiry-contract/source/invalid/document.json +18 -0
  162. package/fixtures/atelier-inquiry-contract/source/valid/document.json +17 -0
  163. package/fixtures/atelier-inquiry-contract/withdrawal/invalid/document.json +16 -0
  164. package/fixtures/atelier-inquiry-contract/withdrawal/valid/document.json +15 -0
  165. package/fixtures/atelier-instruction-adoption/context-receipt/invalid/document.json +18 -0
  166. package/fixtures/atelier-instruction-adoption/context-receipt/valid/document.json +17 -0
  167. package/fixtures/atelier-instruction-adoption/plan/invalid/document.json +63 -0
  168. package/fixtures/atelier-instruction-adoption/plan/valid/document.json +62 -0
  169. package/fixtures/atelier-instruction-adoption/receipt/invalid/document.json +22 -0
  170. package/fixtures/atelier-instruction-adoption/receipt/valid/document.json +21 -0
  171. package/fixtures/atelier-instruction-adoption/state/invalid/document.json +30 -0
  172. package/fixtures/atelier-instruction-adoption/state/valid/document.json +29 -0
  173. package/fixtures/atelier-interaction/act/invalid/document.json +25 -0
  174. package/fixtures/atelier-interaction/act/valid/document.json +24 -0
  175. package/fixtures/atelier-interaction/assessment/invalid/document.json +32 -0
  176. package/fixtures/atelier-interaction/assessment/valid/document.json +31 -0
  177. package/fixtures/atelier-interaction/observation/invalid/document.json +22 -0
  178. package/fixtures/atelier-interaction/observation/valid/document.json +21 -0
  179. package/fixtures/atelier-interaction/policy/invalid/document.json +20 -0
  180. package/fixtures/atelier-interaction/policy/valid/document.json +19 -0
  181. package/fixtures/atelier-judgment/case/invalid/document.json +76 -0
  182. package/fixtures/atelier-judgment/case/valid/document.json +75 -0
  183. package/fixtures/atelier-judgment/decision/invalid/document.json +38 -0
  184. package/fixtures/atelier-judgment/decision/valid/document.json +37 -0
  185. package/fixtures/atelier-judgment/native-decision.md +3 -0
  186. package/fixtures/atelier-judgment/practice-reconsideration/definition.json +92 -0
  187. package/fixtures/atelier-judgment/practice-reconsideration/scenario.json +435 -0
  188. package/fixtures/atelier-knowledge-contract/activation/invalid/document.json +26 -0
  189. package/fixtures/atelier-knowledge-contract/activation/valid/document.json +25 -0
  190. package/fixtures/atelier-knowledge-contract/contribution/invalid/document.json +34 -0
  191. package/fixtures/atelier-knowledge-contract/contribution/valid/document.json +33 -0
  192. package/fixtures/atelier-knowledge-contract/domain/invalid/document.json +41 -0
  193. package/fixtures/atelier-knowledge-contract/domain/valid/document.json +40 -0
  194. package/fixtures/atelier-knowledge-contract/domain-revision/invalid/document.json +46 -0
  195. package/fixtures/atelier-knowledge-contract/domain-revision/valid/document.json +45 -0
  196. package/fixtures/atelier-knowledge-contract/evaluation/invalid/document.json +21 -0
  197. package/fixtures/atelier-knowledge-contract/evaluation/valid/document.json +20 -0
  198. package/fixtures/atelier-knowledge-contract/ledger/invalid/document.json +318 -0
  199. package/fixtures/atelier-knowledge-contract/ledger/valid/document.json +317 -0
  200. package/fixtures/atelier-knowledge-contract/relation/invalid/document.json +25 -0
  201. package/fixtures/atelier-knowledge-contract/relation/valid/document.json +24 -0
  202. package/fixtures/atelier-knowledge-contract/review/invalid/document.json +18 -0
  203. package/fixtures/atelier-knowledge-contract/review/valid/document.json +17 -0
  204. package/fixtures/atelier-knowledge-contract/withdrawal/invalid/document.json +16 -0
  205. package/fixtures/atelier-knowledge-contract/withdrawal/valid/document.json +15 -0
  206. package/fixtures/atelier-learning/invalid/authority.json +14 -0
  207. package/fixtures/atelier-learning/valid/capture.json +13 -0
  208. package/fixtures/atelier-personal-workspace-contract/manifest/invalid/authority-key.json +17 -0
  209. package/fixtures/atelier-personal-workspace-contract/manifest/invalid/nonempty-ext.json +25 -0
  210. package/fixtures/atelier-personal-workspace-contract/manifest/invalid/wrong-schema.json +22 -0
  211. package/fixtures/atelier-personal-workspace-contract/manifest/valid/manifest.json +22 -0
  212. package/fixtures/atelier-personal-workspace-contract/overlay/invalid/authority-key.json +25 -0
  213. package/fixtures/atelier-personal-workspace-contract/overlay/invalid/unknown-top-level-field.json +27 -0
  214. package/fixtures/atelier-personal-workspace-contract/overlay/invalid/wrong-schema.json +24 -0
  215. package/fixtures/atelier-trackable/definition/invalid/document.json +15 -0
  216. package/fixtures/atelier-trackable/definition/valid/document.json +14 -0
  217. package/fixtures/atelier-trackable/request/invalid/document.json +23 -0
  218. package/fixtures/atelier-trackable/request/valid/document.json +22 -0
  219. package/fixtures/boundary-delegations/invalid/authority-key.v1.json +30 -0
  220. package/fixtures/boundary-delegations/invalid/push-operation.v1.json +28 -0
  221. package/fixtures/boundary-delegations/invalid/unsigned.v1.json +25 -0
  222. package/fixtures/boundary-delegations/valid/empty.v1.json +4 -0
  223. package/fixtures/boundary-delegations/valid/signed-operator.v1.json +30 -0
  224. package/fixtures/boundary-owner-keys/invalid/wrong-algorithm.v1.json +15 -0
  225. package/fixtures/boundary-owner-keys/invalid/wrong-curve.v1.json +15 -0
  226. package/fixtures/boundary-owner-keys/valid/one-owner.v1.json +17 -0
  227. package/fixtures/capability-packages/adoption.example.json +70 -0
  228. package/fixtures/capability-packages/evidence-review/capability-package.json +58 -0
  229. package/fixtures/capability-packages/evidence-review/capability-release.json +84 -0
  230. package/fixtures/capability-packages/evidence-review/evaluation.md +15 -0
  231. package/fixtures/capability-packages/evidence-review/skills/evidence-review/SKILL.md +22 -0
  232. package/fixtures/capability-packages/evidence-review/skills/evidence-review/references/ledger.md +7 -0
  233. package/fixtures/capability-packages/research/capability-package.json +88 -0
  234. package/fixtures/capability-packages/research/capability-release.json +134 -0
  235. package/fixtures/capability-packages/research/evaluation.md +15 -0
  236. package/fixtures/capability-packages/research/skills/research-integrate/SKILL.md +29 -0
  237. package/fixtures/capability-packages/research/skills/research-integrate/references/integration.md +10 -0
  238. package/fixtures/capability-packages/research/skills/research-plan/SKILL.md +27 -0
  239. package/fixtures/capability-packages/research/skills/research-plan/references/inquiries.md +26 -0
  240. package/fixtures/capability-packages/research/skills/research-synthesize/SKILL.md +23 -0
  241. package/fixtures/capability-packages/research/skills/research-synthesize/references/synthesis.md +12 -0
  242. package/fixtures/evidence-navigation/invalid/duplicate-operation.json +16 -0
  243. package/fixtures/evidence-navigation/invalid/instruction-kind.json +36 -0
  244. package/fixtures/evidence-navigation/invalid/invalid-digest.json +36 -0
  245. package/fixtures/evidence-navigation/invalid/invalid-time.json +36 -0
  246. package/fixtures/evidence-navigation/invalid/missing-attribution.json +35 -0
  247. package/fixtures/evidence-navigation/invalid/reserved-extension.json +19 -0
  248. package/fixtures/evidence-navigation/invalid/unattributed-acceptance.json +36 -0
  249. package/fixtures/evidence-navigation/invalid/uncoerced-version.json +16 -0
  250. package/fixtures/evidence-navigation/invalid/unknown-currency.json +17 -0
  251. package/fixtures/evidence-navigation/invalid/unknown-selector-field.json +37 -0
  252. package/fixtures/evidence-navigation/invalid/unsupported-operation.json +15 -0
  253. package/fixtures/evidence-navigation/valid/claim.json +36 -0
  254. package/fixtures/evidence-navigation/valid/host.json +16 -0
  255. package/fixtures/evidence-navigation/valid/profile.json +16 -0
  256. package/fixtures/evidence-navigation/valid/snapshot.json +17 -0
  257. package/fixtures/harness-packages/build-harness/capability-package.json +61 -0
  258. package/fixtures/harness-packages/build-harness/capability-release.json +82 -0
  259. package/fixtures/harness-packages/build-harness/evaluation.md +3 -0
  260. package/fixtures/harness-packages/build-harness/skills/atelier-build-harness/SKILL.md +59 -0
  261. package/fixtures/harness-packages/knowledge-harness/capability-package.json +61 -0
  262. package/fixtures/harness-packages/knowledge-harness/capability-release.json +82 -0
  263. package/fixtures/harness-packages/knowledge-harness/evaluation.md +3 -0
  264. package/fixtures/harness-packages/knowledge-harness/skills/atelier-knowledge-harness/SKILL.md +60 -0
  265. package/fixtures/harnesses/learning-cycle.json +780 -0
  266. package/fixtures/inquiry/workshop.json +675 -0
  267. package/fixtures/inquiry-packages/discovery-harness/capability-package.json +61 -0
  268. package/fixtures/inquiry-packages/discovery-harness/capability-release.json +82 -0
  269. package/fixtures/inquiry-packages/discovery-harness/evaluation.md +3 -0
  270. package/fixtures/inquiry-packages/discovery-harness/skills/atelier-discovery-harness/SKILL.md +48 -0
  271. package/fixtures/inquiry-packages/research-harness/capability-package.json +61 -0
  272. package/fixtures/inquiry-packages/research-harness/capability-release.json +82 -0
  273. package/fixtures/inquiry-packages/research-harness/evaluation.md +3 -0
  274. package/fixtures/inquiry-packages/research-harness/skills/atelier-research-harness/SKILL.md +43 -0
  275. package/fixtures/knowledge-health/calibration-suite.json +26 -0
  276. package/fixtures/knowledge-health/calibration-trial.json +37 -0
  277. package/fixtures/knowledge-health/corrected/checklist.md +18 -0
  278. package/fixtures/knowledge-health/devday/participant-record.json +19 -0
  279. package/fixtures/knowledge-health/expected-summary.json +27 -0
  280. package/fixtures/knowledge-health/workshop/README.md +20 -0
  281. package/fixtures/knowledge-health/workshop/atelier.project.json +7 -0
  282. package/fixtures/knowledge-health/workshop/knowledge-plan.json +65 -0
  283. package/fixtures/knowledge-health/workshop/records/checklist.md +18 -0
  284. package/fixtures/knowledge-health/workshop/records/workshop.md +18 -0
  285. package/fixtures/knowledge-health/workshop/repo-access.v1.json +5 -0
  286. package/fixtures/knowledge-health/workspace/atelier.project.json +18 -0
  287. package/fixtures/knowledge-health/workspace/knowledge-plan.json +74 -0
  288. package/fixtures/knowledge-health/workspace/records/checklist.md +18 -0
  289. package/fixtures/knowledge-health/workspace/records/pilot.md +16 -0
  290. package/fixtures/knowledge-health/workspace/repo-access.v1.json +9 -0
  291. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/case-only-collision.v2.json +160 -0
  292. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/flat-note-path.v2.json +160 -0
  293. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/hidden-folder.v2.json +160 -0
  294. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/identity-in-the-body.v2.json +160 -0
  295. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/link-breaking-name.v2.json +160 -0
  296. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/missing-identity-region.v2.json +156 -0
  297. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/missing-layout-version.v2.json +159 -0
  298. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/note-named-like-a-folder.v2.json +160 -0
  299. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/unknown-region-kind.v2.json +160 -0
  300. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/v1-contract-version.v2.json +161 -0
  301. package/fixtures/obsidian/contracts/generation-manifest-v2/valid/three-notes.v2.json +160 -0
  302. package/fixtures/obsidian/edits/workspace.json +1 -1
  303. package/fixtures/obsidian/materialization/expected-full.json +21 -21
  304. package/fixtures/obsidian/materialization/expected-full.layout-1.json +99 -0
  305. package/fixtures/obsidian/materialization/expected-scoped.json +7 -7
  306. package/fixtures/obsidian/materialization/expected-scoped.layout-1.json +39 -0
  307. package/fixtures/personal-workspace/overlay.json +24 -0
  308. package/fixtures/templates/local-library.v1.json +75 -0
  309. package/fixtures/templates/upgrade-contracts/adoption-policy.v2/invalid.json +16 -0
  310. package/fixtures/templates/upgrade-contracts/adoption-policy.v2/valid.json +13 -0
  311. package/fixtures/templates/upgrade-contracts/migration.v3/invalid.json +24 -0
  312. package/fixtures/templates/upgrade-contracts/migration.v3/valid.json +21 -0
  313. package/fixtures/templates/upgrade-contracts/template-adoption.v1/invalid.json +60 -0
  314. package/fixtures/templates/upgrade-contracts/template-adoption.v1/valid.json +57 -0
  315. package/fixtures/templates/upgrade-contracts/upgrade-plan.v3/invalid.json +85 -0
  316. package/fixtures/templates/upgrade-contracts/upgrade-plan.v3/valid.json +82 -0
  317. package/package.json +64 -6
  318. package/plugins/obsidian/main.js +444 -0
  319. package/plugins/obsidian/manifest.json +9 -0
  320. package/plugins/obsidian/styles.css +22 -0
  321. package/skills/claude/atelier-build-harness/SKILL.md +59 -0
  322. package/skills/claude/atelier-coordination/SKILL.md +32 -0
  323. package/skills/claude/atelier-discovery-harness/SKILL.md +48 -0
  324. package/skills/claude/atelier-guided-upgrade/SKILL.md +29 -0
  325. package/skills/claude/atelier-interaction/SKILL.md +34 -0
  326. package/skills/claude/atelier-knowledge-harness/SKILL.md +60 -0
  327. package/skills/claude/atelier-knowledge-setup/SKILL.md +72 -0
  328. package/skills/claude/atelier-practical-judgment/SKILL.md +64 -0
  329. package/skills/claude/atelier-research-harness/SKILL.md +43 -0
  330. package/skills/claude/atelier-skill-steward/SKILL.md +53 -0
  331. package/skills/claude/atelier-trackables/SKILL.md +40 -0
  332. package/skills/codex/atelier-build-harness/SKILL.md +59 -0
  333. package/skills/codex/atelier-coordination/SKILL.md +32 -0
  334. package/skills/codex/atelier-discovery-harness/SKILL.md +48 -0
  335. package/skills/codex/atelier-guided-upgrade/SKILL.md +29 -0
  336. package/skills/codex/atelier-interaction/SKILL.md +34 -0
  337. package/skills/codex/atelier-knowledge-harness/SKILL.md +60 -0
  338. package/skills/codex/atelier-knowledge-setup/SKILL.md +72 -0
  339. package/skills/codex/atelier-practical-judgment/SKILL.md +64 -0
  340. package/skills/codex/atelier-research-harness/SKILL.md +43 -0
  341. package/skills/codex/atelier-skill-steward/SKILL.md +53 -0
  342. package/skills/codex/atelier-trackables/SKILL.md +40 -0
  343. package/src/architecture/catalog.mjs +355 -0
  344. package/src/architecture/index.mjs +93 -0
  345. package/src/boundary/content-rules.mjs +4 -2
  346. package/src/boundary/delegation-command.mjs +158 -0
  347. package/src/boundary/delegation.mjs +396 -0
  348. package/src/boundary/policy.mjs +52 -10
  349. package/src/build/git.mjs +18 -0
  350. package/src/build/index.mjs +3 -0
  351. package/src/build/ledger.mjs +88 -0
  352. package/src/capabilities/adoption.mjs +381 -0
  353. package/src/capabilities/evidence.mjs +140 -0
  354. package/src/capabilities/files.mjs +124 -0
  355. package/src/capabilities/index.mjs +4 -0
  356. package/src/capabilities/instructions.mjs +250 -0
  357. package/src/capabilities/package.mjs +136 -0
  358. package/src/cli/command-failure.mjs +36 -0
  359. package/src/cli/execute-command.mjs +16 -2
  360. package/src/cli/run.mjs +65 -9
  361. package/src/coauthor/store.mjs +43 -2
  362. package/src/collaboration/proposals.mjs +189 -0
  363. package/src/commands/architecture.mjs +27 -0
  364. package/src/commands/boundary.mjs +3 -0
  365. package/src/commands/capability.mjs +73 -0
  366. package/src/commands/enroll.mjs +3 -0
  367. package/src/commands/harness.mjs +79 -0
  368. package/src/commands/ingest.mjs +39 -0
  369. package/src/commands/init.mjs +4 -1
  370. package/src/commands/inquiry.mjs +66 -0
  371. package/src/commands/knowledge-semantic.mjs +128 -0
  372. package/src/commands/knowledge.mjs +119 -0
  373. package/src/commands/learn.mjs +61 -0
  374. package/src/commands/obsidian.mjs +832 -62
  375. package/src/commands/practice.mjs +24 -0
  376. package/src/commands/setup.mjs +22 -2
  377. package/src/commands/trackable.mjs +19 -0
  378. package/src/contracts/corpus.mjs +36 -0
  379. package/src/coordination/index.mjs +110 -0
  380. package/src/egress/forbidden-egress.mjs +2 -0
  381. package/src/evidence-navigation/contracts.mjs +60 -0
  382. package/src/evidence-navigation/evaluate.mjs +69 -0
  383. package/src/evidence-navigation/generation.mjs +22 -0
  384. package/src/evidence-navigation/index.mjs +2 -0
  385. package/src/evidence-navigation/local.mjs +167 -0
  386. package/src/evidence-navigation/schema.generated.mjs +604 -0
  387. package/src/evidence-navigation/types.mjs +12 -0
  388. package/src/export/atelier-export-contract.mjs +35 -8
  389. package/src/graph/enroll.mjs +248 -0
  390. package/src/graph/graph.mjs +17 -1
  391. package/src/graph/knowledge-graph.mjs +58 -8
  392. package/src/harnesses/contracts.mjs +41 -0
  393. package/src/harnesses/exchange.mjs +154 -0
  394. package/src/harnesses/feedback.mjs +16 -0
  395. package/src/harnesses/history.mjs +37 -0
  396. package/src/harnesses/index.mjs +4 -0
  397. package/src/harnesses/store.mjs +29 -0
  398. package/src/ingestion/contracts.mjs +41 -0
  399. package/src/ingestion/evaluation.mjs +119 -0
  400. package/src/ingestion/optional/composition/index.mjs +171 -0
  401. package/src/ingestion/optional/evaluation/index.mjs +219 -0
  402. package/src/ingestion/optional/graphify/composition-binding.mjs +60 -0
  403. package/src/ingestion/optional/graphify/composition_receiving.py +185 -0
  404. package/src/ingestion/optional/graphify/graphify_supplier.py +933 -0
  405. package/src/ingestion/optional/graphify/json_bridge.py +163 -0
  406. package/src/ingestion/optional/graphify/query_receiving.py +209 -0
  407. package/src/ingestion/optional/index.mjs +9 -0
  408. package/src/ingestion/optional/jev/bridge.mjs +166 -0
  409. package/src/ingestion/optional/jev/composition-binding.mjs +116 -0
  410. package/src/ingestion/optional/jev/judgments.mjs +174 -0
  411. package/src/ingestion/optional/jev/native-translation.mjs +32 -0
  412. package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/__init__.py +7 -0
  413. package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/adapter.py +966 -0
  414. package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/artifacts.py +101 -0
  415. package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/projection.py +146 -0
  416. package/src/ingestion/optional/lightrag/composition-binding.mjs +67 -0
  417. package/src/ingestion/optional/vanilla/composition-binding.mjs +102 -0
  418. package/src/ingestion/optional/vanilla/index.mjs +218 -0
  419. package/src/ingestion/optional/vanilla/native-normalization.mjs +187 -0
  420. package/src/ingestion/processors.mjs +218 -0
  421. package/src/ingestion/semantic.mjs +203 -0
  422. package/src/ingestion/store.mjs +372 -0
  423. package/src/inquiry/beliefs.mjs +32 -0
  424. package/src/inquiry/contracts.mjs +23 -0
  425. package/src/inquiry/index.mjs +5 -0
  426. package/src/inquiry/ledger.mjs +135 -0
  427. package/src/inquiry/lenses.mjs +15 -0
  428. package/src/inquiry/projection.mjs +77 -0
  429. package/src/inquiry/store.mjs +35 -0
  430. package/src/intake/read-scope.mjs +12 -0
  431. package/src/intake/store.mjs +69 -6
  432. package/src/interaction/index.mjs +91 -0
  433. package/src/judgment/index.mjs +82 -0
  434. package/src/judgment/practice-evaluation.mjs +70 -0
  435. package/src/judgment/practice.mjs +144 -0
  436. package/src/knowledge/context.mjs +217 -0
  437. package/src/knowledge/index.mjs +5 -0
  438. package/src/knowledge/ingestion.mjs +79 -0
  439. package/src/knowledge/intake.mjs +33 -0
  440. package/src/knowledge/ledger.mjs +110 -0
  441. package/src/knowledge/participatory/guidance.mjs +36 -0
  442. package/src/knowledge/participatory/guided-contribution.mjs +44 -0
  443. package/src/knowledge/participatory/index.mjs +2 -0
  444. package/src/knowledge/participatory/installed-workshop.mjs +108 -0
  445. package/src/knowledge/plan.mjs +67 -0
  446. package/src/knowledge/projection.mjs +43 -0
  447. package/src/knowledge/semantic-operation.mjs +567 -0
  448. package/src/knowledge/sessions.mjs +467 -0
  449. package/src/knowledge/workspace.mjs +295 -0
  450. package/src/knowledge-health/assessment.mjs +165 -0
  451. package/src/knowledge-health/capabilities.mjs +350 -0
  452. package/src/knowledge-health/context.mjs +62 -0
  453. package/src/knowledge-health/example.mjs +47 -0
  454. package/src/knowledge-health/index.mjs +10 -0
  455. package/src/knowledge-health/owner-join.mjs +88 -0
  456. package/src/knowledge-health/proof/common.mjs +24 -0
  457. package/src/knowledge-health/proof/installed-check.mjs +100 -0
  458. package/src/knowledge-health/proof/native-readback.mjs +37 -0
  459. package/src/knowledge-health/proof/rehearse.mjs +68 -0
  460. package/src/knowledge-health/proof/validate-participant.mjs +17 -0
  461. package/src/knowledge-health/proof/verify-native-capture.mjs +14 -0
  462. package/src/knowledge-health/proof/workshop-check.mjs +36 -0
  463. package/src/knowledge-health/rule-identity.mjs +44 -0
  464. package/src/knowledge-health/workshop-composition.mjs +19 -0
  465. package/src/knowledge-health/workshop-profile.mjs +176 -0
  466. package/src/knowledge-health/workshop.mjs +99 -0
  467. package/src/learning/adapters.mjs +68 -0
  468. package/src/learning/assistance.mjs +127 -0
  469. package/src/learning/contracts.mjs +65 -0
  470. package/src/learning/store.mjs +272 -0
  471. package/src/personal-workspace/index.mjs +391 -0
  472. package/src/personal-workspace/selection.mjs +385 -0
  473. package/src/project/config.mjs +8 -0
  474. package/src/project/durable-state.mjs +3 -1
  475. package/src/project/file-class.mjs +1 -1
  476. package/src/project/private-state.mjs +10 -1
  477. package/src/projection/obsidian/contracts.mjs +224 -18
  478. package/src/projection/obsidian/edits/apply.mjs +63 -19
  479. package/src/projection/obsidian/edits/regions.mjs +137 -42
  480. package/src/projection/obsidian/materialize/index.mjs +6 -3
  481. package/src/projection/obsidian/materialize/path-registry.mjs +443 -57
  482. package/src/projection/obsidian/materialize/prepare-view.mjs +382 -131
  483. package/src/projection/obsidian/materialize/redaction.mjs +327 -0
  484. package/src/projection/obsidian/materialize/settings.mjs +113 -34
  485. package/src/projection/obsidian/personal-workspace.mjs +436 -0
  486. package/src/projection/obsidian/plugin-bridge/bundle.mjs +50 -0
  487. package/src/projection/obsidian/plugin-bridge/channel.mjs +174 -0
  488. package/src/projection/obsidian/plugin-bridge/index.mjs +10 -0
  489. package/src/projection/obsidian/proposals/adapter.mjs +47 -8
  490. package/src/projection/obsidian/proposals/observation.mjs +20 -7
  491. package/src/projection/obsidian/publication/bridge-script.mjs +11 -5
  492. package/src/projection/obsidian/publication/index.mjs +2 -1
  493. package/src/projection/obsidian/publication/publisher.mjs +312 -36
  494. package/src/projection/obsidian/publication/transport.mjs +63 -8
  495. package/src/projection/obsidian/publication/vault-list.mjs +200 -0
  496. package/src/projection/obsidian/recovery/index.mjs +4 -1
  497. package/src/projection/obsidian/recovery/restart.mjs +3 -1
  498. package/src/projection/obsidian/recovery/store.mjs +168 -8
  499. package/src/projection/obsidian/selection-ui/contribution.mjs +6 -5
  500. package/src/projection/obsidian/selection-ui/focus.mjs +14 -7
  501. package/src/projection/obsidian/selection-ui/selection-state.mjs +2 -2
  502. package/src/projection/obsidian/selection-ui/selection.mjs +8 -3
  503. package/src/readiness/readiness.mjs +10 -3
  504. package/src/reflection/index.mjs +56 -0
  505. package/src/runtime/obsidian/app-capability.mjs +104 -12
  506. package/src/runtime/obsidian/app-production-seams.mjs +161 -42
  507. package/src/runtime/obsidian/app-registration.mjs +313 -0
  508. package/src/runtime/obsidian/app-restart.mjs +154 -0
  509. package/src/runtime/obsidian/engine.mjs +288 -29
  510. package/src/runtime/obsidian/extension-points.mjs +1 -1
  511. package/src/runtime/obsidian/index.mjs +15 -8
  512. package/src/runtime/obsidian/launch-plan.mjs +91 -0
  513. package/src/runtime/obsidian/lifecycle.mjs +193 -22
  514. package/src/runtime/obsidian/login-item.mjs +332 -0
  515. package/src/runtime/obsidian/machine-settings.mjs +119 -12
  516. package/src/runtime/obsidian/opening.mjs +369 -63
  517. package/src/runtime/obsidian/pending-edits.mjs +10 -0
  518. package/src/runtime/obsidian/pipeline.mjs +71 -3
  519. package/src/runtime/obsidian/plugin-channel.mjs +289 -0
  520. package/src/runtime/obsidian/plugin-choice.mjs +182 -0
  521. package/src/runtime/obsidian/plugin-drift.mjs +124 -0
  522. package/src/runtime/obsidian/plugin-presence.mjs +61 -0
  523. package/src/runtime/obsidian/process-identity.mjs +20 -10
  524. package/src/runtime/obsidian/project-views.mjs +282 -0
  525. package/src/runtime/obsidian/questions.mjs +48 -0
  526. package/src/runtime/obsidian/release-watch.mjs +56 -0
  527. package/src/runtime/obsidian/service-main.mjs +113 -17
  528. package/src/runtime/obsidian/service-manager-production.mjs +61 -0
  529. package/src/runtime/obsidian/service-managers.mjs +275 -0
  530. package/src/runtime/obsidian/service-record.mjs +105 -5
  531. package/src/runtime/obsidian/service-server.mjs +50 -12
  532. package/src/runtime/obsidian/service.mjs +134 -7
  533. package/src/runtime/obsidian/startup-adapters.mjs +59 -21
  534. package/src/runtime/obsidian/state-store.mjs +13 -1
  535. package/src/runtime/obsidian/unheld-evidence.mjs +84 -0
  536. package/src/runtime/obsidian/vault-location.mjs +300 -0
  537. package/src/runtime/obsidian/view-counts.mjs +34 -0
  538. package/src/server/local-sidecar.mjs +193 -7
  539. package/src/server/server.mjs +45 -6
  540. package/src/template-bindings/project.mjs +92 -0
  541. package/src/templates/profile.mjs +225 -0
  542. package/src/trackables/domain.mjs +175 -0
  543. package/src/trackables/store.mjs +114 -0
  544. package/src/ui/knowledge-page.mjs +1388 -0
  545. package/src/upgrade/explanation.mjs +1 -1
  546. package/src/upgrade/template-participant.mjs +171 -0
  547. package/src/upgrade/transaction.mjs +72 -25
  548. package/src/upgrade/upgrade.mjs +2 -1
  549. package/templates/external-project-workspace/pack-lifecycle.json +6 -1
  550. package/templates/knowledge-workspace/.gitattributes +2 -0
  551. package/templates/knowledge-workspace/AGENTS.md +27 -0
  552. package/templates/knowledge-workspace/README.md +44 -0
  553. package/templates/knowledge-workspace/atelier.project.json +22 -0
  554. package/templates/knowledge-workspace/gitignore +6 -0
  555. package/templates/knowledge-workspace/knowledge-plan.json +111 -0
  556. package/templates/knowledge-workspace/knowledge-plan.schema.json +281 -0
  557. package/templates/knowledge-workspace/records/forecast.md +22 -0
  558. package/templates/knowledge-workspace/records/inspection.md +25 -0
  559. package/templates/knowledge-workspace/records/telescope.md +24 -0
  560. package/templates/knowledge-workspace/repo-access.v1.json +9 -0
@@ -0,0 +1,39 @@
1
+ import { createIngestionStore } from '../ingestion/store.mjs'
2
+ import { reportCommandFailure } from '../cli/command-failure.mjs'
3
+
4
+ const commands = ['plan', 'run', 'status', 'query']
5
+ const usage = `Usage: atelier ingest plan|run|status|query
6
+ Read one UTF-8 JSON object from stdin, maximum 256 KiB:
7
+ {workspaceId,input}. Run inside the intended Git workspace with untracked,
8
+ ignored .atelier-local/ state. Plans bind explicit sources, scope and budgets.
9
+ Run processes bounded local text, CSV and JSON. Status retains every selected
10
+ source's disposition. Query returns source-bound lexical evidence with coverage;
11
+ no operation accepts semantic claims, calls a provider or enrolls raw files into
12
+ the graph. Output is private JSON. See docs/ingestion.md.`
13
+
14
+ try {
15
+ const command = process.argv[2]
16
+ if (command === '--help' || command === 'help') console.log(usage)
17
+ else {
18
+ if (!commands.includes(command) || process.argv.length !== 3) throw new Error(usage)
19
+ const chunks = []
20
+ let bytes = 0
21
+ for await (const chunk of process.stdin) {
22
+ bytes += chunk.length
23
+ if (bytes > 256 * 1024) throw new Error('ingestion request exceeds byte limit')
24
+ chunks.push(chunk)
25
+ }
26
+ let body
27
+ try { body = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(Buffer.concat(chunks))) }
28
+ catch { throw new Error('ingestion request must be UTF-8 JSON') }
29
+ if (!body || typeof body !== 'object' || Array.isArray(body)
30
+ || Object.keys(body).length !== 2 || !Object.hasOwn(body, 'workspaceId') || !Object.hasOwn(body, 'input')) {
31
+ throw new Error('invalid ingestion request fields')
32
+ }
33
+ const store = createIngestionStore({ workspaceRoot: process.cwd(), workspaceId: body.workspaceId })
34
+ console.log(JSON.stringify(await store[command](body.input), null, 2))
35
+ }
36
+ } catch (error) {
37
+ // Parser exceptions above are replaced before they can echo source text.
38
+ reportCommandFailure(error)
39
+ }
@@ -101,6 +101,9 @@ if (template === 'external-project') {
101
101
  if (fs.existsSync(target)) throw new Error('external-project target must not exist; refusing overwrite or redirected destination')
102
102
  copyDir(path.join(packageRoot, 'templates/external-project-workspace'), target)
103
103
  console.log(`created external-project adapter at ${target}`)
104
+ } else if (template === 'knowledge-workspace') {
105
+ copyDir(path.join(packageRoot, 'templates/knowledge-workspace'), target)
106
+ console.log(`created knowledge workspace at ${target}`)
104
107
  } else if (template === 'sample-workspace') {
105
108
  copyDir(path.join(packageRoot, 'fixtures/projects/sample-workspace'), target)
106
109
  console.log(`created sample Atelier workspace at ${target}`)
@@ -131,7 +134,7 @@ if (template === 'external-project') {
131
134
  } else if (template) {
132
135
  // Unknown template names fail closed: a typo must not silently produce a
133
136
  // blank scaffold that lacks the boundary policy the caller asked for.
134
- console.error(`Unknown template: ${template}. Valid templates: private-domain, shared-project, sample-workspace, distribution, external-project.`)
137
+ console.error(`Unknown template: ${template}. Valid templates: private-domain, shared-project, sample-workspace, distribution, external-project, knowledge-workspace.`)
135
138
  process.exit(1)
136
139
  } else {
137
140
  fs.mkdirSync(target, { recursive: true })
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env node
2
+ import fs from 'node:fs'
3
+ import path from 'node:path'
4
+ import * as inquiry from '../inquiry/index.mjs'
5
+ import { jsonAt } from '../capabilities/files.mjs'
6
+ import { reportCommandFailure } from '../cli/command-failure.mjs'
7
+
8
+ const USAGE = `Usage: atelier inquiry <command> [options]
9
+ validate --record FILE Validate a single record's shape only.
10
+ inspect --history FILE Replay an exported ledger, checking all references.
11
+ append --record FILE --confirm DIGEST Append to ignored repository campaign history.
12
+ status --campaign ID Show assessments and reconsideration needs.
13
+ handoff --campaign ID --request ID Emit a portable research request and full prompt.
14
+ graph --campaign ID --namespace ID Emit draft sources and relation proposals as JSON.
15
+ feedback --campaign ID --record ID Prepare a version-bound Skill Steward observation.
16
+ export --campaign ID Export the complete local ledger, including captures.
17
+ example Print synthetic records for a complete local journey.
18
+ lenses List optional conceptual inquiry methods.
19
+
20
+ --workspace DIR defaults to the current repository. Output is JSON.
21
+ The initial history digest is ${inquiry.EMPTY_INQUIRY_HEAD}.
22
+ Append requires a Git root with ignored .atelier-local/ state on POSIX.
23
+ Output may contain private source content; choose its destination deliberately.
24
+ No command runs research providers, grants authority, or promotes graph changes.
25
+ Exit codes: 0 success, 1 refusal, 2 usage error.`
26
+ const commands = { validate: ['record'], inspect: ['history'], append: ['record', 'confirm'], status: ['campaign'], handoff: ['campaign', 'request'], graph: ['campaign', 'namespace'], feedback: ['campaign', 'record'], export: ['campaign'], example: [], lenses: [] }
27
+ const argv = process.argv.slice(2), command = argv.shift(), options = {}
28
+ function usage(message) { console.error(`${message}\n\n${USAGE}`); process.exit(2) }
29
+ if (['help', '--help', '-h'].includes(command) || argv.includes('--help')) { console.log(USAGE); process.exit(0) }
30
+ if (!Object.hasOwn(commands, command ?? '')) usage('unknown inquiry command')
31
+ for (let i = 0; i < argv.length; i++) {
32
+ const key = argv[i].startsWith('--') ? argv[i].slice(2) : ''
33
+ if (![...commands[command], 'workspace'].includes(key) || Object.hasOwn(options, key)) usage('unknown or duplicate inquiry option')
34
+ const value = argv[++i]
35
+ if (!value || value.startsWith('--')) usage('inquiry option requires a value')
36
+ options[key] = value
37
+ }
38
+ const requireOption = key => { if (!options[key]) usage(`--${key} is required`); return options[key] }
39
+ const read = file => { const p = path.resolve(file); return jsonAt(fs.realpathSync(path.dirname(p)), path.basename(p)) }
40
+ try {
41
+ let result
42
+ const workspaceRoot = options.workspace ?? process.cwd()
43
+ if (command === 'validate') { const errors = inquiry.validateInquiryDocument(read(requireOption('record'))); result = { valid: errors.length === 0, errors, assurance: 'shape-only' }; if (errors.length) process.exitCode = 1 }
44
+ else if (command === 'inspect') {
45
+ const ledger = read(requireOption('history'))
46
+ const errors = inquiry.validateInquiryDocument(ledger, 'ledger')
47
+ if (errors.length) throw new Error('invalid inquiry ledger')
48
+ result = inquiry.inspectInquiry(ledger.records)
49
+ if (result.head !== ledger.head) throw new Error('inquiry history digest mismatch')
50
+ }
51
+ else if (command === 'append') result = inquiry.appendInquiry({ workspaceRoot, record: read(requireOption('record')), confirm: requireOption('confirm') })
52
+ else if (command === 'example') result = JSON.parse(fs.readFileSync(new URL('../../fixtures/inquiry/workshop.json', import.meta.url), 'utf8'))
53
+ else if (command === 'lenses') result = inquiry.INQUIRY_LENSES
54
+ else {
55
+ const state = inquiry.readInquiry({ workspaceRoot, campaign: requireOption('campaign') })
56
+ if (command === 'status') result = state
57
+ if (command === 'handoff') result = inquiry.researchHandoff(state.records, requireOption('request'))
58
+ if (command === 'graph') result = inquiry.inquiryGraphProposal(state.records, { namespace: requireOption('namespace') })
59
+ if (command === 'feedback') result = inquiry.inquiryStewardObservation(state.records, requireOption('record'))
60
+ if (command === 'export') {
61
+ if (!state.campaign) throw new Error('inquiry campaign does not exist')
62
+ result = { schema: 'atelier-inquiry-ledger@v1', records: state.records, head: state.head }
63
+ }
64
+ }
65
+ console.log(JSON.stringify(result, null, 2))
66
+ } catch (error) { reportCommandFailure(error, 'stdout') }
@@ -0,0 +1,128 @@
1
+ // `atelier knowledge semantic <operation>`: the public command surface over the
2
+ // internal semantic operation runner (src/knowledge/semantic-operation.mjs).
3
+ //
4
+ // The runner checks only `begin`'s request and some nested values as closed
5
+ // shapes; its other methods read their fields by name and ignore extras. This
6
+ // adapter closes every request itself, before the runner is constructed, so a
7
+ // refused request writes nothing. A valid request is passed on unchanged.
8
+ //
9
+ // Atelier calls no model here. The host supplies raw output, candidates and
10
+ // usage; receiver records are caller assertions, not authentication.
11
+ import { createSemanticOperation } from '../knowledge/semantic-operation.mjs'
12
+ import { encodeKnowledgeOutput } from '../knowledge/context.mjs'
13
+ import { parseArgs } from '../project/config.mjs'
14
+ import { safeCommandMessage } from '../cli/command-failure.mjs'
15
+
16
+ export const SEMANTIC_REQUEST_BYTES = 256 * 1024
17
+
18
+ // Every request field has a declared kind, checked before the runner exists, so
19
+ // a wrong kind is a typed refusal with nothing written. Formats (timestamps,
20
+ // digests, identifiers) are the runner's to judge. Required fields are never
21
+ // null; optional ones may be null only where the kind says so.
22
+ const S = 'string', O = 'object', A = 'array'
23
+ const spec = (method, types, optional = []) => Object.freeze({ method, types: Object.freeze(types),
24
+ required: Object.freeze(Object.keys(types).filter(field => !optional.includes(field))), optional: Object.freeze(optional) })
25
+ export const SEMANTIC_COMMANDS = Object.freeze({
26
+ begin: spec('begin', { operationId: S, attemptId: S, at: S, term: S, plan: O, references: A, identityCandidates: A, extractor: O, confirm: S }),
27
+ status: spec('status', { operationId: S }),
28
+ reconcile: spec('reconcile', { operationId: S, at: S, by: S, reason: S, outcome: S, confirm: S }),
29
+ complete: spec('complete', { operationId: S, output: S, expectedOutputDigest: S, candidates: O, usage: O, at: S, confirm: S }),
30
+ proposals: spec('proposals', { operationId: S, query: S, limit: 'integer' }, ['limit']),
31
+ contribution: spec('prepareContribution', { operationId: S, id: S, kind: 'interpretation-kind', candidateId: S, source: O, sourceBinding: O, term: S, at: S, confirm: S,
32
+ supersedes: 'object-or-null', revisionReason: 'string-or-null' }, ['supersedes', 'revisionReason']),
33
+ relation: spec('prepareRelation', { assertion: O, at: S, confirm: S }),
34
+ record: spec('record', { record: O, confirm: S }),
35
+ cascade: spec('cascade', { withdrawalId: S, at: S, confirm: S }),
36
+ context: spec('context', { query: S }),
37
+ project: spec('project', { activationId: S, namespace: S }),
38
+ })
39
+
40
+ const USAGE = `use knowledge semantic ${Object.keys(SEMANTIC_COMMANDS).join('|')} with one JSON object on stdin; see knowledge --help`
41
+
42
+ class SemanticRequestError extends Error {
43
+ constructor(code, message) { super(message); this.name = 'SemanticRequestError'; this.code = code }
44
+ }
45
+
46
+ const plainObject = value => value !== null && typeof value === 'object' && !Array.isArray(value)
47
+ const KINDS = Object.freeze({
48
+ string: value => typeof value === 'string',
49
+ object: plainObject,
50
+ array: Array.isArray,
51
+ integer: Number.isSafeInteger,
52
+ 'object-or-null': value => value === null || plainObject(value),
53
+ 'string-or-null': value => value === null || typeof value === 'string',
54
+ // The runner maps exactly these three kinds; any other, even an inherited
55
+ // property name, is refused here.
56
+ 'interpretation-kind': value => value === 'entity' || value === 'assertion' || value === 'unknown',
57
+ })
58
+ const exactFields = (value, required, optional = []) => plainObject(value)
59
+ && Object.keys(value).every(key => required.includes(key) || optional.includes(key))
60
+ && required.every(key => Object.hasOwn(value, key))
61
+
62
+ async function readRequest() {
63
+ const chunks = []
64
+ let bytes = 0
65
+ for await (const chunk of process.stdin) {
66
+ bytes += chunk.length
67
+ if (bytes > SEMANTIC_REQUEST_BYTES) throw new SemanticRequestError('SEMANTIC_OPERATION_LIMIT', 'semantic request exceeds 256 KiB')
68
+ chunks.push(chunk)
69
+ }
70
+ try { return JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(Buffer.concat(chunks))) }
71
+ catch { throw new SemanticRequestError('SEMANTIC_OPERATION_INVALID', 'semantic request must be UTF-8 JSON') }
72
+ }
73
+
74
+ // The closed envelope and the per-command field set, checked before any store is opened.
75
+ export function selectSemanticRequest(command, body) {
76
+ const selected = SEMANTIC_COMMANDS[command]
77
+ if (!exactFields(body, ['workspaceId', 'run', 'request']) || typeof body.workspaceId !== 'string' || typeof body.run !== 'string')
78
+ throw new SemanticRequestError('SEMANTIC_OPERATION_INVALID', 'semantic request needs exactly workspaceId, run and request')
79
+ if (!exactFields(body.request, selected.required, selected.optional))
80
+ throw new SemanticRequestError('SEMANTIC_OPERATION_INVALID', `unknown or missing ${command} request field`)
81
+ for (const [field, value] of Object.entries(body.request))
82
+ if (!KINDS[selected.types[field]](value)) throw new SemanticRequestError('SEMANTIC_OPERATION_INVALID', `invalid ${command} request field type: ${field}`)
83
+ return selected
84
+ }
85
+
86
+ const TYPED = /^SEMANTIC_[A-Z_]+$/
87
+ // The printed failure for an error, or null when it must go to the command
88
+ // executor's redaction. Three cases:
89
+ // - a SEMANTIC_* refusal keeps its own code;
90
+ // - any error carrying the runner's recorded/captured detail keeps it, as
91
+ // SEMANTIC_OPERATION_INTERRUPTED when uncoded;
92
+ // - Atelier's own other refusals (safe text, no host detail) become
93
+ // SEMANTIC_OPERATION_REFUSED.
94
+ // Only an error with unsafe text and nothing saved is left to the executor.
95
+ export function semanticFailure(error) {
96
+ const typed = typeof error?.code === 'string' && TYPED.test(error.code)
97
+ const saved = error?.recorded !== undefined || error?.captured !== undefined
98
+ const message = safeCommandMessage(error)
99
+ if (!typed && !saved && message === null) return null
100
+ const failure = { ok: false, code: typed ? error.code : saved ? 'SEMANTIC_OPERATION_INTERRUPTED' : 'SEMANTIC_OPERATION_REFUSED', error: message ?? '[internal-error]' }
101
+ if (error.recorded !== undefined) failure.recorded = error.recorded
102
+ if (error.captured !== undefined) failure.captured = error.captured
103
+ return failure
104
+ }
105
+
106
+ function reportSemanticFailure(error) {
107
+ const failure = semanticFailure(error)
108
+ if (failure === null) throw error
109
+ console.error(JSON.stringify(failure))
110
+ process.exitCode = 1
111
+ }
112
+
113
+ export async function runKnowledgeSemantic(argv) {
114
+ try {
115
+ const args = parseArgs(argv)
116
+ const command = args._[0]
117
+ if (args._.length !== 1 || !Object.hasOwn(SEMANTIC_COMMANDS, command) || Object.keys(args).some(key => key !== '_'))
118
+ throw new SemanticRequestError('SEMANTIC_OPERATION_INVALID', USAGE)
119
+ const body = await readRequest()
120
+ const selected = selectSemanticRequest(command, body)
121
+ // The workspace is the current directory, as for ingest and learn: the
122
+ // runner reads the ingestion store that `atelier ingest` writes there.
123
+ const runner = createSemanticOperation({ workspaceRoot: process.cwd(), workspaceId: body.workspaceId, run: body.run })
124
+ process.stdout.write(encodeKnowledgeOutput(runner[selected.method](body.request)))
125
+ } catch (error) {
126
+ reportSemanticFailure(error)
127
+ }
128
+ }
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env node
2
+ import { commandProject, parseArgs } from '../project/config.mjs'
3
+ import { buildCanonicalGraph, createGraphFileCache } from '../graph/graph.mjs'
4
+ import { inspectKnowledgePlan } from '../knowledge/plan.mjs'
5
+ import {
6
+ createKnowledgeContext,
7
+ encodeKnowledgeOutput,
8
+ evaluateKnowledgeQuestions,
9
+ } from '../knowledge/context.mjs'
10
+ import {
11
+ knowledgeDashboard,
12
+ loadKnowledgeWorkspace,
13
+ readKnowledgePlan,
14
+ } from '../knowledge/workspace.mjs'
15
+ import { createKnowledgeSessions } from '../knowledge/sessions.mjs'
16
+ import { runKnowledgeSemantic } from './knowledge-semantic.mjs'
17
+
18
+ // semantic reports its own typed failures and leaves untyped ones to the
19
+ // command executor, so it runs outside this command's message-only catch.
20
+ if (process.argv[2] === 'semantic') await runKnowledgeSemantic(process.argv.slice(3))
21
+ else try {
22
+ const argv = process.argv.slice(2)
23
+ const args = parseArgs(argv)
24
+ const command = args._[0]
25
+ if (
26
+ !['check', 'context', 'evaluate', 'dashboard', 'session'].includes(
27
+ command
28
+ ) ||
29
+ args._.length !== (command === 'session' ? 2 : 1)
30
+ )
31
+ throw new Error(
32
+ 'use knowledge check, context, evaluate, dashboard, session, or semantic; see knowledge --help'
33
+ )
34
+ const allowed = new Set([
35
+ '_',
36
+ 'project',
37
+ 'project-config',
38
+ 'repo-path',
39
+ 'plan',
40
+ ...(command === 'context' ? ['question', 'mode', 'max-bytes'] : []),
41
+ ])
42
+ if (Object.keys(args).some((key) => !allowed.has(key)))
43
+ throw new Error('unknown knowledge option; see knowledge --help')
44
+ const project = commandProject({ argv })
45
+ if (command === 'session') {
46
+ const operation = args._[1]
47
+ if (!['start', 'read', 'event', 'recover', 'list'].includes(operation))
48
+ throw new Error('unknown knowledge session operation')
49
+ const sessions = createKnowledgeSessions(project, args.plan)
50
+ let result
51
+ if (operation === 'list') result = { ok: true, ...sessions.list() }
52
+ else {
53
+ const chunks = []
54
+ let count = 0
55
+ for await (const chunk of process.stdin) {
56
+ count += chunk.length
57
+ if (count > 1024 * 1024) throw new Error('request exceeds byte ceiling')
58
+ chunks.push(chunk)
59
+ }
60
+ const input = JSON.parse(
61
+ new TextDecoder('utf-8', { fatal: true }).decode(Buffer.concat(chunks))
62
+ )
63
+ if (operation === 'read') {
64
+ if (!input || Object.keys(input).join(',') !== 'sessionId')
65
+ throw new Error('read requires only sessionId')
66
+ result = sessions.read(input.sessionId)
67
+ } else result = sessions[operation](input)
68
+ }
69
+ process.stdout.write(encodeKnowledgeOutput(result))
70
+ } else if (command === 'dashboard') {
71
+ process.stdout.write(
72
+ encodeKnowledgeOutput(
73
+ knowledgeDashboard(loadKnowledgeWorkspace(project, args.plan))
74
+ )
75
+ )
76
+ } else {
77
+ const { plan, sha256 } = readKnowledgePlan(project, args.plan)
78
+ const cache = createGraphFileCache()
79
+ const graph = buildCanonicalGraph(project, { fileCache: cache })
80
+ if (command === 'check') {
81
+ const result = inspectKnowledgePlan(plan, graph)
82
+ process.stdout.write(encodeKnowledgeOutput(result))
83
+ if (!result.ok) process.exitCode = 1
84
+ } else {
85
+ if (!graph.ok)
86
+ throw new Error(
87
+ 'canonical graph is invalid; run atelier graph to inspect diagnostics'
88
+ )
89
+ const result =
90
+ command === 'evaluate'
91
+ ? evaluateKnowledgeQuestions({ project, plan, sha256, graph, cache })
92
+ : createKnowledgeContext({
93
+ project,
94
+ plan,
95
+ sha256,
96
+ graph,
97
+ cache,
98
+ question: args.question,
99
+ mode: args.mode || 'graph',
100
+ maxBytes:
101
+ args['max-bytes'] === undefined
102
+ ? plan.budget.maxContextBytes
103
+ : Number(args['max-bytes']),
104
+ })
105
+ process.stdout.write(encodeKnowledgeOutput(result))
106
+ if (
107
+ command === 'evaluate' &&
108
+ result.cases.some(
109
+ (c) =>
110
+ !c.runs.graph.expectedEvidencePresent || c.runs.graph.stale.length
111
+ )
112
+ )
113
+ process.exitCode = 1
114
+ }
115
+ }
116
+ } catch (error) {
117
+ console.error(`knowledge: ${error.message}`)
118
+ process.exitCode = 1
119
+ }
@@ -0,0 +1,61 @@
1
+ import { createLearningStore } from '../learning/store.mjs'
2
+ import { planLearningWork } from '../learning/assistance.mjs'
3
+ import { reportCommandFailure } from '../cli/command-failure.mjs'
4
+
5
+ const commands = ['capture', 'propose', 'decide', 'activate', 'withdraw', 'list', 'context', 'render', 'graph', 'export', 'plan']
6
+ const writes = new Set(commands.slice(0, 5))
7
+ const usage = `Usage: atelier learn ${commands.join('|')}
8
+ Read one JSON object from stdin, maximum 256 KiB. Run inside the intended Git
9
+ workspace with untracked, ignored .atelier-local/ state.
10
+
11
+ Every request includes workspaceId. Writes also include actor:{id,kind},
12
+ requestId, expectedRevision and input. Actor is a local caller assertion, not
13
+ authenticated identity. Reads use query only for context and render.
14
+
15
+ Capture records evidence; propose creates an inert lesson. Decide binds an exact
16
+ lesson digest. Activate makes approved content available to a named harness;
17
+ it does not install files or grant tool permissions. Withdraw stops future use.
18
+ List, context, render, graph, export and plan print private JSON to stdout.
19
+ Export is an explicit private archive, never a send or publication operation.
20
+ See docs/learning.md for complete examples.`
21
+
22
+ function exactObject(value, allowed, required) {
23
+ if (!value || typeof value !== 'object' || Array.isArray(value)
24
+ || Object.keys(value).some(key => !allowed.includes(key))
25
+ || required.some(key => !Object.hasOwn(value, key))) throw new Error('invalid learning request fields')
26
+ }
27
+
28
+ const command = process.argv[2]
29
+ if (command === '--help' || command === 'help') {
30
+ console.log(usage)
31
+ } else {
32
+ try {
33
+ if (!commands.includes(command) || process.argv.length !== 3) throw new Error(usage)
34
+ const chunks = []
35
+ let bytes = 0
36
+ for await (const chunk of process.stdin) {
37
+ bytes += chunk.length
38
+ if (bytes > 256 * 1024) throw new Error('learning request exceeds byte limit')
39
+ chunks.push(chunk)
40
+ }
41
+ let body
42
+ try { body = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(Buffer.concat(chunks))) }
43
+ catch { throw new Error('learning request must be UTF-8 JSON') }
44
+ const fields = writes.has(command)
45
+ ? ['workspaceId', 'actor', 'requestId', 'expectedRevision', 'input']
46
+ : ['workspaceId', ...(['context', 'render'].includes(command) ? ['query'] : [])]
47
+ exactObject(body, fields, fields)
48
+ const store = createLearningStore({ workspaceRoot: process.cwd(), workspaceId: body.workspaceId })
49
+ let result
50
+ if (writes.has(command)) {
51
+ result = store.execute({ requestId: body.requestId, expectedRevision: body.expectedRevision,
52
+ operation: command, input: body.input }, { actor: body.actor })
53
+ } else if (command === 'list') result = store.snapshot()
54
+ else if (command === 'plan') result = planLearningWork(store.snapshot())
55
+ else if (command === 'context' || command === 'render') result = store[command](body.query)
56
+ else result = store[command]()
57
+ console.log(JSON.stringify(result, null, 2))
58
+ } catch (error) {
59
+ reportCommandFailure(error)
60
+ }
61
+ }