issue-flow 0.18.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/README.md +43 -97
  2. package/dist/agent-4DHRKZ2Z.js +32 -0
  3. package/dist/{analyze-Q4ONIWRZ.js → analyze-UEJ2R3H5.js} +42 -41
  4. package/dist/analyze-UEJ2R3H5.js.map +1 -0
  5. package/dist/{apply-EEFPY2W4.js → apply-QDYNQMUX.js} +22 -24
  6. package/dist/apply-QDYNQMUX.js.map +1 -0
  7. package/dist/artifacts-AMJQJFFV.js +82 -0
  8. package/dist/artifacts-AMJQJFFV.js.map +1 -0
  9. package/dist/{bench-WWWXLTFH.js → bench-RNRXVEFK.js} +42 -42
  10. package/dist/{chunk-RYOUZ6EK.js → chunk-23VHVVKW.js} +3 -3
  11. package/dist/chunk-2EYLOS5I.js +99 -0
  12. package/dist/chunk-2EYLOS5I.js.map +1 -0
  13. package/dist/{chunk-C5TL7T4V.js → chunk-2YM2VH6R.js} +2 -2
  14. package/dist/{chunk-XUEMATVY.js → chunk-37O2FMAN.js} +28 -25
  15. package/dist/chunk-37O2FMAN.js.map +1 -0
  16. package/dist/chunk-44RF3VFG.js +717 -0
  17. package/dist/chunk-44RF3VFG.js.map +1 -0
  18. package/dist/chunk-6AOZCWN2.js +21 -0
  19. package/dist/chunk-6AOZCWN2.js.map +1 -0
  20. package/dist/chunk-7MJGYPHF.js +1571 -0
  21. package/dist/chunk-7MJGYPHF.js.map +1 -0
  22. package/dist/{chunk-SA6HXL4Y.js → chunk-7WBUEBD5.js} +9 -9
  23. package/dist/chunk-7WBUEBD5.js.map +1 -0
  24. package/dist/chunk-7ZZUSMBJ.js +35 -0
  25. package/dist/chunk-7ZZUSMBJ.js.map +1 -0
  26. package/dist/{chunk-QJ44VG5G.js → chunk-ADH6RJNX.js} +3 -3
  27. package/dist/{chunk-34OCSKOB.js → chunk-AKL5UPR6.js} +159 -114
  28. package/dist/chunk-AKL5UPR6.js.map +1 -0
  29. package/dist/{chunk-7F7LGMVO.js → chunk-BTBJ5UOO.js} +12 -12
  30. package/dist/{chunk-7F7LGMVO.js.map → chunk-BTBJ5UOO.js.map} +1 -1
  31. package/dist/{chunk-HOAHMERN.js → chunk-CLZ6RRZL.js} +21 -21
  32. package/dist/chunk-DBLXLKGU.js +1201 -0
  33. package/dist/chunk-DBLXLKGU.js.map +1 -0
  34. package/dist/{chunk-DUS5ZNKL.js → chunk-DIMDAYZS.js} +7 -6
  35. package/dist/chunk-DZ3DZ3EN.js +278 -0
  36. package/dist/chunk-DZ3DZ3EN.js.map +1 -0
  37. package/dist/{chunk-CRGIQFUQ.js → chunk-E2H3JV2E.js} +3 -1
  38. package/dist/chunk-E2H3JV2E.js.map +1 -0
  39. package/dist/{chunk-45WZ6GMI.js → chunk-EORDSKWZ.js} +17 -17
  40. package/dist/chunk-EORDSKWZ.js.map +1 -0
  41. package/dist/{chunk-LTH6XYZ3.js → chunk-EYKPWHT7.js} +40 -30
  42. package/dist/chunk-EYKPWHT7.js.map +1 -0
  43. package/dist/{chunk-OODXFCQV.js → chunk-FU2FQ4JE.js} +14 -16
  44. package/dist/{chunk-OODXFCQV.js.map → chunk-FU2FQ4JE.js.map} +1 -1
  45. package/dist/{chunk-V7QOIQYC.js → chunk-G442RDFX.js} +9 -23
  46. package/dist/{chunk-V7QOIQYC.js.map → chunk-G442RDFX.js.map} +1 -1
  47. package/dist/{chunk-QPGEFLMY.js → chunk-I64N6RL6.js} +7 -7
  48. package/dist/{chunk-KRAGAUKD.js → chunk-JBYXJOJJ.js} +201 -64
  49. package/dist/chunk-JBYXJOJJ.js.map +1 -0
  50. package/dist/{chunk-SOM4QA6C.js → chunk-JCR5C5A7.js} +93 -18
  51. package/dist/chunk-JCR5C5A7.js.map +1 -0
  52. package/dist/{chunk-RNFUVKC3.js → chunk-K5NM26NV.js} +30 -13
  53. package/dist/chunk-K5NM26NV.js.map +1 -0
  54. package/dist/{chunk-YVPZUN6X.js → chunk-KUA6KBBD.js} +335 -38
  55. package/dist/chunk-KUA6KBBD.js.map +1 -0
  56. package/dist/{chunk-KMCS76ZW.js → chunk-KUL64XUF.js} +44 -12
  57. package/dist/chunk-KUL64XUF.js.map +1 -0
  58. package/dist/{chunk-HAKDLR6N.js → chunk-MAJ6QDRL.js} +65 -78
  59. package/dist/chunk-MAJ6QDRL.js.map +1 -0
  60. package/dist/{chunk-DGRTJD5R.js → chunk-MML2G7IC.js} +7 -7
  61. package/dist/chunk-NP47HRX2.js +136 -0
  62. package/dist/chunk-NP47HRX2.js.map +1 -0
  63. package/dist/{chunk-3R27MJ5R.js → chunk-PFWHHYEO.js} +3 -3
  64. package/dist/{chunk-ECU7YO7S.js → chunk-PM5YWJYO.js} +22 -6
  65. package/dist/chunk-PM5YWJYO.js.map +1 -0
  66. package/dist/{chunk-E4I6MMHD.js → chunk-PXPTIXJF.js} +154 -101
  67. package/dist/chunk-PXPTIXJF.js.map +1 -0
  68. package/dist/{chunk-CWSQVHVV.js → chunk-QJHZ3HYJ.js} +248 -102
  69. package/dist/chunk-QJHZ3HYJ.js.map +1 -0
  70. package/dist/{chunk-LI35PIIS.js → chunk-RDPK7LYK.js} +20 -117
  71. package/dist/chunk-RDPK7LYK.js.map +1 -0
  72. package/dist/{chunk-PMLE7KAQ.js → chunk-RMIBLFG3.js} +30 -14
  73. package/dist/chunk-RMIBLFG3.js.map +1 -0
  74. package/dist/{chunk-62GVVZQO.js → chunk-T736DSZI.js} +32 -316
  75. package/dist/chunk-T736DSZI.js.map +1 -0
  76. package/dist/{chunk-TZYINKCC.js → chunk-UDUUUFQF.js} +57 -29
  77. package/dist/chunk-UDUUUFQF.js.map +1 -0
  78. package/dist/{chunk-NEWNXZ65.js → chunk-V7GETODQ.js} +36 -28
  79. package/dist/{chunk-NEWNXZ65.js.map → chunk-V7GETODQ.js.map} +1 -1
  80. package/dist/{chunk-PPZ3K4YM.js → chunk-VHQMMY2D.js} +2 -2
  81. package/dist/{chunk-ZVZMWNCG.js → chunk-VJ3PF6B7.js} +50 -16
  82. package/dist/chunk-VJ3PF6B7.js.map +1 -0
  83. package/dist/{chunk-L6HSKTQE.js → chunk-W7LZLJAF.js} +4 -4
  84. package/dist/{chunk-6K2LCFG6.js → chunk-WB4FA2EH.js} +70 -81
  85. package/dist/chunk-WB4FA2EH.js.map +1 -0
  86. package/dist/{chunk-LGHND47K.js → chunk-WQSGL5LX.js} +22 -16
  87. package/dist/chunk-WQSGL5LX.js.map +1 -0
  88. package/dist/{chunk-ICM463EO.js → chunk-XNK5UN2D.js} +5 -649
  89. package/dist/chunk-XNK5UN2D.js.map +1 -0
  90. package/dist/{chunk-7UMMFOL2.js → chunk-Y2KOWABB.js} +39 -24
  91. package/dist/chunk-Y2KOWABB.js.map +1 -0
  92. package/dist/{chunk-QF7VEL3M.js → chunk-YC24E66P.js} +568 -158
  93. package/dist/chunk-YC24E66P.js.map +1 -0
  94. package/dist/{chunk-EG2MGDP5.js → chunk-Z6RCKCVB.js} +52 -46
  95. package/dist/chunk-Z6RCKCVB.js.map +1 -0
  96. package/dist/{chunk-YUNBOUQH.js → chunk-ZPGNVBWY.js} +8 -8
  97. package/dist/cli.js +132 -62
  98. package/dist/cli.js.map +1 -1
  99. package/dist/compat-OJG76J4I.js +24 -0
  100. package/dist/{config-LEBZZCJP.js → config-6YTWPDBK.js} +20 -17
  101. package/dist/{contract-JH2WBIO6.js → contract-HWLFFL3F.js} +2 -2
  102. package/dist/{conventions-XOT6YW5L.js → conventions-5UPOTU42.js} +20 -16
  103. package/dist/{conventions-XOT6YW5L.js.map → conventions-5UPOTU42.js.map} +1 -1
  104. package/dist/db-QAZG4LQD.js +264 -0
  105. package/dist/db-QAZG4LQD.js.map +1 -0
  106. package/dist/diagnostics-YEFB42E5.js +25 -0
  107. package/dist/execute-QCT64D37.js +38 -0
  108. package/dist/{generate-JGW5JSKB.js → generate-QATMDKOK.js} +46 -43
  109. package/dist/generate-QATMDKOK.js.map +1 -0
  110. package/dist/{git-A2IP32PQ.js → git-XGOECXWG.js} +2 -3
  111. package/dist/history-NBPUZVGQ.js +101 -0
  112. package/dist/history-NBPUZVGQ.js.map +1 -0
  113. package/dist/init-4LB2YKWP.js +28 -0
  114. package/dist/{operations-O4FORFIH.js → operations-RUQP2Y2F.js} +78 -52
  115. package/dist/operations-RUQP2Y2F.js.map +1 -0
  116. package/dist/{permissions-G4XCAESF.js → permissions-QZPUUBSO.js} +5 -6
  117. package/dist/plan-2NMSHTMD.js +38 -0
  118. package/dist/{policy-U5NBFAO5.js → policy-RKKFF5A2.js} +17 -15
  119. package/dist/{policy-U5NBFAO5.js.map → policy-RKKFF5A2.js.map} +1 -1
  120. package/dist/pr-QKFO5HI3.js +42 -0
  121. package/dist/pr-review-H2BFD6F2.js +33 -0
  122. package/dist/prd-ET6XKYRS.js +37 -0
  123. package/dist/{ps-76L6ZAZL.js → ps-UIKSOUAQ.js} +26 -15
  124. package/dist/ps-UIKSOUAQ.js.map +1 -0
  125. package/dist/{recorder-2BAKPBRA.js → recorder-LOU3PTIE.js} +11 -7
  126. package/dist/registry-HV7M6MAH.js +17 -0
  127. package/dist/repository-RCRR6RDE.js +80 -0
  128. package/dist/resume-BWJZGBLZ.js +278 -0
  129. package/dist/resume-BWJZGBLZ.js.map +1 -0
  130. package/dist/review-2MTZLNSS.js +38 -0
  131. package/dist/routing-RM5ABHHD.js +35 -0
  132. package/dist/run-XMACQBRJ.js +61 -0
  133. package/dist/{session-publisher-KAJQRHNZ.js → session-publisher-Q5TNEZPX.js} +3 -3
  134. package/dist/session-publisher-Q5TNEZPX.js.map +1 -0
  135. package/dist/{state-manager-UPHO2EA2.js → state-manager-SRN4VJSX.js} +9 -4
  136. package/dist/state-manager-SRN4VJSX.js.map +1 -0
  137. package/dist/{usage-KTMYXAPF.js → usage-JOODVE5O.js} +69 -63
  138. package/dist/usage-JOODVE5O.js.map +1 -0
  139. package/dist/web-TLMWJ2BM.js +205 -0
  140. package/dist/web-TLMWJ2BM.js.map +1 -0
  141. package/package.json +22 -8
  142. package/prompts/analyze.md +16 -19
  143. package/prompts/execute.md +73 -144
  144. package/prompts/generate.md +23 -10
  145. package/prompts/plan.md +32 -60
  146. package/prompts/pr-review.md +58 -40
  147. package/prompts/pr.md +50 -16
  148. package/prompts/prd.md +26 -19
  149. package/prompts/review.md +41 -18
  150. package/web/public/app.js +111 -112
  151. package/dist/agent-HMZTXCRT.js +0 -30
  152. package/dist/analyze-Q4ONIWRZ.js.map +0 -1
  153. package/dist/apply-EEFPY2W4.js.map +0 -1
  154. package/dist/chunk-34OCSKOB.js.map +0 -1
  155. package/dist/chunk-45WZ6GMI.js.map +0 -1
  156. package/dist/chunk-62GVVZQO.js.map +0 -1
  157. package/dist/chunk-6K2LCFG6.js.map +0 -1
  158. package/dist/chunk-7UMMFOL2.js.map +0 -1
  159. package/dist/chunk-CRGIQFUQ.js.map +0 -1
  160. package/dist/chunk-CWSQVHVV.js.map +0 -1
  161. package/dist/chunk-E4I6MMHD.js.map +0 -1
  162. package/dist/chunk-ECU7YO7S.js.map +0 -1
  163. package/dist/chunk-EG2MGDP5.js.map +0 -1
  164. package/dist/chunk-HAKDLR6N.js.map +0 -1
  165. package/dist/chunk-ICM463EO.js.map +0 -1
  166. package/dist/chunk-KMCS76ZW.js.map +0 -1
  167. package/dist/chunk-KRAGAUKD.js.map +0 -1
  168. package/dist/chunk-LGHND47K.js.map +0 -1
  169. package/dist/chunk-LI35PIIS.js.map +0 -1
  170. package/dist/chunk-LTH6XYZ3.js.map +0 -1
  171. package/dist/chunk-PMLE7KAQ.js.map +0 -1
  172. package/dist/chunk-QF7VEL3M.js.map +0 -1
  173. package/dist/chunk-RNFUVKC3.js.map +0 -1
  174. package/dist/chunk-SA6HXL4Y.js.map +0 -1
  175. package/dist/chunk-SOM4QA6C.js.map +0 -1
  176. package/dist/chunk-TZYINKCC.js.map +0 -1
  177. package/dist/chunk-WCCZJL7W.js +0 -141
  178. package/dist/chunk-WCCZJL7W.js.map +0 -1
  179. package/dist/chunk-XEYH6ZZI.js +0 -289
  180. package/dist/chunk-XEYH6ZZI.js.map +0 -1
  181. package/dist/chunk-XUEMATVY.js.map +0 -1
  182. package/dist/chunk-XZUEFTUP.js +0 -243
  183. package/dist/chunk-XZUEFTUP.js.map +0 -1
  184. package/dist/chunk-YVPZUN6X.js.map +0 -1
  185. package/dist/chunk-ZVZMWNCG.js.map +0 -1
  186. package/dist/diagnostics-HTCWF7F4.js +0 -23
  187. package/dist/execute-LELOSR5T.js +0 -37
  188. package/dist/generate-JGW5JSKB.js.map +0 -1
  189. package/dist/init-TO6MUXO4.js +0 -26
  190. package/dist/operations-O4FORFIH.js.map +0 -1
  191. package/dist/plan-OXAT344Q.js +0 -34
  192. package/dist/pr-UZHNKKZC.js +0 -39
  193. package/dist/pr-review-Q4ACAWDM.js +0 -32
  194. package/dist/prd-6CYEMLDY.js +0 -33
  195. package/dist/ps-76L6ZAZL.js.map +0 -1
  196. package/dist/registry-XLHHYLTR.js +0 -15
  197. package/dist/resume-URCU6CIJ.js +0 -244
  198. package/dist/resume-URCU6CIJ.js.map +0 -1
  199. package/dist/review-LVZT2TMW.js +0 -35
  200. package/dist/routing-EK6RBZM4.js +0 -33
  201. package/dist/run-2RXJCJKT.js +0 -56
  202. package/dist/usage-KTMYXAPF.js.map +0 -1
  203. package/dist/web-B5UPHHR5.js +0 -172
  204. package/dist/web-B5UPHHR5.js.map +0 -1
  205. /package/dist/{agent-HMZTXCRT.js.map → agent-4DHRKZ2Z.js.map} +0 -0
  206. /package/dist/{bench-WWWXLTFH.js.map → bench-RNRXVEFK.js.map} +0 -0
  207. /package/dist/{chunk-RYOUZ6EK.js.map → chunk-23VHVVKW.js.map} +0 -0
  208. /package/dist/{chunk-C5TL7T4V.js.map → chunk-2YM2VH6R.js.map} +0 -0
  209. /package/dist/{chunk-QJ44VG5G.js.map → chunk-ADH6RJNX.js.map} +0 -0
  210. /package/dist/{chunk-HOAHMERN.js.map → chunk-CLZ6RRZL.js.map} +0 -0
  211. /package/dist/{chunk-DUS5ZNKL.js.map → chunk-DIMDAYZS.js.map} +0 -0
  212. /package/dist/{chunk-QPGEFLMY.js.map → chunk-I64N6RL6.js.map} +0 -0
  213. /package/dist/{chunk-DGRTJD5R.js.map → chunk-MML2G7IC.js.map} +0 -0
  214. /package/dist/{chunk-3R27MJ5R.js.map → chunk-PFWHHYEO.js.map} +0 -0
  215. /package/dist/{chunk-PPZ3K4YM.js.map → chunk-VHQMMY2D.js.map} +0 -0
  216. /package/dist/{chunk-L6HSKTQE.js.map → chunk-W7LZLJAF.js.map} +0 -0
  217. /package/dist/{chunk-YUNBOUQH.js.map → chunk-ZPGNVBWY.js.map} +0 -0
  218. /package/dist/{config-LEBZZCJP.js.map → compat-OJG76J4I.js.map} +0 -0
  219. /package/dist/{contract-JH2WBIO6.js.map → config-6YTWPDBK.js.map} +0 -0
  220. /package/dist/{diagnostics-HTCWF7F4.js.map → contract-HWLFFL3F.js.map} +0 -0
  221. /package/dist/{execute-LELOSR5T.js.map → diagnostics-YEFB42E5.js.map} +0 -0
  222. /package/dist/{git-A2IP32PQ.js.map → execute-QCT64D37.js.map} +0 -0
  223. /package/dist/{init-TO6MUXO4.js.map → git-XGOECXWG.js.map} +0 -0
  224. /package/dist/{permissions-G4XCAESF.js.map → init-4LB2YKWP.js.map} +0 -0
  225. /package/dist/{plan-OXAT344Q.js.map → permissions-QZPUUBSO.js.map} +0 -0
  226. /package/dist/{pr-UZHNKKZC.js.map → plan-2NMSHTMD.js.map} +0 -0
  227. /package/dist/{pr-review-Q4ACAWDM.js.map → pr-QKFO5HI3.js.map} +0 -0
  228. /package/dist/{prd-6CYEMLDY.js.map → pr-review-H2BFD6F2.js.map} +0 -0
  229. /package/dist/{recorder-2BAKPBRA.js.map → prd-ET6XKYRS.js.map} +0 -0
  230. /package/dist/{registry-XLHHYLTR.js.map → recorder-LOU3PTIE.js.map} +0 -0
  231. /package/dist/{review-LVZT2TMW.js.map → registry-HV7M6MAH.js.map} +0 -0
  232. /package/dist/{routing-EK6RBZM4.js.map → repository-RCRR6RDE.js.map} +0 -0
  233. /package/dist/{run-2RXJCJKT.js.map → review-2MTZLNSS.js.map} +0 -0
  234. /package/dist/{session-publisher-KAJQRHNZ.js.map → routing-RM5ABHHD.js.map} +0 -0
  235. /package/dist/{state-manager-UPHO2EA2.js.map → run-XMACQBRJ.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/artifact-files.ts","../src/commands/artifacts.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { hashIssueContent } from '../issues/hash.js';\nimport { parseIssueMarkdown } from '../issues/markdown.js';\nimport { issueMetadataSchema, taskPlanSchema } from '../schemas.js';\nimport { executionContext, inspectTaskPlan } from './task-plan.js';\n\n/** Explicit files only: never resolves a project, imports storage, or reconciles a run. */\nexport async function inspectArtifact(operation: string, path?: string, metadataPath?: string) {\n try {\n if (!path || !['plan', 'context', 'issue'].includes(operation))\n throw new Error('Expected plan <tasks.json> or issue <issue.md> [metadata.json]');\n const content = await readFile(path, 'utf8');\n if (operation === 'plan' || operation === 'context') {\n if (metadataPath) throw new Error('plan accepts only one file');\n const value: unknown = JSON.parse(content);\n const inspection = inspectTaskPlan(value);\n if (operation === 'plan' || !inspection.ok) return inspection;\n return {\n schemaVersion: 1 as const,\n ok: true as const,\n data: executionContext(taskPlanSchema.parse(value)),\n errors: [],\n };\n }\n const issue = parseIssueMarkdown(content);\n if (!issue.title) throw new Error('The first non-empty line must be an H1 title');\n const contentHash = hashIssueContent(issue.title, issue.body);\n if (metadataPath) {\n const metadata = issueMetadataSchema.parse(JSON.parse(await readFile(metadataPath, 'utf8')));\n if (metadata.title !== issue.title || metadata.contentHash !== contentHash)\n throw new Error('Metadata title/hash differs from issue.md');\n if (/[/\\\\]/.test(metadata.id) || ['.', '..'].includes(metadata.id))\n throw new Error('Unsafe issue id');\n const expected = /^\\d+$/.test(metadata.id) ? Number(metadata.id) : null;\n if (metadata.number !== expected) throw new Error('Metadata number differs from id');\n }\n return {\n schemaVersion: 1 as const,\n ok: true as const,\n data: { ...issue, contentHash },\n errors: [],\n };\n } catch (error) {\n return {\n schemaVersion: 1 as const,\n ok: false as const,\n data: null,\n errors: [\n {\n code: 'invalid_artifact',\n path: path ?? '',\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n}\n","import { inspectArtifact } from '../core/artifact-files.js';\n\nexport async function runArtifacts(\n operation: string,\n path?: string,\n metadata?: string,\n json = false,\n): Promise<number> {\n const result = await inspectArtifact(operation, path, metadata);\n if (json) console.log(JSON.stringify(result));\n else if (!result.ok)\n console.error(\n result.errors.map((error) => `${error.code}: ${error.path}: ${error.message}`).join('\\n'),\n );\n else console.log(JSON.stringify(result.data, null, 2));\n return result.ok ? 0 : 1;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAAA,SAAS,gBAAgB;AAOzB,eAAsB,gBAAgB,WAAmB,MAAe,cAAuB;AAC7F,MAAI;AACF,QAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,WAAW,OAAO,EAAE,SAAS,SAAS;AAC3D,YAAM,IAAI,MAAM,gEAAgE;AAClF,UAAM,UAAU,MAAM,SAAS,MAAM,MAAM;AAC3C,QAAI,cAAc,UAAU,cAAc,WAAW;AACnD,UAAI,aAAc,OAAM,IAAI,MAAM,4BAA4B;AAC9D,YAAM,QAAiB,KAAK,MAAM,OAAO;AACzC,YAAM,aAAa,gBAAgB,KAAK;AACxC,UAAI,cAAc,UAAU,CAAC,WAAW,GAAI,QAAO;AACnD,aAAO;AAAA,QACL,eAAe;AAAA,QACf,IAAI;AAAA,QACJ,MAAM,iBAAiB,eAAe,MAAM,KAAK,CAAC;AAAA,QAClD,QAAQ,CAAC;AAAA,MACX;AAAA,IACF;AACA,UAAM,QAAQ,mBAAmB,OAAO;AACxC,QAAI,CAAC,MAAM,MAAO,OAAM,IAAI,MAAM,8CAA8C;AAChF,UAAM,cAAc,iBAAiB,MAAM,OAAO,MAAM,IAAI;AAC5D,QAAI,cAAc;AAChB,YAAM,WAAW,oBAAoB,MAAM,KAAK,MAAM,MAAM,SAAS,cAAc,MAAM,CAAC,CAAC;AAC3F,UAAI,SAAS,UAAU,MAAM,SAAS,SAAS,gBAAgB;AAC7D,cAAM,IAAI,MAAM,2CAA2C;AAC7D,UAAI,QAAQ,KAAK,SAAS,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,SAAS,SAAS,EAAE;AAC/D,cAAM,IAAI,MAAM,iBAAiB;AACnC,YAAM,WAAW,QAAQ,KAAK,SAAS,EAAE,IAAI,OAAO,SAAS,EAAE,IAAI;AACnE,UAAI,SAAS,WAAW,SAAU,OAAM,IAAI,MAAM,iCAAiC;AAAA,IACrF;AACA,WAAO;AAAA,MACL,eAAe;AAAA,MACf,IAAI;AAAA,MACJ,MAAM,EAAE,GAAG,OAAO,YAAY;AAAA,MAC9B,QAAQ,CAAC;AAAA,IACX;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,eAAe;AAAA,MACf,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,QAAQ;AAAA,QACN;AAAA,UACE,MAAM;AAAA,UACN,MAAM,QAAQ;AAAA,UACd,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACtDA,eAAsB,aACpB,WACA,MACA,UACA,OAAO,OACU;AACjB,QAAM,SAAS,MAAM,gBAAgB,WAAW,MAAM,QAAQ;AAC9D,MAAI,KAAM,SAAQ,IAAI,KAAK,UAAU,MAAM,CAAC;AAAA,WACnC,CAAC,OAAO;AACf,YAAQ;AAAA,MACN,OAAO,OAAO,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM,OAAO,EAAE,EAAE,KAAK,IAAI;AAAA,IAC1F;AAAA,MACG,SAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,MAAM,CAAC,CAAC;AACrD,SAAO,OAAO,KAAK,IAAI;AACzB;","names":[]}
@@ -1,62 +1,62 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  summarizePhaseTiming
4
- } from "./chunk-QJ44VG5G.js";
4
+ } from "./chunk-ADH6RJNX.js";
5
5
  import {
6
6
  runAcceptance
7
- } from "./chunk-E4I6MMHD.js";
8
- import "./chunk-L6HSKTQE.js";
7
+ } from "./chunk-PXPTIXJF.js";
8
+ import "./chunk-W7LZLJAF.js";
9
9
  import {
10
10
  evaluateCeilings,
11
11
  spendFromCost
12
- } from "./chunk-TZYINKCC.js";
13
- import "./chunk-WCCZJL7W.js";
14
- import "./chunk-DGRTJD5R.js";
15
- import "./chunk-ZVZMWNCG.js";
12
+ } from "./chunk-UDUUUFQF.js";
13
+ import "./chunk-MML2G7IC.js";
14
+ import "./chunk-VJ3PF6B7.js";
16
15
  import {
17
16
  ensureHarnessVersion,
18
17
  setIssuesCliOverrides
19
- } from "./chunk-QF7VEL3M.js";
20
- import {
21
- resetStorageResolutionCache,
22
- resolveIssuePaths
23
- } from "./chunk-LI35PIIS.js";
18
+ } from "./chunk-YC24E66P.js";
24
19
  import {
25
20
  printError,
26
21
  printInfo,
27
- printWarning
28
- } from "./chunk-XZUEFTUP.js";
29
- import "./chunk-QPGEFLMY.js";
30
- import {
31
- GLOBAL_ROOT_ENV,
32
- ISSUES_DIR_NAME,
33
- getGlobalRoot
34
- } from "./chunk-HAKDLR6N.js";
35
- import {
36
- run
37
- } from "./chunk-YVPZUN6X.js";
22
+ printWarning,
23
+ resetStorageResolutionCache,
24
+ resolveIssuePaths
25
+ } from "./chunk-DBLXLKGU.js";
26
+ import "./chunk-I64N6RL6.js";
38
27
  import {
39
28
  createInitialSnapshot,
40
29
  reduceSessionEvent
41
- } from "./chunk-DUS5ZNKL.js";
42
- import "./chunk-6K2LCFG6.js";
30
+ } from "./chunk-DIMDAYZS.js";
31
+ import "./chunk-WB4FA2EH.js";
43
32
  import {
44
33
  redactSecrets
45
- } from "./chunk-PPZ3K4YM.js";
34
+ } from "./chunk-VHQMMY2D.js";
35
+ import "./chunk-P3LRUNC6.js";
36
+ import "./chunk-RDPK7LYK.js";
46
37
  import {
47
38
  loadTaskPlan
48
- } from "./chunk-SOM4QA6C.js";
39
+ } from "./chunk-JCR5C5A7.js";
40
+ import "./chunk-NP47HRX2.js";
41
+ import "./chunk-44RF3VFG.js";
42
+ import "./chunk-7MJGYPHF.js";
49
43
  import {
50
44
  sessionSnapshotSchema
51
- } from "./chunk-ICM463EO.js";
52
- import "./chunk-XEYH6ZZI.js";
53
- import "./chunk-P3LRUNC6.js";
54
- import "./chunk-3R27MJ5R.js";
45
+ } from "./chunk-XNK5UN2D.js";
46
+ import {
47
+ GLOBAL_ROOT_ENV,
48
+ ISSUES_DIR_NAME,
49
+ getGlobalRoot
50
+ } from "./chunk-MAJ6QDRL.js";
51
+ import {
52
+ run
53
+ } from "./chunk-KUA6KBBD.js";
54
+ import "./chunk-PFWHHYEO.js";
55
55
 
56
56
  // src/commands/bench.ts
57
- import { mkdir as mkdir3, writeFile as writeFile2 } from "fs/promises";
58
- import { dirname as dirname2 } from "path";
59
- import { createInterface } from "readline";
57
+ import { mkdir as mkdir3, writeFile as writeFile2 } from "node:fs/promises";
58
+ import { dirname as dirname2 } from "node:path";
59
+ import { createInterface } from "node:readline";
60
60
 
61
61
  // src/benchmark/corpus.ts
62
62
  var TASK_CLASSES = ["trivial", "small", "medium", "analysis"];
@@ -154,13 +154,13 @@ function createLiveRepeatRunner(deps) {
154
154
  }
155
155
 
156
156
  // src/benchmark/real.ts
157
- import { mkdir as mkdir2 } from "fs/promises";
158
- import { join as join2 } from "path";
157
+ import { mkdir as mkdir2 } from "node:fs/promises";
158
+ import { join as join2 } from "node:path";
159
159
 
160
160
  // src/benchmark/fixtures/materialize.ts
161
- import { mkdir, mkdtemp, rm, writeFile } from "fs/promises";
162
- import { tmpdir } from "os";
163
- import { dirname, join } from "path";
161
+ import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
162
+ import { tmpdir } from "node:os";
163
+ import { dirname, join } from "node:path";
164
164
 
165
165
  // src/benchmark/fixtures/templates.ts
166
166
  function withSeed(content, seed) {
@@ -577,7 +577,7 @@ async function runRealCorpus(options) {
577
577
  }
578
578
 
579
579
  // src/benchmark/report.ts
580
- import { hostname } from "os";
580
+ import { hostname } from "node:os";
581
581
  function formatMs(value) {
582
582
  return value === null ? "\u2014" : `${Math.round(value)}`;
583
583
  }
@@ -858,7 +858,7 @@ async function runBench(options = {}) {
858
858
  const harnessVersion = options.harnessVersion ?? await collectHarnessVersion("claude");
859
859
  const runner = options.runner ?? createLiveRepeatRunner({
860
860
  runPipeline: options.runPipeline ?? (async (issue) => {
861
- const { runPipeline } = await import("./run-2RXJCJKT.js");
861
+ const { runPipeline } = await import("./run-XMACQBRJ.js");
862
862
  return runPipeline(issue, "auto", void 0, true, false, { yes: true, only: true });
863
863
  })
864
864
  });
@@ -907,4 +907,4 @@ export {
907
907
  estimateCampaignUsd,
908
908
  runBench
909
909
  };
910
- //# sourceMappingURL=bench-WWWXLTFH.js.map
910
+ //# sourceMappingURL=bench-RNRXVEFK.js.map
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  sessionSnapshotSchema
4
- } from "./chunk-ICM463EO.js";
4
+ } from "./chunk-XNK5UN2D.js";
5
5
 
6
6
  // src/storage/session-file.ts
7
- import { readFile, stat as statFile } from "fs/promises";
7
+ import { readFile, stat as statFile } from "node:fs/promises";
8
8
  async function readSessionFile(filePath) {
9
9
  let raw;
10
10
  let mtimeMs;
@@ -27,4 +27,4 @@ async function readSessionFile(filePath) {
27
27
  export {
28
28
  readSessionFile
29
29
  };
30
- //# sourceMappingURL=chunk-RYOUZ6EK.js.map
30
+ //# sourceMappingURL=chunk-23VHVVKW.js.map
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ databaseOptionsForProject,
4
+ openIssueFlowDatabase
5
+ } from "./chunk-7MJGYPHF.js";
6
+
7
+ // src/storage/db/queries.ts
8
+ async function query(work, options = {}) {
9
+ const database = await openIssueFlowDatabase(options);
10
+ try {
11
+ return work(database);
12
+ } finally {
13
+ database.close();
14
+ }
15
+ }
16
+ async function listStoredIssueIds(input) {
17
+ return query(
18
+ (database) => database.prepare(
19
+ `SELECT issue_id FROM pipelines WHERE project_id = ?
20
+ ORDER BY COALESCE(last_attempt_at, updated_at) DESC, issue_id`
21
+ ).all(input.projectId).map((row) => row.issue_id),
22
+ input.databaseOptions ?? databaseOptionsForProject(input.projectId)
23
+ );
24
+ }
25
+ async function latestStoredIssueSnapshot(input) {
26
+ return query((database) => {
27
+ const row = database.prepare(
28
+ `SELECT snapshot.payload_json FROM snapshots AS snapshot
29
+ WHERE snapshot.project_id = ? AND snapshot.issue_id = ?
30
+ ORDER BY snapshot.updated_at DESC, snapshot.rowid DESC LIMIT 1`
31
+ ).get(input.projectId, input.issueId);
32
+ return row === void 0 ? null : JSON.parse(row.payload_json);
33
+ }, input.databaseOptions ?? databaseOptionsForProject(input.projectId));
34
+ }
35
+ async function listStoredQueues(input) {
36
+ return query(
37
+ (database) => database.prepare("SELECT payload_json FROM queues WHERE project_id = ? ORDER BY updated_at DESC").all(input.projectId).map((row) => JSON.parse(row.payload_json)),
38
+ input.databaseOptions ?? databaseOptionsForProject(input.projectId)
39
+ );
40
+ }
41
+ async function listStoredIssueEvents(input) {
42
+ return query(
43
+ (database) => database.prepare(
44
+ `SELECT event.payload_json FROM events AS event
45
+ JOIN runs AS run ON run.id = event.run_id
46
+ WHERE event.project_id = ? AND run.issue_id = ?
47
+ ORDER BY run.started_at, event.sequence, event.rowid`
48
+ ).all(input.projectId, input.issueId).map((row, index) => {
49
+ const parsed = JSON.parse(row.payload_json);
50
+ if (typeof parsed === "object" && parsed !== null && "event" in parsed && typeof parsed.event === "object" && parsed.event !== null) {
51
+ const entry = parsed;
52
+ return { seq: index + 1, event: entry.event };
53
+ }
54
+ return {
55
+ seq: index + 1,
56
+ event: parsed
57
+ };
58
+ }),
59
+ input.databaseOptions ?? databaseOptionsForProject(input.projectId)
60
+ );
61
+ }
62
+ async function getStoredIssueHistory(input) {
63
+ return query((database) => {
64
+ const runs = database.prepare(
65
+ `SELECT id, status, started_at, finished_at, heartbeat_at
66
+ FROM runs WHERE project_id = ? AND issue_id = ? ORDER BY started_at`
67
+ ).all(input.projectId, input.issueId);
68
+ const phases = database.prepare(
69
+ `SELECT phase.run_id, phase.name, phase.status, phase.started_at, phase.finished_at,
70
+ phase.duration_ms, phase.input_tokens, phase.output_tokens, phase.cost_status,
71
+ phase.cost_amount
72
+ FROM phases AS phase JOIN runs AS run ON run.id = phase.run_id
73
+ WHERE run.project_id = ? AND run.issue_id = ? ORDER BY run.started_at, phase.started_at`
74
+ ).all(input.projectId, input.issueId);
75
+ const executions = database.prepare(
76
+ `SELECT payload_json FROM executions WHERE project_id = ? AND issue_id = ?
77
+ ORDER BY started_at, rowid`
78
+ ).all(input.projectId, input.issueId).map((row) => JSON.parse(row.payload_json));
79
+ const verifications = database.prepare(
80
+ `SELECT payload_json FROM verifications WHERE project_id = ? AND issue_id = ?
81
+ ORDER BY created_at, rowid`
82
+ ).all(input.projectId, input.issueId).map((row) => JSON.parse(row.payload_json));
83
+ const reviews = database.prepare(
84
+ `SELECT review.payload_json FROM reviews AS review
85
+ JOIN pull_requests AS pull ON pull.id = review.pull_request_id
86
+ WHERE pull.project_id = ? AND pull.issue_id = ? ORDER BY review.created_at, review.rowid`
87
+ ).all(input.projectId, input.issueId).map((row) => JSON.parse(row.payload_json));
88
+ return { issueId: input.issueId, runs, phases, executions, verifications, reviews };
89
+ }, input.databaseOptions ?? databaseOptionsForProject(input.projectId));
90
+ }
91
+
92
+ export {
93
+ listStoredIssueIds,
94
+ latestStoredIssueSnapshot,
95
+ listStoredQueues,
96
+ listStoredIssueEvents,
97
+ getStoredIssueHistory
98
+ };
99
+ //# sourceMappingURL=chunk-2EYLOS5I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/storage/db/queries.ts"],"sourcesContent":["import type { SessionSnapshot } from '../../core/session-state.js';\nimport type { ExecutionPlan } from '../../execution/types.js';\nimport type { ExecutionRecord } from '../../telemetry/types.js';\nimport {\n databaseOptionsForProject,\n type OpenIssueFlowDatabaseOptions,\n openIssueFlowDatabase,\n} from './index.js';\n\nasync function query<T>(\n work: (database: Awaited<ReturnType<typeof openIssueFlowDatabase>>) => T,\n options: OpenIssueFlowDatabaseOptions = {},\n): Promise<T> {\n const database = await openIssueFlowDatabase(options);\n try {\n return work(database);\n } finally {\n database.close();\n }\n}\n\n/** Canonical issue identities for a project, ordered by their last plan update. */\nexport async function listStoredIssueIds(input: {\n projectId: string;\n databaseOptions?: OpenIssueFlowDatabaseOptions;\n}): Promise<string[]> {\n return query(\n (database) =>\n database\n .prepare(\n `SELECT issue_id FROM pipelines WHERE project_id = ?\n ORDER BY COALESCE(last_attempt_at, updated_at) DESC, issue_id`,\n )\n .all<{ issue_id: string }>(input.projectId)\n .map((row) => row.issue_id),\n input.databaseOptions ?? databaseOptionsForProject(input.projectId),\n );\n}\n\n/** Latest durable snapshot for one issue, whether the run is active or finished. */\nexport async function latestStoredIssueSnapshot(input: {\n projectId: string;\n issueId: string;\n databaseOptions?: OpenIssueFlowDatabaseOptions;\n}): Promise<SessionSnapshot | null> {\n return query((database) => {\n const row = database\n .prepare(\n `SELECT snapshot.payload_json FROM snapshots AS snapshot\n WHERE snapshot.project_id = ? AND snapshot.issue_id = ?\n ORDER BY snapshot.updated_at DESC, snapshot.rowid DESC LIMIT 1`,\n )\n .get<{ payload_json: string }>(input.projectId, input.issueId);\n return row === undefined ? null : (JSON.parse(row.payload_json) as SessionSnapshot);\n }, input.databaseOptions ?? databaseOptionsForProject(input.projectId));\n}\n\n/** Canonical queue plans for one project. */\nexport async function listStoredQueues(input: {\n projectId: string;\n databaseOptions?: OpenIssueFlowDatabaseOptions;\n}): Promise<ExecutionPlan[]> {\n return query(\n (database) =>\n database\n .prepare('SELECT payload_json FROM queues WHERE project_id = ? ORDER BY updated_at DESC')\n .all<{ payload_json: string }>(input.projectId)\n .map((row) => JSON.parse(row.payload_json) as ExecutionPlan),\n input.databaseOptions ?? databaseOptionsForProject(input.projectId),\n );\n}\n\nexport interface StoredIssueEvent {\n seq: number;\n event: Record<string, unknown> & { type: string; at: string };\n}\n\n/** Ordered canonical journal for one issue across all of its runs. */\nexport async function listStoredIssueEvents(input: {\n projectId: string;\n issueId: string;\n databaseOptions?: OpenIssueFlowDatabaseOptions;\n}): Promise<StoredIssueEvent[]> {\n return query(\n (database) =>\n database\n .prepare(\n `SELECT event.payload_json FROM events AS event\n JOIN runs AS run ON run.id = event.run_id\n WHERE event.project_id = ? AND run.issue_id = ?\n ORDER BY run.started_at, event.sequence, event.rowid`,\n )\n .all<{ payload_json: string }>(input.projectId, input.issueId)\n .map((row, index) => {\n const parsed = JSON.parse(row.payload_json) as unknown;\n if (\n typeof parsed === 'object' &&\n parsed !== null &&\n 'event' in parsed &&\n typeof parsed.event === 'object' &&\n parsed.event !== null\n ) {\n const entry = parsed as StoredIssueEvent;\n return { seq: index + 1, event: entry.event };\n }\n return {\n seq: index + 1,\n event: parsed as StoredIssueEvent['event'],\n };\n }),\n input.databaseOptions ?? databaseOptionsForProject(input.projectId),\n );\n}\n\nexport interface StoredIssueHistory {\n issueId: string;\n runs: Array<Record<string, unknown>>;\n phases: Array<Record<string, unknown>>;\n executions: ExecutionRecord[];\n verifications: Array<Record<string, unknown>>;\n reviews: Array<Record<string, unknown>>;\n}\n\n/** Full relational history used by `issue-flow history`. */\nexport async function getStoredIssueHistory(input: {\n projectId: string;\n issueId: string;\n databaseOptions?: OpenIssueFlowDatabaseOptions;\n}): Promise<StoredIssueHistory> {\n return query((database) => {\n const runs = database\n .prepare(\n `SELECT id, status, started_at, finished_at, heartbeat_at\n FROM runs WHERE project_id = ? AND issue_id = ? ORDER BY started_at`,\n )\n .all<Record<string, unknown>>(input.projectId, input.issueId);\n const phases = database\n .prepare(\n `SELECT phase.run_id, phase.name, phase.status, phase.started_at, phase.finished_at,\n phase.duration_ms, phase.input_tokens, phase.output_tokens, phase.cost_status,\n phase.cost_amount\n FROM phases AS phase JOIN runs AS run ON run.id = phase.run_id\n WHERE run.project_id = ? AND run.issue_id = ? ORDER BY run.started_at, phase.started_at`,\n )\n .all<Record<string, unknown>>(input.projectId, input.issueId);\n const executions = database\n .prepare(\n `SELECT payload_json FROM executions WHERE project_id = ? AND issue_id = ?\n ORDER BY started_at, rowid`,\n )\n .all<{ payload_json: string }>(input.projectId, input.issueId)\n .map((row) => JSON.parse(row.payload_json) as ExecutionRecord);\n const verifications = database\n .prepare(\n `SELECT payload_json FROM verifications WHERE project_id = ? AND issue_id = ?\n ORDER BY created_at, rowid`,\n )\n .all<{ payload_json: string }>(input.projectId, input.issueId)\n .map((row) => JSON.parse(row.payload_json) as Record<string, unknown>);\n const reviews = database\n .prepare(\n `SELECT review.payload_json FROM reviews AS review\n JOIN pull_requests AS pull ON pull.id = review.pull_request_id\n WHERE pull.project_id = ? AND pull.issue_id = ? ORDER BY review.created_at, review.rowid`,\n )\n .all<{ payload_json: string }>(input.projectId, input.issueId)\n .map((row) => JSON.parse(row.payload_json) as Record<string, unknown>);\n return { issueId: input.issueId, runs, phases, executions, verifications, reviews };\n }, input.databaseOptions ?? databaseOptionsForProject(input.projectId));\n}\n"],"mappings":";;;;;;;AASA,eAAe,MACb,MACA,UAAwC,CAAC,GAC7B;AACZ,QAAM,WAAW,MAAM,sBAAsB,OAAO;AACpD,MAAI;AACF,WAAO,KAAK,QAAQ;AAAA,EACtB,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAGA,eAAsB,mBAAmB,OAGnB;AACpB,SAAO;AAAA,IACL,CAAC,aACC,SACG;AAAA,MACC;AAAA;AAAA,IAEF,EACC,IAA0B,MAAM,SAAS,EACzC,IAAI,CAAC,QAAQ,IAAI,QAAQ;AAAA,IAC9B,MAAM,mBAAmB,0BAA0B,MAAM,SAAS;AAAA,EACpE;AACF;AAGA,eAAsB,0BAA0B,OAIZ;AAClC,SAAO,MAAM,CAAC,aAAa;AACzB,UAAM,MAAM,SACT;AAAA,MACC;AAAA;AAAA;AAAA,IAGF,EACC,IAA8B,MAAM,WAAW,MAAM,OAAO;AAC/D,WAAO,QAAQ,SAAY,OAAQ,KAAK,MAAM,IAAI,YAAY;AAAA,EAChE,GAAG,MAAM,mBAAmB,0BAA0B,MAAM,SAAS,CAAC;AACxE;AAGA,eAAsB,iBAAiB,OAGV;AAC3B,SAAO;AAAA,IACL,CAAC,aACC,SACG,QAAQ,+EAA+E,EACvF,IAA8B,MAAM,SAAS,EAC7C,IAAI,CAAC,QAAQ,KAAK,MAAM,IAAI,YAAY,CAAkB;AAAA,IAC/D,MAAM,mBAAmB,0BAA0B,MAAM,SAAS;AAAA,EACpE;AACF;AAQA,eAAsB,sBAAsB,OAIZ;AAC9B,SAAO;AAAA,IACL,CAAC,aACC,SACG;AAAA,MACC;AAAA;AAAA;AAAA;AAAA,IAIF,EACC,IAA8B,MAAM,WAAW,MAAM,OAAO,EAC5D,IAAI,CAAC,KAAK,UAAU;AACnB,YAAM,SAAS,KAAK,MAAM,IAAI,YAAY;AAC1C,UACE,OAAO,WAAW,YAClB,WAAW,QACX,WAAW,UACX,OAAO,OAAO,UAAU,YACxB,OAAO,UAAU,MACjB;AACA,cAAM,QAAQ;AACd,eAAO,EAAE,KAAK,QAAQ,GAAG,OAAO,MAAM,MAAM;AAAA,MAC9C;AACA,aAAO;AAAA,QACL,KAAK,QAAQ;AAAA,QACb,OAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IACL,MAAM,mBAAmB,0BAA0B,MAAM,SAAS;AAAA,EACpE;AACF;AAYA,eAAsB,sBAAsB,OAIZ;AAC9B,SAAO,MAAM,CAAC,aAAa;AACzB,UAAM,OAAO,SACV;AAAA,MACC;AAAA;AAAA,IAEF,EACC,IAA6B,MAAM,WAAW,MAAM,OAAO;AAC9D,UAAM,SAAS,SACZ;AAAA,MACC;AAAA;AAAA;AAAA;AAAA;AAAA,IAKF,EACC,IAA6B,MAAM,WAAW,MAAM,OAAO;AAC9D,UAAM,aAAa,SAChB;AAAA,MACC;AAAA;AAAA,IAEF,EACC,IAA8B,MAAM,WAAW,MAAM,OAAO,EAC5D,IAAI,CAAC,QAAQ,KAAK,MAAM,IAAI,YAAY,CAAoB;AAC/D,UAAM,gBAAgB,SACnB;AAAA,MACC;AAAA;AAAA,IAEF,EACC,IAA8B,MAAM,WAAW,MAAM,OAAO,EAC5D,IAAI,CAAC,QAAQ,KAAK,MAAM,IAAI,YAAY,CAA4B;AACvE,UAAM,UAAU,SACb;AAAA,MACC;AAAA;AAAA;AAAA,IAGF,EACC,IAA8B,MAAM,WAAW,MAAM,OAAO,EAC5D,IAAI,CAAC,QAAQ,KAAK,MAAM,IAAI,YAAY,CAA4B;AACvE,WAAO,EAAE,SAAS,MAAM,SAAS,MAAM,QAAQ,YAAY,eAAe,QAAQ;AAAA,EACpF,GAAG,MAAM,mBAAmB,0BAA0B,MAAM,SAAS,CAAC;AACxE;","names":[]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/version.ts
4
- import { createRequire } from "module";
4
+ import { createRequire } from "node:module";
5
5
  var require2 = createRequire(import.meta.url);
6
6
  var UNKNOWN_VERSION = "0.0.0";
7
7
  var cached = null;
@@ -24,4 +24,4 @@ function getPackageVersion() {
24
24
  export {
25
25
  getPackageVersion
26
26
  };
27
- //# sourceMappingURL=chunk-C5TL7T4V.js.map
27
+ //# sourceMappingURL=chunk-2YM2VH6R.js.map
@@ -1,40 +1,43 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ parseDocumentResult
4
+ } from "./chunk-6AOZCWN2.js";
2
5
  import {
3
6
  isTransientFailure,
4
- readFileWithGrace,
5
7
  runPhaseWithRetry
6
- } from "./chunk-V7QOIQYC.js";
8
+ } from "./chunk-G442RDFX.js";
7
9
  import {
8
10
  issuePlaceholders,
9
11
  resolveCommandIssue
10
- } from "./chunk-SA6HXL4Y.js";
12
+ } from "./chunk-7WBUEBD5.js";
11
13
  import {
12
14
  publishPhaseMetrics,
13
15
  resolvePolicyPlaceholders
14
- } from "./chunk-KMCS76ZW.js";
16
+ } from "./chunk-KUL64XUF.js";
15
17
  import {
16
18
  applyPlaceholders,
17
19
  loadPrompt
18
- } from "./chunk-7F7LGMVO.js";
20
+ } from "./chunk-BTBJ5UOO.js";
19
21
  import {
20
22
  DEFAULT_HEADLESS_TIMEOUT_MS,
21
23
  runHeadless
22
- } from "./chunk-TZYINKCC.js";
23
- import {
24
- resolveIssuePaths
25
- } from "./chunk-LI35PIIS.js";
24
+ } from "./chunk-UDUUUFQF.js";
26
25
  import {
27
26
  getGlobalTimeout,
28
27
  printError,
29
- printSuccess
30
- } from "./chunk-XZUEFTUP.js";
28
+ printSuccess,
29
+ resolveIssuePaths
30
+ } from "./chunk-DBLXLKGU.js";
31
31
  import {
32
32
  loadTaskPlan,
33
33
  saveTaskPlan
34
- } from "./chunk-SOM4QA6C.js";
34
+ } from "./chunk-JCR5C5A7.js";
35
+ import {
36
+ writeFileAtomic
37
+ } from "./chunk-PFWHHYEO.js";
35
38
 
36
39
  // src/commands/prd.ts
37
- import { mkdir } from "fs/promises";
40
+ import { mkdir } from "node:fs/promises";
38
41
  async function runPrd(issue, resolvedIssue) {
39
42
  const issueNumber = issue.replace(/^#/, "");
40
43
  const paths = await resolveIssuePaths(issueNumber);
@@ -48,13 +51,12 @@ async function runPrd(issue, resolvedIssue) {
48
51
  const prompt = applyPlaceholders(template, {
49
52
  // The repository's own conventions. Empty when it declares none, which is
50
53
  // what keeps the rendered prompt identical to the pre-policy one.
51
- ...await resolvePolicyPlaceholders(),
54
+ ...await resolvePolicyPlaceholders({ phase: "prd" }),
52
55
  __ISSUE_NUMBER__: issueNumber,
53
- __PRD_PATH__: prdPath,
54
56
  // Absolute: the analysis lives in the global storage, outside the working
55
57
  // directory the agent is started in.
56
58
  __ANALYSIS_PATH__: paths.analysisFile,
57
- ...issuePlaceholders(resolution.resolved)
59
+ ...issuePlaceholders(resolution.resolved, paths.issueFile)
58
60
  });
59
61
  const outcome = await runPhaseWithRetry({
60
62
  phase: "prd",
@@ -71,11 +73,11 @@ async function runPrd(issue, resolvedIssue) {
71
73
  // json (not text) so the CLI reports usage: the envelope's `result`
72
74
  // field carries the same assistant text this phase already consumed.
73
75
  outputFormat: "json",
74
- allowedTools: ["Bash", "Read", "Glob", "Grep", "Write"],
76
+ allowedTools: ["Bash", "Read", "Glob", "Grep"],
75
77
  addDirs: [paths.issueDir],
76
78
  statusMessage: `Generating PRD for issue #${issueNumber}...`,
77
79
  phase: "prd",
78
- permission: "workspace"
80
+ permission: "read-only"
79
81
  });
80
82
  publishPhaseMetrics("prd", result.cost, startedAtMs, result.agent?.provider);
81
83
  if (!result.success) {
@@ -86,12 +88,13 @@ async function runPrd(issue, resolvedIssue) {
86
88
  };
87
89
  }
88
90
  try {
89
- const content = await readFileWithGrace(prdPath);
90
- if (content.length < 10) {
91
- return { ok: false, transient: true, error: "PRD file was created but appears empty" };
92
- }
93
- } catch {
94
- return { ok: false, transient: true, error: `PRD file was not created at ${prdPath}` };
91
+ await writeFileAtomic(prdPath, parseDocumentResult(result.result, "prd"));
92
+ } catch (error) {
93
+ return {
94
+ ok: false,
95
+ transient: true,
96
+ error: `Invalid PRD output: ${error.message}`
97
+ };
95
98
  }
96
99
  return { ok: true };
97
100
  }
@@ -114,4 +117,4 @@ async function runPrd(issue, resolvedIssue) {
114
117
  export {
115
118
  runPrd
116
119
  };
117
- //# sourceMappingURL=chunk-XUEMATVY.js.map
120
+ //# sourceMappingURL=chunk-37O2FMAN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/prd.ts"],"sourcesContent":["import { mkdir } from 'node:fs/promises';\nimport { parseDocumentResult } from '../core/document-result.js';\nimport { DEFAULT_HEADLESS_TIMEOUT_MS, runHeadless } from '../core/headless.js';\nimport { runPhaseWithRetry } from '../core/phase-runner.js';\nimport { applyPlaceholders, loadPrompt } from '../core/prompt-resolver.js';\nimport { publishPhaseMetrics } from '../core/session-metrics.js';\nimport { loadTaskPlan, saveTaskPlan } from '../core/state-manager.js';\nimport { getGlobalTimeout } from '../core/verbose.js';\nimport { issuePlaceholders, resolveCommandIssue } from '../issues/context.js';\nimport type { ResolvedIssue } from '../issues/types.js';\nimport { resolvePolicyPlaceholders } from '../policy/placeholders.js';\nimport { resolveIssuePaths } from '../storage/resolve.js';\nimport { printError, printSuccess } from '../ui/logger.js';\nimport { writeFileAtomic } from '../utils/fs.js';\nimport { isTransientFailure } from '../utils/retry.js';\n\nexport async function runPrd(issue: string, resolvedIssue?: ResolvedIssue): Promise<number> {\n const issueNumber = issue.replace(/^#/, '');\n const paths = await resolveIssuePaths(issueNumber);\n const prdPath = paths.prdFile;\n\n const resolution = await resolveCommandIssue(issueNumber, resolvedIssue);\n if (!resolution.ok) {\n return resolution.code;\n }\n\n await mkdir(paths.issueDir, { recursive: true });\n\n const template = await loadPrompt('prd');\n const prompt = applyPlaceholders(template, {\n // The repository's own conventions. Empty when it declares none, which is\n // what keeps the rendered prompt identical to the pre-policy one.\n ...(await resolvePolicyPlaceholders({ phase: 'prd' })),\n __ISSUE_NUMBER__: issueNumber,\n // Absolute: the analysis lives in the global storage, outside the working\n // directory the agent is started in.\n __ANALYSIS_PATH__: paths.analysisFile,\n ...issuePlaceholders(resolution.resolved, paths.issueFile),\n });\n\n const outcome = await runPhaseWithRetry({\n phase: 'prd',\n attempt: async () => {\n const startedAtMs = Date.now();\n const result = await runHeadless({\n prompt,\n maxTurns: 25,\n timeout: getGlobalTimeout() ?? DEFAULT_HEADLESS_TIMEOUT_MS,\n timeoutHistory: {\n phase: 'prd',\n journalFiles: [paths.rotatedEventsFile, paths.eventsFile],\n },\n // json (not text) so the CLI reports usage: the envelope's `result`\n // field carries the same assistant text this phase already consumed.\n outputFormat: 'json',\n allowedTools: ['Bash', 'Read', 'Glob', 'Grep'],\n addDirs: [paths.issueDir],\n statusMessage: `Generating PRD for issue #${issueNumber}...`,\n phase: 'prd',\n permission: 'read-only',\n });\n // One event per attempt; the reducer sums them into the phase total.\n publishPhaseMetrics('prd', result.cost, startedAtMs, result.agent?.provider);\n\n if (!result.success) {\n return {\n ok: false,\n transient: result.retryExhausted !== true && isTransientFailure(1, result.error ?? ''),\n error: `PRD generation failed: ${result.error}`,\n };\n }\n\n try {\n await writeFileAtomic(prdPath, parseDocumentResult(result.result, 'prd'));\n } catch (error) {\n return {\n ok: false,\n transient: true,\n error: `Invalid PRD output: ${(error as Error).message}`,\n };\n }\n\n return { ok: true };\n },\n });\n\n if (!outcome.ok) {\n printError(outcome.error ?? `PRD generation failed for issue #${issueNumber}`);\n return 1;\n }\n\n // Update pipeline state\n const tasksPath = paths.tasksFile;\n try {\n const plan = await loadTaskPlan(tasksPath);\n plan.pipeline.prdCompleted = true;\n await saveTaskPlan(tasksPath, plan);\n } catch {\n // tasks.json may not exist yet\n }\n\n printSuccess(`PRD saved to ${prdPath}`);\n return 0;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,aAAa;AAgBtB,eAAsB,OAAO,OAAe,eAAgD;AAC1F,QAAM,cAAc,MAAM,QAAQ,MAAM,EAAE;AAC1C,QAAM,QAAQ,MAAM,kBAAkB,WAAW;AACjD,QAAM,UAAU,MAAM;AAEtB,QAAM,aAAa,MAAM,oBAAoB,aAAa,aAAa;AACvE,MAAI,CAAC,WAAW,IAAI;AAClB,WAAO,WAAW;AAAA,EACpB;AAEA,QAAM,MAAM,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAE/C,QAAM,WAAW,MAAM,WAAW,KAAK;AACvC,QAAM,SAAS,kBAAkB,UAAU;AAAA;AAAA;AAAA,IAGzC,GAAI,MAAM,0BAA0B,EAAE,OAAO,MAAM,CAAC;AAAA,IACpD,kBAAkB;AAAA;AAAA;AAAA,IAGlB,mBAAmB,MAAM;AAAA,IACzB,GAAG,kBAAkB,WAAW,UAAU,MAAM,SAAS;AAAA,EAC3D,CAAC;AAED,QAAM,UAAU,MAAM,kBAAkB;AAAA,IACtC,OAAO;AAAA,IACP,SAAS,YAAY;AACnB,YAAM,cAAc,KAAK,IAAI;AAC7B,YAAM,SAAS,MAAM,YAAY;AAAA,QAC/B;AAAA,QACA,UAAU;AAAA,QACV,SAAS,iBAAiB,KAAK;AAAA,QAC/B,gBAAgB;AAAA,UACd,OAAO;AAAA,UACP,cAAc,CAAC,MAAM,mBAAmB,MAAM,UAAU;AAAA,QAC1D;AAAA;AAAA;AAAA,QAGA,cAAc;AAAA,QACd,cAAc,CAAC,QAAQ,QAAQ,QAAQ,MAAM;AAAA,QAC7C,SAAS,CAAC,MAAM,QAAQ;AAAA,QACxB,eAAe,6BAA6B,WAAW;AAAA,QACvD,OAAO;AAAA,QACP,YAAY;AAAA,MACd,CAAC;AAED,0BAAoB,OAAO,OAAO,MAAM,aAAa,OAAO,OAAO,QAAQ;AAE3E,UAAI,CAAC,OAAO,SAAS;AACnB,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,WAAW,OAAO,mBAAmB,QAAQ,mBAAmB,GAAG,OAAO,SAAS,EAAE;AAAA,UACrF,OAAO,0BAA0B,OAAO,KAAK;AAAA,QAC/C;AAAA,MACF;AAEA,UAAI;AACF,cAAM,gBAAgB,SAAS,oBAAoB,OAAO,QAAQ,KAAK,CAAC;AAAA,MAC1E,SAAS,OAAO;AACd,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,WAAW;AAAA,UACX,OAAO,uBAAwB,MAAgB,OAAO;AAAA,QACxD;AAAA,MACF;AAEA,aAAO,EAAE,IAAI,KAAK;AAAA,IACpB;AAAA,EACF,CAAC;AAED,MAAI,CAAC,QAAQ,IAAI;AACf,eAAW,QAAQ,SAAS,oCAAoC,WAAW,EAAE;AAC7E,WAAO;AAAA,EACT;AAGA,QAAM,YAAY,MAAM;AACxB,MAAI;AACF,UAAM,OAAO,MAAM,aAAa,SAAS;AACzC,SAAK,SAAS,eAAe;AAC7B,UAAM,aAAa,WAAW,IAAI;AAAA,EACpC,QAAQ;AAAA,EAER;AAEA,eAAa,gBAAgB,OAAO,EAAE;AACtC,SAAO;AACT;","names":[]}