@monoes/monomindcli 2.16.3 → 2.16.5

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 (488) hide show
  1. package/.claude/agents/github/repo-architect.md +1 -1
  2. package/.claude/agents/specialists/integration-architect.md +9 -13
  3. package/.claude/commands/agents/agent-capabilities.md +1 -0
  4. package/.claude/commands/agents/agent-coordination.md +1 -0
  5. package/.claude/commands/agents/agent-spawning.md +1 -0
  6. package/.claude/commands/agents/agent-types.md +1 -0
  7. package/.claude/commands/analysis/bottleneck-detect.md +1 -0
  8. package/.claude/commands/analysis/performance-bottlenecks.md +1 -0
  9. package/.claude/commands/analysis/performance-report.md +1 -0
  10. package/.claude/commands/analysis/token-usage.md +1 -0
  11. package/.claude/commands/automation/README.md +1 -1
  12. package/.claude/commands/automation/auto-agent.md +1 -0
  13. package/.claude/commands/automation/self-healing.md +1 -0
  14. package/.claude/commands/automation/session-memory.md +1 -0
  15. package/.claude/commands/automation/smart-agents.md +1 -0
  16. package/.claude/commands/automation/smart-spawn.md +1 -0
  17. package/.claude/commands/automation/workflow-select.md +22 -27
  18. package/.claude/commands/coordination/README.md +2 -2
  19. package/.claude/commands/coordination/agent-spawn.md +1 -0
  20. package/.claude/commands/coordination/monoswarm-init.md +9 -8
  21. package/.claude/commands/coordination/task-orchestrate.md +6 -5
  22. package/.claude/commands/github/README.md +1 -1
  23. package/.claude/commands/github/github-modes.md +1 -0
  24. package/.claude/commands/github/issue-tracker.md +1 -0
  25. package/.claude/commands/github/pr-manager.md +1 -0
  26. package/.claude/commands/github/release-manager.md +1 -2
  27. package/.claude/commands/github/repo-architect.md +1 -0
  28. package/.claude/commands/github/sync-coordinator.md +1 -0
  29. package/.claude/commands/hooks/overview.md +1 -0
  30. package/.claude/commands/hooks/post-edit.md +1 -0
  31. package/.claude/commands/hooks/post-task.md +1 -0
  32. package/.claude/commands/hooks/pre-edit.md +1 -0
  33. package/.claude/commands/hooks/pre-task.md +1 -0
  34. package/.claude/commands/hooks/session-end.md +1 -0
  35. package/.claude/commands/hooks/setup.md +1 -0
  36. package/.claude/commands/mastermind/adr.md +3 -1
  37. package/.claude/commands/mastermind/brain.md +3 -1
  38. package/.claude/commands/mastermind/budget.md +3 -1
  39. package/.claude/commands/mastermind/code-review.md +3 -1
  40. package/.claude/commands/mastermind/content.md +3 -1
  41. package/.claude/commands/mastermind/createorg.md +4 -2
  42. package/.claude/commands/mastermind/createtask.md +6 -4
  43. package/.claude/commands/mastermind/debug.md +3 -1
  44. package/.claude/commands/mastermind/design.md +3 -1
  45. package/.claude/commands/mastermind/do.md +5 -3
  46. package/.claude/commands/mastermind/execute.md +3 -1
  47. package/.claude/commands/mastermind/finance.md +3 -1
  48. package/.claude/commands/mastermind/graph-status.md +3 -1
  49. package/.claude/commands/mastermind/help.md +17 -20
  50. package/.claude/commands/mastermind/idea.md +3 -1
  51. package/.claude/commands/mastermind/ideate.md +4 -2
  52. package/.claude/commands/mastermind/improve.md +4 -2
  53. package/.claude/commands/mastermind/loops.md +3 -1
  54. package/.claude/commands/mastermind/marketing.md +3 -1
  55. package/.claude/commands/mastermind/master.md +4 -3
  56. package/.claude/commands/mastermind/memory.md +8 -36
  57. package/.claude/commands/mastermind/monoswarm.md +3 -2
  58. package/.claude/commands/mastermind/okf-export.md +3 -1
  59. package/.claude/commands/mastermind/okf-import.md +3 -1
  60. package/.claude/commands/mastermind/ops.md +3 -1
  61. package/.claude/commands/mastermind/orgs.md +3 -1
  62. package/.claude/commands/mastermind/orgstatus.md +3 -1
  63. package/.claude/commands/mastermind/plan.md +3 -1
  64. package/.claude/commands/mastermind/receive-review.md +3 -1
  65. package/.claude/commands/mastermind/release.md +3 -1
  66. package/.claude/commands/mastermind/repeat.md +3 -1
  67. package/.claude/commands/mastermind/research.md +3 -1
  68. package/.claude/commands/mastermind/review.md +3 -1
  69. package/.claude/commands/mastermind/runorg.md +4 -2
  70. package/.claude/commands/mastermind/sales.md +3 -1
  71. package/.claude/commands/mastermind/skill-builder.md +3 -1
  72. package/.claude/commands/mastermind/specialagents.md +3 -1
  73. package/.claude/commands/mastermind/stoporg.md +9 -11
  74. package/.claude/commands/mastermind/techport.md +3 -1
  75. package/.claude/commands/mastermind/topology.md +4 -3
  76. package/.claude/commands/mastermind/understand.md +3 -1
  77. package/.claude/commands/mastermind/worktree.md +3 -1
  78. package/.claude/commands/memory/memory-search.md +1 -0
  79. package/.claude/commands/monitoring/README.md +1 -1
  80. package/.claude/commands/monitoring/agent-metrics.md +1 -0
  81. package/.claude/commands/monitoring/agents.md +1 -0
  82. package/.claude/commands/monitoring/status.md +1 -0
  83. package/.claude/commands/monoswarm/README.md +3 -3
  84. package/.claude/commands/monoswarm/analysis.md +2 -2
  85. package/.claude/commands/monoswarm/consensus.md +1 -0
  86. package/.claude/commands/monoswarm/development.md +3 -3
  87. package/.claude/commands/monoswarm/examples.md +4 -4
  88. package/.claude/commands/monoswarm/init.md +2 -1
  89. package/.claude/commands/monoswarm/maintenance.md +2 -2
  90. package/.claude/commands/monoswarm/memory.md +1 -0
  91. package/.claude/commands/monoswarm/monoswarm.md +5 -5
  92. package/.claude/commands/monoswarm/optimization.md +2 -2
  93. package/.claude/commands/monoswarm/research.md +2 -2
  94. package/.claude/commands/monoswarm/spawn.md +1 -0
  95. package/.claude/commands/monoswarm/status.md +2 -1
  96. package/.claude/commands/monoswarm/stop.md +2 -1
  97. package/.claude/commands/monoswarm/testing.md +2 -2
  98. package/.claude/commands/pair/README.md +8 -9
  99. package/.claude/commands/pair/examples.md +3 -4
  100. package/.claude/commands/pair/session.md +1 -1
  101. package/.claude/commands/workflows/README.md +45 -40
  102. package/.claude/commands/workflows/development.md +42 -55
  103. package/.claude/commands/workflows/research.md +41 -57
  104. package/.claude/commands/workflows/workflow-create.md +43 -45
  105. package/.claude/commands/workflows/workflow-execute.md +58 -68
  106. package/.claude/commands/workflows/workflow-export.md +37 -63
  107. package/.claude/helpers/agent-registry.cjs +434 -0
  108. package/.claude/helpers/build-skill-registry.cjs +10 -6
  109. package/.claude/helpers/handlers/pick-core.cjs +55 -26
  110. package/.claude/helpers/handlers/route-handler.cjs +11 -3
  111. package/.claude/helpers/handlers/session-restore-handler.cjs +4 -1
  112. package/.claude/helpers/hook-handler.cjs +4 -2
  113. package/.claude/helpers/jev-catalog.cjs +14 -6
  114. package/.claude/helpers/jev-picker.cjs +52 -8
  115. package/.claude/helpers/pick-rank.cjs +184 -6
  116. package/.claude/helpers/pick-stats.cjs +86 -2
  117. package/.claude/skills/agentic-jujutsu/SKILL.md +2 -3
  118. package/.claude/skills/github-toolkit/SKILL.md +1 -1
  119. package/.claude/skills/hooks-automation/SKILL.md +243 -938
  120. package/.claude/skills/mastermind-agent-detail/SKILL.md +1 -1
  121. package/.claude/skills/mastermind-agent-select/SKILL.md +16 -1
  122. package/.claude/skills/mastermind-agents/SKILL.md +31 -38
  123. package/.claude/skills/mastermind-createorg/SKILL.md +3 -3
  124. package/.claude/skills/mastermind-env/SKILL.md +4 -18
  125. package/.claude/skills/mastermind-inbox/SKILL.md +31 -52
  126. package/.claude/skills/mastermind-instance/SKILL.md +7 -5
  127. package/.claude/skills/mastermind-new-agent/SKILL.md +3 -3
  128. package/.claude/skills/mastermind-org-settings/SKILL.md +3 -4
  129. package/.claude/skills/mastermind-orgs/SKILL.md +26 -32
  130. package/.claude/skills/mastermind-orgstatus/SKILL.md +49 -140
  131. package/.claude/skills/mastermind-plugins/SKILL.md +1 -1
  132. package/.claude/skills/mastermind-release/SKILL.md +9 -1
  133. package/.claude/skills/mastermind-research/SKILL.md +9 -1
  134. package/.claude/skills/mastermind-review/SKILL.md +9 -1
  135. package/.claude/skills/mastermind-routine-detail/SKILL.md +1 -1
  136. package/.claude/skills/mastermind-runorg/SKILL.md +13 -13
  137. package/.claude/skills/mastermind-stoporg/SKILL.md +7 -62
  138. package/.claude/skills/mastermind-tasks/SKILL.md +6 -8
  139. package/.claude/skills/monodesign/SKILL.md +257 -0
  140. package/.claude/skills/monodesign/adapt.md +53 -0
  141. package/.claude/skills/monodesign/agents/monodesign-asset-producer.md +100 -0
  142. package/.claude/skills/monodesign/agents/monodesign-manual-edit-applier.md +103 -0
  143. package/.claude/skills/monodesign/animate.md +65 -0
  144. package/.claude/skills/monodesign/audit.md +89 -0
  145. package/.claude/skills/monodesign/bolder.md +50 -0
  146. package/.claude/skills/monodesign/clarify.md +64 -0
  147. package/.claude/skills/monodesign/colorize.md +68 -0
  148. package/.claude/skills/monodesign/craft.md +51 -0
  149. package/.claude/skills/monodesign/critique.md +66 -0
  150. package/.claude/skills/monodesign/delight.md +47 -0
  151. package/.claude/skills/monodesign/distill.md +56 -0
  152. package/.claude/skills/monodesign/document.md +83 -0
  153. package/.claude/skills/monodesign/extract.md +74 -0
  154. package/.claude/skills/monodesign/harden.md +65 -0
  155. package/.claude/skills/monodesign/init.md +30 -0
  156. package/.claude/skills/monodesign/layout.md +36 -0
  157. package/.claude/skills/monodesign/live.md +34 -0
  158. package/.claude/skills/monodesign/onboard.md +50 -0
  159. package/.claude/skills/monodesign/optimize.md +64 -0
  160. package/.claude/skills/monodesign/overdrive.md +56 -0
  161. package/.claude/skills/monodesign/polish.md +68 -0
  162. package/.claude/skills/monodesign/quieter.md +57 -0
  163. package/.claude/skills/monodesign/reference/adapt.md +312 -0
  164. package/.claude/skills/monodesign/reference/adapt.native.md +58 -0
  165. package/.claude/skills/monodesign/reference/android.md +40 -0
  166. package/.claude/skills/monodesign/reference/animate.md +203 -0
  167. package/.claude/skills/monodesign/reference/antipatterns-catalog.md +410 -0
  168. package/.claude/skills/monodesign/reference/audit.md +135 -0
  169. package/.claude/skills/monodesign/reference/audit.native.md +139 -0
  170. package/.claude/skills/monodesign/reference/bolder.md +120 -0
  171. package/.claude/skills/monodesign/reference/brand-workflow.md +180 -0
  172. package/.claude/skills/monodesign/reference/brand.md +108 -0
  173. package/.claude/skills/monodesign/reference/clarify.md +288 -0
  174. package/.claude/skills/monodesign/reference/codex.md +105 -0
  175. package/.claude/skills/monodesign/reference/cognitive-load.md +106 -0
  176. package/.claude/skills/monodesign/reference/color-and-contrast.md +105 -0
  177. package/.claude/skills/monodesign/reference/colorize.md +257 -0
  178. package/.claude/skills/monodesign/reference/component-specs.md +260 -0
  179. package/.claude/skills/monodesign/reference/component-states.md +274 -0
  180. package/.claude/skills/monodesign/reference/component-system.md +358 -0
  181. package/.claude/skills/monodesign/reference/copy-formulas.md +160 -0
  182. package/.claude/skills/monodesign/reference/craft.md +123 -0
  183. package/.claude/skills/monodesign/reference/critique.md +780 -0
  184. package/.claude/skills/monodesign/reference/delight.md +302 -0
  185. package/.claude/skills/monodesign/reference/design-principles.md +246 -0
  186. package/.claude/skills/monodesign/reference/distill.md +111 -0
  187. package/.claude/skills/monodesign/reference/document.md +429 -0
  188. package/.claude/skills/monodesign/reference/extract.md +69 -0
  189. package/.claude/skills/monodesign/reference/harden.md +347 -0
  190. package/.claude/skills/monodesign/reference/heuristics-scoring.md +234 -0
  191. package/.claude/skills/monodesign/reference/hooks.md +92 -0
  192. package/.claude/skills/monodesign/reference/image-prompts.md +130 -0
  193. package/.claude/skills/monodesign/reference/init.md +221 -0
  194. package/.claude/skills/monodesign/reference/interaction-design.md +189 -0
  195. package/.claude/skills/monodesign/reference/ios.md +45 -0
  196. package/.claude/skills/monodesign/reference/layout.md +185 -0
  197. package/.claude/skills/monodesign/reference/live.md +710 -0
  198. package/.claude/skills/monodesign/reference/motion-design.md +109 -0
  199. package/.claude/skills/monodesign/reference/onboard.md +234 -0
  200. package/.claude/skills/monodesign/reference/optimize.md +258 -0
  201. package/.claude/skills/monodesign/reference/overdrive.md +130 -0
  202. package/.claude/skills/monodesign/reference/personas.md +179 -0
  203. package/.claude/skills/monodesign/reference/polish.md +241 -0
  204. package/.claude/skills/monodesign/reference/pre-delivery-checklist.md +108 -0
  205. package/.claude/skills/monodesign/reference/product.md +60 -0
  206. package/.claude/skills/monodesign/reference/quieter.md +99 -0
  207. package/.claude/skills/monodesign/reference/responsive-design.md +114 -0
  208. package/.claude/skills/monodesign/reference/shape.md +165 -0
  209. package/.claude/skills/monodesign/reference/spatial-design.md +100 -0
  210. package/.claude/skills/monodesign/reference/teach.md +10 -0
  211. package/.claude/skills/monodesign/reference/token-architecture.md +222 -0
  212. package/.claude/skills/monodesign/reference/typeset.md +301 -0
  213. package/.claude/skills/monodesign/reference/typography.md +159 -0
  214. package/.claude/skills/monodesign/reference/ux-research.md +143 -0
  215. package/.claude/skills/monodesign/reference/ux-rules.md +211 -0
  216. package/.claude/skills/monodesign/reference/ux-writing.md +107 -0
  217. package/.claude/skills/monodesign/scripts/command-metadata.json +94 -0
  218. package/.claude/skills/monodesign/scripts/context-signals.mjs +260 -0
  219. package/.claude/skills/monodesign/scripts/context.mjs +1065 -0
  220. package/.claude/skills/monodesign/scripts/critique-storage.mjs +416 -0
  221. package/.claude/skills/monodesign/scripts/detect-csp.mjs +193 -0
  222. package/.claude/skills/monodesign/scripts/detect.mjs +33 -0
  223. package/.claude/skills/monodesign/scripts/detector/browser/injected/index.mjs +1960 -0
  224. package/.claude/skills/monodesign/scripts/detector/cli/main.mjs +321 -0
  225. package/.claude/skills/monodesign/scripts/detector/design-system.mjs +814 -0
  226. package/.claude/skills/monodesign/scripts/detector/detect-antipatterns-browser.js +5628 -0
  227. package/.claude/skills/monodesign/scripts/detector/detect-antipatterns.mjs +50 -0
  228. package/.claude/skills/monodesign/scripts/detector/engines/browser/detect-url.mjs +259 -0
  229. package/.claude/skills/monodesign/scripts/detector/engines/browser/drivers.mjs +339 -0
  230. package/.claude/skills/monodesign/scripts/detector/engines/regex/detect-text.mjs +636 -0
  231. package/.claude/skills/monodesign/scripts/detector/engines/static-html/css-cascade.mjs +1016 -0
  232. package/.claude/skills/monodesign/scripts/detector/engines/static-html/detect-html.mjs +253 -0
  233. package/.claude/skills/monodesign/scripts/detector/engines/visual/screenshot-contrast.mjs +198 -0
  234. package/.claude/skills/monodesign/scripts/detector/findings.mjs +12 -0
  235. package/.claude/skills/monodesign/scripts/detector/fix/css-regions.mjs +181 -0
  236. package/.claude/skills/monodesign/scripts/detector/fix/fixers.mjs +373 -0
  237. package/.claude/skills/monodesign/scripts/detector/fix/index.mjs +426 -0
  238. package/.claude/skills/monodesign/scripts/detector/node/file-system.mjs +198 -0
  239. package/.claude/skills/monodesign/scripts/detector/profile/profiler.mjs +166 -0
  240. package/.claude/skills/monodesign/scripts/detector/registry/antipatterns.mjs +563 -0
  241. package/.claude/skills/monodesign/scripts/detector/rules/checks.mjs +3024 -0
  242. package/.claude/skills/monodesign/scripts/detector/shared/color.mjs +124 -0
  243. package/.claude/skills/monodesign/scripts/detector/shared/constants.mjs +101 -0
  244. package/.claude/skills/monodesign/scripts/detector/shared/fonts.mjs +30 -0
  245. package/.claude/skills/monodesign/scripts/detector/shared/inline-ignores.mjs +148 -0
  246. package/.claude/skills/monodesign/scripts/detector/shared/page.mjs +7 -0
  247. package/.claude/skills/monodesign/scripts/hook-admin.mjs +694 -0
  248. package/.claude/skills/monodesign/scripts/hook-before-edit.mjs +516 -0
  249. package/.claude/skills/monodesign/scripts/hook-lib.mjs +1785 -0
  250. package/.claude/skills/monodesign/scripts/hook.mjs +61 -0
  251. package/.claude/skills/monodesign/scripts/lib/design-parser.mjs +809 -0
  252. package/.claude/skills/monodesign/scripts/lib/is-generated.mjs +69 -0
  253. package/.claude/skills/monodesign/scripts/lib/monodesign-config.mjs +640 -0
  254. package/.claude/skills/monodesign/scripts/lib/monodesign-paths.mjs +129 -0
  255. package/.claude/skills/monodesign/scripts/lib/provider.mjs +4 -0
  256. package/.claude/skills/monodesign/scripts/lib/target-args.mjs +42 -0
  257. package/.claude/skills/monodesign/scripts/live/browser-script-parts.mjs +50 -0
  258. package/.claude/skills/monodesign/scripts/live/completion.mjs +19 -0
  259. package/.claude/skills/monodesign/scripts/live/event-validation.mjs +137 -0
  260. package/.claude/skills/monodesign/scripts/live/insert-ui.mjs +458 -0
  261. package/.claude/skills/monodesign/scripts/live/manual-apply.mjs +939 -0
  262. package/.claude/skills/monodesign/scripts/live/manual-edit-routes.mjs +357 -0
  263. package/.claude/skills/monodesign/scripts/live/manual-edits-buffer.mjs +152 -0
  264. package/.claude/skills/monodesign/scripts/live/session-store.mjs +293 -0
  265. package/.claude/skills/monodesign/scripts/live/svelte-component.mjs +826 -0
  266. package/.claude/skills/monodesign/scripts/live/sveltekit-adapter.mjs +279 -0
  267. package/.claude/skills/monodesign/scripts/live/ui-core.mjs +180 -0
  268. package/.claude/skills/monodesign/scripts/live/vocabulary.mjs +36 -0
  269. package/.claude/skills/monodesign/scripts/live-accept.mjs +812 -0
  270. package/.claude/skills/monodesign/scripts/live-browser-dom.js +147 -0
  271. package/.claude/skills/monodesign/scripts/live-browser-session.js +124 -0
  272. package/.claude/skills/monodesign/scripts/live-browser.js +11213 -0
  273. package/.claude/skills/monodesign/scripts/live-commit-manual-edits.mjs +1241 -0
  274. package/.claude/skills/monodesign/scripts/live-complete.mjs +75 -0
  275. package/.claude/skills/monodesign/scripts/live-copy-edit-agent.mjs +683 -0
  276. package/.claude/skills/monodesign/scripts/live-discard-manual-edits.mjs +51 -0
  277. package/.claude/skills/monodesign/scripts/live-inject.mjs +596 -0
  278. package/.claude/skills/monodesign/scripts/live-insert.mjs +272 -0
  279. package/.claude/skills/monodesign/scripts/live-manual-edit-evidence.mjs +363 -0
  280. package/.claude/skills/monodesign/scripts/live-poll.mjs +384 -0
  281. package/.claude/skills/monodesign/scripts/live-resume.mjs +94 -0
  282. package/.claude/skills/monodesign/scripts/live-server.mjs +1210 -0
  283. package/.claude/skills/monodesign/scripts/live-status.mjs +61 -0
  284. package/.claude/skills/monodesign/scripts/live-target.mjs +30 -0
  285. package/.claude/skills/monodesign/scripts/live-wrap.mjs +884 -0
  286. package/.claude/skills/monodesign/scripts/live.mjs +297 -0
  287. package/.claude/skills/monodesign/scripts/modern-screenshot.umd.js +14 -0
  288. package/.claude/skills/monodesign/scripts/palette.mjs +635 -0
  289. package/.claude/skills/monodesign/scripts/pin.mjs +221 -0
  290. package/.claude/skills/monodesign/shape.md +71 -0
  291. package/.claude/skills/monodesign/teach.md +18 -0
  292. package/.claude/skills/monodesign/typeset.md +59 -0
  293. package/.claude/skills/monolean-audit/SKILL.md +4 -6
  294. package/.claude/skills/monolean-help/SKILL.md +0 -1
  295. package/.claude/skills/monoswarm/SKILL.md +17 -17
  296. package/.claude/skills/pair-programming/SKILL.md +127 -1100
  297. package/README.md +28 -43
  298. package/dist/src/agents/registry-builder.d.ts +58 -22
  299. package/dist/src/agents/registry-builder.d.ts.map +1 -1
  300. package/dist/src/agents/registry-builder.js +41 -341
  301. package/dist/src/agents/registry-builder.js.map +1 -1
  302. package/dist/src/agents/registry-freshness.d.ts +4 -4
  303. package/dist/src/agents/registry-freshness.d.ts.map +1 -1
  304. package/dist/src/agents/registry-freshness.js +11 -60
  305. package/dist/src/agents/registry-freshness.js.map +1 -1
  306. package/dist/src/commands/doc.d.ts.map +1 -1
  307. package/dist/src/commands/doc.js +6 -15
  308. package/dist/src/commands/doc.js.map +1 -1
  309. package/dist/src/commands/doctor-pick-checks.d.ts +20 -3
  310. package/dist/src/commands/doctor-pick-checks.d.ts.map +1 -1
  311. package/dist/src/commands/doctor-pick-checks.js +138 -45
  312. package/dist/src/commands/doctor-pick-checks.js.map +1 -1
  313. package/dist/src/commands/doctor-project-checks.d.ts +2 -2
  314. package/dist/src/commands/doctor-project-checks.d.ts.map +1 -1
  315. package/dist/src/commands/doctor-project-checks.js +21 -17
  316. package/dist/src/commands/doctor-project-checks.js.map +1 -1
  317. package/dist/src/commands/doctor.d.ts.map +1 -1
  318. package/dist/src/commands/doctor.js +6 -4
  319. package/dist/src/commands/doctor.js.map +1 -1
  320. package/dist/src/commands/hooks-routing-commands.d.ts.map +1 -1
  321. package/dist/src/commands/hooks-routing-commands.js +4 -3
  322. package/dist/src/commands/hooks-routing-commands.js.map +1 -1
  323. package/dist/src/commands/init-upgrade.d.ts.map +1 -1
  324. package/dist/src/commands/init-upgrade.js +10 -0
  325. package/dist/src/commands/init-upgrade.js.map +1 -1
  326. package/dist/src/commands/init-wizard.d.ts.map +1 -1
  327. package/dist/src/commands/init-wizard.js +7 -2
  328. package/dist/src/commands/init-wizard.js.map +1 -1
  329. package/dist/src/commands/init.d.ts.map +1 -1
  330. package/dist/src/commands/init.js +27 -27
  331. package/dist/src/commands/init.js.map +1 -1
  332. package/dist/src/commands/monograph.d.ts.map +1 -1
  333. package/dist/src/commands/monograph.js +16 -21
  334. package/dist/src/commands/monograph.js.map +1 -1
  335. package/dist/src/commands/org.js +1 -1
  336. package/dist/src/commands/org.js.map +1 -1
  337. package/dist/src/commands/pick.d.ts.map +1 -1
  338. package/dist/src/commands/pick.js +4 -3
  339. package/dist/src/commands/pick.js.map +1 -1
  340. package/dist/src/decision/jev.d.ts +20 -0
  341. package/dist/src/decision/jev.d.ts.map +1 -1
  342. package/dist/src/decision/jev.js +12 -0
  343. package/dist/src/decision/jev.js.map +1 -1
  344. package/dist/src/decision/pick-eval.d.ts +23 -0
  345. package/dist/src/decision/pick-eval.d.ts.map +1 -1
  346. package/dist/src/decision/pick-eval.js +24 -1
  347. package/dist/src/decision/pick-eval.js.map +1 -1
  348. package/dist/src/decision/pick-real.d.ts +93 -0
  349. package/dist/src/decision/pick-real.d.ts.map +1 -0
  350. package/dist/src/decision/pick-real.js +253 -0
  351. package/dist/src/decision/pick-real.js.map +1 -0
  352. package/dist/src/decision/picks.d.ts +6 -0
  353. package/dist/src/decision/picks.d.ts.map +1 -1
  354. package/dist/src/decision/picks.js +34 -11
  355. package/dist/src/decision/picks.js.map +1 -1
  356. package/dist/src/init/claudemd-generator.d.ts.map +1 -1
  357. package/dist/src/init/claudemd-generator.js +1 -0
  358. package/dist/src/init/claudemd-generator.js.map +1 -1
  359. package/dist/src/init/copy-assets.d.ts.map +1 -1
  360. package/dist/src/init/copy-assets.js +17 -9
  361. package/dist/src/init/copy-assets.js.map +1 -1
  362. package/dist/src/init/embeddings-step.d.ts +23 -0
  363. package/dist/src/init/embeddings-step.d.ts.map +1 -0
  364. package/dist/src/init/embeddings-step.js +53 -0
  365. package/dist/src/init/embeddings-step.js.map +1 -0
  366. package/dist/src/init/executor.d.ts.map +1 -1
  367. package/dist/src/init/executor.js +35 -5
  368. package/dist/src/init/executor.js.map +1 -1
  369. package/dist/src/init/file-guard.d.ts +93 -0
  370. package/dist/src/init/file-guard.d.ts.map +1 -0
  371. package/dist/src/init/file-guard.js +239 -0
  372. package/dist/src/init/file-guard.js.map +1 -0
  373. package/dist/src/init/helpers-generator.d.ts +7 -0
  374. package/dist/src/init/helpers-generator.d.ts.map +1 -1
  375. package/dist/src/init/helpers-generator.js +13 -0
  376. package/dist/src/init/helpers-generator.js.map +1 -1
  377. package/dist/src/init/init-memory.d.ts +10 -0
  378. package/dist/src/init/init-memory.d.ts.map +1 -1
  379. package/dist/src/init/init-memory.js +44 -1
  380. package/dist/src/init/init-memory.js.map +1 -1
  381. package/dist/src/init/managed-block.d.ts +3 -1
  382. package/dist/src/init/managed-block.d.ts.map +1 -1
  383. package/dist/src/init/managed-block.js +9 -2
  384. package/dist/src/init/managed-block.js.map +1 -1
  385. package/dist/src/init/mcp-generator.d.ts +9 -0
  386. package/dist/src/init/mcp-generator.d.ts.map +1 -1
  387. package/dist/src/init/mcp-generator.js +28 -0
  388. package/dist/src/init/mcp-generator.js.map +1 -1
  389. package/dist/src/init/project-indexes.d.ts +19 -0
  390. package/dist/src/init/project-indexes.d.ts.map +1 -0
  391. package/dist/src/init/project-indexes.js +44 -0
  392. package/dist/src/init/project-indexes.js.map +1 -0
  393. package/dist/src/init/runtime-config-merge.d.ts +21 -0
  394. package/dist/src/init/runtime-config-merge.d.ts.map +1 -0
  395. package/dist/src/init/runtime-config-merge.js +88 -0
  396. package/dist/src/init/runtime-config-merge.js.map +1 -0
  397. package/dist/src/init/settings-generator.js +1 -1
  398. package/dist/src/init/settings-generator.js.map +1 -1
  399. package/dist/src/init/shared-instructions-generator.d.ts +3 -1
  400. package/dist/src/init/shared-instructions-generator.d.ts.map +1 -1
  401. package/dist/src/init/shared-instructions-generator.js +14 -39
  402. package/dist/src/init/shared-instructions-generator.js.map +1 -1
  403. package/dist/src/init/shared.d.ts +17 -2
  404. package/dist/src/init/shared.d.ts.map +1 -1
  405. package/dist/src/init/shared.js +39 -7
  406. package/dist/src/init/shared.js.map +1 -1
  407. package/dist/src/init/types.d.ts +22 -2
  408. package/dist/src/init/types.d.ts.map +1 -1
  409. package/dist/src/init/types.js +11 -3
  410. package/dist/src/init/types.js.map +1 -1
  411. package/dist/src/init/upgrade.d.ts +7 -0
  412. package/dist/src/init/upgrade.d.ts.map +1 -1
  413. package/dist/src/init/upgrade.js +60 -48
  414. package/dist/src/init/upgrade.js.map +1 -1
  415. package/dist/src/init/write-antigravity.d.ts +1 -0
  416. package/dist/src/init/write-antigravity.d.ts.map +1 -1
  417. package/dist/src/init/write-antigravity.js +28 -4
  418. package/dist/src/init/write-antigravity.js.map +1 -1
  419. package/dist/src/init/write-claude.d.ts.map +1 -1
  420. package/dist/src/init/write-claude.js +47 -23
  421. package/dist/src/init/write-claude.js.map +1 -1
  422. package/dist/src/init/write-kimicode.d.ts +27 -0
  423. package/dist/src/init/write-kimicode.d.ts.map +1 -1
  424. package/dist/src/init/write-kimicode.js +119 -92
  425. package/dist/src/init/write-kimicode.js.map +1 -1
  426. package/dist/src/init/write-opencode.d.ts.map +1 -1
  427. package/dist/src/init/write-opencode.js +45 -6
  428. package/dist/src/init/write-opencode.js.map +1 -1
  429. package/dist/src/init/write-runtime-config.d.ts.map +1 -1
  430. package/dist/src/init/write-runtime-config.js +108 -81
  431. package/dist/src/init/write-runtime-config.js.map +1 -1
  432. package/dist/src/knowledge/eval/golden-set.js +0 -15
  433. package/dist/src/knowledge/eval/golden-set.js.map +1 -1
  434. package/dist/src/mcp-tools/embeddings-tools.d.ts.map +1 -1
  435. package/dist/src/mcp-tools/embeddings-tools.js +14 -5
  436. package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
  437. package/dist/src/mcp-tools/hooks-routing.d.ts.map +1 -1
  438. package/dist/src/mcp-tools/hooks-routing.js +4 -3
  439. package/dist/src/mcp-tools/hooks-routing.js.map +1 -1
  440. package/dist/src/mcp-tools/monograph/build-tools.d.ts.map +1 -1
  441. package/dist/src/mcp-tools/monograph/build-tools.js +16 -9
  442. package/dist/src/mcp-tools/monograph/build-tools.js.map +1 -1
  443. package/dist/src/mcp-tools/org-skill-tools.d.ts.map +1 -1
  444. package/dist/src/mcp-tools/org-skill-tools.js +6 -2
  445. package/dist/src/mcp-tools/org-skill-tools.js.map +1 -1
  446. package/dist/src/mcp-tools/pick-tools.d.ts.map +1 -1
  447. package/dist/src/mcp-tools/pick-tools.js +13 -4
  448. package/dist/src/mcp-tools/pick-tools.js.map +1 -1
  449. package/dist/src/memory/embedding-operations.d.ts +0 -4
  450. package/dist/src/memory/embedding-operations.d.ts.map +1 -1
  451. package/dist/src/memory/embedding-operations.js +11 -85
  452. package/dist/src/memory/embedding-operations.js.map +1 -1
  453. package/dist/src/memory/memory-bridge.d.ts +7 -0
  454. package/dist/src/memory/memory-bridge.d.ts.map +1 -1
  455. package/dist/src/memory/memory-bridge.js +15 -0
  456. package/dist/src/memory/memory-bridge.js.map +1 -1
  457. package/dist/src/orgrt/bash-timeout.d.ts +17 -0
  458. package/dist/src/orgrt/bash-timeout.d.ts.map +1 -1
  459. package/dist/src/orgrt/bash-timeout.js +15 -0
  460. package/dist/src/orgrt/bash-timeout.js.map +1 -1
  461. package/dist/src/orgrt/session.d.ts.map +1 -1
  462. package/dist/src/orgrt/session.js +5 -2
  463. package/dist/src/orgrt/session.js.map +1 -1
  464. package/dist/src/orgrt/task-match.d.ts +3 -1
  465. package/dist/src/orgrt/task-match.d.ts.map +1 -1
  466. package/dist/src/orgrt/task-match.js +12 -4
  467. package/dist/src/orgrt/task-match.js.map +1 -1
  468. package/dist/src/platform-adapters/merge.d.ts +4 -3
  469. package/dist/src/platform-adapters/merge.d.ts.map +1 -1
  470. package/dist/src/platform-adapters/merge.js +18 -8
  471. package/dist/src/platform-adapters/merge.js.map +1 -1
  472. package/dist/src/platform-adapters/mutation.d.ts +6 -1
  473. package/dist/src/platform-adapters/mutation.d.ts.map +1 -1
  474. package/dist/src/platform-adapters/mutation.js +9 -3
  475. package/dist/src/platform-adapters/mutation.js.map +1 -1
  476. package/dist/src/platform-adapters/operations.d.ts.map +1 -1
  477. package/dist/src/platform-adapters/operations.js +14 -6
  478. package/dist/src/platform-adapters/operations.js.map +1 -1
  479. package/dist/src/platform-adapters/types.d.ts +5 -0
  480. package/dist/src/platform-adapters/types.d.ts.map +1 -1
  481. package/dist/src/routing/agent-pick.d.ts +9 -7
  482. package/dist/src/routing/agent-pick.d.ts.map +1 -1
  483. package/dist/src/routing/agent-pick.js +17 -17
  484. package/dist/src/routing/agent-pick.js.map +1 -1
  485. package/dist/tsconfig.tsbuildinfo +1 -1
  486. package/package.json +6 -6
  487. package/.claude/skills/github-issue-triage/SKILL.md +0 -354
  488. package/.claude/skills/github-repo-recap/SKILL.md +0 -207
@@ -0,0 +1,434 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ /**
4
+ * The agent registry (.monomind/registry.json) — ONE implementation shared by
5
+ * the CLI (src/agents/registry-builder.ts and registry-freshness.ts load this
6
+ * file) and the SessionStart hook (handlers/pick-core.cjs), so an agent added
7
+ * to ~/.claude/agents or .claude/agents is indexed at the next session start
8
+ * without running the CLI, and both sides parse frontmatter the same way.
9
+ *
10
+ * Roots, in precedence order (the first definition of a slug wins):
11
+ * extra $MONOMIND_EXTRA_AGENT_PATHS (':'-separated), else a sibling
12
+ * ../agency-agents directory — canonical, wins over the project
13
+ * project <root>/.claude/agents
14
+ * user ~/.claude/agents — Claude Code loads these in every project, so
15
+ * they are valid Task subagent_types. As in Claude Code, a project
16
+ * (or extra) agent wins: a user agent whose slug or frontmatter
17
+ * `name` is already defined is left out (listed under `shadowed`).
18
+ *
19
+ * User entries record `~/.claude/agents/...` as filePath, never the absolute
20
+ * home path. The registry is rebuilt when missing or older than any agent file
21
+ * in those roots (an mtime scan, no parsing) or this builder.
22
+ *
23
+ * Usage: node .claude/helpers/agent-registry.cjs [projectRoot]
24
+ */
25
+
26
+ var fs = require('fs');
27
+ var os = require('os');
28
+ var path = require('path');
29
+
30
+ /** Directories to skip during the scan. `reengineer-squad` is a repo-only
31
+ * squad the package does not ship, and its `tester` would shadow the core
32
+ * tester. */
33
+ var SKIP_DIRS = new Set(['schemas', 'ephemeral', 'reengineer-squad']);
34
+ var MAX_AGENT_BYTES = 512 * 1024;
35
+ var USER_LABEL = '~/.claude/agents';
36
+
37
+ function homeDir(opts) {
38
+ return (opts && opts.home) || os.homedir();
39
+ }
40
+
41
+ /** Every `.md` under `root` (recursively), skipping SKIP_DIRS and `._` forks. */
42
+ function collectMdFiles(root) {
43
+ var results = [];
44
+ var entries;
45
+ try {
46
+ entries = fs.readdirSync(root);
47
+ } catch (e) {
48
+ return results;
49
+ }
50
+ for (var i = 0; i < entries.length; i++) {
51
+ var entry = entries[i];
52
+ var full = path.join(root, entry);
53
+ var stat;
54
+ try {
55
+ stat = fs.statSync(full);
56
+ } catch (e) {
57
+ continue;
58
+ }
59
+ if (stat.isDirectory()) {
60
+ if (SKIP_DIRS.has(entry)) continue;
61
+ results.push.apply(results, collectMdFiles(full));
62
+ } else if (stat.isFile() && path.extname(entry) === '.md' && !entry.startsWith('._')) {
63
+ results.push(full);
64
+ }
65
+ }
66
+ return results;
67
+ }
68
+
69
+ function unquote(v) {
70
+ if ((v.startsWith('"') && v.endsWith('"')) || (v.startsWith("'") && v.endsWith("'"))) return v.slice(1, -1);
71
+ return v;
72
+ }
73
+
74
+ /**
75
+ * Nested YAML list items under a key whose value was empty
76
+ * (`triggers:\n - pattern: ...`): a string array when every item is a plain
77
+ * scalar, an array of objects when items hold `key: value` pairs, null when
78
+ * there are no list items.
79
+ */
80
+ function parseNestedYamlList(lines, startIdx, parentIndent) {
81
+ var objects = [];
82
+ var simpleItems = [];
83
+ var current = null;
84
+ var consumed = 0;
85
+ var hasObjects = false;
86
+ for (var i = startIdx; i < lines.length; i++) {
87
+ var line = lines[i];
88
+ var trimmed = line.trim();
89
+ if (!trimmed || trimmed.startsWith('#')) {
90
+ consumed++;
91
+ continue;
92
+ }
93
+ var indent = line.length - line.trimStart().length;
94
+ if (indent <= parentIndent) break;
95
+ if (trimmed.startsWith('- ')) {
96
+ var itemContent = trimmed.slice(2);
97
+ var colon = itemContent.indexOf(': ');
98
+ if (colon !== -1) {
99
+ hasObjects = true;
100
+ current = {};
101
+ current[itemContent.slice(0, colon).trim()] = unquote(itemContent.slice(colon + 2).trim());
102
+ objects.push(current);
103
+ } else {
104
+ simpleItems.push(unquote(itemContent.trim()));
105
+ }
106
+ consumed++;
107
+ } else if (current && hasObjects) {
108
+ var c = trimmed.indexOf(': ');
109
+ if (c !== -1) current[trimmed.slice(0, c).trim()] = unquote(trimmed.slice(c + 2).trim());
110
+ consumed++;
111
+ } else {
112
+ break;
113
+ }
114
+ }
115
+ if (hasObjects && objects.length > 0) return { value: objects, consumed: consumed };
116
+ if (simpleItems.length > 0) return { value: simpleItems, consumed: consumed };
117
+ return { value: null, consumed: consumed };
118
+ }
119
+
120
+ /** The leading `---` frontmatter block as a flat key → value map (scalars,
121
+ * booleans, `[a, b]` and nested `- ` lists, `|`/`>` block scalars). */
122
+ function parseFrontmatter(content) {
123
+ var match = /^---\r?\n([\s\S]*?)\r?\n---/.exec(content);
124
+ if (!match) return {};
125
+ var result = {};
126
+ var lines = match[1].split('\n');
127
+ for (var i = 0; i < lines.length; i++) {
128
+ var line = lines[i];
129
+ var trimmed = line.trim();
130
+ if (!trimmed || trimmed.startsWith('#')) continue;
131
+ var colonIdx = trimmed.indexOf(':');
132
+ if (colonIdx === -1) continue;
133
+ var key = trimmed.slice(0, colonIdx).trim();
134
+ var value = trimmed.slice(colonIdx + 1).trim();
135
+
136
+ var blockScalar = /^([|>])[+-]?$/.exec(value);
137
+ if (blockScalar) {
138
+ var blockIndent = line.length - line.trimStart().length;
139
+ var body = [];
140
+ while (i + 1 < lines.length) {
141
+ var next = lines[i + 1];
142
+ if (next.trim() && next.length - next.trimStart().length <= blockIndent) break;
143
+ body.push(next.trim());
144
+ i++;
145
+ }
146
+ result[key] = body.join(blockScalar[1] === '|' ? '\n' : ' ').trim();
147
+ continue;
148
+ }
149
+
150
+ if (value === '') {
151
+ var nested = parseNestedYamlList(lines, i + 1, line.length - line.trimStart().length);
152
+ if (nested.value !== null) {
153
+ result[key] = nested.value;
154
+ i += nested.consumed;
155
+ continue;
156
+ }
157
+ }
158
+
159
+ if (value.startsWith('[') && value.endsWith(']')) {
160
+ value = value
161
+ .slice(1, -1)
162
+ .split(',')
163
+ .map(function (s) { return s.trim().replace(/^["']|["']$/g, ''); })
164
+ .filter(Boolean);
165
+ } else if (value === 'true') value = true;
166
+ else if (value === 'false') value = false;
167
+ else value = unquote(value);
168
+ result[key] = value;
169
+ }
170
+ return result;
171
+ }
172
+
173
+ /** The first argument that is not undefined/null (a `??` chain). */
174
+ function first() {
175
+ for (var i = 0; i < arguments.length; i++) if (arguments[i] !== undefined && arguments[i] !== null) return arguments[i];
176
+ return undefined;
177
+ }
178
+
179
+ function toStringArray(val) {
180
+ if (Array.isArray(val)) return val.map(String);
181
+ if (typeof val === 'string' && val.length > 0) return [val];
182
+ return [];
183
+ }
184
+
185
+ function parseTriggers(val) {
186
+ if (!val) return [];
187
+ var arr = Array.isArray(val) ? val : [val];
188
+ return arr.map(function (t) {
189
+ if (typeof t === 'object' && t !== null && 'pattern' in t) {
190
+ return { pattern: String(t.pattern), mode: String(first(t.mode, 'glob')) };
191
+ }
192
+ return { pattern: String(t), mode: 'glob' };
193
+ });
194
+ }
195
+
196
+ function slugFromFilename(file) {
197
+ return path.basename(file, path.extname(file))
198
+ .toLowerCase()
199
+ .replace(/\s+/g, '-')
200
+ .replace(/[^a-z0-9-]/g, '');
201
+ }
202
+
203
+ function categoryFromPath(file, root) {
204
+ var parts = path.relative(root, file).split(path.sep);
205
+ return parts.length > 1 ? parts[0] : 'default';
206
+ }
207
+
208
+ function isDir(p) {
209
+ try { return fs.statSync(p).isDirectory(); } catch (e) { return false; }
210
+ }
211
+
212
+ /**
213
+ * The agent roots for project `cwd`, in precedence order: extras, the
214
+ * project's .claude/agents, then ~/.claude/agents (opts.user === false leaves
215
+ * it out; opts.home overrides the home directory). When cwd is the home
216
+ * directory the two .claude/agents are one directory, listed once as `user`.
217
+ */
218
+ function computeAgentRoots(cwd, opts) {
219
+ var env = (opts && opts.env) || process.env;
220
+ var extras = env.MONOMIND_EXTRA_AGENT_PATHS ? env.MONOMIND_EXTRA_AGENT_PATHS.split(':').filter(Boolean) : [];
221
+ var sibling = path.join(cwd, '..', 'agency-agents');
222
+ if (extras.length === 0 && isDir(sibling)) extras.push(sibling);
223
+ var roots = extras.map(function (dir) { return { dir: dir, origin: 'extra' }; });
224
+ var projectDir = path.join(cwd, '.claude', 'agents');
225
+ var userDir = path.join(homeDir(opts), '.claude', 'agents');
226
+ var withUser = !(opts && opts.user === false);
227
+ if (!withUser || path.resolve(projectDir) !== path.resolve(userDir)) roots.push({ dir: projectDir, origin: 'project' });
228
+ if (withUser) roots.push({ dir: userDir, origin: 'user', label: USER_LABEL });
229
+ return roots;
230
+ }
231
+
232
+ /** A root given as a plain path is a project-local definition directory. */
233
+ function asRoot(r) {
234
+ return typeof r === 'string' ? { dir: r, origin: 'project' } : r;
235
+ }
236
+
237
+ /**
238
+ * Builds the registry from `roots` (first root wins a slug; a `user` agent
239
+ * also loses to any earlier agent with the same frontmatter `name` or slug),
240
+ * writing it to `outputPath` when given. opts.base: the directory project and
241
+ * extra filePaths are relative to (default cwd).
242
+ */
243
+ function buildUnifiedRegistry(roots, outputPath, opts) {
244
+ var now = new Date().toISOString();
245
+ var base = (opts && opts.base) || process.cwd();
246
+ var seen = new Map();
247
+ var names = new Set();
248
+ var dupes = new Map();
249
+ var shadowed = [];
250
+ var counts = { project: 0, user: 0, extra: 0 };
251
+ (roots || []).map(asRoot).forEach(function (root) {
252
+ var files = collectMdFiles(root.dir);
253
+ files.forEach(function (file) {
254
+ var content;
255
+ try {
256
+ if (fs.statSync(file).size > MAX_AGENT_BYTES) return;
257
+ content = fs.readFileSync(file, 'utf-8');
258
+ } catch (e) {
259
+ return;
260
+ }
261
+ var fm = parseFrontmatter(content);
262
+ var slug = (typeof fm.slug === 'string' && fm.slug) || slugFromFilename(file);
263
+ var name = (typeof fm.name === 'string' && fm.name) || slug;
264
+ var filePath = root.label
265
+ ? root.label + '/' + path.relative(root.dir, file).split(path.sep).join('/')
266
+ : path.isAbsolute(file) ? path.relative(base, file) : file;
267
+ var prior = seen.get(slug);
268
+ if (root.origin === 'user' && (prior ? prior.origin !== 'user' : names.has(name) || names.has(slug))) {
269
+ shadowed.push({ slug: slug, name: name, filePath: filePath });
270
+ return;
271
+ }
272
+ if (prior) {
273
+ var d = dupes.get(slug) || { slug: slug, kept: prior.filePath, dropped: [] };
274
+ d.dropped.push(filePath);
275
+ dupes.set(slug, d);
276
+ return;
277
+ }
278
+ var str = function (v) { return typeof v === 'string' ? v : undefined; };
279
+ seen.set(slug, {
280
+ slug: slug,
281
+ name: name,
282
+ version: str(fm.version) || '0.0.0',
283
+ category: str(fm.category) || categoryFromPath(file, root.dir),
284
+ description: str(fm.description) || '',
285
+ whenToUse: str(first(fm.when_to_use, fm.whenToUse)),
286
+ tags: toStringArray(fm.tags),
287
+ vibe: str(fm.vibe),
288
+ // A `capability:` block is read flattened, so its `expertise:` list lands top-level
289
+ capabilities: toStringArray(first(fm.capabilities, fm.expertise)),
290
+ taskTypes: toStringArray(first(fm.taskTypes, fm['task-types'], fm.task_types)),
291
+ tools: toStringArray(fm.tools),
292
+ triggers: parseTriggers(fm.triggers),
293
+ deprecated: fm.deprecated === true,
294
+ deprecatedBy: str(fm.deprecatedBy),
295
+ dependencies: toStringArray(fm.dependencies),
296
+ origin: root.origin,
297
+ filePath: filePath,
298
+ registeredAt: now,
299
+ lastUpdated: now,
300
+ });
301
+ names.add(name);
302
+ names.add(slug);
303
+ counts[root.origin] = (counts[root.origin] || 0) + 1;
304
+ });
305
+ });
306
+ var agents = Array.from(seen.values());
307
+ var registry = {
308
+ version: '1.0.0',
309
+ generatedAt: now,
310
+ totalAgents: agents.length,
311
+ counts: counts,
312
+ agents: agents,
313
+ duplicates: Array.from(dupes.values()),
314
+ shadowed: shadowed,
315
+ };
316
+ if (outputPath) writeRegistryFile(outputPath, registry);
317
+ return registry;
318
+ }
319
+
320
+ function agentCountOnDisk(file) {
321
+ try {
322
+ var reg = JSON.parse(fs.readFileSync(file, 'utf-8'));
323
+ return reg && Array.isArray(reg.agents) ? reg.agents.length : 0;
324
+ } catch (e) {
325
+ return 0;
326
+ }
327
+ }
328
+
329
+ /** Writes `registry` atomically — except an empty registry never replaces a
330
+ * non-empty one. Returns whether the file was written. */
331
+ function writeRegistryFile(file, registry) {
332
+ if (registry.agents.length === 0 && agentCountOnDisk(file) > 0) return false;
333
+ var tmp = file + '.' + process.pid + '.tmp';
334
+ fs.writeFileSync(tmp, JSON.stringify(registry, null, 2), 'utf-8');
335
+ fs.renameSync(tmp, file);
336
+ return true;
337
+ }
338
+
339
+ /** Newest mtime (ms) of any agent `.md` under `dirs`; directories count too,
340
+ * so a deleted file also marks the registry stale. 0 when there are none. */
341
+ function newestAgentMtime(dirs) {
342
+ var newest = 0;
343
+ function walk(dir) {
344
+ var entries;
345
+ try {
346
+ newest = Math.max(newest, fs.statSync(dir).mtimeMs);
347
+ entries = fs.readdirSync(dir, { withFileTypes: true });
348
+ } catch (e) {
349
+ return;
350
+ }
351
+ entries.forEach(function (e) {
352
+ var full = path.join(dir, e.name);
353
+ if (e.isDirectory()) walk(full);
354
+ else if (e.isFile() && path.extname(e.name) === '.md') {
355
+ try { newest = Math.max(newest, fs.statSync(full).mtimeMs); } catch (err) { /* vanished */ }
356
+ }
357
+ });
358
+ }
359
+ (dirs || []).forEach(function (d) { walk(typeof d === 'string' ? d : d.dir); });
360
+ return newest;
361
+ }
362
+
363
+ function registryPath(root) {
364
+ return path.join(root, '.monomind', 'registry.json');
365
+ }
366
+
367
+ function mtime(p) {
368
+ try { return fs.statSync(p).mtimeMs; } catch (e) { return 0; }
369
+ }
370
+
371
+ /** True when `root`'s registry is missing or older than an agent definition
372
+ * in any root (project, user, extra) or than this builder. */
373
+ function isStale(root, opts) {
374
+ var at = mtime(registryPath(root));
375
+ if (at === 0) return true;
376
+ return Math.max(newestAgentMtime(computeAgentRoots(root, opts)), mtime(__filename)) > at;
377
+ }
378
+
379
+ /** Rebuilds `root`'s registry when stale; the built registry, or null when it
380
+ * was fresh or the build failed. Never throws. */
381
+ function ensure(root, opts) {
382
+ try {
383
+ if (!isStale(root, opts)) return null;
384
+ fs.mkdirSync(path.join(root, '.monomind'), { recursive: true });
385
+ return buildUnifiedRegistry(computeAgentRoots(root, opts), registryPath(root), { base: root });
386
+ } catch (e) {
387
+ return null;
388
+ }
389
+ }
390
+
391
+ /**
392
+ * The nearest directory at or above `cwd` holding `.claude/agents` or
393
+ * `.monomind`. The walk stops at the git root (inclusive) and never returns
394
+ * the home directory itself, whose ~/.monomind is the user's global state.
395
+ * Null when no project is found.
396
+ */
397
+ function findProjectRoot(cwd, home) {
398
+ var stopAt = path.resolve(home || os.homedir());
399
+ var dir = path.resolve(cwd);
400
+ for (;;) {
401
+ if (dir === stopAt) return null;
402
+ if (fs.existsSync(path.join(dir, '.claude', 'agents')) || fs.existsSync(path.join(dir, '.monomind'))) return dir;
403
+ if (fs.existsSync(path.join(dir, '.git'))) return null;
404
+ var parent = path.dirname(dir);
405
+ if (parent === dir) return null;
406
+ dir = parent;
407
+ }
408
+ }
409
+
410
+ function main() {
411
+ var root = process.argv[2] || process.env.CLAUDE_PROJECT_DIR || findProjectRoot(process.cwd());
412
+ if (!root) {
413
+ process.stderr.write('registry.json: no project found at or above ' + process.cwd() + '; nothing written\n');
414
+ return;
415
+ }
416
+ fs.mkdirSync(path.join(root, '.monomind'), { recursive: true });
417
+ var reg = buildUnifiedRegistry(computeAgentRoots(root), registryPath(root), { base: root });
418
+ process.stdout.write('registry.json: ' + reg.totalAgents + ' agents (' + reg.counts.user + ' from ' + USER_LABEL + ')\n');
419
+ }
420
+
421
+ if (require.main === module) main();
422
+
423
+ module.exports = {
424
+ USER_LABEL: USER_LABEL,
425
+ parseFrontmatter: parseFrontmatter,
426
+ computeAgentRoots: computeAgentRoots,
427
+ buildUnifiedRegistry: buildUnifiedRegistry,
428
+ writeRegistryFile: writeRegistryFile,
429
+ newestAgentMtime: newestAgentMtime,
430
+ registryPath: registryPath,
431
+ isStale: isStale,
432
+ ensure: ensure,
433
+ findProjectRoot: findProjectRoot,
434
+ };
@@ -20,8 +20,9 @@
20
20
  * Org skill library (`orgSkills`, via org-skill-index.cjs). The file is
21
21
  * generated per machine (init, upgrade, SessionStart, `monomind pick`) and is
22
22
  * never committed — a shipped snapshot listed skills a project did not have.
23
- * README/overview/reference docs, `_`-prefixed includes and helper-only
24
- * skills (HELPER_ONLY, or frontmatter `type: helper`) are not entries.
23
+ * README/overview/reference docs, internal includes (any `_`-prefixed file,
24
+ * folder or frontmatter `name`) and helper-only skills (HELPER_ONLY, or
25
+ * frontmatter `type: helper`) are not entries.
25
26
  * Frontmatter `pick: low` marks an admin/meta entry (org management pages,
26
27
  * examples, the picker itself): it stays in the index, recorded as
27
28
  * `pick: 'low'`, and the pickers rank it below equally matching entries so
@@ -35,10 +36,11 @@ var os = require('os');
35
36
  var path = require('path');
36
37
  var orgIndex = require('./org-skill-index.cjs');
37
38
 
38
- /** Protocol pieces other skills include; never invoked on their own. */
39
+ /** Protocol pieces other skills include; never invoked on their own.
40
+ * (`_`-prefixed includes need no entry here: isNotACandidate skips them all.) */
39
41
  var HELPER_ONLY = new Set([
40
42
  'mastermind-agent-select', 'mastermind-delegation', 'mastermind-intake',
41
- 'mastermind-protocol', 'mastermind-repeat', '_repeat', '_taskfile',
43
+ 'mastermind-protocol', 'mastermind-repeat',
42
44
  ]);
43
45
  /** Documentation pages that live beside commands but are not commands. */
44
46
  var DOC_NAMES = new Set(['readme', 'overview', 'reference', 'references']);
@@ -167,11 +169,13 @@ function isJunk(basename) {
167
169
  }
168
170
 
169
171
  /** Docs and helper-only pieces: README/overview/reference pages (or anything
170
- * under a references/ dir), HELPER_ONLY names, and `type: helper` frontmatter. */
172
+ * under a references/ dir), internal includes (a `_`-prefixed path segment or
173
+ * frontmatter name), HELPER_ONLY names, and `type: helper` frontmatter. */
171
174
  function isNotACandidate(parts, fm) {
172
175
  for (var i = 0; i < parts.length; i++) {
173
- if (DOC_NAMES.has(parts[i].toLowerCase())) return true;
176
+ if (DOC_NAMES.has(parts[i].toLowerCase()) || parts[i].charAt(0) === '_') return true;
174
177
  }
178
+ if (String(fm.name || '').trim().charAt(0) === '_') return true;
175
179
  if (HELPER_ONLY.has(parts[parts.length - 1])) return true;
176
180
  return String(fm.type || '').toLowerCase() === 'helper';
177
181
  }
@@ -18,20 +18,17 @@ try { redaction = require('../redact-secrets.cjs'); } catch (e) { /* preview fal
18
18
  var pickStats = null;
19
19
  try { pickStats = require('../pick-stats.cjs'); } catch (e) { /* no outcome prior: keyword order stands */ }
20
20
  var pickRank = null;
21
- try { pickRank = require('../pick-rank.cjs'); } catch (e) { /* no trivial-prompt check */ }
22
-
23
- // A keyword pick needs this score (pick-rank.cjs: idf-weighted BM25 times the
24
- // share of task words matched) AND a lead of KEYWORD_AGENT_LEAD over the
25
- // runner-up. Ties and weak overlap print nothing: a wrong pick in Claude's
26
- // context costs more than none. Tuned on the 40-task pick benchmark: 25/40
27
- // shown, 23 of them correct.
28
- var KEYWORD_MIN_AGENT_SCORE = 2;
29
- var KEYWORD_AGENT_LEAD = 1.5;
30
- // A keyword skill pick (pick-rank.cjs over the shared skill catalog) needs
31
- // this score AND a KEYWORD_SKILL_LEAD lead over the runner-up. Calibrated on
32
- // tests/pick-eval (59 tasks, 514 skills): 34 shown, 31 of them correct (91%).
33
- var KEYWORD_MIN_SKILL_SCORE = 3;
34
- var KEYWORD_SKILL_LEAD = 1.25;
21
+ try { pickRank = require('../pick-rank.cjs'); } catch (e) { /* no trivial-prompt check, no keyword pick */ }
22
+
23
+ // A keyword pick needs a minimum score (pick-rank.cjs: idf-weighted BM25 times
24
+ // the share of task words matched) AND a lead over the runner-up: the one
25
+ // gate pick-rank.cjs defines (KEYWORD_GATE, leads) and the CLI's `pick`
26
+ // shares. Without pick-rank nothing clears it.
27
+ var GATE = (pickRank && pickRank.KEYWORD_GATE) || { agents: { min: Infinity, lead: 1 }, skills: { min: Infinity, lead: 1 } };
28
+ var KEYWORD_MIN_AGENT_SCORE = GATE.agents.min;
29
+ var KEYWORD_AGENT_LEAD = GATE.agents.lead;
30
+ var KEYWORD_MIN_SKILL_SCORE = GATE.skills.min;
31
+ var KEYWORD_SKILL_LEAD = GATE.skills.lead;
35
32
  var MAX_CANDIDATES = 5;
36
33
  var PREVIEW_CHARS = 120;
37
34
  // A prompt with fewer content words ("hi", "thanks", "ok, go ahead") is a
@@ -62,11 +59,12 @@ function isSystemPrompt(prompt) {
62
59
  }
63
60
 
64
61
  /** True for a prompt with fewer than MIN_PICK_TOKENS content words
65
- * (pick-rank tokens: stopwords dropped, any script). */
62
+ * (pick-rank queryTokens: stopwords and words the prompt rules out dropped,
63
+ * any script), so "anything else pending rather than release" is a reply. */
66
64
  function isTrivialPrompt(prompt) {
67
65
  if (!pickRank || typeof prompt !== 'string') return false;
68
66
  var text = prompt.replace(/<system-reminder>[\s\S]*?<\/system-reminder>/gi, ' ').slice(0, 2000);
69
- return pickRank.tokens(text).length < MIN_PICK_TOKENS;
67
+ return pickRank.queryTokens(text).length < MIN_PICK_TOKENS;
70
68
  }
71
69
 
72
70
  function promptHash(prompt) {
@@ -130,20 +128,18 @@ function rankSkills(jp, prompt, skills) {
130
128
  });
131
129
  }
132
130
 
133
- /** The top entry when it clears `min` and leads the runner-up by `ratio`. The
134
- * floor is on keyword relevance alone (baseScore when a prior re-ranked). */
131
+ /** pick-rank.cjs leads(): the top entry when it clears the gate. */
135
132
  function leads(list, min, ratio) {
136
- var top = list && list[0];
137
- if (!top || !((top.baseScore !== undefined ? top.baseScore : top.score) >= min)) return null;
138
- var second = list[1];
139
- if (!second || !(second.score > 0)) return top;
140
- return top.score >= second.score * (ratio || 1) && top.score > second.score ? top : null;
133
+ return pickRank ? pickRank.leads(list, min, ratio) : null;
141
134
  }
142
135
 
143
136
  /**
144
137
  * The prompt's pick. A Jev agent answer (already past acceptAgent) wins, else a
145
138
  * strong keyword agent; a confident Jev skill answer (including "none fits")
146
- * wins, else a strong keyword skill. Agent ids are resolved to registry names.
139
+ * wins, else a strong keyword skill. A question Jev answered below its bar
140
+ * (agentResponded / skillResponded) gets no pick at all: its candidates held
141
+ * the keyword leaders and it did not back them. Agent ids are resolved to
142
+ * registry names.
147
143
  */
148
144
  function decide(opts) {
149
145
  var agents = opts.agents || [];
@@ -158,6 +154,8 @@ function decide(opts) {
158
154
  out.agent = { id: jev.agent, name: byId[jev.agent].name };
159
155
  out.confidence = jev.agentConfidence;
160
156
  viaJev = true;
157
+ } else if (jev && jev.agentResponded) {
158
+ viaJev = true;
161
159
  } else {
162
160
  var kw = leads(opts.keywordCands, KEYWORD_MIN_AGENT_SCORE, KEYWORD_AGENT_LEAD);
163
161
  if (kw) { out.agent = { id: kw.id, name: kw.name }; viaKeyword = true; }
@@ -167,6 +165,8 @@ function decide(opts) {
167
165
  var js = (jev.skills || [])[0];
168
166
  if (js) out.skill = { skill: js.id, invoke: js.invoke };
169
167
  viaJev = true;
168
+ } else if (jev && jev.skillResponded) {
169
+ viaJev = true;
170
170
  } else {
171
171
  var ks = leads(opts.skillMatches, KEYWORD_MIN_SKILL_SCORE, KEYWORD_SKILL_LEAD);
172
172
  if (ks) { out.skill = { skill: ks.skill, invoke: ks.invoke }; viaKeyword = true; }
@@ -184,11 +184,23 @@ function decide(opts) {
184
184
  return out;
185
185
  }
186
186
 
187
- /** The one line Claude sees: `[PICK] agent: <name> · skill: <invoke>`, '' when nothing is confident. */
187
+ var ORG_SKILL_INVOKE = 'mcp__monomind__org_skill_show ';
188
+
189
+ /** The one line Claude sees: `[PICK] agent: <name> · skill: <invoke>`, '' when
190
+ * nothing is confident. An Org skill also names its CLI read: Claude Code
191
+ * keeps a running MCP server until restart, and one older than the
192
+ * org_skill_show tool fails the MCP call. */
188
193
  function formatPickLine(pick) {
189
194
  var parts = [];
190
195
  if (pick && pick.agent) parts.push('agent: ' + pick.agent.name);
191
- if (pick && pick.skill) parts.push('skill: ' + pick.skill.invoke);
196
+ if (pick && pick.skill) {
197
+ var invoke = pick.skill.invoke;
198
+ // Only a plain skill name (the org_skill_show name rule) goes into a command line.
199
+ if (invoke.indexOf(ORG_SKILL_INVOKE) === 0 && /^[a-z0-9][a-z0-9-]{0,63}$/.test(pick.skill.skill || '')) {
200
+ invoke += ' (or: npx -y monomind org skills show ' + pick.skill.skill + ')';
201
+ }
202
+ parts.push('skill: ' + invoke);
203
+ }
192
204
  return parts.length ? '[PICK] ' + parts.join(' · ') : '';
193
205
  }
194
206
 
@@ -422,6 +434,22 @@ function ensureSkillRegistryFresh(root, builder) {
422
434
  return 'rebuilt';
423
435
  }
424
436
 
437
+ /** Rebuild .monomind/registry.json when agent-registry.cjs says it is stale
438
+ * (missing, or older than an agent in .claude/agents, ~/.claude/agents or an
439
+ * extra root), so a new user agent is routed from the next session on. Only
440
+ * inside a project (findProjectRoot: never the home directory, never a
441
+ * folder without .monomind or .claude/agents). opts.home overrides the home
442
+ * directory. Returns what it did. */
443
+ function ensureAgentRegistryFresh(root, builder, opts) {
444
+ if (builder === undefined) {
445
+ try { builder = require('../agent-registry.cjs'); } catch (e) { builder = null; }
446
+ }
447
+ if (!builder || typeof builder.isStale !== 'function' || typeof builder.ensure !== 'function') return 'no-builder';
448
+ if (builder.findProjectRoot(root, opts && opts.home) !== path.resolve(root)) return 'not-a-project';
449
+ if (!builder.isStale(root, opts)) return 'fresh';
450
+ return builder.ensure(root, opts) ? 'rebuilt' : 'failed';
451
+ }
452
+
425
453
  module.exports = {
426
454
  KEYWORD_MIN_AGENT_SCORE: KEYWORD_MIN_AGENT_SCORE,
427
455
  KEYWORD_AGENT_LEAD: KEYWORD_AGENT_LEAD,
@@ -442,4 +470,5 @@ module.exports = {
442
470
  joinOutcome: joinOutcome,
443
471
  recordAdherence: recordAdherence,
444
472
  ensureSkillRegistryFresh: ensureSkillRegistryFresh,
473
+ ensureAgentRegistryFresh: ensureAgentRegistryFresh,
445
474
  };
@@ -120,9 +120,12 @@ async function _pickWithJev(CWD, prompt, agents, includeAgentId, skills) {
120
120
  return {
121
121
  provider: picked.provider,
122
122
  agent: jp.acceptAgent(picked.agent),
123
+ // Jev answered the question (at any confidence): no keyword pick replaces it.
124
+ agentResponded: !!picked.agent,
123
125
  agentConfidence: picked.agent ? picked.agent.confidence : 0,
124
126
  agentRanked: picked.agent ? picked.agent.ranked : [],
125
- // Only a confident skill answer (including a confident "none fits") replaces keyword matches.
127
+ skillResponded: !!picked.skill,
128
+ // Only a confident skill answer (including a confident "none fits") names a skill.
126
129
  skillAnswered: !!picked.skill && picked.skill.confidence >= jp.resolveMinConfidence(process.env),
127
130
  skills: jp.acceptSkills(picked.skill).map(function (id) { return skillById[id]; }).filter(Boolean),
128
131
  };
@@ -134,6 +137,10 @@ async function _pickWithJev(CWD, prompt, agents, includeAgentId, skills) {
134
137
  // is not a selector (its agent table and matchSkills predate the catalogs).
135
138
  async function _decidePick(CWD, prompt) {
136
139
  var jp = _loadJevPicker();
140
+ // The skill index is read below: rebuild it first when a skill/command tree
141
+ // is newer (a stat scan, plus a ~30 ms build only when stale). Fails open:
142
+ // the catalog still drops entries whose file is gone.
143
+ try { pickCore.ensureSkillRegistryFresh(CWD); } catch (e) { /* keep the index as it is */ }
137
144
  var agents = jp ? jp.loadAgentCatalog(CWD) : [];
138
145
  var skills = jp ? jp.loadSkillCatalog(CWD) : [];
139
146
  var skillMatches = pickCore.rankSkills(jp, prompt, skills);
@@ -144,8 +151,9 @@ async function _decidePick(CWD, prompt) {
144
151
  var keywordCands = pickCore.rankAgents(jp, prompt, agents, stats);
145
152
  var jev = await _pickWithJev(CWD, prompt, agents, keywordCands[0] && keywordCands[0].id, skills);
146
153
  var pick = pickCore.decide({ agents: agents, keywordCands: keywordCands, skillMatches: skillMatches, jev: jev });
147
- // Jev's skill answer replaces keyword skill matches, including "none fits".
148
- if (jev && jev.skillAnswered) {
154
+ // Jev's skill answer replaces keyword skill matches, including "none fits"
155
+ // and an answer below its bar (no skills then).
156
+ if (jev && jev.skillResponded) {
149
157
  skillMatches = jev.skills.map(function (s, i) {
150
158
  return { skill: s.id, invoke: s.invoke, description: s.description || '', score: i === 0 ? 2 : 1, source: 'jev' };
151
159
  });
@@ -39,6 +39,9 @@ module.exports = {
39
39
  // Keep skill-registry.json (the skill catalog routing and Jev read) in
40
40
  // step with .claude/skills: rebuilt when missing or older than any skill.
41
41
  try { require('./pick-core.cjs').ensureSkillRegistryFresh(CWD); } catch (e) { /* non-fatal */ }
42
+ // Same for .monomind/registry.json (the agent catalog): rebuilt when an
43
+ // agent in .claude/agents or ~/.claude/agents is newer.
44
+ try { require('./pick-core.cjs').ensureAgentRegistryFresh(CWD); } catch (e) { /* non-fatal */ }
42
45
 
43
46
  // ── Non-blocking security scan via @monoes/hooks worker ─────────────
44
47
  // The hooks package ships a security worker (worker-security.ts) that scans
@@ -135,7 +138,7 @@ module.exports = {
135
138
  if (bundledDir) {
136
139
  var healed = [];
137
140
  // Top-level critical files — mirrors executor.ts's `criticalHelpers` list.
138
- var helpersToCheck = ['hook-handler.cjs', 'statusline.cjs', 'router.cjs', 'monograph-freshen.cjs', 'control-start.cjs', 'intelligence.cjs', 'auto-memory-hook.mjs', 'build-skill-registry.cjs', 'org-skill-index.cjs', 'jev-picker.cjs', 'jev-catalog.cjs', 'redact-secrets.cjs', 'pick-rank.cjs', 'pick-stats.cjs'];
141
+ var helpersToCheck = ['hook-handler.cjs', 'statusline.cjs', 'router.cjs', 'monograph-freshen.cjs', 'control-start.cjs', 'intelligence.cjs', 'auto-memory-hook.mjs', 'build-skill-registry.cjs', 'agent-registry.cjs', 'org-skill-index.cjs', 'jev-picker.cjs', 'jev-catalog.cjs', 'redact-secrets.cjs', 'pick-rank.cjs', 'pick-stats.cjs'];
139
142
  for (var hi = 0; hi < helpersToCheck.length; hi++) {
140
143
  var hName = helpersToCheck[hi];
141
144
  var healedName = _healIfStale(