@matteeh/osq 0.2.1 → 0.2.2

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 (606) hide show
  1. package/README.md +234 -15
  2. package/dist/cli/approve.d.ts +7 -0
  3. package/dist/cli/approve.d.ts.map +1 -1
  4. package/dist/cli/approve.js +34 -0
  5. package/dist/cli/approve.js.map +1 -1
  6. package/dist/cli/bin.js +2 -3
  7. package/dist/cli/bin.js.map +1 -1
  8. package/dist/cli/check.d.ts +15 -0
  9. package/dist/cli/check.d.ts.map +1 -0
  10. package/dist/cli/check.js +65 -0
  11. package/dist/cli/check.js.map +1 -0
  12. package/dist/cli/index.d.ts.map +1 -1
  13. package/dist/cli/index.js +10 -10
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/cli/init.d.ts.map +1 -1
  16. package/dist/cli/init.js +6 -1
  17. package/dist/cli/init.js.map +1 -1
  18. package/dist/cli/lint.d.ts +3 -0
  19. package/dist/cli/lint.d.ts.map +1 -1
  20. package/dist/cli/lint.js +33 -14
  21. package/dist/cli/lint.js.map +1 -1
  22. package/dist/cli/plan-queue.d.ts +10 -4
  23. package/dist/cli/plan-queue.d.ts.map +1 -1
  24. package/dist/cli/plan-queue.js +20 -19
  25. package/dist/cli/plan-queue.js.map +1 -1
  26. package/dist/cli/plan-sections.d.ts +15 -0
  27. package/dist/cli/plan-sections.d.ts.map +1 -0
  28. package/dist/cli/plan-sections.js +47 -0
  29. package/dist/cli/plan-sections.js.map +1 -0
  30. package/dist/cli/plan.d.ts +1 -0
  31. package/dist/cli/plan.d.ts.map +1 -1
  32. package/dist/cli/plan.js +14 -4
  33. package/dist/cli/plan.js.map +1 -1
  34. package/dist/cli/report.d.ts.map +1 -1
  35. package/dist/cli/report.js +73 -1
  36. package/dist/cli/report.js.map +1 -1
  37. package/dist/cli/run.d.ts +7 -0
  38. package/dist/cli/run.d.ts.map +1 -0
  39. package/dist/cli/run.js +22 -0
  40. package/dist/cli/run.js.map +1 -0
  41. package/dist/cli/verified.d.ts +15 -0
  42. package/dist/cli/verified.d.ts.map +1 -0
  43. package/dist/cli/verified.js +34 -0
  44. package/dist/cli/verified.js.map +1 -0
  45. package/dist/core/foundation/config-agents.d.ts +16 -0
  46. package/dist/core/foundation/config-agents.d.ts.map +1 -0
  47. package/dist/core/foundation/config-agents.js +2 -0
  48. package/dist/core/foundation/config-agents.js.map +1 -0
  49. package/dist/core/foundation/config-claude.d.ts +48 -0
  50. package/dist/core/foundation/config-claude.d.ts.map +1 -0
  51. package/dist/core/foundation/config-claude.js +106 -0
  52. package/dist/core/foundation/config-claude.js.map +1 -0
  53. package/dist/core/foundation/config-codex-resolve.d.ts +10 -0
  54. package/dist/core/foundation/config-codex-resolve.d.ts.map +1 -0
  55. package/dist/core/foundation/config-codex-resolve.js +24 -0
  56. package/dist/core/foundation/config-codex-resolve.js.map +1 -0
  57. package/dist/core/foundation/config-file.d.ts +18 -0
  58. package/dist/core/foundation/config-file.d.ts.map +1 -0
  59. package/dist/core/foundation/config-file.js +46 -0
  60. package/dist/core/foundation/config-file.js.map +1 -0
  61. package/dist/core/foundation/config-gates.d.ts +2 -0
  62. package/dist/core/foundation/config-gates.d.ts.map +1 -1
  63. package/dist/core/foundation/config-gates.js +8 -0
  64. package/dist/core/foundation/config-gates.js.map +1 -1
  65. package/dist/core/foundation/config-opencode.d.ts +25 -0
  66. package/dist/core/foundation/config-opencode.d.ts.map +1 -0
  67. package/dist/core/foundation/config-opencode.js +55 -0
  68. package/dist/core/foundation/config-opencode.js.map +1 -0
  69. package/dist/core/foundation/config-pi.d.ts +10 -0
  70. package/dist/core/foundation/config-pi.d.ts.map +1 -1
  71. package/dist/core/foundation/config-pi.js +13 -0
  72. package/dist/core/foundation/config-pi.js.map +1 -1
  73. package/dist/core/foundation/config-planning.d.ts +12 -1
  74. package/dist/core/foundation/config-planning.d.ts.map +1 -1
  75. package/dist/core/foundation/config-planning.js +29 -1
  76. package/dist/core/foundation/config-planning.js.map +1 -1
  77. package/dist/core/foundation/config-traceability.d.ts +28 -0
  78. package/dist/core/foundation/config-traceability.d.ts.map +1 -0
  79. package/dist/core/foundation/config-traceability.js +63 -0
  80. package/dist/core/foundation/config-traceability.js.map +1 -0
  81. package/dist/core/foundation/config-user.d.ts +32 -0
  82. package/dist/core/foundation/config-user.d.ts.map +1 -0
  83. package/dist/core/foundation/config-user.js +2 -0
  84. package/dist/core/foundation/config-user.js.map +1 -0
  85. package/dist/core/foundation/config-vcs.d.ts +29 -0
  86. package/dist/core/foundation/config-vcs.d.ts.map +1 -0
  87. package/dist/core/foundation/config-vcs.js +57 -0
  88. package/dist/core/foundation/config-vcs.js.map +1 -0
  89. package/dist/core/foundation/config.d.ts +23 -24
  90. package/dist/core/foundation/config.d.ts.map +1 -1
  91. package/dist/core/foundation/config.js +29 -36
  92. package/dist/core/foundation/config.js.map +1 -1
  93. package/dist/core/foundation/decisions-validate.d.ts +16 -0
  94. package/dist/core/foundation/decisions-validate.d.ts.map +1 -0
  95. package/dist/core/foundation/decisions-validate.js +74 -0
  96. package/dist/core/foundation/decisions-validate.js.map +1 -0
  97. package/dist/core/foundation/decisions.d.ts +34 -0
  98. package/dist/core/foundation/decisions.d.ts.map +1 -0
  99. package/dist/core/foundation/decisions.js +152 -0
  100. package/dist/core/foundation/decisions.js.map +1 -0
  101. package/dist/core/foundation/doctor-decisions.d.ts +9 -0
  102. package/dist/core/foundation/doctor-decisions.d.ts.map +1 -0
  103. package/dist/core/foundation/doctor-decisions.js +49 -0
  104. package/dist/core/foundation/doctor-decisions.js.map +1 -0
  105. package/dist/core/foundation/doctor-managed.d.ts.map +1 -1
  106. package/dist/core/foundation/doctor-managed.js +3 -0
  107. package/dist/core/foundation/doctor-managed.js.map +1 -1
  108. package/dist/core/foundation/doctor-prices.d.ts +8 -0
  109. package/dist/core/foundation/doctor-prices.d.ts.map +1 -0
  110. package/dist/core/foundation/doctor-prices.js +25 -0
  111. package/dist/core/foundation/doctor-prices.js.map +1 -0
  112. package/dist/core/foundation/doctor.d.ts.map +1 -1
  113. package/dist/core/foundation/doctor.js +20 -30
  114. package/dist/core/foundation/doctor.js.map +1 -1
  115. package/dist/core/foundation/harness-catalog.d.ts +7 -8
  116. package/dist/core/foundation/harness-catalog.d.ts.map +1 -1
  117. package/dist/core/foundation/harness-catalog.js +26 -41
  118. package/dist/core/foundation/harness-catalog.js.map +1 -1
  119. package/dist/core/foundation/init-blocks.d.ts +1 -1
  120. package/dist/core/foundation/init-blocks.d.ts.map +1 -1
  121. package/dist/core/foundation/init-blocks.js +51 -14
  122. package/dist/core/foundation/init-blocks.js.map +1 -1
  123. package/dist/core/foundation/init.d.ts +4 -0
  124. package/dist/core/foundation/init.d.ts.map +1 -1
  125. package/dist/core/foundation/init.js +7 -0
  126. package/dist/core/foundation/init.js.map +1 -1
  127. package/dist/core/foundation/new.d.ts +4 -1
  128. package/dist/core/foundation/new.d.ts.map +1 -1
  129. package/dist/core/foundation/new.js +18 -8
  130. package/dist/core/foundation/new.js.map +1 -1
  131. package/dist/core/foundation/package-root.d.ts +6 -0
  132. package/dist/core/foundation/package-root.d.ts.map +1 -1
  133. package/dist/core/foundation/package-root.js +6 -0
  134. package/dist/core/foundation/package-root.js.map +1 -1
  135. package/dist/core/foundation/rules-block.d.ts +11 -0
  136. package/dist/core/foundation/rules-block.d.ts.map +1 -0
  137. package/dist/core/foundation/rules-block.js +90 -0
  138. package/dist/core/foundation/rules-block.js.map +1 -0
  139. package/dist/core/foundation/traceability-block.d.ts +13 -0
  140. package/dist/core/foundation/traceability-block.d.ts.map +1 -0
  141. package/dist/core/foundation/traceability-block.js +124 -0
  142. package/dist/core/foundation/traceability-block.js.map +1 -0
  143. package/dist/core/lifecycle/done.d.ts.map +1 -1
  144. package/dist/core/lifecycle/done.js +2 -4
  145. package/dist/core/lifecycle/done.js.map +1 -1
  146. package/dist/core/lifecycle/recertify.d.ts +9 -0
  147. package/dist/core/lifecycle/recertify.d.ts.map +1 -0
  148. package/dist/core/lifecycle/recertify.js +27 -0
  149. package/dist/core/lifecycle/recertify.js.map +1 -0
  150. package/dist/core/lifecycle/reject.d.ts.map +1 -1
  151. package/dist/core/lifecycle/reject.js +3 -4
  152. package/dist/core/lifecycle/reject.js.map +1 -1
  153. package/dist/core/lifecycle/retry.d.ts.map +1 -1
  154. package/dist/core/lifecycle/retry.js +6 -20
  155. package/dist/core/lifecycle/retry.js.map +1 -1
  156. package/dist/core/lifecycle/verification-record.d.ts +42 -0
  157. package/dist/core/lifecycle/verification-record.d.ts.map +1 -0
  158. package/dist/core/lifecycle/verification-record.js +76 -0
  159. package/dist/core/lifecycle/verification-record.js.map +1 -0
  160. package/dist/core/report/approval-flags.d.ts +16 -3
  161. package/dist/core/report/approval-flags.d.ts.map +1 -1
  162. package/dist/core/report/approval-flags.js +59 -22
  163. package/dist/core/report/approval-flags.js.map +1 -1
  164. package/dist/core/report/brief-to-approval.d.ts +7 -0
  165. package/dist/core/report/brief-to-approval.d.ts.map +1 -0
  166. package/dist/core/report/brief-to-approval.js +43 -0
  167. package/dist/core/report/brief-to-approval.js.map +1 -0
  168. package/dist/core/report/planning-price-gaps.d.ts +10 -0
  169. package/dist/core/report/planning-price-gaps.d.ts.map +1 -0
  170. package/dist/core/report/planning-price-gaps.js +37 -0
  171. package/dist/core/report/planning-price-gaps.js.map +1 -0
  172. package/dist/core/report/planning-slice-lookup.d.ts.map +1 -1
  173. package/dist/core/report/planning-slice-lookup.js +3 -9
  174. package/dist/core/report/planning-slice-lookup.js.map +1 -1
  175. package/dist/core/report/recent-disclosures.d.ts +18 -0
  176. package/dist/core/report/recent-disclosures.d.ts.map +1 -0
  177. package/dist/core/report/recent-disclosures.js +105 -0
  178. package/dist/core/report/recent-disclosures.js.map +1 -0
  179. package/dist/core/report/record-disclosures.d.ts +14 -0
  180. package/dist/core/report/record-disclosures.d.ts.map +1 -0
  181. package/dist/core/report/record-disclosures.js +30 -0
  182. package/dist/core/report/record-disclosures.js.map +1 -0
  183. package/dist/core/report/record-estimates.d.ts +25 -0
  184. package/dist/core/report/record-estimates.d.ts.map +1 -0
  185. package/dist/core/report/record-estimates.js +83 -0
  186. package/dist/core/report/record-estimates.js.map +1 -0
  187. package/dist/core/report/record-rework.d.ts +19 -0
  188. package/dist/core/report/record-rework.d.ts.map +1 -0
  189. package/dist/core/report/record-rework.js +50 -0
  190. package/dist/core/report/record-rework.js.map +1 -0
  191. package/dist/core/report/record-verification.d.ts +16 -0
  192. package/dist/core/report/record-verification.d.ts.map +1 -0
  193. package/dist/core/report/record-verification.js +33 -0
  194. package/dist/core/report/record-verification.js.map +1 -0
  195. package/dist/core/report/report-dependencies.d.ts +29 -0
  196. package/dist/core/report/report-dependencies.d.ts.map +1 -0
  197. package/dist/core/report/report-dependencies.js +92 -0
  198. package/dist/core/report/report-dependencies.js.map +1 -0
  199. package/dist/core/report/report-events.d.ts +1 -0
  200. package/dist/core/report/report-events.d.ts.map +1 -1
  201. package/dist/core/report/report-events.js +8 -26
  202. package/dist/core/report/report-events.js.map +1 -1
  203. package/dist/core/report/report-mutation.d.ts +34 -0
  204. package/dist/core/report/report-mutation.d.ts.map +1 -0
  205. package/dist/core/report/report-mutation.js +191 -0
  206. package/dist/core/report/report-mutation.js.map +1 -0
  207. package/dist/core/report/report-scope.d.ts +21 -0
  208. package/dist/core/report/report-scope.d.ts.map +1 -0
  209. package/dist/core/report/report-scope.js +61 -0
  210. package/dist/core/report/report-scope.js.map +1 -0
  211. package/dist/core/report/report-traceability.d.ts +29 -0
  212. package/dist/core/report/report-traceability.d.ts.map +1 -0
  213. package/dist/core/report/report-traceability.js +94 -0
  214. package/dist/core/report/report-traceability.js.map +1 -0
  215. package/dist/core/report/report.d.ts +35 -1
  216. package/dist/core/report/report.d.ts.map +1 -1
  217. package/dist/core/report/report.js +130 -111
  218. package/dist/core/report/report.js.map +1 -1
  219. package/dist/core/report/result-sections.d.ts +30 -0
  220. package/dist/core/report/result-sections.d.ts.map +1 -0
  221. package/dist/core/report/result-sections.js +125 -0
  222. package/dist/core/report/result-sections.js.map +1 -0
  223. package/dist/core/report/scope-size.d.ts +7 -0
  224. package/dist/core/report/scope-size.d.ts.map +1 -0
  225. package/dist/core/report/scope-size.js +22 -0
  226. package/dist/core/report/scope-size.js.map +1 -0
  227. package/dist/core/run/commit-message.d.ts +24 -0
  228. package/dist/core/run/commit-message.d.ts.map +1 -0
  229. package/dist/core/run/commit-message.js +76 -0
  230. package/dist/core/run/commit-message.js.map +1 -0
  231. package/dist/core/run/dead-commit.d.ts +10 -0
  232. package/dist/core/run/dead-commit.d.ts.map +1 -0
  233. package/dist/core/run/dead-commit.js +70 -0
  234. package/dist/core/run/dead-commit.js.map +1 -0
  235. package/dist/core/run/focused-tests.d.ts +43 -0
  236. package/dist/core/run/focused-tests.d.ts.map +1 -0
  237. package/dist/core/run/focused-tests.js +116 -0
  238. package/dist/core/run/focused-tests.js.map +1 -0
  239. package/dist/core/run/manifest-approval.d.ts +7 -0
  240. package/dist/core/run/manifest-approval.d.ts.map +1 -0
  241. package/dist/core/run/manifest-approval.js +30 -0
  242. package/dist/core/run/manifest-approval.js.map +1 -0
  243. package/dist/core/run/manifest.d.ts +11 -1
  244. package/dist/core/run/manifest.d.ts.map +1 -1
  245. package/dist/core/run/manifest.js +52 -11
  246. package/dist/core/run/manifest.js.map +1 -1
  247. package/dist/core/run/mutation-report.d.ts +29 -0
  248. package/dist/core/run/mutation-report.d.ts.map +1 -0
  249. package/dist/core/run/mutation-report.js +107 -0
  250. package/dist/core/run/mutation-report.js.map +1 -0
  251. package/dist/core/run/mutation-run.d.ts +32 -0
  252. package/dist/core/run/mutation-run.d.ts.map +1 -0
  253. package/dist/core/run/mutation-run.js +80 -0
  254. package/dist/core/run/mutation-run.js.map +1 -0
  255. package/dist/core/run/verification.d.ts +12 -1
  256. package/dist/core/run/verification.d.ts.map +1 -1
  257. package/dist/core/run/verification.js +24 -2
  258. package/dist/core/run/verification.js.map +1 -1
  259. package/dist/core/spec/approve-worktree-shared.d.ts +33 -0
  260. package/dist/core/spec/approve-worktree-shared.d.ts.map +1 -0
  261. package/dist/core/spec/approve-worktree-shared.js +59 -0
  262. package/dist/core/spec/approve-worktree-shared.js.map +1 -0
  263. package/dist/core/spec/approve-worktree.d.ts +21 -0
  264. package/dist/core/spec/approve-worktree.d.ts.map +1 -0
  265. package/dist/core/spec/approve-worktree.js +153 -0
  266. package/dist/core/spec/approve-worktree.js.map +1 -0
  267. package/dist/core/spec/approve.d.ts +20 -10
  268. package/dist/core/spec/approve.d.ts.map +1 -1
  269. package/dist/core/spec/approve.js +57 -54
  270. package/dist/core/spec/approve.js.map +1 -1
  271. package/dist/core/spec/capability-impact.d.ts +43 -0
  272. package/dist/core/spec/capability-impact.d.ts.map +1 -0
  273. package/dist/core/spec/capability-impact.js +85 -0
  274. package/dist/core/spec/capability-impact.js.map +1 -0
  275. package/dist/core/spec/decisions-lint.d.ts +18 -0
  276. package/dist/core/spec/decisions-lint.d.ts.map +1 -0
  277. package/dist/core/spec/decisions-lint.js +127 -0
  278. package/dist/core/spec/decisions-lint.js.map +1 -0
  279. package/dist/core/spec/delta.d.ts +6 -0
  280. package/dist/core/spec/delta.d.ts.map +1 -1
  281. package/dist/core/spec/delta.js +73 -5
  282. package/dist/core/spec/delta.js.map +1 -1
  283. package/dist/core/spec/digest-decisions.d.ts +27 -0
  284. package/dist/core/spec/digest-decisions.d.ts.map +1 -0
  285. package/dist/core/spec/digest-decisions.js +86 -0
  286. package/dist/core/spec/digest-decisions.js.map +1 -0
  287. package/dist/core/spec/digest-format.d.ts +4 -0
  288. package/dist/core/spec/digest-format.d.ts.map +1 -0
  289. package/dist/core/spec/digest-format.js +44 -0
  290. package/dist/core/spec/digest-format.js.map +1 -0
  291. package/dist/core/spec/digest.d.ts +5 -3
  292. package/dist/core/spec/digest.d.ts.map +1 -1
  293. package/dist/core/spec/digest.js +14 -33
  294. package/dist/core/spec/digest.js.map +1 -1
  295. package/dist/core/spec/human-steps.d.ts +20 -0
  296. package/dist/core/spec/human-steps.d.ts.map +1 -0
  297. package/dist/core/spec/human-steps.js +52 -0
  298. package/dist/core/spec/human-steps.js.map +1 -0
  299. package/dist/core/spec/impact-lint.d.ts +24 -0
  300. package/dist/core/spec/impact-lint.d.ts.map +1 -0
  301. package/dist/core/spec/impact-lint.js +39 -0
  302. package/dist/core/spec/impact-lint.js.map +1 -0
  303. package/dist/core/spec/import-graph.d.ts +35 -0
  304. package/dist/core/spec/import-graph.d.ts.map +1 -0
  305. package/dist/core/spec/import-graph.js +155 -0
  306. package/dist/core/spec/import-graph.js.map +1 -0
  307. package/dist/core/spec/lint-findings.d.ts +44 -0
  308. package/dist/core/spec/lint-findings.d.ts.map +1 -0
  309. package/dist/core/spec/lint-findings.js +56 -0
  310. package/dist/core/spec/lint-findings.js.map +1 -0
  311. package/dist/core/spec/lint-output.d.ts +53 -0
  312. package/dist/core/spec/lint-output.d.ts.map +1 -0
  313. package/dist/core/spec/lint-output.js +87 -0
  314. package/dist/core/spec/lint-output.js.map +1 -0
  315. package/dist/core/spec/linter.d.ts +14 -4
  316. package/dist/core/spec/linter.d.ts.map +1 -1
  317. package/dist/core/spec/linter.js +271 -111
  318. package/dist/core/spec/linter.js.map +1 -1
  319. package/dist/core/spec/merged-spec-check.d.ts +24 -0
  320. package/dist/core/spec/merged-spec-check.d.ts.map +1 -0
  321. package/dist/core/spec/merged-spec-check.js +95 -0
  322. package/dist/core/spec/merged-spec-check.js.map +1 -0
  323. package/dist/core/spec/openspec-issues.d.ts +58 -0
  324. package/dist/core/spec/openspec-issues.d.ts.map +1 -0
  325. package/dist/core/spec/openspec-issues.js +166 -0
  326. package/dist/core/spec/openspec-issues.js.map +1 -0
  327. package/dist/core/spec/parser.d.ts +1 -0
  328. package/dist/core/spec/parser.d.ts.map +1 -1
  329. package/dist/core/spec/parser.js +16 -6
  330. package/dist/core/spec/parser.js.map +1 -1
  331. package/dist/core/spec/scenario-impact.d.ts +47 -0
  332. package/dist/core/spec/scenario-impact.d.ts.map +1 -0
  333. package/dist/core/spec/scenario-impact.js +130 -0
  334. package/dist/core/spec/scenario-impact.js.map +1 -0
  335. package/dist/core/spec/test-impact.d.ts +28 -0
  336. package/dist/core/spec/test-impact.d.ts.map +1 -0
  337. package/dist/core/spec/test-impact.js +119 -0
  338. package/dist/core/spec/test-impact.js.map +1 -0
  339. package/dist/core/spec/traceability-links.d.ts +50 -0
  340. package/dist/core/spec/traceability-links.d.ts.map +1 -0
  341. package/dist/core/spec/traceability-links.js +120 -0
  342. package/dist/core/spec/traceability-links.js.map +1 -0
  343. package/dist/core/spec/traceability-lint.d.ts +29 -0
  344. package/dist/core/spec/traceability-lint.d.ts.map +1 -0
  345. package/dist/core/spec/traceability-lint.js +143 -0
  346. package/dist/core/spec/traceability-lint.js.map +1 -0
  347. package/dist/core/status/blocked-item.d.ts +8 -0
  348. package/dist/core/status/blocked-item.d.ts.map +1 -0
  349. package/dist/core/status/blocked-item.js +45 -0
  350. package/dist/core/status/blocked-item.js.map +1 -0
  351. package/dist/core/status/change-locations.d.ts +44 -0
  352. package/dist/core/status/change-locations.d.ts.map +1 -0
  353. package/dist/core/status/change-locations.js +138 -0
  354. package/dist/core/status/change-locations.js.map +1 -0
  355. package/dist/core/status/dependency-readiness.d.ts +11 -0
  356. package/dist/core/status/dependency-readiness.d.ts.map +1 -0
  357. package/dist/core/status/dependency-readiness.js +39 -0
  358. package/dist/core/status/dependency-readiness.js.map +1 -0
  359. package/dist/core/status/inbox-projection.d.ts.map +1 -1
  360. package/dist/core/status/inbox-projection.js +23 -4
  361. package/dist/core/status/inbox-projection.js.map +1 -1
  362. package/dist/core/status/inbox-text.d.ts.map +1 -1
  363. package/dist/core/status/inbox-text.js +34 -3
  364. package/dist/core/status/inbox-text.js.map +1 -1
  365. package/dist/core/status/inbox.d.ts +10 -1
  366. package/dist/core/status/inbox.d.ts.map +1 -1
  367. package/dist/core/status/inbox.js +19 -1
  368. package/dist/core/status/inbox.js.map +1 -1
  369. package/dist/core/status/layout.d.ts +6 -0
  370. package/dist/core/status/layout.d.ts.map +1 -1
  371. package/dist/core/status/layout.js +8 -0
  372. package/dist/core/status/layout.js.map +1 -1
  373. package/dist/core/status/next-step.d.ts +17 -0
  374. package/dist/core/status/next-step.d.ts.map +1 -0
  375. package/dist/core/status/next-step.js +85 -0
  376. package/dist/core/status/next-step.js.map +1 -0
  377. package/dist/core/status/pre-spawn-words.d.ts +13 -0
  378. package/dist/core/status/pre-spawn-words.d.ts.map +1 -0
  379. package/dist/core/status/pre-spawn-words.js +26 -0
  380. package/dist/core/status/pre-spawn-words.js.map +1 -0
  381. package/dist/core/status/queue-parser.d.ts +1 -0
  382. package/dist/core/status/queue-parser.d.ts.map +1 -1
  383. package/dist/core/status/queue-parser.js +41 -2
  384. package/dist/core/status/queue-parser.js.map +1 -1
  385. package/dist/core/status/queue-planning.d.ts +1 -0
  386. package/dist/core/status/queue-planning.d.ts.map +1 -1
  387. package/dist/core/status/queue-planning.js +24 -12
  388. package/dist/core/status/queue-planning.js.map +1 -1
  389. package/dist/core/status/queue-report-detail.d.ts.map +1 -1
  390. package/dist/core/status/queue-report-detail.js +5 -3
  391. package/dist/core/status/queue-report-detail.js.map +1 -1
  392. package/dist/core/status/queue-state.d.ts +1 -1
  393. package/dist/core/status/queue-state.d.ts.map +1 -1
  394. package/dist/core/status/queue-state.js +27 -41
  395. package/dist/core/status/queue-state.js.map +1 -1
  396. package/dist/core/status/show.d.ts +25 -0
  397. package/dist/core/status/show.d.ts.map +1 -1
  398. package/dist/core/status/show.js +354 -91
  399. package/dist/core/status/show.js.map +1 -1
  400. package/dist/core/status/state.d.ts.map +1 -1
  401. package/dist/core/status/state.js +1 -23
  402. package/dist/core/status/state.js.map +1 -1
  403. package/dist/core/status/status.d.ts +18 -0
  404. package/dist/core/status/status.d.ts.map +1 -1
  405. package/dist/core/status/status.js +59 -80
  406. package/dist/core/status/status.js.map +1 -1
  407. package/dist/core/status/verification.d.ts +27 -0
  408. package/dist/core/status/verification.d.ts.map +1 -0
  409. package/dist/core/status/verification.js +111 -0
  410. package/dist/core/status/verification.js.map +1 -0
  411. package/dist/core/trace/function-ranges.d.ts +30 -0
  412. package/dist/core/trace/function-ranges.d.ts.map +1 -0
  413. package/dist/core/trace/function-ranges.js +250 -0
  414. package/dist/core/trace/function-ranges.js.map +1 -0
  415. package/dist/core/trace/mutation-pick.d.ts +55 -0
  416. package/dist/core/trace/mutation-pick.d.ts.map +1 -0
  417. package/dist/core/trace/mutation-pick.js +96 -0
  418. package/dist/core/trace/mutation-pick.js.map +1 -0
  419. package/dist/core/trace/scenario-index.d.ts +27 -0
  420. package/dist/core/trace/scenario-index.d.ts.map +1 -0
  421. package/dist/core/trace/scenario-index.js +76 -0
  422. package/dist/core/trace/scenario-index.js.map +1 -0
  423. package/dist/core/trace/scenario-lookup.d.ts +14 -0
  424. package/dist/core/trace/scenario-lookup.d.ts.map +1 -0
  425. package/dist/core/trace/scenario-lookup.js +179 -0
  426. package/dist/core/trace/scenario-lookup.js.map +1 -0
  427. package/dist/core/trace/tag-scan.d.ts +44 -0
  428. package/dist/core/trace/tag-scan.d.ts.map +1 -0
  429. package/dist/core/trace/tag-scan.js +200 -0
  430. package/dist/core/trace/tag-scan.js.map +1 -0
  431. package/dist/core/vcs/doctor-git.d.ts +13 -0
  432. package/dist/core/vcs/doctor-git.d.ts.map +1 -0
  433. package/dist/core/vcs/doctor-git.js +114 -0
  434. package/dist/core/vcs/doctor-git.js.map +1 -0
  435. package/dist/core/vcs/git-vcs-write.d.ts +47 -0
  436. package/dist/core/vcs/git-vcs-write.d.ts.map +1 -0
  437. package/dist/core/vcs/git-vcs-write.js +210 -0
  438. package/dist/core/vcs/git-vcs-write.js.map +1 -0
  439. package/dist/core/vcs/git-vcs.d.ts +40 -0
  440. package/dist/core/vcs/git-vcs.d.ts.map +1 -0
  441. package/dist/core/vcs/git-vcs.js +170 -0
  442. package/dist/core/vcs/git-vcs.js.map +1 -0
  443. package/dist/core/vcs/no-vcs.d.ts +26 -0
  444. package/dist/core/vcs/no-vcs.d.ts.map +1 -0
  445. package/dist/core/vcs/no-vcs.js +62 -0
  446. package/dist/core/vcs/no-vcs.js.map +1 -0
  447. package/dist/core/vcs/select.d.ts +11 -0
  448. package/dist/core/vcs/select.d.ts.map +1 -0
  449. package/dist/core/vcs/select.js +33 -0
  450. package/dist/core/vcs/select.js.map +1 -0
  451. package/dist/core/vcs/snapshot.d.ts +34 -0
  452. package/dist/core/vcs/snapshot.d.ts.map +1 -0
  453. package/dist/core/vcs/snapshot.js +71 -0
  454. package/dist/core/vcs/snapshot.js.map +1 -0
  455. package/dist/core/vcs/vcs.d.ts +55 -0
  456. package/dist/core/vcs/vcs.d.ts.map +1 -0
  457. package/dist/core/vcs/vcs.js +2 -0
  458. package/dist/core/vcs/vcs.js.map +1 -0
  459. package/dist/core/vcs/worktree.d.ts +10 -0
  460. package/dist/core/vcs/worktree.d.ts.map +1 -0
  461. package/dist/core/vcs/worktree.js +25 -0
  462. package/dist/core/vcs/worktree.js.map +1 -0
  463. package/dist/core/web/web-data-folders.d.ts.map +1 -1
  464. package/dist/core/web/web-data-folders.js +18 -33
  465. package/dist/core/web/web-data-folders.js.map +1 -1
  466. package/dist/core/web/web-data-lifecycle.d.ts.map +1 -1
  467. package/dist/core/web/web-data-lifecycle.js +2 -1
  468. package/dist/core/web/web-data-lifecycle.js.map +1 -1
  469. package/dist/core/web/web-events.d.ts +8 -6
  470. package/dist/core/web/web-events.d.ts.map +1 -1
  471. package/dist/core/web/web-events.js +7 -31
  472. package/dist/core/web/web-events.js.map +1 -1
  473. package/dist/core/web/web-server.d.ts.map +1 -1
  474. package/dist/core/web/web-server.js +3 -0
  475. package/dist/core/web/web-server.js.map +1 -1
  476. package/dist/core/web/web-trees.d.ts +27 -0
  477. package/dist/core/web/web-trees.d.ts.map +1 -0
  478. package/dist/core/web/web-trees.js +82 -0
  479. package/dist/core/web/web-trees.js.map +1 -0
  480. package/dist/harness/claude/claude-exec-args.d.ts +13 -0
  481. package/dist/harness/claude/claude-exec-args.d.ts.map +1 -0
  482. package/dist/harness/claude/claude-exec-args.js +61 -0
  483. package/dist/harness/claude/claude-exec-args.js.map +1 -0
  484. package/dist/harness/claude/claude-exec.d.ts +12 -0
  485. package/dist/harness/claude/claude-exec.d.ts.map +1 -0
  486. package/dist/harness/claude/claude-exec.js +79 -0
  487. package/dist/harness/claude/claude-exec.js.map +1 -0
  488. package/dist/harness/claude/claude-stream.d.ts +31 -0
  489. package/dist/harness/claude/claude-stream.d.ts.map +1 -0
  490. package/dist/harness/claude/claude-stream.js +150 -0
  491. package/dist/harness/claude/claude-stream.js.map +1 -0
  492. package/dist/harness/claude/claude-tools.d.ts +5 -0
  493. package/dist/harness/claude/claude-tools.d.ts.map +1 -0
  494. package/dist/harness/claude/claude-tools.js +30 -0
  495. package/dist/harness/claude/claude-tools.js.map +1 -0
  496. package/dist/harness/index.d.ts +1 -0
  497. package/dist/harness/index.d.ts.map +1 -1
  498. package/dist/harness/index.js +3 -0
  499. package/dist/harness/index.js.map +1 -1
  500. package/dist/harness/opencode/opencode-session.d.ts +42 -0
  501. package/dist/harness/opencode/opencode-session.d.ts.map +1 -0
  502. package/dist/harness/opencode/opencode-session.js +123 -0
  503. package/dist/harness/opencode/opencode-session.js.map +1 -0
  504. package/dist/harness/opencode/opencode.d.ts +2 -1
  505. package/dist/harness/opencode/opencode.d.ts.map +1 -1
  506. package/dist/harness/opencode/opencode.js +52 -28
  507. package/dist/harness/opencode/opencode.js.map +1 -1
  508. package/dist/harness/prompt.js +1 -1
  509. package/dist/harness/prompt.js.map +1 -1
  510. package/dist/harness/types.d.ts +112 -1
  511. package/dist/harness/types.d.ts.map +1 -1
  512. package/dist/harness/types.js.map +1 -1
  513. package/dist/index.d.ts +3 -1
  514. package/dist/index.d.ts.map +1 -1
  515. package/dist/index.js +1 -0
  516. package/dist/index.js.map +1 -1
  517. package/dist/testing/index.d.ts +3 -0
  518. package/dist/testing/index.d.ts.map +1 -0
  519. package/dist/testing/index.js +2 -0
  520. package/dist/testing/index.js.map +1 -0
  521. package/dist/testing/scenario.d.ts +29 -0
  522. package/dist/testing/scenario.d.ts.map +1 -0
  523. package/dist/testing/scenario.js +157 -0
  524. package/dist/testing/scenario.js.map +1 -0
  525. package/dist/watcher/archiver.d.ts +2 -1
  526. package/dist/watcher/archiver.d.ts.map +1 -1
  527. package/dist/watcher/archiver.js +27 -2
  528. package/dist/watcher/archiver.js.map +1 -1
  529. package/dist/watcher/auto-recertify.d.ts +27 -0
  530. package/dist/watcher/auto-recertify.d.ts.map +1 -0
  531. package/dist/watcher/auto-recertify.js +113 -0
  532. package/dist/watcher/auto-recertify.js.map +1 -0
  533. package/dist/watcher/auto-retry.d.ts +1 -1
  534. package/dist/watcher/auto-retry.d.ts.map +1 -1
  535. package/dist/watcher/auto-retry.js +3 -11
  536. package/dist/watcher/auto-retry.js.map +1 -1
  537. package/dist/watcher/baseline-key.d.ts +17 -0
  538. package/dist/watcher/baseline-key.d.ts.map +1 -0
  539. package/dist/watcher/baseline-key.js +31 -0
  540. package/dist/watcher/baseline-key.js.map +1 -0
  541. package/dist/watcher/baseline.d.ts +32 -0
  542. package/dist/watcher/baseline.d.ts.map +1 -0
  543. package/dist/watcher/baseline.js +166 -0
  544. package/dist/watcher/baseline.js.map +1 -0
  545. package/dist/watcher/blocked.d.ts +12 -0
  546. package/dist/watcher/blocked.d.ts.map +1 -0
  547. package/dist/watcher/blocked.js +24 -0
  548. package/dist/watcher/blocked.js.map +1 -0
  549. package/dist/watcher/dependencies.d.ts +28 -0
  550. package/dist/watcher/dependencies.d.ts.map +1 -0
  551. package/dist/watcher/dependencies.js +152 -0
  552. package/dist/watcher/dependencies.js.map +1 -0
  553. package/dist/watcher/done-metadata.d.ts +4 -0
  554. package/dist/watcher/done-metadata.d.ts.map +1 -0
  555. package/dist/watcher/done-metadata.js +20 -0
  556. package/dist/watcher/done-metadata.js.map +1 -0
  557. package/dist/watcher/failure-reason.d.ts +1 -1
  558. package/dist/watcher/failure-reason.d.ts.map +1 -1
  559. package/dist/watcher/focused-verify.d.ts +17 -0
  560. package/dist/watcher/focused-verify.d.ts.map +1 -0
  561. package/dist/watcher/focused-verify.js +54 -0
  562. package/dist/watcher/focused-verify.js.map +1 -0
  563. package/dist/watcher/git-guard.d.ts +24 -0
  564. package/dist/watcher/git-guard.d.ts.map +1 -0
  565. package/dist/watcher/git-guard.js +95 -0
  566. package/dist/watcher/git-guard.js.map +1 -0
  567. package/dist/watcher/instructions-drift.d.ts +21 -0
  568. package/dist/watcher/instructions-drift.d.ts.map +1 -0
  569. package/dist/watcher/instructions-drift.js +115 -0
  570. package/dist/watcher/instructions-drift.js.map +1 -0
  571. package/dist/watcher/loop.d.ts.map +1 -1
  572. package/dist/watcher/loop.js +36 -50
  573. package/dist/watcher/loop.js.map +1 -1
  574. package/dist/watcher/measures.d.ts.map +1 -1
  575. package/dist/watcher/measures.js +22 -39
  576. package/dist/watcher/measures.js.map +1 -1
  577. package/dist/watcher/mutation-check.d.ts +42 -0
  578. package/dist/watcher/mutation-check.d.ts.map +1 -0
  579. package/dist/watcher/mutation-check.js +147 -0
  580. package/dist/watcher/mutation-check.js.map +1 -0
  581. package/dist/watcher/regression.d.ts +10 -5
  582. package/dist/watcher/regression.d.ts.map +1 -1
  583. package/dist/watcher/regression.js +29 -22
  584. package/dist/watcher/regression.js.map +1 -1
  585. package/dist/watcher/runner.d.ts.map +1 -1
  586. package/dist/watcher/runner.js +12 -14
  587. package/dist/watcher/runner.js.map +1 -1
  588. package/dist/watcher/spawn.d.ts.map +1 -1
  589. package/dist/watcher/spawn.js +5 -0
  590. package/dist/watcher/spawn.js.map +1 -1
  591. package/dist/watcher/task-verify.d.ts +7 -2
  592. package/dist/watcher/task-verify.d.ts.map +1 -1
  593. package/dist/watcher/task-verify.js +33 -8
  594. package/dist/watcher/task-verify.js.map +1 -1
  595. package/dist/watcher/verify.d.ts +1 -5
  596. package/dist/watcher/verify.d.ts.map +1 -1
  597. package/dist/watcher/verify.js +2 -6
  598. package/dist/watcher/verify.js.map +1 -1
  599. package/package.json +5 -1
  600. package/templates/PLANNER.md +35 -9
  601. package/templates/openspec/config.yaml +1 -1
  602. package/templates/openspec/schemas/osq/schema.yaml +4 -2
  603. package/templates/openspec/schemas/osq/templates/proposal.md +9 -2
  604. package/templates/proposal.md +9 -2
  605. package/ui/dist/assets/{index-CZYeQ8la.js → index-D39uYbbL.js} +1 -1
  606. package/ui/dist/index.html +1 -1
@@ -0,0 +1,150 @@
1
+ import { relativizeToolSummary } from '../../core/run/summary.js';
2
+ import { EventStreamParser, asRecord, firstNonEmptyString, resolveEventTimestamp, } from '../stream.js';
3
+ import { appendHarnessEvent, } from '../types.js';
4
+ import { claudeToolSummary, toProjectRelative } from './claude-tools.js';
5
+ export function createClaudeStreamState() {
6
+ return { toolUses: new Map() };
7
+ }
8
+ function contentBlocks(message) {
9
+ if (!Array.isArray(message?.content))
10
+ return [];
11
+ return message.content
12
+ .map((block) => asRecord(block))
13
+ .filter((block) => block !== undefined);
14
+ }
15
+ function numberField(value) {
16
+ return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
17
+ }
18
+ async function handleAssistant(event, ctx, state, timestamp) {
19
+ const message = asRecord(event.message);
20
+ for (const block of contentBlocks(message)) {
21
+ const type = firstNonEmptyString(block.type);
22
+ if (type === 'tool_use') {
23
+ const name = firstNonEmptyString(block.name) ?? 'tool';
24
+ const id = firstNonEmptyString(block.id);
25
+ const input = asRecord(block.input);
26
+ const filePath = firstNonEmptyString(input?.file_path);
27
+ if (id) {
28
+ state.toolUses.set(id, { name, ...(filePath ? { path: filePath } : {}) });
29
+ }
30
+ const summary = relativizeToolSummary(claudeToolSummary(name, input), ctx.projectRoot);
31
+ await appendHarnessEvent(ctx.specFolderPath, ctx.taskNumber, {
32
+ type: 'tool',
33
+ timestamp,
34
+ data: { tool: name, summary },
35
+ });
36
+ ctx.logger?.verbose(`[tool] ${name}: ${summary}`);
37
+ continue;
38
+ }
39
+ if (type === 'text') {
40
+ const text = firstNonEmptyString(block.text);
41
+ if (text) {
42
+ await appendHarnessEvent(ctx.specFolderPath, ctx.taskNumber, {
43
+ type: 'text',
44
+ timestamp,
45
+ data: { text },
46
+ });
47
+ }
48
+ }
49
+ }
50
+ }
51
+ async function handleUser(event, ctx, state, timestamp) {
52
+ const message = asRecord(event.message);
53
+ for (const block of contentBlocks(message)) {
54
+ if (firstNonEmptyString(block.type) !== 'tool_result')
55
+ continue;
56
+ if (block.is_error === true)
57
+ continue;
58
+ const id = firstNonEmptyString(block.tool_use_id);
59
+ const remembered = id ? state.toolUses.get(id) : undefined;
60
+ if (!remembered)
61
+ continue;
62
+ if (remembered.name !== 'Edit' && remembered.name !== 'Write')
63
+ continue;
64
+ if (!remembered.path)
65
+ continue;
66
+ await appendHarnessEvent(ctx.specFolderPath, ctx.taskNumber, {
67
+ type: 'file_changed',
68
+ timestamp,
69
+ data: {
70
+ path: toProjectRelative(remembered.path, ctx.projectRoot),
71
+ },
72
+ });
73
+ }
74
+ }
75
+ async function handleResult(event, ctx, state, timestamp) {
76
+ state.subtype = firstNonEmptyString(event.subtype);
77
+ state.isError = event.is_error === true;
78
+ state.result = firstNonEmptyString(event.result);
79
+ const modelUsage = asRecord(event.modelUsage);
80
+ if (!modelUsage)
81
+ return;
82
+ for (const [model, entry] of Object.entries(modelUsage)) {
83
+ const usage = asRecord(entry);
84
+ if (!usage)
85
+ continue;
86
+ const cacheRead = numberField(usage.cacheReadInputTokens);
87
+ const promptTokens = (numberField(usage.inputTokens) ?? 0) +
88
+ (cacheRead ?? 0) +
89
+ (numberField(usage.cacheCreationInputTokens) ?? 0);
90
+ const candidateTokens = numberField(usage.outputTokens) ?? 0;
91
+ const data = {
92
+ promptTokens,
93
+ candidateTokens,
94
+ totalTokens: promptTokens + candidateTokens,
95
+ model,
96
+ };
97
+ if (cacheRead !== undefined)
98
+ data.cachedTokens = cacheRead;
99
+ const reasoning = numberField(usage.thinkingTokens);
100
+ if (reasoning !== undefined)
101
+ data.reasoningTokens = reasoning;
102
+ const cost = numberField(usage.costUSD);
103
+ if (cost !== undefined)
104
+ data.cost = cost;
105
+ await appendHarnessEvent(ctx.specFolderPath, ctx.taskNumber, {
106
+ type: 'tokens',
107
+ timestamp,
108
+ data,
109
+ });
110
+ }
111
+ }
112
+ /** Translate one completed Claude Code JSONL line into osq harness events. */
113
+ export async function processClaudeStdoutLine(line, ctx, state) {
114
+ const trimmed = line.trim();
115
+ if (!trimmed)
116
+ return;
117
+ let parsed;
118
+ try {
119
+ parsed = JSON.parse(trimmed);
120
+ }
121
+ catch {
122
+ ctx.logger?.verbose(`[claude] Unrecognised stream line: ${trimmed}`);
123
+ return;
124
+ }
125
+ const event = asRecord(parsed);
126
+ if (!event)
127
+ return;
128
+ const type = firstNonEmptyString(event.type);
129
+ const timestamp = resolveEventTimestamp(event);
130
+ if (type === 'assistant') {
131
+ await handleAssistant(event, ctx, state, timestamp);
132
+ return;
133
+ }
134
+ if (type === 'user') {
135
+ await handleUser(event, ctx, state, timestamp);
136
+ return;
137
+ }
138
+ if (type === 'result') {
139
+ await handleResult(event, ctx, state, timestamp);
140
+ return;
141
+ }
142
+ ctx.logger?.verbose(`[claude] Ignored event: ${type ?? 'unknown'}`);
143
+ }
144
+ /** Buffering helper mirroring the other harness parsers. */
145
+ export class ClaudeEventStreamParser extends EventStreamParser {
146
+ constructor(ctx, state) {
147
+ super((line) => processClaudeStdoutLine(line, ctx, state));
148
+ }
149
+ }
150
+ //# sourceMappingURL=claude-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-stream.js","sourceRoot":"","sources":["../../../src/harness/claude/claude-stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Relativize an absolute path under the project root, leaving relative paths. */
2
+ export declare function toProjectRelative(target: string, projectRoot: string): string;
3
+ /** Short, human-readable tool summary following Claude Code's tool input shapes. */
4
+ export declare function claudeToolSummary(toolName: string, input: Record<string, unknown> | undefined): string;
5
+ //# sourceMappingURL=claude-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-tools.d.ts","sourceRoot":"","sources":["../../../src/harness/claude/claude-tools.ts"],"names":[],"mappings":"AAKA,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACzC,MAAM,CAoBR"}
@@ -0,0 +1,30 @@
1
+ import path from 'node:path';
2
+ import { firstNonEmptyString } from '../stream.js';
3
+ const SUMMARY_MAX = 60;
4
+ /** Relativize an absolute path under the project root, leaving relative paths. */
5
+ export function toProjectRelative(target, projectRoot) {
6
+ return path.isAbsolute(target) ? path.relative(projectRoot, target) : target;
7
+ }
8
+ /** Short, human-readable tool summary following Claude Code's tool input shapes. */
9
+ export function claudeToolSummary(toolName, input) {
10
+ const i = input ?? {};
11
+ let raw;
12
+ switch (toolName) {
13
+ case 'Bash':
14
+ raw = firstNonEmptyString(i.command);
15
+ break;
16
+ case 'Read':
17
+ case 'Edit':
18
+ case 'Write':
19
+ raw = firstNonEmptyString(i.file_path);
20
+ break;
21
+ case 'Glob':
22
+ case 'Grep':
23
+ raw = firstNonEmptyString(i.pattern);
24
+ break;
25
+ default:
26
+ raw = JSON.stringify(i);
27
+ }
28
+ return (raw ?? '').slice(0, SUMMARY_MAX);
29
+ }
30
+ //# sourceMappingURL=claude-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-tools.js","sourceRoot":"","sources":["../../../src/harness/claude/claude-tools.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,kFAAkF;AAClF,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,WAAmB;IACnE,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAC/E,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,iBAAiB,CAC/B,QAAgB,EAChB,KAA0C;IAE1C,MAAM,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;IACtB,IAAI,GAAuB,CAAC;IAC5B,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,GAAG,GAAG,mBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM;QACR,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO;YACV,GAAG,GAAG,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACvC,MAAM;QACR,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACT,GAAG,GAAG,mBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM;QACR;YACE,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AAC3C,CAAC"}
@@ -13,4 +13,5 @@ export * from './agy/agy.js';
13
13
  export * from './opencode/opencode.js';
14
14
  export * from './codex/codex.js';
15
15
  export * from './pi/pi.js';
16
+ export * from './claude/claude-exec.js';
16
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/harness/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAGjB,MAAM,uCAAuC,CAAC;AAM/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,cAAc,CAAC,CAMvF,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAY9D;AAED,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/harness/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAGjB,MAAM,uCAAuC,CAAC;AAO/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,cAAc,CAAC,CAOvF,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAY9D;AAED,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { availableHarnessNames, lookupHarness, } from '../core/foundation/harness-catalog.js';
2
2
  import { AgyAdapter } from './agy/agy.js';
3
+ import { ClaudeAdapter } from './claude/claude-exec.js';
3
4
  import { CodexAdapter } from './codex/codex.js';
4
5
  import { MockAdapter } from './mock.js';
5
6
  import { OpencodeAdapter } from './opencode/opencode.js';
@@ -11,6 +12,7 @@ import { PiAdapter } from './pi/pi.js';
11
12
  */
12
13
  export const harnessAdapterFactories = {
13
14
  agy: () => new AgyAdapter(),
15
+ claude: () => new ClaudeAdapter(),
14
16
  codex: () => new CodexAdapter(),
15
17
  mock: () => new MockAdapter(),
16
18
  opencode: () => new OpencodeAdapter(),
@@ -32,4 +34,5 @@ export * from './agy/agy.js';
32
34
  export * from './opencode/opencode.js';
33
35
  export * from './codex/codex.js';
34
36
  export * from './pi/pi.js';
37
+ export * from './claude/claude-exec.js';
35
38
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/harness/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,qBAAqB,EACrB,aAAa,GACd,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAwD;IAC1F,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,UAAU,EAAE;IAC3B,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAE;IAC/B,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE;IAC7B,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE;IACrC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,SAAS,EAAE;CAC1B,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,6BAA6B,IAAI,0BAA0B,qBAAqB,EAAE,CAAC,IAAI,CACrF,IAAI,CACL,EAAE,CACJ,CAAC;IACJ,CAAC;IACD,OAAO,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/harness/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,qBAAqB,EACrB,aAAa,GACd,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAwD;IAC1F,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,UAAU,EAAE;IAC3B,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,aAAa,EAAE;IACjC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAE;IAC/B,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE;IAC7B,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE;IACrC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,SAAS,EAAE;CAC1B,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,6BAA6B,IAAI,0BAA0B,qBAAqB,EAAE,CAAC,IAAI,CACrF,IAAI,CACL,EAAE,CACJ,CAAC;IACJ,CAAC;IACD,OAAO,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Whole-run token and cost totals for one opencode task. The adapter records
3
+ * what the JSON stream reported and, after the process exits, reads the
4
+ * session export to recover the final step the stream leaves out.
5
+ */
6
+ export interface OpencodeUsageTotals {
7
+ promptTokens: number;
8
+ candidateTokens: number;
9
+ totalTokens: number;
10
+ cachedTokens: number;
11
+ reasoningTokens: number;
12
+ cost: number;
13
+ }
14
+ /** Mutable per-run state carried through the parser closure. */
15
+ export interface OpencodeRunTracker {
16
+ sessionID?: string;
17
+ totals: OpencodeUsageTotals;
18
+ }
19
+ export declare function createOpencodeRunTracker(): OpencodeRunTracker;
20
+ /** Record the top-level `sessionID` every opencode stream event carries. */
21
+ export declare function trackOpencodeSessionID(tracker: OpencodeRunTracker, event: unknown): void;
22
+ /** Accumulate one streamed `step_finish` usage record into the run totals. */
23
+ export declare function addOpencodeUsage(tracker: OpencodeRunTracker, usage: OpencodeUsageTotals): void;
24
+ /**
25
+ * Parse `opencode session export` JSON. Returns the session's whole-run totals,
26
+ * or `null` when the payload is not an object carrying an `info` record.
27
+ */
28
+ export declare function parseOpencodeSessionExport(raw: string): OpencodeUsageTotals | null;
29
+ /**
30
+ * Run `opencode session export --standalone <sessionID>` and parse it. Any
31
+ * spawn failure, non-zero exit, timeout, or unparseable payload yields `null`
32
+ * so the caller appends nothing.
33
+ */
34
+ export declare function readOpencodeSessionUsage(bin: string, projectRoot: string, sessionID: string, timeoutSeconds: number): Promise<OpencodeUsageTotals | null>;
35
+ /** Field-wise remainder, clamped at zero so the session total is never undershot. */
36
+ export declare function computeOpencodeRemainder(streamed: OpencodeUsageTotals, session: OpencodeUsageTotals): OpencodeUsageTotals;
37
+ /**
38
+ * Append one `tokens` event carrying only what the session export reported
39
+ * beyond the streamed totals. Appends nothing when the remainder is empty.
40
+ */
41
+ export declare function appendOpencodeSessionRemainder(specFolderPath: string, taskNumber: string, streamed: OpencodeUsageTotals, session: OpencodeUsageTotals): Promise<void>;
42
+ //# sourceMappingURL=opencode-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-session.d.ts","sourceRoot":"","sources":["../../../src/harness/opencode/opencode-session.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,gEAAgE;AAChE,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,mBAAmB,CAAC;CAC7B;AAaD,wBAAgB,wBAAwB,IAAI,kBAAkB,CAE7D;AAED,4EAA4E;AAC5E,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAMxF;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAQ9F;AAOD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAuBlF;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAgBrC;AAED,qFAAqF;AACrF,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,EAAE,mBAAmB,GAC3B,mBAAmB,CAYrB;AAMD;;;GAGG;AACH,wBAAsB,8BAA8B,CAClD,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAUf"}
@@ -0,0 +1,123 @@
1
+ import { spawnWithTimeout } from '../process.js';
2
+ import { asRecord } from '../stream.js';
3
+ import { appendHarnessEvent } from '../types.js';
4
+ function emptyTotals() {
5
+ return {
6
+ promptTokens: 0,
7
+ candidateTokens: 0,
8
+ totalTokens: 0,
9
+ cachedTokens: 0,
10
+ reasoningTokens: 0,
11
+ cost: 0,
12
+ };
13
+ }
14
+ export function createOpencodeRunTracker() {
15
+ return { totals: emptyTotals() };
16
+ }
17
+ /** Record the top-level `sessionID` every opencode stream event carries. */
18
+ export function trackOpencodeSessionID(tracker, event) {
19
+ const eventObj = asRecord(event);
20
+ const sessionID = eventObj?.sessionID;
21
+ if (typeof sessionID === 'string' && sessionID.length > 0) {
22
+ tracker.sessionID = sessionID;
23
+ }
24
+ }
25
+ /** Accumulate one streamed `step_finish` usage record into the run totals. */
26
+ export function addOpencodeUsage(tracker, usage) {
27
+ const totals = tracker.totals;
28
+ totals.promptTokens += usage.promptTokens;
29
+ totals.candidateTokens += usage.candidateTokens;
30
+ totals.totalTokens += usage.totalTokens;
31
+ totals.cachedTokens += usage.cachedTokens;
32
+ totals.reasoningTokens += usage.reasoningTokens;
33
+ totals.cost += usage.cost;
34
+ }
35
+ function count(value) {
36
+ const numeric = Number(value);
37
+ return Number.isFinite(numeric) ? numeric : 0;
38
+ }
39
+ /**
40
+ * Parse `opencode session export` JSON. Returns the session's whole-run totals,
41
+ * or `null` when the payload is not an object carrying an `info` record.
42
+ */
43
+ export function parseOpencodeSessionExport(raw) {
44
+ let parsed;
45
+ try {
46
+ parsed = JSON.parse(raw);
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ const info = asRecord(asRecord(parsed)?.info);
52
+ if (!info) {
53
+ return null;
54
+ }
55
+ const tokens = asRecord(info.tokens);
56
+ const cache = asRecord(tokens?.cache);
57
+ const promptTokens = count(tokens?.input);
58
+ const candidateTokens = count(tokens?.output);
59
+ return {
60
+ promptTokens,
61
+ candidateTokens,
62
+ totalTokens: promptTokens + candidateTokens,
63
+ cachedTokens: count(cache?.read) + count(cache?.write),
64
+ reasoningTokens: count(tokens?.reasoning),
65
+ cost: count(info.cost),
66
+ };
67
+ }
68
+ /**
69
+ * Run `opencode session export --standalone <sessionID>` and parse it. Any
70
+ * spawn failure, non-zero exit, timeout, or unparseable payload yields `null`
71
+ * so the caller appends nothing.
72
+ */
73
+ export async function readOpencodeSessionUsage(bin, projectRoot, sessionID, timeoutSeconds) {
74
+ let result;
75
+ try {
76
+ result = await spawnWithTimeout({
77
+ command: bin,
78
+ args: ['session', 'export', '--standalone', sessionID],
79
+ cwd: projectRoot,
80
+ timeoutSeconds,
81
+ });
82
+ }
83
+ catch {
84
+ return null;
85
+ }
86
+ if (result.exitCode !== 0 || result.timedOut) {
87
+ return null;
88
+ }
89
+ return parseOpencodeSessionExport(result.stdout);
90
+ }
91
+ /** Field-wise remainder, clamped at zero so the session total is never undershot. */
92
+ export function computeOpencodeRemainder(streamed, session) {
93
+ const remainder = (recorded, total) => Math.max(0, total - recorded);
94
+ const promptTokens = remainder(streamed.promptTokens, session.promptTokens);
95
+ const candidateTokens = remainder(streamed.candidateTokens, session.candidateTokens);
96
+ return {
97
+ promptTokens,
98
+ candidateTokens,
99
+ totalTokens: promptTokens + candidateTokens,
100
+ cachedTokens: remainder(streamed.cachedTokens, session.cachedTokens),
101
+ reasoningTokens: remainder(streamed.reasoningTokens, session.reasoningTokens),
102
+ cost: remainder(streamed.cost, session.cost),
103
+ };
104
+ }
105
+ function hasUsage(totals) {
106
+ return Object.values(totals).some((value) => value > 0);
107
+ }
108
+ /**
109
+ * Append one `tokens` event carrying only what the session export reported
110
+ * beyond the streamed totals. Appends nothing when the remainder is empty.
111
+ */
112
+ export async function appendOpencodeSessionRemainder(specFolderPath, taskNumber, streamed, session) {
113
+ const remainder = computeOpencodeRemainder(streamed, session);
114
+ if (!hasUsage(remainder)) {
115
+ return;
116
+ }
117
+ await appendHarnessEvent(specFolderPath, taskNumber, {
118
+ type: 'tokens',
119
+ timestamp: new Date().toISOString(),
120
+ data: remainder,
121
+ });
122
+ }
123
+ //# sourceMappingURL=opencode-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-session.js","sourceRoot":"","sources":["../../../src/harness/opencode/opencode-session.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { type OsqConfig } from '../../core/foundation/config.js';
2
2
  import type { Logger } from '../../core/foundation/logger.js';
3
3
  import { EventStreamParser } from '../stream.js';
4
4
  import { type HarnessAdapter, type InteractiveSessionOptions, type InteractiveUsage, type ReadInteractiveUsageOptions, type SpawnResult, type SpawnTaskOptions, type ToolEventData } from '../types.js';
5
+ import { type OpencodeRunTracker } from './opencode-session.js';
5
6
  export declare const OPENCODE_PLANNER_AGENT_TEMPLATE = "---\ndescription: Interactive planning agent for osq\nmode: all\npermission:\n read: allow\n edit: allow\n glob: allow\n grep: allow\n bash:\n \"*\": deny\n \"osq lint*\": allow\n \"pnpm osq lint*\": allow\n \"npx osq lint*\": allow\n \"*;*\": deny\n \"*&*\": deny\n \"*|*\": deny\n \"*>*\": deny\n \"*<*\": deny\n \"*`*\": deny\n \"*$(*\": deny\n \"*\\n*\": deny\n webfetch: deny\n websearch: deny\n---\n\nFollow PLANNER.md strictly for change planning rules and procedure.\nWrites are expected only under openspec/changes/<id>/.\nThe only shell command you may run is `osq lint <slug>`.\n";
6
7
  export declare const OPENCODE_AGENT_TEMPLATE: string;
7
8
  export declare function resolveOpencodeBinary(config?: OsqConfig): Promise<string>;
@@ -19,7 +20,7 @@ export interface OpencodeTokensData {
19
20
  export declare function extractOpencodeTokens(event: unknown): OpencodeTokensData | null;
20
21
  export declare function extractToolEventSummary(toolName: string, input: unknown): string;
21
22
  export declare function extractOpencodeToolEvent(event: unknown): ToolEventData | null;
22
- export declare function processOpencodeStdoutLine(line: string, specFolderPath: string, taskNumber: string, logger?: Logger, projectRoot?: string): Promise<void>;
23
+ export declare function processOpencodeStdoutLine(line: string, specFolderPath: string, taskNumber: string, logger?: Logger, projectRoot?: string, tracker?: OpencodeRunTracker): Promise<void>;
23
24
  /**
24
25
  * Compatibility subclass retained for existing callers and tests; the buffering
25
26
  * and serialization logic lives entirely in the shared {@link EventStreamParser}.
@@ -1 +1 @@
1
- {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/harness/opencode/opencode.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAc,MAAM,iCAAiC,CAAC;AAM7E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAK9D,OAAO,EACL,iBAAiB,EAIlB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACrB,KAAK,2BAA2B,EAChC,KAAK,WAAW,EAChB,KAAK,gBAAgB,EAErB,KAAK,aAAa,EAEnB,MAAM,aAAa,CAAC;AAGrB,eAAO,MAAM,+BAA+B,8nBA4B3C,CAAC;AAEF,eAAO,MAAM,uBAAuB,QAcnC,CAAC;AAEF,wBAAsB,qBAAqB,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ/E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAErE;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuHpF;AAED,eAAO,MAAM,SAAS,0BAAoB,CAAC;AAE3C,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,GAAG,IAAI,CAwD/E;AAKD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAuBhF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CA4B7E;AAyBD,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAsEf;AAED;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,iBAAiB;gBAClD,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;CAK9F;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B3C;AAED,qBAAa,eAAgB,YAAW,cAAc;IACpD,QAAQ,CAAC,IAAI,cAAc;IAErB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IA+C5D,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC;IAqCtD,gBAAgB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC;IA4BrE,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAK5F"}
1
+ {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/harness/opencode/opencode.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,SAAS,EAAc,MAAM,iCAAiC,CAAC;AAM7E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAK9D,OAAO,EACL,iBAAiB,EAIlB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACrB,KAAK,2BAA2B,EAChC,KAAK,WAAW,EAChB,KAAK,gBAAgB,EAErB,KAAK,aAAa,EAEnB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,kBAAkB,EAMxB,MAAM,uBAAuB,CAAC;AAG/B,eAAO,MAAM,+BAA+B,8nBA4B3C,CAAC;AAEF,eAAO,MAAM,uBAAuB,QAcnC,CAAC;AAEF,wBAAsB,qBAAqB,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ/E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAErE;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAoHpF;AAED,eAAO,MAAM,SAAS,0BAAoB,CAAC;AAE3C,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,GAAG,IAAI,CAwD/E;AAKD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAuBhF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CA4B7E;AAyBD,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,IAAI,CAAC,CA4Df;AA8BD;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,iBAAiB;gBAClD,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;CAK9F;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAqC3C;AAED,qBAAa,eAAgB,YAAW,cAAc;IACpD,QAAQ,CAAC,IAAI,cAAc;IAErB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IA+C5D,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC;IA+DtD,gBAAgB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC;IAyBrE,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAK5F"}
@@ -2,6 +2,7 @@ import { spawn } from 'node:child_process';
2
2
  import fsSync from 'node:fs';
3
3
  import fs from 'node:fs/promises';
4
4
  import path from 'node:path';
5
+ import { OPENCODE_TESTED_RANGE, assessOpencodeVersion, } from '../../core/foundation/config-opencode.js';
5
6
  import { loadConfig } from '../../core/foundation/config.js';
6
7
  import { MANAGED_AGENTS_BLOCK, OSQ_END_MARKER, OSQ_START_MARKER, } from '../../core/foundation/init.js';
7
8
  import { relativizeToolSummary } from '../../core/run/summary.js';
@@ -10,6 +11,7 @@ import { spawnWithTimeout } from '../process.js';
10
11
  import { buildExecutorPrompt } from '../prompt.js';
11
12
  import { EventStreamParser, asRecord, firstNonEmptyString, resolveEventTimestamp, } from '../stream.js';
12
13
  import { appendHarnessEvent, } from '../types.js';
14
+ import { addOpencodeUsage, appendOpencodeSessionRemainder, createOpencodeRunTracker, readOpencodeSessionUsage, trackOpencodeSessionID, } from './opencode-session.js';
13
15
  import { readOpencodeInteractiveUsage } from './opencode-usage.js';
14
16
  export const OPENCODE_PLANNER_AGENT_TEMPLATE = `---
15
17
  description: Interactive planning agent for osq
@@ -71,23 +73,21 @@ export async function buildOpencodeArgs(options) {
71
73
  const { projectRoot, specFolderPath, taskNumber, config } = options;
72
74
  const agent = config?.opencode?.agent || 'osq-coder';
73
75
  const model = config?.opencode?.model || process.env.OSQ_MODEL || 'deepseek/deepseek-flash';
76
+ const variant = config?.opencode?.variant;
77
+ const modelArg = variant ? `${model}#${variant}` : model;
74
78
  const prompt = buildOpencodePrompt(options);
75
79
  const args = [
76
80
  'run',
77
81
  prompt,
82
+ '--standalone',
78
83
  '--agent',
79
84
  agent,
80
85
  '--auto',
81
86
  '--format',
82
87
  'json',
83
- '--dir',
84
- projectRoot,
85
88
  '--model',
86
- model,
89
+ modelArg,
87
90
  ];
88
- if (config?.opencode?.variant) {
89
- args.push('--variant', config.opencode.variant);
90
- }
91
91
  const changeDocName = fsSync.existsSync(path.resolve(specFolderPath, 'proposal.md'))
92
92
  ? 'proposal.md'
93
93
  : 'spec.md';
@@ -279,7 +279,7 @@ async function emitObservedToolEvent(specFolderPath, taskNumber, toolEvent, time
279
279
  });
280
280
  logger?.verbose(`[tool] ${toolEvent.tool}: ${summary}`);
281
281
  }
282
- export async function processOpencodeStdoutLine(line, specFolderPath, taskNumber, logger, projectRoot) {
282
+ export async function processOpencodeStdoutLine(line, specFolderPath, taskNumber, logger, projectRoot, tracker) {
283
283
  const trimmed = line.trim();
284
284
  if (!trimmed) {
285
285
  return;
@@ -296,27 +296,16 @@ export async function processOpencodeStdoutLine(line, specFolderPath, taskNumber
296
296
  return;
297
297
  }
298
298
  const eventObj = event;
299
+ if (tracker) {
300
+ trackOpencodeSessionID(tracker, eventObj);
301
+ }
299
302
  const toolEvent = extractOpencodeToolEvent(eventObj);
300
303
  if (toolEvent) {
301
304
  await emitObservedToolEvent(specFolderPath, taskNumber, toolEvent, resolveEventTimestamp(eventObj), projectRoot, logger);
302
305
  return;
303
306
  }
304
307
  if (eventObj.type === 'step_finish') {
305
- const tokensData = extractOpencodeTokens(eventObj);
306
- if (tokensData) {
307
- await appendHarnessEvent(specFolderPath, taskNumber, {
308
- type: 'tokens',
309
- timestamp: resolveEventTimestamp(eventObj),
310
- data: {
311
- promptTokens: tokensData.promptTokens,
312
- candidateTokens: tokensData.candidateTokens,
313
- totalTokens: tokensData.totalTokens,
314
- cachedTokens: tokensData.cachedTokens,
315
- reasoningTokens: tokensData.reasoningTokens,
316
- cost: tokensData.cost,
317
- },
318
- });
319
- }
308
+ await emitOpencodeTokensEvent(specFolderPath, taskNumber, eventObj, tracker);
320
309
  return;
321
310
  }
322
311
  // A completed text part is the adapter's final assistant message. Only whole
@@ -337,6 +326,28 @@ export async function processOpencodeStdoutLine(line, specFolderPath, taskNumber
337
326
  // stdout can never leak onto the terminal.
338
327
  logger?.verbose(`[opencode] Unknown event type: ${eventObj.type}`);
339
328
  }
329
+ /** Append one `tokens` event for a streamed `step_finish`, tracking the run sum. */
330
+ async function emitOpencodeTokensEvent(specFolderPath, taskNumber, eventObj, tracker) {
331
+ const tokensData = extractOpencodeTokens(eventObj);
332
+ if (!tokensData) {
333
+ return;
334
+ }
335
+ if (tracker) {
336
+ addOpencodeUsage(tracker, tokensData);
337
+ }
338
+ await appendHarnessEvent(specFolderPath, taskNumber, {
339
+ type: 'tokens',
340
+ timestamp: resolveEventTimestamp(eventObj),
341
+ data: {
342
+ promptTokens: tokensData.promptTokens,
343
+ candidateTokens: tokensData.candidateTokens,
344
+ totalTokens: tokensData.totalTokens,
345
+ cachedTokens: tokensData.cachedTokens,
346
+ reasoningTokens: tokensData.reasoningTokens,
347
+ cost: tokensData.cost,
348
+ },
349
+ });
350
+ }
340
351
  /**
341
352
  * Compatibility subclass retained for existing callers and tests; the buffering
342
353
  * and serialization logic lives entirely in the shared {@link EventStreamParser}.
@@ -369,7 +380,15 @@ export async function preflightOpencode(projectRoot, config) {
369
380
  process.exit(1);
370
381
  return { version: '', bin };
371
382
  }
372
- const version = (result.stdout || result.stderr).trim().split('\n')[0].trim();
383
+ const raw = (result.stdout || result.stderr).trim();
384
+ const version = raw.split('\n')[0]?.trim() ?? '';
385
+ const assessment = assessOpencodeVersion(raw);
386
+ if (!assessment.ok) {
387
+ console.error(`opencode ${assessment.version} is not supported; the opencode adapter needs opencode 2 (tested ${OPENCODE_TESTED_RANGE})`);
388
+ process.exitCode = 1;
389
+ process.exit(1);
390
+ return { version, bin };
391
+ }
373
392
  console.log(version);
374
393
  return { version, bin };
375
394
  }
@@ -424,7 +443,8 @@ export class OpencodeAdapter {
424
443
  const { projectRoot, specFolderPath, taskNumber, timeoutSeconds = 1800, config } = options;
425
444
  const args = await buildOpencodeArgs(options);
426
445
  const bin = await resolveOpencodeBinary(config);
427
- const streamParser = new EventStreamParser((line) => processOpencodeStdoutLine(line, specFolderPath, taskNumber, options.logger, projectRoot));
446
+ const tracker = createOpencodeRunTracker();
447
+ const streamParser = new EventStreamParser((line) => processOpencodeStdoutLine(line, specFolderPath, taskNumber, options.logger, projectRoot, tracker));
428
448
  const result = await spawnWithTimeout({
429
449
  command: bin,
430
450
  args,
@@ -441,6 +461,13 @@ export class OpencodeAdapter {
441
461
  onSpawn: options.onSpawn,
442
462
  });
443
463
  await streamParser.flush();
464
+ if (tracker.sessionID) {
465
+ const timeoutSeconds = config?.timeouts?.harnessPreflightSeconds ?? 10;
466
+ const sessionTotals = await readOpencodeSessionUsage(bin, projectRoot, tracker.sessionID, timeoutSeconds);
467
+ if (sessionTotals) {
468
+ await appendOpencodeSessionRemainder(specFolderPath, taskNumber, tracker.totals, sessionTotals);
469
+ }
470
+ }
444
471
  return {
445
472
  exitCode: result.exitCode,
446
473
  timedOut: result.timedOut,
@@ -454,16 +481,13 @@ export class OpencodeAdapter {
454
481
  const { prompt, cwd, model, agent } = options;
455
482
  const config = await loadConfig(cwd).catch(() => undefined);
456
483
  const bin = await resolveOpencodeBinary(config);
457
- const args = [prompt, '--dir', cwd];
484
+ const args = ['mini', '--prompt', prompt];
458
485
  if (model) {
459
486
  args.push('--model', model);
460
487
  }
461
488
  if (agent) {
462
489
  args.push('--agent', agent);
463
490
  }
464
- if (config?.opencode?.variant) {
465
- args.push('--variant', config.opencode.variant);
466
- }
467
491
  const child = spawn(bin, args, {
468
492
  cwd,
469
493
  env: process.env,