@namewta/speculo 1.0.24 → 2.0.2
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/README.md +37 -98
- package/THIRD-PARTY-NOTICES.md +69 -0
- package/dist/src/agent-files.js +9 -36
- package/dist/src/agent-files.js.map +1 -1
- package/dist/src/agent-skills.d.ts +57 -57
- package/dist/src/agent-skills.js +218 -513
- package/dist/src/agent-skills.js.map +1 -1
- package/dist/src/assets.d.ts +21 -0
- package/dist/src/assets.js +111 -0
- package/dist/src/assets.js.map +1 -0
- package/dist/src/cli.js +44 -29
- package/dist/src/cli.js.map +1 -1
- package/dist/src/coordination.d.ts +23 -0
- package/dist/src/coordination.js +60 -0
- package/dist/src/coordination.js.map +1 -0
- package/dist/src/doctor.js +39 -20
- package/dist/src/doctor.js.map +1 -1
- package/dist/src/index.d.ts +22 -7
- package/dist/src/index.js +60 -35
- package/dist/src/index.js.map +1 -1
- package/dist/src/install-ui.d.ts +61 -0
- package/dist/src/install-ui.js +268 -0
- package/dist/src/install-ui.js.map +1 -0
- package/dist/src/interaction.d.ts +5 -0
- package/dist/src/interaction.js +10 -0
- package/dist/src/interaction.js.map +1 -0
- package/dist/src/paths.d.ts +17 -4
- package/dist/src/paths.js +103 -17
- package/dist/src/paths.js.map +1 -1
- package/dist/src/refresh.d.ts +16 -2
- package/dist/src/refresh.js +66 -85
- package/dist/src/refresh.js.map +1 -1
- package/dist/src/runtime-entry.d.ts +4 -0
- package/dist/src/runtime-entry.js +5 -0
- package/dist/src/runtime-entry.js.map +1 -0
- package/dist/src/specdev-artifacts.d.ts +77 -0
- package/dist/src/specdev-artifacts.js +323 -0
- package/dist/src/specdev-artifacts.js.map +1 -0
- package/dist/src/structured.d.ts +1 -7
- package/dist/src/structured.js +18 -242
- package/dist/src/structured.js.map +1 -1
- package/dist/src/transaction.d.ts +5 -10
- package/dist/src/transaction.js +105 -171
- package/dist/src/transaction.js.map +1 -1
- package/dist/src/workflows.js +25 -87
- package/dist/src/workflows.js.map +1 -1
- package/package.json +18 -9
- package/template/.speculo/README.md +24 -27
- package/template/.speculo/refresh-contract.json +4 -6
- package/template/.speculo/workspace.json +10 -7
- package/template/AGENTS.md +8 -5
- package/template/canonical/README.md +6 -0
- package/template/canonical/canonical-specdev-goal-plan.md +2517 -681
- package/template/canonical/canonical-specdev-grill-with-docs.md +3091 -548
- package/template/canonical/canonical-specdev-spec.md +2889 -455
- package/template/canonical/canonical-specdev-tickets.md +2914 -718
- package/template/canonical/canonical-specdev-wayfinder.md +3526 -466
- package/template/commands/archive-and-consolidate/COMMAND.md +30 -0
- package/template/commands/docs-sync/COMMAND.md +25 -0
- package/template/commands/docs-sync/assets/agents-template.md +19 -0
- package/template/commands/docs-sync/assets/report-template.md +32 -0
- package/template/commands/docs-sync/references/agents-contract.md +27 -0
- package/template/commands/docs-sync/references/changelog-contract.md +39 -0
- package/template/commands/docs-sync/references/git-state-contract.md +39 -0
- package/template/commands/docs-sync/references/handbook-discovery.md +11 -0
- package/template/commands/docs-sync/references/operation-contract.md +62 -0
- package/template/commands/docs-sync/references/readme-contract.md +24 -0
- package/template/commands/docs-sync/references/workflow-scope-contract.md +32 -0
- package/template/commands/engineering-standards-builder/COMMAND.md +163 -0
- package/template/commands/engineering-standards-builder/manifest.txt +118 -0
- package/template/commands/engineering-standards-builder/scripts/validate-builder.mjs +268 -0
- package/template/commands/git-history-squash/COMMAND.md +72 -0
- package/template/commands/git-history-squash/references/operation-contract.md +99 -0
- package/template/commands/git-history-squash/references/rewrite-contract.md +127 -0
- package/template/commands/git-history-squash/scripts/git-history-squash.mjs +1210 -0
- package/template/commands/git-repository-audit/COMMAND.md +80 -0
- package/template/commands/handoff/COMMAND.md +61 -0
- package/template/commands/manifest.json +15 -0
- package/template/commands/retro/COMMAND.md +72 -0
- package/template/commands/source-code-zip/COMMAND.md +58 -0
- package/template/commands/status/COMMAND.md +14 -0
- package/template/commands/upstream-fork-sync/COMMAND.md +85 -0
- package/template/commands/upstream-fork-sync/references/report-contract.md +40 -0
- package/template/commands/upstream-fork-sync/references/repository-contract.md +54 -0
- package/template/commands/upstream-fork-sync/references/state-schema.md +55 -0
- package/template/lib/design-validators.mjs +5460 -0
- package/template/lib/legacy-status-validator.cjs +3238 -0
- package/template/lib/speculo-runtime.mjs +7949 -0
- package/template/references/coordination/coordination-contract.md +50 -0
- package/template/references/coordination/exchange/external-web.md +132 -0
- package/template/references/coordination/exchange/source-package.md +239 -0
- package/template/references/coordination/modes/cli.md +11 -0
- package/template/references/coordination/modes/herdr.md +27 -0
- package/template/references/coordination/modes/orca.md +13 -0
- package/template/references/coordination/project-facts.example.json +5 -0
- package/template/references/coordination/project-facts.schema.json +113 -0
- package/template/references/coordination/result-and-recovery.md +36 -0
- package/template/references/coordination/task-brief.md +43 -0
- package/template/references/retrospective/references/issue-drafting-sop.md +69 -0
- package/template/references/retrospective/retrospective-contract.md +37 -0
- package/template/references/writing-for-agents/GLOSSARY.md +201 -0
- package/template/references/writing-for-agents/references/current-facts-docs.md +35 -0
- package/template/references/writing-for-agents/references/document-contract.md +25 -0
- package/template/references/writing-for-agents/writing-contract.md +17 -0
- package/template/workflows/learning/SKILL.md +40 -0
- package/template/workflows/learning/common/rules/domain-runtime.md +94 -0
- package/template/workflows/learning/common/rules/question-map-contract.md +1 -1
- package/template/workflows/learning/common/skills/topic-synthesis/SKILL.md +2 -0
- package/template/workflows/learning/common/tools/validate-learning.mjs +38 -50
- package/template/workflows/learning/learning-a-archive/SKILL.md +32 -0
- package/template/workflows/learning/learning-a-assess-and-plan/SKILL.md +40 -0
- package/template/workflows/learning/learning-c-consolidate/SKILL.md +40 -0
- package/template/workflows/learning/learning-g-goal/SKILL.md +63 -0
- package/template/workflows/learning/learning-g-goal/assets/goal-plan-template.md +310 -0
- package/template/workflows/learning/learning-g-goal/assets/progress-template.md +19 -0
- package/template/workflows/learning/learning-g-goal/references/coverage-bar.md +36 -0
- package/template/workflows/learning/learning-g-goal/references/external-goal-runner.md +54 -0
- package/template/workflows/learning/learning-g-goal/references/lead-orchestration.md +52 -0
- package/template/workflows/learning/learning-g-goal/references/orchestration-protocol.md +26 -0
- package/template/workflows/learning/learning-g-goal/references/planning-modes.md +19 -0
- package/template/workflows/learning/learning-h-homework/SKILL.md +38 -0
- package/template/workflows/learning/learning-i-init-setup/SKILL.md +34 -0
- package/template/workflows/learning/learning-l-lesson/SKILL.md +43 -0
- package/template/workflows/learning/learning-q-question/SKILL.md +48 -0
- package/template/workflows/learning/learning-q-question/references/exploration-mode.md +35 -0
- package/template/workflows/learning/learning-q-question/references/tutor-mode.md +31 -0
- package/template/workflows/learning/learning-r-review/SKILL.md +37 -0
- package/template/workflows/learning/manifest.json +103 -1
- package/template/workflows/media/SKILL.md +37 -0
- package/template/workflows/media/common/rules/domain-runtime.md +66 -0
- package/template/workflows/media/common/tools/media-tools.mjs +1 -1
- package/template/workflows/media/common/tools/validate-media.mjs +12 -11
- package/template/workflows/media/manifest.json +21 -2
- package/template/workflows/media/media-b-brief/SKILL.md +19 -0
- package/template/workflows/media/media-d-deconstruct/SKILL.md +19 -0
- package/template/workflows/media/media-h-hand-drawn/SKILL.md +19 -0
- package/template/workflows/media/media-i-init-setup/SKILL.md +19 -0
- package/template/workflows/media/media-p-publish-draft/SKILL.md +19 -0
- package/template/workflows/media/media-r-retro/SKILL.md +19 -0
- package/template/workflows/media/media-v-video/SKILL.md +19 -0
- package/template/workflows/ops/SKILL.md +37 -0
- package/template/workflows/ops/common/WORKSPACE-USAGE.md +2 -2
- package/template/workflows/ops/common/rules/domain-runtime.md +54 -0
- package/template/workflows/ops/common/tests/test_ops.mjs +12 -10
- package/template/workflows/ops/common/tests/test_ops_bootstrap.mjs +10 -10
- package/template/workflows/ops/common/tests/test_ops_onboarding.mjs +2 -2
- package/template/workflows/ops/common/tests/test_ops_workspace.mjs +6 -6
- package/template/workflows/ops/common/tools/opslib/workspace.mjs +2 -2
- package/template/workflows/ops/common/tools/validate-ops.mjs +4 -4
- package/template/workflows/ops/manifest.json +17 -2
- package/template/workflows/ops/ops-d-project-deploy/SKILL.md +41 -0
- package/template/workflows/ops/ops-h-host-manage/SKILL.md +35 -0
- package/template/workflows/ops/ops-i-initialize/SKILL.md +29 -0
- package/template/workflows/ops/ops-s-server-connect/SKILL.md +29 -0
- package/template/workflows/ops/ops-v-inventory-view/SKILL.md +33 -0
- package/template/workflows/person/SKILL.md +32 -0
- package/template/workflows/person/manifest.json +57 -1
- package/template/workflows/person/person-m-mao-zedong-cognitive-os/SKILL.md +43 -0
- package/template/workflows/person/person-m-mao-zedong-cognitive-os/books/README.md +17 -0
- package/template/workflows/person/person-m-mao-zedong-cognitive-os/books/src/SUMMARY.md +231 -0
- package/template/workflows/person/person-m-mao-zedong-cognitive-os/books/src//347/233/256/345/275/225.md +243 -0
- package/template/workflows/person/person-m-mao-zedong-cognitive-os/references/activate.md +83 -0
- package/template/workflows/person/person-m-mao-zedong-cognitive-os/references/deliver.md +116 -0
- package/template/workflows/person/person-m-mao-zedong-cognitive-os/references/diagnose.md +83 -0
- package/template/workflows/person/person-m-mao-zedong-cognitive-os/references/mobilize.md +85 -0
- package/template/workflows/person/person-m-mao-zedong-cognitive-os/references/strategize.md +76 -0
- package/template/workflows/person/person-s-steelman-deliberation/SKILL.md +114 -0
- package/template/workflows/person/person-s-steelman-deliberation/assets/canonical-body.md +518 -0
- package/template/workflows/person/person-s-steelman-deliberation/references/state-and-publication.md +86 -0
- package/template/workflows/person/{S-steelman-deliberation/tools → person-s-steelman-deliberation/scripts}/validate-steelman-change.mjs +0 -0
- package/template/workflows/specdev/SKILL.md +51 -0
- package/template/workflows/specdev/common/README.md +3 -3
- package/template/workflows/specdev/common/rules/activation-and-memory.md +5 -1
- package/template/workflows/specdev/common/rules/adr-format.md +3 -3
- package/template/workflows/specdev/common/rules/agent-experience.md +7 -1
- package/template/workflows/specdev/common/rules/artifact-contract.md +23 -16
- package/template/workflows/specdev/common/rules/change-completion.md +27 -6
- package/template/workflows/specdev/common/rules/design-contract.md +51 -0
- package/template/workflows/specdev/common/rules/design-it-twice.md +9 -9
- package/template/workflows/specdev/common/rules/design-portability.md +48 -0
- package/template/workflows/specdev/common/rules/deviation-control.md +3 -3
- package/template/workflows/specdev/common/rules/documentation-standard.md +5 -1
- package/template/workflows/specdev/common/rules/domain-modeling.md +1 -1
- package/template/workflows/specdev/common/rules/domain-runtime.md +35 -0
- package/template/workflows/specdev/common/rules/error-handling.md +5 -1
- package/template/workflows/specdev/common/rules/evidence-and-verification.md +3 -3
- package/template/workflows/specdev/common/rules/execution-policy.md +28 -0
- package/template/workflows/specdev/common/rules/operating-governance.md +4 -4
- package/template/workflows/specdev/common/rules/parent-implementation-orchestration.md +3 -3
- package/template/workflows/specdev/common/rules/path-ownership.md +6 -6
- package/template/workflows/specdev/common/rules/path-reference-contract.md +15 -6
- package/template/workflows/specdev/common/rules/readiness-and-depth.md +6 -1
- package/template/workflows/specdev/common/rules/test-reliability.md +4 -0
- package/template/workflows/specdev/common/rules/workflow-routing.md +4 -4
- package/template/workflows/specdev/common/rules/workflow-state-and-lifecycle.md +26 -81
- package/template/workflows/specdev/common/schemas/change-design.schema.json +254 -0
- package/template/workflows/specdev/common/schemas/config.schema.json +4 -4
- package/template/workflows/specdev/common/schemas/goal-plan.schema.json +144 -23
- package/template/workflows/specdev/common/schemas/implementation-plan.schema.json +139 -24
- package/template/workflows/specdev/common/schemas/project-design.schema.json +164 -0
- package/template/workflows/specdev/common/schemas/prototype-browser-evidence.schema.json +153 -0
- package/template/workflows/specdev/common/schemas/ticket.schema.json +40 -0
- package/template/workflows/specdev/common/skills/code-review/SKILL.md +11 -5
- package/template/workflows/specdev/common/skills/code-review/references/result-reuse.md +2 -2
- package/template/workflows/specdev/common/skills/code-review/references/reviewer-contracts.md +2 -2
- package/template/workflows/specdev/common/skills/code-review/references/source-discovery.md +3 -1
- package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +11 -11
- package/template/workflows/specdev/common/skills/dev-worktree/references/create.md +20 -12
- package/template/workflows/specdev/common/skills/dev-worktree/references/finalize.md +13 -13
- package/template/workflows/specdev/common/skills/plan-quality-review/SKILL.md +1 -1
- package/template/workflows/specdev/common/skills/research/SKILL.md +1 -1
- package/template/workflows/specdev/common/tools/README.md +21 -5
- package/template/workflows/specdev/common/tools/change-artifacts.mjs +164 -0
- package/template/workflows/specdev/common/tools/design-artifacts.mjs +277 -0
- package/template/workflows/specdev/common/tools/engineering-evidence.mjs +3 -3
- package/template/workflows/specdev/common/tools/plan-contract.mjs +168 -17
- package/template/workflows/specdev/common/tools/publish-design.mjs +341 -0
- package/template/workflows/specdev/common/tools/review-scope.mjs +49 -6
- package/template/workflows/specdev/common/tools/tests/engineering.test.mjs +19 -21
- package/template/workflows/specdev/common/tools/tests/review-source-files.test.mjs +74 -0
- package/template/workflows/specdev/common/tools/ticket-control.mjs +19 -25
- package/template/workflows/specdev/common/tools/validate-specdev.mjs +397 -576
- package/template/workflows/specdev/manifest.json +54 -7
- package/template/workflows/specdev/runtime-contract.json +6 -6
- package/template/workflows/specdev/specdev-a-archive-and-consolidate/SKILL.md +39 -0
- package/template/workflows/specdev/specdev-a-archive-and-consolidate/assets/archive-plan-template.md +32 -0
- package/template/workflows/specdev/specdev-a-archive-and-consolidate/assets/cleanup-candidate-template.md +69 -0
- package/template/workflows/specdev/specdev-a-archive-and-consolidate/assets/consolidation-plan-template.md +78 -0
- package/template/workflows/specdev/specdev-a-archive-and-consolidate/references/archive-receipt-contract.md +40 -0
- package/template/workflows/specdev/specdev-a-archive-and-consolidate/references/archive-rules.md +20 -0
- package/template/workflows/specdev/specdev-a-archive-and-consolidate/references/cleanup-rules.md +79 -0
- package/template/workflows/specdev/specdev-a-archive-and-consolidate/references/consolidation-interview.md +67 -0
- package/template/workflows/specdev/specdev-a-archive-and-consolidate/references/consolidation-rules.md +86 -0
- package/template/workflows/specdev/specdev-a-archive-and-consolidate/references/design-knowledge-gateway.md +61 -0
- package/template/workflows/specdev/specdev-a-archive-and-consolidate/references/knowledge-graduation.md +58 -0
- package/template/workflows/specdev/specdev-a-archive-and-consolidate/references/operation-contract.md +48 -0
- package/template/workflows/specdev/specdev-c-code-review/SKILL.md +55 -0
- package/template/workflows/specdev/specdev-c-code-review/assets/code-review-template.md +53 -0
- package/template/workflows/specdev/specdev-c-code-review/references/source-files-review.md +14 -0
- package/template/workflows/specdev/specdev-d-diagnose-bugs/SKILL.md +84 -0
- package/template/workflows/specdev/specdev-d-diagnose-bugs/references/feedback-loop.md +43 -0
- package/template/workflows/specdev/specdev-d-diagnose-bugs/references/incident-evidence.md +21 -0
- package/template/workflows/specdev/specdev-g-grill-with-docs/SKILL.md +34 -0
- package/template/workflows/specdev/specdev-g-grill-with-docs/references/interview-procedure.md +138 -0
- package/template/workflows/specdev/specdev-i-implement/SKILL.md +49 -0
- package/template/workflows/specdev/specdev-i-implement/assets/evidence-template.md +154 -0
- package/template/workflows/specdev/specdev-i-implement/references/documentation-procedure.md +23 -0
- package/template/workflows/specdev/specdev-i-implement/references/execution-preflight.md +55 -0
- package/template/workflows/specdev/specdev-i-implement/references/implementation-procedure.md +170 -0
- package/template/workflows/specdev/specdev-i-implement/references/merge-conflict-protocol.md +21 -0
- package/template/workflows/specdev/specdev-i-implement/references/tdd-rules.md +25 -0
- package/template/workflows/specdev/specdev-i-init-setup/SKILL.md +31 -0
- package/template/workflows/specdev/specdev-i-init-setup/assets/change-readme-template.md +32 -0
- package/template/workflows/specdev/specdev-i-init-setup/assets/config-template.json +31 -0
- package/template/workflows/specdev/specdev-i-init-setup/assets/domain-layout-template.md +29 -0
- package/template/workflows/specdev/specdev-i-init-setup/assets/tracking-template.md +13 -0
- package/template/workflows/specdev/specdev-i-init-setup/references/change-record-examples.md +62 -0
- package/template/workflows/specdev/specdev-i-init-setup/references/first-setup.md +11 -0
- package/template/workflows/specdev/specdev-l-learn/SKILL.md +35 -0
- package/template/workflows/specdev/specdev-l-learn/references/learning-change.md +23 -0
- package/template/workflows/specdev/specdev-l-learn/references/lesson-format.md +61 -0
- package/template/workflows/specdev/specdev-p-goal-plan/SKILL.md +71 -0
- package/template/workflows/specdev/specdev-p-goal-plan/assets/goal-plan-template.md +152 -0
- package/template/workflows/specdev/specdev-p-goal-plan/assets/lightweight-goal-plan-template.md +21 -0
- package/template/workflows/specdev/specdev-p-goal-plan/references/completion-control.md +47 -0
- package/template/workflows/specdev/specdev-p-goal-plan/references/goal-lifecycle.md +35 -0
- package/template/workflows/specdev/specdev-p-goal-plan/references/goal-tickets-map-template.md +15 -0
- package/template/workflows/specdev/specdev-p-goal-plan/references/lead-orchestration.md +44 -0
- package/template/workflows/specdev/specdev-p-goal-plan/references/map-control.md +28 -0
- package/template/workflows/specdev/specdev-p-goal-plan/references/multi-change-plan.md +126 -0
- package/template/workflows/specdev/specdev-p-goal-plan/references/multi-execution-loop.md +31 -0
- package/template/workflows/specdev/specdev-p-goal-plan/references/multi-input-readiness.md +25 -0
- package/template/workflows/specdev/specdev-p-goal-plan/references/multi-super-dag.md +27 -0
- package/template/workflows/specdev/specdev-p-goal-plan/references/orchestration-protocol.md +58 -0
- package/template/workflows/specdev/specdev-p-goal-plan/references/planning-modes.md +78 -0
- package/template/workflows/specdev/specdev-p-goal-plan/references/replan-and-recovery.md +15 -0
- package/template/workflows/specdev/specdev-p-goal-plan/references/single-change-plan.md +157 -0
- package/template/workflows/specdev/specdev-p-prototype/SKILL.md +56 -0
- package/template/workflows/specdev/specdev-p-prototype/assets/change-design-template.md +68 -0
- package/template/workflows/specdev/specdev-p-prototype/assets/design-package.schema.json +248 -0
- package/template/workflows/specdev/specdev-p-prototype/assets/design-system-template.md +307 -0
- package/template/workflows/specdev/specdev-p-prototype/assets/project-design-template.md +60 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/INDEX.md +50 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/catalog.json +384 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/catalog.schema.json +42 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/color-and-theme.md +65 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/composition.md +39 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/foundations.md +66 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/gallery.html +14 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/gallery.js +55 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/interaction-patterns.md +61 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/product-pattern-index.md +73 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/research-provenance.md +60 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/responsive-and-platforms.md +53 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/style-index.md +47 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/templates/assets/prototypes.css +13 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/templates/assets/prototypes.js +146 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/templates/brand-editorial.html +18 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/templates/brand-editorial.md +25 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/templates/commerce-service.html +10 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/templates/commerce-service.md +25 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/templates/cross-platform-workspace.md +25 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/templates/dense-ide.md +25 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/templates/enterprise-data.html +21 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/templates/enterprise-data.md +25 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/templates/local-first-content.md +25 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/templates/marketing-conversion.html +13 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/templates/marketing-conversion.md +25 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/templates/media-first.md +25 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/templates/mobile-supervisor.md +25 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/templates/monochrome-console.md +25 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/templates/responsive-web.md +25 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/templates/soft-personal-ai.md +25 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/upstream/awesome-design-md/LICENSE +21 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/upstream/awesome-design-md/README.md +14 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/upstream/awesome-design-md/airbnb/DESIGN.md +545 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/upstream/awesome-design-md/apple/DESIGN.md +562 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/upstream/awesome-design-md/figma/DESIGN.md +578 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/upstream/awesome-design-md/ibm/DESIGN.md +550 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/upstream/awesome-design-md/linear/DESIGN.md +548 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/upstream/awesome-design-md/mintlify/DESIGN.md +852 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/upstream/awesome-design-md/notion/DESIGN.md +821 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/upstream/awesome-design-md/provenance.json +95 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/upstream/awesome-design-md/spotify/DESIGN.md +246 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/upstream/awesome-design-md/stripe/DESIGN.md +487 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/upstream/awesome-design-md/vercel/DESIGN.md +736 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/visual-references/airbnb.md +27 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/visual-references/apple.md +27 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/visual-references/figma.md +27 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/visual-references/ibm.md +29 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/visual-references/linear.md +27 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/visual-references/mintlify.md +27 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/visual-references/notion.md +27 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/visual-references/spotify.md +27 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/visual-references/stripe.md +27 -0
- package/template/workflows/specdev/specdev-p-prototype/design-library/visual-references/vercel.md +29 -0
- package/template/workflows/specdev/specdev-p-prototype/references/detect-existing-style.md +53 -0
- package/template/workflows/specdev/specdev-p-prototype/references/generate-design-package.md +78 -0
- package/template/workflows/specdev/specdev-p-prototype/references/logic-protocol.md +11 -0
- package/template/workflows/specdev/specdev-p-prototype/references/project-preview-protocol.md +9 -0
- package/template/workflows/specdev/specdev-p-prototype/references/style-selection-protocol.md +36 -0
- package/template/workflows/specdev/specdev-p-prototype/scripts/validate-design-package.mjs +133 -0
- package/template/workflows/specdev/specdev-r-retro/SKILL.md +31 -0
- package/template/workflows/specdev/specdev-r-review-architecture/SKILL.md +104 -0
- package/template/workflows/specdev/specdev-r-review-architecture/assets/architecture-review-template.md +73 -0
- package/template/workflows/specdev/specdev-r-review-architecture/references/proposal-to-ticket.md +13 -0
- package/template/workflows/specdev/specdev-r-review-architecture/references/review-rubric.md +56 -0
- package/template/workflows/specdev/specdev-r-review-architecture/references/selected-design.md +27 -0
- package/template/workflows/specdev/specdev-s-spec/SKILL.md +43 -0
- package/template/workflows/specdev/specdev-s-spec/references/spec-readiness.md +17 -0
- package/template/workflows/specdev/specdev-t-tickets/SKILL.md +51 -0
- package/template/workflows/specdev/specdev-t-tickets/assets/ticket-template.md +157 -0
- package/template/workflows/specdev/specdev-t-tickets/assets/tickets-map-template.md +102 -0
- package/template/workflows/specdev/specdev-t-tickets/references/decomposition-rules.md +60 -0
- package/template/workflows/specdev/specdev-t-tickets/references/planning-procedure.md +235 -0
- package/template/workflows/specdev/specdev-t-tickets/references/ticket-readiness.md +56 -0
- package/template/workflows/specdev/specdev-t-triage/SKILL.md +58 -0
- package/template/workflows/specdev/specdev-t-triage/assets/capture-template.md +42 -0
- package/template/workflows/specdev/specdev-t-triage/assets/close-comment-template.md +42 -0
- package/template/workflows/specdev/specdev-t-triage/assets/issue-body-template.md +34 -0
- package/template/workflows/specdev/specdev-t-triage/assets/issue-record-template.md +27 -0
- package/template/workflows/specdev/specdev-t-triage/assets/triage-template.md +57 -0
- package/template/workflows/specdev/specdev-t-triage/references/capture-protocol.md +89 -0
- package/template/workflows/specdev/specdev-t-triage/references/ci-security-protocol.md +15 -0
- package/template/workflows/specdev/specdev-t-triage/references/intake-protocol.md +63 -0
- package/template/workflows/specdev/specdev-t-triage/references/issue-pr-policy.md +23 -0
- package/template/workflows/specdev/specdev-t-triage/references/pr-delivery-protocol.md +17 -0
- package/template/workflows/specdev/specdev-t-triage/references/publish-protocol.md +92 -0
- package/template/workflows/specdev/specdev-t-triage/references/queue-protocol.md +7 -0
- package/template/workflows/specdev/specdev-t-triage/references/reconcile-protocol.md +34 -0
- package/template/workflows/specdev/specdev-t-triage/references/release-preflight.md +17 -0
- package/template/workflows/specdev/specdev-t-triage/references/release-protocol.md +16 -0
- package/template/workflows/specdev/specdev-t-triage/references/release-recovery.md +22 -0
- package/template/workflows/specdev/specdev-t-triage/references/remote-operations.md +25 -0
- package/template/workflows/specdev/specdev-t-triage/scripts/capture-status.mjs +126 -0
- package/template/workflows/specdev/specdev-t-triage/scripts/publish-status.mjs +137 -0
- package/template/workflows/specdev/specdev-w-wayfinder/SKILL.md +49 -0
- package/template/workflows/specdev/specdev-w-wayfinder/assets/wayfinder-map-template.md +33 -0
- package/template/workflows/specdev/specdev-w-wayfinder/references/initiative-discovery.md +29 -0
- package/template/workflows/specdev/specdev-w-wayfinder/references/local-tracker-contract.md +33 -0
- package/template/workflows/specdev/specdev-w-wayfinder/references/map-traversal.md +120 -0
- package/scripts/validate-skills.mjs +0 -56
- package/template/commands/archive-and-consolidate.md +0 -72
- package/template/commands/docs-sync.md +0 -28
- package/template/commands/git-history-squash.md +0 -76
- package/template/commands/git-repository-audit.md +0 -83
- package/template/commands/handoff.md +0 -66
- package/template/commands/retro.md +0 -75
- package/template/commands/status.md +0 -17
- package/template/skills/archive-and-consolidate/SKILL.md +0 -175
- package/template/skills/archive-and-consolidate/assets/archive-plan-template.md +0 -35
- package/template/skills/archive-and-consolidate/assets/cleanup-candidate-template.md +0 -69
- package/template/skills/archive-and-consolidate/assets/consolidation-plan-template.md +0 -67
- package/template/skills/archive-and-consolidate/references/archive-rules.md +0 -48
- package/template/skills/archive-and-consolidate/references/cleanup-rules.md +0 -73
- package/template/skills/archive-and-consolidate/references/consolidation-rules.md +0 -69
- package/template/skills/archive-and-consolidate/references/knowledge-graduation.md +0 -53
- package/template/skills/docs-sync/SKILL.md +0 -32
- package/template/skills/docs-sync/assets/report-template.md +0 -46
- package/template/skills/docs-sync/references/agents/agent-writing.md +0 -75
- package/template/skills/docs-sync/references/agents/claude-redirect.md +0 -39
- package/template/skills/docs-sync/references/agents/content-contract.md +0 -213
- package/template/skills/docs-sync/references/agents/evidence-collection.md +0 -184
- package/template/skills/docs-sync/references/agents/manifest-discovery.md +0 -126
- package/template/skills/docs-sync/references/agents/role-classification.md +0 -141
- package/template/skills/docs-sync/references/agents/templates/aggregator-AGENTS.md +0 -69
- package/template/skills/docs-sync/references/agents/templates/capability-module-AGENTS.md +0 -68
- package/template/skills/docs-sync/references/agents/templates/contract-module-AGENTS.md +0 -65
- package/template/skills/docs-sync/references/agents/templates/repo-root-AGENTS.md +0 -71
- package/template/skills/docs-sync/references/agents/templates/runnable-app-AGENTS.md +0 -69
- package/template/skills/docs-sync/references/agents/templates/scripts-docs-AGENTS.md +0 -51
- package/template/skills/docs-sync/references/agents/writing-style.md +0 -145
- package/template/skills/docs-sync/references/agents-contract.md +0 -67
- package/template/skills/docs-sync/references/changelog-contract.md +0 -39
- package/template/skills/docs-sync/references/document-lifecycle-contract.md +0 -40
- package/template/skills/docs-sync/references/git-state-contract.md +0 -67
- package/template/skills/docs-sync/references/mode-contract.md +0 -21
- package/template/skills/docs-sync/references/readme-contract.md +0 -46
- package/template/skills/docs-sync/references/readme-writing-guide.md +0 -294
- package/template/skills/docs-sync/references/workflow-scope-contract.md +0 -52
- package/template/skills/engineering-standards-builder/SKILL.md +0 -161
- package/template/skills/engineering-standards-builder/manifest.txt +0 -118
- package/template/skills/engineering-standards-builder/scripts/validate-builder.mjs +0 -272
- package/template/skills/git-history-squash/SKILL.md +0 -99
- package/template/skills/git-history-squash/references/rewrite-contract.md +0 -123
- package/template/skills/git-history-squash/scripts/git-history-squash.mjs +0 -1171
- package/template/skills/retrospective/SKILL.md +0 -43
- package/template/skills/retrospective/references/issue-drafting-sop.md +0 -69
- package/template/skills/source-code-zip/SKILL.md +0 -54
- package/template/skills/upstream-fork-sync/SKILL.md +0 -82
- package/template/skills/upstream-fork-sync/references/report-contract.md +0 -40
- package/template/skills/upstream-fork-sync/references/repository-contract.md +0 -54
- package/template/skills/upstream-fork-sync/references/state-schema.md +0 -55
- package/template/skills/writing-for-agents/GLOSSARY.md +0 -201
- package/template/skills/writing-for-agents/SKILL.md +0 -22
- package/template/skills/writing-for-agents/agents/openai.yaml +0 -2
- package/template/skills/writing-for-agents/references/document-contract.md +0 -23
- package/template/workflows/learning/A-archive/A-archive.md +0 -31
- package/template/workflows/learning/A-assess-and-plan/A-assess-and-plan.md +0 -39
- package/template/workflows/learning/C-consolidate/C-consolidate.md +0 -39
- package/template/workflows/learning/G-goal/G-goal.md +0 -62
- package/template/workflows/learning/G-goal/goal-plan-template.md +0 -310
- package/template/workflows/learning/G-goal/orchestration-protocol.md +0 -26
- package/template/workflows/learning/G-goal/planning-modes.md +0 -19
- package/template/workflows/learning/G-goal/progress-template.md +0 -19
- package/template/workflows/learning/G-goal/references/coverage-bar.md +0 -36
- package/template/workflows/learning/G-goal/references/external-goal-runner.md +0 -54
- package/template/workflows/learning/G-goal/references/lead-orchestration.md +0 -52
- package/template/workflows/learning/H-homework/H-homework.md +0 -37
- package/template/workflows/learning/I-init-setup/I-init-setup.md +0 -33
- package/template/workflows/learning/INDEX.md +0 -26
- package/template/workflows/learning/L-lesson/L-lesson.md +0 -42
- package/template/workflows/learning/Q-question/Q-question.md +0 -47
- package/template/workflows/learning/Q-question/references/exploration-mode.md +0 -35
- package/template/workflows/learning/Q-question/references/tutor-mode.md +0 -31
- package/template/workflows/learning/R-review/R-review.md +0 -36
- package/template/workflows/learning/README.md +0 -100
- package/template/workflows/media/B-brief/B-brief.md +0 -18
- package/template/workflows/media/D-deconstruct/D-deconstruct.md +0 -18
- package/template/workflows/media/H-hand-drawn/H-hand-drawn.md +0 -18
- package/template/workflows/media/I-init-setup/I-init-setup.md +0 -18
- package/template/workflows/media/INDEX.md +0 -20
- package/template/workflows/media/P-publish-draft/P-publish-draft.md +0 -18
- package/template/workflows/media/R-retro/R-retro.md +0 -18
- package/template/workflows/media/README.md +0 -76
- package/template/workflows/media/V-video/V-video.md +0 -18
- package/template/workflows/ops/D-project-deploy/D-project-deploy.md +0 -40
- package/template/workflows/ops/H-host-manage/H-host-manage.md +0 -34
- package/template/workflows/ops/I-initialize/I-initialize.md +0 -28
- package/template/workflows/ops/INDEX.md +0 -36
- package/template/workflows/ops/README.md +0 -62
- package/template/workflows/ops/S-server-connect/S-server-connect.md +0 -28
- package/template/workflows/ops/V-inventory-view/V-inventory-view.md +0 -32
- package/template/workflows/person/INDEX.md +0 -15
- package/template/workflows/person/M-mao-zedong-cognitive-os/M-mao-zedong-cognitive-os.md +0 -42
- package/template/workflows/person/M-mao-zedong-cognitive-os/activate.md +0 -81
- package/template/workflows/person/M-mao-zedong-cognitive-os/books/README.md +0 -17
- package/template/workflows/person/M-mao-zedong-cognitive-os/books/src/SUMMARY.md +0 -231
- package/template/workflows/person/M-mao-zedong-cognitive-os/books/src//347/233/256/345/275/225.md +0 -243
- package/template/workflows/person/M-mao-zedong-cognitive-os/deliver.md +0 -114
- package/template/workflows/person/M-mao-zedong-cognitive-os/diagnose.md +0 -83
- package/template/workflows/person/M-mao-zedong-cognitive-os/mobilize.md +0 -85
- package/template/workflows/person/M-mao-zedong-cognitive-os/strategize.md +0 -76
- package/template/workflows/person/S-steelman-deliberation/S-steelman-deliberation.md +0 -113
- package/template/workflows/person/S-steelman-deliberation/references/state-and-publication.md +0 -86
- package/template/workflows/specdev/A-archive-and-consolidate/A-archive-and-consolidate.md +0 -56
- package/template/workflows/specdev/A-archive-and-consolidate/consolidation-interview.md +0 -67
- package/template/workflows/specdev/C-code-review/C-code-review.md +0 -42
- package/template/workflows/specdev/C-code-review/code-review-template.md +0 -53
- package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +0 -83
- package/template/workflows/specdev/D-diagnose-bugs/feedback-loop.md +0 -43
- package/template/workflows/specdev/D-diagnose-bugs/references/incident-evidence.md +0 -21
- package/template/workflows/specdev/G-grill-with-docs/G-grill-with-docs.md +0 -33
- package/template/workflows/specdev/G-grill-with-docs/references/interview-procedure.md +0 -138
- package/template/workflows/specdev/I-implement/I-implement.md +0 -36
- package/template/workflows/specdev/I-implement/evidence-template.md +0 -145
- package/template/workflows/specdev/I-implement/execution-preflight.md +0 -48
- package/template/workflows/specdev/I-implement/merge-conflict-protocol.md +0 -21
- package/template/workflows/specdev/I-implement/references/documentation-procedure.md +0 -21
- package/template/workflows/specdev/I-implement/references/implementation-procedure.md +0 -164
- package/template/workflows/specdev/I-implement/tdd-rules.md +0 -25
- package/template/workflows/specdev/I-init-setup/I-init-setup.md +0 -45
- package/template/workflows/specdev/I-init-setup/change-status-template.json +0 -28
- package/template/workflows/specdev/I-init-setup/config-template.json +0 -31
- package/template/workflows/specdev/I-init-setup/domain-layout-template.md +0 -23
- package/template/workflows/specdev/I-init-setup/references/first-setup.md +0 -46
- package/template/workflows/specdev/I-init-setup/status-template.json +0 -6
- package/template/workflows/specdev/I-init-setup/tracking-template.md +0 -13
- package/template/workflows/specdev/INDEX.md +0 -30
- package/template/workflows/specdev/L-learn-change/L-learn-change.md +0 -32
- package/template/workflows/specdev/L-learn-change/references/lesson-format.md +0 -51
- package/template/workflows/specdev/P-goal-plan/P-goal-plan.md +0 -58
- package/template/workflows/specdev/P-goal-plan/completion-control.md +0 -47
- package/template/workflows/specdev/P-goal-plan/goal-plan-template.md +0 -146
- package/template/workflows/specdev/P-goal-plan/lead-orchestration.md +0 -42
- package/template/workflows/specdev/P-goal-plan/orchestration-protocol.md +0 -56
- package/template/workflows/specdev/P-goal-plan/planning-modes.md +0 -78
- package/template/workflows/specdev/P-goal-plan/references/goal-lifecycle.md +0 -35
- package/template/workflows/specdev/P-goal-plan/references/goal-tickets-map-template.md +0 -15
- package/template/workflows/specdev/P-goal-plan/references/map-control.md +0 -28
- package/template/workflows/specdev/P-goal-plan/references/multi-change-plan.md +0 -126
- package/template/workflows/specdev/P-goal-plan/references/multi-execution-loop.md +0 -31
- package/template/workflows/specdev/P-goal-plan/references/multi-input-readiness.md +0 -25
- package/template/workflows/specdev/P-goal-plan/references/multi-super-dag.md +0 -27
- package/template/workflows/specdev/P-goal-plan/references/replan-and-recovery.md +0 -21
- package/template/workflows/specdev/P-goal-plan/references/single-change-plan.md +0 -151
- package/template/workflows/specdev/P-prototype/P-prototype.md +0 -53
- package/template/workflows/specdev/P-prototype/design-library/INDEX.md +0 -43
- package/template/workflows/specdev/P-prototype/design-library/color-and-theme.md +0 -65
- package/template/workflows/specdev/P-prototype/design-library/foundations.md +0 -66
- package/template/workflows/specdev/P-prototype/design-library/interaction-patterns.md +0 -61
- package/template/workflows/specdev/P-prototype/design-library/product-pattern-index.md +0 -73
- package/template/workflows/specdev/P-prototype/design-library/research-provenance.md +0 -54
- package/template/workflows/specdev/P-prototype/design-library/responsive-and-platforms.md +0 -53
- package/template/workflows/specdev/P-prototype/design-library/style-index.md +0 -32
- package/template/workflows/specdev/P-prototype/design-package.schema.json +0 -70
- package/template/workflows/specdev/P-prototype/design-system-template.md +0 -366
- package/template/workflows/specdev/P-prototype/detect-existing-style.md +0 -53
- package/template/workflows/specdev/P-prototype/generate-design-package.md +0 -54
- package/template/workflows/specdev/P-prototype/logic-protocol.md +0 -11
- package/template/workflows/specdev/P-prototype/project-preview-protocol.md +0 -9
- package/template/workflows/specdev/P-prototype/style-selection-protocol.md +0 -45
- package/template/workflows/specdev/P-prototype/tools/validate-design-package.mjs +0 -155
- package/template/workflows/specdev/R-retro/R-retro.md +0 -30
- package/template/workflows/specdev/R-review-architecture/R-review-architecture.md +0 -103
- package/template/workflows/specdev/R-review-architecture/architecture-review-template.md +0 -73
- package/template/workflows/specdev/R-review-architecture/proposal-to-ticket.md +0 -13
- package/template/workflows/specdev/R-review-architecture/references/selected-design.md +0 -27
- package/template/workflows/specdev/R-review-architecture/review-rubric.md +0 -56
- package/template/workflows/specdev/README.md +0 -105
- package/template/workflows/specdev/S-spec/S-spec.md +0 -38
- package/template/workflows/specdev/S-spec/spec-readiness.md +0 -16
- package/template/workflows/specdev/T-tickets/T-tickets.md +0 -46
- package/template/workflows/specdev/T-tickets/decomposition-rules.md +0 -60
- package/template/workflows/specdev/T-tickets/references/planning-procedure.md +0 -233
- package/template/workflows/specdev/T-tickets/ticket-readiness.md +0 -54
- package/template/workflows/specdev/T-tickets/ticket-template.md +0 -155
- package/template/workflows/specdev/T-tickets/tickets-map-template.md +0 -102
- package/template/workflows/specdev/T-triage/T-triage.md +0 -57
- package/template/workflows/specdev/T-triage/capture-protocol.md +0 -89
- package/template/workflows/specdev/T-triage/capture-template.md +0 -42
- package/template/workflows/specdev/T-triage/ci-security-protocol.md +0 -15
- package/template/workflows/specdev/T-triage/close-comment-template.md +0 -42
- package/template/workflows/specdev/T-triage/intake-protocol.md +0 -63
- package/template/workflows/specdev/T-triage/issue-body-template.md +0 -34
- package/template/workflows/specdev/T-triage/issue-record-template.md +0 -27
- package/template/workflows/specdev/T-triage/pr-delivery-protocol.md +0 -17
- package/template/workflows/specdev/T-triage/publish-protocol.md +0 -92
- package/template/workflows/specdev/T-triage/queue-protocol.md +0 -7
- package/template/workflows/specdev/T-triage/reconcile-protocol.md +0 -34
- package/template/workflows/specdev/T-triage/references/issue-pr-policy.md +0 -23
- package/template/workflows/specdev/T-triage/release-preflight.md +0 -17
- package/template/workflows/specdev/T-triage/release-protocol.md +0 -16
- package/template/workflows/specdev/T-triage/release-recovery.md +0 -22
- package/template/workflows/specdev/T-triage/remote-operations.md +0 -25
- package/template/workflows/specdev/T-triage/tools/capture-status.mjs +0 -125
- package/template/workflows/specdev/T-triage/tools/publish-status.mjs +0 -148
- package/template/workflows/specdev/T-triage/triage-template.md +0 -57
- package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +0 -46
- package/template/workflows/specdev/W-wayfinder/local-tracker-contract.md +0 -35
- package/template/workflows/specdev/W-wayfinder/references/initiative-discovery.md +0 -29
- package/template/workflows/specdev/W-wayfinder/references/map-traversal.md +0 -120
- package/template/workflows/specdev/W-wayfinder/wayfinder-map-template.md +0 -33
- package/template/workflows/specdev/_state/archive/.gitkeep +0 -0
- package/template/workflows/specdev/_state/changes/.gitkeep +0 -0
- package/template/workflows/specdev/_state/status.json +0 -6
- package/template/workflows/specdev/common/skills/subagent-delivery/SKILL.md +0 -51
- package/template/workflows/specdev/common/skills/subagent-delivery/references/dispatch-and-accept.md +0 -87
- package/template/workflows/specdev/common/skills/subagent-delivery/references/external-web-subagent.md +0 -132
- package/template/workflows/specdev/common/skills/subagent-delivery/references/native-subagent.md +0 -28
- package/template/workflows/specdev/common/skills/subagent-delivery/references/source-package.md +0 -239
- /package/template/{skills → commands}/docs-sync/assets/state-template.json +0 -0
- /package/template/{skills → commands}/docs-sync/assets/workflow-scope-template.json +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/README.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/agents/openai.yaml +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/README.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/fallback/kotlin-gradle/build.gradle.kts +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/fallback/kotlin-gradle/expected.json +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/fallback/kotlin-gradle/src/main/kotlin/example/App.kt +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/go/service/.golangci.yml +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/go/service/cmd/api/main.go +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/go/service/expected.json +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/go/service/go.mod +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/go/service/internal/service/service.go +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/go/service/internal/service/service_test.go +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/java/spring-boot-maven/expected.json +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/java/spring-boot-maven/pom.xml +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/java/spring-boot-maven/src/main/java/dev/speculo/orders/OrdersApplication.java +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/java/spring-boot-maven/src/test/java/dev/speculo/orders/OrdersApplicationTest.java +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/polyglot/monorepo/.github/workflows/ci.yml +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/polyglot/monorepo/apps/web/package.json +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/polyglot/monorepo/apps/web/src/App.vue +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/polyglot/monorepo/apps/web/tsconfig.json +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/polyglot/monorepo/expected.json +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/polyglot/monorepo/package.json +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/polyglot/monorepo/pnpm-workspace.yaml +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/polyglot/monorepo/services/orders/pom.xml +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/polyglot/monorepo/services/orders/src/main/java/dev/speculo/orders/OrdersApplication.java +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/polyglot/monorepo/services/worker/go.mod +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/polyglot/monorepo/services/worker/main.go +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/rust/workspace/Cargo.toml +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/rust/workspace/crates/cli/Cargo.toml +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/rust/workspace/crates/cli/src/main.rs +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/rust/workspace/crates/core/Cargo.toml +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/rust/workspace/crates/core/src/lib.rs +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/rust/workspace/expected.json +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/rust/workspace/rust-toolchain.toml +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/typescript/react-vite/expected.json +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/typescript/react-vite/package.json +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/typescript/react-vite/src/App.test.tsx +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/typescript/react-vite/src/App.tsx +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/typescript/react-vite/src/main.tsx +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/typescript/react-vite/tsconfig.json +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/typescript/vue-vite/expected.json +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/typescript/vue-vite/package.json +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/typescript/vue-vite/src/App.test.ts +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/typescript/vue-vite/src/App.vue +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/typescript/vue-vite/src/main.ts +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/typescript/vue-vite/tsconfig.json +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/examples/typescript/vue-vite/vite.config.ts +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/go/00-detection-and-scope.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/go/01-language-and-idioms.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/go/02-modules-packages-and-layout.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/go/03-errors-context-and-concurrency.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/go/04-testing-tooling-quality-gates.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/go/README.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/java/00-detection-and-scope.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/java/01-language-packages-and-api.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/java/02-build-modules-and-dependencies.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/java/03-errors-nullability-resources-concurrency.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/java/04-testing-tooling-quality-gates.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/java/README.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/java/frameworks/spring-boot.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rules/00-governance-and-precedence.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rules/01-project-discovery.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rules/02-evidence-topology-and-scope.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rules/03-interview-and-decisions.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rules/04-architecture-and-dependency-boundaries.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rules/05-files-directories-and-naming.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rules/06-apis-errors-resources-and-concurrency.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rules/07-documentation-and-comments.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rules/08-testing-strategy.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rules/09-mechanical-guardrails.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rules/09-security-configuration-and-data.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rules/10-performance-observability-and-i18n.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rules/11-tooling-quality-gates-and-ci.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rules/12-git-review-and-delivery.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rules/13-adoption-exceptions-and-ratchets.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rules/14-generation-contract.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rules/15-validation-contract.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rules/16-language-adapter-contract.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rules/README.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rust/00-detection-and-scope.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rust/01-language-api-and-safety.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rust/02-crates-workspaces-and-layout.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rust/03-errors-ownership-and-concurrency.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rust/04-testing-tooling-quality-gates.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/rust/README.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/typescript/00-detection-and-scope.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/typescript/01-language-and-type-system.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/typescript/02-modules-packages-and-runtime-boundaries.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/typescript/03-functions-async-errors-resources.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/typescript/04-testing-tooling-quality-gates.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/typescript/README.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/typescript/app-types/cli.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/typescript/app-types/library.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/typescript/frameworks/react.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/typescript/frameworks/vue.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/typescript/runtimes/browser.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/typescript/runtimes/electron.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/references/typescript/runtimes/node.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/scripts/discover-project.mjs +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/scripts/self-test.mjs +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/scripts/sync-manifest.mjs +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/scripts/validate-generated-skill.mjs +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/templates/README.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/templates/compatibility/agents-typescript--standards.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/templates/compatibility/agents-typescript-standards.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/templates/compatibility/claude-engineering-standards.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/templates/compatibility/claude-typescript-standards.md +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/templates/domain-skill/SKILL.md.template +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/templates/project-skill/SKILL.md.template +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/templates/project-skill/generated-skill-set.json.template +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/templates/project-skill/references/project/00-project-profile.md.template +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/templates/project-skill/references/project/01-module-map.md.template +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/templates/project-skill/references/project/02-decisions-and-exceptions.md.template +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/templates/project-skill/references/project/03-skill-map.md.template +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/templates/project-skill/references/project/04-source-and-template-map.md.template +0 -0
- /package/template/{skills → commands}/engineering-standards-builder/templates/project-skill/references/project/review-checklist.md.template +0 -0
- /package/template/{skills → commands}/git-history-squash/agents/openai.yaml +0 -0
- /package/template/{skills → commands}/git-history-squash/assets/request-template.json +0 -0
- /package/template/{skills → commands}/git-history-squash/references/recovery-contract.md +0 -0
- /package/template/{skills → commands}/git-history-squash/references/submodule-contract.md +0 -0
- /package/template/commands/{references/git-repository-audit-procedure.md → git-repository-audit/references/procedure.md} +0 -0
- /package/template/{skills → commands}/source-code-zip/references/cli-reference.md +0 -0
- /package/template/{skills → commands}/source-code-zip/scripts/zip_source_code.js +0 -0
- /package/template/{skills → commands}/upstream-fork-sync/scripts/upstream-sync.mjs +0 -0
- /package/template/{skills → references}/retrospective/references/friction-taxonomy.md +0 -0
- /package/template/{skills → references}/writing-for-agents/references/authoring-principles.md +0 -0
- /package/template/workflows/learning/{A-assess-and-plan → learning-a-assess-and-plan/assets}/background-template.md +0 -0
- /package/template/workflows/learning/{A-assess-and-plan → learning-a-assess-and-plan/assets}/change-status-template.json +0 -0
- /package/template/workflows/learning/{A-assess-and-plan → learning-a-assess-and-plan/assets}/course-template.md +0 -0
- /package/template/workflows/learning/{G-goal → learning-g-goal/assets}/chain-template.md +0 -0
- /package/template/workflows/learning/{G-goal → learning-g-goal/assets}/coverage-matrix-template.md +0 -0
- /package/template/workflows/learning/{G-goal → learning-g-goal/assets}/probe-template.md +0 -0
- /package/template/workflows/learning/{G-goal → learning-g-goal}/references/mine-unit.md +0 -0
- /package/template/workflows/learning/{G-goal → learning-g-goal}/references/split-rules.md +0 -0
- /package/template/workflows/learning/{G-goal → learning-g-goal}/references/stop-rules.md +0 -0
- /package/template/workflows/learning/{H-homework → learning-h-homework/assets}/homework-template.md +0 -0
- /package/template/workflows/learning/{I-init-setup → learning-i-init-setup/assets}/context-index-template.md +0 -0
- /package/template/workflows/learning/{I-init-setup → learning-i-init-setup/assets}/learner-profile-template.md +0 -0
- /package/template/workflows/learning/{I-init-setup → learning-i-init-setup/assets}/review-index-template.md +0 -0
- /package/template/workflows/learning/{L-lesson → learning-l-lesson/assets}/lesson-template.md +0 -0
- /package/template/workflows/learning/{Q-question → learning-q-question/assets}/exploration-template.md +0 -0
- /package/template/workflows/learning/{Q-question → learning-q-question/assets}/inquiry-template.md +0 -0
- /package/template/workflows/learning/{Q-question → learning-q-question/assets}/lightweight-course-template.md +0 -0
- /package/template/workflows/learning/{Q-question → learning-q-question/assets}/question-map-template.json +0 -0
- /package/template/workflows/learning/{Q-question/tools → learning-q-question/scripts}/validate-exploration.mjs +0 -0
- /package/template/workflows/learning/{Q-question/tools → learning-q-question/scripts}/validate-inquiry.mjs +0 -0
- /package/template/workflows/learning/{R-review → learning-r-review/assets}/review-template.md +0 -0
- /package/template/workflows/media/{B-brief → media-b-brief/assets}/brief-template.json +0 -0
- /package/template/workflows/media/{H-hand-drawn → media-h-hand-drawn/references}/production.md +0 -0
- /package/template/workflows/media/{H-hand-drawn → media-h-hand-drawn/references}/style-catalog.json +0 -0
- /package/template/workflows/media/{P-publish-draft → media-p-publish-draft/assets}/draft-request-template.json +0 -0
- /package/template/workflows/media/{R-retro → media-r-retro/assets}/retro-template.md +0 -0
- /package/template/workflows/media/{V-video → media-v-video/assets}/review-template.json +0 -0
- /package/template/workflows/media/{V-video → media-v-video/assets}/shot-plan-template.json +0 -0
- /package/template/workflows/media/{V-video → media-v-video/references}/production.md +0 -0
- /package/template/workflows/media/{V-video → media-v-video/scripts}/render_preview.py +0 -0
- /package/template/workflows/ops/{H-host-manage → ops-h-host-manage}/references/host-profiles.md +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os/_templates → person-m-mao-zedong-cognitive-os/assets/templates}/mao-consultation-output-template.md +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/000-/344/270/255/345/233/275/347/244/276/344/274/232/345/220/204/351/230/266/347/272/247/347/232/204/345/210/206/346/236/220.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/001-/346/271/226/345/215/227/345/206/234/346/260/221/350/277/220/345/212/250/350/200/203/345/257/237/346/212/245/345/221/212.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/002-/344/270/255/345/233/275/347/232/204/347/272/242/350/211/262/346/224/277/346/235/203/344/270/272/344/273/200/344/271/210/350/203/275/345/244/237/345/255/230/345/234/250/357/274/237.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/003-/344/272/225/345/206/210/345/261/261/347/232/204/346/226/227/344/272/211.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/004-/345/205/263/344/272/216/347/272/240/346/255/243/345/205/232/345/206/205/347/232/204/351/224/231/350/257/257/346/200/235/346/203/263.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/005-/346/230/237/346/230/237/344/271/213/347/201/253/357/274/214/345/217/257/344/273/245/347/207/216/345/216/237.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/006-/345/217/215/345/257/271/346/234/254/346/234/254/344/270/273/344/271/211.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/007-/345/277/205/351/241/273/346/263/250/346/204/217/347/273/217/346/265/216/345/267/245/344/275/234.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/008-/346/200/216/346/240/267/345/210/206/346/236/220/345/206/234/346/235/221/351/230/266/347/272/247.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/009-/346/210/221/344/273/254/347/232/204/347/273/217/346/265/216/346/224/277/347/255/226.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/010-/345/205/263/345/277/203/347/276/244/344/274/227/347/224/237/346/264/273/357/274/214/346/263/250/346/204/217/345/267/245/344/275/234/346/226/271/346/263/225.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/011-/350/256/272/345/217/215/345/257/271/346/227/245/346/234/254/345/270/235/345/233/275/344/270/273/344/271/211/347/232/204/347/255/226/347/225/245.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/012-/344/270/255/345/233/275/351/235/251/345/221/275/346/210/230/344/272/211/347/232/204/346/210/230/347/225/245/351/227/256/351/242/230.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/013-/345/205/263/344/272/216/350/222/213/344/273/213/347/237/263/345/243/260/346/230/216/347/232/204/345/243/260/346/230/216.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/014-/344/270/255/345/233/275/345/205/261/344/272/247/345/205/232/345/234/250/346/212/227/346/227/245/346/227/266/346/234/237/347/232/204/344/273/273/345/212/241.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/015-/344/270/272/344/272/211/345/217/226/345/215/203/347/231/276/344/270/207/347/276/244/344/274/227/350/277/233/345/205/245/346/212/227/346/227/245/346/260/221/346/227/217/347/273/237/344/270/200/346/210/230/347/272/277/350/200/214/346/226/227/344/272/211.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/016-/345/256/236/350/267/265/350/256/272.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/017-/347/237/233/347/233/276/350/256/272.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/018-/345/217/215/345/257/271/346/227/245/346/234/254/350/277/233/346/224/273/347/232/204/346/226/271/351/222/210/343/200/201/345/212/236/346/263/225/345/222/214/345/211/215/351/200/224.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/019-/344/270/272/345/212/250/345/221/230/344/270/200/345/210/207/345/212/233/351/207/217/344/272/211/345/217/226/346/212/227/346/210/230/350/203/234/345/210/251/350/200/214/346/226/227/344/272/211.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/020-/345/217/215/345/257/271/350/207/252/347/224/261/344/270/273/344/271/211.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/021-/345/233/275/345/205/261/345/220/210/344/275/234/346/210/220/347/253/213/345/220/216/347/232/204/350/277/253/345/210/207/344/273/273/345/212/241.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/022-/345/222/214/350/213/261/345/233/275/350/256/260/350/200/205/350/264/235/347/211/271/345/205/260/347/232/204/350/260/210/350/257/235.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/023-/344/270/212/346/265/267/345/244/252/345/216/237/345/244/261/351/231/267/344/273/245/345/220/216/346/212/227/346/227/245/346/210/230/344/272/211/347/232/204/345/275/242/345/212/277/345/222/214/344/273/273/345/212/241.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/024-/351/231/225/347/224/230/345/256/201/350/276/271/345/214/272/346/224/277/345/272/234/347/254/254/345/205/253/350/267/257/345/206/233/345/220/216/346/226/271/347/225/231/345/256/210/345/244/204/345/270/203/345/221/212.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/025-/346/212/227/346/227/245/346/270/270/345/207/273/346/210/230/344/272/211/347/232/204/346/210/230/347/225/245/351/227/256/351/242/230.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/026-/350/256/272/346/214/201/344/271/205/346/210/230.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/027-/344/270/255/345/233/275/345/205/261/344/272/247/345/205/232/345/234/250/346/260/221/346/227/217/346/210/230/344/272/211/344/270/255/347/232/204/345/234/260/344/275/215.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/028-/347/273/237/344/270/200/346/210/230/347/272/277/344/270/255/347/232/204/347/213/254/347/253/213/350/207/252/344/270/273/351/227/256/351/242/230.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/029-/346/210/230/344/272/211/345/222/214/346/210/230/347/225/245/351/227/256/351/242/230.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/030-/344/272/224/345/233/233/350/277/220/345/212/250.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/031-/351/235/222/345/271/264/350/277/220/345/212/250/347/232/204/346/226/271/345/220/221.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/032-/345/217/215/345/257/271/346/212/225/351/231/215/346/264/273/345/212/250.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/033-/345/277/205/351/241/273/345/210/266/350/243/201/345/217/215/345/212/250/346/264/276.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/034-/345/205/263/344/272/216/345/233/275/351/231/205/346/226/260/345/275/242/345/212/277/345/257/271/346/226/260/345/215/216/346/227/245/346/212/245/350/256/260/350/200/205/347/232/204/350/260/210/350/257/235.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/035-/345/222/214/344/270/255/345/244/256/347/244/276/343/200/201/346/211/253/350/215/241/346/212/245/343/200/201/346/226/260/346/260/221/346/212/245/344/270/211/350/256/260/350/200/205/347/232/204/350/260/210/350/257/235.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/036-/350/213/217/350/201/224/345/210/251/347/233/212/345/222/214/344/272/272/347/261/273/345/210/251/347/233/212/347/232/204/344/270/200/350/207/264.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/037-/343/200/212/345/205/261/344/272/247/345/205/232/344/272/272/343/200/213/345/217/221/345/210/212/350/257/215.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/038-/347/233/256/345/211/215/345/275/242/345/212/277/345/222/214/345/205/232/347/232/204/344/273/273/345/212/241.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/039-/345/244/247/351/207/217/345/220/270/346/224/266/347/237/245/350/257/206/345/210/206/345/255/220.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/040-/344/270/255/345/233/275/351/235/251/345/221/275/345/222/214/344/270/255/345/233/275/345/205/261/344/272/247/345/205/232.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/041-/346/226/257/345/244/247/346/236/227/346/230/257/344/270/255/345/233/275/344/272/272/346/260/221/347/232/204/346/234/213/345/217/213.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/042-/347/272/252/345/277/265/347/231/275/346/261/202/346/201/251.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/043-/346/226/260/346/260/221/344/270/273/344/270/273/344/271/211/350/256/272.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/044-/345/205/213/346/234/215/346/212/225/351/231/215/345/215/261/351/231/251/357/274/214/345/212/233/344/272/211/346/227/266/345/261/200/345/245/275/350/275/254.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/045-/345/233/242/347/273/223/344/270/200/345/210/207/346/212/227/346/227/245/345/212/233/351/207/217/357/274/214/345/217/215/345/257/271/345/217/215/345/205/261/351/241/275/345/233/272/346/264/276.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/046-/345/220/221/345/233/275/346/260/221/345/205/232/347/232/204/345/215/201/347/202/271/350/246/201/346/261/202.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/047-/343/200/212/344/270/255/345/233/275/345/267/245/344/272/272/343/200/213/345/217/221/345/210/212/350/257/215.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/048-/345/277/205/351/241/273/345/274/272/350/260/203/345/233/242/347/273/223/345/222/214/350/277/233/346/255/245.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/049-/346/226/260/346/260/221/344/270/273/344/270/273/344/271/211/347/232/204/345/256/252/346/224/277.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/050-/346/212/227/346/227/245/346/240/271/346/215/256/345/234/260/347/232/204/346/224/277/346/235/203/351/227/256/351/242/230.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/051-/347/233/256/345/211/215/346/212/227/346/227/245/347/273/237/344/270/200/346/210/230/347/272/277/344/270/255/347/232/204/347/255/226/347/225/245/351/227/256/351/242/230.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/052-/346/224/276/346/211/213/345/217/221/345/261/225/346/212/227/346/227/245/345/212/233/351/207/217/357/274/214/346/212/265/346/212/227/345/217/215/345/205/261/351/241/275/345/233/272/346/264/276/347/232/204/350/277/233/346/224/273.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/053-/345/233/242/347/273/223/345/210/260/345/272/225.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/054-/350/256/272/346/224/277/347/255/226.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/055-/344/270/272/347/232/226/345/215/227/344/272/213/345/217/230/345/217/221/350/241/250/347/232/204/345/221/275/344/273/244/345/222/214/350/260/210/350/257/235.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/056-/346/211/223/351/200/200/347/254/254/344/272/214/346/254/241/345/217/215/345/205/261/351/253/230/346/275/256/345/220/216/347/232/204/346/227/266/345/261/200.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/057-/345/205/263/344/272/216/346/211/223/351/200/200/347/254/254/344/272/214/346/254/241/345/217/215/345/205/261/351/253/230/346/275/256/347/232/204/346/200/273/347/273/223.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/058-/343/200/212/345/206/234/346/235/221/350/260/203/346/237/245/343/200/213/347/232/204/345/272/217/350/250/200/345/222/214/350/267/213.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/059-/346/224/271/351/200/240/346/210/221/344/273/254/347/232/204/345/255/246/344/271/240.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/060-/346/217/255/347/240/264/350/277/234/344/270/234/346/205/225/345/260/274/351/273/221/347/232/204/351/230/264/350/260/213.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/061-/345/205/263/344/272/216/345/217/215/346/263/225/350/245/277/346/226/257/347/232/204/345/233/275/351/231/205/347/273/237/344/270/200/346/210/230/347/272/277.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/062-/345/234/250/351/231/225/347/224/230/345/256/201/350/276/271/345/214/272/345/217/202/350/256/256/344/274/232/347/232/204/346/274/224/350/257/264.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/063-/346/225/264/351/241/277/345/205/232/347/232/204/344/275/234/351/243/216.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/064-/345/217/215/345/257/271/345/205/232/345/205/253/350/202/241.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/065-/345/234/250/345/273/266/345/256/211/346/226/207/350/211/272/345/272/247/350/260/210/344/274/232/344/270/212/347/232/204/350/256/262/350/257/235.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/066-/344/270/200/344/270/252/346/236/201/345/205/266/351/207/215/350/246/201/347/232/204/346/224/277/347/255/226.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/067-/347/254/254/344/272/214/346/254/241/344/270/226/347/225/214/345/244/247/346/210/230/347/232/204/350/275/254/346/212/230/347/202/271.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/068-/347/245/235/345/215/201/346/234/210/351/235/251/345/221/275/344/272/214/345/215/201/344/272/224/345/221/250/345/271/264.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/069-/346/212/227/346/227/245/346/227/266/346/234/237/347/232/204/347/273/217/346/265/216/351/227/256/351/242/230/345/222/214/350/264/242/346/224/277/351/227/256/351/242/230.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/070-/345/205/263/344/272/216/351/242/206/345/257/274/346/226/271/346/263/225/347/232/204/350/213/245/345/271/262/351/227/256/351/242/230.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/071-/350/264/250/351/227/256/345/233/275/346/260/221/345/205/232.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/072-/345/274/200/345/261/225/346/240/271/346/215/256/345/234/260/347/232/204/345/207/217/347/247/237/343/200/201/347/224/237/344/272/247/345/222/214/346/213/245/346/224/277/347/210/261/346/260/221/350/277/220/345/212/250.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/073-/350/257/204/345/233/275/346/260/221/345/205/232/345/215/201/344/270/200/344/270/255/345/205/250/344/274/232/345/222/214/344/270/211/345/261/212/344/272/214/346/254/241/345/233/275/346/260/221/345/217/202/346/224/277/344/274/232.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/074-/347/273/204/347/273/207/350/265/267/346/235/245.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/075-/345/255/246/344/271/240/345/222/214/346/227/266/345/261/200.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/076-/344/270/272/344/272/272/346/260/221/346/234/215/345/212/241.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/077-/350/257/204/350/222/213/344/273/213/347/237/263/345/234/250/345/217/214/345/215/201/350/212/202/347/232/204/346/274/224/350/257/264.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/078-/346/226/207/345/214/226/345/267/245/344/275/234/344/270/255/347/232/204/347/273/237/344/270/200/346/210/230/347/272/277.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/079-/345/277/205/351/241/273/345/255/246/344/274/232/345/201/232/347/273/217/346/265/216/345/267/245/344/275/234.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/080-/346/270/270/345/207/273/345/214/272/344/271/237/350/203/275/345/244/237/350/277/233/350/241/214/347/224/237/344/272/247.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/081-/344/270/244/344/270/252/344/270/255/345/233/275/344/271/213/345/221/275/350/277/220.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/082-/350/256/272/350/201/224/345/220/210/346/224/277/345/272/234.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/083-/346/204/232/345/205/254/347/247/273/345/261/261.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/084-/350/256/272/345/206/233/351/230/237/347/224/237/344/272/247/350/207/252/347/273/231/357/274/214/345/205/274/350/256/272/346/225/264/351/243/216/345/222/214/347/224/237/344/272/247/344/270/244/345/244/247/350/277/220/345/212/250/347/232/204/351/207/215/350/246/201/346/200/247.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/085-/350/265/253/345/260/224/345/210/251/345/222/214/350/222/213/344/273/213/347/237/263/347/232/204/345/217/214/347/260/247/345/267/262/347/273/217/347/240/264/344/272/247.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/086-/350/257/204/350/265/253/345/260/224/345/210/251/346/224/277/347/255/226/347/232/204/345/215/261/351/231/251.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/087-/347/273/231/347/246/217/346/226/257/347/211/271/345/220/214/345/277/227/347/232/204/347/224/265/346/212/245.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/088-/345/257/271/346/227/245/345/257/207/347/232/204/346/234/200/345/220/216/344/270/200/346/210/230.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/089-/346/212/227/346/227/245/346/210/230/344/272/211/350/203/234/345/210/251/345/220/216/347/232/204/346/227/266/345/261/200/345/222/214/346/210/221/344/273/254/347/232/204/346/226/271/351/222/210.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/090-/350/222/213/344/273/213/347/237/263/345/234/250/346/214/221/345/212/250/345/206/205/346/210/230.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/091-/347/254/254/345/215/201/345/205/253/351/233/206/345/233/242/345/206/233/346/200/273/345/217/270/344/273/244/347/273/231/350/222/213/344/273/213/347/237/263/347/232/204/344/270/244/344/270/252/347/224/265/346/212/245.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/092-/350/257/204/350/222/213/344/273/213/347/237/263/345/217/221/350/250/200/344/272/272/350/260/210/350/257/235.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/093-/344/270/255/345/205/261/344/270/255/345/244/256/345/205/263/344/272/216/345/220/214/345/233/275/346/260/221/345/205/232/350/277/233/350/241/214/345/222/214/345/271/263/350/260/210/345/210/244/347/232/204/351/200/232/347/237/245.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/094-/345/205/263/344/272/216/351/207/215/345/272/206/350/260/210/345/210/244.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/095-/345/233/275/346/260/221/345/205/232/350/277/233/346/224/273/347/232/204/347/234/237/347/233/270.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/096-/345/207/217/347/247/237/345/222/214/347/224/237/344/272/247/346/230/257/344/277/235/345/215/253/350/247/243/346/224/276/345/214/272/347/232/204/344/270/244/344/273/266/345/244/247/344/272/213.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/097-/344/270/200/344/271/235/345/233/233/345/205/255/345/271/264/350/247/243/346/224/276/345/214/272/345/267/245/344/275/234/347/232/204/346/226/271/351/222/210.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/098-/345/273/272/347/253/213/345/267/251/345/233/272/347/232/204/344/270/234/345/214/227/346/240/271/346/215/256/345/234/260.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/099-/345/205/263/344/272/216/347/233/256/345/211/215/345/233/275/351/231/205/345/275/242/345/212/277/347/232/204/345/207/240/347/202/271/344/274/260/350/256/241.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/100-/344/273/245/350/207/252/345/215/253/346/210/230/344/272/211/347/262/211/347/242/216/350/222/213/344/273/213/347/237/263/347/232/204/350/277/233/346/224/273.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/101-/345/222/214/347/276/216/345/233/275/350/256/260/350/200/205/345/256/211/345/250/234/302/267/350/267/257/346/230/223/346/226/257/302/267/346/226/257/347/211/271/346/234/227/347/232/204/350/260/210/350/257/235.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/102-/351/233/206/344/270/255/344/274/230/345/212/277/345/205/265/345/212/233/357/274/214/345/220/204/344/270/252/346/255/274/347/201/255/346/225/214/344/272/272.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/103-/347/276/216/345/233/275/342/200/234/350/260/203/350/247/243/342/200/235/347/234/237/347/233/270/345/222/214/344/270/255/345/233/275/345/206/205/346/210/230/345/211/215/351/200/224.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/104-/344/270/211/344/270/252/346/234/210/346/200/273/347/273/223.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/105-/350/277/216/346/216/245/344/270/255/345/233/275/351/235/251/345/221/275/347/232/204/346/226/260/351/253/230/346/275/256.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/106-/344/270/255/345/205/261/344/270/255/345/244/256/345/205/263/344/272/216/346/232/202/346/227/266/346/224/276/345/274/203/345/273/266/345/256/211/345/222/214/344/277/235/345/215/253/351/231/225/347/224/230/345/256/201/350/276/271/345/214/272/347/232/204/344/270/244/344/270/252/346/226/207/344/273/266.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/107-/345/205/263/344/272/216/350/245/277/345/214/227/346/210/230/345/234/272/347/232/204/344/275/234/346/210/230/346/226/271/351/222/210.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/108-/350/222/213/344/273/213/347/237/263/346/224/277/345/272/234/345/267/262/345/244/204/345/234/250/345/205/250/346/260/221/347/232/204/345/214/205/345/233/264/344/270/255.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/109-/350/247/243/346/224/276/346/210/230/344/272/211/347/254/254/344/272/214/345/271/264/347/232/204/346/210/230/347/225/245/346/226/271/351/222/210.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/110-/344/270/255/345/233/275/344/272/272/346/260/221/350/247/243/346/224/276/345/206/233/345/256/243/350/250/200.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/111-/344/270/255/345/233/275/344/272/272/346/260/221/350/247/243/346/224/276/345/206/233/346/200/273/351/203/250/345/205/263/344/272/216/351/207/215/350/241/214/351/242/201/345/270/203/344/270/211/345/244/247/347/272/252/345/276/213/345/205/253/351/241/271/346/263/250/346/204/217/347/232/204/350/256/255/344/273/244.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/112-/347/233/256/345/211/215/345/275/242/345/212/277/345/222/214/346/210/221/344/273/254/347/232/204/344/273/273/345/212/241.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/113-/345/205/263/344/272/216/345/273/272/347/253/213/346/212/245/345/221/212/345/210/266/345/272/246.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/114-/345/205/263/344/272/216/347/233/256/345/211/215/345/205/232/347/232/204/346/224/277/347/255/226/344/270/255/347/232/204/345/207/240/344/270/252/351/207/215/350/246/201/351/227/256/351/242/230.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/115-/345/206/233/351/230/237/345/206/205/351/203/250/347/232/204/346/260/221/344/270/273/350/277/220/345/212/250.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/116-/345/234/250/344/270/215/345/220/214/345/234/260/345/214/272/345/256/236/346/226/275/345/234/237/345/234/260/346/263/225/347/232/204/344/270/215/345/220/214/347/255/226/347/225/245.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/117-/347/272/240/346/255/243/345/234/237/345/234/260/346/224/271/351/235/251/345/256/243/344/274/240/344/270/255/347/232/204/342/200/234/345/267/246/342/200/235/345/200/276/351/224/231/350/257/257.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/118-/346/226/260/350/247/243/346/224/276/345/214/272/345/234/237/345/234/260/346/224/271/351/235/251/350/246/201/347/202/271.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/119-/345/205/263/344/272/216/345/267/245/345/225/206/344/270/232/346/224/277/347/255/226.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/120-/345/205/263/344/272/216/346/260/221/346/227/217/350/265/204/344/272/247/351/230/266/347/272/247/345/222/214/345/274/200/346/230/216/347/273/205/345/243/253/351/227/256/351/242/230.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/121-/350/257/204/350/245/277/345/214/227/345/244/247/346/215/267/345/205/274/350/256/272/350/247/243/346/224/276/345/206/233/347/232/204/346/226/260/345/274/217/346/225/264/345/206/233/350/277/220/345/212/250.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/122-/345/205/263/344/272/216/346/203/205/345/206/265/347/232/204/351/200/232/346/212/245.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/123-/345/234/250/346/231/213/347/273/245/345/271/262/351/203/250/344/274/232/350/256/256/344/270/212/347/232/204/350/256/262/350/257/235.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/124-/345/257/271/346/231/213/347/273/245/346/227/245/346/212/245/347/274/226/350/276/221/344/272/272/345/221/230/347/232/204/350/260/210/350/257/235.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/125-/345/206/215/345/205/213/346/264/233/351/230/263/345/220/216/347/273/231/346/264/233/351/230/263/345/211/215/347/272/277/346/214/207/346/214/245/351/203/250/347/232/204/347/224/265/346/212/245.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/126-/346/226/260/350/247/243/346/224/276/345/214/272/345/206/234/346/235/221/345/267/245/344/275/234/347/232/204/347/255/226/347/225/245/351/227/256/351/242/230.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/127-/344/270/200/344/271/235/345/233/233/345/205/253/345/271/264/347/232/204/345/234/237/345/234/260/346/224/271/351/235/251/345/267/245/344/275/234/345/222/214/346/225/264/345/205/232/345/267/245/344/275/234.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/128-/345/205/263/344/272/216/350/276/275/346/262/210/346/210/230/345/275/271/347/232/204/344/275/234/346/210/230/346/226/271/351/222/210.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/129-/345/205/263/344/272/216/345/201/245/345/205/250/345/205/232/345/247/224/345/210/266.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/130-/344/270/255/345/205/261/344/270/255/345/244/256/345/205/263/344/272/216/344/271/235/346/234/210/344/274/232/350/256/256/347/232/204/351/200/232/347/237/245.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/131-/345/205/263/344/272/216/346/267/256/346/265/267/346/210/230/345/275/271/347/232/204/347/232/204/344/275/234/346/210/230/346/226/271/351/222/210.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/132-/345/205/250/344/270/226/347/225/214/351/235/251/345/221/275/345/212/233/351/207/217/345/233/242/347/273/223/350/265/267/346/235/245/357/274/214/345/217/215/345/257/271/345/270/235/345/233/275/344/270/273/344/271/211/347/232/204/344/276/265/347/225/245.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/133-/344/270/255/345/233/275/345/206/233/344/272/213/345/275/242/345/212/277/347/232/204/351/207/215/345/244/247/345/217/230/345/214/226.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/134-/345/205/263/344/272/216/345/271/263/346/264/245/346/210/230/345/275/271/347/232/204/344/275/234/346/210/230/346/226/271/351/222/210.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/135-/346/225/246/344/277/203/346/235/234/350/201/277/346/230/216/347/255/211/346/212/225/351/231/215/344/271/246.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/136-/345/260/206/351/235/251/345/221/275/350/277/233/350/241/214/345/210/260/345/272/225.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/137-/350/257/204/346/210/230/347/212/257/346/261/202/345/222/214.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/138-/344/270/255/345/205/261/344/270/255/345/244/256/346/257/233/346/263/275/344/270/234/344/270/273/345/270/255/345/205/263/344/272/216/346/227/266/345/261/200/347/232/204/345/243/260/346/230/216.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/139-/344/270/255/345/205/261/345/217/221/350/250/200/344/272/272/350/257/204/345/215/227/344/272/254/350/241/214/346/224/277/351/231/242/347/232/204/345/206/263/350/256/256.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/140-/344/270/255/345/205/261/345/217/221/350/250/200/344/272/272/345/205/263/344/272/216/345/221/275/344/273/244/345/233/275/346/260/221/345/205/232/345/217/215/345/212/250/346/224/277/345/272/234/351/207/215/346/226/260/351/200/256/346/215/225/345/211/215/346/227/245/346/234/254/344/276/265/345/215/216/345/206/233/346/200/273/345/217/270/344/273/244/345/206/210/346/235/221/345/256/201/346/254/241/345/222/214/351/200/256/346/215/225/345/233/275/346/260/221/345/205/232/345/206/205/346/210/230/347/275/252/347/212/257/347/232/204/350/260/210/350/257/235.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/141-/344/270/255/345/205/261/345/217/221/350/250/200/344/272/272/345/205/263/344/272/216/345/222/214/345/271/263/346/235/241/344/273/266/345/277/205/351/241/273/345/214/205/346/213/254/346/203/251/345/212/236/346/227/245/346/234/254/346/210/230/347/212/257/345/222/214/345/233/275/346/260/221/345/205/232/346/210/230/347/212/257/347/232/204/345/243/260/346/230/216.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/142-/346/212/212/345/206/233/351/230/237/345/217/230/344/270/272/345/267/245/344/275/234/351/230/237.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/143-/345/233/233/345/210/206/344/272/224/350/243/202/347/232/204/345/217/215/345/212/250/346/264/276/344/270/272/344/273/200/344/271/210/350/277/230/350/246/201/347/251/272/345/226/212/342/200/234/345/205/250/351/235/242/345/222/214/345/271/263/342/200/235/357/274/237.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/144-/345/233/275/346/260/221/345/205/232/345/217/215/345/212/250/346/264/276/347/224/261/342/200/234/345/221/274/345/220/201/345/222/214/345/271/263/342/200/235/345/217/230/344/270/272/345/221/274/345/220/201/346/210/230/344/272/211.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/145-/350/257/204/345/233/275/346/260/221/345/205/232/345/257/271/346/210/230/344/272/211/350/264/243/344/273/273/351/227/256/351/242/230/347/232/204/345/207/240/347/247/215/347/255/224/346/241/210.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/146-/345/234/250/344/270/255/345/233/275/345/205/261/344/272/247/345/205/232/347/254/254/344/270/203/345/261/212/344/270/255/345/244/256/345/247/224/345/221/230/344/274/232/347/254/254/344/272/214/346/254/241/345/205/250/344/275/223/344/274/232/350/256/256/344/270/212/347/232/204/346/212/245/345/221/212.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/147-/345/205/232/345/247/224/344/274/232/347/232/204/345/267/245/344/275/234/346/226/271/346/263/225.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/148-/345/215/227/344/272/254/346/224/277/345/272/234/345/220/221/344/275/225/345/244/204/345/216/273/357/274/237.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/149-/345/220/221/345/205/250/345/233/275/350/277/233/345/206/233/347/232/204/345/221/275/344/273/244.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/150-/344/270/255/345/233/275/344/272/272/346/260/221/350/247/243/346/224/276/345/206/233/345/270/203/345/221/212.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/151-/344/270/255/345/233/275/344/272/272/346/260/221/350/247/243/346/224/276/345/206/233/346/200/273/351/203/250/345/217/221/350/250/200/344/272/272/344/270/272/350/213/261/345/233/275/345/206/233/350/210/260/346/232/264/350/241/214/345/217/221/350/241/250/347/232/204/345/243/260/346/230/216.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/152-/345/234/250/346/226/260/346/224/277/346/262/273/345/215/217/345/225/206/344/274/232/350/256/256/347/255/271/345/244/207/344/274/232/344/270/212/347/232/204/350/256/262/350/257/235.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/153-/350/256/272/344/272/272/346/260/221/346/260/221/344/270/273/344/270/223/346/224/277--/347/272/252/345/277/265/344/270/255/345/233/275/345/205/261/344/272/247/345/205/232/344/272/214/345/215/201/345/205/253/345/221/250/345/271/264.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/154-/344/270/242/346/216/211/345/271/273/346/203/263/357/274/214/345/207/206/345/244/207/346/226/227/344/272/211.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/155-/345/210/253/344/272/206/357/274/214/345/217/270/345/276/222/351/233/267/347/231/273.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/156-/342/200/234/345/217/213/350/260/212/342/200/235/357/274/214/350/277/230/346/230/257/344/276/265/347/225/245/357/274/237.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/157-/344/270/272/344/273/200/344/271/210/350/246/201/350/256/250/350/256/272/347/231/275/347/232/256/344/271/246/357/274/237.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/158-/345/224/257/345/277/203/345/216/206/345/217/262/350/247/202/347/232/204/347/240/264/344/272/247.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/159-/344/270/255/345/233/275/344/272/272/346/260/221/347/253/231/350/265/267/346/235/245/344/272/206.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/160-/344/270/255/345/233/275/344/272/272/346/260/221/345/244/247/345/233/242/347/273/223/344/270/207/345/262/201.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/161-/344/272/272/346/260/221/350/213/261/351/233/204/344/273/254/346/260/270/345/236/202/344/270/215/346/234/275.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/162-/346/260/270/350/277/234/344/277/235/346/214/201/350/211/260/350/213/246/345/245/213/346/226/227/347/232/204/344/275/234/351/243/216.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/163-/345/276/201/350/257/242/345/257/271/345/276/205/345/257/214/345/206/234/347/255/226/347/225/245/351/227/256/351/242/230/347/232/204/346/204/217/350/247/201.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/164-/344/270/272/344/272/211/345/217/226/345/233/275/345/256/266/350/264/242/346/224/277/347/273/217/346/265/216/347/212/266/345/206/265/347/232/204/345/237/272/346/234/254/345/245/275/350/275/254/350/200/214/346/226/227/344/272/211.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/165-/344/270/215/350/246/201/345/233/233/351/235/242/345/207/272/345/207/273.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/166-/345/201/232/344/270/200/344/270/252/345/256/214/345/205/250/347/232/204/351/235/251/345/221/275/346/264/276.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/167-/344/275/240/344/273/254/346/230/257/345/205/250/346/260/221/346/227/217/347/232/204/346/250/241/350/214/203/344/272/272/347/211/251.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/168-/347/273/231/344/270/255/345/233/275/344/272/272/346/260/221/345/277/227/346/204/277/345/206/233/347/232/204/345/221/275/344/273/244.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/169-/344/270/255/345/233/275/344/272/272/346/260/221/345/277/227/346/204/277/345/206/233/350/246/201/347/210/261/346/212/244/346/234/235/351/262/234/347/232/204/344/270/200/345/261/261/344/270/200/346/260/264/344/270/200/350/215/211/344/270/200/346/234/250.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/170-/344/270/255/345/205/261/344/270/255/345/244/256/346/224/277/346/262/273/345/261/200/346/211/251/345/244/247/344/274/232/350/256/256/345/206/263/350/256/256/350/246/201/347/202/271.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/171-/351/225/207/345/216/213/345/217/215/351/235/251/345/221/275/345/277/205/351/241/273/345/256/236/350/241/214/345/205/232/347/232/204/347/276/244/344/274/227/350/267/257/347/272/277.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/172-/351/225/207/345/216/213/345/217/215/351/235/251/345/221/275/345/277/205/351/241/273/346/211/223/345/276/227/347/250/263/357/274/214/346/211/223/345/276/227/345/207/206/357/274/214/346/211/223/345/276/227/347/213/240.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/173-/345/272/224/345/275/223/351/207/215/350/247/206/347/224/265/345/275/261/343/200/212/346/255/246/350/256/255/344/274/240/343/200/213/347/232/204/350/256/250/350/256/272.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/174-/344/270/211/345/244/247/350/277/220/345/212/250/347/232/204/344/274/237/345/244/247/350/203/234/345/210/251.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/175-/345/205/263/344/272/216/342/200/234/344/270/211/345/217/215/342/200/235/343/200/201/342/200/234/344/272/224/345/217/215/342/200/235/347/232/204/346/226/227/344/272/211.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/176-/346/212/212/345/206/234/344/270/232/344/272/222/345/212/251/345/220/210/344/275/234/345/275/223/344/275/234/344/270/200/344/273/266/345/244/247/344/272/213/345/216/273/345/201/232.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/177-/345/205/203/346/227/246/347/245/235/350/257/215.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/178-/344/270/255/345/205/261/344/270/255/345/244/256/345/205/263/344/272/216/350/245/277/350/227/217/345/267/245/344/275/234/346/226/271/351/222/210/347/232/204/346/214/207/347/244/272.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/179-/345/267/245/344/272/272/351/230/266/347/272/247/344/270/216/350/265/204/344/272/247/351/230/266/347/272/247/347/232/204/347/237/233/347/233/276/346/230/257/345/233/275/345/206/205/347/232/204/344/270/273/350/246/201/347/237/233/347/233/276.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/180-/345/233/242/347/273/223/350/265/267/346/235/245/357/274/214/345/210/222/346/270/205/346/225/214/346/210/221/347/225/214/351/231/220.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/181-/347/245/235/350/264/272/344/270/255/345/233/275/344/272/272/346/260/221/345/277/227/346/204/277/345/206/233/347/232/204/351/207/215/345/244/247/350/203/234/345/210/251.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/182-/345/217/215/345/257/271/345/256/230/345/203/232/344/270/273/344/271/211/343/200/201/345/221/275/344/273/244/344/270/273/344/271/211/345/222/214/350/277/235/346/263/225/344/271/261/347/272/252.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/183-/346/211/271/345/210/244/345/244/247/346/261/211/346/227/217/344/270/273/344/271/211.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/184-/350/247/243/345/206/263/342/200/234/344/272/224/345/244/232/342/200/235/351/227/256/351/242/230.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/185-/345/257/271/345/210/230/345/260/221/345/245/207/343/200/201/346/235/250/345/260/232/346/230/206/347/240/264/345/235/217/347/272/252/345/276/213/346/223/205/350/207/252/344/273/245/344/270/255/345/244/256/345/220/215/344/271/211/345/217/221/345/207/272/346/226/207/344/273/266/347/232/204/346/211/271/350/257/204.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/186-/346/211/271/345/210/244/347/246/273/345/274/200/346/200/273/350/267/257/347/272/277/347/232/204/345/217/263/345/200/276/350/247/202/347/202/271.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/187-/351/235/222/345/271/264/345/233/242/347/232/204/345/267/245/344/275/234/350/246/201/347/205/247/351/241/276/351/235/222/345/271/264/347/232/204/347/211/271/347/202/271.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/188-/345/205/263/344/272/216/345/233/275/345/256/266/350/265/204/346/234/254/344/270/273/344/271/211.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/189-/345/205/232/345/234/250/350/277/207/346/270/241/346/227/266/346/234/237/347/232/204/346/200/273/350/267/257/347/272/277.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/190-/345/217/215/345/257/271/345/205/232/345/206/205/347/232/204/350/265/204/344/272/247/351/230/266/347/272/247/346/200/235/346/203/263.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/191-/346/224/271/351/200/240/350/265/204/346/234/254/344/270/273/344/271/211/345/267/245/345/225/206/344/270/232/347/232/204/345/277/205/347/273/217/344/271/213/350/267/257.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/192-/346/212/227/347/276/216/346/217/264/346/234/235/347/232/204/344/274/237/345/244/247/350/203/234/345/210/251/345/222/214/344/273/212/345/220/216/347/232/204/344/273/273/345/212/241.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/193-/346/211/271/345/210/244/346/242/201/346/274/261/346/272/237/347/232/204/345/217/215/345/212/250/346/200/235/346/203/263.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/194-/345/205/263/344/272/216/345/206/234/344/270/232/344/272/222/345/212/251/345/220/210/344/275/234/347/232/204/344/270/244/346/254/241/350/260/210/350/257/235.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/195-/345/205/263/344/272/216/344/270/255/345/215/216/344/272/272/346/260/221/345/205/261/345/222/214/345/233/275/345/256/252/346/263/225/350/215/211/346/241/210.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/196-/344/270/272/345/273/272/350/256/276/344/270/200/344/270/252/344/274/237/345/244/247/347/232/204/347/244/276/344/274/232/344/270/273/344/271/211/345/233/275/345/256/266/350/200/214/345/245/213/346/226/227.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/197-/345/205/263/344/272/216/343/200/212/347/272/242/346/245/274/346/242/246/343/200/213/347/240/224/347/251/266/351/227/256/351/242/230/347/232/204/344/277/241.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/198-/345/216/237/345/255/220/345/274/271/345/220/223/344/270/215/345/200/222/344/270/255/345/233/275/344/272/272/346/260/221.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/199-/345/234/250/344/270/255/345/233/275/345/205/261/344/272/247/345/205/232/345/205/250/345/233/275/344/273/243/350/241/250/344/274/232/350/256/256/344/270/212/347/232/204/350/256/262/350/257/235.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/200-/351/251/263/342/200/234/350/210/206/350/256/272/344/270/200/345/276/213/342/200/235.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/201-/343/200/212/345/205/263/344/272/216/350/203/241/351/243/216/345/217/215/351/235/251/345/221/275/351/233/206/345/233/242/347/232/204/346/235/220/346/226/231/343/200/213/347/232/204/345/272/217/350/250/200/345/222/214/346/214/211/350/257/255.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/202-/345/205/263/344/272/216/345/206/234/344/270/232/345/220/210/344/275/234/345/214/226/351/227/256/351/242/230.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/203-/345/206/234/344/270/232/345/220/210/344/275/234/345/214/226/345/277/205/351/241/273/344/276/235/351/235/240/345/205/232/345/233/242/345/221/230/345/222/214/350/264/253/345/206/234/344/270/213/344/270/255/345/206/234.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/204-/345/206/234/344/270/232/345/220/210/344/275/234/345/214/226/347/232/204/344/270/200/345/234/272/350/276/251/350/256/272/345/222/214/345/275/223/345/211/215/347/232/204/351/230/266/347/272/247/346/226/227/344/272/211.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/205-/343/200/212/344/270/255/345/233/275/345/206/234/346/235/221/347/232/204/347/244/276/344/274/232/344/270/273/344/271/211/351/253/230/346/275/256/343/200/213/347/232/204/345/272/217/350/250/200.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/206-/343/200/212/344/270/255/345/233/275/345/206/234/346/235/221/347/232/204/347/244/276/344/274/232/344/270/273/344/271/211/351/253/230/346/275/256/343/200/213/347/232/204/346/214/211/350/257/255.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/207-/345/276/201/350/257/242/345/257/271/345/206/234/344/270/232/345/215/201/344/270/203/346/235/241/347/232/204/346/204/217/350/247/201.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/208-/345/212/240/345/277/253/346/211/213/345/267/245/344/270/232/347/232/204/347/244/276/344/274/232/344/270/273/344/271/211/346/224/271/351/200/240.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/209-/350/256/272/345/215/201/345/244/247/345/205/263/347/263/273.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/210-/347/276/216/345/270/235/345/233/275/344/270/273/344/271/211/346/230/257/347/272/270/350/200/201/350/231/216.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/211-/345/242/236/345/274/272/345/205/232/347/232/204/345/233/242/347/273/223/357/274/214/347/273/247/346/211/277/345/205/232/347/232/204/344/274/240/347/273/237.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/212-/346/210/221/344/273/254/345/205/232/347/232/204/342/200/224/344/272/233/345/216/206/345/217/262/347/273/217/351/252/214.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/213-/347/272/252/345/277/265/345/255/231/344/270/255/345/261/261/345/205/210/347/224/237.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/214-/345/234/250/344/270/255/345/233/275/345/205/261/344/272/247/345/205/232/347/254/254/345/205/253/345/261/212/344/270/255/345/244/256/345/247/224/345/221/230/344/274/232/347/254/254/344/272/214/346/254/241/345/205/250/344/275/223/344/274/232/350/256/256/344/270/212/347/232/204/350/256/262/350/257/235.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/215-/345/234/250/347/234/201/345/270/202/350/207/252/346/262/273/345/214/272/345/205/232/345/247/224/344/271/246/350/256/260/344/274/232/350/256/256/344/270/212/347/232/204/350/256/262/350/257/235.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/216-/345/205/263/344/272/216/346/255/243/347/241/256/345/244/204/347/220/206/344/272/272/346/260/221/345/206/205/351/203/250/347/237/233/347/233/276/347/232/204/351/227/256/351/242/230.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/217-/345/234/250/344/270/255/345/233/275/345/205/261/344/272/247/345/205/232/345/205/250/345/233/275/345/256/243/344/274/240/345/267/245/344/275/234/344/274/232/350/256/256/344/270/212/347/232/204/350/256/262/350/257/235.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/218-/345/235/232/346/214/201/350/211/260/350/213/246/345/245/213/346/226/227/357/274/214/345/257/206/345/210/207/350/201/224/347/263/273/347/276/244/344/274/227.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/219-/344/272/213/346/203/205/346/255/243/345/234/250/350/265/267/345/217/230/345/214/226.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/220-/344/270/255/345/233/275/345/205/261/344/272/247/345/205/232/346/230/257/345/205/250/344/270/255/345/233/275/344/272/272/346/260/221/347/232/204/351/242/206/345/257/274/346/240/270/345/277/203.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/221-/347/273/204/347/273/207/345/212/233/351/207/217/345/217/215/345/207/273/345/217/263/346/264/276/345/210/206/345/255/220/347/232/204/347/214/226/347/213/202/350/277/233/346/224/273.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/222-/346/226/207/346/261/207/346/212/245/347/232/204/350/265/204/344/272/247/351/230/266/347/272/247/346/226/271/345/220/221/345/272/224/345/275/223/346/211/271/345/210/244.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/223-/346/211/223/351/200/200/350/265/204/344/272/247/351/230/266/347/272/247/345/217/263/346/264/276/347/232/204/350/277/233/346/224/273.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/224-/344/270/200/344/271/235/344/272/224/344/270/203/345/271/264/345/244/217/345/255/243/347/232/204/345/275/242/345/212/277.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/225-/345/201/232/351/235/251/345/221/275/347/232/204/344/277/203/350/277/233/346/264/276.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/226-/345/235/232/345/256/232/345/234/260/347/233/270/344/277/241/347/276/244/344/274/227/347/232/204/345/244/247/345/244/232/346/225/260.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/227-/345/205/232/345/206/205/345/233/242/347/273/223/347/232/204/350/276/251/350/257/201/346/226/271/346/263/225.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/books/src/228-/344/270/200/345/210/207/345/217/215/345/212/250/346/264/276/351/203/275/346/230/257/347/272/270/350/200/201/350/231/216.md" +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/references/research/10-personality-profile.md +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/references/research/11-analysis-frameworks.md +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/references/research/12-strategy-frameworks.md +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/references/research/13-organization-action.md +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/references/research/14-voice-and-dialogue.md +0 -0
- /package/template/workflows/person/{M-mao-zedong-cognitive-os → person-m-mao-zedong-cognitive-os}/references/research/15-quote-bank.md +0 -0
- /package/template/workflows/person/{S-steelman-deliberation/_templates → person-s-steelman-deliberation/assets/templates}/decision-template.md +0 -0
- /package/template/workflows/person/{S-steelman-deliberation/_templates → person-s-steelman-deliberation/assets/templates}/steelman-dossier-template.md +0 -0
- /package/template/workflows/person/{S-steelman-deliberation → person-s-steelman-deliberation/references}/deliberate.md +0 -0
- /package/template/workflows/person/{S-steelman-deliberation → person-s-steelman-deliberation/references}/evidence-gate.md +0 -0
- /package/template/workflows/person/{S-steelman-deliberation → person-s-steelman-deliberation/references}/judge.md +0 -0
- /package/template/workflows/specdev/{D-diagnose-bugs → specdev-d-diagnose-bugs/assets}/diagnosis-template.md +0 -0
- /package/template/workflows/specdev/{D-diagnose-bugs → specdev-d-diagnose-bugs/references}/hypothesis-and-instrumentation.md +0 -0
- /package/template/workflows/specdev/{D-diagnose-bugs → specdev-d-diagnose-bugs}/scripts/hitl-loop.template.sh +0 -0
- /package/template/workflows/specdev/{G-grill-with-docs → specdev-g-grill-with-docs/assets}/design-tree-template.json +0 -0
- /package/template/workflows/specdev/{G-grill-with-docs → specdev-g-grill-with-docs/references}/grilling-protocol.md +0 -0
- /package/template/workflows/specdev/{G-grill-with-docs → specdev-g-grill-with-docs/references}/log-format.md +0 -0
- /package/template/workflows/specdev/{G-grill-with-docs → specdev-g-grill-with-docs/references}/stakeholder-questionnaire.md +0 -0
- /package/template/workflows/specdev/{I-implement → specdev-i-implement/references}/tdd-mocking.md +0 -0
- /package/template/workflows/specdev/{I-implement → specdev-i-implement/references}/tdd-test-design.md +0 -0
- /package/template/workflows/specdev/{P-goal-plan → specdev-p-goal-plan}/references/multi-conflict-and-drift.md +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype/assets}/logic-template.md +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/METHODOLOGY.md +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/README.md +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/data/extended-projects.json +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/data/projects.json +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/reference/USAGE.md +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/reference/design-tokens.css +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/report/OPEN_SOURCE_UI_RESEARCH_2026.md +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/research/PROJECT_TEMPLATE.md +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/research/README.md +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/research/claude-code-modern-clients.md +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/research/creative-ai-communication.md +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/research/data-dev-tools.md +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/research/personal-multiplatform-apps.md +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/research/productivity-collaboration.md +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/01-dense-ide.html +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/02-monochrome-console.html +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/03-soft-personal-ai.html +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/04-responsive-web.html +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/05-mobile-supervisor.html +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/06-cross-platform-workspace.html +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/07-local-first-content.html +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/08-media-first.html +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/README.md +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/assets/ATTRIBUTION.md +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/assets/landscape.jpg +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/assets/lucide.js +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/assets/mountain.jpg +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/assets/workspace.jpg +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/index.html +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/package-lock.json +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/package.json +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/screenshots/index-desktop.png +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/scripts/gallery.js +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/styles/base.css +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/styles/pages.css +0 -0
- /package/template/workflows/specdev/{P-prototype → specdev-p-prototype}/design-library/research-snapshot/ui-gallery/tests/gallery.spec.js +0 -0
- /package/template/workflows/specdev/{P-prototype/tools → specdev-p-prototype/scripts}/materialize-prototype.mjs +0 -0
- /package/template/workflows/specdev/{R-retro → specdev-r-retro/assets}/retro-template.md +0 -0
- /package/template/workflows/specdev/{R-review-architecture → specdev-r-review-architecture}/references/performance-review.md +0 -0
- /package/template/workflows/specdev/{S-spec → specdev-s-spec/assets}/spec-template.md +0 -0
- /package/template/workflows/specdev/{T-triage → specdev-t-triage/assets}/pr-record-template.md +0 -0
- /package/template/workflows/specdev/{T-triage → specdev-t-triage/assets}/publish-template.md +0 -0
- /package/template/workflows/specdev/{T-triage → specdev-t-triage/assets}/source-template.md +0 -0
- /package/template/workflows/specdev/{T-triage → specdev-t-triage/assets}/triage-run-template.md +0 -0
- /package/template/workflows/specdev/{T-triage → specdev-t-triage}/references/classification-map.md +0 -0
- /package/template/workflows/specdev/{T-triage → specdev-t-triage}/references/public-projection.md +0 -0
- /package/template/workflows/specdev/{T-triage → specdev-t-triage}/references/release-authentication.md +0 -0
- /package/template/workflows/specdev/{T-triage → specdev-t-triage}/references/release-notes-injection.md +0 -0
- /package/template/workflows/specdev/{T-triage → specdev-t-triage}/references/workflow-yaml-reference.md +0 -0
- /package/template/workflows/specdev/{T-triage → specdev-t-triage}/scripts/github-transport.mjs +0 -0
- /package/template/workflows/specdev/{W-wayfinder → specdev-w-wayfinder/assets}/investigation-ticket-template.md +0 -0
- /package/template/workflows/specdev/{W-wayfinder → specdev-w-wayfinder/assets}/solution-comment-template.md +0 -0
- /package/template/workflows/specdev/{W-wayfinder → specdev-w-wayfinder}/references/initiative-template.json +0 -0
|
@@ -19,46 +19,51 @@ import {
|
|
|
19
19
|
import { execFileSync } from "node:child_process";
|
|
20
20
|
import { dirname, basename, extname, join, relative, resolve, sep, isAbsolute } from "node:path";
|
|
21
21
|
import { fileURLToPath } from "node:url";
|
|
22
|
+
import { parseFrontmatter as parseYaml, validateSkill } from "../../../../lib/speculo-runtime.mjs";
|
|
23
|
+
|
|
24
|
+
import * as runtime from "../../../../lib/speculo-runtime.mjs";
|
|
22
25
|
|
|
23
26
|
import {
|
|
24
27
|
validateTicketPlan, validatePlanMap, validateInvocationCoverage,
|
|
25
|
-
validateGoalMap, validateInitiative, resolveProjectSource,
|
|
28
|
+
validateGoalMap, validateInitiative, resolveProjectSource, readChangeExecution, readSpecification, resolveToolContext, validateExecutionPolicy, canonicalToolPath, resolveSnapshotContext, readLightweightGoal, validateAcceptanceEvidence,
|
|
26
29
|
} from "./plan-contract.mjs";
|
|
27
30
|
|
|
31
|
+
import { validateChangeClosure, readChangeOwner } from "./change-artifacts.mjs";
|
|
28
32
|
import { validateRecord, validateRecords } from "./delivery-artifacts.mjs";
|
|
29
33
|
import { reviewScopeCLI } from "./review-scope.mjs";
|
|
30
34
|
import { ENGINEERING_KINDS, validateEngineeringArtifacts, validateEngineeringPackage } from "./engineering-evidence.mjs";
|
|
31
35
|
|
|
32
36
|
const DOMAIN_SCHEMA_VERSION = 3;
|
|
33
|
-
const CONFIG_SCHEMA_VERSION =
|
|
34
|
-
const GOAL_PLAN_SCHEMA_VERSION =
|
|
37
|
+
const CONFIG_SCHEMA_VERSION = 7;
|
|
38
|
+
const GOAL_PLAN_SCHEMA_VERSION = 7;
|
|
35
39
|
const IMPLEMENTATION_MAP_SCHEMA_VERSION = 1;
|
|
36
|
-
const IMPLEMENTATION_PLAN_SCHEMA_VERSION =
|
|
40
|
+
const IMPLEMENTATION_PLAN_SCHEMA_VERSION = 2;
|
|
37
41
|
const CHANGE_STATUS_SCHEMA_VERSION = 6;
|
|
38
42
|
const GLOBAL_STATUS_SCHEMA_VERSION = 5;
|
|
39
43
|
const WORKFLOW_PREFIX = "{roots.workflows}/specdev/";
|
|
40
44
|
const STATE_PREFIX = "{roots.state}/specdev/";
|
|
41
45
|
const STATE_ROOT_PREFIX = "{roots.state}/";
|
|
46
|
+
const REFERENCES_PREFIX = "{roots.references}/";
|
|
42
47
|
const SKILLS_PREFIX = "{roots.skills}/";
|
|
43
48
|
const COMMANDS_PREFIX = "{roots.commands}/";
|
|
44
49
|
const CHANGE_NAME = /^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
45
50
|
|
|
46
51
|
const EXPECTED_WORKS = new Set([
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
52
|
+
"specdev-a-archive-and-consolidate",
|
|
53
|
+
"specdev-c-code-review",
|
|
54
|
+
"specdev-d-diagnose-bugs",
|
|
55
|
+
"specdev-g-grill-with-docs",
|
|
56
|
+
"specdev-i-implement",
|
|
57
|
+
"specdev-i-init-setup",
|
|
58
|
+
"specdev-l-learn",
|
|
59
|
+
"specdev-p-goal-plan",
|
|
60
|
+
"specdev-p-prototype",
|
|
61
|
+
"specdev-r-review-architecture",
|
|
62
|
+
"specdev-r-retro",
|
|
63
|
+
"specdev-s-spec",
|
|
64
|
+
"specdev-t-tickets",
|
|
65
|
+
"specdev-t-triage",
|
|
66
|
+
"specdev-w-wayfinder",
|
|
62
67
|
]);
|
|
63
68
|
const EXPECTED_COMMON_DIRS = new Set(["rules", "schemas", "skills", "tools"]);
|
|
64
69
|
const VALID_TICKET_STATUS = new Set([
|
|
@@ -167,13 +172,15 @@ const VALID_STAGES = new Set([
|
|
|
167
172
|
"tickets",
|
|
168
173
|
"goal-plan",
|
|
169
174
|
"implement",
|
|
170
|
-
"learn
|
|
175
|
+
"learn",
|
|
171
176
|
"retro",
|
|
172
177
|
"pr-delivery",
|
|
173
178
|
"review",
|
|
174
179
|
"prototype",
|
|
175
180
|
"wayfinder",
|
|
176
181
|
"complete",
|
|
182
|
+
"archive-ready",
|
|
183
|
+
"archived",
|
|
177
184
|
]);
|
|
178
185
|
const REQUIRED_TICKET_KEYS = new Set([
|
|
179
186
|
"schema_version",
|
|
@@ -214,7 +221,7 @@ const REQUIRED_GOAL_PLAN_SECTIONS = new Set([
|
|
|
214
221
|
]);
|
|
215
222
|
const REQUIRED_LEAD_GOAL_PLAN_MARKERS = [
|
|
216
223
|
"### Lead Orchestration",
|
|
217
|
-
"
|
|
224
|
+
"Concurrent implementations",
|
|
218
225
|
"Read-only agents",
|
|
219
226
|
"execution-time dynamic",
|
|
220
227
|
"### Ticket Workspace and Integration",
|
|
@@ -269,7 +276,7 @@ function toPosix(value) {
|
|
|
269
276
|
}
|
|
270
277
|
|
|
271
278
|
function readText(path) {
|
|
272
|
-
return
|
|
279
|
+
return runtime.readUtf8ArtifactSync(path);
|
|
273
280
|
}
|
|
274
281
|
|
|
275
282
|
function isFile(path) {
|
|
@@ -291,196 +298,17 @@ function walk(root) {
|
|
|
291
298
|
return paths;
|
|
292
299
|
}
|
|
293
300
|
|
|
294
|
-
function
|
|
295
|
-
const value = raw.trim();
|
|
296
|
-
if (value === "true" || value === "True") return true;
|
|
297
|
-
if (value === "false" || value === "False") return false;
|
|
298
|
-
if (value === "null" || value === "Null" || value === "~") return null;
|
|
299
|
-
if (/^-?\d+$/.test(value)) return Number(value);
|
|
300
|
-
if (
|
|
301
|
-
(value.startsWith('"') && value.endsWith('"')) ||
|
|
302
|
-
(value.startsWith("'") && value.endsWith("'"))
|
|
303
|
-
) {
|
|
304
|
-
return value.slice(1, -1);
|
|
305
|
-
}
|
|
306
|
-
if (value.startsWith("[") && value.endsWith("]")) {
|
|
307
|
-
// JSON object arrays are used by the additive Skill invocation contract.
|
|
308
|
-
// Keep the existing plain YAML scalar-list form for old artifacts.
|
|
309
|
-
try { return JSON.parse(value); } catch { /* legacy scalar list below */ }
|
|
310
|
-
const inner = value.slice(1, -1).trim();
|
|
311
|
-
if (inner.startsWith("{")) throw new Error("invalid JSON object array in frontmatter");
|
|
312
|
-
if (!inner) return [];
|
|
313
|
-
return inner.split(",").map((item) => parseScalar(item));
|
|
314
|
-
}
|
|
315
|
-
if (value.startsWith("{") && value.endsWith("}")) {
|
|
316
|
-
try {
|
|
317
|
-
return JSON.parse(value);
|
|
318
|
-
} catch {
|
|
319
|
-
return value;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
return value;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
function findSpecdevConfigByAncestry(change) {
|
|
326
|
-
let current = resolve(change);
|
|
327
|
-
while (true) {
|
|
328
|
-
const candidate = join(current, ".speculo", "specdev", "config.json");
|
|
329
|
-
if (isFile(candidate)) {
|
|
330
|
-
try {
|
|
331
|
-
return JSON.parse(readText(candidate));
|
|
332
|
-
} catch {
|
|
333
|
-
return null;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
const parent = dirname(current);
|
|
337
|
-
if (parent === current) return null;
|
|
338
|
-
current = parent;
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
function uniqueResolved(paths) {
|
|
343
|
-
const seen = new Set();
|
|
344
|
-
const result = [];
|
|
345
|
-
for (const path of paths) {
|
|
346
|
-
const resolved = resolve(path);
|
|
347
|
-
if (seen.has(resolved)) continue;
|
|
348
|
-
seen.add(resolved);
|
|
349
|
-
result.push(resolved);
|
|
350
|
-
}
|
|
351
|
-
return result;
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
function ancestorsOf(start) {
|
|
355
|
-
const dirs = [];
|
|
356
|
-
let current = resolve(start);
|
|
357
|
-
while (true) {
|
|
358
|
-
dirs.push(current);
|
|
359
|
-
const parent = dirname(current);
|
|
360
|
-
if (parent === current) break;
|
|
361
|
-
current = parent;
|
|
362
|
-
}
|
|
363
|
-
return dirs;
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
function parseWorkspaceCandidate(filePath, projectRoot) {
|
|
367
|
-
if (!isFile(filePath)) return null;
|
|
368
|
-
let data;
|
|
301
|
+
function resolveWorkspaceContract(repoRoot, change, options = {}) {
|
|
369
302
|
try {
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
if (typeof state !== "string" || !state.trim()) return null;
|
|
378
|
-
const declared = toPosix(state).replace(/^\.?\//, "").replace(/\/$/, "");
|
|
379
|
-
if (
|
|
380
|
-
!declared ||
|
|
381
|
-
declared.split("/").includes("..") ||
|
|
382
|
-
isAbsolute(declared) ||
|
|
383
|
-
ABSOLUTE_MACHINE_PATH_RE.test(declared)
|
|
384
|
-
) {
|
|
385
|
-
return null;
|
|
386
|
-
}
|
|
387
|
-
const expected = resolve(projectRoot, declared, "workspace.json");
|
|
388
|
-
if (expected !== resolve(filePath)) return null;
|
|
389
|
-
return {
|
|
390
|
-
filePath: resolve(filePath),
|
|
391
|
-
projectRoot: resolve(projectRoot),
|
|
392
|
-
stateDeclared: declared,
|
|
393
|
-
stateRoot: resolve(projectRoot, declared),
|
|
394
|
-
data,
|
|
395
|
-
};
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
function workspaceProbes(projectRoot) {
|
|
399
|
-
const root = resolve(projectRoot);
|
|
400
|
-
return [
|
|
401
|
-
{ projectRoot: root, filePath: join(root, "speculo", ".speculo", "workspace.json") },
|
|
402
|
-
{ projectRoot: root, filePath: join(root, ".speculo", "workspace.json") },
|
|
403
|
-
];
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
function collectWorkspaceCandidates(repoRoot, change) {
|
|
407
|
-
const probes = [];
|
|
408
|
-
if (repoRoot) {
|
|
409
|
-
probes.push(...workspaceProbes(repoRoot));
|
|
410
|
-
} else {
|
|
411
|
-
for (const dir of uniqueResolved([...ancestorsOf(change), ...ancestorsOf(process.cwd())])) {
|
|
412
|
-
probes.push(...workspaceProbes(dir));
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
const found = new Map();
|
|
416
|
-
for (const probe of probes) {
|
|
417
|
-
const parsed = parseWorkspaceCandidate(probe.filePath, probe.projectRoot);
|
|
418
|
-
if (!parsed) continue;
|
|
419
|
-
if (!found.has(parsed.filePath)) found.set(parsed.filePath, parsed);
|
|
420
|
-
}
|
|
421
|
-
return [...found.values()];
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
function isLegalChangeLocation(changeAbs, stateRoot) {
|
|
425
|
-
const name = basename(changeAbs);
|
|
426
|
-
if (resolve(stateRoot, "specdev", "changes", name) === changeAbs) return true;
|
|
427
|
-
const monthDir = dirname(changeAbs);
|
|
428
|
-
const archiveRoot = dirname(monthDir);
|
|
429
|
-
return (
|
|
430
|
-
/^\d{4}-\d{2}$/.test(basename(monthDir)) &&
|
|
431
|
-
resolve(stateRoot, "specdev", "archive") === archiveRoot &&
|
|
432
|
-
basename(changeAbs) === name
|
|
433
|
-
);
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
function resolveWorkspaceContract(repoRoot, change) {
|
|
437
|
-
const changeAbs = resolve(change);
|
|
438
|
-
const candidates = collectWorkspaceCandidates(repoRoot, changeAbs);
|
|
439
|
-
if (!candidates.length) {
|
|
440
|
-
return { mode: "legacy", errors: [], config: null, specdevRoot: null, stateDeclared: null };
|
|
441
|
-
}
|
|
442
|
-
const uniqueRoots = uniqueResolved(candidates.map((candidate) => candidate.stateRoot));
|
|
443
|
-
if (uniqueRoots.length > 1) {
|
|
444
|
-
const declared = [...new Set(candidates.map((candidate) => candidate.stateDeclared))].sort();
|
|
445
|
-
return {
|
|
446
|
-
mode: "strict",
|
|
447
|
-
errors: [`conflicting workspace.json roots.state (${declared.join(" vs ")})`],
|
|
448
|
-
config: null,
|
|
449
|
-
specdevRoot: null,
|
|
450
|
-
stateDeclared: null,
|
|
451
|
-
};
|
|
452
|
-
}
|
|
453
|
-
const workspace = candidates[0];
|
|
454
|
-
const specdevRoot = join(workspace.stateRoot, "specdev");
|
|
455
|
-
const errors = [];
|
|
456
|
-
if (!isLegalChangeLocation(changeAbs, workspace.stateRoot)) {
|
|
457
|
-
errors.push(
|
|
458
|
-
`change is outside workspace roots.state (${workspace.stateDeclared}/specdev); project-root .speculo/specdev is illegal`,
|
|
459
|
-
);
|
|
460
|
-
}
|
|
461
|
-
let config = null;
|
|
462
|
-
const configPath = join(specdevRoot, "config.json");
|
|
463
|
-
if (isFile(configPath)) {
|
|
464
|
-
try {
|
|
465
|
-
config = JSON.parse(readText(configPath));
|
|
466
|
-
} catch {
|
|
467
|
-
config = null;
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
return {
|
|
471
|
-
mode: "strict",
|
|
472
|
-
errors,
|
|
473
|
-
config,
|
|
474
|
-
specdevRoot,
|
|
475
|
-
stateDeclared: workspace.stateDeclared,
|
|
476
|
-
};
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
function findSpecdevConfig(change, repoRoot = null) {
|
|
480
|
-
const contract = resolveWorkspaceContract(repoRoot, change);
|
|
481
|
-
if (contract.mode === "strict") return contract.config;
|
|
482
|
-
return findSpecdevConfigByAncestry(change);
|
|
303
|
+
const context = options.readOnlySnapshot ? resolveSnapshotContext(options.readOnlySnapshot) : resolveToolContext(change, { ...options, repoRoot });
|
|
304
|
+
const location = runtime.resolveChangeSync(context, basename(change), { includeArchived: true });
|
|
305
|
+
const errors = canonicalToolPath(context, change) === location.root ? [] : ["change is outside the declared state root"];
|
|
306
|
+
const configPath = join(context.specdevRoot, "config.json");
|
|
307
|
+
const config = existsSync(configPath) ? JSON.parse(readText(runtime.safeWorkPathSync(context.specdevRoot, 'config.json', {mustExist:true,type:'file'}))) : null;
|
|
308
|
+
return { context, errors, config, specdevRoot:context.specdevRoot, stateDeclared:relative(context.projectRoot,context.stateRoot) };
|
|
309
|
+
} catch(error) { return {errors:[String(error)],config:null,specdevRoot:null}; }
|
|
483
310
|
}
|
|
311
|
+
function findSpecdevConfig(change,repoRoot=null,options={}) {return resolveWorkspaceContract(repoRoot,change,options).config;}
|
|
484
312
|
|
|
485
313
|
function positiveConfigLimit(config, key, fallback) {
|
|
486
314
|
const value = config?.execution?.[key];
|
|
@@ -488,37 +316,10 @@ function positiveConfigLimit(config, key, fallback) {
|
|
|
488
316
|
}
|
|
489
317
|
|
|
490
318
|
function parseFrontmatter(path) {
|
|
491
|
-
const text
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
if (end < 0) return { meta: {}, body: text };
|
|
496
|
-
|
|
497
|
-
const meta = {};
|
|
498
|
-
let currentListKey = null;
|
|
499
|
-
for (const line of lines.slice(1, end)) {
|
|
500
|
-
const stripped = line.trim();
|
|
501
|
-
if (!stripped || stripped.startsWith("#")) continue;
|
|
502
|
-
if (currentListKey && /^\s+-\s+/.test(line)) {
|
|
503
|
-
meta[currentListKey].push(parseScalar(line.replace(/^\s+-\s+/, "")));
|
|
504
|
-
continue;
|
|
505
|
-
}
|
|
506
|
-
currentListKey = null;
|
|
507
|
-
const colon = line.indexOf(":");
|
|
508
|
-
if (colon < 0) continue;
|
|
509
|
-
const key = line.slice(0, colon).trim();
|
|
510
|
-
if (["__proto__", "constructor", "prototype"].includes(key) || Object.hasOwn(meta, key)) {
|
|
511
|
-
throw new Error(`${path}: duplicate or unsafe frontmatter key ${key}`);
|
|
512
|
-
}
|
|
513
|
-
const raw = line.slice(colon + 1).trim();
|
|
514
|
-
if (!raw) {
|
|
515
|
-
meta[key] = [];
|
|
516
|
-
currentListKey = key;
|
|
517
|
-
} else {
|
|
518
|
-
meta[key] = parseScalar(raw);
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
return { meta, body: lines.slice(end + 1).join("\n") };
|
|
319
|
+
const text=readText(path);
|
|
320
|
+
if(!text.startsWith("---"))return {meta:{},body:text};
|
|
321
|
+
const parsed=parseYaml(text);
|
|
322
|
+
return {meta:parsed.fields,body:parsed.body};
|
|
522
323
|
}
|
|
523
324
|
|
|
524
325
|
function escapeRegExp(value) {
|
|
@@ -661,7 +462,7 @@ function validatePathValue(value, { allowProject = true } = {}) {
|
|
|
661
462
|
}
|
|
662
463
|
return null;
|
|
663
464
|
}
|
|
664
|
-
for (const [prefix, name] of [[SKILLS_PREFIX, "skills"], [COMMANDS_PREFIX, "commands"]]) {
|
|
465
|
+
for (const [prefix, name] of [[SKILLS_PREFIX, "skills"], [REFERENCES_PREFIX,"references"], [COMMANDS_PREFIX, "commands"]]) {
|
|
665
466
|
if (value.startsWith(prefix)) {
|
|
666
467
|
const suffix = value.slice(prefix.length);
|
|
667
468
|
if (
|
|
@@ -698,12 +499,13 @@ function validateDocumentReferences(root) {
|
|
|
698
499
|
const entries = walk(root);
|
|
699
500
|
const frozenResearchRoot = join(
|
|
700
501
|
root,
|
|
701
|
-
"
|
|
502
|
+
"specdev-p-prototype",
|
|
702
503
|
"design-library",
|
|
703
504
|
"research-snapshot",
|
|
704
505
|
);
|
|
506
|
+
const upstreamRoot = join(root, "specdev-p-prototype", "design-library", "upstream");
|
|
705
507
|
const governedEntries = entries.filter(
|
|
706
|
-
(path) => path
|
|
508
|
+
(path) => ![frozenResearchRoot, upstreamRoot].some(frozen => path === frozen || path.startsWith(`${frozen}${sep}`)),
|
|
707
509
|
);
|
|
708
510
|
const knownFiles = new Set(governedEntries.filter(isFile).map((path) => basename(path)));
|
|
709
511
|
const knownDirectories = new Set(governedEntries.filter(isDirectory).map((path) => basename(path)));
|
|
@@ -750,13 +552,13 @@ function validateDocumentReferences(root) {
|
|
|
750
552
|
);
|
|
751
553
|
}
|
|
752
554
|
}
|
|
753
|
-
} else if (payload.startsWith(
|
|
754
|
-
const isSkill = payload.startsWith(
|
|
755
|
-
const prefix = isSkill ?
|
|
555
|
+
} else if (payload.startsWith(REFERENCES_PREFIX) || payload.startsWith(COMMANDS_PREFIX)) {
|
|
556
|
+
const isSkill = payload.startsWith(REFERENCES_PREFIX);
|
|
557
|
+
const prefix = isSkill ? REFERENCES_PREFIX : COMMANDS_PREFIX;
|
|
756
558
|
const referenced = payload.slice(prefix.length);
|
|
757
559
|
if (!PLACEHOLDER_RE.test(referenced)) {
|
|
758
560
|
const templateRoot = resolve(root, "..", "..");
|
|
759
|
-
const target = join(templateRoot, isSkill ? "
|
|
561
|
+
const target = join(templateRoot, isSkill ? "references" : "commands", referenced);
|
|
760
562
|
if (!existsSync(target)) {
|
|
761
563
|
errors.push(`${label}:${lineNumber(text, match.index)}: broken public Path ${payload}`);
|
|
762
564
|
}
|
|
@@ -771,15 +573,29 @@ function validateDocumentReferences(root) {
|
|
|
771
573
|
}
|
|
772
574
|
}
|
|
773
575
|
|
|
576
|
+
const workSegment = toPosix(relative(root, path)).split("/")[0];
|
|
577
|
+
const skillRoot = EXPECTED_WORKS.has(workSegment) ? join(root, workSegment) : null;
|
|
578
|
+
const acceptedLinks = [];
|
|
774
579
|
for (const match of text.matchAll(RELATIVE_MD_LINK_RE)) {
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
);
|
|
580
|
+
const target = resolve(dirname(path), match[1].split("#")[0]);
|
|
581
|
+
if (skillRoot && target.startsWith(`${skillRoot}${sep}`) && existsSync(target)) acceptedLinks.push(match[0]);
|
|
582
|
+
else errors.push(`${label}:${lineNumber(text, match.index)}: relative Markdown link crosses its Skill package or is missing: ${match[1]}`);
|
|
583
|
+
}
|
|
584
|
+
// Browser assets need executable relative href/src values, not agent Path
|
|
585
|
+
// tags. Accept only existing targets inside the same Work package.
|
|
586
|
+
if (extname(path).toLowerCase() === ".html" && skillRoot) {
|
|
587
|
+
for (const match of text.matchAll(/(?:href|src)=["']([^"'#]+)(?:#[^"']*)?["']/g)) {
|
|
588
|
+
if (/^[a-z]+:|^\/\//i.test(match[1])) continue;
|
|
589
|
+
const target = resolve(dirname(path), match[1]);
|
|
590
|
+
if (target.startsWith(`${skillRoot}${sep}`) && existsSync(target)) acceptedLinks.push(match[0]);
|
|
591
|
+
else errors.push(`${label}: browser asset link crosses its Skill package or is missing: ${match[1]}`);
|
|
592
|
+
}
|
|
778
593
|
}
|
|
779
594
|
|
|
780
595
|
let withoutTags = text
|
|
781
596
|
.replace(/`?\s*<Path>.*?<\/Path>\s*`?/gs, "")
|
|
782
597
|
.replace(/`?\s*<Url>.*?<\/Url>\s*`?/gs, "");
|
|
598
|
+
for (const link of acceptedLinks) withoutTags = withoutTags.replaceAll(link, "");
|
|
783
599
|
|
|
784
600
|
for (const match of withoutTags.matchAll(/\{roots\.(?:workflows|state)\}/g)) {
|
|
785
601
|
errors.push(
|
|
@@ -852,29 +668,8 @@ function validateJsonFiles(root) {
|
|
|
852
668
|
|
|
853
669
|
function validateGlobalStatusAssets(root) {
|
|
854
670
|
const errors = [];
|
|
855
|
-
const
|
|
856
|
-
|
|
857
|
-
paths.unshift(join(root, "_state", "status.json"));
|
|
858
|
-
}
|
|
859
|
-
for (const path of paths) {
|
|
860
|
-
if (!isFile(path)) {
|
|
861
|
-
errors.push(`missing global status seed ${toPosix(relative(root, path))}`);
|
|
862
|
-
continue;
|
|
863
|
-
}
|
|
864
|
-
const data = JSON.parse(readText(path));
|
|
865
|
-
const keys = Object.keys(data).sort();
|
|
866
|
-
const expected = ["active", "archived", "schema_version", "workflow"];
|
|
867
|
-
if (JSON.stringify(keys) !== JSON.stringify(expected)) {
|
|
868
|
-
errors.push(`${toPosix(relative(root, path))}: global status must contain only ${expected.join(", ")}`);
|
|
869
|
-
}
|
|
870
|
-
if (
|
|
871
|
-
data.schema_version !== GLOBAL_STATUS_SCHEMA_VERSION ||
|
|
872
|
-
data.workflow !== "specdev" ||
|
|
873
|
-
!Array.isArray(data.active) ||
|
|
874
|
-
!Array.isArray(data.archived)
|
|
875
|
-
) {
|
|
876
|
-
errors.push(`${toPosix(relative(root, path))}: invalid SpecDev global status v5 seed`);
|
|
877
|
-
}
|
|
671
|
+
for (const path of [join(root,"_state/status.json"),join(root,"specdev-i-init-setup/assets/status-template.json"),join(root,"specdev-i-init-setup/assets/change-status-template.json")]) {
|
|
672
|
+
if (existsSync(path)) errors.push(`retired business status must not be distributed as a new seed: ${toPosix(relative(root,path))}`);
|
|
878
673
|
}
|
|
879
674
|
|
|
880
675
|
const schemaPath = join(root, "common", "schemas", "status.schema.json");
|
|
@@ -900,8 +695,7 @@ function validateGlobalStatusAssets(root) {
|
|
|
900
695
|
|
|
901
696
|
function validateExecutionContractAssets(root) {
|
|
902
697
|
const errors = [];
|
|
903
|
-
const configTemplatePath = join(root, "
|
|
904
|
-
const changeTemplatePath = join(root, "I-init-setup", "change-status-template.json");
|
|
698
|
+
const configTemplatePath = join(root, "specdev-i-init-setup", "assets/config-template.json");
|
|
905
699
|
const configSchemaPath = join(root, "common", "schemas", "config.schema.json");
|
|
906
700
|
const goalPlanSchemaPath = join(root, "common", "schemas", "goal-plan.schema.json");
|
|
907
701
|
const changeSchemaPath = join(root, "common", "schemas", "change-status.schema.json");
|
|
@@ -910,7 +704,6 @@ function validateExecutionContractAssets(root) {
|
|
|
910
704
|
|
|
911
705
|
for (const path of [
|
|
912
706
|
configTemplatePath,
|
|
913
|
-
changeTemplatePath,
|
|
914
707
|
configSchemaPath,
|
|
915
708
|
goalPlanSchemaPath,
|
|
916
709
|
changeSchemaPath,
|
|
@@ -924,8 +717,8 @@ function validateExecutionContractAssets(root) {
|
|
|
924
717
|
const configTemplate = JSON.parse(readText(configTemplatePath));
|
|
925
718
|
if (
|
|
926
719
|
configTemplate.schema_version !== CONFIG_SCHEMA_VERSION ||
|
|
927
|
-
!Number.isInteger(configTemplate.execution?.
|
|
928
|
-
configTemplate.execution.
|
|
720
|
+
!Number.isInteger(configTemplate.execution?.max_concurrent_implementations) ||
|
|
721
|
+
configTemplate.execution.max_concurrent_implementations < 1 ||
|
|
929
722
|
!Number.isInteger(configTemplate.execution?.max_integration_attempts) ||
|
|
930
723
|
configTemplate.execution.max_integration_attempts < 1 ||
|
|
931
724
|
!Number.isInteger(configTemplate.planning?.ui_design_default_candidates) ||
|
|
@@ -934,7 +727,7 @@ function validateExecutionContractAssets(root) {
|
|
|
934
727
|
configTemplate.planning.ui_design_max_candidates > 4 ||
|
|
935
728
|
configTemplate.planning.ui_design_max_candidates < configTemplate.planning.ui_design_default_candidates
|
|
936
729
|
) {
|
|
937
|
-
errors.push("config-template.json must define SpecDev config
|
|
730
|
+
errors.push("config-template.json must define SpecDev config v7 with positive execution limits and valid UI design candidate bounds");
|
|
938
731
|
}
|
|
939
732
|
for (const obsolete of ["auto_commit", "worktree_for_parallel", "max_parallel"]) {
|
|
940
733
|
if (JSON.stringify(configTemplate).includes(`\"${obsolete}\"`)) {
|
|
@@ -943,38 +736,29 @@ function validateExecutionContractAssets(root) {
|
|
|
943
736
|
}
|
|
944
737
|
|
|
945
738
|
const configSchema = JSON.parse(readText(configSchemaPath));
|
|
946
|
-
const limit = configSchema.properties?.execution?.properties?.
|
|
739
|
+
const limit = configSchema.properties?.execution?.properties?.max_concurrent_implementations;
|
|
947
740
|
if (
|
|
948
|
-
configSchema.$id !== "urn:speculo:specdev:config:
|
|
741
|
+
configSchema.$id !== "urn:speculo:specdev:config:v7" ||
|
|
949
742
|
configSchema.properties?.schema_version?.const !== CONFIG_SCHEMA_VERSION ||
|
|
950
743
|
limit?.minimum !== 1 ||
|
|
951
744
|
configSchema.properties?.execution?.properties?.max_integration_attempts?.minimum !== 1 ||
|
|
952
745
|
configSchema.additionalProperties !== false
|
|
953
746
|
) {
|
|
954
|
-
errors.push("config.schema.json must define the strict SpecDev config
|
|
747
|
+
errors.push("config.schema.json must define the strict SpecDev config v7 execution contract");
|
|
955
748
|
}
|
|
956
749
|
|
|
957
750
|
const goalPlanSchema = JSON.parse(readText(goalPlanSchemaPath));
|
|
958
751
|
if (
|
|
959
|
-
goalPlanSchema.$id !== "urn:speculo:specdev:goal-plan:
|
|
752
|
+
goalPlanSchema.$id !== "urn:speculo:specdev:goal-plan:v7" ||
|
|
960
753
|
goalPlanSchema.properties?.schema_version?.const !== GOAL_PLAN_SCHEMA_VERSION ||
|
|
961
754
|
goalPlanSchema.properties?.orchestration?.const !== "lead-directed" ||
|
|
962
|
-
goalPlanSchema.properties?.
|
|
755
|
+
goalPlanSchema.properties?.concurrent_implementation_limit?.minimum !== 1 ||
|
|
963
756
|
goalPlanSchema.properties?.integration_attempt_limit?.minimum !== 1 ||
|
|
964
757
|
!["current", "required"].every((value) => goalPlanSchema.properties?.ticket_workspace_policy?.enum?.includes(value)) ||
|
|
965
758
|
!["direct-parent", "candidate-merge"].every((value) => goalPlanSchema.properties?.integration_gate?.enum?.includes(value)) ||
|
|
966
759
|
goalPlanSchema.additionalProperties !== false
|
|
967
760
|
) {
|
|
968
|
-
errors.push("goal-plan.schema.json must define the strict Lead-directed Goal Plan
|
|
969
|
-
}
|
|
970
|
-
|
|
971
|
-
const changeTemplate = JSON.parse(readText(changeTemplatePath));
|
|
972
|
-
if (
|
|
973
|
-
changeTemplate.schema_version !== CHANGE_STATUS_SCHEMA_VERSION ||
|
|
974
|
-
changeTemplate.artifact !== "change-status" ||
|
|
975
|
-
!Array.isArray(changeTemplate.worktrees)
|
|
976
|
-
) {
|
|
977
|
-
errors.push("change-status-template.json must define the SpecDev change-status v6 seed");
|
|
761
|
+
errors.push("goal-plan.schema.json must define the strict Lead-directed Goal Plan v7 workspace strategy contract");
|
|
978
762
|
}
|
|
979
763
|
|
|
980
764
|
const changeSchema = JSON.parse(readText(changeSchemaPath));
|
|
@@ -1001,10 +785,10 @@ function validateExecutionContractAssets(root) {
|
|
|
1001
785
|
}
|
|
1002
786
|
const implementationPlanSchema = JSON.parse(readText(implementationPlanSchemaPath));
|
|
1003
787
|
if (
|
|
1004
|
-
implementationPlanSchema.$id !== "urn:speculo:specdev:implementation-plan:
|
|
788
|
+
implementationPlanSchema.$id !== "urn:speculo:specdev:implementation-plan:v2" ||
|
|
1005
789
|
implementationPlanSchema.properties?.schema_version?.const !== IMPLEMENTATION_PLAN_SCHEMA_VERSION ||
|
|
1006
790
|
implementationPlanSchema.properties?.orchestration?.const !== "lead-directed" ||
|
|
1007
|
-
implementationPlanSchema.properties?.
|
|
791
|
+
implementationPlanSchema.properties?.concurrent_implementation_limit?.minimum !== 1 ||
|
|
1008
792
|
implementationPlanSchema.properties?.integration_attempt_limit?.minimum !== 1 ||
|
|
1009
793
|
!["current", "required"].every((value) => implementationPlanSchema.properties?.ticket_workspace_policy?.enum?.includes(value)) ||
|
|
1010
794
|
implementationPlanSchema.additionalProperties !== false
|
|
@@ -1019,12 +803,12 @@ function capabilityChecks(root) {
|
|
|
1019
803
|
[
|
|
1020
804
|
"init",
|
|
1021
805
|
[
|
|
1022
|
-
join(root, "
|
|
806
|
+
join(root, "specdev-i-init-setup", "SKILL.md"),
|
|
1023
807
|
[
|
|
1024
|
-
"
|
|
1025
|
-
"
|
|
1026
|
-
"
|
|
1027
|
-
"
|
|
808
|
+
"first-setup.md",
|
|
809
|
+
"current-facts-docs.md",
|
|
810
|
+
"必要偏好",
|
|
811
|
+
"README",
|
|
1028
812
|
"specdev-worktree/",
|
|
1029
813
|
],
|
|
1030
814
|
],
|
|
@@ -1032,28 +816,28 @@ function capabilityChecks(root) {
|
|
|
1032
816
|
[
|
|
1033
817
|
"triage",
|
|
1034
818
|
[
|
|
1035
|
-
join(root, "
|
|
819
|
+
join(root, "specdev-t-triage", "SKILL.md"),
|
|
1036
820
|
["intake", "reconcile", "publish", "capture", "capture.md", "pr-delivery", "ci-security", "release-preflight", "recover", "remote-operations.md"],
|
|
1037
821
|
],
|
|
1038
822
|
],
|
|
1039
823
|
[
|
|
1040
824
|
"spec",
|
|
1041
825
|
[
|
|
1042
|
-
join(root, "
|
|
1043
|
-
["
|
|
826
|
+
join(root, "specdev-s-spec", "SKILL.md"),
|
|
827
|
+
["用户端到端行为", "验收合同", "代码", "CONTEXT", "ADR", "验证接缝", "ready_for_tickets"],
|
|
1044
828
|
],
|
|
1045
829
|
],
|
|
1046
830
|
[
|
|
1047
831
|
"tickets",
|
|
1048
832
|
[
|
|
1049
|
-
join(root, "
|
|
833
|
+
join(root, "specdev-t-tickets", "SKILL.md"),
|
|
1050
834
|
["Prefactor", "垂直切片", "Expand", "与用户核对", "Definition of Ready"],
|
|
1051
835
|
],
|
|
1052
836
|
],
|
|
1053
837
|
[
|
|
1054
838
|
"goal-plan",
|
|
1055
839
|
[
|
|
1056
|
-
join(root, "
|
|
840
|
+
join(root, "specdev-p-goal-plan", "SKILL.md"),
|
|
1057
841
|
[
|
|
1058
842
|
"Outcome",
|
|
1059
843
|
"权威来源",
|
|
@@ -1061,7 +845,7 @@ function capabilityChecks(root) {
|
|
|
1061
845
|
"Gate",
|
|
1062
846
|
"Wave",
|
|
1063
847
|
"lead-directed",
|
|
1064
|
-
"
|
|
848
|
+
"concurrent_implementation_limit",
|
|
1065
849
|
"candidate-merge",
|
|
1066
850
|
"lead-orchestration.md",
|
|
1067
851
|
"Definition of Done",
|
|
@@ -1071,70 +855,70 @@ function capabilityChecks(root) {
|
|
|
1071
855
|
[
|
|
1072
856
|
"implement",
|
|
1073
857
|
[
|
|
1074
|
-
join(root, "
|
|
1075
|
-
["codebase-design", "design-it-twice", "TDD", "双轴审查", "Evidence", "parent-candidate", "
|
|
858
|
+
join(root, "specdev-i-implement", "SKILL.md"),
|
|
859
|
+
["codebase-design", "design-it-twice", "TDD", "双轴审查", "Evidence", "parent-candidate", "共享编排方法", "实现 commit"],
|
|
1076
860
|
],
|
|
1077
861
|
],
|
|
1078
862
|
[
|
|
1079
863
|
"code-review",
|
|
1080
864
|
[
|
|
1081
|
-
join(root, "
|
|
865
|
+
join(root, "specdev-c-code-review", "SKILL.md"),
|
|
1082
866
|
["--review-scope", "baseline", "range", "commit", "pr", "no-diff", "固定点", "标准轴", "规范轴", "未合并排名", "reviews/CR-###.md"],
|
|
1083
867
|
],
|
|
1084
868
|
],
|
|
1085
869
|
[
|
|
1086
870
|
"prototype",
|
|
1087
871
|
[
|
|
1088
|
-
join(root, "
|
|
872
|
+
join(root, "specdev-p-prototype", "SKILL.md"),
|
|
1089
873
|
["设计定向", "风格", "design-system.md", "comparison", "HTML/CSS/JS", "design-library/INDEX.md"],
|
|
1090
874
|
],
|
|
1091
875
|
],
|
|
1092
876
|
[
|
|
1093
|
-
"learn
|
|
877
|
+
"learn",
|
|
1094
878
|
[
|
|
1095
|
-
join(root, "
|
|
1096
|
-
["
|
|
879
|
+
join(root, "specdev-l-learn", "SKILL.md"),
|
|
880
|
+
["需求参考", "零专业背景", "$ARGUMENTS", "ASCII", "learning-change.md", "learning/index.md", "{number}_{topic}.md", "{roots.state}/learning/"],
|
|
1097
881
|
],
|
|
1098
882
|
],
|
|
1099
883
|
[
|
|
1100
884
|
"wayfinder",
|
|
1101
885
|
[
|
|
1102
|
-
join(root, "
|
|
1103
|
-
["共享地图", "
|
|
886
|
+
join(root, "specdev-w-wayfinder", "SKILL.md"),
|
|
887
|
+
["共享地图", "调查认领", "wayfinder:prototype", "wayfinder:grilling", "solution comment", "每个会话"],
|
|
1104
888
|
],
|
|
1105
889
|
],
|
|
1106
890
|
[
|
|
1107
891
|
"architecture-review",
|
|
1108
892
|
[
|
|
1109
|
-
join(root, "
|
|
893
|
+
join(root, "specdev-r-review-architecture", "SKILL.md"),
|
|
1110
894
|
["结构性坏味道", "code-judo", "删除测试", "高置信候选", "最佳推荐"],
|
|
1111
895
|
],
|
|
1112
896
|
],
|
|
1113
897
|
[
|
|
1114
898
|
"architecture-review-rubric",
|
|
1115
899
|
[
|
|
1116
|
-
join(root, "
|
|
900
|
+
join(root, "specdev-r-review-architecture", "references/review-rubric.md"),
|
|
1117
901
|
["删除测试", "文件大小", "高置信候选", "spaghetti growth"],
|
|
1118
902
|
],
|
|
1119
903
|
],
|
|
1120
904
|
[
|
|
1121
905
|
"archive",
|
|
1122
906
|
[
|
|
1123
|
-
join(root, "
|
|
907
|
+
join(root, "specdev-a-archive-and-consolidate", "SKILL.md"),
|
|
1124
908
|
["archive-single", "dry-run", "external_action", "publish_action", "consolidate-from-code", "archive-and-consolidate"],
|
|
1125
909
|
],
|
|
1126
910
|
],
|
|
1127
911
|
[
|
|
1128
912
|
"grill",
|
|
1129
913
|
[
|
|
1130
|
-
join(root, "
|
|
914
|
+
join(root, "specdev-g-grill-with-docs", "SKILL.md"),
|
|
1131
915
|
["完整 frontier", "design-tree.json", "LOG.md", "CONTEXT.md", "ADR.md", "推荐答案", "永久 namespace 对 G 只读"],
|
|
1132
916
|
],
|
|
1133
917
|
],
|
|
1134
918
|
[
|
|
1135
919
|
"diagnosis",
|
|
1136
920
|
[
|
|
1137
|
-
join(root, "
|
|
921
|
+
join(root, "specdev-d-diagnose-bugs", "SKILL.md"),
|
|
1138
922
|
["红灯", "反馈回路", "最小化", "可证伪", "根因", "回归测试"],
|
|
1139
923
|
],
|
|
1140
924
|
],
|
|
@@ -1156,35 +940,35 @@ function capabilityChecks(root) {
|
|
|
1156
940
|
"common/rules/codebase-design.md",
|
|
1157
941
|
"common/schemas/design-tree.schema.json",
|
|
1158
942
|
"common/schemas/wayfinder-ticket.schema.json",
|
|
1159
|
-
"
|
|
1160
|
-
"
|
|
1161
|
-
"
|
|
943
|
+
"specdev-g-grill-with-docs/assets/design-tree-template.json",
|
|
944
|
+
"specdev-w-wayfinder/references/local-tracker-contract.md",
|
|
945
|
+
"specdev-w-wayfinder/assets/solution-comment-template.md",
|
|
1162
946
|
"common/rules/parent-implementation-orchestration.md",
|
|
1163
947
|
"common/schemas/implementation-map.schema.json",
|
|
1164
948
|
"common/schemas/implementation-plan.schema.json",
|
|
1165
949
|
"common/schemas/capture.schema.json",
|
|
1166
|
-
"
|
|
1167
|
-
"
|
|
1168
|
-
"
|
|
1169
|
-
"
|
|
950
|
+
"specdev-t-triage/references/capture-protocol.md",
|
|
951
|
+
"specdev-t-triage/assets/capture-template.md",
|
|
952
|
+
"specdev-t-triage/assets/issue-record-template.md",
|
|
953
|
+
"specdev-t-triage/scripts/capture-status.mjs",
|
|
1170
954
|
]) {
|
|
1171
955
|
if (!isFile(join(root, required))) errors.push(`missing architecture/wayfinding contract ${required}`);
|
|
1172
956
|
}
|
|
1173
957
|
|
|
1174
|
-
const mapTemplate = join(root, "
|
|
958
|
+
const mapTemplate = join(root, "specdev-w-wayfinder", "assets/wayfinder-map-template.md");
|
|
1175
959
|
if (isFile(mapTemplate) && /^## (?:开放 Tickets|调查清单)/m.test(readText(mapTemplate))) {
|
|
1176
960
|
errors.push("Wayfinder map template must query open Tickets instead of caching them");
|
|
1177
961
|
}
|
|
1178
962
|
|
|
1179
|
-
const goalPlanTemplate = join(root, "
|
|
963
|
+
const goalPlanTemplate = join(root, "specdev-p-goal-plan", "assets/goal-plan-template.md");
|
|
1180
964
|
if (!isFile(goalPlanTemplate)) {
|
|
1181
965
|
errors.push("missing Goal Plan template");
|
|
1182
966
|
} else {
|
|
1183
967
|
const text = readText(goalPlanTemplate);
|
|
1184
968
|
for (const required of [
|
|
1185
|
-
"schema_version:
|
|
969
|
+
"schema_version: 7",
|
|
1186
970
|
"orchestration: lead-directed",
|
|
1187
|
-
"
|
|
971
|
+
"concurrent_implementation_limit: 3",
|
|
1188
972
|
"integration_attempt_limit: 3",
|
|
1189
973
|
"ticket_workspace_policy: current",
|
|
1190
974
|
"integration_gate: direct-parent",
|
|
@@ -1209,11 +993,11 @@ function selfCheck(root) {
|
|
|
1209
993
|
const errors = [];
|
|
1210
994
|
const warnings = [];
|
|
1211
995
|
|
|
1212
|
-
if (!isFile(join(root, "
|
|
996
|
+
if (!isFile(join(root, "SKILL.md"))) errors.push("missing domain Skill");
|
|
1213
997
|
|
|
1214
998
|
const actualWorks = new Set(
|
|
1215
999
|
readdirSync(root, { withFileTypes: true })
|
|
1216
|
-
.filter((entry) => entry.isDirectory() && /^[
|
|
1000
|
+
.filter((entry) => entry.isDirectory() && /^specdev-[a-z]-/.test(entry.name))
|
|
1217
1001
|
.map((entry) => entry.name),
|
|
1218
1002
|
);
|
|
1219
1003
|
const missingWorks = [...EXPECTED_WORKS].filter((name) => !actualWorks.has(name));
|
|
@@ -1223,23 +1007,16 @@ function selfCheck(root) {
|
|
|
1223
1007
|
|
|
1224
1008
|
const ids = [];
|
|
1225
1009
|
for (const directoryName of [...actualWorks].sort()) {
|
|
1226
|
-
const entry = join(root, directoryName,
|
|
1010
|
+
const entry = join(root, directoryName, "SKILL.md");
|
|
1227
1011
|
if (!isFile(entry)) {
|
|
1228
1012
|
errors.push(`missing work entry ${toPosix(relative(root, entry))}`);
|
|
1229
1013
|
continue;
|
|
1230
1014
|
}
|
|
1231
1015
|
const { meta } = parseFrontmatter(entry);
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
if
|
|
1236
|
-
errors.push(`${toPosix(relative(root, entry))}: workflow must be specdev`);
|
|
1237
|
-
}
|
|
1238
|
-
if (typeof meta.id !== "string" || !meta.id.startsWith("specdev/")) {
|
|
1239
|
-
errors.push(`${toPosix(relative(root, entry))}: invalid work id`);
|
|
1240
|
-
} else {
|
|
1241
|
-
ids.push(meta.id);
|
|
1242
|
-
}
|
|
1016
|
+
errors.push(...validateSkill(readText(entry),directoryName).map(error=>entry+": "+error));
|
|
1017
|
+
if(meta.metadata?.["speculo-kind"]!=="work-skill" || meta.metadata?.["speculo-domain"]!=="specdev")errors.push(entry+": invalid Work metadata");
|
|
1018
|
+
const id=meta.metadata?.["speculo-id"];
|
|
1019
|
+
if(typeof id!=="string"||!id.startsWith("specdev/"))errors.push(entry+": invalid work id");else ids.push(id);
|
|
1243
1020
|
}
|
|
1244
1021
|
if (ids.length !== new Set(ids).size) errors.push("duplicate workflow entry id");
|
|
1245
1022
|
|
|
@@ -1377,7 +1154,7 @@ function validateSource(path, expectedChange, errors) {
|
|
|
1377
1154
|
return { path, meta, body };
|
|
1378
1155
|
}
|
|
1379
1156
|
|
|
1380
|
-
function validateTriage(path, expectedChange, errors
|
|
1157
|
+
function validateTriage(path, expectedChange, errors) {
|
|
1381
1158
|
if (!isFile(path)) {
|
|
1382
1159
|
errors.push("missing triage artifact");
|
|
1383
1160
|
return null;
|
|
@@ -1398,8 +1175,8 @@ function validateTriage(path, expectedChange, errors, historical = false) {
|
|
|
1398
1175
|
];
|
|
1399
1176
|
const missing = required.filter((key) => !(key in meta));
|
|
1400
1177
|
if (missing.length) errors.push(`triage.md: missing keys ${JSON.stringify(missing)}`);
|
|
1401
|
-
if (
|
|
1402
|
-
errors.push("triage.md: artifact/schema_version must be triage/2
|
|
1178
|
+
if (meta.schema_version !== 2 || meta.artifact !== "triage") {
|
|
1179
|
+
errors.push("triage.md: artifact/schema_version must be triage/2");
|
|
1403
1180
|
}
|
|
1404
1181
|
if (meta.schema_version === 2) {
|
|
1405
1182
|
if (!["needs-triage", "needs-info", "ready-for-agent", "ready-for-human", "wontfix"].includes(meta.disposition)) errors.push("triage.md: invalid disposition");
|
|
@@ -1710,10 +1487,12 @@ function validateReviews(change, required, errors) {
|
|
|
1710
1487
|
return paths;
|
|
1711
1488
|
}
|
|
1712
1489
|
|
|
1713
|
-
function validatePrototypes(change, required, errors) {
|
|
1490
|
+
function validatePrototypes(change, required, errors, prototypeId = null, consumingDesign = false, context = null) {
|
|
1714
1491
|
const root = join(change, "prototypes");
|
|
1492
|
+
const changeDesign = isFile(join(change, "DESIGN.md")) ? parseFrontmatter(join(change, "DESIGN.md")).meta : null;
|
|
1493
|
+
const boundId = changeDesign?.prototype_ref?.id;
|
|
1715
1494
|
if (!isDirectory(root)) {
|
|
1716
|
-
if (required) errors.push("prototype stage requires a prototypes/UI-NNN/design-system.md artifact");
|
|
1495
|
+
if (required || boundId) errors.push("prototype stage requires a prototypes/UI-NNN/design-system.md artifact");
|
|
1717
1496
|
return [];
|
|
1718
1497
|
}
|
|
1719
1498
|
|
|
@@ -1721,16 +1500,21 @@ function validatePrototypes(change, required, errors) {
|
|
|
1721
1500
|
dirname(fileURLToPath(import.meta.url)),
|
|
1722
1501
|
"..",
|
|
1723
1502
|
"..",
|
|
1724
|
-
"
|
|
1725
|
-
"
|
|
1503
|
+
"specdev-p-prototype",
|
|
1504
|
+
"scripts",
|
|
1726
1505
|
"validate-design-package.mjs",
|
|
1727
1506
|
);
|
|
1728
1507
|
const paths = [];
|
|
1729
1508
|
let readyCount = 0;
|
|
1509
|
+
const candidates = readdirSync(root).filter(name => /^(?:UI|LOGIC)-\d{3,}$/.test(name));
|
|
1510
|
+
if (required && !prototypeId && candidates.length !== 1) errors.push("prototype stage requires --prototype-id when multiple packages exist");
|
|
1511
|
+
const selectedId = prototypeId ?? (required && candidates.length === 1 ? candidates[0] : !required ? boundId : null);
|
|
1512
|
+
if (selectedId && !candidates.includes(selectedId)) errors.push(`prototype not found: ${selectedId}`);
|
|
1730
1513
|
|
|
1731
1514
|
for (const entry of readdirSync(root, { withFileTypes: true })) {
|
|
1732
1515
|
const entryPath = join(root, entry.name);
|
|
1733
1516
|
const label = toPosix(relative(change, entryPath));
|
|
1517
|
+
if (selectedId && entry.name !== selectedId) continue;
|
|
1734
1518
|
if (entry.isSymbolicLink()) {
|
|
1735
1519
|
errors.push(`${label}: prototype design directories and files must not be symlinks`);
|
|
1736
1520
|
continue;
|
|
@@ -1758,9 +1542,10 @@ function validatePrototypes(change, required, errors) {
|
|
|
1758
1542
|
}
|
|
1759
1543
|
paths.push(designPath);
|
|
1760
1544
|
const { meta } = parseFrontmatter(designPath);
|
|
1545
|
+
if (consumingDesign && entry.name === boundId && meta.status !== "ready") errors.push(`${label}: bound UI prototype must be ready before downstream consumption`);
|
|
1761
1546
|
if (meta.status === "ready") readyCount += 1;
|
|
1762
1547
|
try {
|
|
1763
|
-
execFileSync(process.execPath, [validator, designPath], {
|
|
1548
|
+
execFileSync(process.execPath, [validator, ...contextArguments(context), ...(consumingDesign && entry.name === boundId ? ["--check-ready"] : []), designPath], {
|
|
1764
1549
|
encoding: "utf8",
|
|
1765
1550
|
stdio: ["ignore", "pipe", "pipe"],
|
|
1766
1551
|
});
|
|
@@ -1774,13 +1559,14 @@ function validatePrototypes(change, required, errors) {
|
|
|
1774
1559
|
}
|
|
1775
1560
|
}
|
|
1776
1561
|
|
|
1777
|
-
const
|
|
1562
|
+
const scanRoot = selectedId && isDirectory(join(root, selectedId)) ? join(root, selectedId) : root;
|
|
1563
|
+
const obsoleteRecords = walk(scanRoot).filter(
|
|
1778
1564
|
(path) => isFile(path) && basename(path) === "record.md",
|
|
1779
1565
|
);
|
|
1780
1566
|
for (const path of obsoleteRecords) {
|
|
1781
1567
|
errors.push(`${toPosix(relative(change, path))}: obsolete prototype record is forbidden; use UI-NNN/design-system.md`);
|
|
1782
1568
|
}
|
|
1783
|
-
const discoveredDesigns = walk(
|
|
1569
|
+
const discoveredDesigns = walk(scanRoot).filter(
|
|
1784
1570
|
(path) => isFile(path) && basename(path) === "design-system.md",
|
|
1785
1571
|
);
|
|
1786
1572
|
for (const path of discoveredDesigns) {
|
|
@@ -1789,7 +1575,7 @@ function validatePrototypes(change, required, errors) {
|
|
|
1789
1575
|
}
|
|
1790
1576
|
}
|
|
1791
1577
|
if (required && readyCount === 0) {
|
|
1792
|
-
errors.push("prototype stage requires
|
|
1578
|
+
errors.push("prototype stage requires the selected ready UI or logic design package");
|
|
1793
1579
|
}
|
|
1794
1580
|
return paths;
|
|
1795
1581
|
}
|
|
@@ -1800,7 +1586,7 @@ function validateChangeLearning(change, required, errors) {
|
|
|
1800
1586
|
const diagramName = /^\d{2,}_[\p{L}\p{N}_-]+\.md$/u;
|
|
1801
1587
|
|
|
1802
1588
|
if (!existsSync(learningRoot)) {
|
|
1803
|
-
if (required) errors.push("learn
|
|
1589
|
+
if (required) errors.push("learn stage requires learning/index.md");
|
|
1804
1590
|
return null;
|
|
1805
1591
|
}
|
|
1806
1592
|
if (lstatSync(learningRoot).isSymbolicLink() || !isDirectory(learningRoot)) {
|
|
@@ -1809,22 +1595,27 @@ function validateChangeLearning(change, required, errors) {
|
|
|
1809
1595
|
}
|
|
1810
1596
|
|
|
1811
1597
|
const diagramFiles = [];
|
|
1598
|
+
const diagramNumbers = new Set();
|
|
1812
1599
|
for (const entry of readdirSync(learningRoot, { withFileTypes: true })) {
|
|
1813
1600
|
if (entry.isSymbolicLink()) {
|
|
1814
1601
|
errors.push(`learning/${entry.name}: learning artifacts must not be symlinks`);
|
|
1815
1602
|
} else if (entry.isFile() && diagramName.test(entry.name)) {
|
|
1816
1603
|
diagramFiles.push(entry.name);
|
|
1604
|
+
const number = Number(entry.name.split("_")[0]);
|
|
1605
|
+
if (diagramNumbers.has(number)) errors.push(`learning/${entry.name}: duplicate diagram number ${number}`);
|
|
1606
|
+
diagramNumbers.add(number);
|
|
1817
1607
|
}
|
|
1818
1608
|
}
|
|
1819
1609
|
diagramFiles.sort();
|
|
1820
1610
|
|
|
1821
1611
|
if (!isFile(indexPath)) {
|
|
1822
|
-
errors.push("learn
|
|
1612
|
+
errors.push("learn stage requires learning/index.md");
|
|
1823
1613
|
return null;
|
|
1824
1614
|
}
|
|
1825
1615
|
|
|
1826
1616
|
const index = readText(indexPath);
|
|
1827
|
-
|
|
1617
|
+
// Historical titles remain readable without rewriting existing learning records.
|
|
1618
|
+
if (!/^# (?:Change )?学习图解索引\s*$/m.test(index)) {
|
|
1828
1619
|
errors.push("learning/index.md: missing index heading");
|
|
1829
1620
|
}
|
|
1830
1621
|
const entries = Array.from(
|
|
@@ -2076,7 +1867,7 @@ function validateGoalPlan(path, errors) {
|
|
|
2076
1867
|
"modes",
|
|
2077
1868
|
"orchestration",
|
|
2078
1869
|
"lead",
|
|
2079
|
-
"
|
|
1870
|
+
"concurrent_implementation_limit",
|
|
2080
1871
|
"integration_attempt_limit",
|
|
2081
1872
|
"ticket_workspace_policy",
|
|
2082
1873
|
"integration_gate",
|
|
@@ -2100,8 +1891,8 @@ function validateGoalPlan(path, errors) {
|
|
|
2100
1891
|
if (typeof meta.lead !== "string" || !meta.lead.trim()) {
|
|
2101
1892
|
errors.push(`${basename(path)}: lead must be a non-empty recoverable locator`);
|
|
2102
1893
|
}
|
|
2103
|
-
if (!Number.isInteger(meta.
|
|
2104
|
-
errors.push(`${basename(path)}:
|
|
1894
|
+
if (!Number.isInteger(meta.concurrent_implementation_limit) || meta.concurrent_implementation_limit < 1) {
|
|
1895
|
+
errors.push(`${basename(path)}: concurrent_implementation_limit must be a positive integer`);
|
|
2105
1896
|
}
|
|
2106
1897
|
if (!Number.isInteger(meta.integration_attempt_limit) || meta.integration_attempt_limit < 1) {
|
|
2107
1898
|
errors.push(`${basename(path)}: integration_attempt_limit must be a positive integer`);
|
|
@@ -2154,25 +1945,9 @@ function validateGoalPlan(path, errors) {
|
|
|
2154
1945
|
return { path, meta, body };
|
|
2155
1946
|
}
|
|
2156
1947
|
|
|
2157
|
-
function validateGoalPlanRuntimeLimits(path, change, goalPlan, errors, repoRoot = null) {
|
|
1948
|
+
function validateGoalPlanRuntimeLimits(path, change, goalPlan, errors, repoRoot = null, options = {}) {
|
|
2158
1949
|
if (!goalPlan) return;
|
|
2159
|
-
|
|
2160
|
-
if (!config) {
|
|
2161
|
-
errors.push(`${basename(path)}: SpecDev config.json is required to validate execution limits`);
|
|
2162
|
-
return;
|
|
2163
|
-
}
|
|
2164
|
-
const configuredAgents = positiveConfigLimit(config, "max_implementation_agents", 0);
|
|
2165
|
-
const configuredAttempts = positiveConfigLimit(config, "max_integration_attempts", 0);
|
|
2166
|
-
if (config.schema_version !== CONFIG_SCHEMA_VERSION || configuredAgents === 0 || configuredAttempts === 0) {
|
|
2167
|
-
errors.push(`${basename(path)}: SpecDev config.json must use schema v${CONFIG_SCHEMA_VERSION} with positive execution limits`);
|
|
2168
|
-
return;
|
|
2169
|
-
}
|
|
2170
|
-
if (goalPlan.meta.implementation_agent_limit > configuredAgents) {
|
|
2171
|
-
errors.push(`${basename(path)}: implementation_agent_limit ${goalPlan.meta.implementation_agent_limit} exceeds config max_implementation_agents ${configuredAgents}`);
|
|
2172
|
-
}
|
|
2173
|
-
if (goalPlan.meta.integration_attempt_limit > configuredAttempts) {
|
|
2174
|
-
errors.push(`${basename(path)}: integration_attempt_limit ${goalPlan.meta.integration_attempt_limit} exceeds config max_integration_attempts ${configuredAttempts}`);
|
|
2175
|
-
}
|
|
1950
|
+
errors.push(...validateExecutionPolicy(goalPlan, findSpecdevConfig(change, repoRoot, options)).map(error => `${basename(path)}: ${error}`));
|
|
2176
1951
|
}
|
|
2177
1952
|
|
|
2178
1953
|
function validateDesignTree(path, change, errors) {
|
|
@@ -2439,61 +2214,24 @@ function validateTicket(path, errors) {
|
|
|
2439
2214
|
return { path, meta, body };
|
|
2440
2215
|
}
|
|
2441
2216
|
|
|
2442
|
-
function
|
|
2443
|
-
|
|
2444
|
-
errors.push("missing change status artifact");
|
|
2445
|
-
return null;
|
|
2446
|
-
}
|
|
2217
|
+
function validateChangeExecution(change, errors, context) {
|
|
2218
|
+
const path = join(change, "evidence"), expectedChange = basename(change);
|
|
2447
2219
|
let data;
|
|
2448
2220
|
try {
|
|
2449
|
-
|
|
2450
|
-
|
|
2451
|
-
|
|
2452
|
-
|
|
2453
|
-
}
|
|
2454
|
-
const required = [
|
|
2455
|
-
"schema_version",
|
|
2456
|
-
"artifact",
|
|
2457
|
-
"change",
|
|
2458
|
-
"change_status",
|
|
2459
|
-
"current_work",
|
|
2460
|
-
"works_run",
|
|
2461
|
-
"claimed_investigations",
|
|
2462
|
-
"execution_authorization",
|
|
2463
|
-
"leadership",
|
|
2464
|
-
"created_at",
|
|
2465
|
-
"updated_at",
|
|
2466
|
-
"completed_at",
|
|
2467
|
-
"archived",
|
|
2468
|
-
"archive_path",
|
|
2469
|
-
"blockers",
|
|
2470
|
-
"deviations",
|
|
2471
|
-
"worktrees",
|
|
2472
|
-
];
|
|
2473
|
-
const missing = required.filter((key) => !(key in data));
|
|
2474
|
-
if (missing.length) errors.push(`${basename(path)}: missing keys ${JSON.stringify(missing.sort())}`);
|
|
2475
|
-
const unexpected = Object.keys(data).filter((key) => !required.includes(key));
|
|
2476
|
-
if (unexpected.length) errors.push(`${basename(path)}: unexpected keys ${JSON.stringify(unexpected.sort())}`);
|
|
2477
|
-
if (data.schema_version !== CHANGE_STATUS_SCHEMA_VERSION || data.artifact !== "change-status") {
|
|
2478
|
-
errors.push(`${basename(path)}: artifact/schema_version must be change-status/${CHANGE_STATUS_SCHEMA_VERSION}`);
|
|
2479
|
-
}
|
|
2480
|
-
if (data.change !== expectedChange) {
|
|
2481
|
-
errors.push(`${basename(path)}: change must equal directory name ${expectedChange}`);
|
|
2482
|
-
}
|
|
2483
|
-
if (!new Set(["active", "blocked", "completed", "archived"]).has(data.change_status)) {
|
|
2484
|
-
errors.push(`${basename(path)}: invalid change_status ${data.change_status}`);
|
|
2485
|
-
}
|
|
2486
|
-
if (!Array.isArray(data.blockers) || !Array.isArray(data.deviations) || !Array.isArray(data.worktrees)) {
|
|
2487
|
-
errors.push(`${basename(path)}: blockers, deviations, and worktrees must be arrays`);
|
|
2488
|
-
}
|
|
2221
|
+
const facts = runtime.readChangeFactsSync(context, basename(change));
|
|
2222
|
+
if (facts.location.root !== resolve(change)) throw new Error('change identity does not match requested location');
|
|
2223
|
+
data = { ...facts, worktrees:readChangeExecution(change) };
|
|
2224
|
+
} catch (error) { errors.push(`${change}: ${error.message}`); return null; }
|
|
2489
2225
|
const seenWorktreeTickets = new Set();
|
|
2490
2226
|
for (const worktree of Array.isArray(data.worktrees) ? data.worktrees : []) {
|
|
2491
2227
|
if (!worktree || typeof worktree !== "object" || Array.isArray(worktree)) {
|
|
2492
2228
|
errors.push(`${basename(path)}: invalid worktree entry`);
|
|
2493
2229
|
continue;
|
|
2494
2230
|
}
|
|
2231
|
+
const direct = worktree.purpose === "direct-spec";
|
|
2232
|
+
const unit = direct ? "direct-spec" : worktree.ticket_id;
|
|
2495
2233
|
const requiredWorktreeKeys = [
|
|
2496
|
-
"ticket_id",
|
|
2234
|
+
...(direct ? ["purpose", "change", "integration_attempt_limit"] : ["ticket_id"]),
|
|
2497
2235
|
"owner",
|
|
2498
2236
|
"implementation_owner",
|
|
2499
2237
|
"integration_owner",
|
|
@@ -2514,14 +2252,24 @@ function validateChangeStatus(path, expectedChange, errors) {
|
|
|
2514
2252
|
}
|
|
2515
2253
|
const unexpectedWorktreeKeys = Object.keys(worktree).filter((key) => !requiredWorktreeKeys.includes(key));
|
|
2516
2254
|
if (unexpectedWorktreeKeys.length) {
|
|
2517
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2255
|
+
errors.push(`${basename(path)}: worktree ${unit} has unexpected keys ${JSON.stringify(unexpectedWorktreeKeys.sort())}`);
|
|
2518
2256
|
}
|
|
2519
|
-
if (
|
|
2520
|
-
errors.push(
|
|
2521
|
-
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2257
|
+
if (direct) {
|
|
2258
|
+
if (worktree.change !== expectedChange) errors.push("Direct Spec execution belongs to another change");
|
|
2259
|
+
try {
|
|
2260
|
+
if (readChangeOwner(context, expectedChange).owner !== worktree.owner) errors.push("Direct Spec execution owner differs from original Lead");
|
|
2261
|
+
} catch (error) { errors.push(error.message); }
|
|
2262
|
+
if (!Number.isInteger(worktree.integration_attempt_limit) || worktree.integration_attempt_limit < 1) errors.push("Direct Spec requires a positive integration_attempt_limit");
|
|
2263
|
+
if (worktree.integration?.attempts > worktree.integration_attempt_limit) errors.push("Direct Spec integration attempts exceed integration_attempt_limit");
|
|
2264
|
+
if (worktree.integration_owner !== worktree.owner) errors.push("Direct Spec integration owner must be Lead");
|
|
2265
|
+
if (worktree.status === "cancelled" && data.outcome !== "cancelled") errors.push("cancelled Direct Spec execution requires the original whole-change cancellation");
|
|
2266
|
+
if (worktree.workspace_ref !== "current" && worktree.branch !== `speculo/${expectedChange}/direct-spec`) errors.push("Direct Spec source branch must match its change");
|
|
2267
|
+
} else if (!/^T-[0-9]{2,}$/.test(String(unit))) {
|
|
2268
|
+
errors.push(`${basename(path)}: invalid worktree ticket_id ${unit}`);
|
|
2269
|
+
} else if (seenWorktreeTickets.has(unit)) {
|
|
2270
|
+
errors.push(`${basename(path)}: duplicate worktree for ${unit}`);
|
|
2271
|
+
}
|
|
2272
|
+
seenWorktreeTickets.add(unit);
|
|
2525
2273
|
const ref = worktree.workspace_ref;
|
|
2526
2274
|
if (
|
|
2527
2275
|
typeof ref !== "string" ||
|
|
@@ -2531,20 +2279,20 @@ function validateChangeStatus(path, expectedChange, errors) {
|
|
|
2531
2279
|
errors.push(`${basename(path)}: workspace_ref must be a portable non-absolute locator`);
|
|
2532
2280
|
continue;
|
|
2533
2281
|
}
|
|
2534
|
-
if (!VALID_WORKTREE_STATUS.has(worktree.status)) {
|
|
2282
|
+
if (!VALID_WORKTREE_STATUS.has(worktree.status) && !(direct && worktree.status === "cancelled")) {
|
|
2535
2283
|
errors.push(`${basename(path)}: invalid worktree status ${worktree.status}`);
|
|
2536
2284
|
}
|
|
2537
2285
|
const currentWorkspace = ref === "current";
|
|
2538
2286
|
if (worktree.provider !== "git") {
|
|
2539
|
-
errors.push(`${basename(path)}: Ticket worktree ${
|
|
2287
|
+
errors.push(`${basename(path)}: Ticket worktree ${unit} provider must be git`);
|
|
2540
2288
|
}
|
|
2541
|
-
const expectedRef = `specdev-worktree/${expectedChange}/${
|
|
2289
|
+
const expectedRef = `specdev-worktree/${expectedChange}/${unit}`;
|
|
2542
2290
|
if (!currentWorkspace && ref !== expectedRef) {
|
|
2543
2291
|
errors.push(`${basename(path)}: git workspace_ref must equal ${expectedRef}`);
|
|
2544
2292
|
}
|
|
2545
2293
|
|
|
2546
2294
|
if ("terminal_action" in worktree) {
|
|
2547
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2295
|
+
errors.push(`${basename(path)}: worktree ${unit} obsolete terminal_action is not allowed`);
|
|
2548
2296
|
}
|
|
2549
2297
|
const requiredIntegrationKeys = [
|
|
2550
2298
|
"owner",
|
|
@@ -2556,35 +2304,35 @@ function validateChangeStatus(path, expectedChange, errors) {
|
|
|
2556
2304
|
];
|
|
2557
2305
|
const missingIntegrationKeys = requiredIntegrationKeys.filter((key) => !(key in worktree));
|
|
2558
2306
|
if (missingIntegrationKeys.length) {
|
|
2559
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2307
|
+
errors.push(`${basename(path)}: worktree ${unit} integration contract missing ${JSON.stringify(missingIntegrationKeys)}`);
|
|
2560
2308
|
continue;
|
|
2561
2309
|
}
|
|
2562
2310
|
for (const key of ["owner", "implementation_owner", "integration_owner", "base_sha", "parent_branch", "branch", "updated_at"]) {
|
|
2563
2311
|
if (typeof worktree[key] !== "string" || !worktree[key].trim()) {
|
|
2564
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2312
|
+
errors.push(`${basename(path)}: worktree ${unit} ${key} is required`);
|
|
2565
2313
|
}
|
|
2566
2314
|
}
|
|
2567
2315
|
if (typeof worktree.parent_branch !== "string" || !worktree.parent_branch.trim()) {
|
|
2568
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2316
|
+
errors.push(`${basename(path)}: worktree ${unit} parent_branch is required`);
|
|
2569
2317
|
} else if (currentWorkspace && worktree.parent_branch !== worktree.branch) {
|
|
2570
|
-
errors.push(`${basename(path)}: current workspace ${
|
|
2318
|
+
errors.push(`${basename(path)}: current workspace ${unit} branch must equal parent_branch`);
|
|
2571
2319
|
} else if (!currentWorkspace && worktree.parent_branch === worktree.branch) {
|
|
2572
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2320
|
+
errors.push(`${basename(path)}: worktree ${unit} parent_branch must differ from branch`);
|
|
2573
2321
|
}
|
|
2574
2322
|
|
|
2575
2323
|
const sourceRequired = new Set(["review", "integrating", "integrated", "removed"]).has(worktree.status);
|
|
2576
2324
|
if (sourceRequired && (typeof worktree.source_checkpoint !== "string" || !worktree.source_checkpoint.trim())) {
|
|
2577
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2325
|
+
errors.push(`${basename(path)}: worktree ${unit} ${worktree.status} requires source_checkpoint`);
|
|
2578
2326
|
} else if (
|
|
2579
2327
|
worktree.source_checkpoint !== null &&
|
|
2580
2328
|
(typeof worktree.source_checkpoint !== "string" || !worktree.source_checkpoint.trim())
|
|
2581
2329
|
) {
|
|
2582
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2330
|
+
errors.push(`${basename(path)}: worktree ${unit} source_checkpoint must be null or non-empty`);
|
|
2583
2331
|
}
|
|
2584
2332
|
|
|
2585
2333
|
const integration = worktree.integration;
|
|
2586
2334
|
if (!integration || typeof integration !== "object" || Array.isArray(integration)) {
|
|
2587
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2335
|
+
errors.push(`${basename(path)}: worktree ${unit} integration must be an object`);
|
|
2588
2336
|
continue;
|
|
2589
2337
|
}
|
|
2590
2338
|
const requiredResultKeys = [
|
|
@@ -2608,49 +2356,48 @@ function validateChangeStatus(path, expectedChange, errors) {
|
|
|
2608
2356
|
];
|
|
2609
2357
|
const missingResultKeys = requiredResultKeys.filter((key) => !(key in integration));
|
|
2610
2358
|
if (missingResultKeys.length) {
|
|
2611
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2359
|
+
errors.push(`${basename(path)}: worktree ${unit} integration missing ${JSON.stringify(missingResultKeys)}`);
|
|
2612
2360
|
}
|
|
2613
2361
|
const unexpectedResultKeys = Object.keys(integration).filter((key) => !requiredResultKeys.includes(key));
|
|
2614
2362
|
if (unexpectedResultKeys.length) {
|
|
2615
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2363
|
+
errors.push(`${basename(path)}: worktree ${unit} integration has unexpected keys ${JSON.stringify(unexpectedResultKeys.sort())}`);
|
|
2616
2364
|
}
|
|
2617
2365
|
if (!VALID_INTEGRATION_STATUS.has(integration.status)) {
|
|
2618
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2366
|
+
errors.push(`${basename(path)}: worktree ${unit} has invalid integration status ${integration.status}`);
|
|
2619
2367
|
}
|
|
2620
2368
|
if (!VALID_INTEGRATION_METHOD.has(integration.method)) {
|
|
2621
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2369
|
+
errors.push(`${basename(path)}: worktree ${unit} has invalid integration method ${integration.method}`);
|
|
2622
2370
|
}
|
|
2623
2371
|
if (!VALID_INTEGRATION_VERIFICATION.has(integration.verification)) {
|
|
2624
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2372
|
+
errors.push(`${basename(path)}: worktree ${unit} has invalid integration verification ${integration.verification}`);
|
|
2625
2373
|
}
|
|
2626
2374
|
if (!Array.isArray(integration.conflict_paths)) {
|
|
2627
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2375
|
+
errors.push(`${basename(path)}: worktree ${unit} conflict_paths must be an array`);
|
|
2628
2376
|
}
|
|
2629
2377
|
if (!Number.isInteger(integration.attempts) || integration.attempts < 0) {
|
|
2630
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2378
|
+
errors.push(`${basename(path)}: worktree ${unit} attempts must be a non-negative integer`);
|
|
2631
2379
|
}
|
|
2632
|
-
|
|
2633
|
-
|
|
2634
|
-
|
|
2635
|
-
) {
|
|
2636
|
-
errors.push(`${basename(path)}: worktree ${worktree.ticket_id} integration evidence must be a rooted Ticket Evidence path`);
|
|
2380
|
+
const expectedEvidence = `<Path>{roots.state}/specdev/changes/${expectedChange}/evidence/${unit}.md</Path>`;
|
|
2381
|
+
if (direct ? integration.evidence !== expectedEvidence : typeof integration.evidence !== "string" || !/^<Path>\{roots\.state\}\/specdev\/changes\/[^<]+\/evidence\/T-[0-9]{2,}\.md<\/Path>$/.test(integration.evidence)) {
|
|
2382
|
+
errors.push(`${basename(path)}: worktree ${unit} integration evidence must be its rooted Evidence path: ${expectedEvidence}`);
|
|
2637
2383
|
}
|
|
2638
2384
|
if (!new Set(["pending", "applying", "applied", "failed", "stale"]).has(integration.promotion_status)) {
|
|
2639
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2385
|
+
errors.push(`${basename(path)}: worktree ${unit} has invalid promotion_status ${integration.promotion_status}`);
|
|
2640
2386
|
}
|
|
2641
2387
|
for (const [name, suite] of [["full_suite", integration.full_suite], ["e2e", integration.e2e]]) {
|
|
2642
2388
|
if (!suite || typeof suite !== "object" || Array.isArray(suite) || typeof suite.required !== "boolean" || !VALID_E2E_STATUS.has(suite.status)) {
|
|
2643
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2389
|
+
errors.push(`${basename(path)}: worktree ${unit} ${name} contract is invalid`);
|
|
2644
2390
|
continue;
|
|
2645
2391
|
}
|
|
2646
2392
|
const unexpectedSuiteKeys = Object.keys(suite).filter((key) => !new Set(["required", "status", "reason", "evidence"]).has(key));
|
|
2647
|
-
if (unexpectedSuiteKeys.length) errors.push(`${basename(path)}: worktree ${
|
|
2393
|
+
if (unexpectedSuiteKeys.length) errors.push(`${basename(path)}: worktree ${unit} ${name} has unexpected keys ${JSON.stringify(unexpectedSuiteKeys.sort())}`);
|
|
2648
2394
|
if (suite.required === false && (suite.status !== "not-required" || typeof suite.reason !== "string" || !suite.reason.trim())) {
|
|
2649
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2395
|
+
errors.push(`${basename(path)}: worktree ${unit} non-required ${name} needs not-required status and reason`);
|
|
2650
2396
|
}
|
|
2651
2397
|
if (suite.required === true && suite.status === "not-required") {
|
|
2652
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2398
|
+
errors.push(`${basename(path)}: worktree ${unit} required ${name} cannot be not-required`);
|
|
2653
2399
|
}
|
|
2400
|
+
if (direct && suite.required === true && suite.status === "passed" && (typeof suite.evidence !== "string" || !suite.evidence.trim())) errors.push(`Direct Spec passed ${name} requires actual evidence`);
|
|
2654
2401
|
}
|
|
2655
2402
|
const e2e = integration.e2e;
|
|
2656
2403
|
if (
|
|
@@ -2660,65 +2407,65 @@ function validateChangeStatus(path, expectedChange, errors) {
|
|
|
2660
2407
|
typeof e2e.required !== "boolean" ||
|
|
2661
2408
|
!VALID_E2E_STATUS.has(e2e.status)
|
|
2662
2409
|
) {
|
|
2663
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2410
|
+
errors.push(`${basename(path)}: worktree ${unit} integration e2e contract is invalid`);
|
|
2664
2411
|
} else {
|
|
2665
2412
|
const unexpectedE2eKeys = Object.keys(e2e).filter((key) => !new Set(["required", "status", "reason", "evidence"]).has(key));
|
|
2666
2413
|
if (unexpectedE2eKeys.length) {
|
|
2667
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2414
|
+
errors.push(`${basename(path)}: worktree ${unit} integration e2e has unexpected keys ${JSON.stringify(unexpectedE2eKeys.sort())}`);
|
|
2668
2415
|
}
|
|
2669
2416
|
if (e2e.required === false && e2e.status !== "not-required") {
|
|
2670
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2417
|
+
errors.push(`${basename(path)}: worktree ${unit} non-required E2E must use status=not-required`);
|
|
2671
2418
|
}
|
|
2672
2419
|
if (e2e.required === true && e2e.status === "not-required") {
|
|
2673
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2420
|
+
errors.push(`${basename(path)}: worktree ${unit} required E2E cannot be not-required`);
|
|
2674
2421
|
}
|
|
2675
2422
|
if (
|
|
2676
2423
|
e2e.required === true &&
|
|
2677
2424
|
e2e.status === "passed" &&
|
|
2678
2425
|
(typeof e2e.evidence !== "string" || !e2e.evidence.trim())
|
|
2679
2426
|
) {
|
|
2680
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2427
|
+
errors.push(`${basename(path)}: worktree ${unit} passed required E2E needs evidence`);
|
|
2681
2428
|
}
|
|
2682
2429
|
}
|
|
2683
2430
|
const integrationLifecycleActive = new Set(["integrating", "integrated", "removed"]).has(worktree.status);
|
|
2684
2431
|
if (integrationLifecycleActive) {
|
|
2685
2432
|
if (typeof integration.parent_before_sha !== "string" || !integration.parent_before_sha.trim()) {
|
|
2686
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2433
|
+
errors.push(`${basename(path)}: worktree ${unit} ${worktree.status} requires parent_before_sha`);
|
|
2687
2434
|
}
|
|
2688
2435
|
if (typeof integration.source_sha !== "string" || !integration.source_sha.trim()) {
|
|
2689
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2436
|
+
errors.push(`${basename(path)}: worktree ${unit} ${worktree.status} requires source_sha`);
|
|
2690
2437
|
} else if (integration.source_sha !== worktree.source_checkpoint) {
|
|
2691
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2438
|
+
errors.push(`${basename(path)}: worktree ${unit} source_sha must equal source_checkpoint`);
|
|
2692
2439
|
}
|
|
2693
2440
|
if (currentWorkspace) {
|
|
2694
2441
|
if (integration.candidate_sha !== null || integration.candidate_tree_sha !== null || integration.candidate_branch !== null || integration.candidate_workspace_ref !== null) {
|
|
2695
|
-
errors.push(`${basename(path)}: current workspace ${
|
|
2442
|
+
errors.push(`${basename(path)}: current workspace ${unit} cannot record candidate workspace fields`);
|
|
2696
2443
|
}
|
|
2697
2444
|
if (integration.method !== "direct-parent") {
|
|
2698
|
-
errors.push(`${basename(path)}: current workspace ${
|
|
2445
|
+
errors.push(`${basename(path)}: current workspace ${unit} requires integration.method=direct-parent`);
|
|
2699
2446
|
}
|
|
2700
2447
|
} else {
|
|
2701
2448
|
if (typeof integration.candidate_sha !== "string" || !integration.candidate_sha.trim()) {
|
|
2702
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2449
|
+
errors.push(`${basename(path)}: worktree ${unit} ${worktree.status} requires candidate_sha`);
|
|
2703
2450
|
}
|
|
2704
|
-
const expectedCandidateBranch = `speculo/integration/${expectedChange}/${
|
|
2451
|
+
const expectedCandidateBranch = `speculo/integration/${expectedChange}/${unit}`;
|
|
2705
2452
|
if (integration.candidate_branch !== expectedCandidateBranch) {
|
|
2706
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2453
|
+
errors.push(`${basename(path)}: worktree ${unit} candidate_branch must equal ${expectedCandidateBranch}`);
|
|
2707
2454
|
}
|
|
2708
|
-
const expectedCandidateRef = `specdev-worktree/.integration/${expectedChange}/${
|
|
2455
|
+
const expectedCandidateRef = `specdev-worktree/.integration/${expectedChange}/${unit}`;
|
|
2709
2456
|
if (integration.candidate_workspace_ref !== expectedCandidateRef) {
|
|
2710
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2457
|
+
errors.push(`${basename(path)}: worktree ${unit} candidate_workspace_ref must equal ${expectedCandidateRef}`);
|
|
2711
2458
|
}
|
|
2712
2459
|
if (!new Set(["fast-forward", "merge-commit"]).has(integration.method)) {
|
|
2713
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2460
|
+
errors.push(`${basename(path)}: worktree ${unit} ${worktree.status} requires an integration method`);
|
|
2714
2461
|
}
|
|
2715
2462
|
}
|
|
2716
2463
|
if (!Number.isInteger(integration.attempts) || integration.attempts < 1) {
|
|
2717
|
-
errors.push(`${basename(path)}: worktree ${
|
|
2464
|
+
errors.push(`${basename(path)}: worktree ${unit} ${worktree.status} requires attempts >= 1`);
|
|
2718
2465
|
}
|
|
2719
2466
|
}
|
|
2720
2467
|
if (worktree.status === "integrating" && integration.status !== "candidate") {
|
|
2721
|
-
errors.push(`${basename(path)}: integrating worktree ${
|
|
2468
|
+
errors.push(`${basename(path)}: integrating worktree ${unit} requires integration.status=candidate`);
|
|
2722
2469
|
}
|
|
2723
2470
|
if (new Set(["integrated", "removed"]).has(worktree.status)) {
|
|
2724
2471
|
if (
|
|
@@ -2728,49 +2475,41 @@ function validateChangeStatus(path, expectedChange, errors) {
|
|
|
2728
2475
|
typeof integration.result_sha !== "string" ||
|
|
2729
2476
|
!integration.result_sha.trim() ||
|
|
2730
2477
|
(currentWorkspace ? integration.result_sha !== worktree.source_checkpoint : integration.result_sha !== integration.candidate_sha) ||
|
|
2478
|
+
(direct && (integration.promotion_status !== "applied" || !new Set(["not-required", "passed"]).has(integration.full_suite?.status))) ||
|
|
2731
2479
|
!e2e ||
|
|
2732
2480
|
!new Set(["not-required", "passed"]).has(e2e.status)
|
|
2733
2481
|
) {
|
|
2734
|
-
errors.push(`${basename(path)}: ${worktree.status} worktree ${
|
|
2482
|
+
errors.push(`${basename(path)}: ${worktree.status} worktree ${unit} requires passed candidate/result/E2E state`);
|
|
2735
2483
|
}
|
|
2736
2484
|
if (currentWorkspace && integration.method === "direct-parent") {
|
|
2737
2485
|
if (integration.candidate_sha !== null || integration.candidate_tree_sha !== null || integration.candidate_branch !== null || integration.candidate_workspace_ref !== null) {
|
|
2738
|
-
errors.push(`${basename(path)}: current workspace ${
|
|
2486
|
+
errors.push(`${basename(path)}: current workspace ${unit} direct-parent cannot record candidate fields`);
|
|
2739
2487
|
}
|
|
2740
2488
|
if (integration.result_sha !== worktree.source_checkpoint) {
|
|
2741
|
-
errors.push(`${basename(path)}: current workspace ${worktree.status} ${
|
|
2489
|
+
errors.push(`${basename(path)}: current workspace ${worktree.status} ${unit} result_sha must equal source_checkpoint`);
|
|
2742
2490
|
}
|
|
2743
2491
|
} else if (integration.method === "fast-forward") {
|
|
2744
2492
|
if (integration.candidate_sha !== worktree.source_checkpoint) {
|
|
2745
|
-
errors.push(`${basename(path)}: ${worktree.status} worktree ${
|
|
2493
|
+
errors.push(`${basename(path)}: ${worktree.status} worktree ${unit} fast-forward candidate/result must equal source_checkpoint`);
|
|
2746
2494
|
}
|
|
2747
2495
|
if (Array.isArray(integration.conflict_paths) && integration.conflict_paths.length > 0) {
|
|
2748
|
-
errors.push(`${basename(path)}: ${worktree.status} worktree ${
|
|
2496
|
+
errors.push(`${basename(path)}: ${worktree.status} worktree ${unit} fast-forward cannot record conflict_paths`);
|
|
2749
2497
|
}
|
|
2750
2498
|
} else if (
|
|
2751
2499
|
integration.method === "merge-commit" &&
|
|
2752
2500
|
typeof integration.candidate_sha === "string" &&
|
|
2753
2501
|
(integration.candidate_sha === worktree.source_checkpoint || integration.candidate_sha === integration.parent_before_sha)
|
|
2754
2502
|
) {
|
|
2755
|
-
errors.push(`${basename(path)}: ${worktree.status} worktree ${
|
|
2503
|
+
errors.push(`${basename(path)}: ${worktree.status} worktree ${unit} merge-commit candidate must be a distinct checkpoint`);
|
|
2756
2504
|
}
|
|
2757
2505
|
}
|
|
2758
2506
|
}
|
|
2759
|
-
if (data.change_status === "archived") {
|
|
2760
|
-
if (data.archived !== true) errors.push(`${basename(path)}: archived status requires archived=true`);
|
|
2761
|
-
const inner = typeof data.archive_path === "string" ? stripPathTag(data.archive_path) : null;
|
|
2762
|
-
if (inner === null || !inner.startsWith(`${STATE_PREFIX}archive/`)) {
|
|
2763
|
-
errors.push(`${basename(path)}: archived status requires a rooted archive_path`);
|
|
2764
|
-
}
|
|
2765
|
-
} else if (data.archived === true) {
|
|
2766
|
-
errors.push(`${basename(path)}: archived=true conflicts with change_status=${data.change_status}`);
|
|
2767
|
-
}
|
|
2768
2507
|
return data;
|
|
2769
2508
|
}
|
|
2770
2509
|
|
|
2771
2510
|
function validateCurrentWorkspaceExecution(changeStatus, goalPlan, errors) {
|
|
2772
|
-
|
|
2773
|
-
const entries =
|
|
2511
|
+
const allEntries = Array.isArray(changeStatus?.worktrees) ? changeStatus.worktrees : [];
|
|
2512
|
+
const entries = goalPlan?.meta.ticket_workspace_policy === "current" ? allEntries : allEntries.filter(entry => entry.workspace_ref === "current");
|
|
2774
2513
|
const active = [];
|
|
2775
2514
|
for (const worktree of entries) {
|
|
2776
2515
|
if (worktree.workspace_ref !== "current") {
|
|
@@ -2780,7 +2519,7 @@ function validateCurrentWorkspaceExecution(changeStatus, goalPlan, errors) {
|
|
|
2780
2519
|
errors.push(`${worktree.ticket_id}: current workspace execution must commit directly on parent_branch`);
|
|
2781
2520
|
}
|
|
2782
2521
|
if (new Set(["active", "review", "integrating", "blocked"]).has(worktree.status)) {
|
|
2783
|
-
active.push(worktree.ticket_id);
|
|
2522
|
+
active.push(worktree.ticket_id ?? worktree.purpose);
|
|
2784
2523
|
}
|
|
2785
2524
|
const integration = worktree.integration;
|
|
2786
2525
|
if (integration && typeof integration === "object" && !Array.isArray(integration)) {
|
|
@@ -2819,7 +2558,7 @@ function gitSucceeds(repoRoot, args) {
|
|
|
2819
2558
|
}
|
|
2820
2559
|
|
|
2821
2560
|
function validateGitEvidence(repoRoot, changeStatus, errors) {
|
|
2822
|
-
if (!repoRoot) return;
|
|
2561
|
+
if (!repoRoot || !changeStatus?.worktrees?.length) return;
|
|
2823
2562
|
const resolvedRoot = resolve(repoRoot);
|
|
2824
2563
|
if (gitOutput(resolvedRoot, ["rev-parse", "--is-inside-work-tree"]) !== "true") {
|
|
2825
2564
|
errors.push(`--repo is not a Git worktree: ${resolvedRoot}`);
|
|
@@ -2827,7 +2566,7 @@ function validateGitEvidence(repoRoot, changeStatus, errors) {
|
|
|
2827
2566
|
}
|
|
2828
2567
|
const currentBranch = gitOutput(resolvedRoot, ["branch", "--show-current"]);
|
|
2829
2568
|
for (const worktree of Array.isArray(changeStatus?.worktrees) ? changeStatus.worktrees : []) {
|
|
2830
|
-
const label = String(worktree.ticket_id ?? "worktree");
|
|
2569
|
+
const label = String(worktree.ticket_id ?? worktree.purpose ?? "worktree");
|
|
2831
2570
|
for (const [name, sha] of [
|
|
2832
2571
|
["base_sha", worktree.base_sha],
|
|
2833
2572
|
["source_checkpoint", worktree.source_checkpoint],
|
|
@@ -2851,13 +2590,56 @@ function validateGitEvidence(repoRoot, changeStatus, errors) {
|
|
|
2851
2590
|
} else if (worktree.integration?.source_sha && worktree.base_sha && !gitSucceeds(resolvedRoot, ["merge-base", "--is-ancestor", worktree.base_sha, worktree.integration.source_sha])) {
|
|
2852
2591
|
errors.push(`${label}: source_sha must descend from base_sha`);
|
|
2853
2592
|
}
|
|
2593
|
+
if (worktree.workspace_ref !== "current" && new Set(["active","review","integrating","blocked"]).has(worktree.status)) {
|
|
2594
|
+
try {
|
|
2595
|
+
const source = runtime.safeWorkPathSync(resolvedRoot,worktree.workspace_ref,{mustExist:true,type:"directory"});
|
|
2596
|
+
const common = gitOutput(resolvedRoot,["rev-parse","--path-format=absolute","--git-common-dir"]);
|
|
2597
|
+
if (gitOutput(source,["rev-parse","--path-format=absolute","--git-common-dir"]) !== common || gitOutput(source,["branch","--show-current"]) !== worktree.branch) errors.push(`${label}: source workspace must be a real isolated worktree of the recorded repository and branch`);
|
|
2598
|
+
} catch(error) { errors.push(`${label}: actual source isolation is missing: ${error.message}`); }
|
|
2599
|
+
}
|
|
2600
|
+
if (worktree.status === "integrating" && worktree.workspace_ref !== "current") {
|
|
2601
|
+
try {
|
|
2602
|
+
const candidate = runtime.safeWorkPathSync(resolvedRoot,worktree.integration.candidate_workspace_ref,{mustExist:true,type:"directory"});
|
|
2603
|
+
if (gitOutput(candidate,["rev-parse","HEAD"]) !== worktree.integration.candidate_sha || gitOutput(candidate,["rev-parse","HEAD^{tree}"]) !== worktree.integration.candidate_tree_sha) errors.push(`${label}: actual candidate workspace differs from the recorded checkpoint/tree`);
|
|
2604
|
+
} catch(error) { errors.push(`${label}: actual candidate isolation is missing: ${error.message}`); }
|
|
2605
|
+
}
|
|
2606
|
+
if (worktree.purpose === "direct-spec") {
|
|
2607
|
+
const integration = worktree.integration;
|
|
2608
|
+
if (worktree.source_checkpoint && gitOutput(resolvedRoot, ["rev-parse", worktree.branch]) !== worktree.source_checkpoint && worktree.status !== "removed") errors.push(`${label}: source branch tip differs from source_checkpoint`);
|
|
2609
|
+
if (worktree.source_checkpoint && !gitSucceeds(resolvedRoot, ["merge-base", "--is-ancestor", worktree.base_sha, worktree.source_checkpoint])) errors.push(`${label}: source_checkpoint must descend from base_sha`);
|
|
2610
|
+
if (worktree.workspace_ref !== "current" && new Set(["review", "integrating", "integrated"]).has(worktree.status)) {
|
|
2611
|
+
try {
|
|
2612
|
+
const source = runtime.safeWorkPathSync(resolvedRoot, worktree.workspace_ref, {mustExist:true,type:"directory"});
|
|
2613
|
+
if (gitOutput(source, ["status", "--porcelain"])) errors.push(`${label}: source worktree is dirty`);
|
|
2614
|
+
} catch (error) { errors.push(`${label}: source worktree missing before cleanup: ${error.message}`); }
|
|
2615
|
+
}
|
|
2616
|
+
if (integration?.candidate_sha) {
|
|
2617
|
+
if (gitOutput(resolvedRoot, ["rev-parse", `${integration.candidate_sha}^{tree}`]) !== integration.candidate_tree_sha) errors.push(`${label}: candidate tree differs from recorded tree`);
|
|
2618
|
+
for (const sha of [integration.parent_before_sha, worktree.source_checkpoint]) {
|
|
2619
|
+
if (sha && !gitSucceeds(resolvedRoot, ["merge-base", "--is-ancestor", sha, integration.candidate_sha])) errors.push(`${label}: candidate must contain parent and source checkpoints`);
|
|
2620
|
+
}
|
|
2621
|
+
}
|
|
2622
|
+
const parent = gitOutput(resolvedRoot, ["rev-parse", worktree.parent_branch]);
|
|
2623
|
+
if (worktree.status === "integrating" && worktree.workspace_ref !== "current") {
|
|
2624
|
+
try {
|
|
2625
|
+
const candidate = runtime.safeWorkPathSync(resolvedRoot, integration.candidate_workspace_ref, {mustExist:true,type:"directory"});
|
|
2626
|
+
if (gitOutput(candidate, ["rev-parse", "--path-format=absolute", "--git-common-dir"]) !== gitOutput(resolvedRoot, ["rev-parse", "--path-format=absolute", "--git-common-dir"]) || gitOutput(candidate, ["branch", "--show-current"]) !== integration.candidate_branch || gitOutput(candidate, ["status", "--porcelain"])) errors.push(`${label}: candidate must be a clean worktree of the recorded repository and branch`);
|
|
2627
|
+
} catch (error) { errors.push(`${label}: candidate cannot be inspected: ${error.message}`); }
|
|
2628
|
+
}
|
|
2629
|
+
if (worktree.status === "integrating" && parent !== integration?.parent_before_sha) errors.push(`${label}: parent HEAD drifted; candidate must be marked stale and rebuilt`);
|
|
2630
|
+
if (new Set(["failed", "stale"]).has(integration?.status) && parent === integration.candidate_sha && parent !== integration.parent_before_sha) errors.push(`${label}: failed or stale candidate has already advanced the parent; reconcile before continuing`);
|
|
2631
|
+
if (new Set(["integrated", "removed"]).has(worktree.status)) {
|
|
2632
|
+
if (parent !== integration?.result_sha) errors.push(`${label}: parent branch HEAD must equal recorded result_sha`);
|
|
2633
|
+
if (!gitSucceeds(resolvedRoot, ["merge-base", "--is-ancestor", worktree.source_checkpoint, parent])) errors.push(`${label}: parent must contain source_checkpoint`);
|
|
2634
|
+
}
|
|
2635
|
+
}
|
|
2854
2636
|
if (new Set(["integrated", "removed"]).has(worktree.status) && gitOutput(resolvedRoot, ["status", "--porcelain"])) {
|
|
2855
2637
|
errors.push(`${label}: repository is dirty while Ticket is recorded as ${worktree.status}`);
|
|
2856
2638
|
}
|
|
2857
2639
|
}
|
|
2858
2640
|
}
|
|
2859
2641
|
|
|
2860
|
-
function validateParentImplementation(change, parentStatus, stage, errors, warnings, repoRoot = null) {
|
|
2642
|
+
function validateParentImplementation(change, parentStatus, stage, errors, warnings, repoRoot = null, options = {}) {
|
|
2861
2643
|
const mapPath = join(change, "implementation-map.md");
|
|
2862
2644
|
const planPath = join(change, "implementation-plan.md");
|
|
2863
2645
|
if (!isFile(mapPath)) errors.push("parent implementation requires implementation-map.md");
|
|
@@ -2868,7 +2650,7 @@ function validateParentImplementation(change, parentStatus, stage, errors, warni
|
|
|
2868
2650
|
const map = parseFrontmatter(mapPath);
|
|
2869
2651
|
const plan = parseFrontmatter(planPath);
|
|
2870
2652
|
const mapKeys = ["schema_version", "artifact", "change", "status", "revision", "members", "tasks", "dependencies", "serializations"];
|
|
2871
|
-
const planKeys = ["schema_version", "artifact", "change", "status", "source_map_revision", "orchestration", "lead", "
|
|
2653
|
+
const planKeys = ["schema_version", "artifact", "change", "status", "source_map_revision", "orchestration", "lead", "concurrent_implementation_limit", "integration_attempt_limit", "ticket_workspace_policy", "integration_gate", "ready_for_execution"];
|
|
2872
2654
|
for (const [label, meta, expected] of [
|
|
2873
2655
|
["implementation-map.md", map.meta, mapKeys],
|
|
2874
2656
|
["implementation-plan.md", plan.meta, planKeys],
|
|
@@ -2899,7 +2681,7 @@ function validateParentImplementation(change, parentStatus, stage, errors, warni
|
|
|
2899
2681
|
if (plan.meta.orchestration !== "lead-directed" || typeof plan.meta.lead !== "string" || !plan.meta.lead.trim()) {
|
|
2900
2682
|
errors.push("implementation-plan.md: lead-directed orchestration requires a recoverable Lead");
|
|
2901
2683
|
}
|
|
2902
|
-
for (const key of ["
|
|
2684
|
+
for (const key of ["concurrent_implementation_limit", "integration_attempt_limit"]) {
|
|
2903
2685
|
if (!Number.isInteger(plan.meta[key]) || plan.meta[key] < 1) {
|
|
2904
2686
|
errors.push(`implementation-plan.md: ${key} must be a positive integer`);
|
|
2905
2687
|
}
|
|
@@ -2965,7 +2747,8 @@ function validateParentImplementation(change, parentStatus, stage, errors, warni
|
|
|
2965
2747
|
errors.push(`implementation-map.md: invalid member change name ${member}`);
|
|
2966
2748
|
continue;
|
|
2967
2749
|
}
|
|
2968
|
-
|
|
2750
|
+
let memberRoot;
|
|
2751
|
+
try { memberRoot = runtime.resolveChangeSync(options.context,member,{includeArchived:parentStatus?.location.kind === "archive"}).root; } catch(error) { errors.push(`member change does not exist or has invalid identity: ${member}: ${error.message}`); continue; }
|
|
2969
2752
|
if (!isDirectory(memberRoot)) {
|
|
2970
2753
|
errors.push(`implementation-map.md: member change does not exist: ${member}`);
|
|
2971
2754
|
continue;
|
|
@@ -2976,13 +2759,11 @@ function validateParentImplementation(change, parentStatus, stage, errors, warni
|
|
|
2976
2759
|
|
|
2977
2760
|
const memberErrors = [];
|
|
2978
2761
|
const memberWarnings = [];
|
|
2979
|
-
const status =
|
|
2762
|
+
const status = validateChangeExecution(memberRoot, memberErrors, options.context);
|
|
2980
2763
|
if (status) {
|
|
2981
2764
|
memberStatuses.set(member, status);
|
|
2982
|
-
if (
|
|
2983
|
-
if (
|
|
2984
|
-
memberErrors.push(`current_work=${status.current_work} conflicts with parent implementation ownership`);
|
|
2985
|
-
}
|
|
2765
|
+
if (parentStatus?.outcome === "completed") validateGitEvidence(options.context.projectRoot,status,memberErrors);
|
|
2766
|
+
if (parentStatus?.location.kind !== "archive" && status.location.kind !== "active") memberErrors.push("archived change cannot be an implementation member");
|
|
2986
2767
|
for (const worktree of Array.isArray(status.worktrees) ? status.worktrees : []) {
|
|
2987
2768
|
if (worktree?.status === "active") {
|
|
2988
2769
|
activeImplementations += 1;
|
|
@@ -3092,7 +2873,7 @@ function validateParentImplementation(change, parentStatus, stage, errors, warni
|
|
|
3092
2873
|
const uncovered = [...declared].filter((id) => !covered.has(id) && !(childMap && new RegExp(`${escapeRegExp(id)}.*\\bdeferred\\b`, "i").test(childMap.body)));
|
|
3093
2874
|
if (uncovered.length) memberErrors.push(`Spec acceptance contracts are not covered by Tickets: ${JSON.stringify(uncovered.sort())}`);
|
|
3094
2875
|
}
|
|
3095
|
-
if (status?.
|
|
2876
|
+
if (status?.outcome === "completed") {
|
|
3096
2877
|
const unfinished = [...childTickets].filter(([, artifact]) => !new Set(["done", "cancelled"]).has(artifact.meta.status)).map(([id]) => id);
|
|
3097
2878
|
if (unfinished.length) memberErrors.push(`completed member has unfinished Tickets: ${JSON.stringify(unfinished)}`);
|
|
3098
2879
|
}
|
|
@@ -3207,30 +2988,18 @@ function validateParentImplementation(change, parentStatus, stage, errors, warni
|
|
|
3207
2988
|
if (!Array.isArray(otherMap.members)) continue;
|
|
3208
2989
|
let otherStatus = null;
|
|
3209
2990
|
try {
|
|
3210
|
-
otherStatus =
|
|
2991
|
+
otherStatus = runtime.readChangeFactsSync(options.context, entry.name).outcome;
|
|
3211
2992
|
} catch {
|
|
3212
2993
|
// Invalid competing parents still own their members conservatively.
|
|
3213
2994
|
}
|
|
3214
|
-
if (new Set(["completed", "
|
|
2995
|
+
if (new Set(["completed", "cancelled"]).has(otherStatus)) continue;
|
|
3215
2996
|
const overlap = otherMap.members.map(String).filter((member) => memberSet.has(member));
|
|
3216
2997
|
if (overlap.length) errors.push(`member changes already belong to unfinished parent implementation ${entry.name}: ${JSON.stringify(overlap)}`);
|
|
3217
2998
|
}
|
|
3218
2999
|
|
|
3219
|
-
|
|
3220
|
-
|
|
3221
|
-
|
|
3222
|
-
if (!config || config.schema_version !== CONFIG_SCHEMA_VERSION || configuredAgents === 0 || configuredAttempts === 0) {
|
|
3223
|
-
errors.push("implementation-plan.md: SpecDev config v6 with positive execution limits is required");
|
|
3224
|
-
} else {
|
|
3225
|
-
if (plan.meta.implementation_agent_limit > configuredAgents) {
|
|
3226
|
-
errors.push(`implementation-plan.md: implementation_agent_limit ${plan.meta.implementation_agent_limit} exceeds config max_implementation_agents ${configuredAgents}`);
|
|
3227
|
-
}
|
|
3228
|
-
if (plan.meta.integration_attempt_limit > configuredAttempts) {
|
|
3229
|
-
errors.push(`implementation-plan.md: integration_attempt_limit ${plan.meta.integration_attempt_limit} exceeds config max_integration_attempts ${configuredAttempts}`);
|
|
3230
|
-
}
|
|
3231
|
-
}
|
|
3232
|
-
if (activeImplementations > plan.meta.implementation_agent_limit) {
|
|
3233
|
-
errors.push(`parent implementation agent limit exceeded: ${activeImplementations} active for limit ${plan.meta.implementation_agent_limit}`);
|
|
3000
|
+
errors.push(...validateExecutionPolicy(plan, findSpecdevConfig(change, repoRoot, options)).map(error => `implementation-plan.md: ${error}`));
|
|
3001
|
+
if (activeImplementations > plan.meta.concurrent_implementation_limit) {
|
|
3002
|
+
errors.push(`parent implementation agent limit exceeded: ${activeImplementations} active for limit ${plan.meta.concurrent_implementation_limit}`);
|
|
3234
3003
|
}
|
|
3235
3004
|
if (plan.meta.ticket_workspace_policy === "current" && activeCurrentWriters > 1) {
|
|
3236
3005
|
errors.push(`parent current policy permits only one active implementation writer; found ${activeCurrentWriters}`);
|
|
@@ -3239,24 +3008,14 @@ function validateParentImplementation(change, parentStatus, stage, errors, warni
|
|
|
3239
3008
|
if (count > 1) errors.push(`repository/ref integration must be serialized for ${ref}; found ${count}`);
|
|
3240
3009
|
}
|
|
3241
3010
|
|
|
3242
|
-
if (
|
|
3243
|
-
|
|
3244
|
-
}
|
|
3245
|
-
if (parentStatus?.change_status === "completed") {
|
|
3246
|
-
const incomplete = members.filter((member) => memberStatuses.get(member)?.change_status !== "completed");
|
|
3011
|
+
if (parentStatus?.outcome === "completed") {
|
|
3012
|
+
const incomplete = members.filter((member) => memberStatuses.get(member)?.outcome !== "completed");
|
|
3247
3013
|
if (incomplete.length) errors.push(`parent implementation is completed while members remain incomplete: ${JSON.stringify(incomplete)}`);
|
|
3248
3014
|
const unfinished = [...ticketByTask].filter(([, value]) => !new Set(["done", "cancelled"]).has(value.artifact.meta.status)).map(([task]) => task);
|
|
3249
3015
|
if (unfinished.length) errors.push(`completed parent implementation has unfinished composite tasks: ${JSON.stringify(unfinished)}`);
|
|
3250
3016
|
if (map.meta.status !== "completed" || plan.meta.status !== "completed") {
|
|
3251
3017
|
errors.push("completed parent requires completed Implementation Map and Implementation Plan");
|
|
3252
3018
|
}
|
|
3253
|
-
if (
|
|
3254
|
-
parentStatus.current_work !== null ||
|
|
3255
|
-
!Array.isArray(parentStatus.blockers) || parentStatus.blockers.length > 0 ||
|
|
3256
|
-
!Array.isArray(parentStatus.deviations) || parentStatus.deviations.length > 0
|
|
3257
|
-
) {
|
|
3258
|
-
errors.push("completed parent requires null current_work and no blockers or deviations");
|
|
3259
|
-
}
|
|
3260
3019
|
const activeMemberWork = [...memberStatuses]
|
|
3261
3020
|
.flatMap(([member, status]) => (status.worktrees ?? []).map((worktree) => ({ member, worktree })))
|
|
3262
3021
|
.filter(({ worktree }) => new Set(["planned", "active", "review", "integrating", "blocked"]).has(worktree?.status) || worktree?.integration?.status === "candidate")
|
|
@@ -3300,23 +3059,47 @@ function validateParentImplementation(change, parentStatus, stage, errors, warni
|
|
|
3300
3059
|
return { map, plan, members, tasks, memberStatuses, ticketByTask };
|
|
3301
3060
|
}
|
|
3302
3061
|
|
|
3303
|
-
function validateChange(change, stage = null, repoRoot = null, engineeringKind = null) {
|
|
3062
|
+
function validateChange(change, stage = null, repoRoot = null, engineeringKind = null, prototypeId = null, options = {}) {
|
|
3304
3063
|
const errors = [];
|
|
3305
3064
|
const warnings = [];
|
|
3065
|
+
const archiveReady = stage === "archive-ready";
|
|
3066
|
+
if (archiveReady) stage = "complete";
|
|
3306
3067
|
if (!isDirectory(change)) {
|
|
3307
3068
|
return { errors: [`change directory does not exist: ${change}`], warnings };
|
|
3308
3069
|
}
|
|
3309
3070
|
|
|
3310
|
-
const workspace = resolveWorkspaceContract(repoRoot, change);
|
|
3071
|
+
const workspace = resolveWorkspaceContract(repoRoot, change, options);
|
|
3311
3072
|
errors.push(...workspace.errors);
|
|
3073
|
+
if (errors.length) return {errors,warnings};
|
|
3074
|
+
options = {...options, context:workspace.context};
|
|
3075
|
+
change = canonicalToolPath(workspace.context, change);
|
|
3076
|
+
|
|
3077
|
+
// Resolve every consumed artifact subtree before individual validators can read it.
|
|
3078
|
+
// Unrelated preserved links are not consumers and remain in the archive manifest.
|
|
3079
|
+
if(stage !== 'archived') try {
|
|
3080
|
+
for(const name of ['README.md','spec.md','goal-plan.md','implementation-map.md','implementation-plan.md','tickets-map.md','DESIGN.md','design-tree.json','source.md','triage.md','publish.md','diagnosis.md','wayfinder-map.md','LOG.md','ticket','evidence','investigation','learning','reviews','prototypes']) {
|
|
3081
|
+
const path=runtime.safeWorkPathSync(change,name);
|
|
3082
|
+
if(isDirectory(path)) for(const child of walk(path)) runtime.safeWorkPathSync(change,toPosix(relative(change,child)));
|
|
3083
|
+
}
|
|
3084
|
+
}catch(error){return {errors:[...errors,error.message],warnings};}
|
|
3312
3085
|
|
|
3313
3086
|
// A partial parent must never fall back to the single-change artifact contract.
|
|
3314
3087
|
const mapPath = join(change, "tickets-map.md");
|
|
3315
3088
|
const isParentImplementation = isFile(join(change, "implementation-map.md")) ||
|
|
3316
3089
|
isFile(join(change, "implementation-plan.md")) ||
|
|
3317
3090
|
(isFile(mapPath) && parseFrontmatter(mapPath).meta.artifact === "goal-tickets-map");
|
|
3318
|
-
const changeStatus =
|
|
3319
|
-
if (
|
|
3091
|
+
const changeStatus = stage === "archived" ? null : validateChangeExecution(change, errors, workspace.context);
|
|
3092
|
+
if (errors.length) return {errors,warnings};
|
|
3093
|
+
if (stage === "complete" || changeStatus?.outcome === "completed") errors.push(...validateChangeClosure({context:workspace.context,change:basename(change),forArchive:archiveReady}).errors);
|
|
3094
|
+
if (archiveReady && changeStatus?.outcome === "cancelled") return {errors,warnings};
|
|
3095
|
+
if (stage === "archived") {
|
|
3096
|
+
const output=runDesignCheck("--archived", change, errors, workspace.context,options.sealed ? ['--sealed'] : []);
|
|
3097
|
+
let archive;
|
|
3098
|
+
if(output) {try {archive=JSON.parse(output);}catch {errors.push('archived consumer returned no verified receipt result');}}
|
|
3099
|
+
if(archive?.archive_state === 'moved') warnings.push('archive moved and checked, but is not sealed; finish the original A8 receipt');
|
|
3100
|
+
return { errors, warnings, ...(archive ? {archive} : {}) };
|
|
3101
|
+
}
|
|
3102
|
+
if (isParentImplementation) validateParentImplementation(change, changeStatus, stage, errors, warnings, repoRoot, options);
|
|
3320
3103
|
errors.push(...validateInitiative(change));
|
|
3321
3104
|
if (isFile(join(change, "source-issue.md"))) {
|
|
3322
3105
|
errors.push("obsolete source-issue.md is forbidden; use source.md without compatibility fallback");
|
|
@@ -3331,7 +3114,7 @@ function validateChange(change, stage = null, repoRoot = null, engineeringKind =
|
|
|
3331
3114
|
: null;
|
|
3332
3115
|
const triagePath = join(change, "triage.md");
|
|
3333
3116
|
const triage = isFile(triagePath) || sourceRequired
|
|
3334
|
-
? validateTriage(triagePath, basename(change), errors
|
|
3117
|
+
? validateTriage(triagePath, basename(change), errors)
|
|
3335
3118
|
: null;
|
|
3336
3119
|
const publishPath = join(change, "publish.md");
|
|
3337
3120
|
const publishRequired = Boolean(
|
|
@@ -3345,34 +3128,40 @@ function validateChange(change, stage = null, repoRoot = null, engineeringKind =
|
|
|
3345
3128
|
validateDiagnosis(diagnosisPath, basename(change), errors);
|
|
3346
3129
|
}
|
|
3347
3130
|
validateReviews(change, stage === "review", errors);
|
|
3348
|
-
validatePrototypes(change, stage === "prototype", errors);
|
|
3349
|
-
|
|
3131
|
+
validatePrototypes(change, stage === "prototype", errors, prototypeId, new Set(["spec", "tickets", "goal-plan", "implement", "review", "complete"]).has(stage), workspace.context);
|
|
3132
|
+
if (new Set(["tickets", "goal-plan", "implement", "review", "complete"]).has(stage)) runDesignCheck("--handoff", change, errors, workspace.context);
|
|
3133
|
+
validateChangeLearning(change, stage === "learn", errors);
|
|
3350
3134
|
const retro = validateRecords(change, "retrospective", parseFrontmatter);
|
|
3351
3135
|
const prs = validateRecords(change, "pull-request", parseFrontmatter);
|
|
3352
3136
|
errors.push(...retro.errors, ...prs.errors);
|
|
3353
3137
|
if (stage === "retro" && !retro.records.some(r => r.meta.status === "completed")) errors.push("retro stage requires a completed retrospective");
|
|
3354
3138
|
if (stage === "pr-delivery" && !prs.records.length) errors.push("pr-delivery stage requires a PR record");
|
|
3355
|
-
if (
|
|
3139
|
+
if (archiveReady && prs.records.some(r => r.meta.requested === true && (["planned", "failed"].includes(r.meta.status) || (r.meta.delivery_target === "ready" && r.meta.status === "draft")))) errors.push("complete stage cannot archive pending PR delivery");
|
|
3356
3140
|
const retroOnly = retro.records.length > 0 && retro.errors.length === 0 && retro.records.every(r => r.meta.status === "completed") &&
|
|
3357
|
-
changeStatus?.works_run?.includes("specdev/retro") && changeStatus.works_run.every(w => ["specdev/retro", "specdev/triage"].includes(w)) &&
|
|
3358
3141
|
!["spec.md", "ticket", "tickets-map.md", "goal-plan.md", "implementation-map.md", "implementation-plan.md", "evidence"].some(p => existsSync(join(change,p))) && !changeStatus.worktrees?.length;
|
|
3359
3142
|
|
|
3143
|
+
let simpleGoal = null;
|
|
3144
|
+
try { simpleGoal = readLightweightGoal(change); } catch (error) { errors.push(error.message); }
|
|
3360
3145
|
const specRequired = new Set(["spec", "tickets", "goal-plan", "implement", "complete"]).has(stage) && !isParentImplementation && !retroOnly;
|
|
3361
3146
|
const specPath = join(change, "spec.md");
|
|
3362
|
-
|
|
3363
|
-
|
|
3364
|
-
:
|
|
3147
|
+
let specification = null;
|
|
3148
|
+
if (!isParentImplementation && !retroOnly && (isFile(specPath) || specRequired)) {
|
|
3149
|
+
try { specification = readSpecification(change, {allowLightweight: stage !== "tickets" && (stage !== "goal-plan" || Boolean(simpleGoal)), requiredArtifact:options.requiredArtifact, depth:options.depth}); }
|
|
3150
|
+
catch(error) { errors.push(error.message); }
|
|
3151
|
+
}
|
|
3152
|
+
const lightweight = specification?.lightweight === true;
|
|
3153
|
+
const spec = isFile(specPath) ? validateSpec(specPath, errors, warnings) : null;
|
|
3365
3154
|
const ticketMode = isDirectory(join(change, "ticket"));
|
|
3366
|
-
const mapRequired = !isParentImplementation && (new Set(["tickets", "goal-plan"]).has(stage) || (stage === "implement" && ticketMode));
|
|
3155
|
+
const mapRequired = !simpleGoal && !isParentImplementation && (new Set(["tickets", "goal-plan"]).has(stage) || (stage === "implement" && ticketMode));
|
|
3367
3156
|
const ticketsMap = isFile(mapPath) || mapRequired ? validateMap(mapPath, errors, repoRoot) : null;
|
|
3368
3157
|
const goalPlanPath = join(change, "goal-plan.md");
|
|
3369
|
-
const goalPlan = isFile(goalPlanPath) || (stage === "goal-plan" && !isParentImplementation)
|
|
3158
|
+
const goalPlan = !simpleGoal && (isFile(goalPlanPath) || (stage === "goal-plan" && !isParentImplementation))
|
|
3370
3159
|
? validateGoalPlan(goalPlanPath, errors)
|
|
3371
3160
|
: null;
|
|
3372
3161
|
validateDesignTree(join(change, "design-tree.json"), change, errors);
|
|
3373
3162
|
validateWayfinder(change, errors);
|
|
3374
3163
|
if (stage === "grill") {
|
|
3375
|
-
for (const name of ["design-tree.json"
|
|
3164
|
+
for (const name of ["design-tree.json"]) {
|
|
3376
3165
|
if (!isFile(join(change, name))) errors.push(`grill stage requires ${name}`);
|
|
3377
3166
|
}
|
|
3378
3167
|
}
|
|
@@ -3386,7 +3175,7 @@ function validateChange(change, stage = null, repoRoot = null, engineeringKind =
|
|
|
3386
3175
|
}
|
|
3387
3176
|
|
|
3388
3177
|
const ticketDir = join(change, "ticket");
|
|
3389
|
-
const ticketsRequired = !isParentImplementation && (new Set(["tickets", "goal-plan"]).has(stage) || (stage === "implement" && ticketMode));
|
|
3178
|
+
const ticketsRequired = !simpleGoal && !isParentImplementation && (new Set(["tickets", "goal-plan"]).has(stage) || (stage === "implement" && ticketMode));
|
|
3390
3179
|
const ticketFiles = isDirectory(ticketDir)
|
|
3391
3180
|
? readdirSync(ticketDir)
|
|
3392
3181
|
.filter((name) => name.endsWith(".md"))
|
|
@@ -3395,7 +3184,7 @@ function validateChange(change, stage = null, repoRoot = null, engineeringKind =
|
|
|
3395
3184
|
: [];
|
|
3396
3185
|
if (ticketsRequired && !isDirectory(ticketDir)) errors.push("missing Ticket directory");
|
|
3397
3186
|
if (ticketsRequired && !ticketFiles.length) errors.push("Ticket directory contains no Markdown tickets");
|
|
3398
|
-
if (stage === "implement" && !ticketMode && !isFile(join(change, "evidence", "direct-spec.md"))) {
|
|
3187
|
+
if (stage === "implement" && !ticketMode && !lightweight && !isFile(join(change, "evidence", "direct-spec.md"))) {
|
|
3399
3188
|
errors.push("Direct Spec implement stage requires evidence/direct-spec.md");
|
|
3400
3189
|
}
|
|
3401
3190
|
|
|
@@ -3455,7 +3244,7 @@ function validateChange(change, stage = null, repoRoot = null, engineeringKind =
|
|
|
3455
3244
|
}
|
|
3456
3245
|
}
|
|
3457
3246
|
if (changeStatus && goalPlan) {
|
|
3458
|
-
validateGoalPlanRuntimeLimits(goalPlan.path, change, goalPlan, errors, repoRoot);
|
|
3247
|
+
validateGoalPlanRuntimeLimits(goalPlan.path, change, goalPlan, errors, repoRoot, options);
|
|
3459
3248
|
const attemptLimit = Number.isInteger(goalPlan.meta.integration_attempt_limit) ? goalPlan.meta.integration_attempt_limit : null;
|
|
3460
3249
|
if (attemptLimit !== null) {
|
|
3461
3250
|
for (const worktree of changeStatus.worktrees ?? []) {
|
|
@@ -3464,11 +3253,20 @@ function validateChange(change, stage = null, repoRoot = null, engineeringKind =
|
|
|
3464
3253
|
}
|
|
3465
3254
|
}
|
|
3466
3255
|
}
|
|
3467
|
-
validateCurrentWorkspaceExecution(changeStatus, goalPlan, errors);
|
|
3468
3256
|
}
|
|
3469
|
-
|
|
3257
|
+
validateCurrentWorkspaceExecution(changeStatus, goalPlan, errors);
|
|
3258
|
+
const directExecution = changeStatus?.worktrees?.find(entry => entry.purpose === "direct-spec");
|
|
3259
|
+
if (directExecution && workspace.config) errors.push(...validateExecutionPolicy({meta:{concurrent_implementation_limit:1,integration_attempt_limit:directExecution.integration_attempt_limit}},workspace.config).map(error => `Direct Spec: ${error}`));
|
|
3260
|
+
if (directExecution && (ticketMode || isParentImplementation)) errors.push("Direct Spec execution cannot coexist with Ticket or parent implementation artifacts");
|
|
3261
|
+
if (directExecution && (stage === "complete" || changeStatus.outcome === "completed") && !new Set(["integrated", "removed"]).has(directExecution.status)) errors.push("Direct Spec completion requires integrated or removed execution; active or failed candidates cannot complete");
|
|
3262
|
+
validateGitEvidence(stage === "complete" ? workspace.context.projectRoot : repoRoot, changeStatus, errors);
|
|
3470
3263
|
|
|
3471
|
-
if (spec)
|
|
3264
|
+
if (stage === "implement" && spec && !ticketMode && (spec.meta.ready_for_tickets !== true || spec.meta.status !== "ready")) errors.push("Direct Spec implementation requires a ready Spec with ready_for_tickets=true");
|
|
3265
|
+
if (spec?.meta.ready_for_tickets === true && !/\bAC-\d+\b/.test(spec.body)) errors.push("ready Spec must define at least one AC-### acceptance contract");
|
|
3266
|
+
|
|
3267
|
+
if (stage === "complete" && spec && !ticketMode && !isParentImplementation && !retroOnly) errors.push(...validateAcceptanceEvidence(change,"evidence/direct-spec.md",[...new Set(spec.body.match(/\bAC-\d+\b/g) ?? [])]));
|
|
3268
|
+
|
|
3269
|
+
if (spec && ticketMode) {
|
|
3472
3270
|
const declaredContracts = new Set(spec.body.match(/\bAC-\d+\b/g) ?? []);
|
|
3473
3271
|
const coveredContracts = new Set(
|
|
3474
3272
|
[...tickets.values()].flatMap((artifact) =>
|
|
@@ -3553,7 +3351,7 @@ function validateChange(change, stage = null, repoRoot = null, engineeringKind =
|
|
|
3553
3351
|
continue;
|
|
3554
3352
|
}
|
|
3555
3353
|
const text = readText(evidence);
|
|
3556
|
-
const currentWorkspace =
|
|
3354
|
+
const currentWorkspace = changeStatus?.worktrees?.find(entry => entry.ticket_id === ticketId)?.workspace_ref === "current";
|
|
3557
3355
|
const requiredHeadings = [
|
|
3558
3356
|
"## 2. Lead Dispatch And Candidate Return",
|
|
3559
3357
|
"## 3. 修改范围与路径所有权",
|
|
@@ -3598,44 +3396,44 @@ function validateChange(change, stage = null, repoRoot = null, engineeringKind =
|
|
|
3598
3396
|
|
|
3599
3397
|
if (changeStatus) {
|
|
3600
3398
|
if (
|
|
3601
|
-
changeStatus.
|
|
3399
|
+
changeStatus.outcome === "completed" &&
|
|
3602
3400
|
[...tickets.values()].some(
|
|
3603
3401
|
(artifact) => !new Set(["done", "cancelled"]).has(artifact.meta.status),
|
|
3604
3402
|
)
|
|
3605
3403
|
) {
|
|
3606
|
-
errors.push("
|
|
3404
|
+
errors.push("Outcome is completed while planned Tickets remain unfinished");
|
|
3607
3405
|
}
|
|
3608
|
-
if (changeStatus.
|
|
3406
|
+
if (changeStatus.location.kind === "archive") {
|
|
3609
3407
|
warnings.push("validating an archived change in place; normally it lives under the archive root");
|
|
3610
3408
|
}
|
|
3611
|
-
if (stage === "complete" && changeStatus.
|
|
3612
|
-
errors.push("complete stage requires
|
|
3409
|
+
if (stage === "complete" && changeStatus.outcome !== "completed") {
|
|
3410
|
+
errors.push("complete stage requires Outcome: completed");
|
|
3613
3411
|
}
|
|
3614
3412
|
}
|
|
3615
3413
|
if (
|
|
3616
3414
|
stage === "complete" &&
|
|
3617
|
-
!ticketFiles.length && !retroOnly &&
|
|
3415
|
+
!ticketFiles.length && !retroOnly && !lightweight &&
|
|
3618
3416
|
!isFile(join(change, "implementation-map.md")) &&
|
|
3619
3417
|
!isFile(join(change, "evidence", "direct-spec.md"))
|
|
3620
3418
|
) {
|
|
3621
3419
|
errors.push("complete stage without Tickets requires evidence/direct-spec.md");
|
|
3622
3420
|
}
|
|
3623
3421
|
if (
|
|
3624
|
-
|
|
3422
|
+
archiveReady &&
|
|
3625
3423
|
triage &&
|
|
3626
3424
|
new Set(["pending-close", "close-failed"]).has(triage.meta.external_action)
|
|
3627
3425
|
) {
|
|
3628
3426
|
errors.push(`complete stage cannot archive external_action=${triage.meta.external_action}`);
|
|
3629
3427
|
}
|
|
3630
3428
|
if (
|
|
3631
|
-
|
|
3429
|
+
archiveReady &&
|
|
3632
3430
|
triage &&
|
|
3633
3431
|
new Set(["pending", "publish-failed"]).has(triage.meta.publish_action)
|
|
3634
3432
|
) {
|
|
3635
3433
|
errors.push(`complete stage cannot archive publish_action=${triage.meta.publish_action}`);
|
|
3636
3434
|
}
|
|
3637
3435
|
|
|
3638
|
-
for (const path of walk(change).filter((item) =>
|
|
3436
|
+
for (const path of walk(change).filter((item) => lstatSync(item).isFile() && extname(item) === ".md")) {
|
|
3639
3437
|
const text = readText(path);
|
|
3640
3438
|
if ((text.match(/<Path>/g) ?? []).length !== (text.match(/<\/Path>/g) ?? []).length) {
|
|
3641
3439
|
errors.push(`${toPosix(relative(change, path))}: unbalanced <Path> tags`);
|
|
@@ -3651,7 +3449,18 @@ function validateChange(change, stage = null, repoRoot = null, engineeringKind =
|
|
|
3651
3449
|
}
|
|
3652
3450
|
|
|
3653
3451
|
errors.push(...validateEngineeringArtifacts(change, engineeringKind));
|
|
3654
|
-
|
|
3452
|
+
if (simpleGoal && changeStatus?.outcome === "completed" && /^[-*] \[ \]/m.test(simpleGoal.body)) errors.push("completed Goal still has unfinished tasks");
|
|
3453
|
+
return { errors, warnings, ...(options.readOnlySnapshot ? {snapshot:true,preflight:true} : {}) };
|
|
3454
|
+
}
|
|
3455
|
+
|
|
3456
|
+
function contextArguments(context) {
|
|
3457
|
+
if (!context) return [];
|
|
3458
|
+
const source = context.readOnlySnapshot?.sourceContext ?? context;
|
|
3459
|
+
return ['--repo',source.projectRoot,'--method-root',source.methodRoot,'--state-root',source.specdevRoot,...(context.readOnlySnapshot ? ['--snapshot-specdev',context.specdevRoot] : [])];
|
|
3460
|
+
}
|
|
3461
|
+
function runDesignCheck(operation, path, errors, context = null, flags = []) {
|
|
3462
|
+
try { return execFileSync(process.execPath, [fileURLToPath(new URL("./design-artifacts.mjs", import.meta.url)), operation, path, ...contextArguments(context),...flags], { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] }); }
|
|
3463
|
+
catch (error) { errors.push(String(error.stderr || error.stdout || error.message).trim()); }
|
|
3655
3464
|
}
|
|
3656
3465
|
|
|
3657
3466
|
function printResults(errors, warnings) {
|
|
@@ -3662,22 +3471,30 @@ function printResults(errors, warnings) {
|
|
|
3662
3471
|
}
|
|
3663
3472
|
|
|
3664
3473
|
function usage() {
|
|
3665
|
-
console.error("Usage: node validate-specdev.mjs [--stage <stage>] [--repo <project-root>] [--engineering <performance|documentation|incident>] <change-directory> | --review-scope --repo <project-root> --mode <baseline|range|commit|pr> [comparison options] | --self-check | --capture <capture.md> | --triage-run <TRI-NNN.md>");
|
|
3474
|
+
console.error("Usage: node validate-specdev.mjs [--stage <stage>] [--sealed (archived only)] [--prototype-id UI-NNN|LOGIC-NNN] [--repo <project-root>] [--engineering <performance|documentation|incident>] <change-directory> | --review-scope --repo <project-root> --mode <baseline|range|commit|pr|source-files> [comparison options or repeated --file <relative-path>] | --self-check | --capture <capture.md> | --triage-run <TRI-NNN.md>");
|
|
3666
3475
|
return 2;
|
|
3667
3476
|
}
|
|
3668
3477
|
|
|
3669
3478
|
function main(argv) {
|
|
3670
3479
|
if (argv[0] === "--review-scope") return reviewScopeCLI(argv.slice(1));
|
|
3671
3480
|
let engineeringKind = null;
|
|
3481
|
+
let prototypeId = null;
|
|
3672
3482
|
let selfCheckRequested = false;
|
|
3673
3483
|
let stage = null;
|
|
3674
3484
|
let repoRoot = null;
|
|
3485
|
+
const contextOptions = {};
|
|
3675
3486
|
let capturePath = null;
|
|
3676
3487
|
let triageRunPath = null;
|
|
3677
3488
|
const positional = [];
|
|
3678
3489
|
for (let index = 0; index < argv.length; index += 1) {
|
|
3679
3490
|
const arg = argv[index];
|
|
3680
|
-
if (arg === "--
|
|
3491
|
+
if (arg === "--prototype-id") {
|
|
3492
|
+
if (prototypeId !== null || !/^(?:UI|LOGIC)-\d{3,}$/.test(argv[index + 1] ?? "")) return usage();
|
|
3493
|
+
prototypeId = argv[++index];
|
|
3494
|
+
} else if (arg === "--sealed") {
|
|
3495
|
+
if(contextOptions.sealed) return usage();
|
|
3496
|
+
contextOptions.sealed=true;
|
|
3497
|
+
} else if (arg === "--engineering") {
|
|
3681
3498
|
if (engineeringKind !== null || !ENGINEERING_KINDS.has(argv[index + 1])) return usage();
|
|
3682
3499
|
engineeringKind = argv[++index];
|
|
3683
3500
|
} else if (arg === "--self-check") {
|
|
@@ -3687,6 +3504,8 @@ function main(argv) {
|
|
|
3687
3504
|
index += 1;
|
|
3688
3505
|
} else if (arg.startsWith("--stage=")) {
|
|
3689
3506
|
stage = arg.slice("--stage=".length);
|
|
3507
|
+
} else if (arg === "--method-root" || arg === "--state-root") {
|
|
3508
|
+
contextOptions[arg === "--method-root" ? "methodRoot" : "stateRoot"] = argv[++index];
|
|
3690
3509
|
} else if (arg === "--repo") {
|
|
3691
3510
|
repoRoot = argv[index + 1] ?? null;
|
|
3692
3511
|
index += 1;
|
|
@@ -3706,6 +3525,8 @@ function main(argv) {
|
|
|
3706
3525
|
}
|
|
3707
3526
|
}
|
|
3708
3527
|
if (stage !== null && !VALID_STAGES.has(stage)) return usage();
|
|
3528
|
+
if(contextOptions.sealed && stage !== 'archived') return usage();
|
|
3529
|
+
if (prototypeId && stage !== "prototype") return usage();
|
|
3709
3530
|
if (engineeringKind !== null && (selfCheckRequested || capturePath || triageRunPath || positional.length !== 1)) return usage();
|
|
3710
3531
|
if (triageRunPath) {
|
|
3711
3532
|
if (selfCheckRequested || positional.length || stage !== null || capturePath || repoRoot) return usage();
|
|
@@ -3725,7 +3546,7 @@ function main(argv) {
|
|
|
3725
3546
|
return printResults(errors, []);
|
|
3726
3547
|
}
|
|
3727
3548
|
if (positional.length === 1) {
|
|
3728
|
-
const result = validateChange(resolve(positional[0]), stage, repoRoot, engineeringKind);
|
|
3549
|
+
const result = validateChange(resolve(positional[0]), stage, repoRoot, engineeringKind, prototypeId, contextOptions);
|
|
3729
3550
|
return printResults(result.errors, result.warnings);
|
|
3730
3551
|
}
|
|
3731
3552
|
return usage();
|