@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
|
@@ -21,6 +21,14 @@
|
|
|
21
21
|
"Bash(git push --force*:*)",
|
|
22
22
|
"Bash(git reset --hard*:*)",
|
|
23
23
|
"Bash(git clean -fd*:*)"
|
|
24
|
+
],
|
|
25
|
+
"ask": [
|
|
26
|
+
"Bash(git push:*)",
|
|
27
|
+
"Bash(git tag:*)",
|
|
28
|
+
"Bash(git * push:*)",
|
|
29
|
+
"Bash(git * tag:*)",
|
|
30
|
+
"Bash(git * push)",
|
|
31
|
+
"Bash(git * tag)"
|
|
24
32
|
]
|
|
25
33
|
},
|
|
26
34
|
"alwaysThinkingEnabled": true,
|
|
@@ -87,15 +95,6 @@
|
|
|
87
95
|
}
|
|
88
96
|
],
|
|
89
97
|
"PreToolUse": [
|
|
90
|
-
{
|
|
91
|
-
"matcher": "Bash",
|
|
92
|
-
"hooks": [
|
|
93
|
-
{
|
|
94
|
-
"type": "command",
|
|
95
|
-
"command": "~/.claude/hooks/pre-bash-guard.sh"
|
|
96
|
-
}
|
|
97
|
-
]
|
|
98
|
-
},
|
|
99
98
|
{
|
|
100
99
|
"matcher": "mcp__.*",
|
|
101
100
|
"hooks": [
|
|
@@ -116,6 +115,15 @@
|
|
|
116
115
|
}
|
|
117
116
|
],
|
|
118
117
|
"PostToolUse": [
|
|
118
|
+
{
|
|
119
|
+
"matcher": "Bash",
|
|
120
|
+
"hooks": [
|
|
121
|
+
{
|
|
122
|
+
"type": "command",
|
|
123
|
+
"command": "~/.claude/hooks/post-shell-observe.sh PostToolUse"
|
|
124
|
+
}
|
|
125
|
+
]
|
|
126
|
+
},
|
|
119
127
|
{
|
|
120
128
|
"matcher": "Edit",
|
|
121
129
|
"hooks": [
|
|
@@ -176,6 +184,15 @@
|
|
|
176
184
|
}
|
|
177
185
|
],
|
|
178
186
|
"PostToolUseFailure": [
|
|
187
|
+
{
|
|
188
|
+
"matcher": "Bash",
|
|
189
|
+
"hooks": [
|
|
190
|
+
{
|
|
191
|
+
"type": "command",
|
|
192
|
+
"command": "~/.claude/hooks/post-shell-observe.sh PostToolUseFailure"
|
|
193
|
+
}
|
|
194
|
+
]
|
|
195
|
+
},
|
|
179
196
|
{
|
|
180
197
|
"matcher": ".*",
|
|
181
198
|
"hooks": [
|
|
@@ -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
|
# doflow-statusline — Claude Code status line fed by DoFlow's neutral state.
|
|
3
4
|
#
|
|
4
5
|
# Claude Code pipes one session-state JSON document to stdin; whatever this script prints becomes
|
|
@@ -4,4 +4,5 @@ developer_instructions = """
|
|
|
4
4
|
Implement features and refactor code strictly according to approved designs and task checklists.
|
|
5
5
|
Optimize algorithms, reduce complexity, and maintain polyglot code quality across the codebase.
|
|
6
6
|
Ensure changes pass all existing tests and conform to language-specific standards.
|
|
7
|
+
End the report with one line `Status: <status>`, where the status is one of `done`, `done-with-concerns`, `needs-context`, `blocked`.
|
|
7
8
|
"""
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
name = "delivery-lead"
|
|
2
|
+
description = "Delivery lead that plans a feature's tasks, briefs and dispatches workers, verifies their evidence, and commits."
|
|
3
|
+
developer_instructions = """
|
|
4
|
+
Plan the tasks of one feature or package, brief each worker with goal, context, write set, rules, acceptance command and report format, and dispatch in parallel only when write sets are disjoint.
|
|
5
|
+
Accept a fix only with a test red on the base and green after, plus a negative control; never weaken an assertion.
|
|
6
|
+
Commit one logical item at a time with explicit paths; stop and return options on an unrequested contract change or a permission denial.
|
|
7
|
+
Write no product code and no tests yourself: workers do.
|
|
8
|
+
Branch on each hand-back's status: `needs-context` resend with the missing context; `blocked` stop and surface it; `done-with-concerns` verify the concerns before accepting; `done` accept.
|
|
9
|
+
End the report with one line `Status: <status>`, where the status is one of `done`, `done-with-concerns`, `needs-context`, `blocked`.
|
|
10
|
+
"""
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
name = "quality-guardian"
|
|
2
2
|
description = "Specialist quality and security engineer for automated testing, security audits, and root cause analysis."
|
|
3
|
-
sandbox_mode = "read-only"
|
|
4
3
|
developer_instructions = """
|
|
5
4
|
Author and run comprehensive test suites, audit code for security vulnerabilities, and diagnose root causes.
|
|
6
5
|
Verify adherence to SOLID principles, check error handling boundaries, and analyze reproduction traces.
|
|
7
6
|
Stay in audit mode: do not modify business logic code directly without an approved fix plan.
|
|
7
|
+
End the report with one line `Status: <status>`, where the status is one of `done`, `done-with-concerns`, `needs-context`, `blocked`.
|
|
8
8
|
"""
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
name = "research-writer"
|
|
2
2
|
description = "Specialist research and technical writing agent for documentation, architecture indices, and web research."
|
|
3
|
-
sandbox_mode = "read-only"
|
|
4
3
|
developer_instructions = """
|
|
5
4
|
Conduct deep web research with cited sources and write comprehensive technical documentation.
|
|
6
5
|
Create project architecture indices and implementation flow summaries capturing architectural trade-offs.
|
|
7
6
|
Stay in documentation mode: do not modify workspace source code.
|
|
7
|
+
End the report with one line `Status: <status>`, where the status is one of `done`, `done-with-concerns`, `needs-context`, `blocked`.
|
|
8
8
|
"""
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
name = "reviewer"
|
|
2
|
+
description = "Read-only reviewer of a change it did not write: evidenced defects, severity, and round-two replies."
|
|
3
|
+
sandbox_mode = "read-only"
|
|
4
|
+
developer_instructions = """
|
|
5
|
+
Review a change written by another agent and model; decline work your own model or agent wrote.
|
|
6
|
+
Back each defect with path:line plus a reproducer you ran or an exact input-to-wrong-output chain, else report it as a note; mark SOURCE or INFERENCE and severity blocker, should-fix or note.
|
|
7
|
+
Run tests only in a scratch copy of the reviewed head and kill every process you start.
|
|
8
|
+
Stay in review mode: do not modify repository files; write only your own report.
|
|
9
|
+
End the report with one line `Status: <status>`, where the status is one of `done`, `done-with-concerns`, `needs-context`, `blocked`.
|
|
10
|
+
"""
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
name = "spec-analyst"
|
|
2
2
|
description = "Specialist agent for requirements discovery, user story breakdown, and estimation."
|
|
3
|
-
sandbox_mode = "read-only"
|
|
4
3
|
developer_instructions = """
|
|
5
4
|
Elicit requirements through Socratic dialogue focusing on user value and business goals.
|
|
6
5
|
Decompose initiatives into user stories with testable acceptance criteria and estimate effort.
|
|
7
6
|
Stay in planning mode: do not implement code or modify workspace files.
|
|
7
|
+
End the report with one line `Status: <status>`, where the status is one of `done`, `done-with-concerns`, `needs-context`, `blocked`.
|
|
8
8
|
"""
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
name = "system-architect"
|
|
2
2
|
description = "Specialist architect agent for system design, API contracts, and infrastructure."
|
|
3
|
-
sandbox_mode = "read-only"
|
|
4
3
|
developer_instructions = """
|
|
5
4
|
Design scalable systems with explicit component boundaries, interfaces, dependencies, and trade-offs.
|
|
6
5
|
Evaluate architecture decisions for maintainability, resilience, operational impact, and future change.
|
|
7
6
|
Document clear recommendations with alternatives and validation criteria.
|
|
8
7
|
Stay in planning mode: do not implement code or modify workspace files.
|
|
8
|
+
End the report with one line `Status: <status>`, where the status is one of `done`, `done-with-concerns`, `needs-context`, `blocked`.
|
|
9
9
|
"""
|
|
@@ -43,16 +43,6 @@
|
|
|
43
43
|
}
|
|
44
44
|
],
|
|
45
45
|
"PreToolUse": [
|
|
46
|
-
{
|
|
47
|
-
"matcher": "^Bash$",
|
|
48
|
-
"hooks": [
|
|
49
|
-
{
|
|
50
|
-
"type": "command",
|
|
51
|
-
"command": "bash \"$(root=$(git rev-parse --show-toplevel 2>/dev/null) && [ -f \"$root/.codex/hooks/pre-bash-guard.sh\" ] && printf '%s/.codex/hooks/pre-bash-guard.sh' \"$root\" || printf '%s/hooks/pre-bash-guard.sh' \"${CODEX_HOME:-$HOME/.codex}\")\"",
|
|
52
|
-
"statusMessage": "Checking command safety"
|
|
53
|
-
}
|
|
54
|
-
]
|
|
55
|
-
},
|
|
56
46
|
{
|
|
57
47
|
"matcher": "^mcp__.*",
|
|
58
48
|
"hooks": [
|
|
@@ -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
|
# lib.sh — shared constants and helpers for session lifecycle hooks
|
|
3
4
|
#
|
|
4
5
|
# Usage: source "$(dirname "$0")/lib.sh"
|
|
@@ -17,13 +18,30 @@ set -euo pipefail
|
|
|
17
18
|
|
|
18
19
|
# ── State directories ────────────────────────────────────────────────────────
|
|
19
20
|
|
|
20
|
-
# XDG-compliant, agent-agnostic store shared by
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
# XDG-compliant, agent-agnostic store shared by every harness DoFlow supports, under the config home
|
|
22
|
+
# (doflow_config_home: an absolute XDG_CONFIG_HOME, else an absolute HOME + /.config, else none). With
|
|
23
|
+
# no config home every state path below is empty, sourcing this file still never exits, and each state
|
|
24
|
+
# function returns 0 at once: session work is skipped and a guard reaches its own decision (086 IC-010).
|
|
25
|
+
# BEGIN doflow-config-home v1 (rule: src/runtime/config-home.js; checked by test/guards/settings.test.js)
|
|
26
|
+
doflow_config_home() {
|
|
27
|
+
DOFLOW_HOME=""
|
|
28
|
+
case "${XDG_CONFIG_HOME:-}" in
|
|
29
|
+
/*) DOFLOW_HOME="${XDG_CONFIG_HOME}/doflow"; return 0 ;;
|
|
30
|
+
[A-Za-z]:[\\/]*) case "${OSTYPE:-}" in msys*|cygwin*|win32*) DOFLOW_HOME="${XDG_CONFIG_HOME}/doflow"; return 0 ;; esac ;;
|
|
31
|
+
esac
|
|
32
|
+
case "${HOME:-}" in
|
|
33
|
+
/*) DOFLOW_HOME="${HOME}/.config/doflow" ;;
|
|
34
|
+
[A-Za-z]:[\\/]*) case "${OSTYPE:-}" in msys*|cygwin*|win32*) DOFLOW_HOME="${HOME}/.config/doflow" ;; esac ;;
|
|
35
|
+
esac
|
|
36
|
+
return 0
|
|
37
|
+
}
|
|
38
|
+
# END doflow-config-home v1
|
|
39
|
+
doflow_config_home
|
|
40
|
+
STATE_DIR="${DOFLOW_HOME:+$DOFLOW_HOME/session-env}"
|
|
41
|
+
SESSION_DIR="${STATE_DIR:+$STATE_DIR/sessions}"
|
|
42
|
+
PROJECTS_DIR="${STATE_DIR:+$STATE_DIR/projects}"
|
|
25
43
|
# shellcheck disable=SC2034 # used by session-start.sh and session-end.sh which source this file
|
|
26
|
-
SESSIONS_LOG="$DOFLOW_HOME/sessions.log"
|
|
44
|
+
SESSIONS_LOG="${DOFLOW_HOME:+$DOFLOW_HOME/sessions.log}"
|
|
27
45
|
|
|
28
46
|
# Identifies which agent is running. Override via env var for non-Claude agents.
|
|
29
47
|
export DOFLOW_AGENT="${DOFLOW_AGENT:-unknown}"
|
|
@@ -278,6 +296,7 @@ has_uncommitted_changes() {
|
|
|
278
296
|
# Safe to call multiple times (mkdir -p is idempotent).
|
|
279
297
|
ensure_session_dir() {
|
|
280
298
|
local session_id="$1"
|
|
299
|
+
[ -n "$SESSION_DIR" ] || return 0
|
|
281
300
|
mkdir -p "$SESSION_DIR/$session_id"
|
|
282
301
|
echo "$SESSION_DIR/$session_id"
|
|
283
302
|
}
|
|
@@ -287,6 +306,7 @@ ensure_session_dir() {
|
|
|
287
306
|
ensure_project_dir() {
|
|
288
307
|
local cwd="$1"
|
|
289
308
|
local hash
|
|
309
|
+
[ -n "$PROJECTS_DIR" ] || return 0
|
|
290
310
|
hash=$(cwd_hash "$cwd")
|
|
291
311
|
mkdir -p "$PROJECTS_DIR/$hash"
|
|
292
312
|
echo "$PROJECTS_DIR/$hash"
|
|
@@ -314,22 +334,21 @@ require_jq() {
|
|
|
314
334
|
fi
|
|
315
335
|
}
|
|
316
336
|
|
|
317
|
-
# ── Session role
|
|
318
|
-
|
|
319
|
-
#
|
|
320
|
-
#
|
|
321
|
-
#
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
""
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
}
|
|
337
|
+
# ── Session role and identity ─────────────────────────────────────────────────
|
|
338
|
+
|
|
339
|
+
# doflow_session_role comes from the shared identity.sh, its only definition (IC-009). When an
|
|
340
|
+
# install lacks that file, the session is a worker and the broken install is captured as
|
|
341
|
+
# identity-missing: a worker writes and claims nothing, so a broken install cannot leak context.
|
|
342
|
+
if [ -f "${BASH_SOURCE[0]%/*}/../../.doflow/shared/hooks/policies/identity.sh" ]; then
|
|
343
|
+
. "${BASH_SOURCE[0]%/*}/../../.doflow/shared/hooks/policies/identity.sh"
|
|
344
|
+
else
|
|
345
|
+
doflow_session_role() {
|
|
346
|
+
local policy="${0##*/}"
|
|
347
|
+
policy="${policy%.sh}"
|
|
348
|
+
policy="${policy%.impl}"
|
|
349
|
+
( . "${BASH_SOURCE[0]%/*}/../../.doflow/shared/hooks/policies/capture-failure.sh" \
|
|
350
|
+
&& doflow_capture_failure "$policy" identity-missing ) >/dev/null 2>&1 || true
|
|
351
|
+
printf 'worker\n'
|
|
352
|
+
return 0
|
|
353
|
+
}
|
|
354
|
+
fi
|
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
set -uo pipefail
|
|
4
4
|
export DOFLOW_AGENT="${DOFLOW_AGENT:-codex}"
|
|
5
5
|
if ! . "$(dirname "$0")/../../.doflow/shared/hooks/bridge/bridge.sh" 2>/dev/null; then
|
|
6
|
-
|
|
6
|
+
# D1: a missing bridge allows. Only DOFLOW_FAULT_PROFILE=strict-1, a person's opt-in, denies.
|
|
7
|
+
if [ "${DOFLOW_FAULT_PROFILE:-}" = strict-1 ]; then
|
|
8
|
+
printf '%s\n' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"[doflow] shared hooks lack the bridge; run: doflow update -t codex"}}'
|
|
9
|
+
fi
|
|
7
10
|
exit 0
|
|
8
11
|
fi
|
|
9
12
|
doflow_bridge codex PreToolUse mcp-tool-guard
|
|
@@ -19,11 +19,13 @@ INPUT=$(cat)
|
|
|
19
19
|
SESSION_ID=$(json_field "$INPUT" ".session_id")
|
|
20
20
|
TOOL_NAME=$(json_field "$INPUT" ".tool_name")
|
|
21
21
|
|
|
22
|
-
# Only handle Edit/Write (Claude
|
|
22
|
+
# Only handle Edit/Write (Claude) and apply_patch (Codex's edit tool name)
|
|
23
23
|
[[ "$TOOL_NAME" != "Edit" && "$TOOL_NAME" != "Write" && "$TOOL_NAME" != "apply_patch" ]] && exit 0
|
|
24
24
|
|
|
25
25
|
# Guard: if we can't determine the session, nothing to do
|
|
26
26
|
[[ -z "$SESSION_ID" ]] && exit 0
|
|
27
|
+
# No config home (lib.sh leaves the state paths empty): no session store to write (086 IC-010).
|
|
28
|
+
[[ -n "$SESSION_DIR" ]] || exit 0
|
|
27
29
|
|
|
28
30
|
SESSION_PATH=$(ensure_session_dir "$SESSION_ID")
|
|
29
31
|
|
|
@@ -1,16 +1,20 @@
|
|
|
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
|
# pre-compact.impl.sh — PreCompact hook (Codex-specific output shape)
|
|
3
4
|
#
|
|
4
5
|
# Codex's PreCompact output schema (codex-rs/hooks/src/schema.rs::PreCompactCommandOutputWire)
|
|
5
6
|
# flattens only HookUniversalOutputWire (continue/stopReason/suppressOutput/systemMessage) and
|
|
6
7
|
# rejects unknown fields — there is no additionalContext-style field for PreCompact, and the
|
|
7
|
-
# output MUST be valid JSON, unlike Claude's PreCompact hook,
|
|
8
|
-
#
|
|
9
|
-
# does, but emits it as a JSON
|
|
10
|
-
# systemMessage
|
|
11
|
-
#
|
|
12
|
-
#
|
|
13
|
-
#
|
|
8
|
+
# output MUST be valid JSON, unlike Claude's PreCompact hook, whose plain stdout was observed in
|
|
9
|
+
# Claude Code 2.1.304 and 2.1.308 to be read as custom_instructions, undocumented (FU-w563w2). This script
|
|
10
|
+
# gathers the same git-state context Claude's pre-compact.sh does, but emits it as a JSON
|
|
11
|
+
# systemMessage instead — the closest available field, though systemMessage's exact downstream
|
|
12
|
+
# effect on compaction content is not confirmed (that Claude's custom_instructions reach the
|
|
13
|
+
# compaction LLM call is observed in Claude Code 2.1.304 and 2.1.308, undocumented (FU-w563w2); Codex's docs
|
|
14
|
+
# do not state that systemMessage receives the same treatment). Treat this as best-effort context
|
|
15
|
+
# surfacing, not a guaranteed compaction-summary injection, until verified against a live Codex
|
|
16
|
+
# session.
|
|
17
|
+
# The shared compaction text comes from compact-text.sh (IC-001/IC-002).
|
|
14
18
|
#
|
|
15
19
|
# Must never exit non-zero or block (PreCompact hooks do not support a block decision in Codex).
|
|
16
20
|
|
|
@@ -22,25 +26,24 @@ require_jq
|
|
|
22
26
|
INPUT=$(cat)
|
|
23
27
|
CWD=$(json_field "$INPUT" ".cwd")
|
|
24
28
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
else
|
|
38
|
-
MSG=$(printf 'Include in compact summary:\n- cwd: %s (not a git repository)\nPreserve: decisions made, files modified, open questions, planned next steps.' \
|
|
39
|
-
"${CWD:-unknown}")
|
|
29
|
+
# Rule compact-instructions.instructions (DEC-023) decides whether this hook emits; it is
|
|
30
|
+
# `include` for both roles, so the output below is unchanged. The role comes from the shared
|
|
31
|
+
# identity.sh, read silently: this hook never wrote the role diagnostic and does not start now.
|
|
32
|
+
POLICIES="$(dirname "$0")/../../.doflow/shared/hooks/policies"
|
|
33
|
+
[[ -f "$POLICIES/emission-rules.sh" ]] || POLICIES="$(dirname "$0")/../../shared/hooks/policies"
|
|
34
|
+
_DF_ROLE=worker
|
|
35
|
+
if declare -F _doflow_role_resolve >/dev/null 2>&1; then _doflow_role_resolve 2>/dev/null; fi
|
|
36
|
+
DF_ACTION=skip
|
|
37
|
+
if [[ -f "$POLICIES/emission-rules.sh" ]]; then
|
|
38
|
+
# shellcheck source=/dev/null
|
|
39
|
+
. "$POLICIES/emission-rules.sh"
|
|
40
|
+
doflow_emission_rule compact-instructions.instructions "$_DF_ROLE"
|
|
40
41
|
fi
|
|
42
|
+
[[ "$DF_ACTION" == include ]] || exit 0
|
|
41
43
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
[[ -f "$POLICIES/compact-text.sh" ]] || exit 0
|
|
45
|
+
# shellcheck source=/dev/null
|
|
46
|
+
source "$POLICIES/compact-text.sh"
|
|
47
|
+
doflow_compact_text "$CWD"
|
|
48
|
+
jq -n --arg systemMessage "$DF_COMPACT_TEXT" '{systemMessage: $systemMessage}'
|
|
46
49
|
exit 0
|
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
set -uo pipefail
|
|
4
4
|
export DOFLOW_AGENT="${DOFLOW_AGENT:-codex}"
|
|
5
5
|
if ! . "$(dirname "$0")/../../.doflow/shared/hooks/bridge/bridge.sh" 2>/dev/null; then
|
|
6
|
-
|
|
6
|
+
# D1: a missing bridge allows. Only DOFLOW_FAULT_PROFILE=strict-1, a person's opt-in, denies.
|
|
7
|
+
if [ "${DOFLOW_FAULT_PROFILE:-}" = strict-1 ]; then
|
|
8
|
+
printf '%s\n' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"[doflow] shared hooks lack the bridge; run: doflow update -t codex"}}'
|
|
9
|
+
fi
|
|
7
10
|
exit 0
|
|
8
11
|
fi
|
|
9
12
|
doflow_bridge codex PreToolUse pre-implementation-gate
|
|
@@ -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
|
# session-end.sh — SessionEnd hook
|
|
3
4
|
#
|
|
4
5
|
# Runs when Claude Code closes a session. Responsibilities:
|
|
@@ -24,6 +25,27 @@ CWD=$(json_field "$INPUT" ".cwd")
|
|
|
24
25
|
|
|
25
26
|
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
26
27
|
|
|
28
|
+
# Start storage cleanup without changing the hook's output, status, or latency.
|
|
29
|
+
start_storage_upkeep() {
|
|
30
|
+
(
|
|
31
|
+
SHARED_POLICY_LIB="$(dirname "$0")/../../.doflow/shared/hooks/policies/lib.sh"
|
|
32
|
+
if [[ ! -f "$SHARED_POLICY_LIB" ]]; then
|
|
33
|
+
SHARED_POLICY_LIB="$(dirname "$0")/../../shared/hooks/policies/lib.sh"
|
|
34
|
+
fi
|
|
35
|
+
if [[ -f "$SHARED_POLICY_LIB" ]]; then
|
|
36
|
+
source "$SHARED_POLICY_LIB"
|
|
37
|
+
storage_upkeep_async "$CWD"
|
|
38
|
+
fi
|
|
39
|
+
) >/dev/null 2>&1 || true
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
# No config home (lib.sh leaves the state paths empty): no session store to write, but the
|
|
43
|
+
# storage upkeep still starts (086 IC-010).
|
|
44
|
+
if [[ -z "$STATE_DIR" ]]; then
|
|
45
|
+
start_storage_upkeep
|
|
46
|
+
exit 0
|
|
47
|
+
fi
|
|
48
|
+
|
|
27
49
|
# ── 1. Log session end ────────────────────────────────────────────────────────
|
|
28
50
|
|
|
29
51
|
mkdir -p "$(dirname "$SESSIONS_LOG")"
|
|
@@ -60,16 +82,7 @@ if [[ -n "$SESSION_ID" ]]; then
|
|
|
60
82
|
rm -rf "$SESSION_PATH" 2>/dev/null || true
|
|
61
83
|
fi
|
|
62
84
|
|
|
63
|
-
|
|
64
|
-
SHARED_POLICY_LIB="$(dirname "$0")/../../.doflow/shared/hooks/policies/lib.sh"
|
|
65
|
-
if [[ ! -f "$SHARED_POLICY_LIB" ]]; then
|
|
66
|
-
SHARED_POLICY_LIB="$(dirname "$0")/../../shared/hooks/policies/lib.sh"
|
|
67
|
-
fi
|
|
68
|
-
if [[ -f "$SHARED_POLICY_LIB" ]]; then
|
|
69
|
-
source "$SHARED_POLICY_LIB"
|
|
70
|
-
storage_upkeep_async "$CWD"
|
|
71
|
-
fi
|
|
72
|
-
) >/dev/null 2>&1 || true
|
|
85
|
+
start_storage_upkeep
|
|
73
86
|
|
|
74
87
|
# ── 4. Trim sessions.log (lock-guarded) ───────────────────────────────────────
|
|
75
88
|
|
|
@@ -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
|
# Codex front door: subagent-audit through the shared lifecycle bridge.
|
|
3
4
|
set -uo pipefail
|
|
4
5
|
export DOFLOW_AGENT="${DOFLOW_AGENT:-codex}"
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copilot CLI front-door helpers: translate a camelCase Copilot hook payload into the canonical
|
|
3
|
+
# Claude-style payload the shared lifecycle bridge and policies read, and render nothing else.
|
|
4
|
+
# Installed by the doflow CLI and overwritten on update; do not edit an installed copy.
|
|
5
|
+
#
|
|
6
|
+
# Payload facts are from the live capture of 2026-10-27 (Copilot CLI 1.0.103), not the docs alone:
|
|
7
|
+
# - camelCase fields: sessionId, toolName, toolArgs, transcriptPath, agentId, agentType, parentAgentId
|
|
8
|
+
# - toolArgs arrives as a JSON OBJECT for bash/skill/task and as a raw STRING for apply_patch (the
|
|
9
|
+
# freeform patch text). The docs type it `unknown`; this accepts an object, a JSON string and a
|
|
10
|
+
# raw string.
|
|
11
|
+
# - tool names are lowercase: bash, apply_patch, edit, task, skill
|
|
12
|
+
|
|
13
|
+
# copilot_bridge_payload <event>: native payload on stdin, canonical payload on stdout. <event> is
|
|
14
|
+
# the PascalCase name the bridge and policies know (PreToolUse, Stop, SessionStart, ...). When jq is
|
|
15
|
+
# missing or rejects the payload the original payload is printed unchanged.
|
|
16
|
+
# - tool_name: bash|powershell -> Bash, edit -> Edit, create -> Write, apply_patch stays; any
|
|
17
|
+
# other name passes through unchanged, so an unmapped tool fails open as it does without a bridge
|
|
18
|
+
# - tool_input: toolArgs as an object (a JSON string is parsed; any other string becomes
|
|
19
|
+
# {command: <string>}, which is where the shared policies read an apply_patch body); for Edit
|
|
20
|
+
# and Write tool_input.file_path is copied from path, filePath, filename or target_file when
|
|
21
|
+
# absent (only path and file_path are captured; an edit whose target is still undecodable is
|
|
22
|
+
# denied by the bridge, not allowed)
|
|
23
|
+
# - response (subagentStop) -> last_assistant_message
|
|
24
|
+
copilot_bridge_payload() {
|
|
25
|
+
local event="${1:-}" payload rewritten
|
|
26
|
+
payload=$(cat)
|
|
27
|
+
if command -v jq >/dev/null 2>&1 \
|
|
28
|
+
&& rewritten=$(printf '%s' "$payload" | jq -c --arg event "$event" '
|
|
29
|
+
(.toolName // .tool_name // "") as $raw
|
|
30
|
+
| ($raw | ascii_downcase) as $t
|
|
31
|
+
| (if $t == "bash" or $t == "powershell" then "Bash"
|
|
32
|
+
elif $t == "edit" then "Edit"
|
|
33
|
+
elif $t == "create" then "Write"
|
|
34
|
+
else $raw end) as $name
|
|
35
|
+
| ((.toolArgs // .tool_input) as $a
|
|
36
|
+
| if $a == null then null
|
|
37
|
+
elif ($a | type) == "object" then $a
|
|
38
|
+
elif ($a | type) == "string" then ((try ($a | fromjson) catch $a) | if type == "object" then . else {command: $a} end)
|
|
39
|
+
else {command: ($a | tostring)} end) as $input
|
|
40
|
+
| (if ($name == "Edit" or $name == "Write") and ($input | type) == "object" and ($input.file_path == null) and (($input.path // $input.filePath // $input.filename // $input.target_file) != null)
|
|
41
|
+
then $input + {file_path: ($input.path // $input.filePath // $input.filename // $input.target_file)} else $input end) as $input
|
|
42
|
+
| {
|
|
43
|
+
hook_event_name: $event,
|
|
44
|
+
session_id: (.sessionId // .session_id),
|
|
45
|
+
cwd: .cwd,
|
|
46
|
+
transcript_path: (.transcriptPath // .transcript_path),
|
|
47
|
+
stop_hook_active: .stop_hook_active,
|
|
48
|
+
stop_reason: (.stopReason // .stop_reason),
|
|
49
|
+
source: .source,
|
|
50
|
+
reason: .reason,
|
|
51
|
+
prompt: .prompt,
|
|
52
|
+
initial_prompt: (.initialPrompt // .initial_prompt),
|
|
53
|
+
agent_id: (.agentId // .agent_id),
|
|
54
|
+
agent_type: (.agentType // .agent_type),
|
|
55
|
+
agent_name: (.agentName // .agent_name),
|
|
56
|
+
parent_agent_id: (.parentAgentId // .parent_agent_id),
|
|
57
|
+
last_assistant_message: (.response // .last_assistant_message),
|
|
58
|
+
tool_name: (if $raw == "" then null else $name end),
|
|
59
|
+
tool_input: $input,
|
|
60
|
+
tool_result: (.toolResult // .tool_result)
|
|
61
|
+
}
|
|
62
|
+
| with_entries(select(.value != null))
|
|
63
|
+
' 2>/dev/null) \
|
|
64
|
+
&& [ -n "$rewritten" ]; then
|
|
65
|
+
printf '%s\n' "$rewritten"
|
|
66
|
+
else
|
|
67
|
+
printf '%s\n' "$payload"
|
|
68
|
+
fi
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
# copilot_front_door <script-dir> <event> <policy> <fail>: run one shared policy through the bridge.
|
|
72
|
+
# <fail> is `deny` for a pre-tool policy (a missing bridge denies the tool call only under strict-1)
|
|
73
|
+
# or `open` for every other event.
|
|
74
|
+
copilot_front_door() {
|
|
75
|
+
local dir="$1" event="$2" policy="$3" fail="${4:-open}" raw payload bridge status=0
|
|
76
|
+
raw=$(cat)
|
|
77
|
+
if [ "$event" = Stop ] && command -v jq >/dev/null 2>&1 \
|
|
78
|
+
&& [ -n "$(printf '%s' "$raw" | jq -r '.agentId // .agent_id // empty' 2>/dev/null)" ]; then
|
|
79
|
+
return 0 # a subagent's own stop; SubagentStop covers it, as it does for Claude
|
|
80
|
+
fi
|
|
81
|
+
payload=$(copilot_bridge_payload "$event" <<<"$raw")
|
|
82
|
+
bridge="$dir/../../.doflow/shared/hooks/bridge/bridge.sh"
|
|
83
|
+
# User hooks under a custom $COPILOT_HOME sit beside no .doflow; the bridge is then in $HOME/.doflow.
|
|
84
|
+
[ -f "$bridge" ] || bridge="${HOME:-}/.doflow/shared/hooks/bridge/bridge.sh"
|
|
85
|
+
if [ ! -f "$bridge" ] || ! . "$bridge" 2>/dev/null; then
|
|
86
|
+
# D1: a missing bridge allows. Only DOFLOW_FAULT_PROFILE=strict-1, a person's opt-in, denies a pre-tool call.
|
|
87
|
+
if [ "$fail" = deny ] && [ "${DOFLOW_FAULT_PROFILE:-}" = strict-1 ]; then
|
|
88
|
+
printf '%s\n' '{"permissionDecision":"deny","permissionDecisionReason":"[doflow] shared hooks lack the bridge; run: doflow update -t copilot"}'
|
|
89
|
+
fi
|
|
90
|
+
return 0
|
|
91
|
+
fi
|
|
92
|
+
doflow_bridge copilot "$event" "$policy" <<<"$payload" || status=$?
|
|
93
|
+
return "$status"
|
|
94
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copilot CLI front door: mcp-tool-guard through the shared lifecycle bridge.
|
|
3
|
+
set -uo pipefail
|
|
4
|
+
export DOFLOW_AGENT="${DOFLOW_AGENT:-copilot}"
|
|
5
|
+
here="$(cd "$(dirname "$0")" && pwd)"
|
|
6
|
+
# shellcheck source=doflow-lib.sh
|
|
7
|
+
. "$here/doflow-lib.sh"
|
|
8
|
+
copilot_front_door "$here" PreToolUse mcp-tool-guard deny
|
|
9
|
+
exit $?
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copilot CLI front door: pre-implementation-gate through the shared lifecycle bridge.
|
|
3
|
+
set -uo pipefail
|
|
4
|
+
export DOFLOW_AGENT="${DOFLOW_AGENT:-copilot}"
|
|
5
|
+
here="$(cd "$(dirname "$0")" && pwd)"
|
|
6
|
+
# shellcheck source=doflow-lib.sh
|
|
7
|
+
. "$here/doflow-lib.sh"
|
|
8
|
+
copilot_front_door "$here" PreToolUse pre-implementation-gate deny
|
|
9
|
+
exit $?
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copilot CLI front door: session-context through the shared lifecycle bridge.
|
|
3
|
+
set -uo pipefail
|
|
4
|
+
export DOFLOW_AGENT="${DOFLOW_AGENT:-copilot}"
|
|
5
|
+
here="$(cd "$(dirname "$0")" && pwd)"
|
|
6
|
+
# shellcheck source=doflow-lib.sh
|
|
7
|
+
. "$here/doflow-lib.sh"
|
|
8
|
+
copilot_front_door "$here" SessionStart session-context open
|
|
9
|
+
exit $?
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copilot CLI front door: stop-check through the shared lifecycle bridge.
|
|
3
|
+
set -uo pipefail
|
|
4
|
+
export DOFLOW_AGENT="${DOFLOW_AGENT:-copilot}"
|
|
5
|
+
here="$(cd "$(dirname "$0")" && pwd)"
|
|
6
|
+
# shellcheck source=doflow-lib.sh
|
|
7
|
+
. "$here/doflow-lib.sh"
|
|
8
|
+
copilot_front_door "$here" Stop stop-check open
|
|
9
|
+
exit $?
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copilot CLI front door: subagent-audit (start) through the shared lifecycle bridge.
|
|
3
|
+
set -uo pipefail
|
|
4
|
+
export DOFLOW_AGENT="${DOFLOW_AGENT:-copilot}"
|
|
5
|
+
here="$(cd "$(dirname "$0")" && pwd)"
|
|
6
|
+
# shellcheck source=doflow-lib.sh
|
|
7
|
+
. "$here/doflow-lib.sh"
|
|
8
|
+
copilot_front_door "$here" SubagentStart subagent-audit open
|
|
9
|
+
exit $?
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copilot CLI front door: subagent-audit (stop) through the shared lifecycle bridge.
|
|
3
|
+
set -uo pipefail
|
|
4
|
+
export DOFLOW_AGENT="${DOFLOW_AGENT:-copilot}"
|
|
5
|
+
here="$(cd "$(dirname "$0")" && pwd)"
|
|
6
|
+
# shellcheck source=doflow-lib.sh
|
|
7
|
+
. "$here/doflow-lib.sh"
|
|
8
|
+
copilot_front_door "$here" SubagentStop subagent-audit open
|
|
9
|
+
exit $?
|