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.
- package/README.md +43 -97
- package/dist/agent-4DHRKZ2Z.js +32 -0
- package/dist/{analyze-Q4ONIWRZ.js → analyze-UEJ2R3H5.js} +42 -41
- package/dist/analyze-UEJ2R3H5.js.map +1 -0
- package/dist/{apply-EEFPY2W4.js → apply-QDYNQMUX.js} +22 -24
- package/dist/apply-QDYNQMUX.js.map +1 -0
- package/dist/artifacts-AMJQJFFV.js +82 -0
- package/dist/artifacts-AMJQJFFV.js.map +1 -0
- package/dist/{bench-WWWXLTFH.js → bench-RNRXVEFK.js} +42 -42
- package/dist/{chunk-RYOUZ6EK.js → chunk-23VHVVKW.js} +3 -3
- package/dist/chunk-2EYLOS5I.js +99 -0
- package/dist/chunk-2EYLOS5I.js.map +1 -0
- package/dist/{chunk-C5TL7T4V.js → chunk-2YM2VH6R.js} +2 -2
- package/dist/{chunk-XUEMATVY.js → chunk-37O2FMAN.js} +28 -25
- package/dist/chunk-37O2FMAN.js.map +1 -0
- package/dist/chunk-44RF3VFG.js +717 -0
- package/dist/chunk-44RF3VFG.js.map +1 -0
- package/dist/chunk-6AOZCWN2.js +21 -0
- package/dist/chunk-6AOZCWN2.js.map +1 -0
- package/dist/chunk-7MJGYPHF.js +1571 -0
- package/dist/chunk-7MJGYPHF.js.map +1 -0
- package/dist/{chunk-SA6HXL4Y.js → chunk-7WBUEBD5.js} +9 -9
- package/dist/chunk-7WBUEBD5.js.map +1 -0
- package/dist/chunk-7ZZUSMBJ.js +35 -0
- package/dist/chunk-7ZZUSMBJ.js.map +1 -0
- package/dist/{chunk-QJ44VG5G.js → chunk-ADH6RJNX.js} +3 -3
- package/dist/{chunk-34OCSKOB.js → chunk-AKL5UPR6.js} +159 -114
- package/dist/chunk-AKL5UPR6.js.map +1 -0
- package/dist/{chunk-7F7LGMVO.js → chunk-BTBJ5UOO.js} +12 -12
- package/dist/{chunk-7F7LGMVO.js.map → chunk-BTBJ5UOO.js.map} +1 -1
- package/dist/{chunk-HOAHMERN.js → chunk-CLZ6RRZL.js} +21 -21
- package/dist/chunk-DBLXLKGU.js +1201 -0
- package/dist/chunk-DBLXLKGU.js.map +1 -0
- package/dist/{chunk-DUS5ZNKL.js → chunk-DIMDAYZS.js} +7 -6
- package/dist/chunk-DZ3DZ3EN.js +278 -0
- package/dist/chunk-DZ3DZ3EN.js.map +1 -0
- package/dist/{chunk-CRGIQFUQ.js → chunk-E2H3JV2E.js} +3 -1
- package/dist/chunk-E2H3JV2E.js.map +1 -0
- package/dist/{chunk-45WZ6GMI.js → chunk-EORDSKWZ.js} +17 -17
- package/dist/chunk-EORDSKWZ.js.map +1 -0
- package/dist/{chunk-LTH6XYZ3.js → chunk-EYKPWHT7.js} +40 -30
- package/dist/chunk-EYKPWHT7.js.map +1 -0
- package/dist/{chunk-OODXFCQV.js → chunk-FU2FQ4JE.js} +14 -16
- package/dist/{chunk-OODXFCQV.js.map → chunk-FU2FQ4JE.js.map} +1 -1
- package/dist/{chunk-V7QOIQYC.js → chunk-G442RDFX.js} +9 -23
- package/dist/{chunk-V7QOIQYC.js.map → chunk-G442RDFX.js.map} +1 -1
- package/dist/{chunk-QPGEFLMY.js → chunk-I64N6RL6.js} +7 -7
- package/dist/{chunk-KRAGAUKD.js → chunk-JBYXJOJJ.js} +201 -64
- package/dist/chunk-JBYXJOJJ.js.map +1 -0
- package/dist/{chunk-SOM4QA6C.js → chunk-JCR5C5A7.js} +93 -18
- package/dist/chunk-JCR5C5A7.js.map +1 -0
- package/dist/{chunk-RNFUVKC3.js → chunk-K5NM26NV.js} +30 -13
- package/dist/chunk-K5NM26NV.js.map +1 -0
- package/dist/{chunk-YVPZUN6X.js → chunk-KUA6KBBD.js} +335 -38
- package/dist/chunk-KUA6KBBD.js.map +1 -0
- package/dist/{chunk-KMCS76ZW.js → chunk-KUL64XUF.js} +44 -12
- package/dist/chunk-KUL64XUF.js.map +1 -0
- package/dist/{chunk-HAKDLR6N.js → chunk-MAJ6QDRL.js} +65 -78
- package/dist/chunk-MAJ6QDRL.js.map +1 -0
- package/dist/{chunk-DGRTJD5R.js → chunk-MML2G7IC.js} +7 -7
- package/dist/chunk-NP47HRX2.js +136 -0
- package/dist/chunk-NP47HRX2.js.map +1 -0
- package/dist/{chunk-3R27MJ5R.js → chunk-PFWHHYEO.js} +3 -3
- package/dist/{chunk-ECU7YO7S.js → chunk-PM5YWJYO.js} +22 -6
- package/dist/chunk-PM5YWJYO.js.map +1 -0
- package/dist/{chunk-E4I6MMHD.js → chunk-PXPTIXJF.js} +154 -101
- package/dist/chunk-PXPTIXJF.js.map +1 -0
- package/dist/{chunk-CWSQVHVV.js → chunk-QJHZ3HYJ.js} +248 -102
- package/dist/chunk-QJHZ3HYJ.js.map +1 -0
- package/dist/{chunk-LI35PIIS.js → chunk-RDPK7LYK.js} +20 -117
- package/dist/chunk-RDPK7LYK.js.map +1 -0
- package/dist/{chunk-PMLE7KAQ.js → chunk-RMIBLFG3.js} +30 -14
- package/dist/chunk-RMIBLFG3.js.map +1 -0
- package/dist/{chunk-62GVVZQO.js → chunk-T736DSZI.js} +32 -316
- package/dist/chunk-T736DSZI.js.map +1 -0
- package/dist/{chunk-TZYINKCC.js → chunk-UDUUUFQF.js} +57 -29
- package/dist/chunk-UDUUUFQF.js.map +1 -0
- package/dist/{chunk-NEWNXZ65.js → chunk-V7GETODQ.js} +36 -28
- package/dist/{chunk-NEWNXZ65.js.map → chunk-V7GETODQ.js.map} +1 -1
- package/dist/{chunk-PPZ3K4YM.js → chunk-VHQMMY2D.js} +2 -2
- package/dist/{chunk-ZVZMWNCG.js → chunk-VJ3PF6B7.js} +50 -16
- package/dist/chunk-VJ3PF6B7.js.map +1 -0
- package/dist/{chunk-L6HSKTQE.js → chunk-W7LZLJAF.js} +4 -4
- package/dist/{chunk-6K2LCFG6.js → chunk-WB4FA2EH.js} +70 -81
- package/dist/chunk-WB4FA2EH.js.map +1 -0
- package/dist/{chunk-LGHND47K.js → chunk-WQSGL5LX.js} +22 -16
- package/dist/chunk-WQSGL5LX.js.map +1 -0
- package/dist/{chunk-ICM463EO.js → chunk-XNK5UN2D.js} +5 -649
- package/dist/chunk-XNK5UN2D.js.map +1 -0
- package/dist/{chunk-7UMMFOL2.js → chunk-Y2KOWABB.js} +39 -24
- package/dist/chunk-Y2KOWABB.js.map +1 -0
- package/dist/{chunk-QF7VEL3M.js → chunk-YC24E66P.js} +568 -158
- package/dist/chunk-YC24E66P.js.map +1 -0
- package/dist/{chunk-EG2MGDP5.js → chunk-Z6RCKCVB.js} +52 -46
- package/dist/chunk-Z6RCKCVB.js.map +1 -0
- package/dist/{chunk-YUNBOUQH.js → chunk-ZPGNVBWY.js} +8 -8
- package/dist/cli.js +132 -62
- package/dist/cli.js.map +1 -1
- package/dist/compat-OJG76J4I.js +24 -0
- package/dist/{config-LEBZZCJP.js → config-6YTWPDBK.js} +20 -17
- package/dist/{contract-JH2WBIO6.js → contract-HWLFFL3F.js} +2 -2
- package/dist/{conventions-XOT6YW5L.js → conventions-5UPOTU42.js} +20 -16
- package/dist/{conventions-XOT6YW5L.js.map → conventions-5UPOTU42.js.map} +1 -1
- package/dist/db-QAZG4LQD.js +264 -0
- package/dist/db-QAZG4LQD.js.map +1 -0
- package/dist/diagnostics-YEFB42E5.js +25 -0
- package/dist/execute-QCT64D37.js +38 -0
- package/dist/{generate-JGW5JSKB.js → generate-QATMDKOK.js} +46 -43
- package/dist/generate-QATMDKOK.js.map +1 -0
- package/dist/{git-A2IP32PQ.js → git-XGOECXWG.js} +2 -3
- package/dist/history-NBPUZVGQ.js +101 -0
- package/dist/history-NBPUZVGQ.js.map +1 -0
- package/dist/init-4LB2YKWP.js +28 -0
- package/dist/{operations-O4FORFIH.js → operations-RUQP2Y2F.js} +78 -52
- package/dist/operations-RUQP2Y2F.js.map +1 -0
- package/dist/{permissions-G4XCAESF.js → permissions-QZPUUBSO.js} +5 -6
- package/dist/plan-2NMSHTMD.js +38 -0
- package/dist/{policy-U5NBFAO5.js → policy-RKKFF5A2.js} +17 -15
- package/dist/{policy-U5NBFAO5.js.map → policy-RKKFF5A2.js.map} +1 -1
- package/dist/pr-QKFO5HI3.js +42 -0
- package/dist/pr-review-H2BFD6F2.js +33 -0
- package/dist/prd-ET6XKYRS.js +37 -0
- package/dist/{ps-76L6ZAZL.js → ps-UIKSOUAQ.js} +26 -15
- package/dist/ps-UIKSOUAQ.js.map +1 -0
- package/dist/{recorder-2BAKPBRA.js → recorder-LOU3PTIE.js} +11 -7
- package/dist/registry-HV7M6MAH.js +17 -0
- package/dist/repository-RCRR6RDE.js +80 -0
- package/dist/resume-BWJZGBLZ.js +278 -0
- package/dist/resume-BWJZGBLZ.js.map +1 -0
- package/dist/review-2MTZLNSS.js +38 -0
- package/dist/routing-RM5ABHHD.js +35 -0
- package/dist/run-XMACQBRJ.js +61 -0
- package/dist/{session-publisher-KAJQRHNZ.js → session-publisher-Q5TNEZPX.js} +3 -3
- package/dist/session-publisher-Q5TNEZPX.js.map +1 -0
- package/dist/{state-manager-UPHO2EA2.js → state-manager-SRN4VJSX.js} +9 -4
- package/dist/state-manager-SRN4VJSX.js.map +1 -0
- package/dist/{usage-KTMYXAPF.js → usage-JOODVE5O.js} +69 -63
- package/dist/usage-JOODVE5O.js.map +1 -0
- package/dist/web-TLMWJ2BM.js +205 -0
- package/dist/web-TLMWJ2BM.js.map +1 -0
- package/package.json +22 -8
- package/prompts/analyze.md +16 -19
- package/prompts/execute.md +73 -144
- package/prompts/generate.md +23 -10
- package/prompts/plan.md +32 -60
- package/prompts/pr-review.md +58 -40
- package/prompts/pr.md +50 -16
- package/prompts/prd.md +26 -19
- package/prompts/review.md +41 -18
- package/web/public/app.js +111 -112
- package/dist/agent-HMZTXCRT.js +0 -30
- package/dist/analyze-Q4ONIWRZ.js.map +0 -1
- package/dist/apply-EEFPY2W4.js.map +0 -1
- package/dist/chunk-34OCSKOB.js.map +0 -1
- package/dist/chunk-45WZ6GMI.js.map +0 -1
- package/dist/chunk-62GVVZQO.js.map +0 -1
- package/dist/chunk-6K2LCFG6.js.map +0 -1
- package/dist/chunk-7UMMFOL2.js.map +0 -1
- package/dist/chunk-CRGIQFUQ.js.map +0 -1
- package/dist/chunk-CWSQVHVV.js.map +0 -1
- package/dist/chunk-E4I6MMHD.js.map +0 -1
- package/dist/chunk-ECU7YO7S.js.map +0 -1
- package/dist/chunk-EG2MGDP5.js.map +0 -1
- package/dist/chunk-HAKDLR6N.js.map +0 -1
- package/dist/chunk-ICM463EO.js.map +0 -1
- package/dist/chunk-KMCS76ZW.js.map +0 -1
- package/dist/chunk-KRAGAUKD.js.map +0 -1
- package/dist/chunk-LGHND47K.js.map +0 -1
- package/dist/chunk-LI35PIIS.js.map +0 -1
- package/dist/chunk-LTH6XYZ3.js.map +0 -1
- package/dist/chunk-PMLE7KAQ.js.map +0 -1
- package/dist/chunk-QF7VEL3M.js.map +0 -1
- package/dist/chunk-RNFUVKC3.js.map +0 -1
- package/dist/chunk-SA6HXL4Y.js.map +0 -1
- package/dist/chunk-SOM4QA6C.js.map +0 -1
- package/dist/chunk-TZYINKCC.js.map +0 -1
- package/dist/chunk-WCCZJL7W.js +0 -141
- package/dist/chunk-WCCZJL7W.js.map +0 -1
- package/dist/chunk-XEYH6ZZI.js +0 -289
- package/dist/chunk-XEYH6ZZI.js.map +0 -1
- package/dist/chunk-XUEMATVY.js.map +0 -1
- package/dist/chunk-XZUEFTUP.js +0 -243
- package/dist/chunk-XZUEFTUP.js.map +0 -1
- package/dist/chunk-YVPZUN6X.js.map +0 -1
- package/dist/chunk-ZVZMWNCG.js.map +0 -1
- package/dist/diagnostics-HTCWF7F4.js +0 -23
- package/dist/execute-LELOSR5T.js +0 -37
- package/dist/generate-JGW5JSKB.js.map +0 -1
- package/dist/init-TO6MUXO4.js +0 -26
- package/dist/operations-O4FORFIH.js.map +0 -1
- package/dist/plan-OXAT344Q.js +0 -34
- package/dist/pr-UZHNKKZC.js +0 -39
- package/dist/pr-review-Q4ACAWDM.js +0 -32
- package/dist/prd-6CYEMLDY.js +0 -33
- package/dist/ps-76L6ZAZL.js.map +0 -1
- package/dist/registry-XLHHYLTR.js +0 -15
- package/dist/resume-URCU6CIJ.js +0 -244
- package/dist/resume-URCU6CIJ.js.map +0 -1
- package/dist/review-LVZT2TMW.js +0 -35
- package/dist/routing-EK6RBZM4.js +0 -33
- package/dist/run-2RXJCJKT.js +0 -56
- package/dist/usage-KTMYXAPF.js.map +0 -1
- package/dist/web-B5UPHHR5.js +0 -172
- package/dist/web-B5UPHHR5.js.map +0 -1
- /package/dist/{agent-HMZTXCRT.js.map → agent-4DHRKZ2Z.js.map} +0 -0
- /package/dist/{bench-WWWXLTFH.js.map → bench-RNRXVEFK.js.map} +0 -0
- /package/dist/{chunk-RYOUZ6EK.js.map → chunk-23VHVVKW.js.map} +0 -0
- /package/dist/{chunk-C5TL7T4V.js.map → chunk-2YM2VH6R.js.map} +0 -0
- /package/dist/{chunk-QJ44VG5G.js.map → chunk-ADH6RJNX.js.map} +0 -0
- /package/dist/{chunk-HOAHMERN.js.map → chunk-CLZ6RRZL.js.map} +0 -0
- /package/dist/{chunk-DUS5ZNKL.js.map → chunk-DIMDAYZS.js.map} +0 -0
- /package/dist/{chunk-QPGEFLMY.js.map → chunk-I64N6RL6.js.map} +0 -0
- /package/dist/{chunk-DGRTJD5R.js.map → chunk-MML2G7IC.js.map} +0 -0
- /package/dist/{chunk-3R27MJ5R.js.map → chunk-PFWHHYEO.js.map} +0 -0
- /package/dist/{chunk-PPZ3K4YM.js.map → chunk-VHQMMY2D.js.map} +0 -0
- /package/dist/{chunk-L6HSKTQE.js.map → chunk-W7LZLJAF.js.map} +0 -0
- /package/dist/{chunk-YUNBOUQH.js.map → chunk-ZPGNVBWY.js.map} +0 -0
- /package/dist/{config-LEBZZCJP.js.map → compat-OJG76J4I.js.map} +0 -0
- /package/dist/{contract-JH2WBIO6.js.map → config-6YTWPDBK.js.map} +0 -0
- /package/dist/{diagnostics-HTCWF7F4.js.map → contract-HWLFFL3F.js.map} +0 -0
- /package/dist/{execute-LELOSR5T.js.map → diagnostics-YEFB42E5.js.map} +0 -0
- /package/dist/{git-A2IP32PQ.js.map → execute-QCT64D37.js.map} +0 -0
- /package/dist/{init-TO6MUXO4.js.map → git-XGOECXWG.js.map} +0 -0
- /package/dist/{permissions-G4XCAESF.js.map → init-4LB2YKWP.js.map} +0 -0
- /package/dist/{plan-OXAT344Q.js.map → permissions-QZPUUBSO.js.map} +0 -0
- /package/dist/{pr-UZHNKKZC.js.map → plan-2NMSHTMD.js.map} +0 -0
- /package/dist/{pr-review-Q4ACAWDM.js.map → pr-QKFO5HI3.js.map} +0 -0
- /package/dist/{prd-6CYEMLDY.js.map → pr-review-H2BFD6F2.js.map} +0 -0
- /package/dist/{recorder-2BAKPBRA.js.map → prd-ET6XKYRS.js.map} +0 -0
- /package/dist/{registry-XLHHYLTR.js.map → recorder-LOU3PTIE.js.map} +0 -0
- /package/dist/{review-LVZT2TMW.js.map → registry-HV7M6MAH.js.map} +0 -0
- /package/dist/{routing-EK6RBZM4.js.map → repository-RCRR6RDE.js.map} +0 -0
- /package/dist/{run-2RXJCJKT.js.map → review-2MTZLNSS.js.map} +0 -0
- /package/dist/{session-publisher-KAJQRHNZ.js.map → routing-RM5ABHHD.js.map} +0 -0
- /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-
|
|
4
|
+
} from "./chunk-ADH6RJNX.js";
|
|
5
5
|
import {
|
|
6
6
|
runAcceptance
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-PXPTIXJF.js";
|
|
8
|
+
import "./chunk-W7LZLJAF.js";
|
|
9
9
|
import {
|
|
10
10
|
evaluateCeilings,
|
|
11
11
|
spendFromCost
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
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-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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-
|
|
42
|
-
import "./chunk-
|
|
30
|
+
} from "./chunk-DIMDAYZS.js";
|
|
31
|
+
import "./chunk-WB4FA2EH.js";
|
|
43
32
|
import {
|
|
44
33
|
redactSecrets
|
|
45
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-VHQMMY2D.js";
|
|
35
|
+
import "./chunk-P3LRUNC6.js";
|
|
36
|
+
import "./chunk-RDPK7LYK.js";
|
|
46
37
|
import {
|
|
47
38
|
loadTaskPlan
|
|
48
|
-
} from "./chunk-
|
|
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-
|
|
52
|
-
import
|
|
53
|
-
|
|
54
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
8
|
+
} from "./chunk-G442RDFX.js";
|
|
7
9
|
import {
|
|
8
10
|
issuePlaceholders,
|
|
9
11
|
resolveCommandIssue
|
|
10
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-7WBUEBD5.js";
|
|
11
13
|
import {
|
|
12
14
|
publishPhaseMetrics,
|
|
13
15
|
resolvePolicyPlaceholders
|
|
14
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-KUL64XUF.js";
|
|
15
17
|
import {
|
|
16
18
|
applyPlaceholders,
|
|
17
19
|
loadPrompt
|
|
18
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-BTBJ5UOO.js";
|
|
19
21
|
import {
|
|
20
22
|
DEFAULT_HEADLESS_TIMEOUT_MS,
|
|
21
23
|
runHeadless
|
|
22
|
-
} from "./chunk-
|
|
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
|
-
|
|
28
|
+
printSuccess,
|
|
29
|
+
resolveIssuePaths
|
|
30
|
+
} from "./chunk-DBLXLKGU.js";
|
|
31
31
|
import {
|
|
32
32
|
loadTaskPlan,
|
|
33
33
|
saveTaskPlan
|
|
34
|
-
} from "./chunk-
|
|
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"
|
|
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: "
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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-
|
|
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":[]}
|