@khoavu882/doflow 2.0.0-beta.5 → 2.0.0
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 +12 -11
- package/bin/doflow.js +21 -11
- 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/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/session-end.sh +23 -10
- package/core/harnesses/claude/hooks/skill-config-audit.sh +3 -0
- package/core/harnesses/claude/settings/settings.json +18 -0
- 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/lib.sh +44 -25
- 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/session-end.impl.sh +23 -10
- package/core/harnesses/codex/hooks/subagent-audit.sh +1 -0
- package/core/harnesses/copilot/hooks/doflow-lib.sh +93 -0
- package/core/harnesses/copilot/hooks/doflow-mcp-tool-guard.sh +9 -0
- package/core/harnesses/copilot/hooks/doflow-pre-bash-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 +57 -0
- package/core/harnesses/kiro/agents/doflow.json +1 -1
- package/core/harnesses/kiro/hooks/lib.sh +26 -6
- package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +1 -0
- package/core/harnesses/kiro/hooks/pre-bash-guard.sh +1 -0
- package/core/harnesses/kiro/hooks/pre-implement-gate.sh +1 -0
- 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 +8 -0
- package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +0 -1
- package/core/harnesses/shared/hooks/bridge/bridge.sh +102 -9
- 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 +10 -2
- package/core/harnesses/shared/hooks/policies/blocked-patterns.conf +28 -14
- package/core/harnesses/shared/hooks/policies/capture-failure.sh +48 -15
- 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 +2 -11
- 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-tool-guard.sh +3 -2
- package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +213 -12
- package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +114 -38
- package/core/harnesses/shared/hooks/policies/session-context.sh +30 -1
- package/core/harnesses/shared/hooks/policies/stop-check.sh +20 -9
- package/core/harnesses/shared/hooks/policies/subagent-audit.sh +5 -2
- 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 +47 -8
- 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 +32 -0
- package/core/registry/gates.json +32 -0
- package/core/registry/guidance-caps.json +40 -0
- package/core/registry/harnesses.json +1442 -363
- package/core/registry/lifecycle.json +485 -304
- 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/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 +276 -0
- package/core/registry/storage.json +679 -31
- package/core/registry/telemetry.json +236 -0
- package/core/registry/transcripts.json +142 -0
- package/core/registry/verification.json +76 -1
- 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 +1 -2
- 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 +48 -4
- package/core/shared/scripts/doflow/bin/doflow-run +149 -34
- package/core/shared/skills/do/SKILL.md +12 -10
- 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 +20 -74
- package/core/shared/skills/do-brainstorm/references/handoff_branches.md +35 -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 +41 -144
- 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 +18 -17
- package/core/shared/skills/do-diagnose/SKILL.md +14 -4
- package/core/shared/skills/do-document/SKILL.md +11 -1
- package/core/shared/skills/do-document/references/deep_research.md +1 -2
- package/core/shared/skills/do-document/references/embedded-research.md +18 -6
- package/core/shared/skills/do-document/references/implementation-flow.md +5 -6
- package/core/shared/skills/do-execute-plan/SKILL.md +15 -58
- 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 +13 -1
- 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 +8 -9
- package/core/shared/skills/do-flow/references/task_classes.md +2 -2
- package/core/shared/skills/do-git/SKILL.md +4 -0
- package/core/shared/skills/do-implement/SKILL.md +4 -7
- package/core/shared/skills/do-plan/SKILL.md +26 -15
- 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/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 +24 -4
- package/src/adapters/codex/agents.js +25 -15
- package/src/adapters/codex/index.js +48 -13
- package/src/adapters/codex/native-projection.js +6 -2
- package/src/adapters/copilot/index.js +58 -23
- package/src/adapters/copy-tree.js +290 -44
- 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 +21 -2
- package/src/cli/commands/ui.js +99 -0
- package/src/cli/commands/update.js +2 -1
- package/src/cli/index.js +322 -29
- package/src/cli/runtime-commands.js +209 -57
- 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 +20 -3
- 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 +492 -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/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 +154 -78
- 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 +34 -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 +565 -17
- package/src/runtime/history-compactor.js +13 -3
- package/src/runtime/implementation-gate.js +277 -22
- 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 +16 -6
- package/src/runtime/lifecycle/event-store.js +8 -6
- package/src/runtime/lifecycle/followup.js +6 -1
- package/src/runtime/lifecycle/overview.js +24 -1
- 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 +477 -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/facts.js +479 -0
- package/src/runtime/roadmap/gates.js +270 -0
- package/src/runtime/roadmap/loop.js +1636 -0
- package/src/runtime/roadmap/merge.js +381 -0
- package/src/runtime/roadmap/rows.js +1113 -0
- package/src/runtime/roadmap/seed.js +951 -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 +47 -11
- 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 +374 -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/verification/check-key.js +628 -0
- package/src/runtime/verification/contract-runner.js +546 -11
- package/src/runtime/verification/engine.js +499 -9
- 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 +288 -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 +578 -63
- 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/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/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
package/README.md
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
# DoFlow
|
|
2
2
|
|
|
3
|
-
DoFlow is a configuration layer for AI coding tools. It gives Claude Code, Codex,
|
|
4
|
-
|
|
5
|
-
workflows, and safer defaults — projected from one source, so the
|
|
3
|
+
DoFlow is a configuration layer for AI coding tools. It gives Claude Code, Codex, Antigravity,
|
|
4
|
+
OpenCode, Pi, GitHub Copilot CLI, and Kiro a shared set of engineering rules, reusable
|
|
5
|
+
workflows, and safer defaults — projected from one source, so the seven never drift apart.
|
|
6
6
|
|
|
7
7
|
```mermaid
|
|
8
8
|
flowchart LR
|
|
9
9
|
R[One DoFlow source] --> C[Claude Code]
|
|
10
10
|
R --> X[Codex]
|
|
11
|
-
R --> G[Gemini CLI]
|
|
12
11
|
R --> O[OpenCode]
|
|
13
12
|
R --> P[Pi]
|
|
14
13
|
R --> CP[Copilot CLI]
|
|
@@ -16,7 +15,6 @@ flowchart LR
|
|
|
16
15
|
R --> A[Antigravity CLI]
|
|
17
16
|
C --> H[Hooks + MCP + skills]
|
|
18
17
|
X --> S[AGENTS.md + skills]
|
|
19
|
-
G --> GM[GEMINI.md + skills]
|
|
20
18
|
A --> AG[AGENTS.md + .agents tree]
|
|
21
19
|
O --> S
|
|
22
20
|
P --> S
|
|
@@ -29,7 +27,7 @@ flowchart LR
|
|
|
29
27
|
| Need | DoFlow component |
|
|
30
28
|
|---|---|
|
|
31
29
|
| Repeatable delivery work | 13 skills, including `/do-brainstorm`, `/do-plan`, `/do-test`, and `/do-code-review` |
|
|
32
|
-
| Specialist review |
|
|
30
|
+
| Specialist review | 7 agents — `spec-analyst`, `system-architect`, `delivery-lead`, `core-implementer`, `quality-guardian`, `reviewer`, `research-writer` |
|
|
33
31
|
| Safer automation | Claude hooks block destructive commands and unfinished implementation stubs |
|
|
34
32
|
| Shared standards | Rules for safety, workflow, quality, and clarification across supported tools |
|
|
35
33
|
| Session continuity | Claude and Codex hooks capture lightweight Git context and compact-session summaries and deliver them on a session's first prompt |
|
|
@@ -38,7 +36,7 @@ flowchart LR
|
|
|
38
36
|
|
|
39
37
|
1. **New to DoFlow?** Follow the [Quickstart](docs/quickstart.md).
|
|
40
38
|
2. **Need installation, updates, or rollback?** Use the [Setup guide](docs/setup.md).
|
|
41
|
-
3. **Want to understand the moving parts?** Read the visual [Overview](docs/
|
|
39
|
+
3. **Want to understand the moving parts?** Read the visual [Overview](docs/index.md#the-component-model).
|
|
42
40
|
4. **Ready to work?** Pick a task pattern from the [Guide](docs/guide.md).
|
|
43
41
|
5. **Looking up a command or capability?** Open the [Reference](docs/reference.md).
|
|
44
42
|
|
|
@@ -111,16 +109,19 @@ Use `/do-flow "add a customer export"` to run the same sequence with its approva
|
|
|
111
109
|
|---|---|
|
|
112
110
|
| Claude Code | Full integration: skills, agents, hooks, MCP registration, session context, and rules |
|
|
113
111
|
| Codex | `AGENTS.md`, skills at `.agents/skills/`, scripts, templates, rules, agents, hooks, and references |
|
|
114
|
-
|
|
|
115
|
-
| Antigravity CLI (`agy`) | Managed `AGENTS.md` section (project), skills at `.agents/skills/`, shared agents, workspace rules at `.agents/rules/`, the spec-driven chain workflow shim, the pre-implementation-gate hook (`.agents/hooks.json`), and MCP in `.agents/mcp_config.json` / `~/.gemini/config/mcp_config.json` |
|
|
112
|
+
| Antigravity CLI (`agy`) | Managed `AGENTS.md` section (project), skills at `.agents/skills/`, shared agents, workspace rules at `.agents/rules/`, the spec-driven chain workflow shim, the pre-implementation-gate hook (`.agents/hooks.json`), and MCP in `.agents/mcp_config.json` / `~/.gemini/config/mcp_config.json`, and a managed guidance section in the global `~/.gemini/GEMINI.md` |
|
|
116
113
|
| OpenCode | `AGENTS.md`, skills discovered at `.opencode/skills/` (project) or `~/.config/opencode/skills/` (global), and `opencode.json` configuration |
|
|
117
114
|
| Pi Coding Agent | `AGENTS.md`, skills discovered at `.pi/skills/` (project) or `~/.pi/agent/skills/` (global), and MCP servers in `.pi/mcp.json` (project) or `~/.pi/agent/mcp.json` (global) |
|
|
118
115
|
| GitHub Copilot CLI | `.github/copilot-instructions.md` (project scope only), skills at `.agents/skills/`, agents at `.github/agents/`, and MCP registered in `.mcp.json` |
|
|
119
116
|
| Kiro | Steering files under `.kiro/steering/`, skills at `.kiro/skills/`, agents at `.kiro/agents/`, hooks at `.kiro/hooks/`, and MCP registered in `.kiro/settings/mcp.json` |
|
|
120
117
|
|
|
118
|
+
Content (guidance, skills, agents, MCP) goes to every harness; DoFlow's hooks, gates and bridge go
|
|
119
|
+
only to the harnesses the user-layer setting `hooks.harnesses` names (default `claude`, `codex`,
|
|
120
|
+
`antigravity`, `pi`). A harness outside the list gets content only, and the next install or update
|
|
121
|
+
removes the DoFlow hooks an earlier run wrote for it; an install or update warns when Claude or a
|
|
122
|
+
worker named in `workers.enabled` is left out. Add `kiro` to that list for its hooks.
|
|
121
123
|
Codex hooks are installed as `hooks.json` but require review/trust in Codex before they run.
|
|
122
|
-
|
|
123
|
-
similarly subject to Gemini's own hook trust/review gating. Kiro's hooks are not in Kiro v3's
|
|
124
|
+
Kiro's hooks are not in Kiro v3's
|
|
124
125
|
untrusted-workspace exclusion list; an untrusted workspace asks before every shell command, and
|
|
125
126
|
whether that covers hook commands is undocumented. Copilot CLI documents hooks, settings, and a
|
|
126
127
|
plugin marketplace upstream; DoFlow still installs none of those there. OpenCode and Pi
|
package/bin/doflow.js
CHANGED
|
@@ -5,24 +5,34 @@
|
|
|
5
5
|
// so the `doflow` binary path and the doflow-run dispatcher seam
|
|
6
6
|
// (core/shared/scripts/doflow/bin/doflow-run, which execs `node <repoRoot>/bin/doflow.js`)
|
|
7
7
|
// keep resolving to this exact location.
|
|
8
|
-
// Refuse clearly on a Node that cannot strip types: src/ is TypeScript, and
|
|
9
|
-
// loading a .ts module dies with a SyntaxError on the first annotation.
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
// plain JavaScript so it can say so. Exit 2 is the
|
|
8
|
+
// Refuse clearly on a Node below the floor, or one that cannot strip types: src/ is TypeScript, and
|
|
9
|
+
// without stripping loading a .ts module dies with a SyntaxError on the first annotation. The floor
|
|
10
|
+
// is 24.22.1, the 2026-10-21 security release of the Node 24 line (engines.node in package.json is
|
|
11
|
+
// the same value); stripping is on by default from there and off only under
|
|
12
|
+
// --no-experimental-strip-types. This file stays plain JavaScript so it can say so. Exit 2 is the
|
|
13
|
+
// doflow-run usage/resolution-error code.
|
|
14
|
+
const NODE_FLOOR_VERSION = '24.22.1';
|
|
15
|
+
const NODE_FLOOR = `>=${NODE_FLOOR_VERSION}`;
|
|
16
|
+
// A prerelease of the floor version (24.22.1-rc.1) sorts below it, as in semver; any other
|
|
17
|
+
// prerelease suffix is ignored, so 24.22.2-rc.1 and 24.23.0-rc.1 both pass.
|
|
18
|
+
const running = /^(\d+)\.(\d+)\.(\d+)(-.*)?$/.exec(String(process.versions.node)) || [];
|
|
19
|
+
const order = NODE_FLOOR_VERSION.split('.').reduce((result, part, i) => result || Math.sign(Number(running[i + 1] || 0) - Number(part)), 0);
|
|
20
|
+
const belowFloor = order < 0 || (order === 0 && Boolean(running[4]));
|
|
21
|
+
if (belowFloor) {
|
|
22
|
+
process.stderr.write(`doflow: Node ${process.versions.node} is not supported; doflow needs Node ${NODE_FLOOR} (Node 22 and Node 24 before ${NODE_FLOOR_VERSION} are no longer supported).\n`);
|
|
23
|
+
process.exit(2);
|
|
24
|
+
}
|
|
13
25
|
if (!process.features || !process.features.typescript) {
|
|
14
|
-
process.stderr.write(`doflow: Node ${process.versions.node} cannot strip TypeScript types; doflow needs Node
|
|
26
|
+
process.stderr.write(`doflow: Node ${process.versions.node} cannot strip TypeScript types; doflow needs Node ${NODE_FLOOR} with type-stripping enabled (it is off under --no-experimental-strip-types, including via NODE_OPTIONS).\n`);
|
|
15
27
|
process.exit(2);
|
|
16
28
|
}
|
|
17
29
|
// Enable Node's module compile cache before any ../src require. Type stripping makes the first load
|
|
18
30
|
// of each .ts module cost a transform; the cache turns that into a one-time cost per Node version
|
|
19
31
|
// and file content. Called without options so an explicit NODE_COMPILE_CACHE directory is honoured
|
|
20
|
-
// and NODE_DISABLE_COMPILE_CACHE still disables it. Best-effort:
|
|
21
|
-
//
|
|
32
|
+
// and NODE_DISABLE_COMPILE_CACHE still disables it. Best-effort: if it throws, the CLI runs at
|
|
33
|
+
// today's speed.
|
|
22
34
|
const nodeModule = require('node:module');
|
|
23
|
-
|
|
24
|
-
try { nodeModule.enableCompileCache(); } catch { /* best-effort */ }
|
|
25
|
-
}
|
|
35
|
+
try { nodeModule.enableCompileCache(); } catch { /* best-effort */ }
|
|
26
36
|
// Record an error that escapes everything, including one thrown while the CLI loads (a half-updated
|
|
27
37
|
// install), before it is loaded (IC-016). The monitor only observes: Node's own crash output and
|
|
28
38
|
// exit status are unchanged, and a monitor that threw would change that status to 7, hence the
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "doflow",
|
|
3
3
|
"version": "1.0.0",
|
|
4
|
-
"description": "Spec-driven engineering workflow engine, quality gates, and specialist agent personas for Google Antigravity
|
|
4
|
+
"description": "Spec-driven engineering workflow engine, quality gates, and specialist agent personas for Google Antigravity.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "DoFlow",
|
|
7
7
|
"url": "https://github.com/khoavu882/do-flow"
|
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
"license": "MIT",
|
|
12
12
|
"keywords": [
|
|
13
13
|
"antigravity",
|
|
14
|
-
"gemini",
|
|
15
14
|
"engineering",
|
|
16
15
|
"workflows",
|
|
17
16
|
"quality-gates",
|
package/core/.plugin/plugin.json
CHANGED
|
@@ -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:-claude-code}"
|
|
@@ -247,6 +265,7 @@ has_uncommitted_changes() {
|
|
|
247
265
|
# Safe to call multiple times (mkdir -p is idempotent).
|
|
248
266
|
ensure_session_dir() {
|
|
249
267
|
local session_id="$1"
|
|
268
|
+
[ -n "$SESSION_DIR" ] || return 0
|
|
250
269
|
mkdir -p "$SESSION_DIR/$session_id"
|
|
251
270
|
echo "$SESSION_DIR/$session_id"
|
|
252
271
|
}
|
|
@@ -256,6 +275,7 @@ ensure_session_dir() {
|
|
|
256
275
|
ensure_project_dir() {
|
|
257
276
|
local cwd="$1"
|
|
258
277
|
local hash
|
|
278
|
+
[ -n "$PROJECTS_DIR" ] || return 0
|
|
259
279
|
hash=$(cwd_hash "$cwd")
|
|
260
280
|
mkdir -p "$PROJECTS_DIR/$hash"
|
|
261
281
|
echo "$PROJECTS_DIR/$hash"
|
|
@@ -283,22 +303,21 @@ require_jq() {
|
|
|
283
303
|
fi
|
|
284
304
|
}
|
|
285
305
|
|
|
286
|
-
# ── Session role
|
|
306
|
+
# ── Session role and identity ─────────────────────────────────────────────────
|
|
287
307
|
|
|
288
|
-
#
|
|
289
|
-
#
|
|
290
|
-
#
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
""
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
}
|
|
308
|
+
# doflow_session_role comes from the shared identity.sh, its only definition (IC-009). When an
|
|
309
|
+
# install lacks that file, the session is a worker and the broken install is captured as
|
|
310
|
+
# identity-missing: a worker writes and claims nothing, so a broken install cannot leak context.
|
|
311
|
+
if [ -f "${BASH_SOURCE[0]%/*}/../../.doflow/shared/hooks/policies/identity.sh" ]; then
|
|
312
|
+
. "${BASH_SOURCE[0]%/*}/../../.doflow/shared/hooks/policies/identity.sh"
|
|
313
|
+
else
|
|
314
|
+
doflow_session_role() {
|
|
315
|
+
local policy="${0##*/}"
|
|
316
|
+
policy="${policy%.sh}"
|
|
317
|
+
policy="${policy%.impl}"
|
|
318
|
+
( . "${BASH_SOURCE[0]%/*}/../../.doflow/shared/hooks/policies/capture-failure.sh" \
|
|
319
|
+
&& doflow_capture_failure "$policy" identity-missing ) >/dev/null 2>&1 || true
|
|
320
|
+
printf 'worker\n'
|
|
321
|
+
return 0
|
|
322
|
+
}
|
|
323
|
+
fi
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
+
case "${OSTYPE:-}" in msys*|cygwin*|win32*) if command -v jq >/dev/null 2>&1; then jq() { command jq -b "$@"; }; fi ;; esac # native jq.exe ends lines with CRLF unless -b
|
|
2
3
|
# permission-audit.sh — PermissionDenied hook (pure observability, no deny path)
|
|
3
4
|
#
|
|
4
5
|
# The decision has already been made by the time this fires; there is nothing to
|
|
@@ -27,6 +28,8 @@ SESSION_ID=$(json_field "$INPUT" ".session_id")
|
|
|
27
28
|
|
|
28
29
|
# Guard: if we can't determine the session, nothing to do
|
|
29
30
|
[[ -z "$SESSION_ID" ]] && exit 0
|
|
31
|
+
# No config home (lib.sh leaves the state paths empty): no session store to write (086 IC-010).
|
|
32
|
+
[[ -n "$SESSION_DIR" ]] || exit 0
|
|
30
33
|
|
|
31
34
|
EVENT=$(json_field "$INPUT" ".hook_event_name")
|
|
32
35
|
TOOL_NAME=$(json_field "$INPUT" ".tool_name")
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
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
|
|
3
|
+
# post-compact.sh — PostCompact hook (IC-011)
|
|
3
4
|
#
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
#
|
|
5
|
+
# Records the AI-generated compact_summary (from stdin JSON) in the summary scope of the session
|
|
6
|
+
# that produced it: summaries/<worktreeKey>/<run>/<lineage>/summary.md, through
|
|
7
|
+
# doflow_summary_write. Rule compact-store.summary decides whether this session records at all (a
|
|
8
|
+
# `solo` lineage records nothing, DEC-013); rule compact-meta.meta decides whether meta.json's
|
|
9
|
+
# compacted_at is updated (the default main lineage only). The retired project-level summary file
|
|
10
|
+
# is never written.
|
|
7
11
|
#
|
|
8
|
-
# Atomic write:
|
|
9
|
-
# Multi-session safe: project directory is keyed by cwd hash, not session_id.
|
|
12
|
+
# Atomic write: the store writes a .summary.XXXXXX temp file in the scope, then renames it.
|
|
10
13
|
# Must complete in <200ms. Must never exit non-zero or block.
|
|
11
14
|
|
|
12
15
|
set -euo pipefail
|
|
@@ -16,11 +19,6 @@ require_jq
|
|
|
16
19
|
|
|
17
20
|
INPUT=$(cat)
|
|
18
21
|
|
|
19
|
-
# A worker session never writes the project's summary or metadata: they belong to the main session.
|
|
20
|
-
if [[ "$(doflow_session_role || echo main)" == "worker" ]]; then
|
|
21
|
-
exit 0
|
|
22
|
-
fi
|
|
23
|
-
|
|
24
22
|
SESSION_ID=$(json_field "$INPUT" ".session_id")
|
|
25
23
|
CWD=$(json_field "$INPUT" ".cwd")
|
|
26
24
|
TRIGGER=$(json_field "$INPUT" ".trigger")
|
|
@@ -33,34 +31,39 @@ COMPACT_SUMMARY=$(json_field "$INPUT" ".compact_summary")
|
|
|
33
31
|
# injected as empty context on the next session's first prompt — useless noise, skip it.
|
|
34
32
|
[[ -z "$COMPACT_SUMMARY" ]] && exit 0
|
|
35
33
|
|
|
36
|
-
|
|
34
|
+
# The identity, the rule table and the store come from the Canonical Policy Library. An install
|
|
35
|
+
# missing any of them records nothing: a broken install cannot write a summary to the wrong scope.
|
|
36
|
+
POLICIES="$(dirname "$0")/../../.doflow/shared/hooks/policies"
|
|
37
|
+
declare -F doflow_identity >/dev/null 2>&1 || exit 0
|
|
38
|
+
[[ -f "$POLICIES/emission-rules.sh" && -f "$POLICIES/summary-store.sh" ]] || exit 0
|
|
39
|
+
# shellcheck source=/dev/null
|
|
40
|
+
. "$POLICIES/emission-rules.sh"
|
|
41
|
+
# shellcheck source=/dev/null
|
|
42
|
+
. "$POLICIES/summary-store.sh"
|
|
43
|
+
|
|
44
|
+
doflow_identity "$SESSION_ID" "$CWD"
|
|
45
|
+
|
|
46
|
+
DF_ACTION=skip
|
|
47
|
+
doflow_emission_rule compact-store.summary "$DF_ID_ROLE:$DF_ID_KIND"
|
|
48
|
+
[[ "$DF_ACTION" == write ]] || exit 0
|
|
37
49
|
|
|
38
50
|
# Read current branch for frontmatter metadata (best-effort, empty is fine)
|
|
39
51
|
BRANCH=$(run_with_timeout 5 -- git -C "$CWD" branch --show-current 2>/dev/null || echo "")
|
|
40
52
|
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
41
53
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
TMP=""
|
|
45
|
-
META_TMP=""
|
|
46
|
-
_cleanup() { rm -f "$TMP" "$META_TMP" 2>/dev/null || true; }
|
|
47
|
-
trap _cleanup EXIT
|
|
54
|
+
doflow_summary_write "$DF_ID_WORKTREE" "$DF_ID_RUN" "$DF_ID_LINEAGE" "${DF_ID_ATTEMPT:-}" \
|
|
55
|
+
"$TIMESTAMP" "$SESSION_ID" "$TRIGGER" "$BRANCH" "$DF_ID_ROLE" "$COMPACT_SUMMARY" || exit 0
|
|
48
56
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
---
|
|
53
|
-
compacted_at: ${TIMESTAMP}
|
|
54
|
-
session_id: ${SESSION_ID:-unknown}
|
|
55
|
-
trigger: ${TRIGGER:-unknown}
|
|
56
|
-
branch: ${BRANCH:-unknown}
|
|
57
|
-
role: main
|
|
58
|
-
---
|
|
57
|
+
DF_ACTION=skip
|
|
58
|
+
doflow_emission_rule compact-meta.meta "$DF_ID_ROLE:$DF_ID_KIND"
|
|
59
|
+
[[ "$DF_ACTION" == write ]] || exit 0
|
|
59
60
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
# No config home (lib.sh leaves the state paths empty): no session store to write (086 IC-010).
|
|
62
|
+
[[ -n "$PROJECTS_DIR" ]] || exit 0
|
|
63
|
+
PROJECT_DIR=$(ensure_project_dir "$CWD")
|
|
64
|
+
META_TMP=""
|
|
65
|
+
_cleanup() { rm -f "$META_TMP" 2>/dev/null || true; }
|
|
66
|
+
trap _cleanup EXIT
|
|
64
67
|
|
|
65
68
|
# Update meta.json compacted_at (field-merge — do not overwrite other fields)
|
|
66
69
|
if [[ -f "$PROJECT_DIR/meta.json" ]]; then
|
|
@@ -22,6 +22,8 @@ TOOL_NAME=$(json_field "$INPUT" ".tool_name")
|
|
|
22
22
|
|
|
23
23
|
# Guard: if we can't determine the session, nothing to do
|
|
24
24
|
[[ -z "$SESSION_ID" ]] && exit 0
|
|
25
|
+
# No config home (lib.sh leaves the state paths empty): no session store to write (086 IC-010).
|
|
26
|
+
[[ -n "$SESSION_DIR" ]] || exit 0
|
|
25
27
|
|
|
26
28
|
FILE_PATH=$(json_field "$INPUT" ".tool_input.file_path")
|
|
27
29
|
|
|
@@ -0,0 +1,48 @@
|
|
|
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
|
|
3
|
+
# IC-005, E.1 (Claude Code 2.1.292): event gives status; duration_ms is numeric on both
|
|
4
|
+
# post events. Neither has a numeric exit code. Never inspect or record output/error text.
|
|
5
|
+
[ "${DOFLOW_TELEMETRY:-}" != off ] || exit 0
|
|
6
|
+
exec >/dev/null 2>&1
|
|
7
|
+
event=${1:-}
|
|
8
|
+
case "$event" in PostToolUse|PostToolUseFailure) ;; *) exit 0 ;; esac
|
|
9
|
+
IFS= read -r -d '' payload || true
|
|
10
|
+
case "$payload" in *test*|*jest*|*mocha*) ;; *) exit 0 ;; esac
|
|
11
|
+
|
|
12
|
+
# Source definitions only; no lifecycle policy, failure capture or native response runs here.
|
|
13
|
+
_DOFLOW_SRC=${BASH_SOURCE[0]//\\//}; case $_DOFLOW_SRC in */*) hook_dir=${_DOFLOW_SRC%/*} ;; *) hook_dir=. ;; esac
|
|
14
|
+
. "$hook_dir/../../.doflow/shared/hooks/bridge/bridge.sh" || exit 0
|
|
15
|
+
|
|
16
|
+
# Same project-store resolution as bridge.sh, including nested dispatch delivery directories.
|
|
17
|
+
# The bridge currently has no separately exported doflow_telemetry_dir helper.
|
|
18
|
+
if [ -n "${DOFLOW_CONFIG_DIR:-}" ]; then
|
|
19
|
+
d=$DOFLOW_CONFIG_DIR
|
|
20
|
+
else
|
|
21
|
+
d=${PWD:-}
|
|
22
|
+
case "$d" in /*) ;; *) exit 0 ;; esac
|
|
23
|
+
while :; do
|
|
24
|
+
if [ -d "$d/.doflow" ]; then
|
|
25
|
+
case "$d/" in */.doflow/*) ;; *) d=${d%/}/.doflow; break ;; esac
|
|
26
|
+
fi
|
|
27
|
+
[ -n "$d" ] && [ "$d" != / ] || exit 0
|
|
28
|
+
d=${d%/*}
|
|
29
|
+
done
|
|
30
|
+
fi
|
|
31
|
+
[ -d "$d/state" ] || exit 0
|
|
32
|
+
|
|
33
|
+
tuple=$(printf '%s' "$payload" | jq -c --arg harness claude --arg event "$event" \
|
|
34
|
+
--arg policy post-shell-observe --arg mode observe -f "$_DOFLOW_BRIDGE_DIR/envelope.jq") || exit 0
|
|
35
|
+
case "$tuple" in *$'\n'*|''|'{}'|'{"dft":1}') exit 0 ;; esac
|
|
36
|
+
class=${tuple##*\"test_class\":\"}; class=${class%%\"*}
|
|
37
|
+
case "$class" in test.full|test.scoped|test.other) ;; *) exit 0 ;; esac
|
|
38
|
+
day=${tuple:17:10}
|
|
39
|
+
case "$day" in [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]) ;; *) exit 0 ;; esac
|
|
40
|
+
rest=${tuple#\{\"dft\":1,\"date\":\"??????????\",}
|
|
41
|
+
case "$rest" in \"timestamp\":*\}) ;; *) exit 0 ;; esac
|
|
42
|
+
# test_class is last in the tuple; print it explicitly so the contract guard sees the key.
|
|
43
|
+
rest=${rest%,\"test_class\":*}\}
|
|
44
|
+
[ -d "$d/state/runs/telemetry" ] || mkdir "$d/state/runs/telemetry" || exit 0
|
|
45
|
+
f=$d/state/runs/telemetry/$day.jsonl
|
|
46
|
+
[ ! -e "$f" ] || [ -f "$f" ] || exit 0
|
|
47
|
+
printf '{"kind":"hook","harness":"claude","event":"%s","policy":"post-shell-observe","verdict":"observe","test_class":"%s",%s\n' "$event" "$class" "$rest" >>"$f" || true
|
|
48
|
+
exit 0
|
|
@@ -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
|
# post-tool-failure.sh — PostToolUse*Failure* hook (pure observability, no deny path)
|
|
3
4
|
#
|
|
4
5
|
# A failed tool call is the one outcome no other hook records. post-edit-lint.sh
|
|
@@ -25,6 +26,8 @@ SESSION_ID=$(json_field "$INPUT" ".session_id")
|
|
|
25
26
|
|
|
26
27
|
# Guard: if we can't determine the session, nothing to do
|
|
27
28
|
[[ -z "$SESSION_ID" ]] && exit 0
|
|
29
|
+
# No config home (lib.sh leaves the state paths empty): no session store to write (086 IC-010).
|
|
30
|
+
[[ -n "$SESSION_DIR" ]] || exit 0
|
|
28
31
|
|
|
29
32
|
EVENT=$(json_field "$INPUT" ".hook_event_name")
|
|
30
33
|
TOOL_NAME=$(json_field "$INPUT" ".tool_name")
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
# pre-compact.sh — PreCompact hook
|
|
3
3
|
#
|
|
4
|
-
# Outputs
|
|
5
|
-
#
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
# Output is a plain string — NOT JSON.
|
|
9
|
-
# Must be under ~500 chars (Claude Code may truncate longer strings).
|
|
4
|
+
# Outputs plain stdout, not JSON. In Claude Code 2.1.304 and 2.1.308, this reached the
|
|
5
|
+
# compaction summary model as custom instructions; vendor docs are silent on
|
|
6
|
+
# PreCompact stdout (FU-w563w2).
|
|
7
|
+
# Text comes from the shared compact-text.sh (IC-001/IC-002), capped at 490 bytes.
|
|
10
8
|
# Must never exit non-zero or block.
|
|
11
9
|
|
|
12
10
|
set -euo pipefail
|
|
@@ -17,27 +15,25 @@ require_jq
|
|
|
17
15
|
INPUT=$(cat)
|
|
18
16
|
CWD=$(json_field "$INPUT" ".cwd")
|
|
19
17
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
#
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
# Build output and hard-cap at 490 chars to stay within Claude Code's limit
|
|
34
|
-
OUT=$(printf 'Include in compact summary:\n- git branch: %s sha: %s\n- recent commits: %s\n- uncommitted files: %s\n- cwd: %s\nPreserve: decisions made, files modified, open questions, planned next steps.' \
|
|
35
|
-
"${BRANCH:-unknown}" "${SHA:-unknown}" "${RECENT:-none}" "$UNCOMMITTED" "${CWD:-unknown}")
|
|
36
|
-
printf '%s' "${OUT:0:490}"
|
|
37
|
-
else
|
|
38
|
-
OUT=$(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}")
|
|
40
|
-
printf '%s' "${OUT:0:490}"
|
|
18
|
+
# Rule compact-instructions.instructions (DEC-023) decides whether this hook emits; it is
|
|
19
|
+
# `include` for both roles, so the output below is unchanged. The role comes from the shared
|
|
20
|
+
# identity.sh, read silently: this hook never wrote the role diagnostic and does not start now.
|
|
21
|
+
POLICIES="$(dirname "$0")/../../.doflow/shared/hooks/policies"
|
|
22
|
+
[[ -f "$POLICIES/emission-rules.sh" ]] || POLICIES="$(dirname "$0")/../../shared/hooks/policies"
|
|
23
|
+
_DF_ROLE=worker
|
|
24
|
+
if declare -F _doflow_role_resolve >/dev/null 2>&1; then _doflow_role_resolve 2>/dev/null; fi
|
|
25
|
+
DF_ACTION=skip
|
|
26
|
+
if [[ -f "$POLICIES/emission-rules.sh" ]]; then
|
|
27
|
+
# shellcheck source=/dev/null
|
|
28
|
+
. "$POLICIES/emission-rules.sh"
|
|
29
|
+
doflow_emission_rule compact-instructions.instructions "$_DF_ROLE"
|
|
41
30
|
fi
|
|
31
|
+
[[ "$DF_ACTION" == include ]] || exit 0
|
|
32
|
+
|
|
33
|
+
[[ -f "$POLICIES/compact-text.sh" ]] || exit 0
|
|
34
|
+
# shellcheck source=/dev/null
|
|
35
|
+
source "$POLICIES/compact-text.sh"
|
|
36
|
+
doflow_compact_text "$CWD"
|
|
37
|
+
printf '%s' "$DF_COMPACT_TEXT"
|
|
42
38
|
|
|
43
39
|
exit 0
|
|
@@ -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:
|
|
@@ -23,6 +24,27 @@ CWD=$(json_field "$INPUT" ".cwd")
|
|
|
23
24
|
|
|
24
25
|
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
25
26
|
|
|
27
|
+
# Start storage cleanup without changing the hook's output, status, or latency.
|
|
28
|
+
start_storage_upkeep() {
|
|
29
|
+
(
|
|
30
|
+
SHARED_POLICY_LIB="$(dirname "$0")/../../.doflow/shared/hooks/policies/lib.sh"
|
|
31
|
+
if [[ ! -f "$SHARED_POLICY_LIB" ]]; then
|
|
32
|
+
SHARED_POLICY_LIB="$(dirname "$0")/../../shared/hooks/policies/lib.sh"
|
|
33
|
+
fi
|
|
34
|
+
if [[ -f "$SHARED_POLICY_LIB" ]]; then
|
|
35
|
+
source "$SHARED_POLICY_LIB"
|
|
36
|
+
storage_upkeep_async "$CWD"
|
|
37
|
+
fi
|
|
38
|
+
) >/dev/null 2>&1 || true
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
# No config home (lib.sh leaves the state paths empty): no session store to write, but the
|
|
42
|
+
# storage upkeep still starts (086 IC-010).
|
|
43
|
+
if [[ -z "$STATE_DIR" ]]; then
|
|
44
|
+
start_storage_upkeep
|
|
45
|
+
exit 0
|
|
46
|
+
fi
|
|
47
|
+
|
|
26
48
|
# ── 1. Log session end ────────────────────────────────────────────────────────
|
|
27
49
|
|
|
28
50
|
mkdir -p "$(dirname "$SESSIONS_LOG")"
|
|
@@ -59,16 +81,7 @@ if [[ -n "$SESSION_ID" ]]; then
|
|
|
59
81
|
rm -rf "$SESSION_PATH" 2>/dev/null || true
|
|
60
82
|
fi
|
|
61
83
|
|
|
62
|
-
|
|
63
|
-
SHARED_POLICY_LIB="$(dirname "$0")/../../.doflow/shared/hooks/policies/lib.sh"
|
|
64
|
-
if [[ ! -f "$SHARED_POLICY_LIB" ]]; then
|
|
65
|
-
SHARED_POLICY_LIB="$(dirname "$0")/../../shared/hooks/policies/lib.sh"
|
|
66
|
-
fi
|
|
67
|
-
if [[ -f "$SHARED_POLICY_LIB" ]]; then
|
|
68
|
-
source "$SHARED_POLICY_LIB"
|
|
69
|
-
storage_upkeep_async "$CWD"
|
|
70
|
-
fi
|
|
71
|
-
) >/dev/null 2>&1 || true
|
|
84
|
+
start_storage_upkeep
|
|
72
85
|
|
|
73
86
|
# ── 4. Trim sessions.log (lock-guarded) ───────────────────────────────────────
|
|
74
87
|
|
|
@@ -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
|
# skill-config-audit.sh — ConfigChange(skills) hook (pure observability, no deny path)
|
|
3
4
|
#
|
|
4
5
|
# Logs skill-file mutations regardless of which tool made them (a subagent's Bash heredoc-to-file
|
|
@@ -26,6 +27,8 @@ SESSION_ID=$(json_field "$INPUT" ".session_id")
|
|
|
26
27
|
|
|
27
28
|
# Guard: if we can't determine the session, nothing to do
|
|
28
29
|
[[ -z "$SESSION_ID" ]] && exit 0
|
|
30
|
+
# No config home (lib.sh leaves the state paths empty): no session store to write (086 IC-010).
|
|
31
|
+
[[ -n "$SESSION_DIR" ]] || exit 0
|
|
29
32
|
|
|
30
33
|
TIMESTAMP=$(date -u +%FT%TZ)
|
|
31
34
|
SESSION_PATH=$(ensure_session_dir "$SESSION_ID")
|
|
@@ -116,6 +116,15 @@
|
|
|
116
116
|
}
|
|
117
117
|
],
|
|
118
118
|
"PostToolUse": [
|
|
119
|
+
{
|
|
120
|
+
"matcher": "Bash",
|
|
121
|
+
"hooks": [
|
|
122
|
+
{
|
|
123
|
+
"type": "command",
|
|
124
|
+
"command": "~/.claude/hooks/post-shell-observe.sh PostToolUse"
|
|
125
|
+
}
|
|
126
|
+
]
|
|
127
|
+
},
|
|
119
128
|
{
|
|
120
129
|
"matcher": "Edit",
|
|
121
130
|
"hooks": [
|
|
@@ -176,6 +185,15 @@
|
|
|
176
185
|
}
|
|
177
186
|
],
|
|
178
187
|
"PostToolUseFailure": [
|
|
188
|
+
{
|
|
189
|
+
"matcher": "Bash",
|
|
190
|
+
"hooks": [
|
|
191
|
+
{
|
|
192
|
+
"type": "command",
|
|
193
|
+
"command": "~/.claude/hooks/post-shell-observe.sh PostToolUseFailure"
|
|
194
|
+
}
|
|
195
|
+
]
|
|
196
|
+
},
|
|
179
197
|
{
|
|
180
198
|
"matcher": ".*",
|
|
181
199
|
"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
|
"""
|