@xdevops/issue-auto-finish 1.0.91 → 1.0.92

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/{chunk-CQ66LL7P.js → chunk-2WDVTLVF.js} +1 -1
  2. package/dist/{chunk-UMQYEYLO.js → chunk-6T7ZHAV2.js} +2 -2
  3. package/dist/{chunk-LDGK5NMS.js → chunk-WZGEYHCC.js} +628 -442
  4. package/dist/{chunk-LDGK5NMS.js.map → chunk-WZGEYHCC.js.map} +1 -1
  5. package/dist/cli.js +2 -2
  6. package/dist/index.js +2 -2
  7. package/dist/lib.js +1 -1
  8. package/dist/lifecycle/DefaultLifecycleHook.d.ts +21 -0
  9. package/dist/lifecycle/DefaultLifecycleHook.d.ts.map +1 -0
  10. package/dist/lifecycle/FeedbackTypes.d.ts +52 -0
  11. package/dist/lifecycle/FeedbackTypes.d.ts.map +1 -0
  12. package/dist/lifecycle/PhaseLifecycleHook.d.ts +70 -0
  13. package/dist/lifecycle/PhaseLifecycleHook.d.ts.map +1 -0
  14. package/dist/lifecycle/PhaseMiddleware.d.ts +47 -0
  15. package/dist/lifecycle/PhaseMiddleware.d.ts.map +1 -0
  16. package/dist/lifecycle/PhaseStateMachine.d.ts +111 -0
  17. package/dist/lifecycle/PhaseStateMachine.d.ts.map +1 -0
  18. package/dist/lifecycle/index.d.ts +8 -0
  19. package/dist/lifecycle/index.d.ts.map +1 -1
  20. package/dist/orchestrator/steps/PhaseHelpers.d.ts +24 -0
  21. package/dist/orchestrator/steps/PhaseHelpers.d.ts.map +1 -0
  22. package/dist/orchestrator/steps/PhaseLoopStep.d.ts +10 -0
  23. package/dist/orchestrator/steps/PhaseLoopStep.d.ts.map +1 -1
  24. package/dist/orchestrator/strategies/AiPhaseStrategy.d.ts +17 -0
  25. package/dist/orchestrator/strategies/AiPhaseStrategy.d.ts.map +1 -0
  26. package/dist/orchestrator/strategies/GateStrategy.d.ts +15 -0
  27. package/dist/orchestrator/strategies/GateStrategy.d.ts.map +1 -0
  28. package/dist/orchestrator/strategies/PhaseStrategy.d.ts +16 -0
  29. package/dist/orchestrator/strategies/PhaseStrategy.d.ts.map +1 -0
  30. package/dist/orchestrator/strategies/VerifyFixStrategy.d.ts +15 -0
  31. package/dist/orchestrator/strategies/VerifyFixStrategy.d.ts.map +1 -0
  32. package/dist/orchestrator/strategies/index.d.ts +17 -0
  33. package/dist/orchestrator/strategies/index.d.ts.map +1 -0
  34. package/dist/{restart-MSUWF4ID.js → restart-5D3ZDD5L.js} +2 -2
  35. package/dist/run.js +2 -2
  36. package/dist/{start-B4CDZAFG.js → start-IQBNXLEI.js} +2 -2
  37. package/package.json +1 -1
  38. package/src/web/frontend/dist/assets/{index-BoYtsxGN.js → index-BR0UoQER.js} +19 -19
  39. package/src/web/frontend/dist/index.html +1 -1
  40. /package/dist/{chunk-CQ66LL7P.js.map → chunk-2WDVTLVF.js.map} +0 -0
  41. /package/dist/{chunk-UMQYEYLO.js.map → chunk-6T7ZHAV2.js.map} +0 -0
  42. /package/dist/{restart-MSUWF4ID.js.map → restart-5D3ZDD5L.js.map} +0 -0
  43. /package/dist/{start-B4CDZAFG.js.map → start-IQBNXLEI.js.map} +0 -0
package/dist/cli.js CHANGED
@@ -93,7 +93,7 @@ program.command("init").description("Launch the interactive web setup wizard").o
93
93
  await initCommand({ port: parseInt(opts.port, 10), config: opts.config });
94
94
  });
95
95
  program.command("start").description("Start the issue-auto-finish daemon service").option("-c, --config <path>", "Path to .env config file").option("-d, --daemon", "Run as a background daemon").action(async (opts) => {
96
- const { startCommand } = await import("./start-B4CDZAFG.js");
96
+ const { startCommand } = await import("./start-IQBNXLEI.js");
97
97
  await startCommand({ config: opts.config, daemon: opts.daemon });
98
98
  });
99
99
  program.command("stop").description("Stop the running service").option("-p, --port <port>", "Web UI port", defaults.port).option("-H, --host <host>", "Service host", defaults.host).option("-f, --force", "Force kill via SIGKILL").action(async (opts) => {
@@ -105,7 +105,7 @@ program.command("stop").description("Stop the running service").option("-p, --po
105
105
  });
106
106
  });
107
107
  program.command("restart").description("Restart the service (stop + start)").option("-c, --config <path>", "Path to .env config file").option("-p, --port <port>", "Web UI port", defaults.port).option("-H, --host <host>", "Service host", defaults.host).option("-d, --daemon", "Restart as a background daemon").action(async (opts) => {
108
- const { restartCommand } = await import("./restart-MSUWF4ID.js");
108
+ const { restartCommand } = await import("./restart-5D3ZDD5L.js");
109
109
  await restartCommand({
110
110
  config: opts.config,
111
111
  host: opts.host,
package/dist/index.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  main
3
- } from "./chunk-UMQYEYLO.js";
3
+ } from "./chunk-6T7ZHAV2.js";
4
4
  import "./chunk-5M5SB6ZA.js";
5
5
  import "./chunk-ENF24C44.js";
6
6
  import "./chunk-Z3OBKODV.js";
7
7
  import "./chunk-EU4XFZ2T.js";
8
8
  import "./chunk-KC5S66OZ.js";
9
9
  import "./chunk-SEO57UYI.js";
10
- import "./chunk-LDGK5NMS.js";
10
+ import "./chunk-WZGEYHCC.js";
11
11
  import "./chunk-GPZX4DSY.js";
12
12
  import "./chunk-MSL7ROVK.js";
13
13
  import "./chunk-4XMYOXGZ.js";
package/dist/lib.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  registerPhase,
14
14
  registerPipeline,
15
15
  resolvePipelineMode
16
- } from "./chunk-LDGK5NMS.js";
16
+ } from "./chunk-WZGEYHCC.js";
17
17
  import {
18
18
  AsyncMutex,
19
19
  GitOperations,
@@ -0,0 +1,21 @@
1
+ import type { StreamEvent } from '../ai-runner/AIRunner.js';
2
+ import type { PhaseOutcome } from '../phases/PhaseOutcome.js';
3
+ import type { PhaseLifecycleHook, PhaseExecutionContext } from './PhaseLifecycleHook.js';
4
+ import type { PhaseFeedback, FeedbackResponse, PhaseError, ErrorDecision } from './FeedbackTypes.js';
5
+ export declare class DefaultLifecycleHook implements PhaseLifecycleHook {
6
+ beforePhase(ctx: PhaseExecutionContext): Promise<void>;
7
+ onStream(ctx: PhaseExecutionContext, event: StreamEvent): void;
8
+ beforeExecute?: undefined;
9
+ afterExecute?: undefined;
10
+ onFeedback(ctx: PhaseExecutionContext, feedback: PhaseFeedback): Promise<FeedbackResponse>;
11
+ afterPhase(ctx: PhaseExecutionContext, outcome: PhaseOutcome): Promise<void>;
12
+ onError(ctx: PhaseExecutionContext, error: PhaseError): Promise<ErrorDecision>;
13
+ }
14
+ /**
15
+ * 从 PhaseLifecycleHook 创建 PhaseCallbacks(供 BasePhase.run() 使用)。
16
+ *
17
+ * 将标准化的 hook 接口适配为 BasePhase 期望的旧式回调,
18
+ * 实现了 PhaseFeedback/FeedbackResponse ↔ InputRequest/string 的双向转换。
19
+ */
20
+ export declare function createCallbacksFromHook(hook: PhaseLifecycleHook, ctx: PhaseExecutionContext): import('../phases/PhaseOutcome.js').PhaseCallbacks;
21
+ //# sourceMappingURL=DefaultLifecycleHook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultLifecycleHook.d.ts","sourceRoot":"","sources":["../../src/lifecycle/DefaultLifecycleHook.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAgBrG,qBAAa,oBAAqB,YAAW,kBAAkB;IACvD,WAAW,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB5D,QAAQ,CAAC,GAAG,EAAE,qBAAqB,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI;IAS9D,aAAa,CAAC,EAAE,SAAS,CAAC;IAE1B,YAAY,CAAC,EAAE,SAAS,CAAC;IAEnB,UAAU,CAAC,GAAG,EAAE,qBAAqB,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwB1F,UAAU,CAAC,GAAG,EAAE,qBAAqB,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB5E,OAAO,CAAC,GAAG,EAAE,qBAAqB,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;CAmBrF;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,kBAAkB,EACxB,GAAG,EAAE,qBAAqB,GACzB,OAAO,2BAA2B,EAAE,cAAc,CAapD"}
@@ -0,0 +1,52 @@
1
+ import type { DialogOption, InputRequest } from '../ai-runner/AIRunner.js';
2
+ export type PhaseFeedback = InteractiveDialogFeedback | ApprovalRequiredFeedback | PermissionRequestFeedback | GenericFeedback;
3
+ export interface InteractiveDialogFeedback {
4
+ kind: 'interactive-dialog';
5
+ question: string;
6
+ options: DialogOption[];
7
+ }
8
+ export interface ApprovalRequiredFeedback {
9
+ kind: 'approval-required';
10
+ scope: 'plan' | 'release' | 'uat';
11
+ }
12
+ export interface PermissionRequestFeedback {
13
+ kind: 'permission-request';
14
+ tool: string;
15
+ detail: unknown;
16
+ }
17
+ export interface GenericFeedback {
18
+ kind: 'generic';
19
+ content: string;
20
+ }
21
+ export type FeedbackResponse = {
22
+ action: 'approve';
23
+ } | {
24
+ action: 'reject';
25
+ reason?: string;
26
+ } | {
27
+ action: 'select';
28
+ value: string;
29
+ } | {
30
+ action: 'dismiss';
31
+ } | {
32
+ action: 'pause';
33
+ };
34
+ export type ErrorDecision = {
35
+ action: 'fail';
36
+ softFail: boolean;
37
+ } | {
38
+ action: 'retry';
39
+ } | {
40
+ action: 'skip';
41
+ };
42
+ export interface PhaseError {
43
+ message: string;
44
+ isRetryable: boolean;
45
+ rawOutput: string;
46
+ wasActiveAtTimeout: boolean;
47
+ }
48
+ export declare function inputRequestToFeedback(request: InputRequest): PhaseFeedback;
49
+ export declare function feedbackToInputRequest(feedback: PhaseFeedback): InputRequest;
50
+ export declare function feedbackResponseToString(response: FeedbackResponse): string;
51
+ export declare function stringToFeedbackResponse(str: string, originalFeedback: PhaseFeedback): FeedbackResponse;
52
+ //# sourceMappingURL=FeedbackTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FeedbackTypes.d.ts","sourceRoot":"","sources":["../../src/lifecycle/FeedbackTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAI3E,MAAM,MAAM,aAAa,GACrB,yBAAyB,GACzB,wBAAwB,GACxB,yBAAyB,GACzB,eAAe,CAAC;AAEpB,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC;CACnC;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,MAAM,MAAM,gBAAgB,GACxB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAIxB,MAAM,MAAM,aAAa,GACrB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GACnB;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAIvB,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAID,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa,CAa3E;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,aAAa,GAAG,YAAY,CAW5E;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAQ3E;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,aAAa,GAAG,gBAAgB,CASvG"}
@@ -0,0 +1,70 @@
1
+ import type { PhaseSpec } from '../pipeline/PipelineDefinition.js';
2
+ import type { GitOperations } from '../git/GitOperations.js';
3
+ import type { PlanPersistence } from '../persistence/PlanPersistence.js';
4
+ import type { StreamEvent } from '../ai-runner/AIRunner.js';
5
+ import type { BasePhase } from '../phases/BasePhase.js';
6
+ import type { PhaseOutcome } from '../phases/PhaseOutcome.js';
7
+ import type { IssueProcessingContext, OrchestratorDeps } from '../orchestrator/IssueProcessingContext.js';
8
+ import type { PhaseFeedback, FeedbackResponse, PhaseError, ErrorDecision } from './FeedbackTypes.js';
9
+ /**
10
+ * 阶段执行上下文 — 在 hook 方法之间共享的完整上下文。
11
+ *
12
+ * 由编排器在执行阶段前构造,包含当前阶段所需的所有依赖和状态。
13
+ */
14
+ export interface PhaseExecutionContext {
15
+ /** 当前阶段规格 */
16
+ spec: PhaseSpec;
17
+ /** Issue 处理上下文(贯穿整个 pipeline) */
18
+ issueCtx: IssueProcessingContext;
19
+ /** 编排器依赖包 */
20
+ deps: OrchestratorDeps;
21
+ /** Worktree Git 操作 */
22
+ wtGit: GitOperations;
23
+ /** 计划文件持久化 */
24
+ wtPlan: PlanPersistence;
25
+ /** 多仓库 Git 操作映射(repo name → GitOperations) */
26
+ wtGitMap?: Map<string, GitOperations>;
27
+ /** 阶段实例(由策略或调用方创建后注入) */
28
+ phase?: BasePhase;
29
+ /** 便捷字段:issue.iid */
30
+ displayId: number;
31
+ }
32
+ /**
33
+ * 阶段生命周期 Hook — 标准化每个阶段的处理流程。
34
+ *
35
+ * 每个阶段的执行遵循统一生命周期:
36
+ *
37
+ * ```
38
+ * beforePhase → [beforeExecute] → Execute → [onStream/onFeedback]* → [afterExecute] → afterPhase
39
+ * ↘ onError
40
+ * ```
41
+ *
42
+ * 实现此接口即可注入自定义的前置/后置/反馈处理逻辑,
43
+ * 而无需修改阶段或编排器的核心代码。
44
+ */
45
+ export interface PhaseLifecycleHook {
46
+ /** 阶段开始前 — 更新状态、注入 hooks、准备上下文 */
47
+ beforePhase(ctx: PhaseExecutionContext): Promise<void>;
48
+ /** AI 开始执行前 — 最后一次修改 prompt/options 的机会 */
49
+ beforeExecute?(ctx: PhaseExecutionContext): Promise<void>;
50
+ /** 收到中间反馈(agent 提问、权限请求等) — 返回决策 */
51
+ onFeedback?(ctx: PhaseExecutionContext, feedback: PhaseFeedback): Promise<FeedbackResponse>;
52
+ /** 收到流式输出 — 转发到 SSE/日志等 */
53
+ onStream?(ctx: PhaseExecutionContext, event: StreamEvent): void;
54
+ /** AI 执行完成后,结果待校验前 — 可注入自定义验证逻辑 */
55
+ afterExecute?(ctx: PhaseExecutionContext, outcome: PhaseOutcome): Promise<PhaseOutcome>;
56
+ /** 阶段成功完成 — 提交产物、发评论、推送事件 */
57
+ afterPhase(ctx: PhaseExecutionContext, outcome: PhaseOutcome): Promise<void>;
58
+ /** 阶段失败 — 标记状态、决定重试策略 */
59
+ onError(ctx: PhaseExecutionContext, error: PhaseError): Promise<ErrorDecision>;
60
+ }
61
+ /**
62
+ * 策略执行结果 — 策略返回此类型以指示流水线是否应暂停。
63
+ */
64
+ export interface PhaseStepResult {
65
+ /** 流水线应暂停(gate 等待、异步阶段等) */
66
+ paused: boolean;
67
+ /** 预览服务器是否在此阶段启动 */
68
+ serversStarted?: boolean;
69
+ }
70
+ //# sourceMappingURL=PhaseLifecycleHook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhaseLifecycleHook.d.ts","sourceRoot":"","sources":["../../src/lifecycle/PhaseLifecycleHook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAC1G,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAErG;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,aAAa;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,iCAAiC;IACjC,QAAQ,EAAE,sBAAsB,CAAC;IACjC,aAAa;IACb,IAAI,EAAE,gBAAgB,CAAC;IACvB,sBAAsB;IACtB,KAAK,EAAE,aAAa,CAAC;IACrB,cAAc;IACd,MAAM,EAAE,eAAe,CAAC;IACxB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtC,yBAAyB;IACzB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,kBAAkB;IACjC,kCAAkC;IAClC,WAAW,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvD,2CAA2C;IAC3C,aAAa,CAAC,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1D,oCAAoC;IACpC,UAAU,CAAC,CAAC,GAAG,EAAE,qBAAqB,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAE5F,2BAA2B;IAC3B,QAAQ,CAAC,CAAC,GAAG,EAAE,qBAAqB,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAEhE,mCAAmC;IACnC,YAAY,CAAC,CAAC,GAAG,EAAE,qBAAqB,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAExF,6BAA6B;IAC7B,UAAU,CAAC,GAAG,EAAE,qBAAqB,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7E,yBAAyB;IACzB,OAAO,CAAC,GAAG,EAAE,qBAAqB,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAChF;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,4BAA4B;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,oBAAoB;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * 阶段 Middleware 链 — 类似 Koa/Express middleware 的洋葱模型。
3
+ *
4
+ * 每个 middleware 可以在执行前后注入逻辑(日志、metrics、审计等),
5
+ * 核心 AI 执行始终在最内层。middleware 可自由组合和排序。
6
+ *
7
+ * ```
8
+ * statusTracking → hookInjection → metrics → [core execution] → metrics → hookInjection → statusTracking
9
+ * ```
10
+ */
11
+ import type { PhaseOutcome } from '../phases/PhaseOutcome.js';
12
+ import type { PhaseExecutionContext } from './PhaseLifecycleHook.js';
13
+ /**
14
+ * 阶段 middleware 函数签名。
15
+ *
16
+ * @param ctx - 阶段执行上下文
17
+ * @param next - 调用下一个 middleware(最终到达核心执行逻辑)
18
+ * @returns 阶段执行结果
19
+ */
20
+ export type PhaseMiddleware = (ctx: PhaseExecutionContext, next: () => Promise<PhaseOutcome>) => Promise<PhaseOutcome>;
21
+ /**
22
+ * 组合多个 middleware 为单一可执行函数(从外到内依次包裹)。
23
+ *
24
+ * 执行顺序:middleware[0] 最先进入、最后退出(洋葱模型)。
25
+ *
26
+ * ```typescript
27
+ * const pipeline = composeMiddleware([loggingMw, metricsMw, coreMw]);
28
+ * const result = await pipeline(ctx, () => phase.run(ctx));
29
+ * ```
30
+ */
31
+ export declare function composeMiddleware(middlewares: PhaseMiddleware[]): PhaseMiddleware;
32
+ /**
33
+ * 日志 middleware — 记录阶段开始/完成/失败和耗时。
34
+ */
35
+ export declare function loggingMiddleware(logFn: (message: string, meta?: Record<string, unknown>) => void): PhaseMiddleware;
36
+ /**
37
+ * Metrics middleware — 记录阶段执行次数和耗时直方图。
38
+ */
39
+ export declare function metricsMiddleware(collector: {
40
+ incrementCounter(name: string, labels?: Record<string, string>): void;
41
+ observeHistogram(name: string, value: number, labels?: Record<string, string>): void;
42
+ }): PhaseMiddleware;
43
+ /**
44
+ * 超时 middleware — 为阶段执行增加额外的超时保护。
45
+ */
46
+ export declare function timeoutMiddleware(timeoutMs: number): PhaseMiddleware;
47
+ //# sourceMappingURL=PhaseMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhaseMiddleware.d.ts","sourceRoot":"","sources":["../../src/lifecycle/PhaseMiddleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAErE;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,CAC5B,GAAG,EAAE,qBAAqB,EAC1B,IAAI,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,KAC9B,OAAO,CAAC,YAAY,CAAC,CAAC;AAE3B;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,eAAe,EAAE,GAAG,eAAe,CAqBjF;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAC/D,eAAe,CAwBjB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE;IACT,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACtE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CACtF,GACA,eAAe,CAoBjB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,CAmBpE"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * 轻量级阶段状态机 — 显式定义阶段内的状态流转和 guard 条件。
3
+ *
4
+ * 不依赖外部库(如 XState),而是通过简单的状态表 + transition 函数
5
+ * 实现可预测、可序列化、可测试的状态管理。
6
+ *
7
+ * 状态机管理的是**单个阶段内**的状态流转,而非全局 Issue 状态
8
+ * (全局状态由 ActionLifecycleManager + IssueTracker 管理)。
9
+ */
10
+ export type PhaseInternalState = 'idle' | 'hooks_injected' | 'context_ready' | 'executing' | 'awaiting_feedback' | 'feedback_received' | 'validating' | 'completed' | 'failed' | 'skipped' | 'paused';
11
+ export type PhaseEvent = {
12
+ type: 'INJECT_HOOKS';
13
+ } | {
14
+ type: 'CONTEXT_READY';
15
+ } | {
16
+ type: 'START_EXECUTE';
17
+ } | {
18
+ type: 'FEEDBACK_REQUIRED';
19
+ question: string;
20
+ } | {
21
+ type: 'FEEDBACK_RECEIVED';
22
+ response: string;
23
+ } | {
24
+ type: 'EXECUTE_DONE';
25
+ success: boolean;
26
+ } | {
27
+ type: 'VALIDATION_PASSED';
28
+ } | {
29
+ type: 'VALIDATION_FAILED';
30
+ reason: string;
31
+ } | {
32
+ type: 'COMPLETE';
33
+ } | {
34
+ type: 'FAIL';
35
+ reason: string;
36
+ } | {
37
+ type: 'SKIP';
38
+ } | {
39
+ type: 'PAUSE';
40
+ } | {
41
+ type: 'RESUME';
42
+ };
43
+ export interface TransitionGuard {
44
+ (ctx: StateMachineContext, event: PhaseEvent): boolean;
45
+ }
46
+ export interface StateMachineContext {
47
+ phaseName: string;
48
+ issueIid: number;
49
+ retryCount: number;
50
+ maxRetries: number;
51
+ lastError?: string;
52
+ feedbackHistory: Array<{
53
+ question: string;
54
+ response: string;
55
+ timestamp: string;
56
+ }>;
57
+ startedAt?: string;
58
+ completedAt?: string;
59
+ }
60
+ export interface TransitionDef {
61
+ from: PhaseInternalState;
62
+ event: PhaseEvent['type'];
63
+ to: PhaseInternalState;
64
+ guard?: TransitionGuard;
65
+ action?: (ctx: StateMachineContext, event: PhaseEvent) => void;
66
+ }
67
+ export interface PhaseStateMachineSnapshot {
68
+ state: PhaseInternalState;
69
+ context: StateMachineContext;
70
+ }
71
+ export declare class PhaseStateMachine {
72
+ private _state;
73
+ private _context;
74
+ private readonly transitions;
75
+ private readonly listeners;
76
+ constructor(phaseName: string, issueIid: number, opts?: {
77
+ maxRetries?: number;
78
+ initialState?: PhaseInternalState;
79
+ transitions?: TransitionDef[];
80
+ });
81
+ get state(): PhaseInternalState;
82
+ get context(): Readonly<StateMachineContext>;
83
+ /** 发送事件触发状态转换。返回新状态,如果无匹配 transition 则抛异常。 */
84
+ send(event: PhaseEvent): PhaseInternalState;
85
+ /** 尝试发送事件,如果无匹配 transition 则返回 false 而非抛异常。 */
86
+ trySend(event: PhaseEvent): boolean;
87
+ /** 检查当前状态下是否可以处理某事件。 */
88
+ canSend(eventType: PhaseEvent['type']): boolean;
89
+ /** 获取当前状态下所有可用的事件类型。 */
90
+ availableEvents(): PhaseEvent['type'][];
91
+ /** 是否处于终态。 */
92
+ get isTerminal(): boolean;
93
+ /** 是否处于失败态(可能可重试)。 */
94
+ get isFailed(): boolean;
95
+ /** 是否可重试。 */
96
+ get canRetry(): boolean;
97
+ /** 订阅状态变化。返回取消订阅函数。 */
98
+ subscribe(listener: (snapshot: PhaseStateMachineSnapshot) => void): () => void;
99
+ /** 快照(可序列化 / 可用于断点恢复)。 */
100
+ snapshot(): PhaseStateMachineSnapshot;
101
+ /** 从快照恢复。 */
102
+ static fromSnapshot(snap: PhaseStateMachineSnapshot, transitions?: TransitionDef[]): PhaseStateMachine;
103
+ private notify;
104
+ }
105
+ export declare class InvalidTransitionError extends Error {
106
+ readonly currentState: PhaseInternalState;
107
+ readonly eventType: string;
108
+ readonly phaseName: string;
109
+ constructor(currentState: PhaseInternalState, eventType: string, phaseName: string);
110
+ }
111
+ //# sourceMappingURL=PhaseStateMachine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhaseStateMachine.d.ts","sourceRoot":"","sources":["../../src/lifecycle/PhaseStateMachine.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,11 @@
1
1
  export type { ActionStatus, Action, ActionState, StateCategory } from './ActionLifecycle.js';
2
2
  export { ActionLifecycleManager } from './ActionLifecycleManager.js';
3
+ export type { PhaseFeedback, InteractiveDialogFeedback, ApprovalRequiredFeedback, PermissionRequestFeedback, GenericFeedback, FeedbackResponse, ErrorDecision, PhaseError, } from './FeedbackTypes.js';
4
+ export { inputRequestToFeedback, feedbackToInputRequest, feedbackResponseToString, stringToFeedbackResponse, } from './FeedbackTypes.js';
5
+ export type { PhaseExecutionContext, PhaseLifecycleHook, PhaseStepResult, } from './PhaseLifecycleHook.js';
6
+ export { DefaultLifecycleHook, createCallbacksFromHook } from './DefaultLifecycleHook.js';
7
+ export type { PhaseMiddleware } from './PhaseMiddleware.js';
8
+ export { composeMiddleware, loggingMiddleware, metricsMiddleware, timeoutMiddleware, } from './PhaseMiddleware.js';
9
+ export type { PhaseInternalState, PhaseEvent, TransitionGuard, StateMachineContext, TransitionDef, PhaseStateMachineSnapshot, } from './PhaseStateMachine.js';
10
+ export { PhaseStateMachine, InvalidTransitionError } from './PhaseStateMachine.js';
3
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lifecycle/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lifecycle/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,YAAY,EACV,aAAa,EACb,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,UAAU,GACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EACV,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,GAChB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAE1F,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 从 PhaseLoopStep 提取的编排级辅助函数。
3
+ *
4
+ * 供 PhaseLoopStep、DefaultLifecycleHook、各 PhaseStrategy 共用,
5
+ * 避免循环依赖。
6
+ */
7
+ import type { GitOperations } from '../../git/GitOperations.js';
8
+ import type { PlanPersistence } from '../../persistence/PlanPersistence.js';
9
+ import type { AIRunner, InputRequest } from '../../ai-runner/index.js';
10
+ import type { BasePhase, PhaseContext } from '../../phases/BasePhase.js';
11
+ import type { PhaseSpec, PipelineDef } from '../../pipeline/PipelineDefinition.js';
12
+ import type { IssueProcessingContext, OrchestratorDeps } from '../IssueProcessingContext.js';
13
+ export declare function safeComment(deps: OrchestratorDeps, issueId: number, message: string): Promise<void>;
14
+ export declare function resolveVerifyRunner(deps: OrchestratorDeps): AIRunner;
15
+ export declare function resolveUatRunner(deps: OrchestratorDeps, issueIid: number): AIRunner;
16
+ export declare function commitPlanFiles(ctx: PhaseContext, wtGit: GitOperations, wtGitMap: Map<string, GitOperations> | undefined, phaseName: string, displayId: number): Promise<void>;
17
+ export declare function syncResultToIssue(phase: BasePhase, ctx: PhaseContext, displayId: number, phaseName: string, deps: OrchestratorDeps, issueId: number, wtPlan: PlanPersistence): Promise<void>;
18
+ export declare function handlePlanApproval(displayId: number, phaseName: string, deps: OrchestratorDeps): Promise<string>;
19
+ export declare function handleInteractiveDialog(displayId: number, phaseName: string, deps: OrchestratorDeps, request: InputRequest): Promise<string>;
20
+ export declare function updateHooksForPhase(spec: PhaseSpec, pipelineDef: PipelineDef, ctx: IssueProcessingContext, wtPlan: PlanPersistence): void;
21
+ export declare function findPreviousAiPhaseIndex(phases: readonly {
22
+ kind: string;
23
+ }[], currentIdx: number): number;
24
+ //# sourceMappingURL=PhaseHelpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhaseHelpers.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/steps/PhaseHelpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAc7F,wBAAsB,WAAW,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzG;AAID,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,QAAQ,CAEpE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAKnF;AAID,wBAAsB,eAAe,CACnC,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,SAAS,EAChD,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAkCf;AAID,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAID,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,MAAM,CAAC,CA4BjB;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,MAAM,CAAC,CAoDjB;AAID,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,sBAAsB,EAC3B,MAAM,EAAE,eAAe,GACtB,IAAI,CAyBN;AAID,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EACnC,UAAU,EAAE,MAAM,GACjB,MAAM,CAKR"}
@@ -1,6 +1,16 @@
1
1
  import type { GitOperations } from '../../git/GitOperations.js';
2
2
  import type { PlanPersistence } from '../../persistence/PlanPersistence.js';
3
+ import type { BasePhase } from '../../phases/BasePhase.js';
4
+ import type { PhaseOutcome } from '../../phases/PhaseOutcome.js';
5
+ import type { PhaseSpec } from '../../pipeline/PipelineDefinition.js';
3
6
  import type { IssueProcessingContext, OrchestratorDeps, PhaseLoopResult } from '../IssueProcessingContext.js';
7
+ import type { PhaseLifecycleHook } from '../../lifecycle/PhaseLifecycleHook.js';
8
+ /**
9
+ * 统一的阶段执行包装器 — 通过 PhaseLifecycleHook 驱动完整生命周期。
10
+ *
11
+ * beforePhase → Execute (phase.run with callbacks) → afterPhase / onError
12
+ */
13
+ export declare function runPhaseWithLifecycle(phase: BasePhase, phaseCtx: import('../../phases/BasePhase.js').PhaseContext, spec: PhaseSpec, ctx: IssueProcessingContext, deps: OrchestratorDeps, wtGit: GitOperations, wtPlan: PlanPersistence, wtGitMap?: Map<string, GitOperations>, hook?: PhaseLifecycleHook): Promise<PhaseOutcome>;
4
14
  /**
5
15
  * 执行流水线阶段循环:
6
16
  * - 确定恢复阶段索引
@@ -1 +1 @@
1
- {"version":3,"file":"PhaseLoopStep.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/steps/PhaseLoopStep.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAgB5E,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AA4W9G;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,sBAAsB,EAC3B,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,eAAe,EACvB,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GACpC,OAAO,CAAC,eAAe,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CA2NhD"}
1
+ {"version":3,"file":"PhaseLoopStep.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/steps/PhaseLoopStep.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAGtE,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC9G,OAAO,KAAK,EAAE,kBAAkB,EAAyB,MAAM,uCAAuC,CAAC;AASvG;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,OAAO,2BAA2B,EAAE,YAAY,EAC1D,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,sBAAsB,EAC3B,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,eAAe,EACvB,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EACrC,IAAI,CAAC,EAAE,kBAAkB,GACxB,OAAO,CAAC,YAAY,CAAC,CA6DvB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,sBAAsB,EAC3B,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,eAAe,EACvB,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GACpC,OAAO,CAAC,eAAe,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CA6GhD"}
@@ -0,0 +1,17 @@
1
+ import type { PhaseExecutionContext, PhaseLifecycleHook, PhaseStepResult } from '../../lifecycle/PhaseLifecycleHook.js';
2
+ import type { PhaseStrategy } from './PhaseStrategy.js';
3
+ /**
4
+ * 标准 AI 阶段策略 — 处理所有 kind='ai' 的阶段。
5
+ *
6
+ * 覆盖:plan、build、uat(非 verify-fix 循环的 verify 也走这里)。
7
+ * 处理异步阶段(awaitCompletion)、gate 请求(hasReleaseCapability)。
8
+ */
9
+ export declare class AiPhaseStrategy implements PhaseStrategy {
10
+ readonly name = "ai";
11
+ shouldSkip(ctx: PhaseExecutionContext): boolean;
12
+ execute(ctx: PhaseExecutionContext, hooks: PhaseLifecycleHook): Promise<PhaseStepResult>;
13
+ private resolveRunner;
14
+ private handleAsyncOutcome;
15
+ private handleGateRequest;
16
+ }
17
+ //# sourceMappingURL=AiPhaseStrategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AiPhaseStrategy.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/strategies/AiPhaseStrategy.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAexD;;;;;GAKG;AACH,qBAAa,eAAgB,YAAW,aAAa;IACnD,QAAQ,CAAC,IAAI,QAAQ;IAErB,UAAU,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO;IASzC,OAAO,CAAC,GAAG,EAAE,qBAAqB,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC;IA4C9F,OAAO,CAAC,aAAa;YAOP,kBAAkB;IAiEhC,OAAO,CAAC,iBAAiB;CAY1B"}
@@ -0,0 +1,15 @@
1
+ import type { PhaseExecutionContext, PhaseLifecycleHook, PhaseStepResult } from '../../lifecycle/PhaseLifecycleHook.js';
2
+ import type { PhaseStrategy } from './PhaseStrategy.js';
3
+ /**
4
+ * Gate 阶段策略 — 处理审核门禁(如 review 阶段)。
5
+ *
6
+ * 两种路径:
7
+ * 1. 标签匹配自动批准 → 标记完成并继续
8
+ * 2. 暂停等待人工审核 → 发事件后返回 paused=true
9
+ */
10
+ export declare class GateStrategy implements PhaseStrategy {
11
+ readonly name = "gate";
12
+ shouldSkip(): boolean;
13
+ execute(ctx: PhaseExecutionContext, _hooks: PhaseLifecycleHook): Promise<PhaseStepResult>;
14
+ }
15
+ //# sourceMappingURL=GateStrategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GateStrategy.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/strategies/GateStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMxD;;;;;;GAMG;AACH,qBAAa,YAAa,YAAW,aAAa;IAChD,QAAQ,CAAC,IAAI,UAAU;IAEvB,UAAU,IAAI,OAAO;IAIf,OAAO,CAAC,GAAG,EAAE,qBAAqB,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC;CAoChG"}
@@ -0,0 +1,16 @@
1
+ import type { PhaseExecutionContext, PhaseLifecycleHook, PhaseStepResult } from '../../lifecycle/PhaseLifecycleHook.js';
2
+ /**
3
+ * 阶段执行策略 — 将 executePhaseLoop 中的 if-else 分支抽象为独立策略。
4
+ *
5
+ * 每种阶段类型(gate、标准 AI、verify-fix 循环等)实现自己的策略,
6
+ * 编排器只需遍历阶段并调度对应策略,不再关心具体分支逻辑。
7
+ */
8
+ export interface PhaseStrategy {
9
+ /** 策略名称(用于日志和调试) */
10
+ readonly name: string;
11
+ /** 是否应跳过此阶段(如 UAT 未启用时) */
12
+ shouldSkip(ctx: PhaseExecutionContext): boolean;
13
+ /** 执行阶段(含 gate 等待、verify-fix 循环等特殊逻辑) */
14
+ execute(ctx: PhaseExecutionContext, hooks: PhaseLifecycleHook): Promise<PhaseStepResult>;
15
+ }
16
+ //# sourceMappingURL=PhaseStrategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhaseStrategy.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/strategies/PhaseStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAExH;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,oBAAoB;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,2BAA2B;IAC3B,UAAU,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC;IAEhD,yCAAyC;IACzC,OAAO,CAAC,GAAG,EAAE,qBAAqB,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC1F"}
@@ -0,0 +1,15 @@
1
+ import type { PhaseExecutionContext, PhaseLifecycleHook, PhaseStepResult } from '../../lifecycle/PhaseLifecycleHook.js';
2
+ import type { PhaseStrategy } from './PhaseStrategy.js';
3
+ /**
4
+ * Verify-Fix 循环策略。
5
+ *
6
+ * 多次迭代 verify → build fix → verify,直到验证通过或达到最大迭代次数。
7
+ */
8
+ export declare class VerifyFixStrategy implements PhaseStrategy {
9
+ readonly name = "verify-fix";
10
+ shouldSkip(): boolean;
11
+ execute(ctx: PhaseExecutionContext, hooks: PhaseLifecycleHook): Promise<PhaseStepResult>;
12
+ private executeBuildFix;
13
+ private findPreviousAiPhaseIndex;
14
+ }
15
+ //# sourceMappingURL=VerifyFixStrategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VerifyFixStrategy.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/strategies/VerifyFixStrategy.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAQxD;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACrD,QAAQ,CAAC,IAAI,gBAAgB;IAE7B,UAAU,IAAI,OAAO;IAIf,OAAO,CAAC,GAAG,EAAE,qBAAqB,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC;YA0GhF,eAAe;IAkC7B,OAAO,CAAC,wBAAwB;CASjC"}
@@ -0,0 +1,17 @@
1
+ import type { PhaseSpec } from '../../pipeline/PipelineDefinition.js';
2
+ import type { Config } from '../../config.js';
3
+ import type { PhaseStrategy } from './PhaseStrategy.js';
4
+ export type { PhaseStrategy } from './PhaseStrategy.js';
5
+ export { GateStrategy } from './GateStrategy.js';
6
+ export { AiPhaseStrategy } from './AiPhaseStrategy.js';
7
+ export { VerifyFixStrategy } from './VerifyFixStrategy.js';
8
+ /**
9
+ * 根据阶段规格和配置解析对应的执行策略。
10
+ *
11
+ * 解析优先级:
12
+ * 1. kind='gate' → GateStrategy
13
+ * 2. name='verify' + verifyFixLoop.enabled → VerifyFixStrategy
14
+ * 3. 其它 kind='ai' → AiPhaseStrategy(含 uat/release 等特殊处理)
15
+ */
16
+ export declare function resolveStrategy(spec: PhaseSpec, config: Config): PhaseStrategy;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/strategies/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKxD,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAQ3D;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAU9E"}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-WIEUIU6L.js";
4
4
  import {
5
5
  startCommand
6
- } from "./chunk-CQ66LL7P.js";
6
+ } from "./chunk-2WDVTLVF.js";
7
7
  import {
8
8
  dim,
9
9
  yellow
@@ -45,4 +45,4 @@ async function restartCommand(options) {
45
45
  export {
46
46
  restartCommand
47
47
  };
48
- //# sourceMappingURL=restart-MSUWF4ID.js.map
48
+ //# sourceMappingURL=restart-5D3ZDD5L.js.map
package/dist/run.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  main
3
- } from "./chunk-UMQYEYLO.js";
3
+ } from "./chunk-6T7ZHAV2.js";
4
4
  import "./chunk-5M5SB6ZA.js";
5
5
  import "./chunk-ENF24C44.js";
6
6
  import "./chunk-Z3OBKODV.js";
7
7
  import "./chunk-EU4XFZ2T.js";
8
8
  import "./chunk-KC5S66OZ.js";
9
9
  import "./chunk-SEO57UYI.js";
10
- import "./chunk-LDGK5NMS.js";
10
+ import "./chunk-WZGEYHCC.js";
11
11
  import "./chunk-GPZX4DSY.js";
12
12
  import "./chunk-MSL7ROVK.js";
13
13
  import "./chunk-4XMYOXGZ.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  startCommand
3
- } from "./chunk-CQ66LL7P.js";
3
+ } from "./chunk-2WDVTLVF.js";
4
4
  import "./chunk-B7XUZJOK.js";
5
5
  import "./chunk-SEO57UYI.js";
6
6
  import "./chunk-FJTZKAJA.js";
@@ -13,4 +13,4 @@ import "./chunk-GF2RRYHB.js";
13
13
  export {
14
14
  startCommand
15
15
  };
16
- //# sourceMappingURL=start-B4CDZAFG.js.map
16
+ //# sourceMappingURL=start-IQBNXLEI.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xdevops/issue-auto-finish",
3
- "version": "1.0.91",
3
+ "version": "1.0.92",
4
4
  "description": "Issue Auto-Finish: AI-powered issue resolution daemon",
5
5
  "type": "module",
6
6
  "main": "./dist/lib.js",