issue-flow 0.6.0 → 0.7.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 (72) hide show
  1. package/README.md +3 -1
  2. package/dist/{analyze-VVG7UABS.js → analyze-R25HDGBJ.js} +10 -6
  3. package/dist/analyze-R25HDGBJ.js.map +1 -0
  4. package/dist/chunk-23WOEBGN.js +725 -0
  5. package/dist/chunk-23WOEBGN.js.map +1 -0
  6. package/dist/{chunk-4HT4EVYV.js → chunk-2AVZZAC6.js} +181 -13
  7. package/dist/chunk-2AVZZAC6.js.map +1 -0
  8. package/dist/{chunk-FPGHTTVV.js → chunk-ASMCLXQ2.js} +12 -7
  9. package/dist/chunk-ASMCLXQ2.js.map +1 -0
  10. package/dist/{chunk-2CSHLHYP.js → chunk-EHVKXFFN.js} +2 -2
  11. package/dist/{chunk-JTSAL3TI.js → chunk-EM43T462.js} +18 -5
  12. package/dist/chunk-EM43T462.js.map +1 -0
  13. package/dist/{chunk-KWGRBNUG.js → chunk-HJ7JT777.js} +26 -7
  14. package/dist/chunk-HJ7JT777.js.map +1 -0
  15. package/dist/{chunk-WZDCTAWZ.js → chunk-JNEHVQH5.js} +39 -2
  16. package/dist/chunk-JNEHVQH5.js.map +1 -0
  17. package/dist/{chunk-SVOWWZQJ.js → chunk-RN2FAMUU.js} +5 -280
  18. package/dist/chunk-RN2FAMUU.js.map +1 -0
  19. package/dist/chunk-TCOS2KFB.js +283 -0
  20. package/dist/chunk-TCOS2KFB.js.map +1 -0
  21. package/dist/chunk-WHIBTNYI.js +72 -0
  22. package/dist/chunk-WHIBTNYI.js.map +1 -0
  23. package/dist/{chunk-7W5VGYXW.js → chunk-YGEWIEAI.js} +45 -69
  24. package/dist/chunk-YGEWIEAI.js.map +1 -0
  25. package/dist/{chunk-YM3G5BLR.js → chunk-YLXPLHEL.js} +2 -2
  26. package/dist/{chunk-EHX4J5G5.js → chunk-ZAEBDO3Q.js} +12 -7
  27. package/dist/chunk-ZAEBDO3Q.js.map +1 -0
  28. package/dist/cli.js +65 -20
  29. package/dist/cli.js.map +1 -1
  30. package/dist/{config-B564P45C.js → config-SJAQMFWB.js} +11 -3
  31. package/dist/execute-VZ7SHLP4.js +13 -0
  32. package/dist/{generate-IN62ARBS.js → generate-LUK3XTIP.js} +7 -5
  33. package/dist/{generate-IN62ARBS.js.map → generate-LUK3XTIP.js.map} +1 -1
  34. package/dist/init-5KXCG36P.js +9 -0
  35. package/dist/plan-R34SAWRK.js +15 -0
  36. package/dist/pr-P4BDQXUQ.js +15 -0
  37. package/dist/pr-review-TOSBE6ZS.js +15 -0
  38. package/dist/prd-RYLULM75.js +15 -0
  39. package/dist/review-ZSC5ELQA.js +13 -0
  40. package/dist/review-ZSC5ELQA.js.map +1 -0
  41. package/dist/{run-GPBICAD6.js → run-SDRQDMSZ.js} +150 -55
  42. package/dist/run-SDRQDMSZ.js.map +1 -0
  43. package/package.json +1 -1
  44. package/prompts/execute.md +17 -5
  45. package/prompts/plan.md +1 -0
  46. package/prompts/pr-review.md +144 -0
  47. package/prompts/review.md +2 -0
  48. package/dist/analyze-VVG7UABS.js.map +0 -1
  49. package/dist/chunk-4HT4EVYV.js.map +0 -1
  50. package/dist/chunk-7W5VGYXW.js.map +0 -1
  51. package/dist/chunk-EHX4J5G5.js.map +0 -1
  52. package/dist/chunk-FPGHTTVV.js.map +0 -1
  53. package/dist/chunk-JTSAL3TI.js.map +0 -1
  54. package/dist/chunk-KWGRBNUG.js.map +0 -1
  55. package/dist/chunk-SVOWWZQJ.js.map +0 -1
  56. package/dist/chunk-WZDCTAWZ.js.map +0 -1
  57. package/dist/execute-PNOFNLZG.js +0 -12
  58. package/dist/init-5242XSYC.js +0 -9
  59. package/dist/plan-6KLONWPR.js +0 -14
  60. package/dist/pr-JLJLMFN3.js +0 -14
  61. package/dist/prd-TVJDYZXH.js +0 -14
  62. package/dist/review-FRV4ZMS2.js +0 -12
  63. package/dist/run-GPBICAD6.js.map +0 -1
  64. /package/dist/{chunk-2CSHLHYP.js.map → chunk-EHVKXFFN.js.map} +0 -0
  65. /package/dist/{chunk-YM3G5BLR.js.map → chunk-YLXPLHEL.js.map} +0 -0
  66. /package/dist/{config-B564P45C.js.map → config-SJAQMFWB.js.map} +0 -0
  67. /package/dist/{execute-PNOFNLZG.js.map → execute-VZ7SHLP4.js.map} +0 -0
  68. /package/dist/{init-5242XSYC.js.map → init-5KXCG36P.js.map} +0 -0
  69. /package/dist/{plan-6KLONWPR.js.map → plan-R34SAWRK.js.map} +0 -0
  70. /package/dist/{pr-JLJLMFN3.js.map → pr-P4BDQXUQ.js.map} +0 -0
  71. /package/dist/{prd-TVJDYZXH.js.map → pr-review-TOSBE6ZS.js.map} +0 -0
  72. /package/dist/{review-FRV4ZMS2.js.map → prd-RYLULM75.js.map} +0 -0
package/README.md CHANGED
@@ -87,7 +87,7 @@ npx issue-flow run 42 --mode manual
87
87
  npx issue-flow run 42 --web
88
88
  ```
89
89
 
90
- Executes all phases in order: **init** → **analyze** → **prd** → **plan** → **execute** → **review** → **pr**. Automatically resumes from the last incomplete phase if pipeline state exists. On review failure, runs correction cycles (re-execute + re-review) up to `maxCorrectionCycles`.
90
+ Executes all phases in order: **init** → **analyze** → **prd** → **plan** → **execute** → **review** → **pr**. Automatically resumes from the last incomplete phase if pipeline state exists. On review failure, its findings are saved verbatim to `lastReviewFindings` in `tasks.json`, and a correction cycle (re-execute + re-review) runs up to `maxCorrectionCycles`. The re-execute step reads `lastReviewFindings` and treats the issue as unresolved even if every user story already has `passes: true`, until the findings are addressed and the field is cleared back to `null`.
91
91
 
92
92
  ### `init` -- Check prerequisites
93
93
 
@@ -216,6 +216,8 @@ The `pipeline` field tracks which phases have completed, enabling resume from an
216
216
  }
217
217
  ```
218
218
 
219
+ The top-level `lastReviewFindings` field (`string | null`) holds the verbatim findings of the most recent failed `review` phase. Non-null overrides the "issue already complete" check even when every user story has `passes: true`, so a correction cycle's re-execute step is guaranteed to run instead of exiting immediately — see `core/engine.ts`.
220
+
219
221
  ## Architecture
220
222
 
221
223
  ```
@@ -1,14 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  issuePlaceholders,
4
- resolveCommandIssue,
4
+ resolveCommandIssue
5
+ } from "./chunk-RN2FAMUU.js";
6
+ import {
5
7
  runHeadless
6
- } from "./chunk-SVOWWZQJ.js";
8
+ } from "./chunk-TCOS2KFB.js";
7
9
  import {
8
10
  applyPlaceholders,
9
11
  loadPrompt
10
12
  } from "./chunk-SLHZPB3C.js";
11
- import "./chunk-4HT4EVYV.js";
13
+ import {
14
+ getIssueDir
15
+ } from "./chunk-2AVZZAC6.js";
12
16
  import {
13
17
  getGlobalTimeout,
14
18
  loadTaskPlan,
@@ -16,14 +20,14 @@ import {
16
20
  printInfo,
17
21
  printSuccess,
18
22
  saveTaskPlan
19
- } from "./chunk-WZDCTAWZ.js";
23
+ } from "./chunk-JNEHVQH5.js";
20
24
 
21
25
  // src/commands/analyze.ts
22
26
  import { mkdir, readFile, writeFile } from "fs/promises";
23
27
  import { join } from "path";
24
28
  async function runAnalyze(issue, resolvedIssue) {
25
29
  const issueNumber = issue.replace(/^#/, "");
26
- const issueDir = join("issues", issueNumber);
30
+ const issueDir = await getIssueDir(issueNumber);
27
31
  const analysisPath = join(issueDir, "analysis.md");
28
32
  const resolution = await resolveCommandIssue(issueNumber, resolvedIssue);
29
33
  if (!resolution.ok) {
@@ -73,4 +77,4 @@ async function runAnalyze(issue, resolvedIssue) {
73
77
  export {
74
78
  runAnalyze
75
79
  };
76
- //# sourceMappingURL=analyze-VVG7UABS.js.map
80
+ //# sourceMappingURL=analyze-R25HDGBJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/analyze.ts"],"sourcesContent":["import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { runHeadless } from '../core/headless.js';\nimport { applyPlaceholders, loadPrompt } from '../core/prompt-resolver.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 { printError, printInfo, printSuccess } from '../ui/logger.js';\nimport { getIssueDir } from '../utils/git.js';\n\nexport async function runAnalyze(issue: string, resolvedIssue?: ResolvedIssue): Promise<number> {\n const issueNumber = issue.replace(/^#/, '');\n const issueDir = await getIssueDir(issueNumber);\n const analysisPath = join(issueDir, 'analysis.md');\n\n const resolution = await resolveCommandIssue(issueNumber, resolvedIssue);\n if (!resolution.ok) {\n return resolution.code;\n }\n\n await mkdir(issueDir, { recursive: true });\n\n const template = await loadPrompt('analyze');\n const prompt = applyPlaceholders(template, {\n __ISSUE_NUMBER__: issueNumber,\n __ANALYSIS_PATH__: analysisPath,\n // Last: the Issue content is substituted in but never scanned again, so a\n // body that happens to contain a placeholder is left untouched.\n ...issuePlaceholders(resolution.resolved),\n });\n\n const result = await runHeadless({\n prompt,\n maxTurns: 30,\n timeout: getGlobalTimeout() ?? 300_000,\n outputFormat: 'text',\n allowedTools: ['Bash', 'Read', 'Glob', 'Grep', 'Write'],\n statusMessage: `Analyzing issue #${issueNumber}...`,\n });\n\n if (!result.success) {\n printError(`Analysis failed: ${result.error}`);\n return 1;\n }\n\n // Verify the file was created\n try {\n const content = await readFile(analysisPath, 'utf-8');\n if (content.length < 10) {\n printError('Analysis file was created but appears empty');\n return 1;\n }\n } catch {\n // File wasn't created by headless — save the result as analysis\n printInfo('Headless did not create analysis file; saving output directly');\n await writeFile(analysisPath, result.result, 'utf-8');\n }\n\n // Update pipeline state\n const tasksPath = join(issueDir, 'tasks.json');\n try {\n const plan = await loadTaskPlan(tasksPath);\n plan.pipeline.analyzeCompleted = true;\n await saveTaskPlan(tasksPath, plan);\n } catch {\n // tasks.json may not exist yet — that's OK for standalone analyze\n }\n\n printSuccess(`Analysis saved to ${analysisPath}`);\n return 0;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,OAAO,UAAU,iBAAiB;AAC3C,SAAS,YAAY;AAUrB,eAAsB,WAAW,OAAe,eAAgD;AAC9F,QAAM,cAAc,MAAM,QAAQ,MAAM,EAAE;AAC1C,QAAM,WAAW,MAAM,YAAY,WAAW;AAC9C,QAAM,eAAe,KAAK,UAAU,aAAa;AAEjD,QAAM,aAAa,MAAM,oBAAoB,aAAa,aAAa;AACvE,MAAI,CAAC,WAAW,IAAI;AAClB,WAAO,WAAW;AAAA,EACpB;AAEA,QAAM,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAEzC,QAAM,WAAW,MAAM,WAAW,SAAS;AAC3C,QAAM,SAAS,kBAAkB,UAAU;AAAA,IACzC,kBAAkB;AAAA,IAClB,mBAAmB;AAAA;AAAA;AAAA,IAGnB,GAAG,kBAAkB,WAAW,QAAQ;AAAA,EAC1C,CAAC;AAED,QAAM,SAAS,MAAM,YAAY;AAAA,IAC/B;AAAA,IACA,UAAU;AAAA,IACV,SAAS,iBAAiB,KAAK;AAAA,IAC/B,cAAc;AAAA,IACd,cAAc,CAAC,QAAQ,QAAQ,QAAQ,QAAQ,OAAO;AAAA,IACtD,eAAe,oBAAoB,WAAW;AAAA,EAChD,CAAC;AAED,MAAI,CAAC,OAAO,SAAS;AACnB,eAAW,oBAAoB,OAAO,KAAK,EAAE;AAC7C,WAAO;AAAA,EACT;AAGA,MAAI;AACF,UAAM,UAAU,MAAM,SAAS,cAAc,OAAO;AACpD,QAAI,QAAQ,SAAS,IAAI;AACvB,iBAAW,6CAA6C;AACxD,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAEN,cAAU,+DAA+D;AACzE,UAAM,UAAU,cAAc,OAAO,QAAQ,OAAO;AAAA,EACtD;AAGA,QAAM,YAAY,KAAK,UAAU,YAAY;AAC7C,MAAI;AACF,UAAM,OAAO,MAAM,aAAa,SAAS;AACzC,SAAK,SAAS,mBAAmB;AACjC,UAAM,aAAa,WAAW,IAAI;AAAA,EACpC,QAAQ;AAAA,EAER;AAEA,eAAa,qBAAqB,YAAY,EAAE;AAChD,SAAO;AACT;","names":[]}