@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,271 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// TypeScript migration (agent-docs/BRIEF_GOAL_DOFLOW.md): run directly by Node native type-stripping.
|
|
4
|
+
|
|
5
|
+
// Codex MCP reconciliation. Unlike Claude's JSON registry, Codex discovers MCP servers from
|
|
6
|
+
// config.toml. This adapter manages only table names that it created and recorded in the
|
|
7
|
+
// manifest ledger; every other MCP table remains user-owned and byte-for-byte untouched.
|
|
8
|
+
const fs = require('node:fs');
|
|
9
|
+
const path = require('node:path');
|
|
10
|
+
const {
|
|
11
|
+
configPath,
|
|
12
|
+
fingerprint,
|
|
13
|
+
parseToml,
|
|
14
|
+
newViolation,
|
|
15
|
+
atomicWrite,
|
|
16
|
+
} = require('./config.ts');
|
|
17
|
+
const { selectMcpServers, nativeMcpCatalog } = require('../../registry/index.ts');
|
|
18
|
+
const { NOTICES } = require('../mcp-entries.ts');
|
|
19
|
+
const { stripComment } = require('../../helper/toml.ts');
|
|
20
|
+
|
|
21
|
+
const MCP_KIND = 'mcp-server';
|
|
22
|
+
const MCP_PREFIX = 'mcp_servers.';
|
|
23
|
+
|
|
24
|
+
/** @param {object} registry a loaded registry (src/registry#loadRegistry) */
|
|
25
|
+
function readCodexMcpCatalog(registry: any) {
|
|
26
|
+
return nativeMcpCatalog(selectMcpServers(registry));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function isSafeServerName(name: any) {
|
|
30
|
+
return /^[A-Za-z0-9_-]+$/.test(name);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function tomlValue(value: any): string {
|
|
34
|
+
if (typeof value === 'string') return JSON.stringify(value);
|
|
35
|
+
if (typeof value === 'boolean' || typeof value === 'number') return String(value);
|
|
36
|
+
if (Array.isArray(value)) return `[${value.map(tomlValue).join(', ')}]`;
|
|
37
|
+
if (value && typeof value === 'object') {
|
|
38
|
+
return `{ ${Object.entries(value).map(([key, item]) => `${JSON.stringify(key)} = ${tomlValue(item)}`).join(', ')} }`;
|
|
39
|
+
}
|
|
40
|
+
throw new Error('Codex MCP definitions may only contain TOML-compatible values');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function renderServer(name: any, definition: any) {
|
|
44
|
+
if (!isSafeServerName(name)) throw new Error(`Unsupported Codex MCP server name '${name}'`);
|
|
45
|
+
if (!definition || typeof definition !== 'object' || Array.isArray(definition)) {
|
|
46
|
+
throw new Error(`Codex MCP server '${name}' requires an object definition`);
|
|
47
|
+
}
|
|
48
|
+
if (!definition.command && !definition.url) {
|
|
49
|
+
throw new Error(`Codex MCP server '${name}' requires either command or url`);
|
|
50
|
+
}
|
|
51
|
+
const lines = [`[mcp_servers.${name}]`];
|
|
52
|
+
for (const [key, value] of Object.entries(definition)) {
|
|
53
|
+
if (!/^[A-Za-z0-9_-]+$/.test(key)) throw new Error(`Unsupported Codex MCP key '${key}'`);
|
|
54
|
+
lines.push(`${key} = ${tomlValue(value)}`);
|
|
55
|
+
}
|
|
56
|
+
return `${lines.join('\n')}\n`;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function resourceFor({ name, scope, definition, sourceVersion, recoveryPoint }: any) {
|
|
60
|
+
return {
|
|
61
|
+
target: 'codex', scope, kind: MCP_KIND, identity: name,
|
|
62
|
+
sourceVersion, selection: true, recoveryPoint,
|
|
63
|
+
fingerprint: fingerprint(renderServer(name, definition)),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function isOwnedRecord(resource: any, scope: any) {
|
|
68
|
+
return resource && resource.target === 'codex' && resource.scope === scope &&
|
|
69
|
+
resource.kind === MCP_KIND && typeof resource.identity === 'string';
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function tableRanges(text: any) {
|
|
73
|
+
const lines = text.split(/\r?\n/);
|
|
74
|
+
const tables = [];
|
|
75
|
+
for (let index = 0; index < lines.length; index++) {
|
|
76
|
+
const match = lines[index].match(/^\s*\[mcp_servers\.([A-Za-z0-9_-]+)\]\s*(?:#.*)?$/);
|
|
77
|
+
if (!match) continue;
|
|
78
|
+
const name = match[1];
|
|
79
|
+
let end = lines.length;
|
|
80
|
+
for (let following = index + 1; following < lines.length; following++) {
|
|
81
|
+
const header = lines[following].match(/^\s*\[([^\]]+)\]\s*(?:#.*)?$/);
|
|
82
|
+
if (header && header[1] !== `mcp_servers.${name}` && !header[1].startsWith(`mcp_servers.${name}.`)) {
|
|
83
|
+
end = following;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// A comment written after the table's last line, and whatever follows it up to the next table,
|
|
88
|
+
// is the user's and belongs to no table. Blank lines straight after the table stay in its range,
|
|
89
|
+
// so a removal still takes the separator DoFlow wrote with it.
|
|
90
|
+
let content = end;
|
|
91
|
+
while (content > index + 1 && stripComment(lines[content - 1]).trim() === '') content--;
|
|
92
|
+
let stop = content;
|
|
93
|
+
while (stop < end && lines[stop].trim() === '') stop++;
|
|
94
|
+
tables.push({ name, start: index, end: stop });
|
|
95
|
+
}
|
|
96
|
+
return { lines, tables };
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function fullServerRange(tables: any, name: any) {
|
|
100
|
+
return tables.find((table: any) => table.name === name) ?? null;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** One table's text as its fingerprint is taken. */
|
|
104
|
+
function tableText(lines: any, range: any) {
|
|
105
|
+
return `${lines.slice(range.start, range.end).join('\n').replace(/\n*$/, '\n')}`;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Whether config.toml defines server `name` in any form: a bare `[mcp_servers.<name>]` header, a
|
|
109
|
+
* quoted header, a sub-table, or dotted keys and inline tables under `mcp_servers`. */
|
|
110
|
+
function definedInFile(name: any, { tables, parsed }: any) {
|
|
111
|
+
const own = (key: any) => key === `${MCP_PREFIX}${name}` || key.startsWith(`${MCP_PREFIX}${name}.`);
|
|
112
|
+
return tables.some((table: any) => table.name === name) || parsed.headers.some((header: any) => own(header.table))
|
|
113
|
+
|| [...parsed.entries.keys()].some(own);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** The text of server `name`'s bare table, as its fingerprint is taken, or null when it has none. */
|
|
117
|
+
function serverTableText(text: any, name: any) {
|
|
118
|
+
const { lines, tables } = tableRanges(text);
|
|
119
|
+
const range = fullServerRange(tables, name);
|
|
120
|
+
return range ? tableText(lines, range) : null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** The names among `names` that config.toml defines with no owned record: the user's own servers,
|
|
124
|
+
* which DoFlow never writes, removes or records. A file that cannot be read or parsed yields none. */
|
|
125
|
+
function userDefinedCodexMcpIds({ file, scope, names = [], managedResources = [], fsImpl = fs }: any) {
|
|
126
|
+
let text; let parsed;
|
|
127
|
+
try {
|
|
128
|
+
text = fsImpl.existsSync(file) ? fsImpl.readFileSync(file, 'utf8') : '';
|
|
129
|
+
parsed = parseToml(text);
|
|
130
|
+
} catch { return []; }
|
|
131
|
+
const { tables } = tableRanges(text);
|
|
132
|
+
const owned = new Set(managedResources.filter((resource: any) => isOwnedRecord(resource, scope)).map((resource: any) => resource.identity));
|
|
133
|
+
return [...new Set(names)].filter((name) => !owned.has(name) && definedInFile(name, { tables, parsed }));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** The tables DoFlow owns in config.toml now: owned records whose table is present with the
|
|
137
|
+
* fingerprint the record holds. A file that cannot be read or parsed yields none. */
|
|
138
|
+
function ownedCodexMcpIds({ file, scope, managedResources = [], fsImpl = fs }: any) {
|
|
139
|
+
let text;
|
|
140
|
+
try {
|
|
141
|
+
text = fsImpl.existsSync(file) ? fsImpl.readFileSync(file, 'utf8') : '';
|
|
142
|
+
parseToml(text);
|
|
143
|
+
} catch { return []; }
|
|
144
|
+
const { lines, tables } = tableRanges(text);
|
|
145
|
+
return managedResources.filter((resource: any) => isOwnedRecord(resource, scope)).filter((resource: any) => {
|
|
146
|
+
const range = fullServerRange(tables, resource.identity);
|
|
147
|
+
return range !== null && fingerprint(tableText(lines, range)) === resource.fingerprint;
|
|
148
|
+
}).map((resource: any) => resource.identity);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** How to stop managing a server whose table the user changed: the same run without it selected. */
|
|
152
|
+
function modifiedConflict(name: any, desired: any, scopeArg: any) {
|
|
153
|
+
const rest = desired.filter((item: any) => item !== name);
|
|
154
|
+
// Quoted for a POSIX shell when it holds anything a shell would split or expand, so the command
|
|
155
|
+
// works as copied for a project root with a space in it.
|
|
156
|
+
const arg = /^[A-Za-z0-9_@%+=:,./-]+$/.test(scopeArg) ? scopeArg : `'${scopeArg.replace(/'/g, "'\\''")}'`;
|
|
157
|
+
return `MCP server '${name}' was modified outside DoFlow. If this table is yours, run: doflow update ${arg} -t codex --mcp ${rest.length ? rest.join(',') : 'none'}; DoFlow then stops managing it and keeps the table.`;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* @param {Object} options
|
|
162
|
+
* @param {boolean} [options.removing=false] the run removes Codex: an owned server the user changed
|
|
163
|
+
* is then refused, as it always was, rather than released; the refusal names the update that
|
|
164
|
+
* releases it.
|
|
165
|
+
* @param {string} [options.scopeArg='-g'] the scope as the user types it (`-g` or the project root),
|
|
166
|
+
* for the command a conflict names.
|
|
167
|
+
*/
|
|
168
|
+
function planCodexMcp({ file, scope, managedResources = [], selected = [], allServers, serverDefs, sourceVersion, recoveryPoint, removing = false, scopeArg = '-g' }: any) {
|
|
169
|
+
const original = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '';
|
|
170
|
+
let parsed;
|
|
171
|
+
try { parsed = parseToml(original); } catch (error: any) {
|
|
172
|
+
return { ok: false, status: 'malformed', file, original, changes: [], conflicts: [error.message], managedResources };
|
|
173
|
+
}
|
|
174
|
+
if (!Array.isArray(allServers) || !serverDefs || typeof serverDefs !== 'object') {
|
|
175
|
+
return { ok: false, status: 'invalid-request', file, original, changes: [], conflicts: ['Codex MCP catalog is required'], managedResources };
|
|
176
|
+
}
|
|
177
|
+
const unknown = selected.filter((name: any) => !allServers.includes(name));
|
|
178
|
+
if (unknown.length) return { ok: false, status: 'invalid-request', file, original, changes: [], conflicts: [`Unknown MCP server(s): ${unknown.join(', ')}`], managedResources };
|
|
179
|
+
const desired: any[] = [...new Set<any>(selected)];
|
|
180
|
+
try { for (const name of desired) renderServer(name, serverDefs[name]); } catch (error: any) {
|
|
181
|
+
return { ok: false, status: 'invalid-request', file, original, changes: [], conflicts: [error.message], managedResources };
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const { lines, tables } = tableRanges(original);
|
|
185
|
+
const owned = new Map<string, any>(managedResources.filter((resource: any) => isOwnedRecord(resource, scope)).map((resource: any) => [resource.identity, resource]));
|
|
186
|
+
const changes: any[] = [];
|
|
187
|
+
const conflicts: string[] = [];
|
|
188
|
+
const notices: string[] = [];
|
|
189
|
+
const userDefined = allServers.filter((name) => !owned.has(name) && definedInFile(name, { tables, parsed }));
|
|
190
|
+
const names = new Set([...desired, ...owned.keys()]);
|
|
191
|
+
for (const name of names) {
|
|
192
|
+
const range = fullServerRange(tables, name);
|
|
193
|
+
const existing = range ? tableText(lines, range) : null;
|
|
194
|
+
const record = owned.get(name);
|
|
195
|
+
const wanted = desired.includes(name);
|
|
196
|
+
if (userDefined.includes(name)) {
|
|
197
|
+
// A server the user had already registered is not appropriated by an install. It remains
|
|
198
|
+
// usable when selected, and is never removed merely because a later selection omits it.
|
|
199
|
+
if (wanted) notices.push(NOTICES.collision(name, file));
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
// A definition in a form DoFlow never writes (quoted header, dotted keys) is a change too, so
|
|
203
|
+
// DoFlow never appends a second definition beside it.
|
|
204
|
+
if (record && definedInFile(name, { tables, parsed }) && (!range || record.fingerprint !== fingerprint(existing))) {
|
|
205
|
+
if (wanted || removing) conflicts.push(modifiedConflict(name, desired, scopeArg));
|
|
206
|
+
else {
|
|
207
|
+
changes.push({ type: 'remove', identity: name, release: true });
|
|
208
|
+
notices.push(NOTICES.released(name, file));
|
|
209
|
+
}
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
if (wanted) {
|
|
213
|
+
const content = renderServer(name, serverDefs[name]);
|
|
214
|
+
if (!range) changes.push({ type: 'create', identity: name, content });
|
|
215
|
+
else if (fingerprint(existing) !== fingerprint(content)) changes.push({ type: 'update', identity: name, content, range });
|
|
216
|
+
} else if (range) {
|
|
217
|
+
changes.push({ type: 'remove', identity: name, range });
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (conflicts.length) return { ok: false, status: 'conflict', file, original, changes: [], conflicts, managedResources };
|
|
221
|
+
|
|
222
|
+
const nextLines = [...lines];
|
|
223
|
+
// A release gives up the record only; the user's table stays byte for byte.
|
|
224
|
+
for (const change of changes.filter((item) => item.type !== 'create' && !item.release).sort((a, b) => b.range.start - a.range.start)) {
|
|
225
|
+
const replacement = change.type === 'update' ? change.content.trimEnd().split('\n') : [];
|
|
226
|
+
nextLines.splice(change.range.start, change.range.end - change.range.start, ...replacement);
|
|
227
|
+
}
|
|
228
|
+
for (const change of changes.filter((item) => item.type === 'create')) {
|
|
229
|
+
while (nextLines.length && nextLines.at(-1) === '') nextLines.pop();
|
|
230
|
+
if (nextLines.length) nextLines.push('');
|
|
231
|
+
nextLines.push(...change.content.trimEnd().split('\n'));
|
|
232
|
+
}
|
|
233
|
+
let content = nextLines.join('\n');
|
|
234
|
+
if (content && !content.endsWith('\n')) content += '\n';
|
|
235
|
+
const invalid = newViolation({ file, original, content, identities: changes.map((change) => change.identity) });
|
|
236
|
+
if (invalid) return { ok: false, status: 'conflict', file, original, changes: [], conflicts: [invalid], managedResources };
|
|
237
|
+
|
|
238
|
+
const nextManagedResources = managedResources.filter((resource: any) => !isOwnedRecord(resource, scope) || desired.includes(resource.identity));
|
|
239
|
+
for (const name of desired) {
|
|
240
|
+
if (userDefined.includes(name)) continue;
|
|
241
|
+
const next = resourceFor({ name, scope, definition: serverDefs[name], sourceVersion, recoveryPoint });
|
|
242
|
+
const index = nextManagedResources.findIndex((resource: any) => isOwnedRecord(resource, scope) && resource.identity === name);
|
|
243
|
+
if (index >= 0) nextManagedResources[index] = next;
|
|
244
|
+
else nextManagedResources.push(next);
|
|
245
|
+
}
|
|
246
|
+
return { ok: true, status: changes.length ? 'change' : 'unchanged', file, original, content, changes, conflicts: [], notices, userDefined, managedResources: nextManagedResources };
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function applyCodexMcp(plan: any, { dryRun = false, fsImpl = fs } = {}) {
|
|
250
|
+
if (!plan.ok || dryRun || plan.status === 'unchanged') return { ...plan, applied: false };
|
|
251
|
+
atomicWrite(plan.file, plan.content, fsImpl);
|
|
252
|
+
return { ...plan, applied: true };
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
function reconcileCodexMcp(options: any) {
|
|
256
|
+
const file = options.file ?? configPath(options);
|
|
257
|
+
return applyCodexMcp(planCodexMcp({ ...options, file }), options);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
module.exports = {
|
|
261
|
+
MCP_KIND,
|
|
262
|
+
readCodexMcpCatalog,
|
|
263
|
+
ownedCodexMcpIds,
|
|
264
|
+
userDefinedCodexMcpIds,
|
|
265
|
+
serverTableText,
|
|
266
|
+
renderServer,
|
|
267
|
+
resourceFor,
|
|
268
|
+
planCodexMcp,
|
|
269
|
+
applyCodexMcp,
|
|
270
|
+
reconcileCodexMcp,
|
|
271
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// TypeScript migration (agent-docs/BRIEF_GOAL_DOFLOW.md): run directly by Node native type-stripping.
|
|
4
|
+
|
|
5
|
+
// Codex's native-projection normalizer, moved here from the common adapter module (review A3:
|
|
6
|
+
// `nativeProjectionFor` in src/adapters/index.ts contained this Codex-specific shape inline, so
|
|
7
|
+
// per-harness knowledge lived on the shared side of the adapter boundary). The common module now
|
|
8
|
+
// only dispatches by adapter name; the shape below — configResources / mcp catalog / agents dir /
|
|
9
|
+
// hooks trust — is Codex's own and belongs to its adapter directory.
|
|
10
|
+
|
|
11
|
+
const { resolveRegistrySource } = require('../resolve-source.ts');
|
|
12
|
+
|
|
13
|
+
/** Normalize the validated Codex registry declaration into its adapter's named
|
|
14
|
+
* input. Source paths always come from the registry; runtime overrides only
|
|
15
|
+
* affect an explicitly safe trust acknowledgement. */
|
|
16
|
+
function normalizeNativeProjection(registry: any, harness: any, mcp: any[], context: any): any {
|
|
17
|
+
const declaration = harness.nativeProjection;
|
|
18
|
+
const override = context.projectionOverrides?.[harness.id] ?? {};
|
|
19
|
+
if (!override || typeof override !== 'object' || Array.isArray(override)) throw new Error(`Projection override for '${harness.id}' must be an object`);
|
|
20
|
+
const trusted = override.hooks?.trusted;
|
|
21
|
+
if (trusted !== undefined && typeof trusted !== 'boolean') throw new Error(`Projection override '${harness.id}.hooks.trusted' must be boolean`);
|
|
22
|
+
return Object.freeze({
|
|
23
|
+
configResources: Object.freeze((declaration.config?.resources || []).map((resource: any) => Object.freeze({ ...resource }))),
|
|
24
|
+
mcp: Object.freeze({ catalog: Object.freeze(mcp.map((server: any) => Object.freeze({ ...server }))), selected: Object.freeze(mcp.map((server: any) => server.id)) }),
|
|
25
|
+
agents: Object.freeze({ sourceDir: resolveRegistrySource(registry, declaration.agents?.source, `${harness.id} agents`) }),
|
|
26
|
+
hooks: Object.freeze({
|
|
27
|
+
sourceFile: resolveRegistrySource(registry, declaration.hooks?.configSource, `${harness.id} hooks config`),
|
|
28
|
+
sourceHooksDir: resolveRegistrySource(registry, declaration.hooks?.scriptsSource, `${harness.id} hooks scripts`),
|
|
29
|
+
trusted: trusted ?? declaration.hooks?.trusted,
|
|
30
|
+
}),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
module.exports = { normalizeNativeProjection };
|