@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,492 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// TypeScript migration (agent-docs/BRIEF_GOAL_DOFLOW.md): run directly by Node native type-stripping.
|
|
4
|
+
|
|
5
|
+
const { EvidenceLedger } = require('./evidence-ledger.ts');
|
|
6
|
+
const { ClaimsManager } = require('./claims.ts');
|
|
7
|
+
const { ResearchRequestStore } = require('./research-request.ts');
|
|
8
|
+
const { finishRuntime, usageError } = require('./cli-result.ts');
|
|
9
|
+
const { resolveActiveFeature } = require('./feature-resolve.ts');
|
|
10
|
+
const { readRegister } = require('./decision-register.ts');
|
|
11
|
+
|
|
12
|
+
const NO_DECISIONS = Object.freeze({ available: false, live: [], liveCount: 0 });
|
|
13
|
+
|
|
14
|
+
const TASK_CLASS_BUDGETS: Record<string, any> = Object.freeze({
|
|
15
|
+
feature: 225000,
|
|
16
|
+
'dependency-change': 85000,
|
|
17
|
+
bug: 71000,
|
|
18
|
+
refactor: 71000,
|
|
19
|
+
documentation: 57000,
|
|
20
|
+
operations: 45000,
|
|
21
|
+
review: 42000,
|
|
22
|
+
research: 35302,
|
|
23
|
+
'trivial-edit': 30000,
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The live decisions of the feature the caller is working on (IC-012). The feature is resolved
|
|
28
|
+
* from the branch, or from `slug` when the task id is not the feature slug. A feature with no
|
|
29
|
+
* register or an unresolvable feature reads as "not available"; an unreadable register does too,
|
|
30
|
+
* with a `reason`. Neither throws: a context pack is a read, and a missing register must not stop
|
|
31
|
+
* a stage from getting its evidence.
|
|
32
|
+
* @param {{projectRoot:string, slug?:string|null}} options
|
|
33
|
+
* @returns {{available:boolean, live:Array<Object>, liveCount:number, reason?:string}}
|
|
34
|
+
*/
|
|
35
|
+
function loadLiveDecisions({ projectRoot, slug = null }: any) {
|
|
36
|
+
try {
|
|
37
|
+
const feature = resolveActiveFeature({ projectRoot, slug });
|
|
38
|
+
if (feature.error) return { ...NO_DECISIONS };
|
|
39
|
+
let register;
|
|
40
|
+
try {
|
|
41
|
+
register = readRegister(feature.featureDir);
|
|
42
|
+
} catch (error: any) {
|
|
43
|
+
// The register exists but cannot be trusted. Stay unavailable, but say why, so a stage
|
|
44
|
+
// sees the corruption instead of reading "no decisions".
|
|
45
|
+
return { ...NO_DECISIONS, reason: `register unreadable: ${error.message}` };
|
|
46
|
+
}
|
|
47
|
+
if (!register) return { ...NO_DECISIONS };
|
|
48
|
+
const live = register.decisions
|
|
49
|
+
.filter((d: any) => d.status === 'live')
|
|
50
|
+
.sort((a: any, b: any) => (a.topic < b.topic ? -1 : a.topic > b.topic ? 1 : 0))
|
|
51
|
+
.map(({ id, topic, statement, decidedBy, stage }: any) => ({ id, topic, statement, decidedBy, stage }));
|
|
52
|
+
return { available: true, live, liveCount: live.length };
|
|
53
|
+
} catch {
|
|
54
|
+
return { ...NO_DECISIONS };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
class ContextPackCompiler {
|
|
59
|
+
declare options: any;
|
|
60
|
+
/**
|
|
61
|
+
* @param {Object} [defaultOptions]
|
|
62
|
+
* @param {number} [defaultOptions.maxFiles=15]
|
|
63
|
+
* @param {number} [defaultOptions.maxClaims=20]
|
|
64
|
+
* @param {number} [defaultOptions.maxEvidenceItems=25]
|
|
65
|
+
*/
|
|
66
|
+
constructor(defaultOptions: any = {}) {
|
|
67
|
+
this.options = {
|
|
68
|
+
maxFiles: defaultOptions.maxFiles || 15,
|
|
69
|
+
maxClaims: defaultOptions.maxClaims || 20,
|
|
70
|
+
maxEvidenceItems: defaultOptions.maxEvidenceItems || 25,
|
|
71
|
+
maxResearchRequests: defaultOptions.maxResearchRequests || 20,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Compiles a ContextPack from task evidence and claims.
|
|
77
|
+
* @param {Object} params
|
|
78
|
+
* @param {string} params.taskId
|
|
79
|
+
* @param {string} [params.taskClass='feature']
|
|
80
|
+
* @param {string} [params.objective='']
|
|
81
|
+
* @param {Array<string>} [params.constraints=[]]
|
|
82
|
+
* @param {Array<string>} [params.acceptanceCriteria=[]]
|
|
83
|
+
* @param {Object} params.evidenceLedger
|
|
84
|
+
* @param {Object} params.claimsManager
|
|
85
|
+
* @param {Object} [budgetOverrides={}]
|
|
86
|
+
* @returns {Object} ContextPack
|
|
87
|
+
*/
|
|
88
|
+
compileContextPack(params: any, budgetOverrides: any = {}) {
|
|
89
|
+
const {
|
|
90
|
+
taskId,
|
|
91
|
+
taskClass = 'feature',
|
|
92
|
+
objective = '',
|
|
93
|
+
constraints = [],
|
|
94
|
+
acceptanceCriteria = [],
|
|
95
|
+
evidenceLedger,
|
|
96
|
+
claimsManager,
|
|
97
|
+
researchRequests = [],
|
|
98
|
+
decisions = NO_DECISIONS,
|
|
99
|
+
} = params;
|
|
100
|
+
|
|
101
|
+
const limits = { ...this.options, ...budgetOverrides };
|
|
102
|
+
|
|
103
|
+
const rawClaims = claimsManager ? claimsManager.getClaims(taskId) : [];
|
|
104
|
+
const rawEvidence = evidenceLedger ? evidenceLedger.queryEvidence({ taskId }) : [];
|
|
105
|
+
|
|
106
|
+
// Filter claims
|
|
107
|
+
const supportedClaims = [];
|
|
108
|
+
const activeHypotheses = [];
|
|
109
|
+
const conflictedClaims = [];
|
|
110
|
+
|
|
111
|
+
for (const claim of rawClaims) {
|
|
112
|
+
if (claim.status === 'supported') {
|
|
113
|
+
if (supportedClaims.length < limits.maxClaims) {
|
|
114
|
+
supportedClaims.push({
|
|
115
|
+
id: claim.id,
|
|
116
|
+
statement: claim.statement,
|
|
117
|
+
evidenceIds: claim.supportingEvidence,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
} else if (claim.status === 'hypothesis') {
|
|
121
|
+
activeHypotheses.push({
|
|
122
|
+
id: claim.id,
|
|
123
|
+
statement: claim.statement,
|
|
124
|
+
});
|
|
125
|
+
} else if (claim.status === 'conflicted') {
|
|
126
|
+
conflictedClaims.push({
|
|
127
|
+
id: claim.id,
|
|
128
|
+
statement: claim.statement,
|
|
129
|
+
supportingEvidence: claim.supportingEvidence,
|
|
130
|
+
contradictingEvidence: claim.contradictingEvidence,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Extract relevant files and structural context from fresh evidence
|
|
136
|
+
const relevantFileSet = new Set();
|
|
137
|
+
const structuralNodes = [];
|
|
138
|
+
const freshEvidenceItems = [];
|
|
139
|
+
|
|
140
|
+
for (const ev of rawEvidence) {
|
|
141
|
+
if (ev.freshness?.status === 'FRESH') {
|
|
142
|
+
if (ev.locator?.file) {
|
|
143
|
+
relevantFileSet.add(ev.locator.file);
|
|
144
|
+
}
|
|
145
|
+
if (ev.kind === 'structural' && ev.content) {
|
|
146
|
+
structuralNodes.push(ev.content);
|
|
147
|
+
}
|
|
148
|
+
if (freshEvidenceItems.length < limits.maxEvidenceItems) {
|
|
149
|
+
freshEvidenceItems.push({
|
|
150
|
+
id: ev.id,
|
|
151
|
+
kind: ev.kind,
|
|
152
|
+
locator: ev.locator,
|
|
153
|
+
summary: typeof ev.content === 'string' ? ev.content.slice(0, 120) : null,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const relevantFiles = Array.from(relevantFileSet).slice(0, limits.maxFiles);
|
|
160
|
+
|
|
161
|
+
return {
|
|
162
|
+
version: 1,
|
|
163
|
+
taskId: taskId || 'default',
|
|
164
|
+
taskClass,
|
|
165
|
+
compiledAt: new Date().toISOString(),
|
|
166
|
+
objective,
|
|
167
|
+
constraints: [...constraints],
|
|
168
|
+
// Ported from `evidence/context_pack.py` (plan task B.3): the only field the Python pack
|
|
169
|
+
// carried that this one did not. What the task must satisfy belongs beside the evidence
|
|
170
|
+
// gathered to satisfy it, otherwise the verification engine has to re-read the requirement
|
|
171
|
+
// to find out what it is verifying against.
|
|
172
|
+
verificationRequirements: [...acceptanceCriteria],
|
|
173
|
+
claims: {
|
|
174
|
+
supported: supportedClaims,
|
|
175
|
+
hypotheses: activeHypotheses,
|
|
176
|
+
conflicts: conflictedClaims,
|
|
177
|
+
},
|
|
178
|
+
relevantFiles,
|
|
179
|
+
structuralContext: structuralNodes.slice(0, 5),
|
|
180
|
+
evidenceCount: freshEvidenceItems.length,
|
|
181
|
+
evidenceSummary: freshEvidenceItems,
|
|
182
|
+
researchRequests: [...researchRequests]
|
|
183
|
+
.sort((a, b) => Number(b.blocking && b.status !== 'ANSWERED')
|
|
184
|
+
- Number(a.blocking && a.status !== 'ANSWERED'))
|
|
185
|
+
.slice(0, limits.maxResearchRequests).map(r => ({
|
|
186
|
+
id: r.id, stageId: r.stageId, question: r.question, status: r.status,
|
|
187
|
+
blocking: r.blocking, claimId: r.claimId, evidenceIds: r.evidenceIds, gap: r.gap,
|
|
188
|
+
})),
|
|
189
|
+
decisions: {
|
|
190
|
+
available: decisions.available, live: [...decisions.live], liveCount: decisions.liveCount,
|
|
191
|
+
...(decisions.reason ? { reason: decisions.reason } : {}),
|
|
192
|
+
},
|
|
193
|
+
budgetEnforcement: {
|
|
194
|
+
totalFiles: relevantFiles.length,
|
|
195
|
+
totalSupportedClaims: supportedClaims.length,
|
|
196
|
+
totalActiveHypotheses: activeHypotheses.length,
|
|
197
|
+
limits,
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Formats a ContextPack into a concise markdown context block.
|
|
204
|
+
* @param {Object} pack
|
|
205
|
+
* @returns {string}
|
|
206
|
+
*/
|
|
207
|
+
formatMarkdown(pack: any) {
|
|
208
|
+
let md = `## ContextPack: [${pack.taskClass.toUpperCase()}] ${pack.taskId}\n`;
|
|
209
|
+
if (pack.objective) {
|
|
210
|
+
md += `**Objective:** ${pack.objective}\n\n`;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (pack.claims.supported.length > 0) {
|
|
214
|
+
md += `### Supported Facts & Invariants\n`;
|
|
215
|
+
for (const c of pack.claims.supported) {
|
|
216
|
+
md += `- ✓ ${c.statement} *(ev: ${c.evidenceIds.join(', ')})*\n`;
|
|
217
|
+
}
|
|
218
|
+
md += '\n';
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (pack.claims.hypotheses.length > 0) {
|
|
222
|
+
md += `### Active Hypotheses (Unverified)\n`;
|
|
223
|
+
for (const h of pack.claims.hypotheses) {
|
|
224
|
+
md += `- ? ${h.statement}\n`;
|
|
225
|
+
}
|
|
226
|
+
md += '\n';
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (pack.researchRequests.length > 0) {
|
|
230
|
+
md += `### Feature Research Requests\n`;
|
|
231
|
+
for (const r of pack.researchRequests) {
|
|
232
|
+
md += `- ${r.status} ${r.blocking ? '(blocking)' : '(nonblocking)'} ${r.stageId}: ${r.question}`;
|
|
233
|
+
if (r.gap) md += ` — ${r.gap}`;
|
|
234
|
+
if (r.claimId) md += ` (claim: ${r.claimId})`;
|
|
235
|
+
md += '\n';
|
|
236
|
+
}
|
|
237
|
+
md += '\n';
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if (pack.decisions && pack.decisions.liveCount > 0) {
|
|
241
|
+
md += `### Live decisions\n`;
|
|
242
|
+
for (const d of pack.decisions.live) md += `- ${d.id} (${d.topic}): ${d.statement}\n`;
|
|
243
|
+
md += '\n';
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if (pack.relevantFiles.length > 0) {
|
|
247
|
+
md += `### Relevant File Locators\n`;
|
|
248
|
+
for (const f of pack.relevantFiles) {
|
|
249
|
+
md += `- \`${f}\`\n`;
|
|
250
|
+
}
|
|
251
|
+
md += '\n';
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
return md;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Compiles bounded context pack payload with mandatory/optional partitioning (IC-001).
|
|
259
|
+
* @param {Object} options
|
|
260
|
+
* @param {string} options.taskId
|
|
261
|
+
* @param {string} [options.taskClass='feature']
|
|
262
|
+
* @param {number} [options.maxBytes]
|
|
263
|
+
* @param {string} [options.objective='']
|
|
264
|
+
* @param {Object} [options.mandatory]
|
|
265
|
+
* @param {Array<string>} [options.mandatory.acceptanceCriteria]
|
|
266
|
+
* @param {Array<string>} [options.mandatory.constraints]
|
|
267
|
+
* @param {string} [options.mandatory.verificationPlan]
|
|
268
|
+
* @param {Object} [options.optional]
|
|
269
|
+
* @param {Array<string>} [options.optional.hypotheses]
|
|
270
|
+
* @param {Array<string>} [options.optional.narrative]
|
|
271
|
+
* @param {Array<string>} [options.optional.unverifiedClaims]
|
|
272
|
+
* @returns {Object} ContextPackResult
|
|
273
|
+
*/
|
|
274
|
+
compileBoundedContextPack(options: any = {}) {
|
|
275
|
+
const {
|
|
276
|
+
taskId = 'default',
|
|
277
|
+
taskClass = 'feature',
|
|
278
|
+
maxBytes,
|
|
279
|
+
objective = '',
|
|
280
|
+
mandatory = {},
|
|
281
|
+
optional = {},
|
|
282
|
+
} = options;
|
|
283
|
+
|
|
284
|
+
const budgetBytes = Number.isInteger(maxBytes) && maxBytes > 0
|
|
285
|
+
? maxBytes
|
|
286
|
+
: (TASK_CLASS_BUDGETS[taskClass] || 225000);
|
|
287
|
+
|
|
288
|
+
const acceptanceCriteria = Array.isArray(mandatory.acceptanceCriteria) ? [...mandatory.acceptanceCriteria] : [];
|
|
289
|
+
const constraints = Array.isArray(mandatory.constraints) ? [...mandatory.constraints] : [];
|
|
290
|
+
const verificationPlan = typeof mandatory.verificationPlan === 'string' ? mandatory.verificationPlan : '';
|
|
291
|
+
|
|
292
|
+
// Build mandatory section payload
|
|
293
|
+
let mandatoryMd = `## ContextPack: [${taskClass.toUpperCase()}] ${taskId}\n`;
|
|
294
|
+
if (objective) {
|
|
295
|
+
mandatoryMd += `**Objective:** ${objective}\n\n`;
|
|
296
|
+
}
|
|
297
|
+
if (acceptanceCriteria.length > 0) {
|
|
298
|
+
mandatoryMd += `### Acceptance Criteria\n`;
|
|
299
|
+
for (const ac of acceptanceCriteria) {
|
|
300
|
+
mandatoryMd += `- [ ] ${ac}\n`;
|
|
301
|
+
}
|
|
302
|
+
mandatoryMd += '\n';
|
|
303
|
+
}
|
|
304
|
+
if (constraints.length > 0) {
|
|
305
|
+
mandatoryMd += `### Constraints\n`;
|
|
306
|
+
for (const c of constraints) {
|
|
307
|
+
mandatoryMd += `- ! ${c}\n`;
|
|
308
|
+
}
|
|
309
|
+
mandatoryMd += '\n';
|
|
310
|
+
}
|
|
311
|
+
if (verificationPlan) {
|
|
312
|
+
mandatoryMd += `### Verification Plan\n${verificationPlan}\n\n`;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
const mandatoryBytes = Buffer.byteLength(mandatoryMd, 'utf8');
|
|
316
|
+
|
|
317
|
+
// Rule 1: Mandatory content is never truncated; if mandatoryBytes > budgetBytes, returns overflow: true.
|
|
318
|
+
if (mandatoryBytes > budgetBytes) {
|
|
319
|
+
const omissions = [];
|
|
320
|
+
const narrativeList = Array.isArray(optional.narrative) ? optional.narrative : [];
|
|
321
|
+
const claimsList = Array.isArray(optional.unverifiedClaims) ? optional.unverifiedClaims : [];
|
|
322
|
+
const hypList = Array.isArray(optional.hypotheses) ? optional.hypotheses : [];
|
|
323
|
+
|
|
324
|
+
for (let i = 0; i < narrativeList.length; i++) omissions.push({ id: `narrative-${i + 1}`, reason: 'budget-cap-exceeded' });
|
|
325
|
+
for (let i = 0; i < claimsList.length; i++) omissions.push({ id: `claim-${i + 1}`, reason: 'budget-cap-exceeded' });
|
|
326
|
+
for (let i = 0; i < hypList.length; i++) omissions.push({ id: `hypothesis-${i + 1}`, reason: 'budget-cap-exceeded' });
|
|
327
|
+
|
|
328
|
+
return {
|
|
329
|
+
taskId,
|
|
330
|
+
taskClass,
|
|
331
|
+
totalBytes: mandatoryBytes,
|
|
332
|
+
budgetBytes,
|
|
333
|
+
overflow: true,
|
|
334
|
+
mandatoryBytes,
|
|
335
|
+
optionalBytes: 0,
|
|
336
|
+
omissions,
|
|
337
|
+
payload: mandatoryMd,
|
|
338
|
+
error: `Mandatory context (${mandatoryBytes} B) exceeds budget (${budgetBytes} B)`,
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// Rule 2: Optional content is trimmed in reverse priority order when mandatoryBytes + optionalBytes > budgetBytes.
|
|
343
|
+
// Priority order: 1. hypotheses, 2. unverifiedClaims, 3. narrative.
|
|
344
|
+
// Trimming in reverse priority: narrative first, then claims, then hypotheses.
|
|
345
|
+
const hypotheses = Array.isArray(optional.hypotheses) ? [...optional.hypotheses] : [];
|
|
346
|
+
const unverifiedClaims = Array.isArray(optional.unverifiedClaims) ? [...optional.unverifiedClaims] : [];
|
|
347
|
+
const narrative = Array.isArray(optional.narrative) ? [...optional.narrative] : [];
|
|
348
|
+
|
|
349
|
+
const keptHypotheses = [];
|
|
350
|
+
const keptClaims = [];
|
|
351
|
+
const keptNarrative = [];
|
|
352
|
+
const omissions = [];
|
|
353
|
+
|
|
354
|
+
const buildPayload = (hList: any, cList: any, nList: any) => {
|
|
355
|
+
let md = mandatoryMd;
|
|
356
|
+
if (hList.length > 0) {
|
|
357
|
+
md += `### Active Hypotheses (Unverified)\n`;
|
|
358
|
+
for (const h of hList) md += `- ? ${h}\n`;
|
|
359
|
+
md += '\n';
|
|
360
|
+
}
|
|
361
|
+
if (cList.length > 0) {
|
|
362
|
+
md += `### Unverified Claims\n`;
|
|
363
|
+
for (const c of cList) md += `- ? ${c}\n`;
|
|
364
|
+
md += '\n';
|
|
365
|
+
}
|
|
366
|
+
if (nList.length > 0) {
|
|
367
|
+
md += `### Background Narrative\n`;
|
|
368
|
+
for (const n of nList) md += `- ${n}\n`;
|
|
369
|
+
md += '\n';
|
|
370
|
+
}
|
|
371
|
+
return md;
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
// Forward trial fitting: hypotheses first
|
|
375
|
+
for (let i = 0; i < hypotheses.length; i++) {
|
|
376
|
+
const trial = [...keptHypotheses, hypotheses[i]];
|
|
377
|
+
const trialMd = buildPayload(trial, [], []);
|
|
378
|
+
if (Buffer.byteLength(trialMd, 'utf8') <= budgetBytes) {
|
|
379
|
+
keptHypotheses.push(hypotheses[i]);
|
|
380
|
+
} else {
|
|
381
|
+
omissions.push({ id: `hypothesis-${i + 1}`, reason: 'budget-cap-exceeded' });
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// unverifiedClaims next
|
|
386
|
+
for (let i = 0; i < unverifiedClaims.length; i++) {
|
|
387
|
+
const trial = [...keptClaims, unverifiedClaims[i]];
|
|
388
|
+
const trialMd = buildPayload(keptHypotheses, trial, []);
|
|
389
|
+
if (Buffer.byteLength(trialMd, 'utf8') <= budgetBytes) {
|
|
390
|
+
keptClaims.push(unverifiedClaims[i]);
|
|
391
|
+
} else {
|
|
392
|
+
omissions.push({ id: `claim-${i + 1}`, reason: 'budget-cap-exceeded' });
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// narrative next
|
|
397
|
+
for (let i = 0; i < narrative.length; i++) {
|
|
398
|
+
const trial = [...keptNarrative, narrative[i]];
|
|
399
|
+
const trialMd = buildPayload(keptHypotheses, keptClaims, trial);
|
|
400
|
+
if (Buffer.byteLength(trialMd, 'utf8') <= budgetBytes) {
|
|
401
|
+
keptNarrative.push(narrative[i]);
|
|
402
|
+
} else {
|
|
403
|
+
omissions.push({ id: `narrative-${i + 1}`, reason: 'budget-cap-exceeded' });
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
const payload = buildPayload(keptHypotheses, keptClaims, keptNarrative);
|
|
408
|
+
const totalBytes = Buffer.byteLength(payload, 'utf8');
|
|
409
|
+
const optionalBytes = totalBytes - mandatoryBytes;
|
|
410
|
+
|
|
411
|
+
return {
|
|
412
|
+
taskId,
|
|
413
|
+
taskClass,
|
|
414
|
+
totalBytes,
|
|
415
|
+
budgetBytes,
|
|
416
|
+
overflow: false,
|
|
417
|
+
mandatoryBytes,
|
|
418
|
+
optionalBytes,
|
|
419
|
+
omissions,
|
|
420
|
+
payload,
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* Alias for compileBoundedContextPack.
|
|
426
|
+
*/
|
|
427
|
+
compileBoundedPayload(options: any = {}) {
|
|
428
|
+
return this.compileBoundedContextPack(options);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/**
|
|
433
|
+
* Handles `doflow context-pack` — compile the evidence and claims recorded for a task into the
|
|
434
|
+
* context block a stage is handed.
|
|
435
|
+
*
|
|
436
|
+
* Exits 1 on a pack with nothing in it. An empty pack is not evidence that a task needs no
|
|
437
|
+
* context; it is evidence that nothing was recorded, and reporting it as success is the
|
|
438
|
+
* empty-contract defect in another costume.
|
|
439
|
+
*
|
|
440
|
+
* @param {Object} options
|
|
441
|
+
* @param {string} options.taskId
|
|
442
|
+
* @param {string} [options.taskClass]
|
|
443
|
+
* @param {string} [options.objective]
|
|
444
|
+
* @param {boolean} [options.json=false]
|
|
445
|
+
* @param {string} [options.stateRoot]
|
|
446
|
+
* @param {string} [options.slug] feature slug, when the task id is not the feature's own
|
|
447
|
+
* @returns {number} exit code
|
|
448
|
+
*/
|
|
449
|
+
function handleContextPackCommand({ taskId, taskClass, objective, json = false, stateRoot, slug }: any = {}) {
|
|
450
|
+
const root = stateRoot || process.cwd();
|
|
451
|
+
const ledger = new EvidenceLedger({ repoRoot: root, slug });
|
|
452
|
+
ledger.load(taskId);
|
|
453
|
+
const claims = new ClaimsManager({ evidenceLedger: ledger, repoRoot: root, slug });
|
|
454
|
+
claims.load(taskId);
|
|
455
|
+
claims.evaluateAll();
|
|
456
|
+
const researchRequests = new ResearchRequestStore({ projectRoot: root, slug }).list(taskId);
|
|
457
|
+
|
|
458
|
+
const compiler = new ContextPackCompiler();
|
|
459
|
+
const pack = compiler.compileContextPack({
|
|
460
|
+
taskId,
|
|
461
|
+
// The library's own default. Passed through rather than substituted here so there is one
|
|
462
|
+
// place that decides what an unstated class means for a *label* — which is all it is in a
|
|
463
|
+
// pack, unlike readiness where it selects the contract.
|
|
464
|
+
...(taskClass ? { taskClass } : {}),
|
|
465
|
+
objective: objective || '',
|
|
466
|
+
evidenceLedger: ledger,
|
|
467
|
+
claimsManager: claims,
|
|
468
|
+
researchRequests,
|
|
469
|
+
decisions: loadLiveDecisions({ projectRoot: root, slug: slug || null }),
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
const empty = pack.evidenceCount === 0
|
|
473
|
+
&& pack.claims.supported.length === 0
|
|
474
|
+
&& pack.claims.hypotheses.length === 0
|
|
475
|
+
&& pack.claims.conflicts.length === 0
|
|
476
|
+
&& pack.researchRequests.length === 0
|
|
477
|
+
&& pack.decisions.liveCount === 0;
|
|
478
|
+
|
|
479
|
+
if (json) console.log(JSON.stringify({ ...pack, empty }, null, 2));
|
|
480
|
+
else {
|
|
481
|
+
console.log(compiler.formatMarkdown(pack));
|
|
482
|
+
if (empty) console.log(`_No evidence or claims are recorded for task '${taskId}'; this pack states nothing._\n`);
|
|
483
|
+
}
|
|
484
|
+
return finishRuntime(empty ? 1 : 0);
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
module.exports = {
|
|
488
|
+
ContextPackCompiler,
|
|
489
|
+
TASK_CLASS_BUDGETS,
|
|
490
|
+
handleContextPackCommand,
|
|
491
|
+
loadLiveDecisions,
|
|
492
|
+
};
|