@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
|
@@ -3,8 +3,11 @@ import { refuse } from '../../../runtime/obsidian/errors.mjs'
|
|
|
3
3
|
|
|
4
4
|
// Focus: the full vault stays on disk and the native Graph view is filtered
|
|
5
5
|
// with a "Search files" query derived from the selected set. The query names
|
|
6
|
-
// every selected note by its exact vault-relative path,
|
|
7
|
-
//
|
|
6
|
+
// every selected note by its exact vault-relative path, as an anchored regular
|
|
7
|
+
// expression in the app's `path:/…/` search, joined with OR: a path search
|
|
8
|
+
// matches substrings, and with titles as names one path can lie inside
|
|
9
|
+
// another (`r/a/Plan.md` inside `qr/a/Plan.md`), so only an anchored term
|
|
10
|
+
// matches exactly one note.
|
|
8
11
|
//
|
|
9
12
|
// Nothing here writes a file. The query and the core-Bookmark payload are
|
|
10
13
|
// values a person, an agent or the acceptance procedure applies in the app;
|
|
@@ -13,7 +16,9 @@ import { refuse } from '../../../runtime/obsidian/errors.mjs'
|
|
|
13
16
|
// Atelier. Whether the installed app applies the query as built is an
|
|
14
17
|
// acceptance question (AP-02), not something this module can answer.
|
|
15
18
|
|
|
16
|
-
export const FOCUS_QUERY_VERSION = 'obsidian-graph-search-paths/
|
|
19
|
+
export const FOCUS_QUERY_VERSION = 'obsidian-graph-search-paths/v2'
|
|
20
|
+
// Versions a persisted focus may carry and still be read: v1 quoted each path as a substring term.
|
|
21
|
+
export const FOCUS_QUERY_VERSIONS_READ = Object.freeze(['obsidian-graph-search-paths/v1', FOCUS_QUERY_VERSION])
|
|
17
22
|
export const FOCUS_BOOKMARK_TYPE = 'graph'
|
|
18
23
|
// The files under .obsidian/ the app's UI owns. Atelier reads none of them
|
|
19
24
|
// and writes none of them; a focus is applied through the app, never by
|
|
@@ -21,14 +26,16 @@ export const FOCUS_BOOKMARK_TYPE = 'graph'
|
|
|
21
26
|
export const UI_OWNED_SETTINGS_FILES = Object.freeze(['workspace.json', 'graph.json', 'bookmarks.json'])
|
|
22
27
|
export const MAX_FOCUS_PATHS = 100000
|
|
23
28
|
|
|
24
|
-
//
|
|
25
|
-
//
|
|
29
|
+
// An anchored regular-expression term: every metacharacter and the `/`
|
|
30
|
+
// delimiter escaped, a space and a double quote written as hexadecimal escapes
|
|
31
|
+
// so the search box neither splits nor quotes the term; anything that is not
|
|
32
|
+
// printable text cannot be typed into a search box and refuses.
|
|
26
33
|
export const FOCUS_QUERY_PRIMITIVES = Object.freeze({
|
|
27
34
|
escape(value) {
|
|
28
|
-
return value.replace(/[
|
|
35
|
+
return value.replace(/[\\^$.*+?()[\]{}|/]/g, (character) => `\\${character}`).replace(/ /g, '\\x20').replace(/"/g, '\\x22')
|
|
29
36
|
},
|
|
30
37
|
term(path) {
|
|
31
|
-
return `path
|
|
38
|
+
return `path:/^${path}$/`
|
|
32
39
|
},
|
|
33
40
|
join(terms) {
|
|
34
41
|
return terms.join(' OR ')
|
|
@@ -6,7 +6,7 @@ import { refuse } from '../../../runtime/obsidian/errors.mjs'
|
|
|
6
6
|
import { assertOutsideRepositories } from '../../../runtime/obsidian/machine-settings.mjs'
|
|
7
7
|
import { SCOPE_MODES, assertObsidianContract } from '../contracts.mjs'
|
|
8
8
|
import { SETTINGS_ROOT } from '../materialize/settings.mjs'
|
|
9
|
-
import { FOCUS_BOOKMARK_TYPE,
|
|
9
|
+
import { FOCUS_BOOKMARK_TYPE, FOCUS_QUERY_VERSIONS_READ } from './focus.mjs'
|
|
10
10
|
import { SELECTION_SCHEMA } from './selection.mjs'
|
|
11
11
|
|
|
12
12
|
// Where a selector is kept: Atelier's own private state of the workspace,
|
|
@@ -38,7 +38,7 @@ export function validateSelectionState(document, workspaceId) {
|
|
|
38
38
|
assertObsidianContract('scope', { schema: 'atelier-obsidian-scope/v1', scopeId: document.scopeId, mode: document.mode, selector: document.selector, ...(document.expansion === null ? {} : { expansion: document.expansion }) })
|
|
39
39
|
if (document.focus !== null) {
|
|
40
40
|
closedObject(document.focus, { required: ['version', 'query', 'queryDigest', 'paths', 'bookmark'] }, code, 'the persisted focus')
|
|
41
|
-
if (document.focus.version
|
|
41
|
+
if (!FOCUS_QUERY_VERSIONS_READ.includes(document.focus.version) || typeof document.focus.query !== 'string' || document.focus.query === '' || !DIGEST.test(String(document.focus.queryDigest))) refuse(code, 'the persisted focus is malformed')
|
|
42
42
|
if (!Array.isArray(document.focus.paths) || document.focus.paths.length === 0 || document.focus.paths.some((item) => typeof item !== 'string')) refuse(code, 'the persisted focus names no path')
|
|
43
43
|
closedObject(document.focus.bookmark, { required: ['type', 'title', 'options'] }, code, 'the persisted bookmark payload')
|
|
44
44
|
if (document.focus.bookmark.type !== FOCUS_BOOKMARK_TYPE) refuse(code, 'the persisted bookmark payload is not a graph bookmark')
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { refuse } from '../../../runtime/obsidian/errors.mjs'
|
|
2
2
|
import { EXPANSION_DIRECTIONS, EXPANSION_ORDERS, MAX_EXPANSION_DEPTH, ObsidianContractRefusal, SCOPE_MODES, assertObsidianContract, selectScope } from '../contracts.mjs'
|
|
3
|
-
import {
|
|
3
|
+
import { allocateViewPaths, viewsOfRegistry } from '../materialize/path-registry.mjs'
|
|
4
4
|
import { buildFocusQuery, focusBookmarkPayload } from './focus.mjs'
|
|
5
5
|
|
|
6
6
|
// Selection: a requested scope (full, scoped or focus, with an optional
|
|
@@ -78,9 +78,14 @@ export function resolveSelection({ canonicalSnapshot, profile, scope, allowEmpty
|
|
|
78
78
|
|
|
79
79
|
const workspaceId = typeof profile?.workspaceId === 'string' ? profile.workspaceId : 'ws-unnamed'
|
|
80
80
|
const nodeById = new Map(canonicalSnapshot.nodes.map((node) => [node.id, node]))
|
|
81
|
-
|
|
81
|
+
// Paths are allocated among the view's own notes, as a prepared view allocates them, seeded from the view's last
|
|
82
|
+
// allocation in the registry: a name that collides takes a qualifier, so which name a note gets depends on the notes
|
|
83
|
+
// of the view.
|
|
82
84
|
let pathOf
|
|
83
|
-
try {
|
|
85
|
+
try {
|
|
86
|
+
const section = viewsOfRegistry(pathRegistry, workspaceId)[document.scopeId] ?? null
|
|
87
|
+
;({ pathOf } = allocateViewPaths({ published: section, nodes: result.vaultNodes.map((id) => nodeById.get(id)) }))
|
|
88
|
+
} catch (error) { contractRefusalToTyped(error) }
|
|
84
89
|
const notePaths = Object.fromEntries(result.nodes.map((id) => [id, pathOf(nodeById.get(id).repo, id)]))
|
|
85
90
|
|
|
86
91
|
let focus = null
|
|
@@ -123,6 +123,13 @@ function buildPackageReadiness({
|
|
|
123
123
|
}
|
|
124
124
|
}
|
|
125
125
|
|
|
126
|
+
// Paths in the written artifact are relative to the project config directory
|
|
127
|
+
// in POSIX form, so `readiness --check` does not depend on where the project
|
|
128
|
+
// is checked out and the artifact names no machine-specific directory.
|
|
129
|
+
function configRelative(project, file) {
|
|
130
|
+
return path.relative(project.configDir, file).split(path.sep).join('/') || '.'
|
|
131
|
+
}
|
|
132
|
+
|
|
126
133
|
function buildProjectReadiness({ project, graph = null } = {}) {
|
|
127
134
|
const loadedGraph = graph || (fs.existsSync(project.graphPath) ? readJson(project.graphPath) : null)
|
|
128
135
|
const projectionEntry = path.join(project.outputRoot, 'index.html')
|
|
@@ -142,14 +149,14 @@ function buildProjectReadiness({ project, graph = null } = {}) {
|
|
|
142
149
|
blockers,
|
|
143
150
|
warnings,
|
|
144
151
|
graph: {
|
|
145
|
-
path: project.graphPath,
|
|
152
|
+
path: configRelative(project, project.graphPath),
|
|
146
153
|
nodes: loadedGraph?.counts?.nodes ?? loadedGraph?.nodes?.length ?? 0,
|
|
147
154
|
edges: loadedGraph?.counts?.edges ?? loadedGraph?.edges?.length ?? 0,
|
|
148
155
|
diagnostics: loadedGraph?.counts?.diagnostics ?? loadedGraph?.diagnostics?.length ?? 0,
|
|
149
156
|
},
|
|
150
157
|
projection: {
|
|
151
|
-
outputRoot: project.outputRoot,
|
|
152
|
-
entry: projectionEntry,
|
|
158
|
+
outputRoot: configRelative(project, project.outputRoot),
|
|
159
|
+
entry: configRelative(project, projectionEntry),
|
|
153
160
|
},
|
|
154
161
|
support: {
|
|
155
162
|
telemetry: 'none',
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import fs from 'node:fs'
|
|
2
|
+
import Ajv from 'ajv/dist/2020.js'
|
|
3
|
+
import addFormats from 'ajv-formats'
|
|
4
|
+
import { boundedLearningValue, learningDigest as digest } from '../learning/contracts.mjs'
|
|
5
|
+
const schema = JSON.parse(fs.readFileSync(new URL('../../contracts/atelier-interaction.v1.schema.json', import.meta.url)))
|
|
6
|
+
const ajv = new Ajv({ strict: true, allErrors: true }); addFormats(ajv)
|
|
7
|
+
const validators = new Map()
|
|
8
|
+
export function validateInteraction(value, shape) {
|
|
9
|
+
try { boundedLearningValue(value) } catch (error) { return [error.message] }
|
|
10
|
+
if (!['observation', 'assessment', 'act', 'policy'].includes(shape)) return ['unsupported interaction shape']
|
|
11
|
+
if (!validators.has(shape)) validators.set(shape, ajv.compile({ $schema: schema.$schema, $defs: schema.$defs, $ref: `#/$defs/${shape}` }))
|
|
12
|
+
const validate = validators.get(shape)
|
|
13
|
+
return validate(value) ? [] : validate.errors.map(e => `${e.instancePath || '/'}: ${e.message}`)
|
|
14
|
+
}
|
|
15
|
+
export function assertInteraction(value, shape) {
|
|
16
|
+
const errors = validateInteraction(value, shape)
|
|
17
|
+
if (errors.length) throw new Error(`invalid ${shape}: ${errors.join('; ')}`)
|
|
18
|
+
return value
|
|
19
|
+
}
|
|
20
|
+
export function reflectionReference(record) {
|
|
21
|
+
const kind = record?.schema === 'atelier-reflection-observation@v1' ? 'observation' : 'assessment'
|
|
22
|
+
assertInteraction(record, kind)
|
|
23
|
+
return { kind, id: record.id, digest: digest(record) }
|
|
24
|
+
}
|
|
25
|
+
export function qualifyReflection({ assessment, observations, scope, purpose }) {
|
|
26
|
+
assertInteraction(assessment, 'assessment'); boundedLearningValue(observations)
|
|
27
|
+
if (!Array.isArray(observations) || observations.length > 128) throw new Error('bounded observations required')
|
|
28
|
+
for (const o of observations) assertInteraction(o, 'observation')
|
|
29
|
+
if (new Set(observations.map(o => o.id)).size !== observations.length) throw new Error('ambiguous observation identity')
|
|
30
|
+
const reasons = []
|
|
31
|
+
if (assessment.scope !== scope || assessment.purpose !== purpose || assessment.status !== 'active') reasons.push('assessment-outside-active-purpose')
|
|
32
|
+
if (!assessment.evidence.length) reasons.push('assessment-without-evidence')
|
|
33
|
+
if (new Set(assessment.evidence.map(e => `${e.kind}:${e.id}`)).size !== assessment.evidence.length) reasons.push('duplicate-evidence')
|
|
34
|
+
const admitted = []
|
|
35
|
+
for (const pin of assessment.evidence) {
|
|
36
|
+
const o = observations.find(o => o.id === pin.id)
|
|
37
|
+
if (pin.kind !== 'observation' || !o || digest(o) !== pin.digest || o.status !== 'active' || o.scope !== scope || o.purpose !== purpose) reasons.push(`evidence-stale-or-outside-purpose:${pin.id}`)
|
|
38
|
+
else admitted.push(o)
|
|
39
|
+
}
|
|
40
|
+
if (assessment.claimKind === 'independent-capacity' && (assessment.subject.kind !== 'person' || admitted.some(o => o.assistance !== 'independent' || o.subject.kind !== 'person' || o.subject.id !== assessment.subject.id))) reasons.push('independent-capacity-not-supported-by-admitted-evidence')
|
|
41
|
+
if (assessment.claimKind === 'system-friction' && assessment.subject.kind === 'person') reasons.push('system-friction-cannot-be-a-personal-capacity-claim')
|
|
42
|
+
return { reference: reflectionReference(assessment), current: reasons.length === 0, reasons,
|
|
43
|
+
uncertainty: assessment.uncertainty, limits: assessment.limits, semanticTruthVerified: false, observationAuthorityTransferred: false }
|
|
44
|
+
}
|
|
45
|
+
// The caller supplies an attributed judgment. This function qualifies its exact
|
|
46
|
+
// evidence, never invents a developmental score or silently persists a profile.
|
|
47
|
+
export function prepareReflectiveAct({ assessment, observations, act }) {
|
|
48
|
+
assertInteraction(act, 'act')
|
|
49
|
+
const result = qualifyReflection({ assessment, observations, scope: act.scope, purpose: act.purpose })
|
|
50
|
+
if (!result.current) throw new Error(`reflection unavailable: ${result.reasons.join('; ')}`)
|
|
51
|
+
if (act.origin !== 'witness' || !['reflective', 'coaching'].includes(act.mode)) throw new Error('reflective contribution requires Witness origin and declared mode')
|
|
52
|
+
const required = [reflectionReference(assessment), ...assessment.evidence]
|
|
53
|
+
for (const pin of required) if (!act.dependencies.some(p => digest(p) === digest(pin))) throw new Error('reflective act must pin its assessment and evidence')
|
|
54
|
+
if (act.mode === 'coaching' && !act.dependencies.some(p => p.kind === 'intention')) throw new Error('coaching requires a current chosen intention')
|
|
55
|
+
return { act: structuredClone(act), assessment: result, deliverable: false, executionAuthorized: false }
|
|
56
|
+
}
|
|
@@ -13,6 +13,17 @@ import { refuse } from './errors.mjs'
|
|
|
13
13
|
// is true when the command-line tool answered that no vault is open. The
|
|
14
14
|
// production probe is a separate module that only the real command-line
|
|
15
15
|
// entries load; every test passes its own.
|
|
16
|
+
//
|
|
17
|
+
// A version can also come from Atelier's plugin: a plugin that holds a live
|
|
18
|
+
// lease runs inside the app and reports `apiVersion`, the version of exactly
|
|
19
|
+
// that app. It stands in only where the command-line tool gives no version:
|
|
20
|
+
// the tool reaches the app a publication coordinates with, which may be
|
|
21
|
+
// another app holding the same vault, so its own answer decides wherever it
|
|
22
|
+
// gives one. Such an observation carries `versionSource: 'plugin'` and
|
|
23
|
+
// qualifies with reason `plugin-reported`; whether the app is installed where
|
|
24
|
+
// Atelier looks, with its command-line tool, is still the probe's answer, and
|
|
25
|
+
// so is whether it runs: a lease outlives a crashed app by up to its lease
|
|
26
|
+
// time, so while the process table shows no app, a report stands for none.
|
|
16
27
|
|
|
17
28
|
// The publication protocol sets the view's undocumented `lastSavedData` field.
|
|
18
29
|
// 1.13.7 is the only app version that protocol was proven on, so it is the
|
|
@@ -64,6 +75,13 @@ export function meetsMinimumAppVersion(version, floor = MINIMUM_APP_VERSION) {
|
|
|
64
75
|
// command, `version` too, with this line (observed on 1.13.7, on either output
|
|
65
76
|
// stream and with either exit status). It is not a version.
|
|
66
77
|
const NO_VAULT_OPEN = /^vault not found\.?$/i
|
|
78
|
+
// While a vault window is still loading, right after the app started or opened
|
|
79
|
+
// a vault, the tool answers a command with this line instead (observed on
|
|
80
|
+
// 1.13.7). The app is not up yet: this is not a version either.
|
|
81
|
+
const COMMAND_NOT_READY = /^error: command "[^"]*" not found\b/i
|
|
82
|
+
// With its command line turned off (the default of a new installation: Settings > General > Advanced), the app
|
|
83
|
+
// answers every command but a URL with this line (1.13.7). It runs and is reachable only by URL: not a version.
|
|
84
|
+
const CLI_TURNED_OFF = /^command line interface is not enabled\b/i
|
|
67
85
|
|
|
68
86
|
// Pure. What one `version` call of the command-line tool answered:
|
|
69
87
|
// { version, noVaultOpen }. `exited` is false for a call that failed or exited
|
|
@@ -71,10 +89,47 @@ const NO_VAULT_OPEN = /^vault not found\.?$/i
|
|
|
71
89
|
export function readVersionAnswer({ stdout = '', stderr = '', exited = true } = {}) {
|
|
72
90
|
const lines = [stdout, stderr].flatMap((text) => (typeof text === 'string' ? text.split('\n') : [])).map((line) => line.trim())
|
|
73
91
|
if (lines.some((line) => NO_VAULT_OPEN.test(line))) return { version: null, noVaultOpen: true }
|
|
92
|
+
if (lines.some((line) => CLI_TURNED_OFF.test(line))) return { version: null, noVaultOpen: false, cliOff: true }
|
|
93
|
+
if (lines.some((line) => COMMAND_NOT_READY.test(line))) return { version: null, noVaultOpen: false }
|
|
74
94
|
const text = typeof stdout === 'string' ? stdout.trim() : ''
|
|
75
95
|
return { version: exited && text !== '' ? text : null, noVaultOpen: false }
|
|
76
96
|
}
|
|
77
97
|
|
|
98
|
+
// Pure. Whether a reply of the command-line tool came from the app itself: a
|
|
99
|
+
// version, or one of the lines the app answers with (no vault open, a command
|
|
100
|
+
// not ready yet, the command line turned off). The tool's own message while it
|
|
101
|
+
// cannot reach the app ("The CLI is unable to find Obsidian …") is not one, and
|
|
102
|
+
// nor is silence: the app is not up.
|
|
103
|
+
export function appAnswered({ stdout = '', stderr = '', exited = true } = {}) {
|
|
104
|
+
const lines = [stdout, stderr].flatMap((text) => (typeof text === 'string' ? text.split('\n') : [])).map((line) => line.trim())
|
|
105
|
+
if (lines.some((line) => NO_VAULT_OPEN.test(line) || CLI_TURNED_OFF.test(line) || COMMAND_NOT_READY.test(line))) return true
|
|
106
|
+
const text = typeof stdout === 'string' ? stdout.trim() : ''
|
|
107
|
+
return exited && parseAppVersion(text) !== null
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Pure. What one `eval` call of the command-line tool answered:
|
|
111
|
+
// { answered: true, value } with the value the script returned, parsed as
|
|
112
|
+
// JSON, or { answered: false, reason }. The tool prints a returned string as
|
|
113
|
+
// it is after `=> `; a string that is itself JSON text is parsed once more.
|
|
114
|
+
// `reason` is `no-vault-open` for the answer the app gives with no vault open,
|
|
115
|
+
// `cli-failed` for a call that failed, and `no-value` otherwise.
|
|
116
|
+
export function readEvalAnswer({ stdout = '', stderr = '', failed = false } = {}) {
|
|
117
|
+
const lines = [stdout, stderr].flatMap((text) => (typeof text === 'string' ? text.split('\n') : [])).map((line) => line.trim())
|
|
118
|
+
if (lines.some((line) => NO_VAULT_OPEN.test(line))) return { answered: false, reason: 'no-vault-open' }
|
|
119
|
+
if (lines.some((line) => CLI_TURNED_OFF.test(line))) return { answered: false, reason: 'cli-turned-off' }
|
|
120
|
+
if (failed) return { answered: false, reason: 'cli-failed' }
|
|
121
|
+
const text = typeof stdout === 'string' ? stdout : ''
|
|
122
|
+
const start = text.indexOf('=> ')
|
|
123
|
+
if (start < 0) return { answered: false, reason: 'no-value' }
|
|
124
|
+
try {
|
|
125
|
+
let value = JSON.parse(text.slice(start + 3))
|
|
126
|
+
if (typeof value === 'string') { try { value = JSON.parse(value) } catch { /* a plain string */ } }
|
|
127
|
+
return { answered: true, value }
|
|
128
|
+
} catch {
|
|
129
|
+
return { answered: false, reason: 'no-value' }
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
78
133
|
// Pure. `requireVersion: false` lets an installed app that is positively not
|
|
79
134
|
// running pass without a version: nothing is published through an app that
|
|
80
135
|
// does not run, and the version is asked for again once it does. An app whose
|
|
@@ -83,7 +138,18 @@ export function readVersionAnswer({ stdout = '', stderr = '', exited = true } =
|
|
|
83
138
|
export function qualifyApp(observation, { requireVersion = true, floor = MINIMUM_APP_VERSION } = {}) {
|
|
84
139
|
const seen = observation !== null && typeof observation === 'object' ? observation : {}
|
|
85
140
|
const base = { floor, version: typeof seen.version === 'string' ? seen.version.slice(0, 80) : null, running: seen.running === true ? true : seen.running === false ? false : null }
|
|
141
|
+
if (seen.versionSource === 'plugin') {
|
|
142
|
+
// The plugin runs inside the app it reports: that app runs and has a vault open.
|
|
143
|
+
const reported = { ...base, running: true, versionSource: 'plugin' }
|
|
144
|
+
if (seen.installed !== true) return { ...reported, outcome: 'app-missing', reason: 'no-app-found' }
|
|
145
|
+
if (seen.cli !== true) return { ...reported, outcome: 'app-cli-unavailable', reason: 'cli-capability-absent' }
|
|
146
|
+
if (reported.version === null) return { ...reported, outcome: 'app-version-unsupported', reason: 'version-unknown' }
|
|
147
|
+
if (parseAppVersion(reported.version) === null) return { ...reported, outcome: 'app-version-unsupported', reason: 'version-unreadable' }
|
|
148
|
+
if (!meetsMinimumAppVersion(reported.version, floor)) return { ...reported, outcome: 'app-version-unsupported', reason: 'below-minimum-version' }
|
|
149
|
+
return { ...reported, outcome: 'qualified', reason: 'plugin-reported', versionChecked: true }
|
|
150
|
+
}
|
|
86
151
|
if (seen.installed !== true) return { ...base, outcome: 'app-missing', reason: 'no-app-found' }
|
|
152
|
+
if (seen.cliOff === true) return { ...base, running: true, outcome: 'app-cli-unavailable', reason: 'cli-turned-off' }
|
|
87
153
|
if (seen.cli !== true) return { ...base, outcome: 'app-cli-unavailable', reason: 'cli-capability-absent' }
|
|
88
154
|
if (seen.noVaultOpen === true) return { ...base, outcome: 'app-version-unsupported', reason: 'no-vault-open' }
|
|
89
155
|
if (base.version === null) {
|
|
@@ -108,8 +174,23 @@ export async function inspectApp(appProbe) {
|
|
|
108
174
|
// qualification with its input: an app that was not running qualified without
|
|
109
175
|
// a version, and an adapter built on that answer must not coordinate with an
|
|
110
176
|
// app started since (see createEditorAdapter).
|
|
177
|
+
//
|
|
178
|
+
// The app is asked only when an adapter is wanted, that is when a view is
|
|
179
|
+
// about to be published. An appProbe with `inspect()` is asked without
|
|
180
|
+
// blocking, and the factory and `qualification()` then answer promises; one
|
|
181
|
+
// with only `inspectSync()` is asked synchronously.
|
|
182
|
+
//
|
|
183
|
+
// When the service passes `pluginReport` (one launch of the plugin holds a
|
|
184
|
+
// live lease on the view), the probe is asked as without one, through the same
|
|
185
|
+
// remembered answer, and that answer decides wherever the tool gave a version,
|
|
186
|
+
// found no app or no tool, or the process table showed no app running. Only
|
|
187
|
+
// where the tool gave no version while an app may run does the plugin's
|
|
188
|
+
// version stand in; such an answer is never reused for another view or a later
|
|
189
|
+
// call. The adapter still coordinates through its own channel, which must
|
|
190
|
+
// answer for the vault before anything is published.
|
|
111
191
|
export function createQualifiedAdapterFactory({ appProbe, createAdapter, floor = MINIMUM_APP_VERSION, maxAgeMs = 10_000, now = () => Date.now() } = {}) {
|
|
112
|
-
|
|
192
|
+
const waits = typeof appProbe?.inspect === 'function'
|
|
193
|
+
if (!waits && typeof appProbe?.inspectSync !== 'function') throw new TypeError('the qualified adapter factory needs an appProbe with inspect() or inspectSync()')
|
|
113
194
|
if (typeof createAdapter !== 'function') throw new TypeError('the qualified adapter factory needs createAdapter')
|
|
114
195
|
let last = null
|
|
115
196
|
// An answer that lets an adapter through without a checked version (no app
|
|
@@ -117,22 +198,33 @@ export function createQualifiedAdapterFactory({ appProbe, createAdapter, floor =
|
|
|
117
198
|
// asked for its version by the next call, not refused on the old answer. An
|
|
118
199
|
// answer that checked a version, or that refuses, is reused for `maxAgeMs`.
|
|
119
200
|
const reusable = (result) => result.versionChecked === true || (result.outcome !== 'qualified' && result.outcome !== 'app-missing')
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
return
|
|
201
|
+
const current = () => last !== null && reusable(last.result) && now() - last.at <= maxAgeMs
|
|
202
|
+
const learn = (observation) => { last = { at: now(), result: qualifyApp(observation, { requireVersion: false, floor }) }; return last.result }
|
|
203
|
+
const qualification = waits
|
|
204
|
+
? async () => { if (current()) return last.result; let observation; try { observation = await appProbe.inspect() } catch { observation = null } return learn(observation) }
|
|
205
|
+
: () => { if (current()) return last.result; let observation; try { observation = appProbe.inspectSync() } catch { observation = null } return learn(observation) }
|
|
206
|
+
const withPlugin = (probed, report) => {
|
|
207
|
+
if (report === null) return probed
|
|
208
|
+
// No app in the process table: a live lease is the echo of an app that is gone (it lapses within the lease time) or
|
|
209
|
+
// of a process holding the key, and vouches for no version. The probe's own answer stands, so an adapter built on it
|
|
210
|
+
// never coordinates with an app started since, whose version nobody checked.
|
|
211
|
+
if (probed.version !== null || probed.running === false || probed.outcome === 'app-missing' || probed.outcome === 'app-cli-unavailable') return probed
|
|
212
|
+
return qualifyApp({ installed: true, cli: true, version: typeof report?.appVersion === 'string' ? report.appVersion : null, versionSource: 'plugin' }, { requireVersion: true, floor })
|
|
127
213
|
}
|
|
128
|
-
|
|
129
|
-
|
|
214
|
+
let shown = null
|
|
215
|
+
const build = (input, probed) => {
|
|
216
|
+
const result = withPlugin(probed, input?.pluginReport ?? null)
|
|
217
|
+
shown = result
|
|
130
218
|
// No app at all is not an unqualified app: the publisher's own path needs none, and its adapter finds no process.
|
|
131
219
|
if (result.outcome !== 'qualified' && result.outcome !== 'app-missing') refuse(result.outcome, 'the installed Obsidian does not qualify; nothing is published through it', { reason: result.reason, floor: result.floor, version: result.version })
|
|
132
220
|
return createAdapter({ ...input, qualification: result })
|
|
133
221
|
}
|
|
222
|
+
const factory = waits ? async (input) => build(input, await qualification()) : (input) => build(input, qualification())
|
|
134
223
|
factory.qualification = qualification
|
|
135
|
-
// What was last learned, without asking again: for a status answer.
|
|
136
|
-
factory.lastQualification = () => last?.result ?? null
|
|
224
|
+
// What was last learned, from the probe or from a plugin, without asking again: for a status answer.
|
|
225
|
+
factory.lastQualification = () => shown ?? last?.result ?? null
|
|
226
|
+
// Drops what was learned, so the next adapter asks the app again: a tick somebody asked for does not reuse an
|
|
227
|
+
// answer from before the app changed.
|
|
228
|
+
factory.forget = () => { last = null; shown = null }
|
|
137
229
|
return factory
|
|
138
230
|
}
|