@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,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/setup/ensure-cli.ts
|
|
3
|
+
* Source-platform-general "ensure-cli(platform)" helper (PR-021).
|
|
4
|
+
* Type A — Pure Script: detection + decision are side-effect-free.
|
|
5
|
+
*
|
|
6
|
+
* Purpose (operator directive): source platforms (Langfuse, OTel, …) are usually
|
|
7
|
+
* driven via a CLI during onboarding. Most CLIENTS will NOT have that CLI installed.
|
|
8
|
+
* Onboarding must therefore:
|
|
9
|
+
* 1. point the user at the official CLI docs, and
|
|
10
|
+
* 2. when the CLI is missing, OFFER to install it —
|
|
11
|
+
* but the install MUST be checked + approved by the user first.
|
|
12
|
+
* NEVER auto-install under any code path.
|
|
13
|
+
*
|
|
14
|
+
* This module is the reusable core. It exposes:
|
|
15
|
+
* - CLI_SPECS — per-platform CLI metadata (binary, install cmd, docs link)
|
|
16
|
+
* - isCliInstalled(binary) — pure probe (`command -v <binary>`), no install
|
|
17
|
+
* - planCliEnsure(platform) — decision object: detected? what to install? docs link?
|
|
18
|
+
* NO side effects, NO install. (approval happens upstream)
|
|
19
|
+
* - runCliInstall(spec) — runs the documented install command.
|
|
20
|
+
* ⚠ Callers MUST gate this behind explicit user approval.
|
|
21
|
+
* This function does NOT ask — it assumes approval was given.
|
|
22
|
+
*
|
|
23
|
+
* The approval prompt itself is platform-portable and lives in the onboarding caller
|
|
24
|
+
* (AskUserQuestion on Claude Code; chat y/N fallback elsewhere) — NOT here. This keeps
|
|
25
|
+
* the detect/decision layer pure and testable without any ASK runtime.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { execSync } from "child_process";
|
|
29
|
+
import type { SourcePlatform } from "../normalize/trace.ts";
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Injectable PATH probe: given a binary name, returns whether it is on PATH.
|
|
33
|
+
* Named type alias (not an inline function type) so the binary param has a home
|
|
34
|
+
* without tripping the base no-unused-vars rule on inline arrow-type params.
|
|
35
|
+
*/
|
|
36
|
+
// eslint-disable-next-line no-unused-vars
|
|
37
|
+
export type CliProbe = (binary: string) => boolean;
|
|
38
|
+
|
|
39
|
+
// ── Per-platform CLI specification ────────────────────────────────────────────
|
|
40
|
+
|
|
41
|
+
export interface CliSpec {
|
|
42
|
+
/** Source platform this CLI serves. */
|
|
43
|
+
platform: SourcePlatform;
|
|
44
|
+
/**
|
|
45
|
+
* Binary name probed on PATH (`command -v <bin>`). `null` for platforms that
|
|
46
|
+
* need NO CLI (pure file reads) — `planCliEnsure` short-circuits to "not-required".
|
|
47
|
+
*/
|
|
48
|
+
binary: string | null;
|
|
49
|
+
/** Human-readable CLI/tooling name for prompts. */
|
|
50
|
+
label: string;
|
|
51
|
+
/**
|
|
52
|
+
* The documented install command, or `null` when no installable CLI exists
|
|
53
|
+
* (e.g. OTel — backend-specific tooling; or file-only platforms).
|
|
54
|
+
*/
|
|
55
|
+
installCommand: string | null;
|
|
56
|
+
/** Official CLI / tooling docs URL. Always present (operator: must link the docs). */
|
|
57
|
+
docsUrl: string;
|
|
58
|
+
/**
|
|
59
|
+
* Extra guidance when the CLI is absent and no install is possible (REST / file
|
|
60
|
+
* fallback). Shown alongside the docs link so the user can proceed without the CLI.
|
|
61
|
+
*/
|
|
62
|
+
fallbackNote: string;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Source-platform CLI specs. Langfuse is the first concrete instance (operator-provided
|
|
67
|
+
* docs link). Other platforms link their official tooling docs where one exists, else
|
|
68
|
+
* carry a clear TODO in `docsUrl` and a `null` installCommand (file-only / backend-specific).
|
|
69
|
+
*/
|
|
70
|
+
export const CLI_SPECS: Readonly<Record<SourcePlatform, CliSpec>> = {
|
|
71
|
+
langfuse: {
|
|
72
|
+
platform: "langfuse",
|
|
73
|
+
binary: "langfuse",
|
|
74
|
+
label: "Langfuse CLI",
|
|
75
|
+
installCommand: "pip install langfuse",
|
|
76
|
+
// Operator-provided (Wave-6):
|
|
77
|
+
docsUrl: "https://langfuse.com/docs/api-and-data-platform/features/cli",
|
|
78
|
+
fallbackNote:
|
|
79
|
+
"Without the CLI the skill falls back to the Langfuse public REST API " +
|
|
80
|
+
"(GET /api/public/traces) — see references/source-platforms/langfuse.md (CLI vs REST).",
|
|
81
|
+
},
|
|
82
|
+
otel: {
|
|
83
|
+
platform: "otel",
|
|
84
|
+
// No single canonical OTel CLI — tooling is backend-specific (Jaeger/Tempo/Honeycomb).
|
|
85
|
+
binary: null,
|
|
86
|
+
label: "OpenTelemetry tooling (backend-specific)",
|
|
87
|
+
installCommand: null,
|
|
88
|
+
docsUrl: "https://opentelemetry.io/docs/specs/otlp/",
|
|
89
|
+
fallbackNote:
|
|
90
|
+
"OTel has no single CLI — traces are pulled from your OTLP backend " +
|
|
91
|
+
"(Jaeger / Tempo / Honeycomb) via its own API. The skill fetches via REST/curl. " +
|
|
92
|
+
"See references/source-platforms/otel.md.",
|
|
93
|
+
},
|
|
94
|
+
"local-jsonl": {
|
|
95
|
+
platform: "local-jsonl",
|
|
96
|
+
// Pure file reads — no CLI required.
|
|
97
|
+
binary: null,
|
|
98
|
+
label: "Local JSONL (no CLI required)",
|
|
99
|
+
installCommand: null,
|
|
100
|
+
// No platform CLI docs — this is a local-file source. Link the skill's own reference.
|
|
101
|
+
docsUrl: "references/source-platforms/local-jsonl.md",
|
|
102
|
+
fallbackNote:
|
|
103
|
+
"Local JSONL needs no CLI — the skill reads .jsonl/.ndjson files directly. " +
|
|
104
|
+
"Filtering is client-side via grep/jq.",
|
|
105
|
+
},
|
|
106
|
+
"claude-code": {
|
|
107
|
+
platform: "claude-code",
|
|
108
|
+
// Pure file reads of ~/.claude/projects/**/*.jsonl — no CLI required.
|
|
109
|
+
binary: null,
|
|
110
|
+
label: "Claude Code transcripts (no CLI required)",
|
|
111
|
+
installCommand: null,
|
|
112
|
+
docsUrl: "https://code.claude.com/docs/en/data-usage",
|
|
113
|
+
fallbackNote:
|
|
114
|
+
"Claude Code transcripts are local JSONL files — no CLI required. " +
|
|
115
|
+
"See references/source-platforms/claude-code-transcripts.md.",
|
|
116
|
+
},
|
|
117
|
+
codex: {
|
|
118
|
+
platform: "codex",
|
|
119
|
+
binary: "codex",
|
|
120
|
+
label: "Codex CLI",
|
|
121
|
+
installCommand: "npm install -g @openai/codex",
|
|
122
|
+
docsUrl: "https://developers.openai.com/codex/cli",
|
|
123
|
+
fallbackNote:
|
|
124
|
+
"Codex transcripts are local JSONL files under ~/.codex/sessions/ — the CLI is " +
|
|
125
|
+
"only needed to PRODUCE them, not to read them. The skill reads the files directly. " +
|
|
126
|
+
"See references/source-platforms/codex-transcripts.md.",
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
// ── Decision result ───────────────────────────────────────────────────────────
|
|
131
|
+
|
|
132
|
+
export type CliEnsureStatus =
|
|
133
|
+
/** Platform needs no CLI (file-only / backend-specific) — nothing to do. */
|
|
134
|
+
| "not-required"
|
|
135
|
+
/** CLI binary already found on PATH. */
|
|
136
|
+
| "present"
|
|
137
|
+
/** CLI missing AND an install command exists — caller must ASK before installing. */
|
|
138
|
+
| "missing-installable"
|
|
139
|
+
/** CLI missing AND no install command exists — caller must surface REST/file fallback. */
|
|
140
|
+
| "missing-no-installer";
|
|
141
|
+
|
|
142
|
+
export interface CliEnsurePlan {
|
|
143
|
+
platform: SourcePlatform;
|
|
144
|
+
status: CliEnsureStatus;
|
|
145
|
+
/** The CLI spec (always present, even for not-required platforms). */
|
|
146
|
+
spec: CliSpec;
|
|
147
|
+
/**
|
|
148
|
+
* The install command the caller should run IF the user approves.
|
|
149
|
+
* `null` for not-required / present / missing-no-installer.
|
|
150
|
+
*/
|
|
151
|
+
installCommand: string | null;
|
|
152
|
+
/**
|
|
153
|
+
* Whether running the install requires explicit user approval.
|
|
154
|
+
* ALWAYS true when status is "missing-installable". The caller MUST NOT run
|
|
155
|
+
* `runCliInstall` unless it has obtained explicit approval. There is no path
|
|
156
|
+
* where this is false for an installable-but-missing CLI.
|
|
157
|
+
*/
|
|
158
|
+
approvalRequired: boolean;
|
|
159
|
+
/** Official docs link to show the user (operator: always link the docs). */
|
|
160
|
+
docsUrl: string;
|
|
161
|
+
/** Human-readable guidance string (docs + install or fallback). */
|
|
162
|
+
guidance: string;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// ── Pure probe ────────────────────────────────────────────────────────────────
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Probe whether a CLI binary is on PATH. Pure read — never installs anything.
|
|
169
|
+
* Uses `command -v` (POSIX builtin) with stdio suppressed; no shell metachar
|
|
170
|
+
* injection because `binary` comes from the closed CLI_SPECS table, never user input.
|
|
171
|
+
*
|
|
172
|
+
* @param binary - The binary name to probe (from a CliSpec).
|
|
173
|
+
* @returns true if found on PATH, false otherwise.
|
|
174
|
+
*/
|
|
175
|
+
export function isCliInstalled(binary: string): boolean {
|
|
176
|
+
try {
|
|
177
|
+
execSync(`command -v ${binary}`, { stdio: "pipe", timeout: 5000 });
|
|
178
|
+
return true;
|
|
179
|
+
} catch {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// ── Decision (no side effects, no install) ────────────────────────────────────
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Decide what onboarding should do about the source platform's CLI.
|
|
188
|
+
* PURE: probes PATH (a read) and returns a plan. NEVER installs. NEVER asks.
|
|
189
|
+
*
|
|
190
|
+
* The returned plan tells the caller:
|
|
191
|
+
* - whether a CLI is even needed (`not-required`),
|
|
192
|
+
* - whether it is already present (`present`),
|
|
193
|
+
* - whether it is missing-but-installable (`missing-installable` → caller MUST ask
|
|
194
|
+
* for approval, THEN call `runCliInstall`),
|
|
195
|
+
* - or missing-with-no-installer (`missing-no-installer` → caller shows REST/file fallback).
|
|
196
|
+
*
|
|
197
|
+
* @param platform - The chosen source platform.
|
|
198
|
+
* @param probe - Injectable PATH probe (defaults to isCliInstalled) — enables
|
|
199
|
+
* deterministic unit tests without touching the real PATH.
|
|
200
|
+
*/
|
|
201
|
+
export function planCliEnsure(
|
|
202
|
+
platform: SourcePlatform,
|
|
203
|
+
probe: CliProbe = isCliInstalled
|
|
204
|
+
): CliEnsurePlan {
|
|
205
|
+
const spec = CLI_SPECS[platform];
|
|
206
|
+
|
|
207
|
+
// Platforms with no binary need no CLI at all.
|
|
208
|
+
if (spec.binary === null) {
|
|
209
|
+
return {
|
|
210
|
+
platform,
|
|
211
|
+
status: "not-required",
|
|
212
|
+
spec,
|
|
213
|
+
installCommand: null,
|
|
214
|
+
approvalRequired: false,
|
|
215
|
+
docsUrl: spec.docsUrl,
|
|
216
|
+
guidance:
|
|
217
|
+
`${spec.label} — no CLI required.\n` +
|
|
218
|
+
`Docs: ${spec.docsUrl}\n` +
|
|
219
|
+
`${spec.fallbackNote}`,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const present = probe(spec.binary);
|
|
224
|
+
if (present) {
|
|
225
|
+
return {
|
|
226
|
+
platform,
|
|
227
|
+
status: "present",
|
|
228
|
+
spec,
|
|
229
|
+
installCommand: null,
|
|
230
|
+
approvalRequired: false,
|
|
231
|
+
docsUrl: spec.docsUrl,
|
|
232
|
+
guidance:
|
|
233
|
+
`${spec.label} detected on PATH (\`${spec.binary}\`).\n` +
|
|
234
|
+
`Docs: ${spec.docsUrl}`,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Missing. Is there an installer?
|
|
239
|
+
if (spec.installCommand !== null) {
|
|
240
|
+
return {
|
|
241
|
+
platform,
|
|
242
|
+
status: "missing-installable",
|
|
243
|
+
spec,
|
|
244
|
+
installCommand: spec.installCommand,
|
|
245
|
+
// INVARIANT: installable-but-missing ALWAYS requires approval. Never auto-install.
|
|
246
|
+
approvalRequired: true,
|
|
247
|
+
docsUrl: spec.docsUrl,
|
|
248
|
+
guidance:
|
|
249
|
+
`${spec.label} (\`${spec.binary}\`) is NOT installed.\n` +
|
|
250
|
+
`Official docs: ${spec.docsUrl}\n` +
|
|
251
|
+
`Suggested install: ${spec.installCommand}\n` +
|
|
252
|
+
`(You will be asked to approve before anything is installed. ` +
|
|
253
|
+
`Decline to continue with the REST/file fallback instead.)`,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
return {
|
|
258
|
+
platform,
|
|
259
|
+
status: "missing-no-installer",
|
|
260
|
+
spec,
|
|
261
|
+
installCommand: null,
|
|
262
|
+
approvalRequired: false,
|
|
263
|
+
docsUrl: spec.docsUrl,
|
|
264
|
+
guidance:
|
|
265
|
+
`${spec.label} is not installed and has no single install command.\n` +
|
|
266
|
+
`Docs: ${spec.docsUrl}\n` +
|
|
267
|
+
`${spec.fallbackNote}`,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// ── Install (caller-gated — assumes approval already obtained) ─────────────────
|
|
272
|
+
|
|
273
|
+
export interface CliInstallResult {
|
|
274
|
+
ok: boolean;
|
|
275
|
+
command: string;
|
|
276
|
+
/** stdout/stderr of the install command (truncated). */
|
|
277
|
+
output: string;
|
|
278
|
+
error?: string;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Run a CLI's documented install command.
|
|
283
|
+
*
|
|
284
|
+
* ⚠ APPROVAL CONTRACT: this function does NOT ask the user. It assumes the caller
|
|
285
|
+
* has ALREADY obtained explicit user approval (AskUserQuestion / chat y/N). Calling
|
|
286
|
+
* this without prior approval violates the no-silent-install rule. The onboarding
|
|
287
|
+
* flow in cli/init.ts is the only sanctioned caller and it always asks first.
|
|
288
|
+
*
|
|
289
|
+
* Throws if `plan.installCommand` is null (nothing to install) — a programming error
|
|
290
|
+
* that should never reach here for a non-installable plan.
|
|
291
|
+
*
|
|
292
|
+
* @param plan - A `missing-installable` plan from planCliEnsure.
|
|
293
|
+
* @returns Structured result; never throws on install failure (collected in `error`).
|
|
294
|
+
*/
|
|
295
|
+
export function runCliInstall(plan: CliEnsurePlan): CliInstallResult {
|
|
296
|
+
if (plan.installCommand === null) {
|
|
297
|
+
throw new Error(
|
|
298
|
+
`runCliInstall called for platform "${plan.platform}" with no install command ` +
|
|
299
|
+
`(status: ${plan.status}). This is a caller bug — only "missing-installable" ` +
|
|
300
|
+
`plans are installable.`
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
const command = plan.installCommand;
|
|
304
|
+
try {
|
|
305
|
+
const output = execSync(command, {
|
|
306
|
+
stdio: "pipe",
|
|
307
|
+
encoding: "utf8",
|
|
308
|
+
timeout: 300000, // generous — CLI installs (pip/npm) can be slow
|
|
309
|
+
});
|
|
310
|
+
return { ok: true, command, output: String(output).slice(0, 4000) };
|
|
311
|
+
} catch (err) {
|
|
312
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
313
|
+
return { ok: false, command, output: "", error: message };
|
|
314
|
+
}
|
|
315
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/setup/reconfigure.ts
|
|
3
|
+
* AGENT-HANDLE route-signal (W9-10 simplify — FR-003)
|
|
4
|
+
*
|
|
5
|
+
* Backs up the current config and emits a route-signal JSON so the agent knows
|
|
6
|
+
* a fresh onboarding pass is needed. The interactive re-onboarding itself is
|
|
7
|
+
* handled by the agent reading SKILL.md + references/workflows/onboarding.md
|
|
8
|
+
* inline — this script does NOT orchestrate the questions or write new config.
|
|
9
|
+
*
|
|
10
|
+
* Usage: bun scripts/cli/run.sh scripts/setup/reconfigure.ts [project-root]
|
|
11
|
+
* Or: pnpx @mutagent/diagnostics init --mode reconfigure [project-root]
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { existsSync, copyFileSync, mkdirSync } from "fs";
|
|
15
|
+
import { resolve } from "path";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Route-signal emitted to the agent. The agent reads `action` and `message`,
|
|
19
|
+
* then re-runs onboarding.md Phase 1..8 inline. It does NOT dispatch a sub-agent.
|
|
20
|
+
*/
|
|
21
|
+
export interface ReconfigureSignal {
|
|
22
|
+
action: "reconfigure";
|
|
23
|
+
backupPath: string | null;
|
|
24
|
+
backupCreated: boolean;
|
|
25
|
+
message: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** @deprecated Use ReconfigureSignal instead. Kept for backward compatibility. */
|
|
29
|
+
export type ReconfigureResult = ReconfigureSignal;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Back up the existing config and return a route-signal for the agent.
|
|
33
|
+
* The agent is responsible for re-running onboarding.md inline after receiving this.
|
|
34
|
+
*/
|
|
35
|
+
export function prepareReconfigure(projectRoot: string): ReconfigureSignal {
|
|
36
|
+
// Unified local config (operator decision 2026-06-29): <root>/.mutagent/config.yaml.
|
|
37
|
+
// Re-onboarding rewrites ONLY the `diagnostics:` section (onboarding.md is
|
|
38
|
+
// section-aware) — the timestamped backup preserves the whole file first.
|
|
39
|
+
const configDir = resolve(projectRoot, ".mutagent");
|
|
40
|
+
const configPath = resolve(configDir, "config.yaml");
|
|
41
|
+
const backupPath = resolve(configDir, `config.yaml.bak.${Date.now()}`);
|
|
42
|
+
|
|
43
|
+
if (!existsSync(configPath)) {
|
|
44
|
+
return {
|
|
45
|
+
action: "reconfigure",
|
|
46
|
+
backupPath: null,
|
|
47
|
+
backupCreated: false,
|
|
48
|
+
message: "No existing config found — starting fresh onboarding. Load references/workflows/onboarding.md.",
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
mkdirSync(configDir, { recursive: true });
|
|
54
|
+
copyFileSync(configPath, backupPath);
|
|
55
|
+
return {
|
|
56
|
+
action: "reconfigure",
|
|
57
|
+
backupPath,
|
|
58
|
+
backupCreated: true,
|
|
59
|
+
message: `Config backed up to ${backupPath}. Load references/workflows/onboarding.md to reconfigure.`,
|
|
60
|
+
};
|
|
61
|
+
} catch (err) {
|
|
62
|
+
return {
|
|
63
|
+
action: "reconfigure",
|
|
64
|
+
backupPath: null,
|
|
65
|
+
backupCreated: false,
|
|
66
|
+
message: `Warning: could not back up config: ${err}. Load references/workflows/onboarding.md to reconfigure.`,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// CLI entrypoint — emits route-signal JSON; agent handles the rest
|
|
72
|
+
if (import.meta.main) {
|
|
73
|
+
const projectRoot = process.argv[2] ?? process.cwd();
|
|
74
|
+
const signal = prepareReconfigure(projectRoot);
|
|
75
|
+
process.stdout.write(JSON.stringify(signal, null, 2) + "\n");
|
|
76
|
+
process.exit(0);
|
|
77
|
+
}
|
package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/setup/verify-agents.ts
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/setup/verify-agents.ts
|
|
3
|
+
* R-SELF-01-d: Agent-spin verification boundary check.
|
|
4
|
+
*
|
|
5
|
+
* After install-agents.ts symlinks the 3 agent .md files, this script verifies
|
|
6
|
+
* that each is present at its installed location AND that its YAML frontmatter
|
|
7
|
+
* declares the expected `name:` field. This prevents the recurring failure mode
|
|
8
|
+
* where agents are "installed" but the registry never picked them up.
|
|
9
|
+
*
|
|
10
|
+
* Usage: bun scripts/cli/run.sh scripts/setup/verify-agents.ts [project-root] [--scope=project|user]
|
|
11
|
+
* Exit 0 = all agents ready
|
|
12
|
+
* Exit 1 = one or more agents missing/invalid/pending restart
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { existsSync, readFileSync, lstatSync } from "fs";
|
|
16
|
+
import { join, resolve } from "path";
|
|
17
|
+
import { homedir } from "os";
|
|
18
|
+
|
|
19
|
+
export type AgentBoundaryState = "ready" | "missing" | "invalid" | "pending-restart";
|
|
20
|
+
|
|
21
|
+
export interface AgentVerifyEntry {
|
|
22
|
+
agentName: string;
|
|
23
|
+
expectedName: string;
|
|
24
|
+
installedPath: string;
|
|
25
|
+
state: AgentBoundaryState;
|
|
26
|
+
note?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface AgentVerifyResult {
|
|
30
|
+
/**
|
|
31
|
+
* I-009: orchestrator field removed from top-level schema.
|
|
32
|
+
* diagnostics-orchestrator is retired (P2 pivot — inline protocol only).
|
|
33
|
+
* Summary is derived from entries[] — see formatVerifyResult() + allReady check.
|
|
34
|
+
*/
|
|
35
|
+
analyzer: AgentBoundaryState;
|
|
36
|
+
/** M10: vendored WRITE actor — the apply on-ramp (replaces the retired apply-worker). */
|
|
37
|
+
aiEngineer: AgentBoundaryState;
|
|
38
|
+
/** M10: vendored VERIFY actor — the applied-remedy rubric + spec reconcile. */
|
|
39
|
+
aiArchitect: AgentBoundaryState;
|
|
40
|
+
/** True when at least one agent was installed but the session has NOT been restarted */
|
|
41
|
+
harnessRestartRequired: boolean;
|
|
42
|
+
/** Marker written by install-agents.ts to indicate a post-install restart is needed */
|
|
43
|
+
restartMarkerExists: boolean;
|
|
44
|
+
entries: AgentVerifyEntry[];
|
|
45
|
+
errors: string[];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* P2 pivot: orchestrator sub-agent retired — procedure is now an inline protocol.
|
|
50
|
+
* The diagnostics-apply-worker is RETIRED (M9); apply delegates to the shared
|
|
51
|
+
* `mutagent-cli apply` transport driven by the VENDORED actors (M10): ai-engineer
|
|
52
|
+
* (WRITE) + ai-architect (VERIFY), bundled here so apply works WITHOUT the full Helix
|
|
53
|
+
* bundle (standalone `pnpx @mutagent/diagnostics init`). The analyzer is the RCA leaf.
|
|
54
|
+
*/
|
|
55
|
+
const EXPECTED_AGENTS: Array<{ filename: string; expectedName: string; key: keyof Pick<AgentVerifyResult, "analyzer" | "aiEngineer" | "aiArchitect"> }> = [
|
|
56
|
+
{ filename: "diagnostics-analyzer.md", expectedName: "diagnostics-analyzer", key: "analyzer" },
|
|
57
|
+
{ filename: "ai-engineer.md", expectedName: "ai-engineer", key: "aiEngineer" },
|
|
58
|
+
{ filename: "ai-architect.md", expectedName: "ai-architect", key: "aiArchitect" },
|
|
59
|
+
];
|
|
60
|
+
|
|
61
|
+
/** Minimal YAML frontmatter parser — extracts `name:` field only */
|
|
62
|
+
function extractFrontmatterName(content: string): string | null {
|
|
63
|
+
// Frontmatter is delimited by --- at line start
|
|
64
|
+
const match = content.match(/^---\s*\n([\s\S]*?)\n---/m);
|
|
65
|
+
if (!match) return null;
|
|
66
|
+
const frontmatter = match[1];
|
|
67
|
+
const nameLine = frontmatter.match(/^name:\s*(.+)$/m);
|
|
68
|
+
if (!nameLine) return null;
|
|
69
|
+
return nameLine[1].trim().replace(/^['"]|['"]$/g, ""); // strip optional quotes
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function verifyAgents(
|
|
73
|
+
projectRoot: string,
|
|
74
|
+
scope: "project" | "user" = "project"
|
|
75
|
+
): AgentVerifyResult {
|
|
76
|
+
const result: AgentVerifyResult = {
|
|
77
|
+
// I-009: orchestrator field removed — summary derived from entries[] only.
|
|
78
|
+
analyzer: "missing",
|
|
79
|
+
aiEngineer: "missing",
|
|
80
|
+
aiArchitect: "missing",
|
|
81
|
+
harnessRestartRequired: false,
|
|
82
|
+
restartMarkerExists: false,
|
|
83
|
+
entries: [],
|
|
84
|
+
errors: [],
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
// Resolve the target agents directory
|
|
88
|
+
let agentsDir: string;
|
|
89
|
+
if (scope === "project") {
|
|
90
|
+
agentsDir = join(projectRoot, ".claude", "agents");
|
|
91
|
+
} else {
|
|
92
|
+
agentsDir = join(homedir(), ".claude", "agents");
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Check for restart marker written by install-agents.ts
|
|
96
|
+
const restartMarkerPath = join(agentsDir, ".mutagent/diagnostics-restart-required");
|
|
97
|
+
if (existsSync(restartMarkerPath)) {
|
|
98
|
+
result.restartMarkerExists = true;
|
|
99
|
+
result.harnessRestartRequired = true;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
for (const agent of EXPECTED_AGENTS) {
|
|
103
|
+
const installedPath = join(agentsDir, agent.filename);
|
|
104
|
+
const entry: AgentVerifyEntry = {
|
|
105
|
+
agentName: agent.expectedName,
|
|
106
|
+
expectedName: agent.expectedName,
|
|
107
|
+
installedPath,
|
|
108
|
+
state: "missing",
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
if (!existsSync(installedPath)) {
|
|
112
|
+
entry.state = "missing";
|
|
113
|
+
entry.note = `File not found at ${installedPath}. Run: bun scripts/cli/run.sh scripts/cli/install-agents.ts "${projectRoot}" --scope=${scope}`;
|
|
114
|
+
result.entries.push(entry);
|
|
115
|
+
result[agent.key] = "missing";
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Check it's a readable file (or valid symlink)
|
|
120
|
+
let content: string;
|
|
121
|
+
try {
|
|
122
|
+
const stat = lstatSync(installedPath);
|
|
123
|
+
if (stat.isSymbolicLink()) {
|
|
124
|
+
// resolve() already follows symlinks for existsSync, but we read actual content
|
|
125
|
+
}
|
|
126
|
+
content = readFileSync(installedPath, "utf8");
|
|
127
|
+
} catch (err) {
|
|
128
|
+
entry.state = "invalid";
|
|
129
|
+
entry.note = `Could not read ${installedPath}: ${err}`;
|
|
130
|
+
result.entries.push(entry);
|
|
131
|
+
result[agent.key] = "invalid";
|
|
132
|
+
result.errors.push(`${agent.filename}: read error — ${err}`);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Validate frontmatter name
|
|
137
|
+
const parsedName = extractFrontmatterName(content);
|
|
138
|
+
if (!parsedName) {
|
|
139
|
+
entry.state = "invalid";
|
|
140
|
+
entry.note = `No YAML frontmatter found in ${installedPath}. File may be corrupted or wrong format.`;
|
|
141
|
+
result.entries.push(entry);
|
|
142
|
+
result[agent.key] = "invalid";
|
|
143
|
+
result.errors.push(`${agent.filename}: missing frontmatter`);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (parsedName !== agent.expectedName) {
|
|
148
|
+
entry.state = "invalid";
|
|
149
|
+
entry.note = `Frontmatter name mismatch: expected "${agent.expectedName}", got "${parsedName}". File at ${installedPath} may be a different agent.`;
|
|
150
|
+
result.entries.push(entry);
|
|
151
|
+
result[agent.key] = "invalid";
|
|
152
|
+
result.errors.push(`${agent.filename}: name mismatch ("${parsedName}" vs "${agent.expectedName}")`);
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// All checks passed — but if restart is required, state is pending-restart
|
|
157
|
+
if (result.harnessRestartRequired) {
|
|
158
|
+
entry.state = "pending-restart";
|
|
159
|
+
entry.note = "Agent file is valid. Session restart required for registry to pick up the new subagent_type.";
|
|
160
|
+
result[agent.key] = "pending-restart";
|
|
161
|
+
} else {
|
|
162
|
+
entry.state = "ready";
|
|
163
|
+
result[agent.key] = "ready";
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
result.entries.push(entry);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return result;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export function formatVerifyResult(res: AgentVerifyResult): string {
|
|
173
|
+
const lines: string[] = ["[verify-agents]"];
|
|
174
|
+
for (const e of res.entries) {
|
|
175
|
+
const icon = e.state === "ready" ? "✓" : e.state === "pending-restart" ? "⏳" : e.state === "invalid" ? "✗" : "✗";
|
|
176
|
+
lines.push(` ${icon} ${e.agentName}: ${e.state}${e.note ? `\n → ${e.note}` : ""}`);
|
|
177
|
+
}
|
|
178
|
+
if (res.harnessRestartRequired) {
|
|
179
|
+
lines.push("");
|
|
180
|
+
lines.push("⚠ RESTART REQUIRED: Restart your Claude Code session before running diagnostics.");
|
|
181
|
+
lines.push(" The subagent_type registry is loaded at session boot — new agents are invisible until restart.");
|
|
182
|
+
}
|
|
183
|
+
if (res.errors.length > 0) {
|
|
184
|
+
lines.push("");
|
|
185
|
+
lines.push("Errors:");
|
|
186
|
+
for (const e of res.errors) lines.push(` - ${e}`);
|
|
187
|
+
}
|
|
188
|
+
return lines.join("\n");
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// CLI entrypoint
|
|
192
|
+
if (import.meta.main) {
|
|
193
|
+
const args = process.argv.slice(2);
|
|
194
|
+
const positional = args.filter((a) => !a.startsWith("--"));
|
|
195
|
+
const projectRoot = resolve(positional[0] ?? process.cwd());
|
|
196
|
+
const scopeArg = args.find((a) => a.startsWith("--scope="));
|
|
197
|
+
const scope: "project" | "user" = scopeArg?.split("=")[1] === "user" ? "user" : "project";
|
|
198
|
+
|
|
199
|
+
const result = verifyAgents(projectRoot, scope);
|
|
200
|
+
process.stdout.write(JSON.stringify(result, null, 2) + "\n");
|
|
201
|
+
process.stderr.write(formatVerifyResult(result) + "\n");
|
|
202
|
+
|
|
203
|
+
// I-009: summary derived from entries[] — orchestrator key removed from top-level schema.
|
|
204
|
+
const allReady =
|
|
205
|
+
result.analyzer === "ready" && result.aiEngineer === "ready" && result.aiArchitect === "ready";
|
|
206
|
+
process.exit(allReady ? 0 : 1);
|
|
207
|
+
}
|