@aiagentflow/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +232 -0
  3. package/dist/agents/base.d.ts +69 -0
  4. package/dist/agents/base.d.ts.map +1 -0
  5. package/dist/agents/base.js +78 -0
  6. package/dist/agents/base.js.map +1 -0
  7. package/dist/agents/factory.d.ts +21 -0
  8. package/dist/agents/factory.d.ts.map +1 -0
  9. package/dist/agents/factory.js +50 -0
  10. package/dist/agents/factory.js.map +1 -0
  11. package/dist/agents/roles/architect.d.ts +23 -0
  12. package/dist/agents/roles/architect.d.ts.map +1 -0
  13. package/dist/agents/roles/architect.js +39 -0
  14. package/dist/agents/roles/architect.js.map +1 -0
  15. package/dist/agents/roles/coder.d.ts +19 -0
  16. package/dist/agents/roles/coder.d.ts.map +1 -0
  17. package/dist/agents/roles/coder.js +38 -0
  18. package/dist/agents/roles/coder.js.map +1 -0
  19. package/dist/agents/roles/fixer.d.ts +19 -0
  20. package/dist/agents/roles/fixer.d.ts.map +1 -0
  21. package/dist/agents/roles/fixer.js +29 -0
  22. package/dist/agents/roles/fixer.js.map +1 -0
  23. package/dist/agents/roles/judge.d.ts +24 -0
  24. package/dist/agents/roles/judge.d.ts.map +1 -0
  25. package/dist/agents/roles/judge.js +38 -0
  26. package/dist/agents/roles/judge.js.map +1 -0
  27. package/dist/agents/roles/reviewer.d.ts +28 -0
  28. package/dist/agents/roles/reviewer.d.ts.map +1 -0
  29. package/dist/agents/roles/reviewer.js +49 -0
  30. package/dist/agents/roles/reviewer.js.map +1 -0
  31. package/dist/agents/roles/tester.d.ts +19 -0
  32. package/dist/agents/roles/tester.d.ts.map +1 -0
  33. package/dist/agents/roles/tester.js +29 -0
  34. package/dist/agents/roles/tester.js.map +1 -0
  35. package/dist/agents/types.d.ts +13 -0
  36. package/dist/agents/types.d.ts.map +1 -0
  37. package/dist/agents/types.js +25 -0
  38. package/dist/agents/types.js.map +1 -0
  39. package/dist/cli/commands/config.d.ts +9 -0
  40. package/dist/cli/commands/config.d.ts.map +1 -0
  41. package/dist/cli/commands/config.js +30 -0
  42. package/dist/cli/commands/config.js.map +1 -0
  43. package/dist/cli/commands/doctor.d.ts +12 -0
  44. package/dist/cli/commands/doctor.d.ts.map +1 -0
  45. package/dist/cli/commands/doctor.js +63 -0
  46. package/dist/cli/commands/doctor.js.map +1 -0
  47. package/dist/cli/commands/init.d.ts +12 -0
  48. package/dist/cli/commands/init.d.ts.map +1 -0
  49. package/dist/cli/commands/init.js +231 -0
  50. package/dist/cli/commands/init.js.map +1 -0
  51. package/dist/cli/commands/run.d.ts +11 -0
  52. package/dist/cli/commands/run.d.ts.map +1 -0
  53. package/dist/cli/commands/run.js +66 -0
  54. package/dist/cli/commands/run.js.map +1 -0
  55. package/dist/cli/index.d.ts +9 -0
  56. package/dist/cli/index.d.ts.map +1 -0
  57. package/dist/cli/index.js +24 -0
  58. package/dist/cli/index.js.map +1 -0
  59. package/dist/core/config/defaults.d.ts +22 -0
  60. package/dist/core/config/defaults.d.ts.map +1 -0
  61. package/dist/core/config/defaults.js +60 -0
  62. package/dist/core/config/defaults.js.map +1 -0
  63. package/dist/core/config/manager.d.ts +45 -0
  64. package/dist/core/config/manager.d.ts.map +1 -0
  65. package/dist/core/config/manager.js +106 -0
  66. package/dist/core/config/manager.js.map +1 -0
  67. package/dist/core/config/schema.d.ts +780 -0
  68. package/dist/core/config/schema.d.ts.map +1 -0
  69. package/dist/core/config/schema.js +102 -0
  70. package/dist/core/config/schema.js.map +1 -0
  71. package/dist/core/config/types.d.ts +24 -0
  72. package/dist/core/config/types.d.ts.map +1 -0
  73. package/dist/core/config/types.js +11 -0
  74. package/dist/core/config/types.js.map +1 -0
  75. package/dist/core/errors.d.ts +36 -0
  76. package/dist/core/errors.d.ts.map +1 -0
  77. package/dist/core/errors.js +60 -0
  78. package/dist/core/errors.js.map +1 -0
  79. package/dist/core/workflow/approval.d.ts +22 -0
  80. package/dist/core/workflow/approval.d.ts.map +1 -0
  81. package/dist/core/workflow/approval.js +54 -0
  82. package/dist/core/workflow/approval.js.map +1 -0
  83. package/dist/core/workflow/engine.d.ts +128 -0
  84. package/dist/core/workflow/engine.d.ts.map +1 -0
  85. package/dist/core/workflow/engine.js +159 -0
  86. package/dist/core/workflow/engine.js.map +1 -0
  87. package/dist/core/workflow/file-parser.d.ts +41 -0
  88. package/dist/core/workflow/file-parser.d.ts.map +1 -0
  89. package/dist/core/workflow/file-parser.js +138 -0
  90. package/dist/core/workflow/file-parser.js.map +1 -0
  91. package/dist/core/workflow/qa-policy.d.ts +55 -0
  92. package/dist/core/workflow/qa-policy.d.ts.map +1 -0
  93. package/dist/core/workflow/qa-policy.js +119 -0
  94. package/dist/core/workflow/qa-policy.js.map +1 -0
  95. package/dist/core/workflow/runner.d.ts +30 -0
  96. package/dist/core/workflow/runner.d.ts.map +1 -0
  97. package/dist/core/workflow/runner.js +273 -0
  98. package/dist/core/workflow/runner.js.map +1 -0
  99. package/dist/core/workflow/session.d.ts +37 -0
  100. package/dist/core/workflow/session.d.ts.map +1 -0
  101. package/dist/core/workflow/session.js +93 -0
  102. package/dist/core/workflow/session.js.map +1 -0
  103. package/dist/core/workflow/task-queue.d.ts +46 -0
  104. package/dist/core/workflow/task-queue.d.ts.map +1 -0
  105. package/dist/core/workflow/task-queue.js +106 -0
  106. package/dist/core/workflow/task-queue.js.map +1 -0
  107. package/dist/core/workflow/test-runner.d.ts +25 -0
  108. package/dist/core/workflow/test-runner.d.ts.map +1 -0
  109. package/dist/core/workflow/test-runner.js +50 -0
  110. package/dist/core/workflow/test-runner.js.map +1 -0
  111. package/dist/core/workflow/token-tracker.d.ts +54 -0
  112. package/dist/core/workflow/token-tracker.d.ts.map +1 -0
  113. package/dist/core/workflow/token-tracker.js +98 -0
  114. package/dist/core/workflow/token-tracker.js.map +1 -0
  115. package/dist/git/client.d.ts +47 -0
  116. package/dist/git/client.d.ts.map +1 -0
  117. package/dist/git/client.js +109 -0
  118. package/dist/git/client.js.map +1 -0
  119. package/dist/prompts/library.d.ts +35 -0
  120. package/dist/prompts/library.d.ts.map +1 -0
  121. package/dist/prompts/library.js +238 -0
  122. package/dist/prompts/library.js.map +1 -0
  123. package/dist/providers/anthropic.d.ts +55 -0
  124. package/dist/providers/anthropic.d.ts.map +1 -0
  125. package/dist/providers/anthropic.js +237 -0
  126. package/dist/providers/anthropic.js.map +1 -0
  127. package/dist/providers/ollama.d.ts +44 -0
  128. package/dist/providers/ollama.d.ts.map +1 -0
  129. package/dist/providers/ollama.js +211 -0
  130. package/dist/providers/ollama.js.map +1 -0
  131. package/dist/providers/registry.d.ts +36 -0
  132. package/dist/providers/registry.d.ts.map +1 -0
  133. package/dist/providers/registry.js +91 -0
  134. package/dist/providers/registry.js.map +1 -0
  135. package/dist/providers/types.d.ts +100 -0
  136. package/dist/providers/types.d.ts.map +1 -0
  137. package/dist/providers/types.js +12 -0
  138. package/dist/providers/types.js.map +1 -0
  139. package/dist/types/index.d.ts +11 -0
  140. package/dist/types/index.d.ts.map +1 -0
  141. package/dist/types/index.js +9 -0
  142. package/dist/types/index.js.map +1 -0
  143. package/dist/utils/fs.d.ts +30 -0
  144. package/dist/utils/fs.d.ts.map +1 -0
  145. package/dist/utils/fs.js +80 -0
  146. package/dist/utils/fs.js.map +1 -0
  147. package/dist/utils/logger.d.ts +46 -0
  148. package/dist/utils/logger.d.ts.map +1 -0
  149. package/dist/utils/logger.js +87 -0
  150. package/dist/utils/logger.js.map +1 -0
  151. package/dist/utils/validation.d.ts +28 -0
  152. package/dist/utils/validation.d.ts.map +1 -0
  153. package/dist/utils/validation.js +38 -0
  154. package/dist/utils/validation.js.map +1 -0
  155. package/package.json +62 -0
@@ -0,0 +1,273 @@
1
+ /**
2
+ * Workflow runner — orchestrates agents through the workflow engine.
3
+ *
4
+ * This is the main "brain" that:
5
+ * 1. Creates a workflow context for a task
6
+ * 2. Determines which agent to run next
7
+ * 3. Executes agents and feeds output to the workflow engine
8
+ * 4. Handles transitions, loops, and terminal states
9
+ * 5. Tracks token usage and persists session state
10
+ *
11
+ * Dependency direction: runner.ts → engine, agents/factory, git/client, config
12
+ * Used by: cli/commands/run.ts
13
+ */
14
+ import chalk from 'chalk';
15
+ import ora from 'ora';
16
+ import { createWorkflowContext, transition, isTerminal, getNextAgent, } from './engine.js';
17
+ import { createAgent } from '../../agents/factory.js';
18
+ import { GitClient } from '../../git/client.js';
19
+ import { parseAndWriteFiles } from './file-parser.js';
20
+ import { runTests } from './test-runner.js';
21
+ import { requestApproval, needsApproval } from './approval.js';
22
+ import { TokenTracker } from './token-tracker.js';
23
+ import { saveSession } from './session.js';
24
+ import { loadQAPolicy, evaluateReview, formatPolicyForAgent } from './qa-policy.js';
25
+ import { loadConfig } from '../config/manager.js';
26
+ import { logger } from '../../utils/logger.js';
27
+ import { WorkflowError } from '../errors.js';
28
+ /**
29
+ * Run a full workflow for a task.
30
+ *
31
+ * Orchestrates the agent pipeline: Architect → Coder → Reviewer → Tester → Fixer → Judge.
32
+ * Returns the final workflow context with all accumulated data.
33
+ */
34
+ export async function runWorkflow(options) {
35
+ const { projectRoot, task, auto = false } = options;
36
+ const config = loadConfig(projectRoot);
37
+ const tokenTracker = new TokenTracker();
38
+ const qaPolicy = loadQAPolicy(projectRoot);
39
+ logger.header('AI Workflow — Running Task');
40
+ console.log(chalk.gray(`Task: ${task}`));
41
+ if (auto) {
42
+ console.log(chalk.yellow('⚡ Autonomous mode — no human approval required'));
43
+ }
44
+ console.log();
45
+ // Optional: create a Git branch for this task
46
+ if (config.workflow.autoCreateBranch) {
47
+ const git = new GitClient(projectRoot);
48
+ const isRepo = await git.isRepo();
49
+ if (isRepo) {
50
+ const branchName = GitClient.toBranchName(config.workflow.branchPrefix, task);
51
+ await git.createBranch(branchName);
52
+ }
53
+ }
54
+ // Create workflow context
55
+ let ctx = createWorkflowContext(task, config.workflow.maxIterations);
56
+ let sessionId;
57
+ let lastOutput = '';
58
+ try {
59
+ // Main workflow loop
60
+ while (!isTerminal(ctx)) {
61
+ const agentRole = getNextAgent(ctx);
62
+ if (!agentRole) {
63
+ if (ctx.state === 'qa_approved') {
64
+ logger.success('Workflow complete!');
65
+ break;
66
+ }
67
+ logger.warn('No agent mapped to current state — stopping.');
68
+ break;
69
+ }
70
+ const agent = createAgent(agentRole, config, projectRoot);
71
+ const agentConfig = config.agents[agentRole];
72
+ const spinner = ora(`Running ${agentRole} agent...`).start();
73
+ try {
74
+ const output = await agent.execute({
75
+ task: ctx.task,
76
+ context: buildAgentContext(ctx, qaPolicy),
77
+ previousOutput: getLatestOutput(ctx),
78
+ });
79
+ spinner.succeed(`${agentRole} complete (${output.tokensUsed} tokens)`);
80
+ lastOutput = output.content;
81
+ // Track token usage
82
+ tokenTracker.record(agentRole, agentConfig.model, {
83
+ promptTokens: 0, // TODO: Get from provider response
84
+ completionTokens: output.tokensUsed,
85
+ totalTokens: output.tokensUsed,
86
+ });
87
+ // Transition based on agent output
88
+ ctx = await applyAgentOutput(ctx, agentRole, output.content, config, projectRoot, qaPolicy);
89
+ }
90
+ catch (err) {
91
+ spinner.fail(`${agentRole} failed`);
92
+ if (err instanceof WorkflowError)
93
+ throw err;
94
+ logger.error(err instanceof Error ? err.message : String(err));
95
+ ctx = transition(ctx, { type: 'ABORT', payload: { reason: String(err) } });
96
+ }
97
+ // Save session after each step (crash recovery)
98
+ sessionId = saveSession(projectRoot, ctx, tokenTracker.getEntries(), sessionId);
99
+ // Human approval gate (skipped in autonomous mode)
100
+ const shouldApprove = !auto && needsApproval(config.workflow.humanApproval, ctx.state);
101
+ if (shouldApprove && !isTerminal(ctx)) {
102
+ const decision = await requestApproval(ctx, agentRole, lastOutput);
103
+ if (decision === 'abort') {
104
+ ctx = transition(ctx, { type: 'ABORT', payload: { reason: 'User aborted' } });
105
+ }
106
+ else if (decision === 'retry') {
107
+ logger.info('Retrying agent...');
108
+ }
109
+ }
110
+ }
111
+ }
112
+ catch (err) {
113
+ logger.error(`Workflow failed: ${err instanceof Error ? err.message : String(err)}`);
114
+ if (!isTerminal(ctx)) {
115
+ ctx = transition(ctx, { type: 'ABORT', payload: { reason: String(err) } });
116
+ }
117
+ }
118
+ // Final save
119
+ saveSession(projectRoot, ctx, tokenTracker.getEntries(), sessionId);
120
+ // Print summaries
121
+ printWorkflowSummary(ctx);
122
+ tokenTracker.printSummary();
123
+ return ctx;
124
+ }
125
+ // ── Private helpers ──
126
+ /** Build context string for the current agent based on workflow state. */
127
+ function buildAgentContext(ctx, qaPolicy) {
128
+ const parts = [];
129
+ if (ctx.spec)
130
+ parts.push(`## Spec\n${ctx.spec}`);
131
+ if (ctx.plan)
132
+ parts.push(`## Plan\n${ctx.plan}`);
133
+ if (ctx.reviewFeedback)
134
+ parts.push(`## Review Feedback\n${ctx.reviewFeedback}`);
135
+ if (ctx.testFailures)
136
+ parts.push(`## Test Failures\n${ctx.testFailures}`);
137
+ if (ctx.generatedFiles.length > 0) {
138
+ parts.push(`## Modified Files\n${ctx.generatedFiles.join('\n')}`);
139
+ }
140
+ // Include QA policy for the judge agent
141
+ if (qaPolicy && ctx.state === 'tests_passed') {
142
+ parts.push(formatPolicyForAgent(qaPolicy));
143
+ }
144
+ return parts.join('\n\n');
145
+ }
146
+ /** Get the most recent output relevant to the next agent. */
147
+ function getLatestOutput(ctx) {
148
+ if (ctx.spec && ctx.state === 'spec_created')
149
+ return ctx.spec;
150
+ if (ctx.plan && ctx.state === 'plan_approved')
151
+ return ctx.plan;
152
+ if (ctx.reviewFeedback)
153
+ return ctx.reviewFeedback;
154
+ if (ctx.testFailures)
155
+ return ctx.testFailures;
156
+ return undefined;
157
+ }
158
+ /**
159
+ * Apply an agent's output to the workflow context via state transition.
160
+ */
161
+ async function applyAgentOutput(ctx, role, content, config, projectRoot, qaPolicy) {
162
+ switch (role) {
163
+ case 'architect':
164
+ if (ctx.state === 'idle') {
165
+ ctx = transition(ctx, { type: 'SPEC_READY', payload: { spec: content } });
166
+ ctx = transition(ctx, { type: 'PLAN_APPROVED', payload: { plan: content } });
167
+ }
168
+ return ctx;
169
+ case 'coder': {
170
+ const files = parseAndWriteFiles(projectRoot, content);
171
+ return transition(ctx, {
172
+ type: 'CODE_GENERATED',
173
+ payload: { files: files.length > 0 ? files : ['(no files parsed)'] },
174
+ });
175
+ }
176
+ case 'reviewer': {
177
+ const upper = content.toUpperCase();
178
+ const reviewApproved = upper.includes('APPROVE') &&
179
+ !upper.includes('REQUEST_CHANGES') &&
180
+ !upper.includes('REJECT');
181
+ // Evaluate review against QA policy (informational when reviewer approves)
182
+ const evaluation = evaluateReview(content, qaPolicy);
183
+ if (evaluation.totalIssues > 0) {
184
+ logger.info(`QA policy: ${evaluation.criticalCount} critical, ${evaluation.warningCount} warning(s), ${evaluation.totalIssues - evaluation.criticalCount - evaluation.warningCount} nit(s)`);
185
+ }
186
+ // Trust the reviewer's explicit verdict.
187
+ // QA policy only blocks when the reviewer did NOT approve.
188
+ const approved = reviewApproved;
189
+ return transition(ctx, { type: 'REVIEW_DONE', payload: { approved, feedback: content } });
190
+ }
191
+ case 'tester': {
192
+ const testFiles = parseAndWriteFiles(projectRoot, content);
193
+ ctx = transition(ctx, {
194
+ type: 'TESTS_WRITTEN',
195
+ payload: { testFiles: testFiles.length > 0 ? testFiles : ['(no test files parsed)'] },
196
+ });
197
+ // Auto-run tests and transition based on results
198
+ if (config.workflow.autoRunTests) {
199
+ const testResult = await runTests(projectRoot);
200
+ if (testResult.passed) {
201
+ ctx = transition(ctx, { type: 'TESTS_PASSED' });
202
+ }
203
+ else {
204
+ ctx = transition(ctx, { type: 'TESTS_FAILED', payload: { failures: testResult.output } });
205
+ }
206
+ }
207
+ else {
208
+ // Skip test execution — assume tests pass
209
+ ctx = transition(ctx, { type: 'TESTS_PASSED' });
210
+ }
211
+ return ctx;
212
+ }
213
+ case 'fixer': {
214
+ const fixedFiles = parseAndWriteFiles(projectRoot, content);
215
+ ctx = transition(ctx, {
216
+ type: 'FIX_APPLIED',
217
+ payload: { files: fixedFiles.length > 0 ? fixedFiles : ['(no files parsed)'] },
218
+ });
219
+ // Auto-transition back to code_generated for re-review
220
+ return transition(ctx, {
221
+ type: 'CODE_GENERATED',
222
+ payload: { files: fixedFiles.length > 0 ? fixedFiles : ['(no files parsed)'] },
223
+ });
224
+ }
225
+ case 'judge': {
226
+ const passed = content.toUpperCase().includes('PASS') &&
227
+ !content.toUpperCase().includes('FAIL');
228
+ if (passed) {
229
+ return transition(ctx, { type: 'QA_APPROVED' });
230
+ }
231
+ else {
232
+ return transition(ctx, { type: 'QA_REJECTED', payload: { reason: content } });
233
+ }
234
+ }
235
+ default:
236
+ return ctx;
237
+ }
238
+ }
239
+ /** Print a colored summary of the workflow execution. */
240
+ function printWorkflowSummary(ctx) {
241
+ console.log();
242
+ logger.header('Workflow Summary');
243
+ console.log(chalk.gray(`Task: ${ctx.task}`));
244
+ console.log(chalk.gray(`Final state: ${ctx.state}`));
245
+ console.log(chalk.gray(`Iterations: ${ctx.iteration}/${ctx.maxIterations}`));
246
+ console.log(chalk.gray(`Steps: ${ctx.history.length}`));
247
+ if (ctx.generatedFiles.length > 0) {
248
+ console.log();
249
+ console.log(chalk.bold(' Files modified:'));
250
+ for (const file of ctx.generatedFiles) {
251
+ console.log(chalk.gray(` ${file}`));
252
+ }
253
+ }
254
+ if (ctx.history.length > 0) {
255
+ console.log();
256
+ console.log(chalk.bold(' State transitions:'));
257
+ for (const step of ctx.history) {
258
+ const arrow = step.to === 'failed' ? chalk.red('→') : chalk.green('→');
259
+ console.log(chalk.gray(` ${step.from} ${arrow} ${chalk.white(step.to)} (${step.event})`));
260
+ }
261
+ }
262
+ console.log();
263
+ if (ctx.state === 'complete' || ctx.state === 'qa_approved') {
264
+ logger.success('Task completed successfully!');
265
+ }
266
+ else if (ctx.state === 'failed') {
267
+ logger.error('Task failed.');
268
+ }
269
+ else {
270
+ logger.warn(`Task stopped in state: ${ctx.state}`);
271
+ }
272
+ }
273
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/core/workflow/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Session persistence — save and resume workflow state.
3
+ *
4
+ * Saves the workflow context to `.aiagentflow/sessions/` so workflows
5
+ * can survive crashes, restarts, and be resumed later.
6
+ *
7
+ * Dependency direction: session.ts → utils/fs, core/errors
8
+ * Used by: workflow runner
9
+ */
10
+ import type { WorkflowContext } from './engine.js';
11
+ import type { TokenUsageEntry } from './token-tracker.js';
12
+ /** Persisted session data. */
13
+ export interface SessionData {
14
+ /** Unique session ID. */
15
+ id: string;
16
+ /** When the session was created. */
17
+ createdAt: number;
18
+ /** When the session was last updated. */
19
+ updatedAt: number;
20
+ /** The workflow context snapshot. */
21
+ context: WorkflowContext;
22
+ /** Token usage entries. */
23
+ tokenUsage: TokenUsageEntry[];
24
+ }
25
+ /**
26
+ * Save a workflow session to disk.
27
+ */
28
+ export declare function saveSession(projectRoot: string, context: WorkflowContext, tokenUsage?: TokenUsageEntry[], sessionId?: string): string;
29
+ /**
30
+ * Load a workflow session from disk.
31
+ */
32
+ export declare function loadSession(projectRoot: string, sessionId: string): SessionData | null;
33
+ /**
34
+ * List all saved sessions for a project.
35
+ */
36
+ export declare function listSessions(projectRoot: string): SessionData[];
37
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/core/workflow/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAI1D,8BAA8B;AAC9B,MAAM,WAAW,WAAW;IACxB,yBAAyB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,OAAO,EAAE,eAAe,CAAC;IACzB,2BAA2B;IAC3B,UAAU,EAAE,eAAe,EAAE,CAAC;CACjC;AAsBD;;GAEG;AACH,wBAAgB,WAAW,CACvB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,eAAe,EACxB,UAAU,GAAE,eAAe,EAAO,EAClC,SAAS,CAAC,EAAE,MAAM,GACnB,MAAM,CAqBR;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CActF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CAoB/D"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Session persistence — save and resume workflow state.
3
+ *
4
+ * Saves the workflow context to `.aiagentflow/sessions/` so workflows
5
+ * can survive crashes, restarts, and be resumed later.
6
+ *
7
+ * Dependency direction: session.ts → utils/fs, core/errors
8
+ * Used by: workflow runner
9
+ */
10
+ import { join } from 'node:path';
11
+ import { existsSync, readdirSync } from 'node:fs';
12
+ import { CONFIG_DIR_NAME } from '../config/defaults.js';
13
+ import { ensureDir, readTextFile, writeJsonFile } from '../../utils/fs.js';
14
+ import { logger } from '../../utils/logger.js';
15
+ const SESSIONS_DIR = 'sessions';
16
+ /**
17
+ * Get the sessions directory path.
18
+ */
19
+ function getSessionsDir(projectRoot) {
20
+ return join(projectRoot, CONFIG_DIR_NAME, SESSIONS_DIR);
21
+ }
22
+ /**
23
+ * Generate a short session ID from the task description.
24
+ */
25
+ function generateSessionId(task) {
26
+ const timestamp = Date.now().toString(36);
27
+ const slug = task
28
+ .toLowerCase()
29
+ .replace(/[^a-z0-9]+/g, '-')
30
+ .replace(/^-+|-+$/g, '')
31
+ .slice(0, 30);
32
+ return `${slug}-${timestamp}`;
33
+ }
34
+ /**
35
+ * Save a workflow session to disk.
36
+ */
37
+ export function saveSession(projectRoot, context, tokenUsage = [], sessionId) {
38
+ const sessionsDir = getSessionsDir(projectRoot);
39
+ ensureDir(sessionsDir);
40
+ const id = sessionId ?? generateSessionId(context.task);
41
+ const sessionPath = join(sessionsDir, `${id}.json`);
42
+ const data = {
43
+ id,
44
+ createdAt: existsSync(sessionPath)
45
+ ? loadSession(projectRoot, id)?.createdAt ?? Date.now()
46
+ : Date.now(),
47
+ updatedAt: Date.now(),
48
+ context,
49
+ tokenUsage,
50
+ };
51
+ writeJsonFile(sessionPath, data);
52
+ logger.debug(`Session saved: ${id}`);
53
+ return id;
54
+ }
55
+ /**
56
+ * Load a workflow session from disk.
57
+ */
58
+ export function loadSession(projectRoot, sessionId) {
59
+ const sessionPath = join(getSessionsDir(projectRoot), `${sessionId}.json`);
60
+ if (!existsSync(sessionPath)) {
61
+ return null;
62
+ }
63
+ try {
64
+ const content = readTextFile(sessionPath);
65
+ return JSON.parse(content);
66
+ }
67
+ catch {
68
+ logger.warn(`Failed to load session: ${sessionId}`);
69
+ return null;
70
+ }
71
+ }
72
+ /**
73
+ * List all saved sessions for a project.
74
+ */
75
+ export function listSessions(projectRoot) {
76
+ const sessionsDir = getSessionsDir(projectRoot);
77
+ if (!existsSync(sessionsDir)) {
78
+ return [];
79
+ }
80
+ const files = readdirSync(sessionsDir).filter(f => f.endsWith('.json'));
81
+ const sessions = [];
82
+ for (const file of files) {
83
+ try {
84
+ const content = readTextFile(join(sessionsDir, file));
85
+ sessions.push(JSON.parse(content));
86
+ }
87
+ catch {
88
+ // Skip corrupted session files
89
+ }
90
+ }
91
+ return sessions.sort((a, b) => b.updatedAt - a.updatedAt);
92
+ }
93
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/core/workflow/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Task queue — manages multiple workflow tasks in sequence.
3
+ *
4
+ * Allows users to feed multiple tasks at once. The queue processes
5
+ * them one by one, tracking results and continuing on failure.
6
+ *
7
+ * Dependency direction: task-queue.ts → workflow/runner, core/errors, utils
8
+ * Used by: cli/commands/run.ts (batch mode)
9
+ */
10
+ import type { WorkflowContext } from './engine.js';
11
+ /** A task in the queue with its result. */
12
+ export interface QueuedTask {
13
+ /** Task description. */
14
+ task: string;
15
+ /** Current status. */
16
+ status: 'pending' | 'running' | 'completed' | 'failed' | 'skipped';
17
+ /** Workflow context after execution. */
18
+ result?: WorkflowContext;
19
+ /** Error message if failed. */
20
+ error?: string;
21
+ /** Duration in milliseconds. */
22
+ duration?: number;
23
+ }
24
+ /** Options for running a task queue. */
25
+ export interface QueueOptions {
26
+ /** Project root directory. */
27
+ projectRoot: string;
28
+ /** List of task descriptions. */
29
+ tasks: string[];
30
+ /** Skip human approval between tasks. */
31
+ auto?: boolean;
32
+ /** Stop the queue on first failure. */
33
+ stopOnFailure?: boolean;
34
+ }
35
+ /**
36
+ * Run multiple tasks in sequence.
37
+ *
38
+ * Returns the queue with all results after completion.
39
+ */
40
+ export declare function runTaskQueue(options: QueueOptions): Promise<QueuedTask[]>;
41
+ /**
42
+ * Parse a task list from a file or string.
43
+ * Each line is a separate task. Empty lines and comments (#) are skipped.
44
+ */
45
+ export declare function parseTasks(input: string): string[];
46
+ //# sourceMappingURL=task-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-queue.d.ts","sourceRoot":"","sources":["../../../src/core/workflow/task-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,2CAA2C;AAC3C,MAAM,WAAW,UAAU;IACvB,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IACnE,wCAAwC;IACxC,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wCAAwC;AACxC,MAAM,WAAW,YAAY;IACzB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,yCAAyC;IACzC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,uCAAuC;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAgE/E;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAKlD"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Task queue — manages multiple workflow tasks in sequence.
3
+ *
4
+ * Allows users to feed multiple tasks at once. The queue processes
5
+ * them one by one, tracking results and continuing on failure.
6
+ *
7
+ * Dependency direction: task-queue.ts → workflow/runner, core/errors, utils
8
+ * Used by: cli/commands/run.ts (batch mode)
9
+ */
10
+ import chalk from 'chalk';
11
+ import { runWorkflow } from './runner.js';
12
+ import { logger } from '../../utils/logger.js';
13
+ /**
14
+ * Run multiple tasks in sequence.
15
+ *
16
+ * Returns the queue with all results after completion.
17
+ */
18
+ export async function runTaskQueue(options) {
19
+ const { projectRoot, tasks, auto = false, stopOnFailure = false } = options;
20
+ const queue = tasks.map(task => ({
21
+ task,
22
+ status: 'pending',
23
+ }));
24
+ logger.header('AI Workflow — Task Queue');
25
+ console.log(chalk.gray(`${queue.length} task(s) queued`));
26
+ if (auto)
27
+ console.log(chalk.yellow('⚡ Autonomous mode'));
28
+ console.log();
29
+ for (let i = 0; i < queue.length; i++) {
30
+ const item = queue[i];
31
+ console.log(chalk.bold(`\n── Task ${i + 1}/${queue.length} ──`));
32
+ console.log(chalk.gray(item.task));
33
+ console.log();
34
+ item.status = 'running';
35
+ const startTime = Date.now();
36
+ try {
37
+ const result = await runWorkflow({
38
+ projectRoot,
39
+ task: item.task,
40
+ auto,
41
+ });
42
+ item.result = result;
43
+ item.duration = Date.now() - startTime;
44
+ if (result.state === 'failed') {
45
+ item.status = 'failed';
46
+ item.error = 'Workflow ended in failed state';
47
+ if (stopOnFailure) {
48
+ // Mark remaining tasks as skipped
49
+ for (let j = i + 1; j < queue.length; j++) {
50
+ queue[j].status = 'skipped';
51
+ }
52
+ break;
53
+ }
54
+ }
55
+ else {
56
+ item.status = 'completed';
57
+ }
58
+ }
59
+ catch (err) {
60
+ item.status = 'failed';
61
+ item.error = err instanceof Error ? err.message : String(err);
62
+ item.duration = Date.now() - startTime;
63
+ if (stopOnFailure) {
64
+ for (let j = i + 1; j < queue.length; j++) {
65
+ queue[j].status = 'skipped';
66
+ }
67
+ break;
68
+ }
69
+ }
70
+ }
71
+ // Print queue summary
72
+ printQueueSummary(queue);
73
+ return queue;
74
+ }
75
+ /**
76
+ * Parse a task list from a file or string.
77
+ * Each line is a separate task. Empty lines and comments (#) are skipped.
78
+ */
79
+ export function parseTasks(input) {
80
+ return input
81
+ .split('\n')
82
+ .map(line => line.trim())
83
+ .filter(line => line.length > 0 && !line.startsWith('#'));
84
+ }
85
+ /** Print a colored summary of the queue results. */
86
+ function printQueueSummary(queue) {
87
+ console.log();
88
+ logger.header('Queue Summary');
89
+ const completed = queue.filter(t => t.status === 'completed').length;
90
+ const failed = queue.filter(t => t.status === 'failed').length;
91
+ const skipped = queue.filter(t => t.status === 'skipped').length;
92
+ for (const item of queue) {
93
+ const icon = item.status === 'completed' ? chalk.green('✔')
94
+ : item.status === 'failed' ? chalk.red('✘')
95
+ : item.status === 'skipped' ? chalk.gray('○')
96
+ : chalk.yellow('…');
97
+ const duration = item.duration ? chalk.gray(` (${(item.duration / 1000).toFixed(1)}s)`) : '';
98
+ console.log(` ${icon} ${item.task}${duration}`);
99
+ if (item.error) {
100
+ console.log(chalk.red(` Error: ${item.error}`));
101
+ }
102
+ }
103
+ console.log();
104
+ console.log(chalk.bold(` ${completed} completed, ${failed} failed, ${skipped} skipped`));
105
+ }
106
+ //# sourceMappingURL=task-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-queue.js","sourceRoot":"","sources":["../../../src/core/workflow/task-queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Test runner — executes project tests and captures results.
3
+ *
4
+ * Runs the configured test command (e.g., `pnpm test`) and returns
5
+ * whether tests passed and the output.
6
+ *
7
+ * Dependency direction: test-runner.ts → execa, core/errors, utils
8
+ * Used by: workflow runner
9
+ */
10
+ export interface TestResult {
11
+ /** Whether all tests passed. */
12
+ passed: boolean;
13
+ /** Stdout + stderr from the test command. */
14
+ output: string;
15
+ /** Exit code of the test command. */
16
+ exitCode: number;
17
+ }
18
+ /**
19
+ * Run the project's test suite.
20
+ *
21
+ * @param projectRoot - Root directory of the project
22
+ * @param testCommand - The test command to run (default: 'pnpm test')
23
+ */
24
+ export declare function runTests(projectRoot: string, testCommand?: string): Promise<TestResult>;
25
+ //# sourceMappingURL=test-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../../../src/core/workflow/test-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,MAAM,WAAW,UAAU;IACvB,gCAAgC;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAsB,QAAQ,CAC1B,WAAW,EAAE,MAAM,EACnB,WAAW,GAAE,MAAoB,GAClC,OAAO,CAAC,UAAU,CAAC,CAmCrB"}