@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
|
@@ -1,302 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# lib.sh — shared constants and helpers for session lifecycle hooks
|
|
3
|
-
#
|
|
4
|
-
# Usage: source "$(dirname "$0")/lib.sh"
|
|
5
|
-
#
|
|
6
|
-
# All hooks must:
|
|
7
|
-
# 1. source this file at the top
|
|
8
|
-
# 2. call require_jq immediately after
|
|
9
|
-
# 3. capture stdin once: INPUT=$(cat)
|
|
10
|
-
# 4. use: json_field "$INPUT" ".field_name"
|
|
11
|
-
#
|
|
12
|
-
# Deployment:
|
|
13
|
-
# This file is installed by the doflow CLI and overwritten on update — do
|
|
14
|
-
# not edit an installed copy directly.
|
|
15
|
-
|
|
16
|
-
set -euo pipefail
|
|
17
|
-
|
|
18
|
-
# ── State directories ────────────────────────────────────────────────────────
|
|
19
|
-
|
|
20
|
-
# XDG-compliant, agent-agnostic store shared by Claude Code, Codex, Gemini, etc.
|
|
21
|
-
DOFLOW_HOME="${XDG_CONFIG_HOME:-$HOME/.config}/doflow"
|
|
22
|
-
STATE_DIR="$DOFLOW_HOME/session-env"
|
|
23
|
-
SESSION_DIR="$STATE_DIR/sessions"
|
|
24
|
-
PROJECTS_DIR="$STATE_DIR/projects"
|
|
25
|
-
# shellcheck disable=SC2034 # used by session-start.sh and session-end.sh which source this file
|
|
26
|
-
SESSIONS_LOG="$DOFLOW_HOME/sessions.log"
|
|
27
|
-
|
|
28
|
-
# Identifies which agent is running. Override via env var for non-Claude agents.
|
|
29
|
-
export DOFLOW_AGENT="${DOFLOW_AGENT:-unknown}"
|
|
30
|
-
|
|
31
|
-
# ── Portability primitives ───────────────────────────────────────────────────
|
|
32
|
-
#
|
|
33
|
-
# The helpers in this section replace non-portable GNU/Linux-only dependencies
|
|
34
|
-
# (realpath -e, flock, GNU timeout, bare sha256sum) with equivalents that run
|
|
35
|
-
# on stock macOS, Git Bash/MSYS2, and common Linux distros without requiring
|
|
36
|
-
# any additional package install (no Homebrew coreutils assumed).
|
|
37
|
-
|
|
38
|
-
# Print an absolute, symlink-resolved form of <path> to stdout when <path>
|
|
39
|
-
# exists; otherwise print <path> unchanged. Replaces `realpath -e "$1" ||
|
|
40
|
-
# echo "$1"`, which already fails silently on stock macOS (BSD realpath has
|
|
41
|
-
# no -e flag) and falls back to an uncanonicalized path. Uses only primitives
|
|
42
|
-
# present on every target: cd, pwd -P, dirname, basename.
|
|
43
|
-
#
|
|
44
|
-
# Hardening notes:
|
|
45
|
-
# - `CDPATH=` resets CDPATH for the internal `cd` so a user's exported
|
|
46
|
-
# CDPATH can't redirect it to an unrelated directory of the same name
|
|
47
|
-
# (and can't make `cd` echo a stray "found via CDPATH" line to stdout).
|
|
48
|
-
# - `--` guards `dirname`/`basename`/`cd` against a path that begins with
|
|
49
|
-
# `-` being parsed as an option.
|
|
50
|
-
# - if the internal `cd` fails for any reason, `||` falls through to the
|
|
51
|
-
# uncanonicalized-path branch instead of aborting under this file's
|
|
52
|
-
# `set -e` (matching the old `realpath ... || echo "$1"` degrade path).
|
|
53
|
-
# - a root-level parent directory ("/") is special-cased so the result
|
|
54
|
-
# never gets a leading `//`, which POSIX leaves undefined and which
|
|
55
|
-
# Cygwin/MSYS2 (a DoFlow target platform) interprets as a UNC path.
|
|
56
|
-
canonicalize_path() {
|
|
57
|
-
local path="$1" dir base
|
|
58
|
-
if [[ -e "$path" ]] \
|
|
59
|
-
&& dir=$(CDPATH= cd -P -- "$(dirname -- "$path")" 2>/dev/null && pwd -P); then
|
|
60
|
-
base=$(basename -- "$path")
|
|
61
|
-
if [[ "$dir" == "/" ]]; then
|
|
62
|
-
printf '/%s\n' "$base"
|
|
63
|
-
else
|
|
64
|
-
printf '%s/%s\n' "$dir" "$base"
|
|
65
|
-
fi
|
|
66
|
-
else
|
|
67
|
-
printf '%s\n' "$path"
|
|
68
|
-
fi
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
# Internal: age in whole seconds of <path>'s mtime, or nothing (and a
|
|
72
|
-
# non-zero return) if it cannot be determined. Handles both GNU stat
|
|
73
|
-
# (-c %Y) and BSD/macOS stat (-f %m) since this file assumes neither.
|
|
74
|
-
lock_dir_age_seconds() {
|
|
75
|
-
local path="$1"
|
|
76
|
-
local mtime
|
|
77
|
-
mtime=$(stat -c %Y "$path" 2>/dev/null) || mtime=$(stat -f %m "$path" 2>/dev/null) || return 1
|
|
78
|
-
echo $(( $(date +%s) - mtime ))
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
# A lock dir older than this is presumed abandoned (holder crashed or was
|
|
82
|
-
# killed before it could release) and eligible for reclaim. Deliberately
|
|
83
|
-
# independent of any given with_file_lock call's own <timeout_seconds>: a
|
|
84
|
-
# caller's polling budget is "how long am I willing to wait," which is
|
|
85
|
-
# unrelated to "is the current holder still plausibly alive." Reusing
|
|
86
|
-
# timeout_seconds for both would let a live holder's lock get stolen out
|
|
87
|
-
# from under it the moment a contending caller's own wait approaches its
|
|
88
|
-
# timeout — reclaim needs a threshold generous enough that no legitimate
|
|
89
|
-
# hook invocation is still running, not tied to a contender's patience.
|
|
90
|
-
LOCK_STALE_SECONDS=${LOCK_STALE_SECONDS:-300}
|
|
91
|
-
|
|
92
|
-
# Acquire an exclusive lock on <lockfile>, using atomic mkdir (atomic on
|
|
93
|
-
# every filesystem DoFlow runs on, including NTFS via MSYS2). Replaces
|
|
94
|
-
# `flock -x -w <seconds> 200`, which is confirmed absent entirely on macOS
|
|
95
|
-
# (util-linux only). Gives up after <timeout_seconds> instead of blocking
|
|
96
|
-
# indefinitely, returning non-zero on timeout.
|
|
97
|
-
#
|
|
98
|
-
# Unlike `flock`, a `mkdir`-based lock has no kernel-backed release on
|
|
99
|
-
# holder crash/kill, so this also reclaims the lock directory once it is
|
|
100
|
-
# older than LOCK_STALE_SECONDS (treating it as abandoned), and separately
|
|
101
|
-
# clears — rather than waits out the full timeout on — a non-directory
|
|
102
|
-
# occupying <lockfile>, since a live holder created here always makes a
|
|
103
|
-
# directory. That second case matters on upgrade: hosts that ran the old
|
|
104
|
-
# `flock -x 200>"$LOCK_FILE"` implementation already have a *regular file*
|
|
105
|
-
# at that path, which `mkdir` would otherwise EEXIST against forever.
|
|
106
|
-
#
|
|
107
|
-
# Calling convention: on success, installs a matching release via an EXIT
|
|
108
|
-
# trap (fires on normal exit, on `set -e` abort, and on a killed subshell —
|
|
109
|
-
# unlike a RETURN trap, which never fires for a top-level script, only for
|
|
110
|
-
# a function return), so the caller does not need to remember to release:
|
|
111
|
-
#
|
|
112
|
-
# if with_file_lock "$lockfile" 5; then
|
|
113
|
-
# ... guarded section ...
|
|
114
|
-
# else
|
|
115
|
-
# echo "[hooks] timed out waiting for lock: $lockfile" >&2
|
|
116
|
-
# fi
|
|
117
|
-
with_file_lock() {
|
|
118
|
-
local lockfile="$1"
|
|
119
|
-
local timeout_seconds="$2"
|
|
120
|
-
local waited=0 age
|
|
121
|
-
while true; do
|
|
122
|
-
if mkdir "$lockfile" 2>/dev/null; then
|
|
123
|
-
trap 'release_file_lock "'"$lockfile"'"' EXIT
|
|
124
|
-
return 0
|
|
125
|
-
fi
|
|
126
|
-
if [[ -e "$lockfile" && ! -d "$lockfile" ]]; then
|
|
127
|
-
rm -f "$lockfile" 2>/dev/null || true
|
|
128
|
-
continue
|
|
129
|
-
fi
|
|
130
|
-
if [[ -d "$lockfile" ]]; then
|
|
131
|
-
age=$(lock_dir_age_seconds "$lockfile") || age=""
|
|
132
|
-
if [[ -n "$age" ]] && (( age >= LOCK_STALE_SECONDS )); then
|
|
133
|
-
rmdir "$lockfile" 2>/dev/null || true
|
|
134
|
-
continue
|
|
135
|
-
fi
|
|
136
|
-
fi
|
|
137
|
-
if (( waited >= timeout_seconds )); then
|
|
138
|
-
return 1
|
|
139
|
-
fi
|
|
140
|
-
sleep 1
|
|
141
|
-
waited=$((waited + 1))
|
|
142
|
-
done
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
# Release a lock acquired with with_file_lock. Normally invoked via the
|
|
146
|
-
# EXIT trap with_file_lock installs on success; safe to call directly too.
|
|
147
|
-
release_file_lock() {
|
|
148
|
-
local lockfile="$1"
|
|
149
|
-
rmdir "$lockfile" 2>/dev/null || true
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
# Run <command...> (after a literal `--` separator), terminating it if it
|
|
153
|
-
# exceeds <seconds>. Replaces a bare dependency on GNU `timeout`, which is
|
|
154
|
-
# not installed by default on stock macOS without Homebrew coreutils. When
|
|
155
|
-
# neither `timeout` nor `gtimeout` is on PATH, runs <command...> directly
|
|
156
|
-
# with no enforced budget (soft safety net, not a correctness requirement).
|
|
157
|
-
#
|
|
158
|
-
# `command -v timeout` is verified to actually be GNU coreutils' `timeout`
|
|
159
|
-
# before use: Git Bash inherits the Windows PATH, where `timeout` can
|
|
160
|
-
# resolve to System32's interactive delay command instead — a completely
|
|
161
|
-
# different, incompatible CLI that would reject our arguments and prevent
|
|
162
|
-
# the wrapped command from running at all. `timeout --version` succeeds
|
|
163
|
-
# only on the GNU coreutils build; the Windows binary errors on it.
|
|
164
|
-
#
|
|
165
|
-
# Usage: run_with_timeout 5 -- some_command --with --args
|
|
166
|
-
run_with_timeout() {
|
|
167
|
-
local seconds="$1"
|
|
168
|
-
shift
|
|
169
|
-
if [[ "${1:-}" == "--" ]]; then
|
|
170
|
-
shift
|
|
171
|
-
fi
|
|
172
|
-
if command -v timeout &>/dev/null && timeout --version &>/dev/null; then
|
|
173
|
-
timeout "$seconds" "$@"
|
|
174
|
-
elif command -v gtimeout &>/dev/null; then
|
|
175
|
-
gtimeout "$seconds" "$@"
|
|
176
|
-
else
|
|
177
|
-
"$@"
|
|
178
|
-
fi
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
# ── cwd_hash ─────────────────────────────────────────────────────────────────
|
|
182
|
-
|
|
183
|
-
# Derive a stable 16-char hash of an absolute directory path.
|
|
184
|
-
# Used to namespace per-project state (compact summaries, warnings).
|
|
185
|
-
# Normalizes symlinks and ../ components so equivalent paths hash identically.
|
|
186
|
-
#
|
|
187
|
-
# For a path that is (or resolves to) an existing directory — the case this
|
|
188
|
-
# function exists for — fully resolves it, including a symlink at the path's
|
|
189
|
-
# own leaf component, via `(cd "$1" && pwd -P)`, so equivalent directories
|
|
190
|
-
# always hash identically. Callers that ever pass a non-directory or
|
|
191
|
-
# nonexistent path fall back to the general-purpose canonicalize_path, which
|
|
192
|
-
# — being usable by any file or missing path, not just directories — only
|
|
193
|
-
# resolves symlinks in the parent chain, not the leaf itself.
|
|
194
|
-
cwd_hash() {
|
|
195
|
-
local canonical
|
|
196
|
-
if [ -d "$1" ]; then
|
|
197
|
-
canonical=$(cd "$1" && pwd -P)
|
|
198
|
-
else
|
|
199
|
-
canonical=$(canonicalize_path "$1")
|
|
200
|
-
fi
|
|
201
|
-
if command -v sha256sum &>/dev/null; then
|
|
202
|
-
echo "$canonical" | sha256sum | cut -c1-16
|
|
203
|
-
elif command -v shasum &>/dev/null; then
|
|
204
|
-
echo "$canonical" | shasum -a 256 | cut -c1-16
|
|
205
|
-
else
|
|
206
|
-
printf '%016x\n' "$(echo "$canonical" | cksum | cut -d' ' -f1)"
|
|
207
|
-
fi
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
# ── Git state helpers ────────────────────────────────────────────────────────
|
|
211
|
-
#
|
|
212
|
-
# Thin wrappers around `git -C <cwd> ...` with the project's standard 1s
|
|
213
|
-
# timeout. Each echoes git's own output (or nothing/0 on failure) and leaves
|
|
214
|
-
# stderr suppressed -- callers keep their own `|| echo <fallback>` around a
|
|
215
|
-
# call for a script-specific default, exactly as the inline git calls these
|
|
216
|
-
# replace did (022-hooks-remaining-duplication). Kept in this per-harness
|
|
217
|
-
# copy rather than moved to the canonical lib.sh's sourcing path: this
|
|
218
|
-
# script's own with_file_lock/other APIs have not been reconciled with the
|
|
219
|
-
# canonical copy, so repointing the `source` line is a separate, larger
|
|
220
|
-
# change this refactor does not make.
|
|
221
|
-
|
|
222
|
-
is_git_worktree() {
|
|
223
|
-
run_with_timeout 1 -- git -C "$1" rev-parse --is-inside-work-tree &>/dev/null
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
git_branch_of() {
|
|
227
|
-
run_with_timeout 1 -- git -C "$1" branch --show-current 2>/dev/null
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
git_short_sha_of() {
|
|
231
|
-
run_with_timeout 1 -- git -C "$1" rev-parse --short HEAD 2>/dev/null
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
git_uncommitted_count_of() {
|
|
235
|
-
run_with_timeout 1 -- git -C "$1" status --porcelain 2>/dev/null | wc -l | tr -d ' '
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
has_uncommitted_changes() {
|
|
239
|
-
run_with_timeout 1 -- git -C "$1" status --porcelain 2>/dev/null | grep -q .
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
# ── Directory helpers ─────────────────────────────────────────────────────────
|
|
243
|
-
|
|
244
|
-
# Create and return the session-scoped state directory for a given session_id.
|
|
245
|
-
# Safe to call multiple times (mkdir -p is idempotent).
|
|
246
|
-
ensure_session_dir() {
|
|
247
|
-
local session_id="$1"
|
|
248
|
-
mkdir -p "$SESSION_DIR/$session_id"
|
|
249
|
-
echo "$SESSION_DIR/$session_id"
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
# Create and return the project-scoped state directory for a given cwd.
|
|
253
|
-
# Shared across all sessions in the same directory.
|
|
254
|
-
ensure_project_dir() {
|
|
255
|
-
local cwd="$1"
|
|
256
|
-
local hash
|
|
257
|
-
hash=$(cwd_hash "$cwd")
|
|
258
|
-
mkdir -p "$PROJECTS_DIR/$hash"
|
|
259
|
-
echo "$PROJECTS_DIR/$hash"
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
# ── JSON helpers ──────────────────────────────────────────────────────────────
|
|
263
|
-
|
|
264
|
-
# Extract a field from a JSON string.
|
|
265
|
-
# Usage: json_field "$INPUT" ".field_name"
|
|
266
|
-
# Returns empty string if field is null or jq fails.
|
|
267
|
-
json_field() {
|
|
268
|
-
local json="$1"
|
|
269
|
-
local query="$2"
|
|
270
|
-
echo "$json" | jq -r "$query // empty" 2>/dev/null || echo ""
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
# ── Dependency guard ──────────────────────────────────────────────────────────
|
|
274
|
-
|
|
275
|
-
# Verify jq is available at runtime. If absent, emit a diagnostic to stderr
|
|
276
|
-
# and exit 0 (never block the harness — degraded operation is preferable to failure).
|
|
277
|
-
require_jq() {
|
|
278
|
-
if ! command -v jq &>/dev/null; then
|
|
279
|
-
echo "[hooks] jq not found — install jq to enable session lifecycle hooks (apt install jq / brew install jq)" >&2
|
|
280
|
-
exit 0
|
|
281
|
-
fi
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
# ── Session role ──────────────────────────────────────────────────────────────
|
|
285
|
-
|
|
286
|
-
# Print `main` or `worker` for this session, read from DOFLOW_SESSION_ROLE (matched
|
|
287
|
-
# case-insensitively). Unset or empty is `main`; a value that is neither `main` nor
|
|
288
|
-
# `worker` is `worker` and writes one line to stderr. A worker never writes or claims the
|
|
289
|
-
# project's compact summary or warning. Always returns 0. bash 3.2 safe (no ${var,,}).
|
|
290
|
-
doflow_session_role() {
|
|
291
|
-
local role
|
|
292
|
-
role=$(printf '%s' "${DOFLOW_SESSION_ROLE:-}" | tr '[:upper:]' '[:lower:]') || role=""
|
|
293
|
-
case "$role" in
|
|
294
|
-
""|main) printf 'main\n' ;;
|
|
295
|
-
worker) printf 'worker\n' ;;
|
|
296
|
-
*)
|
|
297
|
-
echo "[doflow] unknown DOFLOW_SESSION_ROLE; treating session as worker" >&2
|
|
298
|
-
printf 'worker\n'
|
|
299
|
-
;;
|
|
300
|
-
esac
|
|
301
|
-
return 0
|
|
302
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Gemini front door: mcp-tool-guard through the shared lifecycle bridge.
|
|
3
|
-
set -uo pipefail
|
|
4
|
-
export DOFLOW_AGENT="${DOFLOW_AGENT:-gemini}"
|
|
5
|
-
if ! . "$(dirname "$0")/../../.doflow/shared/hooks/bridge/bridge.sh" 2>/dev/null; then
|
|
6
|
-
printf '%s\n' '{"decision":"deny","reason":"[doflow] shared hooks lack the bridge; run: doflow update -t gemini"}'
|
|
7
|
-
exit 0
|
|
8
|
-
fi
|
|
9
|
-
doflow_bridge gemini BeforeTool mcp-tool-guard
|
|
10
|
-
exit $?
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# post-edit-lint.sh — AfterTool(write_file|replace) hook
|
|
3
|
-
#
|
|
4
|
-
# Pure collector: appends the edited/written file_path to a session-scoped
|
|
5
|
-
# list. The actual lint work happens in stop-check.sh at the end of each
|
|
6
|
-
# turn, where all paths can be batched by extension in one pass.
|
|
7
|
-
#
|
|
8
|
-
# Gemini's write_file/replace tools both use a "file_path" tool_input key
|
|
9
|
-
# (docs/reference/tools.md) — same field as Claude's
|
|
10
|
-
# Edit/Write, unlike Codex's apply_patch (which needed patch-text parsing).
|
|
11
|
-
#
|
|
12
|
-
# KNOWN GAP: stop-check.sh (Claude's/Codex's consumer of edited-files.txt, run on the
|
|
13
|
-
# Stop event) is NOT ported to Gemini — Gemini has no Stop-equivalent event (design.md
|
|
14
|
-
# §8, this feature). This collector currently writes data nothing reads. Shipped anyway
|
|
15
|
-
# as forward-looking infrastructure, same precedent as this repo's own mcp-policy.conf
|
|
16
|
-
# (ships empty, ahead of real usage) — revisit once/if a Gemini turn-end consumer exists.
|
|
17
|
-
#
|
|
18
|
-
# Multi-session safe: writes only to sessions/{session_id}/edited-files.txt.
|
|
19
|
-
# Must complete in <20ms. Must never exit non-zero or produce unexpected output.
|
|
20
|
-
|
|
21
|
-
set -euo pipefail
|
|
22
|
-
# shellcheck source=lib.sh
|
|
23
|
-
source "$(dirname "$0")/lib.sh"
|
|
24
|
-
require_jq
|
|
25
|
-
|
|
26
|
-
INPUT=$(cat)
|
|
27
|
-
SESSION_ID=$(json_field "$INPUT" ".session_id")
|
|
28
|
-
TOOL_NAME=$(json_field "$INPUT" ".tool_name")
|
|
29
|
-
|
|
30
|
-
[[ "$TOOL_NAME" != "write_file" && "$TOOL_NAME" != "replace" ]] && exit 0
|
|
31
|
-
[[ -z "$SESSION_ID" ]] && exit 0
|
|
32
|
-
|
|
33
|
-
FILE_PATH=$(json_field "$INPUT" ".tool_input.file_path")
|
|
34
|
-
[[ -z "$FILE_PATH" ]] && exit 0
|
|
35
|
-
|
|
36
|
-
SESSION_PATH=$(ensure_session_dir "$SESSION_ID")
|
|
37
|
-
echo "$FILE_PATH" >> "$SESSION_PATH/edited-files.txt"
|
|
38
|
-
|
|
39
|
-
exit 0
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Gemini front door: pre-bash-guard through the shared lifecycle bridge.
|
|
3
|
-
set -uo pipefail
|
|
4
|
-
export DOFLOW_AGENT="${DOFLOW_AGENT:-gemini}"
|
|
5
|
-
if ! . "$(dirname "$0")/../../.doflow/shared/hooks/bridge/bridge.sh" 2>/dev/null; then
|
|
6
|
-
printf '%s\n' '{"decision":"deny","reason":"[doflow] shared hooks lack the bridge; run: doflow update -t gemini"}'
|
|
7
|
-
exit 0
|
|
8
|
-
fi
|
|
9
|
-
doflow_bridge gemini BeforeTool pre-bash-guard
|
|
10
|
-
exit $?
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# pre-compact.sh — PreCompress hook
|
|
3
|
-
#
|
|
4
|
-
# Gemini's PreCompress output schema (docs/hooks/reference.md) accepts a
|
|
5
|
-
# "systemMessage" field, displayed to the user before compression — no
|
|
6
|
-
# additionalContext-style field that feeds compaction content directly, same
|
|
7
|
-
# limitation as Codex's PreCompact. Gathers the same git-state summary Claude's/
|
|
8
|
-
# Codex's pre-compact scripts do, surfaced as a systemMessage instead.
|
|
9
|
-
#
|
|
10
|
-
# Must never exit non-zero or block.
|
|
11
|
-
|
|
12
|
-
set -euo pipefail
|
|
13
|
-
# shellcheck source=lib.sh
|
|
14
|
-
source "$(dirname "$0")/lib.sh"
|
|
15
|
-
require_jq
|
|
16
|
-
|
|
17
|
-
INPUT=$(cat)
|
|
18
|
-
CWD=$(json_field "$INPUT" ".cwd")
|
|
19
|
-
|
|
20
|
-
BRANCH=""
|
|
21
|
-
SHA=""
|
|
22
|
-
UNCOMMITTED=0
|
|
23
|
-
|
|
24
|
-
if [[ -n "$CWD" ]] && is_git_worktree "$CWD"; then
|
|
25
|
-
BRANCH=$(git_branch_of "$CWD" || echo "")
|
|
26
|
-
SHA=$(git_short_sha_of "$CWD" || echo "")
|
|
27
|
-
UNCOMMITTED=$(git_uncommitted_count_of "$CWD" || echo "0")
|
|
28
|
-
RECENT=$(run_with_timeout 1 -- git -C "$CWD" log --format="%h %s" -2 2>/dev/null | paste -sd ' | ' - || echo "")
|
|
29
|
-
|
|
30
|
-
MSG=$(printf 'Compacting session — git branch: %s sha: %s, recent commits: %s, uncommitted files: %s, cwd: %s' \
|
|
31
|
-
"${BRANCH:-unknown}" "${SHA:-unknown}" "${RECENT:-none}" "$UNCOMMITTED" "${CWD:-unknown}")
|
|
32
|
-
else
|
|
33
|
-
MSG=$(printf 'Compacting session — cwd: %s (not a git repository)' "${CWD:-unknown}")
|
|
34
|
-
fi
|
|
35
|
-
|
|
36
|
-
MSG="${MSG:0:490}"
|
|
37
|
-
jq -n --arg systemMessage "$MSG" '{systemMessage: $systemMessage}'
|
|
38
|
-
exit 0
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Gemini front door: pre-implementation-gate through the shared lifecycle bridge.
|
|
3
|
-
set -uo pipefail
|
|
4
|
-
export DOFLOW_AGENT="${DOFLOW_AGENT:-gemini}"
|
|
5
|
-
if ! . "$(dirname "$0")/../../.doflow/shared/hooks/bridge/bridge.sh" 2>/dev/null; then
|
|
6
|
-
printf '%s\n' '{"decision":"deny","reason":"[doflow] shared hooks lack the bridge; run: doflow update -t gemini"}'
|
|
7
|
-
exit 0
|
|
8
|
-
fi
|
|
9
|
-
doflow_bridge gemini BeforeTool pre-implementation-gate
|
|
10
|
-
exit $?
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# session-end.sh — SessionEnd hook
|
|
3
|
-
#
|
|
4
|
-
# Runs when Claude Code closes a session. Responsibilities:
|
|
5
|
-
# 1. Append END marker to sessions.log
|
|
6
|
-
# 2. Write uncommitted-warning.txt if the working tree is dirty
|
|
7
|
-
# 3. Delete the session-scoped state directory (cleanup)
|
|
8
|
-
# 4. Trim sessions.log to last 500 lines (lock-guarded for parallel safety)
|
|
9
|
-
#
|
|
10
|
-
# Multi-session safe: with_file_lock prevents concurrent sessions from
|
|
11
|
-
# corrupting the log trim. Session directory deletion is per session_id so
|
|
12
|
-
# sessions don't interfere.
|
|
13
|
-
# Must never exit non-zero or block (SessionEnd is fire-and-forget).
|
|
14
|
-
|
|
15
|
-
set -euo pipefail
|
|
16
|
-
# shellcheck source=lib.sh
|
|
17
|
-
source "$(dirname "$0")/lib.sh"
|
|
18
|
-
require_jq
|
|
19
|
-
|
|
20
|
-
INPUT=$(cat)
|
|
21
|
-
SESSION_ID=$(json_field "$INPUT" ".session_id")
|
|
22
|
-
CWD=$(json_field "$INPUT" ".cwd")
|
|
23
|
-
|
|
24
|
-
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
25
|
-
|
|
26
|
-
# ── 1. Log session end ────────────────────────────────────────────────────────
|
|
27
|
-
|
|
28
|
-
mkdir -p "$(dirname "$SESSIONS_LOG")"
|
|
29
|
-
echo "$TIMESTAMP END ${SESSION_ID:-unknown} ${CWD:-unknown}" >> "$SESSIONS_LOG"
|
|
30
|
-
|
|
31
|
-
# ── 2. Uncommitted-changes warning ────────────────────────────────────────────
|
|
32
|
-
|
|
33
|
-
# A worker session never writes the project's warning; it is left for the main session.
|
|
34
|
-
if [[ "$(doflow_session_role || echo main)" != "worker" ]] && [[ -n "$CWD" ]] && is_git_worktree "$CWD"; then
|
|
35
|
-
if has_uncommitted_changes "$CWD"; then
|
|
36
|
-
BRANCH=$(git_branch_of "$CWD" || echo "unknown")
|
|
37
|
-
PROJECT_DIR=$(ensure_project_dir "$CWD")
|
|
38
|
-
echo "Session ${SESSION_ID:-unknown} ended with uncommitted changes on branch ${BRANCH}" \
|
|
39
|
-
> "$PROJECT_DIR/uncommitted-warning.txt"
|
|
40
|
-
fi
|
|
41
|
-
fi
|
|
42
|
-
|
|
43
|
-
# ── 2b. Update meta.json last_active ─────────────────────────────────────────
|
|
44
|
-
|
|
45
|
-
if [[ -n "$CWD" ]]; then
|
|
46
|
-
PROJECT_DIR=$(ensure_project_dir "$CWD")
|
|
47
|
-
if [[ -f "$PROJECT_DIR/meta.json" ]]; then
|
|
48
|
-
META_TMP=$(mktemp "$PROJECT_DIR/.meta.XXXXXX")
|
|
49
|
-
jq --arg ts "$TIMESTAMP" '.last_active = $ts' "$PROJECT_DIR/meta.json" \
|
|
50
|
-
> "$META_TMP" && mv "$META_TMP" "$PROJECT_DIR/meta.json" \
|
|
51
|
-
|| rm -f "$META_TMP" 2>/dev/null || true
|
|
52
|
-
fi
|
|
53
|
-
fi
|
|
54
|
-
|
|
55
|
-
# ── 3. Delete session directory ───────────────────────────────────────────────
|
|
56
|
-
|
|
57
|
-
if [[ -n "$SESSION_ID" ]]; then
|
|
58
|
-
SESSION_PATH="$SESSION_DIR/$SESSION_ID"
|
|
59
|
-
rm -rf "$SESSION_PATH" 2>/dev/null || true
|
|
60
|
-
fi
|
|
61
|
-
|
|
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
|
|
72
|
-
|
|
73
|
-
# ── 4. Trim sessions.log (lock-guarded) ───────────────────────────────────────
|
|
74
|
-
|
|
75
|
-
LOCK_FILE="${SESSIONS_LOG}.lock"
|
|
76
|
-
if with_file_lock "$LOCK_FILE" 5; then
|
|
77
|
-
if [[ -f "$SESSIONS_LOG" ]]; then
|
|
78
|
-
TMP=$(mktemp "${SESSIONS_LOG}.XXXXXX")
|
|
79
|
-
if tail -n 500 "$SESSIONS_LOG" > "$TMP"; then
|
|
80
|
-
mv "$TMP" "$SESSIONS_LOG" || rm -f "$TMP"
|
|
81
|
-
else
|
|
82
|
-
rm -f "$TMP"
|
|
83
|
-
fi
|
|
84
|
-
fi
|
|
85
|
-
else
|
|
86
|
-
echo "[hooks] timed out waiting for lock: $LOCK_FILE" >&2 # Give up after 5s rather than block indefinitely
|
|
87
|
-
fi
|
|
88
|
-
|
|
89
|
-
exit 0
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Gemini front door: session-context through the shared lifecycle bridge.
|
|
3
|
-
set -uo pipefail
|
|
4
|
-
export DOFLOW_AGENT="${DOFLOW_AGENT:-gemini}"
|
|
5
|
-
if ! . "$(dirname "$0")/../../.doflow/shared/hooks/bridge/bridge.sh" 2>/dev/null; then exit 0; fi
|
|
6
|
-
doflow_bridge gemini SessionStart session-context
|
|
7
|
-
exit $?
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
# Runtime Behavior and Flags
|
|
2
|
-
|
|
3
|
-
Loaded into **every** session on every harness. What a flag used to request is now mostly
|
|
4
|
-
unconditional, so this states the behavior once rather than listing knobs.
|
|
5
|
-
|
|
6
|
-
## Always on
|
|
7
|
-
|
|
8
|
-
**Readiness gating** — a stage that edits source is graded against its class contract first;
|
|
9
|
-
the verdict is one of four states, never a number.
|
|
10
|
-
**Recovery bounds** — a failed verification is classified and retried under a bound the runtime
|
|
11
|
-
sets. You do not pick a cycle count.
|
|
12
|
-
**Run tracing** — every runtime call is recorded as it happens and read back; where a run
|
|
13
|
-
stopped is read from that record, never reconstructed.
|
|
14
|
-
**Capability routing** — an information need resolves to a provider healthy on this machine, not to
|
|
15
|
-
a habitual tool.
|
|
16
|
-
|
|
17
|
-
## Flags
|
|
18
|
-
|
|
19
|
-
What the user typed beats auto-detection. Every flag belongs to one skill and is declared in that
|
|
20
|
-
skill's `argument-hint`, except this one, which crosses them:
|
|
21
|
-
|
|
22
|
-
**--focus [quality|security|performance|architecture]** — narrows analysis to one domain. Consumed
|
|
23
|
-
by `do-diagnose`.
|
|
24
|
-
|
|
25
|
-
MCP short flags are generated per install into `MCP_INDEX.md`; this file names no server.
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
# Safety Rules (CRITICAL)
|
|
2
|
-
|
|
3
|
-
## Priority System
|
|
4
|
-
**CRITICAL** — Security, data safety, production — never compromise
|
|
5
|
-
**IMPORTANT** — Quality, maintainability, professionalism — strong preference
|
|
6
|
-
**RECOMMENDED** — Optimization, style, best practices — apply when practical
|
|
7
|
-
|
|
8
|
-
Conflict order: Safety > Scope > Quality > Speed. Prototype != Production requirements.
|
|
9
|
-
|
|
10
|
-
<important if="debugging, fixing a bug, or investigating a failure">
|
|
11
|
-
## Failure Investigation
|
|
12
|
-
- Root cause always — understand WHY, not just THAT; fix the cause, not the symptom
|
|
13
|
-
- Never skip/disable/comment-out tests or validation to pass builds
|
|
14
|
-
</important>
|
|
15
|
-
|
|
16
|
-
<important if="performing git operations or starting work on a codebase">
|
|
17
|
-
## Git Workflow
|
|
18
|
-
- `git status && git branch` first; feature branches for ALL work; never force-push main
|
|
19
|
-
- Commit incrementally with descriptive messages; `git diff` before staging; restore-point commit
|
|
20
|
-
before anything risky
|
|
21
|
-
</important>
|
|
22
|
-
|
|
23
|
-
## Temporal Awareness
|
|
24
|
-
- Read the date from `<env>` before any temporal claim; never infer it from your knowledge cutoff,
|
|
25
|
-
and state its source
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
# Workflow Rules
|
|
2
|
-
|
|
3
|
-
## Planning
|
|
4
|
-
- **Parallel by default** — sequential only for hard dependencies; a task list once past 3 tasks, when the session offers one
|
|
5
|
-
- Validate before execution, verify after; run lint/typecheck before marking complete
|
|
6
|
-
- Check deps (package.json) and existing patterns before any changes
|
|
7
|
-
- Feature delivery follows the doflow chain — see `references/DOFLOW_CHAIN.md` for the phase-gated
|
|
8
|
-
flow, artifact contracts, and the enforced gate
|
|
9
|
-
|
|
10
|
-
<important if="planning or starting a multi-step task">
|
|
11
|
-
## Planning Efficiency
|
|
12
|
-
- Identify concurrent vs sequential operations
|
|
13
|
-
- Map dependencies; batch tool calls; estimate parallelization gains
|
|
14
|
-
</important>
|
|
15
|
-
|
|
16
|
-
## Implementation Completeness
|
|
17
|
-
- Start it = Finish it. No partial features, TODO stubs, mocks, or "not implemented" throws
|
|
18
|
-
- All generated code must work as specified; no scaffolding placeholders
|
|
19
|
-
|
|
20
|
-
## Scope Discipline
|
|
21
|
-
- Build ONLY what's asked — no bonus features, no enterprise bloat (auth/monitoring/deployment
|
|
22
|
-
unless requested)
|
|
23
|
-
- MVP first; YAGNI; single responsibility per component
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
# Quality Rules
|
|
2
|
-
|
|
3
|
-
## Organization & Hygiene
|
|
4
|
-
**Naming**: Follow language standards (camelCase JS, snake_case Python); no mixed conventions
|
|
5
|
-
**Files**: Organize by feature/domain; tests → `tests/`; scripts → `scripts/`; reports → `agent-docs/`
|
|
6
|
-
**Workspace**: Remove temp files, debug scripts, build artifacts after use; never leave clutter in VCS
|
|
7
|
-
|
|
8
|
-
## Professional Honesty
|
|
9
|
-
- No marketing language ("blazingly fast", "100% secure", "magnificent")
|
|
10
|
-
- No invented sources, figures, citations or quotes; leave out what you cannot trace; state "untested/MVP/needs validation" honestly
|
|
11
|
-
- If you are not sure, say so plainly and name what is unknown; do not present a guess as established
|
|
12
|
-
- Warn when a claim may be outdated: information from memory or an old source can have changed since it was written
|
|
13
|
-
- Never attribute a statement or view to a real person unless you have verified it; otherwise omit the name
|
|
14
|
-
- Push back on bad approaches; evidence-based claims only
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
# Question & Clarification Rules
|
|
2
|
-
|
|
3
|
-
## When to Ask
|
|
4
|
-
- Ask ONLY for genuine user-owned decisions unresolved by the request, the code, or sensible defaults
|
|
5
|
-
- Enough to act → act; don't ask to confirm the obvious (see RULE_02 Scope Discipline)
|
|
6
|
-
- One question that unblocks beats three that re-litigate settled choices
|
|
7
|
-
|
|
8
|
-
<important if="asking the user a clarifying question or choosing between approaches">
|
|
9
|
-
## How to Ask (MANDATORY format)
|
|
10
|
-
Structured multiple-choice — never a free-form question buried in prose.
|
|
11
|
-
- **A native question tool exists in this session** (Claude Code's `AskUserQuestion`, or any
|
|
12
|
-
harness tool that presents options and returns the user's choice): use it. Which harness this
|
|
13
|
-
is is not the test — what THIS session offers is; Codex and Gemini sessions increasingly
|
|
14
|
-
carry one.
|
|
15
|
-
- **No native question tool** (truly non-interactive runs): write a `{stage}-questions.md` file
|
|
16
|
-
with `[Answer]:` tags — the fallback, never the preference.
|
|
17
|
-
|
|
18
|
-
Each question:
|
|
19
|
-
- 2–4 **meaningful, mutually-exclusive** options covering the real scenarios
|
|
20
|
-
- NEVER invent filler; an "Other"/free-text escape is always the last choice
|
|
21
|
-
- One topic per question; specific and unambiguous; lead with your recommended default
|
|
22
|
-
</important>
|
|
23
|
-
|
|
24
|
-
<important if="writing a question file because this session has no native question tool">
|
|
25
|
-
## Question-File Format
|
|
26
|
-
```markdown
|
|
27
|
-
## Question 1 — [the question]
|
|
28
|
-
A) [option] B) [option] X) Other (free text after the tag)
|
|
29
|
-
|
|
30
|
-
[Answer]:
|
|
31
|
-
```
|
|
32
|
-
Naming: `{stage}-questions.md` (e.g. `spec-questions.md`) in the directory the stage writes
|
|
33
|
-
its output to — not a fixed path outside the repo's layout.
|
|
34
|
-
|
|
35
|
-
Lifecycle: write the file → tell the user and wait for "done" → read answers →
|
|
36
|
-
**Validate Before Proceeding** (below) → act. A missing `[Answer]:`, or one that is not a listed
|
|
37
|
-
letter, means ask again — never guess, and never reinterpret free text as a letter choice.
|
|
38
|
-
</important>
|
|
39
|
-
|
|
40
|
-
<important if="reading the user's answers before you act on them">
|
|
41
|
-
## Validate Before Proceeding
|
|
42
|
-
- Scan answers for contradictions (scope vs risk, quick fix vs multi-subsystem) and ambiguity
|
|
43
|
-
- Conflict found → name it and ask one targeted follow-up in `{stage}-clarification-questions.md`,
|
|
44
|
-
same format, citing the conflicting answer; never proceed on an unresolved contradiction, and
|
|
45
|
-
never assume an answer to an ambiguous response
|
|
46
|
-
</important>
|