@mnstry/atelier 0.2.0-alpha.12 → 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.
- package/CHANGELOG.md +661 -0
- package/README.md +142 -6
- package/contracts/atelier-adoption-policy.v2.schema.json +55 -0
- package/contracts/atelier-architecture.v1.schema.json +258 -0
- package/contracts/atelier-boundary-delegations.v1.schema.json +161 -0
- package/contracts/atelier-boundary-owner-keys.v1.schema.json +98 -0
- package/contracts/atelier-build.v1.schema.json +1076 -0
- package/contracts/atelier-capability.v1.schema.json +1252 -0
- package/contracts/atelier-coordination.v1.schema.json +1050 -0
- package/contracts/atelier-evidence-navigation.v1.schema.json +603 -0
- package/contracts/atelier-harness.v1.schema.json +234 -0
- package/contracts/atelier-ingestion.v1.schema.json +806 -0
- package/contracts/atelier-inquiry.v1.schema.json +1772 -0
- package/contracts/atelier-instruction-adoption.v1.schema.json +490 -0
- package/contracts/atelier-interaction.v1.schema.json +553 -0
- package/contracts/atelier-judgment.v1.schema.json +690 -0
- package/contracts/atelier-knowledge.v1.schema.json +1512 -0
- package/contracts/atelier-learning.v1.schema.json +1095 -0
- package/contracts/atelier-migration.v3.schema.json +64 -0
- package/contracts/atelier-personal-workspace-manifest.v1.schema.json +87 -0
- package/contracts/atelier-personal-workspace-overlay.v1.schema.json +299 -0
- package/contracts/atelier-template-adoption.v1.schema.json +223 -0
- package/contracts/atelier-template-profile.v1.schema.json +1168 -0
- package/contracts/atelier-trackable.v1.schema.json +781 -0
- package/contracts/atelier-upgrade-plan.v3.schema.json +532 -0
- package/docs/architecture.md +89 -0
- package/docs/assurance-controls.md +2 -2
- package/docs/blocks/capability-stewardship.md +17 -0
- package/docs/blocks/claims.md +16 -3
- package/docs/blocks/inquiry-harnesses.md +19 -0
- package/docs/blocks/learning-harnesses.md +17 -0
- package/docs/capability-stewardship.md +269 -0
- package/docs/coordination.md +51 -0
- package/docs/decision-practices.md +111 -0
- package/docs/decisions.md +29 -0
- package/docs/evidence-navigation.md +237 -0
- package/docs/exact-upgrades.md +3 -2
- package/docs/ingestion.md +181 -0
- package/docs/inquiry-harnesses.md +211 -0
- package/docs/install.md +80 -3
- package/docs/intake-and-guides.md +5 -0
- package/docs/integration-contract-decisions.md +24 -2
- package/docs/interaction-and-reflection.md +72 -0
- package/docs/knowledge-graph.md +20 -0
- package/docs/knowledge-health/api.md +30 -0
- package/docs/knowledge-health/assessment/api.md +96 -0
- package/docs/knowledge-health/assessment/capabilities.md +40 -0
- package/docs/knowledge-health/assessment/evaluation.md +27 -0
- package/docs/knowledge-health/assessment/facilitator.md +30 -0
- package/docs/knowledge-health/assessment/quickstart.md +61 -0
- package/docs/knowledge-health/assessment/troubleshooting.md +23 -0
- package/docs/knowledge-health/devday/facilitator.md +16 -0
- package/docs/knowledge-health/devday/participant-response.md +22 -0
- package/docs/knowledge-health/devday/public-default.md +107 -0
- package/docs/knowledge-health/devday/quickstart.md +18 -0
- package/docs/knowledge-health/devday/support.md +22 -0
- package/docs/knowledge-health/exercise.md +17 -0
- package/docs/knowledge-health/facilitator.md +20 -0
- package/docs/knowledge-health/quickstart.md +94 -0
- package/docs/knowledge-health/readme.md +15 -0
- package/docs/knowledge-health/support.md +34 -0
- package/docs/knowledge-setup.md +248 -0
- package/docs/knowledge-workspace.md +264 -0
- package/docs/learning-harnesses.md +238 -0
- package/docs/learning.md +215 -0
- package/docs/local-services.md +181 -16
- package/docs/obsidian-contract.md +223 -15
- package/docs/obsidian-plugin.md +38 -4
- package/docs/obsidian.md +613 -51
- package/docs/optional-ingestion.md +83 -0
- package/docs/personal-workspace.md +257 -0
- package/docs/practical-judgment.md +92 -0
- package/docs/progressive-ingestion-acceptance.md +89 -0
- package/docs/progressive-ingestion.md +235 -0
- package/docs/project-command-inventory.md +1 -0
- package/docs/release-engineering.md +49 -0
- package/docs/repo-boundary-guard.md +94 -0
- package/docs/research-starter-quickstart.md +66 -0
- package/docs/research-starter.md +114 -0
- package/docs/semantic-ingestion.md +198 -0
- package/docs/semantic-operation.md +317 -0
- package/docs/skill-steward.md +6 -0
- package/docs/template-profile.md +164 -0
- package/docs/template-upgrades.md +114 -0
- package/docs/trackables.md +111 -0
- package/docs/upgrade.md +47 -2
- package/fixtures/atelier-architecture/binding/invalid/document.json +19 -0
- package/fixtures/atelier-architecture/binding/valid/document.json +19 -0
- package/fixtures/atelier-architecture/catalog/invalid/document.json +290 -0
- package/fixtures/atelier-architecture/catalog/valid/document.json +343 -0
- package/fixtures/atelier-build-contract/attempt/invalid/document.json +20 -0
- package/fixtures/atelier-build-contract/attempt/valid/document.json +19 -0
- package/fixtures/atelier-build-contract/candidate/invalid/document.json +24 -0
- package/fixtures/atelier-build-contract/candidate/valid/document.json +23 -0
- package/fixtures/atelier-build-contract/decision/invalid/document.json +31 -0
- package/fixtures/atelier-build-contract/decision/valid/document.json +30 -0
- package/fixtures/atelier-build-contract/delivery/invalid/document.json +18 -0
- package/fixtures/atelier-build-contract/delivery/valid/document.json +17 -0
- package/fixtures/atelier-build-contract/gate/invalid/document.json +22 -0
- package/fixtures/atelier-build-contract/gate/valid/document.json +21 -0
- package/fixtures/atelier-build-contract/ledger/invalid/document.json +270 -0
- package/fixtures/atelier-build-contract/ledger/valid/document.json +269 -0
- package/fixtures/atelier-build-contract/objective/invalid/document.json +73 -0
- package/fixtures/atelier-build-contract/objective/valid/document.json +72 -0
- package/fixtures/atelier-build-contract/progress/invalid/document.json +18 -0
- package/fixtures/atelier-build-contract/progress/valid/document.json +17 -0
- package/fixtures/atelier-capability-contract/adoption/invalid/document.json +71 -0
- package/fixtures/atelier-capability-contract/adoption/valid/document.json +70 -0
- package/fixtures/atelier-capability-contract/event/invalid/document.json +18 -0
- package/fixtures/atelier-capability-contract/event/valid/document.json +17 -0
- package/fixtures/atelier-capability-contract/journal/invalid/document.json +382 -0
- package/fixtures/atelier-capability-contract/journal/valid/document.json +381 -0
- package/fixtures/atelier-capability-contract/notice/invalid/document.json +8 -0
- package/fixtures/atelier-capability-contract/notice/valid/document.json +7 -0
- package/fixtures/atelier-capability-contract/package/invalid/document.json +59 -0
- package/fixtures/atelier-capability-contract/package/valid/document.json +58 -0
- package/fixtures/atelier-capability-contract/plan/invalid/document.json +107 -0
- package/fixtures/atelier-capability-contract/plan/valid/document.json +106 -0
- package/fixtures/atelier-capability-contract/release/invalid/document.json +85 -0
- package/fixtures/atelier-capability-contract/release/valid/document.json +84 -0
- package/fixtures/atelier-capability-contract/state/invalid/document.json +316 -0
- package/fixtures/atelier-capability-contract/state/valid/document.json +315 -0
- package/fixtures/atelier-coordination/dependency/invalid/document.json +37 -0
- package/fixtures/atelier-coordination/dependency/valid/document.json +36 -0
- package/fixtures/atelier-coordination/directive/invalid/document.json +25 -0
- package/fixtures/atelier-coordination/directive/valid/document.json +24 -0
- package/fixtures/atelier-coordination/disposition/invalid/document.json +34 -0
- package/fixtures/atelier-coordination/disposition/valid/document.json +33 -0
- package/fixtures/atelier-coordination/outcome/invalid/document.json +39 -0
- package/fixtures/atelier-coordination/outcome/valid/document.json +38 -0
- package/fixtures/atelier-coordination/recovery/invalid/document.json +34 -0
- package/fixtures/atelier-coordination/recovery/valid/document.json +33 -0
- package/fixtures/atelier-harness-contract/handoff/invalid/document.json +25 -0
- package/fixtures/atelier-harness-contract/handoff/valid/document.json +24 -0
- package/fixtures/atelier-ingestion/invalid/authority.json +19 -0
- package/fixtures/atelier-ingestion/semantic-baseline.json +26 -0
- package/fixtures/atelier-ingestion/semantic-operation.json +75 -0
- package/fixtures/atelier-ingestion/valid/plan-input.json +18 -0
- package/fixtures/atelier-inquiry-contract/assessment/invalid/document.json +41 -0
- package/fixtures/atelier-inquiry-contract/assessment/valid/document.json +40 -0
- package/fixtures/atelier-inquiry-contract/bundle/invalid/document.json +51 -0
- package/fixtures/atelier-inquiry-contract/bundle/valid/document.json +50 -0
- package/fixtures/atelier-inquiry-contract/campaign/invalid/document.json +17 -0
- package/fixtures/atelier-inquiry-contract/campaign/valid/document.json +16 -0
- package/fixtures/atelier-inquiry-contract/decision/invalid/document.json +22 -0
- package/fixtures/atelier-inquiry-contract/decision/valid/document.json +21 -0
- package/fixtures/atelier-inquiry-contract/feedback/invalid/document.json +19 -0
- package/fixtures/atelier-inquiry-contract/feedback/valid/document.json +18 -0
- package/fixtures/atelier-inquiry-contract/handoff/invalid/document.json +92 -0
- package/fixtures/atelier-inquiry-contract/handoff/valid/document.json +91 -0
- package/fixtures/atelier-inquiry-contract/hypothesis/invalid/document.json +20 -0
- package/fixtures/atelier-inquiry-contract/hypothesis/valid/document.json +19 -0
- package/fixtures/atelier-inquiry-contract/ledger/invalid/document.json +680 -0
- package/fixtures/atelier-inquiry-contract/ledger/valid/document.json +679 -0
- package/fixtures/atelier-inquiry-contract/legacy-assessment/invalid/document.json +19 -0
- package/fixtures/atelier-inquiry-contract/legacy-assessment/valid/document.json +18 -0
- package/fixtures/atelier-inquiry-contract/request/invalid/document.json +50 -0
- package/fixtures/atelier-inquiry-contract/request/valid/document.json +49 -0
- package/fixtures/atelier-inquiry-contract/source/invalid/document.json +18 -0
- package/fixtures/atelier-inquiry-contract/source/valid/document.json +17 -0
- package/fixtures/atelier-inquiry-contract/withdrawal/invalid/document.json +16 -0
- package/fixtures/atelier-inquiry-contract/withdrawal/valid/document.json +15 -0
- package/fixtures/atelier-instruction-adoption/context-receipt/invalid/document.json +18 -0
- package/fixtures/atelier-instruction-adoption/context-receipt/valid/document.json +17 -0
- package/fixtures/atelier-instruction-adoption/plan/invalid/document.json +63 -0
- package/fixtures/atelier-instruction-adoption/plan/valid/document.json +62 -0
- package/fixtures/atelier-instruction-adoption/receipt/invalid/document.json +22 -0
- package/fixtures/atelier-instruction-adoption/receipt/valid/document.json +21 -0
- package/fixtures/atelier-instruction-adoption/state/invalid/document.json +30 -0
- package/fixtures/atelier-instruction-adoption/state/valid/document.json +29 -0
- package/fixtures/atelier-interaction/act/invalid/document.json +25 -0
- package/fixtures/atelier-interaction/act/valid/document.json +24 -0
- package/fixtures/atelier-interaction/assessment/invalid/document.json +32 -0
- package/fixtures/atelier-interaction/assessment/valid/document.json +31 -0
- package/fixtures/atelier-interaction/observation/invalid/document.json +22 -0
- package/fixtures/atelier-interaction/observation/valid/document.json +21 -0
- package/fixtures/atelier-interaction/policy/invalid/document.json +20 -0
- package/fixtures/atelier-interaction/policy/valid/document.json +19 -0
- package/fixtures/atelier-judgment/case/invalid/document.json +76 -0
- package/fixtures/atelier-judgment/case/valid/document.json +75 -0
- package/fixtures/atelier-judgment/decision/invalid/document.json +38 -0
- package/fixtures/atelier-judgment/decision/valid/document.json +37 -0
- package/fixtures/atelier-judgment/native-decision.md +3 -0
- package/fixtures/atelier-judgment/practice-reconsideration/definition.json +92 -0
- package/fixtures/atelier-judgment/practice-reconsideration/scenario.json +435 -0
- package/fixtures/atelier-knowledge-contract/activation/invalid/document.json +26 -0
- package/fixtures/atelier-knowledge-contract/activation/valid/document.json +25 -0
- package/fixtures/atelier-knowledge-contract/contribution/invalid/document.json +34 -0
- package/fixtures/atelier-knowledge-contract/contribution/valid/document.json +33 -0
- package/fixtures/atelier-knowledge-contract/domain/invalid/document.json +41 -0
- package/fixtures/atelier-knowledge-contract/domain/valid/document.json +40 -0
- package/fixtures/atelier-knowledge-contract/domain-revision/invalid/document.json +46 -0
- package/fixtures/atelier-knowledge-contract/domain-revision/valid/document.json +45 -0
- package/fixtures/atelier-knowledge-contract/evaluation/invalid/document.json +21 -0
- package/fixtures/atelier-knowledge-contract/evaluation/valid/document.json +20 -0
- package/fixtures/atelier-knowledge-contract/ledger/invalid/document.json +318 -0
- package/fixtures/atelier-knowledge-contract/ledger/valid/document.json +317 -0
- package/fixtures/atelier-knowledge-contract/relation/invalid/document.json +25 -0
- package/fixtures/atelier-knowledge-contract/relation/valid/document.json +24 -0
- package/fixtures/atelier-knowledge-contract/review/invalid/document.json +18 -0
- package/fixtures/atelier-knowledge-contract/review/valid/document.json +17 -0
- package/fixtures/atelier-knowledge-contract/withdrawal/invalid/document.json +16 -0
- package/fixtures/atelier-knowledge-contract/withdrawal/valid/document.json +15 -0
- package/fixtures/atelier-learning/invalid/authority.json +14 -0
- package/fixtures/atelier-learning/valid/capture.json +13 -0
- package/fixtures/atelier-personal-workspace-contract/manifest/invalid/authority-key.json +17 -0
- package/fixtures/atelier-personal-workspace-contract/manifest/invalid/nonempty-ext.json +25 -0
- package/fixtures/atelier-personal-workspace-contract/manifest/invalid/wrong-schema.json +22 -0
- package/fixtures/atelier-personal-workspace-contract/manifest/valid/manifest.json +22 -0
- package/fixtures/atelier-personal-workspace-contract/overlay/invalid/authority-key.json +25 -0
- package/fixtures/atelier-personal-workspace-contract/overlay/invalid/unknown-top-level-field.json +27 -0
- package/fixtures/atelier-personal-workspace-contract/overlay/invalid/wrong-schema.json +24 -0
- package/fixtures/atelier-trackable/definition/invalid/document.json +15 -0
- package/fixtures/atelier-trackable/definition/valid/document.json +14 -0
- package/fixtures/atelier-trackable/request/invalid/document.json +23 -0
- package/fixtures/atelier-trackable/request/valid/document.json +22 -0
- package/fixtures/boundary-delegations/invalid/authority-key.v1.json +30 -0
- package/fixtures/boundary-delegations/invalid/push-operation.v1.json +28 -0
- package/fixtures/boundary-delegations/invalid/unsigned.v1.json +25 -0
- package/fixtures/boundary-delegations/valid/empty.v1.json +4 -0
- package/fixtures/boundary-delegations/valid/signed-operator.v1.json +30 -0
- package/fixtures/boundary-owner-keys/invalid/wrong-algorithm.v1.json +15 -0
- package/fixtures/boundary-owner-keys/invalid/wrong-curve.v1.json +15 -0
- package/fixtures/boundary-owner-keys/valid/one-owner.v1.json +17 -0
- package/fixtures/capability-packages/adoption.example.json +70 -0
- package/fixtures/capability-packages/evidence-review/capability-package.json +58 -0
- package/fixtures/capability-packages/evidence-review/capability-release.json +84 -0
- package/fixtures/capability-packages/evidence-review/evaluation.md +15 -0
- package/fixtures/capability-packages/evidence-review/skills/evidence-review/SKILL.md +22 -0
- package/fixtures/capability-packages/evidence-review/skills/evidence-review/references/ledger.md +7 -0
- package/fixtures/capability-packages/research/capability-package.json +88 -0
- package/fixtures/capability-packages/research/capability-release.json +134 -0
- package/fixtures/capability-packages/research/evaluation.md +15 -0
- package/fixtures/capability-packages/research/skills/research-integrate/SKILL.md +29 -0
- package/fixtures/capability-packages/research/skills/research-integrate/references/integration.md +10 -0
- package/fixtures/capability-packages/research/skills/research-plan/SKILL.md +27 -0
- package/fixtures/capability-packages/research/skills/research-plan/references/inquiries.md +26 -0
- package/fixtures/capability-packages/research/skills/research-synthesize/SKILL.md +23 -0
- package/fixtures/capability-packages/research/skills/research-synthesize/references/synthesis.md +12 -0
- package/fixtures/evidence-navigation/invalid/duplicate-operation.json +16 -0
- package/fixtures/evidence-navigation/invalid/instruction-kind.json +36 -0
- package/fixtures/evidence-navigation/invalid/invalid-digest.json +36 -0
- package/fixtures/evidence-navigation/invalid/invalid-time.json +36 -0
- package/fixtures/evidence-navigation/invalid/missing-attribution.json +35 -0
- package/fixtures/evidence-navigation/invalid/reserved-extension.json +19 -0
- package/fixtures/evidence-navigation/invalid/unattributed-acceptance.json +36 -0
- package/fixtures/evidence-navigation/invalid/uncoerced-version.json +16 -0
- package/fixtures/evidence-navigation/invalid/unknown-currency.json +17 -0
- package/fixtures/evidence-navigation/invalid/unknown-selector-field.json +37 -0
- package/fixtures/evidence-navigation/invalid/unsupported-operation.json +15 -0
- package/fixtures/evidence-navigation/valid/claim.json +36 -0
- package/fixtures/evidence-navigation/valid/host.json +16 -0
- package/fixtures/evidence-navigation/valid/profile.json +16 -0
- package/fixtures/evidence-navigation/valid/snapshot.json +17 -0
- package/fixtures/harness-packages/build-harness/capability-package.json +61 -0
- package/fixtures/harness-packages/build-harness/capability-release.json +82 -0
- package/fixtures/harness-packages/build-harness/evaluation.md +3 -0
- package/fixtures/harness-packages/build-harness/skills/atelier-build-harness/SKILL.md +59 -0
- package/fixtures/harness-packages/knowledge-harness/capability-package.json +61 -0
- package/fixtures/harness-packages/knowledge-harness/capability-release.json +82 -0
- package/fixtures/harness-packages/knowledge-harness/evaluation.md +3 -0
- package/fixtures/harness-packages/knowledge-harness/skills/atelier-knowledge-harness/SKILL.md +60 -0
- package/fixtures/harnesses/learning-cycle.json +780 -0
- package/fixtures/inquiry/workshop.json +675 -0
- package/fixtures/inquiry-packages/discovery-harness/capability-package.json +61 -0
- package/fixtures/inquiry-packages/discovery-harness/capability-release.json +82 -0
- package/fixtures/inquiry-packages/discovery-harness/evaluation.md +3 -0
- package/fixtures/inquiry-packages/discovery-harness/skills/atelier-discovery-harness/SKILL.md +48 -0
- package/fixtures/inquiry-packages/research-harness/capability-package.json +61 -0
- package/fixtures/inquiry-packages/research-harness/capability-release.json +82 -0
- package/fixtures/inquiry-packages/research-harness/evaluation.md +3 -0
- package/fixtures/inquiry-packages/research-harness/skills/atelier-research-harness/SKILL.md +43 -0
- package/fixtures/knowledge-health/calibration-suite.json +26 -0
- package/fixtures/knowledge-health/calibration-trial.json +37 -0
- package/fixtures/knowledge-health/corrected/checklist.md +18 -0
- package/fixtures/knowledge-health/devday/participant-record.json +19 -0
- package/fixtures/knowledge-health/expected-summary.json +27 -0
- package/fixtures/knowledge-health/workshop/README.md +20 -0
- package/fixtures/knowledge-health/workshop/atelier.project.json +7 -0
- package/fixtures/knowledge-health/workshop/knowledge-plan.json +65 -0
- package/fixtures/knowledge-health/workshop/records/checklist.md +18 -0
- package/fixtures/knowledge-health/workshop/records/workshop.md +18 -0
- package/fixtures/knowledge-health/workshop/repo-access.v1.json +5 -0
- package/fixtures/knowledge-health/workspace/atelier.project.json +18 -0
- package/fixtures/knowledge-health/workspace/knowledge-plan.json +74 -0
- package/fixtures/knowledge-health/workspace/records/checklist.md +18 -0
- package/fixtures/knowledge-health/workspace/records/pilot.md +16 -0
- package/fixtures/knowledge-health/workspace/repo-access.v1.json +9 -0
- package/fixtures/personal-workspace/overlay.json +24 -0
- package/fixtures/templates/local-library.v1.json +75 -0
- package/fixtures/templates/upgrade-contracts/adoption-policy.v2/invalid.json +16 -0
- package/fixtures/templates/upgrade-contracts/adoption-policy.v2/valid.json +13 -0
- package/fixtures/templates/upgrade-contracts/migration.v3/invalid.json +24 -0
- package/fixtures/templates/upgrade-contracts/migration.v3/valid.json +21 -0
- package/fixtures/templates/upgrade-contracts/template-adoption.v1/invalid.json +60 -0
- package/fixtures/templates/upgrade-contracts/template-adoption.v1/valid.json +57 -0
- package/fixtures/templates/upgrade-contracts/upgrade-plan.v3/invalid.json +85 -0
- package/fixtures/templates/upgrade-contracts/upgrade-plan.v3/valid.json +82 -0
- package/package.json +59 -5
- package/skills/claude/atelier-build-harness/SKILL.md +59 -0
- package/skills/claude/atelier-coordination/SKILL.md +32 -0
- package/skills/claude/atelier-discovery-harness/SKILL.md +48 -0
- package/skills/claude/atelier-guided-upgrade/SKILL.md +29 -0
- package/skills/claude/atelier-interaction/SKILL.md +34 -0
- package/skills/claude/atelier-knowledge-harness/SKILL.md +60 -0
- package/skills/claude/atelier-knowledge-setup/SKILL.md +72 -0
- package/skills/claude/atelier-practical-judgment/SKILL.md +64 -0
- package/skills/claude/atelier-research-harness/SKILL.md +43 -0
- package/skills/claude/atelier-skill-steward/SKILL.md +53 -0
- package/skills/claude/atelier-trackables/SKILL.md +40 -0
- package/skills/codex/atelier-build-harness/SKILL.md +59 -0
- package/skills/codex/atelier-coordination/SKILL.md +32 -0
- package/skills/codex/atelier-discovery-harness/SKILL.md +48 -0
- package/skills/codex/atelier-guided-upgrade/SKILL.md +29 -0
- package/skills/codex/atelier-interaction/SKILL.md +34 -0
- package/skills/codex/atelier-knowledge-harness/SKILL.md +60 -0
- package/skills/codex/atelier-knowledge-setup/SKILL.md +72 -0
- package/skills/codex/atelier-practical-judgment/SKILL.md +64 -0
- package/skills/codex/atelier-research-harness/SKILL.md +43 -0
- package/skills/codex/atelier-skill-steward/SKILL.md +53 -0
- package/skills/codex/atelier-trackables/SKILL.md +40 -0
- package/src/architecture/catalog.mjs +355 -0
- package/src/architecture/index.mjs +93 -0
- package/src/boundary/content-rules.mjs +4 -2
- package/src/boundary/delegation-command.mjs +158 -0
- package/src/boundary/delegation.mjs +396 -0
- package/src/boundary/policy.mjs +52 -10
- package/src/build/git.mjs +18 -0
- package/src/build/index.mjs +3 -0
- package/src/build/ledger.mjs +88 -0
- package/src/capabilities/adoption.mjs +381 -0
- package/src/capabilities/evidence.mjs +140 -0
- package/src/capabilities/files.mjs +124 -0
- package/src/capabilities/index.mjs +4 -0
- package/src/capabilities/instructions.mjs +250 -0
- package/src/capabilities/package.mjs +136 -0
- package/src/cli/command-failure.mjs +36 -0
- package/src/cli/execute-command.mjs +16 -2
- package/src/cli/run.mjs +65 -9
- package/src/coauthor/store.mjs +43 -2
- package/src/collaboration/proposals.mjs +189 -0
- package/src/commands/architecture.mjs +27 -0
- package/src/commands/boundary.mjs +3 -0
- package/src/commands/capability.mjs +73 -0
- package/src/commands/enroll.mjs +3 -0
- package/src/commands/harness.mjs +79 -0
- package/src/commands/ingest.mjs +39 -0
- package/src/commands/init.mjs +4 -1
- package/src/commands/inquiry.mjs +66 -0
- package/src/commands/knowledge-semantic.mjs +128 -0
- package/src/commands/knowledge.mjs +119 -0
- package/src/commands/learn.mjs +61 -0
- package/src/commands/obsidian.mjs +754 -63
- package/src/commands/practice.mjs +24 -0
- package/src/commands/setup.mjs +22 -2
- package/src/commands/trackable.mjs +19 -0
- package/src/contracts/corpus.mjs +30 -0
- package/src/coordination/index.mjs +110 -0
- package/src/evidence-navigation/contracts.mjs +60 -0
- package/src/evidence-navigation/evaluate.mjs +69 -0
- package/src/evidence-navigation/generation.mjs +22 -0
- package/src/evidence-navigation/index.mjs +2 -0
- package/src/evidence-navigation/local.mjs +167 -0
- package/src/evidence-navigation/schema.generated.mjs +604 -0
- package/src/evidence-navigation/types.mjs +12 -0
- package/src/export/atelier-export-contract.mjs +35 -8
- package/src/graph/enroll.mjs +248 -0
- package/src/graph/graph.mjs +17 -1
- package/src/graph/knowledge-graph.mjs +58 -8
- package/src/harnesses/contracts.mjs +41 -0
- package/src/harnesses/exchange.mjs +154 -0
- package/src/harnesses/feedback.mjs +16 -0
- package/src/harnesses/history.mjs +37 -0
- package/src/harnesses/index.mjs +4 -0
- package/src/harnesses/store.mjs +29 -0
- package/src/ingestion/contracts.mjs +41 -0
- package/src/ingestion/evaluation.mjs +119 -0
- package/src/ingestion/optional/composition/index.mjs +171 -0
- package/src/ingestion/optional/evaluation/index.mjs +219 -0
- package/src/ingestion/optional/graphify/composition-binding.mjs +60 -0
- package/src/ingestion/optional/graphify/composition_receiving.py +185 -0
- package/src/ingestion/optional/graphify/graphify_supplier.py +933 -0
- package/src/ingestion/optional/graphify/json_bridge.py +163 -0
- package/src/ingestion/optional/graphify/query_receiving.py +209 -0
- package/src/ingestion/optional/index.mjs +9 -0
- package/src/ingestion/optional/jev/bridge.mjs +166 -0
- package/src/ingestion/optional/jev/composition-binding.mjs +116 -0
- package/src/ingestion/optional/jev/judgments.mjs +174 -0
- package/src/ingestion/optional/jev/native-translation.mjs +32 -0
- package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/__init__.py +7 -0
- package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/adapter.py +966 -0
- package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/artifacts.py +101 -0
- package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/projection.py +146 -0
- package/src/ingestion/optional/lightrag/composition-binding.mjs +67 -0
- package/src/ingestion/optional/vanilla/composition-binding.mjs +102 -0
- package/src/ingestion/optional/vanilla/index.mjs +218 -0
- package/src/ingestion/optional/vanilla/native-normalization.mjs +187 -0
- package/src/ingestion/processors.mjs +218 -0
- package/src/ingestion/semantic.mjs +203 -0
- package/src/ingestion/store.mjs +372 -0
- package/src/inquiry/beliefs.mjs +32 -0
- package/src/inquiry/contracts.mjs +23 -0
- package/src/inquiry/index.mjs +5 -0
- package/src/inquiry/ledger.mjs +135 -0
- package/src/inquiry/lenses.mjs +15 -0
- package/src/inquiry/projection.mjs +77 -0
- package/src/inquiry/store.mjs +35 -0
- package/src/intake/read-scope.mjs +12 -0
- package/src/intake/store.mjs +69 -6
- package/src/interaction/index.mjs +91 -0
- package/src/judgment/index.mjs +82 -0
- package/src/judgment/practice-evaluation.mjs +70 -0
- package/src/judgment/practice.mjs +144 -0
- package/src/knowledge/context.mjs +217 -0
- package/src/knowledge/index.mjs +5 -0
- package/src/knowledge/ingestion.mjs +79 -0
- package/src/knowledge/intake.mjs +33 -0
- package/src/knowledge/ledger.mjs +110 -0
- package/src/knowledge/participatory/guidance.mjs +36 -0
- package/src/knowledge/participatory/guided-contribution.mjs +44 -0
- package/src/knowledge/participatory/index.mjs +2 -0
- package/src/knowledge/participatory/installed-workshop.mjs +108 -0
- package/src/knowledge/plan.mjs +67 -0
- package/src/knowledge/projection.mjs +43 -0
- package/src/knowledge/semantic-operation.mjs +567 -0
- package/src/knowledge/sessions.mjs +467 -0
- package/src/knowledge/workspace.mjs +295 -0
- package/src/knowledge-health/assessment.mjs +165 -0
- package/src/knowledge-health/capabilities.mjs +350 -0
- package/src/knowledge-health/context.mjs +62 -0
- package/src/knowledge-health/example.mjs +47 -0
- package/src/knowledge-health/index.mjs +10 -0
- package/src/knowledge-health/owner-join.mjs +88 -0
- package/src/knowledge-health/proof/common.mjs +24 -0
- package/src/knowledge-health/proof/installed-check.mjs +100 -0
- package/src/knowledge-health/proof/native-readback.mjs +37 -0
- package/src/knowledge-health/proof/rehearse.mjs +68 -0
- package/src/knowledge-health/proof/validate-participant.mjs +17 -0
- package/src/knowledge-health/proof/verify-native-capture.mjs +14 -0
- package/src/knowledge-health/proof/workshop-check.mjs +36 -0
- package/src/knowledge-health/rule-identity.mjs +44 -0
- package/src/knowledge-health/workshop-composition.mjs +19 -0
- package/src/knowledge-health/workshop-profile.mjs +176 -0
- package/src/knowledge-health/workshop.mjs +99 -0
- package/src/learning/adapters.mjs +68 -0
- package/src/learning/assistance.mjs +127 -0
- package/src/learning/contracts.mjs +65 -0
- package/src/learning/store.mjs +272 -0
- package/src/personal-workspace/index.mjs +391 -0
- package/src/personal-workspace/selection.mjs +385 -0
- package/src/project/config.mjs +8 -0
- package/src/project/durable-state.mjs +3 -1
- package/src/project/file-class.mjs +1 -1
- package/src/projection/obsidian/edits/apply.mjs +55 -16
- package/src/projection/obsidian/personal-workspace.mjs +436 -0
- package/src/projection/obsidian/proposals/adapter.mjs +47 -8
- package/src/projection/obsidian/proposals/observation.mjs +10 -2
- package/src/projection/obsidian/publication/publisher.mjs +142 -13
- package/src/projection/obsidian/publication/vault-list.mjs +4 -3
- package/src/projection/obsidian/recovery/index.mjs +4 -1
- package/src/projection/obsidian/recovery/store.mjs +160 -7
- package/src/projection/obsidian/selection-ui/contribution.mjs +6 -5
- package/src/readiness/readiness.mjs +10 -3
- package/src/reflection/index.mjs +56 -0
- package/src/runtime/obsidian/app-production-seams.mjs +48 -16
- package/src/runtime/obsidian/app-registration.mjs +175 -28
- package/src/runtime/obsidian/app-restart.mjs +154 -0
- package/src/runtime/obsidian/engine.mjs +163 -20
- package/src/runtime/obsidian/extension-points.mjs +1 -1
- package/src/runtime/obsidian/index.mjs +10 -7
- package/src/runtime/obsidian/launch-plan.mjs +7 -4
- package/src/runtime/obsidian/lifecycle.mjs +92 -12
- package/src/runtime/obsidian/login-item.mjs +332 -0
- package/src/runtime/obsidian/machine-settings.mjs +119 -12
- package/src/runtime/obsidian/opening.mjs +171 -37
- package/src/runtime/obsidian/pipeline.mjs +71 -3
- package/src/runtime/obsidian/plugin-channel.mjs +11 -3
- package/src/runtime/obsidian/plugin-choice.mjs +16 -4
- package/src/runtime/obsidian/plugin-drift.mjs +59 -11
- package/src/runtime/obsidian/plugin-presence.mjs +14 -1
- package/src/runtime/obsidian/process-identity.mjs +20 -10
- package/src/runtime/obsidian/project-views.mjs +282 -0
- package/src/runtime/obsidian/questions.mjs +48 -0
- package/src/runtime/obsidian/release-watch.mjs +56 -0
- package/src/runtime/obsidian/service-main.mjs +99 -16
- package/src/runtime/obsidian/service-manager-production.mjs +61 -0
- package/src/runtime/obsidian/service-managers.mjs +275 -0
- package/src/runtime/obsidian/service-record.mjs +87 -23
- package/src/runtime/obsidian/service.mjs +36 -3
- package/src/runtime/obsidian/startup-adapters.mjs +59 -21
- package/src/runtime/obsidian/unheld-evidence.mjs +84 -0
- package/src/runtime/obsidian/vault-location.mjs +300 -0
- package/src/runtime/obsidian/view-counts.mjs +34 -0
- package/src/server/local-sidecar.mjs +169 -2
- package/src/server/server.mjs +28 -2
- package/src/template-bindings/project.mjs +92 -0
- package/src/templates/profile.mjs +225 -0
- package/src/trackables/domain.mjs +175 -0
- package/src/trackables/store.mjs +114 -0
- package/src/ui/knowledge-page.mjs +1388 -0
- package/src/upgrade/explanation.mjs +1 -1
- package/src/upgrade/template-participant.mjs +171 -0
- package/src/upgrade/transaction.mjs +72 -25
- package/src/upgrade/upgrade.mjs +1 -0
- package/templates/external-project-workspace/pack-lifecycle.json +6 -1
- package/templates/knowledge-workspace/.gitattributes +2 -0
- package/templates/knowledge-workspace/AGENTS.md +27 -0
- package/templates/knowledge-workspace/README.md +44 -0
- package/templates/knowledge-workspace/atelier.project.json +22 -0
- package/templates/knowledge-workspace/gitignore +6 -0
- package/templates/knowledge-workspace/knowledge-plan.json +111 -0
- package/templates/knowledge-workspace/knowledge-plan.schema.json +281 -0
- package/templates/knowledge-workspace/records/forecast.md +22 -0
- package/templates/knowledge-workspace/records/inspection.md +25 -0
- package/templates/knowledge-workspace/records/telescope.md +24 -0
- 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
|
+
}
|
package/src/commands/init.mjs
CHANGED
|
@@ -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
|
+
}
|