@slope-dev/slope 1.15.0 → 1.16.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 (116) hide show
  1. package/dist/cli/commands/docs.d.ts +5 -0
  2. package/dist/cli/commands/docs.d.ts.map +1 -0
  3. package/dist/cli/commands/docs.js +303 -0
  4. package/dist/cli/commands/docs.js.map +1 -0
  5. package/dist/cli/commands/guard.d.ts.map +1 -1
  6. package/dist/cli/commands/guard.js +2 -0
  7. package/dist/cli/commands/guard.js.map +1 -1
  8. package/dist/cli/commands/init.d.ts.map +1 -1
  9. package/dist/cli/commands/init.js +56 -0
  10. package/dist/cli/commands/init.js.map +1 -1
  11. package/dist/cli/commands/loop.d.ts +2 -0
  12. package/dist/cli/commands/loop.d.ts.map +1 -0
  13. package/dist/cli/commands/loop.js +388 -0
  14. package/dist/cli/commands/loop.js.map +1 -0
  15. package/dist/cli/commands/roadmap.d.ts.map +1 -1
  16. package/dist/cli/commands/roadmap.js +51 -2
  17. package/dist/cli/commands/roadmap.js.map +1 -1
  18. package/dist/cli/commands/session.d.ts.map +1 -1
  19. package/dist/cli/commands/session.js +2 -0
  20. package/dist/cli/commands/session.js.map +1 -1
  21. package/dist/cli/commands/vision.d.ts.map +1 -1
  22. package/dist/cli/commands/vision.js +104 -7
  23. package/dist/cli/commands/vision.js.map +1 -1
  24. package/dist/cli/guards/stop-check.d.ts +5 -0
  25. package/dist/cli/guards/stop-check.d.ts.map +1 -1
  26. package/dist/cli/guards/stop-check.js +72 -5
  27. package/dist/cli/guards/stop-check.js.map +1 -1
  28. package/dist/cli/guards/worktree-check.d.ts +14 -0
  29. package/dist/cli/guards/worktree-check.d.ts.map +1 -0
  30. package/dist/cli/guards/worktree-check.js +137 -0
  31. package/dist/cli/guards/worktree-check.js.map +1 -0
  32. package/dist/cli/index.js +16 -0
  33. package/dist/cli/index.js.map +1 -1
  34. package/dist/cli/loop/analyze.d.ts +8 -0
  35. package/dist/cli/loop/analyze.d.ts.map +1 -0
  36. package/dist/cli/loop/analyze.js +62 -0
  37. package/dist/cli/loop/analyze.js.map +1 -0
  38. package/dist/cli/loop/backlog.d.ts +26 -0
  39. package/dist/cli/loop/backlog.d.ts.map +1 -0
  40. package/dist/cli/loop/backlog.js +95 -0
  41. package/dist/cli/loop/backlog.js.map +1 -0
  42. package/dist/cli/loop/config.d.ts +10 -0
  43. package/dist/cli/loop/config.d.ts.map +1 -0
  44. package/dist/cli/loop/config.js +75 -0
  45. package/dist/cli/loop/config.js.map +1 -0
  46. package/dist/cli/loop/continuous.d.ts +6 -0
  47. package/dist/cli/loop/continuous.d.ts.map +1 -0
  48. package/dist/cli/loop/continuous.js +108 -0
  49. package/dist/cli/loop/continuous.js.map +1 -0
  50. package/dist/cli/loop/executor.d.ts +8 -0
  51. package/dist/cli/loop/executor.d.ts.map +1 -0
  52. package/dist/cli/loop/executor.js +600 -0
  53. package/dist/cli/loop/executor.js.map +1 -0
  54. package/dist/cli/loop/guard-runner.d.ts +14 -0
  55. package/dist/cli/loop/guard-runner.d.ts.map +1 -0
  56. package/dist/cli/loop/guard-runner.js +53 -0
  57. package/dist/cli/loop/guard-runner.js.map +1 -0
  58. package/dist/cli/loop/logger.d.ts +9 -0
  59. package/dist/cli/loop/logger.d.ts.map +1 -0
  60. package/dist/cli/loop/logger.js +37 -0
  61. package/dist/cli/loop/logger.js.map +1 -0
  62. package/dist/cli/loop/model-selector.d.ts +14 -0
  63. package/dist/cli/loop/model-selector.d.ts.map +1 -0
  64. package/dist/cli/loop/model-selector.js +59 -0
  65. package/dist/cli/loop/model-selector.js.map +1 -0
  66. package/dist/cli/loop/parallel.d.ts +6 -0
  67. package/dist/cli/loop/parallel.d.ts.map +1 -0
  68. package/dist/cli/loop/parallel.js +109 -0
  69. package/dist/cli/loop/parallel.js.map +1 -0
  70. package/dist/cli/loop/pr-lifecycle.d.ts +26 -0
  71. package/dist/cli/loop/pr-lifecycle.d.ts.map +1 -0
  72. package/dist/cli/loop/pr-lifecycle.js +244 -0
  73. package/dist/cli/loop/pr-lifecycle.js.map +1 -0
  74. package/dist/cli/loop/types.d.ts +98 -0
  75. package/dist/cli/loop/types.d.ts.map +1 -0
  76. package/dist/cli/loop/types.js +37 -0
  77. package/dist/cli/loop/types.js.map +1 -0
  78. package/dist/cli/loop/worktree.d.ts +30 -0
  79. package/dist/cli/loop/worktree.d.ts.map +1 -0
  80. package/dist/cli/loop/worktree.js +134 -0
  81. package/dist/cli/loop/worktree.js.map +1 -0
  82. package/dist/cli/registry.d.ts.map +1 -1
  83. package/dist/cli/registry.js +3 -0
  84. package/dist/cli/registry.js.map +1 -1
  85. package/dist/core/analyzers/stack.d.ts +2 -0
  86. package/dist/core/analyzers/stack.d.ts.map +1 -1
  87. package/dist/core/analyzers/stack.js +9 -6
  88. package/dist/core/analyzers/stack.js.map +1 -1
  89. package/dist/core/constants.d.ts +2 -0
  90. package/dist/core/constants.d.ts.map +1 -1
  91. package/dist/core/constants.js +2 -0
  92. package/dist/core/constants.js.map +1 -1
  93. package/dist/core/docs.d.ts +50 -0
  94. package/dist/core/docs.d.ts.map +1 -0
  95. package/dist/core/docs.js +67 -0
  96. package/dist/core/docs.js.map +1 -0
  97. package/dist/core/generators/roadmap.d.ts +6 -1
  98. package/dist/core/generators/roadmap.d.ts.map +1 -1
  99. package/dist/core/generators/roadmap.js +150 -0
  100. package/dist/core/generators/roadmap.js.map +1 -1
  101. package/dist/core/guard.d.ts +1 -1
  102. package/dist/core/guard.d.ts.map +1 -1
  103. package/dist/core/guard.js +8 -0
  104. package/dist/core/guard.js.map +1 -1
  105. package/dist/core/index.d.ts +5 -2
  106. package/dist/core/index.d.ts.map +1 -1
  107. package/dist/core/index.js +5 -2
  108. package/dist/core/index.js.map +1 -1
  109. package/dist/core/vision.d.ts +10 -0
  110. package/dist/core/vision.d.ts.map +1 -1
  111. package/dist/core/vision.js +37 -0
  112. package/dist/core/vision.js.map +1 -1
  113. package/dist/mcp/registry.d.ts.map +1 -1
  114. package/dist/mcp/registry.js +29 -0
  115. package/dist/mcp/registry.js.map +1 -1
  116. package/package.json +1 -1
@@ -0,0 +1,600 @@
1
+ import { spawn, execSync, execFileSync } from 'node:child_process';
2
+ import { createInterface } from 'node:readline';
3
+ import { existsSync, readFileSync, mkdirSync, writeFileSync, renameSync, appendFileSync, readdirSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { resolveLoopConfig } from './config.js';
6
+ import { loadBacklog, selectNextSprint, selectSprintById, releaseLock, needsEnrichment, validateTickets } from './backlog.js';
7
+ import { selectModel, selectTimeout, isLocalModel } from './model-selector.js';
8
+ import { createWorktree, refreshIndex, enrichBacklog, removeWorktree, getHeadSha, pushBranch } from './worktree.js';
9
+ import { runGuards } from './guard-runner.js';
10
+ import { checkGhCli, hasCommitsAhead, createPr, runStructuralReview, autoMerge } from './pr-lifecycle.js';
11
+ import { createLogger } from './logger.js';
12
+ let shuttingDown = false;
13
+ const activeChildPids = new Set();
14
+ export function isShuttingDown() {
15
+ return shuttingDown;
16
+ }
17
+ /**
18
+ * Run a single sprint end-to-end.
19
+ * Main entry point for `slope loop run`.
20
+ */
21
+ export async function runSprint(flags, cwd) {
22
+ // Reset shutdown flag (allows continuous loop recovery after transient signals)
23
+ shuttingDown = false;
24
+ const config = resolveLoopConfig(cwd);
25
+ const dryRun = flags['dry-run'] === 'true';
26
+ const mainRepo = cwd;
27
+ mkdirSync(join(cwd, config.resultsDir), { recursive: true });
28
+ mkdirSync(join(cwd, config.logDir), { recursive: true });
29
+ const log = createLogger('loop', join(cwd, config.logDir, 'loop.log'));
30
+ // Signal handling — set flag and kill all active child process groups
31
+ const cleanup = () => {
32
+ shuttingDown = true;
33
+ log.warn('Shutting down...');
34
+ const pidsToKill = [...activeChildPids];
35
+ for (const pid of pidsToKill) {
36
+ try {
37
+ process.kill(-pid, 'SIGTERM');
38
+ }
39
+ catch { /* already gone */ }
40
+ }
41
+ setTimeout(() => {
42
+ for (const pid of pidsToKill) {
43
+ try {
44
+ process.kill(-pid, 'SIGKILL');
45
+ }
46
+ catch { /* ok */ }
47
+ }
48
+ }, 5000);
49
+ };
50
+ process.on('SIGINT', cleanup);
51
+ process.on('SIGTERM', cleanup);
52
+ try {
53
+ const backlog = loadBacklog(cwd, config);
54
+ let sprint;
55
+ if (flags.sprint) {
56
+ const found = selectSprintById(backlog, flags.sprint);
57
+ if (!found)
58
+ throw new Error(`Sprint ${flags.sprint} not found in backlog`);
59
+ sprint = found;
60
+ }
61
+ else {
62
+ const found = selectNextSprint(backlog, cwd, config);
63
+ if (!found) {
64
+ log.info('All sprints completed. Run: slope loop analyze --regenerate');
65
+ return null;
66
+ }
67
+ sprint = found;
68
+ }
69
+ log.info(`=== Starting Sprint: ${sprint.id} — ${sprint.title} ===`);
70
+ log.info(`Strategy: ${sprint.strategy} | Tickets: ${sprint.tickets.length}`);
71
+ if (dryRun) {
72
+ return dryRunSprint(sprint, config, cwd, log);
73
+ }
74
+ // Create worktree
75
+ const wt = createWorktree(sprint.id, mainRepo, log);
76
+ const worktreeCwd = wt.path;
77
+ try {
78
+ refreshIndex(worktreeCwd, log);
79
+ if (needsEnrichment(backlog)) {
80
+ enrichBacklog(config.backlogPath, worktreeCwd, log);
81
+ }
82
+ // Start session
83
+ try {
84
+ execFileSync('pnpm', ['slope', 'session', 'start', `--sprint=${sprint.id}`], { cwd: worktreeCwd, stdio: 'pipe' });
85
+ }
86
+ catch { /* non-blocking */ }
87
+ // Validate tickets
88
+ const validTickets = validateTickets(sprint.tickets, worktreeCwd, log);
89
+ if (validTickets.length === 0) {
90
+ log.warn('All tickets failed validation — skipping sprint');
91
+ return null;
92
+ }
93
+ // Process tickets
94
+ const ticketResults = [];
95
+ for (const ticket of validTickets) {
96
+ if (shuttingDown) {
97
+ log.warn('Shutdown requested — stopping ticket processing');
98
+ break;
99
+ }
100
+ const result = await processTicket(ticket, config, worktreeCwd, log);
101
+ ticketResults.push(result);
102
+ // Log model usage (JSONL)
103
+ const jsonlPath = join(cwd, config.logDir, `${sprint.id}-models.jsonl`);
104
+ try {
105
+ appendFileSync(jsonlPath, JSON.stringify(result) + '\n');
106
+ }
107
+ catch { /* ok */ }
108
+ // Push after each ticket — last push is the recovery point
109
+ pushBranch(wt.branch, worktreeCwd, log);
110
+ }
111
+ // End session
112
+ try {
113
+ execFileSync('pnpm', ['slope', 'session', 'end'], { cwd: worktreeCwd, stdio: 'pipe' });
114
+ }
115
+ catch { /* non-blocking */ }
116
+ // Generate scorecard
117
+ generateScorecard(sprint, wt.branch, worktreeCwd, log);
118
+ // PR lifecycle
119
+ const passingCount = ticketResults.filter(t => t.tests_passing && !t.noop).length;
120
+ const noopCount = ticketResults.filter(t => t.noop).length;
121
+ let prNumber;
122
+ let mergeStatus;
123
+ let mergeBlockReason;
124
+ if (passingCount > 0 && checkGhCli(log)) {
125
+ if (hasCommitsAhead(wt.branch, worktreeCwd)) {
126
+ const pr = createPr(wt.branch, sprint.id, sprint.title, sprint.strategy, ticketResults, worktreeCwd, log);
127
+ if (pr) {
128
+ prNumber = pr.number;
129
+ // Clear stale findings
130
+ try {
131
+ execFileSync('pnpm', ['slope', 'review', 'findings', 'clear'], { cwd: worktreeCwd, stdio: 'pipe' });
132
+ }
133
+ catch { /* ok */ }
134
+ const sprintNum = extractSprintNum(worktreeCwd);
135
+ const findingCount = runStructuralReview(pr.number, sprint.id, sprintNum, worktreeCwd, log);
136
+ log.info(`Structural review: ${findingCount} finding(s)`);
137
+ if (findingCount > 0) {
138
+ try {
139
+ execFileSync('pnpm', ['slope', 'review', 'amend', `--sprint=${sprintNum}`], { cwd: worktreeCwd, stdio: 'pipe' });
140
+ log.info('Scorecard amended with review findings');
141
+ }
142
+ catch {
143
+ log.warn('Scorecard amendment failed');
144
+ }
145
+ }
146
+ const mergeResult = autoMerge(pr.number, findingCount, passingCount, config, worktreeCwd, log);
147
+ mergeStatus = mergeResult.merged ? 'merged' : 'blocked';
148
+ mergeBlockReason = mergeResult.blockReason;
149
+ }
150
+ }
151
+ else {
152
+ log.info('No commits ahead of main — skipping PR creation');
153
+ mergeStatus = 'skipped';
154
+ }
155
+ }
156
+ else if (passingCount === 0) {
157
+ log.info('No passing tickets — skipping PR creation');
158
+ mergeStatus = 'skipped';
159
+ }
160
+ const result = {
161
+ sprint_id: sprint.id,
162
+ title: sprint.title,
163
+ strategy: sprint.strategy,
164
+ completed_at: new Date().toISOString(),
165
+ branch: wt.branch,
166
+ tickets_total: sprint.tickets.length,
167
+ tickets_passing: passingCount,
168
+ tickets_noop: noopCount,
169
+ tickets: ticketResults,
170
+ ...(prNumber !== undefined ? { pr_number: prNumber } : {}),
171
+ ...(mergeStatus ? { merge_status: mergeStatus } : {}),
172
+ ...(mergeBlockReason ? { merge_block_reason: mergeBlockReason } : {}),
173
+ };
174
+ // Atomic result write
175
+ saveResult(result, cwd, config);
176
+ // Guide evolution
177
+ evolveGuide(sprint.id, ticketResults, config, worktreeCwd, log);
178
+ // Cleanup worktree if merged
179
+ if (mergeStatus === 'merged') {
180
+ removeWorktree(wt.path, wt.branch, mainRepo, log);
181
+ try {
182
+ execFileSync('git', ['pull'], { cwd: mainRepo, stdio: 'pipe' });
183
+ }
184
+ catch { /* ok */ }
185
+ log.info(`=== Sprint ${sprint.id} done (merged, worktree cleaned) ===`);
186
+ }
187
+ else {
188
+ log.info(`=== Sprint ${sprint.id} done ===`);
189
+ log.info(`Worktree preserved at: ${wt.path}`);
190
+ }
191
+ return result;
192
+ }
193
+ finally {
194
+ releaseLock(cwd, config, sprint.id);
195
+ }
196
+ }
197
+ finally {
198
+ process.removeListener('SIGINT', cleanup);
199
+ process.removeListener('SIGTERM', cleanup);
200
+ }
201
+ }
202
+ // ── Ticket Processing ──────────────────────────────
203
+ async function processTicket(ticket, config, cwd, log) {
204
+ const tLog = log.child(`ticket:${ticket.key}`);
205
+ tLog.info(`-- ${ticket.key}: ${ticket.title} --`);
206
+ tLog.info(`Club: ${ticket.club} (max_files: ${ticket.max_files}, est_tokens: ${ticket.estimated_tokens ?? 0})`);
207
+ const primaryModel = selectModel(ticket.club, ticket.max_files, ticket.estimated_tokens ?? 0, config, cwd);
208
+ const timeout = selectTimeout(primaryModel, config);
209
+ tLog.info(`Model: ${primaryModel} (timeout: ${timeout}s)`);
210
+ // Claim ticket
211
+ try {
212
+ execFileSync('pnpm', ['slope', 'claim', `--target=${ticket.key}`], { cwd, stdio: 'pipe' });
213
+ }
214
+ catch { /* ok */ }
215
+ const prompt = buildPrompt(ticket, primaryModel);
216
+ const preSha = getHeadSha(cwd);
217
+ let finalModel = primaryModel;
218
+ let escalated = false;
219
+ let testsPassing = false;
220
+ let noop = false;
221
+ // Attempt 1: Primary model
222
+ const attempt1 = await runAiderWithGuards(ticket.key, primaryModel, timeout, prompt, ticket, preSha, config, cwd, tLog);
223
+ if (attempt1.passed) {
224
+ testsPassing = true;
225
+ noop = attempt1.noop;
226
+ }
227
+ else if (attempt1.spawnFailed) {
228
+ tLog.error('Aider failed to start — skipping ticket');
229
+ }
230
+ else if (config.escalateOnFail && isLocalModel(primaryModel)) {
231
+ // Attempt 2: Escalate to API model
232
+ tLog.info(`Escalating to ${config.modelApi}`);
233
+ finalModel = config.modelApi;
234
+ escalated = true;
235
+ const preEscSha = getHeadSha(cwd);
236
+ const attempt2 = await runAiderWithGuards(ticket.key, config.modelApi, config.modelApiTimeout, prompt, ticket, preEscSha, config, cwd, tLog);
237
+ if (attempt2.passed) {
238
+ testsPassing = true;
239
+ noop = attempt2.noop;
240
+ }
241
+ else {
242
+ tLog.warn('Tests still failing after escalation');
243
+ }
244
+ }
245
+ // Release claim
246
+ try {
247
+ execFileSync('pnpm', ['slope', 'release', `--target=${ticket.key}`], { cwd, stdio: 'pipe' });
248
+ }
249
+ catch { /* ok */ }
250
+ tLog.info(`-- ${ticket.key} complete --`);
251
+ return {
252
+ ticket: ticket.key,
253
+ title: ticket.title,
254
+ club: ticket.club,
255
+ max_files: ticket.max_files,
256
+ primary_model: primaryModel,
257
+ final_model: finalModel,
258
+ escalated,
259
+ tests_passing: testsPassing,
260
+ noop,
261
+ };
262
+ }
263
+ async function runAiderWithGuards(ticketKey, model, timeout, prompt, ticket, preSha, config, cwd, log) {
264
+ const outcome = await runAider(ticketKey, model, timeout, prompt, ticket, config, cwd, log);
265
+ if (outcome === 'error') {
266
+ return { passed: false, noop: false, spawnFailed: true };
267
+ }
268
+ const postSha = getHeadSha(cwd);
269
+ if (preSha === postSha) {
270
+ log.warn('No code changes produced (no-op)');
271
+ return { passed: true, noop: true, spawnFailed: false };
272
+ }
273
+ const guardResult = runGuards(preSha, config, cwd, log);
274
+ if (guardResult.passed) {
275
+ log.info('Guards passed');
276
+ return { passed: true, noop: false, spawnFailed: false };
277
+ }
278
+ log.warn(`Guard failed: ${guardResult.failedGuard}`);
279
+ return { passed: false, noop: false, spawnFailed: false };
280
+ }
281
+ async function runAider(ticketKey, model, timeout, prompt, ticket, config, cwd, log) {
282
+ const aiderArgs = [
283
+ '--model', model,
284
+ '--message', prompt,
285
+ '--auto-commits',
286
+ '--yes',
287
+ ];
288
+ const local = isLocalModel(model);
289
+ if (local) {
290
+ aiderArgs.push('--no-stream', '--no-show-model-warnings', '--map-tokens', '1024');
291
+ }
292
+ else {
293
+ aiderArgs.push('--auto-test', '--test-cmd', config.loopTestCmd);
294
+ }
295
+ // Agent guide (API only, within word budget)
296
+ if (!local) {
297
+ const guidePath = join(cwd, config.agentGuide);
298
+ if (existsSync(guidePath)) {
299
+ const words = readFileSync(guidePath, 'utf8').split(/\s+/).length;
300
+ if (words <= config.agentGuideMaxWords) {
301
+ aiderArgs.push('--read', guidePath);
302
+ }
303
+ else {
304
+ log.warn(`SKILL.md exceeds ${config.agentGuideMaxWords} words — skipping`);
305
+ }
306
+ }
307
+ }
308
+ // Semantic context injection (capture output instead of shell redirect)
309
+ const contextLineLimit = local ? 200 : 500;
310
+ const contextTop = local ? 4 : 8;
311
+ const contextFile = join(cwd, config.logDir, `${ticketKey}-context.md`);
312
+ try {
313
+ const contextOutput = execFileSync('pnpm', [
314
+ 'slope', 'context',
315
+ `--ticket=${ticketKey}`,
316
+ '--format=snippets',
317
+ `--top=${contextTop}`,
318
+ ], { cwd, encoding: 'utf8' });
319
+ writeFileSync(contextFile, contextOutput);
320
+ const lines = contextOutput.split('\n').length;
321
+ if (lines > 0 && lines <= contextLineLimit) {
322
+ aiderArgs.push('--read', contextFile);
323
+ log.info(`Injected semantic context (${lines} lines)`);
324
+ }
325
+ else if (lines > contextLineLimit) {
326
+ log.info(`Semantic context too large (${lines} lines) — falling back to CODEBASE.md`);
327
+ const codemap = join(cwd, 'CODEBASE.md');
328
+ if (existsSync(codemap))
329
+ aiderArgs.push('--read', codemap);
330
+ }
331
+ else {
332
+ const codemap = join(cwd, 'CODEBASE.md');
333
+ if (existsSync(codemap))
334
+ aiderArgs.push('--read', codemap);
335
+ }
336
+ }
337
+ catch {
338
+ log.info('slope context failed — falling back to CODEBASE.md');
339
+ const codemap = join(cwd, 'CODEBASE.md');
340
+ if (existsSync(codemap))
341
+ aiderArgs.push('--read', codemap);
342
+ }
343
+ // Prep plan injection (capture output instead of shell redirect)
344
+ const prepFile = join(cwd, config.logDir, `${ticketKey}-prep.md`);
345
+ try {
346
+ const prepOutput = execFileSync('pnpm', [
347
+ 'slope', 'prep', ticketKey, '--top=5',
348
+ ], { cwd, encoding: 'utf8' });
349
+ writeFileSync(prepFile, prepOutput);
350
+ const words = prepOutput.split(/\s+/).length;
351
+ if (words > 0 && words < 1600) {
352
+ aiderArgs.push('--read', prepFile);
353
+ log.info(`Injected prep plan (~${Math.round(words / 4)} tokens)`);
354
+ }
355
+ else if (words >= 1600) {
356
+ log.info(`Prep plan too large (~${Math.round(words / 4)} tokens) — skipping`);
357
+ }
358
+ }
359
+ catch {
360
+ log.info('slope prep failed — continuing without plan');
361
+ }
362
+ // Primary files from enriched ticket as --file flags (editable)
363
+ if (ticket.files?.primary) {
364
+ let fileCount = 0;
365
+ for (const f of ticket.files.primary) {
366
+ if (fileCount >= 5)
367
+ break;
368
+ if (f && existsSync(join(cwd, f)) && /\.(ts|js|sh)$/.test(f)) {
369
+ aiderArgs.push('--file', f);
370
+ fileCount++;
371
+ }
372
+ }
373
+ if (fileCount > 0) {
374
+ log.info(`Added ${fileCount} primary files to Aider edit context`);
375
+ }
376
+ }
377
+ // Spawn Aider with detached process group for clean shutdown
378
+ const aiderLogPath = join(cwd, config.logDir, `${ticketKey}-${model.split('/').pop()}.log`);
379
+ const env = {
380
+ ...process.env,
381
+ OLLAMA_API_BASE: config.ollamaApiBase,
382
+ OLLAMA_FLASH_ATTENTION: config.ollamaFlashAttention ? '1' : '0',
383
+ OLLAMA_KV_CACHE_TYPE: config.ollamaKvCacheType,
384
+ };
385
+ return new Promise((resolve) => {
386
+ const child = spawn('aider', aiderArgs, {
387
+ cwd,
388
+ env,
389
+ stdio: ['ignore', 'pipe', 'pipe'],
390
+ detached: true,
391
+ });
392
+ if (child.pid) {
393
+ activeChildPids.add(child.pid);
394
+ }
395
+ // Stream draining — avoid 64KB buffer deadlock
396
+ const logLines = [];
397
+ if (child.stdout) {
398
+ const rl = createInterface({ input: child.stdout });
399
+ rl.on('line', (line) => logLines.push(line));
400
+ }
401
+ if (child.stderr) {
402
+ const rl = createInterface({ input: child.stderr });
403
+ rl.on('line', (line) => logLines.push(line));
404
+ }
405
+ // Timeout
406
+ const timer = setTimeout(() => {
407
+ log.warn(`Aider timed out after ${timeout}s`);
408
+ if (child.pid) {
409
+ try {
410
+ process.kill(-child.pid, 'SIGTERM');
411
+ }
412
+ catch { /* ok */ }
413
+ }
414
+ // Don't resolve here — let the 'close' event handle it
415
+ }, timeout * 1000);
416
+ child.on('close', (code) => {
417
+ clearTimeout(timer);
418
+ if (child.pid)
419
+ activeChildPids.delete(child.pid);
420
+ if (code !== 0) {
421
+ log.warn(`Aider exited with code ${code}`);
422
+ }
423
+ try {
424
+ writeFileSync(aiderLogPath, logLines.join('\n'));
425
+ }
426
+ catch { /* ok */ }
427
+ resolve('completed');
428
+ });
429
+ child.on('error', (err) => {
430
+ clearTimeout(timer);
431
+ if (child.pid)
432
+ activeChildPids.delete(child.pid);
433
+ log.error(`Aider spawn error: ${err.message}`);
434
+ resolve('error');
435
+ });
436
+ });
437
+ }
438
+ // ── Prompt Builder ─────────────────────────────────
439
+ function buildPrompt(ticket, model) {
440
+ const acceptance = ticket.acceptance_criteria.join('; ');
441
+ let prompt = `You are working on the SLOPE project (Sprint Lifecycle & Operational Performance Engine).
442
+ This is a TypeScript monorepo using pnpm, vitest for tests, and strict TypeScript.
443
+
444
+ TICKET: ${ticket.title}
445
+ DESCRIPTION: ${ticket.description}
446
+ ACCEPTANCE CRITERIA: ${acceptance}
447
+
448
+ RULES:
449
+ - Make minimal, focused changes — do not refactor unrelated code
450
+ - Read the relevant source files FIRST before making changes
451
+ - Run 'pnpm test' to verify your changes
452
+ - Run 'pnpm typecheck' to check types
453
+ - Commit with a message starting with '${ticket.key}:'
454
+ `;
455
+ if (model.includes('minimax') || model.includes('claude')) {
456
+ prompt += `\nAPPROACH: Plan before coding. List files to modify, changes per file, verification steps. Then execute step by step.`;
457
+ }
458
+ else {
459
+ prompt += `\nAPPROACH: Make the smallest possible change. Focus on a single file at a time. Keep edits minimal.`;
460
+ }
461
+ if (ticket.files?.primary && ticket.files.primary.length > 0) {
462
+ const fileList = ticket.files.primary.slice(0, 5).map(f => `- ${f}`).join('\n');
463
+ prompt += `\n\nFILES TO MODIFY:\n${fileList}`;
464
+ }
465
+ prompt += `\nSTART by reading the relevant source files, then implement the change.`;
466
+ return prompt;
467
+ }
468
+ // ── Helpers ────────────────────────────────────────
469
+ function dryRunSprint(sprint, config, cwd, log) {
470
+ log.info('--- Dry run mode ---');
471
+ for (const t of sprint.tickets) {
472
+ const model = selectModel(t.club, t.max_files, t.estimated_tokens ?? 0, config, cwd);
473
+ const modelShort = model.split('/').pop();
474
+ log.info(` ${t.key}: ${t.title} [club=${t.club}, files=${t.max_files}] → ${modelShort}`);
475
+ }
476
+ const valid = validateTickets(sprint.tickets, cwd, log);
477
+ if (valid.length === 0) {
478
+ log.warn('All tickets would fail validation — sprint would be skipped');
479
+ }
480
+ releaseLock(cwd, config, sprint.id);
481
+ log.info('--- Dry run complete ---');
482
+ return null;
483
+ }
484
+ function saveResult(result, cwd, config) {
485
+ const dir = join(cwd, config.resultsDir);
486
+ mkdirSync(dir, { recursive: true });
487
+ const tmpPath = join(dir, `${result.sprint_id}.tmp.json`);
488
+ const finalPath = join(dir, `${result.sprint_id}.json`);
489
+ writeFileSync(tmpPath, JSON.stringify(result, null, 2) + '\n');
490
+ renameSync(tmpPath, finalPath);
491
+ }
492
+ function generateScorecard(sprint, branch, cwd, log) {
493
+ try {
494
+ const nextOutput = execFileSync('pnpm', ['slope', 'next'], { cwd, encoding: 'utf8' });
495
+ const match = nextOutput.match(/Next sprint: S(\d+)/);
496
+ const sprintNum = match?.[1] ?? '0';
497
+ if (parseInt(sprintNum, 10) > 0) {
498
+ execFileSync('pnpm', [
499
+ 'slope', 'auto-card',
500
+ `--sprint=${sprintNum}`,
501
+ `--theme=${sprint.title}`,
502
+ `--branch=main..${branch}`,
503
+ ], { cwd, stdio: 'pipe' });
504
+ log.info(`Auto-card generated for sprint ${sprintNum}`);
505
+ }
506
+ }
507
+ catch {
508
+ log.warn('Auto-card generation failed');
509
+ }
510
+ try {
511
+ execFileSync('pnpm', ['slope', 'review'], { cwd, stdio: 'pipe' });
512
+ }
513
+ catch { /* ok */ }
514
+ }
515
+ function extractSprintNum(cwd) {
516
+ try {
517
+ const output = execFileSync('pnpm', ['slope', 'next'], { cwd, encoding: 'utf8' });
518
+ const match = output.match(/Next sprint: S(\d+)/);
519
+ return parseInt(match?.[1] ?? '0', 10);
520
+ }
521
+ catch {
522
+ return 0;
523
+ }
524
+ }
525
+ function evolveGuide(sprintId, ticketResults, config, cwd, log) {
526
+ const failed = ticketResults.filter(t => !t.tests_passing);
527
+ const escalatedTickets = ticketResults.filter(t => t.escalated);
528
+ if (failed.length === 0 && escalatedTickets.length === 0)
529
+ return;
530
+ // Tier 2: Sprint history (full detail)
531
+ const historyPath = join(cwd, config.sprintHistory);
532
+ try {
533
+ let entry = `\n## Sprint ${sprintId} (${new Date().toISOString().split('T')[0]})\n\n`;
534
+ if (escalatedTickets.length > 0) {
535
+ entry += '**Escalated** (local model failed, API attempted):\n';
536
+ for (const t of escalatedTickets)
537
+ entry += `- ${t.ticket}: ${t.title} [${t.club}]\n`;
538
+ entry += '\n';
539
+ }
540
+ if (failed.length > 0) {
541
+ entry += '**Failed** (investigate patterns):\n';
542
+ for (const t of failed)
543
+ entry += `- ${t.ticket}: ${t.title}\n`;
544
+ entry += '\n';
545
+ }
546
+ appendFileSync(historyPath, entry);
547
+ log.info('Sprint history updated');
548
+ }
549
+ catch {
550
+ log.warn('Failed to update sprint history');
551
+ }
552
+ // Tier 1: SKILL.md hazard one-liners
553
+ const guidePath = join(cwd, config.agentGuide);
554
+ if (existsSync(guidePath)) {
555
+ try {
556
+ let content = readFileSync(guidePath, 'utf8');
557
+ const insertBefore = '## Anti-Patterns';
558
+ const lines = [];
559
+ for (const t of failed) {
560
+ lines.push(`- [${sprintId}] ${t.ticket}: ${t.title} — failed`);
561
+ }
562
+ for (const t of escalatedTickets) {
563
+ lines.push(`- [${sprintId}] ${t.ticket}: escalated from local [${t.club}]`);
564
+ }
565
+ if (content.includes(insertBefore)) {
566
+ content = content.replace(insertBefore, lines.join('\n') + '\n' + insertBefore);
567
+ writeFileSync(guidePath, content);
568
+ log.info('SKILL.md hazards updated');
569
+ }
570
+ }
571
+ catch {
572
+ log.warn('Failed to update SKILL.md');
573
+ }
574
+ // Word budget check
575
+ const words = readFileSync(guidePath, 'utf8').split(/\s+/).length;
576
+ if (words > config.agentGuideMaxWords) {
577
+ log.warn(`SKILL.md is ${words} words (limit: ${config.agentGuideMaxWords}) — needs synthesis`);
578
+ }
579
+ }
580
+ // Model config auto-regen check
581
+ try {
582
+ const logFiles = readdirSync(join(cwd, config.logDir)).filter(f => f.endsWith('-models.jsonl'));
583
+ let totalLogged = 0;
584
+ for (const f of logFiles) {
585
+ const c = readFileSync(join(cwd, config.logDir, f), 'utf8');
586
+ totalLogged += c.split('\n').filter(Boolean).length;
587
+ }
588
+ const modelConfigPath = join(cwd, 'slope-loop/model-config.json');
589
+ if (existsSync(modelConfigPath)) {
590
+ const mc = JSON.parse(readFileSync(modelConfigPath, 'utf8'));
591
+ const delta = totalLogged - (mc.ticket_count ?? 0);
592
+ if (delta >= config.modelRegenThreshold) {
593
+ log.info(`Auto-regenerating model-config.json (${delta} new tickets)`);
594
+ execSync('npx tsx slope-loop/model-selector.ts', { cwd, stdio: 'pipe' });
595
+ }
596
+ }
597
+ }
598
+ catch { /* ok */ }
599
+ }
600
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/cli/loop/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { LoopConfig } from './types.js';
2
+ import type { Logger } from './logger.js';
3
+ export interface GuardResult {
4
+ passed: boolean;
5
+ failedGuard?: 'typecheck' | 'tests';
6
+ }
7
+ /**
8
+ * Run post-ticket guards: typecheck + tests.
9
+ * If either fails, auto-revert to preSha.
10
+ *
11
+ * @returns Guard result with pass/fail status
12
+ */
13
+ export declare function runGuards(preSha: string, config: LoopConfig, cwd: string, log: Logger): GuardResult;
14
+ //# sourceMappingURL=guard-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard-runner.d.ts","sourceRoot":"","sources":["../../../src/cli/loop/guard-runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;CACrC;AAID;;;;;GAKG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACV,WAAW,CAsBb"}