@mutagent/helix 0.1.0-alpha.14
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/.claude/skills/mutagent-helix/SKILL.md +113 -0
- package/.claude/skills/mutagent-helix/scripts/cli/codex-transcode.ts +143 -0
- package/.claude/skills/mutagent-helix/scripts/cli/doctor.ts +111 -0
- package/.claude/skills/mutagent-helix/scripts/cli/init.ts +382 -0
- package/.claude/skills/mutagent-helix/scripts/cli/run.sh +61 -0
- package/CLAUDE.md +193 -0
- package/LICENSE +201 -0
- package/NOTICE +22 -0
- package/README.md +209 -0
- package/assets/adl-loop.svg +162 -0
- package/assets/system-status.svg +422 -0
- package/bin/mutagent-cli.mjs +9950 -0
- package/bin/mutagent-helix.mjs +78 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/CLAUDE.md +28 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/SKILL.md +138 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/assets/templates/agentspec.yaml.tpl +247 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/references/frameworks/doc-pins.md +53 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/references/principles.md +91 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/references/requirements.yaml +295 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/references/workflows/orchestrator-protocol.md +302 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/cli/doctor.ts +116 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/cli/init.ts +230 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/cli/run.sh +60 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/config/resolve-spec-dir.ts +199 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/contract/agentspec.schema.ts +455 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/setup/detect.ts +67 -0
- package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/validate/validate-spec.ts +93 -0
- package/mutagent-agentspec/LICENSE +201 -0
- package/mutagent-agentspec/NOTICE +19 -0
- package/mutagent-agentspec/README.md +44 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/SKILL.md +100 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/assets/agents/ai-architect.md +312 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/assets/agents/ai-engineer.md +357 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/assets/templates/build-report.md.tpl +39 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/references/principles.md +31 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/references/workflows/build-protocol.md +61 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/references/workflows/improve-handoff.md +23 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/scripts/cli/run.sh +60 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/scripts/handoff/validate-build-input.ts +72 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/scripts/sync-spec/check-sync-spec.ts +499 -0
- package/mutagent-builder/.claude/skills/mutagent-builder/scripts/verify/spec-impl-coverage.ts +182 -0
- package/mutagent-builder/CLAUDE.md +25 -0
- package/mutagent-builder/README.md +26 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/README.md +192 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/SKILL.md +352 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/agents/ai-architect.md +256 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/agents/ai-engineer.md +344 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/agents/diagnostics-analyzer.md +576 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/agents/discovery.md +425 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/audit.json.tpl +24 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/audit.md.tpl +49 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/config.yaml.tpl +100 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/pr-body.md.tpl +56 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/report.html.tpl +327 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/README.md +27 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/iter-N-handover.md.tpl +125 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/self-diagnosis-contract.v0.1.0.yaml.tpl +234 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/spec.yaml.tpl +152 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/team.yaml.tpl +127 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/wave-N-dashboard.html.tpl +1712 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.1-nl-query.md +59 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.2-tier0-progress.md +58 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.3-analysis-progress.md +44 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.4-html-report.md +61 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.5-rca-detail.md +69 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.6-stale-warning.md +53 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.1-welcome.md +60 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.2-source-platform-picker.md +41 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.3-source-auth.md +75 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.4-target-picker.md +48 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.5-ask-tool.md +43 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.6-config-review.md +57 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.7-filter-defaults.md +52 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.8-first-run.md +59 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/examples/sample-findings.json +92 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/examples/sample-meta.json +47 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/adapter-strategy.md +75 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/config-migration.md +84 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/config.md +159 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/filter-search-matrix.md +66 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/harness-knowledge.md +22 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/memory-format.md +78 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/onboarding-decisions.yaml +187 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/operation-inventory.md +59 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/overview.md +167 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/reference.md +119 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/script-index.md +101 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-adapter-contract.md +93 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/claude-code-transcripts.md +66 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/codex-transcripts.md +78 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/codex.md +145 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/install-paths.md +57 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/langfuse.md +178 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/local-jsonl.md +55 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/openobserve.md +102 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/otel.md +63 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/cloud-rest.md +84 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-claude.md +65 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-cloud-agent-sdk.md +92 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-codex.md +72 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-cursor.md +108 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-mastra.md +77 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-opencode.md +70 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/apply-pr-comment-format.md +82 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/diagnostics.md +35 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/handover-contract.md +247 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/onboarding.md +300 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/orchestrator-protocol.md +1861 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/rca.md +331 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/rendering-anatomy.md +314 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/schedule-prep.md +100 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/scope-model.md +128 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/verification-methodology.md +174 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/aggregate/sort-findings.ts +0 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/awareness/blind-spots.ts +167 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/awareness/llm-sample.ts +681 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/cli/doctor.ts +215 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/cli/init.ts +1013 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/cli/install-agents.ts +350 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/cli/run.sh +61 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/cli/shared-templates.ts +79 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/config/load.ts +392 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/config/resolve-credential.ts +120 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/config/schema.ts +641 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/config/validate.ts +134 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/context/build-diagnosis-context.ts +417 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/context/load-context.ts +105 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/contract/types.ts +166 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/enrich/build-render-input.ts +1964 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/enrich/corpus-severity.ts +172 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/enrich/dismissal-match.ts +270 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/enrich/rank-remedies.ts +75 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/hooks/install-hooks.sh +46 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/hooks/pre-push.sh +78 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/invocation/parse-brief.ts +188 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/library/match.ts +114 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/library/paths.ts +95 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/library/store.ts +535 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/library/types.ts +181 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/lint/template-inline-js.ts +267 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/memory/append.ts +188 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/memory/read.ts +218 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/normalize/platforms/entity-context.ts +686 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/normalize/read-unitf.ts +267 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/normalize/trace.ts +1078 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/normalize/unitf-adapter.ts +0 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/normalize/unitf-types.ts +213 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/report/persist-selections.ts +174 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/report/render.ts +3254 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/run/diagnose.ts +64 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/run/session.ts +167 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/sample/caps.ts +345 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/sample/deep-read-gate.ts +424 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/sample/representative.ts +584 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/scan/objection.ts +224 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/scan/trajectory.ts +489 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/self-diagnostics/dispatch.ts +135 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/self-diagnostics/probe.ts +170 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/setup/detect.ts +307 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/setup/ensure-cli.ts +315 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/setup/reconfigure.ts +77 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/setup/verify-agents.ts +207 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/slicer.ts +166 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/adapters/claude-code.ts +17 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/adapters/codex.ts +11 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/adapters/langfuse.ts +17 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/adapters/local-jsonl.ts +12 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/adapters/otel.ts +12 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/index.ts +54 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/registry.ts +45 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/types.ts +86 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/stale-detector.ts +74 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/test/render-playwright.cli.ts +477 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/tier0/claude-code.ts +133 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/tier0/langfuse.ts +143 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/tier0-scan.ts +423 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/completeness-check.ts +436 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/doc-refs.ts +190 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/finalize-gate.ts +417 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/findings-contract.ts +628 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/render-js-syntax.ts +188 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/report-checklist.yaml +217 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/trace-shape.ts +262 -0
- package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/wave6-checklist.ts +326 -0
- package/mutagent-diagnostics/CLAUDE.md +41 -0
- package/mutagent-diagnostics/LICENSE +201 -0
- package/mutagent-diagnostics/NOTICE +18 -0
- package/mutagent-diagnostics/README.md +343 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/SKILL.md +548 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/agents/audit-executor.md +169 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/agents/dataset-builder.md +160 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/agents/discovery.md +425 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/agents/evaluator.md +1108 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/brand/theme.css +213 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/brand/wordmark.html +9 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/lenses/context-flow-lens.md +85 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/lenses/data-lens.md +47 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/lenses/decision-lens.md +48 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/lenses/methodology-critic-lens.md +53 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/lenses/trajectory-lens.md +44 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/build-review-interface.md +83 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/edd-loop.md +134 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/error-analysis.md +113 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/eval-audit.md +154 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/eval-stage.md +168 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/generate-synthetic-data.md +81 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/grounded-adjudication.md +221 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/memory-format.md +65 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/methodology.md +201 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/operation-inventory.md +197 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/validate-evaluator.md +125 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/workflows/orchestrator-protocol.md +300 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/write-judge-prompt.md +123 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/behavior-tree.schema.yaml +73 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/dataset.schema.yaml +66 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/edd-change-request.schema.yaml +114 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/eval-matrix.schema.yaml +74 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/flow-graph.schema.yaml +69 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/flow-profile.schema.yaml +49 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/methodology-review.schema.yaml +40 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/scorecard.schema.yaml +85 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/agent-dispatch.ts +0 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/aggregate-discover.ts +543 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/artifact-paths.ts +115 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/assemble-scorecard.ts +172 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/build-dataset.ts +186 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/build-evals.ts +93 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/build-review-ui.ts +393 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/check-method-router.ts +170 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/aggregate.ts +112 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/audit-run.ts +182 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/doctor.ts +211 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/dogfood.ts +133 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/init.ts +601 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/methodology-review.ts +122 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/prep.ts +295 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/profile-subject.ts +165 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/run.sh +56 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/variance-check.ts +105 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/code-eval.ts +248 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/code-quality-verdict.ts +285 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/codegen-evals.ts +173 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cold-start-project.ts +151 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cold-start-sampler.ts +267 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/config/load.ts +343 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/config/schema.ts +380 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/agentspec-evals.ts +85 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/dataset.ts +149 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/eval-engine.ts +118 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/eval-matrix.ts +577 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/eval-types.ts +1074 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/flow-graph.ts +194 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/types.ts +303 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/validation.ts +193 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/derive-dataset.ts +152 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/determine-outcome.ts +219 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/diff-discriminate.ts +160 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/discover-criteria.ts +348 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/edd/change-request.ts +232 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/edd/edd-types.ts +210 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/edd/variance-gate.ts +186 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/emit-completeness.ts +111 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/eval-engine.ts +160 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/evaluate.ts +333 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/flow-graph.ts +230 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/judge-prompt-template.ts +253 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/judge-provider.ts +135 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/lint-grounding.ts +229 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/lint-uniformity.ts +168 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/living-suite.ts +109 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/load-bundle.ts +203 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/load-profile-vocab.ts +64 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/load-profile.ts +106 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/mask.ts +138 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/materialize-dataset.ts +113 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/matrix-judge.ts +750 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/memory/append.ts +215 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/memory/read.ts +168 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/persist-eval-criteria.ts +232 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/prep-tasks.ts +125 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/profile-subject.ts +310 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/publish-report.ts +131 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/read-unitf-traces.ts +81 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/render-build-cards.ts +195 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/render-discover-report.ts +1640 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/render-eval-report.ts +3838 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/render-report.ts +212 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/resolve-credential.ts +110 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/resolve-ref.ts +98 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/result-verify.ts +129 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/route-failures.ts +330 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/run-deterministic.ts +367 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/run-evaluate.ts +719 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/run-judge.ts +155 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/run-pipeline.ts +175 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/sample-traces.ts +210 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/self-audit.ts +387 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/source-map.ts +106 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/subject-profile.ts +134 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/substrate.ts +162 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/sync-eval-criteria.ts +244 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/ui-slots.ts +119 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/unitf-to-evaltrace.ts +284 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/validate-judge.ts +358 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/variance-compare.ts +177 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/subjects/mutagent-diagnostics/behavior-tree.yaml +140 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/subjects/mutagent-diagnostics/eval-matrix.yaml +1270 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/subjects/mutagent-diagnostics/methodology-review.yaml +105 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/workflows/audit.workflow.js +82 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/workflows/data-leak.workflow.js +236 -0
- package/mutagent-evaluator/.claude/skills/mutagent-evaluator/workflows/variance.workflow.js +163 -0
- package/mutagent-evaluator/CLAUDE.md +45 -0
- package/mutagent-evaluator/LICENSE +201 -0
- package/mutagent-evaluator/NOTICE +23 -0
- package/mutagent-evaluator/README.md +88 -0
- package/mutagent-optimize/.claude/skills/mutagent-optimize/SKILL.md +287 -0
- package/mutagent-optimize/.claude/skills/mutagent-optimize/scripts/contracts/amend-request.ts +503 -0
- package/mutagent-optimize/.claude/skills/mutagent-optimize/scripts/improve-loop-run.ts +304 -0
- package/mutagent-optimize/.claude/skills/mutagent-optimize/scripts/loop-state-cli.ts +300 -0
- package/mutagent-optimize/.claude/skills/mutagent-optimize/scripts/loop-state.ts +440 -0
- package/mutagent-optimize/CLAUDE.md +49 -0
- package/mutagent-optimize/README.md +26 -0
- package/mutagent-orchestrator/CLAUDE.md +102 -0
- package/mutagent-orchestrator/README.md +20 -0
- package/mutagent-orchestrator/assets/agents/discovery.md +425 -0
- package/mutagent-orchestrator/assets/agents/dogfood-monitor.md +266 -0
- package/mutagent-orchestrator/assets/agents/monitor.md +258 -0
- package/mutagent-orchestrator/orchestrator.md +782 -0
- package/mutagent-orchestrator/references/MONITORING.md +209 -0
- package/mutagent-orchestrator/references/config-fields.md +132 -0
- package/mutagent-orchestrator/references/config-migration.md +132 -0
- package/mutagent-orchestrator/references/index-registry.md +92 -0
- package/mutagent-orchestrator/routing.yaml +391 -0
- package/mutagent-orchestrator/scripts/config-schema.ts +1010 -0
- package/mutagent-orchestrator/scripts/dispatch.ts +439 -0
- package/mutagent-orchestrator/scripts/dogfood/extract-feedback.ts +203 -0
- package/mutagent-orchestrator/scripts/dogfood/reconstruct-trajectory.ts +327 -0
- package/mutagent-orchestrator/scripts/dogfood/render-dogfood-report.ts +347 -0
- package/mutagent-orchestrator/scripts/dogfood/resolve-subagents.ts +160 -0
- package/mutagent-orchestrator/scripts/dogfood/run-report.ts +264 -0
- package/mutagent-orchestrator/scripts/dogfood/slack-thread.ts +106 -0
- package/mutagent-orchestrator/scripts/dogfood/types.ts +257 -0
- package/mutagent-orchestrator/scripts/eval-routing.ts +753 -0
- package/mutagent-orchestrator/scripts/gate.ts +219 -0
- package/mutagent-orchestrator/scripts/handover-contract.ts +362 -0
- package/mutagent-orchestrator/scripts/index/build-index.ts +351 -0
- package/mutagent-orchestrator/scripts/index/render-index.ts +110 -0
- package/mutagent-orchestrator/scripts/monitor/slack-notify.ts +111 -0
- package/mutagent-orchestrator/scripts/monitor/triggers.ts +162 -0
- package/mutagent-orchestrator/scripts/onboarding-check.ts +369 -0
- package/mutagent-orchestrator/scripts/render-roster.ts +308 -0
- package/mutagent-orchestrator/scripts/resolve-credential.ts +185 -0
- package/mutagent-orchestrator/scripts/resolve-paths.ts +114 -0
- package/mutagent-orchestrator/scripts/slack/format.ts +63 -0
- package/mutagent-orchestrator/scripts/slack/post.ts +115 -0
- package/mutagent-orchestrator/scripts/sync-index.ts +311 -0
- package/package.json +64 -0
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/config/load.ts
|
|
3
|
+
* Load + parse the diagnostics config from the UNIFIED local `.mutagent/config.yaml`
|
|
4
|
+
* (v0.2.0). Single source of truth (operator decision 2026-06-29).
|
|
5
|
+
*
|
|
6
|
+
* v0.2.0 config-shape break (plan PHASE 1 · Fork B HARD-CUT):
|
|
7
|
+
* - The diagnostics section moved from `parsed.diagnostics` → `parsed.lifecycle.diagnostics`.
|
|
8
|
+
* - `source` / `target` no longer live in that section — they are RESOLVED from
|
|
9
|
+
* the `global.sources[]` / `global.targets[]` catalog BY ROLE:
|
|
10
|
+
* source-consumer → binds `global.sources` (one ⇒ auto; >1 ⇒ ambiguous)
|
|
11
|
+
* target-writer → binds `global.targets` (one ⇒ auto; >1 ⇒ ambiguous)
|
|
12
|
+
* Ambiguity is NOT a hard fail — it is surfaced (`sourceAmbiguous`/`targetAmbiguous`)
|
|
13
|
+
* so the caller (onboarding) can disambiguate (Fork A: disambiguation deferred).
|
|
14
|
+
* - A LEGACY (pre-v0.2.0) config shape (`shared` / `stages` / a top-level
|
|
15
|
+
* `diagnostics` / a wrong `config_version`) yields `migrationRequired: true` and
|
|
16
|
+
* NO config — the old shape is NEVER parsed at runtime (Fork B).
|
|
17
|
+
*
|
|
18
|
+
* Secrets are NOT embedded — config holds only `credential_ref` (an env-var name or
|
|
19
|
+
* `{env,path}`), resolved at use-time via resolve-credential.ts (env → .env → .mutagentrc).
|
|
20
|
+
* Type A — Pure Script (deterministic YAML parse + sub-key extract; no clock/random/net).
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { readFileSync, existsSync } from "fs";
|
|
24
|
+
import { resolve } from "path";
|
|
25
|
+
import { parse as parseYaml } from "yaml";
|
|
26
|
+
import type {
|
|
27
|
+
DiagnosticsConfig,
|
|
28
|
+
GlobalSource,
|
|
29
|
+
GlobalTarget,
|
|
30
|
+
} from "./schema.ts";
|
|
31
|
+
|
|
32
|
+
/** The FROZEN v0.2.0 contract version this loader accepts. */
|
|
33
|
+
export const CONFIG_VERSION = "0.2.0" as const;
|
|
34
|
+
|
|
35
|
+
/** Legacy top-level keys that must NOT appear in a v0.2.0 config. */
|
|
36
|
+
const LEGACY_TOP_LEVEL_KEYS = [
|
|
37
|
+
"shared",
|
|
38
|
+
"stages",
|
|
39
|
+
"diagnostics",
|
|
40
|
+
"evaluator",
|
|
41
|
+
] as const;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* SELECTION outcome tag for a role-bound catalog (source OR target). The precedence
|
|
45
|
+
* that produces each tag is documented on `selectByRole` — it matches the orchestrator +
|
|
46
|
+
* evaluator selection contract EXACTLY:
|
|
47
|
+
*
|
|
48
|
+
* - "none" — 0 entries in the catalog.
|
|
49
|
+
* - "bound" — auto-bound with NO prompt: exactly one entry in the catalog,
|
|
50
|
+
* OR an explicit `--source`/`--target` name match. The binding
|
|
51
|
+
* is unambiguous — the run proceeds silently.
|
|
52
|
+
* - "resolved-default" — F2 CONFIRM signal: >1 entry AND exactly one `default:true`.
|
|
53
|
+
* The default is PRESELECTED (populated in `bound`), but the run
|
|
54
|
+
* flow SHOULD confirm it ("use default `<X>`?") before proceeding
|
|
55
|
+
* — distinct from `needs-selection` (pick-which). NON-FATAL for
|
|
56
|
+
* gating (a source/target exists). `candidates` lists all names
|
|
57
|
+
* so the operator may override the preselected default.
|
|
58
|
+
* PARITY: mirrors the orchestrator's `resolved-default`.
|
|
59
|
+
* - "needs-selection" — >1 entry, 0 `default:true`, no explicit name — the run flow
|
|
60
|
+
* must PROMPT the operator to pick one (candidates listed).
|
|
61
|
+
* - "multiple-defaults" — >1 entry carries `default:true` — a CONFIG ERROR.
|
|
62
|
+
* - "unknown-name" — an explicit `--source`/`--target` name matched no entry — an ERROR.
|
|
63
|
+
*/
|
|
64
|
+
export type SelectionStatus =
|
|
65
|
+
| "none"
|
|
66
|
+
| "bound"
|
|
67
|
+
| "resolved-default"
|
|
68
|
+
| "needs-selection"
|
|
69
|
+
| "multiple-defaults"
|
|
70
|
+
| "unknown-name";
|
|
71
|
+
|
|
72
|
+
export interface SelectionOutcome<T> {
|
|
73
|
+
status: SelectionStatus;
|
|
74
|
+
/**
|
|
75
|
+
* The resolved entry — populated on `status: "bound"` (auto-bind) AND on
|
|
76
|
+
* `status: "resolved-default"` (the PRESELECTED default, subject to a confirm).
|
|
77
|
+
* Null on every other status.
|
|
78
|
+
*/
|
|
79
|
+
bound: T | null;
|
|
80
|
+
/**
|
|
81
|
+
* Candidate `name`s for the operator to choose from. Populated on `resolved-default`
|
|
82
|
+
* (all entries — the preselected default is in `bound`, the rest are override
|
|
83
|
+
* options for the confirm ASK), `needs-selection` (all entries), `multiple-defaults`
|
|
84
|
+
* (the offending default-flagged names), and `unknown-name` (the available names, so
|
|
85
|
+
* the error can list valid choices).
|
|
86
|
+
*/
|
|
87
|
+
candidates: string[];
|
|
88
|
+
/** The explicit `--source`/`--target` name that failed to match (unknown-name only). */
|
|
89
|
+
requestedName?: string;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Per-role selection override (from `--source <name>` / `--target <name>`). */
|
|
93
|
+
export interface RoleSelectors {
|
|
94
|
+
/** Explicit source name from `--source` — bypasses default/prompt when it matches. */
|
|
95
|
+
sourceName?: string;
|
|
96
|
+
/** Explicit target name from `--target` — bypasses default/prompt when it matches. */
|
|
97
|
+
targetName?: string;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export interface LoadResult {
|
|
101
|
+
/** The `lifecycle.diagnostics` section (opaque skill knobs), or null when absent. */
|
|
102
|
+
config: DiagnosticsConfig | null;
|
|
103
|
+
/** The source resolved BY ROLE from `global.sources` (single/default/name), or null. */
|
|
104
|
+
source: GlobalSource | null;
|
|
105
|
+
/** The target resolved BY ROLE from `global.targets` (single/default/name), or null. */
|
|
106
|
+
target: GlobalTarget | null;
|
|
107
|
+
/**
|
|
108
|
+
* DEPRECATED-shape compat: true when the source could NOT be auto-bound and >1 entry
|
|
109
|
+
* exists (i.e. `needs-selection` OR `multiple-defaults`). Kept so pre-selection callers
|
|
110
|
+
* keep working; prefer `sourceSelection.status` for the precise reason.
|
|
111
|
+
*/
|
|
112
|
+
sourceAmbiguous: boolean;
|
|
113
|
+
/** Same compat flag for the target catalog — see `sourceAmbiguous`. */
|
|
114
|
+
targetAmbiguous: boolean;
|
|
115
|
+
/** RICH source selection outcome (status + candidates) — see `SelectionOutcome`. */
|
|
116
|
+
sourceSelection: SelectionOutcome<GlobalSource>;
|
|
117
|
+
/** RICH target selection outcome (status + candidates) — see `SelectionOutcome`. */
|
|
118
|
+
targetSelection: SelectionOutcome<GlobalTarget>;
|
|
119
|
+
/** True when the config FILE exists (regardless of whether it has a diagnostics section). */
|
|
120
|
+
exists: boolean;
|
|
121
|
+
/**
|
|
122
|
+
* HARD-CUT signal (Fork B): the file is a LEGACY (pre-v0.2.0) shape and was NOT
|
|
123
|
+
* parsed. The caller routes this to `migration-required` (see references/config-migration.md).
|
|
124
|
+
*/
|
|
125
|
+
migrationRequired: boolean;
|
|
126
|
+
/** Legacy markers found (empty unless migrationRequired). */
|
|
127
|
+
legacyMarkers: string[];
|
|
128
|
+
error: string | null;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** The unified config path under a project root: `<root>/.mutagent/config.yaml`. */
|
|
132
|
+
export function configPathFor(projectRoot: string): string {
|
|
133
|
+
return resolve(projectRoot, ".mutagent", "config.yaml");
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Detect a LEGACY (pre-v0.2.0) config WITHOUT parsing its old shape. Two signals,
|
|
138
|
+
* either fires: a non-frozen `config_version`, or any legacy top-level key
|
|
139
|
+
* (`shared` / `stages` / top-level `diagnostics` / `evaluator`). Pure; tolerant of a
|
|
140
|
+
* non-object input (returns []). Mirrors the orchestrator's `detectLegacyConfig`.
|
|
141
|
+
*/
|
|
142
|
+
export function detectLegacyShape(parsed: unknown): string[] {
|
|
143
|
+
if (parsed === null || typeof parsed !== "object") return [];
|
|
144
|
+
const o = parsed as Record<string, unknown>;
|
|
145
|
+
const markers: string[] = [];
|
|
146
|
+
|
|
147
|
+
const version = o.config_version;
|
|
148
|
+
if (version !== CONFIG_VERSION) {
|
|
149
|
+
if (version === undefined) {
|
|
150
|
+
markers.push(`config_version: absent (expected "${CONFIG_VERSION}")`);
|
|
151
|
+
} else {
|
|
152
|
+
markers.push(
|
|
153
|
+
`config_version: ${JSON.stringify(version)} (expected "${CONFIG_VERSION}")`,
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
for (const key of LEGACY_TOP_LEVEL_KEYS) {
|
|
159
|
+
if (key in o) markers.push(`legacy top-level key '${key}'`);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return markers;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** Structural shape the selector needs off a catalog entry (source or target). */
|
|
166
|
+
interface Selectable {
|
|
167
|
+
name: string;
|
|
168
|
+
default?: boolean;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Select ONE catalog entry BY ROLE per the SELECTION contract (parity with the
|
|
173
|
+
* orchestrator + evaluator). Precedence, highest-first:
|
|
174
|
+
*
|
|
175
|
+
* 1. explicit `selectName` (from `--source`/`--target`) ⇒ find by name;
|
|
176
|
+
* not found ⇒ `unknown-name` (surface an error, list valid names).
|
|
177
|
+
* 2. 0 entries ⇒ `none`.
|
|
178
|
+
* 3. exactly 1 entry ⇒ `bound` (auto-bind, no prompt).
|
|
179
|
+
* 4. >1 entries:
|
|
180
|
+
* - exactly one `default:true` ⇒ `resolved-default` (F2 CONFIRM: preselect the
|
|
181
|
+
* default in `bound`, but the run flow confirms it — "use default `<X>`?").
|
|
182
|
+
* - >1 `default:true` ⇒ `multiple-defaults` (config error).
|
|
183
|
+
* - 0 `default:true` ⇒ `needs-selection` (prompt; return names).
|
|
184
|
+
*
|
|
185
|
+
* F2 note: `resolved-default` is DISTINCT from `bound` — a single/explicit binding is
|
|
186
|
+
* unambiguous (no prompt), whereas a default-among-many is preselected-but-confirmed.
|
|
187
|
+
* Both keep a usable entry in `bound`, so both remain NON-FATAL for the onboarding gate.
|
|
188
|
+
*
|
|
189
|
+
* Pure + deterministic. Never throws — every branch is a typed outcome.
|
|
190
|
+
*/
|
|
191
|
+
function selectByRole<T extends Selectable>(
|
|
192
|
+
catalog: T[] | undefined,
|
|
193
|
+
selectName?: string,
|
|
194
|
+
): SelectionOutcome<T> {
|
|
195
|
+
const entries = Array.isArray(catalog) ? catalog : [];
|
|
196
|
+
const names = entries.map((e) => e.name);
|
|
197
|
+
|
|
198
|
+
// 1. Explicit name override wins outright (default flags + count are irrelevant).
|
|
199
|
+
if (selectName !== undefined) {
|
|
200
|
+
const hit = entries.find((e) => e.name === selectName);
|
|
201
|
+
if (hit) return { status: "bound", bound: hit, candidates: names };
|
|
202
|
+
return {
|
|
203
|
+
status: "unknown-name",
|
|
204
|
+
bound: null,
|
|
205
|
+
candidates: names,
|
|
206
|
+
requestedName: selectName,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// 2. Empty catalog.
|
|
211
|
+
if (entries.length === 0) return { status: "none", bound: null, candidates: [] };
|
|
212
|
+
|
|
213
|
+
// 3. Single entry auto-binds.
|
|
214
|
+
if (entries.length === 1) {
|
|
215
|
+
return { status: "bound", bound: entries[0]!, candidates: names };
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// 4. Multiple entries — disambiguate via `default`.
|
|
219
|
+
const defaults = entries.filter((e) => e.default === true);
|
|
220
|
+
if (defaults.length === 1) {
|
|
221
|
+
// F2: preselect the default, but SIGNAL a confirm (distinct from a silent bind).
|
|
222
|
+
// `candidates` carries every name so the confirm ASK can offer an override.
|
|
223
|
+
return { status: "resolved-default", bound: defaults[0]!, candidates: names };
|
|
224
|
+
}
|
|
225
|
+
if (defaults.length > 1) {
|
|
226
|
+
return {
|
|
227
|
+
status: "multiple-defaults",
|
|
228
|
+
bound: null,
|
|
229
|
+
candidates: defaults.map((e) => e.name),
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
return { status: "needs-selection", bound: null, candidates: names };
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/** A "no catalog present" selection outcome (used by emptyResult defaults). */
|
|
236
|
+
function noneOutcome<T>(): SelectionOutcome<T> {
|
|
237
|
+
return { status: "none", bound: null, candidates: [] };
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function emptyResult(overrides: Partial<LoadResult>): LoadResult {
|
|
241
|
+
return {
|
|
242
|
+
config: null,
|
|
243
|
+
source: null,
|
|
244
|
+
target: null,
|
|
245
|
+
sourceAmbiguous: false,
|
|
246
|
+
targetAmbiguous: false,
|
|
247
|
+
sourceSelection: noneOutcome<GlobalSource>(),
|
|
248
|
+
targetSelection: noneOutcome<GlobalTarget>(),
|
|
249
|
+
exists: false,
|
|
250
|
+
migrationRequired: false,
|
|
251
|
+
legacyMarkers: [],
|
|
252
|
+
error: null,
|
|
253
|
+
...overrides,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Load the diagnostics config from `<root>/.mutagent/config.yaml` (v0.2.0):
|
|
259
|
+
* - reads the section at `parsed.lifecycle.diagnostics`;
|
|
260
|
+
* - resolves the source/target BY ROLE from `global.sources` / `global.targets`;
|
|
261
|
+
* - HARD-CUTS on a legacy shape (`migrationRequired: true`, no parse).
|
|
262
|
+
*
|
|
263
|
+
* `exists` reflects the unified FILE; a v0.2.0 file present but with no
|
|
264
|
+
* `lifecycle.diagnostics` section yields { config:null, exists:true }.
|
|
265
|
+
*
|
|
266
|
+
* SELECTION: pass `selectors` to force a specific catalog entry by name (from the
|
|
267
|
+
* `--source`/`--target` CLI overrides). A name that matches nothing yields the rich
|
|
268
|
+
* `unknown-name` outcome (surfaced in `sourceSelection`/`targetSelection`); a
|
|
269
|
+
* multi-entry catalog with no default + no name yields `needs-selection` (the run
|
|
270
|
+
* flow prompts the operator). See `selectByRole`.
|
|
271
|
+
*/
|
|
272
|
+
export function loadConfig(
|
|
273
|
+
projectRoot: string,
|
|
274
|
+
selectors: RoleSelectors = {},
|
|
275
|
+
): LoadResult {
|
|
276
|
+
const configPath = configPathFor(projectRoot);
|
|
277
|
+
|
|
278
|
+
if (!existsSync(configPath)) {
|
|
279
|
+
return emptyResult({ exists: false });
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
let parsed: unknown;
|
|
283
|
+
try {
|
|
284
|
+
const raw = readFileSync(configPath, "utf8");
|
|
285
|
+
parsed = parseYaml(raw);
|
|
286
|
+
} catch (err) {
|
|
287
|
+
return emptyResult({
|
|
288
|
+
exists: true,
|
|
289
|
+
error: err instanceof Error ? err.message : String(err),
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// HARD-CUT (Fork B): legacy detection FIRST — never parse the old shape.
|
|
294
|
+
const legacyMarkers = detectLegacyShape(parsed);
|
|
295
|
+
if (legacyMarkers.length > 0) {
|
|
296
|
+
return emptyResult({
|
|
297
|
+
exists: true,
|
|
298
|
+
migrationRequired: true,
|
|
299
|
+
legacyMarkers,
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
const root =
|
|
304
|
+
parsed !== null && typeof parsed === "object"
|
|
305
|
+
? (parsed as {
|
|
306
|
+
lifecycle?: { diagnostics?: DiagnosticsConfig };
|
|
307
|
+
global?: { sources?: GlobalSource[]; targets?: GlobalTarget[] };
|
|
308
|
+
})
|
|
309
|
+
: {};
|
|
310
|
+
|
|
311
|
+
const section = root.lifecycle?.diagnostics ?? null;
|
|
312
|
+
const src = selectByRole(root.global?.sources, selectors.sourceName);
|
|
313
|
+
const tgt = selectByRole(root.global?.targets, selectors.targetName);
|
|
314
|
+
|
|
315
|
+
return {
|
|
316
|
+
config: section,
|
|
317
|
+
source: src.bound,
|
|
318
|
+
target: tgt.bound,
|
|
319
|
+
// Compat: "ambiguous" = a multi-entry catalog that did not auto-bind.
|
|
320
|
+
sourceAmbiguous: isDeferredSelection(src.status),
|
|
321
|
+
targetAmbiguous: isDeferredSelection(tgt.status),
|
|
322
|
+
sourceSelection: src,
|
|
323
|
+
targetSelection: tgt,
|
|
324
|
+
exists: true,
|
|
325
|
+
migrationRequired: false,
|
|
326
|
+
legacyMarkers: [],
|
|
327
|
+
error: null,
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Compat helper: a selection with NO usable binding because the catalog holds >1 entry
|
|
333
|
+
* and none could be picked (`needs-selection` OR `multiple-defaults`). Maps the rich
|
|
334
|
+
* status back to the legacy boolean `*Ambiguous` fields.
|
|
335
|
+
*
|
|
336
|
+
* `resolved-default` is intentionally NOT deferred: a default IS preselected (in
|
|
337
|
+
* `bound`), so legacy pre-selection callers keep receiving a usable source/target and
|
|
338
|
+
* `*Ambiguous` stays false — the confirm is an ADDITIVE run-time signal read from
|
|
339
|
+
* `sourceSelection.status`, not a blocking flag. `unknown-name` is a distinct
|
|
340
|
+
* explicit-override error (not "ambiguous"), and `none`/`bound` are obviously not deferred.
|
|
341
|
+
*/
|
|
342
|
+
function isDeferredSelection(status: SelectionStatus): boolean {
|
|
343
|
+
return status === "needs-selection" || status === "multiple-defaults";
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Parse `--source <name>` / `--target <name>` selection overrides out of an argv
|
|
348
|
+
* slice (order-independent; supports both `--source name` and `--source=name`).
|
|
349
|
+
* Exported for reuse by the run entry + tests. Pure — no process access.
|
|
350
|
+
*/
|
|
351
|
+
export function parseSelectors(argv: string[]): {
|
|
352
|
+
selectors: RoleSelectors;
|
|
353
|
+
positionals: string[];
|
|
354
|
+
} {
|
|
355
|
+
const selectors: RoleSelectors = {};
|
|
356
|
+
const positionals: string[] = [];
|
|
357
|
+
|
|
358
|
+
for (let i = 0; i < argv.length; i++) {
|
|
359
|
+
const arg = argv[i]!;
|
|
360
|
+
const eq = arg.indexOf("=");
|
|
361
|
+
const flag = eq === -1 ? arg : arg.slice(0, eq);
|
|
362
|
+
const inlineVal = eq === -1 ? undefined : arg.slice(eq + 1);
|
|
363
|
+
|
|
364
|
+
if (flag === "--source" || flag === "--target") {
|
|
365
|
+
const value = inlineVal ?? argv[++i];
|
|
366
|
+
if (value !== undefined) {
|
|
367
|
+
if (flag === "--source") selectors.sourceName = value;
|
|
368
|
+
else selectors.targetName = value;
|
|
369
|
+
}
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
if (!arg.startsWith("--")) positionals.push(arg);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
return { selectors, positionals };
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// CLI usage: bun scripts/config/load.ts [project-root] [--source <name>] [--target <name>]
|
|
379
|
+
if (import.meta.main) {
|
|
380
|
+
const { selectors, positionals } = parseSelectors(process.argv.slice(2));
|
|
381
|
+
const projectRoot = positionals[0] ?? process.cwd();
|
|
382
|
+
const result = loadConfig(projectRoot, selectors);
|
|
383
|
+
process.stdout.write(JSON.stringify(result, null, 2) + "\n");
|
|
384
|
+
// A selection error (unknown --source/--target name or >1 default) is a hard exit;
|
|
385
|
+
// `needs-selection` is NON-fatal here (the run flow prompts) — exit 0.
|
|
386
|
+
const selectionError =
|
|
387
|
+
result.sourceSelection.status === "unknown-name" ||
|
|
388
|
+
result.sourceSelection.status === "multiple-defaults" ||
|
|
389
|
+
result.targetSelection.status === "unknown-name" ||
|
|
390
|
+
result.targetSelection.status === "multiple-defaults";
|
|
391
|
+
process.exit(result.error || result.migrationRequired || selectionError ? 1 : 0);
|
|
392
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/config/resolve-credential.ts
|
|
3
|
+
* The shared secret resolver (operator decision 2026-06-29). PORTED IN — standalone
|
|
4
|
+
* copy (no cross-skill import; mirrors the orchestrator's canonical impl).
|
|
5
|
+
*
|
|
6
|
+
* A `credential_ref` in `.mutagent/config.yaml` is NEVER a raw secret — it names
|
|
7
|
+
* where the value lives. This turns the ref into the value by a fixed PRECEDENCE:
|
|
8
|
+
*
|
|
9
|
+
* 1. process.env[name] — the running environment wins (CI / shell export).
|
|
10
|
+
* 2. local `.env` — projectRoot/.env (the conventional dev secret file).
|
|
11
|
+
* 3. `.mutagentrc` — projectRoot/.mutagentrc (the credential/provider store;
|
|
12
|
+
* the fallback when no `.env` is around — it STAYS).
|
|
13
|
+
*
|
|
14
|
+
* Raw secret VALUES never enter config.yaml; the config holds only the ref. Pure
|
|
15
|
+
* core with INJECTED deps (env map + file reader) → deterministic tests.
|
|
16
|
+
* Type A — Pure Script.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { readFileSync } from "fs";
|
|
20
|
+
import { resolve } from "path";
|
|
21
|
+
|
|
22
|
+
export type CredentialRef = string | { env: string; path?: string };
|
|
23
|
+
export type CredentialSource = "env" | ".env" | ".mutagentrc" | "ref-path";
|
|
24
|
+
|
|
25
|
+
export type ResolveCredentialResult =
|
|
26
|
+
| { found: true; value: string; source: CredentialSource; from: string }
|
|
27
|
+
| { found: false; name: string; tried: string[] };
|
|
28
|
+
|
|
29
|
+
export interface ResolveCredentialDeps {
|
|
30
|
+
env: Record<string, string | undefined>;
|
|
31
|
+
/** File contents, or null if unreadable/absent. Never throws. */
|
|
32
|
+
readFile: (p: string) => string | null; // eslint-disable-line no-unused-vars
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const ENV_LINE = /^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)\s*$/;
|
|
36
|
+
|
|
37
|
+
/** Parse a dotenv-style file (`.env` / `.mutagentrc`). Pure — string in, map out. */
|
|
38
|
+
export function parseDotenv(content: string): Record<string, string> {
|
|
39
|
+
const out: Record<string, string> = {};
|
|
40
|
+
for (const rawLine of content.split(/\r?\n/)) {
|
|
41
|
+
const line = rawLine.trim();
|
|
42
|
+
if (line === "" || line.startsWith("#")) continue;
|
|
43
|
+
const m = ENV_LINE.exec(line);
|
|
44
|
+
if (!m) continue;
|
|
45
|
+
const key = m[1];
|
|
46
|
+
let val = m[2];
|
|
47
|
+
const quoted =
|
|
48
|
+
(val.startsWith('"') && val.endsWith('"') && val.length >= 2) ||
|
|
49
|
+
(val.startsWith("'") && val.endsWith("'") && val.length >= 2);
|
|
50
|
+
if (quoted) {
|
|
51
|
+
val = val.slice(1, -1);
|
|
52
|
+
} else {
|
|
53
|
+
const hash = val.indexOf(" #");
|
|
54
|
+
if (hash >= 0) val = val.slice(0, hash).trim();
|
|
55
|
+
}
|
|
56
|
+
out[key] = val;
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function normalizeRef(ref: CredentialRef): { name: string; refPath?: string } {
|
|
62
|
+
if (typeof ref === "string") return { name: ref };
|
|
63
|
+
return { name: ref.env, refPath: ref.path };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Resolve a credential ref to its secret by precedence (env → .env → .mutagentrc),
|
|
68
|
+
* with an optional ref-pinned file tried FIRST among files. Pure: I/O injected.
|
|
69
|
+
*/
|
|
70
|
+
export function resolveCredential(
|
|
71
|
+
ref: CredentialRef,
|
|
72
|
+
projectRoot: string,
|
|
73
|
+
deps: ResolveCredentialDeps,
|
|
74
|
+
): ResolveCredentialResult {
|
|
75
|
+
const { name, refPath } = normalizeRef(ref);
|
|
76
|
+
const tried: string[] = [];
|
|
77
|
+
|
|
78
|
+
const envVal = deps.env[name];
|
|
79
|
+
if (envVal !== undefined && envVal !== "") {
|
|
80
|
+
return { found: true, value: envVal, source: "env", from: `process.env.${name}` };
|
|
81
|
+
}
|
|
82
|
+
tried.push(`process.env.${name}`);
|
|
83
|
+
|
|
84
|
+
const fileTiers: { label: CredentialSource; file: string }[] = [];
|
|
85
|
+
if (refPath) fileTiers.push({ label: "ref-path", file: resolve(projectRoot, refPath) });
|
|
86
|
+
fileTiers.push({ label: ".env", file: resolve(projectRoot, ".env") });
|
|
87
|
+
fileTiers.push({ label: ".mutagentrc", file: resolve(projectRoot, ".mutagentrc") });
|
|
88
|
+
|
|
89
|
+
for (const tier of fileTiers) {
|
|
90
|
+
tried.push(tier.file);
|
|
91
|
+
const content = deps.readFile(tier.file);
|
|
92
|
+
if (content === null) continue;
|
|
93
|
+
const val = parseDotenv(content)[name];
|
|
94
|
+
if (val !== undefined && val !== "") {
|
|
95
|
+
return { found: true, value: val, source: tier.label, from: tier.file };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return { found: false, name, tried };
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** Real-fs reader: contents or null (never throws). */
|
|
103
|
+
export function readFileOrNull(p: string): string | null {
|
|
104
|
+
try {
|
|
105
|
+
return readFileSync(p, "utf-8");
|
|
106
|
+
} catch {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Thin wrapper binding the REAL process.env + fs. */
|
|
112
|
+
export function resolveCredentialLive(
|
|
113
|
+
ref: CredentialRef,
|
|
114
|
+
projectRoot: string,
|
|
115
|
+
): ResolveCredentialResult {
|
|
116
|
+
return resolveCredential(ref, projectRoot, {
|
|
117
|
+
env: process.env,
|
|
118
|
+
readFile: readFileOrNull,
|
|
119
|
+
});
|
|
120
|
+
}
|