@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,186 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: do-flow
|
|
3
|
+
description: "Auto-chain the doflow spec-driven flow (brainstorm → design → plan → implement → test → review), pausing only at defined approval gates. Use when the user wants the lifecycle run end-to-end, says 'build this feature end-to-end', 'run the doflow chain' or 'take this from idea to implementation', or /do classified the request as a feature. A plain change request that names no /do-* skill goes to /do first, which decides whether it needs this flow. Skip it for single-file fixes, questions and reviews."
|
|
4
|
+
argument-hint: "[feature description] [--from brainstorm|design|plan|implement|test|review]"
|
|
5
|
+
effort: high
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# do-flow
|
|
9
|
+
|
|
10
|
+
Runs a DoFlow workflow end-to-end without a manual `/do-X` at every stage. The task's **class**
|
|
11
|
+
selects the workflow; the resolved workflow's stages name which existing skills run, in what order,
|
|
12
|
+
and where the run stops. `do-flow` does not replace or modify those skills — it invokes their own
|
|
13
|
+
Behavioral Flows in sequence. `do-constitution` belongs to no class; invoke it directly when you
|
|
14
|
+
need to set or amend repo-level rules.
|
|
15
|
+
|
|
16
|
+
**You propose the class; the runtime validates it.** Never the reverse. A class you assumed, or one
|
|
17
|
+
the runtime rejected and you replaced with the familiar default, runs a confident workflow for the
|
|
18
|
+
wrong task.
|
|
19
|
+
|
|
20
|
+
## Invocation
|
|
21
|
+
```text
|
|
22
|
+
/do-flow [feature description] [--from brainstorm|design|plan|implement|test|review]
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Behavioral Flow
|
|
26
|
+
|
|
27
|
+
1. **Resolve state** — run the resolver. Every DoFlow runtime call in this skill goes through the
|
|
28
|
+
runtime seam. Resolve it **once** here and reuse `$DOFLOW` for every later call in this skill:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# Resolve the DoFlow runtime: nearest project install wins, then the global one.
|
|
32
|
+
D=$PWD; while [ "$D" != / ] && [ ! -x "$D/.doflow/scripts/doflow/bin/doflow-run" ]; do D=$(dirname "$D"); done
|
|
33
|
+
DOFLOW="$D/.doflow/scripts/doflow/bin/doflow-run"
|
|
34
|
+
[ -x "$DOFLOW" ] || DOFLOW="$HOME/.doflow/scripts/doflow/bin/doflow-run"
|
|
35
|
+
[ -x "$DOFLOW" ] || { echo "doflow: no runtime found in any .doflow/ above $PWD, nor at $HOME/.doflow. Run: npx @khoavu882/doflow install -t <harness>" >&2; exit 2; }
|
|
36
|
+
```
|
|
37
|
+
Run every command below from the project root — the walk-up starts at `$PWD`. On exit 2, print the message verbatim and stop; it names every path searched.
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
"$DOFLOW" paths --json
|
|
41
|
+
```
|
|
42
|
+
`feature_slug` `null` with a non-empty `candidate_slugs` is an unresolved choice, not "no active feature": ask one option per entry, re-resolve with `"$DOFLOW" paths --json --slug="<chosen>"`, and use that slug for the rest of this flow. `/do-flow` passing `--slug` already resolves it — no prompt then.
|
|
43
|
+
|
|
44
|
+
2. **Propose one class** — read the request and name exactly one class id, using the cues and the
|
|
45
|
+
confusable pairs in this skill's own `references/task_classes.md`. State the class and the
|
|
46
|
+
signal it rests on in one line. If two classes fit equally, do **not** take the longer one: show
|
|
47
|
+
what each would run —
|
|
48
|
+
`"$DOFLOW" workflow --task-class "<candidate>" --json`, quote its `stageIds` — and ask via
|
|
49
|
+
`AskUserQuestion`, one option per candidate.
|
|
50
|
+
|
|
51
|
+
3. **Validate the class through the runtime** — a proposal is not a selection until this returns:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
"$DOFLOW" classify --task-class "<proposed>" --calling-skill do-flow --json
|
|
55
|
+
```
|
|
56
|
+
Branch on the returned `outcome` field, not the exit code.
|
|
57
|
+
- **`ACCEPTED`** — the returned `workflow` is this run's plan of record; read `stages`, `gates` and `handoff` off it rather than from memory.
|
|
58
|
+
- **`REJECTED`** — **stop.** Print `message` verbatim (it already names `validClasses` and any `suggestions`), ask the user to choose from `validClasses`, then re-validate. Never substitute `feature`.
|
|
59
|
+
A rejection may be about **you** rather than the class (`reason: caller-not-a-stage`). Then the fix is to propose one of the classes in `fit.hostingClasses`, or to hand the work to the skill this class names for the stage you meant — not to re-propose the same class.
|
|
60
|
+
- **Exit 2** — surface the message verbatim and stop.
|
|
61
|
+
|
|
62
|
+
Every stage this run enters comes from the accepted `workflow`'s `stages`; a phase the workflow does
|
|
63
|
+
not declare is not run here, however familiar it is from the `feature` chain.
|
|
64
|
+
|
|
65
|
+
4. **Announce the selection** — one line before anything runs:
|
|
66
|
+
`<taskClass> → <workflow.name>: <stageIds joined by →>`, plus the gate ids if `gates` is
|
|
67
|
+
non-empty. This is the user's chance to correct a misclassification cheaply.
|
|
68
|
+
|
|
69
|
+
5. **Pick the starting stage.**
|
|
70
|
+
- `feature`: resume from the first missing chain artifact — `!has_requirement` → the discovery
|
|
71
|
+
stage; `has_requirement && !has_design` → design; `has_design && !has_plan` → planning; all
|
|
72
|
+
three present → go straight to the pre-implementation gate in step 7.
|
|
73
|
+
- Every other class: start at the first entry in `stages`.
|
|
74
|
+
- `--from <phase>` overrides the above to deliberately re-run a stage. Match the phase to the
|
|
75
|
+
stage whose `skill` is that phase's skill (`brainstorm` → `do-brainstorm`, `design` →
|
|
76
|
+
`do-design`, `plan` → `do-plan`, `implement` → the stage with `mutatesSource: true`, `test` →
|
|
77
|
+
`do-test`, `review` → `do-code-review`). No stage matches in this workflow → stop and list the
|
|
78
|
+
stage ids it does have. Two stages match — `bug` and `refactor` each run `do-test` twice — →
|
|
79
|
+
ask which one.
|
|
80
|
+
|
|
81
|
+
6. **Run the stages in order**, invoking each stage's `skill` Behavioral Flow directly.
|
|
82
|
+
- `optional: true` — decide from that stage's own `purpose`, then say which way you went and
|
|
83
|
+
why. Never drop an optional stage silently.
|
|
84
|
+
- `readinessTemplate` is non-null — consult readiness before entering the stage:
|
|
85
|
+
`"$DOFLOW" readiness --task-class "<taskClass>" --task-id "<task id>" --mode workflow --json`.
|
|
86
|
+
Both `--task-class` and `--task-id` are required; omitting either exits 2 and names the valid
|
|
87
|
+
set. Act on the returned `stageEntry.decision` — the entry policy is the runtime's, not this
|
|
88
|
+
page's: `ENTER` → enter the stage; `GATHER_FIRST` → report the missing items and gather them
|
|
89
|
+
first, do not enter; `ASK_USER` → ask the owed decision and wait; `STOP` → stop and surface
|
|
90
|
+
the conflicted claim.
|
|
91
|
+
- `readinessTemplate` is `null` — enter the stage. Do not consult readiness "to be safe": a
|
|
92
|
+
workflow whose `requiresImplementationReadiness` is `false` has no implementation to be ready
|
|
93
|
+
for and declares no template by design (`references/task_classes.md`). Calling it anyway
|
|
94
|
+
invents a gate the registry does not declare.
|
|
95
|
+
- After each stage, report one line: stage id, skill, and the artifact path or result it
|
|
96
|
+
produced — so the user can follow without intervening.
|
|
97
|
+
|
|
98
|
+
7. **Stop at the gates the resolved workflow declares** — read them from `workflow.gates`, each
|
|
99
|
+
attached to a stage by `afterStage`. `trigger: always` stops every time; any other trigger stops
|
|
100
|
+
only when that named condition actually holds. Ask with the gate's own `prompt` via
|
|
101
|
+
`AskUserQuestion`. For the `feature` workflow's three, which behave as they always have:
|
|
102
|
+
- **`gate-0`** (after discovery, trigger `unresolved-clarifications`) — a safety net, not the
|
|
103
|
+
normal path: `do-brainstorm` resolves ambiguities to zero via its own loop, so this fires only
|
|
104
|
+
if a `[NEEDS CLARIFICATION]` marker survived an aborted session. Ask one question per marker
|
|
105
|
+
(grouped if closely related), patch the answers into `requirement.md` directly, and do not
|
|
106
|
+
re-run `do-brainstorm`. Then follow steps 1-4 of the decision step in the guidance
|
|
107
|
+
tree's `references/WORKFLOW_HANDOFF.md` (stage `discovery`, channel `question`) so the answers
|
|
108
|
+
are registered and cited; do-brainstorm already recorded discovery's handoff, so record none.
|
|
109
|
+
- **`gate-a`** (after planning) — the conversational checkpoint on top of the already-existing
|
|
110
|
+
hard hook (`pre-implement-gate.sh`, which blocks source edits until `requirement.md`,
|
|
111
|
+
`design.md` and `plan.md` exist and remains the real enforcement regardless of what happens
|
|
112
|
+
here). Options: `Proceed` / `Let me review the artifacts first` / `Stop here`.
|
|
113
|
+
- **`gate-b`** (after review) — no enforcement hook exists for this today; `/do-git` is a
|
|
114
|
+
separate, always-manually-invoked skill. Frame the question by the review's own approval
|
|
115
|
+
status: on `CHANGES REQUESTED`, foreground addressing the findings rather than offering a bare
|
|
116
|
+
proceed.
|
|
117
|
+
A workflow with an empty `gates` array stops at none of these. It still stops on a readiness
|
|
118
|
+
block, on an ambiguous answer, and on any stage skill's own stopping rule.
|
|
119
|
+
|
|
120
|
+
**Record every answer that is a decision.** Asking is not recording: a gate this skill asked but
|
|
121
|
+
never wrote back stays open in the run, so the stage skill that owns it asks the same question
|
|
122
|
+
again — the user answers twice for one decision. Immediately after the user answers, write it:
|
|
123
|
+
```bash
|
|
124
|
+
"$DOFLOW" orchestrate --action decide-gate --task-id "<slug>" --gate "<gate id>" --decision approve|reject --note "<the user's own answer, one line>" --json
|
|
125
|
+
```
|
|
126
|
+
Map each gate's own option set onto the two decisions the runtime accepts, and never onto a third:
|
|
127
|
+
- **`gate-a`** — `Proceed` is `approve`; `Stop here` is `reject`. `Let me review the artifacts
|
|
128
|
+
first` is **neither**: it is a pause, not a decision, so call nothing and actually pause — hold
|
|
129
|
+
the run at this gate and re-ask once the user comes back, exactly as step 8's ambiguous-answer
|
|
130
|
+
rule already requires.
|
|
131
|
+
- **`gate-b`** — an actual "proceed to commit/merge" answer is `approve`; an explicit stop is
|
|
132
|
+
`reject`. Anything that is not a real decision — "let me address the findings first" on a
|
|
133
|
+
`CHANGES REQUESTED` review, most often — is neither, and gets no `decide-gate` call. `reject`
|
|
134
|
+
terminates the run outright, which is a different answer from "not now".
|
|
135
|
+
- **`gate-0`** — only in the aborted-session branch above, where this skill patched
|
|
136
|
+
`requirement.md` itself: once every surviving marker is resolved, `approve`. If any marker is
|
|
137
|
+
still open, leave the gate alone.
|
|
138
|
+
This call is advisory to the trail, not to the chain: if it fails for a reason outside this flow's
|
|
139
|
+
control (an unwritable local state directory, say), report the failure plainly and carry the
|
|
140
|
+
user's answer forward anyway — the answer is what governs whether the next stage runs, and the
|
|
141
|
+
record of it is what keeps the next stage from asking again.
|
|
142
|
+
|
|
143
|
+
When the answer also carries a choice beyond approve or reject and `paths --json` reports
|
|
144
|
+
`has_decisions: true`, register it too, once `decision --action list`
|
|
145
|
+
shows no live decision with that statement; the receiving stage's batch then leaves it out:
|
|
146
|
+
```bash
|
|
147
|
+
"$DOFLOW" decision --action add --topic "<key>" --statement "<text>" --channel gate --stage "<stage the gate follows>" --rationale "<text>" --json
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
8. **Never skip a gate on an ambiguous answer** — an unanswered or unclear response to any
|
|
151
|
+
`AskUserQuestion` means stop and ask again, per this repo's `RULE_04_QUESTIONS`. When the
|
|
152
|
+
terminal stage completes, state `workflow.handoff` as the next step rather than continuing into
|
|
153
|
+
it.
|
|
154
|
+
|
|
155
|
+
## Conditional research within a feature
|
|
156
|
+
|
|
157
|
+
Before a feature stage relies on an external fact that local or user evidence cannot establish, or when the developer explicitly asks a research question, let that stage follow `../do-document/references/embedded-research.md`. The stage opens a same-task `research-request`, records a source-linked finding or gap, then resumes itself without adding a seventh workflow stage. On resume, read request status and context pack. A blocking unanswered question prevents stage completion; neither research nor a retrieved page approves any existing gate. Do not trigger external search merely because a feature began.
|
|
158
|
+
|
|
159
|
+
## Boundaries
|
|
160
|
+
**Will:**
|
|
161
|
+
- Propose a task class, validate it through the runtime, and run the resolved workflow's stages in
|
|
162
|
+
order without a manual re-invocation at each boundary.
|
|
163
|
+
- Stop only where the resolved workflow says to: its declared gates, a readiness block, or an
|
|
164
|
+
ambiguous answer.
|
|
165
|
+
- Record each gate answer it collects through `orchestrate --action decide-gate`, so the stage skill
|
|
166
|
+
that owns that gate finds it already resolved instead of asking the user the same question twice.
|
|
167
|
+
- Compose with the existing `pre-implement-gate.sh` hard gate rather than bypass or duplicate it.
|
|
168
|
+
That hook keys on branch and artifact state, not on class, so it can deny a `bug` or
|
|
169
|
+
`trivial-edit` workflow's edits on a branch that already holds an incomplete feature dir —
|
|
170
|
+
surface its message as written.
|
|
171
|
+
|
|
172
|
+
**Will Not:**
|
|
173
|
+
- Run any workflow for a class the runtime rejected, or replace a rejected class with `feature`.
|
|
174
|
+
- Infer a class silently when two fit, or read a class the user stated as a suggestion.
|
|
175
|
+
- Consult implementation readiness for a stage that declares no readiness template, or invent a
|
|
176
|
+
readiness template for a class that has none.
|
|
177
|
+
- Modify any stage skill, or invoke `do-constitution` — it is standalone and in no class.
|
|
178
|
+
- Add a hook-level enforcement gate for commit/merge — `gate-b` is conversational only. A
|
|
179
|
+
hook-level version would be a separate, future proposal.
|
|
180
|
+
- Silently proceed past a gate on an ambiguous or missing answer.
|
|
181
|
+
- Record a pause or a deferral as a gate decision — `Let me review the artifacts first` and "let me
|
|
182
|
+
address the findings first" are neither `approve` nor `reject`, and forcing them into one writes a
|
|
183
|
+
decision the user did not make.
|
|
184
|
+
|
|
185
|
+
**Next Step:** whatever the resolved `workflow.handoff` names — for every class that ends in a
|
|
186
|
+
change, `/do-git` to commit/merge once the last gate is cleared.
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Task classes — proposal guide
|
|
2
|
+
|
|
3
|
+
The runtime's workflow registry is authoritative for **what runs**; this file is authoritative for
|
|
4
|
+
**which class to propose**. Never quote a stage list from here: get stages from `classify` or
|
|
5
|
+
`workflow`, so a registry edit reaches the run without a prose edit.
|
|
6
|
+
|
|
7
|
+
## Propose exactly one
|
|
8
|
+
|
|
9
|
+
- Read the request, name one class id, and hand it to `classify` as `taskClass`. That key name is
|
|
10
|
+
literal — the runtime detects `class`, `type`, `taskType`, `workflow` and friends as near-misses
|
|
11
|
+
and rejects the proposal rather than reading them.
|
|
12
|
+
- A proposal is a hypothesis, not a decision. Say what you propose and the one or two signals it
|
|
13
|
+
rests on, so a wrong read is visible before the workflow runs.
|
|
14
|
+
- Two classes fit equally well → **ask**, do not pick the larger one. "Feature" is not the safe
|
|
15
|
+
default; it is the longest workflow and the only one that demands three artifacts before an edit.
|
|
16
|
+
- The user naming a class outright settles it. Propose what they said, and let `classify` reject it
|
|
17
|
+
if it is not a declared id.
|
|
18
|
+
|
|
19
|
+
## Cues
|
|
20
|
+
|
|
21
|
+
| Class | Propose when the request is about… |
|
|
22
|
+
|---|---|
|
|
23
|
+
| `feature` | A capability that does not exist yet and needs to be specified before it is built. |
|
|
24
|
+
| `bug` | Behavior that is wrong *now*, with a symptom the user can point at. |
|
|
25
|
+
| `refactor` | Changing structure while holding behavior fixed — extract, rename, split, de-duplicate. |
|
|
26
|
+
| `review` | Judging code or a diff that already exists. The deliverable is findings. |
|
|
27
|
+
| `research` | Answering a question. The deliverable is a written report, not a change. |
|
|
28
|
+
| `documentation` | Writing or updating docs that ship with the repo — a reference page, a guide, a README section, an architecture note. |
|
|
29
|
+
| `dependency-change` | Adding, removing, or moving the version of something the project depends on. |
|
|
30
|
+
| `operations` | Repository lifecycle — branch, release, merge, hotfix, backport, tag. |
|
|
31
|
+
| `trivial-edit` | One file, no cascade: a typo, a constant, a string, a comment. |
|
|
32
|
+
|
|
33
|
+
## Confusable pairs
|
|
34
|
+
|
|
35
|
+
- **bug vs refactor** — a bug has an observed wrong behavior; a refactor has none, and the suite is
|
|
36
|
+
green before and after. If the suite is red, it is a bug.
|
|
37
|
+
- **bug vs trivial-edit** — a one-line change is still `bug` when the reason it is wrong has to be
|
|
38
|
+
established. `trivial-edit` is for when the target and the correct value are both already known.
|
|
39
|
+
- **review vs bug** — reviewing produces findings; acting on a finding is a separate task with its
|
|
40
|
+
own class. Do not propose `review` for work that ends in an edit.
|
|
41
|
+
- **research vs review** — `review` judges this repository's code, `research` answers a question
|
|
42
|
+
that may have no code answer at all.
|
|
43
|
+
- **dependency-change vs feature** — an upgrade is `dependency-change` even when it unlocks a
|
|
44
|
+
feature. The feature is the next task.
|
|
45
|
+
- **operations vs trivial-edit** — changing a version *string* in a manifest as part of cutting a
|
|
46
|
+
release is `operations`; changing it because it is wrong is `trivial-edit` or `bug`.
|
|
47
|
+
- **documentation vs trivial-edit** — a one-line doc fix with a known target and a known correct
|
|
48
|
+
value is `trivial-edit`; anything that has to be written, or that spans the files a doc set
|
|
49
|
+
cross-references, is `documentation`.
|
|
50
|
+
- **documentation vs research** — `research` answers a question and files a report; `documentation`
|
|
51
|
+
writes prose that ships in the tree. If the deliverable is committed alongside the code, it is
|
|
52
|
+
`documentation`.
|
|
53
|
+
|
|
54
|
+
## Properties each class guarantees
|
|
55
|
+
|
|
56
|
+
These are structural facts about the resolved workflow, not advice — read them off the returned
|
|
57
|
+
object rather than assuming them.
|
|
58
|
+
|
|
59
|
+
- **`review`** — `hasImplementationStage: false`. There is no stage that edits source, so a review
|
|
60
|
+
run never enters implementation and never consults implementation readiness. A finding leaves the
|
|
61
|
+
workflow as its own task under its own class.
|
|
62
|
+
- **`research`** — terminates at synthesis. `requiresImplementationReadiness: false`: do not run a
|
|
63
|
+
readiness check, do not report one as skipped, and do not ask for the evidence a readiness
|
|
64
|
+
template would want. If the synthesis motivates a change, that change is a new task.
|
|
65
|
+
- **`documentation`** — no readiness template, by the same rule as `review` and `research`: the
|
|
66
|
+
workflow authors no source, so implementation readiness has nothing to gate. Every claim the prose
|
|
67
|
+
makes carries a locator — a figure nobody measured is the failure this class actually has. The
|
|
68
|
+
verification stage is optional, and a skip must be stated with the reason the repository has no
|
|
69
|
+
check the documentation can break.
|
|
70
|
+
- **`bug`** — starts from reproduction and root cause. Do not propose or apply a fix before the
|
|
71
|
+
reproduction stage has recorded the failure and the analysis stage has supported a cause. A fix
|
|
72
|
+
proposed at intake is the thing this ordering exists to prevent.
|
|
73
|
+
- **`refactor`** — needs a recorded green baseline before the first edit, so a later failure is
|
|
74
|
+
attributable to the restructuring rather than argued about.
|
|
75
|
+
- **`dependency-change`** — starts from the upstream release evidence for the exact version range,
|
|
76
|
+
not from the version number. Its verification stage runs the full suite: the blast radius is not
|
|
77
|
+
bounded by the diff.
|
|
78
|
+
- **`operations`** — **ungated, deliberately.** The readiness registry holds no `operations`
|
|
79
|
+
template, and the class claims none: the workflow authors no source, so
|
|
80
|
+
implementation readiness has nothing to gate. Its equivalent safeguard is the preflight
|
|
81
|
+
verification stage. Do not invent a template, and do not call `readiness --task-class operations`
|
|
82
|
+
— the verb rejects it, and rightly.
|
|
83
|
+
- **`trivial-edit`** — deliberately the shortest workflow. Do not add checks to it; if it needs
|
|
84
|
+
them, it was the wrong class.
|
|
85
|
+
- **`feature`** — unchanged from what `do-flow` has always run: the six-stage chain, resumed from
|
|
86
|
+
the first missing artifact, stopping at unresolved clarifications, before implementation, and
|
|
87
|
+
before commit or merge.
|
|
88
|
+
|
|
89
|
+
## Reading the decision
|
|
90
|
+
|
|
91
|
+
`classify` returns one object. The fields this skill acts on:
|
|
92
|
+
|
|
93
|
+
- `outcome` — `ACCEPTED` or `REJECTED`. Branch on this, never on the exit code.
|
|
94
|
+
- `message` — the sentence to show the user. On a rejection it already names the valid set and any
|
|
95
|
+
near-match suggestions, so surface it verbatim rather than paraphrasing it.
|
|
96
|
+
- `validClasses`, `suggestions` — present on a rejection; the option set for the follow-up question.
|
|
97
|
+
- `fit` — whether the class's workflow has a stage for the skill that called `classify`. See below.
|
|
98
|
+
- `callerSuggestions` — present only on an `unknown-calling-skill` rejection. Skill ids, never class
|
|
99
|
+
ids: do not offer them as an answer to "which class?".
|
|
100
|
+
- `workflow` — present only on `ACCEPTED`; `null` on a rejection. The run's plan of record.
|
|
101
|
+
|
|
102
|
+
Within `workflow`: `stages[]` (each with `id`, `skill`, `kind`, `purpose`, `optional`,
|
|
103
|
+
`readinessTemplate`, `mutatesSource`, `gatesAfter`), `stageIds`, `gates[]` (`id`, `name`,
|
|
104
|
+
`afterStage`, `trigger`, `prompt`), `hasImplementationStage`,
|
|
105
|
+
`requiresImplementationReadiness`, and `handoff`.
|
|
106
|
+
|
|
107
|
+
## Fit: does this class have a stage for the skill asking?
|
|
108
|
+
|
|
109
|
+
Pass `--calling-skill <this skill's own id>` with every `classify` call. Membership — "is this a
|
|
110
|
+
real class?" — is not the same question as fit — "does this class's workflow have a stage I can
|
|
111
|
+
occupy?" — and a class can pass the first while having nowhere to put your work.
|
|
112
|
+
|
|
113
|
+
`fit.state` is one of four:
|
|
114
|
+
|
|
115
|
+
- `HOSTED` — the class names your skill at `fit.hostedStageIds`. Proceed.
|
|
116
|
+
- `NOT_APPLICABLE` — you are a router (`do`, `do-flow`): you select stages rather than occupying
|
|
117
|
+
one, so fit is judged one hop later by the skill you hand the work to.
|
|
118
|
+
- `NOT_HOSTED` — a rejection. See below.
|
|
119
|
+
- `NOT_EVALUATED` — **nothing was checked.** Either no calling skill was named, or it was named
|
|
120
|
+
under the wrong key. This is not a pass: the decision establishes that the class exists and
|
|
121
|
+
nothing more. Re-run with `--calling-skill`.
|
|
122
|
+
|
|
123
|
+
A `caller-not-a-stage` rejection is about **you**, not about the class. Answer it from
|
|
124
|
+
`fit.hostingClasses`, which lists every class that does have a stage for your skill and names the
|
|
125
|
+
stage — propose one of those, or hand the work to the skill this class names for the stage you
|
|
126
|
+
meant. Re-proposing the same class will be rejected the same way.
|
|
127
|
+
|
|
128
|
+
## The hard hook does not know about classes
|
|
129
|
+
|
|
130
|
+
`pre-implement-gate.sh` keys on branch and artifact state: if the current branch already carries a
|
|
131
|
+
feature directory missing `requirement.md`, `design.md` or `plan.md`, it denies source edits
|
|
132
|
+
regardless of the class in play — so a `bug` or `trivial-edit` workflow started on that branch will
|
|
133
|
+
be blocked at its implementation stage. Surface the hook's message as written. Do not route around
|
|
134
|
+
it, and do not create placeholder artifacts to satisfy it.
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: do-git
|
|
3
|
+
description: "Git operations with lifecycle-aware intents and safety checks — start, save, sync, ship, release, hotfix, backport, and status, plus raw git passthrough for anything else. Use whenever the user requests git actions, branch management, committing changes, syncing with remotes, or release rituals (e.g., 'commit these files', 'ship this feature', 'create a feature branch', 'cut a hotfix', 'sync repo', 'what is git status'). Always activate this skill for safe, confirmed git operations rather than running bare mutating git commands."
|
|
4
|
+
argument-hint: "[intent] [args...] [--confirm]"
|
|
5
|
+
effort: medium
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# do-git
|
|
9
|
+
|
|
10
|
+
Cycle-aware git operations via named lifecycle intents. Reads policy from the repository's
|
|
11
|
+
constitution or falls back to opinionated defaults. All mutating operations require explicit
|
|
12
|
+
confirmation.
|
|
13
|
+
|
|
14
|
+
## Invocation
|
|
15
|
+
```text
|
|
16
|
+
/do-git <intent> [args...] [--confirm]
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Intents
|
|
20
|
+
|
|
21
|
+
| Intent | Description |
|
|
22
|
+
|---|---|
|
|
23
|
+
| `start` | Start a new task on the appropriate branch type |
|
|
24
|
+
| `save` | Stage and commit current changes with intelligent message |
|
|
25
|
+
| `sync` | Sync local branches with remote state |
|
|
26
|
+
| `ship` | Ship the current feature/fix (merge to integration) |
|
|
27
|
+
| `release` | Run the release ritual as one previewed sequence |
|
|
28
|
+
| `hotfix` | Create and propagate a hotfix across all live lines |
|
|
29
|
+
| `backport` | Cherry-pick a commit to another branch |
|
|
30
|
+
| `status` | Report repository state and lifecycle position |
|
|
31
|
+
|
|
32
|
+
### Raw Operation Passthrough
|
|
33
|
+
|
|
34
|
+
Any unrecognized first token falls through to today's raw git operation behavior:
|
|
35
|
+
```text
|
|
36
|
+
/do-git status # Today's raw git status (no prompt)
|
|
37
|
+
/do-git log --oneline
|
|
38
|
+
/do-git diff HEAD~10
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Existing `/do-git [operation]` invocations keep working.
|
|
42
|
+
|
|
43
|
+
## Behavioral Flow
|
|
44
|
+
|
|
45
|
+
Every DoFlow runtime call in this skill goes through the runtime seam. Resolve it **once** here and
|
|
46
|
+
reuse `$DOFLOW` for every later call in this skill:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# Resolve the DoFlow runtime: nearest project install wins, then the global one.
|
|
50
|
+
D=$PWD; while [ "$D" != / ] && [ ! -x "$D/.doflow/scripts/doflow/bin/doflow-run" ]; do D=$(dirname "$D"); done
|
|
51
|
+
DOFLOW="$D/.doflow/scripts/doflow/bin/doflow-run"
|
|
52
|
+
[ -x "$DOFLOW" ] || DOFLOW="$HOME/.doflow/scripts/doflow/bin/doflow-run"
|
|
53
|
+
[ -x "$DOFLOW" ] || { echo "doflow: no runtime found in any .doflow/ above $PWD, nor at $HOME/.doflow. Run: npx @khoavu882/doflow install -t <harness>" >&2; exit 2; }
|
|
54
|
+
```
|
|
55
|
+
Run every command below from the project root — the walk-up starts at `$PWD`. On exit 2, print the message verbatim and stop; it names every path searched.
|
|
56
|
+
|
|
57
|
+
### Per Intent Processing
|
|
58
|
+
|
|
59
|
+
1. **Read repository state** → `"$DOFLOW" paths --json`, `"$DOFLOW" git-state` as needed
|
|
60
|
+
2. **Dry-run fingerprint** (for mutable intents) → `"$DOFLOW" git-state --fingerprint`, record it, so a later step can tell whether the working tree moved underneath the plan
|
|
61
|
+
3. **Compose preview sequence** → exact commands with concrete values, no placeholders. **The preview is the contract for this intent**: it is the complete set of commands that will run, in order, against the fingerprint from step 2. A command that is not in it does not run, and a step you cannot spell concretely is a step to stop on rather than to improvise at execution time
|
|
62
|
+
4. **User confirmation** → explicit go/no-go before execution
|
|
63
|
+
5. **Re-fingerprint** → `"$DOFLOW" git-state --fingerprint`; if changed since step 2, abort and re-preview
|
|
64
|
+
6. **Execute, then report against the preview** → every command in the previewed sequence gets a reported result; one the sequence listed and the run did not reach is reported as not run, never dropped from the report
|
|
65
|
+
|
|
66
|
+
### Raw Operation Passthrough Flow
|
|
67
|
+
|
|
68
|
+
1. **Check state first** (`git status`) for any operation that could discard work
|
|
69
|
+
2. **Gate on reversibility**: stash or confirm before destructive operations
|
|
70
|
+
3. **Execute** the raw git command
|
|
71
|
+
4. **Report** result, next-Step suggestion if applicable
|
|
72
|
+
|
|
73
|
+
## Safety Gates
|
|
74
|
+
|
|
75
|
+
The following behaviors from today's skill are carried over unchanged:
|
|
76
|
+
|
|
77
|
+
- **State checks** → `git status` before anything that could discard uncommitted work
|
|
78
|
+
- **Confirm before irreversible actions**:
|
|
79
|
+
- Force-pushes to any branch
|
|
80
|
+
- Pushes to production (`master`/`main`)
|
|
81
|
+
- History rewrites (rebase, reset, tag force-overwrite)
|
|
82
|
+
- **No implicit approvals** → confirmation is per-command sequence, not broad permission
|
|
83
|
+
|
|
84
|
+
## Boundaries
|
|
85
|
+
|
|
86
|
+
**Will:**
|
|
87
|
+
- Run named lifecycle intents with full preview and confirmation
|
|
88
|
+
- Fall through to raw git operations for unrecognized first tokens
|
|
89
|
+
- Generate commit messages from actual diff content, never from the request's wording
|
|
90
|
+
- Derive branch names purely from policy plus `"$DOFLOW" git-state` — never invent one
|
|
91
|
+
|
|
92
|
+
**Will Not:**
|
|
93
|
+
- Forge API calls (PR/MR creation, pipeline watching) - excluded per scope boundary
|
|
94
|
+
- CI/CD setup or branch protection scaffolding - excluded per scope boundary
|
|
95
|
+
- Confirm multiple commands at once - each requires explicit go/no-go
|
|
96
|
+
|
|
97
|
+
## Reference Files
|
|
98
|
+
|
|
99
|
+
This skill loads the following reference files on demand (not parsed at runtime):
|
|
100
|
+
|
|
101
|
+
- `references/lifecycle-policy.md` - default policy + override shape + forge mapping
|
|
102
|
+
- `references/release-ritual.md` - release sequence, manifest rewrite, CHANGELOG drafting
|
|
103
|
+
- `references/hotfix-ritual.md` - hotfix propagation rules and halt-on-conflict behavior
|
|
104
|
+
|
|
105
|
+
## Examples
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
/do-git status # Report current lifecycle position
|
|
109
|
+
/do-git start # Prepare for a new task (feature/fix branch)
|
|
110
|
+
/do-git save # Stage and commit with intelligent message
|
|
111
|
+
/do-git ship # Merge feature to integration
|
|
112
|
+
/do-git release # Run full release ritual
|
|
113
|
+
/do-git hotfix 12345 # Create hotfix from fix #12345
|
|
114
|
+
/do-git log --oneline # Raw git passthrough
|
|
115
|
+
```
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Hotfix Procedure: /do-git
|
|
2
|
+
|
|
3
|
+
This procedure is executed when `/do-git hotfix` is invoked. It patches production and
|
|
4
|
+
propagates to every live line.
|
|
5
|
+
|
|
6
|
+
## Sequence
|
|
7
|
+
|
|
8
|
+
Runs inside `SKILL.md`'s Per Intent Processing sequence. This file supplies only the
|
|
9
|
+
intent-specific preview content (its steps 2–3).
|
|
10
|
+
|
|
11
|
+
1. **Propagation targets** → `"$DOFLOW" git-state --propagation-targets`
|
|
12
|
+
2. **Preview full command sequence**:
|
|
13
|
+
- Create hotfix branch from production: `git checkout -b hotfix/<slug> production-branch`
|
|
14
|
+
- Cherry-pick or merge the fix commit(s)
|
|
15
|
+
- Tag with patch version: `git tag v<major>.<minor>.<patch>` (annotated)
|
|
16
|
+
- Merge to production without fast-forward
|
|
17
|
+
- For each target in propagation targets:
|
|
18
|
+
- If target is integration: merge hotfix branch into it
|
|
19
|
+
- If target is active release branch: cherry-pick the fix commit
|
|
20
|
+
|
|
21
|
+
## Propagation Rules
|
|
22
|
+
|
|
23
|
+
### Target Order
|
|
24
|
+
1. Production branch (merge hotfix)
|
|
25
|
+
2. Integration branch (merge hotfix)
|
|
26
|
+
3. Active release branches in order of creation (cherry-pick)
|
|
27
|
+
|
|
28
|
+
### Outstanding Target Definition
|
|
29
|
+
A target is "outstanding" if:
|
|
30
|
+
- It cannot receive the fix automatically (conflicting cherry-pick)
|
|
31
|
+
- It requires manual intervention
|
|
32
|
+
|
|
33
|
+
### Halt-and-Report Behavior
|
|
34
|
+
On a conflicting cherry-pick:
|
|
35
|
+
1. Stop propagation immediately
|
|
36
|
+
2. Report all outstanding targets with conflict details
|
|
37
|
+
3. Do NOT report hotfix as complete
|
|
38
|
+
4. Report exact chain of commits that could not be applied
|
|
39
|
+
|
|
40
|
+
## Constraints
|
|
41
|
+
|
|
42
|
+
- **Hotfix merges directly to production first** before any other targets
|
|
43
|
+
- **Each target's propagation status is tracked** - no silent omissions
|
|
44
|
+
- **Conflict detection is required** - no forced cherry-picks without user intervention
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Lifecycle Policy: /do-git default branching policy
|
|
2
|
+
|
|
3
|
+
## Default Policy Table
|
|
4
|
+
|
|
5
|
+
| Field | Value |
|
|
6
|
+
|---|---|
|
|
7
|
+
| `trunk_names` | `main`, `develop` |
|
|
8
|
+
| `feature_prefixes` | `feat`, `feature` |
|
|
9
|
+
| `fix_prefixes` | `fix`, `bugfix` |
|
|
10
|
+
| `integration_branch` | `develop` |
|
|
11
|
+
| `production_branch` | `master` |
|
|
12
|
+
| `tag_format` | `vX.Y.Z` (semver) |
|
|
13
|
+
|
|
14
|
+
These are transcribed defaults, not the live ones. `"$DOFLOW" git-state` computes the branch class
|
|
15
|
+
and lifecycle position from the values it actually holds — when the two disagree, the verb is right
|
|
16
|
+
and this table is stale.
|
|
17
|
+
|
|
18
|
+
## Tier-2 Constitution Override Shape
|
|
19
|
+
|
|
20
|
+
A repo may override the default policy by adding a block under `agent-docs/constitution.md`:
|
|
21
|
+
|
|
22
|
+
```markdown
|
|
23
|
+
## /do-git Policy Overrides
|
|
24
|
+
|
|
25
|
+
| Field | Value |
|
|
26
|
+
|---|---|
|
|
27
|
+
| trunk_names | Comma-separated list of trunk branch names |
|
|
28
|
+
| feature_prefixes | Comma-separated list of feature branch prefixes |
|
|
29
|
+
| fix_prefixes | Comma-separated list of fix branch prefixes |
|
|
30
|
+
| integration_branch | The integration branch name |
|
|
31
|
+
| production_branch | The production branch name |
|
|
32
|
+
| tag_format | The tagging format (semver or custom) |
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Where absent, defaults apply.
|
|
36
|
+
|
|
37
|
+
## Forge Adaptation
|
|
38
|
+
|
|
39
|
+
Nothing in this repo runs forge detection today, so this file describes no mechanism for it. Read
|
|
40
|
+
the forge off the remote's host when the vocabulary matters (`Pull Request` on GitHub, `Merge
|
|
41
|
+
Request` on GitLab); detection failure or an unknown remote degrades to plain git with the ambiguity
|
|
42
|
+
stated rather than guessed.
|
|
43
|
+
|
|
44
|
+
## Deviation Catalogue
|
|
45
|
+
|
|
46
|
+
What counts as a policy deviation and how it's reported:
|
|
47
|
+
|
|
48
|
+
| Observation | Classification | Action |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| Branch name doesn't match any defined pattern | Unclassifiable branch | Report deviation, continue |
|
|
51
|
+
| Release branch without corresponding tag | Missing tag | Report deviation |
|
|
52
|
+
| Hotfix not propagated to all active release branches | Incomplete propagation | Report outstanding targets |
|
|
53
|
+
|
|
54
|
+
Deviations are **reported**, never silently corrected.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Release Procedure: /do-git
|
|
2
|
+
|
|
3
|
+
This procedure is executed when `/do-git release` is invoked. It runs as one previewed,
|
|
4
|
+
confirmed sequence.
|
|
5
|
+
|
|
6
|
+
## Sequence
|
|
7
|
+
|
|
8
|
+
Runs inside `SKILL.md`'s Per Intent Processing sequence. This file supplies only the
|
|
9
|
+
intent-specific preview content (its steps 2–3).
|
|
10
|
+
|
|
11
|
+
1. **Next version** → `"$DOFLOW" git-state --next-version`
|
|
12
|
+
- When `is_prerelease` is true the verb returns **two** candidates and picks neither:
|
|
13
|
+
`next_version` promotes the line (`1.0.0-beta.7` → `1.0.0`, because semver orders a
|
|
14
|
+
pre-release *before* its own version, so promoting it is the bump) and `next_prerelease`
|
|
15
|
+
continues it (`1.0.0-beta.8`). Put both to the user rather than assuming one — which of the
|
|
16
|
+
two is right is a product decision, not a computation.
|
|
17
|
+
2. **Preview full command sequence** with the proposed version:
|
|
18
|
+
- `git checkout -b release/v<version> <integration-branch>`
|
|
19
|
+
- Update all version manifests (per policy: package.json, etc.)
|
|
20
|
+
- Draft CHANGELOG entry from commits since last tag
|
|
21
|
+
- Commit version bump
|
|
22
|
+
- `git checkout <production-branch>`, then `git merge --no-ff release/v<version>`
|
|
23
|
+
- `git tag v<version>` (annotated)
|
|
24
|
+
- `git push origin release/v<version> v<version>`
|
|
25
|
+
- Back-merge: merge the release branch back to the integration branch
|
|
26
|
+
|
|
27
|
+
Also preview the shipped features with `"$DOFLOW" lifecycle --action release --tag v<version>`
|
|
28
|
+
(it writes nothing). After the tag is created, rerun it with `--confirm`. The record is local;
|
|
29
|
+
DoFlow never stages, commits or pushes it.
|
|
30
|
+
|
|
31
|
+
## Version Manifest Rewrite
|
|
32
|
+
|
|
33
|
+
For each manifest file declared in policy:
|
|
34
|
+
- Extract current version string using appropriate format (version, versionCode, etc.)
|
|
35
|
+
- Replace with the next version `"$DOFLOW" git-state --next-version` derived
|
|
36
|
+
- Leave format intact; only change the value
|
|
37
|
+
|
|
38
|
+
## CHANGELOG Drafting Instruction
|
|
39
|
+
|
|
40
|
+
Generate a Keep-a-Changelog style entry for `[Unreleased]`:
|
|
41
|
+
- Group commits by type (feat, fix, BREAKING CHANGE)
|
|
42
|
+
- For each group, list commits as bullet items
|
|
43
|
+
- Include scope where inferable from changed paths
|
|
44
|
+
- Use conventional commit message format as-is
|
|
45
|
+
|
|
46
|
+
Example:
|
|
47
|
+
```markdown
|
|
48
|
+
## [v1.0.0] - YYYY-MM-DD
|
|
49
|
+
### Added
|
|
50
|
+
- Feature X by user
|
|
51
|
+
|
|
52
|
+
### Fixed
|
|
53
|
+
- Bug Y reported by user
|
|
54
|
+
|
|
55
|
+
### Breaking Changes
|
|
56
|
+
- Changed API Z
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Constraints
|
|
60
|
+
|
|
61
|
+
- **Never write the version manifests until after user confirmation** (the preview above shows the
|
|
62
|
+
proposed content only)
|
|
63
|
+
- **Fingerprint mismatch aborts execution** - state must be exactly as when previewed
|
|
64
|
+
- **All push operations require confirmation** — see `SKILL.md`'s Safety Gates
|