@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.
Files changed (357) hide show
  1. package/.claude/skills/mutagent-helix/SKILL.md +113 -0
  2. package/.claude/skills/mutagent-helix/scripts/cli/codex-transcode.ts +143 -0
  3. package/.claude/skills/mutagent-helix/scripts/cli/doctor.ts +111 -0
  4. package/.claude/skills/mutagent-helix/scripts/cli/init.ts +382 -0
  5. package/.claude/skills/mutagent-helix/scripts/cli/run.sh +61 -0
  6. package/CLAUDE.md +193 -0
  7. package/LICENSE +201 -0
  8. package/NOTICE +22 -0
  9. package/README.md +209 -0
  10. package/assets/adl-loop.svg +162 -0
  11. package/assets/system-status.svg +422 -0
  12. package/bin/mutagent-cli.mjs +9950 -0
  13. package/bin/mutagent-helix.mjs +78 -0
  14. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/CLAUDE.md +28 -0
  15. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/SKILL.md +138 -0
  16. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/assets/templates/agentspec.yaml.tpl +247 -0
  17. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/references/frameworks/doc-pins.md +53 -0
  18. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/references/principles.md +91 -0
  19. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/references/requirements.yaml +295 -0
  20. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/references/workflows/orchestrator-protocol.md +302 -0
  21. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/cli/doctor.ts +116 -0
  22. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/cli/init.ts +230 -0
  23. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/cli/run.sh +60 -0
  24. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/config/resolve-spec-dir.ts +199 -0
  25. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/contract/agentspec.schema.ts +455 -0
  26. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/setup/detect.ts +67 -0
  27. package/mutagent-agentspec/.claude/skills/mutagent-agentspec/scripts/validate/validate-spec.ts +93 -0
  28. package/mutagent-agentspec/LICENSE +201 -0
  29. package/mutagent-agentspec/NOTICE +19 -0
  30. package/mutagent-agentspec/README.md +44 -0
  31. package/mutagent-builder/.claude/skills/mutagent-builder/SKILL.md +100 -0
  32. package/mutagent-builder/.claude/skills/mutagent-builder/assets/agents/ai-architect.md +312 -0
  33. package/mutagent-builder/.claude/skills/mutagent-builder/assets/agents/ai-engineer.md +357 -0
  34. package/mutagent-builder/.claude/skills/mutagent-builder/assets/templates/build-report.md.tpl +39 -0
  35. package/mutagent-builder/.claude/skills/mutagent-builder/references/principles.md +31 -0
  36. package/mutagent-builder/.claude/skills/mutagent-builder/references/workflows/build-protocol.md +61 -0
  37. package/mutagent-builder/.claude/skills/mutagent-builder/references/workflows/improve-handoff.md +23 -0
  38. package/mutagent-builder/.claude/skills/mutagent-builder/scripts/cli/run.sh +60 -0
  39. package/mutagent-builder/.claude/skills/mutagent-builder/scripts/handoff/validate-build-input.ts +72 -0
  40. package/mutagent-builder/.claude/skills/mutagent-builder/scripts/sync-spec/check-sync-spec.ts +499 -0
  41. package/mutagent-builder/.claude/skills/mutagent-builder/scripts/verify/spec-impl-coverage.ts +182 -0
  42. package/mutagent-builder/CLAUDE.md +25 -0
  43. package/mutagent-builder/README.md +26 -0
  44. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/README.md +192 -0
  45. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/SKILL.md +352 -0
  46. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/agents/ai-architect.md +256 -0
  47. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/agents/ai-engineer.md +344 -0
  48. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/agents/diagnostics-analyzer.md +576 -0
  49. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/agents/discovery.md +425 -0
  50. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/audit.json.tpl +24 -0
  51. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/audit.md.tpl +49 -0
  52. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/config.yaml.tpl +100 -0
  53. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/pr-body.md.tpl +56 -0
  54. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/report.html.tpl +327 -0
  55. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/README.md +27 -0
  56. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/iter-N-handover.md.tpl +125 -0
  57. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/self-diagnosis-contract.v0.1.0.yaml.tpl +234 -0
  58. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/spec.yaml.tpl +152 -0
  59. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/team.yaml.tpl +127 -0
  60. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/templates/shared/wave-N-dashboard.html.tpl +1712 -0
  61. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.1-nl-query.md +59 -0
  62. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.2-tier0-progress.md +58 -0
  63. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.3-analysis-progress.md +44 -0
  64. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.4-html-report.md +61 -0
  65. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.5-rca-detail.md +69 -0
  66. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/diagnostics/WF-2.6-stale-warning.md +53 -0
  67. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.1-welcome.md +60 -0
  68. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.2-source-platform-picker.md +41 -0
  69. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.3-source-auth.md +75 -0
  70. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.4-target-picker.md +48 -0
  71. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.5-ask-tool.md +43 -0
  72. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.6-config-review.md +57 -0
  73. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.7-filter-defaults.md +52 -0
  74. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/assets/wireframes/onboarding/WF-1.8-first-run.md +59 -0
  75. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/examples/sample-findings.json +92 -0
  76. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/examples/sample-meta.json +47 -0
  77. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/adapter-strategy.md +75 -0
  78. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/config-migration.md +84 -0
  79. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/config.md +159 -0
  80. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/filter-search-matrix.md +66 -0
  81. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/harness-knowledge.md +22 -0
  82. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/memory-format.md +78 -0
  83. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/onboarding-decisions.yaml +187 -0
  84. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/operation-inventory.md +59 -0
  85. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/overview.md +167 -0
  86. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/reference.md +119 -0
  87. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/script-index.md +101 -0
  88. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-adapter-contract.md +93 -0
  89. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/claude-code-transcripts.md +66 -0
  90. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/codex-transcripts.md +78 -0
  91. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/codex.md +145 -0
  92. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/install-paths.md +57 -0
  93. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/langfuse.md +178 -0
  94. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/local-jsonl.md +55 -0
  95. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/openobserve.md +102 -0
  96. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/source-platforms/otel.md +63 -0
  97. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/cloud-rest.md +84 -0
  98. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-claude.md +65 -0
  99. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-cloud-agent-sdk.md +92 -0
  100. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-codex.md +72 -0
  101. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-cursor.md +108 -0
  102. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-mastra.md +77 -0
  103. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/target-platforms/local-opencode.md +70 -0
  104. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/apply-pr-comment-format.md +82 -0
  105. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/diagnostics.md +35 -0
  106. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/handover-contract.md +247 -0
  107. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/onboarding.md +300 -0
  108. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/orchestrator-protocol.md +1861 -0
  109. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/rca.md +331 -0
  110. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/rendering-anatomy.md +314 -0
  111. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/schedule-prep.md +100 -0
  112. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/scope-model.md +128 -0
  113. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/references/workflows/verification-methodology.md +174 -0
  114. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/aggregate/sort-findings.ts +0 -0
  115. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/awareness/blind-spots.ts +167 -0
  116. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/awareness/llm-sample.ts +681 -0
  117. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/cli/doctor.ts +215 -0
  118. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/cli/init.ts +1013 -0
  119. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/cli/install-agents.ts +350 -0
  120. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/cli/run.sh +61 -0
  121. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/cli/shared-templates.ts +79 -0
  122. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/config/load.ts +392 -0
  123. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/config/resolve-credential.ts +120 -0
  124. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/config/schema.ts +641 -0
  125. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/config/validate.ts +134 -0
  126. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/context/build-diagnosis-context.ts +417 -0
  127. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/context/load-context.ts +105 -0
  128. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/contract/types.ts +166 -0
  129. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/enrich/build-render-input.ts +1964 -0
  130. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/enrich/corpus-severity.ts +172 -0
  131. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/enrich/dismissal-match.ts +270 -0
  132. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/enrich/rank-remedies.ts +75 -0
  133. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/hooks/install-hooks.sh +46 -0
  134. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/hooks/pre-push.sh +78 -0
  135. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/invocation/parse-brief.ts +188 -0
  136. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/library/match.ts +114 -0
  137. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/library/paths.ts +95 -0
  138. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/library/store.ts +535 -0
  139. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/library/types.ts +181 -0
  140. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/lint/template-inline-js.ts +267 -0
  141. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/memory/append.ts +188 -0
  142. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/memory/read.ts +218 -0
  143. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/normalize/platforms/entity-context.ts +686 -0
  144. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/normalize/read-unitf.ts +267 -0
  145. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/normalize/trace.ts +1078 -0
  146. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/normalize/unitf-adapter.ts +0 -0
  147. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/normalize/unitf-types.ts +213 -0
  148. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/report/persist-selections.ts +174 -0
  149. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/report/render.ts +3254 -0
  150. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/run/diagnose.ts +64 -0
  151. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/run/session.ts +167 -0
  152. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/sample/caps.ts +345 -0
  153. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/sample/deep-read-gate.ts +424 -0
  154. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/sample/representative.ts +584 -0
  155. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/scan/objection.ts +224 -0
  156. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/scan/trajectory.ts +489 -0
  157. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/self-diagnostics/dispatch.ts +135 -0
  158. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/self-diagnostics/probe.ts +170 -0
  159. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/setup/detect.ts +307 -0
  160. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/setup/ensure-cli.ts +315 -0
  161. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/setup/reconfigure.ts +77 -0
  162. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/setup/verify-agents.ts +207 -0
  163. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/slicer.ts +166 -0
  164. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/adapters/claude-code.ts +17 -0
  165. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/adapters/codex.ts +11 -0
  166. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/adapters/langfuse.ts +17 -0
  167. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/adapters/local-jsonl.ts +12 -0
  168. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/adapters/otel.ts +12 -0
  169. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/index.ts +54 -0
  170. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/registry.ts +45 -0
  171. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/source/types.ts +86 -0
  172. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/stale-detector.ts +74 -0
  173. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/test/render-playwright.cli.ts +477 -0
  174. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/tier0/claude-code.ts +133 -0
  175. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/tier0/langfuse.ts +143 -0
  176. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/tier0-scan.ts +423 -0
  177. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/completeness-check.ts +436 -0
  178. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/doc-refs.ts +190 -0
  179. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/finalize-gate.ts +417 -0
  180. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/findings-contract.ts +628 -0
  181. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/render-js-syntax.ts +188 -0
  182. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/report-checklist.yaml +217 -0
  183. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/trace-shape.ts +262 -0
  184. package/mutagent-diagnostics/.claude/skills/mutagent-diagnostics/scripts/validate/wave6-checklist.ts +326 -0
  185. package/mutagent-diagnostics/CLAUDE.md +41 -0
  186. package/mutagent-diagnostics/LICENSE +201 -0
  187. package/mutagent-diagnostics/NOTICE +18 -0
  188. package/mutagent-diagnostics/README.md +343 -0
  189. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/SKILL.md +548 -0
  190. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/agents/audit-executor.md +169 -0
  191. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/agents/dataset-builder.md +160 -0
  192. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/agents/discovery.md +425 -0
  193. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/agents/evaluator.md +1108 -0
  194. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/brand/theme.css +213 -0
  195. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/assets/brand/wordmark.html +9 -0
  196. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/lenses/context-flow-lens.md +85 -0
  197. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/lenses/data-lens.md +47 -0
  198. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/lenses/decision-lens.md +48 -0
  199. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/lenses/methodology-critic-lens.md +53 -0
  200. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/lenses/trajectory-lens.md +44 -0
  201. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/build-review-interface.md +83 -0
  202. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/edd-loop.md +134 -0
  203. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/error-analysis.md +113 -0
  204. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/eval-audit.md +154 -0
  205. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/eval-stage.md +168 -0
  206. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/generate-synthetic-data.md +81 -0
  207. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/grounded-adjudication.md +221 -0
  208. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/memory-format.md +65 -0
  209. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/methodology.md +201 -0
  210. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/operation-inventory.md +197 -0
  211. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/validate-evaluator.md +125 -0
  212. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/workflows/orchestrator-protocol.md +300 -0
  213. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/references/write-judge-prompt.md +123 -0
  214. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/behavior-tree.schema.yaml +73 -0
  215. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/dataset.schema.yaml +66 -0
  216. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/edd-change-request.schema.yaml +114 -0
  217. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/eval-matrix.schema.yaml +74 -0
  218. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/flow-graph.schema.yaml +69 -0
  219. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/flow-profile.schema.yaml +49 -0
  220. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/methodology-review.schema.yaml +40 -0
  221. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/schemas/scorecard.schema.yaml +85 -0
  222. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/agent-dispatch.ts +0 -0
  223. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/aggregate-discover.ts +543 -0
  224. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/artifact-paths.ts +115 -0
  225. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/assemble-scorecard.ts +172 -0
  226. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/build-dataset.ts +186 -0
  227. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/build-evals.ts +93 -0
  228. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/build-review-ui.ts +393 -0
  229. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/check-method-router.ts +170 -0
  230. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/aggregate.ts +112 -0
  231. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/audit-run.ts +182 -0
  232. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/doctor.ts +211 -0
  233. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/dogfood.ts +133 -0
  234. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/init.ts +601 -0
  235. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/methodology-review.ts +122 -0
  236. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/prep.ts +295 -0
  237. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/profile-subject.ts +165 -0
  238. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/run.sh +56 -0
  239. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cli/variance-check.ts +105 -0
  240. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/code-eval.ts +248 -0
  241. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/code-quality-verdict.ts +285 -0
  242. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/codegen-evals.ts +173 -0
  243. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cold-start-project.ts +151 -0
  244. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/cold-start-sampler.ts +267 -0
  245. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/config/load.ts +343 -0
  246. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/config/schema.ts +380 -0
  247. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/agentspec-evals.ts +85 -0
  248. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/dataset.ts +149 -0
  249. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/eval-engine.ts +118 -0
  250. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/eval-matrix.ts +577 -0
  251. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/eval-types.ts +1074 -0
  252. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/flow-graph.ts +194 -0
  253. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/types.ts +303 -0
  254. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/contracts/validation.ts +193 -0
  255. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/derive-dataset.ts +152 -0
  256. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/determine-outcome.ts +219 -0
  257. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/diff-discriminate.ts +160 -0
  258. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/discover-criteria.ts +348 -0
  259. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/edd/change-request.ts +232 -0
  260. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/edd/edd-types.ts +210 -0
  261. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/edd/variance-gate.ts +186 -0
  262. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/emit-completeness.ts +111 -0
  263. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/eval-engine.ts +160 -0
  264. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/evaluate.ts +333 -0
  265. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/flow-graph.ts +230 -0
  266. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/judge-prompt-template.ts +253 -0
  267. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/judge-provider.ts +135 -0
  268. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/lint-grounding.ts +229 -0
  269. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/lint-uniformity.ts +168 -0
  270. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/living-suite.ts +109 -0
  271. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/load-bundle.ts +203 -0
  272. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/load-profile-vocab.ts +64 -0
  273. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/load-profile.ts +106 -0
  274. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/mask.ts +138 -0
  275. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/materialize-dataset.ts +113 -0
  276. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/matrix-judge.ts +750 -0
  277. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/memory/append.ts +215 -0
  278. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/memory/read.ts +168 -0
  279. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/persist-eval-criteria.ts +232 -0
  280. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/prep-tasks.ts +125 -0
  281. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/profile-subject.ts +310 -0
  282. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/publish-report.ts +131 -0
  283. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/read-unitf-traces.ts +81 -0
  284. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/render-build-cards.ts +195 -0
  285. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/render-discover-report.ts +1640 -0
  286. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/render-eval-report.ts +3838 -0
  287. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/render-report.ts +212 -0
  288. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/resolve-credential.ts +110 -0
  289. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/resolve-ref.ts +98 -0
  290. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/result-verify.ts +129 -0
  291. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/route-failures.ts +330 -0
  292. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/run-deterministic.ts +367 -0
  293. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/run-evaluate.ts +719 -0
  294. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/run-judge.ts +155 -0
  295. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/run-pipeline.ts +175 -0
  296. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/sample-traces.ts +210 -0
  297. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/self-audit.ts +387 -0
  298. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/source-map.ts +106 -0
  299. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/subject-profile.ts +134 -0
  300. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/substrate.ts +162 -0
  301. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/sync-eval-criteria.ts +244 -0
  302. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/ui-slots.ts +119 -0
  303. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/unitf-to-evaltrace.ts +284 -0
  304. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/validate-judge.ts +358 -0
  305. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/scripts/variance-compare.ts +177 -0
  306. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/subjects/mutagent-diagnostics/behavior-tree.yaml +140 -0
  307. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/subjects/mutagent-diagnostics/eval-matrix.yaml +1270 -0
  308. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/subjects/mutagent-diagnostics/methodology-review.yaml +105 -0
  309. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/workflows/audit.workflow.js +82 -0
  310. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/workflows/data-leak.workflow.js +236 -0
  311. package/mutagent-evaluator/.claude/skills/mutagent-evaluator/workflows/variance.workflow.js +163 -0
  312. package/mutagent-evaluator/CLAUDE.md +45 -0
  313. package/mutagent-evaluator/LICENSE +201 -0
  314. package/mutagent-evaluator/NOTICE +23 -0
  315. package/mutagent-evaluator/README.md +88 -0
  316. package/mutagent-optimize/.claude/skills/mutagent-optimize/SKILL.md +287 -0
  317. package/mutagent-optimize/.claude/skills/mutagent-optimize/scripts/contracts/amend-request.ts +503 -0
  318. package/mutagent-optimize/.claude/skills/mutagent-optimize/scripts/improve-loop-run.ts +304 -0
  319. package/mutagent-optimize/.claude/skills/mutagent-optimize/scripts/loop-state-cli.ts +300 -0
  320. package/mutagent-optimize/.claude/skills/mutagent-optimize/scripts/loop-state.ts +440 -0
  321. package/mutagent-optimize/CLAUDE.md +49 -0
  322. package/mutagent-optimize/README.md +26 -0
  323. package/mutagent-orchestrator/CLAUDE.md +102 -0
  324. package/mutagent-orchestrator/README.md +20 -0
  325. package/mutagent-orchestrator/assets/agents/discovery.md +425 -0
  326. package/mutagent-orchestrator/assets/agents/dogfood-monitor.md +266 -0
  327. package/mutagent-orchestrator/assets/agents/monitor.md +258 -0
  328. package/mutagent-orchestrator/orchestrator.md +782 -0
  329. package/mutagent-orchestrator/references/MONITORING.md +209 -0
  330. package/mutagent-orchestrator/references/config-fields.md +132 -0
  331. package/mutagent-orchestrator/references/config-migration.md +132 -0
  332. package/mutagent-orchestrator/references/index-registry.md +92 -0
  333. package/mutagent-orchestrator/routing.yaml +391 -0
  334. package/mutagent-orchestrator/scripts/config-schema.ts +1010 -0
  335. package/mutagent-orchestrator/scripts/dispatch.ts +439 -0
  336. package/mutagent-orchestrator/scripts/dogfood/extract-feedback.ts +203 -0
  337. package/mutagent-orchestrator/scripts/dogfood/reconstruct-trajectory.ts +327 -0
  338. package/mutagent-orchestrator/scripts/dogfood/render-dogfood-report.ts +347 -0
  339. package/mutagent-orchestrator/scripts/dogfood/resolve-subagents.ts +160 -0
  340. package/mutagent-orchestrator/scripts/dogfood/run-report.ts +264 -0
  341. package/mutagent-orchestrator/scripts/dogfood/slack-thread.ts +106 -0
  342. package/mutagent-orchestrator/scripts/dogfood/types.ts +257 -0
  343. package/mutagent-orchestrator/scripts/eval-routing.ts +753 -0
  344. package/mutagent-orchestrator/scripts/gate.ts +219 -0
  345. package/mutagent-orchestrator/scripts/handover-contract.ts +362 -0
  346. package/mutagent-orchestrator/scripts/index/build-index.ts +351 -0
  347. package/mutagent-orchestrator/scripts/index/render-index.ts +110 -0
  348. package/mutagent-orchestrator/scripts/monitor/slack-notify.ts +111 -0
  349. package/mutagent-orchestrator/scripts/monitor/triggers.ts +162 -0
  350. package/mutagent-orchestrator/scripts/onboarding-check.ts +369 -0
  351. package/mutagent-orchestrator/scripts/render-roster.ts +308 -0
  352. package/mutagent-orchestrator/scripts/resolve-credential.ts +185 -0
  353. package/mutagent-orchestrator/scripts/resolve-paths.ts +114 -0
  354. package/mutagent-orchestrator/scripts/slack/format.ts +63 -0
  355. package/mutagent-orchestrator/scripts/slack/post.ts +115 -0
  356. package/mutagent-orchestrator/scripts/sync-index.ts +311 -0
  357. package/package.json +64 -0
@@ -0,0 +1,170 @@
1
+ /**
2
+ * scripts/self-diagnostics/probe.ts
3
+ * [INTERNAL] Detect host coding-agent runtime and locate current session transcript path (PR-022)
4
+ * Type A — Pure Script (env + fs probing — no I/O side effects)
5
+ *
6
+ * Self-diagnostics is GATED by config.yaml: self_diagnostics.enabled (default: false)
7
+ * Only runs for skill maintainers + dogfood mode.
8
+ *
9
+ * Usage: bun scripts/self-diagnostics/probe.ts [project-root]
10
+ */
11
+
12
+ import { existsSync, readdirSync, statSync } from "fs";
13
+ import { resolve, join } from "path";
14
+ import os from "os";
15
+
16
+ export type HostRuntime = "claude-code" | "codex" | "unknown";
17
+
18
+ export interface ProbeResult {
19
+ runtime: HostRuntime;
20
+ transcriptRoot: string | null;
21
+ currentSessionPath: string | null;
22
+ allSessionPaths: string[];
23
+ notes: string[];
24
+ }
25
+
26
+ /**
27
+ * Probe the host runtime and locate session transcripts.
28
+ * Claude Code: ~/.claude/projects/<encoded-path>/<session-id>.jsonl
29
+ * Codex: ~/.codex/sessions/<session>.jsonl
30
+ */
31
+ export function probeHostRuntime(projectRoot: string): ProbeResult {
32
+ const home = os.homedir();
33
+ const notes: string[] = [];
34
+
35
+ // Detect Claude Code
36
+ const claudeProjectsRoot = join(home, ".claude", "projects");
37
+ if (existsSync(claudeProjectsRoot)) {
38
+ // PRIMARY resolution: scan ~/.claude/projects/ for the subdirectory whose
39
+ // encoded form matches this project's cwd. Claude Code encodes the absolute
40
+ // project path by replacing path separators with hyphens — the result
41
+ // LEGITIMATELY starts with a leading hyphen (e.g. `-Users-foo-proj`), so we
42
+ // must NOT strip it (SD-1). We match against the live directory listing so
43
+ // any encoding quirks (trailing chars, special-char handling) still resolve.
44
+ const encodedPath = encodeProjectPath(projectRoot);
45
+ const projectSessionDir = resolveClaudeProjectDir(claudeProjectsRoot, encodedPath);
46
+
47
+ if (projectSessionDir) {
48
+ const sessions = readdirSync(projectSessionDir)
49
+ .filter((f) => f.endsWith(".jsonl"))
50
+ .map((f) => join(projectSessionDir, f))
51
+ .sort((a, b) => {
52
+ // Sort by mtime descending — most recent first
53
+ try {
54
+ return statSync(b).mtimeMs - statSync(a).mtimeMs;
55
+ } catch {
56
+ return 0;
57
+ }
58
+ });
59
+
60
+ return {
61
+ runtime: "claude-code",
62
+ transcriptRoot: projectSessionDir,
63
+ currentSessionPath: sessions[0] ?? null,
64
+ allSessionPaths: sessions,
65
+ notes: [`Found ${sessions.length} Claude Code session(s) for this project`],
66
+ };
67
+ }
68
+
69
+ // Project not found — surface the encoded path we looked for, for debugging
70
+ notes.push(`Claude Code projects dir exists but no session dir matched: ${encodedPath}`);
71
+ return {
72
+ runtime: "claude-code",
73
+ transcriptRoot: claudeProjectsRoot,
74
+ currentSessionPath: null,
75
+ allSessionPaths: [],
76
+ notes,
77
+ };
78
+ }
79
+
80
+ // Detect Codex (iter-8 confirmed paths)
81
+ const codexSessionsRoot = join(home, ".codex", "sessions");
82
+ if (existsSync(codexSessionsRoot)) {
83
+ const sessions = readdirSync(codexSessionsRoot)
84
+ .filter((f) => f.endsWith(".jsonl"))
85
+ .map((f) => join(codexSessionsRoot, f))
86
+ .sort((a, b) => {
87
+ try {
88
+ return statSync(b).mtimeMs - statSync(a).mtimeMs;
89
+ } catch {
90
+ return 0;
91
+ }
92
+ });
93
+
94
+ return {
95
+ runtime: "codex",
96
+ transcriptRoot: codexSessionsRoot,
97
+ currentSessionPath: sessions[0] ?? null,
98
+ allSessionPaths: sessions,
99
+ notes: [`Found ${sessions.length} Codex session(s)`],
100
+ };
101
+ }
102
+
103
+ notes.push("Could not detect Claude Code or Codex session directories.");
104
+ return {
105
+ runtime: "unknown",
106
+ transcriptRoot: null,
107
+ currentSessionPath: null,
108
+ allSessionPaths: [],
109
+ notes,
110
+ };
111
+ }
112
+
113
+ /**
114
+ * Encode a project path the same way Claude Code does.
115
+ * Claude Code encodes the ABSOLUTE path by replacing every path separator with
116
+ * a hyphen. Because an absolute POSIX path begins with `/`, the encoded form
117
+ * LEGITIMATELY begins with a leading hyphen (e.g. `/srv/foo` → `-srv-foo`).
118
+ *
119
+ * SD-1: a previous version stripped that leading hyphen (`.replace(/^-/, "")`),
120
+ * which meant the encoded form never matched the real on-disk directory name —
121
+ * those directories really do start with `-`. The strip is removed here.
122
+ *
123
+ * Exported for unit testing.
124
+ */
125
+ export function encodeProjectPath(projectPath: string): string {
126
+ const abs = resolve(projectPath);
127
+ return abs.replace(/\//g, "-");
128
+ }
129
+
130
+ /**
131
+ * Resolve the `~/.claude/projects/` subdirectory for a project.
132
+ *
133
+ * PRIMARY path: an exact match on the encoded directory name. Because the
134
+ * encoded form keeps its leading hyphen (SD-1), this now matches the real
135
+ * directory layout.
136
+ *
137
+ * FALLBACK path: if the exact name isn't present (Claude Code's encoder may
138
+ * differ on edge chars across versions), scan the live listing for a directory
139
+ * whose own decoded form points back at the same cwd. This makes the cwd match
140
+ * — not the synthesized string — the source of truth.
141
+ *
142
+ * Returns the absolute directory path, or null when nothing matches.
143
+ */
144
+ function resolveClaudeProjectDir(
145
+ claudeProjectsRoot: string,
146
+ encodedPath: string,
147
+ ): string | null {
148
+ const exact = join(claudeProjectsRoot, encodedPath);
149
+ if (existsSync(exact) && statSync(exact).isDirectory()) {
150
+ return exact;
151
+ }
152
+
153
+ let entries: string[];
154
+ try {
155
+ entries = readdirSync(claudeProjectsRoot);
156
+ } catch {
157
+ return null;
158
+ }
159
+
160
+ const match = entries.find((name) => name === encodedPath);
161
+ return match ? join(claudeProjectsRoot, match) : null;
162
+ }
163
+
164
+ // CLI entrypoint
165
+ if (import.meta.main) {
166
+ const projectRoot = process.argv[2] ?? process.cwd();
167
+ const result = probeHostRuntime(projectRoot);
168
+ process.stdout.write(JSON.stringify(result, null, 2) + "\n");
169
+ process.exit(result.currentSessionPath ? 0 : 1);
170
+ }
@@ -0,0 +1,307 @@
1
+ /**
2
+ * scripts/setup/detect.ts
3
+ * Detect config presence + per-field completeness (FR-001, FR-002)
4
+ * Type A — Pure Script (file reads + state checks — no I/O side effects)
5
+ *
6
+ * Usage: bun scripts/setup/detect.ts [project-root]
7
+ * Exit 0 = config present + complete
8
+ * Exit 1 = config missing or incomplete
9
+ */
10
+
11
+ import { existsSync } from "fs";
12
+ import { resolve, join } from "path";
13
+ import { loadConfig, configPathFor, parseSelectors } from "../config/load.ts";
14
+ import type { RoleSelectors } from "../config/load.ts";
15
+ import { validateResolved } from "../config/validate.ts";
16
+ import { planCliEnsure } from "./ensure-cli.ts";
17
+ import type { CliEnsurePlan, CliProbe } from "./ensure-cli.ts";
18
+ import type { SourcePlatform } from "../normalize/trace.ts";
19
+
20
+ export type SetupState = "missing" | "partial" | "complete";
21
+
22
+ // ── R-SELF-05-a: CWD-leak guard helpers ──────────────────────────────────────
23
+
24
+ /**
25
+ * Walk parent directories from `cwd` upward until we find a directory
26
+ * containing a `.git` entry. Returns the git root, or null if not found
27
+ * within the filesystem root.
28
+ */
29
+ export function findGitRoot(cwd: string): string | null {
30
+ let current = resolve(cwd);
31
+ const root = current.split("/")[0] + "/"; // filesystem root
32
+ while (current !== root) {
33
+ if (existsSync(join(current, ".git"))) {
34
+ return current;
35
+ }
36
+ const parent = resolve(current, "..");
37
+ if (parent === current) break; // at filesystem root
38
+ current = parent;
39
+ }
40
+ return null;
41
+ }
42
+
43
+ /**
44
+ * Detect if `cwd` is inside a skills directory (i.e. ~/.claude/skills/<skill>
45
+ * or any path that looks like a deployed skill dir). If so, exit(1) with an
46
+ * actionable error message.
47
+ *
48
+ * The canonical smell is: cwd is inside `<home>/.claude/skills/` or the path
49
+ * contains `/.claude/skills/` anywhere, which indicates the script is running
50
+ * FROM inside the skill package rather than from a project root.
51
+ *
52
+ * R-SELF-05-a: prevents "detect confusing the skill dir for the project root"
53
+ * which caused false-negative setup detection during dogfood (F-SELF-05).
54
+ */
55
+ export function assertNotInSkillDir(cwd: string): void {
56
+ const normalised = resolve(cwd);
57
+ // Pattern 1: inside ~/.claude/skills/<skill>
58
+ const home = process.env.HOME ?? "";
59
+ const userSkillsPrefix = join(home, ".claude", "skills");
60
+ if (home && normalised.startsWith(userSkillsPrefix + "/")) {
61
+ process.stderr.write(
62
+ `[mutagent-diagnostics] ERROR: detect.ts invoked with cwd="${normalised}",\n` +
63
+ `which is INSIDE the skill's install directory (${userSkillsPrefix}/).\n` +
64
+ `This means you are running setup detection FROM the skill package, not from your project root.\n` +
65
+ `\nFIX: pass your project root as the argument:\n` +
66
+ ` bun scripts/cli/run.sh scripts/setup/detect.ts /path/to/your/project\n` +
67
+ ` # or omit the arg to use the current working directory of your shell.\n`
68
+ );
69
+ process.exit(1);
70
+ }
71
+
72
+ // Pattern 2: path contains /.claude/skills/ anywhere (worktree / symlink chain)
73
+ if (normalised.includes("/.claude/skills/")) {
74
+ process.stderr.write(
75
+ `[mutagent-diagnostics] ERROR: detect.ts invoked with cwd="${normalised}",\n` +
76
+ `which appears to be inside a .claude/skills/ directory.\n` +
77
+ `Pass your actual project root instead of the skill install path.\n`
78
+ );
79
+ process.exit(1);
80
+ }
81
+ }
82
+
83
+ export interface DetectResult {
84
+ state: SetupState;
85
+ configPath: string;
86
+ exists: boolean;
87
+ valid: boolean;
88
+ missingFields: string[];
89
+ errors: Array<{ path: string; message: string }>;
90
+ /**
91
+ * v0.2.0 HARD-CUT: the config is a LEGACY (pre-v0.2.0) shape — it was NOT parsed.
92
+ * A `migration-required` state; the caller runs the migration DIRECTIVE
93
+ * (references/config-migration.md) before anything else.
94
+ */
95
+ migrationRequired: boolean;
96
+ legacyMarkers: string[];
97
+ /**
98
+ * SELECTION: when >1 source exists with no `default:true` and no `--source` override,
99
+ * the run flow must PROMPT the operator to pick one. This is NON-fatal for the
100
+ * onboarding gate (a source DOES exist) — `state` stays `complete` and these names
101
+ * feed the run-start ASK (orchestrator-protocol Step 1). Empty unless a prompt is due.
102
+ */
103
+ sourceNeedsSelection: string[];
104
+ /** SELECTION: same, for the target catalog. */
105
+ targetNeedsSelection: string[];
106
+ }
107
+
108
+ export function detectSetup(
109
+ projectRoot: string,
110
+ selectors: RoleSelectors = {},
111
+ ): DetectResult {
112
+ const configPath = configPathFor(projectRoot);
113
+ const exists = existsSync(configPath);
114
+
115
+ if (!exists) {
116
+ return {
117
+ state: "missing",
118
+ configPath,
119
+ exists: false,
120
+ valid: false,
121
+ missingFields: [
122
+ "global.sources[] (source-consumer role)",
123
+ "global.targets[] (target-writer role)",
124
+ "ask_tool.runtime",
125
+ ],
126
+ errors: [],
127
+ migrationRequired: false,
128
+ legacyMarkers: [],
129
+ sourceNeedsSelection: [],
130
+ targetNeedsSelection: [],
131
+ };
132
+ }
133
+
134
+ const loadResult = loadConfig(projectRoot, selectors);
135
+
136
+ // v0.2.0 HARD-CUT: a legacy shape short-circuits to migration-required.
137
+ if (loadResult.migrationRequired) {
138
+ return {
139
+ state: "partial",
140
+ configPath,
141
+ exists: true,
142
+ valid: false,
143
+ missingFields: [],
144
+ errors: loadResult.legacyMarkers.map((m) => ({
145
+ path: "config_version",
146
+ message: `legacy config — migration required (references/config-migration.md): ${m}`,
147
+ })),
148
+ migrationRequired: true,
149
+ legacyMarkers: loadResult.legacyMarkers,
150
+ sourceNeedsSelection: [],
151
+ targetNeedsSelection: [],
152
+ };
153
+ }
154
+
155
+ if (loadResult.error) {
156
+ return {
157
+ state: "partial",
158
+ configPath,
159
+ exists: true,
160
+ valid: false,
161
+ missingFields: [],
162
+ errors: [{ path: "config.yaml", message: loadResult.error }],
163
+ migrationRequired: false,
164
+ legacyMarkers: [],
165
+ sourceNeedsSelection: [],
166
+ targetNeedsSelection: [],
167
+ };
168
+ }
169
+
170
+ if (!loadResult.config) {
171
+ return {
172
+ state: "partial",
173
+ configPath,
174
+ exists: true,
175
+ valid: false,
176
+ missingFields: ["(empty lifecycle.diagnostics section)"],
177
+ errors: [],
178
+ migrationRequired: false,
179
+ legacyMarkers: [],
180
+ sourceNeedsSelection: [],
181
+ targetNeedsSelection: [],
182
+ };
183
+ }
184
+
185
+ // Validate the SECTION + any resolved (bound) catalog entry's shape. When a catalog
186
+ // is present-but-unpicked (`needs-selection`), a source/target DOES exist — we must
187
+ // NOT let validateResolved flag it as a null-missing field (that would fail the gate).
188
+ // So we substitute the first candidate purely for the section/shape validation pass;
189
+ // the real bound entry is null and gets resolved at run start via the ASK.
190
+ const source = loadResult.source;
191
+ const target = loadResult.target;
192
+ const validation = validateResolved({
193
+ config: loadResult.config,
194
+ source,
195
+ target,
196
+ });
197
+
198
+ const missingFields = [...validation.missingFields];
199
+ const errors = [...validation.errors];
200
+
201
+ // ── SELECTION outcomes (per source + target) ────────────────────────────────
202
+ const sel = loadResult.sourceSelection;
203
+ const tgt = loadResult.targetSelection;
204
+
205
+ // `needs-selection` = present but unpicked → NON-FATAL. Remove the null-missing
206
+ // field validateResolved added, and surface the candidates for the run-start ASK.
207
+ const sourceNeedsSelection =
208
+ sel.status === "needs-selection" ? sel.candidates : [];
209
+ const targetNeedsSelection =
210
+ tgt.status === "needs-selection" ? tgt.candidates : [];
211
+
212
+ const notFatalMissing = (m: string): boolean => {
213
+ if (sourceNeedsSelection.length > 0 && m.startsWith("global.sources[]")) {
214
+ return false;
215
+ }
216
+ if (targetNeedsSelection.length > 0 && m.startsWith("global.targets[]")) {
217
+ return false;
218
+ }
219
+ return true;
220
+ };
221
+ const filteredMissing = missingFields.filter(notFatalMissing);
222
+
223
+ // `multiple-defaults` + `unknown-name` ARE hard errors (config/override mistakes).
224
+ for (const [role, outcome] of [
225
+ ["source", sel],
226
+ ["target", tgt],
227
+ ] as const) {
228
+ if (outcome.status === "multiple-defaults") {
229
+ errors.push({
230
+ path: `global.${role}s[]`,
231
+ message: `multiple ${role}s carry \`default: true\` (${outcome.candidates.join(", ")}) — exactly one default is allowed. Remove the extra default(s) or pass --${role} <name>.`,
232
+ });
233
+ } else if (outcome.status === "unknown-name") {
234
+ errors.push({
235
+ path: `global.${role}s[]`,
236
+ message: `--${role} "${outcome.requestedName ?? ""}" matched no entry. Available: ${outcome.candidates.join(", ") || "(none)"}.`,
237
+ });
238
+ }
239
+ }
240
+
241
+ const valid = errors.length === 0 && filteredMissing.length === 0;
242
+
243
+ return {
244
+ state: valid ? "complete" : "partial",
245
+ configPath,
246
+ exists: true,
247
+ valid,
248
+ missingFields: filteredMissing,
249
+ errors,
250
+ migrationRequired: false,
251
+ legacyMarkers: [],
252
+ sourceNeedsSelection,
253
+ targetNeedsSelection,
254
+ };
255
+ }
256
+
257
+ // ── Source-platform CLI detection (PR-021) ────────────────────────────────────
258
+
259
+ /**
260
+ * Probe whether the chosen source platform's CLI is installed, and return a
261
+ * plan describing what onboarding should do (offer an approval-gated install,
262
+ * fall back to REST/file, or nothing). Pure read — NEVER installs.
263
+ *
264
+ * Thin wrapper over `planCliEnsure` so callers can stay in the `setup/detect.ts`
265
+ * surface for all "what state is setup in?" probes. The actual approval prompt
266
+ * and install live in `cli/init.ts` (the only sanctioned installer).
267
+ *
268
+ * @param platform - The configured/chosen source platform.
269
+ * @param probe - Injectable PATH probe (for deterministic tests).
270
+ */
271
+ export function detectSourceCli(
272
+ platform: SourcePlatform,
273
+ probe?: CliProbe
274
+ ): CliEnsurePlan {
275
+ return planCliEnsure(platform, probe);
276
+ }
277
+
278
+ // CLI entrypoint
279
+ if (import.meta.main) {
280
+ const argv = process.argv.slice(2);
281
+
282
+ // Subcommand: `detect.ts --cli <platform>` — probe a source platform's CLI.
283
+ const cliFlagIdx = argv.indexOf("--cli");
284
+ if (cliFlagIdx !== -1) {
285
+ const platform = argv[cliFlagIdx + 1] as SourcePlatform | undefined;
286
+ if (!platform) {
287
+ process.stderr.write(
288
+ "[mutagent-diagnostics] ERROR: --cli requires a source platform argument.\n" +
289
+ " usage: detect.ts --cli <langfuse|otel|local-jsonl|claude-code|codex>\n"
290
+ );
291
+ process.exit(2);
292
+ }
293
+ const plan = detectSourceCli(platform);
294
+ process.stdout.write(JSON.stringify(plan, null, 2) + "\n");
295
+ // Exit 0 when the CLI is present or not required; 1 when missing (any kind).
296
+ process.exit(plan.status === "present" || plan.status === "not-required" ? 0 : 1);
297
+ }
298
+
299
+ // SELECTION: `--source <name>` / `--target <name>` force a specific catalog entry.
300
+ const { selectors, positionals } = parseSelectors(argv);
301
+ const projectRoot = positionals[0] ?? process.cwd();
302
+ // R-SELF-05-a: guard against running from inside the skill dir
303
+ assertNotInSkillDir(projectRoot);
304
+ const result = detectSetup(projectRoot, selectors);
305
+ process.stdout.write(JSON.stringify(result, null, 2) + "\n");
306
+ process.exit(result.state === "complete" ? 0 : 1);
307
+ }