takt 0.2.3 → 0.3.2

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 (185) hide show
  1. package/README.md +186 -162
  2. package/dist/agents/runner.d.ts +2 -4
  3. package/dist/agents/runner.d.ts.map +1 -1
  4. package/dist/agents/runner.js +6 -35
  5. package/dist/agents/runner.js.map +1 -1
  6. package/dist/claude/client.d.ts +31 -6
  7. package/dist/claude/client.d.ts.map +1 -1
  8. package/dist/claude/client.js +78 -30
  9. package/dist/claude/client.js.map +1 -1
  10. package/dist/claude/executor.d.ts.map +1 -1
  11. package/dist/claude/executor.js +17 -8
  12. package/dist/claude/executor.js.map +1 -1
  13. package/dist/claude/index.d.ts +1 -1
  14. package/dist/claude/index.d.ts.map +1 -1
  15. package/dist/claude/index.js +1 -1
  16. package/dist/claude/index.js.map +1 -1
  17. package/dist/cli.d.ts +5 -5
  18. package/dist/cli.d.ts.map +1 -1
  19. package/dist/cli.js +160 -119
  20. package/dist/cli.js.map +1 -1
  21. package/dist/codex/client.d.ts +0 -1
  22. package/dist/codex/client.d.ts.map +1 -1
  23. package/dist/codex/client.js +3 -6
  24. package/dist/codex/client.js.map +1 -1
  25. package/dist/commands/addTask.d.ts +15 -8
  26. package/dist/commands/addTask.d.ts.map +1 -1
  27. package/dist/commands/addTask.js +63 -26
  28. package/dist/commands/addTask.js.map +1 -1
  29. package/dist/commands/eject.d.ts +13 -0
  30. package/dist/commands/eject.d.ts.map +1 -0
  31. package/dist/commands/eject.js +105 -0
  32. package/dist/commands/eject.js.map +1 -0
  33. package/dist/commands/index.d.ts +2 -2
  34. package/dist/commands/index.d.ts.map +1 -1
  35. package/dist/commands/index.js +2 -2
  36. package/dist/commands/index.js.map +1 -1
  37. package/dist/commands/interactive.d.ts +28 -0
  38. package/dist/commands/interactive.d.ts.map +1 -0
  39. package/dist/commands/interactive.js +186 -0
  40. package/dist/commands/interactive.js.map +1 -0
  41. package/dist/commands/taskExecution.js +2 -2
  42. package/dist/commands/taskExecution.js.map +1 -1
  43. package/dist/commands/workflowExecution.d.ts.map +1 -1
  44. package/dist/commands/workflowExecution.js +85 -18
  45. package/dist/commands/workflowExecution.js.map +1 -1
  46. package/dist/config/agentLoader.d.ts +3 -1
  47. package/dist/config/agentLoader.d.ts.map +1 -1
  48. package/dist/config/agentLoader.js +17 -24
  49. package/dist/config/agentLoader.js.map +1 -1
  50. package/dist/config/globalConfig.d.ts +2 -0
  51. package/dist/config/globalConfig.d.ts.map +1 -1
  52. package/dist/config/globalConfig.js +14 -0
  53. package/dist/config/globalConfig.js.map +1 -1
  54. package/dist/config/initialization.d.ts +7 -5
  55. package/dist/config/initialization.d.ts.map +1 -1
  56. package/dist/config/initialization.js +23 -21
  57. package/dist/config/initialization.js.map +1 -1
  58. package/dist/config/paths.d.ts +5 -0
  59. package/dist/config/paths.d.ts.map +1 -1
  60. package/dist/config/paths.js +9 -0
  61. package/dist/config/paths.js.map +1 -1
  62. package/dist/config/workflowLoader.d.ts +6 -4
  63. package/dist/config/workflowLoader.d.ts.map +1 -1
  64. package/dist/config/workflowLoader.js +190 -35
  65. package/dist/config/workflowLoader.js.map +1 -1
  66. package/dist/github/issue.d.ts +72 -0
  67. package/dist/github/issue.d.ts.map +1 -0
  68. package/dist/github/issue.js +143 -0
  69. package/dist/github/issue.js.map +1 -0
  70. package/dist/models/index.d.ts +1 -1
  71. package/dist/models/index.d.ts.map +1 -1
  72. package/dist/models/index.js.map +1 -1
  73. package/dist/models/schemas.d.ts +164 -90
  74. package/dist/models/schemas.d.ts.map +1 -1
  75. package/dist/models/schemas.js +77 -51
  76. package/dist/models/schemas.js.map +1 -1
  77. package/dist/models/types.d.ts +51 -20
  78. package/dist/models/types.d.ts.map +1 -1
  79. package/dist/prompt/index.d.ts +0 -7
  80. package/dist/prompt/index.d.ts.map +1 -1
  81. package/dist/prompt/index.js +0 -11
  82. package/dist/prompt/index.js.map +1 -1
  83. package/dist/providers/claude.js +2 -2
  84. package/dist/providers/claude.js.map +1 -1
  85. package/dist/providers/codex.d.ts.map +1 -1
  86. package/dist/providers/codex.js +0 -2
  87. package/dist/providers/codex.js.map +1 -1
  88. package/dist/providers/index.d.ts +2 -1
  89. package/dist/providers/index.d.ts.map +1 -1
  90. package/dist/providers/index.js.map +1 -1
  91. package/dist/resources/index.d.ts +3 -22
  92. package/dist/resources/index.d.ts.map +1 -1
  93. package/dist/resources/index.js +3 -73
  94. package/dist/resources/index.js.map +1 -1
  95. package/dist/task/display.js +1 -1
  96. package/dist/task/display.js.map +1 -1
  97. package/dist/utils/session.d.ts +74 -10
  98. package/dist/utils/session.d.ts.map +1 -1
  99. package/dist/utils/session.js +101 -51
  100. package/dist/utils/session.js.map +1 -1
  101. package/dist/workflow/engine.d.ts +34 -1
  102. package/dist/workflow/engine.d.ts.map +1 -1
  103. package/dist/workflow/engine.js +228 -36
  104. package/dist/workflow/engine.js.map +1 -1
  105. package/dist/workflow/index.d.ts +1 -1
  106. package/dist/workflow/index.d.ts.map +1 -1
  107. package/dist/workflow/index.js +1 -1
  108. package/dist/workflow/index.js.map +1 -1
  109. package/dist/workflow/instruction-builder.d.ts +87 -18
  110. package/dist/workflow/instruction-builder.d.ts.map +1 -1
  111. package/dist/workflow/instruction-builder.js +404 -57
  112. package/dist/workflow/instruction-builder.js.map +1 -1
  113. package/dist/workflow/parallel-logger.d.ts +76 -0
  114. package/dist/workflow/parallel-logger.d.ts.map +1 -0
  115. package/dist/workflow/parallel-logger.js +173 -0
  116. package/dist/workflow/parallel-logger.js.map +1 -0
  117. package/dist/workflow/phase-runner.d.ts +40 -0
  118. package/dist/workflow/phase-runner.d.ts.map +1 -0
  119. package/dist/workflow/phase-runner.js +69 -0
  120. package/dist/workflow/phase-runner.js.map +1 -0
  121. package/dist/workflow/rule-evaluator.d.ts +64 -0
  122. package/dist/workflow/rule-evaluator.d.ts.map +1 -0
  123. package/dist/workflow/rule-evaluator.js +178 -0
  124. package/dist/workflow/rule-evaluator.js.map +1 -0
  125. package/dist/workflow/rule-utils.d.ts +13 -0
  126. package/dist/workflow/rule-utils.d.ts.map +1 -0
  127. package/dist/workflow/rule-utils.js +17 -0
  128. package/dist/workflow/rule-utils.js.map +1 -0
  129. package/dist/workflow/transitions.d.ts +5 -13
  130. package/dist/workflow/transitions.d.ts.map +1 -1
  131. package/dist/workflow/transitions.js +8 -78
  132. package/dist/workflow/transitions.js.map +1 -1
  133. package/dist/workflow/types.d.ts +2 -1
  134. package/dist/workflow/types.d.ts.map +1 -1
  135. package/package.json +1 -1
  136. package/resources/global/en/agents/default/ai-antipattern-reviewer.md +84 -15
  137. package/resources/global/en/agents/default/{architect.md → architecture-reviewer.md} +144 -44
  138. package/resources/global/en/agents/default/coder.md +4 -4
  139. package/resources/global/en/agents/default/planner.md +16 -9
  140. package/resources/global/en/agents/default/{security.md → security-reviewer.md} +23 -5
  141. package/resources/global/en/agents/default/supervisor.md +22 -2
  142. package/resources/global/en/agents/expert/frontend-reviewer.md +0 -17
  143. package/resources/global/en/agents/expert/qa-reviewer.md +0 -16
  144. package/resources/global/en/agents/expert/security-reviewer.md +0 -16
  145. package/resources/global/en/agents/expert/supervisor.md +2 -0
  146. package/resources/global/en/agents/expert-cqrs/cqrs-es-reviewer.md +0 -17
  147. package/resources/global/en/agents/templates/coder.md +128 -0
  148. package/resources/global/en/agents/templates/planner.md +44 -0
  149. package/resources/global/en/agents/templates/reviewer.md +57 -0
  150. package/resources/global/en/agents/templates/supervisor.md +64 -0
  151. package/resources/global/en/workflows/default.yaml +232 -772
  152. package/resources/global/en/workflows/expert-cqrs.yaml +319 -698
  153. package/resources/global/en/workflows/expert.yaml +348 -723
  154. package/resources/global/en/workflows/magi.yaml +45 -52
  155. package/resources/global/en/workflows/research.yaml +18 -99
  156. package/resources/global/en/workflows/simple.yaml +152 -421
  157. package/resources/global/ja/agents/default/ai-antipattern-reviewer.md +84 -15
  158. package/resources/global/ja/agents/default/{architect.md → architecture-reviewer.md} +148 -48
  159. package/resources/global/ja/agents/default/coder.md +4 -4
  160. package/resources/global/ja/agents/default/planner.md +16 -9
  161. package/resources/global/ja/agents/default/{security.md → security-reviewer.md} +23 -5
  162. package/resources/global/ja/agents/default/supervisor.md +22 -2
  163. package/resources/global/ja/agents/expert/frontend-reviewer.md +0 -18
  164. package/resources/global/ja/agents/expert/qa-reviewer.md +0 -16
  165. package/resources/global/ja/agents/expert/security-reviewer.md +0 -16
  166. package/resources/global/ja/agents/expert/supervisor.md +2 -0
  167. package/resources/global/ja/agents/expert-cqrs/cqrs-es-reviewer.md +0 -18
  168. package/resources/global/ja/agents/templates/coder.md +128 -0
  169. package/resources/global/ja/agents/templates/planner.md +44 -0
  170. package/resources/global/ja/agents/templates/reviewer.md +57 -0
  171. package/resources/global/ja/agents/templates/supervisor.md +64 -0
  172. package/resources/global/ja/workflows/default.yaml +227 -773
  173. package/resources/global/ja/workflows/expert-cqrs.yaml +309 -833
  174. package/resources/global/ja/workflows/expert.yaml +325 -712
  175. package/resources/global/ja/workflows/magi.yaml +45 -52
  176. package/resources/global/ja/workflows/research.yaml +18 -99
  177. package/resources/global/ja/workflows/simple.yaml +145 -415
  178. package/dist/commands/help.d.ts +0 -8
  179. package/dist/commands/help.d.ts.map +0 -1
  180. package/dist/commands/help.js +0 -48
  181. package/dist/commands/help.js.map +0 -1
  182. package/dist/commands/refreshBuiltin.d.ts +0 -11
  183. package/dist/commands/refreshBuiltin.d.ts.map +0 -1
  184. package/dist/commands/refreshBuiltin.js +0 -37
  185. package/dist/commands/refreshBuiltin.js.map +0 -1
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Parallel step log display
3
+ *
4
+ * Provides prefixed, color-coded interleaved output for parallel sub-steps.
5
+ * Each sub-step's stream output gets a `[name]` prefix with right-padding
6
+ * aligned to the longest sub-step name.
7
+ */
8
+ /** ANSI color codes for sub-step prefixes (cycled in order) */
9
+ const COLORS = ['\x1b[36m', '\x1b[33m', '\x1b[35m', '\x1b[32m']; // cyan, yellow, magenta, green
10
+ const RESET = '\x1b[0m';
11
+ /**
12
+ * Logger for parallel step execution.
13
+ *
14
+ * Creates per-sub-step StreamCallback wrappers that:
15
+ * - Buffer partial lines until newline
16
+ * - Prepend colored `[name]` prefix to each complete line
17
+ * - Delegate init/result/error events to the parent callback
18
+ */
19
+ export class ParallelLogger {
20
+ maxNameLength;
21
+ lineBuffers = new Map();
22
+ parentOnStream;
23
+ writeFn;
24
+ constructor(options) {
25
+ this.maxNameLength = Math.max(...options.subStepNames.map((n) => n.length));
26
+ this.parentOnStream = options.parentOnStream;
27
+ this.writeFn = options.writeFn ?? ((text) => process.stdout.write(text));
28
+ for (const name of options.subStepNames) {
29
+ this.lineBuffers.set(name, '');
30
+ }
31
+ }
32
+ /**
33
+ * Build the colored prefix string for a sub-step.
34
+ * Format: `\x1b[COLORm[name]\x1b[0m` + padding spaces
35
+ */
36
+ buildPrefix(name, index) {
37
+ const color = COLORS[index % COLORS.length];
38
+ const padding = ' '.repeat(this.maxNameLength - name.length);
39
+ return `${color}[${name}]${RESET}${padding} `;
40
+ }
41
+ /**
42
+ * Create a StreamCallback wrapper for a specific sub-step.
43
+ *
44
+ * - `text`: buffered line-by-line with prefix
45
+ * - `tool_use`, `tool_result`, `tool_output`, `thinking`: prefixed per-line, no buffering
46
+ * - `init`, `result`, `error`: delegated to parent callback (no prefix)
47
+ */
48
+ createStreamHandler(subStepName, index) {
49
+ const prefix = this.buildPrefix(subStepName, index);
50
+ return (event) => {
51
+ switch (event.type) {
52
+ case 'text':
53
+ this.handleTextEvent(subStepName, prefix, event.data.text);
54
+ break;
55
+ case 'tool_use':
56
+ case 'tool_result':
57
+ case 'tool_output':
58
+ case 'thinking':
59
+ this.handleBlockEvent(prefix, event);
60
+ break;
61
+ case 'init':
62
+ case 'result':
63
+ case 'error':
64
+ // Delegate to parent without prefix
65
+ this.parentOnStream?.(event);
66
+ break;
67
+ }
68
+ };
69
+ }
70
+ /**
71
+ * Handle text event with line buffering.
72
+ * Buffer until newline, then output prefixed complete lines.
73
+ * Empty lines get no prefix per spec.
74
+ */
75
+ handleTextEvent(name, prefix, text) {
76
+ const buffer = this.lineBuffers.get(name) ?? '';
77
+ const combined = buffer + text;
78
+ const parts = combined.split('\n');
79
+ // Last part is incomplete (no trailing newline) — keep in buffer
80
+ this.lineBuffers.set(name, parts.pop());
81
+ // Output all complete lines
82
+ for (const line of parts) {
83
+ if (line === '') {
84
+ this.writeFn('\n');
85
+ }
86
+ else {
87
+ this.writeFn(`${prefix}${line}\n`);
88
+ }
89
+ }
90
+ }
91
+ /**
92
+ * Handle block events (tool_use, tool_result, tool_output, thinking).
93
+ * Output with prefix, splitting multi-line content.
94
+ */
95
+ handleBlockEvent(prefix, event) {
96
+ let text;
97
+ switch (event.type) {
98
+ case 'tool_use':
99
+ text = `[tool] ${event.data.tool}`;
100
+ break;
101
+ case 'tool_result':
102
+ text = event.data.content;
103
+ break;
104
+ case 'tool_output':
105
+ text = event.data.output;
106
+ break;
107
+ case 'thinking':
108
+ text = event.data.thinking;
109
+ break;
110
+ default:
111
+ return;
112
+ }
113
+ for (const line of text.split('\n')) {
114
+ if (line === '') {
115
+ this.writeFn('\n');
116
+ }
117
+ else {
118
+ this.writeFn(`${prefix}${line}\n`);
119
+ }
120
+ }
121
+ }
122
+ /**
123
+ * Flush remaining line buffers for all sub-steps.
124
+ * Call after all sub-steps complete to output any trailing partial lines.
125
+ */
126
+ flush() {
127
+ // Build prefixes for flush — need index mapping
128
+ // Since we don't store index, iterate lineBuffers in insertion order
129
+ // (Map preserves insertion order, matching subStepNames order)
130
+ let index = 0;
131
+ for (const [name, buffer] of this.lineBuffers) {
132
+ if (buffer !== '') {
133
+ const prefix = this.buildPrefix(name, index);
134
+ this.writeFn(`${prefix}${buffer}\n`);
135
+ this.lineBuffers.set(name, '');
136
+ }
137
+ index++;
138
+ }
139
+ }
140
+ /**
141
+ * Print completion summary after all sub-steps finish.
142
+ *
143
+ * Format:
144
+ * ```
145
+ * ── parallel-review results ──
146
+ * arch-review: approved
147
+ * security-review: rejected
148
+ * ──────────────────────────────
149
+ * ```
150
+ */
151
+ printSummary(parentStepName, results) {
152
+ this.flush();
153
+ const maxResultNameLength = Math.max(...results.map((r) => r.name.length));
154
+ const resultLines = results.map((r) => {
155
+ const padding = ' '.repeat(maxResultNameLength - r.name.length);
156
+ const condition = r.condition ?? '(no result)';
157
+ return ` ${r.name}:${padding} ${condition}`;
158
+ });
159
+ // Header line: ── name results ──
160
+ const headerText = ` ${parentStepName} results `;
161
+ const maxLineLength = Math.max(headerText.length + 4, // 4 for "── " + " ──"
162
+ ...resultLines.map((l) => l.length));
163
+ const sideWidth = Math.max(1, Math.floor((maxLineLength - headerText.length) / 2));
164
+ const headerLine = `${'─'.repeat(sideWidth)}${headerText}${'─'.repeat(sideWidth)}`;
165
+ const footerLine = '─'.repeat(headerLine.length);
166
+ this.writeFn(`${headerLine}\n`);
167
+ for (const line of resultLines) {
168
+ this.writeFn(`${line}\n`);
169
+ }
170
+ this.writeFn(`${footerLine}\n`);
171
+ }
172
+ }
173
+ //# sourceMappingURL=parallel-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-logger.js","sourceRoot":"","sources":["../../src/workflow/parallel-logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Phase execution logic extracted from engine.ts.
3
+ *
4
+ * Handles Phase 2 (report output) and Phase 3 (status judgment)
5
+ * as session-resume operations.
6
+ */
7
+ import type { WorkflowStep, Language } from '../models/types.js';
8
+ import { type RunAgentOptions } from '../agents/runner.js';
9
+ export interface PhaseRunnerContext {
10
+ /** Working directory (agent work dir, may be a clone) */
11
+ cwd: string;
12
+ /** Report directory path */
13
+ reportDir: string;
14
+ /** Language for instructions */
15
+ language?: Language;
16
+ /** Get agent session ID */
17
+ getSessionId: (agent: string) => string | undefined;
18
+ /** Build resume options for a step */
19
+ buildResumeOptions: (step: WorkflowStep, sessionId: string, overrides: Pick<RunAgentOptions, 'allowedTools' | 'maxTurns'>) => RunAgentOptions;
20
+ /** Update agent session after a phase run */
21
+ updateAgentSession: (agent: string, sessionId: string | undefined) => void;
22
+ }
23
+ /**
24
+ * Check if a step needs Phase 3 (status judgment).
25
+ * Returns true when at least one rule requires tag-based detection.
26
+ */
27
+ export declare function needsStatusJudgmentPhase(step: WorkflowStep): boolean;
28
+ /**
29
+ * Phase 2: Report output.
30
+ * Resumes the agent session with Write-only tools to output reports.
31
+ * The response is discarded — only sessionId is updated.
32
+ */
33
+ export declare function runReportPhase(step: WorkflowStep, stepIteration: number, ctx: PhaseRunnerContext): Promise<void>;
34
+ /**
35
+ * Phase 3: Status judgment.
36
+ * Resumes the agent session with no tools to ask the agent to output a status tag.
37
+ * Returns the Phase 3 response content (containing the status tag).
38
+ */
39
+ export declare function runStatusJudgmentPhase(step: WorkflowStep, ctx: PhaseRunnerContext): Promise<string>;
40
+ //# sourceMappingURL=phase-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase-runner.d.ts","sourceRoot":"","sources":["../../src/workflow/phase-runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAUrE,MAAM,WAAW,kBAAkB;IACjC,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAC;IACZ,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,2BAA2B;IAC3B,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACpD,sCAAsC;IACtC,kBAAkB,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,cAAc,GAAG,UAAU,CAAC,KAAK,eAAe,CAAC;IAC9I,6CAA6C;IAC7C,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CAC5E;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAEpE;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,YAAY,EAClB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,kBAAkB,GACtB,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,YAAY,EAClB,GAAG,EAAE,kBAAkB,GACtB,OAAO,CAAC,MAAM,CAAC,CAwBjB"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Phase execution logic extracted from engine.ts.
3
+ *
4
+ * Handles Phase 2 (report output) and Phase 3 (status judgment)
5
+ * as session-resume operations.
6
+ */
7
+ import { runAgent } from '../agents/runner.js';
8
+ import { buildReportInstruction as buildReportInstructionFromTemplate, buildStatusJudgmentInstruction as buildStatusJudgmentInstructionFromTemplate, } from './instruction-builder.js';
9
+ import { hasTagBasedRules } from './rule-utils.js';
10
+ import { createLogger } from '../utils/debug.js';
11
+ const log = createLogger('phase-runner');
12
+ /**
13
+ * Check if a step needs Phase 3 (status judgment).
14
+ * Returns true when at least one rule requires tag-based detection.
15
+ */
16
+ export function needsStatusJudgmentPhase(step) {
17
+ return hasTagBasedRules(step);
18
+ }
19
+ /**
20
+ * Phase 2: Report output.
21
+ * Resumes the agent session with Write-only tools to output reports.
22
+ * The response is discarded — only sessionId is updated.
23
+ */
24
+ export async function runReportPhase(step, stepIteration, ctx) {
25
+ const sessionId = ctx.getSessionId(step.agent);
26
+ if (!sessionId) {
27
+ throw new Error(`Report phase requires a session to resume, but no sessionId found for agent "${step.agent}" in step "${step.name}"`);
28
+ }
29
+ log.debug('Running report phase', { step: step.name, sessionId });
30
+ const reportInstruction = buildReportInstructionFromTemplate(step, {
31
+ cwd: ctx.cwd,
32
+ reportDir: ctx.reportDir,
33
+ stepIteration,
34
+ language: ctx.language,
35
+ });
36
+ const reportOptions = ctx.buildResumeOptions(step, sessionId, {
37
+ allowedTools: ['Write'],
38
+ maxTurns: 3,
39
+ });
40
+ const reportResponse = await runAgent(step.agent, reportInstruction, reportOptions);
41
+ // Update session (phase 2 may update it)
42
+ ctx.updateAgentSession(step.agent, reportResponse.sessionId);
43
+ log.debug('Report phase complete', { step: step.name, status: reportResponse.status });
44
+ }
45
+ /**
46
+ * Phase 3: Status judgment.
47
+ * Resumes the agent session with no tools to ask the agent to output a status tag.
48
+ * Returns the Phase 3 response content (containing the status tag).
49
+ */
50
+ export async function runStatusJudgmentPhase(step, ctx) {
51
+ const sessionId = ctx.getSessionId(step.agent);
52
+ if (!sessionId) {
53
+ throw new Error(`Status judgment phase requires a session to resume, but no sessionId found for agent "${step.agent}" in step "${step.name}"`);
54
+ }
55
+ log.debug('Running status judgment phase', { step: step.name, sessionId });
56
+ const judgmentInstruction = buildStatusJudgmentInstructionFromTemplate(step, {
57
+ language: ctx.language,
58
+ });
59
+ const judgmentOptions = ctx.buildResumeOptions(step, sessionId, {
60
+ allowedTools: [],
61
+ maxTurns: 3,
62
+ });
63
+ const judgmentResponse = await runAgent(step.agent, judgmentInstruction, judgmentOptions);
64
+ // Update session (phase 3 may update it)
65
+ ctx.updateAgentSession(step.agent, judgmentResponse.sessionId);
66
+ log.debug('Status judgment phase complete', { step: step.name, status: judgmentResponse.status });
67
+ return judgmentResponse.content;
68
+ }
69
+ //# sourceMappingURL=phase-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase-runner.js","sourceRoot":"","sources":["../../src/workflow/phase-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Rule evaluation logic extracted from engine.ts.
3
+ *
4
+ * Evaluates workflow step rules to determine the matched rule index.
5
+ * Supports tag-based detection, ai() conditions, aggregate conditions,
6
+ * and AI judge fallback.
7
+ */
8
+ import type { WorkflowStep, WorkflowState, RuleMatchMethod } from '../models/types.js';
9
+ export interface RuleMatch {
10
+ index: number;
11
+ method: RuleMatchMethod;
12
+ }
13
+ export interface RuleEvaluatorContext {
14
+ /** Workflow state (for accessing stepOutputs in aggregate evaluation) */
15
+ state: WorkflowState;
16
+ /** Working directory (for AI judge calls) */
17
+ cwd: string;
18
+ }
19
+ /**
20
+ * Detect matched rule for a step's response.
21
+ * Evaluation order (first match wins):
22
+ * 1. Aggregate conditions: all()/any() — evaluate sub-step results
23
+ * 2. Tag detection from Phase 3 output
24
+ * 3. Tag detection from Phase 1 output (fallback)
25
+ * 4. ai() condition evaluation via AI judge
26
+ * 5. All-conditions AI judge (final fallback)
27
+ *
28
+ * Returns undefined for steps without rules.
29
+ * Throws if rules exist but no rule matched (Fail Fast).
30
+ *
31
+ * @param step - The workflow step
32
+ * @param agentContent - Phase 1 output (main execution)
33
+ * @param tagContent - Phase 3 output (status judgment); empty string skips tag detection
34
+ * @param ctx - Evaluation context (state, cwd)
35
+ */
36
+ export declare function detectMatchedRule(step: WorkflowStep, agentContent: string, tagContent: string, ctx: RuleEvaluatorContext): Promise<RuleMatch | undefined>;
37
+ /**
38
+ * Evaluate aggregate conditions (all()/any()) against sub-step results.
39
+ * Returns the 0-based rule index in the step's rules array, or -1 if no match.
40
+ *
41
+ * For each aggregate rule, checks the matched condition text of sub-steps:
42
+ * - all("X"): true when ALL sub-steps have matched condition === X
43
+ * - any("X"): true when at least ONE sub-step has matched condition === X
44
+ *
45
+ * Edge cases per spec:
46
+ * - Sub-step with no matched rule: all() → false, any() → skip that sub-step
47
+ * - No sub-steps (0 件): both → false
48
+ * - Non-parallel step: both → false
49
+ */
50
+ export declare function evaluateAggregateConditions(step: WorkflowStep, state: WorkflowState): number;
51
+ /**
52
+ * Evaluate ai() conditions via AI judge.
53
+ * Collects all ai() rules, calls the judge, and maps the result back to the original rule index.
54
+ * Returns the 0-based rule index in the step's rules array, or -1 if no match.
55
+ */
56
+ export declare function evaluateAiConditions(step: WorkflowStep, agentOutput: string, cwd: string): Promise<number>;
57
+ /**
58
+ * Final fallback: evaluate ALL rule conditions via AI judge.
59
+ * Unlike evaluateAiConditions (which only handles ai() flagged rules),
60
+ * this sends every rule's condition text to the judge.
61
+ * Returns the 0-based rule index, or -1 if no match.
62
+ */
63
+ export declare function evaluateAllConditionsViaAiJudge(step: WorkflowStep, agentOutput: string, cwd: string): Promise<number>;
64
+ //# sourceMappingURL=rule-evaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-evaluator.d.ts","sourceRoot":"","sources":["../../src/workflow/rule-evaluator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAM5B,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,yEAAyE;IACzE,KAAK,EAAE,aAAa,CAAC;IACrB,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,YAAY,EAClB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,oBAAoB,GACxB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAsChC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAuC5F;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmChH;AAED;;;;;GAKG;AACH,wBAAsB,+BAA+B,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuB3H"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Rule evaluation logic extracted from engine.ts.
3
+ *
4
+ * Evaluates workflow step rules to determine the matched rule index.
5
+ * Supports tag-based detection, ai() conditions, aggregate conditions,
6
+ * and AI judge fallback.
7
+ */
8
+ import { detectRuleIndex, callAiJudge } from '../claude/client.js';
9
+ import { createLogger } from '../utils/debug.js';
10
+ const log = createLogger('rule-evaluator');
11
+ /**
12
+ * Detect matched rule for a step's response.
13
+ * Evaluation order (first match wins):
14
+ * 1. Aggregate conditions: all()/any() — evaluate sub-step results
15
+ * 2. Tag detection from Phase 3 output
16
+ * 3. Tag detection from Phase 1 output (fallback)
17
+ * 4. ai() condition evaluation via AI judge
18
+ * 5. All-conditions AI judge (final fallback)
19
+ *
20
+ * Returns undefined for steps without rules.
21
+ * Throws if rules exist but no rule matched (Fail Fast).
22
+ *
23
+ * @param step - The workflow step
24
+ * @param agentContent - Phase 1 output (main execution)
25
+ * @param tagContent - Phase 3 output (status judgment); empty string skips tag detection
26
+ * @param ctx - Evaluation context (state, cwd)
27
+ */
28
+ export async function detectMatchedRule(step, agentContent, tagContent, ctx) {
29
+ if (!step.rules || step.rules.length === 0)
30
+ return undefined;
31
+ // 1. Aggregate conditions (all/any) — only meaningful for parallel parent steps
32
+ const aggIndex = evaluateAggregateConditions(step, ctx.state);
33
+ if (aggIndex >= 0) {
34
+ return { index: aggIndex, method: 'aggregate' };
35
+ }
36
+ // 2. Tag detection from Phase 3 output
37
+ if (tagContent) {
38
+ const ruleIndex = detectRuleIndex(tagContent, step.name);
39
+ if (ruleIndex >= 0 && ruleIndex < step.rules.length) {
40
+ return { index: ruleIndex, method: 'phase3_tag' };
41
+ }
42
+ }
43
+ // 3. Tag detection from Phase 1 output (fallback)
44
+ if (agentContent) {
45
+ const ruleIndex = detectRuleIndex(agentContent, step.name);
46
+ if (ruleIndex >= 0 && ruleIndex < step.rules.length) {
47
+ return { index: ruleIndex, method: 'phase1_tag' };
48
+ }
49
+ }
50
+ // 4. AI judge for ai() conditions only
51
+ const aiRuleIndex = await evaluateAiConditions(step, agentContent, ctx.cwd);
52
+ if (aiRuleIndex >= 0) {
53
+ return { index: aiRuleIndex, method: 'ai_judge' };
54
+ }
55
+ // 5. AI judge for all conditions (final fallback)
56
+ const fallbackIndex = await evaluateAllConditionsViaAiJudge(step, agentContent, ctx.cwd);
57
+ if (fallbackIndex >= 0) {
58
+ return { index: fallbackIndex, method: 'ai_judge_fallback' };
59
+ }
60
+ throw new Error(`Status not found for step "${step.name}": no rule matched after all detection phases`);
61
+ }
62
+ /**
63
+ * Evaluate aggregate conditions (all()/any()) against sub-step results.
64
+ * Returns the 0-based rule index in the step's rules array, or -1 if no match.
65
+ *
66
+ * For each aggregate rule, checks the matched condition text of sub-steps:
67
+ * - all("X"): true when ALL sub-steps have matched condition === X
68
+ * - any("X"): true when at least ONE sub-step has matched condition === X
69
+ *
70
+ * Edge cases per spec:
71
+ * - Sub-step with no matched rule: all() → false, any() → skip that sub-step
72
+ * - No sub-steps (0 件): both → false
73
+ * - Non-parallel step: both → false
74
+ */
75
+ export function evaluateAggregateConditions(step, state) {
76
+ if (!step.rules || !step.parallel || step.parallel.length === 0)
77
+ return -1;
78
+ for (let i = 0; i < step.rules.length; i++) {
79
+ const rule = step.rules[i];
80
+ if (!rule.isAggregateCondition || !rule.aggregateType || !rule.aggregateConditionText) {
81
+ continue;
82
+ }
83
+ const subSteps = step.parallel;
84
+ const targetCondition = rule.aggregateConditionText;
85
+ if (rule.aggregateType === 'all') {
86
+ const allMatch = subSteps.every((sub) => {
87
+ const output = state.stepOutputs.get(sub.name);
88
+ if (!output || output.matchedRuleIndex == null || !sub.rules)
89
+ return false;
90
+ const matchedRule = sub.rules[output.matchedRuleIndex];
91
+ return matchedRule?.condition === targetCondition;
92
+ });
93
+ if (allMatch) {
94
+ log.debug('Aggregate all() matched', { step: step.name, condition: targetCondition, ruleIndex: i });
95
+ return i;
96
+ }
97
+ }
98
+ else {
99
+ // 'any'
100
+ const anyMatch = subSteps.some((sub) => {
101
+ const output = state.stepOutputs.get(sub.name);
102
+ if (!output || output.matchedRuleIndex == null || !sub.rules)
103
+ return false;
104
+ const matchedRule = sub.rules[output.matchedRuleIndex];
105
+ return matchedRule?.condition === targetCondition;
106
+ });
107
+ if (anyMatch) {
108
+ log.debug('Aggregate any() matched', { step: step.name, condition: targetCondition, ruleIndex: i });
109
+ return i;
110
+ }
111
+ }
112
+ }
113
+ return -1;
114
+ }
115
+ /**
116
+ * Evaluate ai() conditions via AI judge.
117
+ * Collects all ai() rules, calls the judge, and maps the result back to the original rule index.
118
+ * Returns the 0-based rule index in the step's rules array, or -1 if no match.
119
+ */
120
+ export async function evaluateAiConditions(step, agentOutput, cwd) {
121
+ if (!step.rules)
122
+ return -1;
123
+ const aiConditions = [];
124
+ for (let i = 0; i < step.rules.length; i++) {
125
+ const rule = step.rules[i];
126
+ if (rule.isAiCondition && rule.aiConditionText) {
127
+ aiConditions.push({ index: i, text: rule.aiConditionText });
128
+ }
129
+ }
130
+ if (aiConditions.length === 0)
131
+ return -1;
132
+ log.debug('Evaluating ai() conditions via judge', {
133
+ step: step.name,
134
+ conditionCount: aiConditions.length,
135
+ });
136
+ // Remap: judge returns 0-based index within aiConditions array
137
+ const judgeConditions = aiConditions.map((c, i) => ({ index: i, text: c.text }));
138
+ const judgeResult = await callAiJudge(agentOutput, judgeConditions, { cwd });
139
+ if (judgeResult >= 0 && judgeResult < aiConditions.length) {
140
+ const matched = aiConditions[judgeResult];
141
+ log.debug('AI judge matched condition', {
142
+ step: step.name,
143
+ judgeResult,
144
+ originalRuleIndex: matched.index,
145
+ condition: matched.text,
146
+ });
147
+ return matched.index;
148
+ }
149
+ log.debug('AI judge did not match any condition', { step: step.name });
150
+ return -1;
151
+ }
152
+ /**
153
+ * Final fallback: evaluate ALL rule conditions via AI judge.
154
+ * Unlike evaluateAiConditions (which only handles ai() flagged rules),
155
+ * this sends every rule's condition text to the judge.
156
+ * Returns the 0-based rule index, or -1 if no match.
157
+ */
158
+ export async function evaluateAllConditionsViaAiJudge(step, agentOutput, cwd) {
159
+ if (!step.rules || step.rules.length === 0)
160
+ return -1;
161
+ const conditions = step.rules.map((rule, i) => ({ index: i, text: rule.condition }));
162
+ log.debug('Evaluating all conditions via AI judge (final fallback)', {
163
+ step: step.name,
164
+ conditionCount: conditions.length,
165
+ });
166
+ const judgeResult = await callAiJudge(agentOutput, conditions, { cwd });
167
+ if (judgeResult >= 0 && judgeResult < conditions.length) {
168
+ log.debug('AI judge (fallback) matched condition', {
169
+ step: step.name,
170
+ ruleIndex: judgeResult,
171
+ condition: conditions[judgeResult].text,
172
+ });
173
+ return judgeResult;
174
+ }
175
+ log.debug('AI judge (fallback) did not match any condition', { step: step.name });
176
+ return -1;
177
+ }
178
+ //# sourceMappingURL=rule-evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-evaluator.js","sourceRoot":"","sources":["../../src/workflow/rule-evaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Shared rule utility functions used by both engine.ts and instruction-builder.ts.
3
+ */
4
+ import type { WorkflowStep } from '../models/types.js';
5
+ /**
6
+ * Check whether a step has tag-based rules (i.e., rules that require
7
+ * [STEP:N] tag output for detection).
8
+ *
9
+ * Returns false when all rules are ai() or aggregate conditions,
10
+ * meaning no tag-based status output is needed.
11
+ */
12
+ export declare function hasTagBasedRules(step: WorkflowStep): boolean;
13
+ //# sourceMappingURL=rule-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-utils.d.ts","sourceRoot":"","sources":["../../src/workflow/rule-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAI5D"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Shared rule utility functions used by both engine.ts and instruction-builder.ts.
3
+ */
4
+ /**
5
+ * Check whether a step has tag-based rules (i.e., rules that require
6
+ * [STEP:N] tag output for detection).
7
+ *
8
+ * Returns false when all rules are ai() or aggregate conditions,
9
+ * meaning no tag-based status output is needed.
10
+ */
11
+ export function hasTagBasedRules(step) {
12
+ if (!step.rules || step.rules.length === 0)
13
+ return false;
14
+ const allNonTagConditions = step.rules.every((r) => r.isAiCondition || r.isAggregateCondition);
15
+ return !allNonTagConditions;
16
+ }
17
+ //# sourceMappingURL=rule-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-utils.js","sourceRoot":"","sources":["../../src/workflow/rule-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAkB;IACjD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACzD,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC/F,OAAO,CAAC,mBAAmB,CAAC;AAC9B,CAAC"}
@@ -1,22 +1,14 @@
1
1
  /**
2
2
  * Workflow state transition logic
3
3
  *
4
- * Handles determining the next step based on agent response status
5
- * and transition conditions defined in the workflow configuration.
4
+ * Handles determining the next step based on rules-based routing.
6
5
  */
7
- import type { WorkflowConfig, WorkflowStep, Status, TransitionCondition } from '../models/types.js';
6
+ import type { WorkflowStep } from '../models/types.js';
8
7
  /**
9
- * Check if status matches transition condition.
8
+ * Determine next step using rules-based detection.
9
+ * Returns the next step name from the matched rule, or null if no rule matched.
10
10
  */
11
- export declare function matchesCondition(status: Status, condition: TransitionCondition): boolean;
12
- /**
13
- * Handle case when no status marker is found in agent output.
14
- */
15
- export declare function handleNoStatus(step: WorkflowStep, config: WorkflowConfig): string;
16
- /**
17
- * Determine next step based on current status.
18
- */
19
- export declare function determineNextStep(step: WorkflowStep, status: Status, config: WorkflowConfig): string;
11
+ export declare function determineNextStepByRules(step: WorkflowStep, ruleIndex: number): string | null;
20
12
  /**
21
13
  * Extract user-facing prompt from blocked response.
22
14
  * Looks for common patterns like "必要な情報:", "質問:", etc.
@@ -1 +1 @@
1
- {"version":3,"file":"transitions.d.ts","sourceRoot":"","sources":["../../src/workflow/transitions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,MAAM,EACN,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAG5B;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,mBAAmB,GAC7B,OAAO,CAqBT;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,cAAc,GACrB,MAAM,CAkCR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,cAAc,GACrB,MAAM,CAoBR;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAkB5D"}
1
+ {"version":3,"file":"transitions.d.ts","sourceRoot":"","sources":["../../src/workflow/transitions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,YAAY,EACb,MAAM,oBAAoB,CAAC;AAE5B;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CAMf;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAkB5D"}