@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
|
@@ -14,8 +14,12 @@
|
|
|
14
14
|
#
|
|
15
15
|
# Usage: doflow-run <verb> [args...]
|
|
16
16
|
# enforcement --harness <id> --policy <id> [--profile <id>] [--json]
|
|
17
|
+
# context-emit --event launch|prompt|delta --cwd <dir> [--session <id>] [--harness <id>]
|
|
18
|
+
# [--nudge nudge|suppress|none] [--max-bytes <n>] [--task-id <id>] [--slug <slug>] [--peek] [--json]
|
|
19
|
+
# context-grant --summary <summaryId|pending> --to-run <id> --to-lineage <id>
|
|
20
|
+
# [--from-worktree <dir>] [--from-run <id>] [--from-lineage <id>] [--max-bytes <n>] [--json]
|
|
17
21
|
# Every verb accepts --json. Exit 0 = success, 1 = an actionable finding, 2 = usage or
|
|
18
|
-
# resolution error, 3 = context-pack overflow. Arguments, stdin and exit status pass through the
|
|
22
|
+
# resolution error, 3 = context-pack overflow or context-emit refusal. Arguments, stdin and exit status pass through the
|
|
19
23
|
# dispatcher unmodified —
|
|
20
24
|
# `sync-context` reads its block body from stdin, so anything that buffered or consumed it here
|
|
21
25
|
# would break that verb rather than merely inconvenience it.
|
|
@@ -30,29 +34,61 @@ set -euo pipefail
|
|
|
30
34
|
# `set -euo pipefail` never stops on it; nothing in it can reach the dispatcher's own options or
|
|
31
35
|
# variables. Appends one JSON line of at most 1000 bytes (longer appends from concurrent writers can
|
|
32
36
|
# interleave) and never rotates: rotation is done by the Node writers only (IC-015, DEC-019). It is
|
|
33
|
-
# a no-op when no
|
|
34
|
-
#
|
|
35
|
-
# off
|
|
36
|
-
#
|
|
37
|
+
# a no-op when there is no config home (neither XDG_CONFIG_HOME nor HOME is set to an absolute path;
|
|
38
|
+
# doflow_config_home below, the rule of src/runtime/config-home.ts) and while capture is off
|
|
39
|
+
# (DOFLOW_FAILURE_CAPTURE=off|0|false|no, the `off` sentinel file, or a `failure.capture` value other
|
|
40
|
+
# than "on" in <config home>/settings.json, read by doflow_lex_capture below). The line carries only
|
|
41
|
+
# names from DoFlow's own tables and the working directory: never an argument, stdin or the
|
|
42
|
+
# environment.
|
|
37
43
|
# capture_failure <command> <kind> <exit status>
|
|
38
44
|
CAPTURE_VERB=""
|
|
39
45
|
|
|
46
|
+
# BEGIN doflow-config-home v1 (rule: src/runtime/config-home.ts; checked by test/guards/settings.test.js)
|
|
47
|
+
doflow_config_home() {
|
|
48
|
+
DOFLOW_HOME=""
|
|
49
|
+
case "${XDG_CONFIG_HOME:-}" in
|
|
50
|
+
/*) DOFLOW_HOME="${XDG_CONFIG_HOME}/doflow"; return 0 ;;
|
|
51
|
+
[A-Za-z]:[\\/]*) case "${OSTYPE:-}" in msys*|cygwin*|win32*) DOFLOW_HOME="${XDG_CONFIG_HOME}/doflow"; return 0 ;; esac ;;
|
|
52
|
+
esac
|
|
53
|
+
case "${HOME:-}" in
|
|
54
|
+
/*) DOFLOW_HOME="${HOME}/.config/doflow" ;;
|
|
55
|
+
[A-Za-z]:[\\/]*) case "${OSTYPE:-}" in msys*|cygwin*|win32*) DOFLOW_HOME="${HOME}/.config/doflow" ;; esac ;;
|
|
56
|
+
esac
|
|
57
|
+
return 0
|
|
58
|
+
}
|
|
59
|
+
# END doflow-config-home v1
|
|
60
|
+
|
|
61
|
+
# BEGIN doflow-settings-lexical v1 (rule: src/runtime/settings/lexical.ts; checked by test/guards/settings.test.js)
|
|
62
|
+
doflow_lex_capture() {
|
|
63
|
+
local f="${1:-}" text="" rest="" d=""
|
|
64
|
+
local re='"failure\.capture"[[:space:]]*:[[:space:]]*("[^"]*"|[^,}"[:space:]]*)'
|
|
65
|
+
DOFLOW_LEX_CAPTURE=""
|
|
66
|
+
if [ ! -e "$f" ]; then
|
|
67
|
+
# Missing is no setting, unless the folder holding it cannot be searched (Node: EACCES is off).
|
|
68
|
+
d="${f%/*}"
|
|
69
|
+
if [ -n "$d" ] && [ "$d" != "$f" ] && [ -d "$d" ] && [ ! -x "$d" ]; then DOFLOW_LEX_CAPTURE="off"; fi
|
|
70
|
+
return 0
|
|
71
|
+
fi
|
|
72
|
+
if [ ! -f "$f" ] || [ ! -r "$f" ]; then DOFLOW_LEX_CAPTURE="off"; return 0; fi
|
|
73
|
+
IFS= read -r -d '' text < "$f" || true
|
|
74
|
+
rest="$text"
|
|
75
|
+
while [[ $rest =~ $re ]]; do
|
|
76
|
+
if [ "${BASH_REMATCH[1]}" = '"on"' ]; then DOFLOW_LEX_CAPTURE="${DOFLOW_LEX_CAPTURE:-on}"; else DOFLOW_LEX_CAPTURE="off"; fi
|
|
77
|
+
rest="${rest#*"${BASH_REMATCH[0]}"}"
|
|
78
|
+
done
|
|
79
|
+
return 0
|
|
80
|
+
}
|
|
81
|
+
# END doflow-settings-lexical v1
|
|
82
|
+
|
|
83
|
+
|
|
40
84
|
capture_failure_write() {
|
|
41
85
|
local command="${1:-}" kind="${2:-}" status="${3:-}"
|
|
42
86
|
local home="" setting="" version="" candidate="" project="" harness="" at="" line="" cwd="" hp=""
|
|
43
87
|
export LC_ALL=C
|
|
44
88
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
*) return 0 ;;
|
|
49
|
-
esac
|
|
50
|
-
else
|
|
51
|
-
case "${HOME:-}" in
|
|
52
|
-
/*) home="$HOME/.config/doflow/failures" ;;
|
|
53
|
-
*) return 0 ;;
|
|
54
|
-
esac
|
|
55
|
-
fi
|
|
89
|
+
doflow_config_home
|
|
90
|
+
[ -n "$DOFLOW_HOME" ] || return 0
|
|
91
|
+
home="$DOFLOW_HOME/failures"
|
|
56
92
|
|
|
57
93
|
# Case-insensitive, whitespace trimmed at the ends only: the same reading the Node writer has.
|
|
58
94
|
setting="$(printf '%s' "${DOFLOW_FAILURE_CAPTURE:-}" | tr '[:upper:]' '[:lower:]')" || return 0
|
|
@@ -62,6 +98,8 @@ capture_failure_write() {
|
|
|
62
98
|
off|0|false|no) return 0 ;;
|
|
63
99
|
esac
|
|
64
100
|
[ -f "$home/off" ] && return 0
|
|
101
|
+
doflow_lex_capture "$DOFLOW_HOME/settings.json"
|
|
102
|
+
[ "$DOFLOW_LEX_CAPTURE" = off ] && return 0
|
|
65
103
|
|
|
66
104
|
# The command is a verb the dispatcher has already matched against its own tables, or `dispatcher`.
|
|
67
105
|
[[ "$command" =~ ^[a-z][a-z0-9-]{0,39}$ ]] || command="dispatcher"
|
|
@@ -114,14 +152,15 @@ capture_failure() {
|
|
|
114
152
|
|
|
115
153
|
# After a verb ran: a status outside {0, 1, 2} is a crash worth recording (a signal, a runtime that
|
|
116
154
|
# died), minus what is not DoFlow's fault (DEC-031): 127 (command not found), 130, 141 and 143
|
|
117
|
-
# (interrupted, broken pipe, terminated), task-not-found status 3 of `task-brief`,
|
|
118
|
-
# status 3 of `context-pack
|
|
155
|
+
# (interrupted, broken pipe, terminated), task-not-found status 3 of `task-brief`, overflow
|
|
156
|
+
# status 3 of `context-pack`, refused status 3 of `context-emit`, and over-budget status 3 of
|
|
157
|
+
# `context-grant`. A Node crash exits 1 and is recorded by the CLI itself, so it is
|
|
119
158
|
# never counted twice.
|
|
120
159
|
capture_exit_status() {
|
|
121
160
|
local verb="${1:-}" status="${2:-0}"
|
|
122
161
|
case "$status" in
|
|
123
162
|
0|1|2|127|130|141|143) return 0 ;;
|
|
124
|
-
3) case "$verb" in task-brief|context-pack) return 0 ;; esac ;;
|
|
163
|
+
3) case "$verb" in task-brief|context-pack|context-emit|context-grant) return 0 ;; esac ;;
|
|
125
164
|
esac
|
|
126
165
|
capture_failure "$verb" "exit-$status" "$status"
|
|
127
166
|
return 0
|
|
@@ -165,8 +204,13 @@ resolve_config_dir() {
|
|
|
165
204
|
dir="$(pwd -P 2>/dev/null || pwd)"
|
|
166
205
|
while [ -n "$dir" ] && [ "$dir" != "/" ]; do
|
|
167
206
|
if [ -d "$dir/.doflow" ]; then
|
|
168
|
-
|
|
169
|
-
|
|
207
|
+
case "$dir/" in
|
|
208
|
+
*/.doflow/*) ;;
|
|
209
|
+
*)
|
|
210
|
+
printf '%s' "$dir/.doflow"
|
|
211
|
+
return 0
|
|
212
|
+
;;
|
|
213
|
+
esac
|
|
170
214
|
fi
|
|
171
215
|
dir="$(dirname "$dir")"
|
|
172
216
|
done
|
|
@@ -353,7 +397,9 @@ Workflow and evidence:
|
|
|
353
397
|
workflow resolve stages, dependencies and gates for a class
|
|
354
398
|
orchestrate start/resume a run: complete stages, skip optional ones, decide gates
|
|
355
399
|
research-request open, list or resolve a feature-stage research question
|
|
356
|
-
task-attempt claim, finish, release
|
|
400
|
+
task-attempt claim, finish, release, start, pause, cancel, resume, inspect, reopen or report-usage on a plan's task attempts
|
|
401
|
+
worker discover, probe, describe, select, run, status or cancel an external headless worker on a claimed task
|
|
402
|
+
dispatch run a feature's task graph: start, step, run, submit, spawn, pause, inspect, cancel, takeover or resume
|
|
357
403
|
retrieve BM25 search over the installed guidance tree (auto-refreshing index)
|
|
358
404
|
model-role resolve an abstract model role to ranked, availability-annotated providers
|
|
359
405
|
route resolve an information need to a healthy provider
|
|
@@ -361,14 +407,30 @@ Workflow and evidence:
|
|
|
361
407
|
claim record or update a claim and its support state
|
|
362
408
|
readiness evaluate readiness; return state and missing items
|
|
363
409
|
context-pack emit the compiled context pack for a stage
|
|
410
|
+
context-emit decide and render one launch, prompt or delta emission (launcher entry)
|
|
411
|
+
context-grant grant one compacted summary to a launched run and lineage
|
|
364
412
|
retrieval-plan declare the needs a stage will resolve, attempt each need, then report every declared item
|
|
365
413
|
outcome record a task's terminal state with its basis, or show what was recorded
|
|
366
414
|
scaffold emit the code scaffold the active feature's artifacts imply
|
|
367
415
|
decision register, list or compact the active feature's decisions
|
|
416
|
+
intake sort, preview, undo, list or file prompt text for the feature's additional-context folder
|
|
368
417
|
followup record, list, take, settle, promote or report what a feature left unfinished
|
|
369
418
|
lifecycle overview, init, status, release or merged: follow-ups and feature tracking for the project
|
|
370
419
|
goal add, check, link, list or close a goal and its checklist
|
|
371
420
|
failure list, settle or switch off the failures DoFlow captured on this machine
|
|
421
|
+
roadmap session-driven autopilot runner: render or status the roadmap table
|
|
422
|
+
plan-check check a plan's task lines the way the task-attempt ledger reads them
|
|
423
|
+
review validate a feature's review/findings.json, print counts and advisories (review-package assembles the payload)
|
|
424
|
+
protocol print the review and debate protocol presets, or the one a run would use (read-only)
|
|
425
|
+
rules print the values the runtime owns for this project, each with its source (read-only)
|
|
426
|
+
primary resolve which harness and model the main session runs (read-only)
|
|
427
|
+
fleet list the projects this machine knows (read-only)
|
|
428
|
+
transcript read an agent's recent events, or the project's traffic (read-only)
|
|
429
|
+
package list the contribution points a package may fill, check a package directory, list/show packages (read-only), add/update a local package (a plan, then --plan applies it), or enable/disable/trust/exempt/revoke/verify/remove one
|
|
430
|
+
slot named machine-wide queue: run a command as its one holder, list or release
|
|
431
|
+
models synchronize, list, or inspect observed models across workers (--action sync|list|describe)
|
|
432
|
+
worktree remove a merged feature's worktree and branch, never by force (--action cleanup --slug <slug>)
|
|
433
|
+
attendance say whether a person is watching a stage (read-only; --task-id <slug> [--run <id>])
|
|
372
434
|
|
|
373
435
|
Verification and recovery:
|
|
374
436
|
verify compile the contract, run checks, emit the report
|
|
@@ -376,7 +438,7 @@ Verification and recovery:
|
|
|
376
438
|
leak-scan report DoFlow-internal identifiers in shipped files
|
|
377
439
|
|
|
378
440
|
Observability:
|
|
379
|
-
trace current run trajectory
|
|
441
|
+
trace current run trajectory; trace spans: the span view; trace analyze: its detectors; trace export: OTLP/HTTP export
|
|
380
442
|
stats aggregate run usage
|
|
381
443
|
indicators per-stage and per-gate timings from the orchestration record
|
|
382
444
|
discover missed opportunities in recorded runs
|
|
@@ -384,6 +446,7 @@ Observability:
|
|
|
384
446
|
capabilities provider resolution
|
|
385
447
|
enforcement verified lifecycle policy coverage
|
|
386
448
|
doctor installation and provider health
|
|
449
|
+
config list effective settings and their origins
|
|
387
450
|
storage report stored data and its retention bounds
|
|
388
451
|
EOF
|
|
389
452
|
}
|
|
@@ -439,12 +502,23 @@ now_ms() {
|
|
|
439
502
|
#
|
|
440
503
|
# Tracing never changes what a verb returned. Every step is failure-tolerant and the function
|
|
441
504
|
# always succeeds: an unwritable state directory degrades observability, not the run.
|
|
505
|
+
#
|
|
506
|
+
# Session identity (082 IC-035, DEC-012, DEC-031, DEC-042): `run`, `lineage` and `attempt` come
|
|
507
|
+
# from the environment only, each written quoted when it matches identity.ts's pattern (ERE, held in
|
|
508
|
+
# a variable so `[[ =~ ]]` reads it unquoted, which bash 3.2 supports) and `null` otherwise. A value
|
|
509
|
+
# that passes holds no quote, backslash or control character, so quoting it cannot break the line.
|
|
510
|
+
# `[[ ]]` is a builtin: the trace starts no process beyond `mkdir` and `date` (NFR-007).
|
|
442
511
|
trace_run() {
|
|
443
512
|
local verb="$1" code="$2" duration="$3" argc="$4" started_at="$5"
|
|
444
513
|
local runs_dir="$CONFIG_DIR/state/runs"
|
|
514
|
+
local id_re='^[A-Za-z0-9][A-Za-z0-9_-]{0,55}$' attempt_re='^[1-9][0-9]{0,3}$'
|
|
515
|
+
local run_v=null lineage_v=null attempt_v=null
|
|
516
|
+
if [[ "${DOFLOW_RUN_ID:-}" =~ $id_re && "${DOFLOW_RUN_ID}" != local ]]; then run_v="\"${DOFLOW_RUN_ID}\""; fi
|
|
517
|
+
if [[ "${DOFLOW_LINEAGE_ID:-}" =~ $id_re ]]; then lineage_v="\"${DOFLOW_LINEAGE_ID}\""; fi
|
|
518
|
+
if [[ "${DOFLOW_ATTEMPT:-}" =~ $attempt_re ]]; then attempt_v="\"${DOFLOW_ATTEMPT}\""; fi
|
|
445
519
|
mkdir -p "$runs_dir" 2>/dev/null || return 0
|
|
446
|
-
printf '{"timestamp":"%s","verb":"%s","exit_code":%s,"duration_ms":%s,"arg_count":%s}\n' \
|
|
447
|
-
"$started_at" "$verb" "$code" "$duration" "$argc" \
|
|
520
|
+
printf '{"timestamp":"%s","verb":"%s","exit_code":%s,"duration_ms":%s,"arg_count":%s,"run":%s,"lineage":%s,"attempt":%s}\n' \
|
|
521
|
+
"$started_at" "$verb" "$code" "$duration" "$argc" "$run_v" "$lineage_v" "$attempt_v" \
|
|
448
522
|
>>"$runs_dir/$(date -u +%Y-%m-%d).jsonl" 2>/dev/null || return 0
|
|
449
523
|
return 0
|
|
450
524
|
}
|
|
@@ -481,8 +555,8 @@ shell_helper_for() {
|
|
|
481
555
|
# command list; an unbuilt verb is dispatched and the CLI answers for itself.
|
|
482
556
|
is_node_verb() {
|
|
483
557
|
case "$1" in
|
|
484
|
-
classify|workflow|route|evidence|claim|readiness|context-pack|retrieval-plan|outcome|scaffold|decision|followup|lifecycle|goal|failure|verify|recover|leak-scan|\
|
|
485
|
-
trace|stats|indicators|discover|inventory|capabilities|enforcement|doctor|orchestrate|research-request|task-attempt|retrieve|model-role|storage|brief-tools|advise) return 0 ;;
|
|
558
|
+
classify|workflow|route|evidence|claim|readiness|context-pack|context-emit|context-grant|retrieval-plan|outcome|scaffold|decision|intake|followup|lifecycle|goal|failure|verify|recover|leak-scan|\
|
|
559
|
+
trace|stats|indicators|discover|inventory|capabilities|enforcement|doctor|config|orchestrate|research-request|task-attempt|worker|dispatch|retrieve|model-role|storage|brief-tools|advise|roadmap|plan-check|review|protocol|rules|primary|fleet|transcript|package|slot|models|worktree|attendance) return 0 ;;
|
|
486
560
|
*) return 1 ;;
|
|
487
561
|
esac
|
|
488
562
|
}
|
|
@@ -502,7 +576,7 @@ dispatch_shell() {
|
|
|
502
576
|
|
|
503
577
|
dispatch_node() {
|
|
504
578
|
local verb="$1"; shift
|
|
505
|
-
local marker tmpfile rc first_line
|
|
579
|
+
local marker tmpfile outfile registry_msg rc first_line runtime_root second_line trimmed_second first_val total_errs more
|
|
506
580
|
if ! resolve_node_cli; then
|
|
507
581
|
if marker="$(has_doflow_marker_nearby)"; then
|
|
508
582
|
fail 2 "unlinked-checkout" \
|
|
@@ -514,17 +588,40 @@ dispatch_node() {
|
|
|
514
588
|
if [ "$NODE_CLI_KIND" = "script" ]; then
|
|
515
589
|
command -v node >/dev/null 2>&1 || fail 2 "node-not-found" \
|
|
516
590
|
"verb '$verb' needs node on PATH to run $NODE_CLI_PATH"
|
|
517
|
-
case "$NODE_CLI_SOURCE" in
|
|
518
|
-
|
|
591
|
+
case "$NODE_CLI_SOURCE:$verb" in
|
|
592
|
+
# `slot run` streams its command's output and holds the queue for as long as the command
|
|
593
|
+
# runs, so its stderr is never held back for the stale-runtime check below.
|
|
594
|
+
*:slot)
|
|
595
|
+
node "$NODE_CLI_PATH" "$verb" "$@"
|
|
596
|
+
;;
|
|
597
|
+
project-runtime:*|global-runtime:*)
|
|
519
598
|
# These two sources are a *projected copy* of the runtime, not the checkout itself, so
|
|
520
599
|
# they can drift out of sync with the working tree's registry. Stdout still streams
|
|
521
600
|
# directly; only stderr is captured, so a version-drift crash can be told apart from a
|
|
522
601
|
# verb legitimately reporting a finding (e.g. readiness's NEEDS_EVIDENCE) before either
|
|
523
602
|
# reaches the caller.
|
|
524
603
|
tmpfile="$(mktemp)"
|
|
525
|
-
|
|
604
|
+
outfile=""
|
|
605
|
+
# `worker` and `dispatch` catch the registry error themselves and, under --json, report it as
|
|
606
|
+
# a JSON body on stdout (error "registry-invalid") with nothing on stderr; the other verbs let
|
|
607
|
+
# it reach stderr. Only those two have stdout held back (their --json body is a single
|
|
608
|
+
# document written at the end), so the same stale-runtime report can be built for them.
|
|
609
|
+
case "$verb" in
|
|
610
|
+
worker|dispatch) if [ "$wants_json" = true ]; then outfile="$(mktemp)"; fi ;;
|
|
611
|
+
esac
|
|
612
|
+
trap 'rm -f "$tmpfile" "$outfile" 2>/dev/null || true' EXIT
|
|
526
613
|
rc=0
|
|
527
|
-
|
|
614
|
+
if [ -n "$outfile" ]; then
|
|
615
|
+
node "$NODE_CLI_PATH" "$verb" "$@" >"$outfile" 2>"$tmpfile" || rc=$?
|
|
616
|
+
if [ "$rc" -eq 2 ]; then
|
|
617
|
+
registry_msg="$(node -e 'try{const o=JSON.parse(require("fs").readFileSync(process.argv[1],"utf8"));if(o&&o.error==="registry-invalid"&&typeof o.message==="string")process.stdout.write(o.message)}catch{}' "$outfile" 2>/dev/null)" || registry_msg=""
|
|
618
|
+
if [ -n "$registry_msg" ]; then
|
|
619
|
+
printf '[ERROR] %s\n' "$registry_msg" >"$tmpfile"
|
|
620
|
+
fi
|
|
621
|
+
fi
|
|
622
|
+
else
|
|
623
|
+
node "$NODE_CLI_PATH" "$verb" "$@" 2>"$tmpfile" || rc=$?
|
|
624
|
+
fi
|
|
528
625
|
if [ "$rc" -ne 0 ]; then
|
|
529
626
|
first_line=""
|
|
530
627
|
IFS= read -r first_line <"$tmpfile" || true
|
|
@@ -533,13 +630,34 @@ dispatch_node() {
|
|
|
533
630
|
# anchored match against the registry loader's raw prefix never fires in practice.
|
|
534
631
|
case "$first_line" in
|
|
535
632
|
*"Invalid DoFlow registry:"*)
|
|
633
|
+
runtime_root="$(dirname "$(dirname "$NODE_CLI_PATH")")"
|
|
634
|
+
second_line=""
|
|
635
|
+
{
|
|
636
|
+
read -r _
|
|
637
|
+
IFS= read -r second_line || true
|
|
638
|
+
} <"$tmpfile"
|
|
639
|
+
second_line="${second_line%$'\r'}"
|
|
640
|
+
trimmed_second="${second_line#"${second_line%%[![:space:]]*}"}"
|
|
641
|
+
first_val="${trimmed_second#- }"
|
|
642
|
+
if [ -z "$first_val" ]; then
|
|
643
|
+
first_val="${first_line#*Invalid DoFlow registry:}"
|
|
644
|
+
first_val="${first_val#"${first_val%%[![:space:]]*}"}"
|
|
645
|
+
fi
|
|
646
|
+
first_val="${first_val%$'\r'}"
|
|
647
|
+
total_errs="$(grep -c '^[[:space:]]*- ' "$tmpfile" || true)"
|
|
648
|
+
case "$total_errs" in *[!0-9]*|"") total_errs=0 ;; esac
|
|
649
|
+
more=""
|
|
650
|
+
if [ "$total_errs" -gt 1 ]; then
|
|
651
|
+
more=" ($(( total_errs - 1 )) more)"
|
|
652
|
+
fi
|
|
536
653
|
fail 2 "stale-runtime" \
|
|
537
|
-
"verb '$verb' failed
|
|
654
|
+
"verb '$verb' failed: the registry at $runtime_root/core/registry is invalid: $first_val$more; reinstall DoFlow if this runtime was projected from another version"
|
|
538
655
|
;;
|
|
539
656
|
esac
|
|
540
657
|
fi
|
|
658
|
+
if [ -n "$outfile" ]; then cat "$outfile"; fi
|
|
541
659
|
cat "$tmpfile" >&2
|
|
542
|
-
rm -f "$tmpfile"
|
|
660
|
+
rm -f "$tmpfile" "$outfile"
|
|
543
661
|
trap - EXIT
|
|
544
662
|
return "$rc"
|
|
545
663
|
;;
|
|
@@ -18,7 +18,7 @@ Universal command dispatcher, task decomposer, capability router, and developmen
|
|
|
18
18
|
|
|
19
19
|
1. **Session & Command Dispatch**:
|
|
20
20
|
- If invoked with no arguments or `--help`, announce DoFlow session status and display the core command reference.
|
|
21
|
-
- If `$1` matches a
|
|
21
|
+
- If `$1` matches a `/do-*` skill in the Core Command Reference table below, forward to that skill directly.
|
|
22
22
|
- Otherwise, resolve the runtime seam **once** and reuse `$DOFLOW` for every later call here:
|
|
23
23
|
|
|
24
24
|
```bash
|
|
@@ -35,21 +35,25 @@ Run every command below from the project root — the walk-up starts at `$PWD`.
|
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
- `/do maintain` (`$1` is `maintain`): note the start time `T`, run
|
|
38
|
-
`doflow-run lifecycle --action overview --maintain --since T --json` (`doflow-run` is the
|
|
38
|
+
`doflow-run lifecycle --action overview --maintain --since T --view brief --json` (`doflow-run` is the
|
|
39
39
|
`$DOFLOW` resolved above), and settle each pending item with the question tool through the
|
|
40
40
|
`doflow-run followup`, `doflow-run goal` or `doflow-run failure` command its `next` lines give.
|
|
41
|
+
Advice on a follow-up: `references/advice_calls.md`, followup-triage.
|
|
41
42
|
Rerun with the same `--since T` until nothing is pending. A product problem the user reports
|
|
42
43
|
goes to `doflow-run followup --action report`; a large goal they state, to
|
|
43
44
|
`doflow-run goal --action add`. It edits no source file.
|
|
45
|
+
- `/do program <goal>`, or an ask larger than one feature: follow `references/program_mode.md`, researching per
|
|
46
|
+
`../do-document/references/deep_research.md` at the tiers the guidance tree's `references/MODEL_SELECTION.md` gives.
|
|
47
|
+
- `/do package <idea>` or "make this a DoFlow extension/package/plugin": run `"$DOFLOW" package --action points --json`; stop if a needed point is not open. Ask up to 3 questions (what/why, id, points) via the question tool; run `"$DOFLOW" package --action new --id <id> --points <point[:local],...>`; follow `next` lines. No evidence batch; never write `grants.jsonl`, add remote sources or create a feature folder.
|
|
44
48
|
|
|
45
49
|
2. **Multi-Part / Ambiguous Request Routing (`--depth`)**:
|
|
46
50
|
- When a request bundles 2+ unrelated asks across different files or domains, verify referenced files exist first.
|
|
47
51
|
- Decompose into independent or sequenced work packages, then propose **one task class per
|
|
48
|
-
package** and let the runtime validate each: `"$DOFLOW" classify --task-class "<proposed>" --calling-skill do
|
|
52
|
+
package** and let the runtime validate each: `"$DOFLOW" classify --task-class "<proposed>" --calling-skill do (--request-file <file> | --request <shell-escaped argument>) --view brief --json`. Always pass the request. Prefer `--request-file`: create a temporary UTF-8 file with `mktemp`, write the verbatim request as the body of a single-quoted heredoc whose delimiter does not occur on any request line, pass only its path, and install cleanup traps plus explicit removal. Never interpolate raw request text into a shell command or word; use `--request` only as one safely shell-escaped argument, and omit the optional opinion if safe transport is unavailable. The flags are mutually exclusive.
|
|
49
53
|
|
|
50
54
|
When the JSON carries `secondOpinion.status: "answered"` with `agrees: false`, tell the user the decision model picked a different class, in one line naming both; the verdict stands, and no other action follows from it.
|
|
51
55
|
|
|
52
|
-
Branch on
|
|
56
|
+
Branch on `outcome`, not the exit code.
|
|
53
57
|
- **`ACCEPTED`** — the returned `workflow` is this run's plan of record; read `stages`, `gates` and `handoff` off it rather than from memory.
|
|
54
58
|
- **`REJECTED`** — **stop.** Print `message` verbatim (it already names `validClasses` and any `suggestions`), ask the user to choose from `validClasses`, then re-validate. Never substitute `feature`.
|
|
55
59
|
A rejection may be about **you** rather than the class (`reason: caller-not-a-stage`). Then the fix is to propose one of the classes in `fit.hostingClasses`, or to hand the work to the skill this class names for the stage you meant — not to re-propose the same class.
|
|
@@ -64,17 +68,14 @@ Route each package to the accepted workflow's first stage. A workflow whose `sta
|
|
|
64
68
|
that does the package's work is a misclassification — re-propose the class rather than routing the
|
|
65
69
|
package under one the runtime accepted for a different kind of task.
|
|
66
70
|
|
|
71
|
+
Advice on a worker's tier: `references/advice_calls.md`, tier.
|
|
72
|
+
|
|
67
73
|
- For detailed decomposition and dependency graph formatting, consult this skill's own
|
|
68
|
-
`references/pm_routing.md
|
|
74
|
+
`references/pm_routing.md`; before dispatching agents, read the guidance tree's
|
|
75
|
+
`references/ORCHESTRATION.md` and `references/MODEL_SELECTION.md`.
|
|
69
76
|
|
|
70
77
|
3. **Capability & Tool Selection**:
|
|
71
|
-
- Before routing, check
|
|
72
|
-
(reuse `$DOFLOW` resolved in step 1). **It exits 1 when there is a finding — that is signal,
|
|
73
|
-
not failure; never treat that exit code as an error.** When the analysis cannot be settled
|
|
74
|
-
from the recorded metadata, `discover` reports `UNKNOWN` rather than "clear"; surface `UNKNOWN`
|
|
75
|
-
as undetermined and never round it up to "no missed opportunities". `do` surfaces the finding
|
|
76
|
-
to the user — it takes no automatic action on it, and no finding is ever rendered as a number,
|
|
77
|
-
a percentage, or a confidence.
|
|
78
|
+
- Before routing, run `"$DOFLOW" discover --json` to check recorded runs. Exit 1 signals a finding, not an error. When metadata cannot settle the analysis, surface `UNKNOWN` as undetermined, never clear. Show findings to the user; take no automatic action. Never render findings as a number, percentage or confidence.
|
|
78
79
|
- Routing an information need to a tool is unconditional, not a mode this skill can be asked
|
|
79
80
|
for: whenever a search, graph, or testing need arises, query the Capability Router — run `"$DOFLOW" capabilities` (add `--json` to parse, `--check` for a deep
|
|
80
81
|
smoke check), or `"$DOFLOW" route --intent <intent> --json` to resolve one need end to end. It
|
|
@@ -82,6 +83,7 @@ package under one the runtime accepted for a different kind of task.
|
|
|
82
83
|
Ripgrep when absent, and a static table cannot know that.
|
|
83
84
|
- Consult this skill's own `references/tool_matrix.md` for the intent→capability map and the two
|
|
84
85
|
fallback layers. Treat the router's output as authoritative when the two disagree.
|
|
86
|
+
- Advice on an MCP server's trigger: `references/advice_calls.md`, mcp-need.
|
|
85
87
|
|
|
86
88
|
4. **Scope & Effort Estimation (`--estimate`)**:
|
|
87
89
|
- When asked for sizing, complexity, or timeline estimates, produce a range anchored against git history and file scope, stating the assumptions that set its width and the unknowns that would narrow it. Never attach a numeric or percentage certainty to the range — the assumptions are the honest expression of what is not yet known.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Advice calls
|
|
2
|
+
|
|
3
|
+
Optional. Skip a call and its outcome call unless `status` is `answered`; on `agrees: false` say so in one line and keep your judgement. `classify` asks `task-class` itself.
|
|
4
|
+
|
|
5
|
+
## tier
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
"$DOFLOW" advise --kind tier --state "<the package>" --static "<light|standard|frontier>" --task-id "<task id>" --json
|
|
9
|
+
"$DOFLOW" advise --action outcome --pick-id "<pickId>" --actual "<tier used>"
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## mcp-need
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
"$DOFLOW" advise --kind mcp-need --server <id> --state "<the stage>" --static <yes|no> --task-id "<task id>" --json
|
|
16
|
+
"$DOFLOW" advise --action outcome --pick-id "<pickId>" --actual "<yes|no: server used>"
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## followup-triage
|
|
20
|
+
|
|
21
|
+
No `--static`; the pick is input to the question.
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
"$DOFLOW" advise --kind followup-triage --state "<its text>" --task-id "<its id>" --json
|
|
25
|
+
"$DOFLOW" advise --action outcome --pick-id "<pickId>" --actual "<now|later|dismiss>"
|
|
26
|
+
```
|
|
@@ -7,8 +7,7 @@ Decomposition depth guidelines when `/do` processes multi-part, cross-domain req
|
|
|
7
7
|
Produce a flat table: Part | Domain | Target Skill / Agent | Completion Gate
|
|
8
8
|
- `--depth normal` (Shared context or sequence dependencies):
|
|
9
9
|
Produce the shallow table plus an explicit dependency check (e.g., API contract before UI binding).
|
|
10
|
-
- `--depth deep` (
|
|
11
|
-
Full Epic $\rightarrow$ Story $\rightarrow$ Task hierarchy ready for `/do-plan`.
|
|
10
|
+
- `--depth deep` (programme-sized: more than one feature): program mode, `program_mode.md`.
|
|
12
11
|
|
|
13
12
|
## Delegation Matrix
|
|
14
13
|
- Feature discovery $\rightarrow$ `/do-brainstorm`
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Program mode
|
|
2
|
+
|
|
3
|
+
For an ask larger than one feature: research, offer roadmap shapes, hand over a checked draft. It
|
|
4
|
+
writes no roadmap row and edits no source.
|
|
5
|
+
|
|
6
|
+
1. **Enter.** `/do program <goal>` enters. An ask naming more than one independently shippable
|
|
7
|
+
outcome may enter: name the signal in one line and ask with the question tool (program mode
|
|
8
|
+
first, "one feature" second) before any research. Anything else routes as before.
|
|
9
|
+
2. **Contract.** Write the sub-questions the roadmap needs (users, scope edges, existing surfaces,
|
|
10
|
+
ordering risks), at most 6. Task id: `program-<kebab-of-goal>`.
|
|
11
|
+
3. **Research.** One broad round over the whole goal, then one targeted round per sub-question, per
|
|
12
|
+
`../do-document/references/deep_research.md` (no report file), at most 6 sources each. Run
|
|
13
|
+
independent sub-questions as parallel subagents where the harness has them, else in turn, at the
|
|
14
|
+
tier the guidance tree's `references/MODEL_SELECTION.md` gives: `light` to scout or extract,
|
|
15
|
+
`standard` to research, `frontier` to judge and pick shapes. Mark each finding sourced (with its
|
|
16
|
+
locator) or inferred. Stop when every sub-question has an answer or a stated gap and the last
|
|
17
|
+
round added nothing; report the gaps. Record one evidence batch and one claim per conclusion
|
|
18
|
+
under this task id with SKILL.md step 5's commands, per the guidance tree's
|
|
19
|
+
`references/EVIDENCE_LEDGER.md`.
|
|
20
|
+
4. **Shapes.** Offer two or three roadmap shapes through the question tool, recommended first: rows
|
|
21
|
+
in outline, order and the main trade-off. One viable shape: say why the others fell.
|
|
22
|
+
5. **Draft.** Write the chosen shape as `{"schema":1,"rows":[...]}`: per row `id`, `slug`, `title`,
|
|
23
|
+
`class`, `needs`, a rough `writeSet`, one-line `intent`, at most 8 `acceptance` lines; nothing a
|
|
24
|
+
row's own chain decides later. New rows go to `agent-docs/roadmap/draft.json` with ids above the
|
|
25
|
+
store's highest; changes to rows not started go to `agent-docs/roadmap/draft-amend.json`. Ask
|
|
26
|
+
before overwriting either file.
|
|
27
|
+
6. **Check.** Run `"$DOFLOW" roadmap seed --action check --draft <path> --json` per draft. Fix the
|
|
28
|
+
findings and re-check, at most 3 times; every row of a draft must carry the same `change`. Show
|
|
29
|
+
the result line, overlaps, `alone` rows and gaps. A draft with findings is not ready.
|
|
30
|
+
7. **Hand over.** Show the person the `land` command `check` printed and stop. Landing is the
|
|
31
|
+
person's act: never run it, and never hand it to a subagent, a policy or autopilot.
|