@khoavu882/doflow 2.0.0-beta.5 → 2.0.1
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 +16 -16
- package/bin/doflow.js +22 -12
- package/core/.antigravity-plugin/plugin.json +1 -2
- package/core/.claude-plugin/plugin.json +1 -1
- package/core/.codex-plugin/plugin.json +1 -1
- package/core/.plugin/plugin.json +1 -1
- package/core/harnesses/claude/hooks/lib.sh +43 -24
- package/core/harnesses/claude/hooks/mcp-tool-guard.sh +4 -1
- package/core/harnesses/claude/hooks/permission-audit.sh +3 -0
- package/core/harnesses/claude/hooks/post-compact.sh +35 -32
- package/core/harnesses/claude/hooks/post-edit-lint.sh +2 -0
- package/core/harnesses/claude/hooks/post-shell-observe.sh +48 -0
- package/core/harnesses/claude/hooks/post-tool-failure.sh +3 -0
- package/core/harnesses/claude/hooks/pre-compact.sh +23 -27
- package/core/harnesses/claude/hooks/pre-implement-gate.sh +4 -1
- package/core/harnesses/claude/hooks/session-end.sh +23 -10
- package/core/harnesses/claude/hooks/skill-config-audit.sh +3 -0
- package/core/harnesses/claude/settings/settings.json +26 -9
- package/core/harnesses/claude/statusline/doflow-statusline.sh +1 -0
- package/core/harnesses/codex/agents/core-implementer.toml +1 -0
- package/core/harnesses/codex/agents/delivery-lead.toml +10 -0
- package/core/harnesses/codex/agents/quality-guardian.toml +1 -1
- package/core/harnesses/codex/agents/research-writer.toml +1 -1
- package/core/harnesses/codex/agents/reviewer.toml +10 -0
- package/core/harnesses/codex/agents/spec-analyst.toml +1 -1
- package/core/harnesses/codex/agents/system-architect.toml +1 -1
- package/core/harnesses/codex/hooks/hooks.json +0 -10
- package/core/harnesses/codex/hooks/lib.sh +44 -25
- package/core/harnesses/codex/hooks/mcp-tool-guard.sh +4 -1
- package/core/harnesses/codex/hooks/post-edit-lint.impl.sh +3 -1
- package/core/harnesses/codex/hooks/pre-compact.impl.sh +29 -26
- package/core/harnesses/codex/hooks/pre-implement-gate.sh +4 -1
- package/core/harnesses/codex/hooks/session-end.impl.sh +23 -10
- package/core/harnesses/codex/hooks/subagent-audit.sh +1 -0
- package/core/harnesses/copilot/hooks/doflow-lib.sh +94 -0
- package/core/harnesses/copilot/hooks/doflow-mcp-tool-guard.sh +9 -0
- package/core/harnesses/copilot/hooks/doflow-pre-implement-gate.sh +9 -0
- package/core/harnesses/copilot/hooks/doflow-session-start.sh +9 -0
- package/core/harnesses/copilot/hooks/doflow-stop-check.sh +9 -0
- package/core/harnesses/copilot/hooks/doflow-subagent-start.sh +9 -0
- package/core/harnesses/copilot/hooks/doflow-subagent-stop.sh +9 -0
- package/core/harnesses/copilot/hooks/doflow.json +51 -0
- package/core/harnesses/kiro/agents/doflow.json +1 -11
- package/core/harnesses/kiro/hooks/doflow.json +0 -10
- package/core/harnesses/kiro/hooks/lib.sh +26 -6
- package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +8 -3
- package/core/harnesses/kiro/hooks/pre-implement-gate.sh +8 -3
- package/core/harnesses/kiro/hooks/session-start.sh +1 -0
- package/core/harnesses/kiro/hooks/stop-check.sh +1 -0
- package/core/harnesses/pi/extensions/doflow-guard.js +11 -2
- package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +1 -2
- package/core/harnesses/shared/hooks/adapters/antigravity.js +1 -1
- package/core/harnesses/shared/hooks/bridge/bridge.sh +126 -23
- package/core/harnesses/shared/hooks/bridge/envelope.jq +87 -18
- package/core/harnesses/shared/hooks/bridge/observe-model.sh +75 -0
- package/core/harnesses/shared/hooks/bridge/respond.sh +16 -2
- package/core/harnesses/shared/hooks/policies/capture-failure.sh +49 -16
- package/core/harnesses/shared/hooks/policies/compact-text.sh +46 -0
- package/core/harnesses/shared/hooks/policies/contract.sh +3 -0
- package/core/harnesses/shared/hooks/policies/deny-json.sh +20 -7
- package/core/harnesses/shared/hooks/policies/emission-rules.sh +37 -0
- package/core/harnesses/shared/hooks/policies/emission.jq +209 -0
- package/core/harnesses/shared/hooks/policies/emission.sh +383 -0
- package/core/harnesses/shared/hooks/policies/identity.sh +177 -0
- package/core/harnesses/shared/hooks/policies/lib.sh +63 -40
- package/core/harnesses/shared/hooks/policies/mcp-policy.conf +1 -1
- package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +7 -8
- package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +132 -57
- package/core/harnesses/shared/hooks/policies/session-context.sh +30 -1
- package/core/harnesses/shared/hooks/policies/stop-check.sh +27 -15
- package/core/harnesses/shared/hooks/policies/subagent-audit.sh +6 -3
- package/core/harnesses/shared/hooks/policies/summary-store.sh +347 -0
- package/core/harnesses/shared/hooks/policies/user-prompt-submit.sh +60 -155
- package/core/harnesses/shared/hooks/stream-hook-runner.js +58 -20
- package/core/harnesses/shared/locator/doflow-run +2 -3
- package/core/registry/advice.json +3 -3
- package/core/registry/assets.json +55 -82
- package/core/registry/capabilities.json +12 -0
- package/core/registry/contracts.json +58 -31
- package/core/registry/contribution-points.json +35 -0
- package/core/registry/gates.json +32 -0
- package/core/registry/guidance-caps.json +40 -0
- package/core/registry/harnesses.json +1445 -366
- package/core/registry/intake.json +53 -0
- package/core/registry/lifecycle.json +599 -996
- package/core/registry/mcp.json +5 -1
- package/core/registry/models.json +7 -1
- package/core/registry/package-templates/README.md +19 -0
- package/core/registry/package-templates/agent/files/agent.md +9 -0
- package/core/registry/package-templates/agent/template.json +4 -0
- package/core/registry/package-templates/capability-provider/files/provider.json +9 -0
- package/core/registry/package-templates/capability-provider/template.json +11 -0
- package/core/registry/package-templates/debate-preset/files/preset.json +26 -0
- package/core/registry/package-templates/debate-preset/template.json +4 -0
- package/core/registry/package-templates/intake-category/files/category.json +8 -0
- package/core/registry/package-templates/intake-category/template.json +4 -0
- package/core/registry/package-templates/review-preset/files/preset.json +30 -0
- package/core/registry/package-templates/review-preset/template.json +4 -0
- package/core/registry/package-templates/skill/files/SKILL.md +8 -0
- package/core/registry/package-templates/skill/template.json +4 -0
- package/core/registry/package-templates/worker/files/worker.json +92 -0
- package/core/registry/package-templates/worker/template.json +11 -0
- package/core/registry/packages/doflow/doflow-package.json +15 -0
- package/core/registry/packages/doflow/presets/debate-3.json +26 -0
- package/core/registry/protocols.json +61 -0
- package/core/registry/routes.json +17 -0
- package/core/registry/rules.json +431 -0
- package/core/registry/settings.json +272 -0
- package/core/registry/storage.json +687 -31
- package/core/registry/telemetry.json +236 -0
- package/core/registry/transcripts.json +142 -0
- package/core/registry/verification.json +76 -6
- package/core/registry/workflows.json +55 -0
- package/core/shared/agent-specs/core-implementer.md +3 -0
- package/core/shared/agent-specs/delivery-lead.md +68 -0
- package/core/shared/agent-specs/quality-guardian.md +5 -1
- package/core/shared/agent-specs/research-writer.md +10 -3
- package/core/shared/agent-specs/reviewer.md +53 -0
- package/core/shared/agent-specs/spec-analyst.md +5 -6
- package/core/shared/agent-specs/system-architect.md +5 -1
- package/core/shared/guidance/DOFLOW_CORE.md +1 -5
- package/core/shared/guidance/modes/MODE_DeepResearch.md +1 -1
- package/core/shared/guidance/modes/MODE_Orchestration.md +4 -3
- package/core/shared/guidance/modes/MODE_Task_Management.md +14 -14
- package/core/shared/guidance/pointers/codex.md +1 -4
- package/core/shared/guidance/references/ARTIFACT_FORMAT.md +30 -16
- package/core/shared/guidance/references/ARTIFACT_VOICE.md +3 -2
- package/core/shared/guidance/references/CONSTITUTION_BASE.md +17 -15
- package/core/shared/guidance/references/DIAGRAM_GUIDE.md +1 -1
- package/core/shared/guidance/references/DOFLOW_CHAIN.md +17 -19
- package/core/shared/guidance/references/EVIDENCE_LEDGER.md +7 -8
- package/core/shared/guidance/references/MODEL_SELECTION.md +5 -3
- package/core/shared/guidance/references/ORCHESTRATION.md +3 -2
- package/core/shared/guidance/references/WORKFLOW_HANDOFF.md +19 -1
- package/core/shared/guidance/rules/RULES.md +45 -0
- package/core/shared/scripts/doflow/bash/do-args.sh +37 -0
- package/core/shared/scripts/doflow/bash/do-exec-paths.sh +4 -0
- package/core/shared/scripts/doflow/bash/do-git-state.sh +15 -4
- package/core/shared/scripts/doflow/bash/do-parallel-check.sh +4 -0
- package/core/shared/scripts/doflow/bash/do-paths.sh +40 -2
- package/core/shared/scripts/doflow/bash/do-prereqs.sh +2 -1
- package/core/shared/scripts/doflow/bash/do-review-package.sh +4 -0
- package/core/shared/scripts/doflow/bash/do-task-brief.sh +58 -16
- package/core/shared/scripts/doflow/bash/render-audit.sh +26 -2
- package/core/shared/scripts/doflow/bash/render-diagrams.sh +1 -0
- package/core/shared/scripts/doflow/bash/render-puml.sh +2 -1
- package/core/shared/scripts/doflow/bash/validate-artifacts.sh +49 -5
- package/core/shared/scripts/doflow/bin/doflow-run +152 -34
- package/core/shared/skills/do/SKILL.md +14 -12
- package/core/shared/skills/do/references/advice_calls.md +26 -0
- package/core/shared/skills/do/references/pm_routing.md +1 -2
- package/core/shared/skills/do/references/program_mode.md +31 -0
- package/core/shared/skills/do-brainstorm/SKILL.md +45 -97
- package/core/shared/skills/do-brainstorm/references/handoff_branches.md +36 -0
- package/core/shared/skills/do-brainstorm/references/intent_seed.md +21 -0
- package/core/shared/skills/do-brainstorm/references/round_log.md +17 -0
- package/core/shared/skills/do-code-review/SKILL.md +48 -148
- package/core/shared/skills/do-code-review/content-types/markdown.md +24 -2
- package/core/shared/skills/do-code-review/references/tools.md +90 -0
- package/core/shared/skills/do-code-review/scripts/doc_quality_checker.py +549 -7
- package/core/shared/skills/do-design/SKILL.md +23 -20
- package/core/shared/skills/do-diagnose/SKILL.md +18 -6
- package/core/shared/skills/do-document/SKILL.md +12 -1
- package/core/shared/skills/do-document/references/deep_research.md +1 -2
- package/core/shared/skills/do-document/references/embedded-research.md +19 -7
- package/core/shared/skills/do-document/references/implementation-flow.md +5 -6
- package/core/shared/skills/do-execute-plan/SKILL.md +19 -60
- package/core/shared/skills/do-execute-plan/references/handoff_record.md +7 -2
- package/core/shared/skills/do-execute-plan/references/parallel_dispatch.md +13 -0
- package/core/shared/skills/do-execute-plan/references/readiness_gate.md +26 -1
- package/core/shared/skills/do-execute-plan/references/run_position.md +16 -2
- package/core/shared/skills/do-execute-plan/references/scaffold.md +17 -9
- package/core/shared/skills/do-execute-plan/references/state_checkpoint.md +11 -0
- package/core/shared/skills/do-execute-plan/references/task_attempts.md +78 -24
- package/core/shared/skills/do-flow/SKILL.md +10 -11
- package/core/shared/skills/do-flow/references/task_classes.md +5 -5
- package/core/shared/skills/do-git/SKILL.md +4 -0
- package/core/shared/skills/do-implement/SKILL.md +13 -14
- package/core/shared/skills/do-plan/SKILL.md +34 -20
- package/core/shared/skills/do-test/SKILL.md +7 -4
- package/core/shared/templates/doflow/constitution-template.md +9 -3
- package/core/shared/templates/doflow/data-model-template.md +1 -1
- package/core/shared/templates/doflow/design-template.md +113 -16
- package/core/shared/templates/doflow/plan-template.md +11 -10
- package/core/shared/templates/doflow/question-log-template.md +14 -2
- package/core/shared/templates/doflow/requirement-template.md +1 -1
- package/core/shared/workflows/do-flow-chain.md +2 -0
- package/core/worker-evidence/antigravity/checks.json +14 -0
- package/core/worker-evidence/codex/2026-10-18-cli-check.json +107 -0
- package/core/worker-evidence/codex/2026-10-18-live-run-edit.json +73 -0
- package/core/worker-evidence/codex/2026-10-18-live-run-read-only.json +62 -0
- package/core/worker-evidence/codex/2026-10-24-cli-check.json +126 -0
- package/core/worker-evidence/codex/checks.json +38 -0
- package/package.json +10 -6
- package/src/adapters/antigravity/index.js +143 -66
- package/src/adapters/claude/index.js +46 -5
- package/src/adapters/codex/agents.js +25 -15
- package/src/adapters/codex/hooks.js +39 -3
- package/src/adapters/codex/index.js +61 -13
- package/src/adapters/codex/native-projection.js +6 -2
- package/src/adapters/copilot/index.js +58 -23
- package/src/adapters/copy-tree.js +291 -46
- package/src/adapters/guidance-manifest.js +71 -0
- package/src/adapters/guidance-pointer.js +19 -0
- package/src/adapters/hook-commands.js +6 -10
- package/src/adapters/index.js +1 -0
- package/src/adapters/kiro/index.js +23 -12
- package/src/adapters/opencode/index.js +8 -8
- package/src/adapters/pi/hooks.js +2 -1
- package/src/adapters/pi/index.js +14 -7
- package/src/adapters/resolve-source.js +26 -2
- package/src/cli/commands/install.js +2 -1
- package/src/cli/commands/reconcile.js +53 -9
- package/src/cli/commands/remove.js +2 -2
- package/src/cli/commands/rollback.js +6 -3
- package/src/cli/commands/self-update.js +18 -9
- package/src/cli/commands/status.js +22 -3
- package/src/cli/commands/ui.js +99 -0
- package/src/cli/commands/update.js +2 -1
- package/src/cli/index.js +337 -32
- package/src/cli/runtime-commands.js +220 -60
- package/src/cli/shared.js +0 -2
- package/src/helper/git.js +1 -1
- package/src/helper/guardrails.js +1 -1
- package/src/helper/marker-merge.js +31 -13
- package/src/helper/package-ids.js +37 -0
- package/src/helper/semver.js +94 -0
- package/src/install/backup.js +105 -15
- package/src/install/context.js +1 -1
- package/src/install/targets.js +31 -16
- package/src/lifecycle/coverage.js +4 -16
- package/src/lifecycle/hook-tier.js +160 -0
- package/src/lifecycle/index.js +412 -78
- package/src/lifecycle/retired-harnesses.js +318 -0
- package/src/lifecycle/view.js +35 -15
- package/src/registry/index.js +551 -26
- package/src/registry/worker-ids.js +45 -0
- package/src/release/build-package.js +0 -3
- package/src/release/docs-blocks.js +472 -0
- package/src/release/preflight.js +425 -0
- package/src/release/rehearse.js +401 -0
- package/src/release/release-workflow.js +733 -0
- package/src/release/sync-plugin-versions.js +43 -7
- package/src/runtime/advice/bench-gate.js +25 -0
- package/src/runtime/advice/cli.js +59 -16
- package/src/runtime/advice/client.js +32 -9
- package/src/runtime/advice/config.js +98 -133
- package/src/runtime/advice/doctor.js +1 -1
- package/src/runtime/advice/elevation.js +97 -0
- package/src/runtime/advice/endpoint-guard.js +9 -3
- package/src/runtime/advice/mode.js +37 -0
- package/src/runtime/advice/record.js +18 -5
- package/src/runtime/advice/registry.js +4 -1
- package/src/runtime/advice/shadow-config.js +229 -0
- package/src/runtime/advice/shadow-dispatcher.js +276 -0
- package/src/runtime/brief-rules.js +81 -0
- package/src/runtime/brief-tools.js +111 -34
- package/src/runtime/candidate.js +20 -11
- package/src/runtime/capabilities/executor.js +450 -0
- package/src/runtime/capabilities/loopback.js +41 -0
- package/src/runtime/capabilities/sanitizer.js +88 -0
- package/src/runtime/capability-router.js +135 -3
- package/src/runtime/checkouts.js +73 -11
- package/src/runtime/claims.js +13 -7
- package/src/runtime/cli.js +196 -19
- package/src/runtime/config-home.js +42 -0
- package/src/runtime/context/arbitrate.js +767 -0
- package/src/runtime/context/delivery-store.js +4 -6
- package/src/runtime/context/emission-rules.js +118 -0
- package/src/runtime/context/identity.js +227 -0
- package/src/runtime/context/pointer.js +67 -12
- package/src/runtime/context/primary-command.js +117 -0
- package/src/runtime/context/primary.js +344 -0
- package/src/runtime/context/summary-store.js +655 -0
- package/src/runtime/context-pack.js +158 -79
- package/src/runtime/decision-register.js +13 -4
- package/src/runtime/dispatch/admission.js +392 -0
- package/src/runtime/dispatch/attempt-end.js +274 -0
- package/src/runtime/dispatch/command.js +628 -0
- package/src/runtime/dispatch/controls.js +904 -0
- package/src/runtime/dispatch/envelope.js +276 -0
- package/src/runtime/dispatch/grants.js +310 -0
- package/src/runtime/dispatch/integrate.js +617 -0
- package/src/runtime/dispatch/loop.js +1835 -0
- package/src/runtime/dispatch/store.js +352 -0
- package/src/runtime/dispatch/verify-run.js +201 -0
- package/src/runtime/evidence-ledger.js +52 -7
- package/src/runtime/failure/capture.js +3 -1
- package/src/runtime/failure/cli.js +25 -9
- package/src/runtime/failure/home.js +57 -30
- package/src/runtime/failure/store.js +7 -2
- package/src/runtime/feature-pointer.js +174 -0
- package/src/runtime/feature-resolve.js +13 -2
- package/src/runtime/fleet/command.js +77 -0
- package/src/runtime/fleet/projects.js +178 -0
- package/src/runtime/fleet/tree.js +383 -0
- package/src/runtime/freshness.js +33 -3
- package/src/runtime/git-memo.js +46 -0
- package/src/runtime/guidance/ablation.js +427 -0
- package/src/runtime/health.js +624 -18
- package/src/runtime/history-compactor.js +13 -3
- package/src/runtime/implementation-gate.js +281 -26
- package/src/runtime/intake/engine.js +677 -0
- package/src/runtime/intake/index.js +136 -0
- package/src/runtime/intake/manifest.js +140 -0
- package/src/runtime/intake/taxonomy.js +206 -0
- package/src/runtime/inventory/coverage.js +1 -1
- package/src/runtime/inventory/index.js +1 -1
- package/src/runtime/inventory/precedence.js +2 -2
- package/src/runtime/inventory/siblings.js +6 -4
- package/src/runtime/knowledge/code-corpus.js +277 -0
- package/src/runtime/knowledge/code-lexical.js +130 -0
- package/src/runtime/knowledge/code-retrieval.js +307 -0
- package/src/runtime/knowledge/code-validation.js +106 -0
- package/src/runtime/knowledge/gp3-gate.js +74 -0
- package/src/runtime/knowledge/graph-adapter.js +288 -0
- package/src/runtime/knowledge/graph-fallback.js +394 -0
- package/src/runtime/knowledge/hybrid.js +136 -8
- package/src/runtime/knowledge/retrieval.js +34 -1
- package/src/runtime/knowledge/rtk-compress.js +77 -0
- package/src/runtime/knowledge/semble-bridge.py +106 -0
- package/src/runtime/knowledge/semble-lifecycle.js +114 -0
- package/src/runtime/knowledge/semble-provider.js +365 -0
- package/src/runtime/lifecycle/cli.js +88 -10
- package/src/runtime/lifecycle/event-store.js +8 -6
- package/src/runtime/lifecycle/followup.js +38 -7
- package/src/runtime/lifecycle/overview.js +26 -2
- package/src/runtime/lifecycle/report-store.js +8 -10
- package/src/runtime/lifecycle/retention.js +95 -31
- package/src/runtime/lifecycle/root.js +9 -1
- package/src/runtime/lifecycle/status.js +34 -17
- package/src/runtime/lifecycle/store-upkeep.js +56 -7
- package/src/runtime/mask.js +134 -7
- package/src/runtime/mcp-consultations.js +40 -6
- package/src/runtime/model-router.js +79 -7
- package/src/runtime/models/catalogue.js +191 -0
- package/src/runtime/models/command.js +153 -0
- package/src/runtime/off-words.js +12 -0
- package/src/runtime/outcome.js +2 -2
- package/src/runtime/packages/command.js +1009 -0
- package/src/runtime/packages/contributions.js +116 -0
- package/src/runtime/packages/digest.js +132 -0
- package/src/runtime/packages/fetch.js +182 -0
- package/src/runtime/packages/grants.js +192 -0
- package/src/runtime/packages/index-file.js +134 -0
- package/src/runtime/packages/instruction.js +90 -0
- package/src/runtime/packages/manifest.js +331 -0
- package/src/runtime/packages/points.js +487 -0
- package/src/runtime/packages/programs.js +216 -0
- package/src/runtime/packages/scaffold.js +277 -0
- package/src/runtime/packages/source.js +90 -0
- package/src/runtime/packages/state.js +164 -0
- package/src/runtime/packages/store.js +449 -0
- package/src/runtime/packages/tar.js +106 -0
- package/src/runtime/packages/view.js +406 -0
- package/src/runtime/plan-check.js +59 -0
- package/src/runtime/plan-content.js +324 -0
- package/src/runtime/policy-init.js +118 -0
- package/src/runtime/profiles/doctor.js +96 -0
- package/src/runtime/profiles/resolve.js +244 -0
- package/src/runtime/profiles/rollback.js +254 -0
- package/src/runtime/profiles/sampler.js +41 -0
- package/src/runtime/readiness-record.js +16 -11
- package/src/runtime/readiness.js +46 -5
- package/src/runtime/research-request.js +50 -25
- package/src/runtime/retrieval-plan.js +10 -30
- package/src/runtime/retrieval-record.js +75 -5
- package/src/runtime/review/command.js +246 -0
- package/src/runtime/review/dominance.js +68 -0
- package/src/runtime/review/findings.js +434 -0
- package/src/runtime/review/identity.js +255 -0
- package/src/runtime/review/protocol-command.js +109 -0
- package/src/runtime/review/protocols.js +405 -0
- package/src/runtime/review/resolve-protocol.js +302 -0
- package/src/runtime/review/start.js +530 -0
- package/src/runtime/roadmap/attendance.js +137 -0
- package/src/runtime/roadmap/facts.js +479 -0
- package/src/runtime/roadmap/gates.js +273 -0
- package/src/runtime/roadmap/loop.js +1719 -0
- package/src/runtime/roadmap/merge.js +390 -0
- package/src/runtime/roadmap/rows.js +1122 -0
- package/src/runtime/roadmap/seed.js +1063 -0
- package/src/runtime/roadmap/worktree-cleanup.js +147 -0
- package/src/runtime/rules-report.js +336 -0
- package/src/runtime/scaffold/artifacts.js +60 -9
- package/src/runtime/scaffold/generate.js +21 -9
- package/src/runtime/settings/autopilot.js +106 -0
- package/src/runtime/settings/cli.js +280 -0
- package/src/runtime/settings/config-write.js +314 -0
- package/src/runtime/settings/files.js +271 -0
- package/src/runtime/settings/legacy.js +154 -0
- package/src/runtime/settings/lexical.js +56 -0
- package/src/runtime/settings/prepared-run.js +269 -0
- package/src/runtime/settings/project-layers.js +118 -0
- package/src/runtime/settings/refs.js +288 -0
- package/src/runtime/settings/registry.js +553 -0
- package/src/runtime/settings/resolve.js +713 -0
- package/src/runtime/settings/shared.js +37 -0
- package/src/runtime/settings/worker-billing.js +107 -0
- package/src/runtime/settings/write.js +269 -0
- package/src/runtime/slot-command.js +78 -0
- package/src/runtime/slots.js +671 -0
- package/src/runtime/source-version.js +1 -0
- package/src/runtime/state-root.js +217 -0
- package/src/runtime/storage/cli.js +12 -5
- package/src/runtime/storage/engine.js +9 -2
- package/src/runtime/storage/registry.js +14 -1
- package/src/runtime/storage/roots.js +66 -16
- package/src/runtime/storage/rules.js +82 -10
- package/src/runtime/storage/upkeep.js +10 -2
- package/src/runtime/storage/work-status.js +245 -26
- package/src/runtime/task-attempts.js +589 -69
- package/src/runtime/task-classifier.js +85 -14
- package/src/runtime/task-graph.js +373 -0
- package/src/runtime/task-run.js +778 -0
- package/src/runtime/task-scope.js +176 -55
- package/src/runtime/task-sources.js +147 -0
- package/src/runtime/task-state.js +373 -64
- package/src/runtime/team/admission.js +301 -0
- package/src/runtime/team/envelope.js +324 -0
- package/src/runtime/team/review-guard.js +156 -0
- package/src/runtime/trace/analyze.js +427 -0
- package/src/runtime/trace/baseline.js +770 -0
- package/src/runtime/trace/ledger.js +63 -140
- package/src/runtime/trace/otlp-export.js +568 -0
- package/src/runtime/trace/otlp-map.js +481 -0
- package/src/runtime/trace/spans.js +745 -0
- package/src/runtime/trace/telemetry.js +225 -0
- package/src/runtime/trace/views.js +1 -0
- package/src/runtime/transcripts/command.js +98 -0
- package/src/runtime/transcripts/cursor.js +326 -0
- package/src/runtime/transcripts/read.js +126 -0
- package/src/runtime/transcripts/readers/claude-jsonl.js +74 -0
- package/src/runtime/transcripts/readers/codex-rollout.js +70 -0
- package/src/runtime/transcripts/readers/copilot-events.js +90 -0
- package/src/runtime/transcripts/readers/kiro-jsonl.js +77 -0
- package/src/runtime/transcripts/readers/pi-jsonl.js +59 -0
- package/src/runtime/transcripts/registry.js +161 -0
- package/src/runtime/transcripts/stats.js +161 -0
- package/src/runtime/verb-view.js +267 -0
- package/src/runtime/verification/check-key.js +628 -0
- package/src/runtime/verification/contract-runner.js +546 -11
- package/src/runtime/verification/engine.js +499 -54
- package/src/runtime/verification/impact.js +617 -0
- package/src/runtime/verification/inflight.js +205 -0
- package/src/runtime/verification/registry.js +176 -0
- package/src/runtime/verification/reuse.js +184 -0
- package/src/runtime/verification/telemetry-emit.js +254 -0
- package/src/runtime/verification/test-selection.js +67 -7
- package/src/runtime/worker/active.js +90 -0
- package/src/runtime/worker/cancel.js +222 -0
- package/src/runtime/worker/catalogue.js +122 -0
- package/src/runtime/worker/command.js +677 -0
- package/src/runtime/worker/evidence.js +288 -0
- package/src/runtime/worker/launch.js +256 -0
- package/src/runtime/worker/models.js +137 -0
- package/src/runtime/worker/parsers.js +218 -0
- package/src/runtime/worker/probes/index.js +706 -0
- package/src/runtime/worker/process-tree.js +415 -0
- package/src/runtime/worker/quota.js +43 -0
- package/src/runtime/worker/readiness.js +713 -0
- package/src/runtime/worker/run-store.js +166 -0
- package/src/runtime/worker/supervisor.js +541 -0
- package/src/runtime/worker/worktree-check.js +252 -0
- package/src/runtime/workflow-engine.js +5 -1
- package/src/runtime/workflow-orchestrator.js +610 -67
- package/src/runtime/worktree.js +149 -22
- package/src/state/index.js +1 -1
- package/src/state/lockfile.js +64 -10
- package/src/state/run-lock.js +1 -1
- package/types/node-commonjs.d.ts +106 -7
- package/core/harnesses/claude/hooks/pre-bash-guard.sh +0 -10
- package/core/harnesses/codex/hooks/pre-bash-guard.sh +0 -10
- package/core/harnesses/gemini/hooks/hooks.json +0 -77
- package/core/harnesses/gemini/hooks/lib.sh +0 -302
- package/core/harnesses/gemini/hooks/mcp-tool-guard.sh +0 -10
- package/core/harnesses/gemini/hooks/post-edit-lint.sh +0 -39
- package/core/harnesses/gemini/hooks/pre-bash-guard.sh +0 -10
- package/core/harnesses/gemini/hooks/pre-compact.sh +0 -38
- package/core/harnesses/gemini/hooks/pre-implement-gate.sh +0 -10
- package/core/harnesses/gemini/hooks/session-end.impl.sh +0 -89
- package/core/harnesses/gemini/hooks/session-end.sh +0 -5
- package/core/harnesses/gemini/hooks/session-start.sh +0 -7
- package/core/harnesses/gemini/settings/adapter-defaults.json +0 -4
- package/core/harnesses/kiro/hooks/pre-bash-guard.sh +0 -24
- package/core/harnesses/shared/hooks/policies/blocked-patterns.conf +0 -91
- package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +0 -378
- package/core/shared/guidance/FLAGS.md +0 -25
- package/core/shared/guidance/rules/RULE_01_SAFETY.md +0 -25
- package/core/shared/guidance/rules/RULE_02_WORKFLOW.md +0 -23
- package/core/shared/guidance/rules/RULE_03_QUALITY.md +0 -14
- package/core/shared/guidance/rules/RULE_04_QUESTIONS.md +0 -46
- package/src/adapters/gemini/hooks.js +0 -251
- package/src/adapters/gemini/index.js +0 -429
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
+
case "${OSTYPE:-}" in msys*|cygwin*|win32*) if command -v jq >/dev/null 2>&1; then jq() { command jq -b "$@"; }; fi ;; esac # native jq.exe ends lines with CRLF unless -b
|
|
2
3
|
# do-paths.sh — deterministic path/feature resolver for the doflow chain.
|
|
3
4
|
#
|
|
4
5
|
# Emits a single JSON object describing the ACTIVE feature so doflow skills
|
|
@@ -34,6 +35,9 @@ mode="json"
|
|
|
34
35
|
require=""
|
|
35
36
|
slug_override=""
|
|
36
37
|
prev=""
|
|
38
|
+
# Shared argument rule: `--flag value` is read like `--flag=value` for the flags named here (do-args.sh).
|
|
39
|
+
_da="$(dirname "$0")/do-args.sh"
|
|
40
|
+
if [ -r "$_da" ]; then . "$_da"; doflow_normalize_args "--slug" "$@"; set -- ${DOFLOW_ARGS[@]+"${DOFLOW_ARGS[@]}"}; fi
|
|
37
41
|
for arg in "$@"; do
|
|
38
42
|
case "$arg" in
|
|
39
43
|
--json) mode="json" ;;
|
|
@@ -160,6 +164,31 @@ if [ -n "$feature_slug" ]; then
|
|
|
160
164
|
fi
|
|
161
165
|
fi
|
|
162
166
|
|
|
167
|
+
# ── main checkout (IC-005) ────────────────────────────────────────────────────
|
|
168
|
+
# Prints the main working tree's path when this checkout is a linked worktree of it, else nothing.
|
|
169
|
+
# Same rule as the pre-implementation gate's checkouts(): the first `git worktree list --porcelain`
|
|
170
|
+
# entry; a bare main, a main whose directory is gone and a DoFlow sandbox (.doflow-worktree-base at
|
|
171
|
+
# the current checkout's root) never count. Read-only.
|
|
172
|
+
main_checkout() {
|
|
173
|
+
[ "$is_git_repo" = true ] || return 0
|
|
174
|
+
[ -e "$repo_root/.doflow-worktree-base" ] && return 0
|
|
175
|
+
local list first bare=false line here main_real
|
|
176
|
+
list="$(git -C "$repo_root" worktree list --porcelain 2>/dev/null)" || return 0
|
|
177
|
+
first=""
|
|
178
|
+
while IFS= read -r line; do
|
|
179
|
+
case "$line" in
|
|
180
|
+
"worktree "*) [ -n "$first" ] && break; first="${line#worktree }" ;;
|
|
181
|
+
bare) bare=true ;;
|
|
182
|
+
esac
|
|
183
|
+
done <<< "$list"
|
|
184
|
+
[ -n "$first" ] && [ "$bare" = false ] || return 0
|
|
185
|
+
main_real="$(cd -P "$first" 2>/dev/null && pwd)" || return 0
|
|
186
|
+
here="$(cd -P "$repo_root" 2>/dev/null && pwd)" || return 0
|
|
187
|
+
[ "$main_real" = "$here" ] && return 0
|
|
188
|
+
printf '%s' "$main_real"
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
feature_root="$repo_root"
|
|
163
192
|
feature_dir=""; requirement=""; design=""; specs=""; data_model=""; plan=""; state=""; audit=""
|
|
164
193
|
decisions=""; decisions_register=""; has_decisions=false
|
|
165
194
|
has_requirement=false; has_design=false; has_plan=false; has_specs=false; has_data_model=false
|
|
@@ -167,7 +196,14 @@ layout="legacy"
|
|
|
167
196
|
intention_next_round=""; design_next_round=""; plan_next_round=""
|
|
168
197
|
if [ -n "$feature_slug" ]; then
|
|
169
198
|
feature_dir="$specs_rel/$feature_slug"
|
|
170
|
-
|
|
199
|
+
# The checkout that holds the folder: this one when it has it, else the main checkout when a linked
|
|
200
|
+
# worktree does not, else this one (a new feature). The artifact flags and round scans below read
|
|
201
|
+
# that checkout; every emitted path stays relative to repo_root.
|
|
202
|
+
if [ ! -d "$repo_root/$feature_dir" ]; then
|
|
203
|
+
main_root="$(main_checkout)"
|
|
204
|
+
if [ -n "$main_root" ] && [ -d "$main_root/$feature_dir" ]; then feature_root="$main_root"; fi
|
|
205
|
+
fi
|
|
206
|
+
abs="$feature_root/$feature_dir"
|
|
171
207
|
state="$feature_dir/state.md"; audit="$feature_dir/audit.md"
|
|
172
208
|
decisions="$feature_dir/decisions.md"; decisions_register="$feature_dir/decisions/register.json"
|
|
173
209
|
[ -f "$abs/decisions/register.json" ] && has_decisions=true
|
|
@@ -280,7 +316,7 @@ if [ "$require" = "feature" ] && [ -z "$feature_slug" ]; then
|
|
|
280
316
|
'{error:"ambiguous-feature",
|
|
281
317
|
branch:(if $branch=="" then null else $branch end),
|
|
282
318
|
candidate_slugs:$candidate_slugs,
|
|
283
|
-
hint:"multiple agent-docs/doflow/ feature dirs exist and no git branch disambiguates them — ask which one
|
|
319
|
+
hint:"multiple agent-docs/doflow/ feature dirs exist and no git branch disambiguates them — ask which one with the user question tool, then re-run with --slug=<chosen>"}'
|
|
284
320
|
else
|
|
285
321
|
jq -n --arg branch "$branch" \
|
|
286
322
|
'{error:"no-active-feature",
|
|
@@ -293,6 +329,7 @@ fi
|
|
|
293
329
|
# ── emit resolver JSON ────────────────────────────────────────────────────────
|
|
294
330
|
jq -n \
|
|
295
331
|
--arg repo_root "$repo_root" \
|
|
332
|
+
--arg feature_root "$feature_root" \
|
|
296
333
|
--argjson is_git_repo "$is_git_repo" \
|
|
297
334
|
--arg branch "$branch" \
|
|
298
335
|
--arg feature_slug "$feature_slug" \
|
|
@@ -314,6 +351,7 @@ jq -n \
|
|
|
314
351
|
--arg branch_class "$branch_class" \
|
|
315
352
|
'{
|
|
316
353
|
repo_root: $repo_root,
|
|
354
|
+
feature_root: $feature_root,
|
|
317
355
|
is_git_repo: $is_git_repo,
|
|
318
356
|
branch: (if $branch=="" then null else $branch end),
|
|
319
357
|
feature_slug: (if $feature_slug=="" then null else $feature_slug end),
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
+
case "${OSTYPE:-}" in msys*|cygwin*|win32*) if command -v jq >/dev/null 2>&1; then jq() { command jq -b "$@"; }; fi ;; esac # native jq.exe ends lines with CRLF unless -b
|
|
2
3
|
# do-prereqs.sh — doflow implement-phase prerequisite gate (prompt-level PRIMARY).
|
|
3
4
|
#
|
|
4
5
|
# Called as step 1 of /do-execute-plan. With --require-plan it exits 2 (and prints an
|
|
@@ -48,7 +49,7 @@ if [ "$require_plan" = true ]; then
|
|
|
48
49
|
if [ -z "$slug" ]; then
|
|
49
50
|
if [ "$candidate_slugs" != "[]" ]; then
|
|
50
51
|
echo "$json" | jq '{ok:false, error:"ambiguous-feature", candidate_slugs:.candidate_slugs,
|
|
51
|
-
hint:"multiple agent-docs/doflow/ feature dirs exist and no git branch disambiguates them — ask which one
|
|
52
|
+
hint:"multiple agent-docs/doflow/ feature dirs exist and no git branch disambiguates them — ask which one with the user question tool, then re-run do-prereqs.sh --require-plan --slug=<chosen>"}'
|
|
52
53
|
else
|
|
53
54
|
echo "$json" | jq '{ok:false, error:"no-active-feature", hint:"run /do-brainstorm to start a feature"}'
|
|
54
55
|
fi
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
+
case "${OSTYPE:-}" in msys*|cygwin*|win32*) if command -v jq >/dev/null 2>&1; then jq() { command jq -b "$@"; }; fi ;; esac # native jq.exe ends lines with CRLF unless -b
|
|
2
3
|
# do-review-package.sh — write one commit range's review package to a file.
|
|
3
4
|
#
|
|
4
5
|
# Commit list, stat summary, and the diff with extended context, in one file a
|
|
@@ -25,6 +26,9 @@
|
|
|
25
26
|
set -uo pipefail
|
|
26
27
|
|
|
27
28
|
task_id=""; base=""; head_ref=""; slug_override=""
|
|
29
|
+
# Shared argument rule: `--flag value` is read like `--flag=value` for the flags named here (do-args.sh).
|
|
30
|
+
_da="$(dirname "$0")/do-args.sh"
|
|
31
|
+
if [ -r "$_da" ]; then . "$_da"; doflow_normalize_args "--task --base --head --slug" "$@"; set -- ${DOFLOW_ARGS[@]+"${DOFLOW_ARGS[@]}"}; fi
|
|
28
32
|
for arg in "$@"; do
|
|
29
33
|
case "$arg" in
|
|
30
34
|
--task=*) task_id="${arg#--task=}" ;;
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
# requirements requirement.md §3 FR detail for the FRs the task's [US#] traces
|
|
11
11
|
# why requirement.md §2 story text for that [US#]
|
|
12
12
|
# global constraints requirement.md §4 — ALL NFR detail; NFRs bind every task
|
|
13
|
-
# component boundary design.md
|
|
13
|
+
# component boundary design.md "Components & Boundaries" detail for components serving those FRs
|
|
14
14
|
# verification bar plan.md §7 rows for those FRs + the phase's Checkpoints line
|
|
15
15
|
# interface contracts specs.md §1 in full — only when the resolver reports has_specs
|
|
16
16
|
#
|
|
@@ -28,8 +28,9 @@
|
|
|
28
28
|
# task line's `owner:` and `tier:`, calls the dispatcher once per brief and writes the block plus
|
|
29
29
|
# the `*-brief.json` record (IC-018) beside the brief. It names no tool, provider, server or tier.
|
|
30
30
|
# It fails open (IC-019): a missing dispatcher, a non-zero exit or output that is not the expected
|
|
31
|
-
# JSON gives a "Not generated" line
|
|
32
|
-
#
|
|
31
|
+
# JSON gives a "Not generated" line, the must-carry rules (read from the rule ledger,
|
|
32
|
+
# `core/registry/rules.json`, whatever the task line's owner) and a static report-format block, a
|
|
33
|
+
# `missing[]` note, no record, and the exit status the brief would otherwise have had.
|
|
33
34
|
#
|
|
34
35
|
# Usage:
|
|
35
36
|
# do-task-brief.sh --task=<id> [--harness=<id>] [--slug=<slug>] [--json]
|
|
@@ -47,6 +48,9 @@ slug_override=""
|
|
|
47
48
|
harness=""
|
|
48
49
|
mode=""
|
|
49
50
|
|
|
51
|
+
# Shared argument rule: `--flag value` is read like `--flag=value` for the flags named here (do-args.sh).
|
|
52
|
+
_da="$(dirname "$0")/do-args.sh"
|
|
53
|
+
if [ -r "$_da" ]; then . "$_da"; doflow_normalize_args "--task --group --tasks --slug --harness" "$@"; set -- ${DOFLOW_ARGS[@]+"${DOFLOW_ARGS[@]}"}; fi
|
|
50
54
|
for arg in "$@"; do
|
|
51
55
|
case "$arg" in
|
|
52
56
|
--task=*)
|
|
@@ -192,7 +196,7 @@ task_field() { # task_field <task line> <name>
|
|
|
192
196
|
}
|
|
193
197
|
|
|
194
198
|
# Sets bt_md and bt_record on success, bt_reason on every failure; never exits.
|
|
195
|
-
|
|
199
|
+
bt_verb() { # bt_verb <owner> <tier> <heading level> <task ids>
|
|
196
200
|
bt_md=""; bt_record=""; bt_reason=""
|
|
197
201
|
local dispatcher="$script_dir/../bin/doflow-run" out rc
|
|
198
202
|
if [ -z "$1" ]; then bt_reason="the task line names no owner"; return 0; fi
|
|
@@ -210,7 +214,43 @@ bt_call() { # bt_call <owner> <tier> <heading level> <task ids>
|
|
|
210
214
|
return 0
|
|
211
215
|
}
|
|
212
216
|
|
|
213
|
-
# The
|
|
217
|
+
# The registry file `core/registry/<name>` of the runtime this script belongs to: next to the checkout or
|
|
218
|
+
# projected runtime found above this script, else the global projected runtime. Empty when none exists.
|
|
219
|
+
registry_file() { # registry_file <name>
|
|
220
|
+
local d="$script_dir" c
|
|
221
|
+
while [ -n "$d" ] && [ "$d" != "/" ]; do
|
|
222
|
+
for c in "$d/core/registry/$1" "$d/runtime/core/registry/$1"; do
|
|
223
|
+
if [ -f "$c" ]; then printf '%s' "$c"; return 0; fi
|
|
224
|
+
done
|
|
225
|
+
d="$(dirname "$d")"
|
|
226
|
+
done
|
|
227
|
+
c="${HOME:-}/.doflow/runtime/core/registry/$1"
|
|
228
|
+
if [ -f "$c" ]; then printf '%s' "$c"; fi
|
|
229
|
+
return 0
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
# Sets bt_rules to the "Rules that apply to you" block (the mustCarry lines of the rule ledger, as
|
|
233
|
+
# src/runtime/brief-rules.js renders them) when the verb did not produce the brief block, which
|
|
234
|
+
# already carries it; names the reason in missing[] when the ledger cannot be read. Never exits.
|
|
235
|
+
bt_rules_load() { # bt_rules_load <heading level>
|
|
236
|
+
bt_rules=""
|
|
237
|
+
[ -z "$bt_md" ] || return 0
|
|
238
|
+
local h="##" file lines
|
|
239
|
+
[ "$1" = "3" ] && h="###"
|
|
240
|
+
file="$(registry_file rules.json)"
|
|
241
|
+
if [ -z "$file" ]; then missing+=("brief-rules: core/registry/rules.json is missing"); return 0; fi
|
|
242
|
+
lines="$(jq -r 'if (.mustCarry | type) == "array" and (.mustCarry | length) > 0 and (.mustCarry | all(type == "string")) then .mustCarry[] | "- " + . else empty end' "$file" 2>/dev/null)"
|
|
243
|
+
if [ -z "$lines" ]; then missing+=("brief-rules: core/registry/rules.json has no mustCarry array"); return 0; fi
|
|
244
|
+
bt_rules="$(printf '%s Rules that apply to you\n\n%s\n' "$h" "$lines")"
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
# The tier and tools block, the rules and the report format the task line's owner and tier give.
|
|
248
|
+
bt_call() { # bt_call <owner> <tier> <heading level> <task ids>
|
|
249
|
+
bt_verb "$@"
|
|
250
|
+
bt_rules_load "$3"
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
# The block for the brief: the verb's markdown, or the rules and the static fallback (no tool names).
|
|
214
254
|
bt_emit() { # bt_emit <heading level>
|
|
215
255
|
local h="##" who="your report"
|
|
216
256
|
if [ "$1" = "3" ]; then h="###"; who="each task's report"; fi
|
|
@@ -218,9 +258,11 @@ bt_emit() { # bt_emit <heading level>
|
|
|
218
258
|
printf '%s\n' "$bt_md"
|
|
219
259
|
return 0
|
|
220
260
|
fi
|
|
261
|
+
[ -z "$bt_rules" ] || printf '%s\n\n' "$bt_rules"
|
|
221
262
|
printf '%s Tier and tools\n\nNot generated: %s. Name the tier and tools in the dispatch.\n\n' "$h" "$bt_reason"
|
|
222
|
-
printf '%s Report format\n\
|
|
263
|
+
printf '%s Report format\n\nPut one line naming every tool and MCP server you used just before the final status line:\n' "$h"
|
|
223
264
|
printf '%s\n' '`Tools used: <name>[=used|nothing-usable|unavailable|skipped:<reason>], ...`'
|
|
265
|
+
printf 'End %s with one line `Status: <status>`, where the status is one of `done`, `done-with-concerns`, `needs-context`, `blocked`.\n' "$who"
|
|
224
266
|
}
|
|
225
267
|
|
|
226
268
|
# Writes the record beside the brief with its tasks filled in; sets record_out to its path, or to ""
|
|
@@ -286,8 +328,8 @@ if [ "$mode" = "task" ]; then
|
|
|
286
328
|
components=""
|
|
287
329
|
if [ -n "$frs" ] && [ -f "$des_abs" ]; then
|
|
288
330
|
components="$(for fr in $frs; do
|
|
289
|
-
section "$des_abs" '^##
|
|
290
|
-
/^\| *CMP/ { if ($5 ~ fr) { id = $2; gsub(/^[ \t]+|[ \t]+$/, "", id); print id } }'
|
|
331
|
+
section "$des_abs" '^## [0-9]+[.] Component' | awk -F'|' -v fr="$fr" '
|
|
332
|
+
/^\| *(CMP|C[0-9]+)/ { if ($5 ~ fr) { id = $2; gsub(/^[ \t]+|[ \t]+$/, "", id); print id } }'
|
|
291
333
|
done | sort -u)"
|
|
292
334
|
fi
|
|
293
335
|
|
|
@@ -342,7 +384,7 @@ if [ "$mode" = "task" ]; then
|
|
|
342
384
|
echo "## Component boundary"
|
|
343
385
|
echo
|
|
344
386
|
printf '%s\n' "$components" | while read -r cmp; do
|
|
345
|
-
[ -n "$cmp" ] && detail_for "$des_abs" '^##
|
|
387
|
+
[ -n "$cmp" ] && detail_for "$des_abs" '^## [0-9]+[.] Component' "$cmp"
|
|
346
388
|
done
|
|
347
389
|
echo
|
|
348
390
|
fi
|
|
@@ -352,7 +394,7 @@ if [ "$mode" = "task" ]; then
|
|
|
352
394
|
echo
|
|
353
395
|
# §1 IN FULL, deliberately unfiltered: an IC-### entry carries no FR or component
|
|
354
396
|
# linkage field, so there is nothing to filter it by the way "component boundary"
|
|
355
|
-
# above filters design.md
|
|
397
|
+
# above filters design.md Components & Boundaries rows on the FRs they name.
|
|
356
398
|
section "$specs_abs" '^## 1[.]' | awk 'NF { p = 1 } p'
|
|
357
399
|
echo
|
|
358
400
|
fi
|
|
@@ -457,8 +499,8 @@ else
|
|
|
457
499
|
# Union of components serving those FRs
|
|
458
500
|
if [ -n "$all_frs" ] && [ -f "$des_abs" ]; then
|
|
459
501
|
all_comps_raw="$(for fr in $all_frs; do
|
|
460
|
-
section "$des_abs" '^##
|
|
461
|
-
/^\| *CMP/ { if ($5 ~ fr) { id = $2; gsub(/^[ \t]+|[ \t]+$/, "", id); print id } }'
|
|
502
|
+
section "$des_abs" '^## [0-9]+[.] Component' | awk -F'|' -v fr="$fr" '
|
|
503
|
+
/^\| *(CMP|C[0-9]+)/ { if ($5 ~ fr) { id = $2; gsub(/^[ \t]+|[ \t]+$/, "", id); print id } }'
|
|
462
504
|
done | sort -u)"
|
|
463
505
|
fi
|
|
464
506
|
|
|
@@ -490,8 +532,8 @@ else
|
|
|
490
532
|
t_comps=""
|
|
491
533
|
if [ -n "$t_frs" ] && [ -f "$des_abs" ]; then
|
|
492
534
|
t_comps="$(for fr in $t_frs; do
|
|
493
|
-
section "$des_abs" '^##
|
|
494
|
-
/^\| *CMP/ { if ($5 ~ fr) { id = $2; gsub(/^[ \t]+|[ \t]+$/, "", id); print id } }'
|
|
535
|
+
section "$des_abs" '^## [0-9]+[.] Component' | awk -F'|' -v fr="$fr" '
|
|
536
|
+
/^\| *(CMP|C[0-9]+)/ { if ($5 ~ fr) { id = $2; gsub(/^[ \t]+|[ \t]+$/, "", id); print id } }'
|
|
495
537
|
done | sort -u)"
|
|
496
538
|
fi
|
|
497
539
|
|
|
@@ -541,7 +583,7 @@ else
|
|
|
541
583
|
echo "## Component boundary"
|
|
542
584
|
echo
|
|
543
585
|
printf '%s\n' "$t_comps" | while read -r cmp; do
|
|
544
|
-
[ -n "$cmp" ] && detail_for "$des_abs" '^##
|
|
586
|
+
[ -n "$cmp" ] && detail_for "$des_abs" '^## [0-9]+[.] Component' "$cmp"
|
|
545
587
|
done
|
|
546
588
|
echo
|
|
547
589
|
fi
|
|
@@ -590,7 +632,7 @@ else
|
|
|
590
632
|
echo "### Component boundary"
|
|
591
633
|
echo
|
|
592
634
|
printf '%s\n' "$all_comps_raw" | while read -r cmp; do
|
|
593
|
-
[ -n "$cmp" ] && detail_for "$des_abs" '^##
|
|
635
|
+
[ -n "$cmp" ] && detail_for "$des_abs" '^## [0-9]+[.] Component' "$cmp"
|
|
594
636
|
done
|
|
595
637
|
echo
|
|
596
638
|
fi
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
+
case "${OSTYPE:-}" in msys*|cygwin*|win32*) if command -v jq >/dev/null 2>&1; then jq() { command jq -b "$@"; }; fi ;; esac # native jq.exe ends lines with CRLF unless -b
|
|
2
3
|
# render-audit.sh — projects the orchestrator's own journal into a human-readable audit.md.
|
|
3
4
|
#
|
|
4
5
|
# audit.md is generated, never hand-authored: this script deterministically OVERWRITES it in full
|
|
@@ -76,13 +77,36 @@ fi
|
|
|
76
77
|
[ "$rc" -eq 0 ] || note "resolver-error"
|
|
77
78
|
|
|
78
79
|
repo_root=$(printf '%s' "$resolved_json" | jq -r '.repo_root // empty')
|
|
80
|
+
feature_root=$(printf '%s' "$resolved_json" | jq -r '.feature_root // empty')
|
|
81
|
+
[ -n "$feature_root" ] || feature_root="$repo_root"
|
|
79
82
|
feature_slug=$(printf '%s' "$resolved_json" | jq -r '.feature_slug // empty')
|
|
80
83
|
audit_rel=$(printf '%s' "$resolved_json" | jq -r '.audit // empty')
|
|
81
84
|
[ -n "$feature_slug" ] || note "no-active-feature"
|
|
82
85
|
|
|
83
86
|
# WorkflowOrchestrator's own stateDir/runFile convention (workflow-orchestrator.ts):
|
|
84
87
|
# stateDir = <root>/.doflow/state/orchestration ; runFile = <stateDir>/<taskId>.json
|
|
85
|
-
|
|
88
|
+
#
|
|
89
|
+
# The run is read from the MAIN checkout first (IC-004): a linked worktree's task records live there.
|
|
90
|
+
# Main is the first `git worktree list --porcelain` entry, the pre-implementation gate's rule: a bare
|
|
91
|
+
# main, a vanished main and a DoFlow sandbox (.doflow-worktree-base at this checkout's root) do not
|
|
92
|
+
# count. Main holding no copy, or this being the main checkout, falls back to this checkout's own.
|
|
93
|
+
main_checkout() {
|
|
94
|
+
[ -e "$repo_root/.doflow-worktree-base" ] && return 0
|
|
95
|
+
local list first="" is_bare=false line
|
|
96
|
+
list="$(git -C "$repo_root" worktree list --porcelain 2>/dev/null)" || return 0
|
|
97
|
+
while IFS= read -r line; do
|
|
98
|
+
case "$line" in
|
|
99
|
+
"worktree "*) [ -n "$first" ] && break; first="${line#worktree }" ;;
|
|
100
|
+
bare) is_bare=true ;;
|
|
101
|
+
esac
|
|
102
|
+
done <<< "$list"
|
|
103
|
+
[ -n "$first" ] && [ "$is_bare" = false ] && cd -P "$first" 2>/dev/null && pwd
|
|
104
|
+
return 0
|
|
105
|
+
}
|
|
106
|
+
journal_rel=".doflow/state/orchestration/$feature_slug.json"
|
|
107
|
+
journal_file="$repo_root/$journal_rel"
|
|
108
|
+
main_root="$(main_checkout)"
|
|
109
|
+
if [ -n "$main_root" ] && [ -f "$main_root/$journal_rel" ]; then journal_file="$main_root/$journal_rel"; fi
|
|
86
110
|
[ -f "$journal_file" ] || note "no orchestration run recorded yet"
|
|
87
111
|
|
|
88
112
|
jq -e '.history | type == "array"' "$journal_file" >/dev/null 2>&1 || note "journal-unreadable"
|
|
@@ -93,7 +117,7 @@ jq -e '.history | type == "array"' "$journal_file" >/dev/null 2>&1 || note "jour
|
|
|
93
117
|
# reading it from the resolver rather than recomputing it here still means a future resolver change
|
|
94
118
|
# has one place to land, not two that can drift apart.
|
|
95
119
|
[ -n "$audit_rel" ] || note "resolver-missing-audit-path"
|
|
96
|
-
audit_file="$
|
|
120
|
+
audit_file="$feature_root/$audit_rel"
|
|
97
121
|
|
|
98
122
|
# Render to a temp file first, then move it into place. `>"$audit_file"` truncates the target
|
|
99
123
|
# before the group runs, and with no `-e` a mid-stream jq abort (a malformed or hand-corrupted
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
+
case "${OSTYPE:-}" in msys*|cygwin*|win32*) if command -v jq >/dev/null 2>&1; then jq() { command jq -b "$@"; }; fi ;; esac # native jq.exe ends lines with CRLF unless -b
|
|
2
3
|
# render-diagrams.sh — renders a chain artifact's fenced mermaid blocks to image files.
|
|
3
4
|
#
|
|
4
5
|
# A FAITHFUL render: the same nodes, the same edges, the same labels. The committed markdown is the
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
+
case "${OSTYPE:-}" in msys*|cygwin*|win32*) if command -v jq >/dev/null 2>&1; then jq() { command jq -b "$@"; }; fi ;; esac # native jq.exe ends lines with CRLF unless -b
|
|
2
3
|
# render-puml.sh — renders a feature's authored PlantUML sources and projects them into its artifact.
|
|
3
4
|
#
|
|
4
5
|
# ONE verb doing BOTH derived views, deliberately (035 design R6): reading the source once means the
|
|
@@ -150,7 +151,7 @@ for src in "${sources[@]}"; do
|
|
|
150
151
|
fi
|
|
151
152
|
fi
|
|
152
153
|
|
|
153
|
-
# One source feeds design.md
|
|
154
|
+
# One source feeds design.md System Overview (C4)'s inline block; the others render only to images.
|
|
154
155
|
if [ "$src" = "$block_src" ]; then
|
|
155
156
|
# stdout only is the block: the splice writes it into authored prose, so anything the projector
|
|
156
157
|
# (or Node) prints on stderr, an ExperimentalWarning for one, must never become part of it.
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
+
case "${OSTYPE:-}" in msys*|cygwin*|win32*) if command -v jq >/dev/null 2>&1; then jq() { command jq -b "$@"; }; fi ;; esac # native jq.exe ends lines with CRLF unless -b
|
|
2
3
|
# validate-artifacts.sh — advisory consistency checker for doflow chain artifacts.
|
|
3
4
|
#
|
|
4
5
|
# Checks that an artifact's index tables agree with the detail beside them. This is a CONSISTENCY
|
|
@@ -18,6 +19,9 @@
|
|
|
18
19
|
# unknown a line outside History, comments and code fences cites a DEC-### that is not in the
|
|
19
20
|
# feature's decision register. Inert without a register.
|
|
20
21
|
# rollup plan.md's phase rollup counts match its task checklist
|
|
22
|
+
# task-graph plan.md's task lines parse as the task-attempt ledger reads them: one finding per
|
|
23
|
+
# problem the read-only `plan-check` verb reports. Fail-soft: with the dispatcher,
|
|
24
|
+
# node or jq unavailable it prints one `note:` line on stderr and adds no finding.
|
|
21
25
|
#
|
|
22
26
|
# Grammar (see guidance/references/ARTIFACT_FORMAT.md) — deliberately prefix-agnostic, so
|
|
23
27
|
# FR/NFR/C/D/A and any future prefix work with no change here:
|
|
@@ -81,10 +85,10 @@ refuse_invalid_slug() {
|
|
|
81
85
|
}
|
|
82
86
|
|
|
83
87
|
# ── locate targets ────────────────────────────────────────────────────────────────────────────
|
|
88
|
+
script_dir="$(cd "$(dirname "$0")" && pwd)"
|
|
84
89
|
if [ "${#targets[@]}" -eq 0 ]; then
|
|
85
90
|
command -v jq >/dev/null 2>&1 || note "jq-absent"
|
|
86
91
|
|
|
87
|
-
script_dir="$(cd "$(dirname "$0")" && pwd)"
|
|
88
92
|
RESOLVER="$script_dir/do-paths.sh"
|
|
89
93
|
[ -f "$RESOLVER" ] || RESOLVER="${DOFLOW_CONFIG_DIR:+$DOFLOW_CONFIG_DIR/scripts/doflow/bash/do-paths.sh}"
|
|
90
94
|
[ -f "$RESOLVER" ] || note "resolver-absent"
|
|
@@ -95,7 +99,9 @@ if [ "${#targets[@]}" -eq 0 ]; then
|
|
|
95
99
|
[ "$rc" -eq 2 ] && refuse_invalid_slug "$json"
|
|
96
100
|
[ "$rc" -eq 0 ] || note "resolver-error"
|
|
97
101
|
|
|
98
|
-
|
|
102
|
+
# The feature folder's checkout: a linked worktree that has not yet got the folder reads it from
|
|
103
|
+
# main. Resolvers from before feature_root exist carry only repo_root, which is then the answer.
|
|
104
|
+
root=$(printf '%s' "$json" | jq -r '.feature_root // .repo_root // empty')
|
|
99
105
|
[ -n "$(printf '%s' "$json" | jq -r '.feature_slug // empty')" ] || note "no-active-feature"
|
|
100
106
|
|
|
101
107
|
# data-model.md is a default target only for a feature that has a decision register, so a folder
|
|
@@ -110,7 +116,6 @@ if [ "${#targets[@]}" -eq 0 ]; then
|
|
|
110
116
|
elif command -v jq >/dev/null 2>&1; then
|
|
111
117
|
# Explicit paths skip discovery, but the stale rule still needs the feature's register. Resolve
|
|
112
118
|
# quietly: any failure here only leaves the rule inert, never changes what was asked for.
|
|
113
|
-
script_dir="$(cd "$(dirname "$0")" && pwd)"
|
|
114
119
|
RESOLVER="$script_dir/do-paths.sh"
|
|
115
120
|
[ -f "$RESOLVER" ] || RESOLVER="${DOFLOW_CONFIG_DIR:+$DOFLOW_CONFIG_DIR/scripts/doflow/bash/do-paths.sh}"
|
|
116
121
|
json=""
|
|
@@ -121,7 +126,7 @@ elif command -v jq >/dev/null 2>&1; then
|
|
|
121
126
|
[ "$rc" -eq 2 ] && refuse_invalid_slug "$json"
|
|
122
127
|
[ "$rc" -eq 0 ] || json=""
|
|
123
128
|
fi
|
|
124
|
-
root=$(printf '%s' "$json" | jq -r '.repo_root // empty' 2>/dev/null)
|
|
129
|
+
root=$(printf '%s' "$json" | jq -r '.feature_root // .repo_root // empty' 2>/dev/null)
|
|
125
130
|
fi
|
|
126
131
|
|
|
127
132
|
# ── decision register (stale rule) ──────────────────────────────────────────────────────────────
|
|
@@ -155,6 +160,41 @@ if [ -n "$feat_abs" ] && [ "$(printf '%s' "$json" | jq -r '.has_decisions // fal
|
|
|
155
160
|
fi
|
|
156
161
|
fi
|
|
157
162
|
|
|
163
|
+
# ── task-graph rule ───────────────────────────────────────────────────────────────────────────
|
|
164
|
+
# Asks the plan-check verb about one plan.md and leaves its problems in tg_out as
|
|
165
|
+
# `rule<TAB>id<TAB>message` records, the shape awk's finding() prints. It sets a global rather than
|
|
166
|
+
# printing, so the once-per-run note flag survives the call. A plan-check that cannot answer adds
|
|
167
|
+
# no finding: it prints one `note:` line per run on stderr instead. `plan-unreadable` adds nothing
|
|
168
|
+
# either; the unreadable-file finding already says the file was not checked.
|
|
169
|
+
tg_noted=0
|
|
170
|
+
tg_note() {
|
|
171
|
+
[ "$tg_noted" -eq 1 ] && return 0
|
|
172
|
+
tg_noted=1
|
|
173
|
+
printf 'note: plan-check unavailable (%s); the task-graph rule did not run\n' "$1" >&2
|
|
174
|
+
}
|
|
175
|
+
tg_out=""
|
|
176
|
+
task_graph_findings() { # task_graph_findings <plan file>
|
|
177
|
+
local dispatcher="$script_dir/../bin/doflow-run" tg
|
|
178
|
+
tg_out=""
|
|
179
|
+
command -v jq >/dev/null 2>&1 || { tg_note "jq-absent"; return 0; }
|
|
180
|
+
[ -f "$dispatcher" ] || { tg_note "dispatcher-absent"; return 0; }
|
|
181
|
+
tg=$(bash "$dispatcher" plan-check "$1" --json </dev/null 2>/dev/null)
|
|
182
|
+
if ! printf '%s' "$tg" | jq -e 'type == "object" and has("ok")' >/dev/null 2>&1; then
|
|
183
|
+
tg_note "no-json-from-plan-check"; return 0
|
|
184
|
+
fi
|
|
185
|
+
[ "$(printf '%s' "$tg" | jq -r '.error // empty')" = "plan-unreadable" ] && return 0
|
|
186
|
+
# jq prints `id<TAB>message`; awk adds the rule through the same finding() shape the checks use.
|
|
187
|
+
tg_out=$(printf '%s' "$tg" | jq -r '
|
|
188
|
+
.problems[]?
|
|
189
|
+
| [(if (.ids // [] | length) > 0 then (.ids | join(",")) else "-" end),
|
|
190
|
+
(.kind
|
|
191
|
+
+ (if has("value") then " '"'"'" + (.value | tostring) + "'"'"'"
|
|
192
|
+
elif (.via // [] | length) > 0 then " via " + (.via | join(", "))
|
|
193
|
+
else "" end))]
|
|
194
|
+
| map(gsub("[\t\r\n]"; " ")) | join("\t")' 2>/dev/null \
|
|
195
|
+
| awk -F'\t' 'function finding(rule, id, msg) { print rule "\t" id "\t" msg } { finding("task-graph", $1, $2) }') || tg_out=""
|
|
196
|
+
}
|
|
197
|
+
|
|
158
198
|
# ── check each target ─────────────────────────────────────────────────────────────────────────
|
|
159
199
|
# Findings accumulate as: <file>\t<rule>\t<id>\t<message>
|
|
160
200
|
findings=""
|
|
@@ -176,7 +216,7 @@ for f in "${targets[@]}"; do
|
|
|
176
216
|
esac
|
|
177
217
|
fi
|
|
178
218
|
# Paths reach awk through the environment: -v would process backslash escapes inside them.
|
|
179
|
-
out=$(DF_ART_DIR="$(dirname "$f")" DF_HIST_ROOT="$hist_root" awk -v is_plan="$([ "$(basename "$f")" = "plan.md" ] && echo 1 || echo 0)" \
|
|
219
|
+
out=$(LC_ALL=C DF_ART_DIR="$(dirname "$f")" DF_HIST_ROOT="$hist_root" awk -v is_plan="$([ "$(basename "$f")" = "plan.md" ] && echo 1 || echo 0)" \
|
|
180
220
|
-v stale_map="$file_stale_map" -v reg_ok="$file_reg_ok" -v known_ids="$file_known_ids" -v sq="'" '
|
|
181
221
|
# Inline markup is presentation, not value: "**Superseded → X**" and "`Live`" mean the same as
|
|
182
222
|
# their bare forms, so emphasis is stripped before any comparison.
|
|
@@ -481,6 +521,10 @@ for f in "${targets[@]}"; do
|
|
|
481
521
|
findings="${findings}${f}"$'\t'"io"$'\t'"-"$'\t'"could not be parsed (awk exit ${awk_status}) — this file was NOT checked"$'\n'
|
|
482
522
|
continue
|
|
483
523
|
fi
|
|
524
|
+
if [ "$(basename "$f")" = "plan.md" ]; then
|
|
525
|
+
task_graph_findings "$f"
|
|
526
|
+
[ -n "$tg_out" ] && out="${out:+$out$'\n'}$tg_out"
|
|
527
|
+
fi
|
|
484
528
|
if [ -n "$out" ]; then
|
|
485
529
|
while IFS= read -r line; do
|
|
486
530
|
[ -n "$line" ] && findings="${findings}${f}"$'\t'"${line}"$'\n'
|