issue-flow 0.17.0 → 0.19.1

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 (239) hide show
  1. package/README.md +34 -100
  2. package/dist/agent-EWKA7357.js +32 -0
  3. package/dist/{analyze-6M3KEOX7.js → analyze-Z7ODC27F.js} +42 -41
  4. package/dist/analyze-Z7ODC27F.js.map +1 -0
  5. package/dist/{apply-ADB3ZK7W.js → apply-VNSWQS6O.js} +22 -24
  6. package/dist/apply-VNSWQS6O.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-FM7I7EIV.js → bench-ZJEIACUK.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-ANI2NTR4.js → chunk-2EZW4X57.js} +28 -25
  14. package/dist/chunk-2EZW4X57.js.map +1 -0
  15. package/dist/{chunk-E6KXCV3T.js → chunk-2Q6PG3MT.js} +15 -15
  16. package/dist/chunk-2Q6PG3MT.js.map +1 -0
  17. package/dist/{chunk-C5TL7T4V.js → chunk-2YM2VH6R.js} +2 -2
  18. package/dist/{chunk-LPWPFIIB.js → chunk-2YYP7AE6.js} +14 -16
  19. package/dist/{chunk-LPWPFIIB.js.map → chunk-2YYP7AE6.js.map} +1 -1
  20. package/dist/chunk-3JD25HHJ.js +278 -0
  21. package/dist/chunk-3JD25HHJ.js.map +1 -0
  22. package/dist/{chunk-ISZ54SVE.js → chunk-46S7APLQ.js} +41 -17
  23. package/dist/chunk-46S7APLQ.js.map +1 -0
  24. package/dist/chunk-6AOZCWN2.js +21 -0
  25. package/dist/chunk-6AOZCWN2.js.map +1 -0
  26. package/dist/{chunk-QPGEFLMY.js → chunk-7CMVL4X6.js} +7 -7
  27. package/dist/chunk-7MJGYPHF.js +1571 -0
  28. package/dist/chunk-7MJGYPHF.js.map +1 -0
  29. package/dist/chunk-7ZZUSMBJ.js +35 -0
  30. package/dist/chunk-7ZZUSMBJ.js.map +1 -0
  31. package/dist/{chunk-DUS5ZNKL.js → chunk-DIMDAYZS.js} +7 -6
  32. package/dist/{chunk-DGRTJD5R.js → chunk-DXH4TQRB.js} +7 -7
  33. package/dist/{chunk-CRGIQFUQ.js → chunk-E2H3JV2E.js} +3 -1
  34. package/dist/chunk-E2H3JV2E.js.map +1 -0
  35. package/dist/{chunk-YUNBOUQH.js → chunk-ERAG5IQB.js} +8 -8
  36. package/dist/{chunk-D6ZBGJ3L.js → chunk-F2NFJ27Z.js} +130 -36
  37. package/dist/chunk-F2NFJ27Z.js.map +1 -0
  38. package/dist/{chunk-SOM4QA6C.js → chunk-GD7JZMSJ.js} +93 -18
  39. package/dist/chunk-GD7JZMSJ.js.map +1 -0
  40. package/dist/{chunk-YII4U7ZD.js → chunk-HEHHQU4G.js} +70 -81
  41. package/dist/chunk-HEHHQU4G.js.map +1 -0
  42. package/dist/{chunk-KZ5EY5XX.js → chunk-HHXWAWU6.js} +159 -114
  43. package/dist/chunk-HHXWAWU6.js.map +1 -0
  44. package/dist/{chunk-SGTTR4XW.js → chunk-HWWB22HC.js} +152 -100
  45. package/dist/chunk-HWWB22HC.js.map +1 -0
  46. package/dist/chunk-IMB6FA2F.js +673 -0
  47. package/dist/chunk-IMB6FA2F.js.map +1 -0
  48. package/dist/{chunk-6YQT3SSM.js → chunk-IQYXXFRC.js} +22 -6
  49. package/dist/chunk-IQYXXFRC.js.map +1 -0
  50. package/dist/chunk-J6VJ5M2U.js +1201 -0
  51. package/dist/chunk-J6VJ5M2U.js.map +1 -0
  52. package/dist/{chunk-B3TSS7BT.js → chunk-KDQRNVBZ.js} +3 -3
  53. package/dist/{chunk-A4H7P7T7.js → chunk-LRWIP7QS.js} +41 -26
  54. package/dist/chunk-LRWIP7QS.js.map +1 -0
  55. package/dist/{chunk-DV7HUC4Z.js → chunk-LYC57OXF.js} +20 -117
  56. package/dist/chunk-LYC57OXF.js.map +1 -0
  57. package/dist/{chunk-HAKDLR6N.js → chunk-MAJ6QDRL.js} +65 -78
  58. package/dist/chunk-MAJ6QDRL.js.map +1 -0
  59. package/dist/{chunk-HJBF4WD2.js → chunk-MHA7Q3KU.js} +288 -108
  60. package/dist/chunk-MHA7Q3KU.js.map +1 -0
  61. package/dist/{chunk-UK4E2FUA.js → chunk-MQTVMB7W.js} +103 -76
  62. package/dist/chunk-MQTVMB7W.js.map +1 -0
  63. package/dist/chunk-NP47HRX2.js +136 -0
  64. package/dist/chunk-NP47HRX2.js.map +1 -0
  65. package/dist/{chunk-MI5TREN3.js → chunk-NYDAHE3Y.js} +52 -46
  66. package/dist/chunk-NYDAHE3Y.js.map +1 -0
  67. package/dist/{chunk-UWDCIFTP.js → chunk-P7ZYOC23.js} +41 -57
  68. package/dist/chunk-P7ZYOC23.js.map +1 -0
  69. package/dist/{chunk-3R27MJ5R.js → chunk-PFWHHYEO.js} +3 -3
  70. package/dist/{chunk-2SUFAE6X.js → chunk-PHPAK2L6.js} +44 -33
  71. package/dist/{chunk-2SUFAE6X.js.map → chunk-PHPAK2L6.js.map} +1 -1
  72. package/dist/{chunk-PPZ3K4YM.js → chunk-PRGPSNGA.js} +2 -2
  73. package/dist/{chunk-32JSYXEK.js → chunk-RGFMQFX7.js} +9 -23
  74. package/dist/{chunk-32JSYXEK.js.map → chunk-RGFMQFX7.js.map} +1 -1
  75. package/dist/{chunk-YVPZUN6X.js → chunk-TJVX42KY.js} +335 -38
  76. package/dist/chunk-TJVX42KY.js.map +1 -0
  77. package/dist/{chunk-RCZJQUTC.js → chunk-UDRAD7MF.js} +60 -27
  78. package/dist/chunk-UDRAD7MF.js.map +1 -0
  79. package/dist/{chunk-HY5HLFDU.js → chunk-UHDXXLYH.js} +148 -135
  80. package/dist/chunk-UHDXXLYH.js.map +1 -0
  81. package/dist/{chunk-RNFUVKC3.js → chunk-UPAAZU4W.js} +30 -13
  82. package/dist/chunk-UPAAZU4W.js.map +1 -0
  83. package/dist/{chunk-L6HSKTQE.js → chunk-W7LZLJAF.js} +4 -4
  84. package/dist/{chunk-HLAPOUEM.js → chunk-WB2FVIUS.js} +44 -12
  85. package/dist/chunk-WB2FVIUS.js.map +1 -0
  86. package/dist/{chunk-VE3IYNDN.js → chunk-WPHC6JBR.js} +9 -9
  87. package/dist/chunk-WPHC6JBR.js.map +1 -0
  88. package/dist/{chunk-KZXQWC7U.js → chunk-XHCP6ZNO.js} +201 -64
  89. package/dist/chunk-XHCP6ZNO.js.map +1 -0
  90. package/dist/{chunk-7F7LGMVO.js → chunk-XKR3VD2Z.js} +12 -12
  91. package/dist/{chunk-7F7LGMVO.js.map → chunk-XKR3VD2Z.js.map} +1 -1
  92. package/dist/{chunk-ICM463EO.js → chunk-XNK5UN2D.js} +5 -649
  93. package/dist/chunk-XNK5UN2D.js.map +1 -0
  94. package/dist/{chunk-Z5O2XBWA.js → chunk-XQLNZW7I.js} +40 -30
  95. package/dist/chunk-XQLNZW7I.js.map +1 -0
  96. package/dist/{chunk-QMIQR7EE.js → chunk-ZAYATXJD.js} +32 -316
  97. package/dist/chunk-ZAYATXJD.js.map +1 -0
  98. package/dist/cli.js +128 -60
  99. package/dist/cli.js.map +1 -1
  100. package/dist/compat-YPDZB34U.js +24 -0
  101. package/dist/{config-KGZUPAUP.js → config-56B4OHZE.js} +20 -17
  102. package/dist/{contract-JH2WBIO6.js → contract-HWLFFL3F.js} +2 -2
  103. package/dist/{conventions-RYN7OXJN.js → conventions-DW2CM5I3.js} +20 -16
  104. package/dist/{conventions-RYN7OXJN.js.map → conventions-DW2CM5I3.js.map} +1 -1
  105. package/dist/db-5NU77PJA.js +264 -0
  106. package/dist/db-5NU77PJA.js.map +1 -0
  107. package/dist/diagnostics-UCTS2VUF.js +25 -0
  108. package/dist/execute-R7AVOLNG.js +38 -0
  109. package/dist/{generate-CX6KNHZS.js → generate-O7GUXLN4.js} +46 -43
  110. package/dist/generate-O7GUXLN4.js.map +1 -0
  111. package/dist/{git-A2IP32PQ.js → git-LCG45YXD.js} +2 -3
  112. package/dist/history-6GSURU3H.js +101 -0
  113. package/dist/history-6GSURU3H.js.map +1 -0
  114. package/dist/init-DD6DBRC5.js +28 -0
  115. package/dist/{operations-CAKIT2BO.js → operations-HU5ZFEBA.js} +78 -52
  116. package/dist/operations-HU5ZFEBA.js.map +1 -0
  117. package/dist/{permissions-G4XCAESF.js → permissions-NNNSRC4P.js} +5 -6
  118. package/dist/plan-XR6B7EM3.js +38 -0
  119. package/dist/{policy-WX6O2JID.js → policy-RFJOJQL6.js} +17 -15
  120. package/dist/{policy-WX6O2JID.js.map → policy-RFJOJQL6.js.map} +1 -1
  121. package/dist/pr-OSCNJCOO.js +42 -0
  122. package/dist/pr-review-IKIYHFBO.js +33 -0
  123. package/dist/prd-HFDZJJQR.js +37 -0
  124. package/dist/{ps-76L6ZAZL.js → ps-AKRHGPSR.js} +26 -15
  125. package/dist/ps-AKRHGPSR.js.map +1 -0
  126. package/dist/{recorder-N7U66HCO.js → recorder-T7426CKV.js} +11 -7
  127. package/dist/registry-DWRKD65A.js +17 -0
  128. package/dist/repository-TABBRW2C.js +80 -0
  129. package/dist/resume-GDXKK5XP.js +278 -0
  130. package/dist/resume-GDXKK5XP.js.map +1 -0
  131. package/dist/review-JJHMQA2O.js +38 -0
  132. package/dist/routing-FPNUVE7T.js +35 -0
  133. package/dist/run-RLCURLLL.js +61 -0
  134. package/dist/{session-publisher-KAJQRHNZ.js → session-publisher-Q5TNEZPX.js} +3 -3
  135. package/dist/session-publisher-Q5TNEZPX.js.map +1 -0
  136. package/dist/{state-manager-UPHO2EA2.js → state-manager-IGNTD4AB.js} +9 -4
  137. package/dist/state-manager-IGNTD4AB.js.map +1 -0
  138. package/dist/{usage-U7QNGCPK.js → usage-XW27AL5K.js} +69 -63
  139. package/dist/usage-XW27AL5K.js.map +1 -0
  140. package/dist/web-NCDBVZ5Y.js +205 -0
  141. package/dist/web-NCDBVZ5Y.js.map +1 -0
  142. package/package.json +20 -7
  143. package/prompts/analyze.md +16 -19
  144. package/prompts/execute.md +73 -144
  145. package/prompts/generate.md +23 -10
  146. package/prompts/plan.md +32 -60
  147. package/prompts/pr-review.md +58 -40
  148. package/prompts/pr.md +50 -16
  149. package/prompts/prd.md +26 -19
  150. package/prompts/review.md +41 -18
  151. package/web/AGENTS.md +115 -7
  152. package/web/public/app.css +393 -245
  153. package/web/public/app.js +212 -143
  154. package/web/public/index.html +106 -78
  155. package/dist/agent-TB6W7PT7.js +0 -30
  156. package/dist/analyze-6M3KEOX7.js.map +0 -1
  157. package/dist/apply-ADB3ZK7W.js.map +0 -1
  158. package/dist/chunk-6YQT3SSM.js.map +0 -1
  159. package/dist/chunk-A4H7P7T7.js.map +0 -1
  160. package/dist/chunk-ANI2NTR4.js.map +0 -1
  161. package/dist/chunk-CRGIQFUQ.js.map +0 -1
  162. package/dist/chunk-D6ZBGJ3L.js.map +0 -1
  163. package/dist/chunk-DV7HUC4Z.js.map +0 -1
  164. package/dist/chunk-E6KXCV3T.js.map +0 -1
  165. package/dist/chunk-HAKDLR6N.js.map +0 -1
  166. package/dist/chunk-HJBF4WD2.js.map +0 -1
  167. package/dist/chunk-HLAPOUEM.js.map +0 -1
  168. package/dist/chunk-HY5HLFDU.js.map +0 -1
  169. package/dist/chunk-ICM463EO.js.map +0 -1
  170. package/dist/chunk-ISZ54SVE.js.map +0 -1
  171. package/dist/chunk-KZ5EY5XX.js.map +0 -1
  172. package/dist/chunk-KZXQWC7U.js.map +0 -1
  173. package/dist/chunk-MI5TREN3.js.map +0 -1
  174. package/dist/chunk-QMIQR7EE.js.map +0 -1
  175. package/dist/chunk-RCZJQUTC.js.map +0 -1
  176. package/dist/chunk-RNFUVKC3.js.map +0 -1
  177. package/dist/chunk-SGTTR4XW.js.map +0 -1
  178. package/dist/chunk-SOM4QA6C.js.map +0 -1
  179. package/dist/chunk-UK4E2FUA.js.map +0 -1
  180. package/dist/chunk-UWDCIFTP.js.map +0 -1
  181. package/dist/chunk-VE3IYNDN.js.map +0 -1
  182. package/dist/chunk-WCCZJL7W.js +0 -141
  183. package/dist/chunk-WCCZJL7W.js.map +0 -1
  184. package/dist/chunk-XEYH6ZZI.js +0 -289
  185. package/dist/chunk-XEYH6ZZI.js.map +0 -1
  186. package/dist/chunk-XZUEFTUP.js +0 -243
  187. package/dist/chunk-XZUEFTUP.js.map +0 -1
  188. package/dist/chunk-YII4U7ZD.js.map +0 -1
  189. package/dist/chunk-YVPZUN6X.js.map +0 -1
  190. package/dist/chunk-Z5O2XBWA.js.map +0 -1
  191. package/dist/diagnostics-HTCWF7F4.js +0 -23
  192. package/dist/execute-QL3ZQIAP.js +0 -37
  193. package/dist/generate-CX6KNHZS.js.map +0 -1
  194. package/dist/init-PDVQDRS6.js +0 -24
  195. package/dist/operations-CAKIT2BO.js.map +0 -1
  196. package/dist/plan-PRORGS3L.js +0 -34
  197. package/dist/pr-27RMQI5F.js +0 -39
  198. package/dist/pr-review-VNESMAMT.js +0 -32
  199. package/dist/prd-ZNC4T5BS.js +0 -33
  200. package/dist/ps-76L6ZAZL.js.map +0 -1
  201. package/dist/registry-XLHHYLTR.js +0 -15
  202. package/dist/resume-VLWIE264.js +0 -244
  203. package/dist/resume-VLWIE264.js.map +0 -1
  204. package/dist/review-7CREJDKB.js +0 -35
  205. package/dist/routing-VCDYHSXA.js +0 -33
  206. package/dist/run-3MPORLF5.js +0 -56
  207. package/dist/usage-U7QNGCPK.js.map +0 -1
  208. package/dist/web-HUNDHCJ4.js +0 -172
  209. package/dist/web-HUNDHCJ4.js.map +0 -1
  210. /package/dist/{agent-TB6W7PT7.js.map → agent-EWKA7357.js.map} +0 -0
  211. /package/dist/{bench-FM7I7EIV.js.map → bench-ZJEIACUK.js.map} +0 -0
  212. /package/dist/{chunk-RYOUZ6EK.js.map → chunk-23VHVVKW.js.map} +0 -0
  213. /package/dist/{chunk-C5TL7T4V.js.map → chunk-2YM2VH6R.js.map} +0 -0
  214. /package/dist/{chunk-QPGEFLMY.js.map → chunk-7CMVL4X6.js.map} +0 -0
  215. /package/dist/{chunk-DUS5ZNKL.js.map → chunk-DIMDAYZS.js.map} +0 -0
  216. /package/dist/{chunk-DGRTJD5R.js.map → chunk-DXH4TQRB.js.map} +0 -0
  217. /package/dist/{chunk-YUNBOUQH.js.map → chunk-ERAG5IQB.js.map} +0 -0
  218. /package/dist/{chunk-B3TSS7BT.js.map → chunk-KDQRNVBZ.js.map} +0 -0
  219. /package/dist/{chunk-3R27MJ5R.js.map → chunk-PFWHHYEO.js.map} +0 -0
  220. /package/dist/{chunk-PPZ3K4YM.js.map → chunk-PRGPSNGA.js.map} +0 -0
  221. /package/dist/{chunk-L6HSKTQE.js.map → chunk-W7LZLJAF.js.map} +0 -0
  222. /package/dist/{config-KGZUPAUP.js.map → compat-YPDZB34U.js.map} +0 -0
  223. /package/dist/{contract-JH2WBIO6.js.map → config-56B4OHZE.js.map} +0 -0
  224. /package/dist/{diagnostics-HTCWF7F4.js.map → contract-HWLFFL3F.js.map} +0 -0
  225. /package/dist/{execute-QL3ZQIAP.js.map → diagnostics-UCTS2VUF.js.map} +0 -0
  226. /package/dist/{git-A2IP32PQ.js.map → execute-R7AVOLNG.js.map} +0 -0
  227. /package/dist/{init-PDVQDRS6.js.map → git-LCG45YXD.js.map} +0 -0
  228. /package/dist/{permissions-G4XCAESF.js.map → init-DD6DBRC5.js.map} +0 -0
  229. /package/dist/{plan-PRORGS3L.js.map → permissions-NNNSRC4P.js.map} +0 -0
  230. /package/dist/{pr-27RMQI5F.js.map → plan-XR6B7EM3.js.map} +0 -0
  231. /package/dist/{pr-review-VNESMAMT.js.map → pr-OSCNJCOO.js.map} +0 -0
  232. /package/dist/{prd-ZNC4T5BS.js.map → pr-review-IKIYHFBO.js.map} +0 -0
  233. /package/dist/{recorder-N7U66HCO.js.map → prd-HFDZJJQR.js.map} +0 -0
  234. /package/dist/{registry-XLHHYLTR.js.map → recorder-T7426CKV.js.map} +0 -0
  235. /package/dist/{review-7CREJDKB.js.map → registry-DWRKD65A.js.map} +0 -0
  236. /package/dist/{routing-VCDYHSXA.js.map → repository-TABBRW2C.js.map} +0 -0
  237. /package/dist/{run-3MPORLF5.js.map → review-JJHMQA2O.js.map} +0 -0
  238. /package/dist/{session-publisher-KAJQRHNZ.js.map → routing-FPNUVE7T.js.map} +0 -0
  239. /package/dist/{state-manager-UPHO2EA2.js.map → run-RLCURLLL.js.map} +0 -0
@@ -1,62 +1,62 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  summarizePhaseTiming
4
- } from "./chunk-B3TSS7BT.js";
4
+ } from "./chunk-KDQRNVBZ.js";
5
5
  import {
6
6
  runAcceptance
7
- } from "./chunk-SGTTR4XW.js";
8
- import "./chunk-L6HSKTQE.js";
7
+ } from "./chunk-HWWB22HC.js";
8
+ import "./chunk-W7LZLJAF.js";
9
9
  import {
10
10
  evaluateCeilings,
11
11
  spendFromCost
12
- } from "./chunk-UK4E2FUA.js";
13
- import "./chunk-WCCZJL7W.js";
14
- import "./chunk-DGRTJD5R.js";
15
- import "./chunk-D6ZBGJ3L.js";
12
+ } from "./chunk-MQTVMB7W.js";
13
+ import "./chunk-DXH4TQRB.js";
14
+ import "./chunk-F2NFJ27Z.js";
16
15
  import {
17
16
  ensureHarnessVersion,
18
17
  setIssuesCliOverrides
19
- } from "./chunk-HY5HLFDU.js";
20
- import {
21
- resetStorageResolutionCache,
22
- resolveIssuePaths
23
- } from "./chunk-DV7HUC4Z.js";
18
+ } from "./chunk-UHDXXLYH.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-J6VJ5M2U.js";
26
+ import "./chunk-7CMVL4X6.js";
38
27
  import {
39
28
  createInitialSnapshot,
40
29
  reduceSessionEvent
41
- } from "./chunk-DUS5ZNKL.js";
42
- import "./chunk-YII4U7ZD.js";
30
+ } from "./chunk-DIMDAYZS.js";
31
+ import "./chunk-HEHHQU4G.js";
43
32
  import {
44
33
  redactSecrets
45
- } from "./chunk-PPZ3K4YM.js";
34
+ } from "./chunk-PRGPSNGA.js";
35
+ import "./chunk-P3LRUNC6.js";
36
+ import "./chunk-LYC57OXF.js";
46
37
  import {
47
38
  loadTaskPlan
48
- } from "./chunk-SOM4QA6C.js";
39
+ } from "./chunk-GD7JZMSJ.js";
40
+ import "./chunk-NP47HRX2.js";
41
+ import "./chunk-IMB6FA2F.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-TJVX42KY.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-3MPORLF5.js");
861
+ const { runPipeline } = await import("./run-RLCURLLL.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-FM7I7EIV.js.map
910
+ //# sourceMappingURL=bench-ZJEIACUK.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,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-32JSYXEK.js";
8
+ } from "./chunk-RGFMQFX7.js";
7
9
  import {
8
10
  issuePlaceholders,
9
11
  resolveCommandIssue
10
- } from "./chunk-VE3IYNDN.js";
12
+ } from "./chunk-WPHC6JBR.js";
11
13
  import {
12
14
  publishPhaseMetrics,
13
15
  resolvePolicyPlaceholders
14
- } from "./chunk-HLAPOUEM.js";
16
+ } from "./chunk-WB2FVIUS.js";
15
17
  import {
16
18
  applyPlaceholders,
17
19
  loadPrompt
18
- } from "./chunk-7F7LGMVO.js";
20
+ } from "./chunk-XKR3VD2Z.js";
19
21
  import {
20
22
  DEFAULT_HEADLESS_TIMEOUT_MS,
21
23
  runHeadless
22
- } from "./chunk-UK4E2FUA.js";
23
- import {
24
- resolveIssuePaths
25
- } from "./chunk-DV7HUC4Z.js";
24
+ } from "./chunk-MQTVMB7W.js";
26
25
  import {
27
26
  getGlobalTimeout,
28
27
  printError,
29
- printSuccess
30
- } from "./chunk-XZUEFTUP.js";
28
+ printSuccess,
29
+ resolveIssuePaths
30
+ } from "./chunk-J6VJ5M2U.js";
31
31
  import {
32
32
  loadTaskPlan,
33
33
  saveTaskPlan
34
- } from "./chunk-SOM4QA6C.js";
34
+ } from "./chunk-GD7JZMSJ.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-ANI2NTR4.js.map
120
+ //# sourceMappingURL=chunk-2EZW4X57.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":[]}
@@ -2,14 +2,14 @@
2
2
  import {
3
3
  loadPolicyConfig,
4
4
  mergeConfigLayers
5
- } from "./chunk-HY5HLFDU.js";
5
+ } from "./chunk-UHDXXLYH.js";
6
6
  import {
7
7
  printWarning
8
- } from "./chunk-XZUEFTUP.js";
8
+ } from "./chunk-J6VJ5M2U.js";
9
9
  import {
10
10
  getProjectRoot,
11
11
  run
12
- } from "./chunk-YVPZUN6X.js";
12
+ } from "./chunk-TJVX42KY.js";
13
13
 
14
14
  // src/conventions/git/types.ts
15
15
  var CHANGE_TYPES = [
@@ -351,14 +351,14 @@ function issueReferenceLines(input) {
351
351
  }
352
352
 
353
353
  // src/policy/resolve.ts
354
- import { isAbsolute, normalize, sep as sep2 } from "path";
354
+ import { isAbsolute, normalize, sep as sep2 } from "node:path";
355
355
 
356
356
  // src/policy/discovery.ts
357
- import { readdir, readFile, stat } from "fs/promises";
358
- import { join, relative, sep } from "path";
357
+ import { readdir, readFile, stat } from "node:fs/promises";
358
+ import { join, relative, sep } from "node:path";
359
359
 
360
360
  // src/policy/parsers/docs.ts
361
- import { posix } from "path";
361
+ import { posix } from "node:path";
362
362
  function classifyDocument(fileName) {
363
363
  switch (fileName.toLowerCase()) {
364
364
  case "agents.md":
@@ -543,7 +543,7 @@ function parseIssueTypes(payload) {
543
543
  }
544
544
 
545
545
  // src/policy/parsers/templates.ts
546
- import { basename, extname } from "path";
546
+ import { basename, extname } from "node:path";
547
547
 
548
548
  // src/policy/parsers/issue-forms.ts
549
549
  function emptyTemplateMetadata() {
@@ -1417,14 +1417,14 @@ async function resolvePolicy(root, scope, options) {
1417
1417
  discoverGitConventions(root)
1418
1418
  ]
1419
1419
  );
1420
- const wantsOrgTemplates = toggles.issueTemplates && templateDiscovery.templates.length === 0;
1420
+ const wantsOrgTemplates = options.remote !== false && toggles.issueTemplates && templateDiscovery.templates.length === 0;
1421
1421
  const [baseBranch, slug] = await Promise.all([
1422
- discoverBaseBranch(root, options.exec),
1423
- toggles.issueTypes || wantsOrgTemplates ? discoverGitHubSlug(root, options.exec) : Promise.resolve(null)
1422
+ options.remote === false ? Promise.resolve({ baseBranch: null, sources: [] }) : discoverBaseBranch(root, options.exec),
1423
+ options.remote !== false && toggles.issueTypes || wantsOrgTemplates ? discoverGitHubSlug(root, options.exec) : Promise.resolve(null)
1424
1424
  ]);
1425
1425
  const [labels, issueTypes, orgTemplates, orgForms] = await Promise.all([
1426
- toggles.labels ? discoverLabels(root, options.exec) : Promise.resolve({ labels: [], sources: [disabledSource("labels")] }),
1427
- toggles.issueTypes ? discoverIssueTypes(root, slug?.owner ?? null, options.exec) : Promise.resolve({ types: [], sources: [disabledSource("issue-types")] }),
1426
+ options.remote !== false && toggles.labels ? discoverLabels(root, options.exec) : Promise.resolve({ labels: [], sources: [disabledSource("labels")] }),
1427
+ options.remote !== false && toggles.issueTypes ? discoverIssueTypes(root, slug?.owner ?? null, options.exec) : Promise.resolve({ types: [], sources: [disabledSource("issue-types")] }),
1428
1428
  wantsOrgTemplates ? discoverOrganizationTemplates(root, slug, options.exec) : Promise.resolve({ templates: [], sources: [] }),
1429
1429
  // Two calls, because GitHub answers the two kinds of organization default
1430
1430
  // through different surfaces: `issueTemplates` covers markdown templates and
@@ -1533,7 +1533,7 @@ async function loadRepositoryPolicy(options = {}) {
1533
1533
  if (options.cache === false) {
1534
1534
  return resolvePolicy(root, scope, options);
1535
1535
  }
1536
- const key = `${root}\0${scope ?? ""}`;
1536
+ const key = `${root}\0${scope ?? ""}\0${options.remote !== false}`;
1537
1537
  const cached = cache.get(key);
1538
1538
  if (cached !== void 0) {
1539
1539
  return cached;
@@ -1559,4 +1559,4 @@ export {
1559
1559
  issueReferenceLines,
1560
1560
  loadRepositoryPolicy
1561
1561
  };
1562
- //# sourceMappingURL=chunk-E6KXCV3T.js.map
1562
+ //# sourceMappingURL=chunk-2Q6PG3MT.js.map