sequant 1.0.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 (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +237 -0
  3. package/dist/bin/cli.d.ts +8 -0
  4. package/dist/bin/cli.d.ts.map +1 -0
  5. package/dist/bin/cli.js +70 -0
  6. package/dist/bin/cli.js.map +1 -0
  7. package/dist/src/commands/doctor.d.ts +8 -0
  8. package/dist/src/commands/doctor.d.ts.map +1 -0
  9. package/dist/src/commands/doctor.js +171 -0
  10. package/dist/src/commands/doctor.js.map +1 -0
  11. package/dist/src/commands/init.d.ts +11 -0
  12. package/dist/src/commands/init.d.ts.map +1 -0
  13. package/dist/src/commands/init.js +124 -0
  14. package/dist/src/commands/init.js.map +1 -0
  15. package/dist/src/commands/run.d.ts +18 -0
  16. package/dist/src/commands/run.d.ts.map +1 -0
  17. package/dist/src/commands/run.js +229 -0
  18. package/dist/src/commands/run.js.map +1 -0
  19. package/dist/src/commands/status.d.ts +5 -0
  20. package/dist/src/commands/status.d.ts.map +1 -0
  21. package/dist/src/commands/status.js +45 -0
  22. package/dist/src/commands/status.js.map +1 -0
  23. package/dist/src/commands/update.d.ts +10 -0
  24. package/dist/src/commands/update.d.ts.map +1 -0
  25. package/dist/src/commands/update.js +124 -0
  26. package/dist/src/commands/update.js.map +1 -0
  27. package/dist/src/index.d.ts +15 -0
  28. package/dist/src/index.d.ts.map +1 -0
  29. package/dist/src/index.js +13 -0
  30. package/dist/src/index.js.map +1 -0
  31. package/dist/src/lib/fs.d.ts +10 -0
  32. package/dist/src/lib/fs.d.ts.map +1 -0
  33. package/dist/src/lib/fs.js +44 -0
  34. package/dist/src/lib/fs.js.map +1 -0
  35. package/dist/src/lib/manifest.d.ts +14 -0
  36. package/dist/src/lib/manifest.d.ts.map +1 -0
  37. package/dist/src/lib/manifest.js +37 -0
  38. package/dist/src/lib/manifest.js.map +1 -0
  39. package/dist/src/lib/stacks.d.ts +22 -0
  40. package/dist/src/lib/stacks.d.ts.map +1 -0
  41. package/dist/src/lib/stacks.js +131 -0
  42. package/dist/src/lib/stacks.js.map +1 -0
  43. package/dist/src/lib/templates.d.ts +16 -0
  44. package/dist/src/lib/templates.d.ts.map +1 -0
  45. package/dist/src/lib/templates.js +118 -0
  46. package/dist/src/lib/templates.js.map +1 -0
  47. package/dist/src/lib/workflow/cli-args.d.ts +138 -0
  48. package/dist/src/lib/workflow/cli-args.d.ts.map +1 -0
  49. package/dist/src/lib/workflow/cli-args.js +210 -0
  50. package/dist/src/lib/workflow/cli-args.js.map +1 -0
  51. package/dist/src/lib/workflow/execute-issues.d.ts +42 -0
  52. package/dist/src/lib/workflow/execute-issues.d.ts.map +1 -0
  53. package/dist/src/lib/workflow/execute-issues.js +463 -0
  54. package/dist/src/lib/workflow/execute-issues.js.map +1 -0
  55. package/dist/src/lib/workflow/logger.d.ts +168 -0
  56. package/dist/src/lib/workflow/logger.d.ts.map +1 -0
  57. package/dist/src/lib/workflow/logger.js +249 -0
  58. package/dist/src/lib/workflow/logger.js.map +1 -0
  59. package/dist/src/lib/workflow/types.d.ts +89 -0
  60. package/dist/src/lib/workflow/types.d.ts.map +1 -0
  61. package/dist/src/lib/workflow/types.js +23 -0
  62. package/dist/src/lib/workflow/types.js.map +1 -0
  63. package/package.json +69 -0
  64. package/stacks/go.yaml +22 -0
  65. package/stacks/nextjs.yaml +28 -0
  66. package/stacks/python.yaml +24 -0
  67. package/stacks/rust.yaml +23 -0
  68. package/templates/hooks/post-tool.sh +301 -0
  69. package/templates/hooks/pre-tool.sh +350 -0
  70. package/templates/memory/constitution.md +60 -0
  71. package/templates/scripts/cleanup-worktree.sh +78 -0
  72. package/templates/scripts/list-worktrees.sh +50 -0
  73. package/templates/scripts/new-feature.sh +156 -0
  74. package/templates/settings.json +26 -0
  75. package/templates/skills/assess/SKILL.md +428 -0
  76. package/templates/skills/clean/SKILL.md +196 -0
  77. package/templates/skills/docs/SKILL.md +323 -0
  78. package/templates/skills/exec/SKILL.md +426 -0
  79. package/templates/skills/fullsolve/SKILL.md +479 -0
  80. package/templates/skills/loop/SKILL.md +310 -0
  81. package/templates/skills/qa/SKILL.md +261 -0
  82. package/templates/skills/qa/references/code-quality-exemplars.md +112 -0
  83. package/templates/skills/qa/references/code-review-checklist.md +77 -0
  84. package/templates/skills/qa/references/quality-gates.md +95 -0
  85. package/templates/skills/qa/references/testing-requirements.md +109 -0
  86. package/templates/skills/qa/scripts/quality-checks.sh +109 -0
  87. package/templates/skills/reflect/SKILL.md +159 -0
  88. package/templates/skills/reflect/references/documentation-tiers.md +70 -0
  89. package/templates/skills/reflect/references/phase-reflection.md +95 -0
  90. package/templates/skills/reflect/scripts/workflow-queries.ts +165 -0
  91. package/templates/skills/security-review/SKILL.md +344 -0
  92. package/templates/skills/security-review/references/security-checklists.md +377 -0
  93. package/templates/skills/solve/SKILL.md +242 -0
  94. package/templates/skills/spec/SKILL.md +169 -0
  95. package/templates/skills/spec/references/parallel-groups.md +72 -0
  96. package/templates/skills/spec/references/verification-criteria.md +104 -0
  97. package/templates/skills/test/SKILL.md +508 -0
  98. package/templates/skills/testgen/SKILL.md +561 -0
  99. package/templates/skills/verify/SKILL.md +266 -0
@@ -0,0 +1,463 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * execute-issues.ts - TypeScript Claude Code Workflow Automation
4
+ *
5
+ * Executes /spec → /exec → /test → /qa workflow for GitHub issues.
6
+ * TypeScript port of scripts/execute-issues.sh with added features.
7
+ *
8
+ * Usage:
9
+ * npx tsx --env-file=.env.local scripts/dev/execute-issues.ts 123 # Single issue
10
+ * npx tsx --env-file=.env.local scripts/dev/execute-issues.ts 123 124 125 # Multiple parallel
11
+ * PHASES=exec,qa npx tsx --env-file=.env.local scripts/dev/execute-issues.ts 123 # Custom phases
12
+ * PHASES=spec,testgen,exec,qa npx tsx --env-file=.env.local scripts/dev/execute-issues.ts 123 # With test generation
13
+ * npx tsx --env-file=.env.local scripts/dev/execute-issues.ts --batch "123 124" --batch "125 126"
14
+ * npx tsx --env-file=.env.local scripts/dev/execute-issues.ts --sequential 123 124 125 # Respect dependencies
15
+ * QUALITY_LOOP=true npx tsx --env-file=.env.local scripts/dev/execute-issues.ts 123 # Auto-iterate
16
+ * npx tsx scripts/dev/execute-issues.ts --test # Run quick validation tests
17
+ * npx tsx scripts/dev/execute-issues.ts --cleanup-orphans # Clean stale runs
18
+ *
19
+ * Important:
20
+ * Use --env-file=.env.local to enable database logging to workflow_runs table.
21
+ * Without this flag, workflow runs will not be recorded (warning shown at startup).
22
+ *
23
+ * Environment Variables:
24
+ * PHASES - Comma-separated phases (default: spec,exec,qa)
25
+ * Available: spec, testgen, exec, test, qa, loop
26
+ * Note: testgen requires /spec to have run first with verification criteria
27
+ * PHASE_TIMEOUT - Timeout in seconds per phase (default: 1800)
28
+ * QUALITY_LOOP - Enable auto-iteration (default: false). Auto-includes testgen phase.
29
+ * MAX_ITERATIONS - Max fix iterations per phase (default: 3)
30
+ * SKIP_VERIFICATION - Skip /exec verification (default: false)
31
+ *
32
+ * Features:
33
+ * - Auto-detect UI issues for /test inclusion
34
+ * - Optional /testgen phase for shift-left testing (requires /spec comment)
35
+ * - Dependency detection and sequential execution (#355)
36
+ * - Quality loop mode with /loop iterations
37
+ * - Post-exec verification to catch hallucinated implementations
38
+ * - Structured logging to workflow_runs table
39
+ * - Crash cleanup for orphaned runs
40
+ */
41
+ import { createLogger } from "../lib/logger";
42
+ import { isHelpRequested, printUsage } from "../lib/cli-args";
43
+ import { DEFAULT_CONFIG } from "./lib/types";
44
+ import { runIssue, formatDuration } from "./lib/issue-executor";
45
+ import { cleanupOrphanedRuns, markAllActiveRunsFailed, canLogToSupabase, } from "./lib/workflow-tracker";
46
+ import { buildDependencyGraph, hasInterdependencies, formatDependencyGraph, } from "./lib/dependency-detector";
47
+ import { runWithListr, isTTY } from "./lib/task-renderer";
48
+ // =====================================================
49
+ // CLI PARSING
50
+ // =====================================================
51
+ /**
52
+ * Parse CLI arguments
53
+ */
54
+ function parseExecuteIssuesArgs(argv) {
55
+ const args = {
56
+ issues: [],
57
+ batches: [],
58
+ test: false,
59
+ help: false,
60
+ sequential: false,
61
+ forceParallel: false,
62
+ qualityLoop: process.env.QUALITY_LOOP === "true",
63
+ skipVerification: process.env.SKIP_VERIFICATION === "true",
64
+ verbose: false,
65
+ noSmartTests: false,
66
+ };
67
+ let i = 0;
68
+ while (i < argv.length) {
69
+ const arg = argv[i];
70
+ if (arg === "--help" || arg === "-h") {
71
+ args.help = true;
72
+ i++;
73
+ continue;
74
+ }
75
+ if (arg === "--test") {
76
+ args.test = true;
77
+ i++;
78
+ continue;
79
+ }
80
+ if (arg === "--cleanup-orphans") {
81
+ const next = argv[i + 1];
82
+ if (next && !next.startsWith("-") && /^\d+$/.test(next)) {
83
+ args.cleanupOrphans = parseInt(next, 10);
84
+ i += 2;
85
+ }
86
+ else {
87
+ args.cleanupOrphans = true;
88
+ i++;
89
+ }
90
+ continue;
91
+ }
92
+ if (arg === "--batch") {
93
+ const next = argv[i + 1];
94
+ if (!next) {
95
+ console.error("Error: --batch requires an argument");
96
+ process.exit(1);
97
+ }
98
+ const issues = next
99
+ .split(/\s+/)
100
+ .map((n) => parseInt(n, 10))
101
+ .filter((n) => !isNaN(n));
102
+ args.batches.push({
103
+ batchNumber: args.batches.length + 1,
104
+ issues,
105
+ });
106
+ i += 2;
107
+ continue;
108
+ }
109
+ if (arg === "--sequential") {
110
+ args.sequential = true;
111
+ i++;
112
+ continue;
113
+ }
114
+ if (arg === "--force-parallel") {
115
+ args.forceParallel = true;
116
+ i++;
117
+ continue;
118
+ }
119
+ if (arg === "--phases") {
120
+ const next = argv[i + 1];
121
+ if (next) {
122
+ args.phases = next.split(",").map((p) => p.trim());
123
+ i += 2;
124
+ }
125
+ else {
126
+ i++;
127
+ }
128
+ continue;
129
+ }
130
+ if (arg === "--timeout") {
131
+ const next = argv[i + 1];
132
+ if (next && /^\d+$/.test(next)) {
133
+ args.timeout = parseInt(next, 10);
134
+ i += 2;
135
+ }
136
+ else {
137
+ i++;
138
+ }
139
+ continue;
140
+ }
141
+ if (arg === "--max-iterations") {
142
+ const next = argv[i + 1];
143
+ if (next && /^\d+$/.test(next)) {
144
+ args.maxIterations = parseInt(next, 10);
145
+ i += 2;
146
+ }
147
+ else {
148
+ i++;
149
+ }
150
+ continue;
151
+ }
152
+ if (arg === "--quality-loop") {
153
+ args.qualityLoop = true;
154
+ i++;
155
+ continue;
156
+ }
157
+ if (arg === "--skip-verification") {
158
+ args.skipVerification = true;
159
+ i++;
160
+ continue;
161
+ }
162
+ if (arg === "--no-smart-tests") {
163
+ args.noSmartTests = true;
164
+ i++;
165
+ continue;
166
+ }
167
+ if (arg === "--verbose" || arg === "-v") {
168
+ args.verbose = true;
169
+ i++;
170
+ continue;
171
+ }
172
+ // Positional - issue number
173
+ const issueNum = parseInt(arg, 10);
174
+ if (!isNaN(issueNum)) {
175
+ args.issues.push(issueNum);
176
+ }
177
+ i++;
178
+ }
179
+ return args;
180
+ }
181
+ /**
182
+ * Build config from args and environment
183
+ */
184
+ function buildConfig(args) {
185
+ const config = { ...DEFAULT_CONFIG };
186
+ // Phases from args or env
187
+ if (args.phases) {
188
+ config.phases = args.phases;
189
+ }
190
+ else if (process.env.PHASES) {
191
+ config.phases = process.env.PHASES.split(",").map((p) => p.trim());
192
+ }
193
+ // Timeout
194
+ if (args.timeout !== undefined) {
195
+ config.phaseTimeout = args.timeout;
196
+ }
197
+ else if (process.env.PHASE_TIMEOUT) {
198
+ config.phaseTimeout = parseInt(process.env.PHASE_TIMEOUT, 10);
199
+ }
200
+ // Quality loop
201
+ config.qualityLoop = args.qualityLoop;
202
+ // If quality loop enabled, auto-include testgen after spec phase
203
+ if (config.qualityLoop && !config.phases.includes("testgen")) {
204
+ const specIndex = config.phases.indexOf("spec");
205
+ if (specIndex !== -1) {
206
+ config.phases.splice(specIndex + 1, 0, "testgen");
207
+ }
208
+ }
209
+ // Max iterations
210
+ if (args.maxIterations !== undefined) {
211
+ config.maxIterations = args.maxIterations;
212
+ }
213
+ else if (process.env.MAX_ITERATIONS) {
214
+ config.maxIterations = parseInt(process.env.MAX_ITERATIONS, 10);
215
+ }
216
+ // Skip verification
217
+ config.skipVerification = args.skipVerification;
218
+ // Sequential mode
219
+ config.sequential = args.sequential;
220
+ config.forceParallel = args.forceParallel;
221
+ // Verbose
222
+ config.verbose = args.verbose;
223
+ // Smart tests (enabled by default, --no-smart-tests disables)
224
+ config.noSmartTests = args.noSmartTests;
225
+ return config;
226
+ }
227
+ // =====================================================
228
+ // EXECUTION MODES
229
+ // =====================================================
230
+ /**
231
+ * Run issues in parallel with listr2 rendering
232
+ *
233
+ * Uses listr2 for TTY environments to provide:
234
+ * - Spinner animation while tasks are running
235
+ * - Checkmark/X when tasks complete
236
+ * - Duration display after completion
237
+ * - Non-interleaved output in parallel execution
238
+ *
239
+ * Falls back to simple renderer for non-TTY (CI) environments.
240
+ */
241
+ async function runParallel(issues, config, log) {
242
+ // Use listr2 for parallel execution with proper rendering
243
+ const results = await runWithListr(issues, async (issueNumber, execConfig) => {
244
+ // Create a silent logger for listr2 execution
245
+ // (listr2 handles the visual output, we suppress console logs)
246
+ const silentLog = createLogger({ silent: true });
247
+ return runIssue(issueNumber, execConfig, silentLog);
248
+ }, config, {
249
+ verbose: config.verbose,
250
+ forceNonTTY: !isTTY(),
251
+ });
252
+ return results;
253
+ }
254
+ /**
255
+ * Run issues sequentially (respecting dependencies)
256
+ */
257
+ async function runSequential(issues, config, log) {
258
+ const graph = await buildDependencyGraph(issues);
259
+ if (graph.hasCycles) {
260
+ log.error("Dependency cycle detected! Cannot run sequentially.");
261
+ log.error(formatDependencyGraph(graph));
262
+ return [];
263
+ }
264
+ const order = graph.sortedOrder ?? issues;
265
+ log.info(`Sequential execution order: ${order.map((n) => `#${n}`).join(" → ")}`);
266
+ const results = [];
267
+ for (const issue of order) {
268
+ log.info(`\n${"─".repeat(40)}`);
269
+ const result = await runIssue(issue, config, log);
270
+ results.push(result);
271
+ // If this issue failed and others depend on it, warn
272
+ if (!result.success) {
273
+ const dependents = issues.filter((i) => {
274
+ const deps = graph.edges.get(i);
275
+ return deps && deps.includes(issue);
276
+ });
277
+ if (dependents.length > 0) {
278
+ log.warn(`Issue #${issue} failed. Dependent issues affected: ${dependents.map((d) => `#${d}`).join(", ")}`);
279
+ }
280
+ }
281
+ }
282
+ return results;
283
+ }
284
+ /**
285
+ * Run batches sequentially, issues within batch in parallel
286
+ */
287
+ async function runBatches(batches, config, log) {
288
+ const results = [];
289
+ for (const batch of batches) {
290
+ log.info(`\n${"━".repeat(40)}`);
291
+ log.info(`BATCH ${batch.batchNumber}`);
292
+ log.info(`${"━".repeat(40)}`);
293
+ const issueResults = await runParallel(batch.issues, config, log);
294
+ results.push({
295
+ batchNumber: batch.batchNumber,
296
+ issueResults,
297
+ success: issueResults.every((r) => r.success),
298
+ });
299
+ log.info(`\n⏳ Waiting for BATCH ${batch.batchNumber} to complete...`);
300
+ log.success(`✓ BATCH ${batch.batchNumber} Complete`);
301
+ }
302
+ return results;
303
+ }
304
+ // =====================================================
305
+ // MAIN
306
+ // =====================================================
307
+ async function main() {
308
+ const argv = process.argv.slice(2);
309
+ const args = parseExecuteIssuesArgs(argv);
310
+ // Help
311
+ if (args.help || isHelpRequested(argv)) {
312
+ printUsage("execute-issues.ts", "Execute Claude Code workflow (/spec → /exec → /qa) for GitHub issues.", {
313
+ "<issue_numbers>": "Issue numbers to process (space-separated)",
314
+ '--batch "N M"': "Run issues N and M as a batch (repeatable)",
315
+ "--sequential": "Run issues sequentially, respecting dependencies (#355)",
316
+ "--force-parallel": "Force parallel even if dependencies detected",
317
+ "--cleanup-orphans [hours]": "Mark stale runs (>N hours old) as failed (default: 2)",
318
+ "--test": "Run quick validation tests (no Claude calls)",
319
+ "--phases <list>": "Phases to run (default: spec,exec,qa). Available: spec,testgen,exec,test,qa,loop",
320
+ "--timeout <seconds>": "Timeout per phase (default: 1800)",
321
+ "--quality-loop": "Enable auto-iteration with /loop (auto-includes testgen phase)",
322
+ "--max-iterations <n>": "Max fix iterations per phase (default: 3)",
323
+ "--skip-verification": "Skip /exec verification",
324
+ "--no-smart-tests": "Disable smart tests (auto-run tests after file edits)",
325
+ "--verbose, -v": "Verbose output",
326
+ "--help, -h": "Show this help message",
327
+ }, [
328
+ "npx tsx --env-file=.env.local scripts/dev/execute-issues.ts 123",
329
+ "npx tsx --env-file=.env.local scripts/dev/execute-issues.ts 123 124 125",
330
+ "PHASES=exec,qa npx tsx --env-file=.env.local scripts/dev/execute-issues.ts 123",
331
+ "PHASES=spec,testgen,exec,qa npx tsx --env-file=.env.local scripts/dev/execute-issues.ts 123 # With test stubs",
332
+ 'npx tsx --env-file=.env.local scripts/dev/execute-issues.ts --batch "123 124" --batch "125 126"',
333
+ "npx tsx --env-file=.env.local scripts/dev/execute-issues.ts --sequential 123 124 125",
334
+ "QUALITY_LOOP=true npx tsx --env-file=.env.local scripts/dev/execute-issues.ts 123 # Runs spec,testgen,exec,qa",
335
+ "npx tsx scripts/dev/execute-issues.ts --cleanup-orphans",
336
+ "npx tsx scripts/dev/execute-issues.ts --test",
337
+ ]);
338
+ process.exit(0);
339
+ }
340
+ const config = buildConfig(args);
341
+ const log = createLogger({ verbose: config.verbose });
342
+ // Register crash cleanup
343
+ const cleanup = async () => {
344
+ await markAllActiveRunsFailed("process_crash", "Script interrupted");
345
+ process.exit(1);
346
+ };
347
+ process.on("SIGINT", cleanup);
348
+ process.on("SIGTERM", cleanup);
349
+ // Test mode
350
+ if (args.test) {
351
+ log.info("🧪 Running validation tests...");
352
+ // Import and run tests dynamically
353
+ try {
354
+ const { runWorkflowTests } = await import("./lib/test-runner");
355
+ const passed = await runWorkflowTests();
356
+ process.exit(passed ? 0 : 1);
357
+ }
358
+ catch {
359
+ log.warn("Test runner not implemented yet");
360
+ process.exit(0);
361
+ }
362
+ }
363
+ // Cleanup orphans mode
364
+ if (args.cleanupOrphans !== undefined) {
365
+ const hours = typeof args.cleanupOrphans === "number" ? args.cleanupOrphans : 2;
366
+ await cleanupOrphanedRuns(hours);
367
+ process.exit(0);
368
+ }
369
+ // Validate we have issues
370
+ const allIssues = args.batches.length > 0
371
+ ? args.batches.flatMap((b) => b.issues)
372
+ : args.issues;
373
+ if (allIssues.length === 0) {
374
+ log.error("Error: No issues specified\n");
375
+ printUsage("execute-issues.ts", "", {}, []);
376
+ process.exit(1);
377
+ }
378
+ log.success("🚀 Claude Code Workflow Execution\n");
379
+ // Warn if database logging is disabled
380
+ if (!canLogToSupabase()) {
381
+ log.warn("⚠️ Database logging disabled (missing SUPABASE_SERVICE_ROLE_KEY)");
382
+ console.log("");
383
+ }
384
+ // Always cleanup orphans first
385
+ if (canLogToSupabase()) {
386
+ await cleanupOrphanedRuns();
387
+ console.log("");
388
+ }
389
+ // Check for dependencies if running multiple issues
390
+ if (allIssues.length > 1 && !config.sequential && !config.forceParallel) {
391
+ const graph = await buildDependencyGraph(allIssues);
392
+ if (hasInterdependencies(graph)) {
393
+ log.warn("⚠️ Dependencies detected between issues!");
394
+ log.info(formatDependencyGraph(graph));
395
+ log.info("");
396
+ if (graph.hasCycles) {
397
+ log.error("Cannot proceed: dependency cycle detected.");
398
+ log.info("Please resolve the cycle or use --force-parallel to ignore.");
399
+ process.exit(1);
400
+ }
401
+ log.info("Options:");
402
+ log.info(" 1. Use --sequential to respect dependency order");
403
+ log.info(" 2. Use --force-parallel to ignore dependencies");
404
+ log.info("");
405
+ log.info("Exiting. Re-run with one of the above options.");
406
+ process.exit(1);
407
+ }
408
+ }
409
+ // Execute
410
+ let results;
411
+ if (args.batches.length > 0) {
412
+ // Batch mode
413
+ const batchResults = await runBatches(args.batches, config, log);
414
+ results = batchResults.flatMap((b) => b.issueResults);
415
+ }
416
+ else if (config.sequential) {
417
+ // Sequential mode
418
+ results = await runSequential(args.issues, config, log);
419
+ }
420
+ else {
421
+ // Parallel mode
422
+ results = await runParallel(args.issues, config, log);
423
+ }
424
+ // Summary
425
+ console.log("");
426
+ log.success("━".repeat(60));
427
+ log.success("✓ All Issues Processed!");
428
+ log.success("━".repeat(60));
429
+ console.log("");
430
+ // Show results summary
431
+ const passed = results.filter((r) => r.success).length;
432
+ const failed = results.filter((r) => !r.success).length;
433
+ log.info(`Results: ${passed} passed, ${failed} failed`);
434
+ for (const result of results) {
435
+ const status = result.success ? "✅" : "❌";
436
+ const phases = result.phaseResults
437
+ .map((p) => {
438
+ const pStatus = p.success ? "✓" : "✗";
439
+ const duration = p.durationSeconds
440
+ ? `(${formatDuration(p.durationSeconds)})`
441
+ : "";
442
+ return `${p.phase}:${pStatus}${duration}`;
443
+ })
444
+ .join(" ");
445
+ log.info(` ${status} #${result.issueNumber}: ${phases}`);
446
+ if (result.abortReason) {
447
+ log.info(` Abort: ${result.abortReason}`);
448
+ }
449
+ if (result.loopTriggered) {
450
+ log.info(` Quality loop triggered`);
451
+ }
452
+ }
453
+ console.log("");
454
+ log.info("📝 Logs: /tmp/claude-issue-*.log | 📦 Archived: /tmp/claude-logs/");
455
+ log.info("Next: Review logs → Check GitHub comments → Review and merge PRs");
456
+ // Exit with error if any failed
457
+ process.exit(failed > 0 ? 1 : 0);
458
+ }
459
+ main().catch((err) => {
460
+ console.error("Fatal error:", err);
461
+ markAllActiveRunsFailed("process_crash", err.message).then(() => process.exit(1));
462
+ });
463
+ //# sourceMappingURL=execute-issues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-issues.js","sourceRoot":"","sources":["../../../../src/lib/workflow/execute-issues.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Structured Logger for Pipeline Scripts
3
+ *
4
+ * Provides log levels with emoji prefixes for visual scanning in terminal output.
5
+ * Supports verbose mode integration with CLI arguments.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { createLogger } from './lib/logger'
10
+ *
11
+ * const log = createLogger({ verbose: args.verbose })
12
+ *
13
+ * log.debug('Processing item', { id: 123 }) // Only shown in verbose mode
14
+ * log.info('Starting process')
15
+ * log.success('Completed successfully')
16
+ * log.warn('Missing optional field')
17
+ * log.error('Failed to connect', error)
18
+ * ```
19
+ */
20
+ /**
21
+ * Log levels in order of severity.
22
+ */
23
+ export type LogLevel = "debug" | "info" | "success" | "warn" | "error";
24
+ /**
25
+ * Logger configuration options.
26
+ */
27
+ export interface LoggerOptions {
28
+ /** Enable debug level logging (default: false) */
29
+ verbose?: boolean;
30
+ /** Suppress all console output (default: false). Useful when another renderer (e.g., listr2) controls the terminal. */
31
+ silent?: boolean;
32
+ /** Custom output function (default: console.log) */
33
+ output?: (message: string) => void;
34
+ /** Custom error output function (default: console.error) */
35
+ errorOutput?: (message: string) => void;
36
+ /** Include timestamps in log messages (default: false) */
37
+ timestamps?: boolean;
38
+ }
39
+ /**
40
+ * Logger interface with methods for each log level.
41
+ */
42
+ export interface Logger {
43
+ /** Debug-level logging (only shown when verbose is true) */
44
+ debug(message: string, data?: unknown): void;
45
+ /** Info-level logging */
46
+ info(message: string, data?: unknown): void;
47
+ /** Success-level logging */
48
+ success(message: string, data?: unknown): void;
49
+ /** Warning-level logging */
50
+ warn(message: string, data?: unknown): void;
51
+ /** Error-level logging */
52
+ error(message: string, data?: unknown): void;
53
+ /** Log at a specific level */
54
+ log(level: LogLevel, message: string, data?: unknown): void;
55
+ /** Create a child logger with a prefix */
56
+ child(prefix: string): Logger;
57
+ /** Check if verbose mode is enabled */
58
+ isVerbose(): boolean;
59
+ }
60
+ /**
61
+ * Create a structured logger with configurable options.
62
+ *
63
+ * @param options - Logger configuration
64
+ * @returns A Logger instance
65
+ *
66
+ * @example
67
+ * ```typescript
68
+ * // Basic usage
69
+ * const log = createLogger()
70
+ * log.info('Hello')
71
+ *
72
+ * // With verbose mode
73
+ * const verboseLog = createLogger({ verbose: true })
74
+ * verboseLog.debug('Debug info') // Now visible
75
+ *
76
+ * // With timestamps
77
+ * const timedLog = createLogger({ timestamps: true })
78
+ * timedLog.info('With time') // [12:34:56] ℹ️ With time
79
+ *
80
+ * // Child logger with prefix
81
+ * const childLog = log.child('discovery')
82
+ * childLog.info('Finding shops') // ℹ️ [discovery] Finding shops
83
+ * ```
84
+ */
85
+ export declare function createLogger(options?: LoggerOptions): Logger;
86
+ /**
87
+ * Default logger instance (non-verbose).
88
+ * Use `createLogger({ verbose: true })` for verbose mode.
89
+ */
90
+ export declare const defaultLogger: Logger;
91
+ /**
92
+ * Quick logging functions using the default logger.
93
+ * For scripts that don't need verbose mode configuration.
94
+ *
95
+ * @example
96
+ * ```typescript
97
+ * import { log } from './lib/logger'
98
+ *
99
+ * log.info('Starting')
100
+ * log.success('Done')
101
+ * ```
102
+ */
103
+ export declare const log: Logger;
104
+ /**
105
+ * Create a logger that logs to an array for testing.
106
+ *
107
+ * @returns Object with logger and captured messages
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * const { logger, messages } = createTestLogger()
112
+ * logger.info('test')
113
+ * expect(messages).toContain(expect.stringContaining('test'))
114
+ * ```
115
+ */
116
+ export declare function createTestLogger(options?: Omit<LoggerOptions, "output" | "errorOutput">): {
117
+ logger: Logger;
118
+ messages: string[];
119
+ errors: string[];
120
+ };
121
+ /**
122
+ * Log a step in a multi-step process.
123
+ *
124
+ * @param step - Current step number
125
+ * @param total - Total number of steps
126
+ * @param message - Step description
127
+ *
128
+ * @example
129
+ * ```typescript
130
+ * logStep(1, 3, 'Fetching data')
131
+ * // Output: ℹ️ [1/3] Fetching data
132
+ * ```
133
+ */
134
+ export declare function logStep(step: number, total: number, message: string): void;
135
+ /**
136
+ * Log a progress update within a step.
137
+ *
138
+ * @param current - Current progress
139
+ * @param total - Total items
140
+ * @param message - Progress description
141
+ *
142
+ * @example
143
+ * ```typescript
144
+ * logProgress(5, 10, 'Processing shops')
145
+ * // Output: → 5/10 Processing shops
146
+ * ```
147
+ */
148
+ export declare function logProgress(current: number, total: number, message: string): void;
149
+ /**
150
+ * Log a section header for visual organization.
151
+ *
152
+ * @param title - Section title
153
+ *
154
+ * @example
155
+ * ```typescript
156
+ * logSection('Discovery Results')
157
+ * // Output:
158
+ * // ════════════════════════════════════════
159
+ * // Discovery Results
160
+ * // ════════════════════════════════════════
161
+ * ```
162
+ */
163
+ export declare function logSection(title: string): void;
164
+ /**
165
+ * Log a divider line.
166
+ */
167
+ export declare function logDivider(): void;
168
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../../src/lib/workflow/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,kDAAkD;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,uHAAuH;IACvH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oDAAoD;IACpD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,4DAA4D;IAC5D,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,0DAA0D;IAC1D,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,4DAA4D;IAC5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,yBAAyB;IACzB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,4BAA4B;IAC5B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/C,4BAA4B;IAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,0BAA0B;IAC1B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,8BAA8B;IAC9B,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5D,0CAA0C;IAC1C,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,uCAAuC;IACvC,SAAS,IAAI,OAAO,CAAC;CACtB;AAgED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,MAAM,CA0EhE;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,QAAiB,CAAC;AAE5C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,GAAG,QAAgB,CAAC;AAEjC;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,GAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,GAAG,aAAa,CAAM,GAC1D;IACD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAWA;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,IAAI,CAEN;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAK9C;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC"}