@khoavu882/doflow 0.0.0-stage → 2.0.0-beta.3
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/LICENSE +21 -0
- package/README.md +132 -2
- package/bin/doflow.js +44 -0
- package/core/.antigravity-plugin/hooks.json +39 -0
- package/core/.antigravity-plugin/mcp_config.json +18 -0
- package/core/.antigravity-plugin/plugin.json +31 -0
- package/core/.claude-plugin/marketplace.json +20 -0
- package/core/.claude-plugin/plugin.json +21 -0
- package/core/.codex-plugin/marketplace.json +20 -0
- package/core/.codex-plugin/plugin.json +35 -0
- package/core/.plugin/plugin.json +19 -0
- package/core/harnesses/antigravity/hooks/pre-implementation-gate.sh +9 -0
- package/core/harnesses/antigravity/hooks/stop-check.sh +10 -0
- package/core/harnesses/claude/hooks/lib.sh +304 -0
- package/core/harnesses/claude/hooks/mcp-tool-guard.sh +20 -0
- package/core/harnesses/claude/hooks/permission-audit.sh +47 -0
- package/core/harnesses/claude/hooks/post-compact.sh +74 -0
- package/core/harnesses/claude/hooks/post-edit-lint.sh +36 -0
- package/core/harnesses/claude/hooks/post-tool-failure.sh +47 -0
- package/core/harnesses/claude/hooks/pre-bash-guard.sh +20 -0
- package/core/harnesses/claude/hooks/pre-compact.sh +43 -0
- package/core/harnesses/claude/hooks/pre-implement-gate.sh +21 -0
- package/core/harnesses/claude/hooks/session-end.sh +89 -0
- package/core/harnesses/claude/hooks/session-start.sh +5 -0
- package/core/harnesses/claude/hooks/skill-config-audit.sh +39 -0
- package/core/harnesses/claude/hooks/stop-check.sh +5 -0
- package/core/harnesses/claude/hooks/subagent-audit.sh +7 -0
- package/core/harnesses/claude/hooks/user-prompt-submit.sh +5 -0
- package/core/harnesses/claude/settings/keybindings.json +20 -0
- package/core/harnesses/claude/settings/settings.json +201 -0
- package/core/harnesses/claude/statusline/doflow-statusline.sh +49 -0
- package/core/harnesses/codex/agents/core-implementer.toml +7 -0
- package/core/harnesses/codex/agents/quality-guardian.toml +8 -0
- package/core/harnesses/codex/agents/research-writer.toml +8 -0
- package/core/harnesses/codex/agents/spec-analyst.toml +8 -0
- package/core/harnesses/codex/agents/system-architect.toml +9 -0
- package/core/harnesses/codex/config/config.toml +10 -0
- package/core/harnesses/codex/hooks/hooks.json +122 -0
- package/core/harnesses/codex/hooks/lib.sh +335 -0
- package/core/harnesses/codex/hooks/mcp-tool-guard.sh +18 -0
- package/core/harnesses/codex/hooks/post-edit-lint.impl.sh +52 -0
- package/core/harnesses/codex/hooks/post-edit-lint.sh +6 -0
- package/core/harnesses/codex/hooks/pre-bash-guard.sh +18 -0
- package/core/harnesses/codex/hooks/pre-compact.impl.sh +46 -0
- package/core/harnesses/codex/hooks/pre-compact.sh +9 -0
- package/core/harnesses/codex/hooks/pre-implement-gate.sh +19 -0
- package/core/harnesses/codex/hooks/session-end.impl.sh +92 -0
- package/core/harnesses/codex/hooks/session-end.sh +5 -0
- package/core/harnesses/codex/hooks/session-start.sh +5 -0
- package/core/harnesses/codex/hooks/stop-check.sh +8 -0
- package/core/harnesses/codex/hooks/subagent-audit.sh +8 -0
- package/core/harnesses/codex/hooks/user-prompt-submit.sh +6 -0
- package/core/harnesses/gemini/hooks/hooks.json +77 -0
- package/core/harnesses/gemini/hooks/lib.sh +302 -0
- package/core/harnesses/gemini/hooks/mcp-tool-guard.sh +21 -0
- package/core/harnesses/gemini/hooks/post-edit-lint.sh +39 -0
- package/core/harnesses/gemini/hooks/pre-bash-guard.sh +21 -0
- package/core/harnesses/gemini/hooks/pre-compact.sh +38 -0
- package/core/harnesses/gemini/hooks/pre-implement-gate.sh +22 -0
- package/core/harnesses/gemini/hooks/session-end.impl.sh +89 -0
- package/core/harnesses/gemini/hooks/session-end.sh +5 -0
- package/core/harnesses/gemini/hooks/session-start.sh +5 -0
- package/core/harnesses/gemini/settings/adapter-defaults.json +4 -0
- package/core/harnesses/kiro/agents/doflow.json +58 -0
- package/core/harnesses/kiro/hooks/doflow.json +53 -0
- package/core/harnesses/kiro/hooks/lib.sh +324 -0
- package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +9 -0
- package/core/harnesses/kiro/hooks/pre-bash-guard.sh +9 -0
- package/core/harnesses/kiro/hooks/pre-implement-gate.sh +9 -0
- package/core/harnesses/kiro/hooks/session-start.sh +9 -0
- package/core/harnesses/kiro/hooks/stop-check.sh +43 -0
- package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +39 -0
- package/core/harnesses/shared/hooks/adapters/antigravity.js +111 -0
- package/core/harnesses/shared/hooks/adapters/arg-fields.js +19 -0
- package/core/harnesses/shared/hooks/adapters/gemini.js +114 -0
- package/core/harnesses/shared/hooks/hooks.json +47 -0
- package/core/harnesses/shared/hooks/policies/blocked-patterns.conf +91 -0
- package/core/harnesses/shared/hooks/policies/capture-failure.sh +97 -0
- package/core/harnesses/shared/hooks/policies/deny-json.sh +29 -0
- package/core/harnesses/shared/hooks/policies/lib.sh +501 -0
- package/core/harnesses/shared/hooks/policies/mcp-policy.conf +21 -0
- package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +91 -0
- package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +328 -0
- package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +496 -0
- package/core/harnesses/shared/hooks/policies/prompt-nudge.jq +131 -0
- package/core/harnesses/shared/hooks/policies/session-context.sh +141 -0
- package/core/harnesses/shared/hooks/policies/stop-check.sh +264 -0
- package/core/harnesses/shared/hooks/policies/subagent-audit.sh +46 -0
- package/core/harnesses/shared/hooks/policies/user-prompt-submit.sh +235 -0
- package/core/harnesses/shared/hooks/stream-hook-runner.js +590 -0
- package/core/harnesses/shared/locator/doflow-run +87 -0
- package/core/registry/advice.json +101 -0
- package/core/registry/assets.json +792 -0
- package/core/registry/capabilities.json +120 -0
- package/core/registry/contracts.json +189 -0
- package/core/registry/external-tools.json +191 -0
- package/core/registry/harnesses.json +2062 -0
- package/core/registry/lifecycle.json +231 -0
- package/core/registry/mcp.json +18 -0
- package/core/registry/models.json +79 -0
- package/core/registry/readiness-templates.json +118 -0
- package/core/registry/routes.json +47 -0
- package/core/registry/storage.json +1057 -0
- package/core/registry/verification.json +258 -0
- package/core/registry/workflows.json +790 -0
- package/core/shared/agent-specs/core-implementer.md +73 -0
- package/core/shared/agent-specs/quality-guardian.md +28 -0
- package/core/shared/agent-specs/research-writer.md +31 -0
- package/core/shared/agent-specs/spec-analyst.md +33 -0
- package/core/shared/agent-specs/system-architect.md +29 -0
- package/core/shared/guidance/DOFLOW_CORE.md +8 -0
- package/core/shared/guidance/FLAGS.md +25 -0
- package/core/shared/guidance/PRINCIPLES.md +61 -0
- package/core/shared/guidance/VERSION +1 -0
- package/core/shared/guidance/mcp/MCP_Context7.md +18 -0
- package/core/shared/guidance/mcp/MCP_Sequential.md +17 -0
- package/core/shared/guidance/modes/MODE_Brainstorming.md +46 -0
- package/core/shared/guidance/modes/MODE_DeepResearch.md +69 -0
- package/core/shared/guidance/modes/MODE_Introspection.md +33 -0
- package/core/shared/guidance/modes/MODE_Orchestration.md +57 -0
- package/core/shared/guidance/modes/MODE_Task_Management.md +74 -0
- package/core/shared/guidance/pointers/claude-gemini.md +2 -0
- package/core/shared/guidance/pointers/codex.md +6 -0
- package/core/shared/guidance/references/ARTIFACT_FORMAT.md +373 -0
- package/core/shared/guidance/references/ARTIFACT_VOICE.md +104 -0
- package/core/shared/guidance/references/CONSTITUTION_BASE.md +47 -0
- package/core/shared/guidance/references/DIAGRAM_GUIDE.md +161 -0
- package/core/shared/guidance/references/DOFLOW_CHAIN.md +87 -0
- package/core/shared/guidance/references/EVIDENCE_LEDGER.md +93 -0
- package/core/shared/guidance/references/MODEL_SELECTION.md +74 -0
- package/core/shared/guidance/references/ORCHESTRATION.md +36 -0
- package/core/shared/guidance/references/RESEARCH_CONFIG.md +21 -0
- package/core/shared/guidance/references/WORKFLOW_HANDOFF.md +81 -0
- package/core/shared/guidance/rules/RULE_01_SAFETY.md +25 -0
- package/core/shared/guidance/rules/RULE_02_WORKFLOW.md +23 -0
- package/core/shared/guidance/rules/RULE_03_QUALITY.md +14 -0
- package/core/shared/guidance/rules/RULE_04_QUESTIONS.md +46 -0
- package/core/shared/scripts/doflow/assets/mermaid-theme.json +46 -0
- package/core/shared/scripts/doflow/bash/do-exec-paths.sh +167 -0
- package/core/shared/scripts/doflow/bash/do-git-state.sh +546 -0
- package/core/shared/scripts/doflow/bash/do-parallel-check.sh +208 -0
- package/core/shared/scripts/doflow/bash/do-paths.sh +347 -0
- package/core/shared/scripts/doflow/bash/do-prereqs.sh +66 -0
- package/core/shared/scripts/doflow/bash/do-review-package.sh +127 -0
- package/core/shared/scripts/doflow/bash/do-task-brief.sh +698 -0
- package/core/shared/scripts/doflow/bash/render-audit.sh +224 -0
- package/core/shared/scripts/doflow/bash/render-diagrams.sh +177 -0
- package/core/shared/scripts/doflow/bash/render-puml.sh +223 -0
- package/core/shared/scripts/doflow/bash/sync-context.sh +66 -0
- package/core/shared/scripts/doflow/bash/validate-artifacts.sh +526 -0
- package/core/shared/scripts/doflow/bin/doflow-run +592 -0
- package/core/shared/skills/do/SKILL.md +128 -0
- package/core/shared/skills/do/references/estimation.md +13 -0
- package/core/shared/skills/do/references/pm_routing.md +25 -0
- package/core/shared/skills/do/references/tool_matrix.md +52 -0
- package/core/shared/skills/do-brainstorm/SKILL.md +252 -0
- package/core/shared/skills/do-code-review/README.md +49 -0
- package/core/shared/skills/do-code-review/SKILL.md +333 -0
- package/core/shared/skills/do-code-review/assets/sample_c_clean.c +71 -0
- package/core/shared/skills/do-code-review/assets/sample_c_smells.c +66 -0
- package/core/shared/skills/do-code-review/assets/sample_cpp_shift.cpp +19 -0
- package/core/shared/skills/do-code-review/assets/sample_csharp_clean.cs +100 -0
- package/core/shared/skills/do-code-review/assets/sample_csharp_smells.cs +78 -0
- package/core/shared/skills/do-code-review/assets/sample_java_clean.java +55 -0
- package/core/shared/skills/do-code-review/assets/sample_java_smells.java +56 -0
- package/core/shared/skills/do-code-review/assets/sample_json_clean.json +7 -0
- package/core/shared/skills/do-code-review/assets/sample_markdown_clean.md +30 -0
- package/core/shared/skills/do-code-review/assets/sample_markdown_smells.md +29 -0
- package/core/shared/skills/do-code-review/assets/sample_shell_heredoc.sh +38 -0
- package/core/shared/skills/do-code-review/assets/sample_shell_smells.sh +15 -0
- package/core/shared/skills/do-code-review/assets/sample_typescript_strings.ts +36 -0
- package/core/shared/skills/do-code-review/assets/sample_yaml_smells.yaml +6 -0
- package/core/shared/skills/do-code-review/content-types/config.md +83 -0
- package/core/shared/skills/do-code-review/content-types/markdown.md +132 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_c_clean_quality.json +79 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_c_smells_quality.json +169 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_cpp_shift_quality.json +49 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_csharp_clean_quality.json +149 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_csharp_smells_quality.json +157 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_java_clean_quality.json +67 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_java_smells_quality.json +97 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_json_clean_quality.json +33 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_markdown_clean_quality.json +1 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_markdown_smells_quality.json +16 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_shell_heredoc_quality.json +54 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_shell_smells_quality.json +91 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_typescript_strings_quality.json +60 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_yaml_smells_quality.json +46 -0
- package/core/shared/skills/do-code-review/languages/c.md +103 -0
- package/core/shared/skills/do-code-review/languages/cpp.md +103 -0
- package/core/shared/skills/do-code-review/languages/csharp.md +97 -0
- package/core/shared/skills/do-code-review/languages/dart.md +108 -0
- package/core/shared/skills/do-code-review/languages/go.md +92 -0
- package/core/shared/skills/do-code-review/languages/java.md +103 -0
- package/core/shared/skills/do-code-review/languages/kotlin.md +88 -0
- package/core/shared/skills/do-code-review/languages/php.md +109 -0
- package/core/shared/skills/do-code-review/languages/python.md +94 -0
- package/core/shared/skills/do-code-review/languages/ruby.md +105 -0
- package/core/shared/skills/do-code-review/languages/rust.md +99 -0
- package/core/shared/skills/do-code-review/languages/shell.md +90 -0
- package/core/shared/skills/do-code-review/languages/swift.md +88 -0
- package/core/shared/skills/do-code-review/languages/typescript.md +97 -0
- package/core/shared/skills/do-code-review/review-policy.json +47 -0
- package/core/shared/skills/do-code-review/rules/universal.md +49 -0
- package/core/shared/skills/do-code-review/scripts/code_quality_checker.py +1696 -0
- package/core/shared/skills/do-code-review/scripts/doc_quality_checker.py +532 -0
- package/core/shared/skills/do-code-review/scripts/pr_analyzer.py +620 -0
- package/core/shared/skills/do-code-review/scripts/review_report_generator.py +505 -0
- package/core/shared/skills/do-constitution/SKILL.md +72 -0
- package/core/shared/skills/do-design/SKILL.md +212 -0
- package/core/shared/skills/do-diagnose/SKILL.md +156 -0
- package/core/shared/skills/do-diagnose/references/code_audit.md +15 -0
- package/core/shared/skills/do-diagnose/references/refactoring.md +12 -0
- package/core/shared/skills/do-diagnose/references/root_cause.md +17 -0
- package/core/shared/skills/do-document/SKILL.md +81 -0
- package/core/shared/skills/do-document/references/api-reference.md +42 -0
- package/core/shared/skills/do-document/references/deep_research.md +18 -0
- package/core/shared/skills/do-document/references/embedded-research.md +11 -0
- package/core/shared/skills/do-document/references/implementation-flow.md +105 -0
- package/core/shared/skills/do-document/references/index_generator.md +9 -0
- package/core/shared/skills/do-document/references/user-guide.md +22 -0
- package/core/shared/skills/do-execute-plan/SKILL.md +261 -0
- package/core/shared/skills/do-execute-plan/references/handoff_record.md +57 -0
- package/core/shared/skills/do-execute-plan/references/parallel_dispatch.md +92 -0
- package/core/shared/skills/do-execute-plan/references/readiness_gate.md +155 -0
- package/core/shared/skills/do-execute-plan/references/run_position.md +63 -0
- package/core/shared/skills/do-execute-plan/references/scaffold.md +441 -0
- package/core/shared/skills/do-execute-plan/references/task_attempts.md +41 -0
- package/core/shared/skills/do-flow/SKILL.md +186 -0
- package/core/shared/skills/do-flow/references/task_classes.md +134 -0
- package/core/shared/skills/do-git/SKILL.md +115 -0
- package/core/shared/skills/do-git/references/hotfix-ritual.md +44 -0
- package/core/shared/skills/do-git/references/lifecycle-policy.md +54 -0
- package/core/shared/skills/do-git/references/release-ritual.md +64 -0
- package/core/shared/skills/do-implement/SKILL.md +222 -0
- package/core/shared/skills/do-plan/SKILL.md +219 -0
- package/core/shared/skills/do-test/SKILL.md +113 -0
- package/core/shared/templates/doflow/constitution-template.md +28 -0
- package/core/shared/templates/doflow/data-model-template.md +169 -0
- package/core/shared/templates/doflow/design-template.md +193 -0
- package/core/shared/templates/doflow/external-contract-template.md +35 -0
- package/core/shared/templates/doflow/intent-template.md +45 -0
- package/core/shared/templates/doflow/plan-template.md +151 -0
- package/core/shared/templates/doflow/question-log-template.md +51 -0
- package/core/shared/templates/doflow/requirement-template.md +126 -0
- package/core/shared/templates/doflow/specs-template.md +55 -0
- package/core/shared/templates/doflow/state-template.md +59 -0
- package/core/shared/workflows/do-flow-chain.md +17 -0
- package/package.json +46 -4
- package/src/adapters/antigravity/index.ts +631 -0
- package/src/adapters/claude/index.ts +548 -0
- package/src/adapters/claude/mcp.ts +94 -0
- package/src/adapters/codex/agents.ts +208 -0
- package/src/adapters/codex/config.ts +272 -0
- package/src/adapters/codex/hooks.ts +203 -0
- package/src/adapters/codex/index.ts +707 -0
- package/src/adapters/codex/mcp.ts +271 -0
- package/src/adapters/codex/native-projection.ts +34 -0
- package/src/adapters/copilot/index.ts +413 -0
- package/src/adapters/copy-tree.ts +620 -0
- package/src/adapters/gemini/hooks.ts +210 -0
- package/src/adapters/gemini/index.ts +390 -0
- package/src/adapters/hook-commands.ts +60 -0
- package/src/adapters/index.ts +106 -0
- package/src/adapters/kiro/index.ts +310 -0
- package/src/adapters/mcp-entries.ts +331 -0
- package/src/adapters/opencode/index.ts +466 -0
- package/src/adapters/pi/index.ts +279 -0
- package/src/adapters/pi/json-members.ts +185 -0
- package/src/adapters/pi/mcp.ts +373 -0
- package/src/adapters/resolve-source.ts +19 -0
- package/src/cli/commands/install.ts +218 -0
- package/src/cli/commands/list-backups.ts +21 -0
- package/src/cli/commands/reconcile.ts +120 -0
- package/src/cli/commands/remove.ts +82 -0
- package/src/cli/commands/rollback.ts +172 -0
- package/src/cli/commands/self-update.ts +33 -0
- package/src/cli/commands/status.ts +138 -0
- package/src/cli/commands/tools.ts +92 -0
- package/src/cli/commands/update.ts +162 -0
- package/src/cli/index.ts +568 -0
- package/src/cli/runtime-commands.ts +281 -0
- package/src/cli/shared.ts +218 -0
- package/src/helper/bash-helper.ts +34 -0
- package/src/helper/git.ts +24 -0
- package/src/helper/guardrails.ts +49 -0
- package/src/helper/harness-paths.ts +140 -0
- package/src/helper/marker-merge.ts +116 -0
- package/src/helper/prompt.ts +61 -0
- package/src/helper/repo-root.ts +29 -0
- package/src/helper/settings-merge.ts +151 -0
- package/src/helper/settings-scope.ts +33 -0
- package/src/helper/toml.ts +244 -0
- package/src/install/backup-set.ts +149 -0
- package/src/install/backup.ts +724 -0
- package/src/install/context.ts +58 -0
- package/src/install/manifest.ts +145 -0
- package/src/install/mcp.ts +254 -0
- package/src/install/paths.ts +84 -0
- package/src/install/targets.ts +90 -0
- package/src/install/tool-lifecycle.ts +151 -0
- package/src/lifecycle/bash-availability.ts +25 -0
- package/src/lifecycle/index.ts +812 -0
- package/src/lifecycle/mcp-index.ts +28 -0
- package/src/lifecycle/policies.ts +73 -0
- package/src/lifecycle/view.ts +175 -0
- package/src/registry/index.ts +611 -0
- package/src/release/sync-plugin-versions.ts +66 -0
- package/src/runtime/advice/cli.ts +283 -0
- package/src/runtime/advice/client.ts +324 -0
- package/src/runtime/advice/config.ts +189 -0
- package/src/runtime/advice/doctor.ts +169 -0
- package/src/runtime/advice/endpoint-guard.ts +134 -0
- package/src/runtime/advice/kinds.ts +154 -0
- package/src/runtime/advice/providers/ollama-systemone.ts +209 -0
- package/src/runtime/advice/record.ts +166 -0
- package/src/runtime/advice/registry.ts +170 -0
- package/src/runtime/advice/strength.ts +66 -0
- package/src/runtime/brief-tools.ts +342 -0
- package/src/runtime/c4-project.ts +371 -0
- package/src/runtime/capability-router.ts +484 -0
- package/src/runtime/checkouts.ts +170 -0
- package/src/runtime/claims.ts +468 -0
- package/src/runtime/cli-result.ts +55 -0
- package/src/runtime/cli.ts +678 -0
- package/src/runtime/command-detect.ts +516 -0
- package/src/runtime/context-pack.ts +492 -0
- package/src/runtime/decision-register.ts +493 -0
- package/src/runtime/evidence-ledger.ts +338 -0
- package/src/runtime/failure/capture.ts +272 -0
- package/src/runtime/failure/classifier.ts +68 -0
- package/src/runtime/failure/cli.ts +178 -0
- package/src/runtime/failure/home.ts +64 -0
- package/src/runtime/failure/store.ts +226 -0
- package/src/runtime/feature-resolve.ts +79 -0
- package/src/runtime/freshness.ts +177 -0
- package/src/runtime/health.ts +863 -0
- package/src/runtime/history-compactor.ts +237 -0
- package/src/runtime/implementation-gate.ts +321 -0
- package/src/runtime/inventory/coverage.ts +218 -0
- package/src/runtime/inventory/identity.ts +65 -0
- package/src/runtime/inventory/index.ts +705 -0
- package/src/runtime/inventory/precedence.ts +134 -0
- package/src/runtime/inventory/read-scopes.ts +131 -0
- package/src/runtime/inventory/siblings.ts +192 -0
- package/src/runtime/knowledge/chunker.ts +124 -0
- package/src/runtime/knowledge/hybrid.ts +149 -0
- package/src/runtime/knowledge/index-store.ts +145 -0
- package/src/runtime/knowledge/retrieval.ts +194 -0
- package/src/runtime/leak-scan.ts +185 -0
- package/src/runtime/lifecycle/cli.ts +276 -0
- package/src/runtime/lifecycle/event-store.ts +340 -0
- package/src/runtime/lifecycle/fold.ts +353 -0
- package/src/runtime/lifecycle/followup.ts +432 -0
- package/src/runtime/lifecycle/goal.ts +249 -0
- package/src/runtime/lifecycle/intent-writer.ts +86 -0
- package/src/runtime/lifecycle/overview.ts +292 -0
- package/src/runtime/lifecycle/release.ts +241 -0
- package/src/runtime/lifecycle/report-store.ts +221 -0
- package/src/runtime/lifecycle/retention.ts +212 -0
- package/src/runtime/lifecycle/root.ts +71 -0
- package/src/runtime/lifecycle/status.ts +353 -0
- package/src/runtime/lifecycle/store-upkeep.ts +393 -0
- package/src/runtime/locator-resolve.ts +158 -0
- package/src/runtime/mask.ts +210 -0
- package/src/runtime/mcp-consultations.ts +412 -0
- package/src/runtime/mcp-reach.ts +157 -0
- package/src/runtime/model-router.ts +153 -0
- package/src/runtime/outcome.ts +467 -0
- package/src/runtime/reach.ts +148 -0
- package/src/runtime/readiness-record.ts +150 -0
- package/src/runtime/readiness.ts +435 -0
- package/src/runtime/recovery.ts +282 -0
- package/src/runtime/research-request.ts +231 -0
- package/src/runtime/retrieval-plan.ts +578 -0
- package/src/runtime/scaffold/artifacts.ts +217 -0
- package/src/runtime/scaffold/fingerprint.ts +56 -0
- package/src/runtime/scaffold/generate.ts +911 -0
- package/src/runtime/scaffold/languages.ts +245 -0
- package/src/runtime/storage/cli.ts +64 -0
- package/src/runtime/storage/engine.ts +249 -0
- package/src/runtime/storage/registry.ts +130 -0
- package/src/runtime/storage/roots.ts +63 -0
- package/src/runtime/storage/rules.ts +282 -0
- package/src/runtime/storage/upkeep.ts +243 -0
- package/src/runtime/storage/work-status.ts +326 -0
- package/src/runtime/task-attempts.ts +415 -0
- package/src/runtime/task-classifier.ts +550 -0
- package/src/runtime/task-scope.ts +130 -0
- package/src/runtime/task-state.ts +176 -0
- package/src/runtime/trace/indicators.ts +235 -0
- package/src/runtime/trace/ledger.ts +626 -0
- package/src/runtime/trace/render.ts +76 -0
- package/src/runtime/trace/views.ts +459 -0
- package/src/runtime/verification/contract-runner.ts +341 -0
- package/src/runtime/verification/engine.ts +1461 -0
- package/src/runtime/verification/registry.ts +130 -0
- package/src/runtime/verification/scope-bound.ts +418 -0
- package/src/runtime/verification/test-selection.ts +172 -0
- package/src/runtime/workflow-engine.ts +588 -0
- package/src/runtime/workflow-orchestrator.ts +953 -0
- package/src/runtime/worktree.ts +340 -0
- package/src/state/index.ts +193 -0
- package/src/state/lockfile.ts +136 -0
- package/src/state/run-lock.ts +408 -0
- package/types/node-commonjs.d.ts +68 -0
- package/types/runtime.d.ts +91 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# user-prompt-submit.sh — Canonical Policy Library: UserPromptSubmit hook
|
|
3
|
+
#
|
|
4
|
+
# 022-hooks-remaining-duplication: claude and codex's UserPromptSubmit policies share the same
|
|
5
|
+
# context-gathering behavior. Gemini has no UserPromptSubmit-equivalent event in its native hook set.
|
|
6
|
+
#
|
|
7
|
+
# On the FIRST prompt of a session: injects lightweight git context into the harness's LLM
|
|
8
|
+
# context. Claude and Codex receive one nested envelope,
|
|
9
|
+
# {"hookSpecificOutput":{"hookEventName":"UserPromptSubmit","additionalContext":...}}
|
|
10
|
+
# because Claude Code ignores a top-level additionalContext. Claude's object also carries
|
|
11
|
+
# sessionTitle for window identification, unless the payload's session_title shows the user
|
|
12
|
+
# already titled the session; Codex rejects unknown fields, so its object never does.
|
|
13
|
+
#
|
|
14
|
+
# On subsequent prompts: prints {} (clean, no token waste), unless the nudge below is earned.
|
|
15
|
+
#
|
|
16
|
+
# Once per session, the first prompt that reads as a plain code-change request (decided by
|
|
17
|
+
# prompt-nudge.jq against the rules in the workflow registry's `promptNudge` key) also carries a
|
|
18
|
+
# one-sentence suggestion to use /do: appended to the first-prompt context, or alone in the same
|
|
19
|
+
# nested envelope on a later prompt. The nudge is advisory and never blocks or rewrites a prompt.
|
|
20
|
+
# Every failure on its path (no registry, no jq regex support, an unwritable state folder, an
|
|
21
|
+
# opt-out file, a subagent prompt, a /do-flow already in progress) resolves to silence; see the
|
|
22
|
+
# once-per-session marker in lib.sh. The nudge starts no node or doflow-run process.
|
|
23
|
+
#
|
|
24
|
+
# Multi-session safe: uses session_id-scoped `injected` flag — no shared state.
|
|
25
|
+
# Must complete in <100ms. Must NEVER output "decision: block".
|
|
26
|
+
|
|
27
|
+
set -euo pipefail
|
|
28
|
+
# shellcheck source=lib.sh
|
|
29
|
+
source "$(dirname "$0")/lib.sh"
|
|
30
|
+
require_jq
|
|
31
|
+
|
|
32
|
+
INPUT=$(cat)
|
|
33
|
+
# One jq pass over the payload for every field this hook reads (each pass costs about 8 ms on a
|
|
34
|
+
# 20 KB prompt, and the budget is 100 ms), NUL-separated: session_id, cwd and session_title, null
|
|
35
|
+
# and false read as empty as json_field does, with any NUL inside a value dropped so no field can
|
|
36
|
+
# shift into the next; then `subagent` when agent_id or agent_type holds anything but null or "".
|
|
37
|
+
SESSION_ID="" CWD="" PAYLOAD_TITLE="" SUBAGENT=""
|
|
38
|
+
{ IFS= read -r -d '' SESSION_ID; IFS= read -r -d '' CWD; IFS= read -r -d '' PAYLOAD_TITLE; IFS= read -r -d '' SUBAGENT; } < <(
|
|
39
|
+
printf '%s' "$INPUT" | jq -j '. as $p
|
|
40
|
+
| [$p.session_id, $p.cwd, $p.session_title]
|
|
41
|
+
| map(if . == null or . == false then "" elif type == "string" then . else tojson end | split("\u0000") | join(""))
|
|
42
|
+
| . + [if any($p.agent_id, $p.agent_type; . != null and . != "") then "subagent" else "" end]
|
|
43
|
+
| join("\u0000") + "\u0000"' 2>/dev/null
|
|
44
|
+
) || true
|
|
45
|
+
|
|
46
|
+
[[ -z "$SESSION_ID" ]] && exit 0
|
|
47
|
+
|
|
48
|
+
SESSION_PATH="$SESSION_DIR/$SESSION_ID"
|
|
49
|
+
INJECTED_FLAG="$SESSION_PATH/injected"
|
|
50
|
+
|
|
51
|
+
# ── Prompt nudge (IC-004 N1-N8) ───────────────────────────────────────────────
|
|
52
|
+
|
|
53
|
+
# Print the nudge message when this prompt earns it, nothing otherwise. Every gate that stops
|
|
54
|
+
# returns 0 with no output; the caller also contains a failure of the whole function, so nothing
|
|
55
|
+
# here can change the exit status or the first-prompt output. The prompt only ever travels to jq
|
|
56
|
+
# on stdin, with stderr discarded, and is never copied out of INPUT.
|
|
57
|
+
nudge_message() {
|
|
58
|
+
local root policy_dir here registry decision message
|
|
59
|
+
[[ "${DOFLOW_AGENT:-}" == "claude" || "${DOFLOW_AGENT:-}" == "codex" ]] || return 0 # N1
|
|
60
|
+
[[ "$(doflow_session_role 2>/dev/null || echo main)" != "worker" ]] || return 0 # a worker is never nudged
|
|
61
|
+
nudge_safe_id "$SESSION_ID" || return 0 # N2
|
|
62
|
+
root=$(nudge_repo_root "$CWD") || return 0
|
|
63
|
+
[[ "$(nudge_setting "$root")" == "on" ]] || return 0 # N3
|
|
64
|
+
[[ ! -e "$STATE_DIR/nudge/$SESSION_ID" ]] || return 0 # N4 (IC-008's path, no process)
|
|
65
|
+
# N5: a subagent prompt carries agent_id or agent_type (read with the other fields above).
|
|
66
|
+
[[ -z "$SUBAGENT" ]] || return 0
|
|
67
|
+
# N6: the policy script's physical directory, found with built-ins (a subshell costs about 4 ms).
|
|
68
|
+
case "$0" in */*) policy_dir="${0%/*}" ;; *) policy_dir="." ;; esac
|
|
69
|
+
here="$PWD"
|
|
70
|
+
cd -P -- "$policy_dir" 2>/dev/null || return 0
|
|
71
|
+
policy_dir="$PWD"
|
|
72
|
+
cd -- "$here" 2>/dev/null || return 0
|
|
73
|
+
registry=$(nudge_registry "$policy_dir" "$root") || return 0
|
|
74
|
+
decision=$(printf '%s' "$INPUT" | jq -r --slurpfile R "$registry" -f "$policy_dir/prompt-nudge.jq" 2>/dev/null) || return 0
|
|
75
|
+
if [[ "$decision" == "suppress" ]]; then
|
|
76
|
+
nudge_mark "$SESSION_ID" suppressed || true
|
|
77
|
+
return 0
|
|
78
|
+
fi
|
|
79
|
+
[[ "$decision" == "nudge" ]] || return 0
|
|
80
|
+
if nudge_feature_active "$CWD" "$root" "$SESSION_PATH" || nudge_ledger_active "$CWD" "$SESSION_PATH"; then # N7
|
|
81
|
+
nudge_mark "$SESSION_ID" suppressed || true
|
|
82
|
+
return 0
|
|
83
|
+
fi
|
|
84
|
+
# N8: the message is read and checked before the marker is created, so a registry without a
|
|
85
|
+
# usable message leaves no marker; a failed create (unwritable folder, a racing prompt) is silent.
|
|
86
|
+
message=$(jq -r '.promptNudge.message | strings' "$registry" 2>/dev/null) || return 0
|
|
87
|
+
[[ -n "$message" ]] || return 0
|
|
88
|
+
nudge_mark "$SESSION_ID" nudged || return 0
|
|
89
|
+
printf '%s' "$message"
|
|
90
|
+
return 0
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
# One nested envelope for both harnesses (IC-002): $1 is the additionalContext; $2 the session
|
|
94
|
+
# title, omitted when empty.
|
|
95
|
+
emit_envelope() {
|
|
96
|
+
jq -n --arg ctx "$1" --arg title "$2" \
|
|
97
|
+
'{"hookSpecificOutput": ({"hookEventName": "UserPromptSubmit", "additionalContext": $ctx}
|
|
98
|
+
+ (if $title != "" then {"sessionTitle": $title} else {} end))}'
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
# ── Subsequent prompts: no injection, unless the nudge is earned ──────────────
|
|
102
|
+
|
|
103
|
+
if [[ -f "$INJECTED_FLAG" ]]; then
|
|
104
|
+
NUDGE=$(nudge_message 2>/dev/null) || NUDGE=""
|
|
105
|
+
if [[ -n "$NUDGE" ]]; then
|
|
106
|
+
emit_envelope "$NUDGE" ""
|
|
107
|
+
else
|
|
108
|
+
echo "{}"
|
|
109
|
+
fi
|
|
110
|
+
exit 0
|
|
111
|
+
fi
|
|
112
|
+
|
|
113
|
+
# ── Worker session: no bootstrap, nothing claimed ─────────────────────────────
|
|
114
|
+
# A worker never receives the git context, the prior compact summary or the prior warning, and
|
|
115
|
+
# leaves both files for the main session. It is marked injected so later prompts stay silent.
|
|
116
|
+
|
|
117
|
+
if [[ "$(doflow_session_role || echo main)" == "worker" ]]; then
|
|
118
|
+
ensure_session_dir "$SESSION_ID" >/dev/null || true
|
|
119
|
+
touch "$INJECTED_FLAG" 2>/dev/null || true
|
|
120
|
+
echo "{}"
|
|
121
|
+
exit 0
|
|
122
|
+
fi
|
|
123
|
+
|
|
124
|
+
# ── First prompt: build context ───────────────────────────────────────────────
|
|
125
|
+
|
|
126
|
+
GIT_CONTEXT_FILE="$SESSION_PATH/git-context.json"
|
|
127
|
+
|
|
128
|
+
# Fallback if session-start.sh didn't run or failed
|
|
129
|
+
if [[ ! -f "$GIT_CONTEXT_FILE" ]]; then
|
|
130
|
+
ensure_session_dir "$SESSION_ID" >/dev/null
|
|
131
|
+
touch "$INJECTED_FLAG"
|
|
132
|
+
CONTEXT="Git context unavailable for this session."
|
|
133
|
+
SESSION_TITLE=""
|
|
134
|
+
else
|
|
135
|
+
GIT_JSON=$(cat "$GIT_CONTEXT_FILE")
|
|
136
|
+
IS_GIT=$(json_field "$GIT_JSON" ".is_git_repo")
|
|
137
|
+
|
|
138
|
+
if [[ "$IS_GIT" == "true" ]]; then
|
|
139
|
+
BRANCH=$(json_field "$GIT_JSON" ".branch")
|
|
140
|
+
SHA=$(json_field "$GIT_JSON" ".sha")
|
|
141
|
+
UNCOMMITTED=$(json_field "$GIT_JSON" ".uncommitted_count")
|
|
142
|
+
STASH=$(json_field "$GIT_JSON" ".stash_count")
|
|
143
|
+
|
|
144
|
+
# Build commit list as a single line (· separated)
|
|
145
|
+
COMMITS=$(echo "$GIT_JSON" | jq -r '.commits[]? // empty' | head -5 | paste -sd ' · ' -)
|
|
146
|
+
|
|
147
|
+
CONTEXT="Git context — branch: ${BRANCH:-unknown} | ${SHA:-unknown}"$'\n'
|
|
148
|
+
CONTEXT+="Last commits: ${COMMITS:-none}"$'\n'
|
|
149
|
+
CONTEXT+="Uncommitted files: ${UNCOMMITTED:-0}"
|
|
150
|
+
[[ "${STASH:-0}" -gt 0 ]] && CONTEXT+=" | Stashed: ${STASH}"
|
|
151
|
+
|
|
152
|
+
SESSION_TITLE="${BRANCH:-unknown} — ${SHA:-unknown}"
|
|
153
|
+
else
|
|
154
|
+
CONTEXT="Not a git repository."
|
|
155
|
+
SESSION_TITLE="no-git"
|
|
156
|
+
fi
|
|
157
|
+
|
|
158
|
+
# ── Prior compact summary: injected once into the next session, then consumed ─
|
|
159
|
+
# post-compact.sh writes this file for the session that follows a compaction. The session
|
|
160
|
+
# that compacted already holds the summary, so it skips the file and leaves it in place.
|
|
161
|
+
# Any other session claims the file with an atomic rename first (a summary written meanwhile
|
|
162
|
+
# is a new file and survives), reads a bounded prefix of the claimed copy and removes it. No
|
|
163
|
+
# step here may fail the hook: on any error the summary is simply not injected.
|
|
164
|
+
|
|
165
|
+
PROJECT_DIR=$(ensure_project_dir "$CWD")
|
|
166
|
+
COMPACT_FILE="$PROJECT_DIR/last-compact-summary.md"
|
|
167
|
+
COMPACT_CLAIM="$PROJECT_DIR/.last-compact-summary.claimed.$SESSION_ID"
|
|
168
|
+
COMPACT_CAP=4000
|
|
169
|
+
COMPACT_READ=65536 # bytes: enough for the cap even at four bytes per character
|
|
170
|
+
compact_field() {
|
|
171
|
+
printf '%s\n' "$COMPACT_HEAD" | awk -v k="$1:" '/^---$/{n++; if (n == 2) exit; next} n == 1 && index($0, k) == 1 {sub(/^[^:]*:[ ]*/, ""); print; exit}' || true
|
|
172
|
+
}
|
|
173
|
+
# A native subagent payload (agent_id or agent_type) never claims the summary or the warning.
|
|
174
|
+
if [[ -z "$SUBAGENT" && -f "$COMPACT_FILE" && ! -L "$COMPACT_FILE" ]]; then
|
|
175
|
+
COMPACT_HEAD=$(head -c "$COMPACT_READ" "$COMPACT_FILE" 2>/dev/null | tr -d '\r') || COMPACT_HEAD=''
|
|
176
|
+
if [[ "$(compact_field session_id)" != "$SESSION_ID" ]] && mv "$COMPACT_FILE" "$COMPACT_CLAIM" 2>/dev/null; then
|
|
177
|
+
COMPACT_SIZE=$(wc -c < "$COMPACT_CLAIM" 2>/dev/null) || COMPACT_SIZE=0
|
|
178
|
+
COMPACT_HEAD=$(head -c "$COMPACT_READ" "$COMPACT_CLAIM" 2>/dev/null | tr -d '\r') || COMPACT_HEAD=''
|
|
179
|
+
rm -f "$COMPACT_CLAIM"
|
|
180
|
+
# Strip the YAML frontmatter (between the first two `---` lines) and the blank line after it;
|
|
181
|
+
# keep the summary body only.
|
|
182
|
+
COMPACT_BODY=$(printf '%s\n' "$COMPACT_HEAD" | awk '/^---$/ && n < 2 {n++; next} n >= 2 && (started || $0 != "") {started = 1; print}') || COMPACT_BODY=''
|
|
183
|
+
COMPACT_LEN=''
|
|
184
|
+
if [[ -n "$COMPACT_BODY" ]]; then
|
|
185
|
+
# --rawfile, not stdin or --arg: jq 1.7's raw stdin reader miscounts multibyte text across
|
|
186
|
+
# buffer boundaries, and --arg would hit the per-argument size limit on a large summary.
|
|
187
|
+
COMPACT_LEN=$(jq -n --rawfile b <(printf '%s' "$COMPACT_BODY") '$b | length' 2>/dev/null) || COMPACT_BODY=''
|
|
188
|
+
fi
|
|
189
|
+
if [[ -n "$COMPACT_BODY" && "$COMPACT_LEN" -gt "$COMPACT_CAP" ]]; then
|
|
190
|
+
COMPACT_BODY=$(jq -nr --rawfile b <(printf '%s' "$COMPACT_BODY") "\$b[0:$COMPACT_CAP]" 2>/dev/null) || COMPACT_BODY=''
|
|
191
|
+
COMPACT_MORE=''
|
|
192
|
+
[[ "$COMPACT_SIZE" -gt "$COMPACT_READ" ]] && COMPACT_MORE='at least '
|
|
193
|
+
[[ -n "$COMPACT_BODY" ]] && COMPACT_BODY+=$'\n'"[summary truncated: first ${COMPACT_CAP} of ${COMPACT_MORE}${COMPACT_LEN} characters]"
|
|
194
|
+
fi
|
|
195
|
+
if [[ -n "$COMPACT_BODY" ]]; then
|
|
196
|
+
COMPACT_AT=$(compact_field compacted_at); COMPACT_AT=${COMPACT_AT//]/}
|
|
197
|
+
COMPACT_BRANCH=$(compact_field branch); COMPACT_BRANCH=${COMPACT_BRANCH//]/}
|
|
198
|
+
COMPACT_HEADER="Prior session summary"
|
|
199
|
+
[[ -n "$COMPACT_AT" && "$COMPACT_AT" != "unknown" ]] && COMPACT_HEADER+=", compacted ${COMPACT_AT}"
|
|
200
|
+
[[ -n "$COMPACT_BRANCH" && "$COMPACT_BRANCH" != "unknown" ]] && COMPACT_HEADER+=" on branch ${COMPACT_BRANCH}"
|
|
201
|
+
CONTEXT+=$'\n\n'"[${COMPACT_HEADER}]"$'\n'"$COMPACT_BODY"
|
|
202
|
+
fi
|
|
203
|
+
fi
|
|
204
|
+
fi
|
|
205
|
+
|
|
206
|
+
# Check for uncommitted warning from prior session (one-time: delete after read —
|
|
207
|
+
# nothing else in the framework reassigns this cleanup, so it happens here)
|
|
208
|
+
if [[ -z "$SUBAGENT" && -f "$PROJECT_DIR/uncommitted-warning.txt" ]]; then
|
|
209
|
+
WARNING=$(cat "$PROJECT_DIR/uncommitted-warning.txt")
|
|
210
|
+
CONTEXT+=$'\n'"[Prior session warning: ${WARNING}]"
|
|
211
|
+
rm -f "$PROJECT_DIR/uncommitted-warning.txt"
|
|
212
|
+
fi
|
|
213
|
+
fi
|
|
214
|
+
|
|
215
|
+
# ── Write injected flag ────────────────────────────────────────────────────────
|
|
216
|
+
|
|
217
|
+
touch "$INJECTED_FLAG"
|
|
218
|
+
|
|
219
|
+
# ── Output JSON ───────────────────────────────────────────────────────────────
|
|
220
|
+
|
|
221
|
+
# The nudge, when earned, follows the context after a blank line.
|
|
222
|
+
NUDGE=$(nudge_message 2>/dev/null) || NUDGE=""
|
|
223
|
+
if [[ -n "$NUDGE" ]]; then
|
|
224
|
+
CONTEXT+=$'\n\n'"$NUDGE"
|
|
225
|
+
fi
|
|
226
|
+
|
|
227
|
+
# sessionTitle: not on Codex, only when a title was built, and only when the user has not already
|
|
228
|
+
# titled the session.
|
|
229
|
+
TITLE_ARG=""
|
|
230
|
+
if [[ "${DOFLOW_AGENT:-}" != "codex" && -n "${SESSION_TITLE:-}" && -z "$PAYLOAD_TITLE" ]]; then
|
|
231
|
+
TITLE_ARG="$SESSION_TITLE"
|
|
232
|
+
fi
|
|
233
|
+
emit_envelope "$CONTEXT" "$TITLE_ARG"
|
|
234
|
+
|
|
235
|
+
exit 0
|