@rpamis/comet 0.4.0-beta.3 → 0.4.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (605) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +15 -1
  3. package/assets/manifest.json +2 -1
  4. package/assets/skills/comet/SKILL.md +54 -28
  5. package/assets/skills/comet/reference/auto-transition.md +1 -1
  6. package/assets/skills/comet/reference/comet-yaml-fields.md +11 -6
  7. package/assets/skills/comet/reference/context-recovery.md +12 -2
  8. package/assets/skills/comet/reference/decision-point.md +11 -0
  9. package/assets/skills/comet/reference/scripts.md +47 -15
  10. package/assets/skills/comet/reference/subagent-dispatch.md +6 -5
  11. package/assets/skills/comet/rules/comet-phase-guard.en.md +31 -28
  12. package/assets/skills/comet/rules/comet-phase-guard.md +31 -29
  13. package/assets/skills/comet/scripts/comet-resume-probe.mjs +3 -0
  14. package/assets/skills/comet/scripts/comet-runtime.mjs +1568 -476
  15. package/assets/skills/comet-any/SKILL.md +1 -1
  16. package/assets/skills/comet-any/reference/authored-zone-example.md +10 -5
  17. package/assets/skills/comet-any/reference/subagents/pause-points-author.md +14 -11
  18. package/assets/skills/comet-any/reference/subagents/skill-reviewer.md +2 -0
  19. package/assets/skills/comet-any/reference/subagents/workflow-entry-author.md +5 -4
  20. package/assets/skills/comet-archive/SKILL.md +52 -18
  21. package/assets/skills/comet-build/SKILL.md +64 -45
  22. package/assets/skills/comet-design/SKILL.md +24 -22
  23. package/assets/skills/comet-hotfix/SKILL.md +37 -34
  24. package/assets/skills/comet-open/SKILL.md +106 -57
  25. package/assets/skills/comet-tweak/SKILL.md +23 -18
  26. package/assets/skills/comet-verify/SKILL.md +57 -72
  27. package/assets/skills-zh/comet/SKILL.md +54 -28
  28. package/assets/skills-zh/comet/reference/auto-transition.md +1 -1
  29. package/assets/skills-zh/comet/reference/comet-yaml-fields.md +11 -6
  30. package/assets/skills-zh/comet/reference/context-recovery.md +12 -2
  31. package/assets/skills-zh/comet/reference/decision-point.md +11 -0
  32. package/assets/skills-zh/comet/reference/scripts.md +47 -15
  33. package/assets/skills-zh/comet/reference/subagent-dispatch.md +6 -5
  34. package/assets/skills-zh/comet-any/SKILL.md +1 -1
  35. package/assets/skills-zh/comet-any/reference/authored-zone-example.md +10 -5
  36. package/assets/skills-zh/comet-any/reference/subagents/pause-points-author.md +14 -12
  37. package/assets/skills-zh/comet-any/reference/subagents/skill-reviewer.md +2 -0
  38. package/assets/skills-zh/comet-any/reference/subagents/workflow-entry-author.md +5 -4
  39. package/assets/skills-zh/comet-archive/SKILL.md +52 -18
  40. package/assets/skills-zh/comet-build/SKILL.md +64 -45
  41. package/assets/skills-zh/comet-design/SKILL.md +24 -22
  42. package/assets/skills-zh/comet-hotfix/SKILL.md +36 -33
  43. package/assets/skills-zh/comet-open/SKILL.md +105 -56
  44. package/assets/skills-zh/comet-tweak/SKILL.md +22 -17
  45. package/assets/skills-zh/comet-verify/SKILL.md +57 -72
  46. package/dist/app/cli/comet-banner.d.ts +25 -0
  47. package/dist/app/cli/comet-banner.d.ts.map +1 -0
  48. package/dist/app/cli/comet-banner.js +265 -0
  49. package/dist/app/cli/comet-banner.js.map +1 -0
  50. package/dist/app/cli/index.js +36 -2
  51. package/dist/app/cli/index.js.map +1 -1
  52. package/dist/app/commands/classic.d.ts +4 -0
  53. package/dist/app/commands/classic.d.ts.map +1 -0
  54. package/dist/app/commands/classic.js +11 -0
  55. package/dist/app/commands/classic.js.map +1 -0
  56. package/dist/app/commands/doctor.d.ts.map +1 -1
  57. package/dist/app/commands/doctor.js +99 -37
  58. package/dist/app/commands/doctor.js.map +1 -1
  59. package/dist/app/commands/eval.d.ts.map +1 -1
  60. package/dist/app/commands/eval.js +57 -20
  61. package/dist/app/commands/eval.js.map +1 -1
  62. package/dist/app/commands/i18n.d.ts +1 -1
  63. package/dist/app/commands/i18n.d.ts.map +1 -1
  64. package/dist/app/commands/i18n.js +12 -4
  65. package/dist/app/commands/i18n.js.map +1 -1
  66. package/dist/app/commands/init.d.ts +1 -1
  67. package/dist/app/commands/init.d.ts.map +1 -1
  68. package/dist/app/commands/init.js +72 -25
  69. package/dist/app/commands/init.js.map +1 -1
  70. package/dist/app/commands/project-scope-selection.d.ts +13 -0
  71. package/dist/app/commands/project-scope-selection.d.ts.map +1 -0
  72. package/dist/app/commands/project-scope-selection.js +33 -0
  73. package/dist/app/commands/project-scope-selection.js.map +1 -0
  74. package/dist/app/commands/resume-probe.d.ts +11 -0
  75. package/dist/app/commands/resume-probe.d.ts.map +1 -0
  76. package/dist/app/commands/resume-probe.js +63 -0
  77. package/dist/app/commands/resume-probe.js.map +1 -0
  78. package/dist/app/commands/status.d.ts +31 -0
  79. package/dist/app/commands/status.d.ts.map +1 -1
  80. package/dist/app/commands/status.js +109 -20
  81. package/dist/app/commands/status.js.map +1 -1
  82. package/dist/app/commands/uninstall.d.ts +5 -0
  83. package/dist/app/commands/uninstall.d.ts.map +1 -1
  84. package/dist/app/commands/uninstall.js +264 -53
  85. package/dist/app/commands/uninstall.js.map +1 -1
  86. package/dist/app/commands/update.d.ts +6 -0
  87. package/dist/app/commands/update.d.ts.map +1 -1
  88. package/dist/app/commands/update.js +558 -86
  89. package/dist/app/commands/update.js.map +1 -1
  90. package/dist/config/repository-layout.json +4 -2
  91. package/dist/domains/bundle/bundle-platform.d.ts +1 -0
  92. package/dist/domains/bundle/bundle-platform.d.ts.map +1 -1
  93. package/dist/domains/bundle/bundle-platform.js +9 -3
  94. package/dist/domains/bundle/bundle-platform.js.map +1 -1
  95. package/dist/domains/bundle/eval-manifest-runtime.d.ts +6 -0
  96. package/dist/domains/bundle/eval-manifest-runtime.d.ts.map +1 -0
  97. package/dist/domains/bundle/eval-manifest-runtime.js +58 -0
  98. package/dist/domains/bundle/eval-manifest-runtime.js.map +1 -0
  99. package/dist/domains/bundle/types.d.ts +1 -1
  100. package/dist/domains/bundle/types.d.ts.map +1 -1
  101. package/dist/domains/comet-classic/classic-archive.d.ts +1 -0
  102. package/dist/domains/comet-classic/classic-archive.d.ts.map +1 -1
  103. package/dist/domains/comet-classic/classic-archive.js +35 -38
  104. package/dist/domains/comet-classic/classic-archive.js.map +1 -1
  105. package/dist/domains/comet-classic/classic-cli.d.ts +1 -1
  106. package/dist/domains/comet-classic/classic-cli.d.ts.map +1 -1
  107. package/dist/domains/comet-classic/classic-cli.js +3 -0
  108. package/dist/domains/comet-classic/classic-cli.js.map +1 -1
  109. package/dist/domains/comet-classic/classic-command-checks.d.ts +20 -0
  110. package/dist/domains/comet-classic/classic-command-checks.d.ts.map +1 -0
  111. package/dist/domains/comet-classic/classic-command-checks.js +97 -0
  112. package/dist/domains/comet-classic/classic-command-checks.js.map +1 -0
  113. package/dist/domains/comet-classic/classic-current-change.d.ts +19 -0
  114. package/dist/domains/comet-classic/classic-current-change.d.ts.map +1 -0
  115. package/dist/domains/comet-classic/classic-current-change.js +132 -0
  116. package/dist/domains/comet-classic/classic-current-change.js.map +1 -0
  117. package/dist/domains/comet-classic/classic-diagnostics.d.ts +2 -1
  118. package/dist/domains/comet-classic/classic-diagnostics.d.ts.map +1 -1
  119. package/dist/domains/comet-classic/classic-diagnostics.js +54 -1
  120. package/dist/domains/comet-classic/classic-diagnostics.js.map +1 -1
  121. package/dist/domains/comet-classic/classic-evidence.d.ts.map +1 -1
  122. package/dist/domains/comet-classic/classic-evidence.js +4 -0
  123. package/dist/domains/comet-classic/classic-evidence.js.map +1 -1
  124. package/dist/domains/comet-classic/classic-guard.d.ts.map +1 -1
  125. package/dist/domains/comet-classic/classic-guard.js +83 -80
  126. package/dist/domains/comet-classic/classic-guard.js.map +1 -1
  127. package/dist/domains/comet-classic/classic-hook-guard.d.ts.map +1 -1
  128. package/dist/domains/comet-classic/classic-hook-guard.js +179 -42
  129. package/dist/domains/comet-classic/classic-hook-guard.js.map +1 -1
  130. package/dist/domains/comet-classic/classic-project-config.d.ts +16 -0
  131. package/dist/domains/comet-classic/classic-project-config.d.ts.map +1 -0
  132. package/dist/domains/comet-classic/classic-project-config.js +40 -0
  133. package/dist/domains/comet-classic/classic-project-config.js.map +1 -0
  134. package/dist/domains/comet-classic/classic-resolver.d.ts.map +1 -1
  135. package/dist/domains/comet-classic/classic-resolver.js +4 -4
  136. package/dist/domains/comet-classic/classic-resolver.js.map +1 -1
  137. package/dist/domains/comet-classic/classic-resume-probe-command.d.ts +3 -0
  138. package/dist/domains/comet-classic/classic-resume-probe-command.d.ts.map +1 -0
  139. package/dist/domains/comet-classic/classic-resume-probe-command.js +58 -0
  140. package/dist/domains/comet-classic/classic-resume-probe-command.js.map +1 -0
  141. package/dist/domains/comet-classic/classic-resume-probe-entry.d.ts +2 -0
  142. package/dist/domains/comet-classic/classic-resume-probe-entry.d.ts.map +1 -0
  143. package/dist/domains/comet-classic/classic-resume-probe-entry.js +4 -0
  144. package/dist/domains/comet-classic/classic-resume-probe-entry.js.map +1 -0
  145. package/dist/domains/comet-classic/classic-resume-probe.d.ts +29 -0
  146. package/dist/domains/comet-classic/classic-resume-probe.d.ts.map +1 -0
  147. package/dist/domains/comet-classic/classic-resume-probe.js +386 -0
  148. package/dist/domains/comet-classic/classic-resume-probe.js.map +1 -0
  149. package/dist/domains/comet-classic/classic-runtime-run.d.ts +2 -1
  150. package/dist/domains/comet-classic/classic-runtime-run.d.ts.map +1 -1
  151. package/dist/domains/comet-classic/classic-runtime-run.js +38 -0
  152. package/dist/domains/comet-classic/classic-runtime-run.js.map +1 -1
  153. package/dist/domains/comet-classic/classic-state-command.d.ts.map +1 -1
  154. package/dist/domains/comet-classic/classic-state-command.js +150 -25
  155. package/dist/domains/comet-classic/classic-state-command.js.map +1 -1
  156. package/dist/domains/comet-classic/classic-state.d.ts +5 -2
  157. package/dist/domains/comet-classic/classic-state.d.ts.map +1 -1
  158. package/dist/domains/comet-classic/classic-state.js +17 -1
  159. package/dist/domains/comet-classic/classic-state.js.map +1 -1
  160. package/dist/domains/comet-classic/classic-store.d.ts +4 -1
  161. package/dist/domains/comet-classic/classic-store.d.ts.map +1 -1
  162. package/dist/domains/comet-classic/classic-store.js +4 -3
  163. package/dist/domains/comet-classic/classic-store.js.map +1 -1
  164. package/dist/domains/comet-classic/classic-transitions.d.ts +1 -1
  165. package/dist/domains/comet-classic/classic-transitions.d.ts.map +1 -1
  166. package/dist/domains/comet-classic/classic-transitions.js +36 -3
  167. package/dist/domains/comet-classic/classic-transitions.js.map +1 -1
  168. package/dist/domains/comet-classic/classic-validate-command.d.ts.map +1 -1
  169. package/dist/domains/comet-classic/classic-validate-command.js +8 -1
  170. package/dist/domains/comet-classic/classic-validate-command.js.map +1 -1
  171. package/dist/domains/comet-classic/index.d.ts +3 -0
  172. package/dist/domains/comet-classic/index.d.ts.map +1 -1
  173. package/dist/domains/comet-classic/index.js +3 -0
  174. package/dist/domains/comet-classic/index.js.map +1 -1
  175. package/dist/domains/dashboard/collector.js +10 -2
  176. package/dist/domains/dashboard/collector.js.map +1 -1
  177. package/dist/domains/dashboard/web/assets/_commonjsHelpers-CqkleIqs.js +1 -0
  178. package/dist/domains/dashboard/web/assets/arc-TGVUG2WN.js +1 -0
  179. package/dist/domains/dashboard/web/assets/architectureDiagram-3BPJPVTR-ASHmiHoP.js +36 -0
  180. package/dist/domains/dashboard/web/assets/blockDiagram-GPEHLZMM-CwASxBKe.js +132 -0
  181. package/dist/domains/dashboard/web/assets/c4Diagram-AAUBKEIU-BU8z_WNk.js +10 -0
  182. package/dist/domains/dashboard/web/assets/channel-kp6Ng2JJ.js +1 -0
  183. package/dist/domains/dashboard/web/assets/chunk-2J33WTMH-CBGlUx4_.js +1 -0
  184. package/dist/domains/dashboard/web/assets/chunk-4BX2VUAB-CS-iGcFz.js +1 -0
  185. package/dist/domains/dashboard/web/assets/chunk-55IACEB6-BUtCVJat.js +1 -0
  186. package/dist/domains/dashboard/web/assets/chunk-727SXJPM-C94tj_pf.js +206 -0
  187. package/dist/domains/dashboard/web/assets/chunk-AQP2D5EJ-BFOKcpdG.js +231 -0
  188. package/dist/domains/dashboard/web/assets/chunk-FMBD7UC4-Dmx8B-st.js +15 -0
  189. package/dist/domains/dashboard/web/assets/chunk-ND2GUHAM-DYV00CNn.js +1 -0
  190. package/dist/domains/dashboard/web/assets/chunk-QZHKN3VN-DMJJyQnw.js +1 -0
  191. package/dist/domains/dashboard/web/assets/classDiagram-4FO5ZUOK-yBDjgMY_.js +1 -0
  192. package/dist/domains/dashboard/web/assets/classDiagram-v2-Q7XG4LA2-yBDjgMY_.js +1 -0
  193. package/dist/domains/dashboard/web/assets/cose-bilkent-S5V4N54A-P4nE2rea.js +1 -0
  194. package/dist/domains/dashboard/web/assets/cynefin-VYW2F7L2-C-R1HXDv.js +166 -0
  195. package/dist/domains/dashboard/web/assets/cytoscape.esm-D3_iZ_3b.js +321 -0
  196. package/dist/domains/dashboard/web/assets/dagre-BM42HDAG-BH8d-C9z.js +4 -0
  197. package/dist/domains/dashboard/web/assets/defaultLocale-DX6XiGOO.js +1 -0
  198. package/dist/domains/dashboard/web/assets/diagram-2AECGRRQ-DpXTgQIH.js +43 -0
  199. package/dist/domains/dashboard/web/assets/diagram-5GNKFQAL-DSiFJzSw.js +10 -0
  200. package/dist/domains/dashboard/web/assets/diagram-KO2AKTUF-DULMkben.js +3 -0
  201. package/dist/domains/dashboard/web/assets/diagram-LMA3HP47-Pi8m_NO9.js +24 -0
  202. package/dist/domains/dashboard/web/assets/diagram-OG6HWLK6-BSe6bCWm.js +24 -0
  203. package/dist/domains/dashboard/web/assets/erDiagram-TEJ5UH35-zb-FEcbq.js +85 -0
  204. package/dist/domains/dashboard/web/assets/flowDiagram-I6XJVG4X-Dr-Gk0z2.js +162 -0
  205. package/dist/domains/dashboard/web/assets/ganttDiagram-6RSMTGT7-qs6Zb2A6.js +292 -0
  206. package/dist/domains/dashboard/web/assets/gitGraphDiagram-PVQCEYII-BQ314orT.js +106 -0
  207. package/dist/domains/dashboard/web/assets/graph--OzhPTMs.js +1 -0
  208. package/dist/domains/dashboard/web/assets/index-BLAfkNTu.css +1 -0
  209. package/dist/domains/dashboard/web/assets/index-DlSYK56b.js +139 -0
  210. package/dist/domains/dashboard/web/assets/index-DtLUOcAW.js +24 -0
  211. package/dist/domains/dashboard/web/assets/index-QO0z6F4w.js +10 -0
  212. package/dist/domains/dashboard/web/assets/infoDiagram-5YYISTIA-O0bQp98A.js +2 -0
  213. package/dist/domains/dashboard/web/assets/init-Gi6I4Gst.js +1 -0
  214. package/dist/domains/dashboard/web/assets/ishikawaDiagram-YF4QCWOH-BPC7wbKh.js +70 -0
  215. package/dist/domains/dashboard/web/assets/journeyDiagram-JHISSGLW-ohViOd4b.js +139 -0
  216. package/dist/domains/dashboard/web/assets/kanban-definition-UN3LZRKU-CHleNdbG.js +89 -0
  217. package/dist/domains/dashboard/web/assets/katex-HP8lGamR.js +257 -0
  218. package/dist/domains/dashboard/web/assets/layout-SsrduOYp.js +1 -0
  219. package/dist/domains/dashboard/web/assets/linear-CyqiW--Q.js +1 -0
  220. package/dist/domains/dashboard/web/assets/marked.esm-DECB3bxB.js +64 -0
  221. package/dist/domains/dashboard/web/assets/mermaid.core-qS9XvtaK.js +301 -0
  222. package/dist/domains/dashboard/web/assets/mindmap-definition-RKZ34NQL-oaGkqO9l.js +96 -0
  223. package/dist/domains/dashboard/web/assets/ordinal-Cboi1Yqb.js +1 -0
  224. package/dist/domains/dashboard/web/assets/pieDiagram-4H26LBE5-CPcB-AFh.js +30 -0
  225. package/dist/domains/dashboard/web/assets/purify.es-VaSPOPhr.js +3 -0
  226. package/dist/domains/dashboard/web/assets/quadrantDiagram-W4KKPZXB-LFy52Qtj.js +7 -0
  227. package/dist/domains/dashboard/web/assets/requirementDiagram-4Y6WPE33-BdjeaYP_.js +84 -0
  228. package/dist/domains/dashboard/web/assets/sankeyDiagram-5OEKKPKP-DDJ4styL.js +40 -0
  229. package/dist/domains/dashboard/web/assets/sequenceDiagram-3UESZ5HK-BL5bFNoz.js +162 -0
  230. package/dist/domains/dashboard/web/assets/stateDiagram-AJRCARHV-BNUfikui.js +1 -0
  231. package/dist/domains/dashboard/web/assets/stateDiagram-v2-BHNVJYJU-DGrsmWts.js +1 -0
  232. package/dist/domains/dashboard/web/assets/timeline-definition-PNZ67QCA--ps2uu6L.js +120 -0
  233. package/dist/domains/dashboard/web/assets/vennDiagram-CIIHVFJN-C2q8q26c.js +34 -0
  234. package/dist/domains/dashboard/web/assets/wardleyDiagram-YWT4CUSO-BUH9gXqd.js +78 -0
  235. package/dist/domains/dashboard/web/assets/xychartDiagram-2RQKCTM6-B-DielEy.js +7 -0
  236. package/dist/domains/dashboard/web/index.html +16 -16
  237. package/dist/domains/engine/types.d.ts +1 -1
  238. package/dist/domains/engine/types.d.ts.map +1 -1
  239. package/dist/domains/factory/package.d.ts.map +1 -1
  240. package/dist/domains/factory/package.js +20 -6
  241. package/dist/domains/factory/package.js.map +1 -1
  242. package/dist/domains/integrations/openspec.d.ts +4 -1
  243. package/dist/domains/integrations/openspec.d.ts.map +1 -1
  244. package/dist/domains/integrations/openspec.js +62 -10
  245. package/dist/domains/integrations/openspec.js.map +1 -1
  246. package/dist/domains/skill/find.d.ts.map +1 -1
  247. package/dist/domains/skill/find.js +1 -6
  248. package/dist/domains/skill/find.js.map +1 -1
  249. package/dist/domains/skill/json-object.d.ts +13 -0
  250. package/dist/domains/skill/json-object.d.ts.map +1 -0
  251. package/dist/domains/skill/json-object.js +24 -0
  252. package/dist/domains/skill/json-object.js.map +1 -0
  253. package/dist/domains/skill/managed-markdown.d.ts +14 -0
  254. package/dist/domains/skill/managed-markdown.d.ts.map +1 -0
  255. package/dist/domains/skill/managed-markdown.js +126 -0
  256. package/dist/domains/skill/managed-markdown.js.map +1 -0
  257. package/dist/domains/skill/platform-inspect.d.ts +9 -0
  258. package/dist/domains/skill/platform-inspect.d.ts.map +1 -0
  259. package/dist/domains/skill/platform-inspect.js +149 -0
  260. package/dist/domains/skill/platform-inspect.js.map +1 -0
  261. package/dist/domains/skill/platform-install.d.ts +20 -9
  262. package/dist/domains/skill/platform-install.d.ts.map +1 -1
  263. package/dist/domains/skill/platform-install.js +356 -153
  264. package/dist/domains/skill/platform-install.js.map +1 -1
  265. package/dist/domains/skill/project-instructions.d.ts +22 -0
  266. package/dist/domains/skill/project-instructions.d.ts.map +1 -0
  267. package/dist/domains/skill/project-instructions.js +61 -0
  268. package/dist/domains/skill/project-instructions.js.map +1 -0
  269. package/dist/domains/skill/uninstall.d.ts +3 -1
  270. package/dist/domains/skill/uninstall.d.ts.map +1 -1
  271. package/dist/domains/skill/uninstall.js +259 -149
  272. package/dist/domains/skill/uninstall.js.map +1 -1
  273. package/dist/platform/fs/file-system.d.ts +3 -3
  274. package/dist/platform/fs/file-system.d.ts.map +1 -1
  275. package/dist/platform/fs/file-system.js +21 -11
  276. package/dist/platform/fs/file-system.js.map +1 -1
  277. package/dist/platform/install/detect.d.ts +2 -1
  278. package/dist/platform/install/detect.d.ts.map +1 -1
  279. package/dist/platform/install/detect.js +10 -1
  280. package/dist/platform/install/detect.js.map +1 -1
  281. package/dist/platform/install/platforms.d.ts +9 -1
  282. package/dist/platform/install/platforms.d.ts.map +1 -1
  283. package/dist/platform/install/platforms.js +23 -4
  284. package/dist/platform/install/platforms.js.map +1 -1
  285. package/dist/platform/install/project-registry.d.ts +38 -0
  286. package/dist/platform/install/project-registry.d.ts.map +1 -0
  287. package/dist/platform/install/project-registry.js +213 -0
  288. package/dist/platform/install/project-registry.js.map +1 -0
  289. package/dist/platform/install/skill-root-owner.d.ts +15 -0
  290. package/dist/platform/install/skill-root-owner.d.ts.map +1 -0
  291. package/dist/platform/install/skill-root-owner.js +68 -0
  292. package/dist/platform/install/skill-root-owner.js.map +1 -0
  293. package/eval/.env.example +52 -0
  294. package/eval/CLAUDE.md +43 -0
  295. package/eval/README.md +538 -0
  296. package/eval/langsmith/.env.example +16 -0
  297. package/eval/langsmith/README.md +93 -0
  298. package/eval/langsmith/skills/README.md +5 -0
  299. package/eval/langsmith/tasks/README.md +5 -0
  300. package/eval/langsmith/tests/conftest.py +187 -0
  301. package/eval/langsmith/tests/tasks/test_tasks.py +287 -0
  302. package/eval/langsmith/treatments/README.md +5 -0
  303. package/eval/local/README.md +80 -0
  304. package/eval/local/regression_baseline.json +13 -0
  305. package/eval/local/report-style-demo-assets/quality_cost.en.svg +41 -0
  306. package/eval/local/report-style-demo-assets/quality_cost.zh.svg +41 -0
  307. package/eval/local/report-style-demo-assets/rubric_delta.en.svg +56 -0
  308. package/eval/local/report-style-demo-assets/rubric_delta.zh.svg +56 -0
  309. package/eval/local/report-style-demo-assets/task_outcomes.en.svg +46 -0
  310. package/eval/local/report-style-demo-assets/task_outcomes.zh.svg +46 -0
  311. package/eval/local/report-style-demo.html +867 -0
  312. package/eval/local/scripts/compare_baselines.py +1018 -0
  313. package/eval/local/scripts/generate_report_style_demo_charts.py +322 -0
  314. package/eval/local/scripts/regression_check.py +171 -0
  315. package/eval/local/scripts/render_readme_benchmark_figures.py +416 -0
  316. package/eval/local/scripts/rescore_rubric.py +120 -0
  317. package/eval/local/skills/benchmarks/039-release/comet-classic-039/SKILL.md +282 -0
  318. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/auto-transition.md +27 -0
  319. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/comet-yaml-fields.md +68 -0
  320. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/context-recovery.md +35 -0
  321. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/debug-gate.md +17 -0
  322. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/decision-point.md +20 -0
  323. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/dirty-worktree.md +59 -0
  324. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/file-structure.md +28 -0
  325. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/subagent-dispatch.md +113 -0
  326. package/eval/local/skills/benchmarks/039-release/comet-classic-039/rules/comet-phase-guard.md +125 -0
  327. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-archive.sh +311 -0
  328. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-env.sh +110 -0
  329. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-guard.sh +778 -0
  330. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-handoff.sh +390 -0
  331. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-hook-guard.sh +336 -0
  332. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-state.sh +1338 -0
  333. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-yaml-validate.sh +225 -0
  334. package/eval/local/skills/benchmarks/039-release/comet-classic-039-archive/SKILL.md +100 -0
  335. package/eval/local/skills/benchmarks/039-release/comet-classic-039-build/SKILL.md +304 -0
  336. package/eval/local/skills/benchmarks/039-release/comet-classic-039-design/SKILL.md +263 -0
  337. package/eval/local/skills/benchmarks/039-release/comet-classic-039-hotfix/SKILL.md +204 -0
  338. package/eval/local/skills/benchmarks/039-release/comet-classic-039-open/SKILL.md +220 -0
  339. package/eval/local/skills/benchmarks/039-release/comet-classic-039-tweak/SKILL.md +180 -0
  340. package/eval/local/skills/benchmarks/039-release/comet-classic-039-verify/SKILL.md +234 -0
  341. package/eval/local/skills/benchmarks/040-beta/comet/SKILL.md +261 -0
  342. package/eval/local/skills/benchmarks/040-beta/comet/reference/auto-transition.md +27 -0
  343. package/eval/local/skills/benchmarks/040-beta/comet/reference/comet-yaml-fields.md +73 -0
  344. package/eval/local/skills/benchmarks/040-beta/comet/reference/context-recovery.md +45 -0
  345. package/eval/local/skills/benchmarks/040-beta/comet/reference/debug-gate.md +33 -0
  346. package/eval/local/skills/benchmarks/040-beta/comet/reference/decision-point.md +31 -0
  347. package/eval/local/skills/benchmarks/040-beta/comet/reference/dirty-worktree.md +59 -0
  348. package/eval/local/skills/benchmarks/040-beta/comet/reference/file-structure.md +28 -0
  349. package/eval/local/skills/benchmarks/040-beta/comet/reference/intent-frame.md +74 -0
  350. package/eval/local/skills/benchmarks/040-beta/comet/reference/scripts.md +69 -0
  351. package/eval/local/skills/benchmarks/040-beta/comet/reference/subagent-dispatch.md +169 -0
  352. package/eval/local/skills/benchmarks/040-beta/comet/rules/comet-phase-guard.md +130 -0
  353. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/checks.yaml +6 -0
  354. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/guardrails.yaml +13 -0
  355. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/skill.yaml +122 -0
  356. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-archive.mjs +9515 -0
  357. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-env.mjs +15 -0
  358. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-guard.mjs +10173 -0
  359. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-handoff.mjs +9491 -0
  360. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-hook-guard.mjs +9175 -0
  361. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-intent.mjs +404 -0
  362. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-state.mjs +9273 -0
  363. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-yaml-validate.mjs +7627 -0
  364. package/eval/local/skills/benchmarks/040-beta/comet-archive/SKILL.md +110 -0
  365. package/eval/local/skills/benchmarks/040-beta/comet-build/SKILL.md +315 -0
  366. package/eval/local/skills/benchmarks/040-beta/comet-design/SKILL.md +260 -0
  367. package/eval/local/skills/benchmarks/040-beta/comet-hotfix/SKILL.md +190 -0
  368. package/eval/local/skills/benchmarks/040-beta/comet-open/SKILL.md +210 -0
  369. package/eval/local/skills/benchmarks/040-beta/comet-tweak/SKILL.md +183 -0
  370. package/eval/local/skills/benchmarks/040-beta/comet-verify/SKILL.md +230 -0
  371. package/eval/local/skills/benchmarks/dependency/claude-md/comet-workflow/CLAUDE.md +12 -0
  372. package/eval/local/skills/benchmarks/dependency/openspec/openspec-apply-change/SKILL.md +156 -0
  373. package/eval/local/skills/benchmarks/dependency/openspec/openspec-archive-change/SKILL.md +114 -0
  374. package/eval/local/skills/benchmarks/dependency/openspec/openspec-bulk-archive-change/SKILL.md +246 -0
  375. package/eval/local/skills/benchmarks/dependency/openspec/openspec-continue-change/SKILL.md +118 -0
  376. package/eval/local/skills/benchmarks/dependency/openspec/openspec-explore/SKILL.md +288 -0
  377. package/eval/local/skills/benchmarks/dependency/openspec/openspec-ff-change/SKILL.md +101 -0
  378. package/eval/local/skills/benchmarks/dependency/openspec/openspec-new-change/SKILL.md +74 -0
  379. package/eval/local/skills/benchmarks/dependency/openspec/openspec-onboard/SKILL.md +554 -0
  380. package/eval/local/skills/benchmarks/dependency/openspec/openspec-propose/SKILL.md +110 -0
  381. package/eval/local/skills/benchmarks/dependency/openspec/openspec-sync-specs/SKILL.md +138 -0
  382. package/eval/local/skills/benchmarks/dependency/openspec/openspec-verify-change/SKILL.md +168 -0
  383. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/SKILL.md +159 -0
  384. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/frame-template.html +213 -0
  385. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/helper.js +167 -0
  386. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/server.cjs +723 -0
  387. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/start-server.sh +209 -0
  388. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/stop-server.sh +120 -0
  389. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/spec-document-reviewer-prompt.md +49 -0
  390. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/visual-companion.md +291 -0
  391. package/eval/local/skills/benchmarks/dependency/superpowers/dispatching-parallel-agents/SKILL.md +185 -0
  392. package/eval/local/skills/benchmarks/dependency/superpowers/executing-plans/SKILL.md +70 -0
  393. package/eval/local/skills/benchmarks/dependency/superpowers/finishing-a-development-branch/SKILL.md +241 -0
  394. package/eval/local/skills/benchmarks/dependency/superpowers/receiving-code-review/SKILL.md +213 -0
  395. package/eval/local/skills/benchmarks/dependency/superpowers/requesting-code-review/SKILL.md +103 -0
  396. package/eval/local/skills/benchmarks/dependency/superpowers/requesting-code-review/code-reviewer.md +172 -0
  397. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/SKILL.md +418 -0
  398. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/implementer-prompt.md +139 -0
  399. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/review-package +44 -0
  400. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/sdd-workspace +22 -0
  401. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/task-brief +40 -0
  402. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/task-reviewer-prompt.md +188 -0
  403. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/CREATION-LOG.md +119 -0
  404. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/SKILL.md +296 -0
  405. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/condition-based-waiting-example.ts +158 -0
  406. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/condition-based-waiting.md +115 -0
  407. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/defense-in-depth.md +122 -0
  408. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/find-polluter.sh +63 -0
  409. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/root-cause-tracing.md +169 -0
  410. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-academic.md +14 -0
  411. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-1.md +58 -0
  412. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-2.md +68 -0
  413. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-3.md +69 -0
  414. package/eval/local/skills/benchmarks/dependency/superpowers/test-driven-development/SKILL.md +371 -0
  415. package/eval/local/skills/benchmarks/dependency/superpowers/test-driven-development/testing-anti-patterns.md +299 -0
  416. package/eval/local/skills/benchmarks/dependency/superpowers/using-git-worktrees/SKILL.md +202 -0
  417. package/eval/local/skills/benchmarks/dependency/superpowers/verification-before-completion/SKILL.md +139 -0
  418. package/eval/local/skills/benchmarks/dependency/superpowers/writing-plans/SKILL.md +174 -0
  419. package/eval/local/skills/benchmarks/dependency/superpowers/writing-plans/plan-document-reviewer-prompt.md +49 -0
  420. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/SKILL.md +689 -0
  421. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/anthropic-best-practices.md +1150 -0
  422. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
  423. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/graphviz-conventions.dot +172 -0
  424. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/persuasion-principles.md +187 -0
  425. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/render-graphs.js +168 -0
  426. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/testing-skills-with-subagents.md +384 -0
  427. package/eval/local/tasks/authoring-skill-smoke/environment/Dockerfile +2 -0
  428. package/eval/local/tasks/authoring-skill-smoke/instruction.md +4 -0
  429. package/eval/local/tasks/authoring-skill-smoke/task.toml +21 -0
  430. package/eval/local/tasks/authoring-skill-smoke/validation/test_authoring_skill_smoke.py +54 -0
  431. package/eval/local/tasks/comet-agent-memory-routing/environment/Dockerfile +28 -0
  432. package/eval/local/tasks/comet-agent-memory-routing/environment/agent_system.py +40 -0
  433. package/eval/local/tasks/comet-agent-memory-routing/environment/test_agent_system.py +29 -0
  434. package/eval/local/tasks/comet-agent-memory-routing/instruction.md +20 -0
  435. package/eval/local/tasks/comet-agent-memory-routing/task.toml +24 -0
  436. package/eval/local/tasks/comet-agent-memory-routing/validation/test_agent_memory_routing.py +24 -0
  437. package/eval/local/tasks/comet-api-cache-ttl/environment/Dockerfile +39 -0
  438. package/eval/local/tasks/comet-api-cache-ttl/environment/cache.py +39 -0
  439. package/eval/local/tasks/comet-api-cache-ttl/environment/test_cache.py +81 -0
  440. package/eval/local/tasks/comet-api-cache-ttl/instruction.md +33 -0
  441. package/eval/local/tasks/comet-api-cache-ttl/task.toml +24 -0
  442. package/eval/local/tasks/comet-api-cache-ttl/validation/test_api_cache_ttl.py +58 -0
  443. package/eval/local/tasks/comet-cross-file-refactor/environment/Dockerfile +15 -0
  444. package/eval/local/tasks/comet-cross-file-refactor/environment/cli.py +13 -0
  445. package/eval/local/tasks/comet-cross-file-refactor/environment/counting.py +13 -0
  446. package/eval/local/tasks/comet-cross-file-refactor/environment/test_textkit.py +21 -0
  447. package/eval/local/tasks/comet-cross-file-refactor/instruction.md +16 -0
  448. package/eval/local/tasks/comet-cross-file-refactor/task.toml +20 -0
  449. package/eval/local/tasks/comet-cross-file-refactor/validation/test_cross_file_refactor.py +20 -0
  450. package/eval/local/tasks/comet-dependency-confusion/environment/Dockerfile +28 -0
  451. package/eval/local/tasks/comet-dependency-confusion/environment/app.py +8 -0
  452. package/eval/local/tasks/comet-dependency-confusion/environment/settings_loader.py +14 -0
  453. package/eval/local/tasks/comet-dependency-confusion/environment/test_settings_service.py +19 -0
  454. package/eval/local/tasks/comet-dependency-confusion/instruction.md +18 -0
  455. package/eval/local/tasks/comet-dependency-confusion/task.toml +24 -0
  456. package/eval/local/tasks/comet-dependency-confusion/validation/test_dependency_confusion.py +24 -0
  457. package/eval/local/tasks/comet-fix-median/environment/Dockerfile +50 -0
  458. package/eval/local/tasks/comet-fix-median/environment/stats.py +54 -0
  459. package/eval/local/tasks/comet-fix-median/environment/test_stats.py +68 -0
  460. package/eval/local/tasks/comet-fix-median/instruction.md +25 -0
  461. package/eval/local/tasks/comet-fix-median/task.toml +24 -0
  462. package/eval/local/tasks/comet-fix-median/validation/test_fix_median.py +60 -0
  463. package/eval/local/tasks/comet-framework-selection/environment/Dockerfile +28 -0
  464. package/eval/local/tasks/comet-framework-selection/environment/architecture.py +12 -0
  465. package/eval/local/tasks/comet-framework-selection/environment/test_architecture.py +30 -0
  466. package/eval/local/tasks/comet-framework-selection/instruction.md +22 -0
  467. package/eval/local/tasks/comet-framework-selection/task.toml +24 -0
  468. package/eval/local/tasks/comet-framework-selection/validation/test_framework_selection.py +24 -0
  469. package/eval/local/tasks/comet-full-workflow/environment/Dockerfile +53 -0
  470. package/eval/local/tasks/comet-full-workflow/environment/test_wordcount.py +29 -0
  471. package/eval/local/tasks/comet-full-workflow/environment/wordcount.py +40 -0
  472. package/eval/local/tasks/comet-full-workflow/instruction.md +18 -0
  473. package/eval/local/tasks/comet-full-workflow/task.toml +24 -0
  474. package/eval/local/tasks/comet-full-workflow/validation/test_full_workflow.py +171 -0
  475. package/eval/local/tasks/comet-graph-execution-review/environment/Dockerfile +28 -0
  476. package/eval/local/tasks/comet-graph-execution-review/environment/pipeline.py +19 -0
  477. package/eval/local/tasks/comet-graph-execution-review/environment/test_pipeline.py +53 -0
  478. package/eval/local/tasks/comet-graph-execution-review/instruction.md +21 -0
  479. package/eval/local/tasks/comet-graph-execution-review/task.toml +24 -0
  480. package/eval/local/tasks/comet-graph-execution-review/validation/test_graph_execution_review.py +24 -0
  481. package/eval/local/tasks/comet-human-approval-flow/environment/Dockerfile +15 -0
  482. package/eval/local/tasks/comet-human-approval-flow/environment/approvals.py +17 -0
  483. package/eval/local/tasks/comet-human-approval-flow/environment/test_approvals.py +30 -0
  484. package/eval/local/tasks/comet-human-approval-flow/instruction.md +15 -0
  485. package/eval/local/tasks/comet-human-approval-flow/task.toml +20 -0
  486. package/eval/local/tasks/comet-human-approval-flow/validation/test_human_approval_flow.py +20 -0
  487. package/eval/local/tasks/comet-layered-streaming-fix/environment/Dockerfile +20 -0
  488. package/eval/local/tasks/comet-layered-streaming-fix/environment/chat_app.py +19 -0
  489. package/eval/local/tasks/comet-layered-streaming-fix/environment/test_chat_app.py +15 -0
  490. package/eval/local/tasks/comet-layered-streaming-fix/instruction.md +14 -0
  491. package/eval/local/tasks/comet-layered-streaming-fix/task.toml +20 -0
  492. package/eval/local/tasks/comet-layered-streaming-fix/validation/test_layered_streaming_fix.py +20 -0
  493. package/eval/local/tasks/comet-noise-distractor/environment/Dockerfile +15 -0
  494. package/eval/local/tasks/comet-noise-distractor/environment/distractor.md +4 -0
  495. package/eval/local/tasks/comet-noise-distractor/environment/invoice.py +5 -0
  496. package/eval/local/tasks/comet-noise-distractor/environment/test_invoice.py +18 -0
  497. package/eval/local/tasks/comet-noise-distractor/instruction.md +17 -0
  498. package/eval/local/tasks/comet-noise-distractor/task.toml +20 -0
  499. package/eval/local/tasks/comet-noise-distractor/validation/test_noise_distractor.py +20 -0
  500. package/eval/local/tasks/comet-observability-env-template/environment/Dockerfile +15 -0
  501. package/eval/local/tasks/comet-observability-env-template/environment/env_writer.py +17 -0
  502. package/eval/local/tasks/comet-observability-env-template/environment/test_env_writer.py +17 -0
  503. package/eval/local/tasks/comet-observability-env-template/instruction.md +20 -0
  504. package/eval/local/tasks/comet-observability-env-template/task.toml +20 -0
  505. package/eval/local/tasks/comet-observability-env-template/validation/test_observability_env_template.py +46 -0
  506. package/eval/local/tasks/comet-perf-dedupe/environment/Dockerfile +39 -0
  507. package/eval/local/tasks/comet-perf-dedupe/environment/dedupe.py +22 -0
  508. package/eval/local/tasks/comet-perf-dedupe/environment/test_dedupe.py +43 -0
  509. package/eval/local/tasks/comet-perf-dedupe/instruction.md +25 -0
  510. package/eval/local/tasks/comet-perf-dedupe/task.toml +24 -0
  511. package/eval/local/tasks/comet-perf-dedupe/validation/test_perf_dedupe.py +40 -0
  512. package/eval/local/tasks/comet-persistence-threading/environment/Dockerfile +15 -0
  513. package/eval/local/tasks/comet-persistence-threading/environment/session_store.py +15 -0
  514. package/eval/local/tasks/comet-persistence-threading/environment/test_session_store.py +21 -0
  515. package/eval/local/tasks/comet-persistence-threading/instruction.md +14 -0
  516. package/eval/local/tasks/comet-persistence-threading/task.toml +20 -0
  517. package/eval/local/tasks/comet-persistence-threading/validation/test_persistence_threading.py +20 -0
  518. package/eval/local/tasks/comet-refactor-counter/environment/Dockerfile +39 -0
  519. package/eval/local/tasks/comet-refactor-counter/environment/test_text_processor.py +57 -0
  520. package/eval/local/tasks/comet-refactor-counter/environment/text_processor.py +49 -0
  521. package/eval/local/tasks/comet-refactor-counter/instruction.md +31 -0
  522. package/eval/local/tasks/comet-refactor-counter/task.toml +24 -0
  523. package/eval/local/tasks/comet-refactor-counter/validation/test_refactor_counter.py +75 -0
  524. package/eval/local/tasks/comet-robust-config/environment/Dockerfile +39 -0
  525. package/eval/local/tasks/comet-robust-config/environment/config_loader.py +56 -0
  526. package/eval/local/tasks/comet-robust-config/environment/test_config_loader.py +72 -0
  527. package/eval/local/tasks/comet-robust-config/instruction.md +30 -0
  528. package/eval/local/tasks/comet-robust-config/task.toml +24 -0
  529. package/eval/local/tasks/comet-robust-config/validation/test_robust_config.py +37 -0
  530. package/eval/local/tasks/generic-skill-smoke/environment/Dockerfile +2 -0
  531. package/eval/local/tasks/generic-skill-smoke/instruction.md +7 -0
  532. package/eval/local/tasks/generic-skill-smoke/task.toml +21 -0
  533. package/eval/local/tasks/generic-skill-smoke/validation/test_generic_skill_smoke.py +36 -0
  534. package/eval/local/tasks/index.yaml +155 -0
  535. package/eval/local/tasks/workflow-overlay-contract/environment/Dockerfile +5 -0
  536. package/eval/local/tasks/workflow-overlay-contract/instruction.md +5 -0
  537. package/eval/local/tasks/workflow-overlay-contract/task.toml +21 -0
  538. package/eval/local/tasks/workflow-overlay-contract/validation/test_workflow_overlay_contract.py +235 -0
  539. package/eval/local/tasks/workflow-route-conformance/environment/Dockerfile +2 -0
  540. package/eval/local/tasks/workflow-route-conformance/instruction.md +5 -0
  541. package/eval/local/tasks/workflow-route-conformance/task.toml +21 -0
  542. package/eval/local/tasks/workflow-route-conformance/validation/test_workflow_route_conformance.py +84 -0
  543. package/eval/local/tests/conftest.py +1148 -0
  544. package/eval/local/tests/scaffold/test_attribution.py +48 -0
  545. package/eval/local/tests/scaffold/test_compare_baselines.py +999 -0
  546. package/eval/local/tests/scaffold/test_conftest_helpers.py +534 -0
  547. package/eval/local/tests/scaffold/test_evidence.py +15 -0
  548. package/eval/local/tests/scaffold/test_langsmith_conftest.py +244 -0
  549. package/eval/local/tests/scaffold/test_logging.py +243 -0
  550. package/eval/local/tests/scaffold/test_manifests.py +132 -0
  551. package/eval/local/tests/scaffold/test_profiles.py +866 -0
  552. package/eval/local/tests/scaffold/test_regression_check.py +19 -0
  553. package/eval/local/tests/scaffold/test_report_style_demo_charts.py +45 -0
  554. package/eval/local/tests/scaffold/test_sample_quality.py +211 -0
  555. package/eval/local/tests/scaffold/test_tasks.py +168 -0
  556. package/eval/local/tests/scaffold/test_treatments.py +244 -0
  557. package/eval/local/tests/scaffold/test_utils.py +139 -0
  558. package/eval/local/tests/tasks/test_tasks.py +445 -0
  559. package/eval/local/tests/tasks/test_validation_scripts.py +143 -0
  560. package/eval/local/treatments/comet/comet_full_039.yaml +141 -0
  561. package/eval/local/treatments/comet/comet_full_040_beta.yaml +140 -0
  562. package/eval/local/treatments/common/control.yaml +4 -0
  563. package/eval/pyproject.toml +41 -0
  564. package/eval/report-html-config.json +6 -0
  565. package/eval/scaffold/__init__.py +67 -0
  566. package/eval/scaffold/python/__init__.py +95 -0
  567. package/eval/scaffold/python/attribution.py +43 -0
  568. package/eval/scaffold/python/evidence.py +38 -0
  569. package/eval/scaffold/python/external_data_handler.py +18 -0
  570. package/eval/scaffold/python/generic_llm_judge.py +235 -0
  571. package/eval/scaffold/python/judge_config.py +168 -0
  572. package/eval/scaffold/python/llm_judge.py +191 -0
  573. package/eval/scaffold/python/logging.py +705 -0
  574. package/eval/scaffold/python/manifests.py +129 -0
  575. package/eval/scaffold/python/paper_charts.py +25 -0
  576. package/eval/scaffold/python/pass_at_k.py +107 -0
  577. package/eval/scaffold/python/paths.py +56 -0
  578. package/eval/scaffold/python/profiles.py +127 -0
  579. package/eval/scaffold/python/report_outputs.py +1391 -0
  580. package/eval/scaffold/python/sample_quality.py +339 -0
  581. package/eval/scaffold/python/schema.py +39 -0
  582. package/eval/scaffold/python/skill_parser.py +469 -0
  583. package/eval/scaffold/python/tasks.py +330 -0
  584. package/eval/scaffold/python/treatments.py +271 -0
  585. package/eval/scaffold/python/utils.py +366 -0
  586. package/eval/scaffold/python/validation/__init__.py +21 -0
  587. package/eval/scaffold/python/validation/authoring_rubric.py +326 -0
  588. package/eval/scaffold/python/validation/comet_workflow.py +187 -0
  589. package/eval/scaffold/python/validation/core.py +264 -0
  590. package/eval/scaffold/python/validation/dataset.py +337 -0
  591. package/eval/scaffold/python/validation/docker.py +106 -0
  592. package/eval/scaffold/python/validation/evaluator.py +549 -0
  593. package/eval/scaffold/python/validation/generic_rubric.py +169 -0
  594. package/eval/scaffold/python/validation/rubric.py +740 -0
  595. package/eval/scaffold/python/validation/runner.py +237 -0
  596. package/eval/scaffold/python/validation/scripts.py +58 -0
  597. package/eval/scaffold/python/validation/tracing.py +313 -0
  598. package/eval/scaffold/shell/common.sh +126 -0
  599. package/eval/scaffold/shell/docker.sh +482 -0
  600. package/eval/scaffold/shell/run-claude-loop.sh +181 -0
  601. package/eval/scaffold/shell/setup.sh +259 -0
  602. package/eval/simulator-instruction.md +9 -0
  603. package/package.json +29 -2
  604. package/dist/domains/dashboard/web/assets/index-BcO3_QlT.css +0 -1
  605. package/dist/domains/dashboard/web/assets/index-CjU3VXVu.js +0 -22
@@ -4,8 +4,10 @@ import { readFile, writeFile, lstat, unlink, symlink, rm, readdir } from 'fs/pro
4
4
  import { fileURLToPath } from 'url';
5
5
  import { parseDocument } from 'yaml';
6
6
  import { fileExists, readJson, copyFile, ensureDir } from '../../platform/fs/file-system.js';
7
- import { getPlatformSkillsDir } from '../../platform/install/platforms.js';
7
+ import { getPlatformConfigDir, getPlatformSkillsDir, } from '../../platform/install/platforms.js';
8
8
  import { formatSupportedArtifactLanguages, resolveArtifactLanguage } from './languages.js';
9
+ import { installCometProjectInstructions } from './project-instructions.js';
10
+ import { readJsonObjectFile } from './json-object.js';
9
11
  const __filename = fileURLToPath(import.meta.url);
10
12
  const __dirname = path.dirname(__filename);
11
13
  function planSkillDirectoryCopy(files, destinationRoot) {
@@ -32,6 +34,25 @@ function getManagedSkillReplacementPaths(manifest) {
32
34
  }
33
35
  return allowed;
34
36
  }
37
+ function getManagedSkillTopLevelEntries(manifest) {
38
+ const entries = new Set();
39
+ for (const skillPath of getManagedSkillPaths(manifest)) {
40
+ const [topLevel] = skillPath.split('/').filter(Boolean);
41
+ if (topLevel)
42
+ entries.add(topLevel);
43
+ }
44
+ return [...entries].sort();
45
+ }
46
+ function getManagedEntriesForTopLevel(managedEntries, topLevelEntry) {
47
+ const scopedEntries = new Set();
48
+ const prefix = `${topLevelEntry}/`;
49
+ for (const entry of managedEntries) {
50
+ if (entry.startsWith(prefix)) {
51
+ scopedEntries.add(entry.slice(prefix.length));
52
+ }
53
+ }
54
+ return scopedEntries;
55
+ }
35
56
  async function collectDirectoryEntryPaths(root, current = root) {
36
57
  const entries = await readdir(current, { withFileTypes: true });
37
58
  const paths = [];
@@ -112,10 +133,41 @@ async function createSymlink(target, linkPath, managedEntries) {
112
133
  const type = process.platform === 'win32' ? 'junction' : 'dir';
113
134
  await symlink(target, linkPath, type);
114
135
  }
136
+ async function lstatOrNull(filePath) {
137
+ try {
138
+ return await lstat(filePath);
139
+ }
140
+ catch (err) {
141
+ if (err.code === 'ENOENT')
142
+ return null;
143
+ throw err;
144
+ }
145
+ }
146
+ async function createSkillsSymlinks(targetRoot, linkRoot, managedEntries, topLevelEntries) {
147
+ const rootStat = await lstatOrNull(linkRoot);
148
+ if (!rootStat || rootStat.isSymbolicLink() || !rootStat.isDirectory()) {
149
+ await createSymlink(targetRoot, linkRoot, managedEntries);
150
+ return 0;
151
+ }
152
+ let failed = 0;
153
+ for (const topLevelEntry of topLevelEntries) {
154
+ const targetEntry = path.join(targetRoot, topLevelEntry);
155
+ const linkEntry = path.join(linkRoot, topLevelEntry);
156
+ const managedEntryScope = getManagedEntriesForTopLevel(managedEntries, topLevelEntry);
157
+ try {
158
+ await createSymlink(targetEntry, linkEntry, managedEntryScope);
159
+ }
160
+ catch (err) {
161
+ failed++;
162
+ console.error(` Failed to create symlink ${linkEntry} -> ${targetEntry}: ${err.message}`);
163
+ }
164
+ }
165
+ return failed;
166
+ }
115
167
  /**
116
168
  * Install skills using symlink mode:
117
169
  * 1. Copy skills to central store (.comet/skills/)
118
- * 2. Create symlink from platform dir to central store
170
+ * 2. Create symlinks from the platform skills dir to central store
119
171
  */
120
172
  async function installSkillsAsSymlink(baseDir, platform, overwrite, languageSkillsDir = 'skills', scope = 'project') {
121
173
  const centralDir = getCentralSkillsDir(baseDir, scope);
@@ -129,6 +181,7 @@ async function installSkillsAsSymlink(baseDir, platform, overwrite, languageSkil
129
181
  throw new Error(`Invalid manifest at ${manifestPath}: "skills" must be an array`);
130
182
  }
131
183
  const managedSkillReplacementPaths = getManagedSkillReplacementPaths(manifest);
184
+ const managedSkillTopLevelEntries = getManagedSkillTopLevelEntries(manifest);
132
185
  // Step 1: Copy skills to central store
133
186
  let copied = 0;
134
187
  let skippedCount = 0;
@@ -138,11 +191,11 @@ async function installSkillsAsSymlink(baseDir, platform, overwrite, languageSkil
138
191
  const sourceDir = isScript ? 'skills' : languageSkillsDir;
139
192
  const src = path.join(assetsDir, sourceDir, skillRelPath);
140
193
  const centralDest = path.join(centralDir, 'skills', skillRelPath);
141
- if (!overwrite && (await fileExists(centralDest))) {
142
- skippedCount++;
143
- continue;
144
- }
145
194
  try {
195
+ if (!overwrite && (await fileExists(centralDest))) {
196
+ skippedCount++;
197
+ continue;
198
+ }
146
199
  await copyFile(src, centralDest);
147
200
  copied++;
148
201
  }
@@ -151,11 +204,11 @@ async function installSkillsAsSymlink(baseDir, platform, overwrite, languageSkil
151
204
  console.error(` Failed to copy ${skillRelPath} to central store: ${err.message}`);
152
205
  }
153
206
  }
154
- // Step 2: Create symlink from platform dir to central store
207
+ // Step 2: Create symlinks from platform dir to central store
155
208
  const platformSkillsDir = path.join(baseDir, getPlatformSkillsDir(platform, scope), 'skills');
156
209
  const centralSkillsDir = path.join(centralDir, 'skills');
157
210
  try {
158
- await createSymlink(centralSkillsDir, platformSkillsDir, managedSkillReplacementPaths);
211
+ failedCount += await createSkillsSymlinks(centralSkillsDir, platformSkillsDir, managedSkillReplacementPaths, managedSkillTopLevelEntries);
159
212
  }
160
213
  catch (err) {
161
214
  failedCount++;
@@ -166,12 +219,14 @@ async function installSkillsAsSymlink(baseDir, platform, overwrite, languageSkil
166
219
  const result = await createOpenCodeCommands(baseDir, platform, manifest.skills, overwrite, scope, languageSkillsDir);
167
220
  copied += result.copied;
168
221
  skippedCount += result.skipped;
222
+ failedCount += result.failed;
169
223
  }
170
224
  // Handle Pi platform command extension
171
225
  if (platform.id === 'pi') {
172
226
  const result = await createPiCommandExtension(baseDir, platform, manifest.skills, overwrite, scope);
173
227
  copied += result.copied;
174
228
  skippedCount += result.skipped;
229
+ failedCount += result.failed;
175
230
  }
176
231
  return { copied, skipped: skippedCount, failed: failedCount };
177
232
  }
@@ -196,11 +251,11 @@ async function copyCometSkillsForPlatform(baseDir, platform, overwrite, language
196
251
  const sourceDir = isScript ? 'skills' : languageSkillsDir;
197
252
  const src = path.join(assetsDir, sourceDir, skillRelPath);
198
253
  const dest = path.join(baseDir, getPlatformSkillsDir(platform, scope), 'skills', skillRelPath);
199
- if (!overwrite && (await fileExists(dest))) {
200
- skippedCount++;
201
- continue;
202
- }
203
254
  try {
255
+ if (!overwrite && (await fileExists(dest))) {
256
+ skippedCount++;
257
+ continue;
258
+ }
204
259
  await copyFile(src, dest);
205
260
  copied++;
206
261
  }
@@ -217,11 +272,13 @@ async function copyCometSkillsForPlatform(baseDir, platform, overwrite, language
217
272
  const result = await createOpenCodeCommands(baseDir, platform, manifest.skills, overwrite, scope, languageSkillsDir);
218
273
  copied += result.copied;
219
274
  skippedCount += result.skipped;
275
+ failedCount += result.failed;
220
276
  }
221
277
  if (platform.id === 'pi') {
222
278
  const result = await createPiCommandExtension(baseDir, platform, manifest.skills, overwrite, scope);
223
279
  copied += result.copied;
224
280
  skippedCount += result.skipped;
281
+ failedCount += result.failed;
225
282
  }
226
283
  return { copied, skipped: skippedCount, failed: failedCount };
227
284
  }
@@ -252,37 +309,46 @@ async function createPiCommandExtension(baseDir, platform, skillPaths, overwrite
252
309
  const platformBase = path.join(baseDir, getPlatformSkillsDir(platform, scope));
253
310
  const settingsPath = path.join(platformBase, 'settings.json');
254
311
  const extensionPath = path.join(platformBase, 'extensions', PI_COMMAND_EXTENSION_FILE);
255
- let settings = {};
256
- if (await fileExists(settingsPath)) {
257
- try {
312
+ let copied = 0;
313
+ let skipped = 0;
314
+ let failed = 0;
315
+ try {
316
+ let settings = {};
317
+ if (await fileExists(settingsPath)) {
258
318
  const parsed = JSON.parse(await readFile(settingsPath, 'utf-8'));
259
319
  if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
260
320
  throw new Error('expected a JSON object');
261
321
  }
262
322
  settings = parsed;
263
323
  }
264
- catch (err) {
265
- throw new Error(`Invalid Pi settings at ${settingsPath}: ${err.message}`, {
266
- cause: err,
267
- });
324
+ if (settings.enableSkillCommands !== true) {
325
+ settings.enableSkillCommands = true;
326
+ await ensureDir(path.dirname(settingsPath));
327
+ await writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
328
+ copied++;
268
329
  }
269
330
  }
270
- let copied = 0;
271
- let skipped = 0;
272
- if (settings.enableSkillCommands !== true) {
273
- settings.enableSkillCommands = true;
274
- await ensureDir(path.dirname(settingsPath));
275
- await writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
276
- copied++;
331
+ catch (err) {
332
+ failed++;
333
+ console.error(` Failed to update Pi settings at ${settingsPath}: ${err.message}`);
334
+ }
335
+ if (failed > 0)
336
+ return { copied, skipped, failed };
337
+ try {
338
+ if (!overwrite && (await fileExists(extensionPath))) {
339
+ skipped++;
340
+ }
341
+ else {
342
+ await ensureDir(path.dirname(extensionPath));
343
+ await writeFile(extensionPath, renderPiCommandExtension(getTopLevelSkillNames(skillPaths)), 'utf-8');
344
+ copied++;
345
+ }
277
346
  }
278
- if (!overwrite && (await fileExists(extensionPath))) {
279
- skipped++;
280
- return { copied, skipped };
347
+ catch (err) {
348
+ failed++;
349
+ console.error(` Failed to write Pi command extension at ${extensionPath}: ${err.message}`);
281
350
  }
282
- await ensureDir(path.dirname(extensionPath));
283
- await writeFile(extensionPath, renderPiCommandExtension(getTopLevelSkillNames(skillPaths)), 'utf-8');
284
- copied++;
285
- return { copied, skipped };
351
+ return { copied, skipped, failed };
286
352
  }
287
353
  function stripFrontmatter(content) {
288
354
  if (!content.startsWith('---\n') && !content.startsWith('---\r\n')) {
@@ -297,6 +363,7 @@ function stripFrontmatter(content) {
297
363
  async function createOpenCodeCommands(baseDir, platform, skillPaths, overwrite, scope, languageSkillsDir) {
298
364
  let copied = 0;
299
365
  let skipped = 0;
366
+ let failed = 0;
300
367
  const assetsDir = getAssetsDir();
301
368
  const commandsDir = path.join(baseDir, getPlatformSkillsDir(platform, scope), 'commands');
302
369
  for (const skillPath of skillPaths) {
@@ -305,17 +372,18 @@ async function createOpenCodeCommands(baseDir, platform, skillPaths, overwrite,
305
372
  continue;
306
373
  const skillName = parts[0];
307
374
  const dest = path.join(commandsDir, `${skillName}.md`);
308
- if (!overwrite && (await fileExists(dest))) {
309
- skipped++;
310
- continue;
311
- }
312
- await ensureDir(path.dirname(dest));
313
- let skillSourcePath = path.join(assetsDir, languageSkillsDir, skillPath);
314
- if (!(await fileExists(skillSourcePath))) {
315
- skillSourcePath = path.join(assetsDir, 'skills', skillPath);
316
- }
317
- const skillBody = stripFrontmatter(await readFile(skillSourcePath, 'utf-8'));
318
- const content = `${OPENCODE_COMMAND_HEADER.replace('{skillName}', skillName)}
375
+ try {
376
+ if (!overwrite && (await fileExists(dest))) {
377
+ skipped++;
378
+ continue;
379
+ }
380
+ await ensureDir(path.dirname(dest));
381
+ let skillSourcePath = path.join(assetsDir, languageSkillsDir, skillPath);
382
+ if (!(await fileExists(skillSourcePath))) {
383
+ skillSourcePath = path.join(assetsDir, 'skills', skillPath);
384
+ }
385
+ const skillBody = stripFrontmatter(await readFile(skillSourcePath, 'utf-8'));
386
+ const content = `${OPENCODE_COMMAND_HEADER.replace('{skillName}', skillName)}
319
387
  Equivalent Comet skill: \`${skillName}\`
320
388
  Command name: \`/${skillName}\`
321
389
 
@@ -327,10 +395,15 @@ $ARGUMENTS
327
395
 
328
396
  ${skillBody}
329
397
  `;
330
- await writeFile(dest, content, 'utf-8');
331
- copied++;
398
+ await writeFile(dest, content, 'utf-8');
399
+ copied++;
400
+ }
401
+ catch (err) {
402
+ failed++;
403
+ console.error(` Failed to create OpenCode command ${dest}: ${err.message}`);
404
+ }
332
405
  }
333
- return { copied, skipped };
406
+ return { copied, skipped, failed };
334
407
  }
335
408
  async function readManifest() {
336
409
  const assetsDir = getAssetsDir();
@@ -377,12 +450,12 @@ function selectRulePathsForLanguage(rulePaths, languageId) {
377
450
  }
378
451
  async function copyCometRulesForPlatform(baseDir, platform, overwrite, languageId, scope = 'project') {
379
452
  if (!platform.rulesDir || !platform.rulesFormat) {
380
- return { copied: 0, skipped: 0 };
453
+ return { copied: 0, skipped: 0, failed: 0 };
381
454
  }
382
455
  const manifest = await readManifest();
383
456
  const rulePaths = selectRulePathsForLanguage(manifest.rules ?? [], languageId);
384
457
  if (!rulePaths || rulePaths.length === 0) {
385
- return { copied: 0, skipped: 0 };
458
+ return { copied: 0, skipped: 0, failed: 0 };
386
459
  }
387
460
  const assetsDir = getAssetsDir();
388
461
  // Support platforms whose rules live outside the skills config dir
@@ -394,22 +467,24 @@ async function copyCometRulesForPlatform(baseDir, platform, overwrite, languageI
394
467
  : path.join(baseDir, getPlatformSkillsDir(platform, scope));
395
468
  let copied = 0;
396
469
  let skippedCount = 0;
470
+ let failed = 0;
397
471
  for (const ruleRelPath of rulePaths) {
398
472
  const src = path.join(assetsDir, 'skills', ruleRelPath);
399
- if (!(await fileExists(src))) {
400
- console.error(` Rule source not found: ${ruleRelPath}`);
401
- continue;
402
- }
403
- // Normalize the `.en` infix away so the installed file name is the same
404
- // regardless of which language variant was selected.
405
- const ruleFileName = toRuleBaseName(path.basename(ruleRelPath));
406
- const rulesDestDir = path.join(rulesBase, platform.rulesDir);
407
- const dest = computeRuleDestPath(rulesDestDir, ruleFileName, platform.rulesFormat);
408
- if (!overwrite && (await fileExists(dest))) {
409
- skippedCount++;
410
- continue;
411
- }
412
473
  try {
474
+ if (!(await fileExists(src))) {
475
+ console.error(` Rule source not found: ${ruleRelPath}`);
476
+ failed++;
477
+ continue;
478
+ }
479
+ // Normalize the `.en` infix away so the installed file name is the same
480
+ // regardless of which language variant was selected.
481
+ const ruleFileName = toRuleBaseName(path.basename(ruleRelPath));
482
+ const rulesDestDir = path.join(rulesBase, platform.rulesDir);
483
+ const dest = computeRuleDestPath(rulesDestDir, ruleFileName, platform.rulesFormat);
484
+ if (!overwrite && (await fileExists(dest))) {
485
+ skippedCount++;
486
+ continue;
487
+ }
413
488
  const content = await readFile(src, 'utf-8');
414
489
  await ensureDir(path.dirname(dest));
415
490
  const formatted = formatRuleContent(content, ruleFileName, platform.rulesFormat);
@@ -418,9 +493,10 @@ async function copyCometRulesForPlatform(baseDir, platform, overwrite, languageI
418
493
  }
419
494
  catch (err) {
420
495
  console.error(` Failed to copy rule ${ruleRelPath}: ${err.message}`);
496
+ failed++;
421
497
  }
422
498
  }
423
- return { copied, skipped: skippedCount };
499
+ return { copied, skipped: skippedCount, failed };
424
500
  }
425
501
  function computeRuleDestPath(rulesDestDir, ruleFileName, rulesFormat) {
426
502
  if (rulesFormat === 'mdc') {
@@ -457,47 +533,68 @@ ${content}`;
457
533
  /**
458
534
  * Install Comet hooks for platforms that support them.
459
535
  * Supports multiple hook formats:
460
- * 'claude-code' — settings.local.json with PreToolUse array (Claude Code, Codex, Amazon Q)
536
+ * 'claude-code' — Claude-shaped JSON with PreToolUse array; defaults to settings.local.json,
537
+ * with platform metadata able to override the filename
461
538
  * 'qwen' — settings.json with PreToolUse/hooks array (Qwen Code)
462
539
  * 'qoder' — settings.json with PreToolUse/hooks array (Qoder)
540
+ * 'codebuddy' — settings.json with PreToolUse/hooks array (CodeBuddy Code)
463
541
  * 'gemini' — settings.json with hooks.BeforeTool array (Gemini CLI)
464
542
  * 'windsurf' — hooks.json with pre_write_code array
465
543
  * 'copilot' — hooks/*.json with preToolUse
466
544
  * 'kiro' — hooks/*.kiro.hook JSON files
467
545
  */
468
546
  async function installCometHooksForPlatform(baseDir, platform, scope = 'project') {
469
- if (!platform.supportsHooks || !platform.hookFormat) {
470
- return { installed: false, reason: 'platform does not support hooks' };
547
+ if (!platform.supportsHooks) {
548
+ return { status: 'skipped', reason: 'platform does not support hooks' };
471
549
  }
472
- const manifest = await readManifest();
473
- const hooksConfig = manifest.hooks;
474
- if (!hooksConfig || Object.keys(hooksConfig).length === 0) {
475
- return { installed: false, reason: 'no hooks defined in manifest' };
550
+ if (!platform.hookFormat) {
551
+ return {
552
+ status: 'failed',
553
+ reason: 'hook-capable platform does not declare a hook format',
554
+ };
476
555
  }
477
- const hookFormat = platform.hookFormat;
478
- const skillsDir = getPlatformSkillsDir(platform, scope);
479
- const platformBase = path.join(baseDir, skillsDir);
480
556
  try {
557
+ const manifest = await readManifest();
558
+ const hooksConfig = manifest.hooks;
559
+ if (!hooksConfig || Object.keys(hooksConfig).length === 0) {
560
+ return { status: 'skipped', reason: 'no hooks defined in manifest' };
561
+ }
562
+ const hookFormat = platform.hookFormat;
563
+ const skillsDir = getPlatformSkillsDir(platform, scope);
564
+ const platformBase = path.join(baseDir, getPlatformConfigDir(platform, scope));
481
565
  switch (hookFormat) {
482
- case 'claude-code':
483
- return installClaudeCodeHooks(baseDir, platformBase, skillsDir, hooksConfig);
566
+ case 'claude-code': {
567
+ const result = await installClaudeCodeHooks(baseDir, platformBase, skillsDir, hooksConfig, platform.hookConfigFile ?? 'settings.local.json', platform.name);
568
+ if (result.status === 'installed') {
569
+ for (const legacyFile of platform.legacyHookConfigFiles ?? []) {
570
+ try {
571
+ await removeManagedHooksFromJsonFile(path.join(platformBase, legacyFile), Object.keys(hooksConfig));
572
+ }
573
+ catch {
574
+ // Historical Hook cleanup is best-effort after canonical install succeeds.
575
+ }
576
+ }
577
+ }
578
+ return result;
579
+ }
484
580
  case 'qwen':
485
581
  case 'qoder':
486
- return installQwenStyleHooks(baseDir, platformBase, skillsDir, hooksConfig, hookFormat);
582
+ case 'codebuddy':
583
+ return await installQwenStyleHooks(baseDir, platformBase, skillsDir, hooksConfig, platform.name);
487
584
  case 'gemini':
488
- return installGeminiHooks(baseDir, platformBase, skillsDir, hooksConfig);
585
+ return await installGeminiHooks(baseDir, platformBase, skillsDir, hooksConfig, platform.name);
489
586
  case 'windsurf':
490
- return installWindsurfHooks(baseDir, platformBase, skillsDir, hooksConfig);
587
+ return await installWindsurfHooks(baseDir, platformBase, skillsDir, hooksConfig, platform.name);
491
588
  case 'copilot':
492
- return installCopilotHooks(baseDir, platformBase, skillsDir, hooksConfig);
589
+ return await installCopilotHooks(baseDir, platformBase, skillsDir, hooksConfig);
493
590
  case 'kiro':
494
- return installKiroHooks(baseDir, platformBase, skillsDir, hooksConfig);
591
+ return await installKiroHooks(baseDir, platformBase, skillsDir, hooksConfig);
495
592
  default:
496
- return { installed: false, reason: `unsupported hook format: ${hookFormat}` };
593
+ return { status: 'failed', reason: `unsupported hook format: ${hookFormat}` };
497
594
  }
498
595
  }
499
596
  catch (err) {
500
- return { installed: false, reason: err.message };
597
+ return { status: 'failed', reason: err.message };
501
598
  }
502
599
  }
503
600
  function quoteCommandArg(value) {
@@ -509,34 +606,96 @@ function buildHookCommand(baseDir, skillsDir, scriptRelPath) {
509
606
  const scriptPath = path.join(projectRoot, skillsDir, 'skills', ...scriptRelPath.split('/'));
510
607
  return `node ${quoteCommandArg(scriptPath)} --project-root ${quoteCommandArg(projectRoot)}`;
511
608
  }
609
+ function parseCommandTokens(command) {
610
+ const tokens = [];
611
+ let current = '';
612
+ let quote;
613
+ let tokenStarted = false;
614
+ let quoteClosed = false;
615
+ for (let index = 0; index < command.length; index++) {
616
+ const character = command[index];
617
+ if (quote) {
618
+ if (character === quote) {
619
+ quote = undefined;
620
+ quoteClosed = true;
621
+ }
622
+ else if (character === '\\' && command[index + 1] === quote) {
623
+ current += quote;
624
+ index++;
625
+ }
626
+ else {
627
+ current += character;
628
+ }
629
+ continue;
630
+ }
631
+ if (character === '\r' || character === '\n' || ';|&<>`'.includes(character)) {
632
+ return undefined;
633
+ }
634
+ if (/\s/u.test(character)) {
635
+ if (tokenStarted) {
636
+ tokens.push(current);
637
+ current = '';
638
+ tokenStarted = false;
639
+ quoteClosed = false;
640
+ }
641
+ continue;
642
+ }
643
+ if (quoteClosed)
644
+ return undefined;
645
+ if (character === '"' || character === "'") {
646
+ if (tokenStarted)
647
+ return undefined;
648
+ quote = character;
649
+ tokenStarted = true;
650
+ continue;
651
+ }
652
+ current += character;
653
+ tokenStarted = true;
654
+ }
655
+ if (quote)
656
+ return undefined;
657
+ if (tokenStarted)
658
+ tokens.push(current);
659
+ return tokens;
660
+ }
512
661
  function isManagedHookCommand(command, scriptRelPaths) {
513
662
  if (typeof command !== 'string')
514
663
  return false;
515
664
  // Match both the current `node .../comet-hook-guard.mjs` form and the legacy
516
665
  // `bash .../comet-hook-guard.sh` form so uninstall also cleans up hooks
517
666
  // written by older Comet releases. Compare basenames without extension.
518
- const commandPath = command
519
- .trim()
520
- .match(/^(?:node|bash|sh)\s+["']?([^"'\s]+)["']?(?:\s|$)/)?.[1]
521
- ?.replace(/\\/g, '/');
522
- if (!commandPath)
667
+ const tokens = parseCommandTokens(command.trim());
668
+ if (!tokens || tokens.length < 2 || !['node', 'bash', 'sh'].includes(tokens[0]))
523
669
  return false;
670
+ const commandPath = tokens[1].replace(/\\/g, '/');
524
671
  const normalize = (value) => value.replace(/\.(?:sh|mjs)$/u, '');
525
672
  return scriptRelPaths.some((scriptRelPath) => normalize(commandPath).endsWith(`/skills/${normalize(scriptRelPath.replace(/\\/g, '/'))}`));
526
673
  }
527
674
  function mergeHookGroups(existingGroups, newGroups, scriptRelPaths) {
528
- const mergedGroups = existingGroups.flatMap((group) => {
529
- if (!Array.isArray(group.hooks))
530
- return [group];
531
- const hooks = group.hooks.filter((hook) => !isManagedHookCommand(hook.command, scriptRelPaths));
532
- if (hooks.length === 0 && group.hooks.length > 0)
533
- return [];
534
- return [{ ...group, hooks }];
675
+ const mergedGroups = existingGroups.map((group) => {
676
+ if (!group || typeof group !== 'object' || Array.isArray(group))
677
+ return group;
678
+ const record = group;
679
+ if (!Array.isArray(record.hooks))
680
+ return record;
681
+ const hooks = record.hooks.filter((hook) => {
682
+ const command = hook && typeof hook === 'object' ? hook.command : undefined;
683
+ return !isManagedHookCommand(command, scriptRelPaths);
684
+ });
685
+ return { ...record, hooks };
535
686
  });
536
687
  for (const newGroup of newGroups) {
537
- const existingGroup = mergedGroups.find((group) => group.matcher === newGroup.matcher && Array.isArray(group.hooks));
538
- if (existingGroup) {
539
- existingGroup.hooks = [...existingGroup.hooks, ...newGroup.hooks];
688
+ const existingGroupIndex = mergedGroups.findIndex((group) => Boolean(group) &&
689
+ typeof group === 'object' &&
690
+ !Array.isArray(group) &&
691
+ group.matcher === newGroup.matcher &&
692
+ Array.isArray(group.hooks));
693
+ if (existingGroupIndex >= 0) {
694
+ const existingGroup = mergedGroups[existingGroupIndex];
695
+ mergedGroups[existingGroupIndex] = {
696
+ ...existingGroup,
697
+ hooks: [...existingGroup.hooks, ...newGroup.hooks],
698
+ };
540
699
  }
541
700
  else {
542
701
  mergedGroups.push(newGroup);
@@ -552,12 +711,77 @@ function mergeHookGroups(existingGroups, newGroups, scriptRelPaths) {
552
711
  function asHookGroup(value) {
553
712
  return Array.isArray(value) ? value : [];
554
713
  }
714
+ async function removeManagedHooksFromJsonFile(settingsPath, scriptRelPaths) {
715
+ if (!(await fileExists(settingsPath)))
716
+ return { removed: 0, failed: 0 };
717
+ let source;
718
+ try {
719
+ source = await readFile(settingsPath, 'utf-8');
720
+ }
721
+ catch {
722
+ return { removed: 0, failed: 1 };
723
+ }
724
+ let settings;
725
+ try {
726
+ const parsed = JSON.parse(source);
727
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
728
+ return { removed: 0, failed: 1 };
729
+ }
730
+ settings = parsed;
731
+ }
732
+ catch {
733
+ return { removed: 0, failed: 1 };
734
+ }
735
+ const existingHooks = settings.hooks;
736
+ const existingPreToolUse = existingHooks?.PreToolUse;
737
+ if (!existingHooks || !Array.isArray(existingPreToolUse)) {
738
+ return { removed: 0, failed: 0 };
739
+ }
740
+ let removed = 0;
741
+ const filtered = existingPreToolUse.map((group) => {
742
+ if (!group || typeof group !== 'object')
743
+ return group;
744
+ const record = group;
745
+ if (!Array.isArray(record.hooks))
746
+ return record;
747
+ const handlers = record.hooks.filter((handler) => {
748
+ const command = handler && typeof handler === 'object'
749
+ ? handler.command
750
+ : undefined;
751
+ const managed = isManagedHookCommand(command, scriptRelPaths);
752
+ if (managed)
753
+ removed++;
754
+ return !managed;
755
+ });
756
+ return { ...record, hooks: handlers };
757
+ });
758
+ if (removed === 0)
759
+ return { removed: 0, failed: 0 };
760
+ existingHooks.PreToolUse = filtered;
761
+ try {
762
+ await writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
763
+ }
764
+ catch {
765
+ return { removed: 0, failed: 1 };
766
+ }
767
+ return { removed, failed: 0 };
768
+ }
769
+ async function readSettingsJsonObject(settingsPath, platformName) {
770
+ const result = await readJsonObjectFile(settingsPath);
771
+ if (result.status === 'missing')
772
+ return {};
773
+ if (result.status === 'present')
774
+ return result.value;
775
+ throw new Error(`Invalid ${platformName} settings at ${settingsPath}: ${result.error.message}`, {
776
+ cause: result.error,
777
+ });
778
+ }
555
779
  /**
556
- * Claude Code, Codex, Amazon Q format:
557
- * Writes to settings.local.json with { hooks: { PreToolUse: [...] } }
780
+ * Claude-shaped JSON format used by Claude Code, Codex, and Amazon Q.
781
+ * Defaults to settings.local.json; platform metadata may override the filename.
558
782
  */
559
- async function installClaudeCodeHooks(baseDir, platformBase, skillsDir, hooksConfig) {
560
- const settingsPath = path.join(platformBase, 'settings.local.json');
783
+ async function installClaudeCodeHooks(baseDir, platformBase, skillsDir, hooksConfig, configFile, platformName) {
784
+ const settingsPath = path.join(platformBase, configFile);
561
785
  // Group by matcher so hooks sharing the same matcher are merged
562
786
  const matcherGroups = {};
563
787
  for (const [scriptRelPath, config] of Object.entries(hooksConfig)) {
@@ -568,28 +792,20 @@ async function installClaudeCodeHooks(baseDir, platformBase, skillsDir, hooksCon
568
792
  matcherGroups[config.matcher].push({ type: 'command', command });
569
793
  }
570
794
  const newEntries = Object.entries(matcherGroups).map(([matcher, hooks]) => ({ matcher, hooks }));
571
- let settings = {};
572
- if (await fileExists(settingsPath)) {
573
- try {
574
- settings = JSON.parse(await readFile(settingsPath, 'utf-8'));
575
- }
576
- catch {
577
- settings = {};
578
- }
579
- }
795
+ const settings = await readSettingsJsonObject(settingsPath, platformName);
580
796
  const existingHooks = settings.hooks ?? {};
581
797
  const existingPreToolUse = asHookGroup(existingHooks.PreToolUse);
582
798
  const merged = mergeHookGroups(existingPreToolUse, newEntries, Object.keys(hooksConfig));
583
799
  settings.hooks = { ...existingHooks, PreToolUse: merged };
584
800
  await ensureDir(path.dirname(settingsPath));
585
801
  await writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
586
- return { installed: true };
802
+ return { status: 'installed' };
587
803
  }
588
804
  /**
589
- * Qwen Code / Qoder format:
805
+ * Qwen Code / Qoder / CodeBuddy format:
590
806
  * Writes to settings.json with { hooks: { PreToolUse: [{ matcher, hooks: [{ type, command }] }] } }
591
807
  */
592
- async function installQwenStyleHooks(baseDir, platformBase, skillsDir, hooksConfig, _hookFormat) {
808
+ async function installQwenStyleHooks(baseDir, platformBase, skillsDir, hooksConfig, platformName) {
593
809
  const settingsPath = path.join(platformBase, 'settings.json');
594
810
  // Group by matcher
595
811
  const matcherGroups = {};
@@ -607,28 +823,20 @@ async function installQwenStyleHooks(baseDir, platformBase, skillsDir, hooksConf
607
823
  matcher,
608
824
  hooks,
609
825
  }));
610
- let settings = {};
611
- if (await fileExists(settingsPath)) {
612
- try {
613
- settings = JSON.parse(await readFile(settingsPath, 'utf-8'));
614
- }
615
- catch {
616
- settings = {};
617
- }
618
- }
826
+ const settings = await readSettingsJsonObject(settingsPath, platformName);
619
827
  const existingHooks = settings.hooks ?? {};
620
828
  const existingPreToolUse = asHookGroup(existingHooks.PreToolUse);
621
829
  const merged = mergeHookGroups(existingPreToolUse, preToolUseEntries, Object.keys(hooksConfig));
622
830
  settings.hooks = { ...existingHooks, PreToolUse: merged };
623
831
  await ensureDir(path.dirname(settingsPath));
624
832
  await writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
625
- return { installed: true };
833
+ return { status: 'installed' };
626
834
  }
627
835
  /**
628
836
  * Gemini CLI format:
629
837
  * Writes to .gemini/settings.json with { hooks: { BeforeTool: [{ matcher, hooks: [{ type, command }] }] } }
630
838
  */
631
- async function installGeminiHooks(baseDir, platformBase, skillsDir, hooksConfig) {
839
+ async function installGeminiHooks(baseDir, platformBase, skillsDir, hooksConfig, platformName) {
632
840
  const settingsPath = path.join(platformBase, 'settings.json');
633
841
  const entries = [];
634
842
  for (const [scriptRelPath, config] of Object.entries(hooksConfig)) {
@@ -643,28 +851,20 @@ async function installGeminiHooks(baseDir, platformBase, skillsDir, hooksConfig)
643
851
  ],
644
852
  });
645
853
  }
646
- let settings = {};
647
- if (await fileExists(settingsPath)) {
648
- try {
649
- settings = JSON.parse(await readFile(settingsPath, 'utf-8'));
650
- }
651
- catch {
652
- settings = {};
653
- }
654
- }
854
+ const settings = await readSettingsJsonObject(settingsPath, platformName);
655
855
  const existingHooks = settings.hooks ?? {};
656
856
  const existingBeforeTool = asHookGroup(existingHooks.BeforeTool);
657
857
  const merged = mergeHookGroups(existingBeforeTool, entries, Object.keys(hooksConfig));
658
858
  settings.hooks = { ...existingHooks, BeforeTool: merged };
659
859
  await ensureDir(path.dirname(settingsPath));
660
860
  await writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
661
- return { installed: true };
861
+ return { status: 'installed' };
662
862
  }
663
863
  /**
664
864
  * Windsurf format:
665
865
  * Writes to .windsurf/hooks.json with { hooks: { pre_write_code: [{ command }] } }
666
866
  */
667
- async function installWindsurfHooks(baseDir, platformBase, skillsDir, hooksConfig) {
867
+ async function installWindsurfHooks(baseDir, platformBase, skillsDir, hooksConfig, platformName) {
668
868
  const hooksPath = path.join(platformBase, 'hooks.json');
669
869
  const entries = [];
670
870
  for (const [scriptRelPath] of Object.entries(hooksConfig)) {
@@ -673,23 +873,18 @@ async function installWindsurfHooks(baseDir, platformBase, skillsDir, hooksConfi
673
873
  show_output: true,
674
874
  });
675
875
  }
676
- let hooksFile = {};
677
- if (await fileExists(hooksPath)) {
678
- try {
679
- hooksFile = JSON.parse(await readFile(hooksPath, 'utf-8'));
680
- }
681
- catch {
682
- hooksFile = {};
683
- }
684
- }
876
+ const hooksFile = await readSettingsJsonObject(hooksPath, platformName);
685
877
  const existingHooks = hooksFile.hooks ?? {};
686
878
  const existingPreWrite = asHookGroup(existingHooks.pre_write_code);
687
- const merged = existingPreWrite.filter((entry) => !isManagedHookCommand(entry.command, Object.keys(hooksConfig)));
879
+ const merged = existingPreWrite.filter((entry) => {
880
+ const command = entry && typeof entry === 'object' ? entry.command : undefined;
881
+ return !isManagedHookCommand(command, Object.keys(hooksConfig));
882
+ });
688
883
  merged.push(...entries);
689
884
  hooksFile.hooks = { ...existingHooks, pre_write_code: merged };
690
885
  await ensureDir(path.dirname(hooksPath));
691
886
  await writeFile(hooksPath, JSON.stringify(hooksFile, null, 2) + '\n', 'utf-8');
692
- return { installed: true };
887
+ return { status: 'installed' };
693
888
  }
694
889
  /**
695
890
  * GitHub Copilot format:
@@ -712,7 +907,7 @@ async function installCopilotHooks(baseDir, platformBase, skillsDir, hooksConfig
712
907
  };
713
908
  await ensureDir(hooksDir);
714
909
  await writeFile(hookFilePath, JSON.stringify(hookConfig, null, 2) + '\n', 'utf-8');
715
- return { installed: true };
910
+ return { status: 'installed' };
716
911
  }
717
912
  /**
718
913
  * Kiro format:
@@ -742,7 +937,7 @@ async function installKiroHooks(baseDir, platformBase, skillsDir, hooksConfig) {
742
937
  await ensureDir(hooksDir);
743
938
  await writeFile(hookFilePath, JSON.stringify(hookConfig, null, 2) + '\n', 'utf-8');
744
939
  }
745
- return { installed: true };
940
+ return { status: 'installed' };
746
941
  }
747
942
  function managedConfigFields(language = 'en') {
748
943
  const artifactLanguage = resolveArtifactLanguage(language);
@@ -780,13 +975,20 @@ function parseProjectConfigOverrides(content) {
780
975
  }
781
976
  return out;
782
977
  }
783
- function renderProjectConfig(existing, language = 'en') {
978
+ // `language` is null when the caller has no definitive language selection to assert (e.g.
979
+ // multiple platforms in the same scope disagree and no --language flag was given) — in that
980
+ // case the existing config's language is preserved, falling back to 'en' only when absent.
981
+ // A non-null language always overwrites the managed `language` field: init/update pass it
982
+ // specifically to persist the language the user just selected/installed.
983
+ function renderProjectConfig(existing, language = null) {
984
+ const resolvedLanguage = language ?? existing.language ?? 'en';
784
985
  const lines = [];
785
- const fields = getManagedConfigFields(language);
986
+ const fields = getManagedConfigFields(resolvedLanguage);
786
987
  const managed = new Set(fields.map((f) => f.key));
787
988
  for (const f of fields) {
788
989
  lines.push(f.comment);
789
- lines.push(`${f.key}: ${existing[f.key] ?? f.def}`);
990
+ const value = f.key === 'language' ? resolvedLanguage : (existing[f.key] ?? f.def);
991
+ lines.push(`${f.key}: ${value}`);
790
992
  }
791
993
  for (const [k, v] of Object.entries(existing)) {
792
994
  if (!managed.has(k))
@@ -795,7 +997,7 @@ function renderProjectConfig(existing, language = 'en') {
795
997
  lines.push('');
796
998
  return lines.join('\n');
797
999
  }
798
- async function mergeProjectConfig(projectPath, language = 'en') {
1000
+ async function mergeProjectConfig(projectPath, language = null) {
799
1001
  const configPath = path.join(projectPath, '.comet', 'config.yaml');
800
1002
  let existing = {};
801
1003
  if (await fileExists(configPath)) {
@@ -814,6 +1016,7 @@ async function createWorkingDirs(projectPath, language = 'en') {
814
1016
  await ensureDir(dir);
815
1017
  }
816
1018
  await mergeProjectConfig(projectPath, language);
1019
+ await installCometProjectInstructions(projectPath, language === 'zh-CN' ? 'zh' : 'en');
817
1020
  }
818
- export { copyCometSkillsForPlatform, copyCometRulesForPlatform, installCometHooksForPlatform, readManifest, getManagedSkillPaths, getManifestSkills, getUserFacingSkillNames, createWorkingDirs, getAssetsDir, computeRuleDestPath, formatRuleContent, isManagedHookCommand, planSkillDirectoryCopy, mergeProjectConfig, parseProjectConfigOverrides, renderProjectConfig, getCentralSkillsDir, installSkillsAsSymlink, };
1021
+ export { copyCometSkillsForPlatform, copyCometRulesForPlatform, installCometHooksForPlatform, readManifest, getManagedSkillPaths, getManifestSkills, getUserFacingSkillNames, createWorkingDirs, getAssetsDir, computeRuleDestPath, formatRuleContent, isManagedHookCommand, buildHookCommand, removeManagedHooksFromJsonFile, planSkillDirectoryCopy, mergeProjectConfig, parseProjectConfigOverrides, renderProjectConfig, getCentralSkillsDir, installSkillsAsSymlink, };
819
1022
  //# sourceMappingURL=platform-install.js.map