@slope-dev/slope 1.13.2 → 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 (212) hide show
  1. package/dist/cli/commands/context.d.ts +2 -0
  2. package/dist/cli/commands/context.d.ts.map +1 -0
  3. package/dist/cli/commands/context.js +190 -0
  4. package/dist/cli/commands/context.js.map +1 -0
  5. package/dist/cli/commands/distill.d.ts.map +1 -1
  6. package/dist/cli/commands/distill.js +13 -4
  7. package/dist/cli/commands/distill.js.map +1 -1
  8. package/dist/cli/commands/docs.d.ts +5 -0
  9. package/dist/cli/commands/docs.d.ts.map +1 -0
  10. package/dist/cli/commands/docs.js +303 -0
  11. package/dist/cli/commands/docs.js.map +1 -0
  12. package/dist/cli/commands/enrich.d.ts +2 -0
  13. package/dist/cli/commands/enrich.d.ts.map +1 -0
  14. package/dist/cli/commands/enrich.js +140 -0
  15. package/dist/cli/commands/enrich.js.map +1 -0
  16. package/dist/cli/commands/guard.d.ts.map +1 -1
  17. package/dist/cli/commands/guard.js +2 -0
  18. package/dist/cli/commands/guard.js.map +1 -1
  19. package/dist/cli/commands/index-cmd.d.ts +2 -0
  20. package/dist/cli/commands/index-cmd.d.ts.map +1 -0
  21. package/dist/cli/commands/index-cmd.js +296 -0
  22. package/dist/cli/commands/index-cmd.js.map +1 -0
  23. package/dist/cli/commands/init.d.ts.map +1 -1
  24. package/dist/cli/commands/init.js +73 -182
  25. package/dist/cli/commands/init.js.map +1 -1
  26. package/dist/cli/commands/initiative.d.ts +2 -0
  27. package/dist/cli/commands/initiative.d.ts.map +1 -0
  28. package/dist/cli/commands/initiative.js +207 -0
  29. package/dist/cli/commands/initiative.js.map +1 -0
  30. package/dist/cli/commands/loop.d.ts +2 -0
  31. package/dist/cli/commands/loop.d.ts.map +1 -0
  32. package/dist/cli/commands/loop.js +388 -0
  33. package/dist/cli/commands/loop.js.map +1 -0
  34. package/dist/cli/commands/prep.d.ts +2 -0
  35. package/dist/cli/commands/prep.d.ts.map +1 -0
  36. package/dist/cli/commands/prep.js +94 -0
  37. package/dist/cli/commands/prep.js.map +1 -0
  38. package/dist/cli/commands/roadmap.d.ts.map +1 -1
  39. package/dist/cli/commands/roadmap.js +134 -46
  40. package/dist/cli/commands/roadmap.js.map +1 -1
  41. package/dist/cli/commands/session.d.ts.map +1 -1
  42. package/dist/cli/commands/session.js +2 -0
  43. package/dist/cli/commands/session.js.map +1 -1
  44. package/dist/cli/commands/store.js +76 -10
  45. package/dist/cli/commands/store.js.map +1 -1
  46. package/dist/cli/commands/vision.d.ts.map +1 -1
  47. package/dist/cli/commands/vision.js +104 -7
  48. package/dist/cli/commands/vision.js.map +1 -1
  49. package/dist/cli/guards/stop-check.d.ts +6 -1
  50. package/dist/cli/guards/stop-check.d.ts.map +1 -1
  51. package/dist/cli/guards/stop-check.js +84 -5
  52. package/dist/cli/guards/stop-check.js.map +1 -1
  53. package/dist/cli/guards/worktree-check.d.ts +14 -0
  54. package/dist/cli/guards/worktree-check.d.ts.map +1 -0
  55. package/dist/cli/guards/worktree-check.js +137 -0
  56. package/dist/cli/guards/worktree-check.js.map +1 -0
  57. package/dist/cli/index.js +56 -0
  58. package/dist/cli/index.js.map +1 -1
  59. package/dist/cli/interactive-init.d.ts +19 -0
  60. package/dist/cli/interactive-init.d.ts.map +1 -0
  61. package/dist/cli/interactive-init.js +132 -0
  62. package/dist/cli/interactive-init.js.map +1 -0
  63. package/dist/cli/loop/analyze.d.ts +8 -0
  64. package/dist/cli/loop/analyze.d.ts.map +1 -0
  65. package/dist/cli/loop/analyze.js +62 -0
  66. package/dist/cli/loop/analyze.js.map +1 -0
  67. package/dist/cli/loop/backlog.d.ts +26 -0
  68. package/dist/cli/loop/backlog.d.ts.map +1 -0
  69. package/dist/cli/loop/backlog.js +95 -0
  70. package/dist/cli/loop/backlog.js.map +1 -0
  71. package/dist/cli/loop/config.d.ts +10 -0
  72. package/dist/cli/loop/config.d.ts.map +1 -0
  73. package/dist/cli/loop/config.js +75 -0
  74. package/dist/cli/loop/config.js.map +1 -0
  75. package/dist/cli/loop/continuous.d.ts +6 -0
  76. package/dist/cli/loop/continuous.d.ts.map +1 -0
  77. package/dist/cli/loop/continuous.js +108 -0
  78. package/dist/cli/loop/continuous.js.map +1 -0
  79. package/dist/cli/loop/executor.d.ts +8 -0
  80. package/dist/cli/loop/executor.d.ts.map +1 -0
  81. package/dist/cli/loop/executor.js +600 -0
  82. package/dist/cli/loop/executor.js.map +1 -0
  83. package/dist/cli/loop/guard-runner.d.ts +14 -0
  84. package/dist/cli/loop/guard-runner.d.ts.map +1 -0
  85. package/dist/cli/loop/guard-runner.js +53 -0
  86. package/dist/cli/loop/guard-runner.js.map +1 -0
  87. package/dist/cli/loop/logger.d.ts +9 -0
  88. package/dist/cli/loop/logger.d.ts.map +1 -0
  89. package/dist/cli/loop/logger.js +37 -0
  90. package/dist/cli/loop/logger.js.map +1 -0
  91. package/dist/cli/loop/model-selector.d.ts +14 -0
  92. package/dist/cli/loop/model-selector.d.ts.map +1 -0
  93. package/dist/cli/loop/model-selector.js +59 -0
  94. package/dist/cli/loop/model-selector.js.map +1 -0
  95. package/dist/cli/loop/parallel.d.ts +6 -0
  96. package/dist/cli/loop/parallel.d.ts.map +1 -0
  97. package/dist/cli/loop/parallel.js +109 -0
  98. package/dist/cli/loop/parallel.js.map +1 -0
  99. package/dist/cli/loop/pr-lifecycle.d.ts +26 -0
  100. package/dist/cli/loop/pr-lifecycle.d.ts.map +1 -0
  101. package/dist/cli/loop/pr-lifecycle.js +244 -0
  102. package/dist/cli/loop/pr-lifecycle.js.map +1 -0
  103. package/dist/cli/loop/types.d.ts +98 -0
  104. package/dist/cli/loop/types.d.ts.map +1 -0
  105. package/dist/cli/loop/types.js +37 -0
  106. package/dist/cli/loop/types.js.map +1 -0
  107. package/dist/cli/loop/worktree.d.ts +30 -0
  108. package/dist/cli/loop/worktree.d.ts.map +1 -0
  109. package/dist/cli/loop/worktree.js +134 -0
  110. package/dist/cli/loop/worktree.js.map +1 -0
  111. package/dist/cli/registry.d.ts.map +1 -1
  112. package/dist/cli/registry.js +9 -0
  113. package/dist/cli/registry.js.map +1 -1
  114. package/dist/core/analyzers/stack.d.ts +2 -0
  115. package/dist/core/analyzers/stack.d.ts.map +1 -1
  116. package/dist/core/analyzers/stack.js +9 -6
  117. package/dist/core/analyzers/stack.js.map +1 -1
  118. package/dist/core/config.d.ts +6 -0
  119. package/dist/core/config.d.ts.map +1 -1
  120. package/dist/core/config.js.map +1 -1
  121. package/dist/core/constants.d.ts +2 -0
  122. package/dist/core/constants.d.ts.map +1 -1
  123. package/dist/core/constants.js +2 -0
  124. package/dist/core/constants.js.map +1 -1
  125. package/dist/core/context.d.ts +20 -0
  126. package/dist/core/context.d.ts.map +1 -0
  127. package/dist/core/context.js +59 -0
  128. package/dist/core/context.js.map +1 -0
  129. package/dist/core/docs.d.ts +50 -0
  130. package/dist/core/docs.d.ts.map +1 -0
  131. package/dist/core/docs.js +67 -0
  132. package/dist/core/docs.js.map +1 -0
  133. package/dist/core/embedding-client.d.ts +11 -0
  134. package/dist/core/embedding-client.d.ts.map +1 -0
  135. package/dist/core/embedding-client.js +92 -0
  136. package/dist/core/embedding-client.js.map +1 -0
  137. package/dist/core/embedding-store.d.ts +44 -0
  138. package/dist/core/embedding-store.d.ts.map +1 -0
  139. package/dist/core/embedding-store.js +7 -0
  140. package/dist/core/embedding-store.js.map +1 -0
  141. package/dist/core/embedding.d.ts +32 -0
  142. package/dist/core/embedding.d.ts.map +1 -0
  143. package/dist/core/embedding.js +114 -0
  144. package/dist/core/embedding.js.map +1 -0
  145. package/dist/core/enrich.d.ts +76 -0
  146. package/dist/core/enrich.d.ts.map +1 -0
  147. package/dist/core/enrich.js +115 -0
  148. package/dist/core/enrich.js.map +1 -0
  149. package/dist/core/generators/roadmap.d.ts +6 -1
  150. package/dist/core/generators/roadmap.d.ts.map +1 -1
  151. package/dist/core/generators/roadmap.js +150 -0
  152. package/dist/core/generators/roadmap.js.map +1 -1
  153. package/dist/core/guard.d.ts +1 -1
  154. package/dist/core/guard.d.ts.map +1 -1
  155. package/dist/core/guard.js +8 -0
  156. package/dist/core/guard.js.map +1 -1
  157. package/dist/core/index.d.ts +27 -5
  158. package/dist/core/index.d.ts.map +1 -1
  159. package/dist/core/index.js +25 -4
  160. package/dist/core/index.js.map +1 -1
  161. package/dist/core/initiative.d.ts +72 -0
  162. package/dist/core/initiative.d.ts.map +1 -0
  163. package/dist/core/initiative.js +421 -0
  164. package/dist/core/initiative.js.map +1 -0
  165. package/dist/core/interview-engine.d.ts +34 -0
  166. package/dist/core/interview-engine.d.ts.map +1 -0
  167. package/dist/core/interview-engine.js +195 -0
  168. package/dist/core/interview-engine.js.map +1 -0
  169. package/dist/core/interview-steps.d.ts +27 -0
  170. package/dist/core/interview-steps.d.ts.map +1 -0
  171. package/dist/core/interview-steps.js +157 -0
  172. package/dist/core/interview-steps.js.map +1 -0
  173. package/dist/core/interview.d.ts +20 -0
  174. package/dist/core/interview.d.ts.map +1 -1
  175. package/dist/core/interview.js +61 -34
  176. package/dist/core/interview.js.map +1 -1
  177. package/dist/core/metaphor-preview.d.ts +34 -0
  178. package/dist/core/metaphor-preview.d.ts.map +1 -0
  179. package/dist/core/metaphor-preview.js +94 -0
  180. package/dist/core/metaphor-preview.js.map +1 -0
  181. package/dist/core/prep.d.ts +88 -0
  182. package/dist/core/prep.d.ts.map +1 -0
  183. package/dist/core/prep.js +302 -0
  184. package/dist/core/prep.js.map +1 -0
  185. package/dist/core/roles.d.ts +3 -0
  186. package/dist/core/roles.d.ts.map +1 -1
  187. package/dist/core/roles.js +36 -0
  188. package/dist/core/roles.js.map +1 -1
  189. package/dist/core/store.d.ts +1 -1
  190. package/dist/core/store.d.ts.map +1 -1
  191. package/dist/core/vision.d.ts +10 -0
  192. package/dist/core/vision.d.ts.map +1 -1
  193. package/dist/core/vision.js +37 -0
  194. package/dist/core/vision.js.map +1 -1
  195. package/dist/mcp/index.d.ts.map +1 -1
  196. package/dist/mcp/index.js +55 -7
  197. package/dist/mcp/index.js.map +1 -1
  198. package/dist/mcp/registry.d.ts +1 -1
  199. package/dist/mcp/registry.d.ts.map +1 -1
  200. package/dist/mcp/registry.js +44 -0
  201. package/dist/mcp/registry.js.map +1 -1
  202. package/dist/mcp/sandbox.d.ts.map +1 -1
  203. package/dist/mcp/sandbox.js +12 -1
  204. package/dist/mcp/sandbox.js.map +1 -1
  205. package/dist/store/index.d.ts +26 -1
  206. package/dist/store/index.d.ts.map +1 -1
  207. package/dist/store/index.js +193 -1
  208. package/dist/store/index.js.map +1 -1
  209. package/dist/store-pg/index.d.ts.map +1 -1
  210. package/dist/store-pg/index.js +25 -0
  211. package/dist/store-pg/index.js.map +1 -1
  212. package/package.json +3 -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"}