@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,308 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { parse as parseYaml } from "yaml";
|
|
5
|
+
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// render-roster — dashboard *command roster generator for mutagent-system.
|
|
8
|
+
//
|
|
9
|
+
// §9.4.6 (LOCKED 2026-06-24): `routing.yaml` is the SINGLE SOURCE OF TRUTH for
|
|
10
|
+
// command visibility. Each command carries `visibility: shown | glimpse |
|
|
11
|
+
// internal`; this script READS those flags and DETERMINISTICALLY renders the
|
|
12
|
+
// dashboard roster blocks — exactly like scripts/sync-index.ts renders the
|
|
13
|
+
// SYSTEM panel from the on-disk topology. The orchestrator drops the rendered
|
|
14
|
+
// text into the `{command_roster}` placeholder of `help-display-template`.
|
|
15
|
+
//
|
|
16
|
+
// - shown → rendered in the visible roster (Lifecycle / State & Setup).
|
|
17
|
+
// - glimpse → rendered under the "=== Evaluator ===" section (evaluator
|
|
18
|
+
// branches — "what the evaluator can also do", NOT standalone ADL
|
|
19
|
+
// stages). NB: the enum value "glimpse" is an implementation-only
|
|
20
|
+
// visibility directive; it is NEVER rendered as operator UI text.
|
|
21
|
+
// - internal → HIDDEN from the roster, but STILL invocable by name. Visibility
|
|
22
|
+
// is DISPLAY-ONLY; routing resolution (scripts/dispatch.ts +
|
|
23
|
+
// routing.yaml route targets) is untouched.
|
|
24
|
+
//
|
|
25
|
+
// A companion test (tests/render-roster.test.ts) asserts roster ==
|
|
26
|
+
// routing-visibility, so `*spec`-style drift ("in routing, 0× in the roster")
|
|
27
|
+
// cannot recur. Parsing logic is EXPORTED + pure (routing path injected) so it
|
|
28
|
+
// is unit-testable; main() only parses args + prints.
|
|
29
|
+
//
|
|
30
|
+
// No clock, no network, no env reads — same routing.yaml in, same roster out.
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
|
|
33
|
+
export type Visibility = "shown" | "glimpse" | "internal";
|
|
34
|
+
|
|
35
|
+
export interface CommandVisibility {
|
|
36
|
+
/** Canonical command name WITHOUT the leading `*` (e.g. "spec", "build-evals"). */
|
|
37
|
+
name: string;
|
|
38
|
+
/** The §9.4.6 visibility class. Unknown/missing flags default to "internal". */
|
|
39
|
+
visibility: Visibility;
|
|
40
|
+
/** Routing owner: "orchestrator-internal", a route_target, or a forward-intent owning_skill. */
|
|
41
|
+
owner: string;
|
|
42
|
+
/** Where the command is declared in routing.yaml. */
|
|
43
|
+
source: "owned" | "forward_intent";
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const VALID_VISIBILITY = new Set<Visibility>(["shown", "glimpse", "internal"]);
|
|
47
|
+
|
|
48
|
+
/** Coerce a raw flag to a Visibility; anything unknown/missing => "internal" (safe-hidden). */
|
|
49
|
+
function coerceVisibility(raw: unknown): Visibility {
|
|
50
|
+
return typeof raw === "string" && VALID_VISIBILITY.has(raw as Visibility)
|
|
51
|
+
? (raw as Visibility)
|
|
52
|
+
: "internal";
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Default routing.yaml: this file's sibling-of-parent (scripts/ -> orchestrator/).
|
|
56
|
+
function defaultRoutingPath(): string {
|
|
57
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
58
|
+
return path.resolve(here, "..", "routing.yaml");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** The committed routing.yaml path (the single source of truth). */
|
|
62
|
+
export const DEFAULT_ROUTING_PATH = defaultRoutingPath();
|
|
63
|
+
|
|
64
|
+
interface RoutingYaml {
|
|
65
|
+
commands?: Record<
|
|
66
|
+
string,
|
|
67
|
+
{ route_target?: string; visibility?: unknown } | null
|
|
68
|
+
>;
|
|
69
|
+
forward_intents?: Array<{
|
|
70
|
+
owning_skill?: string;
|
|
71
|
+
commands?: Record<string, { visibility?: unknown } | null>;
|
|
72
|
+
}>;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Parse routing.yaml and return the visibility class of every command (owned +
|
|
77
|
+
* forward-intent), sorted by name for deterministic output. Pure: the path is a
|
|
78
|
+
* parameter so tests can point at fixtures.
|
|
79
|
+
*/
|
|
80
|
+
export function loadCommandVisibility(
|
|
81
|
+
routingPath: string = DEFAULT_ROUTING_PATH,
|
|
82
|
+
): CommandVisibility[] {
|
|
83
|
+
const parsed = parseYaml(fs.readFileSync(routingPath, "utf-8")) as RoutingYaml;
|
|
84
|
+
const out: CommandVisibility[] = [];
|
|
85
|
+
|
|
86
|
+
for (const [name, def] of Object.entries(parsed.commands ?? {})) {
|
|
87
|
+
out.push({
|
|
88
|
+
name,
|
|
89
|
+
visibility: coerceVisibility(def?.visibility),
|
|
90
|
+
owner: def?.route_target ?? "orchestrator-internal",
|
|
91
|
+
source: "owned",
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
for (const group of parsed.forward_intents ?? []) {
|
|
96
|
+
const owner = group.owning_skill ?? "unknown";
|
|
97
|
+
for (const [name, def] of Object.entries(group.commands ?? {})) {
|
|
98
|
+
out.push({
|
|
99
|
+
name,
|
|
100
|
+
visibility: coerceVisibility(def?.visibility),
|
|
101
|
+
owner,
|
|
102
|
+
source: "forward_intent",
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
out.sort((a, b) => a.name.localeCompare(b.name));
|
|
108
|
+
return out;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
// PRESENTATION layer. Visibility (above) decides INCLUSION; this map decides
|
|
113
|
+
// LAYOUT (which block, order, one-liner, route tag). It is NOT a second source
|
|
114
|
+
// of truth for visibility — every NON-internal command in routing.yaml MUST
|
|
115
|
+
// have an entry here, else renderRoster THROWS (caught by the drift test). No
|
|
116
|
+
// internal command is listed here (they are filtered out before lookup).
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
|
|
119
|
+
type Block = "lifecycle" | "evaluator" | "state";
|
|
120
|
+
|
|
121
|
+
interface Presentation {
|
|
122
|
+
block: Block;
|
|
123
|
+
order: number;
|
|
124
|
+
summary: string;
|
|
125
|
+
/** Optional right-side route annotation, e.g. "[→ evaluator]". */
|
|
126
|
+
tag?: string;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const DISPLAY: Readonly<Record<string, Presentation>> = {
|
|
130
|
+
// ── Lifecycle (① SPEC ▶ ② BUILD ▶ ③ EVALUATE ▶ ④ DIAGNOSE ▶ ⑤ IMPROVE) ───
|
|
131
|
+
spec: {
|
|
132
|
+
block: "lifecycle",
|
|
133
|
+
order: 1,
|
|
134
|
+
summary: "Capture WHAT a new agent IS → portable, validated agentspec.yaml",
|
|
135
|
+
tag: "[→ agentspec]",
|
|
136
|
+
},
|
|
137
|
+
build: {
|
|
138
|
+
block: "lifecycle",
|
|
139
|
+
order: 2,
|
|
140
|
+
summary: "Implement a validated agentspec.yaml into the target",
|
|
141
|
+
tag: "[→ builder]",
|
|
142
|
+
},
|
|
143
|
+
"sync-spec": {
|
|
144
|
+
block: "lifecycle",
|
|
145
|
+
order: 3,
|
|
146
|
+
summary: "Resync agentspec.yaml from implementation drift",
|
|
147
|
+
tag: "[→ builder]",
|
|
148
|
+
},
|
|
149
|
+
discover: {
|
|
150
|
+
block: "lifecycle",
|
|
151
|
+
order: 4,
|
|
152
|
+
summary: "Collect + curate traces (fetch · select · classify) → curated handoff",
|
|
153
|
+
tag: "[→ discovery]",
|
|
154
|
+
},
|
|
155
|
+
evaluate: {
|
|
156
|
+
block: "lifecycle",
|
|
157
|
+
order: 4,
|
|
158
|
+
summary: "Run evals vs a skill/agent → success/failure + verdict (judge only)",
|
|
159
|
+
tag: "[→ evaluator]",
|
|
160
|
+
},
|
|
161
|
+
diagnose: {
|
|
162
|
+
block: "lifecycle",
|
|
163
|
+
order: 5,
|
|
164
|
+
summary: "RCA + causal chains on routed failures → ranked remedies",
|
|
165
|
+
tag: "[→ diagnostics]",
|
|
166
|
+
},
|
|
167
|
+
// ── Evaluator (glimpse) — evaluator ops under EVALUATE, NOT standalone stages ──
|
|
168
|
+
"discover-evals": {
|
|
169
|
+
block: "evaluator",
|
|
170
|
+
order: 1,
|
|
171
|
+
summary: "Mine eval criteria from discovered traces → grow the eval suite",
|
|
172
|
+
},
|
|
173
|
+
"discover-dataset": {
|
|
174
|
+
block: "evaluator",
|
|
175
|
+
order: 2,
|
|
176
|
+
summary: "Distill a scenario-balanced dataset from traces (edge-cases first)",
|
|
177
|
+
},
|
|
178
|
+
"build-evals": {
|
|
179
|
+
block: "evaluator",
|
|
180
|
+
order: 3,
|
|
181
|
+
summary: "Build the eval suite for the judge (guided HITL · --auto = direct)",
|
|
182
|
+
},
|
|
183
|
+
"build-dataset": {
|
|
184
|
+
block: "evaluator",
|
|
185
|
+
order: 4,
|
|
186
|
+
summary: "Synthesize test cases (coverage) (HITL)",
|
|
187
|
+
},
|
|
188
|
+
// review + validate are visibility:internal for now (hidden from roster; still route).
|
|
189
|
+
review: {
|
|
190
|
+
block: "evaluator",
|
|
191
|
+
order: 5,
|
|
192
|
+
summary: "Human label-capture UI (feeds *validate) (HITL)",
|
|
193
|
+
},
|
|
194
|
+
validate: {
|
|
195
|
+
block: "evaluator",
|
|
196
|
+
order: 6,
|
|
197
|
+
summary: "Calibrate a judge vs human labels (TPR/TNR) (HITL)",
|
|
198
|
+
},
|
|
199
|
+
// ── State & Setup ─────────────────────────────────────────────────────────
|
|
200
|
+
sync: {
|
|
201
|
+
block: "state",
|
|
202
|
+
order: 1,
|
|
203
|
+
summary: "Explore + index the topology of skills/agents",
|
|
204
|
+
},
|
|
205
|
+
status: {
|
|
206
|
+
block: "state",
|
|
207
|
+
order: 2,
|
|
208
|
+
summary: "Where are we — active stage · last verdict · pending gates",
|
|
209
|
+
},
|
|
210
|
+
onboard: {
|
|
211
|
+
block: "state",
|
|
212
|
+
order: 3,
|
|
213
|
+
summary: "Unified onboarding + config (.mutagent/config.yaml) (alias *config)",
|
|
214
|
+
},
|
|
215
|
+
help: {
|
|
216
|
+
block: "state",
|
|
217
|
+
order: 4,
|
|
218
|
+
summary: "Show this dashboard",
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
// Operator-facing section headers. NOTE: the `glimpse` visibility tier maps to
|
|
223
|
+
// the clean "=== Evaluator ===" header — the §9.4.6 enum value "glimpse" is an
|
|
224
|
+
// IMPLEMENTATION directive (routing.yaml `visibility:`), NEVER rendered as UI
|
|
225
|
+
// text. Likewise "shown"/"internal"/"visibility" must never surface here.
|
|
226
|
+
const BLOCK_HEADERS: Readonly<Record<Block, string>> = {
|
|
227
|
+
lifecycle: "=== Lifecycle ===",
|
|
228
|
+
evaluator: "=== Evaluator ===",
|
|
229
|
+
state: "=== State & Setup ===",
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
const BLOCK_ORDER: readonly Block[] = ["lifecycle", "evaluator", "state"];
|
|
233
|
+
|
|
234
|
+
/** The ⑤ IMPROVE note, rendered as a continuation under the Lifecycle block. */
|
|
235
|
+
const GATED_APPLY_NOTE =
|
|
236
|
+
" (⑤ IMPROVE = gated apply, downstream of *diagnose — never auto-applies)";
|
|
237
|
+
|
|
238
|
+
// Dot-leader column width for the `*label .... summary` rows.
|
|
239
|
+
const DOT_COL = 18;
|
|
240
|
+
|
|
241
|
+
function formatRow(name: string, p: Presentation): string {
|
|
242
|
+
const label = `*${name}`;
|
|
243
|
+
const lead = `${label} `;
|
|
244
|
+
const dots = ".".repeat(Math.max(3, DOT_COL - lead.length));
|
|
245
|
+
const body = `${lead}${dots} ${p.summary}`;
|
|
246
|
+
return p.tag ? `${body} ${p.tag}` : body;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Render the visible roster from a command-visibility list. INTERNAL commands
|
|
251
|
+
* are filtered out; SHOWN + GLIMPSE commands are grouped into their block and
|
|
252
|
+
* ordered. A non-internal command with no DISPLAY entry is a drift error and
|
|
253
|
+
* THROWS (the test catches it).
|
|
254
|
+
*/
|
|
255
|
+
export function renderRoster(commands: CommandVisibility[]): string {
|
|
256
|
+
const visible = commands.filter((c) => c.visibility !== "internal");
|
|
257
|
+
|
|
258
|
+
for (const c of visible) {
|
|
259
|
+
if (!(c.name in DISPLAY)) {
|
|
260
|
+
throw new Error(
|
|
261
|
+
`render-roster: non-internal command "*${c.name}" is missing presentation metadata in DISPLAY. ` +
|
|
262
|
+
`Add it (block/order/summary) or mark it visibility:internal in routing.yaml.`,
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
const lines: string[] = [];
|
|
268
|
+
for (const block of BLOCK_ORDER) {
|
|
269
|
+
const rows = visible
|
|
270
|
+
.filter((c) => DISPLAY[c.name]!.block === block)
|
|
271
|
+
.sort((a, b) => DISPLAY[a.name]!.order - DISPLAY[b.name]!.order);
|
|
272
|
+
if (rows.length === 0) continue;
|
|
273
|
+
|
|
274
|
+
if (lines.length > 0) lines.push("");
|
|
275
|
+
lines.push(BLOCK_HEADERS[block]);
|
|
276
|
+
for (const c of rows) lines.push(formatRow(c.name, DISPLAY[c.name]!));
|
|
277
|
+
if (block === "lifecycle") lines.push(GATED_APPLY_NOTE);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
return lines.join("\n");
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// ---------------------------------------------------------------------------
|
|
284
|
+
// CLI — thin wrapper. Flags: --json (visibility list only) · <routing.yaml>
|
|
285
|
+
// positional override (defaults to the sibling routing.yaml).
|
|
286
|
+
// ---------------------------------------------------------------------------
|
|
287
|
+
function main(argv: string[]): void {
|
|
288
|
+
const args = argv.slice(2);
|
|
289
|
+
const jsonOnly = args.includes("--json");
|
|
290
|
+
const positional = args.find((a) => !a.startsWith("--"));
|
|
291
|
+
const routingPath = positional ? path.resolve(positional) : DEFAULT_ROUTING_PATH;
|
|
292
|
+
|
|
293
|
+
const commands = loadCommandVisibility(routingPath);
|
|
294
|
+
|
|
295
|
+
if (jsonOnly) {
|
|
296
|
+
console.info(JSON.stringify(commands, null, 2));
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
console.info(renderRoster(commands));
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
const isMain =
|
|
303
|
+
typeof import.meta !== "undefined" &&
|
|
304
|
+
(import.meta as unknown as { main?: boolean }).main === true;
|
|
305
|
+
if (isMain) {
|
|
306
|
+
const argv = typeof Bun !== "undefined" ? Bun.argv : process.argv;
|
|
307
|
+
main(argv);
|
|
308
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// resolve-credential — the ONE shared secret resolver (operator decision
|
|
6
|
+
// 2026-06-29).
|
|
7
|
+
//
|
|
8
|
+
// A `credential_ref` in `.mutagent/config.yaml` is NEVER a raw secret value — it
|
|
9
|
+
// names where the value lives. This resolver turns that ref into the actual
|
|
10
|
+
// secret by a fixed PRECEDENCE:
|
|
11
|
+
//
|
|
12
|
+
// 1. process.env[name] — the running environment wins (CI, shell export).
|
|
13
|
+
// 2. local `.env` — projectRoot/.env (the conventional dev secret file).
|
|
14
|
+
// 3. `.mutagentrc` — projectRoot/.mutagentrc (the credential/provider
|
|
15
|
+
// store; the fallback when no `.env` is around).
|
|
16
|
+
//
|
|
17
|
+
// `.mutagentrc` STAYS — it is the gitignored provider-secret store. Raw secret
|
|
18
|
+
// VALUES never enter config.yaml; the config holds only the `credential_ref`.
|
|
19
|
+
//
|
|
20
|
+
// A ref may be a bare ENV-VAR NAME (string) or an object that also pins an
|
|
21
|
+
// explicit file to read first: `{ env: "LANGFUSE_SECRET_KEY", path: ".env.ci" }`.
|
|
22
|
+
//
|
|
23
|
+
// Design invariants (mirror config-schema.ts / handover-contract.ts):
|
|
24
|
+
// - Pure core with INJECTED deps (env map + file reader) → deterministic tests,
|
|
25
|
+
// never touches the real environment or disk in the pure path.
|
|
26
|
+
// - A thin CLI wrapper binds the real process.env + fs.
|
|
27
|
+
// - Never throws on a missing file; a not-found ref returns { found:false }.
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
|
|
30
|
+
/** A credential reference: a bare env-var NAME, or a name + an explicit file to try first. */
|
|
31
|
+
export type CredentialRef = string | { env: string; path?: string };
|
|
32
|
+
|
|
33
|
+
/** Where a resolved secret came from (transparency — surfaced, never the value). */
|
|
34
|
+
export type CredentialSource = "env" | ".env" | ".mutagentrc" | "ref-path";
|
|
35
|
+
|
|
36
|
+
export type ResolveCredentialResult =
|
|
37
|
+
| { found: true; value: string; source: CredentialSource; from: string }
|
|
38
|
+
| { found: false; name: string; tried: string[] };
|
|
39
|
+
|
|
40
|
+
export interface ResolveCredentialDeps {
|
|
41
|
+
/** Injected environment map (defaults to process.env in the thin wrapper). */
|
|
42
|
+
env: Record<string, string | undefined>;
|
|
43
|
+
/** Injected file reader → file contents, or null if unreadable/absent. Never throws. */
|
|
44
|
+
readFile: (p: string) => string | null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const ENV_LINE = /^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)\s*$/;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Parse a dotenv-style file (`.env` / `.mutagentrc`). One `KEY=VALUE` per line;
|
|
51
|
+
* `#` comments + blank lines ignored; surrounding single/double quotes stripped;
|
|
52
|
+
* `export ` prefix tolerated. Pure — string in, map out. Last assignment wins.
|
|
53
|
+
*/
|
|
54
|
+
export function parseDotenv(content: string): Record<string, string> {
|
|
55
|
+
const out: Record<string, string> = {};
|
|
56
|
+
for (const rawLine of content.split(/\r?\n/)) {
|
|
57
|
+
const line = rawLine.trim();
|
|
58
|
+
if (line === "" || line.startsWith("#")) continue;
|
|
59
|
+
const m = ENV_LINE.exec(line);
|
|
60
|
+
if (!m) continue;
|
|
61
|
+
const key = m[1];
|
|
62
|
+
let val = m[2];
|
|
63
|
+
// Strip a trailing inline comment only when the value is unquoted.
|
|
64
|
+
const quoted =
|
|
65
|
+
(val.startsWith('"') && val.endsWith('"') && val.length >= 2) ||
|
|
66
|
+
(val.startsWith("'") && val.endsWith("'") && val.length >= 2);
|
|
67
|
+
if (quoted) {
|
|
68
|
+
val = val.slice(1, -1);
|
|
69
|
+
} else {
|
|
70
|
+
const hash = val.indexOf(" #");
|
|
71
|
+
if (hash >= 0) val = val.slice(0, hash).trim();
|
|
72
|
+
}
|
|
73
|
+
out[key] = val;
|
|
74
|
+
}
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Normalize a CredentialRef to `{ name, refPath }`. */
|
|
79
|
+
function normalizeRef(ref: CredentialRef): { name: string; refPath?: string } {
|
|
80
|
+
if (typeof ref === "string") return { name: ref };
|
|
81
|
+
return { name: ref.env, refPath: ref.path };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Resolve a credential ref to its secret value by precedence (env → .env →
|
|
86
|
+
* .mutagentrc), with an optional ref-pinned file tried FIRST. Pure: all I/O is
|
|
87
|
+
* injected via `deps`. Returns the value + its source for transparency, or
|
|
88
|
+
* { found:false } with the list of places tried.
|
|
89
|
+
*
|
|
90
|
+
* @param ref bare env-var name, or { env, path }.
|
|
91
|
+
* @param projectRoot the install/init dir (where `.env` + `.mutagentrc` live).
|
|
92
|
+
* @param deps injected env map + file reader.
|
|
93
|
+
*/
|
|
94
|
+
export function resolveCredential(
|
|
95
|
+
ref: CredentialRef,
|
|
96
|
+
projectRoot: string,
|
|
97
|
+
deps: ResolveCredentialDeps,
|
|
98
|
+
): ResolveCredentialResult {
|
|
99
|
+
const { name, refPath } = normalizeRef(ref);
|
|
100
|
+
const tried: string[] = [];
|
|
101
|
+
|
|
102
|
+
// 0. process.env always wins (CI / shell export).
|
|
103
|
+
const envVal = deps.env[name];
|
|
104
|
+
if (envVal !== undefined && envVal !== "") {
|
|
105
|
+
return { found: true, value: envVal, source: "env", from: `process.env.${name}` };
|
|
106
|
+
}
|
|
107
|
+
tried.push(`process.env.${name}`);
|
|
108
|
+
|
|
109
|
+
// 1. A ref-pinned explicit file (highest file priority when given).
|
|
110
|
+
const fileTiers: { label: CredentialSource; file: string }[] = [];
|
|
111
|
+
if (refPath) {
|
|
112
|
+
fileTiers.push({ label: "ref-path", file: path.resolve(projectRoot, refPath) });
|
|
113
|
+
}
|
|
114
|
+
// 2./3. conventional files, in precedence order.
|
|
115
|
+
fileTiers.push({ label: ".env", file: path.resolve(projectRoot, ".env") });
|
|
116
|
+
fileTiers.push({ label: ".mutagentrc", file: path.resolve(projectRoot, ".mutagentrc") });
|
|
117
|
+
|
|
118
|
+
for (const tier of fileTiers) {
|
|
119
|
+
tried.push(tier.file);
|
|
120
|
+
const content = deps.readFile(tier.file);
|
|
121
|
+
if (content === null) continue;
|
|
122
|
+
const parsed = parseDotenv(content);
|
|
123
|
+
const val = parsed[name];
|
|
124
|
+
if (val !== undefined && val !== "") {
|
|
125
|
+
return { found: true, value: val, source: tier.label, from: tier.file };
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return { found: false, name, tried };
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Real-fs file reader for the thin wrapper: contents or null (never throws). */
|
|
133
|
+
export function readFileOrNull(p: string): string | null {
|
|
134
|
+
try {
|
|
135
|
+
return fs.readFileSync(p, "utf-8");
|
|
136
|
+
} catch {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Thin wrapper binding the REAL process.env + fs. App code calls this; tests call
|
|
143
|
+
* the pure `resolveCredential` with injected deps.
|
|
144
|
+
*/
|
|
145
|
+
export function resolveCredentialLive(
|
|
146
|
+
ref: CredentialRef,
|
|
147
|
+
projectRoot: string,
|
|
148
|
+
): ResolveCredentialResult {
|
|
149
|
+
return resolveCredential(ref, projectRoot, {
|
|
150
|
+
env: process.env,
|
|
151
|
+
readFile: readFileOrNull,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
// CLI — resolve a ref and report ONLY its source (never the secret value):
|
|
157
|
+
// bun run scripts/resolve-credential.ts <ENV_VAR_NAME> [projectRoot]
|
|
158
|
+
// Exit 0 = found (prints source); exit 1 = not found (prints places tried).
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
|
|
161
|
+
function runCli(argv: string[]): number {
|
|
162
|
+
const name = argv[2];
|
|
163
|
+
const root = argv[3] ?? process.cwd();
|
|
164
|
+
if (!name) {
|
|
165
|
+
process.stderr.write("usage: resolve-credential.ts <ENV_VAR_NAME> [projectRoot]\n");
|
|
166
|
+
return 1;
|
|
167
|
+
}
|
|
168
|
+
const res = resolveCredentialLive(name, root);
|
|
169
|
+
if (res.found) {
|
|
170
|
+
console.info(`[resolve-credential] FOUND ${name} via ${res.source} (${res.from}). Value NOT printed.`);
|
|
171
|
+
return 0;
|
|
172
|
+
}
|
|
173
|
+
process.stderr.write(
|
|
174
|
+
`[resolve-credential] NOT FOUND ${name}. Tried:\n ${res.tried.join("\n ")}\n`,
|
|
175
|
+
);
|
|
176
|
+
return 1;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const isMain =
|
|
180
|
+
typeof import.meta !== "undefined" &&
|
|
181
|
+
(import.meta as unknown as { main?: boolean }).main === true;
|
|
182
|
+
if (isMain) {
|
|
183
|
+
const argv = typeof Bun !== "undefined" ? Bun.argv : process.argv;
|
|
184
|
+
process.exit(runCli(argv));
|
|
185
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// resolve-paths — the LOCAL `.mutagent/` source-of-truth resolver (operator
|
|
6
|
+
// decision 2026-06-29).
|
|
7
|
+
//
|
|
8
|
+
// Everything lives under ONE local `.mutagent/` rooted at the INSTALL/init dir —
|
|
9
|
+
// the dir where `mutagent … init` ran (the nearest ancestor that already has a
|
|
10
|
+
// `.mutagent/`). NEVER `~/.mutagent`: config + artifacts are project-local so a
|
|
11
|
+
// checkout is self-contained and two projects never share state.
|
|
12
|
+
//
|
|
13
|
+
// <root>/.mutagent/
|
|
14
|
+
// config.yaml ← the single global config (resolveConfigPath)
|
|
15
|
+
// evaluator/ ← evaluator artifacts (stageDir "evaluator")
|
|
16
|
+
// diagnostics/{runId}/ ← diagnostics run artifacts (stageDir "diagnostics")
|
|
17
|
+
// diagnostics/library/ ← class-memory (per-install)
|
|
18
|
+
// specs/{spec_id}/ ← agentspec build artifacts (stageDir "specs")
|
|
19
|
+
// skill-builder/ ← (stageDir "skill-builder")
|
|
20
|
+
//
|
|
21
|
+
// Design invariants (mirror config-schema.ts / resolve-credential.ts):
|
|
22
|
+
// - Pure core with an INJECTED `exists` predicate → deterministic tests.
|
|
23
|
+
// - A thin live wrapper binds real fs + process.cwd().
|
|
24
|
+
// - Never throws; when no `.mutagent/` ancestor exists, fall back to the start
|
|
25
|
+
// dir (that is where `init` will create it — first-run friendly).
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
|
|
28
|
+
/** The single local root dir name. Never `~/.mutagent`. */
|
|
29
|
+
export const MUTAGENT_DIR = ".mutagent" as const;
|
|
30
|
+
|
|
31
|
+
/** The canonical ADL stage sub-roots under `.mutagent/`. */
|
|
32
|
+
export const STAGE_DIRS = {
|
|
33
|
+
evaluator: "evaluator",
|
|
34
|
+
diagnostics: "diagnostics",
|
|
35
|
+
specs: "specs",
|
|
36
|
+
skillBuilder: "skill-builder",
|
|
37
|
+
} as const;
|
|
38
|
+
export type StageDirName = (typeof STAGE_DIRS)[keyof typeof STAGE_DIRS];
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Walk UP from `startDir` to the nearest ancestor that already contains a
|
|
42
|
+
* `.mutagent/` directory; return that ancestor (the install/init root). If none
|
|
43
|
+
* is found, return `startDir` (first run — `init` creates `.mutagent/` here).
|
|
44
|
+
* Pure: directory existence is the injected `exists` predicate.
|
|
45
|
+
*/
|
|
46
|
+
export function findConfigRoot(
|
|
47
|
+
startDir: string,
|
|
48
|
+
exists: (p: string) => boolean,
|
|
49
|
+
): string {
|
|
50
|
+
let dir = path.resolve(startDir);
|
|
51
|
+
// Bounded by the filesystem root — path.dirname("/") === "/" terminates.
|
|
52
|
+
for (;;) {
|
|
53
|
+
if (exists(path.join(dir, MUTAGENT_DIR))) return dir;
|
|
54
|
+
const parent = path.dirname(dir);
|
|
55
|
+
if (parent === dir) break;
|
|
56
|
+
dir = parent;
|
|
57
|
+
}
|
|
58
|
+
return path.resolve(startDir);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** True iff `p` is an existing directory (real-fs predicate for the live wrapper). */
|
|
62
|
+
export function dirExists(p: string): boolean {
|
|
63
|
+
try {
|
|
64
|
+
return fs.statSync(p).isDirectory();
|
|
65
|
+
} catch {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Live: the install/init root for the current process (nearest `.mutagent/` ancestor, else cwd). */
|
|
71
|
+
export function resolveConfigRoot(startDir: string = process.cwd()): string {
|
|
72
|
+
return findConfigRoot(startDir, dirExists);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** `<root>/.mutagent`. */
|
|
76
|
+
export function mutagentDir(root: string): string {
|
|
77
|
+
return path.join(root, MUTAGENT_DIR);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** The single global config path: `<root>/.mutagent/config.yaml`. */
|
|
81
|
+
export function configPath(root: string): string {
|
|
82
|
+
return path.join(mutagentDir(root), "config.yaml");
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Live: the resolved global config path for the current process. */
|
|
86
|
+
export function resolveConfigPath(startDir: string = process.cwd()): string {
|
|
87
|
+
return configPath(resolveConfigRoot(startDir));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** A stage artifact root: `<root>/.mutagent/<stage>[/...segments]`. */
|
|
91
|
+
export function stageDir(root: string, stage: StageDirName, ...segments: string[]): string {
|
|
92
|
+
return path.join(mutagentDir(root), stage, ...segments);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
// CLI — print the resolved root + config path for the current dir:
|
|
97
|
+
// bun run scripts/resolve-paths.ts [startDir]
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
|
|
100
|
+
function runCli(argv: string[]): number {
|
|
101
|
+
const start = argv[2] ?? process.cwd();
|
|
102
|
+
const root = resolveConfigRoot(start);
|
|
103
|
+
console.info(`[resolve-paths] root: ${root}`);
|
|
104
|
+
console.info(`[resolve-paths] config: ${configPath(root)}`);
|
|
105
|
+
return 0;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const isMain =
|
|
109
|
+
typeof import.meta !== "undefined" &&
|
|
110
|
+
(import.meta as unknown as { main?: boolean }).main === true;
|
|
111
|
+
if (isMain) {
|
|
112
|
+
const argv = typeof Bun !== "undefined" ? Bun.argv : process.argv;
|
|
113
|
+
process.exit(runCli(argv));
|
|
114
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// slack/format — PURE Slack mrkdwn primitives (SLACK-CORE).
|
|
3
|
+
//
|
|
4
|
+
// The SHARED low-level formatting layer used by BOTH monitor emitters
|
|
5
|
+
// (dogfood/slack-thread.ts · monitor/slack-notify.ts). No I/O, no clock, no
|
|
6
|
+
// random — every function is `string → string` (or a small tuple in), so a
|
|
7
|
+
// rendered message is byte-identical for identical input (deterministic tests).
|
|
8
|
+
//
|
|
9
|
+
// Slack "mrkdwn" is NOT CommonMark: bold is `*x*` (single asterisk), italic is
|
|
10
|
+
// `_x_`, inline code is backticks. These primitives encode exactly that dialect.
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
|
|
13
|
+
/** Bold — Slack mrkdwn uses a SINGLE asterisk (`*x*`, not `**x**`). */
|
|
14
|
+
export function bold(text: string): string {
|
|
15
|
+
return `*${text}*`;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Italic — Slack mrkdwn underscores (`_x_`). */
|
|
19
|
+
export function italic(text: string): string {
|
|
20
|
+
return `_${text}_`;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Inline code span (backticks). */
|
|
24
|
+
export function code(text: string): string {
|
|
25
|
+
return `\`${text}\``;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** A single bullet line (`• item`). Compose several with `\n`. */
|
|
29
|
+
export function bullet(text: string): string {
|
|
30
|
+
return `• ${text}`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* A titled section: a bold heading followed by its body lines (each already a
|
|
35
|
+
* rendered string, e.g. `bullet(...)`). Empty bodies render the heading alone.
|
|
36
|
+
*/
|
|
37
|
+
export function section(title: string, lines: string[] = []): string {
|
|
38
|
+
const head = bold(title);
|
|
39
|
+
return lines.length === 0 ? head : `${head}\n${lines.join("\n")}`;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* A deterministic UTC `HH:MM` clock label for an epoch-ms stamp. Pure (no locale,
|
|
44
|
+
* no self-read clock) — the caller INJECTS the epoch, so renders stay stable
|
|
45
|
+
* across machines/timezones.
|
|
46
|
+
*/
|
|
47
|
+
export function ts(epochMs: number): string {
|
|
48
|
+
return new Date(epochMs).toISOString().slice(11, 16);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* A compact human duration for a millisecond span (`0s` · `45s` · `12m` · `3h`).
|
|
53
|
+
* Pure + deterministic. Used by progress/heartbeat lines.
|
|
54
|
+
*/
|
|
55
|
+
export function fmtDuration(ms: number): string {
|
|
56
|
+
const totalSeconds = Math.max(0, Math.floor(ms / 1000));
|
|
57
|
+
if (totalSeconds < 60) return `${totalSeconds}s`;
|
|
58
|
+
const totalMinutes = Math.floor(totalSeconds / 60);
|
|
59
|
+
if (totalMinutes < 60) return `${totalMinutes}m`;
|
|
60
|
+
const hours = Math.floor(totalMinutes / 60);
|
|
61
|
+
const minutes = totalMinutes % 60;
|
|
62
|
+
return minutes === 0 ? `${hours}h` : `${hours}h${minutes}m`;
|
|
63
|
+
}
|