agents-inc 0.152.0 → 0.153.0

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 (440) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +44 -48
  3. package/dist/{chunk-LDP5ASDM.js → chunk-2HC2SNRP.js} +2 -15
  4. package/dist/chunk-2HC2SNRP.js.map +1 -0
  5. package/dist/{chunk-WKTHWQKM.js → chunk-35VOK7XE.js} +1338 -2573
  6. package/dist/chunk-35VOK7XE.js.map +1 -0
  7. package/dist/{chunk-SX5H6TSC.js → chunk-4VYALFQZ.js} +11 -8
  8. package/dist/chunk-4VYALFQZ.js.map +1 -0
  9. package/dist/{chunk-KXYVJGJP.js → chunk-6CNRMCFM.js} +3 -2
  10. package/dist/{chunk-KXYVJGJP.js.map → chunk-6CNRMCFM.js.map} +1 -1
  11. package/dist/{chunk-LZ52XEPR.js → chunk-ACKC577F.js} +7 -6
  12. package/dist/chunk-ACKC577F.js.map +1 -0
  13. package/dist/{chunk-XHUODHZ4.js → chunk-BMGBA6HJ.js} +22 -49
  14. package/dist/chunk-BMGBA6HJ.js.map +1 -0
  15. package/dist/{chunk-FVDKAVOL.js → chunk-EFU6P3B7.js} +18 -51
  16. package/dist/chunk-EFU6P3B7.js.map +1 -0
  17. package/dist/{chunk-STMHDOZD.js → chunk-F7Z5I6GU.js} +12 -9
  18. package/dist/chunk-F7Z5I6GU.js.map +1 -0
  19. package/dist/{chunk-E5X6RJ4E.js → chunk-FIHTAFST.js} +29 -26
  20. package/dist/chunk-FIHTAFST.js.map +1 -0
  21. package/dist/{chunk-QZZJFYUQ.js → chunk-FRWKCE6R.js} +3 -3
  22. package/dist/chunk-FRWKCE6R.js.map +1 -0
  23. package/dist/{chunk-5UWKOOIS.js → chunk-HEBPKK5L.js} +129 -195
  24. package/dist/chunk-HEBPKK5L.js.map +1 -0
  25. package/dist/{chunk-MJ2KHG24.js → chunk-IO4VEW5U.js} +6 -6
  26. package/dist/{chunk-MJ2KHG24.js.map → chunk-IO4VEW5U.js.map} +1 -1
  27. package/dist/{chunk-TUPYW2IQ.js → chunk-JC7DBPRD.js} +9 -12
  28. package/dist/chunk-JC7DBPRD.js.map +1 -0
  29. package/dist/{chunk-5GUOIJSG.js → chunk-JFAUQDZM.js} +3 -15
  30. package/dist/chunk-JFAUQDZM.js.map +1 -0
  31. package/dist/{chunk-ZL7PFNHN.js → chunk-K3O3YQYG.js} +2 -2
  32. package/dist/{chunk-SKQWRUPX.js → chunk-K7PJDWER.js} +59 -33
  33. package/dist/chunk-K7PJDWER.js.map +1 -0
  34. package/dist/{chunk-MVR3SYMN.js → chunk-KET3EVGX.js} +4 -3
  35. package/dist/{chunk-MVR3SYMN.js.map → chunk-KET3EVGX.js.map} +1 -1
  36. package/dist/{chunk-MWG4VU64.js → chunk-M5HSTNYU.js} +50 -56
  37. package/dist/chunk-M5HSTNYU.js.map +1 -0
  38. package/dist/{chunk-TJJPWUMA.js → chunk-NSJ2S7R5.js} +3 -2
  39. package/dist/{chunk-TJJPWUMA.js.map → chunk-NSJ2S7R5.js.map} +1 -1
  40. package/dist/{chunk-IHUY4M22.js → chunk-NXGMM5YN.js} +4 -4
  41. package/dist/chunk-NXQAY5U7.js +18441 -0
  42. package/dist/chunk-NXQAY5U7.js.map +1 -0
  43. package/dist/{chunk-Q2KG7UV3.js → chunk-OJJLYHM3.js} +2 -1
  44. package/dist/{chunk-Q2KG7UV3.js.map → chunk-OJJLYHM3.js.map} +1 -1
  45. package/dist/{chunk-PZIZNMHK.js → chunk-ORJ5Y222.js} +159 -138
  46. package/dist/chunk-ORJ5Y222.js.map +1 -0
  47. package/dist/{chunk-NR3OZGL4.js → chunk-OZXAJNLA.js} +2 -1
  48. package/dist/{chunk-NR3OZGL4.js.map → chunk-OZXAJNLA.js.map} +1 -1
  49. package/dist/{chunk-MM7CTTAV.js → chunk-Q5FLW4JG.js} +2 -2
  50. package/dist/{chunk-MM7CTTAV.js.map → chunk-Q5FLW4JG.js.map} +1 -1
  51. package/dist/{chunk-GRVKW3CC.js → chunk-R4SEU3DF.js} +3 -2
  52. package/dist/{chunk-GRVKW3CC.js.map → chunk-R4SEU3DF.js.map} +1 -1
  53. package/dist/{chunk-76ADG7LQ.js → chunk-R54KIGN2.js} +8 -22
  54. package/dist/chunk-R54KIGN2.js.map +1 -0
  55. package/dist/{chunk-SBHBBZKF.js → chunk-REKOWTIB.js} +25 -120
  56. package/dist/chunk-REKOWTIB.js.map +1 -0
  57. package/dist/chunk-TY6CAOL7.js +40 -0
  58. package/dist/chunk-TY6CAOL7.js.map +1 -0
  59. package/dist/{chunk-BNSRA6HL.js → chunk-U2DNAHFE.js} +39 -176
  60. package/dist/chunk-U2DNAHFE.js.map +1 -0
  61. package/dist/{chunk-PMM2MYMA.js → chunk-U2YSGBHA.js} +624 -349
  62. package/dist/chunk-U2YSGBHA.js.map +1 -0
  63. package/dist/{chunk-DTSG5XZB.js → chunk-V3ENMW7G.js} +3 -3
  64. package/dist/{chunk-L7SZXUBJ.js → chunk-VECFAKM5.js} +7 -6
  65. package/dist/{chunk-L7SZXUBJ.js.map → chunk-VECFAKM5.js.map} +1 -1
  66. package/dist/chunk-VGEBYCQZ.js +59 -0
  67. package/dist/chunk-VGEBYCQZ.js.map +1 -0
  68. package/dist/chunk-VZRO7RYT.js +3694 -0
  69. package/dist/chunk-VZRO7RYT.js.map +1 -0
  70. package/dist/{chunk-LASI35KT.js → chunk-WDAO3RUY.js} +14 -28
  71. package/dist/chunk-WDAO3RUY.js.map +1 -0
  72. package/dist/{chunk-MQ7FLIYS.js → chunk-WG6V6VJV.js} +3 -2
  73. package/dist/{chunk-MQ7FLIYS.js.map → chunk-WG6V6VJV.js.map} +1 -1
  74. package/dist/chunk-X5XJ6WKO.js +284 -0
  75. package/dist/chunk-X5XJ6WKO.js.map +1 -0
  76. package/dist/{chunk-RNJWAKMO.js → chunk-XGMOXMS4.js} +9 -8
  77. package/dist/chunk-XGMOXMS4.js.map +1 -0
  78. package/dist/{chunk-IUQBOCSU.js → chunk-ZBPEFQ4G.js} +2 -1
  79. package/dist/{chunk-IUQBOCSU.js.map → chunk-ZBPEFQ4G.js.map} +1 -1
  80. package/dist/{chunk-QRDTLVXG.js → chunk-ZNDLUWWD.js} +9 -22
  81. package/dist/chunk-ZNDLUWWD.js.map +1 -0
  82. package/dist/commands/build/marketplace.js +114 -35
  83. package/dist/commands/build/marketplace.js.map +1 -1
  84. package/dist/commands/build/plugins.js +9 -10
  85. package/dist/commands/build/plugins.js.map +1 -1
  86. package/dist/commands/compile.js +97 -70
  87. package/dist/commands/compile.js.map +1 -1
  88. package/dist/commands/doctor.js +793 -64
  89. package/dist/commands/doctor.js.map +1 -1
  90. package/dist/commands/edit.js +169 -208
  91. package/dist/commands/edit.js.map +1 -1
  92. package/dist/commands/eject.js +24 -39
  93. package/dist/commands/eject.js.map +1 -1
  94. package/dist/commands/init.js +41 -46
  95. package/dist/commands/list.js +10 -12
  96. package/dist/commands/list.js.map +1 -1
  97. package/dist/commands/search.js +20 -81
  98. package/dist/commands/search.js.map +1 -1
  99. package/dist/commands/uninstall.js +25 -31
  100. package/dist/commands/uninstall.js.map +1 -1
  101. package/dist/commands/update.js +82 -332
  102. package/dist/commands/update.js.map +1 -1
  103. package/dist/components/common/confirm.js +1 -1
  104. package/dist/components/common/prompt-confirm.js +1 -1
  105. package/dist/components/common/select-list.js +2 -2
  106. package/dist/components/common/spinner.js +1 -1
  107. package/dist/components/wizard/category-grid.js +5 -6
  108. package/dist/components/wizard/checkbox-grid.js +5 -6
  109. package/dist/components/wizard/domain-selection.js +12 -13
  110. package/dist/components/wizard/run-wizard-session.js +30 -36
  111. package/dist/components/wizard/scroll-affordance.js +2 -2
  112. package/dist/components/wizard/skill-agent-summary.js +7 -7
  113. package/dist/components/wizard/source-grid.js +6 -11
  114. package/dist/components/wizard/stack-selection.js +9 -9
  115. package/dist/components/wizard/step-agents.js +12 -12
  116. package/dist/components/wizard/step-build.js +10 -11
  117. package/dist/components/wizard/step-confirm.js +11 -11
  118. package/dist/components/wizard/step-sources.js +11 -17
  119. package/dist/components/wizard/step-stack.js +10 -10
  120. package/dist/components/wizard/summary-panel.js +10 -10
  121. package/dist/components/wizard/toast.js +2 -2
  122. package/dist/components/wizard/wizard-layout.js +15 -16
  123. package/dist/components/wizard/wizard-tabs.js +6 -12
  124. package/dist/components/wizard/wizard.js +29 -35
  125. package/dist/config-exports.js +1 -1
  126. package/dist/copy-local-skills-KF2RAVD3.js +14 -0
  127. package/dist/hooks/init.js +49 -48
  128. package/dist/hooks/init.js.map +1 -1
  129. package/dist/index.js +3 -1
  130. package/dist/index.js.map +1 -1
  131. package/dist/load-agent-defs-DGXGBU3Q.js +15 -0
  132. package/dist/{loader-5JP4S7CJ.js → loader-4U7UCE2Y.js} +7 -5
  133. package/dist/recompile-project-agents-CJVBAWDJ.js +20 -0
  134. package/dist/{source-loader-MZYCPL2S.js → source-loader-ZNSYJJCI.js} +6 -6
  135. package/dist/src/agents/developer/ai-developer/identity.md +4 -4
  136. package/dist/src/agents/developer/ai-developer/playbook.md +1 -1
  137. package/dist/src/agents/developer/api-developer/identity.md +4 -4
  138. package/dist/src/agents/developer/api-developer/metadata.yaml +1 -1
  139. package/dist/src/agents/developer/cli-developer/identity.md +4 -4
  140. package/dist/src/agents/developer/web-developer/identity.md +2 -2
  141. package/dist/src/agents/developer/web-developer/metadata.yaml +1 -1
  142. package/dist/src/agents/meta/agent-summoner/identity.md +4 -5
  143. package/dist/src/agents/meta/agent-summoner/output.md +2 -2
  144. package/dist/src/agents/meta/agent-summoner/playbook.md +15 -16
  145. package/dist/src/agents/meta/codex-keeper/identity.md +4 -4
  146. package/dist/src/agents/meta/codex-keeper/playbook.md +1 -1
  147. package/dist/src/agents/meta/convention-keeper/identity.md +1 -1
  148. package/dist/src/agents/meta/skill-summoner/critical-reminders.md +0 -34
  149. package/dist/src/agents/meta/skill-summoner/critical-requirements.md +27 -3
  150. package/dist/src/agents/meta/skill-summoner/identity.md +2 -2
  151. package/{src/agents/planning/web-pm → dist/src/agents/planning/pm}/critical-reminders.md +10 -7
  152. package/dist/src/agents/planning/{web-pm → pm}/critical-requirements.md +8 -4
  153. package/dist/src/agents/planning/pm/identity.md +47 -0
  154. package/dist/src/agents/planning/pm/metadata.yaml +12 -0
  155. package/dist/src/agents/planning/{web-pm → pm}/output.md +7 -90
  156. package/dist/src/agents/planning/pm/playbook.md +185 -0
  157. package/dist/src/agents/researcher/ai-researcher/critical-reminders.md +58 -0
  158. package/dist/src/agents/researcher/ai-researcher/critical-requirements.md +40 -0
  159. package/dist/src/agents/researcher/ai-researcher/identity.md +86 -0
  160. package/dist/src/agents/researcher/ai-researcher/metadata.yaml +10 -0
  161. package/dist/src/agents/researcher/ai-researcher/output.md +363 -0
  162. package/dist/src/agents/researcher/ai-researcher/playbook.md +545 -0
  163. package/dist/src/agents/researcher/api-researcher/critical-reminders.md +16 -0
  164. package/dist/src/agents/researcher/api-researcher/identity.md +7 -7
  165. package/dist/src/agents/researcher/cli-researcher/critical-reminders.md +50 -0
  166. package/dist/src/agents/researcher/cli-researcher/critical-requirements.md +36 -0
  167. package/dist/src/agents/researcher/cli-researcher/identity.md +87 -0
  168. package/dist/src/agents/researcher/cli-researcher/metadata.yaml +10 -0
  169. package/dist/src/agents/researcher/cli-researcher/output.md +343 -0
  170. package/dist/src/agents/researcher/cli-researcher/playbook.md +370 -0
  171. package/dist/src/agents/researcher/web-researcher/identity.md +5 -6
  172. package/dist/src/agents/reviewer/reviewer/critical-reminders.md +29 -0
  173. package/dist/src/agents/reviewer/reviewer/critical-requirements.md +31 -0
  174. package/dist/src/agents/reviewer/reviewer/identity.md +41 -0
  175. package/dist/src/agents/reviewer/reviewer/metadata.yaml +12 -0
  176. package/dist/src/agents/reviewer/reviewer/output.md +202 -0
  177. package/dist/src/agents/reviewer/reviewer/playbook.md +141 -0
  178. package/dist/src/agents/tester/ai-tester/critical-reminders.md +48 -0
  179. package/dist/src/agents/tester/ai-tester/critical-requirements.md +49 -0
  180. package/dist/src/agents/tester/ai-tester/identity.md +62 -0
  181. package/dist/src/agents/tester/ai-tester/metadata.yaml +12 -0
  182. package/dist/src/agents/tester/ai-tester/output.md +375 -0
  183. package/dist/src/agents/tester/ai-tester/playbook.md +789 -0
  184. package/dist/src/agents/tester/api-tester/identity.md +3 -3
  185. package/dist/src/agents/tester/cli-tester/critical-reminders.md +3 -3
  186. package/dist/src/agents/tester/cli-tester/critical-requirements.md +2 -2
  187. package/dist/src/agents/tester/cli-tester/identity.md +3 -3
  188. package/dist/src/agents/tester/cli-tester/output.md +4 -4
  189. package/dist/src/agents/tester/cli-tester/playbook.md +3 -3
  190. package/dist/src/agents/tester/web-tester/identity.md +3 -3
  191. package/dist/stores/wizard-store.js +8 -6
  192. package/package.json +13 -2
  193. package/src/agents/developer/ai-developer/identity.md +4 -4
  194. package/src/agents/developer/ai-developer/playbook.md +1 -1
  195. package/src/agents/developer/api-developer/identity.md +4 -4
  196. package/src/agents/developer/api-developer/metadata.yaml +1 -1
  197. package/src/agents/developer/cli-developer/identity.md +4 -4
  198. package/src/agents/developer/web-developer/identity.md +2 -2
  199. package/src/agents/developer/web-developer/metadata.yaml +1 -1
  200. package/src/agents/meta/agent-summoner/identity.md +4 -5
  201. package/src/agents/meta/agent-summoner/output.md +2 -2
  202. package/src/agents/meta/agent-summoner/playbook.md +15 -16
  203. package/src/agents/meta/codex-keeper/identity.md +4 -4
  204. package/src/agents/meta/codex-keeper/playbook.md +1 -1
  205. package/src/agents/meta/convention-keeper/identity.md +1 -1
  206. package/src/agents/meta/skill-summoner/critical-reminders.md +0 -34
  207. package/src/agents/meta/skill-summoner/critical-requirements.md +27 -3
  208. package/src/agents/meta/skill-summoner/identity.md +2 -2
  209. package/{dist/src/agents/planning/web-pm → src/agents/planning/pm}/critical-reminders.md +10 -7
  210. package/src/agents/planning/{web-pm → pm}/critical-requirements.md +8 -4
  211. package/src/agents/planning/pm/identity.md +47 -0
  212. package/src/agents/planning/pm/metadata.yaml +12 -0
  213. package/src/agents/planning/{web-pm → pm}/output.md +7 -90
  214. package/src/agents/planning/pm/playbook.md +185 -0
  215. package/src/agents/researcher/ai-researcher/critical-reminders.md +58 -0
  216. package/src/agents/researcher/ai-researcher/critical-requirements.md +40 -0
  217. package/src/agents/researcher/ai-researcher/identity.md +86 -0
  218. package/src/agents/researcher/ai-researcher/metadata.yaml +10 -0
  219. package/src/agents/researcher/ai-researcher/output.md +363 -0
  220. package/src/agents/researcher/ai-researcher/playbook.md +545 -0
  221. package/src/agents/researcher/api-researcher/critical-reminders.md +16 -0
  222. package/src/agents/researcher/api-researcher/identity.md +7 -7
  223. package/src/agents/researcher/cli-researcher/critical-reminders.md +50 -0
  224. package/src/agents/researcher/cli-researcher/critical-requirements.md +36 -0
  225. package/src/agents/researcher/cli-researcher/identity.md +87 -0
  226. package/src/agents/researcher/cli-researcher/metadata.yaml +10 -0
  227. package/src/agents/researcher/cli-researcher/output.md +343 -0
  228. package/src/agents/researcher/cli-researcher/playbook.md +370 -0
  229. package/src/agents/researcher/web-researcher/identity.md +5 -6
  230. package/src/agents/reviewer/reviewer/critical-reminders.md +29 -0
  231. package/src/agents/reviewer/reviewer/critical-requirements.md +31 -0
  232. package/src/agents/reviewer/reviewer/identity.md +41 -0
  233. package/src/agents/reviewer/reviewer/metadata.yaml +12 -0
  234. package/src/agents/reviewer/reviewer/output.md +202 -0
  235. package/src/agents/reviewer/reviewer/playbook.md +141 -0
  236. package/src/agents/tester/ai-tester/critical-reminders.md +48 -0
  237. package/src/agents/tester/ai-tester/critical-requirements.md +49 -0
  238. package/src/agents/tester/ai-tester/identity.md +62 -0
  239. package/src/agents/tester/ai-tester/metadata.yaml +12 -0
  240. package/src/agents/tester/ai-tester/output.md +375 -0
  241. package/src/agents/tester/ai-tester/playbook.md +789 -0
  242. package/src/agents/tester/api-tester/identity.md +3 -3
  243. package/src/agents/tester/cli-tester/critical-reminders.md +3 -3
  244. package/src/agents/tester/cli-tester/critical-requirements.md +2 -2
  245. package/src/agents/tester/cli-tester/identity.md +3 -3
  246. package/src/agents/tester/cli-tester/output.md +4 -4
  247. package/src/agents/tester/cli-tester/playbook.md +3 -3
  248. package/src/agents/tester/web-tester/identity.md +3 -3
  249. package/src/schemas/metadata.schema.json +31 -2
  250. package/src/schemas/project-config.schema.json +61 -15
  251. package/src/schemas/project-source-config.schema.json +0 -47
  252. package/dist/chunk-5GUOIJSG.js.map +0 -1
  253. package/dist/chunk-5UWKOOIS.js.map +0 -1
  254. package/dist/chunk-76ADG7LQ.js.map +0 -1
  255. package/dist/chunk-BNSRA6HL.js.map +0 -1
  256. package/dist/chunk-E5X6RJ4E.js.map +0 -1
  257. package/dist/chunk-EEPELKOM.js +0 -5938
  258. package/dist/chunk-EEPELKOM.js.map +0 -1
  259. package/dist/chunk-F7T5AFFN.js +0 -20
  260. package/dist/chunk-F7T5AFFN.js.map +0 -1
  261. package/dist/chunk-FVDKAVOL.js.map +0 -1
  262. package/dist/chunk-KFB5CRXZ.js +0 -377
  263. package/dist/chunk-KFB5CRXZ.js.map +0 -1
  264. package/dist/chunk-KR65TPKC.js +0 -664
  265. package/dist/chunk-KR65TPKC.js.map +0 -1
  266. package/dist/chunk-LASI35KT.js.map +0 -1
  267. package/dist/chunk-LDP5ASDM.js.map +0 -1
  268. package/dist/chunk-LZ52XEPR.js.map +0 -1
  269. package/dist/chunk-M7HO7NBK.js +0 -88
  270. package/dist/chunk-M7HO7NBK.js.map +0 -1
  271. package/dist/chunk-MWG4VU64.js.map +0 -1
  272. package/dist/chunk-ODNDXQH2.js +0 -77
  273. package/dist/chunk-ODNDXQH2.js.map +0 -1
  274. package/dist/chunk-P44SXVH3.js +0 -80
  275. package/dist/chunk-P44SXVH3.js.map +0 -1
  276. package/dist/chunk-PMM2MYMA.js.map +0 -1
  277. package/dist/chunk-PZIZNMHK.js.map +0 -1
  278. package/dist/chunk-Q45ZU6HD.js +0 -37
  279. package/dist/chunk-Q45ZU6HD.js.map +0 -1
  280. package/dist/chunk-QRDTLVXG.js.map +0 -1
  281. package/dist/chunk-QZZJFYUQ.js.map +0 -1
  282. package/dist/chunk-R5NOI2LP.js +0 -170
  283. package/dist/chunk-R5NOI2LP.js.map +0 -1
  284. package/dist/chunk-RNJWAKMO.js.map +0 -1
  285. package/dist/chunk-SBHBBZKF.js.map +0 -1
  286. package/dist/chunk-SKQWRUPX.js.map +0 -1
  287. package/dist/chunk-STMHDOZD.js.map +0 -1
  288. package/dist/chunk-SX5H6TSC.js.map +0 -1
  289. package/dist/chunk-TUPYW2IQ.js.map +0 -1
  290. package/dist/chunk-UBEDZ4FD.js +0 -4198
  291. package/dist/chunk-UBEDZ4FD.js.map +0 -1
  292. package/dist/chunk-VY6MNOXL.js +0 -20
  293. package/dist/chunk-VY6MNOXL.js.map +0 -1
  294. package/dist/chunk-WBCPLH66.js +0 -42
  295. package/dist/chunk-WBCPLH66.js.map +0 -1
  296. package/dist/chunk-WKTHWQKM.js.map +0 -1
  297. package/dist/chunk-XHUODHZ4.js.map +0 -1
  298. package/dist/chunk-ZPPHXXAP.js +0 -252
  299. package/dist/chunk-ZPPHXXAP.js.map +0 -1
  300. package/dist/commands/import/skill.js +0 -344
  301. package/dist/commands/import/skill.js.map +0 -1
  302. package/dist/commands/new/agent.js +0 -300
  303. package/dist/commands/new/agent.js.map +0 -1
  304. package/dist/commands/new/marketplace.js +0 -310
  305. package/dist/commands/new/marketplace.js.map +0 -1
  306. package/dist/commands/new/skill.js +0 -26
  307. package/dist/commands/validate.js +0 -575
  308. package/dist/commands/validate.js.map +0 -1
  309. package/dist/components/wizard/search-modal.js +0 -13
  310. package/dist/components/wizard/selection-card.js +0 -9
  311. package/dist/components/wizard/step-settings.js +0 -18
  312. package/dist/copy-local-skills-6EMVN7RB.js +0 -14
  313. package/dist/load-agent-defs-BWOUVEAR.js +0 -15
  314. package/dist/load-agent-defs-BWOUVEAR.js.map +0 -1
  315. package/dist/loader-5JP4S7CJ.js.map +0 -1
  316. package/dist/recompile-project-agents-6DL45TDI.js +0 -19
  317. package/dist/recompile-project-agents-6DL45TDI.js.map +0 -1
  318. package/dist/source-loader-MZYCPL2S.js.map +0 -1
  319. package/dist/src/agents/developer/web-architecture/critical-reminders.md +0 -48
  320. package/dist/src/agents/developer/web-architecture/critical-requirements.md +0 -65
  321. package/dist/src/agents/developer/web-architecture/identity.md +0 -64
  322. package/dist/src/agents/developer/web-architecture/metadata.yaml +0 -12
  323. package/dist/src/agents/developer/web-architecture/output.md +0 -449
  324. package/dist/src/agents/developer/web-architecture/playbook.md +0 -481
  325. package/dist/src/agents/pattern/pattern-scout/critical-reminders.md +0 -71
  326. package/dist/src/agents/pattern/pattern-scout/critical-requirements.md +0 -31
  327. package/dist/src/agents/pattern/pattern-scout/identity.md +0 -25
  328. package/dist/src/agents/pattern/pattern-scout/metadata.yaml +0 -10
  329. package/dist/src/agents/pattern/pattern-scout/output.md +0 -290
  330. package/dist/src/agents/pattern/pattern-scout/playbook.md +0 -1806
  331. package/dist/src/agents/pattern/web-pattern-critique/critical-reminders.md +0 -30
  332. package/dist/src/agents/pattern/web-pattern-critique/critical-requirements.md +0 -28
  333. package/dist/src/agents/pattern/web-pattern-critique/identity.md +0 -41
  334. package/dist/src/agents/pattern/web-pattern-critique/metadata.yaml +0 -12
  335. package/dist/src/agents/pattern/web-pattern-critique/output.md +0 -314
  336. package/dist/src/agents/pattern/web-pattern-critique/playbook.md +0 -572
  337. package/dist/src/agents/planning/api-pm/critical-reminders.md +0 -48
  338. package/dist/src/agents/planning/api-pm/critical-requirements.md +0 -41
  339. package/dist/src/agents/planning/api-pm/identity.md +0 -39
  340. package/dist/src/agents/planning/api-pm/metadata.yaml +0 -12
  341. package/dist/src/agents/planning/api-pm/output.md +0 -475
  342. package/dist/src/agents/planning/api-pm/playbook.md +0 -129
  343. package/dist/src/agents/planning/web-pm/identity.md +0 -26
  344. package/dist/src/agents/planning/web-pm/metadata.yaml +0 -12
  345. package/dist/src/agents/planning/web-pm/playbook.md +0 -318
  346. package/dist/src/agents/reviewer/ai-reviewer/critical-reminders.md +0 -40
  347. package/dist/src/agents/reviewer/ai-reviewer/critical-requirements.md +0 -37
  348. package/dist/src/agents/reviewer/ai-reviewer/identity.md +0 -51
  349. package/dist/src/agents/reviewer/ai-reviewer/metadata.yaml +0 -10
  350. package/dist/src/agents/reviewer/ai-reviewer/output.md +0 -395
  351. package/dist/src/agents/reviewer/ai-reviewer/playbook.md +0 -90
  352. package/dist/src/agents/reviewer/api-reviewer/critical-reminders.md +0 -31
  353. package/dist/src/agents/reviewer/api-reviewer/critical-requirements.md +0 -27
  354. package/dist/src/agents/reviewer/api-reviewer/identity.md +0 -51
  355. package/dist/src/agents/reviewer/api-reviewer/metadata.yaml +0 -12
  356. package/dist/src/agents/reviewer/api-reviewer/output.md +0 -343
  357. package/dist/src/agents/reviewer/api-reviewer/playbook.md +0 -288
  358. package/dist/src/agents/reviewer/cli-reviewer/critical-reminders.md +0 -33
  359. package/dist/src/agents/reviewer/cli-reviewer/critical-requirements.md +0 -30
  360. package/dist/src/agents/reviewer/cli-reviewer/identity.md +0 -44
  361. package/dist/src/agents/reviewer/cli-reviewer/metadata.yaml +0 -12
  362. package/dist/src/agents/reviewer/cli-reviewer/output.md +0 -414
  363. package/dist/src/agents/reviewer/cli-reviewer/playbook.md +0 -218
  364. package/dist/src/agents/reviewer/infra-reviewer/critical-reminders.md +0 -38
  365. package/dist/src/agents/reviewer/infra-reviewer/critical-requirements.md +0 -38
  366. package/dist/src/agents/reviewer/infra-reviewer/identity.md +0 -53
  367. package/dist/src/agents/reviewer/infra-reviewer/metadata.yaml +0 -10
  368. package/dist/src/agents/reviewer/infra-reviewer/output.md +0 -364
  369. package/dist/src/agents/reviewer/infra-reviewer/playbook.md +0 -161
  370. package/dist/src/agents/reviewer/web-reviewer/critical-reminders.md +0 -31
  371. package/dist/src/agents/reviewer/web-reviewer/critical-requirements.md +0 -26
  372. package/dist/src/agents/reviewer/web-reviewer/identity.md +0 -40
  373. package/dist/src/agents/reviewer/web-reviewer/metadata.yaml +0 -12
  374. package/dist/src/agents/reviewer/web-reviewer/output.md +0 -333
  375. package/dist/src/agents/reviewer/web-reviewer/playbook.md +0 -156
  376. package/src/agents/developer/web-architecture/critical-reminders.md +0 -48
  377. package/src/agents/developer/web-architecture/critical-requirements.md +0 -65
  378. package/src/agents/developer/web-architecture/identity.md +0 -64
  379. package/src/agents/developer/web-architecture/metadata.yaml +0 -12
  380. package/src/agents/developer/web-architecture/output.md +0 -449
  381. package/src/agents/developer/web-architecture/playbook.md +0 -481
  382. package/src/agents/pattern/pattern-scout/critical-reminders.md +0 -71
  383. package/src/agents/pattern/pattern-scout/critical-requirements.md +0 -31
  384. package/src/agents/pattern/pattern-scout/identity.md +0 -25
  385. package/src/agents/pattern/pattern-scout/metadata.yaml +0 -10
  386. package/src/agents/pattern/pattern-scout/output.md +0 -290
  387. package/src/agents/pattern/pattern-scout/playbook.md +0 -1806
  388. package/src/agents/pattern/web-pattern-critique/critical-reminders.md +0 -30
  389. package/src/agents/pattern/web-pattern-critique/critical-requirements.md +0 -28
  390. package/src/agents/pattern/web-pattern-critique/identity.md +0 -41
  391. package/src/agents/pattern/web-pattern-critique/metadata.yaml +0 -12
  392. package/src/agents/pattern/web-pattern-critique/output.md +0 -314
  393. package/src/agents/pattern/web-pattern-critique/playbook.md +0 -572
  394. package/src/agents/planning/api-pm/critical-reminders.md +0 -48
  395. package/src/agents/planning/api-pm/critical-requirements.md +0 -41
  396. package/src/agents/planning/api-pm/identity.md +0 -39
  397. package/src/agents/planning/api-pm/metadata.yaml +0 -12
  398. package/src/agents/planning/api-pm/output.md +0 -475
  399. package/src/agents/planning/api-pm/playbook.md +0 -129
  400. package/src/agents/planning/web-pm/identity.md +0 -26
  401. package/src/agents/planning/web-pm/metadata.yaml +0 -12
  402. package/src/agents/planning/web-pm/playbook.md +0 -318
  403. package/src/agents/reviewer/ai-reviewer/critical-reminders.md +0 -40
  404. package/src/agents/reviewer/ai-reviewer/critical-requirements.md +0 -37
  405. package/src/agents/reviewer/ai-reviewer/identity.md +0 -51
  406. package/src/agents/reviewer/ai-reviewer/metadata.yaml +0 -10
  407. package/src/agents/reviewer/ai-reviewer/output.md +0 -395
  408. package/src/agents/reviewer/ai-reviewer/playbook.md +0 -90
  409. package/src/agents/reviewer/api-reviewer/critical-reminders.md +0 -31
  410. package/src/agents/reviewer/api-reviewer/critical-requirements.md +0 -27
  411. package/src/agents/reviewer/api-reviewer/identity.md +0 -51
  412. package/src/agents/reviewer/api-reviewer/metadata.yaml +0 -12
  413. package/src/agents/reviewer/api-reviewer/output.md +0 -343
  414. package/src/agents/reviewer/api-reviewer/playbook.md +0 -288
  415. package/src/agents/reviewer/cli-reviewer/critical-reminders.md +0 -33
  416. package/src/agents/reviewer/cli-reviewer/critical-requirements.md +0 -30
  417. package/src/agents/reviewer/cli-reviewer/identity.md +0 -44
  418. package/src/agents/reviewer/cli-reviewer/metadata.yaml +0 -12
  419. package/src/agents/reviewer/cli-reviewer/output.md +0 -414
  420. package/src/agents/reviewer/cli-reviewer/playbook.md +0 -218
  421. package/src/agents/reviewer/infra-reviewer/critical-reminders.md +0 -38
  422. package/src/agents/reviewer/infra-reviewer/critical-requirements.md +0 -38
  423. package/src/agents/reviewer/infra-reviewer/identity.md +0 -53
  424. package/src/agents/reviewer/infra-reviewer/metadata.yaml +0 -10
  425. package/src/agents/reviewer/infra-reviewer/output.md +0 -364
  426. package/src/agents/reviewer/infra-reviewer/playbook.md +0 -161
  427. package/src/agents/reviewer/web-reviewer/critical-reminders.md +0 -31
  428. package/src/agents/reviewer/web-reviewer/critical-requirements.md +0 -26
  429. package/src/agents/reviewer/web-reviewer/identity.md +0 -40
  430. package/src/agents/reviewer/web-reviewer/metadata.yaml +0 -12
  431. package/src/agents/reviewer/web-reviewer/output.md +0 -333
  432. package/src/agents/reviewer/web-reviewer/playbook.md +0 -156
  433. /package/dist/{chunk-ZL7PFNHN.js.map → chunk-K3O3YQYG.js.map} +0 -0
  434. /package/dist/{chunk-IHUY4M22.js.map → chunk-NXGMM5YN.js.map} +0 -0
  435. /package/dist/{chunk-DTSG5XZB.js.map → chunk-V3ENMW7G.js.map} +0 -0
  436. /package/dist/{commands/new/skill.js.map → copy-local-skills-KF2RAVD3.js.map} +0 -0
  437. /package/dist/{components/wizard/search-modal.js.map → load-agent-defs-DGXGBU3Q.js.map} +0 -0
  438. /package/dist/{components/wizard/selection-card.js.map → loader-4U7UCE2Y.js.map} +0 -0
  439. /package/dist/{components/wizard/step-settings.js.map → recompile-project-agents-CJVBAWDJ.js.map} +0 -0
  440. /package/dist/{copy-local-skills-6EMVN7RB.js.map → source-loader-ZNSYJJCI.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/doctor.ts"],"sourcesContent":["import os from \"os\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport { effectivelyExcludedSkillIds, validateProjectConfig } from \"../lib/configuration\";\nimport { loadSource, detectProject } from \"../lib/operations\";\nimport { matrix } from \"../lib/matrix/matrix-provider\";\nimport { discoverLocalSkills } from \"../lib/skills\";\nimport { getStackSkillIds } from \"../lib/stacks\";\nimport { filterExcludedEntries, listAgentMdFiles } from \"../lib/agents\";\nimport { getVerifiedPluginInstallPaths, parseMarketplacePluginRef } from \"../lib/plugins\";\nimport { isHomeDirectory, installBaseDir, resolveInstallPaths } from \"../lib/installation\";\nimport type { MergedSkillsMatrix, ProjectConfig, SkillConfig } from \"../types\";\nimport { fileExists, directoryExists } from \"../utils/fs\";\nimport {\n CLAUDE_SRC_DIR,\n CLI_INVOKE_COMMAND,\n DEFAULT_BRANDING,\n EJECT_SOURCE,\n LOCAL_SKILLS_PATH,\n STANDARD_FILES,\n UI_SYMBOLS,\n} from \"../consts\";\nimport { countBy, unique } from \"remeda\";\nimport { setVerbose } from \"../utils/logger\";\n\ntype CheckKind = \"config\" | \"skills\" | \"agents\" | \"orphans\" | \"installed\" | \"plugins\" | \"source\";\n\ntype CheckResult = {\n kind: CheckKind;\n status: \"pass\" | \"fail\" | \"warn\" | \"skip\";\n message: string;\n details?: string[];\n};\n\ntype ConfigCheckOutput = {\n result: CheckResult;\n config: ProjectConfig | null;\n};\n\n/** Project-relative path to the config file, shown in doctor messages. */\nconst CONFIG_TS_REL = `${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TS}`;\n\nfunction checkConfigValid(config: ProjectConfig | null): ConfigCheckOutput {\n if (!config) {\n return {\n result: {\n kind: \"config\",\n status: \"fail\",\n message: `${CONFIG_TS_REL} not found`,\n details: [`Run '${CLI_INVOKE_COMMAND} init' to create a configuration`],\n },\n config: null,\n };\n }\n\n const validation = validateProjectConfig(config);\n\n if (!validation.valid) {\n return {\n result: {\n kind: \"config\",\n status: \"fail\",\n message: `${CONFIG_TS_REL} has errors`,\n details: validation.errors,\n },\n config: null,\n };\n }\n\n if (validation.warnings.length > 0) {\n return {\n result: {\n kind: \"config\",\n status: \"warn\",\n message: `${CONFIG_TS_REL} has warnings`,\n details: validation.warnings,\n },\n config,\n };\n }\n\n return {\n result: {\n kind: \"config\",\n status: \"pass\",\n message: `${CONFIG_TS_REL} is valid`,\n },\n config,\n };\n}\n\nasync function checkSkillsResolved(\n config: ProjectConfig,\n matrix: MergedSkillsMatrix,\n projectDir: string,\n): Promise<CheckResult> {\n // config.ts declares skills both directly and through the stack. A global-only\n // install has a populated skills array and no stack at all, so keying this check\n // off the stack alone would report \"No skills configured\" for a real install.\n const excludedIds = effectivelyExcludedSkillIds(config.skills);\n const stackIds = config.stack ? getStackSkillIds(config.stack) : [];\n const uniqueSkills = unique([...stackIds, ...config.skills.map((s) => s.id)]).filter(\n (id) => !excludedIds.has(id),\n );\n\n if (uniqueSkills.length === 0) {\n return {\n kind: \"skills\",\n status: \"pass\",\n message: \"No skills configured\",\n };\n }\n\n const [localResult, globalResult] = await Promise.all([\n discoverLocalSkills(projectDir),\n !isHomeDirectory(projectDir) ? discoverLocalSkills(os.homedir()) : null,\n ]);\n const localSkillIds = new Set([\n ...(localResult?.skills.map((s) => s.id) ?? []),\n ...(globalResult?.skills.map((s) => s.id) ?? []),\n ]);\n\n const missingSkills: string[] = [];\n for (const skillId of uniqueSkills) {\n const inMatrix = skillId in matrix.skills;\n const inLocal = localSkillIds.has(skillId);\n if (!inMatrix && !inLocal) {\n missingSkills.push(skillId);\n }\n }\n\n if (missingSkills.length > 0) {\n return {\n kind: \"skills\",\n status: \"fail\",\n message: `${uniqueSkills.length - missingSkills.length}/${uniqueSkills.length} skills found`,\n details: missingSkills.map((s) => `- ${s} (not found)`),\n };\n }\n\n return {\n kind: \"skills\",\n status: \"pass\",\n message: `${uniqueSkills.length}/${uniqueSkills.length} skills found`,\n };\n}\n\nasync function checkAgentsCompiled(\n config: ProjectConfig,\n projectDir: string,\n): Promise<CheckResult> {\n const agents = config.agents ?? [];\n\n if (agents.length === 0) {\n return {\n kind: \"agents\",\n status: \"pass\",\n message: \"No agents configured\",\n };\n }\n\n const projectAgentsDir = resolveInstallPaths(projectDir, \"project\").agentsDir;\n const globalAgentsDir = resolveInstallPaths(projectDir, \"global\").agentsDir;\n const agentChecks = await Promise.all(\n agents.map(async (agent) => {\n // Check scope-appropriate directory for the agent\n const agentsDir = agent.scope === \"global\" ? globalAgentsDir : projectAgentsDir;\n const agentPath = path.join(agentsDir, `${agent.name}.md`);\n return { name: agent.name, compiled: await fileExists(agentPath) };\n }),\n );\n const missingAgents = agentChecks.filter((c) => !c.compiled).map((c) => c.name);\n\n if (missingAgents.length > 0) {\n return {\n kind: \"agents\",\n status: \"warn\",\n message: `${missingAgents.length} agent${missingAgents.length === 1 ? \"\" : \"s\"} need${missingAgents.length === 1 ? \"s\" : \"\"} recompilation`,\n details: missingAgents.map((a) => `- ${a} (missing)`),\n };\n }\n\n return {\n kind: \"agents\",\n status: \"pass\",\n message: `${agents.length}/${agents.length} agents compiled`,\n };\n}\n\nasync function checkNoOrphans(config: ProjectConfig, projectDir: string): Promise<CheckResult> {\n const projectAgentsDir = resolveInstallPaths(projectDir, \"project\").agentsDir;\n const globalAgentsDir = resolveInstallPaths(projectDir, \"global\").agentsDir;\n\n // At home scope both scopes resolve to the same agents directory, so it is\n // listed once and its files are matched against both scopes' known names.\n const scopesShareAgentsDir = isHomeDirectory(projectDir);\n\n const [projectExists, globalExists] = await Promise.all([\n directoryExists(projectAgentsDir),\n !scopesShareAgentsDir ? directoryExists(globalAgentsDir) : false,\n ]);\n\n if (!projectExists && !globalExists) {\n return {\n kind: \"orphans\",\n status: \"pass\",\n message: \"No agents directory\",\n };\n }\n\n const projectMdFiles = projectExists ? await listAgentMdFiles(projectAgentsDir) : [];\n const globalMdFiles = globalExists ? await listAgentMdFiles(globalAgentsDir) : [];\n\n // Project files: only active project-scoped agents should have .md files here\n const activeProjectAgents: Set<string> = new Set(\n (config.agents ?? []).filter((a) => a.scope === \"project\" && !a.excluded).map((a) => a.name),\n );\n // Global files: all global-scoped agents (including excluded) still serve other projects\n const knownGlobalAgents: Set<string> = new Set(\n (config.agents ?? []).filter((a) => a.scope === \"global\").map((a) => a.name),\n );\n\n const knownProjectDirAgents = scopesShareAgentsDir\n ? new Set([...activeProjectAgents, ...knownGlobalAgents])\n : activeProjectAgents;\n\n const orphanedFiles: string[] = [];\n for (const file of projectMdFiles) {\n const agentName = file.replace(/\\.md$/, \"\");\n if (!knownProjectDirAgents.has(agentName)) {\n orphanedFiles.push(agentName);\n }\n }\n for (const file of globalMdFiles) {\n const agentName = file.replace(/\\.md$/, \"\");\n if (!knownGlobalAgents.has(agentName)) {\n orphanedFiles.push(agentName);\n }\n }\n\n if (orphanedFiles.length > 0) {\n return {\n kind: \"orphans\",\n status: \"warn\",\n message: `${orphanedFiles.length} orphaned agent file${orphanedFiles.length === 1 ? \"\" : \"s\"}`,\n details: orphanedFiles.map((f) => `- ${f}.md (not in config)`),\n };\n }\n\n return {\n kind: \"orphans\",\n status: \"pass\",\n message: \"No orphaned agent files\",\n };\n}\n\nasync function checkSkillsInstalled(\n config: ProjectConfig,\n projectDir: string,\n): Promise<CheckResult> {\n const skills: SkillConfig[] = config.skills ?? [];\n const ejectSkills = skills.filter((s) => s.source === EJECT_SOURCE);\n\n if (ejectSkills.length === 0) {\n return {\n kind: \"installed\",\n status: \"pass\",\n message: \"No eject-mode skills configured\",\n };\n }\n\n const skillChecks = await Promise.all(\n ejectSkills.map(async (skill) => {\n const baseDir = installBaseDir(projectDir, skill.scope);\n const skillMdPath = path.join(baseDir, LOCAL_SKILLS_PATH, skill.id, STANDARD_FILES.SKILL_MD);\n return { id: skill.id, installed: await fileExists(skillMdPath) };\n }),\n );\n const missingSkills = skillChecks.filter((c) => !c.installed).map((c) => c.id);\n\n if (missingSkills.length > 0) {\n return {\n kind: \"installed\",\n status: \"warn\",\n message: `${missingSkills.length} skill${missingSkills.length === 1 ? \"\" : \"s\"} missing from disk`,\n details: missingSkills.map((s) => `- ${s} (not found in ${LOCAL_SKILLS_PATH}/)`),\n };\n }\n\n return {\n kind: \"installed\",\n status: \"pass\",\n message: `${ejectSkills.length}/${ejectSkills.length} eject-mode skills installed`,\n };\n}\n\n/**\n * Plugin-mode skills have no files under `.claude/skills/` — they live in the\n * Claude plugin registry. Verifying them means asking the registry for the scope\n * each skill was installed at, not looking on disk.\n */\nasync function checkPluginSkillsInstalled(\n config: ProjectConfig,\n projectDir: string,\n): Promise<CheckResult> {\n const pluginSkills: SkillConfig[] = config.skills.filter((s) => s.source !== EJECT_SOURCE);\n\n if (pluginSkills.length === 0) {\n return {\n kind: \"plugins\",\n status: \"pass\",\n message: \"No plugin-mode skills configured\",\n };\n }\n\n const baseDirs = unique(pluginSkills.map((s) => installBaseDir(projectDir, s.scope)));\n const missingPerBaseDir = await Promise.all(\n baseDirs.map(async (baseDir) => {\n const installedIds = new Set(\n (await getVerifiedPluginInstallPaths(baseDir)).map((plugin) =>\n parseMarketplacePluginRef(plugin.pluginKey),\n ),\n );\n return pluginSkills\n .filter((skill) => installBaseDir(projectDir, skill.scope) === baseDir)\n .filter((skill) => !installedIds.has(skill.id))\n .map((skill) => skill.id);\n }),\n );\n const missingSkills = missingPerBaseDir.flat();\n\n if (missingSkills.length > 0) {\n return {\n kind: \"plugins\",\n status: \"warn\",\n message: `${missingSkills.length} skill${missingSkills.length === 1 ? \"\" : \"s\"} not installed as plugins`,\n details: missingSkills.map((s) => `- ${s} (no enabled plugin found)`),\n };\n }\n\n return {\n kind: \"plugins\",\n status: \"pass\",\n message: `${pluginSkills.length}/${pluginSkills.length} plugin-mode skills installed`,\n };\n}\n\nasync function checkSourceReachable(projectDir: string): Promise<CheckResult> {\n try {\n const { sourceResult: result } = await loadSource({\n projectDir,\n });\n\n const skillCount = Object.keys(matrix.skills).length;\n const sourceLabel = result.isLocal ? \"local\" : \"remote\";\n\n return {\n kind: \"source\",\n status: \"pass\",\n message: `Connected to ${sourceLabel}: ${result.sourcePath}`,\n details: [`${skillCount} skills available`],\n };\n } catch (error) {\n const message = getErrorMessage(error);\n return {\n kind: \"source\",\n status: \"fail\",\n message: \"Failed to load source\",\n details: [message],\n };\n }\n}\n\nconst CHECK_WIDTH = 20;\n\nfunction formatCheckName(name: string): string {\n return name.padEnd(CHECK_WIDTH);\n}\n\nfunction formatStatus(status: CheckResult[\"status\"]): string {\n switch (status) {\n case \"pass\":\n return UI_SYMBOLS.CHECK;\n case \"fail\":\n return UI_SYMBOLS.CROSS;\n case \"warn\":\n return \"!\";\n case \"skip\":\n return \"-\";\n default: {\n const _exhaustive: never = status;\n return _exhaustive;\n }\n }\n}\n\nfunction formatCheckLine(name: string, result: CheckResult): string[] {\n const headerLine = ` ${formatCheckName(name)}${formatStatus(result.status)} ${result.message}`;\n const detailLines = (result.details ?? []).map(\n (detail) => ` ${\" \".repeat(CHECK_WIDTH)} ${detail}`,\n );\n return [headerLine, ...detailLines];\n}\n\nfunction formatSummary(results: CheckResult[]): string {\n const counts = countBy(results, (r) => r.status);\n const plural = (n: number, word: string) => `${n} ${word}${n === 1 ? \"\" : \"s\"}`;\n\n const parts = [\n `${counts.pass ?? 0} passed`,\n plural(counts.warn ?? 0, \"warning\"),\n plural(counts.fail ?? 0, \"error\"),\n ];\n\n return ` Summary: ${parts.join(\", \")}`;\n}\n\nconst TIPS: Array<{ kind: CheckKind; status: CheckResult[\"status\"]; tip: string }> = [\n {\n kind: \"agents\",\n status: \"warn\",\n tip: ` Tip: Run '${CLI_INVOKE_COMMAND} compile' to generate missing agent files`,\n },\n {\n kind: \"config\",\n status: \"fail\",\n tip: ` Tip: Run '${CLI_INVOKE_COMMAND} init' to create or fix configuration`,\n },\n {\n kind: \"skills\",\n status: \"fail\",\n tip: \" Tip: Check skill IDs in config match available skills\",\n },\n {\n kind: \"installed\",\n status: \"warn\",\n // No command is named on purpose: 'eject skills --force' re-copies every skill in the\n // source and always targets project scope, so it cannot repair a global-scoped skill\n // and it litters a plugin-mode project with local skill directories.\n tip: \" Tip: Re-eject the missing skills from the source to restore their files\",\n },\n];\n\nfunction formatTips(results: CheckResult[]): string[] {\n return TIPS.filter((t) => results.some((r) => r.kind === t.kind && r.status === t.status)).map(\n (t) => t.tip,\n );\n}\n\nfunction skippedResult(kind: CheckKind): CheckResult {\n return { kind, status: \"skip\", message: \"Skipped (config invalid)\" };\n}\n\n/**\n * Wrap a check so a thrown exception becomes a `fail` result instead of crashing the\n * whole doctor run. Per-check isolation ensures one broken check does not mask others.\n */\nasync function safeCheck(kind: CheckKind, fn: () => Promise<CheckResult>): Promise<CheckResult> {\n try {\n return await fn();\n } catch (error) {\n return { kind, status: \"fail\", message: \"Check threw\", details: [getErrorMessage(error)] };\n }\n}\n\nexport default class Doctor extends BaseCommand {\n static summary = \"Diagnose common configuration issues\";\n\n static description = `Run diagnostic checks on your ${DEFAULT_BRANDING.NAME} configuration to identify issues with config validity, skill resolution, agent compilation, and source connectivity.`;\n\n static examples = [\"<%= config.bin %> <%= command.id %>\"];\n\n // Override parent baseFlags to drop --source (not relevant for diagnostics)\n static baseFlags = {} as (typeof BaseCommand)[\"baseFlags\"];\n\n static flags = {};\n\n async run(): Promise<void> {\n await this.parse(Doctor);\n setVerbose(true);\n const projectDir = process.cwd();\n\n this.printHeader();\n const results = await this.runAllChecks(projectDir);\n this.printResults(results);\n\n if (results.some((r) => r.status === \"fail\")) {\n this.exit(EXIT_CODES.ERROR);\n }\n }\n\n private printHeader(): void {\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} Doctor`);\n this.log(\"\");\n this.log(\" Checking configuration health...\");\n this.log(\"\");\n }\n\n private async runAllChecks(projectDir: string): Promise<CheckResult[]> {\n const detected = await detectProject(projectDir);\n const { result: configResult, config } = checkConfigValid(detected?.config ?? null);\n this.logCheck(\"Config Valid\", configResult);\n\n // loadSource (called by checkSourceReachable) populates the matrix. Run it\n // before checkSkillsResolved so skills lookups see a populated matrix; if\n // source fails, skip skills rather than reporting false \"not found\" errors.\n const sourceResult = await safeCheck(\"source\", () => checkSourceReachable(projectDir));\n\n const filteredConfig = config ? filterExcludedEntries(config) : null;\n\n const skillsResult = !config\n ? skippedResult(\"skills\")\n : sourceResult.status === \"fail\"\n ? {\n kind: \"skills\" as const,\n status: \"skip\" as const,\n message: \"Skipped (source unreachable)\",\n }\n : await safeCheck(\"skills\", () => checkSkillsResolved(config, matrix, projectDir));\n this.logCheck(\"Skills Resolved\", skillsResult);\n\n const agentsResult = filteredConfig\n ? await safeCheck(\"agents\", () => checkAgentsCompiled(filteredConfig, projectDir))\n : skippedResult(\"agents\");\n this.logCheck(\"Agents Compiled\", agentsResult);\n\n const orphansResult = config\n ? await safeCheck(\"orphans\", () => checkNoOrphans(config, projectDir))\n : skippedResult(\"orphans\");\n this.logCheck(\"No Orphans\", orphansResult);\n\n const installedResult = filteredConfig\n ? await safeCheck(\"installed\", () => checkSkillsInstalled(filteredConfig, projectDir))\n : skippedResult(\"installed\");\n this.logCheck(\"Skills Installed\", installedResult);\n\n const pluginsResult = filteredConfig\n ? await safeCheck(\"plugins\", () => checkPluginSkillsInstalled(filteredConfig, projectDir))\n : skippedResult(\"plugins\");\n this.logCheck(\"Plugins Installed\", pluginsResult);\n\n this.logCheck(\"Source Reachable\", sourceResult);\n\n return [\n configResult,\n skillsResult,\n agentsResult,\n orphansResult,\n installedResult,\n pluginsResult,\n sourceResult,\n ];\n }\n\n private logCheck(name: string, result: CheckResult): void {\n for (const line of formatCheckLine(name, result)) {\n this.log(line);\n }\n }\n\n private printResults(results: CheckResult[]): void {\n this.log(\"\");\n this.log(formatSummary(results));\n\n const tips = formatTips(results);\n if (tips.length > 0) {\n this.log(\"\");\n for (const tip of tips) {\n this.log(tip);\n }\n }\n\n this.log(\"\");\n }\n}\n"],"mappings":"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","names":["matrix"]}
1
+ {"version":3,"sources":["../../src/cli/commands/doctor.ts","../../src/cli/lib/source-validator.ts","../../src/cli/lib/content-validator.ts"],"sourcesContent":["import os from \"os\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport {\n effectivelyExcludedSkillIds,\n loadProjectConfigFromDir,\n validateProjectConfig,\n} from \"../lib/configuration\";\nimport { loadSource, detectProject, type DetectedProject } from \"../lib/operations\";\nimport { matrix } from \"../lib/matrix/matrix-provider\";\nimport { discoverLocalSkills } from \"../lib/skills\";\nimport { getStackSkillIds } from \"../lib/stacks\";\nimport { filterExcludedEntries, listAgentMdFiles } from \"../lib/agents\";\nimport { getVerifiedPluginInstallPaths, parseMarketplacePluginRef } from \"../lib/plugins\";\nimport {\n declaresNoContent,\n isHomeDirectory,\n installBaseDir,\n resolveInstallPaths,\n} from \"../lib/installation\";\nimport { getProjectConfigPath } from \"../lib/configuration\";\nimport { isSourceRepo } from \"../lib/source-validator\";\nimport {\n listInstalledArtifacts,\n validateInstalledAgents,\n validateInstalledPlugins,\n validateInstalledSkills,\n validateProjectConfigFile,\n validateRegisteredSources,\n type ContentIssue,\n type ContentValidation,\n} from \"../lib/content-validator\";\nimport type { MergedSkillsMatrix, ProjectConfig, SkillConfig } from \"../types\";\nimport { fileExists, directoryExists } from \"../utils/fs\";\nimport {\n CLAUDE_SRC_DIR,\n CLI_INVOKE_COMMAND,\n DEFAULT_BRANDING,\n EJECT_SOURCE,\n LOCAL_SKILLS_PATH,\n STANDARD_FILES,\n UI_SYMBOLS,\n} from \"../consts\";\nimport { countBy, unique } from \"remeda\";\nimport { setVerbose } from \"../utils/logger\";\n\ntype CheckKind =\n | \"config\"\n | \"config-empty\"\n | \"skills\"\n | \"agents\"\n | \"orphans\"\n | \"orphans-unowned\"\n | \"installed\"\n | \"plugins\"\n | \"source\"\n | \"content-config\"\n | \"content-sources\"\n | \"content-plugins\"\n | \"content-skills\"\n | \"content-agents\";\n\ntype CheckResult = {\n kind: CheckKind;\n status: \"pass\" | \"fail\" | \"warn\" | \"skip\";\n message: string;\n details?: string[];\n};\n\ntype ConfigCheckOutput = {\n result: CheckResult;\n config: ProjectConfig | null;\n};\n\n/**\n * Which state the config these rows describe is in. `detectInstallation` answers \"is there an\n * installation here\", not \"is there a config here\", and hands back the same `null` for an absent\n * file and for one that loads while declaring neither skills nor agents — two states that need\n * different sentences. The state missing from this union is the one that cannot reach this layer:\n * a config that cannot be READ is the content layer's finding, and it skips the operational layer.\n */\ntype ConfigState =\n | { kind: \"absent\" }\n | { kind: \"declares-nothing\"; config: ProjectConfig }\n | { kind: \"loaded\"; config: ProjectConfig };\n\n/** Project-relative path to the config file, shown in doctor messages. */\nconst CONFIG_TS_REL = `${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TS}`;\n\n/**\n * The config in THIS directory, and what state it is in. Only this directory: the global fallback\n * is `detectInstallation`'s to make and it has already made it, so a project with no config of its\n * own is absent here whatever the home directory holds — `init` writes exactly the declares-nothing\n * shape as the blank global pair on every project setup, and it is not this project's config.\n *\n * The load cannot throw: `configDirsInPlay` is the same set the content layer just read, and any\n * failure in it skipped this layer entirely.\n */\nasync function resolveConfigState(\n detected: DetectedProject | null,\n projectDir: string,\n): Promise<ConfigState> {\n if (detected?.config) return { kind: \"loaded\", config: detected.config };\n\n const loaded = await loadProjectConfigFromDir(projectDir);\n if (!loaded) return { kind: \"absent\" };\n\n return declaresNoContent(loaded.config)\n ? { kind: \"declares-nothing\", config: loaded.config }\n : { kind: \"loaded\", config: loaded.config };\n}\n\nfunction checkConfigValid(state: ConfigState): ConfigCheckOutput {\n if (state.kind === \"absent\") {\n return {\n result: {\n kind: \"config\",\n status: \"fail\",\n message: `${CONFIG_TS_REL} not found`,\n details: [`Run '${CLI_INVOKE_COMMAND} init' to create a configuration`],\n },\n config: null,\n };\n }\n\n // Not a fault and nothing to repair — the file is valid, it just has nothing in it. The config\n // is still handed on: the rows below describe an empty install truthfully, where a `null` would\n // have them all report `Skipped (config invalid)` about a config that is valid.\n if (state.kind === \"declares-nothing\") {\n return {\n result: {\n kind: \"config-empty\",\n status: \"warn\",\n message: `${CONFIG_TS_REL} is valid but declares no skills and no agents`,\n },\n config: state.config,\n };\n }\n\n const { config } = state;\n const validation = validateProjectConfig(config);\n\n if (!validation.valid) {\n return {\n result: {\n kind: \"config\",\n status: \"fail\",\n message: `${CONFIG_TS_REL} has errors`,\n details: validation.errors,\n },\n config: null,\n };\n }\n\n if (validation.warnings.length > 0) {\n return {\n result: {\n kind: \"config\",\n status: \"warn\",\n message: `${CONFIG_TS_REL} has warnings`,\n details: validation.warnings,\n },\n config,\n };\n }\n\n return {\n result: {\n kind: \"config\",\n status: \"pass\",\n message: `${CONFIG_TS_REL} is valid`,\n },\n config,\n };\n}\n\nasync function checkSkillsResolved(\n config: ProjectConfig,\n matrix: MergedSkillsMatrix,\n projectDir: string,\n): Promise<CheckResult> {\n // config.ts declares skills both directly and through the stack. A global-only\n // install has a populated skills array and no stack at all, so keying this check\n // off the stack alone would report \"No skills configured\" for a real install.\n const excludedIds = effectivelyExcludedSkillIds(config.skills);\n const stackIds = config.stack ? getStackSkillIds(config.stack) : [];\n const uniqueSkills = unique([...stackIds, ...config.skills.map((s) => s.id)]).filter(\n (id) => !excludedIds.has(id),\n );\n\n if (uniqueSkills.length === 0) {\n return {\n kind: \"skills\",\n status: \"pass\",\n message: \"No skills configured\",\n };\n }\n\n const [localResult, globalResult] = await Promise.all([\n discoverLocalSkills(projectDir),\n !isHomeDirectory(projectDir) ? discoverLocalSkills(os.homedir()) : null,\n ]);\n const localSkillIds = new Set([\n ...(localResult?.skills.map((s) => s.id) ?? []),\n ...(globalResult?.skills.map((s) => s.id) ?? []),\n ]);\n\n const missingSkills = uniqueSkills.filter(\n (skillId) => !(skillId in matrix.skills) && !localSkillIds.has(skillId),\n );\n\n if (missingSkills.length > 0) {\n return {\n kind: \"skills\",\n status: \"fail\",\n message: `${uniqueSkills.length - missingSkills.length}/${uniqueSkills.length} skills found`,\n details: missingSkills.map((s) => `- ${s} (not found)`),\n };\n }\n\n return {\n kind: \"skills\",\n status: \"pass\",\n message: `${uniqueSkills.length}/${uniqueSkills.length} skills found`,\n };\n}\n\nasync function checkAgentsCompiled(\n config: ProjectConfig,\n projectDir: string,\n): Promise<CheckResult> {\n const agents = config.agents;\n\n if (agents.length === 0) {\n return {\n kind: \"agents\",\n status: \"pass\",\n message: \"No agents configured\",\n };\n }\n\n const projectAgentsDir = resolveInstallPaths(projectDir, \"project\").agentsDir;\n const globalAgentsDir = resolveInstallPaths(projectDir, \"global\").agentsDir;\n const agentChecks = await Promise.all(\n agents.map(async (agent) => {\n // Check scope-appropriate directory for the agent\n const agentsDir = agent.scope === \"global\" ? globalAgentsDir : projectAgentsDir;\n const agentPath = path.join(agentsDir, `${agent.name}.md`);\n return { name: agent.name, compiled: await fileExists(agentPath) };\n }),\n );\n const missingAgents = agentChecks.filter((c) => !c.compiled).map((c) => c.name);\n\n if (missingAgents.length > 0) {\n return {\n kind: \"agents\",\n status: \"warn\",\n message: `${missingAgents.length} agent${missingAgents.length === 1 ? \"\" : \"s\"} need${missingAgents.length === 1 ? \"s\" : \"\"} recompilation`,\n details: missingAgents.map((a) => `- ${a} (missing)`),\n };\n }\n\n return {\n kind: \"agents\",\n status: \"pass\",\n message: `${agents.length}/${agents.length} agents compiled`,\n };\n}\n\nasync function checkNoOrphans(config: ProjectConfig, projectDir: string): Promise<CheckResult> {\n const projectAgentsDir = resolveInstallPaths(projectDir, \"project\").agentsDir;\n const globalAgentsDir = resolveInstallPaths(projectDir, \"global\").agentsDir;\n\n // At home scope both scopes resolve to the same agents directory, so it is\n // listed once and its files are matched against both scopes' known names.\n const scopesShareAgentsDir = isHomeDirectory(projectDir);\n\n const [projectExists, globalExists] = await Promise.all([\n directoryExists(projectAgentsDir),\n !scopesShareAgentsDir ? directoryExists(globalAgentsDir) : false,\n ]);\n\n if (!projectExists && !globalExists) {\n return {\n kind: \"orphans\",\n status: \"pass\",\n message: \"No agents directory\",\n };\n }\n\n const projectMdFiles = projectExists ? await listAgentMdFiles(projectAgentsDir) : [];\n const globalMdFiles = globalExists ? await listAgentMdFiles(globalAgentsDir) : [];\n\n // Project files: only active project-scoped agents should have .md files here\n const activeProjectAgents: Set<string> = new Set(\n config.agents.filter((a) => a.scope === \"project\" && !a.excluded).map((a) => a.name),\n );\n // Global files: all global-scoped agents (including excluded) still serve other projects\n const knownGlobalAgents: Set<string> = new Set(\n config.agents.filter((a) => a.scope === \"global\").map((a) => a.name),\n );\n\n const knownProjectDirAgents = scopesShareAgentsDir\n ? new Set([...activeProjectAgents, ...knownGlobalAgents])\n : activeProjectAgents;\n\n const orphanedFiles = [\n ...orphanedAgentNames(projectMdFiles, knownProjectDirAgents),\n ...orphanedAgentNames(globalMdFiles, knownGlobalAgents),\n ];\n\n if (orphanedFiles.length > 0) {\n return {\n kind: \"orphans\",\n status: \"warn\",\n message: plural(orphanedFiles.length, \"orphaned agent file\"),\n details: orphanedFiles.map((f) => `- ${f}.md (not in config)`),\n };\n }\n\n return {\n kind: \"orphans\",\n status: \"pass\",\n message: \"No orphaned agent files\",\n };\n}\n\n/**\n * The agents whose compiled `.md` sits in a directory whose roster does not name them. The\n * roster differs per directory — a project directory knows only its own active agents, the\n * global one knows every global-scoped agent including the excluded — so it is a parameter.\n */\nfunction orphanedAgentNames(mdFiles: string[], knownAgents: ReadonlySet<string>): string[] {\n return mdFiles\n .map((fileName) => fileName.replace(/\\.md$/, \"\"))\n .filter((agentName) => !knownAgents.has(agentName));\n}\n\n/**\n * The same row when there is no configuration at all. Ownership is not unknown here, it is\n * settled: nothing declares any of it, so every installed skill directory and compiled agent\n * file is an orphan and the row names them all. It reuses the content layer's walk — those\n * counts four rows above and these names are the same files.\n *\n * A `fail`, where a stray file beside a config is a warning: that warning is earned by the next\n * `compile` pruning what it names, and nothing prunes these. `compile` and `edit` refuse without\n * a config, and `uninstall` cannot identify compiled agents no config declares.\n *\n * With nothing installed the row keeps the skip it has always printed. An empty directory with\n * no config is the state `init` exists for — there is nothing for a configuration to have owned.\n */\nasync function checkUnownedInstallation(projectDir: string): Promise<CheckResult> {\n const { skills, agents } = await listInstalledArtifacts(projectDir);\n if (skills.length === 0 && agents.length === 0) return skippedResult(\"orphans\");\n\n return {\n kind: \"orphans-unowned\",\n status: \"fail\",\n // The per-line \"(not in config)\" the other verdict repeats is said once here instead:\n // with no configuration it is true of every line, and there are as many lines as files.\n message: `${countedArtifacts(skills, agents)} installed here, and no configuration declares them`,\n details: [...skills, ...agents].map((artifact) => `- ${artifact}`),\n };\n}\n\n/** \"7 skills and 2 agents\", dropping a half with nothing in it rather than saying \"0 agents\". */\nfunction countedArtifacts(skills: string[], agents: string[]): string {\n return [\n ...(skills.length > 0 ? [plural(skills.length, \"skill\")] : []),\n ...(agents.length > 0 ? [plural(agents.length, \"agent\")] : []),\n ].join(\" and \");\n}\n\nasync function checkSkillsInstalled(\n config: ProjectConfig,\n projectDir: string,\n): Promise<CheckResult> {\n const skills: SkillConfig[] = config.skills;\n const ejectSkills = skills.filter((s) => s.source === EJECT_SOURCE);\n\n if (ejectSkills.length === 0) {\n return {\n kind: \"installed\",\n status: \"pass\",\n message: \"No eject-mode skills configured\",\n };\n }\n\n const skillChecks = await Promise.all(\n ejectSkills.map(async (skill) => {\n const baseDir = installBaseDir(projectDir, skill.scope);\n const skillMdPath = path.join(baseDir, LOCAL_SKILLS_PATH, skill.id, STANDARD_FILES.SKILL_MD);\n return { id: skill.id, installed: await fileExists(skillMdPath) };\n }),\n );\n const missingSkills = skillChecks.filter((c) => !c.installed).map((c) => c.id);\n\n if (missingSkills.length > 0) {\n return {\n kind: \"installed\",\n status: \"warn\",\n message: `${plural(missingSkills.length, \"skill\")} missing from disk`,\n details: missingSkills.map((s) => `- ${s} (not found in ${LOCAL_SKILLS_PATH}/)`),\n };\n }\n\n return {\n kind: \"installed\",\n status: \"pass\",\n message: `${ejectSkills.length}/${ejectSkills.length} eject-mode skills installed`,\n };\n}\n\n/**\n * Plugin-mode skills have no files under `.claude/skills/` — they live in the\n * Claude plugin registry. Verifying them means asking the registry for the scope\n * each skill was installed at, not looking on disk.\n */\nasync function checkPluginSkillsInstalled(\n config: ProjectConfig,\n projectDir: string,\n): Promise<CheckResult> {\n const pluginSkills: SkillConfig[] = config.skills.filter((s) => s.source !== EJECT_SOURCE);\n\n if (pluginSkills.length === 0) {\n return {\n kind: \"plugins\",\n status: \"pass\",\n message: \"No plugin-mode skills configured\",\n };\n }\n\n const baseDirs = unique(pluginSkills.map((s) => installBaseDir(projectDir, s.scope)));\n const missingPerBaseDir = await Promise.all(\n baseDirs.map(async (baseDir) => {\n const installedIds = new Set(\n (await getVerifiedPluginInstallPaths(baseDir)).map((plugin) =>\n parseMarketplacePluginRef(plugin.pluginKey),\n ),\n );\n return pluginSkills\n .filter((skill) => installBaseDir(projectDir, skill.scope) === baseDir)\n .filter((skill) => !installedIds.has(skill.id))\n .map((skill) => skill.id);\n }),\n );\n const missingSkills = missingPerBaseDir.flat();\n\n if (missingSkills.length > 0) {\n return {\n kind: \"plugins\",\n status: \"warn\",\n message: `${plural(missingSkills.length, \"skill\")} not installed as plugins`,\n details: missingSkills.map((s) => `- ${s} (no enabled plugin found)`),\n };\n }\n\n return {\n kind: \"plugins\",\n status: \"pass\",\n message: `${pluginSkills.length}/${pluginSkills.length} plugin-mode skills installed`,\n };\n}\n\nasync function checkSourceReachable(projectDir: string): Promise<CheckResult> {\n try {\n const { sourceResult: result } = await loadSource({\n projectDir,\n });\n\n const skillCount = Object.keys(matrix.skills).length;\n const sourceLabel = result.isLocal ? \"local\" : \"remote\";\n\n return {\n kind: \"source\",\n status: \"pass\",\n message: `Connected to ${sourceLabel}: ${result.sourcePath}`,\n details: [`${skillCount} skills available`],\n };\n } catch (error) {\n const message = getErrorMessage(error);\n return {\n kind: \"source\",\n status: \"fail\",\n message: \"Failed to load source\",\n details: [message],\n };\n }\n}\n\ntype ContentCheck = {\n kind: CheckKind;\n name: string;\n noun: string;\n run: (projectDir: string) => Promise<ContentValidation>;\n};\n\n/** A check plus whether it reads config.ts to know WHAT to validate — see {@link CONFIG_CHECK}. */\ntype GatedContentCheck = ContentCheck & { readsConfig: boolean };\n\n/**\n * The config file every other check is read against, so it is validated before any of them and\n * on its own: a file that exists and cannot be parsed is a finding about that file, and every\n * row underneath would be a cascade of it. It carries no gate of its own — it IS the gate.\n */\nconst CONFIG_CHECK: ContentCheck = {\n kind: \"content-config\",\n name: \"Config\",\n noun: \"config\",\n run: validateProjectConfigFile,\n};\n\n/**\n * The content layer: schema and file-level validation of what is on disk. It runs\n * before the operational layer because an unresolved skill or an uncompiled agent\n * is usually the downstream cascade of a broken metadata.yaml, not its own finding.\n */\nconst CONTENT_CHECKS: GatedContentCheck[] = [\n {\n kind: \"content-sources\",\n name: \"Sources\",\n noun: \"source\",\n // The registered sources are the ones config.ts names.\n readsConfig: true,\n run: validateRegisteredSources,\n },\n {\n kind: \"content-plugins\",\n name: \"Plugins\",\n noun: \"plugin\",\n readsConfig: false,\n run: validateInstalledPlugins,\n },\n {\n kind: \"content-skills\",\n name: \"Skills\",\n noun: \"skill\",\n readsConfig: false,\n run: validateInstalledSkills,\n },\n {\n kind: \"content-agents\",\n name: \"Agents\",\n noun: \"agent\",\n readsConfig: false,\n run: validateInstalledAgents,\n },\n];\n\nfunction contentStatus(errors: number, warnings: number): CheckResult[\"status\"] {\n if (errors > 0) return \"fail\";\n if (warnings > 0) return \"warn\";\n return \"pass\";\n}\n\nfunction contentMessage(noun: string, count: number, errors: number, warnings: number): string {\n // A pass that walked nothing can still report an issue — an unreadable plugin\n // registry is a finding about the directory, not about a plugin inside it.\n if (errors === 0 && warnings === 0) {\n return count === 0 ? `No ${noun}s to validate` : `${plural(count, noun)} validated`;\n }\n return `${plural(count, noun)}: ${plural(errors, \"error\")}, ${plural(warnings, \"warning\")}`;\n}\n\nfunction formatContentIssue(issue: ContentIssue): string {\n const marker = issue.severity === \"error\" ? \"ERROR\" : \"WARN\";\n return `- [${marker}] ${issue.file}: ${issue.message}`;\n}\n\nfunction toContentResult(check: ContentCheck, validation: ContentValidation): CheckResult {\n const errors = validation.issues.filter((issue) => issue.severity === \"error\").length;\n const warnings = validation.issues.length - errors;\n\n return {\n kind: check.kind,\n status: contentStatus(errors, warnings),\n message: contentMessage(check.noun, validation.count, errors, warnings),\n details: [\n ...validation.notes.map((note) => `- ${note}`),\n ...validation.issues.map(formatContentIssue),\n ],\n };\n}\n\nconst CHECK_WIDTH = 20;\n\n/** Section headings and the rows underneath them are indented one step apart. */\nconst SECTION_INDENT = \" \";\nconst ROW_INDENT = \" \";\n\nconst SECTION_CONTENT = \"Content checks\";\nconst SECTION_OPERATIONAL = \"Operational checks\";\nconst SKIP_AFTER_CONTENT_ERRORS = \"Skipped — fix the content errors above first\";\nconst SKIP_NO_INSTALLATION = \"Skipped — no installation here (skills source repository)\";\nconst SKIP_CONFIG_UNREADABLE = \"Skipped — the configuration that names them cannot be read\";\n\nfunction plural(count: number, word: string): string {\n return `${count} ${word}${count === 1 ? \"\" : \"s\"}`;\n}\n\nfunction formatCheckName(name: string): string {\n return name.padEnd(CHECK_WIDTH);\n}\n\nfunction formatStatus(status: CheckResult[\"status\"]): string {\n switch (status) {\n case \"pass\":\n return UI_SYMBOLS.CHECK;\n case \"fail\":\n return UI_SYMBOLS.CROSS;\n case \"warn\":\n return \"!\";\n case \"skip\":\n return \"-\";\n default: {\n const _exhaustive: never = status;\n return _exhaustive;\n }\n }\n}\n\nfunction formatCheckLine(name: string, result: CheckResult): string[] {\n const headerLine = `${ROW_INDENT}${formatCheckName(name)}${formatStatus(result.status)} ${result.message}`;\n const detailLines = (result.details ?? []).map(\n (detail) => `${ROW_INDENT}${\" \".repeat(CHECK_WIDTH)} ${detail}`,\n );\n return [headerLine, ...detailLines];\n}\n\nfunction formatSummary(results: CheckResult[]): string {\n const counts = countBy(results, (r) => r.status);\n\n const parts = [\n `${counts.pass ?? 0} passed`,\n plural(counts.warn ?? 0, \"warning\"),\n plural(counts.fail ?? 0, \"error\"),\n ];\n\n return `${SECTION_INDENT}Summary: ${parts.join(\", \")}`;\n}\n\nconst TIPS: Array<{ kind: CheckKind; status: CheckResult[\"status\"]; tip: string }> = [\n {\n kind: \"agents\",\n status: \"warn\",\n tip: ` Tip: Run '${CLI_INVOKE_COMMAND} compile' to generate missing agent files`,\n },\n {\n kind: \"config\",\n status: \"fail\",\n tip: ` Tip: Run '${CLI_INVOKE_COMMAND} init' to create or fix configuration`,\n },\n {\n // The remedy for a valid config with nothing in it. Not the tip above: there is nothing to\n // create and nothing to fix. `init` on this config opens the wizard rather than the dashboard\n // — that is what the detection returning null is FOR — so it is the way to fill it in.\n kind: \"config-empty\",\n status: \"warn\",\n tip: ` Tip: Nothing is configured yet — run '${CLI_INVOKE_COMMAND} init' to choose skills and sub-agents`,\n },\n {\n // The one remedy that applies to a config that cannot be read. `init` does not clear such a\n // file — it refuses it — so the tip above would send the reader in a circle; this is the same\n // way out `edit` and `init` themselves name, worded the same way.\n kind: \"content-config\",\n status: \"fail\",\n tip: ` Tip: There is no automatic repair — recreate the configuration: '${CLI_INVOKE_COMMAND} uninstall' still works on a config it cannot read, then '${CLI_INVOKE_COMMAND} init'`,\n },\n {\n // Printed beside the config tip above, which says how to get a configuration back and\n // nothing about the files that outlived the old one. Both halves are named with what they\n // actually do: `uninstall` matches skill directories by their own `forked-from` metadata,\n // so it clears them without a config — and identifies compiled agents only through one.\n kind: \"orphans-unowned\",\n status: \"fail\",\n tip: ` Tip: Nothing declares the files above — '${CLI_INVOKE_COMMAND} init' writes a configuration that can own them again, or '${CLI_INVOKE_COMMAND} uninstall' removes the installed skills (the compiled agents outlive it: identifying them needs the configuration that is gone)`,\n },\n {\n kind: \"skills\",\n status: \"fail\",\n tip: \" Tip: Check skill IDs in config match available skills\",\n },\n {\n kind: \"installed\",\n status: \"warn\",\n // No command is named on purpose: 'eject skills --force' re-copies every skill in the\n // source and always targets project scope, so it cannot repair a global-scoped skill\n // and it litters a plugin-mode project with local skill directories.\n tip: \" Tip: Re-eject the missing skills from the source to restore their files\",\n },\n];\n\nfunction formatTips(results: CheckResult[]): string[] {\n return TIPS.filter((t) => results.some((r) => r.kind === t.kind && r.status === t.status)).map(\n (t) => t.tip,\n );\n}\n\nfunction skippedResult(kind: CheckKind): CheckResult {\n return { kind, status: \"skip\", message: \"Skipped (config invalid)\" };\n}\n\n/**\n * The skills row when the source never loaded. Distinct from {@link skippedResult}: the config\n * is fine, and what is missing is the matrix to resolve its skills against.\n */\nfunction sourceUnreachableSkillsResult(): CheckResult {\n return { kind: \"skills\", status: \"skip\", message: \"Skipped (source unreachable)\" };\n}\n\nfunction skippedContentResult(kind: CheckKind): CheckResult {\n return { kind, status: \"skip\", message: SKIP_CONFIG_UNREADABLE };\n}\n\nfunction runContentCheck(check: ContentCheck, projectDir: string): Promise<CheckResult> {\n return safeCheck(check.kind, async () => toContentResult(check, await check.run(projectDir)));\n}\n\n/**\n * Wrap a check so a thrown exception becomes a `fail` result instead of crashing the\n * whole doctor run. Per-check isolation ensures one broken check does not mask others.\n */\nasync function safeCheck(kind: CheckKind, fn: () => Promise<CheckResult>): Promise<CheckResult> {\n try {\n return await fn();\n } catch (error) {\n return { kind, status: \"fail\", message: \"Check threw\", details: [getErrorMessage(error)] };\n }\n}\n\nexport default class Doctor extends BaseCommand {\n static summary = \"Diagnose common configuration issues\";\n\n static description = `Run diagnostic checks on your ${DEFAULT_BRANDING.NAME} configuration to identify issues with config validity, skill resolution, agent compilation, and source connectivity.`;\n\n static examples = [\"<%= config.bin %> <%= command.id %>\"];\n\n static flags = {};\n\n async run(): Promise<void> {\n await this.parse(Doctor);\n setVerbose(true);\n const projectDir = process.cwd();\n\n this.printHeader();\n const contentResults = await this.runContentChecks(projectDir);\n const operationalResults = await this.runOperationalChecks(projectDir, contentResults);\n const results = [...contentResults, ...operationalResults];\n\n this.printResults(results);\n\n if (results.some((r) => r.status === \"fail\")) {\n this.exit(EXIT_CODES.ERROR);\n }\n }\n\n private printHeader(): void {\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} Doctor`);\n this.log(\"\");\n this.log(`${SECTION_INDENT}Checking configuration health...`);\n this.log(\"\");\n }\n\n /**\n * The config is checked first and alone. A check that reads it to know what to validate would\n * otherwise ask a file already reported as unreadable — and asking is what emitted the loader's\n * own failure line once per read, spliced between these rows. Everything that walks installed\n * content on disk still runs: it says something true whatever the config is in.\n */\n private async runContentChecks(projectDir: string): Promise<CheckResult[]> {\n this.log(`${SECTION_INDENT}${SECTION_CONTENT}`);\n\n const configResult = await runContentCheck(CONFIG_CHECK, projectDir);\n const configUnreadable = configResult.status === \"fail\";\n\n const rows = await Promise.all(\n CONTENT_CHECKS.map(async (check) => ({\n name: check.name,\n result:\n check.readsConfig && configUnreadable\n ? skippedContentResult(check.kind)\n : await runContentCheck(check, projectDir),\n })),\n );\n\n const allRows = [{ name: CONFIG_CHECK.name, result: configResult }, ...rows];\n\n for (const row of allRows) {\n this.logCheck(row.name, row.result);\n }\n\n return allRows.map((row) => row.result);\n }\n\n /**\n * The operational layer runs only when it can say something the reader can act on:\n * not after content errors (its findings would be their cascades), and not in a\n * source repository with nothing installed (a marketplace author has no install\n * for it to describe).\n */\n private async runOperationalChecks(\n projectDir: string,\n contentResults: CheckResult[],\n ): Promise<CheckResult[]> {\n this.log(\"\");\n this.log(`${SECTION_INDENT}${SECTION_OPERATIONAL}`);\n\n if (contentResults.some((r) => r.status === \"fail\")) {\n this.log(`${ROW_INDENT}${SKIP_AFTER_CONTENT_ERRORS}`);\n return [];\n }\n\n const detected = await detectProject(projectDir);\n if (!detected && (await this.isUninstalledSourceRepo(projectDir))) {\n this.log(`${ROW_INDENT}${SKIP_NO_INSTALLATION}`);\n return [];\n }\n\n return this.runAllChecks(projectDir, await resolveConfigState(detected, projectDir));\n }\n\n /**\n * A config file that exists but failed to load also detects as \"no project\", and\n * that is a finding rather than an absence — so the skip requires no config file\n * at all, not merely no usable one.\n */\n private async isUninstalledSourceRepo(projectDir: string): Promise<boolean> {\n if (await fileExists(getProjectConfigPath(projectDir))) return false;\n return isSourceRepo(projectDir);\n }\n\n private async runAllChecks(projectDir: string, configState: ConfigState): Promise<CheckResult[]> {\n const { result: configResult, config } = checkConfigValid(configState);\n this.logCheck(\"Config Valid\", configResult);\n\n // loadSource (called by checkSourceReachable) populates the matrix. Run it\n // before checkSkillsResolved so skills lookups see a populated matrix; if\n // source fails, skip skills rather than reporting false \"not found\" errors.\n const sourceResult = await safeCheck(\"source\", () => checkSourceReachable(projectDir));\n\n const filteredConfig = config ? filterExcludedEntries(config) : null;\n\n const skillsResult = await this.resolveSkillsCheck(config, sourceResult, projectDir);\n this.logCheck(\"Skills Resolved\", skillsResult);\n\n const agentsResult = filteredConfig\n ? await safeCheck(\"agents\", () => checkAgentsCompiled(filteredConfig, projectDir))\n : skippedResult(\"agents\");\n this.logCheck(\"Agents Compiled\", agentsResult);\n\n const orphansResult = await this.resolveOrphansCheck(config, configState, projectDir);\n this.logCheck(\"No Orphans\", orphansResult);\n\n const installedResult = filteredConfig\n ? await safeCheck(\"installed\", () => checkSkillsInstalled(filteredConfig, projectDir))\n : skippedResult(\"installed\");\n this.logCheck(\"Skills Installed\", installedResult);\n\n const pluginsResult = filteredConfig\n ? await safeCheck(\"plugins\", () => checkPluginSkillsInstalled(filteredConfig, projectDir))\n : skippedResult(\"plugins\");\n this.logCheck(\"Plugins Installed\", pluginsResult);\n\n this.logCheck(\"Source Reachable\", sourceResult);\n\n return [\n configResult,\n skillsResult,\n agentsResult,\n orphansResult,\n installedResult,\n pluginsResult,\n sourceResult,\n ];\n }\n\n /**\n * The orphan row, and which question it can answer. With a config it names the compiled\n * agents that config does not; with no config at all every installed file is unowned and it\n * names all of them. It skips for the one state left — a config that loads and fails\n * validation — because there the file that says who owns what has already been rejected, and\n * an installation must not be called stranded on the strength of one nobody can trust.\n */\n private async resolveOrphansCheck(\n config: ProjectConfig | null,\n configState: ConfigState,\n projectDir: string,\n ): Promise<CheckResult> {\n if (config) return safeCheck(\"orphans\", () => checkNoOrphans(config, projectDir));\n if (configState.kind === \"absent\") {\n return safeCheck(\"orphans\", () => checkUnownedInstallation(projectDir));\n }\n return skippedResult(\"orphans\");\n }\n\n /**\n * The skills row, and the two states in which it cannot be computed: no config to read the\n * skills out of, and a source that never loaded — so there is no populated matrix to resolve\n * them against, and every configured skill would be reported \"not found\".\n */\n private async resolveSkillsCheck(\n config: ProjectConfig | null,\n sourceResult: CheckResult,\n projectDir: string,\n ): Promise<CheckResult> {\n if (!config) return skippedResult(\"skills\");\n if (sourceResult.status === \"fail\") return sourceUnreachableSkillsResult();\n\n return safeCheck(\"skills\", () => checkSkillsResolved(config, matrix, projectDir));\n }\n\n private logCheck(name: string, result: CheckResult): void {\n for (const line of formatCheckLine(name, result)) {\n this.log(line);\n }\n }\n\n private printResults(results: CheckResult[]): void {\n this.log(\"\");\n this.log(formatSummary(results));\n\n const tips = formatTips(results);\n if (tips.length > 0) {\n this.log(\"\");\n for (const tip of tips) {\n this.log(tip);\n }\n }\n\n this.log(\"\");\n }\n}\n","import path from \"path\";\nimport { isRecord } from \"../utils/type-guards.js\";\nimport { parse as parseYaml } from \"yaml\";\nimport { z } from \"zod\";\nimport { glob, readFile, fileExists, directoryExists } from \"../utils/fs\";\nimport {\n DIRS,\n SKILL_CATEGORIES_PATH,\n SKILL_RULES_PATH,\n SKILLS_DIR_PATH,\n STACKS_FILE_PATH,\n STANDARD_FILES,\n} from \"../consts\";\nimport {\n agentYamlGenerationSchema,\n metadataValidationSchema,\n splitMetadataValidationIssues,\n validateSkillMetadata,\n skillCategoriesFileSchema,\n skillRulesFileSchema,\n stackConfigValidationSchema,\n stacksConfigSchema,\n} from \"./schemas\";\nimport { parseFrontmatter } from \"./loading/loader\";\nimport { loadConfig, loadProjectSourceConfig } from \"./configuration\";\nimport { checkMatrixHealth } from \"./matrix\";\nimport { loadSkillsMatrixFromSource } from \"./loading/source-loader\";\nimport { matrix } from \"./matrix/matrix-provider\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport { formatZodErrors } from \"./schema-validator\";\n\nexport type SourceValidationIssue = {\n severity: \"error\" | \"warning\";\n file: string;\n message: string;\n};\n\nexport type SourceValidationResult = {\n issues: SourceValidationIssue[];\n skillCount: number;\n errorCount: number;\n warningCount: number;\n};\n\n/**\n * True when `dir` is itself a skills source repository — it carries the skills tree\n * `validateSource` walks, at `src/skills/` or wherever its own source config points.\n * A marketplace author's checkout answers yes; a consumer project answers no.\n */\nexport async function isSourceRepo(dir: string): Promise<boolean> {\n const sourceConfig = await loadProjectSourceConfig(dir);\n return directoryExists(path.join(dir, sourceConfig?.skillsDir ?? SKILLS_DIR_PATH));\n}\n\n/** Checks if a key uses snake_case (has underscore between lowercase letters) */\nexport function isSnakeCase(key: string): boolean {\n return /[a-z]_[a-z]/.test(key);\n}\n\n/**\n * Checks top-level keys for snake_case usage (camelCase is the convention).\n * Non-object input yields no issues.\n */\nexport function checkSnakeCaseKeys(rawMetadata: unknown, relPath: string): SourceValidationIssue[] {\n if (!isRecord(rawMetadata)) return [];\n\n return Object.keys(rawMetadata)\n .filter(isSnakeCase)\n .map((key) => ({\n severity: \"error\" as const,\n file: relPath,\n message: `Key '${key}' uses snake_case — use camelCase instead`,\n }));\n}\n\n/**\n * Warns when a skill directory's name does not equal the skill's machine id\n * (SKILL.md frontmatter `name`) — the key the loader registers the skill under.\n * Warning, not error: the loader still loads the skill by its id, but the\n * directory no longer signals which skill it contains.\n */\nexport function checkDirNameMatchesSkillId(\n skillId: string,\n relPath: string,\n dirName: string,\n): SourceValidationIssue[] {\n if (skillId === dirName) return [];\n return [\n {\n severity: \"warning\",\n file: relPath,\n message: `Directory name '${dirName}' does not match skill id '${skillId}'`,\n },\n ];\n}\n\n/**\n * Reads a skill directory's SKILL.md frontmatter and checks the directory name\n * against the skill's machine id. When the id cannot be read (unreadable file or\n * missing/invalid frontmatter), reports that the check could not run.\n */\nasync function checkSkillDirName(\n skillsDir: string,\n skillsDirRelPath: string,\n skillDir: string,\n): Promise<SourceValidationIssue[]> {\n const dirName = path.basename(skillDir);\n const skillMdRelPath = path.join(skillsDirRelPath, skillDir, STANDARD_FILES.SKILL_MD);\n\n try {\n const content = await readFile(path.join(skillsDir, skillDir, STANDARD_FILES.SKILL_MD));\n const frontmatter = parseFrontmatter(content, skillMdRelPath);\n\n if (frontmatter === null) {\n return [\n {\n severity: \"warning\",\n file: skillMdRelPath,\n message: `Cannot verify directory name '${dirName}': missing or invalid ${STANDARD_FILES.SKILL_MD} frontmatter`,\n },\n ];\n }\n\n return checkDirNameMatchesSkillId(frontmatter.name, skillMdRelPath, dirName);\n } catch (error) {\n return [\n {\n severity: \"warning\",\n file: skillMdRelPath,\n message: `Cannot verify directory name '${dirName}': ${getErrorMessage(error)}`,\n },\n ];\n }\n}\n\n/**\n * Finds missing SKILL.md / metadata.yaml pairs (pure function, no I/O).\n *\n * Returns issues for:\n * - Directories with SKILL.md but no metadata.yaml\n * - Directories with metadata.yaml but no SKILL.md\n */\nexport function validateSkillFilePairs(\n skillMdDirs: Set<string>,\n metadataDirs: Set<string>,\n skillsDir: string,\n): SourceValidationIssue[] {\n const missingMetadata = [...skillMdDirs]\n .filter((dir) => !metadataDirs.has(dir))\n .map((dir) => ({\n severity: \"error\" as const,\n file: path.join(skillsDir, dir),\n message: `Missing ${STANDARD_FILES.METADATA_YAML} — skill directory has ${STANDARD_FILES.SKILL_MD} but no metadata`,\n }));\n\n const missingSkillMd = [...metadataDirs]\n .filter((dir) => !skillMdDirs.has(dir))\n .map((dir) => ({\n severity: \"error\" as const,\n file: path.join(skillsDir, dir),\n message: `Missing ${STANDARD_FILES.SKILL_MD} — skill directory has ${STANDARD_FILES.METADATA_YAML} but no SKILL.md`,\n }));\n\n return [...missingMetadata, ...missingSkillMd];\n}\n\n/**\n * Validates a skills source repository for metadata correctness.\n *\n * Checks:\n * 1. Every metadata.yaml against the strict validation schema\n * (over-length cliDescription is downgraded to a warning)\n * 2. Directory name equals the skill's machine id (SKILL.md frontmatter name)\n * 3. Cross-references resolve to existing skill IDs (via checkMatrixHealth)\n * 4. camelCase key convention (no snake_case)\n * 5. Every skill directory has both SKILL.md and metadata.yaml\n */\nexport async function validateSource(sourcePath: string): Promise<SourceValidationResult> {\n const issues: SourceValidationIssue[] = [];\n\n const resolvedPath = path.isAbsolute(sourcePath) ? sourcePath : path.resolve(sourcePath);\n\n if (!(await directoryExists(resolvedPath))) {\n issues.push({\n severity: \"error\",\n file: resolvedPath,\n message: \"Source directory does not exist\",\n });\n return buildResult(issues, 0);\n }\n\n const sourceProjectConfig = await loadProjectSourceConfig(resolvedPath);\n const skillsDirRelPath = sourceProjectConfig?.skillsDir ?? SKILLS_DIR_PATH;\n const skillsDir = path.join(resolvedPath, skillsDirRelPath);\n\n if (!(await directoryExists(skillsDir))) {\n issues.push({\n severity: \"error\",\n file: skillsDir,\n message: \"Skills directory does not exist\",\n });\n return buildResult(issues, 0);\n }\n\n // Phase 1: Check every skill directory has both SKILL.md and metadata.yaml\n const skillMdFiles = await glob(`**/${STANDARD_FILES.SKILL_MD}`, skillsDir);\n const metadataFiles = await glob(`**/${STANDARD_FILES.METADATA_YAML}`, skillsDir);\n\n const skillMdDirs = new Set(skillMdFiles.map((f) => path.dirname(f)));\n const metadataDirs = new Set(metadataFiles.map((f) => path.dirname(f)));\n\n issues.push(...validateSkillFilePairs(skillMdDirs, metadataDirs, skillsDir));\n\n // Phase 2: Validate each metadata.yaml against strict schema and conventions.\n // Pair violations were already reported by phase 1 — validate only complete pairs.\n const validMetadataFiles = metadataFiles.filter((f) => skillMdDirs.has(path.dirname(f)));\n for (const metadataFile of validMetadataFiles) {\n issues.push(...(await validateOneSkill(skillsDir, skillsDirRelPath, metadataFile)));\n }\n\n // Phase 3: Cross-reference validation via matrix health check\n issues.push(...(await checkCrossReferences(resolvedPath)));\n\n // Phases 4–6: optional source-repo targets — run in parallel\n // Phase 4: stack skill metadata + stack configs\n // Phase 5: agent metadata\n // Phase 6: config/*.ts runtime exports\n const extraIssues = await Promise.all([\n validateStacks(resolvedPath),\n validateAgents(resolvedPath),\n validateConfigFiles(resolvedPath),\n ]);\n issues.push(...extraIssues.flat());\n\n return buildResult(issues, validMetadataFiles.length);\n}\n\n/**\n * One complete skill pair, judged four ways: its metadata.yaml parses, its keys are camelCase,\n * it satisfies the strict published-skill schema, and its directory is named after the id its\n * SKILL.md declares. A file nothing can be parsed out of reports that and stops — every check\n * after it reads the parsed value, so each would only restate the same fault.\n */\nasync function validateOneSkill(\n skillsDir: string,\n skillsDirRelPath: string,\n metadataFile: string,\n): Promise<SourceValidationIssue[]> {\n const relPath = path.join(skillsDirRelPath, metadataFile);\n\n let rawMetadata: unknown;\n try {\n rawMetadata = parseYaml(await readFile(path.join(skillsDir, metadataFile)));\n } catch (error) {\n return [\n {\n severity: \"error\",\n file: relPath,\n message: `Failed to parse YAML: ${getErrorMessage(error)}`,\n },\n ];\n }\n\n return [\n ...checkSnakeCaseKeys(rawMetadata, relPath),\n ...checkMetadataSchema(rawMetadata, relPath),\n // Independent of metadata validity — the id lives in SKILL.md frontmatter\n ...(await checkSkillDirName(skillsDir, skillsDirRelPath, path.dirname(metadataFile))),\n ];\n}\n\n/**\n * The strict published-skill schema's verdict, as its hard errors plus the one advisory\n * (over-length cliDescription) `splitMetadataValidationIssues` separates out.\n */\nfunction checkMetadataSchema(rawMetadata: unknown, relPath: string): SourceValidationIssue[] {\n const result = validateSkillMetadata(rawMetadata);\n if (result.success) return [];\n\n const { errors, warnings } = splitMetadataValidationIssues(result.error, rawMetadata);\n return [\n ...errors.map((message) => ({ severity: \"error\" as const, file: relPath, message })),\n ...warnings.map((message) => ({ severity: \"warning\" as const, file: relPath, message })),\n ];\n}\n\n/**\n * Whether every relationship the source declares resolves to a skill it actually holds.\n * A source whose categories/rules could not be loaded is a warning rather than a failure: the\n * per-skill checks above already reported what they found, and this pass simply could not run.\n */\nasync function checkCrossReferences(resolvedPath: string): Promise<SourceValidationIssue[]> {\n try {\n await loadSkillsMatrixFromSource({ sourceFlag: resolvedPath, skipExtraSources: true });\n return checkMatrixHealth(matrix).map((healthIssue) => ({\n severity: healthIssue.severity,\n file: SKILL_CATEGORIES_PATH,\n message: healthIssue.details,\n }));\n } catch (error) {\n return [\n {\n severity: \"warning\",\n file: SKILL_CATEGORIES_PATH,\n message: `Cross-reference validation skipped: failed to load categories/rules: ${getErrorMessage(error)}`,\n },\n ];\n }\n}\n\n/**\n * Validates stack-embedded skill metadata.yaml files and stack config.yaml files.\n * Skips silently when src/stacks/ does not exist.\n */\nasync function validateStacks(resolvedPath: string): Promise<SourceValidationIssue[]> {\n const stacksDir = path.join(resolvedPath, DIRS.stacks);\n if (!(await directoryExists(stacksDir))) return [];\n\n const [skillMetaIssues, configIssues] = await Promise.all([\n validateYamlFiles({\n baseDir: stacksDir,\n relBaseDir: DIRS.stacks,\n pattern: `**/skills/**/${STANDARD_FILES.METADATA_YAML}`,\n schema: metadataValidationSchema,\n }),\n validateYamlFiles({\n baseDir: stacksDir,\n relBaseDir: DIRS.stacks,\n pattern: `*/${STANDARD_FILES.CONFIG_YAML}`,\n schema: stackConfigValidationSchema,\n }),\n ]);\n return [...skillMetaIssues, ...configIssues];\n}\n\n/**\n * Validates agent metadata.yaml files against the compiled agent output schema.\n * Skips silently when src/agents/ does not exist.\n */\nasync function validateAgents(resolvedPath: string): Promise<SourceValidationIssue[]> {\n const agentsDir = path.join(resolvedPath, DIRS.agents);\n if (!(await directoryExists(agentsDir))) return [];\n\n return validateYamlFiles({\n baseDir: agentsDir,\n relBaseDir: DIRS.agents,\n pattern: `**/${STANDARD_FILES.AGENT_METADATA_YAML}`,\n schema: agentYamlGenerationSchema,\n });\n}\n\n/**\n * Validates TypeScript config files (skill-categories.ts, skill-rules.ts, stacks.ts)\n * by runtime-loading them via loadConfig and validating the default export.\n * Skips silently when a file does not exist.\n */\nasync function validateConfigFiles(resolvedPath: string): Promise<SourceValidationIssue[]> {\n const results = await Promise.all([\n validateTsConfig(resolvedPath, SKILL_CATEGORIES_PATH, skillCategoriesFileSchema),\n validateTsConfig(resolvedPath, SKILL_RULES_PATH, skillRulesFileSchema),\n validateTsConfig(resolvedPath, STACKS_FILE_PATH, stacksConfigSchema),\n ]);\n return results.flat();\n}\n\n/**\n * Globs YAML files under baseDir and validates each against the given schema.\n * Reports parse errors, schema errors (as field-path messages), and uses relBaseDir\n * for display paths so issue locations match the project-relative form used elsewhere.\n */\nasync function validateYamlFiles(opts: {\n baseDir: string;\n relBaseDir: string;\n pattern: string;\n schema: z.ZodType<unknown>;\n}): Promise<SourceValidationIssue[]> {\n const issues: SourceValidationIssue[] = [];\n const files = await glob(opts.pattern, opts.baseDir);\n\n for (const relFile of files) {\n const absPath = path.join(opts.baseDir, relFile);\n const displayPath = path.join(opts.relBaseDir, relFile);\n\n let parsed: unknown;\n try {\n parsed = parseYaml(await readFile(absPath));\n } catch {\n issues.push({ severity: \"error\", file: displayPath, message: \"Failed to parse YAML\" });\n continue;\n }\n\n const result = opts.schema.safeParse(parsed);\n if (result.success) continue;\n\n issues.push(\n ...formatZodErrors(result.error).map((message) => ({\n severity: \"error\" as const,\n file: displayPath,\n message,\n })),\n );\n }\n return issues;\n}\n\n/**\n * Runtime-loads a TypeScript config file via loadConfig and reports validation failures.\n * Absent files are not errors — only report when the file exists but fails to load or validate.\n *\n * loadConfig already unwraps the default export (via jiti's `{ default: true }` + interopDefault),\n * so a returned `null` means the module has no default export (named-only modules surface here).\n */\nasync function validateTsConfig(\n resolvedPath: string,\n relConfigPath: string,\n schema: z.ZodType<unknown>,\n): Promise<SourceValidationIssue[]> {\n const absPath = path.join(resolvedPath, relConfigPath);\n if (!(await fileExists(absPath))) return [];\n\n try {\n const loaded = await loadConfig(absPath, schema);\n if (loaded === null) {\n return [{ severity: \"error\", file: relConfigPath, message: \"Config has no default export\" }];\n }\n return [];\n } catch (error) {\n return [\n { severity: \"error\", file: relConfigPath, message: formatLoadError(relConfigPath, error) },\n ];\n }\n}\n\n/**\n * Normalizes a loadConfig error so the message references the relative config path,\n * not the absolute path embedded by loadConfig's own template string.\n */\nfunction formatLoadError(relConfigPath: string, error: unknown): string {\n const raw = getErrorMessage(error);\n const stripped = raw.replace(/Failed to load config from '[^']+':\\s*/, \"\");\n return `Failed to load ${relConfigPath}: ${stripped}`;\n}\n\nfunction buildResult(issues: SourceValidationIssue[], skillCount: number): SourceValidationResult {\n const errorCount = issues.filter((i) => i.severity === \"error\").length;\n const warningCount = issues.filter((i) => i.severity === \"warning\").length;\n return { issues, skillCount, errorCount, warningCount };\n}\n","import os from \"os\";\nimport path from \"path\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { PLUGIN_MANIFEST_DIR, STANDARD_FILES } from \"../consts.js\";\nimport { directoryExists, fileExists, listDirectories } from \"../utils/fs.js\";\nimport { listAgentMdFiles } from \"./agents/index.js\";\nimport { readSkillMetadata } from \"./loading/index.js\";\nimport {\n configDirsInPlay,\n findConfigLoadFailures,\n getProjectConfigPath,\n isLocalSource,\n resolvePrimarySourceEntry,\n type ConfigLoadError,\n type SourceEntry,\n} from \"./configuration/index.js\";\nimport { isHomeDirectory, resolveInstallPaths } from \"./installation/index.js\";\nimport {\n getInstalledPluginsRegistryPath,\n getProjectPluginsDir,\n getUserPluginsDir,\n listRegisteredPluginInstalls,\n validateAgentFrontmatter,\n validateAllPlugins,\n validatePlugin,\n validateSkillFrontmatter,\n type ResolvedPlugin,\n} from \"./plugins/index.js\";\nimport { splitMetadataValidationIssues, validateSkillMetadata } from \"./schemas.js\";\nimport { isSourceRepo, validateSource } from \"./source-validator.js\";\nimport type { ValidationResult } from \"../types/index.js\";\n\n/** How a source repository under the cwd is labelled when it is not a registered source. */\nconst CWD_SOURCE_NAME = \"current directory\";\n\nexport type ContentIssue = {\n severity: \"error\" | \"warning\";\n /** The file or directory a reader has to open to fix the issue. */\n file: string;\n message: string;\n};\n\n/**\n * One content pass: what it walked, what it found, and what it deliberately did\n * not check. `notes` carries neither errors nor warnings — it is the record of\n * which sources were reached and which were skipped.\n */\nexport type ContentValidation = {\n count: number;\n issues: ContentIssue[];\n notes: string[];\n};\n\nconst NOTHING_VALIDATED: ContentValidation = { count: 0, issues: [], notes: [] };\n\nfunction mergeValidations(parts: ContentValidation[]): ContentValidation {\n return parts.reduce(\n (acc, part) => ({\n count: acc.count + part.count,\n issues: [...acc.issues, ...part.issues],\n notes: [...acc.notes, ...part.notes],\n }),\n NOTHING_VALIDATED,\n );\n}\n\n/** Render an absolute path with a `~/` prefix when it's under the user's home directory. */\nfunction displayDir(absolutePath: string): string {\n const home = os.homedir();\n if (absolutePath === home) return \"~\";\n if (absolutePath.startsWith(home + path.sep)) {\n return `~${path.sep}${path.relative(home, absolutePath)}`;\n }\n return absolutePath;\n}\n\nfunction toIssues(file: string, result: ValidationResult): ContentIssue[] {\n return [\n ...result.errors.map((message) => ({ severity: \"error\" as const, file, message })),\n ...result.warnings.map((message) => ({ severity: \"warning\" as const, file, message })),\n ];\n}\n\n/** Says which of the three load outcomes a config file is in, without restating the loader. */\nconst CONFIG_UNREADABLE = \"exists but could not be loaded\";\n\n/**\n * Validates the config files this run reads: the project's own and the global one it inlines.\n *\n * A config that exists and cannot be parsed is reported here rather than left to the operational\n * layer, for the reason that layer exists to be gated on — every operational row is read OUT of\n * this file, so each would be a cascade of the same fault. It is also the only report that can\n * carry the loader's reason: the layers below re-read the file per check, and their own\n * diagnostics for it are what used to arrive spliced between the rows.\n *\n * An ABSENT config is not a finding here. It is the legitimate state `init` exists for, and the\n * operational layer already names it and offers the remedy that fits it.\n */\nexport async function validateProjectConfigFile(projectDir: string): Promise<ContentValidation> {\n const [present, failures] = await Promise.all([\n countExistingConfigs(projectDir),\n findConfigLoadFailures(projectDir),\n ]);\n\n return { count: present, issues: failures.map(toUnreadableConfigIssue), notes: [] };\n}\n\nfunction toUnreadableConfigIssue(failure: ConfigLoadError): ContentIssue {\n return {\n severity: \"error\",\n file: displayDir(failure.configPath),\n message: `${CONFIG_UNREADABLE}: ${failure.reason}`,\n };\n}\n\nasync function countExistingConfigs(projectDir: string): Promise<number> {\n const present = await Promise.all(\n configDirsInPlay(projectDir).map((dir) => fileExists(getProjectConfigPath(dir))),\n );\n return present.filter(Boolean).length;\n}\n\n/**\n * Validates the marketplace this installation reads from when it is local, plus the current\n * directory when that is itself a skills source repository — that repository is the content a\n * marketplace author runs this against, and it is not the source they read skills from (D-210).\n * A remote marketplace is recorded as skipped rather than fetched.\n */\nexport async function validateRegisteredSources(projectDir: string): Promise<ContentValidation> {\n const primary = await resolvePrimarySourceEntry(projectDir);\n const registered = [primary];\n const remote = registered.filter((source) => !isLocalSource(source.url));\n const local = await localSourcesToValidate(projectDir, registered);\n\n const outcomes = await Promise.all(local.map(validateOneSource));\n\n return {\n count: local.length,\n issues: outcomes.flatMap((outcome) => outcome.issues),\n notes: [\n ...outcomes.map((outcome) => outcome.note),\n ...remote.map((source) => `${source.name} (${source.url}) — skipped (remote source)`),\n ],\n };\n}\n\nasync function localSourcesToValidate(\n projectDir: string,\n registered: SourceEntry[],\n): Promise<SourceEntry[]> {\n const local = registered.filter((source) => isLocalSource(source.url));\n const alreadyCovered = local.some(\n (source) => path.resolve(projectDir, source.url) === projectDir,\n );\n\n if (alreadyCovered || !(await isSourceRepo(projectDir))) return local;\n\n return [...local, { name: CWD_SOURCE_NAME, url: projectDir }];\n}\n\ntype SourceOutcome = { note: string; issues: ContentIssue[] };\n\nasync function validateOneSource(source: SourceEntry): Promise<SourceOutcome> {\n const label = `${source.name} (${source.url})`;\n try {\n const result = await validateSource(source.url);\n return { note: `${label} — ${result.skillCount} skills`, issues: result.issues };\n } catch (error) {\n return {\n note: `${label} — failed`,\n issues: [{ severity: \"error\", file: source.url, message: getErrorMessage(error) }],\n };\n }\n}\n\n/** Validates every installed plugin bundle in the global and project plugin directories. */\nexport async function validateInstalledPlugins(projectDir: string): Promise<ContentValidation> {\n const dirs = [\n getUserPluginsDir(),\n ...(isHomeDirectory(projectDir) ? [] : [getProjectPluginsDir(projectDir)]),\n ];\n return mergeValidations(await Promise.all(dirs.map(validatePluginsDirectory)));\n}\n\nasync function validatePluginsDirectory(pluginsDir: string): Promise<ContentValidation> {\n if (!(await directoryExists(pluginsDir))) return NOTHING_VALIDATED;\n\n if (await fileExists(getInstalledPluginsRegistryPath(pluginsDir))) {\n const registryValidation = await validateRegistryPlugins(pluginsDir);\n if (registryValidation !== undefined) return registryValidation;\n }\n\n const pluginDirs = await findPluginDirectories(pluginsDir);\n if (pluginDirs.length === 0) return NOTHING_VALIDATED;\n\n const { results } = await validateAllPlugins(pluginsDir);\n\n return {\n count: results.length,\n issues: results.flatMap(({ name, result }) => toIssues(name, result)),\n notes: [],\n };\n}\n\n/**\n * Validates the installs recorded in the plugins directory's `installed_plugins.json`\n * (claude CLI >=2.1.220 cache layout). Returns undefined when the registry records no\n * installs so the caller can fall back to the direct-children scan (older/manual layouts).\n */\nasync function validateRegistryPlugins(pluginsDir: string): Promise<ContentValidation | undefined> {\n let installs: ResolvedPlugin[];\n try {\n installs = await listRegisteredPluginInstalls(pluginsDir);\n } catch (error) {\n return {\n count: 0,\n issues: [\n {\n severity: \"error\",\n file: displayDir(getInstalledPluginsRegistryPath(pluginsDir)),\n message: getErrorMessage(error),\n },\n ],\n notes: [],\n };\n }\n\n if (installs.length === 0) return undefined;\n\n // A recorded installPath that no longer exists surfaces as an invalid plugin\n // via validatePlugin's structure check, not a crash.\n const results = await Promise.all(\n installs.map(async ({ pluginKey, installPath }) =>\n toIssues(pluginKey, await validatePlugin(installPath)),\n ),\n );\n\n return { count: installs.length, issues: results.flat(), notes: [] };\n}\n\nasync function findPluginDirectories(pluginsDir: string): Promise<string[]> {\n const entries = await listDirectories(pluginsDir);\n const checks = await Promise.all(\n entries.map(async (name) => ({\n name,\n isPlugin: await directoryExists(path.join(pluginsDir, name, PLUGIN_MANIFEST_DIR)),\n })),\n );\n return checks.filter((check) => check.isPlugin).map((check) => check.name);\n}\n\n/** Validates the SKILL.md and metadata.yaml of every installed skill, both scopes. */\nexport async function validateInstalledSkills(projectDir: string): Promise<ContentValidation> {\n return mergeValidations(\n await Promise.all(installedDirs(projectDir, \"skillsDir\").map(validateSkillsDirectory)),\n );\n}\n\n/** Validates the frontmatter of every compiled agent file, both scopes. */\nexport async function validateInstalledAgents(projectDir: string): Promise<ContentValidation> {\n return mergeValidations(\n await Promise.all(installedDirs(projectDir, \"agentsDir\").map(validateAgentsDirectory)),\n );\n}\n\n/**\n * The directories to walk for an installed-content pass. At the home directory both\n * scopes resolve to the same place, so it is walked once instead of twice.\n */\nfunction installedDirs(projectDir: string, key: \"skillsDir\" | \"agentsDir\"): string[] {\n const global = resolveInstallPaths(projectDir, \"global\")[key];\n if (isHomeDirectory(projectDir)) return [global];\n return [global, resolveInstallPaths(projectDir, \"project\")[key]];\n}\n\n/** What an installed-content pass walked, named rather than validated. */\nexport type InstalledArtifacts = {\n /** Every installed skill directory, both scopes, as display paths. */\n skills: string[];\n /** Every compiled agent file, both scopes, as display paths. */\n agents: string[];\n};\n\n/**\n * The same two walks {@link validateInstalledSkills} and {@link validateInstalledAgents} count,\n * listing what they found instead of judging it. `doctor` reports this when no configuration\n * exists to compare the installation against: there is nothing to validate the files AGAINST,\n * and naming them is the whole finding.\n */\nexport async function listInstalledArtifacts(projectDir: string): Promise<InstalledArtifacts> {\n const [skills, agents] = await Promise.all([\n listAcrossScopes(installedDirs(projectDir, \"skillsDir\"), listDirectories),\n listAcrossScopes(installedDirs(projectDir, \"agentsDir\"), listAgentMdFiles),\n ]);\n return { skills, agents };\n}\n\nasync function listAcrossScopes(\n dirs: string[],\n listEntries: (dir: string) => Promise<string[]>,\n): Promise<string[]> {\n const perDir = await Promise.all(dirs.map((dir) => listDisplayPaths(dir, listEntries)));\n return perDir.flat();\n}\n\n/** One directory's entries as display paths, or nothing when the directory is absent. */\nasync function listDisplayPaths(\n dir: string,\n listEntries: (dir: string) => Promise<string[]>,\n): Promise<string[]> {\n if (!(await directoryExists(dir))) return [];\n const entries = await listEntries(dir);\n return entries.map((entry) => displayDir(path.join(dir, entry)));\n}\n\nasync function validateSkillsDirectory(skillsDir: string): Promise<ContentValidation> {\n if (!(await directoryExists(skillsDir))) return NOTHING_VALIDATED;\n\n const skillDirs = await listDirectories(skillsDir);\n if (skillDirs.length === 0) return NOTHING_VALIDATED;\n\n const results = await Promise.all(\n skillDirs.map(async (name) => {\n const skillDir = path.join(skillsDir, name);\n return toIssues(displayDir(skillDir), await validateInstalledSkill(skillDir));\n }),\n );\n\n return { count: skillDirs.length, issues: results.flat(), notes: [] };\n}\n\nasync function validateAgentsDirectory(agentsDir: string): Promise<ContentValidation> {\n if (!(await directoryExists(agentsDir))) return NOTHING_VALIDATED;\n\n const agentFiles = await listAgentMdFiles(agentsDir);\n if (agentFiles.length === 0) return NOTHING_VALIDATED;\n\n const results = await Promise.all(\n agentFiles.map(async (fileName) => {\n const agentPath = path.join(agentsDir, fileName);\n return toIssues(displayDir(agentPath), await validateAgentFrontmatter(agentPath));\n }),\n );\n\n return { count: agentFiles.length, issues: results.flat(), notes: [] };\n}\n\nasync function validateInstalledSkill(skillDir: string): Promise<ValidationResult> {\n const skillMdPath = path.join(skillDir, STANDARD_FILES.SKILL_MD);\n const metadataPath = path.join(skillDir, STANDARD_FILES.METADATA_YAML);\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!(await fileExists(skillMdPath))) {\n errors.push(`Missing ${STANDARD_FILES.SKILL_MD}`);\n } else {\n const frontmatterResult = await validateSkillFrontmatter(skillMdPath);\n errors.push(...frontmatterResult.errors);\n warnings.push(...frontmatterResult.warnings);\n }\n\n if (!(await fileExists(metadataPath))) {\n errors.push(`Missing ${STANDARD_FILES.METADATA_YAML}`);\n } else {\n const metadataResult = await validateInstalledSkillMetadata(metadataPath);\n errors.push(...metadataResult.errors);\n warnings.push(...metadataResult.warnings);\n }\n\n return { valid: errors.length === 0, errors, warnings };\n}\n\nasync function validateInstalledSkillMetadata(metadataPath: string): Promise<ValidationResult> {\n // Same judgment `compile` refuses on and local-skill discovery skips on: a file\n // that describes no skill is reported here as the error it is. The strict\n // published-skill checks below are layered on top of that verdict, never against\n // it — doctor reports what the other two passes refuse, and then some.\n const read = await readSkillMetadata(metadataPath);\n if (!read.usable) {\n return {\n valid: false,\n errors: [`${STANDARD_FILES.METADATA_YAML}: ${read.reason}`],\n warnings: [],\n };\n }\n\n const metadata = read.metadata;\n const result = validateSkillMetadata(metadata);\n if (result.success) {\n return { valid: true, errors: [], warnings: [] };\n }\n\n // Over-length cliDescription is advisory — only hard schema violations invalidate the skill\n const { errors, warnings } = splitMetadataValidationIssues(result.error, metadata);\n return {\n valid: errors.length === 0,\n errors: errors.map((e) => `${STANDARD_FILES.METADATA_YAML}: ${e}`),\n warnings: warnings.map((w) => `${STANDARD_FILES.METADATA_YAML}: ${w}`),\n };\n}\n"],"mappings":"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","names":["os","path","path","path","matrix","os","path"]}