@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,601 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/cli/init.ts
|
|
3
|
+
* Cross-platform skill installer + setup routing.
|
|
4
|
+
* Invoked as: pnpx @mutagent/evaluator init
|
|
5
|
+
*
|
|
6
|
+
* Mirrors the mutagent-diagnostics installer BEHAVIOR (project-local default,
|
|
7
|
+
* --global opt-in, platform detection, copy skill tree + agents, emit an
|
|
8
|
+
* InitDescriptor JSON) — but is SELF-CONTAINED: it imports no setup/* helper
|
|
9
|
+
* modules (the evaluator does not ship them) so `init` works OFFLINE from the
|
|
10
|
+
* package alone.
|
|
11
|
+
*
|
|
12
|
+
* Modes (via --mode <value> or legacy flag aliases):
|
|
13
|
+
* --mode init (DEFAULT) — install skill+agents for detected platforms, then emit
|
|
14
|
+
* InitDescriptor JSON. The pnpx invocation is this mode.
|
|
15
|
+
* --mode install — cross-platform installer only; alias: --install
|
|
16
|
+
* --mode reconfigure — emit a reconfigure-signal descriptor; alias: --reconfigure
|
|
17
|
+
*
|
|
18
|
+
* Other flags (work across modes):
|
|
19
|
+
* --yes Non-interactive: select all detected platforms
|
|
20
|
+
* --force Force-overwrite existing skill/agent files during install
|
|
21
|
+
* --help Show usage
|
|
22
|
+
*
|
|
23
|
+
* Install scope (operator directive — respect the project working directory):
|
|
24
|
+
* project (DEFAULT) — install into the directory the user ran `pnpx … init` in:
|
|
25
|
+
* Claude Code → <cwd>/.claude/skills|agents, Codex → <cwd>/.codex/skills|agents.
|
|
26
|
+
* global (--global) — install into the home dir:
|
|
27
|
+
* Claude Code → ~/.claude/…, Codex → ~/.codex/….
|
|
28
|
+
* Cursor is always cwd-relative (.cursor/ in the project).
|
|
29
|
+
* DETECTION (does the platform exist on this machine?) consults the home/env
|
|
30
|
+
* markers — a platform stays installable into the project even when only the
|
|
31
|
+
* global marker exists (the user is clearly using that runtime).
|
|
32
|
+
*
|
|
33
|
+
* cwd discipline (mirrors diagnostics' W9-fix, cwd-leak family): the SKILL SOURCE
|
|
34
|
+
* dir is resolved from import.meta (correct through symlink chains); the install
|
|
35
|
+
* TARGET root is the user's invocation cwd — NEVER the script dir. Overriding the
|
|
36
|
+
* child cwd to the skill dir would have made init install into the skill package
|
|
37
|
+
* itself.
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
import {
|
|
41
|
+
existsSync, readdirSync, realpathSync,
|
|
42
|
+
mkdirSync, cpSync, copyFileSync,
|
|
43
|
+
} from "node:fs";
|
|
44
|
+
import { join, resolve } from "node:path";
|
|
45
|
+
import { homedir } from "node:os";
|
|
46
|
+
import { execSync } from "node:child_process";
|
|
47
|
+
|
|
48
|
+
// ── Types ───────────────────────────────────────────────────────────────────
|
|
49
|
+
|
|
50
|
+
export type Runtime = "claude-code" | "codex" | "cursor" | "opencode" | "generic";
|
|
51
|
+
|
|
52
|
+
/** Single dispatch flag — all internal modes route through this. */
|
|
53
|
+
export type InitMode = "init" | "install" | "reconfigure";
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Install scope — WHERE skill+agent files land.
|
|
57
|
+
* "project" (DEFAULT) → the directory the user invoked from (process.cwd()).
|
|
58
|
+
* "global" → the home directory (~/.claude, ~/.codex). Opt-in via --global.
|
|
59
|
+
*/
|
|
60
|
+
export type Scope = "project" | "global";
|
|
61
|
+
|
|
62
|
+
export type PlatformId = "claude-code" | "codex" | "cursor";
|
|
63
|
+
|
|
64
|
+
export interface InitDescriptor {
|
|
65
|
+
runtime: Runtime;
|
|
66
|
+
projectRoot: string;
|
|
67
|
+
scope: Scope;
|
|
68
|
+
/**
|
|
69
|
+
* "protocol" = setup complete; load SKILL.md and follow inline (the parent
|
|
70
|
+
* session is the orchestrator — do NOT dispatch a coordinator).
|
|
71
|
+
* "reconfigure" = re-run onboarding.
|
|
72
|
+
*/
|
|
73
|
+
nextAction: "protocol" | "reconfigure";
|
|
74
|
+
message: string;
|
|
75
|
+
/** true if the host's .claude/agents/ (scoped) already has our agents. */
|
|
76
|
+
agentsInstalled: boolean;
|
|
77
|
+
/** Hint command to install agents if agentsInstalled === false. */
|
|
78
|
+
agentsInstallHint?: string;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// ── Flag parsing ────────────────────────────────────────────────────────────
|
|
82
|
+
|
|
83
|
+
/** Flags that consume the FOLLOWING argv token as their value (not a positional). */
|
|
84
|
+
const VALUE_FLAGS = new Set(["--mode"]);
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Extract bare positional args, skipping flags AND the value token that
|
|
88
|
+
* immediately follows a value-flag (so `init --mode install` never mistakes
|
|
89
|
+
* "install" for the projectRoot positional — the diagnostics W9-fix).
|
|
90
|
+
*/
|
|
91
|
+
export function parsePositionals(argv: string[]): string[] {
|
|
92
|
+
const positionals: string[] = [];
|
|
93
|
+
for (let i = 0; i < argv.length; i++) {
|
|
94
|
+
const tok = argv[i]!;
|
|
95
|
+
if (tok.startsWith("--")) {
|
|
96
|
+
if (VALUE_FLAGS.has(tok)) i++; // skip this flag's value token
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
positionals.push(tok);
|
|
100
|
+
}
|
|
101
|
+
return positionals;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** Resolve install scope. DEFAULT is "project"; `--global` opts into the home dir. */
|
|
105
|
+
export function resolveScope(argv: string[]): Scope {
|
|
106
|
+
return argv.includes("--global") ? "global" : "project";
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Resolve --mode. Legacy flags (--install, --reconfigure) map to their --mode
|
|
111
|
+
* equivalents. Priority: explicit --mode <value> > legacy alias > default ("init").
|
|
112
|
+
*/
|
|
113
|
+
export function resolveMode(argv: string[]): InitMode {
|
|
114
|
+
const modeIdx = argv.indexOf("--mode");
|
|
115
|
+
if (modeIdx !== -1) {
|
|
116
|
+
const val = argv[modeIdx + 1];
|
|
117
|
+
if (val === "init" || val === "install" || val === "reconfigure") return val;
|
|
118
|
+
process.stderr.write(
|
|
119
|
+
`[init] WARNING: unknown --mode value "${val ?? ""}"; falling back to "init".\n`
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
if (argv.includes("--install")) return "install";
|
|
123
|
+
if (argv.includes("--reconfigure")) return "reconfigure";
|
|
124
|
+
return "init";
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Detect the host coding-agent runtime from environment cues. Used only to
|
|
129
|
+
* annotate the descriptor; it does NOT gate which platforms get installed.
|
|
130
|
+
*/
|
|
131
|
+
export function detectRuntime(): Runtime {
|
|
132
|
+
if (process.env.CLAUDE_CODE || process.env.ANTHROPIC_API_KEY) return "claude-code";
|
|
133
|
+
if (process.env.OPENAI_API_KEY && !process.env.ANTHROPIC_API_KEY) return "codex";
|
|
134
|
+
if (process.env.CURSOR_WORKSPACE_ID || process.env.CURSOR_VERSION) return "cursor";
|
|
135
|
+
if (process.env.OPENCODE_SESSION_ID) return "opencode";
|
|
136
|
+
return "generic";
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// ── Platform detection ──────────────────────────────────────────────────────
|
|
140
|
+
|
|
141
|
+
export interface DetectedPlatform {
|
|
142
|
+
id: PlatformId;
|
|
143
|
+
label: string;
|
|
144
|
+
/** Human-readable description of what was probed. */
|
|
145
|
+
detectionMarker: string;
|
|
146
|
+
/** Whether the platform's marker was found on this machine. */
|
|
147
|
+
detected: boolean;
|
|
148
|
+
/** Where the skill directory should be installed. */
|
|
149
|
+
skillInstallPath: string;
|
|
150
|
+
/** Where agent files should be installed, or null if not applicable. */
|
|
151
|
+
agentsInstallPath: string | null;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Probe the filesystem for installed coding-agent platforms (Claude Code → Codex
|
|
156
|
+
* → Cursor). Detection markers always use the HOME dir; the INSTALL TARGET
|
|
157
|
+
* follows `scope` (project → <cwd>/…, global → <home>/…). A platform stays
|
|
158
|
+
* installable into the project even when only the global marker exists.
|
|
159
|
+
*/
|
|
160
|
+
export function detectInstalledPlatforms(
|
|
161
|
+
cwd: string = process.cwd(),
|
|
162
|
+
scope: Scope = "project"
|
|
163
|
+
): DetectedPlatform[] {
|
|
164
|
+
const home = homedir();
|
|
165
|
+
const claudeRoot = scope === "global" ? join(home, ".claude") : join(cwd, ".claude");
|
|
166
|
+
const codexRoot = scope === "global" ? join(home, ".codex") : join(cwd, ".codex");
|
|
167
|
+
return [
|
|
168
|
+
{
|
|
169
|
+
id: "claude-code",
|
|
170
|
+
label: "Claude Code",
|
|
171
|
+
detectionMarker: join(home, ".claude"),
|
|
172
|
+
detected: existsSync(join(home, ".claude")),
|
|
173
|
+
skillInstallPath: join(claudeRoot, "skills", "mutagent-evaluator"),
|
|
174
|
+
agentsInstallPath: join(claudeRoot, "agents"),
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
id: "codex",
|
|
178
|
+
label: "Codex",
|
|
179
|
+
detectionMarker: join(home, ".codex"),
|
|
180
|
+
detected: existsSync(join(home, ".codex")),
|
|
181
|
+
skillInstallPath: join(codexRoot, "skills", "mutagent-evaluator"),
|
|
182
|
+
agentsInstallPath: join(codexRoot, "agents"),
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
id: "cursor",
|
|
186
|
+
label: "Cursor",
|
|
187
|
+
detectionMarker: join(cwd, ".cursor"),
|
|
188
|
+
detected: existsSync(join(cwd, ".cursor")),
|
|
189
|
+
skillInstallPath: join(cwd, ".cursor", "rules", "mutagent-evaluator"),
|
|
190
|
+
agentsInstallPath: null, // no agent primitive yet
|
|
191
|
+
},
|
|
192
|
+
];
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Are our evaluator agents installed in the SCOPED .claude/agents dir?
|
|
197
|
+
* Project-first: a project install is NEVER satisfied by the home dir (mirrors
|
|
198
|
+
* the diagnostics W9-fix — global agents must not mask a missing project install).
|
|
199
|
+
*/
|
|
200
|
+
export function checkAgentsInstalled(
|
|
201
|
+
skillSourceDir: string,
|
|
202
|
+
projectRoot: string,
|
|
203
|
+
scope: Scope = "project"
|
|
204
|
+
): boolean {
|
|
205
|
+
const agentsSrc = join(skillSourceDir, "assets", "agents");
|
|
206
|
+
if (!existsSync(agentsSrc)) return false;
|
|
207
|
+
const expected = readdirSync(agentsSrc).filter((f) => f.endsWith(".md"));
|
|
208
|
+
if (expected.length === 0) return false;
|
|
209
|
+
|
|
210
|
+
const scopedDir =
|
|
211
|
+
scope === "global"
|
|
212
|
+
? join(homedir(), ".claude", "agents")
|
|
213
|
+
: join(projectRoot, ".claude", "agents");
|
|
214
|
+
if (!existsSync(scopedDir)) return false;
|
|
215
|
+
|
|
216
|
+
return expected.every((f) => existsSync(join(scopedDir, f)));
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// ── Single-platform install ─────────────────────────────────────────────────
|
|
220
|
+
|
|
221
|
+
export interface PlatformInstallResult {
|
|
222
|
+
platform: PlatformId;
|
|
223
|
+
success: boolean;
|
|
224
|
+
steps: Array<{ step: string; ok: boolean; note?: string }>;
|
|
225
|
+
errors: string[];
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Install mutagent-evaluator to a single detected platform:
|
|
230
|
+
* copy skill tree → copy agents/*.md into the platform agents dir → doctor verify.
|
|
231
|
+
*
|
|
232
|
+
* Agent copy is a plain .md file copy (Claude Code + Codex both read markdown
|
|
233
|
+
* agent defs in their `agents/` dir; the evaluator ships no MD→TOML transcoder).
|
|
234
|
+
* Cursor has no agent primitive — agents are skipped there.
|
|
235
|
+
*/
|
|
236
|
+
export function installToPlatform(
|
|
237
|
+
platform: DetectedPlatform,
|
|
238
|
+
skillSourceDir: string,
|
|
239
|
+
force = false
|
|
240
|
+
): PlatformInstallResult {
|
|
241
|
+
const result: PlatformInstallResult = {
|
|
242
|
+
platform: platform.id,
|
|
243
|
+
success: false,
|
|
244
|
+
steps: [],
|
|
245
|
+
errors: [],
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
// ── Step 1: copy the skill tree ──────────────────────────────────────────
|
|
249
|
+
const skillDest = platform.skillInstallPath;
|
|
250
|
+
try {
|
|
251
|
+
if (existsSync(skillDest) && !force) {
|
|
252
|
+
result.steps.push({
|
|
253
|
+
step: "copy-skill",
|
|
254
|
+
ok: true,
|
|
255
|
+
note: `Skill already exists at ${skillDest} (use --force to overwrite)`,
|
|
256
|
+
});
|
|
257
|
+
} else {
|
|
258
|
+
mkdirSync(skillDest, { recursive: true });
|
|
259
|
+
cpSync(skillSourceDir, skillDest, { recursive: true, force: true });
|
|
260
|
+
result.steps.push({ step: "copy-skill", ok: true, note: `Copied to ${skillDest}` });
|
|
261
|
+
}
|
|
262
|
+
} catch (err) {
|
|
263
|
+
const msg = `Failed to copy skill to ${skillDest}: ${err instanceof Error ? err.message : String(err)}`;
|
|
264
|
+
result.steps.push({ step: "copy-skill", ok: false, note: msg });
|
|
265
|
+
result.errors.push(msg);
|
|
266
|
+
return result;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// ── Step 2: install agents (plain .md copy) ──────────────────────────────
|
|
270
|
+
const agentsDir = platform.agentsInstallPath;
|
|
271
|
+
if (agentsDir !== null) {
|
|
272
|
+
const agentsSrcDir = join(skillSourceDir, "assets", "agents");
|
|
273
|
+
if (existsSync(agentsSrcDir)) {
|
|
274
|
+
const agentFiles = readdirSync(agentsSrcDir).filter((f) => f.endsWith(".md"));
|
|
275
|
+
try {
|
|
276
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
277
|
+
let installed = 0;
|
|
278
|
+
let skipped = 0;
|
|
279
|
+
for (const fname of agentFiles) {
|
|
280
|
+
const dest = join(agentsDir, fname);
|
|
281
|
+
if (existsSync(dest) && !force) {
|
|
282
|
+
skipped++;
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
copyFileSync(join(agentsSrcDir, fname), dest);
|
|
286
|
+
installed++;
|
|
287
|
+
}
|
|
288
|
+
result.steps.push({
|
|
289
|
+
step: "install-agents",
|
|
290
|
+
ok: true,
|
|
291
|
+
note: `${installed} agent(s) installed${skipped ? `, ${skipped} skipped (exists; use --force)` : ""} in ${agentsDir}`,
|
|
292
|
+
});
|
|
293
|
+
} catch (err) {
|
|
294
|
+
const msg = `Failed to install agents to ${agentsDir}: ${err instanceof Error ? err.message : String(err)}`;
|
|
295
|
+
result.steps.push({ step: "install-agents", ok: false, note: msg });
|
|
296
|
+
result.errors.push(msg);
|
|
297
|
+
}
|
|
298
|
+
} else {
|
|
299
|
+
result.steps.push({ step: "install-agents", ok: true, note: "No assets/agents/ dir — skipped" });
|
|
300
|
+
}
|
|
301
|
+
} else {
|
|
302
|
+
result.steps.push({
|
|
303
|
+
step: "install-agents",
|
|
304
|
+
ok: true,
|
|
305
|
+
note: `${platform.label} has no agent primitive — agents skipped`,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// ── Step 3: post-install doctor verify ───────────────────────────────────
|
|
310
|
+
const scriptDir = realpathSync(
|
|
311
|
+
import.meta.dirname ?? import.meta.url.replace(/^file:\/\//, "").replace(/\/[^/]+$/, "")
|
|
312
|
+
);
|
|
313
|
+
const doctorScript = join(scriptDir, "doctor.ts");
|
|
314
|
+
const runSh = join(scriptDir, "run.sh");
|
|
315
|
+
try {
|
|
316
|
+
if (existsSync(doctorScript) && existsSync(runSh)) {
|
|
317
|
+
const raw = execSync(`bash ${JSON.stringify(runSh)} ${JSON.stringify(doctorScript)}`, {
|
|
318
|
+
encoding: "utf8",
|
|
319
|
+
timeout: 15000,
|
|
320
|
+
});
|
|
321
|
+
const report = JSON.parse(raw) as { runtime: string };
|
|
322
|
+
result.steps.push({ step: "doctor-verify", ok: true, note: `Runtime: ${report.runtime}` });
|
|
323
|
+
} else {
|
|
324
|
+
result.steps.push({ step: "doctor-verify", ok: true, note: "doctor.ts not found — skipped" });
|
|
325
|
+
}
|
|
326
|
+
} catch (err) {
|
|
327
|
+
const msg = `Doctor verify failed: ${err instanceof Error ? err.message : String(err)}`;
|
|
328
|
+
result.steps.push({ step: "doctor-verify", ok: false, note: msg });
|
|
329
|
+
// Doctor failure is non-fatal — log but don't block.
|
|
330
|
+
process.stderr.write(`[init] WARN ${msg}\n`);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
result.success = result.errors.length === 0;
|
|
334
|
+
return result;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// ── Chat-fallback multi-select (portable-ask) ───────────────────────────────
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Print detected platforms and ask the user to confirm. When AskUserQuestion is
|
|
341
|
+
* available (Claude Code native), the orchestrator should use that instead; this
|
|
342
|
+
* is the text-based fallback for a direct CLI invocation. `--yes` auto-selects
|
|
343
|
+
* all detected platforms.
|
|
344
|
+
*/
|
|
345
|
+
export async function promptPlatformSelection(
|
|
346
|
+
platforms: DetectedPlatform[],
|
|
347
|
+
autoYes: boolean
|
|
348
|
+
): Promise<PlatformId[]> {
|
|
349
|
+
const detected = platforms.filter((p) => p.detected);
|
|
350
|
+
const undetected = platforms.filter((p) => !p.detected);
|
|
351
|
+
|
|
352
|
+
process.stdout.write("\n mutagent-evaluator — Cross-Platform Install\n");
|
|
353
|
+
process.stdout.write(" ──────────────────────────────────────────────\n");
|
|
354
|
+
process.stdout.write(" Detected platforms:\n");
|
|
355
|
+
|
|
356
|
+
if (detected.length === 0) {
|
|
357
|
+
process.stdout.write(" (none — no platform markers found)\n");
|
|
358
|
+
process.stdout.write(
|
|
359
|
+
"\n No platforms detected. Install at least one of:\n" +
|
|
360
|
+
" Claude Code: https://claude.ai/claude-code\n" +
|
|
361
|
+
" Codex CLI: npm install -g @openai/codex\n" +
|
|
362
|
+
" Cursor: https://cursor.com\n"
|
|
363
|
+
);
|
|
364
|
+
return [];
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
detected.forEach((p, i) => {
|
|
368
|
+
process.stdout.write(` [${i + 1}] ${p.label} (${p.detectionMarker}) detected\n`);
|
|
369
|
+
});
|
|
370
|
+
if (undetected.length > 0) {
|
|
371
|
+
process.stdout.write(" Not detected:\n");
|
|
372
|
+
undetected.forEach((p) => {
|
|
373
|
+
process.stdout.write(` ${p.label} (${p.detectionMarker})\n`);
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
if (autoYes) {
|
|
378
|
+
process.stdout.write(`\n --yes: installing all ${detected.length} detected platform(s).\n`);
|
|
379
|
+
return detected.map((p) => p.id);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
process.stdout.write(
|
|
383
|
+
`\n Install to which platforms? [all/${detected.map((_, i) => i + 1).join(",")}] (default: all): `
|
|
384
|
+
);
|
|
385
|
+
|
|
386
|
+
const line = await new Promise<string>((res) => {
|
|
387
|
+
let buf = "";
|
|
388
|
+
process.stdin.setEncoding("utf8");
|
|
389
|
+
process.stdin.once("data", (chunk: unknown) => {
|
|
390
|
+
buf += String(chunk);
|
|
391
|
+
res(buf.trim());
|
|
392
|
+
});
|
|
393
|
+
process.stdin.resume();
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
if (!line || line.toLowerCase() === "all") return detected.map((p) => p.id);
|
|
397
|
+
|
|
398
|
+
const indices = line
|
|
399
|
+
.split(",")
|
|
400
|
+
.map((s) => parseInt(s.trim(), 10) - 1)
|
|
401
|
+
.filter((i) => i >= 0 && i < detected.length);
|
|
402
|
+
|
|
403
|
+
if (indices.length === 0) {
|
|
404
|
+
process.stdout.write(" No valid selection — defaulting to all detected.\n");
|
|
405
|
+
return detected.map((p) => p.id);
|
|
406
|
+
}
|
|
407
|
+
return indices.map((i) => detected[i]!.id);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
// ── Descriptor ───────────────────────────────────────────────────────────────
|
|
411
|
+
|
|
412
|
+
export function createInitDescriptor(
|
|
413
|
+
skillSourceDir: string,
|
|
414
|
+
projectRoot: string,
|
|
415
|
+
scope: Scope,
|
|
416
|
+
reconfigure = false
|
|
417
|
+
): InitDescriptor {
|
|
418
|
+
const runtime = detectRuntime();
|
|
419
|
+
const agentsInstalled = checkAgentsInstalled(skillSourceDir, projectRoot, scope);
|
|
420
|
+
|
|
421
|
+
const descriptor: InitDescriptor = {
|
|
422
|
+
runtime,
|
|
423
|
+
projectRoot,
|
|
424
|
+
scope,
|
|
425
|
+
nextAction: reconfigure ? "reconfigure" : "protocol",
|
|
426
|
+
message: reconfigure
|
|
427
|
+
? "Re-onboarding requested. Load SKILL.md §0 setup and re-run the interview."
|
|
428
|
+
: "Setup ready. Load SKILL.md and follow inline. The parent session is the orchestrator — do NOT dispatch a coordinator sub-agent.",
|
|
429
|
+
agentsInstalled,
|
|
430
|
+
};
|
|
431
|
+
|
|
432
|
+
if (!agentsInstalled) {
|
|
433
|
+
descriptor.agentsInstallHint =
|
|
434
|
+
`bun scripts/cli/run.sh scripts/cli/init.ts "${projectRoot}"${scope === "global" ? " --global" : ""}`;
|
|
435
|
+
descriptor.message +=
|
|
436
|
+
`\n\nmutagent-evaluator agents NOT installed in ${scope === "global" ? "~/.claude" : "<project>/.claude"}/agents/ — ` +
|
|
437
|
+
`dispatches will fall back to subagent_type=general-purpose. Re-run init to install them.` +
|
|
438
|
+
`\n(After install, restart your Claude Code session — the subagent_type registry caches at boot.)`;
|
|
439
|
+
}
|
|
440
|
+
return descriptor;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
// ── Mode implementations ───────────────────────────────────────────────────
|
|
444
|
+
|
|
445
|
+
/**
|
|
446
|
+
* mode=install — detect platforms, prompt (or auto-select with --yes), install.
|
|
447
|
+
* Returns exit code: 0 = all ok, 1 = any platform failure (others continue).
|
|
448
|
+
*/
|
|
449
|
+
export async function runModeInstall(
|
|
450
|
+
skillDir: string,
|
|
451
|
+
autoYes: boolean,
|
|
452
|
+
force: boolean,
|
|
453
|
+
scope: Scope,
|
|
454
|
+
cwd: string
|
|
455
|
+
): Promise<number> {
|
|
456
|
+
const platforms = detectInstalledPlatforms(cwd, scope);
|
|
457
|
+
const selectedIds = await promptPlatformSelection(platforms, autoYes);
|
|
458
|
+
|
|
459
|
+
if (selectedIds.length === 0) {
|
|
460
|
+
process.stderr.write("[init] No platforms selected — nothing to install.\n");
|
|
461
|
+
return 0;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
process.stdout.write(
|
|
465
|
+
`[init] Install scope: ${scope}${scope === "project" ? ` (${cwd})` : " (home dir)"}\n`
|
|
466
|
+
);
|
|
467
|
+
|
|
468
|
+
let anyFailure = false;
|
|
469
|
+
for (const id of selectedIds) {
|
|
470
|
+
const platform = platforms.find((p) => p.id === id)!;
|
|
471
|
+
process.stdout.write(`\n[init] Installing to ${platform.label}...\n`);
|
|
472
|
+
const result = installToPlatform(platform, skillDir, force);
|
|
473
|
+
for (const step of result.steps) {
|
|
474
|
+
process.stdout.write(`${step.ok ? " ok" : " FAIL"} ${step.step}: ${step.note ?? ""}\n`);
|
|
475
|
+
}
|
|
476
|
+
if (result.success) {
|
|
477
|
+
process.stdout.write(`[init] ${platform.label}: install complete.\n`);
|
|
478
|
+
if (platform.id === "claude-code") {
|
|
479
|
+
process.stdout.write(
|
|
480
|
+
" Restart your Claude Code session — the subagent_type registry caches at boot.\n"
|
|
481
|
+
);
|
|
482
|
+
}
|
|
483
|
+
} else {
|
|
484
|
+
process.stderr.write(`[init] ${platform.label}: FAILED — ${result.errors.join("; ")}\n`);
|
|
485
|
+
anyFailure = true;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
return anyFailure ? 1 : 0;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
/**
|
|
492
|
+
* mode=init (default) — install skill+agents, then emit InitDescriptor JSON. This
|
|
493
|
+
* is the pnpx @mutagent/evaluator init path: one command installs AND returns
|
|
494
|
+
* setup state. Install failures are non-fatal for the descriptor routing.
|
|
495
|
+
*/
|
|
496
|
+
export async function runModeInit(
|
|
497
|
+
skillDir: string,
|
|
498
|
+
projectRoot: string,
|
|
499
|
+
autoYes: boolean,
|
|
500
|
+
force: boolean,
|
|
501
|
+
scope: Scope
|
|
502
|
+
): Promise<number> {
|
|
503
|
+
await runModeInstall(skillDir, autoYes, force, scope, projectRoot);
|
|
504
|
+
const descriptor = createInitDescriptor(skillDir, projectRoot, scope, false);
|
|
505
|
+
process.stdout.write(JSON.stringify(descriptor, null, 2) + "\n");
|
|
506
|
+
return 0;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/** mode=reconfigure — emit a reconfigure-signal descriptor (the interview is inline in SKILL.md). */
|
|
510
|
+
export function runModeReconfigure(
|
|
511
|
+
skillDir: string,
|
|
512
|
+
projectRoot: string,
|
|
513
|
+
scope: Scope
|
|
514
|
+
): number {
|
|
515
|
+
const descriptor = createInitDescriptor(skillDir, projectRoot, scope, true);
|
|
516
|
+
process.stdout.write(JSON.stringify(descriptor, null, 2) + "\n");
|
|
517
|
+
return 0;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
// ── Usage ────────────────────────────────────────────────────────────────────
|
|
521
|
+
|
|
522
|
+
const USAGE = `
|
|
523
|
+
mutagent-evaluator init — cross-platform skill installer + setup routing
|
|
524
|
+
|
|
525
|
+
USAGE
|
|
526
|
+
pnpx @mutagent/evaluator init [--mode <mode>] [options]
|
|
527
|
+
|
|
528
|
+
MODES (--mode flag)
|
|
529
|
+
--mode init DEFAULT — install skill+agents to detected platforms, then emit
|
|
530
|
+
InitDescriptor JSON with setup state.
|
|
531
|
+
--mode install Cross-platform installer only (no descriptor output)
|
|
532
|
+
--mode reconfigure Emit reconfigure-signal descriptor; the interview is inline in SKILL.md
|
|
533
|
+
|
|
534
|
+
Legacy aliases (backward compat):
|
|
535
|
+
--install → same as --mode install
|
|
536
|
+
--reconfigure → same as --mode reconfigure
|
|
537
|
+
|
|
538
|
+
INSTALL SCOPE (install/init modes)
|
|
539
|
+
(default) PROJECT-LOCAL — install into the directory you ran init in:
|
|
540
|
+
Claude Code → <cwd>/.claude/… Codex → <cwd>/.codex/…
|
|
541
|
+
--global HOME DIR — install into ~/.claude/… and ~/.codex/…
|
|
542
|
+
(Cursor is always project-local: .cursor/ in the current directory.)
|
|
543
|
+
|
|
544
|
+
OPTIONS
|
|
545
|
+
--global Install into the home dir instead of the project (default: project-local)
|
|
546
|
+
--yes Non-interactive: select all detected platforms
|
|
547
|
+
--force Force-overwrite existing skill/agent files during install
|
|
548
|
+
--help Show this message
|
|
549
|
+
|
|
550
|
+
PLATFORM DETECTION
|
|
551
|
+
Detection probes home/env markers (does the runtime exist?); the INSTALL TARGET
|
|
552
|
+
follows the scope above — a platform stays installable into your project even
|
|
553
|
+
when only the global marker exists.
|
|
554
|
+
Claude Code detected if ~/.claude/ exists
|
|
555
|
+
Codex detected if ~/.codex/ exists
|
|
556
|
+
Cursor detected if .cursor/ exists in current directory (project-scoped)
|
|
557
|
+
|
|
558
|
+
EXAMPLES
|
|
559
|
+
pnpx @mutagent/evaluator init # project-local install + descriptor (default)
|
|
560
|
+
pnpx @mutagent/evaluator init --global # install into the home dir instead
|
|
561
|
+
pnpx @mutagent/evaluator init --yes # install all detected, non-interactive
|
|
562
|
+
pnpx @mutagent/evaluator init --mode install # installer only
|
|
563
|
+
`.trim();
|
|
564
|
+
|
|
565
|
+
// ── CLI entrypoint ────────────────────────────────────────────────────────────
|
|
566
|
+
|
|
567
|
+
if (import.meta.main) {
|
|
568
|
+
const argv = process.argv.slice(2);
|
|
569
|
+
|
|
570
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
571
|
+
process.stdout.write(USAGE + "\n");
|
|
572
|
+
process.exit(0);
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
const mode = resolveMode(argv);
|
|
576
|
+
const scope = resolveScope(argv);
|
|
577
|
+
const autoYes = argv.includes("--yes");
|
|
578
|
+
const force = argv.includes("--force");
|
|
579
|
+
|
|
580
|
+
// The skill SOURCE dir is resolved from import.meta (stays correct through
|
|
581
|
+
// symlink chains). scriptDir = scripts/cli → skillRoot is two dirs up. The
|
|
582
|
+
// install TARGET root is the user's invocation cwd — NEVER the script dir.
|
|
583
|
+
const scriptDir = realpathSync(
|
|
584
|
+
import.meta.dirname ?? import.meta.url.replace(/^file:\/\//, "").replace(/\/[^/]+$/, "")
|
|
585
|
+
);
|
|
586
|
+
const skillDir = resolve(scriptDir, "../..");
|
|
587
|
+
// parsePositionals skips value-flag tokens so a --mode VALUE is never mistaken
|
|
588
|
+
// for projectRoot. Falls back to the invocation cwd.
|
|
589
|
+
const projectRoot = parsePositionals(argv)[0] ?? process.cwd();
|
|
590
|
+
|
|
591
|
+
if (mode === "install") {
|
|
592
|
+
const code = await runModeInstall(skillDir, autoYes, force, scope, projectRoot);
|
|
593
|
+
process.exit(code);
|
|
594
|
+
}
|
|
595
|
+
if (mode === "reconfigure") {
|
|
596
|
+
process.exit(runModeReconfigure(skillDir, projectRoot, scope));
|
|
597
|
+
}
|
|
598
|
+
// mode === "init" (default)
|
|
599
|
+
const code = await runModeInit(skillDir, projectRoot, autoYes, force, scope);
|
|
600
|
+
process.exit(code);
|
|
601
|
+
}
|