@xdevops/issue-auto-finish 1.0.96 → 1.0.98

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 (43) hide show
  1. package/dist/{PtyRunner-UD3M7GNM.js → PtyRunner-AVP7C4HC.js} +2 -2
  2. package/dist/ai-runner/AIRunner.d.ts +2 -4
  3. package/dist/ai-runner/AIRunner.d.ts.map +1 -1
  4. package/dist/ai-runner/PlanFileResolver.d.ts +20 -3
  5. package/dist/ai-runner/PlanFileResolver.d.ts.map +1 -1
  6. package/dist/ai-runner/PtyRunner.d.ts.map +1 -1
  7. package/dist/{ai-runner-6OQYGU56.js → ai-runner-GPHHQKUT.js} +2 -2
  8. package/dist/{analyze-LZHS3MHW.js → analyze-SYJXCCU7.js} +2 -2
  9. package/dist/{braindump-7QDUYUZW.js → braindump-QIUTH777.js} +2 -2
  10. package/dist/{chunk-P6KYWBMT.js → chunk-APROB5LF.js} +9 -9
  11. package/dist/{chunk-75ANI33A.js → chunk-CKYGI2V2.js} +1 -1
  12. package/dist/{chunk-W553OKAJ.js → chunk-DUQUGPMI.js} +32 -66
  13. package/dist/chunk-DUQUGPMI.js.map +1 -0
  14. package/dist/{chunk-AFGUFM6H.js → chunk-URL4HZ66.js} +2 -2
  15. package/dist/{chunk-SJSVO46Z.js → chunk-XOOKCEAK.js} +92 -76
  16. package/dist/chunk-XOOKCEAK.js.map +1 -0
  17. package/dist/cli.js +5 -5
  18. package/dist/hooks/HookInjector.d.ts +0 -6
  19. package/dist/hooks/HookInjector.d.ts.map +1 -1
  20. package/dist/index.js +4 -4
  21. package/dist/{init-Q4DTX6JN.js → init-FDXIJNXF.js} +2 -2
  22. package/dist/lib.js +2 -2
  23. package/dist/orchestrator/steps/PhaseHelpers.d.ts +1 -1
  24. package/dist/orchestrator/steps/PhaseHelpers.d.ts.map +1 -1
  25. package/dist/orchestrator/steps/SetupStep.d.ts +0 -7
  26. package/dist/orchestrator/steps/SetupStep.d.ts.map +1 -1
  27. package/dist/phases/BasePhase.d.ts.map +1 -1
  28. package/dist/{restart-CEFVMQLL.js → restart-BRO6NIID.js} +2 -2
  29. package/dist/run.js +4 -4
  30. package/dist/{start-JYVFJZCL.js → start-ZIJDXV56.js} +2 -2
  31. package/package.json +1 -1
  32. package/dist/chunk-SJSVO46Z.js.map +0 -1
  33. package/dist/chunk-W553OKAJ.js.map +0 -1
  34. /package/dist/{PtyRunner-UD3M7GNM.js.map → PtyRunner-AVP7C4HC.js.map} +0 -0
  35. /package/dist/{ai-runner-6OQYGU56.js.map → ai-runner-GPHHQKUT.js.map} +0 -0
  36. /package/dist/{analyze-LZHS3MHW.js.map → analyze-SYJXCCU7.js.map} +0 -0
  37. /package/dist/{braindump-7QDUYUZW.js.map → braindump-QIUTH777.js.map} +0 -0
  38. /package/dist/{chunk-P6KYWBMT.js.map → chunk-APROB5LF.js.map} +0 -0
  39. /package/dist/{chunk-75ANI33A.js.map → chunk-CKYGI2V2.js.map} +0 -0
  40. /package/dist/{chunk-AFGUFM6H.js.map → chunk-URL4HZ66.js.map} +0 -0
  41. /package/dist/{init-Q4DTX6JN.js.map → init-FDXIJNXF.js.map} +0 -0
  42. /package/dist/{restart-CEFVMQLL.js.map → restart-BRO6NIID.js.map} +0 -0
  43. /package/dist/{start-JYVFJZCL.js.map → start-ZIJDXV56.js.map} +0 -0
@@ -12,7 +12,7 @@ import {
12
12
  isTuiNoise,
13
13
  parseInteractiveDialog,
14
14
  stripAnsi
15
- } from "./chunk-SJSVO46Z.js";
15
+ } from "./chunk-XOOKCEAK.js";
16
16
  import "./chunk-TFEPHOVE.js";
17
17
  import "./chunk-G7QI5WDI.js";
18
18
  import "./chunk-2RWGZPNF.js";
@@ -32,4 +32,4 @@ export {
32
32
  parseInteractiveDialog,
33
33
  stripAnsi
34
34
  };
35
- //# sourceMappingURL=PtyRunner-UD3M7GNM.js.map
35
+ //# sourceMappingURL=PtyRunner-AVP7C4HC.js.map
@@ -26,6 +26,8 @@ export interface RunOptions {
26
26
  mode?: string;
27
27
  /** Current pipeline phase name — used by PtyRunner for per-phase agent selection */
28
28
  phaseName?: string;
29
+ /** Issue title — used by PlanFileResolver for content-based plan file matching */
30
+ issueTitle?: string;
29
31
  /** PTY 产物门控:返回 true 表示预期产物已就绪,false 时 PtyRunner 不会声明完成 */
30
32
  artifactCheck?: () => boolean;
31
33
  /** 预期产物文件的完整路径列表(用于 PtyRunner 原生 plan mode 的 commit 步骤) */
@@ -39,10 +41,6 @@ export interface RunOptions {
39
41
  /** When PTY output matches this regex, immediately signal task completion (skip debounce).
40
42
  * Used by native plan mode to detect the plan confirmation dialog. */
41
43
  completionSignal?: RegExp;
42
- /** Hook event name that should trigger completion when detected via HookEventWatcher.
43
- * Used as a fallback when completionSignal regex fails to match PTY output.
44
- * A grace period (5s) is applied to let the primary signal match first. */
45
- completionHookEvent?: string;
46
44
  onStreamEvent?: (event: StreamEvent) => void;
47
45
  onInputRequired?: (request: InputRequest) => Promise<string>;
48
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AIRunner.d.ts","sourceRoot":"","sources":["../../src/ai-runner/AIRunner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,eAAe,GAAG,oBAAoB,GAAG,SAAS,CAAC;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC;IAC9B,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,uGAAuG;IACvG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sFAAsF;IACtF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gEAAgE;IAChE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;2EACuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;gFAE4E;IAC5E,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IACpC;oFACgF;IAChF,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7C,OAAO,IAAI,IAAI,CAAC;IAChB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7C,gFAAgF;IAChF,kBAAkB,CAAC,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;CACrD"}
1
+ {"version":3,"file":"AIRunner.d.ts","sourceRoot":"","sources":["../../src/ai-runner/AIRunner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,eAAe,GAAG,oBAAoB,GAAG,SAAS,CAAC;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC;IAC9B,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,uGAAuG;IACvG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sFAAsF;IACtF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gEAAgE;IAChE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;2EACuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IACpC;oFACgF;IAChF,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7C,OAAO,IAAI,IAAI,CAAC;IAChB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7C,gFAAgF;IAChF,kBAAkB,CAAC,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;CACrD"}
@@ -10,13 +10,26 @@ export interface ResolvedPlanFile {
10
10
  * optional content-based validation to handle concurrent plan generation.
11
11
  */
12
12
  export declare class PlanFileResolver {
13
+ /** Plan files older than this are removed before snapshot (2 hours). */
14
+ static readonly STALE_THRESHOLD_MS: number;
15
+ /** Resolved plan files shorter than this are considered empty/fragment. */
16
+ static readonly MIN_PLAN_BYTES = 200;
13
17
  private readonly plansDir;
14
18
  private beforeFiles;
15
19
  constructor(plansDir?: string);
16
20
  /** Create a resolver for a specific runner mode (e.g. 'claude-internal', 'codebuddy'). */
17
21
  static forRunner(agentMode: string): PlanFileResolver;
18
- /** Take a snapshot of existing plan files before the plan phase starts. */
19
- takeBeforeSnapshot(): void;
22
+ /**
23
+ * Take a snapshot of existing plan files before the plan phase starts.
24
+ * Optionally removes stale files (older than STALE_THRESHOLD_MS) to reduce
25
+ * noise in the snapshot diff.
26
+ */
27
+ takeBeforeSnapshot(cleanStale?: boolean): void;
28
+ /**
29
+ * Remove plan files older than STALE_THRESHOLD_MS to prevent accumulation
30
+ * that confuses snapshot-based resolution on long-lived machines.
31
+ */
32
+ private removeStaleFiles;
20
33
  /**
21
34
  * Check if any new or modified plan files exist since the before-snapshot.
22
35
  * Used as an artifact gate by detectCompletion to prevent premature
@@ -41,7 +54,6 @@ export declare class PlanFileResolver {
41
54
  static buildContentHint(issueIid: number, issueTitle?: string): string;
42
55
  private listFiles;
43
56
  private findNewFiles;
44
- private isMetadataFile;
45
57
  /**
46
58
  * Fallback: if no new files found (rare case — plan might have overwritten
47
59
  * an existing file), find the most recently modified file.
@@ -49,6 +61,11 @@ export declare class PlanFileResolver {
49
61
  private fallbackByMtime;
50
62
  private matchByContent;
51
63
  private contentMatches;
64
+ /**
65
+ * Read and validate a candidate, warning if content is below MIN_PLAN_BYTES.
66
+ * Returns the file even if short (caller may still use it as best-effort).
67
+ */
68
+ private readAndValidate;
52
69
  private readCandidate;
53
70
  }
54
71
  //# sourceMappingURL=PlanFileResolver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlanFileResolver.d.ts","sourceRoot":"","sources":["../../src/ai-runner/PlanFileResolver.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAC/B,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAaD;;;;GAIG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,WAAW,CAAkC;gBAEzC,QAAQ,CAAC,EAAE,MAAM;IAI7B,0FAA0F;IAC1F,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB;IAKrD,2EAA2E;IAC3E,kBAAkB,IAAI,IAAI;IAQ1B;;;;OAIG;IACH,qBAAqB,IAAI,OAAO;IAShC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAuCtD;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;IAMtE,OAAO,CAAC,SAAS;IAwBjB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,cAAc;IAKtB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAgCvB,OAAO,CAAC,cAAc;IA+BtB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,aAAa;CActB"}
1
+ {"version":3,"file":"PlanFileResolver.d.ts","sourceRoot":"","sources":["../../src/ai-runner/PlanFileResolver.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAC/B,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAQD;;;;GAIG;AACH,qBAAa,gBAAgB;IAC3B,wEAAwE;IACxE,MAAM,CAAC,QAAQ,CAAC,kBAAkB,SAAsB;IACxD,2EAA2E;IAC3E,MAAM,CAAC,QAAQ,CAAC,cAAc,OAAO;IAErC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,WAAW,CAAkC;gBAEzC,QAAQ,CAAC,EAAE,MAAM;IAI7B,0FAA0F;IAC1F,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB;IAKrD;;;;OAIG;IACH,kBAAkB,CAAC,UAAU,UAAO,GAAG,IAAI;IAW3C;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA2BxB;;;;OAIG;IACH,qBAAqB,IAAI,OAAO;IAShC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAqCtD;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;IAMtE,OAAO,CAAC,SAAS;IAwBjB,OAAO,CAAC,YAAY;IAUpB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAgCvB,OAAO,CAAC,cAAc;IAqBtB,OAAO,CAAC,cAAc;IAKtB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,aAAa;CActB"}
@@ -1 +1 @@
1
- {"version":3,"file":"PtyRunner.d.ts","sourceRoot":"","sources":["../../src/ai-runner/PtyRunner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PtyRunner.d.ts","sourceRoot":"","sources":["../../src/ai-runner/PtyRunner.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import "./chunk-MSL7ROVK.js";
2
2
  import {
3
3
  PlanFileResolver,
4
4
  PtyRunner
5
- } from "./chunk-SJSVO46Z.js";
5
+ } from "./chunk-XOOKCEAK.js";
6
6
  import {
7
7
  SdkRunner
8
8
  } from "./chunk-R32Q3RGK.js";
@@ -54,4 +54,4 @@ export {
54
54
  usesDeterministicPlanCopy,
55
55
  validateRunnerRegistry
56
56
  };
57
- //# sourceMappingURL=ai-runner-6OQYGU56.js.map
57
+ //# sourceMappingURL=ai-runner-GPHHQKUT.js.map
@@ -1,5 +1,5 @@
1
1
  import "./chunk-MSL7ROVK.js";
2
- import "./chunk-SJSVO46Z.js";
2
+ import "./chunk-XOOKCEAK.js";
3
3
  import "./chunk-R32Q3RGK.js";
4
4
  import {
5
5
  analyze
@@ -77,4 +77,4 @@ async function analyzeCommand(opts) {
77
77
  export {
78
78
  analyzeCommand
79
79
  };
80
- //# sourceMappingURL=analyze-LZHS3MHW.js.map
80
+ //# sourceMappingURL=analyze-SYJXCCU7.js.map
@@ -15,7 +15,7 @@ import {
15
15
  GitOperations
16
16
  } from "./chunk-GPZX4DSY.js";
17
17
  import "./chunk-MSL7ROVK.js";
18
- import "./chunk-SJSVO46Z.js";
18
+ import "./chunk-XOOKCEAK.js";
19
19
  import "./chunk-R32Q3RGK.js";
20
20
  import "./chunk-ACVOOHAR.js";
21
21
  import "./chunk-B7TVVODN.js";
@@ -209,4 +209,4 @@ ${bold("\u786E\u8BA4\u6267\u884C\uFF1F")} (${green("y")}=\u786E\u8BA4 / ${red("q
209
209
  export {
210
210
  braindumpCommand
211
211
  };
212
- //# sourceMappingURL=braindump-7QDUYUZW.js.map
212
+ //# sourceMappingURL=braindump-QIUTH777.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-5M5SB6ZA.js";
5
5
  import {
6
6
  createSetupRouter
7
- } from "./chunk-AFGUFM6H.js";
7
+ } from "./chunk-URL4HZ66.js";
8
8
  import {
9
9
  buildLockNoteBody,
10
10
  buildReleaseNoteBody,
@@ -38,7 +38,7 @@ import {
38
38
  setE2eOverride,
39
39
  setNoteSyncOverride,
40
40
  validatePhaseRegistry
41
- } from "./chunk-W553OKAJ.js";
41
+ } from "./chunk-DUQUGPMI.js";
42
42
  import {
43
43
  AsyncMutex,
44
44
  BaseTracker,
@@ -2458,7 +2458,7 @@ function createKnowledgeRouter(deps) {
2458
2458
  heartbeat = setInterval(() => {
2459
2459
  sendProgress({ step: "analyzing", current: 2, total, message: "AI \u5206\u6790\u4E2D...", elapsed: Date.now() - aiStart });
2460
2460
  }, 3e3);
2461
- const { createAIRunner: createAIRunner2 } = await import("./ai-runner-6OQYGU56.js");
2461
+ const { createAIRunner: createAIRunner2 } = await import("./ai-runner-GPHHQKUT.js");
2462
2462
  const runner = createAIRunner2(config.ai);
2463
2463
  const { analyze } = await import("./KnowledgeAnalyzer-MTTTSSHX.js");
2464
2464
  const knowledge = await analyze({ workDir, aiRunner: runner, syncToProject: config.sync.knowledgeToProject });
@@ -2503,7 +2503,7 @@ function createKnowledgeRouter(deps) {
2503
2503
  (async () => {
2504
2504
  try {
2505
2505
  sendProgress({ step: "collecting", current: 1, total, message: "\u68C0\u6D4B\u53D8\u66F4\u5E76\u6536\u96C6\u4FE1\u606F..." });
2506
- const { createAIRunner: createAIRunner2 } = await import("./ai-runner-6OQYGU56.js");
2506
+ const { createAIRunner: createAIRunner2 } = await import("./ai-runner-GPHHQKUT.js");
2507
2507
  const { analyzeIncremental } = await import("./KnowledgeAnalyzer-MTTTSSHX.js");
2508
2508
  const runner = createAIRunner2(config.ai);
2509
2509
  sendProgress({ step: "analyzing", current: 2, total, message: "\u589E\u91CF\u5206\u6790\u4E2D..." });
@@ -2787,7 +2787,7 @@ function createDomainModelRouter(deps) {
2787
2787
  }
2788
2788
  (async () => {
2789
2789
  try {
2790
- const { createAIRunner: createAIRunner2 } = await import("./ai-runner-6OQYGU56.js");
2790
+ const { createAIRunner: createAIRunner2 } = await import("./ai-runner-GPHHQKUT.js");
2791
2791
  const runner = createAIRunner2(config.ai);
2792
2792
  const model = await analyzer.analyze({
2793
2793
  workDir: config.project.workDir,
@@ -3001,7 +3001,7 @@ function createSystemUseCaseRouter(deps) {
3001
3001
  }
3002
3002
  (async () => {
3003
3003
  try {
3004
- const { createAIRunner: createAIRunner2 } = await import("./ai-runner-6OQYGU56.js");
3004
+ const { createAIRunner: createAIRunner2 } = await import("./ai-runner-GPHHQKUT.js");
3005
3005
  const runner = createAIRunner2(config.ai);
3006
3006
  const model = await analyzer.analyze({
3007
3007
  workDir: config.project.workDir,
@@ -3191,7 +3191,7 @@ function createSystemUseCaseRouter(deps) {
3191
3191
  res.status(404).json({ error: "No domain model loaded \u2014 run domain analysis first" });
3192
3192
  return;
3193
3193
  }
3194
- const { createAIRunner: createAIRunner2 } = await import("./ai-runner-6OQYGU56.js");
3194
+ const { createAIRunner: createAIRunner2 } = await import("./ai-runner-GPHHQKUT.js");
3195
3195
  const runner = createAIRunner2(config.ai);
3196
3196
  const associations = await analyzer.suggestDomainAssociations(
3197
3197
  useCaseModel,
@@ -8883,7 +8883,7 @@ async function main() {
8883
8883
  let sharedTerminalManager;
8884
8884
  if (config.ai.mode === "pty") {
8885
8885
  const { TerminalManager: TerminalManager2 } = await import("./TerminalManager-RT2N7N5R.js");
8886
- const { PtyRunner } = await import("./PtyRunner-UD3M7GNM.js");
8886
+ const { PtyRunner } = await import("./PtyRunner-AVP7C4HC.js");
8887
8887
  const { registerAIRunner: regRunner, getPtyProfile } = await import("./AIRunnerRegistry-CFDNWSXC.js");
8888
8888
  const allPtyAgents = /* @__PURE__ */ new Set([
8889
8889
  config.pty.defaultAgent,
@@ -9303,4 +9303,4 @@ function migrateKnowledgeDir(srcDir, destDir) {
9303
9303
  export {
9304
9304
  main
9305
9305
  };
9306
- //# sourceMappingURL=chunk-P6KYWBMT.js.map
9306
+ //# sourceMappingURL=chunk-APROB5LF.js.map
@@ -110,4 +110,4 @@ async function startDaemon(configPath) {
110
110
  export {
111
111
  startCommand
112
112
  };
113
- //# sourceMappingURL=chunk-75ANI33A.js.map
113
+ //# sourceMappingURL=chunk-CKYGI2V2.js.map
@@ -20,7 +20,7 @@ import {
20
20
  } from "./chunk-GPZX4DSY.js";
21
21
  import {
22
22
  HookInjector
23
- } from "./chunk-SJSVO46Z.js";
23
+ } from "./chunk-XOOKCEAK.js";
24
24
  import {
25
25
  getProjectKnowledge
26
26
  } from "./chunk-ACVOOHAR.js";
@@ -236,8 +236,8 @@ var GongfengClient = class {
236
236
  const encoded = encodeURIComponent(this.projectPath);
237
237
  return `${this.apiUrl}/api/v3/projects/${encoded}`;
238
238
  }
239
- async requestRaw(path13, options = {}) {
240
- const url = `${this.projectApiBase}${path13}`;
239
+ async requestRaw(path12, options = {}) {
240
+ const url = `${this.projectApiBase}${path12}`;
241
241
  logger4.debug("API request", { method: options.method || "GET", url });
242
242
  return this.circuitBreaker.execute(
243
243
  () => this.retryPolicy.execute(async () => {
@@ -254,11 +254,11 @@ var GongfengClient = class {
254
254
  throw new GongfengApiError(resp.status, `Gongfeng API error ${resp.status}: ${body}`, body);
255
255
  }
256
256
  return resp;
257
- }, `requestRaw ${options.method || "GET"} ${path13}`)
257
+ }, `requestRaw ${options.method || "GET"} ${path12}`)
258
258
  );
259
259
  }
260
- async request(path13, options = {}) {
261
- const resp = await this.requestRaw(path13, options);
260
+ async request(path12, options = {}) {
261
+ const resp = await this.requestRaw(path12, options);
262
262
  return resp.json();
263
263
  }
264
264
  async createIssue(title, description, labels) {
@@ -437,8 +437,8 @@ var GongfengClient = class {
437
437
  }
438
438
  return mr;
439
439
  }
440
- async requestGlobal(path13, options = {}) {
441
- const url = `${this.apiUrl}${path13}`;
440
+ async requestGlobal(path12, options = {}) {
441
+ const url = `${this.apiUrl}${path12}`;
442
442
  logger4.debug("API request (global)", { method: options.method || "GET", url });
443
443
  const resp = await this.circuitBreaker.execute(
444
444
  () => this.retryPolicy.execute(async () => {
@@ -455,7 +455,7 @@ var GongfengClient = class {
455
455
  throw new GongfengApiError(r.status, `Gongfeng API error ${r.status}: ${body}`, body);
456
456
  }
457
457
  return r;
458
- }, `requestGlobal ${options.method || "GET"} ${path13}`)
458
+ }, `requestGlobal ${options.method || "GET"} ${path12}`)
459
459
  );
460
460
  return resp.json();
461
461
  }
@@ -1902,6 +1902,7 @@ ${t("basePhase.rulesSection", { rules })}`;
1902
1902
  timeoutMaxExtensions: this.config.ai.timeoutMaxExtensions,
1903
1903
  mode: this.getRunMode(),
1904
1904
  phaseName: this.phaseName,
1905
+ issueTitle: ctx?.demand.title,
1905
1906
  artifactCheck,
1906
1907
  artifactPaths,
1907
1908
  sessionId: options?.sessionId,
@@ -3134,8 +3135,8 @@ var WorkspaceManager = class {
3134
3135
  };
3135
3136
 
3136
3137
  // src/orchestrator/PipelineOrchestrator.ts
3137
- import path12 from "path";
3138
- import fs10 from "fs/promises";
3138
+ import path11 from "path";
3139
+ import fs9 from "fs/promises";
3139
3140
  import fsSync from "fs";
3140
3141
  import { execFile as execFile2 } from "child_process";
3141
3142
  import { promisify as promisify2 } from "util";
@@ -3774,38 +3775,7 @@ metrics.registerCounter("iaf_braindump_batches_total", "Total braindump batches"
3774
3775
  metrics.registerCounter("iaf_braindump_tasks_total", "Total braindump tasks");
3775
3776
 
3776
3777
  // src/orchestrator/steps/SetupStep.ts
3777
- import fs9 from "fs";
3778
- import path11 from "path";
3779
3778
  var logger14 = logger.child("SetupStep");
3780
- var PLAN_DIR_NAME = ".claude-plan";
3781
- function cleanupStalePlanDirs(workDir, currentIid) {
3782
- const claudePlanDir = path11.join(workDir, PLAN_DIR_NAME);
3783
- if (!fs9.existsSync(claudePlanDir)) return;
3784
- const currentDirName = `issue-${currentIid}`;
3785
- let entries;
3786
- try {
3787
- entries = fs9.readdirSync(claudePlanDir);
3788
- } catch {
3789
- return;
3790
- }
3791
- for (const entry of entries) {
3792
- if (entry.startsWith("issue-") && entry !== currentDirName) {
3793
- const stalePath = path11.join(claudePlanDir, entry);
3794
- try {
3795
- fs9.rmSync(stalePath, { recursive: true, force: true });
3796
- logger14.info("Removed stale plan directory from worktree", {
3797
- removed: entry,
3798
- currentIid
3799
- });
3800
- } catch (err) {
3801
- logger14.warn("Failed to remove stale plan directory", {
3802
- path: stalePath,
3803
- error: err.message
3804
- });
3805
- }
3806
- }
3807
- }
3808
- }
3809
3779
  async function executeSetup(ctx, deps) {
3810
3780
  const { issue, wtCtx, record, pipelineDef, branchName } = ctx;
3811
3781
  try {
@@ -3839,7 +3809,6 @@ async function executeSetup(ctx, deps) {
3839
3809
  const primaryGitRoot = wtCtx.workspace ? wtCtx.workspace.primary.gitRootDir : wtCtx.gitRootDir;
3840
3810
  const wtGit = new GitOperations(primaryGitRoot);
3841
3811
  const wtPlan = new PlanPersistence(primaryWorkDir, issue.iid);
3842
- cleanupStalePlanDirs(primaryWorkDir, issue.iid);
3843
3812
  wtPlan.ensureDir();
3844
3813
  wtPlan.writeIssueMeta({
3845
3814
  id: issue.id,
@@ -4002,10 +3971,7 @@ function resolveUatRunner(deps, issueIid) {
4002
3971
  }
4003
3972
  return deps.aiRunner;
4004
3973
  }
4005
- async function commitPlanFiles(ctx, wtGit, wtGitMap, phaseName, displayId, planWorkDir) {
4006
- if (planWorkDir) {
4007
- cleanupStalePlanDirs(planWorkDir, displayId);
4008
- }
3974
+ async function commitPlanFiles(ctx, wtGit, wtGitMap, phaseName, displayId) {
4009
3975
  const commitMsg = `chore(auto): ${phaseName} phase completed for issue #${displayId}`;
4010
3976
  if (ctx.workspace && ctx.workspace.repos.length > 1) {
4011
3977
  for (const repo of ctx.workspace.repos) {
@@ -4237,7 +4203,7 @@ var DefaultLifecycleHook = class {
4237
4203
  completedAt: (/* @__PURE__ */ new Date()).toISOString()
4238
4204
  });
4239
4205
  wtPlan.updatePhaseProgress(spec.name, "completed");
4240
- await commitPlanFiles(phaseCtx, wtGit, wtGitMap, spec.name, displayId, wtPlan.baseDir);
4206
+ await commitPlanFiles(phaseCtx, wtGit, wtGitMap, spec.name, displayId);
4241
4207
  if (phase) {
4242
4208
  await syncResultToIssue(phase, phaseCtx, displayId, spec.name, deps, issue.id, wtPlan);
4243
4209
  }
@@ -4385,7 +4351,7 @@ var AiPhaseStrategy = class {
4385
4351
  completedAt: (/* @__PURE__ */ new Date()).toISOString()
4386
4352
  });
4387
4353
  wtPlan.updatePhaseProgress(spec.name, "completed");
4388
- await commitPlanFiles(phaseCtx, wtGit, wtGitMap, spec.name, issue.iid, wtPlan.baseDir);
4354
+ await commitPlanFiles(phaseCtx, wtGit, wtGitMap, spec.name, issue.iid);
4389
4355
  const runner = this.resolveRunner(ctx);
4390
4356
  const phase = createPhase(spec.name, runner, wtGit, wtPlan, deps.config);
4391
4357
  await syncResultToIssue(phase, phaseCtx, issue.iid, spec.name, deps, issue.id, wtPlan);
@@ -4953,7 +4919,7 @@ var PipelineOrchestrator = class {
4953
4919
  });
4954
4920
  this.devServerManager = new DevServerManager();
4955
4921
  this.screenshotPublisher = new ScreenshotPublisher(gongfeng);
4956
- this.effectiveWorktreeBaseDir = this.tenantId === "default" ? config.project.worktreeBaseDir : path12.join(config.project.worktreeBaseDir, this.tenantId);
4922
+ this.effectiveWorktreeBaseDir = this.tenantId === "default" ? config.project.worktreeBaseDir : path11.join(config.project.worktreeBaseDir, this.tenantId);
4957
4923
  const effectiveWsConfig = wsConfig ?? buildSingleRepoWorkspace(config.project, config.gongfeng.projectPath);
4958
4924
  this.workspaceManager = new WorkspaceManager({
4959
4925
  wsConfig: effectiveWsConfig,
@@ -4992,9 +4958,9 @@ var PipelineOrchestrator = class {
4992
4958
  if (wtDir === repoGitRoot) continue;
4993
4959
  if (!wtDir.includes("/issue-")) continue;
4994
4960
  try {
4995
- const gitFile = path12.join(wtDir, ".git");
4961
+ const gitFile = path11.join(wtDir, ".git");
4996
4962
  try {
4997
- await fs10.access(gitFile);
4963
+ await fs9.access(gitFile);
4998
4964
  } catch {
4999
4965
  logger23.warn("Worktree corrupted (.git missing), force removing", { dir: wtDir });
5000
4966
  await this.mainGit.worktreeRemove(wtDir, true).catch(() => {
@@ -5009,9 +4975,9 @@ var PipelineOrchestrator = class {
5009
4975
  await wtGit.rebaseAbort();
5010
4976
  cleaned++;
5011
4977
  }
5012
- const indexLock = path12.join(wtDir, ".git", "index.lock");
4978
+ const indexLock = path11.join(wtDir, ".git", "index.lock");
5013
4979
  try {
5014
- await fs10.unlink(indexLock);
4980
+ await fs9.unlink(indexLock);
5015
4981
  logger23.warn("Removed stale index.lock", { path: indexLock });
5016
4982
  cleaned++;
5017
4983
  } catch {
@@ -5023,9 +4989,9 @@ var PipelineOrchestrator = class {
5023
4989
  } catch (err) {
5024
4990
  logger23.warn("Failed to list worktrees for cleanup", { error: err.message });
5025
4991
  }
5026
- const mainIndexLock = path12.join(repoGitRoot, ".git", "index.lock");
4992
+ const mainIndexLock = path11.join(repoGitRoot, ".git", "index.lock");
5027
4993
  try {
5028
- await fs10.unlink(mainIndexLock);
4994
+ await fs9.unlink(mainIndexLock);
5029
4995
  logger23.warn("Removed stale main repo index.lock", { path: mainIndexLock });
5030
4996
  cleaned++;
5031
4997
  } catch {
@@ -5141,17 +5107,17 @@ var PipelineOrchestrator = class {
5141
5107
  }
5142
5108
  }
5143
5109
  async ensureNodeModules(workDir) {
5144
- const targetBin = path12.join(workDir, "node_modules", ".bin");
5110
+ const targetBin = path11.join(workDir, "node_modules", ".bin");
5145
5111
  try {
5146
- await fs10.access(targetBin);
5112
+ await fs9.access(targetBin);
5147
5113
  logger23.info("node_modules already complete (has .bin/)");
5148
5114
  return true;
5149
5115
  } catch {
5150
5116
  }
5151
- const sourceNM = path12.join(this.config.project.workDir, "node_modules");
5152
- const targetNM = path12.join(workDir, "node_modules");
5117
+ const sourceNM = path11.join(this.config.project.workDir, "node_modules");
5118
+ const targetNM = path11.join(workDir, "node_modules");
5153
5119
  try {
5154
- await fs10.access(sourceNM);
5120
+ await fs9.access(sourceNM);
5155
5121
  } catch {
5156
5122
  logger23.warn("Main repo node_modules not found, skipping seed", { sourceNM });
5157
5123
  return false;
@@ -5238,10 +5204,10 @@ var PipelineOrchestrator = class {
5238
5204
  async cleanupE2eOutputs(issueIid) {
5239
5205
  const vendorDir = this.config.e2e.uatVendorDir;
5240
5206
  if (!vendorDir) return;
5241
- const abs = path12.isAbsolute(vendorDir) ? vendorDir : path12.resolve(this.config.project.workDir, vendorDir);
5242
- const outputDir = path12.join(abs, "outputs", `issue-${issueIid}`);
5207
+ const abs = path11.isAbsolute(vendorDir) ? vendorDir : path11.resolve(this.config.project.workDir, vendorDir);
5208
+ const outputDir = path11.join(abs, "outputs", `issue-${issueIid}`);
5243
5209
  try {
5244
- await fs10.rm(outputDir, { recursive: true, force: true });
5210
+ await fs9.rm(outputDir, { recursive: true, force: true });
5245
5211
  logger23.info("E2E outputs cleaned up", { issueIid, dir: outputDir });
5246
5212
  } catch (err) {
5247
5213
  logger23.warn("Failed to cleanup E2E outputs", { issueIid, dir: outputDir, error: err.message });
@@ -5256,7 +5222,7 @@ var PipelineOrchestrator = class {
5256
5222
  if (!this.workspaceManager) return;
5257
5223
  const wsRoot = this.workspaceManager.getWorkspaceRoot(issueIid);
5258
5224
  try {
5259
- await fs10.rm(wsRoot, { recursive: true, force: true });
5225
+ await fs9.rm(wsRoot, { recursive: true, force: true });
5260
5226
  logger23.info("Workspace root cleaned up", { issueIid, dir: wsRoot });
5261
5227
  } catch (err) {
5262
5228
  logger23.warn("Failed to cleanup workspace root", { issueIid, dir: wsRoot, error: err.message });
@@ -6108,4 +6074,4 @@ export {
6108
6074
  PipelineOrchestrator,
6109
6075
  BrainstormService
6110
6076
  };
6111
- //# sourceMappingURL=chunk-W553OKAJ.js.map
6077
+ //# sourceMappingURL=chunk-DUQUGPMI.js.map