@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.
- package/CHANGELOG.md +1005 -0
- package/README.md +149 -9
- 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-obsidian-generation-manifest.v2.schema.json +372 -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/contracts/compat-baseline.json +1 -1
- package/docs/architecture.md +89 -0
- package/docs/assurance-controls.md +4 -3
- 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 +242 -26
- package/docs/obsidian-contract.md +878 -36
- package/docs/obsidian-plugin.md +619 -0
- package/docs/obsidian.md +809 -64
- 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 +56 -1
- 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 +68 -3
- 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/obsidian/contracts/generation-manifest-v2/invalid/case-only-collision.v2.json +160 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/flat-note-path.v2.json +160 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/hidden-folder.v2.json +160 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/identity-in-the-body.v2.json +160 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/link-breaking-name.v2.json +160 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/missing-identity-region.v2.json +156 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/missing-layout-version.v2.json +159 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/note-named-like-a-folder.v2.json +160 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/unknown-region-kind.v2.json +160 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/v1-contract-version.v2.json +161 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/valid/three-notes.v2.json +160 -0
- package/fixtures/obsidian/edits/workspace.json +1 -1
- package/fixtures/obsidian/materialization/expected-full.json +21 -21
- package/fixtures/obsidian/materialization/expected-full.layout-1.json +99 -0
- package/fixtures/obsidian/materialization/expected-scoped.json +7 -7
- package/fixtures/obsidian/materialization/expected-scoped.layout-1.json +39 -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 +64 -6
- package/plugins/obsidian/main.js +444 -0
- package/plugins/obsidian/manifest.json +9 -0
- package/plugins/obsidian/styles.css +22 -0
- 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 +832 -62
- 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 +36 -0
- package/src/coordination/index.mjs +110 -0
- package/src/egress/forbidden-egress.mjs +2 -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/project/private-state.mjs +10 -1
- package/src/projection/obsidian/contracts.mjs +224 -18
- package/src/projection/obsidian/edits/apply.mjs +63 -19
- package/src/projection/obsidian/edits/regions.mjs +137 -42
- package/src/projection/obsidian/materialize/index.mjs +6 -3
- package/src/projection/obsidian/materialize/path-registry.mjs +443 -57
- package/src/projection/obsidian/materialize/prepare-view.mjs +382 -131
- package/src/projection/obsidian/materialize/redaction.mjs +327 -0
- package/src/projection/obsidian/materialize/settings.mjs +113 -34
- package/src/projection/obsidian/personal-workspace.mjs +436 -0
- package/src/projection/obsidian/plugin-bridge/bundle.mjs +50 -0
- package/src/projection/obsidian/plugin-bridge/channel.mjs +174 -0
- package/src/projection/obsidian/plugin-bridge/index.mjs +10 -0
- package/src/projection/obsidian/proposals/adapter.mjs +47 -8
- package/src/projection/obsidian/proposals/observation.mjs +20 -7
- package/src/projection/obsidian/publication/bridge-script.mjs +11 -5
- package/src/projection/obsidian/publication/index.mjs +2 -1
- package/src/projection/obsidian/publication/publisher.mjs +312 -36
- package/src/projection/obsidian/publication/transport.mjs +63 -8
- package/src/projection/obsidian/publication/vault-list.mjs +200 -0
- package/src/projection/obsidian/recovery/index.mjs +4 -1
- package/src/projection/obsidian/recovery/restart.mjs +3 -1
- package/src/projection/obsidian/recovery/store.mjs +168 -8
- package/src/projection/obsidian/selection-ui/contribution.mjs +6 -5
- package/src/projection/obsidian/selection-ui/focus.mjs +14 -7
- package/src/projection/obsidian/selection-ui/selection-state.mjs +2 -2
- package/src/projection/obsidian/selection-ui/selection.mjs +8 -3
- package/src/readiness/readiness.mjs +10 -3
- package/src/reflection/index.mjs +56 -0
- package/src/runtime/obsidian/app-capability.mjs +104 -12
- package/src/runtime/obsidian/app-production-seams.mjs +161 -42
- package/src/runtime/obsidian/app-registration.mjs +313 -0
- package/src/runtime/obsidian/app-restart.mjs +154 -0
- package/src/runtime/obsidian/engine.mjs +288 -29
- package/src/runtime/obsidian/extension-points.mjs +1 -1
- package/src/runtime/obsidian/index.mjs +15 -8
- package/src/runtime/obsidian/launch-plan.mjs +91 -0
- package/src/runtime/obsidian/lifecycle.mjs +193 -22
- package/src/runtime/obsidian/login-item.mjs +332 -0
- package/src/runtime/obsidian/machine-settings.mjs +119 -12
- package/src/runtime/obsidian/opening.mjs +369 -63
- package/src/runtime/obsidian/pending-edits.mjs +10 -0
- package/src/runtime/obsidian/pipeline.mjs +71 -3
- package/src/runtime/obsidian/plugin-channel.mjs +289 -0
- package/src/runtime/obsidian/plugin-choice.mjs +182 -0
- package/src/runtime/obsidian/plugin-drift.mjs +124 -0
- package/src/runtime/obsidian/plugin-presence.mjs +61 -0
- 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 +113 -17
- 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 +105 -5
- package/src/runtime/obsidian/service-server.mjs +50 -12
- package/src/runtime/obsidian/service.mjs +134 -7
- package/src/runtime/obsidian/startup-adapters.mjs +59 -21
- package/src/runtime/obsidian/state-store.mjs +13 -1
- 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 +193 -7
- package/src/server/server.mjs +45 -6
- 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 +2 -1
- 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,355 @@
|
|
|
1
|
+
export function catalogDocument() {
|
|
2
|
+
return {
|
|
3
|
+
"schema": "atelier-architecture-catalog@v1",
|
|
4
|
+
"entries": [
|
|
5
|
+
{
|
|
6
|
+
"id": "inquiry",
|
|
7
|
+
"kind": "responsibility",
|
|
8
|
+
"label": "Inquiry",
|
|
9
|
+
"aliases": [],
|
|
10
|
+
"purpose": "Investigate uncertainty and establish what evidence supports.",
|
|
11
|
+
"implementation": [
|
|
12
|
+
"src/inquiry/index.mjs"
|
|
13
|
+
]
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"id": "knowledge-stewardship",
|
|
17
|
+
"kind": "responsibility",
|
|
18
|
+
"label": "Knowledge Stewardship",
|
|
19
|
+
"aliases": [],
|
|
20
|
+
"purpose": "Curate, govern, connect and maintain knowledge and its operational applicability.",
|
|
21
|
+
"implementation": [
|
|
22
|
+
"src/knowledge/index.mjs",
|
|
23
|
+
"src/intake/store.mjs",
|
|
24
|
+
"src/ingestion/store.mjs",
|
|
25
|
+
"src/knowledge/ingestion.mjs",
|
|
26
|
+
"src/ingestion/semantic.mjs",
|
|
27
|
+
"src/commands/knowledge.mjs",
|
|
28
|
+
"src/commands/knowledge-semantic.mjs",
|
|
29
|
+
"src/knowledge/semantic-operation.mjs",
|
|
30
|
+
"src/knowledge/plan.mjs",
|
|
31
|
+
"src/knowledge/context.mjs",
|
|
32
|
+
"src/knowledge/workspace.mjs",
|
|
33
|
+
"src/knowledge/sessions.mjs"
|
|
34
|
+
]
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"id": "practical-judgment",
|
|
38
|
+
"kind": "responsibility",
|
|
39
|
+
"label": "Practical Judgment",
|
|
40
|
+
"aliases": [
|
|
41
|
+
"Phronesis"
|
|
42
|
+
],
|
|
43
|
+
"purpose": "Discern fitting action, cultivate practice and learn from consequences.",
|
|
44
|
+
"implementation": [
|
|
45
|
+
"src/learning/store.mjs",
|
|
46
|
+
"src/judgment/index.mjs",
|
|
47
|
+
"src/judgment/practice.mjs",
|
|
48
|
+
"src/judgment/practice-evaluation.mjs",
|
|
49
|
+
"src/capabilities/instructions.mjs"
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"id": "creation-delivery",
|
|
54
|
+
"kind": "responsibility",
|
|
55
|
+
"label": "Creation and Delivery",
|
|
56
|
+
"aliases": [],
|
|
57
|
+
"purpose": "Design, implement, verify and deliver intended changes.",
|
|
58
|
+
"implementation": [
|
|
59
|
+
"src/build/index.mjs"
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"id": "capability-stewardship",
|
|
64
|
+
"kind": "responsibility",
|
|
65
|
+
"label": "Capability Stewardship",
|
|
66
|
+
"aliases": [],
|
|
67
|
+
"purpose": "Compose, qualify, package, adopt, exercise and evolve reusable abilities.",
|
|
68
|
+
"implementation": [
|
|
69
|
+
"src/capabilities/index.mjs",
|
|
70
|
+
"src/skills/steward.mjs"
|
|
71
|
+
]
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"id": "reflection",
|
|
75
|
+
"kind": "responsibility",
|
|
76
|
+
"label": "Reflection",
|
|
77
|
+
"aliases": [],
|
|
78
|
+
"purpose": "Form revisable assessments of the person, work, interaction and system.",
|
|
79
|
+
"implementation": [
|
|
80
|
+
"src/reflection/index.mjs"
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"id": "interaction",
|
|
85
|
+
"kind": "responsibility",
|
|
86
|
+
"label": "Interaction",
|
|
87
|
+
"aliases": [],
|
|
88
|
+
"purpose": "Communicate, listen, pace, challenge and repair through the host conversation authority.",
|
|
89
|
+
"implementation": [
|
|
90
|
+
"src/interaction/index.mjs"
|
|
91
|
+
]
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"id": "coordination",
|
|
95
|
+
"kind": "responsibility",
|
|
96
|
+
"label": "Coordination",
|
|
97
|
+
"aliases": [],
|
|
98
|
+
"purpose": "Connect work, ownership, dependencies, delivery, recovery and outcomes.",
|
|
99
|
+
"implementation": [
|
|
100
|
+
"src/coordination/index.mjs",
|
|
101
|
+
"src/build/index.mjs"
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "discovery",
|
|
106
|
+
"kind": "harness",
|
|
107
|
+
"label": "Discovery Harness",
|
|
108
|
+
"aliases": [
|
|
109
|
+
"Discovery Engine"
|
|
110
|
+
],
|
|
111
|
+
"purpose": "Composes the named responsibility through the existing workflow.",
|
|
112
|
+
"implementation": [
|
|
113
|
+
"src/inquiry/index.mjs"
|
|
114
|
+
]
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"id": "research",
|
|
118
|
+
"kind": "harness",
|
|
119
|
+
"label": "Research Harness",
|
|
120
|
+
"aliases": [],
|
|
121
|
+
"purpose": "Composes the named responsibility through the existing workflow.",
|
|
122
|
+
"implementation": [
|
|
123
|
+
"src/inquiry/index.mjs"
|
|
124
|
+
]
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"id": "knowledge",
|
|
128
|
+
"kind": "harness",
|
|
129
|
+
"label": "Knowledge Harness",
|
|
130
|
+
"aliases": [],
|
|
131
|
+
"purpose": "Composes the named responsibility through the existing workflow.",
|
|
132
|
+
"implementation": [
|
|
133
|
+
"src/knowledge/index.mjs"
|
|
134
|
+
]
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"id": "build",
|
|
138
|
+
"kind": "harness",
|
|
139
|
+
"label": "Build Harness",
|
|
140
|
+
"aliases": [],
|
|
141
|
+
"purpose": "Composes the named responsibility through the existing workflow.",
|
|
142
|
+
"implementation": [
|
|
143
|
+
"src/build/index.mjs"
|
|
144
|
+
]
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"id": "capability-harness",
|
|
148
|
+
"kind": "harness",
|
|
149
|
+
"label": "Capability Harness",
|
|
150
|
+
"aliases": [
|
|
151
|
+
"Skills Harness"
|
|
152
|
+
],
|
|
153
|
+
"purpose": "Composes the named responsibility through the existing workflow.",
|
|
154
|
+
"implementation": [
|
|
155
|
+
"src/capabilities/index.mjs"
|
|
156
|
+
]
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"id": "learning",
|
|
160
|
+
"kind": "harness",
|
|
161
|
+
"label": "Learning lifecycle",
|
|
162
|
+
"aliases": [],
|
|
163
|
+
"purpose": "Composes the named responsibility through the existing workflow.",
|
|
164
|
+
"implementation": [
|
|
165
|
+
"src/learning/store.mjs"
|
|
166
|
+
]
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"id": "ingestion",
|
|
170
|
+
"kind": "harness",
|
|
171
|
+
"label": "Ingestion workflow",
|
|
172
|
+
"aliases": [],
|
|
173
|
+
"purpose": "Composes the named responsibility through the existing workflow.",
|
|
174
|
+
"implementation": [
|
|
175
|
+
"src/ingestion/store.mjs"
|
|
176
|
+
]
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"id": "skill-steward",
|
|
180
|
+
"kind": "role",
|
|
181
|
+
"label": "Skill Steward",
|
|
182
|
+
"aliases": [],
|
|
183
|
+
"purpose": "Participation within a responsibility; does not create a separate authority.",
|
|
184
|
+
"implementation": [
|
|
185
|
+
"src/skills/steward.mjs"
|
|
186
|
+
]
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"id": "witness",
|
|
190
|
+
"kind": "role",
|
|
191
|
+
"label": "Witness",
|
|
192
|
+
"aliases": [],
|
|
193
|
+
"purpose": "Participation within a responsibility; does not create a separate authority.",
|
|
194
|
+
"implementation": []
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"id": "companion",
|
|
198
|
+
"kind": "role",
|
|
199
|
+
"label": "Companion",
|
|
200
|
+
"aliases": [],
|
|
201
|
+
"purpose": "Participation within a responsibility; does not create a separate authority.",
|
|
202
|
+
"implementation": []
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"id": "orthogonal-inquiry",
|
|
206
|
+
"kind": "method",
|
|
207
|
+
"label": "Orthogonal inquiry",
|
|
208
|
+
"aliases": [],
|
|
209
|
+
"purpose": "An optional method, selected for its fit to the purpose.",
|
|
210
|
+
"implementation": []
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
"id": "bayesian-assessment",
|
|
214
|
+
"kind": "method",
|
|
215
|
+
"label": "Bayesian assessment",
|
|
216
|
+
"aliases": [],
|
|
217
|
+
"purpose": "An optional method, selected for its fit to the purpose.",
|
|
218
|
+
"implementation": []
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"id": "coaching",
|
|
222
|
+
"kind": "method",
|
|
223
|
+
"label": "Coaching",
|
|
224
|
+
"aliases": [],
|
|
225
|
+
"purpose": "An optional method, selected for its fit to the purpose.",
|
|
226
|
+
"implementation": []
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
"id": "trackable",
|
|
230
|
+
"kind": "record",
|
|
231
|
+
"label": "Trackable",
|
|
232
|
+
"aliases": [],
|
|
233
|
+
"purpose": "Domain composition of definition, instance, occurrences, evidence and qualified views.",
|
|
234
|
+
"implementation": [
|
|
235
|
+
"src/trackables/store.mjs"
|
|
236
|
+
]
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
"id": "adr",
|
|
240
|
+
"kind": "record",
|
|
241
|
+
"label": "Architecture decision record",
|
|
242
|
+
"aliases": [],
|
|
243
|
+
"purpose": "Repository-owned decision identity and history; implementation and evidence currency are distinct.",
|
|
244
|
+
"implementation": []
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"id": "govern-adoption",
|
|
248
|
+
"kind": "capability",
|
|
249
|
+
"label": "Govern capability adoption",
|
|
250
|
+
"aliases": [],
|
|
251
|
+
"purpose": "Independently adopt an exact reusable capability in a repository.",
|
|
252
|
+
"implementation": [
|
|
253
|
+
"src/capabilities/index.mjs"
|
|
254
|
+
]
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
"id": "steward-skill",
|
|
258
|
+
"kind": "resource",
|
|
259
|
+
"label": "Steward operating skill",
|
|
260
|
+
"aliases": [],
|
|
261
|
+
"purpose": "A portable operating resource for the stewardship outcome.",
|
|
262
|
+
"implementation": [
|
|
263
|
+
"skills/codex/atelier-skill-steward/SKILL.md"
|
|
264
|
+
]
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
"id": "codex-repository",
|
|
268
|
+
"kind": "host",
|
|
269
|
+
"label": "Codex repository profile",
|
|
270
|
+
"aliases": [],
|
|
271
|
+
"purpose": "An explicit skill placement profile; actual host loading requires separate evidence.",
|
|
272
|
+
"implementation": [
|
|
273
|
+
"src/capabilities/package.mjs"
|
|
274
|
+
]
|
|
275
|
+
}
|
|
276
|
+
],
|
|
277
|
+
"relations": [
|
|
278
|
+
{
|
|
279
|
+
"from": "discovery",
|
|
280
|
+
"type": "composes",
|
|
281
|
+
"to": "inquiry"
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
"from": "research",
|
|
285
|
+
"type": "composes",
|
|
286
|
+
"to": "inquiry"
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
"from": "knowledge",
|
|
290
|
+
"type": "composes",
|
|
291
|
+
"to": "knowledge-stewardship"
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
"from": "build",
|
|
295
|
+
"type": "composes",
|
|
296
|
+
"to": "creation-delivery"
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
"from": "capability-harness",
|
|
300
|
+
"type": "composes",
|
|
301
|
+
"to": "capability-stewardship"
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
"from": "learning",
|
|
305
|
+
"type": "composes",
|
|
306
|
+
"to": "practical-judgment"
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"from": "ingestion",
|
|
310
|
+
"type": "composes",
|
|
311
|
+
"to": "knowledge-stewardship"
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
"from": "skill-steward",
|
|
315
|
+
"type": "participates",
|
|
316
|
+
"to": "capability-stewardship"
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
"from": "witness",
|
|
320
|
+
"type": "participates",
|
|
321
|
+
"to": "reflection"
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
"from": "companion",
|
|
325
|
+
"type": "participates",
|
|
326
|
+
"to": "interaction"
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
"from": "research",
|
|
330
|
+
"type": "applies",
|
|
331
|
+
"to": "orthogonal-inquiry"
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
"from": "discovery",
|
|
335
|
+
"type": "applies",
|
|
336
|
+
"to": "bayesian-assessment"
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
"from": "govern-adoption",
|
|
340
|
+
"type": "supports",
|
|
341
|
+
"to": "capability-stewardship"
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
"from": "steward-skill",
|
|
345
|
+
"type": "realizes",
|
|
346
|
+
"to": "govern-adoption"
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
"from": "codex-repository",
|
|
350
|
+
"type": "executes",
|
|
351
|
+
"to": "steward-skill"
|
|
352
|
+
}
|
|
353
|
+
]
|
|
354
|
+
}
|
|
355
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { catalogDocument } from './catalog.mjs'
|
|
2
|
+
import fs from 'node:fs'
|
|
3
|
+
import Ajv from 'ajv/dist/2020.js'
|
|
4
|
+
import { boundedLearningValue, learningDigest } from '../learning/contracts.mjs'
|
|
5
|
+
|
|
6
|
+
const schema = JSON.parse(fs.readFileSync(new URL('../../contracts/atelier-architecture.v1.schema.json', import.meta.url)))
|
|
7
|
+
const ajv = new Ajv({ strict: true, allErrors: true })
|
|
8
|
+
const validators = new Map()
|
|
9
|
+
const relationKinds = {
|
|
10
|
+
composes: [['harness'], ['responsibility']],
|
|
11
|
+
participates: [['role'], ['responsibility']],
|
|
12
|
+
realizes: [['resource'], ['capability']],
|
|
13
|
+
supports: [['capability'], ['responsibility']],
|
|
14
|
+
applies: [['harness'], ['method']],
|
|
15
|
+
handles: [['harness'], ['record']],
|
|
16
|
+
executes: [['host'], ['resource']],
|
|
17
|
+
}
|
|
18
|
+
export function validateArchitecture(value, shape = 'catalog') {
|
|
19
|
+
try { boundedLearningValue(value) } catch (error) { return [error.message] }
|
|
20
|
+
if (!['catalog', 'binding'].includes(shape)) return ['unknown architecture shape']
|
|
21
|
+
if (!validators.has(shape)) validators.set(shape, ajv.compile({ $schema: schema.$schema, $defs: schema.$defs, $ref: `#/$defs/${shape}` }))
|
|
22
|
+
const validate = validators.get(shape)
|
|
23
|
+
if (!validate(value)) return validate.errors.map(e => `${e.instancePath || '/'}: ${e.message}`)
|
|
24
|
+
const errors = []
|
|
25
|
+
if (shape === 'catalog') {
|
|
26
|
+
const entries = new Map(), labels = new Map(), relations = new Set()
|
|
27
|
+
for (const entry of value.entries) {
|
|
28
|
+
if (entries.has(entry.id)) errors.push(`duplicate identity: ${entry.id}`)
|
|
29
|
+
entries.set(entry.id, entry)
|
|
30
|
+
for (const label of [entry.id, entry.label, ...entry.aliases]) {
|
|
31
|
+
const key = label.toLowerCase()
|
|
32
|
+
if (labels.has(key) && labels.get(key) !== entry.id) errors.push(`ambiguous alias: ${label}`)
|
|
33
|
+
labels.set(key, entry.id)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
for (const [index, relation] of value.relations.entries()) {
|
|
37
|
+
const [from, to] = relationKinds[relation.type]
|
|
38
|
+
if (!from.includes(entries.get(relation.from)?.kind) || !to.includes(entries.get(relation.to)?.kind)) errors.push(`/relations/${index}: incompatible kinds or missing identity`)
|
|
39
|
+
const key = JSON.stringify(relation)
|
|
40
|
+
if (relations.has(key)) errors.push(`/relations/${index}: duplicate relationship`)
|
|
41
|
+
relations.add(key)
|
|
42
|
+
}
|
|
43
|
+
} else {
|
|
44
|
+
const pointers = new Set()
|
|
45
|
+
for (const field of value.fields) {
|
|
46
|
+
if (pointers.has(field.pointer)) errors.push(`duplicate authored field: ${field.pointer}`)
|
|
47
|
+
pointers.add(field.pointer)
|
|
48
|
+
if (field.classification === 'enforced' && field.consumer === null) errors.push(`${field.pointer}: enforcement requires a named consumer`)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return errors
|
|
52
|
+
}
|
|
53
|
+
function assert(value, shape) {
|
|
54
|
+
const errors = validateArchitecture(value, shape)
|
|
55
|
+
if (errors.length) throw new Error(`invalid architecture ${shape}: ${errors.join('; ')}`)
|
|
56
|
+
return value
|
|
57
|
+
}
|
|
58
|
+
export function responsibilityCatalog() {
|
|
59
|
+
return assert(catalogDocument(), 'catalog')
|
|
60
|
+
}
|
|
61
|
+
export function architectureEntry(name, catalog = responsibilityCatalog()) {
|
|
62
|
+
assert(catalog, 'catalog')
|
|
63
|
+
if (typeof name !== 'string') throw new Error('architecture name required')
|
|
64
|
+
const key = name.toLowerCase()
|
|
65
|
+
return catalog.entries.find(entry => [entry.id, entry.label, ...entry.aliases].some(label => label.toLowerCase() === key)) ?? null
|
|
66
|
+
}
|
|
67
|
+
// Diagnostic resolution never installs a definition or grants operation authority.
|
|
68
|
+
// A consumer declares its exact supported profile/revision/classifications. Missing
|
|
69
|
+
// coverage is visible even for optional behavior; required gaps prevent resolution.
|
|
70
|
+
export function resolveBehaviorBinding({ binding, consumers }) {
|
|
71
|
+
assert(binding, 'binding')
|
|
72
|
+
boundedLearningValue(consumers)
|
|
73
|
+
if (!Array.isArray(consumers) || consumers.length > 128) throw new Error('bounded consumer declarations required')
|
|
74
|
+
const seen = new Set()
|
|
75
|
+
for (const consumer of consumers) {
|
|
76
|
+
if (!consumer || Object.keys(consumer).sort().join(',') !== 'classifications,id,profile,revision' ||
|
|
77
|
+
![consumer.id, consumer.profile, consumer.revision].every(v => typeof v === 'string' && v.length > 0 && v.length <= 256) ||
|
|
78
|
+
!Array.isArray(consumer.classifications) || !consumer.classifications.length ||
|
|
79
|
+
consumer.classifications.some(v => !['enforced', 'guidance', 'presentation', 'rationale'].includes(v))) throw new Error('invalid consumer declaration')
|
|
80
|
+
const key = `${consumer.id}/${consumer.profile}`
|
|
81
|
+
if (seen.has(key)) throw new Error('duplicate consumer profile')
|
|
82
|
+
seen.add(key)
|
|
83
|
+
}
|
|
84
|
+
const diagnostics = []
|
|
85
|
+
for (const field of binding.fields) {
|
|
86
|
+
const c = field.consumer
|
|
87
|
+
if (field.classification === 'rationale' && c === null) continue
|
|
88
|
+
const supported = consumers.some(item => c && item.id === c.id && item.profile === c.profile && item.revision === c.revision && item.classifications.includes(field.classification))
|
|
89
|
+
if (!supported) diagnostics.push({ pointer: field.pointer, code: 'unsupported-consumer', required: field.required, classification: field.classification, consumer: c })
|
|
90
|
+
}
|
|
91
|
+
return { schema: 'atelier-behavior-resolution@v1', definition: structuredClone(binding.definition), bindingDigest: learningDigest(binding),
|
|
92
|
+
resolved: !diagnostics.some(d => d.required), diagnostics, adoption: 'not-established', executionAuthorized: false }
|
|
93
|
+
}
|
|
@@ -62,8 +62,9 @@ export function validateContentRules(rules, { label = 'contentRules' } = {}) {
|
|
|
62
62
|
continue
|
|
63
63
|
}
|
|
64
64
|
for (const key of Object.keys(rule)) {
|
|
65
|
-
if (!['id', 'kind', 'severity', 'pattern', 'paths', 'description'].includes(key)) errors.push(`${at} must not include additional property ${key}`)
|
|
65
|
+
if (!['id', 'kind', 'severity', 'pattern', 'paths', 'description', 'ext'].includes(key)) errors.push(`${at} must not include additional property ${key}`)
|
|
66
66
|
}
|
|
67
|
+
if (rule.ext != null && !isObject(rule.ext)) errors.push(`${at}.ext must be an object`)
|
|
67
68
|
const id = trimmed(rule.id)
|
|
68
69
|
if (!id) errors.push(`${at}.id is required`)
|
|
69
70
|
else if (seen.has(id)) errors.push(`${at}.id duplicates an earlier rule: ${id}`)
|
|
@@ -96,8 +97,9 @@ export function validateContentRuleExceptions(exceptions, rules = DEFAULT_CONTEN
|
|
|
96
97
|
continue
|
|
97
98
|
}
|
|
98
99
|
for (const key of Object.keys(exception)) {
|
|
99
|
-
if (!['rule', 'repo', 'paths', 'reason'].includes(key)) errors.push(`${at} must not include additional property ${key}`)
|
|
100
|
+
if (!['rule', 'repo', 'paths', 'reason', 'ext'].includes(key)) errors.push(`${at} must not include additional property ${key}`)
|
|
100
101
|
}
|
|
102
|
+
if (exception.ext != null && !isObject(exception.ext)) errors.push(`${at}.ext must be an object`)
|
|
101
103
|
const rule = trimmed(exception.rule)
|
|
102
104
|
if (!rule) errors.push(`${at}.rule is required; an exception must name the rule it excepts`)
|
|
103
105
|
else if (ruleIds.size && !ruleIds.has(rule)) errors.push(`${at}.rule "${rule}" is not a declared content rule`)
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import fs from 'node:fs'
|
|
2
|
+
import { loadSigningKey, safeLabel, signDocument, verifyDocument } from '../attestation/sign.mjs'
|
|
3
|
+
import { commandProject, firstString, parseArgs } from '../project/config.mjs'
|
|
4
|
+
import { HOST_OWNER_KEYS_PATH, delegationBindings, draftDelegation, loadOwnerKeysFile, validateDelegation } from './delegation.mjs'
|
|
5
|
+
import { loadBoundaryPolicy, validateBoundaryPolicy } from './policy.mjs'
|
|
6
|
+
|
|
7
|
+
export const DELEGATION_USAGE = `Usage: atelier boundary delegation <draft|sign|verify>
|
|
8
|
+
|
|
9
|
+
draft --id ID --owner ACTOR --operator ACTOR --repos A[,B] --operations pre-commit[,boundary-check]
|
|
10
|
+
--expires RFC3339 [--not-before RFC3339] [--out FILE] [--project-config FILE]
|
|
11
|
+
Write an unsigned delegation. It binds the current boundary policy, the
|
|
12
|
+
managed repository set and each listed repository's root commit.
|
|
13
|
+
|
|
14
|
+
sign <delegation.json> --key FILE [--out FILE] [--project-config FILE]
|
|
15
|
+
The OWNER signs with their own private key file (from attestation keygen).
|
|
16
|
+
The project is required: sign recomputes the bindings from it, refuses a
|
|
17
|
+
draft that does not match, and prints what is being authorized.
|
|
18
|
+
|
|
19
|
+
verify <delegation.json> [--owner-keys FILE] [--json]
|
|
20
|
+
Report the signature against the host owner-keys file
|
|
21
|
+
(${HOST_OWNER_KEYS_PATH}), or against FILE to inspect a candidate host
|
|
22
|
+
file, together with that file's trust result and revocation. This is a
|
|
23
|
+
diagnostic; boundary check decides whether a delegation applies.
|
|
24
|
+
|
|
25
|
+
Exit codes: 0 success or valid, 1 invalid, 2 usage or input error.`
|
|
26
|
+
|
|
27
|
+
function fail(message) {
|
|
28
|
+
console.error(message)
|
|
29
|
+
process.exit(2)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const list = (value) => (typeof value === 'string' ? value.split(',').map((item) => item.trim()).filter(Boolean) : [])
|
|
33
|
+
|
|
34
|
+
function readJsonFile(file, label) {
|
|
35
|
+
try {
|
|
36
|
+
return JSON.parse(fs.readFileSync(file, 'utf8'))
|
|
37
|
+
} catch {
|
|
38
|
+
fail(`cannot read ${label} JSON: ${file}`)
|
|
39
|
+
}
|
|
40
|
+
return null
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function writeOutput(out, value) {
|
|
44
|
+
const text = `${JSON.stringify(value, null, 2)}\n`
|
|
45
|
+
if (!out) return process.stdout.write(text)
|
|
46
|
+
try {
|
|
47
|
+
fs.writeFileSync(out, text, { flag: 'wx' })
|
|
48
|
+
} catch {
|
|
49
|
+
fail(`refusing to write ${out}: it exists or cannot be created`)
|
|
50
|
+
}
|
|
51
|
+
return console.error(`written to ${out}`)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function projectAndPolicy(argv) {
|
|
55
|
+
const project = commandProject({ argv })
|
|
56
|
+
const loaded = loadBoundaryPolicy(project)
|
|
57
|
+
if (!loaded.ok) fail(loaded.errors.join('\n'))
|
|
58
|
+
// Never draft or sign against a policy the check itself would reject.
|
|
59
|
+
const invalid = validateBoundaryPolicy(loaded.policy, project)
|
|
60
|
+
if (invalid.length) fail(`the boundary policy is invalid:\n${invalid.join('\n')}`)
|
|
61
|
+
return { project, policy: loaded.policy }
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function runDraft(args, argv) {
|
|
65
|
+
const { project, policy } = projectAndPolicy(argv)
|
|
66
|
+
const expiresAt = firstString(args.expires)
|
|
67
|
+
if (!expiresAt) fail(`delegation draft requires --expires\n\n${DELEGATION_USAGE}`)
|
|
68
|
+
const draft = draftDelegation({
|
|
69
|
+
policy,
|
|
70
|
+
project,
|
|
71
|
+
id: firstString(args.id),
|
|
72
|
+
owner: firstString(args.owner),
|
|
73
|
+
operator: firstString(args.operator),
|
|
74
|
+
repos: list(args.repos),
|
|
75
|
+
operations: list(args.operations),
|
|
76
|
+
notBefore: firstString(args['not-before']) ?? new Date().toISOString().replace(/\.\d{3}Z$/, 'Z'),
|
|
77
|
+
expiresAt,
|
|
78
|
+
})
|
|
79
|
+
if (!draft.ok && !draft.errors.every((message) => /repoRoots/.test(message))) fail(draft.errors.join('\n'))
|
|
80
|
+
if (Object.values(draft.delegation.repoRoots).some((root) => !root)) fail('every listed repository needs at least one commit before it can be delegated')
|
|
81
|
+
if (!draft.ok) fail(draft.errors.join('\n'))
|
|
82
|
+
writeOutput(firstString(args.out), draft.delegation)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function runSign(args, argv) {
|
|
86
|
+
const [file] = args._
|
|
87
|
+
if (!file) fail(`delegation sign requires a delegation file\n\n${DELEGATION_USAGE}`)
|
|
88
|
+
const keyPath = firstString(args.key)
|
|
89
|
+
if (!keyPath) fail(`delegation sign requires --key FILE (the owner's own private key)\n\n${DELEGATION_USAGE}`)
|
|
90
|
+
const doc = readJsonFile(file, 'delegation')
|
|
91
|
+
if (doc?.signature !== null) fail('delegation sign requires an unsigned delegation (signature: null)')
|
|
92
|
+
const { project, policy } = projectAndPolicy(argv)
|
|
93
|
+
const shapeErrors = validateDelegation({ ...doc, signature: { algorithm: 'ed25519', keyId: 'unsigned', value: 'unsigned' } }, policy)
|
|
94
|
+
if (shapeErrors.length) fail(shapeErrors.join('\n'))
|
|
95
|
+
// The owner signs what the current project binds, never an opaque digest.
|
|
96
|
+
const expected = delegationBindings({ policy, project, repos: doc.repos })
|
|
97
|
+
if (doc.policyDigest !== expected.policyDigest) fail('the draft does not bind the current boundary policy; draft it again from this project')
|
|
98
|
+
if (doc.repos.some((name) => !expected.repoRoots[name] || doc.repoRoots[name] !== expected.repoRoots[name])) {
|
|
99
|
+
fail('the draft does not bind these repositories\' root commits; draft it again from this project')
|
|
100
|
+
}
|
|
101
|
+
// Every value is printed through safeLabel: ids come from operator-editable files.
|
|
102
|
+
const operatorActor = policy.actors[doc.operator] ?? {}
|
|
103
|
+
const label = (value) => safeLabel(value, 160)
|
|
104
|
+
console.error([
|
|
105
|
+
`Authorizing delegation ${label(doc.id)}:`,
|
|
106
|
+
` operator ${label(doc.operator)} may pass the actor check owned by ${label(doc.owner)}`,
|
|
107
|
+
` the operator is recognised by githubLogin ${label(operatorActor.githubLogin ?? '(none)')} and gitEmails ${(operatorActor.gitEmails ?? []).map((email) => label(email)).join(', ') || '(none)'}`,
|
|
108
|
+
...doc.repos.map((name) => ` repository ${label(name)} with root commit ${label(doc.repoRoots[name])}`),
|
|
109
|
+
` operations: ${doc.operations.map((op) => label(op)).join(', ')}`,
|
|
110
|
+
` from ${label(new Date(Date.parse(doc.notBefore)).toISOString())} until ${label(new Date(Date.parse(doc.expiresAt)).toISOString())}`,
|
|
111
|
+
` while the boundary policy and repository set stay ${label(doc.policyDigest)}`,
|
|
112
|
+
].join('\n'))
|
|
113
|
+
let signed
|
|
114
|
+
try {
|
|
115
|
+
// An explicit key file only: the environment and working-directory fallbacks are not used for delegations.
|
|
116
|
+
const key = loadSigningKey({ keyPath, env: {}, cwd: '/nonexistent' })
|
|
117
|
+
if (key.algorithm !== 'ed25519') fail('delegations are signed with ed25519 keys')
|
|
118
|
+
signed = signDocument(doc, { privateKey: key.privateKeyJwk, keyId: key.keyId, algorithm: key.algorithm })
|
|
119
|
+
} catch (error) {
|
|
120
|
+
fail(error.message)
|
|
121
|
+
}
|
|
122
|
+
writeOutput(firstString(args.out), signed)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function runVerify(args) {
|
|
126
|
+
const [file] = args._
|
|
127
|
+
if (!file) fail(`delegation verify requires a delegation file\n\n${DELEGATION_USAGE}`)
|
|
128
|
+
const doc = readJsonFile(file, 'delegation')
|
|
129
|
+
const keysFile = firstString(args['owner-keys']) ?? HOST_OWNER_KEYS_PATH
|
|
130
|
+
const ownerKeys = loadOwnerKeysFile(keysFile)
|
|
131
|
+
const report = { ownerKeysFile: keysFile, hostTrust: ownerKeys.ok ? { ok: true } : { ok: false, reason: ownerKeys.reason }, signatureValid: false, revoked: false, reasons: [] }
|
|
132
|
+
if (ownerKeys.ok) {
|
|
133
|
+
const key = ownerKeys.keys.find((item) => item.actorId === doc?.owner && item.keyId === doc?.signature?.keyId)
|
|
134
|
+
if (key) {
|
|
135
|
+
const checked = verifyDocument(doc, { publicKey: key })
|
|
136
|
+
report.signatureValid = checked.valid
|
|
137
|
+
report.reasons.push(...checked.reasons)
|
|
138
|
+
report.keyId = key.keyId
|
|
139
|
+
report.owner = key.actorId
|
|
140
|
+
} else report.reasons.push({ code: 'delegation-owner-key-missing', message: 'no host key for this owner and keyId' })
|
|
141
|
+
report.revoked = ownerKeys.revoked.has(doc?.id)
|
|
142
|
+
} else report.reasons.push({ code: ownerKeys.reason, message: ownerKeys.errors.join('; ') })
|
|
143
|
+
report.valid = report.hostTrust.ok && report.signatureValid && !report.revoked
|
|
144
|
+
if (args.json) console.log(JSON.stringify(report, null, 2))
|
|
145
|
+
else console.log(report.valid ? `signature valid for ${report.owner} key ${report.keyId}; scope, time and bindings are decided by boundary check` : `invalid: ${report.reasons.map((item) => item.code).join(', ') || (report.revoked ? 'delegation-revoked' : 'unknown')}`)
|
|
146
|
+
process.exit(report.valid ? 0 : 1)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function runBoundaryDelegationCommand(argv = process.argv.slice(2)) {
|
|
150
|
+
const args = parseArgs(argv)
|
|
151
|
+
const [subcommand, ...rest] = args._
|
|
152
|
+
const sub = { ...args, _: rest }
|
|
153
|
+
if (args.help || args.h) return console.log(DELEGATION_USAGE)
|
|
154
|
+
if (subcommand === 'draft') return runDraft(sub, argv)
|
|
155
|
+
if (subcommand === 'sign') return runSign(sub, argv)
|
|
156
|
+
if (subcommand === 'verify') return runVerify(sub)
|
|
157
|
+
return fail(DELEGATION_USAGE)
|
|
158
|
+
}
|