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

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 (508) hide show
  1. package/README.md +10 -0
  2. package/assets/manifest.json +2 -1
  3. package/assets/skills/comet/SKILL.md +25 -1
  4. package/assets/skills/comet/reference/comet-yaml-fields.md +5 -2
  5. package/assets/skills/comet/reference/context-recovery.md +10 -0
  6. package/assets/skills/comet/reference/scripts.md +47 -15
  7. package/assets/skills/comet/rules/comet-phase-guard.en.md +8 -0
  8. package/assets/skills/comet/rules/comet-phase-guard.md +9 -1
  9. package/assets/skills/comet/scripts/comet-resume-probe.mjs +3 -0
  10. package/assets/skills/comet/scripts/comet-runtime.mjs +1387 -424
  11. package/assets/skills/comet-archive/SKILL.md +24 -11
  12. package/assets/skills/comet-build/SKILL.md +42 -25
  13. package/assets/skills/comet-design/SKILL.md +1 -0
  14. package/assets/skills/comet-hotfix/SKILL.md +3 -1
  15. package/assets/skills/comet-open/SKILL.md +11 -1
  16. package/assets/skills/comet-tweak/SKILL.md +3 -1
  17. package/assets/skills/comet-verify/SKILL.md +29 -20
  18. package/assets/skills-zh/comet/SKILL.md +25 -1
  19. package/assets/skills-zh/comet/reference/comet-yaml-fields.md +5 -2
  20. package/assets/skills-zh/comet/reference/context-recovery.md +10 -0
  21. package/assets/skills-zh/comet/reference/scripts.md +47 -15
  22. package/assets/skills-zh/comet-archive/SKILL.md +24 -11
  23. package/assets/skills-zh/comet-build/SKILL.md +42 -25
  24. package/assets/skills-zh/comet-design/SKILL.md +1 -0
  25. package/assets/skills-zh/comet-hotfix/SKILL.md +3 -1
  26. package/assets/skills-zh/comet-open/SKILL.md +11 -1
  27. package/assets/skills-zh/comet-tweak/SKILL.md +3 -1
  28. package/assets/skills-zh/comet-verify/SKILL.md +30 -21
  29. package/dist/app/cli/comet-banner.d.ts +25 -0
  30. package/dist/app/cli/comet-banner.d.ts.map +1 -0
  31. package/dist/app/cli/comet-banner.js +265 -0
  32. package/dist/app/cli/comet-banner.js.map +1 -0
  33. package/dist/app/cli/index.js +36 -2
  34. package/dist/app/cli/index.js.map +1 -1
  35. package/dist/app/commands/classic.d.ts +4 -0
  36. package/dist/app/commands/classic.d.ts.map +1 -0
  37. package/dist/app/commands/classic.js +11 -0
  38. package/dist/app/commands/classic.js.map +1 -0
  39. package/dist/app/commands/doctor.d.ts.map +1 -1
  40. package/dist/app/commands/doctor.js +39 -24
  41. package/dist/app/commands/doctor.js.map +1 -1
  42. package/dist/app/commands/eval.d.ts.map +1 -1
  43. package/dist/app/commands/eval.js +57 -20
  44. package/dist/app/commands/eval.js.map +1 -1
  45. package/dist/app/commands/i18n.d.ts +1 -1
  46. package/dist/app/commands/i18n.d.ts.map +1 -1
  47. package/dist/app/commands/i18n.js +12 -4
  48. package/dist/app/commands/i18n.js.map +1 -1
  49. package/dist/app/commands/init.d.ts.map +1 -1
  50. package/dist/app/commands/init.js +16 -13
  51. package/dist/app/commands/init.js.map +1 -1
  52. package/dist/app/commands/project-scope-selection.d.ts +13 -0
  53. package/dist/app/commands/project-scope-selection.d.ts.map +1 -0
  54. package/dist/app/commands/project-scope-selection.js +33 -0
  55. package/dist/app/commands/project-scope-selection.js.map +1 -0
  56. package/dist/app/commands/resume-probe.d.ts +11 -0
  57. package/dist/app/commands/resume-probe.d.ts.map +1 -0
  58. package/dist/app/commands/resume-probe.js +63 -0
  59. package/dist/app/commands/resume-probe.js.map +1 -0
  60. package/dist/app/commands/status.d.ts +31 -0
  61. package/dist/app/commands/status.d.ts.map +1 -1
  62. package/dist/app/commands/status.js +109 -20
  63. package/dist/app/commands/status.js.map +1 -1
  64. package/dist/app/commands/uninstall.d.ts +2 -0
  65. package/dist/app/commands/uninstall.d.ts.map +1 -1
  66. package/dist/app/commands/uninstall.js +217 -40
  67. package/dist/app/commands/uninstall.js.map +1 -1
  68. package/dist/app/commands/update.d.ts +6 -0
  69. package/dist/app/commands/update.d.ts.map +1 -1
  70. package/dist/app/commands/update.js +361 -68
  71. package/dist/app/commands/update.js.map +1 -1
  72. package/dist/config/repository-layout.json +4 -2
  73. package/dist/domains/bundle/bundle-platform.d.ts.map +1 -1
  74. package/dist/domains/bundle/bundle-platform.js +3 -1
  75. package/dist/domains/bundle/bundle-platform.js.map +1 -1
  76. package/dist/domains/bundle/eval-manifest-runtime.d.ts +6 -0
  77. package/dist/domains/bundle/eval-manifest-runtime.d.ts.map +1 -0
  78. package/dist/domains/bundle/eval-manifest-runtime.js +58 -0
  79. package/dist/domains/bundle/eval-manifest-runtime.js.map +1 -0
  80. package/dist/domains/bundle/types.d.ts +1 -1
  81. package/dist/domains/bundle/types.d.ts.map +1 -1
  82. package/dist/domains/comet-classic/classic-archive.d.ts +1 -0
  83. package/dist/domains/comet-classic/classic-archive.d.ts.map +1 -1
  84. package/dist/domains/comet-classic/classic-archive.js +35 -38
  85. package/dist/domains/comet-classic/classic-archive.js.map +1 -1
  86. package/dist/domains/comet-classic/classic-cli.d.ts +1 -1
  87. package/dist/domains/comet-classic/classic-cli.d.ts.map +1 -1
  88. package/dist/domains/comet-classic/classic-cli.js +3 -0
  89. package/dist/domains/comet-classic/classic-cli.js.map +1 -1
  90. package/dist/domains/comet-classic/classic-command-checks.d.ts +20 -0
  91. package/dist/domains/comet-classic/classic-command-checks.d.ts.map +1 -0
  92. package/dist/domains/comet-classic/classic-command-checks.js +97 -0
  93. package/dist/domains/comet-classic/classic-command-checks.js.map +1 -0
  94. package/dist/domains/comet-classic/classic-current-change.d.ts +19 -0
  95. package/dist/domains/comet-classic/classic-current-change.d.ts.map +1 -0
  96. package/dist/domains/comet-classic/classic-current-change.js +132 -0
  97. package/dist/domains/comet-classic/classic-current-change.js.map +1 -0
  98. package/dist/domains/comet-classic/classic-diagnostics.d.ts +2 -1
  99. package/dist/domains/comet-classic/classic-diagnostics.d.ts.map +1 -1
  100. package/dist/domains/comet-classic/classic-diagnostics.js +54 -1
  101. package/dist/domains/comet-classic/classic-diagnostics.js.map +1 -1
  102. package/dist/domains/comet-classic/classic-evidence.d.ts.map +1 -1
  103. package/dist/domains/comet-classic/classic-evidence.js +4 -0
  104. package/dist/domains/comet-classic/classic-evidence.js.map +1 -1
  105. package/dist/domains/comet-classic/classic-guard.d.ts.map +1 -1
  106. package/dist/domains/comet-classic/classic-guard.js +68 -69
  107. package/dist/domains/comet-classic/classic-guard.js.map +1 -1
  108. package/dist/domains/comet-classic/classic-hook-guard.d.ts.map +1 -1
  109. package/dist/domains/comet-classic/classic-hook-guard.js +66 -23
  110. package/dist/domains/comet-classic/classic-hook-guard.js.map +1 -1
  111. package/dist/domains/comet-classic/classic-project-config.d.ts +16 -0
  112. package/dist/domains/comet-classic/classic-project-config.d.ts.map +1 -0
  113. package/dist/domains/comet-classic/classic-project-config.js +40 -0
  114. package/dist/domains/comet-classic/classic-project-config.js.map +1 -0
  115. package/dist/domains/comet-classic/classic-resolver.d.ts.map +1 -1
  116. package/dist/domains/comet-classic/classic-resolver.js +3 -3
  117. package/dist/domains/comet-classic/classic-resolver.js.map +1 -1
  118. package/dist/domains/comet-classic/classic-resume-probe-command.d.ts +3 -0
  119. package/dist/domains/comet-classic/classic-resume-probe-command.d.ts.map +1 -0
  120. package/dist/domains/comet-classic/classic-resume-probe-command.js +58 -0
  121. package/dist/domains/comet-classic/classic-resume-probe-command.js.map +1 -0
  122. package/dist/domains/comet-classic/classic-resume-probe-entry.d.ts +2 -0
  123. package/dist/domains/comet-classic/classic-resume-probe-entry.d.ts.map +1 -0
  124. package/dist/domains/comet-classic/classic-resume-probe-entry.js +4 -0
  125. package/dist/domains/comet-classic/classic-resume-probe-entry.js.map +1 -0
  126. package/dist/domains/comet-classic/classic-resume-probe.d.ts +29 -0
  127. package/dist/domains/comet-classic/classic-resume-probe.d.ts.map +1 -0
  128. package/dist/domains/comet-classic/classic-resume-probe.js +386 -0
  129. package/dist/domains/comet-classic/classic-resume-probe.js.map +1 -0
  130. package/dist/domains/comet-classic/classic-runtime-run.d.ts +2 -1
  131. package/dist/domains/comet-classic/classic-runtime-run.d.ts.map +1 -1
  132. package/dist/domains/comet-classic/classic-runtime-run.js +38 -0
  133. package/dist/domains/comet-classic/classic-runtime-run.js.map +1 -1
  134. package/dist/domains/comet-classic/classic-state-command.d.ts.map +1 -1
  135. package/dist/domains/comet-classic/classic-state-command.js +128 -12
  136. package/dist/domains/comet-classic/classic-state-command.js.map +1 -1
  137. package/dist/domains/comet-classic/classic-state.d.ts +3 -1
  138. package/dist/domains/comet-classic/classic-state.d.ts.map +1 -1
  139. package/dist/domains/comet-classic/classic-state.js +4 -0
  140. package/dist/domains/comet-classic/classic-state.js.map +1 -1
  141. package/dist/domains/comet-classic/classic-store.d.ts +4 -1
  142. package/dist/domains/comet-classic/classic-store.d.ts.map +1 -1
  143. package/dist/domains/comet-classic/classic-store.js +4 -3
  144. package/dist/domains/comet-classic/classic-store.js.map +1 -1
  145. package/dist/domains/comet-classic/classic-transitions.d.ts +1 -1
  146. package/dist/domains/comet-classic/classic-transitions.d.ts.map +1 -1
  147. package/dist/domains/comet-classic/classic-transitions.js +20 -1
  148. package/dist/domains/comet-classic/classic-transitions.js.map +1 -1
  149. package/dist/domains/comet-classic/classic-validate-command.d.ts.map +1 -1
  150. package/dist/domains/comet-classic/classic-validate-command.js +1 -0
  151. package/dist/domains/comet-classic/classic-validate-command.js.map +1 -1
  152. package/dist/domains/comet-classic/index.d.ts +3 -0
  153. package/dist/domains/comet-classic/index.d.ts.map +1 -1
  154. package/dist/domains/comet-classic/index.js +3 -0
  155. package/dist/domains/comet-classic/index.js.map +1 -1
  156. package/dist/domains/dashboard/collector.js +10 -2
  157. package/dist/domains/dashboard/collector.js.map +1 -1
  158. package/dist/domains/dashboard/web/assets/{index-CjU3VXVu.js → index-CIvN-PL8.js} +11 -11
  159. package/dist/domains/dashboard/web/assets/{index-BcO3_QlT.css → index-DcyRPBnT.css} +1 -1
  160. package/dist/domains/dashboard/web/index.html +2 -2
  161. package/dist/domains/engine/types.d.ts +1 -1
  162. package/dist/domains/engine/types.d.ts.map +1 -1
  163. package/dist/domains/integrations/openspec.d.ts.map +1 -1
  164. package/dist/domains/integrations/openspec.js +6 -6
  165. package/dist/domains/integrations/openspec.js.map +1 -1
  166. package/dist/domains/skill/find.d.ts.map +1 -1
  167. package/dist/domains/skill/find.js +1 -6
  168. package/dist/domains/skill/find.js.map +1 -1
  169. package/dist/domains/skill/managed-markdown.d.ts +14 -0
  170. package/dist/domains/skill/managed-markdown.d.ts.map +1 -0
  171. package/dist/domains/skill/managed-markdown.js +126 -0
  172. package/dist/domains/skill/managed-markdown.js.map +1 -0
  173. package/dist/domains/skill/platform-install.d.ts +4 -3
  174. package/dist/domains/skill/platform-install.d.ts.map +1 -1
  175. package/dist/domains/skill/platform-install.js +96 -26
  176. package/dist/domains/skill/platform-install.js.map +1 -1
  177. package/dist/domains/skill/project-instructions.d.ts +22 -0
  178. package/dist/domains/skill/project-instructions.d.ts.map +1 -0
  179. package/dist/domains/skill/project-instructions.js +61 -0
  180. package/dist/domains/skill/project-instructions.js.map +1 -0
  181. package/dist/domains/skill/uninstall.d.ts +3 -1
  182. package/dist/domains/skill/uninstall.d.ts.map +1 -1
  183. package/dist/domains/skill/uninstall.js +86 -39
  184. package/dist/domains/skill/uninstall.js.map +1 -1
  185. package/dist/platform/install/detect.d.ts +2 -1
  186. package/dist/platform/install/detect.d.ts.map +1 -1
  187. package/dist/platform/install/detect.js +10 -1
  188. package/dist/platform/install/detect.js.map +1 -1
  189. package/dist/platform/install/platforms.d.ts +5 -1
  190. package/dist/platform/install/platforms.d.ts.map +1 -1
  191. package/dist/platform/install/platforms.js +21 -4
  192. package/dist/platform/install/platforms.js.map +1 -1
  193. package/dist/platform/install/project-registry.d.ts +37 -0
  194. package/dist/platform/install/project-registry.d.ts.map +1 -0
  195. package/dist/platform/install/project-registry.js +205 -0
  196. package/dist/platform/install/project-registry.js.map +1 -0
  197. package/eval/.env +28 -0
  198. package/eval/.env.example +52 -0
  199. package/eval/CLAUDE.md +43 -0
  200. package/eval/README.md +538 -0
  201. package/eval/langsmith/.env.example +16 -0
  202. package/eval/langsmith/README.md +93 -0
  203. package/eval/langsmith/skills/README.md +5 -0
  204. package/eval/langsmith/tasks/README.md +5 -0
  205. package/eval/langsmith/tests/conftest.py +187 -0
  206. package/eval/langsmith/tests/tasks/test_tasks.py +287 -0
  207. package/eval/langsmith/treatments/README.md +5 -0
  208. package/eval/local/README.md +80 -0
  209. package/eval/local/regression_baseline.json +13 -0
  210. package/eval/local/report-style-demo-assets/quality_cost.en.svg +41 -0
  211. package/eval/local/report-style-demo-assets/quality_cost.zh.svg +41 -0
  212. package/eval/local/report-style-demo-assets/rubric_delta.en.svg +56 -0
  213. package/eval/local/report-style-demo-assets/rubric_delta.zh.svg +56 -0
  214. package/eval/local/report-style-demo-assets/task_outcomes.en.svg +46 -0
  215. package/eval/local/report-style-demo-assets/task_outcomes.zh.svg +46 -0
  216. package/eval/local/report-style-demo.html +867 -0
  217. package/eval/local/scripts/compare_baselines.py +1018 -0
  218. package/eval/local/scripts/generate_report_style_demo_charts.py +322 -0
  219. package/eval/local/scripts/regression_check.py +171 -0
  220. package/eval/local/scripts/render_readme_benchmark_figures.py +416 -0
  221. package/eval/local/scripts/rescore_rubric.py +120 -0
  222. package/eval/local/skills/benchmarks/039-release/comet-classic-039/SKILL.md +282 -0
  223. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/auto-transition.md +27 -0
  224. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/comet-yaml-fields.md +68 -0
  225. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/context-recovery.md +35 -0
  226. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/debug-gate.md +17 -0
  227. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/decision-point.md +20 -0
  228. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/dirty-worktree.md +59 -0
  229. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/file-structure.md +28 -0
  230. package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/subagent-dispatch.md +113 -0
  231. package/eval/local/skills/benchmarks/039-release/comet-classic-039/rules/comet-phase-guard.md +125 -0
  232. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-archive.sh +311 -0
  233. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-env.sh +110 -0
  234. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-guard.sh +778 -0
  235. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-handoff.sh +390 -0
  236. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-hook-guard.sh +336 -0
  237. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-state.sh +1338 -0
  238. package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-yaml-validate.sh +225 -0
  239. package/eval/local/skills/benchmarks/039-release/comet-classic-039-archive/SKILL.md +100 -0
  240. package/eval/local/skills/benchmarks/039-release/comet-classic-039-build/SKILL.md +304 -0
  241. package/eval/local/skills/benchmarks/039-release/comet-classic-039-design/SKILL.md +263 -0
  242. package/eval/local/skills/benchmarks/039-release/comet-classic-039-hotfix/SKILL.md +204 -0
  243. package/eval/local/skills/benchmarks/039-release/comet-classic-039-open/SKILL.md +220 -0
  244. package/eval/local/skills/benchmarks/039-release/comet-classic-039-tweak/SKILL.md +180 -0
  245. package/eval/local/skills/benchmarks/039-release/comet-classic-039-verify/SKILL.md +234 -0
  246. package/eval/local/skills/benchmarks/040-beta/comet/SKILL.md +261 -0
  247. package/eval/local/skills/benchmarks/040-beta/comet/reference/auto-transition.md +27 -0
  248. package/eval/local/skills/benchmarks/040-beta/comet/reference/comet-yaml-fields.md +73 -0
  249. package/eval/local/skills/benchmarks/040-beta/comet/reference/context-recovery.md +45 -0
  250. package/eval/local/skills/benchmarks/040-beta/comet/reference/debug-gate.md +33 -0
  251. package/eval/local/skills/benchmarks/040-beta/comet/reference/decision-point.md +31 -0
  252. package/eval/local/skills/benchmarks/040-beta/comet/reference/dirty-worktree.md +59 -0
  253. package/eval/local/skills/benchmarks/040-beta/comet/reference/file-structure.md +28 -0
  254. package/eval/local/skills/benchmarks/040-beta/comet/reference/intent-frame.md +74 -0
  255. package/eval/local/skills/benchmarks/040-beta/comet/reference/scripts.md +69 -0
  256. package/eval/local/skills/benchmarks/040-beta/comet/reference/subagent-dispatch.md +169 -0
  257. package/eval/local/skills/benchmarks/040-beta/comet/rules/comet-phase-guard.md +130 -0
  258. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/checks.yaml +6 -0
  259. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/guardrails.yaml +13 -0
  260. package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/skill.yaml +122 -0
  261. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-archive.mjs +9515 -0
  262. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-env.mjs +15 -0
  263. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-guard.mjs +10173 -0
  264. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-handoff.mjs +9491 -0
  265. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-hook-guard.mjs +9175 -0
  266. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-intent.mjs +404 -0
  267. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-state.mjs +9273 -0
  268. package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-yaml-validate.mjs +7627 -0
  269. package/eval/local/skills/benchmarks/040-beta/comet-archive/SKILL.md +110 -0
  270. package/eval/local/skills/benchmarks/040-beta/comet-build/SKILL.md +315 -0
  271. package/eval/local/skills/benchmarks/040-beta/comet-design/SKILL.md +260 -0
  272. package/eval/local/skills/benchmarks/040-beta/comet-hotfix/SKILL.md +190 -0
  273. package/eval/local/skills/benchmarks/040-beta/comet-open/SKILL.md +210 -0
  274. package/eval/local/skills/benchmarks/040-beta/comet-tweak/SKILL.md +183 -0
  275. package/eval/local/skills/benchmarks/040-beta/comet-verify/SKILL.md +230 -0
  276. package/eval/local/skills/benchmarks/dependency/claude-md/comet-workflow/CLAUDE.md +12 -0
  277. package/eval/local/skills/benchmarks/dependency/openspec/openspec-apply-change/SKILL.md +156 -0
  278. package/eval/local/skills/benchmarks/dependency/openspec/openspec-archive-change/SKILL.md +114 -0
  279. package/eval/local/skills/benchmarks/dependency/openspec/openspec-bulk-archive-change/SKILL.md +246 -0
  280. package/eval/local/skills/benchmarks/dependency/openspec/openspec-continue-change/SKILL.md +118 -0
  281. package/eval/local/skills/benchmarks/dependency/openspec/openspec-explore/SKILL.md +288 -0
  282. package/eval/local/skills/benchmarks/dependency/openspec/openspec-ff-change/SKILL.md +101 -0
  283. package/eval/local/skills/benchmarks/dependency/openspec/openspec-new-change/SKILL.md +74 -0
  284. package/eval/local/skills/benchmarks/dependency/openspec/openspec-onboard/SKILL.md +554 -0
  285. package/eval/local/skills/benchmarks/dependency/openspec/openspec-propose/SKILL.md +110 -0
  286. package/eval/local/skills/benchmarks/dependency/openspec/openspec-sync-specs/SKILL.md +138 -0
  287. package/eval/local/skills/benchmarks/dependency/openspec/openspec-verify-change/SKILL.md +168 -0
  288. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/SKILL.md +159 -0
  289. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/frame-template.html +213 -0
  290. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/helper.js +167 -0
  291. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/server.cjs +723 -0
  292. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/start-server.sh +209 -0
  293. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/stop-server.sh +120 -0
  294. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/spec-document-reviewer-prompt.md +49 -0
  295. package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/visual-companion.md +291 -0
  296. package/eval/local/skills/benchmarks/dependency/superpowers/dispatching-parallel-agents/SKILL.md +185 -0
  297. package/eval/local/skills/benchmarks/dependency/superpowers/executing-plans/SKILL.md +70 -0
  298. package/eval/local/skills/benchmarks/dependency/superpowers/finishing-a-development-branch/SKILL.md +241 -0
  299. package/eval/local/skills/benchmarks/dependency/superpowers/receiving-code-review/SKILL.md +213 -0
  300. package/eval/local/skills/benchmarks/dependency/superpowers/requesting-code-review/SKILL.md +103 -0
  301. package/eval/local/skills/benchmarks/dependency/superpowers/requesting-code-review/code-reviewer.md +172 -0
  302. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/SKILL.md +418 -0
  303. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/implementer-prompt.md +139 -0
  304. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/review-package +44 -0
  305. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/sdd-workspace +22 -0
  306. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/task-brief +40 -0
  307. package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/task-reviewer-prompt.md +188 -0
  308. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/CREATION-LOG.md +119 -0
  309. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/SKILL.md +296 -0
  310. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/condition-based-waiting-example.ts +158 -0
  311. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/condition-based-waiting.md +115 -0
  312. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/defense-in-depth.md +122 -0
  313. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/find-polluter.sh +63 -0
  314. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/root-cause-tracing.md +169 -0
  315. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-academic.md +14 -0
  316. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-1.md +58 -0
  317. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-2.md +68 -0
  318. package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-3.md +69 -0
  319. package/eval/local/skills/benchmarks/dependency/superpowers/test-driven-development/SKILL.md +371 -0
  320. package/eval/local/skills/benchmarks/dependency/superpowers/test-driven-development/testing-anti-patterns.md +299 -0
  321. package/eval/local/skills/benchmarks/dependency/superpowers/using-git-worktrees/SKILL.md +202 -0
  322. package/eval/local/skills/benchmarks/dependency/superpowers/verification-before-completion/SKILL.md +139 -0
  323. package/eval/local/skills/benchmarks/dependency/superpowers/writing-plans/SKILL.md +174 -0
  324. package/eval/local/skills/benchmarks/dependency/superpowers/writing-plans/plan-document-reviewer-prompt.md +49 -0
  325. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/SKILL.md +689 -0
  326. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/anthropic-best-practices.md +1150 -0
  327. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
  328. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/graphviz-conventions.dot +172 -0
  329. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/persuasion-principles.md +187 -0
  330. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/render-graphs.js +168 -0
  331. package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/testing-skills-with-subagents.md +384 -0
  332. package/eval/local/tasks/authoring-skill-smoke/environment/Dockerfile +2 -0
  333. package/eval/local/tasks/authoring-skill-smoke/instruction.md +4 -0
  334. package/eval/local/tasks/authoring-skill-smoke/task.toml +21 -0
  335. package/eval/local/tasks/authoring-skill-smoke/validation/test_authoring_skill_smoke.py +54 -0
  336. package/eval/local/tasks/comet-agent-memory-routing/environment/Dockerfile +28 -0
  337. package/eval/local/tasks/comet-agent-memory-routing/environment/agent_system.py +40 -0
  338. package/eval/local/tasks/comet-agent-memory-routing/environment/test_agent_system.py +29 -0
  339. package/eval/local/tasks/comet-agent-memory-routing/instruction.md +20 -0
  340. package/eval/local/tasks/comet-agent-memory-routing/task.toml +24 -0
  341. package/eval/local/tasks/comet-agent-memory-routing/validation/test_agent_memory_routing.py +24 -0
  342. package/eval/local/tasks/comet-api-cache-ttl/environment/Dockerfile +39 -0
  343. package/eval/local/tasks/comet-api-cache-ttl/environment/cache.py +39 -0
  344. package/eval/local/tasks/comet-api-cache-ttl/environment/test_cache.py +81 -0
  345. package/eval/local/tasks/comet-api-cache-ttl/instruction.md +33 -0
  346. package/eval/local/tasks/comet-api-cache-ttl/task.toml +24 -0
  347. package/eval/local/tasks/comet-api-cache-ttl/validation/test_api_cache_ttl.py +58 -0
  348. package/eval/local/tasks/comet-cross-file-refactor/environment/Dockerfile +15 -0
  349. package/eval/local/tasks/comet-cross-file-refactor/environment/cli.py +13 -0
  350. package/eval/local/tasks/comet-cross-file-refactor/environment/counting.py +13 -0
  351. package/eval/local/tasks/comet-cross-file-refactor/environment/test_textkit.py +21 -0
  352. package/eval/local/tasks/comet-cross-file-refactor/instruction.md +16 -0
  353. package/eval/local/tasks/comet-cross-file-refactor/task.toml +20 -0
  354. package/eval/local/tasks/comet-cross-file-refactor/validation/test_cross_file_refactor.py +20 -0
  355. package/eval/local/tasks/comet-dependency-confusion/environment/Dockerfile +28 -0
  356. package/eval/local/tasks/comet-dependency-confusion/environment/app.py +8 -0
  357. package/eval/local/tasks/comet-dependency-confusion/environment/settings_loader.py +14 -0
  358. package/eval/local/tasks/comet-dependency-confusion/environment/test_settings_service.py +19 -0
  359. package/eval/local/tasks/comet-dependency-confusion/instruction.md +18 -0
  360. package/eval/local/tasks/comet-dependency-confusion/task.toml +24 -0
  361. package/eval/local/tasks/comet-dependency-confusion/validation/test_dependency_confusion.py +24 -0
  362. package/eval/local/tasks/comet-fix-median/environment/Dockerfile +50 -0
  363. package/eval/local/tasks/comet-fix-median/environment/stats.py +54 -0
  364. package/eval/local/tasks/comet-fix-median/environment/test_stats.py +68 -0
  365. package/eval/local/tasks/comet-fix-median/instruction.md +25 -0
  366. package/eval/local/tasks/comet-fix-median/task.toml +24 -0
  367. package/eval/local/tasks/comet-fix-median/validation/test_fix_median.py +60 -0
  368. package/eval/local/tasks/comet-framework-selection/environment/Dockerfile +28 -0
  369. package/eval/local/tasks/comet-framework-selection/environment/architecture.py +12 -0
  370. package/eval/local/tasks/comet-framework-selection/environment/test_architecture.py +30 -0
  371. package/eval/local/tasks/comet-framework-selection/instruction.md +22 -0
  372. package/eval/local/tasks/comet-framework-selection/task.toml +24 -0
  373. package/eval/local/tasks/comet-framework-selection/validation/test_framework_selection.py +24 -0
  374. package/eval/local/tasks/comet-full-workflow/environment/Dockerfile +53 -0
  375. package/eval/local/tasks/comet-full-workflow/environment/test_wordcount.py +29 -0
  376. package/eval/local/tasks/comet-full-workflow/environment/wordcount.py +40 -0
  377. package/eval/local/tasks/comet-full-workflow/instruction.md +18 -0
  378. package/eval/local/tasks/comet-full-workflow/task.toml +24 -0
  379. package/eval/local/tasks/comet-full-workflow/validation/test_full_workflow.py +171 -0
  380. package/eval/local/tasks/comet-graph-execution-review/environment/Dockerfile +28 -0
  381. package/eval/local/tasks/comet-graph-execution-review/environment/pipeline.py +19 -0
  382. package/eval/local/tasks/comet-graph-execution-review/environment/test_pipeline.py +53 -0
  383. package/eval/local/tasks/comet-graph-execution-review/instruction.md +21 -0
  384. package/eval/local/tasks/comet-graph-execution-review/task.toml +24 -0
  385. package/eval/local/tasks/comet-graph-execution-review/validation/test_graph_execution_review.py +24 -0
  386. package/eval/local/tasks/comet-human-approval-flow/environment/Dockerfile +15 -0
  387. package/eval/local/tasks/comet-human-approval-flow/environment/approvals.py +17 -0
  388. package/eval/local/tasks/comet-human-approval-flow/environment/test_approvals.py +30 -0
  389. package/eval/local/tasks/comet-human-approval-flow/instruction.md +15 -0
  390. package/eval/local/tasks/comet-human-approval-flow/task.toml +20 -0
  391. package/eval/local/tasks/comet-human-approval-flow/validation/test_human_approval_flow.py +20 -0
  392. package/eval/local/tasks/comet-layered-streaming-fix/environment/Dockerfile +20 -0
  393. package/eval/local/tasks/comet-layered-streaming-fix/environment/chat_app.py +19 -0
  394. package/eval/local/tasks/comet-layered-streaming-fix/environment/test_chat_app.py +15 -0
  395. package/eval/local/tasks/comet-layered-streaming-fix/instruction.md +14 -0
  396. package/eval/local/tasks/comet-layered-streaming-fix/task.toml +20 -0
  397. package/eval/local/tasks/comet-layered-streaming-fix/validation/test_layered_streaming_fix.py +20 -0
  398. package/eval/local/tasks/comet-noise-distractor/environment/Dockerfile +15 -0
  399. package/eval/local/tasks/comet-noise-distractor/environment/distractor.md +4 -0
  400. package/eval/local/tasks/comet-noise-distractor/environment/invoice.py +5 -0
  401. package/eval/local/tasks/comet-noise-distractor/environment/test_invoice.py +18 -0
  402. package/eval/local/tasks/comet-noise-distractor/instruction.md +17 -0
  403. package/eval/local/tasks/comet-noise-distractor/task.toml +20 -0
  404. package/eval/local/tasks/comet-noise-distractor/validation/test_noise_distractor.py +20 -0
  405. package/eval/local/tasks/comet-observability-env-template/environment/Dockerfile +15 -0
  406. package/eval/local/tasks/comet-observability-env-template/environment/env_writer.py +17 -0
  407. package/eval/local/tasks/comet-observability-env-template/environment/test_env_writer.py +17 -0
  408. package/eval/local/tasks/comet-observability-env-template/instruction.md +20 -0
  409. package/eval/local/tasks/comet-observability-env-template/task.toml +20 -0
  410. package/eval/local/tasks/comet-observability-env-template/validation/test_observability_env_template.py +46 -0
  411. package/eval/local/tasks/comet-perf-dedupe/environment/Dockerfile +39 -0
  412. package/eval/local/tasks/comet-perf-dedupe/environment/dedupe.py +22 -0
  413. package/eval/local/tasks/comet-perf-dedupe/environment/test_dedupe.py +43 -0
  414. package/eval/local/tasks/comet-perf-dedupe/instruction.md +25 -0
  415. package/eval/local/tasks/comet-perf-dedupe/task.toml +24 -0
  416. package/eval/local/tasks/comet-perf-dedupe/validation/test_perf_dedupe.py +40 -0
  417. package/eval/local/tasks/comet-persistence-threading/environment/Dockerfile +15 -0
  418. package/eval/local/tasks/comet-persistence-threading/environment/session_store.py +15 -0
  419. package/eval/local/tasks/comet-persistence-threading/environment/test_session_store.py +21 -0
  420. package/eval/local/tasks/comet-persistence-threading/instruction.md +14 -0
  421. package/eval/local/tasks/comet-persistence-threading/task.toml +20 -0
  422. package/eval/local/tasks/comet-persistence-threading/validation/test_persistence_threading.py +20 -0
  423. package/eval/local/tasks/comet-refactor-counter/environment/Dockerfile +39 -0
  424. package/eval/local/tasks/comet-refactor-counter/environment/test_text_processor.py +57 -0
  425. package/eval/local/tasks/comet-refactor-counter/environment/text_processor.py +49 -0
  426. package/eval/local/tasks/comet-refactor-counter/instruction.md +31 -0
  427. package/eval/local/tasks/comet-refactor-counter/task.toml +24 -0
  428. package/eval/local/tasks/comet-refactor-counter/validation/test_refactor_counter.py +75 -0
  429. package/eval/local/tasks/comet-robust-config/environment/Dockerfile +39 -0
  430. package/eval/local/tasks/comet-robust-config/environment/config_loader.py +56 -0
  431. package/eval/local/tasks/comet-robust-config/environment/test_config_loader.py +72 -0
  432. package/eval/local/tasks/comet-robust-config/instruction.md +30 -0
  433. package/eval/local/tasks/comet-robust-config/task.toml +24 -0
  434. package/eval/local/tasks/comet-robust-config/validation/test_robust_config.py +37 -0
  435. package/eval/local/tasks/generic-skill-smoke/environment/Dockerfile +2 -0
  436. package/eval/local/tasks/generic-skill-smoke/instruction.md +7 -0
  437. package/eval/local/tasks/generic-skill-smoke/task.toml +21 -0
  438. package/eval/local/tasks/generic-skill-smoke/validation/test_generic_skill_smoke.py +36 -0
  439. package/eval/local/tasks/index.yaml +155 -0
  440. package/eval/local/tasks/workflow-overlay-contract/environment/Dockerfile +5 -0
  441. package/eval/local/tasks/workflow-overlay-contract/instruction.md +5 -0
  442. package/eval/local/tasks/workflow-overlay-contract/task.toml +21 -0
  443. package/eval/local/tasks/workflow-overlay-contract/validation/test_workflow_overlay_contract.py +235 -0
  444. package/eval/local/tasks/workflow-route-conformance/environment/Dockerfile +2 -0
  445. package/eval/local/tasks/workflow-route-conformance/instruction.md +5 -0
  446. package/eval/local/tasks/workflow-route-conformance/task.toml +21 -0
  447. package/eval/local/tasks/workflow-route-conformance/validation/test_workflow_route_conformance.py +84 -0
  448. package/eval/local/tests/conftest.py +1148 -0
  449. package/eval/local/tests/scaffold/test_attribution.py +48 -0
  450. package/eval/local/tests/scaffold/test_compare_baselines.py +999 -0
  451. package/eval/local/tests/scaffold/test_conftest_helpers.py +534 -0
  452. package/eval/local/tests/scaffold/test_evidence.py +15 -0
  453. package/eval/local/tests/scaffold/test_langsmith_conftest.py +244 -0
  454. package/eval/local/tests/scaffold/test_logging.py +243 -0
  455. package/eval/local/tests/scaffold/test_manifests.py +132 -0
  456. package/eval/local/tests/scaffold/test_profiles.py +866 -0
  457. package/eval/local/tests/scaffold/test_regression_check.py +19 -0
  458. package/eval/local/tests/scaffold/test_report_style_demo_charts.py +45 -0
  459. package/eval/local/tests/scaffold/test_sample_quality.py +211 -0
  460. package/eval/local/tests/scaffold/test_tasks.py +168 -0
  461. package/eval/local/tests/scaffold/test_treatments.py +244 -0
  462. package/eval/local/tests/scaffold/test_utils.py +139 -0
  463. package/eval/local/tests/tasks/test_tasks.py +445 -0
  464. package/eval/local/tests/tasks/test_validation_scripts.py +143 -0
  465. package/eval/local/treatments/comet/comet_full_039.yaml +141 -0
  466. package/eval/local/treatments/comet/comet_full_040_beta.yaml +140 -0
  467. package/eval/local/treatments/common/control.yaml +4 -0
  468. package/eval/pyproject.toml +41 -0
  469. package/eval/report-html-config.json +6 -0
  470. package/eval/scaffold/__init__.py +67 -0
  471. package/eval/scaffold/python/__init__.py +95 -0
  472. package/eval/scaffold/python/attribution.py +43 -0
  473. package/eval/scaffold/python/evidence.py +38 -0
  474. package/eval/scaffold/python/external_data_handler.py +18 -0
  475. package/eval/scaffold/python/generic_llm_judge.py +235 -0
  476. package/eval/scaffold/python/judge_config.py +168 -0
  477. package/eval/scaffold/python/llm_judge.py +191 -0
  478. package/eval/scaffold/python/logging.py +705 -0
  479. package/eval/scaffold/python/manifests.py +129 -0
  480. package/eval/scaffold/python/paper_charts.py +25 -0
  481. package/eval/scaffold/python/pass_at_k.py +107 -0
  482. package/eval/scaffold/python/paths.py +56 -0
  483. package/eval/scaffold/python/profiles.py +127 -0
  484. package/eval/scaffold/python/report_outputs.py +1391 -0
  485. package/eval/scaffold/python/sample_quality.py +339 -0
  486. package/eval/scaffold/python/schema.py +39 -0
  487. package/eval/scaffold/python/skill_parser.py +469 -0
  488. package/eval/scaffold/python/tasks.py +330 -0
  489. package/eval/scaffold/python/treatments.py +271 -0
  490. package/eval/scaffold/python/utils.py +366 -0
  491. package/eval/scaffold/python/validation/__init__.py +21 -0
  492. package/eval/scaffold/python/validation/authoring_rubric.py +326 -0
  493. package/eval/scaffold/python/validation/comet_workflow.py +187 -0
  494. package/eval/scaffold/python/validation/core.py +264 -0
  495. package/eval/scaffold/python/validation/dataset.py +337 -0
  496. package/eval/scaffold/python/validation/docker.py +106 -0
  497. package/eval/scaffold/python/validation/evaluator.py +549 -0
  498. package/eval/scaffold/python/validation/generic_rubric.py +169 -0
  499. package/eval/scaffold/python/validation/rubric.py +740 -0
  500. package/eval/scaffold/python/validation/runner.py +237 -0
  501. package/eval/scaffold/python/validation/scripts.py +58 -0
  502. package/eval/scaffold/python/validation/tracing.py +313 -0
  503. package/eval/scaffold/shell/common.sh +126 -0
  504. package/eval/scaffold/shell/docker.sh +482 -0
  505. package/eval/scaffold/shell/run-claude-loop.sh +181 -0
  506. package/eval/scaffold/shell/setup.sh +259 -0
  507. package/eval/simulator-instruction.md +9 -0
  508. package/package.json +24 -2
@@ -0,0 +1,126 @@
1
+ #!/usr/bin/env bash
2
+ # Common shell utilities for test orchestration
3
+ # Source this file: source "$(dirname "$0")/../../scaffold/shell/common.sh"
4
+
5
+ set -euo pipefail
6
+
7
+ # =============================================================================
8
+ # COLORS
9
+ # =============================================================================
10
+
11
+ RED='\033[0;31m'
12
+ GREEN='\033[0;32m'
13
+ YELLOW='\033[0;33m'
14
+ BLUE='\033[0;34m'
15
+ NC='\033[0m' # No Color
16
+
17
+ # =============================================================================
18
+ # LOGGING
19
+ # =============================================================================
20
+
21
+ log_info() {
22
+ echo -e "${BLUE}[INFO]${NC} $*"
23
+ }
24
+
25
+ log_success() {
26
+ echo -e "${GREEN}[OK]${NC} $*"
27
+ }
28
+
29
+ log_warn() {
30
+ echo -e "${YELLOW}[WARN]${NC} $*"
31
+ }
32
+
33
+ log_error() {
34
+ echo -e "${RED}[ERROR]${NC} $*" >&2
35
+ }
36
+
37
+ # =============================================================================
38
+ # ERROR HANDLING
39
+ # =============================================================================
40
+
41
+ die() {
42
+ log_error "$@"
43
+ exit 1
44
+ }
45
+
46
+ # =============================================================================
47
+ # PATH UTILITIES
48
+ # =============================================================================
49
+
50
+ # Get the absolute path to the scaffold directory
51
+ get_scaffold_dir() {
52
+ local script_dir
53
+ script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
54
+ echo "$(dirname "$script_dir")"
55
+ }
56
+
57
+ # Get the absolute path to the project root
58
+ get_project_root() {
59
+ local scaffold_dir
60
+ scaffold_dir="$(get_scaffold_dir)"
61
+ echo "$(dirname "$scaffold_dir")"
62
+ }
63
+
64
+ # =============================================================================
65
+ # PYTHON HELPERS
66
+ # =============================================================================
67
+
68
+ # Find python3 executable
69
+ find_python() {
70
+ if command -v python3 &> /dev/null; then
71
+ echo "python3"
72
+ elif command -v python &> /dev/null; then
73
+ echo "python"
74
+ else
75
+ die "Python not found. Please install Python 3."
76
+ fi
77
+ }
78
+
79
+ # Run a Python module from the project root
80
+ run_python_module() {
81
+ local module="$1"
82
+ shift
83
+ local python
84
+ python="$(find_python)"
85
+ local project_root
86
+ project_root="$(get_project_root)"
87
+
88
+ cd "$project_root"
89
+ PYTHONPATH="$project_root" "$python" -m "$module" "$@"
90
+ }
91
+
92
+ # Run a Python script
93
+ run_python_script() {
94
+ local script="$1"
95
+ shift
96
+ local python
97
+ python="$(find_python)"
98
+ local project_root
99
+ project_root="$(get_project_root)"
100
+
101
+ PYTHONPATH="$project_root" "$python" "$script" "$@"
102
+ }
103
+
104
+ # =============================================================================
105
+ # ENVIRONMENT
106
+ # =============================================================================
107
+
108
+ # Load .env file if it exists
109
+ load_env() {
110
+ local env_file="${1:-.env}"
111
+ if [[ -f "$env_file" ]]; then
112
+ set -a
113
+ # shellcheck source=/dev/null
114
+ source "$env_file"
115
+ set +a
116
+ log_info "Loaded environment from $env_file"
117
+ fi
118
+ }
119
+
120
+ # Check required environment variables
121
+ require_env() {
122
+ local var_name="$1"
123
+ if [[ -z "${!var_name:-}" ]]; then
124
+ die "Required environment variable $var_name is not set"
125
+ fi
126
+ }
@@ -0,0 +1,482 @@
1
+ #!/usr/bin/env bash
2
+ # Docker utilities for test orchestration
3
+ # Language-agnostic interface - call from Python, JS, or CLI
4
+ #
5
+ # Usage:
6
+ # ./docker.sh check
7
+ # ./docker.sh build <directory> [--force]
8
+ # ./docker.sh run <directory> <command...>
9
+ # ./docker.sh run-python <directory> <script.py> [args...]
10
+ # ./docker.sh run-claude <directory> <prompt> [--model MODEL] [--timeout SECONDS]
11
+
12
+ set -euo pipefail
13
+
14
+ # Docker on Windows runs as a native binary needing Windows-style host paths,
15
+ # but git-bash (MSYS) rewrites POSIX-looking args. We want:
16
+ # - host paths (build context, volume source) in Windows form (C:\ or C:/)
17
+ # - container-internal paths (-w /workspace, image refs) left as POSIX
18
+ # MSYS_NO_PATHCONV=1 stops ALL conversion, which breaks host paths. Instead we
19
+ # disable the leading-slash heuristic only for args that are container paths,
20
+ # by prefixing them with a double slash (//workspace) which MSYS leaves alone
21
+ # and docker treats as /workspace. The host paths we pass are already normalised
22
+ # to forward-slash drive form by the Python layer (_to_bash_path).
23
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
24
+ source "$SCRIPT_DIR/common.sh"
25
+
26
+ # Normalise a host path to Windows drive form for docker.exe on Windows.
27
+ # git-bash may hand us /d/... which docker.exe (a native binary) cannot resolve.
28
+ # cygpath -w converts reliably when available; otherwise leave as-is on unix.
29
+ _winpath() {
30
+ local p="$1"
31
+ if command -v cygpath &> /dev/null; then
32
+ cygpath -w "$p"
33
+ else
34
+ printf '%s' "$p"
35
+ fi
36
+ }
37
+
38
+ # Image prefix for all benchmark images
39
+ IMAGE_PREFIX="skillbench"
40
+
41
+ # Claude Code version (configurable via env var, defaults to "latest")
42
+ CLAUDE_CODE_VERSION="${BENCH_CC_VERSION:-latest}"
43
+
44
+ # Cross-platform timeout command (macOS uses gtimeout from coreutils)
45
+ TIMEOUT_CMD=""
46
+ if command -v gtimeout &> /dev/null; then
47
+ TIMEOUT_CMD="gtimeout"
48
+ elif command -v timeout &> /dev/null; then
49
+ TIMEOUT_CMD="timeout"
50
+ fi
51
+
52
+ # API keys to pass through to containers
53
+ ENV_KEYS=(
54
+ OPENAI_API_KEY
55
+ ANTHROPIC_API_KEY
56
+ LANGSMITH_API_KEY
57
+ LANGSMITH_PROJECT
58
+ LANGSMITH_TRACING
59
+ LANGSMITH_ENDPOINT
60
+ TAVILY_API_KEY
61
+ # Claude Code LangSmith tracing (official langsmith-tracing plugin)
62
+ TRACE_TO_LANGSMITH
63
+ CC_LANGSMITH_API_KEY
64
+ CC_LANGSMITH_PROJECT
65
+ CC_LANGSMITH_DEBUG
66
+ CC_LANGSMITH_LOG_FILE
67
+ CC_LANGSMITH_METADATA
68
+ # Nest the plugin's Claude Code trajectory under the pytest experiment run
69
+ CC_LANGSMITH_PARENT_DOTTED_ORDER
70
+ # Eval trace context (nest LLM calls in test scripts under eval span)
71
+ BENCH_EVAL_LANGSMITH_TRACE
72
+ BENCH_EVAL_BAGGAGE
73
+ # Claude Code via Anthropic-compatible proxy (BigModel / mimo / OpenRouter etc.)
74
+ # When ANTHROPIC_API_KEY is unset, claude authenticates with these instead.
75
+ ANTHROPIC_AUTH_TOKEN
76
+ ANTHROPIC_BASE_URL
77
+ ANTHROPIC_MODEL
78
+ ANTHROPIC_DEFAULT_HAIKU_MODEL
79
+ ANTHROPIC_DEFAULT_SONNET_MODEL
80
+ ANTHROPIC_DEFAULT_OPUS_MODEL
81
+ ANTHROPIC_DEFAULT_OPUS_MODEL_NAME
82
+ ANTHROPIC_DEFAULT_SONNET_MODEL_NAME
83
+ CLAUDE_CODE_SUBAGENT_MODEL
84
+ )
85
+
86
+ # =============================================================================
87
+ # DOCKER CHECKS
88
+ # =============================================================================
89
+
90
+ check_docker() {
91
+ if ! command -v docker &> /dev/null; then
92
+ echo "ERROR: Docker not found" >&2
93
+ return 1
94
+ fi
95
+ if ! docker info &> /dev/null 2>&1; then
96
+ echo "ERROR: Docker daemon not running" >&2
97
+ return 1
98
+ fi
99
+ return 0
100
+ }
101
+
102
+ # =============================================================================
103
+ # HASH-BASED IMAGE CACHING
104
+ # =============================================================================
105
+
106
+ # Get hash of build inputs for cache key (Dockerfile + requirements.txt)
107
+ get_dockerfile_hash() {
108
+ local dir="$1"
109
+ local dockerfile="$dir/Dockerfile"
110
+
111
+ if [[ ! -f "$dockerfile" ]]; then
112
+ echo ""
113
+ return 1
114
+ fi
115
+
116
+ # Hash Dockerfile + requirements.txt (the files that affect the image).
117
+ # Don't hash the entire directory — test scripts and scaffold files are
118
+ # added at runtime and would cause a different hash every run.
119
+ local combined
120
+ combined=$(cat "$dockerfile")
121
+ if [[ -f "$dir/requirements.txt" ]]; then
122
+ combined="$combined$(cat "$dir/requirements.txt")"
123
+ fi
124
+
125
+ if command -v md5 &> /dev/null; then
126
+ echo "$combined" | md5 -q | cut -c1-8
127
+ else
128
+ echo "$combined" | md5sum | cut -c1-8
129
+ fi
130
+ }
131
+
132
+ # Get image name for a directory (based on build context hash + Claude Code version)
133
+ get_image_name() {
134
+ local dir="$1"
135
+ local hash
136
+ hash=$(get_dockerfile_hash "$dir") || return 1
137
+ # Include version in tag to cache different versions separately
138
+ if [[ "$CLAUDE_CODE_VERSION" == "latest" ]]; then
139
+ echo "${IMAGE_PREFIX}:${hash}"
140
+ else
141
+ echo "${IMAGE_PREFIX}:${hash}-cc${CLAUDE_CODE_VERSION}"
142
+ fi
143
+ }
144
+
145
+ # Check if image exists
146
+ image_exists() {
147
+ local image_name="$1"
148
+ docker images -q "$image_name" 2>/dev/null | grep -q .
149
+ }
150
+
151
+ # =============================================================================
152
+ # DOCKER BUILD
153
+ # =============================================================================
154
+
155
+ # Build Docker image with caching
156
+ # Usage: docker_build <directory> [--force]
157
+ # Output: image name on stdout
158
+ docker_build() {
159
+ local dir="$1"
160
+ local force="${2:-}"
161
+
162
+ local dockerfile="$dir/Dockerfile"
163
+ if [[ ! -f "$dockerfile" ]]; then
164
+ # Fall back to environment/Dockerfile (the eval layout: conftest's
165
+ # copy_environment places it there, and validator test dirs reuse it).
166
+ dockerfile="$dir/environment/Dockerfile"
167
+ fi
168
+ if [[ ! -f "$dockerfile" ]]; then
169
+ echo "ERROR: No Dockerfile in $dir" >&2
170
+ return 1
171
+ fi
172
+
173
+ local image_name
174
+ image_name=$(get_image_name "$dir") || return 1
175
+
176
+ # Check cache unless forced
177
+ if [[ "$force" != "--force" ]] && image_exists "$image_name"; then
178
+ echo "$image_name"
179
+ return 0
180
+ fi
181
+
182
+ # Build image (pass Claude Code version as build arg)
183
+ local windir windockerfile
184
+ windir=$(_winpath "$dir")
185
+ windockerfile=$(_winpath "$dockerfile")
186
+ if docker build -t "$image_name" \
187
+ --build-arg CLAUDE_CODE_VERSION="$CLAUDE_CODE_VERSION" \
188
+ -f "$windockerfile" "$windir" >&2; then
189
+ echo "$image_name"
190
+ return 0
191
+ else
192
+ echo "ERROR: Build failed" >&2
193
+ return 1
194
+ fi
195
+ }
196
+
197
+ # =============================================================================
198
+ # DOCKER RUN
199
+ # =============================================================================
200
+
201
+ # Build env var arguments for docker run (populates ENV_ARGS array)
202
+ # Usage: build_env_args; docker run "${ENV_ARGS[@]}" ...
203
+ build_env_args() {
204
+ ENV_ARGS=()
205
+ for key in "${ENV_KEYS[@]}"; do
206
+ if [[ -n "${!key:-}" ]]; then
207
+ ENV_ARGS+=("-e" "$key=${!key}")
208
+ fi
209
+ done
210
+ }
211
+
212
+ # Build mount + CLI args for the official LangSmith Claude Code plugin.
213
+ # Populates PLUGIN_MOUNT_ARGS (docker -v) and PLUGIN_CLI_ARGS (claude --plugin-dir).
214
+ # Activated only when tracing is on and a prebuilt plugin dir is provided via
215
+ # CC_LANGSMITH_PLUGIN_DIR (host path). When unset the arrays stay empty, so
216
+ # local runs and untraced runs are completely unaffected.
217
+ build_plugin_args() {
218
+ PLUGIN_MOUNT_ARGS=()
219
+ PLUGIN_CLI_ARGS=()
220
+ if [[ "${TRACE_TO_LANGSMITH:-}" != "true" ]]; then
221
+ return 0
222
+ fi
223
+ if [[ -z "${CC_LANGSMITH_PLUGIN_DIR:-}" ]]; then
224
+ return 0
225
+ fi
226
+ if [[ ! -d "${CC_LANGSMITH_PLUGIN_DIR}" ]]; then
227
+ echo "WARN: CC_LANGSMITH_PLUGIN_DIR not a directory: ${CC_LANGSMITH_PLUGIN_DIR}; skipping trajectory tracing" >&2
228
+ return 0
229
+ fi
230
+ local plugin_host
231
+ plugin_host=$(_winpath "${CC_LANGSMITH_PLUGIN_DIR}")
232
+ PLUGIN_MOUNT_ARGS=("-v" "$plugin_host://opt/langsmith-cc-plugin:ro")
233
+ PLUGIN_CLI_ARGS=("--plugin-dir" "//opt/langsmith-cc-plugin")
234
+ }
235
+
236
+ # Run command in Docker container
237
+ # Usage: docker_run <directory> <command...>
238
+ docker_run() {
239
+ local dir="$1"
240
+ shift
241
+ local cmd=("$@")
242
+
243
+ local image_name
244
+ image_name=$(docker_build "$dir") || return 1
245
+
246
+ build_env_args
247
+
248
+ local windir
249
+ windir=$(_winpath "$dir")
250
+
251
+ docker run --rm \
252
+ -v "$windir://workspace" \
253
+ -w //workspace \
254
+ "${ENV_ARGS[@]}" \
255
+ "$image_name" \
256
+ "${cmd[@]}"
257
+ }
258
+
259
+ # Run Python script in Docker
260
+ # Usage: docker_run_python <directory> <script.py> [args...]
261
+ docker_run_python() {
262
+ local dir="$1"
263
+ local script="$2"
264
+ shift 2
265
+
266
+ docker_run "$dir" python "$script" "$@"
267
+ }
268
+
269
+ # Run Node.js/TypeScript script in Docker
270
+ # Usage: docker_run_node <directory> <script.js|script.ts> [args...]
271
+ docker_run_node() {
272
+ local dir="$1"
273
+ local script="$2"
274
+ shift 2
275
+
276
+ # Use tsx for TypeScript, node for JavaScript
277
+ if [[ "$script" == *.ts ]]; then
278
+ docker_run "$dir" npx tsx "$script" "$@"
279
+ else
280
+ docker_run "$dir" node "$script" "$@"
281
+ fi
282
+ }
283
+
284
+ # Run Claude CLI in Docker
285
+ # Usage: docker_run_claude <directory> <prompt> [--model MODEL] [--timeout SECONDS]
286
+ docker_run_claude() {
287
+ local dir="$1"
288
+ local prompt="$2"
289
+ shift 2
290
+
291
+ local model=""
292
+ local timeout="300"
293
+
294
+ while [[ $# -gt 0 ]]; do
295
+ case "$1" in
296
+ --model)
297
+ model="$2"
298
+ shift 2
299
+ ;;
300
+ --timeout)
301
+ timeout="$2"
302
+ shift 2
303
+ ;;
304
+ *)
305
+ shift
306
+ ;;
307
+ esac
308
+ done
309
+
310
+ local image_name
311
+ image_name=$(docker_build "$dir") || return 1
312
+
313
+ build_env_args
314
+ build_plugin_args
315
+
316
+ local cmd=(
317
+ claude -p "$prompt"
318
+ --dangerously-skip-permissions
319
+ --output-format stream-json
320
+ --verbose
321
+ )
322
+
323
+ if [[ ${#PLUGIN_CLI_ARGS[@]} -gt 0 ]]; then
324
+ cmd+=("${PLUGIN_CLI_ARGS[@]}")
325
+ fi
326
+
327
+ if [[ -n "$model" ]]; then
328
+ cmd+=(--model "$model")
329
+ fi
330
+
331
+ local windir
332
+ windir=$(_winpath "$dir")
333
+
334
+ if [[ -n "$TIMEOUT_CMD" ]]; then
335
+ $TIMEOUT_CMD "$timeout" docker run --rm \
336
+ -v "$windir://workspace" \
337
+ ${PLUGIN_MOUNT_ARGS[@]+"${PLUGIN_MOUNT_ARGS[@]}"} \
338
+ -w //workspace \
339
+ "${ENV_ARGS[@]}" \
340
+ "$image_name" \
341
+ "${cmd[@]}"
342
+ else
343
+ docker run --rm \
344
+ -v "$windir://workspace" \
345
+ ${PLUGIN_MOUNT_ARGS[@]+"${PLUGIN_MOUNT_ARGS[@]}"} \
346
+ -w //workspace \
347
+ "${ENV_ARGS[@]}" \
348
+ "$image_name" \
349
+ "${cmd[@]}"
350
+ fi
351
+ }
352
+
353
+ # Run the multi-turn interactive claude driver in Docker.
354
+ # Usage: docker_run_claude_loop <directory> <prompt> [--max-turns N] [--model MODEL]
355
+ # Mounts the scaffold shell dir so run-claude-loop.sh is available inside.
356
+ docker_run_claude_loop() {
357
+ local dir="$1"
358
+ local prompt="$2"
359
+ shift 2
360
+
361
+ local image_name
362
+ image_name=$(docker_build "$dir") || return 1
363
+
364
+ build_env_args
365
+ build_plugin_args
366
+
367
+ local windir shell_dir
368
+ windir=$(_winpath "$dir")
369
+ shell_dir=$(_winpath "$SCRIPT_DIR")
370
+
371
+ # Mount the scaffold shell scripts read-only so the loop driver is available
372
+ # at /opt/scaffold-shell/ inside the container.
373
+ docker run --rm \
374
+ -v "$windir://workspace" \
375
+ -v "$shell_dir://opt/scaffold-shell:ro" \
376
+ ${PLUGIN_MOUNT_ARGS[@]+"${PLUGIN_MOUNT_ARGS[@]}"} \
377
+ -w //workspace \
378
+ "${ENV_ARGS[@]}" \
379
+ "$image_name" \
380
+ bash //opt/scaffold-shell/run-claude-loop.sh "$prompt" \
381
+ ${PLUGIN_CLI_ARGS[@]+"${PLUGIN_CLI_ARGS[@]}"} \
382
+ "$@"
383
+ }
384
+
385
+ # =============================================================================
386
+ # CLI MODE
387
+ # =============================================================================
388
+
389
+ if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
390
+ cmd="${1:-help}"
391
+ shift || true
392
+
393
+ case "$cmd" in
394
+ check)
395
+ if check_docker; then
396
+ echo "OK"
397
+ else
398
+ exit 1
399
+ fi
400
+ ;;
401
+ build)
402
+ dir="${1:-}"
403
+ force="${2:-}"
404
+ if [[ -z "$dir" ]]; then
405
+ die "Usage: $0 build <directory> [--force]"
406
+ fi
407
+ docker_build "$(realpath "$dir")" "$force"
408
+ ;;
409
+ run)
410
+ dir="${1:-}"
411
+ if [[ -z "$dir" ]]; then
412
+ die "Usage: $0 run <directory> <command...>"
413
+ fi
414
+ shift
415
+ docker_run "$(realpath "$dir")" "$@"
416
+ ;;
417
+ run-python)
418
+ dir="${1:-}"
419
+ script="${2:-}"
420
+ if [[ -z "$dir" || -z "$script" ]]; then
421
+ die "Usage: $0 run-python <directory> <script.py> [args...]"
422
+ fi
423
+ shift 2
424
+ docker_run_python "$(realpath "$dir")" "$script" "$@"
425
+ ;;
426
+ run-node)
427
+ dir="${1:-}"
428
+ script="${2:-}"
429
+ if [[ -z "$dir" || -z "$script" ]]; then
430
+ die "Usage: $0 run-node <directory> <script.js|ts> [args...]"
431
+ fi
432
+ shift 2
433
+ docker_run_node "$(realpath "$dir")" "$script" "$@"
434
+ ;;
435
+ run-claude)
436
+ dir="${1:-}"
437
+ prompt="${2:-}"
438
+ if [[ -z "$dir" || -z "$prompt" ]]; then
439
+ die "Usage: $0 run-claude <directory> <prompt> [--model MODEL] [--timeout SECONDS]"
440
+ fi
441
+ shift 2
442
+ docker_run_claude "$(realpath "$dir")" "$prompt" "$@"
443
+ ;;
444
+ run-claude-loop)
445
+ dir="${1:-}"
446
+ prompt="${2:-}"
447
+ if [[ -z "$dir" || -z "$prompt" ]]; then
448
+ die "Usage: $0 run-claude-loop <directory> <prompt> [--max-turns N] [--model MODEL]"
449
+ fi
450
+ shift 2
451
+ docker_run_claude_loop "$(realpath "$dir")" "$prompt" "$@"
452
+ ;;
453
+ help|*)
454
+ cat <<EOF
455
+ Docker utilities for skill benchmarks
456
+
457
+ Usage: $0 <command> [args...]
458
+
459
+ Commands:
460
+ check Check if Docker is available
461
+ build <dir> [--force] Build image (cached by Dockerfile hash)
462
+ run <dir> <cmd...> Run command in container
463
+ run-python <dir> <script> [args] Run Python script in container
464
+ run-node <dir> <script> [args] Run Node.js/TypeScript in container
465
+ run-claude <dir> <prompt> [opts] Run Claude CLI in container
466
+
467
+ Options for run-claude:
468
+ --model MODEL Model to use
469
+ --timeout SECONDS Timeout (default: 300)
470
+
471
+ Environment variables passed to containers:
472
+ OPENAI_API_KEY, ANTHROPIC_API_KEY, LANGSMITH_API_KEY,
473
+ LANGSMITH_PROJECT, LANGSMITH_TRACING, LANGSMITH_ENDPOINT,
474
+ TAVILY_API_KEY
475
+
476
+ Build configuration:
477
+ BENCH_CC_VERSION Version of Claude Code to install (default: latest)
478
+ Example: BENCH_CC_VERSION=2.1.29 ./docker.sh build <dir>
479
+ EOF
480
+ ;;
481
+ esac
482
+ fi