@khoavu882/doflow 0.0.0-stage → 2.0.0-beta.4
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 +1061 -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 +48 -4
- package/src/adapters/antigravity/index.js +631 -0
- package/src/adapters/claude/index.js +548 -0
- package/src/adapters/claude/mcp.js +94 -0
- package/src/adapters/codex/agents.js +208 -0
- package/src/adapters/codex/config.js +272 -0
- package/src/adapters/codex/hooks.js +203 -0
- package/src/adapters/codex/index.js +707 -0
- package/src/adapters/codex/mcp.js +271 -0
- package/src/adapters/codex/native-projection.js +34 -0
- package/src/adapters/copilot/index.js +413 -0
- package/src/adapters/copy-tree.js +620 -0
- package/src/adapters/gemini/hooks.js +210 -0
- package/src/adapters/gemini/index.js +390 -0
- package/src/adapters/hook-commands.js +60 -0
- package/src/adapters/index.js +106 -0
- package/src/adapters/kiro/index.js +310 -0
- package/src/adapters/mcp-entries.js +331 -0
- package/src/adapters/opencode/index.js +466 -0
- package/src/adapters/pi/index.js +279 -0
- package/src/adapters/pi/json-members.js +185 -0
- package/src/adapters/pi/mcp.js +373 -0
- package/src/adapters/resolve-source.js +19 -0
- package/src/cli/commands/install.js +218 -0
- package/src/cli/commands/list-backups.js +21 -0
- package/src/cli/commands/reconcile.js +120 -0
- package/src/cli/commands/remove.js +82 -0
- package/src/cli/commands/rollback.js +172 -0
- package/src/cli/commands/self-update.js +33 -0
- package/src/cli/commands/status.js +138 -0
- package/src/cli/commands/tools.js +92 -0
- package/src/cli/commands/update.js +162 -0
- package/src/cli/index.js +568 -0
- package/src/cli/runtime-commands.js +281 -0
- package/src/cli/shared.js +218 -0
- package/src/helper/bash-helper.js +34 -0
- package/src/helper/git.js +24 -0
- package/src/helper/guardrails.js +49 -0
- package/src/helper/harness-paths.js +140 -0
- package/src/helper/marker-merge.js +116 -0
- package/src/helper/prompt.js +61 -0
- package/src/helper/repo-root.js +29 -0
- package/src/helper/settings-merge.js +151 -0
- package/src/helper/settings-scope.js +33 -0
- package/src/helper/toml.js +244 -0
- package/src/install/backup-set.js +149 -0
- package/src/install/backup.js +724 -0
- package/src/install/context.js +58 -0
- package/src/install/manifest.js +145 -0
- package/src/install/mcp.js +254 -0
- package/src/install/paths.js +84 -0
- package/src/install/targets.js +90 -0
- package/src/install/tool-lifecycle.js +151 -0
- package/src/lifecycle/bash-availability.js +25 -0
- package/src/lifecycle/index.js +812 -0
- package/src/lifecycle/mcp-index.js +28 -0
- package/src/lifecycle/policies.js +73 -0
- package/src/lifecycle/view.js +175 -0
- package/src/registry/index.js +611 -0
- package/src/release/build-package.js +91 -0
- package/src/release/changelog-section.js +70 -0
- package/src/release/sync-plugin-versions.js +66 -0
- package/src/runtime/advice/cli.js +283 -0
- package/src/runtime/advice/client.js +324 -0
- package/src/runtime/advice/config.js +189 -0
- package/src/runtime/advice/doctor.js +169 -0
- package/src/runtime/advice/endpoint-guard.js +134 -0
- package/src/runtime/advice/kinds.js +154 -0
- package/src/runtime/advice/providers/ollama-systemone.js +209 -0
- package/src/runtime/advice/record.js +166 -0
- package/src/runtime/advice/registry.js +170 -0
- package/src/runtime/advice/strength.js +66 -0
- package/src/runtime/brief-tools.js +342 -0
- package/src/runtime/c4-project.js +371 -0
- package/src/runtime/capability-router.js +484 -0
- package/src/runtime/checkouts.js +170 -0
- package/src/runtime/claims.js +468 -0
- package/src/runtime/cli-result.js +55 -0
- package/src/runtime/cli.js +678 -0
- package/src/runtime/command-detect.js +516 -0
- package/src/runtime/context-pack.js +492 -0
- package/src/runtime/decision-register.js +493 -0
- package/src/runtime/evidence-ledger.js +338 -0
- package/src/runtime/failure/capture.js +272 -0
- package/src/runtime/failure/classifier.js +68 -0
- package/src/runtime/failure/cli.js +178 -0
- package/src/runtime/failure/home.js +64 -0
- package/src/runtime/failure/store.js +226 -0
- package/src/runtime/feature-resolve.js +79 -0
- package/src/runtime/freshness.js +177 -0
- package/src/runtime/health.js +863 -0
- package/src/runtime/history-compactor.js +237 -0
- package/src/runtime/implementation-gate.js +321 -0
- package/src/runtime/inventory/coverage.js +218 -0
- package/src/runtime/inventory/identity.js +65 -0
- package/src/runtime/inventory/index.js +705 -0
- package/src/runtime/inventory/precedence.js +134 -0
- package/src/runtime/inventory/read-scopes.js +131 -0
- package/src/runtime/inventory/siblings.js +192 -0
- package/src/runtime/knowledge/chunker.js +124 -0
- package/src/runtime/knowledge/hybrid.js +149 -0
- package/src/runtime/knowledge/index-store.js +145 -0
- package/src/runtime/knowledge/retrieval.js +194 -0
- package/src/runtime/leak-scan.js +185 -0
- package/src/runtime/lifecycle/cli.js +276 -0
- package/src/runtime/lifecycle/event-store.js +340 -0
- package/src/runtime/lifecycle/fold.js +353 -0
- package/src/runtime/lifecycle/followup.js +432 -0
- package/src/runtime/lifecycle/goal.js +249 -0
- package/src/runtime/lifecycle/intent-writer.js +86 -0
- package/src/runtime/lifecycle/overview.js +292 -0
- package/src/runtime/lifecycle/release.js +241 -0
- package/src/runtime/lifecycle/report-store.js +221 -0
- package/src/runtime/lifecycle/retention.js +212 -0
- package/src/runtime/lifecycle/root.js +71 -0
- package/src/runtime/lifecycle/status.js +353 -0
- package/src/runtime/lifecycle/store-upkeep.js +393 -0
- package/src/runtime/locator-resolve.js +158 -0
- package/src/runtime/mask.js +210 -0
- package/src/runtime/mcp-consultations.js +412 -0
- package/src/runtime/mcp-reach.js +157 -0
- package/src/runtime/model-router.js +153 -0
- package/src/runtime/outcome.js +467 -0
- package/src/runtime/reach.js +148 -0
- package/src/runtime/readiness-record.js +150 -0
- package/src/runtime/readiness.js +435 -0
- package/src/runtime/recovery.js +282 -0
- package/src/runtime/research-request.js +231 -0
- package/src/runtime/retrieval-plan.js +578 -0
- package/src/runtime/scaffold/artifacts.js +217 -0
- package/src/runtime/scaffold/fingerprint.js +56 -0
- package/src/runtime/scaffold/generate.js +911 -0
- package/src/runtime/scaffold/languages.js +245 -0
- package/src/runtime/storage/cli.js +64 -0
- package/src/runtime/storage/engine.js +249 -0
- package/src/runtime/storage/registry.js +130 -0
- package/src/runtime/storage/roots.js +63 -0
- package/src/runtime/storage/rules.js +282 -0
- package/src/runtime/storage/upkeep.js +243 -0
- package/src/runtime/storage/work-status.js +326 -0
- package/src/runtime/task-attempts.js +415 -0
- package/src/runtime/task-classifier.js +550 -0
- package/src/runtime/task-scope.js +130 -0
- package/src/runtime/task-state.js +176 -0
- package/src/runtime/trace/indicators.js +235 -0
- package/src/runtime/trace/ledger.js +626 -0
- package/src/runtime/trace/render.js +76 -0
- package/src/runtime/trace/views.js +459 -0
- package/src/runtime/verification/contract-runner.js +341 -0
- package/src/runtime/verification/engine.js +1461 -0
- package/src/runtime/verification/registry.js +130 -0
- package/src/runtime/verification/scope-bound.js +418 -0
- package/src/runtime/verification/test-selection.js +172 -0
- package/src/runtime/workflow-engine.js +588 -0
- package/src/runtime/workflow-orchestrator.js +953 -0
- package/src/runtime/worktree.js +340 -0
- package/src/state/index.js +193 -0
- package/src/state/lockfile.js +136 -0
- package/src/state/run-lock.js +408 -0
- package/types/node-commonjs.d.ts +68 -0
- package/types/runtime.d.ts +91 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// TypeScript migration (agent-docs/BRIEF_GOAL_DOFLOW.md): run directly by Node native type-stripping.
|
|
4
|
+
|
|
5
|
+
// Per-install "this install has" index: the guidance layer's authoritative summary of exactly
|
|
6
|
+
// which MCP servers were selected for this install, so an agent never assumes availability of a
|
|
7
|
+
// server that isn't actually connected. Rendered fresh on every install/update from the resolved
|
|
8
|
+
// selection — never hand-edited, and never a partial/empty file (null means "omit entirely").
|
|
9
|
+
//
|
|
10
|
+
// Each server's doc is emitted as an `@`-import, not as a "read this on use" instruction. That
|
|
11
|
+
// instruction was prose describing a trigger, and nothing evaluates prose — the same shape this
|
|
12
|
+
// guidance layer removed from its behavioral modes. A mode had an alternative (bind it to the
|
|
13
|
+
// skill that reads it, at no context cost); a server doc has none, because there is no per-server
|
|
14
|
+
// skill to bind to. So the choice here is an import that actually loads or a sentence that hopes.
|
|
15
|
+
//
|
|
16
|
+
// Only SELECTED servers are imported, so the cost is proportional to what is installed: a
|
|
17
|
+
// one-server install pays for one doc, and an install with none produces no file at all.
|
|
18
|
+
function renderMcpIndex(selectedServers ) {
|
|
19
|
+
if (!selectedServers || selectedServers.length === 0) return null;
|
|
20
|
+
const lines = ['# MCP short flags — this install'];
|
|
21
|
+
for (const server of selectedServers) {
|
|
22
|
+
lines.push(`# ${server.shortFlag} — prefer the \`${server.id}\` MCP server`);
|
|
23
|
+
lines.push(`@${server.doc}`);
|
|
24
|
+
}
|
|
25
|
+
return `${lines.join('\n')}\n`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
module.exports = { renderMcpIndex };
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// TypeScript migration (agent-docs/BRIEF_GOAL_DOFLOW.md): run directly by Node native type-stripping.
|
|
4
|
+
|
|
5
|
+
// Registry lifecycle policies are logical intent. This projection reports what a
|
|
6
|
+
// harness may render and any human prerequisite; native event serialization stays
|
|
7
|
+
// in the owning harness adapter.
|
|
8
|
+
const { harnessFor } = require('../registry/index.js');
|
|
9
|
+
|
|
10
|
+
const POLICY_STATUSES = new Set(['supported', 'different', 'unavailable', 'prerequisite']);
|
|
11
|
+
|
|
12
|
+
function unique(values ) { return [...new Set(values.filter(Boolean))]; }
|
|
13
|
+
|
|
14
|
+
function policyFor(registry , id ) {
|
|
15
|
+
const policy = registry?.lifecycle?.find((item ) => item.id === id);
|
|
16
|
+
if (!policy) throw new Error(`Unknown lifecycle policy '${id}'`);
|
|
17
|
+
return policy;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function renderPolicy(policy , harness ) {
|
|
21
|
+
const mapping = policy?.mappings?.[harness.id];
|
|
22
|
+
if (!mapping) throw new Error(`Lifecycle policy '${policy.id}' has no mapping for '${harness.id}'`);
|
|
23
|
+
const requiredCapabilities = (policy.requires || []).map((capability ) => {
|
|
24
|
+
const declaration = harness.capabilities?.[capability];
|
|
25
|
+
if (!declaration) throw new Error(`Lifecycle policy '${policy.id}' requires unknown '${harness.id}' capability '${capability}'`);
|
|
26
|
+
return [capability, declaration];
|
|
27
|
+
});
|
|
28
|
+
const unavailableCapability = requiredCapabilities.find(([, declaration] ) => declaration.status === 'unavailable');
|
|
29
|
+
const prerequisites = unique([
|
|
30
|
+
...(mapping.prerequisites || []),
|
|
31
|
+
...requiredCapabilities.flatMap(([, declaration] ) => declaration.prerequisites || []),
|
|
32
|
+
]);
|
|
33
|
+
const capabilityStatus = unavailableCapability ? 'unavailable' : mapping.status;
|
|
34
|
+
const unavailable = capabilityStatus === 'unavailable';
|
|
35
|
+
const status = unavailable ? 'unavailable' : (prerequisites.length ? 'prerequisite' : capabilityStatus);
|
|
36
|
+
// POLICY_STATUSES was declared and exported while nothing consulted it, which left the one value
|
|
37
|
+
// here that does not originate in this function unchecked: `capabilityStatus` falls through from
|
|
38
|
+
// `mapping.status`, straight out of the registry. A registry typo therefore became a policy status
|
|
39
|
+
// no caller has a branch for, reported as though it were a real one. The two failures above already
|
|
40
|
+
// throw on invalid registry data — an absent mapping, an unknown capability — so this is the same
|
|
41
|
+
// check applied to the third field that comes from the same file.
|
|
42
|
+
if (!POLICY_STATUSES.has(status)) {
|
|
43
|
+
throw new Error(
|
|
44
|
+
`Lifecycle policy '${policy.id}' resolved status '${status}' for '${harness.id}', which is not `
|
|
45
|
+
+ `one of: ${[...POLICY_STATUSES].join(', ')}. Check 'status' in the registry entry.`,
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
return Object.freeze({
|
|
49
|
+
id: policy.id,
|
|
50
|
+
intent: policy.intent,
|
|
51
|
+
harness: harness.id,
|
|
52
|
+
status,
|
|
53
|
+
capabilityStatus,
|
|
54
|
+
event: unavailable ? null : mapping.event,
|
|
55
|
+
renderable: !unavailable,
|
|
56
|
+
prerequisites,
|
|
57
|
+
fallback: unavailable ? (mapping.fallback || 'guidance') : null,
|
|
58
|
+
reason: unavailableCapability ? `Required capability '${unavailableCapability[0]}' is unavailable` : null,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Render policy status data for one harness without calling an adapter or writing state. */
|
|
63
|
+
function renderPolicies(registry , { harness: harnessId, policyIds } = {}) {
|
|
64
|
+
if (!harnessId) throw new Error('A harness id is required to render lifecycle policies');
|
|
65
|
+
const harness = harnessFor(registry, harnessId);
|
|
66
|
+
const policies = policyIds === undefined || policyIds === null
|
|
67
|
+
? registry.lifecycle
|
|
68
|
+
: policyIds.map((id ) => policyFor(registry, id));
|
|
69
|
+
if (!Array.isArray(policies)) throw new Error('Lifecycle policies must be an array');
|
|
70
|
+
return Object.freeze(policies.map((policy ) => renderPolicy(policy, harness)));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
module.exports = { POLICY_STATUSES, policyFor, renderPolicy, renderPolicies };
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// TypeScript migration (agent-docs/BRIEF_GOAL_DOFLOW.md): run directly by Node native type-stripping.
|
|
4
|
+
// lifecycle-view.js — CLI-facing view over the registry/lifecycle path: computes a plan across
|
|
5
|
+
// every requested harness (claude/codex/gemini) from a loaded registry, a neutral ledger, and the
|
|
6
|
+
// Codex-native source locations under `repoRoot`, then renders/gates it for bin/doflow.js's
|
|
7
|
+
// install/update/remove/status commands.
|
|
8
|
+
const fs = require('node:fs');
|
|
9
|
+
const os = require('node:os');
|
|
10
|
+
const path = require('node:path');
|
|
11
|
+
const { parseToml } = require('../helper/toml.js');
|
|
12
|
+
const { createAdapterRegistry } = require('../adapters/index.js');
|
|
13
|
+
const { declaredHarnessPaths } = require('../helper/harness-paths.js');
|
|
14
|
+
const claudeAdapter = require('../adapters/claude/index.js');
|
|
15
|
+
const codexAdapter = require('../adapters/codex/index.js');
|
|
16
|
+
const { createGeminiAdapter } = require('../adapters/gemini/index.js');
|
|
17
|
+
const { createOpenCodeAdapter } = require('../adapters/opencode/index.js');
|
|
18
|
+
const { createPiAdapter } = require('../adapters/pi/index.js');
|
|
19
|
+
const { createCopilotAdapter } = require('../adapters/copilot/index.js');
|
|
20
|
+
const { createKiroAdapter } = require('../adapters/kiro/index.js');
|
|
21
|
+
const { createAntigravityAdapter } = require('../adapters/antigravity/index.js');
|
|
22
|
+
const { planLifecycle } = require('./index.js');
|
|
23
|
+
const { stateRoot, readLedger, defaultLedger } = require('../state/index.js');
|
|
24
|
+
const { selectAssets } = require('../registry/index.js');
|
|
25
|
+
const { defaultLock, readLock, writeLock, diffLocks, removeLock, pinnedSelections } = require('../state/lockfile.js');
|
|
26
|
+
// Tolerant because the projected runtime under `.doflow/runtime/` ships bin/, src/ and
|
|
27
|
+
// core/registry/ but no package.json — see the `runtime.*` assets in core/registry/assets.json.
|
|
28
|
+
// A hard require here would make every Node-backed verb fail in an install, which is the exact
|
|
29
|
+
// defect that projection exists to fix. Only version reporting depends on this.
|
|
30
|
+
function loadPkg() {
|
|
31
|
+
try { return require('../../package.json'); } catch { return { version: '0.0.0-installed', name: '@khoavu882/doflow' }; }
|
|
32
|
+
}
|
|
33
|
+
const pkg = loadPkg();
|
|
34
|
+
|
|
35
|
+
function codexScope(scope ) { return scope.global ? 'global' : 'project'; }
|
|
36
|
+
|
|
37
|
+
function codexConfigResources(repoRoot , fsImpl ) {
|
|
38
|
+
const configSrc = path.join(repoRoot, 'core', 'harnesses', 'codex', 'config', 'config.toml');
|
|
39
|
+
const parsed = parseToml(fsImpl.readFileSync(configSrc, 'utf8'));
|
|
40
|
+
return [...parsed.entries.entries()].map(([identity, entry]) => ({
|
|
41
|
+
target: 'codex', kind: 'configuration-entry', identity, value: entry.value,
|
|
42
|
+
sourceVersion: pkg.version, selection: true,
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Registry/lifecycle is introduced as a read-only companion to the legacy installer. It makes
|
|
47
|
+
* the capability and neutral-ledger view observable without changing the proven copy/backup
|
|
48
|
+
* mutation path until every native adapter has CLI-level parity.
|
|
49
|
+
* `registry` is loaded once per command (by the caller) and threaded through here rather than
|
|
50
|
+
* reloaded — the same registry also resolves every harness's MCP selection for that command. */
|
|
51
|
+
function registryLifecycleView({ registry, scope, targets, mcpSelections = {}, mcpAdoptable = {}, retainedMcpIds = [], operation, repoRoot, force = false, adopt = false, permissions = false, statusline = false, fsImpl = fs } ) {
|
|
52
|
+
const lifecycleScope = codexScope(scope);
|
|
53
|
+
const scopeRoot = scope.global ? os.homedir() : path.resolve(scope.projectRoot);
|
|
54
|
+
const neutralStateRoot = stateRoot({ scope: lifecycleScope, projectRoot: scopeRoot, homeDir: scopeRoot });
|
|
55
|
+
const ledger = readLedger(neutralStateRoot) ?? defaultLedger({ scope: lifecycleScope, scopeRoot });
|
|
56
|
+
// Mirrors buildAdapterRegistry() in src/cli/shared.js — including the declared-paths wiring —
|
|
57
|
+
// and is kept as a literal construction here because the registry guard pins every declared
|
|
58
|
+
// harness into each adapter-registry call site by parsing it.
|
|
59
|
+
const declared = declaredHarnessPaths();
|
|
60
|
+
const adapters = createAdapterRegistry({ claude: claudeAdapter.createClaudeAdapter({ declaredPaths: declared.claude }),
|
|
61
|
+
codex: codexAdapter.createCodexAdapter({ declaredPaths: declared.codex }), gemini: createGeminiAdapter({ declaredPaths: declared.gemini }),
|
|
62
|
+
opencode: createOpenCodeAdapter({ declaredPaths: declared.opencode }), pi: createPiAdapter({ declaredPaths: declared.pi }),
|
|
63
|
+
copilot: createCopilotAdapter({ declaredPaths: declared.copilot }), kiro: createKiroAdapter({ declaredPaths: declared.kiro }),
|
|
64
|
+
antigravity: createAntigravityAdapter({ declaredPaths: declared.antigravity }) });
|
|
65
|
+
const plan = planLifecycle({ registry, adapters, scope: lifecycleScope, scopeRoot, targets, mcpSelections, mcpAdoptable, retainedMcpIds, ledger, context: {
|
|
66
|
+
repoRoot, projectRoot: scopeRoot, homeDir: os.homedir(), sourceVersion: pkg.version,
|
|
67
|
+
codexConfigResources: codexConfigResources(repoRoot, fsImpl),
|
|
68
|
+
codexAgentsSourceDir: path.join(repoRoot, 'core', 'harnesses', 'codex', 'agents'),
|
|
69
|
+
codexHooksSourceFile: path.join(repoRoot, 'core', 'harnesses', 'codex', 'hooks', 'hooks.json'),
|
|
70
|
+
codexHooksSourceDir: path.join(repoRoot, 'core', 'harnesses', 'codex', 'hooks'),
|
|
71
|
+
geminiHooksSourceFile: path.join(repoRoot, 'core', 'harnesses', 'gemini', 'hooks', 'hooks.json'),
|
|
72
|
+
geminiHooksSourceDir: path.join(repoRoot, 'core', 'harnesses', 'gemini', 'hooks'),
|
|
73
|
+
operation,
|
|
74
|
+
force,
|
|
75
|
+
adopt,
|
|
76
|
+
permissions,
|
|
77
|
+
statusline,
|
|
78
|
+
} });
|
|
79
|
+
return { registry, stateRoot: neutralStateRoot, ledger, plan, adapters };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function printRegistryLifecycle(view , prefix = '[PLAN]') {
|
|
83
|
+
console.log(`${prefix} Registry lifecycle: ${view.plan.changes.length} native change(s), ${view.plan.conflicts.length} conflict(s), ${view.plan.prerequisites.length} prerequisite(s)`);
|
|
84
|
+
for (const target of view.plan.targets) {
|
|
85
|
+
console.log(`${prefix} ${target.harness}: ${target.changes.length} change(s)${target.conflicts.length ? `; conflicts: ${target.conflicts.join('; ')}` : ''}`);
|
|
86
|
+
const hookChange = target.changes.find((change ) => change.nativeComponent === 'hooks');
|
|
87
|
+
if (hookChange?.nativePlan?.trust?.required) {
|
|
88
|
+
console.log(`${prefix} ${target.harness} hooks trust: ${hookChange.nativePlan.trust.status} (review required in ${target.harness})`);
|
|
89
|
+
}
|
|
90
|
+
for (const notice of target.notices ?? []) console.log(`${prefix} ${target.harness}: ${notice}`);
|
|
91
|
+
}
|
|
92
|
+
console.log(`${prefix} Neutral state: ${view.stateRoot}${readLedger(view.stateRoot) ? ' (existing ledger)' : ' (not yet created)'}`);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Prints the plan's notices after a real run. Independent of whether anything changed: a no-op
|
|
96
|
+
* reinstall of a harness that has a gap must still say so. */
|
|
97
|
+
function printPlanNotices(view ) {
|
|
98
|
+
for (const { harness, notice } of view.plan.notices) console.log(`[INFO] ${harness}: ${notice}`);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Harnesses whose native resources are reconciled through the registry/lifecycle path (all of
|
|
102
|
+
* them, as of this wiring). Kept as an explicit list — rather than reusing VALID from
|
|
103
|
+
* src/targets.js — so a future non-lifecycle target doesn't silently gain lifecycle behavior. */
|
|
104
|
+
const LIFECYCLE_HARNESSES = ['claude', 'codex', 'gemini', 'opencode', 'pi', 'copilot', 'kiro', 'antigravity'];
|
|
105
|
+
|
|
106
|
+
function assertSafeRegistryPlan(view ) {
|
|
107
|
+
if (view.plan.safe) return;
|
|
108
|
+
for (const conflict of view.plan.conflicts) console.error(`[ERROR] ${conflict.harness} lifecycle refused: ${conflict.reason}`);
|
|
109
|
+
for (const prerequisite of view.plan.prerequisites) console.error(`[ERROR] ${prerequisite.harness} lifecycle prerequisite: ${prerequisite.prerequisite}`);
|
|
110
|
+
process.exitCode = 1;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Build the doflow.lock document a completed run leaves. Pure — no I/O — so tests can pin exactly
|
|
114
|
+
* what gets pinned without running an install.
|
|
115
|
+
*
|
|
116
|
+
* The lock accumulates: it pins every harness the previous lock pinned or this run planned, as long
|
|
117
|
+
* as the ledger (as the run left it) still holds a resource of that harness, so a narrower later run
|
|
118
|
+
* never drops another harness's pin and a harness whose last resource is gone leaves it. MCP
|
|
119
|
+
* selections carry over for pinned harnesses and are replaced by the rows this run resolved, `[]`
|
|
120
|
+
* included. Assets are recomputed from the registry for every pinned harness. `null` when no harness
|
|
121
|
+
* stays pinned. */
|
|
122
|
+
function lockDocument({ registry, scope, scopeRoot, previous = null, ledger, plannedTargets = [], mcpSelections = {}, sourceVersion = pkg.version, now = new Date() } ) {
|
|
123
|
+
const held = new Set((ledger?.resources ?? []).map((resource ) => resource?.harness));
|
|
124
|
+
const pinned = [...new Set([...(previous?.targets ?? []).map((entry ) => entry.harness), ...plannedTargets])]
|
|
125
|
+
.filter((harness) => held.has(harness)).sort();
|
|
126
|
+
if (!pinned.length) return null;
|
|
127
|
+
const assets = [];
|
|
128
|
+
for (const harness of pinned) {
|
|
129
|
+
for (const asset of selectAssets(registry, { harness })) {
|
|
130
|
+
const nativeDir = asset.nativeDir?.[harness];
|
|
131
|
+
assets.push({ id: asset.id, kind: asset.kind, ...(nativeDir ? { nativeDir } : {}) });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const rows = { ...pinnedSelections(previous), ...mcpSelections };
|
|
135
|
+
return {
|
|
136
|
+
...defaultLock({ scope, scopeRoot }),
|
|
137
|
+
generatedAt: now.toISOString(),
|
|
138
|
+
sourceVersion,
|
|
139
|
+
targets: pinned.map((harness) => ({ harness })),
|
|
140
|
+
assets,
|
|
141
|
+
mcpSelections: Object.fromEntries(pinned.filter((harness) => Array.isArray(rows[harness])).map((harness) => [harness, rows[harness]])),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** Describe the reviewable delta between the pinned lock and the next one: "created" for a first
|
|
146
|
+
* pin, "unchanged" when nothing pinned differs, "cleared" when nothing remains pinned, else a count
|
|
147
|
+
* of the changed rows. */
|
|
148
|
+
function lockDelta(previous , next ) {
|
|
149
|
+
if (!next) return previous ? { changed: true, summary: 'cleared' } : { changed: false, summary: 'unchanged' };
|
|
150
|
+
if (!previous) return { changed: true, summary: 'created' };
|
|
151
|
+
const diff = diffLocks(previous, next);
|
|
152
|
+
if (diff.clean) return { changed: false, summary: 'unchanged' };
|
|
153
|
+
const count = ['targets', 'assets']
|
|
154
|
+
.flatMap((section) => Object.values (diff[section]).map((list ) => list.length))
|
|
155
|
+
.reduce((sum, n) => sum + n, 0)
|
|
156
|
+
+ diff.mcpSelections.changed.length + (diff.meta.sourceVersion ? 1 : 0);
|
|
157
|
+
return { changed: true, summary: `${count} change(s)` };
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/** Persist the lock for a completed command and return its delta against what was pinned before.
|
|
161
|
+
* An unchanged lock is left byte for byte, so routine re-runs neither rewrite the file nor
|
|
162
|
+
* manufacture noise; a `null` lock removes the file. */
|
|
163
|
+
function recordLock(scopeArgs , next , { fsImpl = fs } = {}) {
|
|
164
|
+
const delta = lockDelta(readLock(scopeArgs, { fsImpl }), next);
|
|
165
|
+
if (delta.changed) {
|
|
166
|
+
if (next) writeLock(scopeArgs, next, { fsImpl });
|
|
167
|
+
else removeLock(scopeArgs, { fsImpl });
|
|
168
|
+
}
|
|
169
|
+
return delta;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
module.exports = {
|
|
173
|
+
codexScope, registryLifecycleView, printRegistryLifecycle, printPlanNotices, LIFECYCLE_HARNESSES, assertSafeRegistryPlan,
|
|
174
|
+
lockDocument, lockDelta, recordLock,
|
|
175
|
+
};
|