@promptwheel/mcp 0.6.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 (134) hide show
  1. package/README.md +178 -0
  2. package/dist/advance-helpers.d.ts +27 -0
  3. package/dist/advance-helpers.d.ts.map +1 -0
  4. package/dist/advance-helpers.js +127 -0
  5. package/dist/advance-helpers.js.map +1 -0
  6. package/dist/advance-prompts.d.ts +48 -0
  7. package/dist/advance-prompts.d.ts.map +1 -0
  8. package/dist/advance-prompts.js +420 -0
  9. package/dist/advance-prompts.js.map +1 -0
  10. package/dist/advance.d.ts +30 -0
  11. package/dist/advance.d.ts.map +1 -0
  12. package/dist/advance.js +752 -0
  13. package/dist/advance.js.map +1 -0
  14. package/dist/codebase-index.d.ts +5 -0
  15. package/dist/codebase-index.d.ts.map +1 -0
  16. package/dist/codebase-index.js +5 -0
  17. package/dist/codebase-index.js.map +1 -0
  18. package/dist/dedup-memory.d.ts +30 -0
  19. package/dist/dedup-memory.d.ts.map +1 -0
  20. package/dist/dedup-memory.js +76 -0
  21. package/dist/dedup-memory.js.map +1 -0
  22. package/dist/direct-client.d.ts +57 -0
  23. package/dist/direct-client.d.ts.map +1 -0
  24. package/dist/direct-client.js +92 -0
  25. package/dist/direct-client.js.map +1 -0
  26. package/dist/event-handlers-qa.d.ts +5 -0
  27. package/dist/event-handlers-qa.d.ts.map +1 -0
  28. package/dist/event-handlers-qa.js +186 -0
  29. package/dist/event-handlers-qa.js.map +1 -0
  30. package/dist/event-handlers-scout.d.ts +5 -0
  31. package/dist/event-handlers-scout.d.ts.map +1 -0
  32. package/dist/event-handlers-scout.js +270 -0
  33. package/dist/event-handlers-scout.js.map +1 -0
  34. package/dist/event-handlers-ticket.d.ts +5 -0
  35. package/dist/event-handlers-ticket.d.ts.map +1 -0
  36. package/dist/event-handlers-ticket.js +232 -0
  37. package/dist/event-handlers-ticket.js.map +1 -0
  38. package/dist/event-helpers.d.ts +46 -0
  39. package/dist/event-helpers.d.ts.map +1 -0
  40. package/dist/event-helpers.js +125 -0
  41. package/dist/event-helpers.js.map +1 -0
  42. package/dist/event-processor.d.ts +15 -0
  43. package/dist/event-processor.d.ts.map +1 -0
  44. package/dist/event-processor.js +111 -0
  45. package/dist/event-processor.js.map +1 -0
  46. package/dist/formulas.d.ts +27 -0
  47. package/dist/formulas.d.ts.map +1 -0
  48. package/dist/formulas.js +109 -0
  49. package/dist/formulas.js.map +1 -0
  50. package/dist/guidelines.d.ts +16 -0
  51. package/dist/guidelines.d.ts.map +1 -0
  52. package/dist/guidelines.js +44 -0
  53. package/dist/guidelines.js.map +1 -0
  54. package/dist/index.d.ts +9 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +42 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/learnings.d.ts +42 -0
  59. package/dist/learnings.d.ts.map +1 -0
  60. package/dist/learnings.js +117 -0
  61. package/dist/learnings.js.map +1 -0
  62. package/dist/project-metadata.d.ts +34 -0
  63. package/dist/project-metadata.d.ts.map +1 -0
  64. package/dist/project-metadata.js +617 -0
  65. package/dist/project-metadata.js.map +1 -0
  66. package/dist/proposals.d.ts +23 -0
  67. package/dist/proposals.d.ts.map +1 -0
  68. package/dist/proposals.js +201 -0
  69. package/dist/proposals.js.map +1 -0
  70. package/dist/qa-stats.d.ts +51 -0
  71. package/dist/qa-stats.d.ts.map +1 -0
  72. package/dist/qa-stats.js +121 -0
  73. package/dist/qa-stats.js.map +1 -0
  74. package/dist/run-manager.d.ts +97 -0
  75. package/dist/run-manager.d.ts.map +1 -0
  76. package/dist/run-manager.js +583 -0
  77. package/dist/run-manager.js.map +1 -0
  78. package/dist/run-state-bridge.d.ts +13 -0
  79. package/dist/run-state-bridge.d.ts.map +1 -0
  80. package/dist/run-state-bridge.js +101 -0
  81. package/dist/run-state-bridge.js.map +1 -0
  82. package/dist/scope-policy.d.ts +83 -0
  83. package/dist/scope-policy.d.ts.map +1 -0
  84. package/dist/scope-policy.js +278 -0
  85. package/dist/scope-policy.js.map +1 -0
  86. package/dist/server.d.ts +18 -0
  87. package/dist/server.d.ts.map +1 -0
  88. package/dist/server.js +35 -0
  89. package/dist/server.js.map +1 -0
  90. package/dist/spindle.d.ts +41 -0
  91. package/dist/spindle.d.ts.map +1 -0
  92. package/dist/spindle.js +230 -0
  93. package/dist/spindle.js.map +1 -0
  94. package/dist/state.d.ts +36 -0
  95. package/dist/state.d.ts.map +1 -0
  96. package/dist/state.js +50 -0
  97. package/dist/state.js.map +1 -0
  98. package/dist/ticket-worker.d.ts +37 -0
  99. package/dist/ticket-worker.d.ts.map +1 -0
  100. package/dist/ticket-worker.js +527 -0
  101. package/dist/ticket-worker.js.map +1 -0
  102. package/dist/tool-registry.d.ts +35 -0
  103. package/dist/tool-registry.d.ts.map +1 -0
  104. package/dist/tool-registry.js +129 -0
  105. package/dist/tool-registry.js.map +1 -0
  106. package/dist/tools/execute.d.ts +17 -0
  107. package/dist/tools/execute.d.ts.map +1 -0
  108. package/dist/tools/execute.js +418 -0
  109. package/dist/tools/execute.js.map +1 -0
  110. package/dist/tools/git.d.ts +7 -0
  111. package/dist/tools/git.d.ts.map +1 -0
  112. package/dist/tools/git.js +98 -0
  113. package/dist/tools/git.js.map +1 -0
  114. package/dist/tools/intelligence.d.ts +10 -0
  115. package/dist/tools/intelligence.d.ts.map +1 -0
  116. package/dist/tools/intelligence.js +432 -0
  117. package/dist/tools/intelligence.js.map +1 -0
  118. package/dist/tools/session.d.ts +7 -0
  119. package/dist/tools/session.d.ts.map +1 -0
  120. package/dist/tools/session.js +533 -0
  121. package/dist/tools/session.js.map +1 -0
  122. package/dist/tools/trajectory.d.ts +10 -0
  123. package/dist/tools/trajectory.d.ts.map +1 -0
  124. package/dist/tools/trajectory.js +374 -0
  125. package/dist/tools/trajectory.js.map +1 -0
  126. package/dist/trajectory-io.d.ts +21 -0
  127. package/dist/trajectory-io.d.ts.map +1 -0
  128. package/dist/trajectory-io.js +105 -0
  129. package/dist/trajectory-io.js.map +1 -0
  130. package/dist/types.d.ts +229 -0
  131. package/dist/types.d.ts.map +1 -0
  132. package/dist/types.js +13 -0
  133. package/dist/types.js.map +1 -0
  134. package/package.json +63 -0
@@ -0,0 +1,583 @@
1
+ /**
2
+ * Run Manager — creates and manages run folders on disk.
3
+ *
4
+ * Each run lives at `.promptwheel/runs/<run_id>/` and contains:
5
+ * - state.json — current RunState (overwritten on every change)
6
+ * - events.ndjson — append-only event log
7
+ * - diffs/ — patch files per step
8
+ * - artifacts/ — QA logs, scout proposals, etc.
9
+ */
10
+ import * as fs from 'node:fs';
11
+ import * as path from 'node:path';
12
+ import { prefixedId, SESSION_DEFAULTS, SCOUT_DEFAULTS } from '@promptwheel/core';
13
+ import { checkSpindle } from './spindle.js';
14
+ import { detectProjectMetadata } from './project-metadata.js';
15
+ import { buildCodebaseIndex } from './codebase-index.js';
16
+ import { loadLearnings } from './learnings.js';
17
+ // ---------------------------------------------------------------------------
18
+ // Defaults
19
+ // ---------------------------------------------------------------------------
20
+ // All defaults imported from @promptwheel/core — see config/defaults.ts
21
+ function emptySpindle() {
22
+ return {
23
+ output_hashes: [],
24
+ diff_hashes: [],
25
+ iterations_since_change: 0,
26
+ total_output_chars: 0,
27
+ total_change_chars: 0,
28
+ failing_command_signatures: [],
29
+ plan_hashes: [],
30
+ };
31
+ }
32
+ // ---------------------------------------------------------------------------
33
+ // RunManager
34
+ // ---------------------------------------------------------------------------
35
+ export class RunManager {
36
+ projectPath;
37
+ state = null;
38
+ runDir = null;
39
+ eventsPath = null;
40
+ learningsDecayRate;
41
+ constructor(projectPath) {
42
+ this.projectPath = projectPath;
43
+ }
44
+ /** The project root path */
45
+ get rootPath() {
46
+ return this.projectPath;
47
+ }
48
+ /** The base .promptwheel directory */
49
+ get bsDir() {
50
+ return path.join(this.projectPath, '.promptwheel');
51
+ }
52
+ /** Create a new run, write initial state.json and SESSION_START event */
53
+ create(projectId, config) {
54
+ if (this.state) {
55
+ throw new Error('Run already active. End it first.');
56
+ }
57
+ // Bootstrap .promptwheel/ directory early — fail with a clear message
58
+ try {
59
+ fs.mkdirSync(this.bsDir, { recursive: true });
60
+ }
61
+ catch (err) {
62
+ throw new Error(`Cannot create .promptwheel directory at ${this.bsDir}: ${err instanceof Error ? err.message : String(err)}. Check file permissions.`);
63
+ }
64
+ // Session lock — prevent concurrent sessions from corrupting state
65
+ // Skip in test environments to avoid PID collisions with test runner
66
+ if (!process.env.VITEST && !process.env.NODE_ENV?.includes('test')) {
67
+ const lockPath = path.join(this.bsDir, 'session.lock');
68
+ try {
69
+ if (fs.existsSync(lockPath)) {
70
+ const lockContent = fs.readFileSync(lockPath, 'utf8').trim();
71
+ const lockPid = parseInt(lockContent, 10);
72
+ // Check if the process is still alive
73
+ if (lockPid && !isNaN(lockPid)) {
74
+ try {
75
+ process.kill(lockPid, 0);
76
+ throw new Error(`Another PromptWheel session is active (PID ${lockPid}). End it first or delete .promptwheel/session.lock.`);
77
+ }
78
+ catch (e) {
79
+ if (e.code !== 'ESRCH')
80
+ throw e; /* Process dead — stale lock, overwrite */
81
+ }
82
+ }
83
+ }
84
+ fs.writeFileSync(lockPath, String(process.pid), 'utf8');
85
+ }
86
+ catch (err) {
87
+ if (err instanceof Error && err.message.includes('Another PromptWheel session'))
88
+ throw err;
89
+ // Ignore lock write failures — non-fatal
90
+ }
91
+ }
92
+ const runId = prefixedId('run');
93
+ const sessionId = prefixedId('ses');
94
+ const now = new Date();
95
+ const isContinuous = config.hours !== undefined || (config.max_cycles !== undefined && config.max_cycles > 1);
96
+ const expiresAt = config.hours
97
+ ? new Date(now.getTime() + config.hours * 60 * 60 * 1000).toISOString()
98
+ : null;
99
+ // PR creation: explicit opt-in via create_prs (or legacy draft_prs)
100
+ const createPrs = config.create_prs ?? config.draft_prs ?? false;
101
+ const draft = config.draft ?? false;
102
+ // PR limit only matters when creating PRs
103
+ const effectiveMaxPrs = createPrs
104
+ ? (config.max_prs ?? (isContinuous ? 999 : SESSION_DEFAULTS.MAX_PRS))
105
+ : 0;
106
+ // In hours/cycles mode, disable per-ticket step budget — session is time-bounded
107
+ const effectiveTicketStepBudget = config.ticket_step_budget
108
+ ?? (isContinuous ? 9999 : SESSION_DEFAULTS.TICKET_STEP_BUDGET);
109
+ this.state = {
110
+ run_id: runId,
111
+ session_id: sessionId,
112
+ project_id: projectId,
113
+ phase: 'SCOUT',
114
+ phase_entry_step: 0,
115
+ step_count: 0,
116
+ step_budget: config.step_budget ?? SESSION_DEFAULTS.STEP_BUDGET,
117
+ ticket_step_count: 0,
118
+ ticket_step_budget: effectiveTicketStepBudget,
119
+ total_lines_changed: 0,
120
+ max_lines_per_ticket: SESSION_DEFAULTS.MAX_LINES_PER_TICKET,
121
+ total_tool_calls: 0,
122
+ max_tool_calls_per_ticket: SESSION_DEFAULTS.MAX_TOOL_CALLS_PER_TICKET,
123
+ tickets_completed: 0,
124
+ tickets_failed: 0,
125
+ tickets_blocked: 0,
126
+ prs_created: 0,
127
+ scout_cycles: 0,
128
+ max_cycles: config.max_cycles ?? (isContinuous ? 999 : 1),
129
+ max_prs: effectiveMaxPrs,
130
+ current_ticket_id: null,
131
+ current_ticket_plan: null,
132
+ plan_approved: false,
133
+ plan_rejections: 0,
134
+ qa_retries: 0,
135
+ scout_retries: 0,
136
+ last_qa_failure: null,
137
+ last_plan_rejection_reason: null,
138
+ started_at: now.toISOString(),
139
+ expires_at: expiresAt,
140
+ scope: config.scope ?? SCOUT_DEFAULTS.SCOPE,
141
+ formula: config.formula ?? null,
142
+ categories: config.categories ?? [...SCOUT_DEFAULTS.CATEGORIES],
143
+ min_confidence: config.min_confidence ?? SCOUT_DEFAULTS.MIN_CONFIDENCE,
144
+ max_proposals_per_scout: config.max_proposals ?? SCOUT_DEFAULTS.MAX_PROPOSALS_PER_SCOUT,
145
+ min_impact_score: config.min_impact_score ?? SCOUT_DEFAULTS.MIN_IMPACT_SCORE,
146
+ create_prs: createPrs,
147
+ draft,
148
+ eco: config.eco ?? false,
149
+ hints: [],
150
+ scout_exclude_dirs: config.scout_exclude_dirs ?? [...SCOUT_DEFAULTS.EXCLUDE_DIRS],
151
+ parallel: Math.min(Math.max(config.parallel ?? 2, 1), 5),
152
+ ticket_workers: {},
153
+ sectors_scanned: 0,
154
+ sectors_total: 0,
155
+ files_scanned: 0,
156
+ files_total: 0,
157
+ spindle: emptySpindle(),
158
+ spindle_recoveries: 0,
159
+ scouted_dirs: [],
160
+ deferred_proposals: [],
161
+ project_metadata: null,
162
+ codebase_index: null,
163
+ codebase_index_dirty: false,
164
+ pending_proposals: null,
165
+ skip_review: config.skip_review ?? false,
166
+ scout_exploration_log: [],
167
+ learnings_enabled: config.learnings !== false,
168
+ learnings_loaded: false,
169
+ injected_learning_ids: [],
170
+ cached_learnings: [],
171
+ // Direct mode: edit in place without worktrees. Default true for simpler solo use.
172
+ // Auto-disabled when creating PRs or using parallel > 1 (needs isolation).
173
+ direct: config.direct ?? (!createPrs && (config.parallel ?? 2) <= 1),
174
+ // Cross-verify: use separate verifier agent for QA (opt-in)
175
+ cross_verify: config.cross_verify ?? false,
176
+ // Trajectory planning
177
+ active_trajectory: null,
178
+ trajectory_step_id: null,
179
+ trajectory_step_title: null,
180
+ // Dry-run + QA commands
181
+ dry_run: config.dry_run ?? false,
182
+ qa_commands: config.qa_commands ?? [],
183
+ };
184
+ // Detect project metadata (test runner, framework, etc.)
185
+ const detectedMeta = detectProjectMetadata(this.projectPath);
186
+ this.state.project_metadata = {
187
+ languages: detectedMeta.languages,
188
+ package_manager: detectedMeta.package_manager,
189
+ test_runner_name: detectedMeta.test_runner?.name ?? null,
190
+ test_run_command: detectedMeta.test_runner?.run_command ?? null,
191
+ test_filter_syntax: detectedMeta.test_runner?.filter_syntax ?? null,
192
+ framework: detectedMeta.framework,
193
+ linter: detectedMeta.linter,
194
+ type_checker: detectedMeta.type_checker,
195
+ monorepo_tool: detectedMeta.monorepo_tool,
196
+ };
197
+ // Build codebase structural index
198
+ this.state.codebase_index = buildCodebaseIndex(this.projectPath, this.state.scout_exclude_dirs);
199
+ // Seed coverage from sectors.json if it exists
200
+ try {
201
+ const sectorsPath = path.join(this.bsDir, 'sectors.json');
202
+ if (fs.existsSync(sectorsPath)) {
203
+ const sectorsData = JSON.parse(fs.readFileSync(sectorsPath, 'utf8'));
204
+ if (sectorsData?.version === 2 && Array.isArray(sectorsData.sectors)) {
205
+ const scoutedSet = new Set();
206
+ for (const sec of sectorsData.sectors) {
207
+ if (sec.scanCount > 0 && sec.path) {
208
+ scoutedSet.add(sec.path);
209
+ }
210
+ }
211
+ // Add scanned sectors to scouted_dirs
212
+ for (const dir of scoutedSet) {
213
+ if (!this.state.scouted_dirs.includes(dir)) {
214
+ this.state.scouted_dirs.push(dir);
215
+ }
216
+ }
217
+ // Recompute coverage from codebase_index × scouted_dirs
218
+ if (this.state.codebase_index) {
219
+ const scoutedDirSet = new Set(this.state.scouted_dirs.map(d => d.replace(/\/$/, '')));
220
+ let scannedSectors = 0;
221
+ let scannedFiles = 0;
222
+ let totalFiles = 0;
223
+ let totalSectors = 0;
224
+ for (const mod of this.state.codebase_index.modules) {
225
+ if (mod.production === false)
226
+ continue;
227
+ const fc = mod.production_file_count ?? mod.file_count ?? 0;
228
+ totalFiles += fc;
229
+ totalSectors++;
230
+ if (scoutedDirSet.has(mod.path) || scoutedDirSet.has(mod.path + '/')) {
231
+ scannedSectors++;
232
+ scannedFiles += fc;
233
+ }
234
+ }
235
+ this.state.sectors_scanned = scannedSectors;
236
+ this.state.sectors_total = totalSectors;
237
+ this.state.files_scanned = scannedFiles;
238
+ this.state.files_total = totalFiles;
239
+ }
240
+ }
241
+ }
242
+ }
243
+ catch (err) {
244
+ if (err instanceof Error && !('code' in err && err.code === 'ENOENT')) {
245
+ console.warn(`[promptwheel] failed to seed coverage from sectors.json: ${err.message}`);
246
+ }
247
+ }
248
+ // Store decay rate for lazy loading later
249
+ this.learningsDecayRate = config.learnings_decay_rate;
250
+ // Create run folder
251
+ const runsDir = path.join(this.bsDir, 'runs');
252
+ this.runDir = path.join(runsDir, runId);
253
+ this.eventsPath = path.join(this.runDir, 'events.ndjson');
254
+ fs.mkdirSync(path.join(this.runDir, 'diffs'), { recursive: true });
255
+ fs.mkdirSync(path.join(this.runDir, 'artifacts'), { recursive: true });
256
+ // Write initial state
257
+ this.persistState();
258
+ // Log session start
259
+ this.appendEvent('SESSION_START', {
260
+ config,
261
+ project_id: projectId,
262
+ });
263
+ return this.state;
264
+ }
265
+ /** Get current state or throw */
266
+ require() {
267
+ if (!this.state) {
268
+ throw new Error('No active run. Call promptwheel_start_session first.');
269
+ }
270
+ return this.state;
271
+ }
272
+ /** Get current state (may be null) */
273
+ get current() {
274
+ return this.state;
275
+ }
276
+ /** Get run directory path */
277
+ get dir() {
278
+ return this.runDir;
279
+ }
280
+ // -----------------------------------------------------------------------
281
+ // State mutations (all persist + log)
282
+ // -----------------------------------------------------------------------
283
+ /** Transition to a new phase */
284
+ setPhase(phase) {
285
+ const s = this.require();
286
+ const oldPhase = s.phase;
287
+ s.phase = phase;
288
+ s.phase_entry_step = s.step_count;
289
+ this.persistState();
290
+ this.appendEvent('ADVANCE_RETURNED', {
291
+ old_phase: oldPhase,
292
+ new_phase: phase,
293
+ });
294
+ }
295
+ /** Increment step counter (called on each advance) */
296
+ incrementStep() {
297
+ const s = this.require();
298
+ s.step_count++;
299
+ s.ticket_step_count++;
300
+ s.total_tool_calls++;
301
+ this.persistState();
302
+ }
303
+ /** Assign a ticket as current work */
304
+ assignTicket(ticketId) {
305
+ const s = this.require();
306
+ s.current_ticket_id = ticketId;
307
+ s.ticket_step_count = 0;
308
+ s.plan_approved = false;
309
+ s.current_ticket_plan = null;
310
+ s.plan_rejections = 0;
311
+ s.qa_retries = 0;
312
+ s.last_qa_failure = null;
313
+ s.last_plan_rejection_reason = null;
314
+ s.spindle = emptySpindle(); // Fresh spindle per ticket — prevents false positives from prior ticket
315
+ this.persistState();
316
+ this.appendEvent('TICKET_ASSIGNED', { ticket_id: ticketId });
317
+ }
318
+ /** Mark current ticket completed */
319
+ completeTicket() {
320
+ const s = this.require();
321
+ s.tickets_completed++;
322
+ s.codebase_index_dirty = true;
323
+ const ticketId = s.current_ticket_id;
324
+ s.current_ticket_id = null;
325
+ s.current_ticket_plan = null;
326
+ s.plan_approved = false;
327
+ s.ticket_step_count = 0;
328
+ this.persistState();
329
+ this.appendEvent('TICKET_COMPLETED', { ticket_id: ticketId });
330
+ }
331
+ /** Mark current ticket failed */
332
+ failTicket(reason) {
333
+ const s = this.require();
334
+ s.tickets_failed++;
335
+ s.codebase_index_dirty = true;
336
+ const ticketId = s.current_ticket_id;
337
+ s.current_ticket_id = null;
338
+ s.current_ticket_plan = null;
339
+ s.plan_approved = false;
340
+ s.ticket_step_count = 0;
341
+ this.persistState();
342
+ this.appendEvent('TICKET_FAILED', { ticket_id: ticketId, reason });
343
+ }
344
+ /** Reset spindle and ticket state for recovery after a spindle abort */
345
+ resetForSpindleRecovery() {
346
+ const s = this.require();
347
+ s.spindle = emptySpindle();
348
+ s.current_ticket_id = null;
349
+ s.current_ticket_plan = null;
350
+ s.plan_approved = false;
351
+ s.plan_rejections = 0;
352
+ s.qa_retries = 0;
353
+ s.ticket_step_count = 0;
354
+ s.last_qa_failure = null;
355
+ s.last_plan_rejection_reason = null;
356
+ this.persistState();
357
+ }
358
+ /** Add a hint */
359
+ addHint(hint) {
360
+ const s = this.require();
361
+ s.hints.push(hint);
362
+ this.persistState();
363
+ this.appendEvent('USER_OVERRIDE', { hint });
364
+ }
365
+ /** Consume and return all pending hints */
366
+ consumeHints() {
367
+ const s = this.require();
368
+ const hints = [...s.hints];
369
+ s.hints = [];
370
+ this.persistState();
371
+ for (const h of hints) {
372
+ this.appendEvent('HINT_CONSUMED', { hint: h });
373
+ }
374
+ return hints;
375
+ }
376
+ /** End the run */
377
+ end() {
378
+ const s = this.require();
379
+ this.appendEvent('SESSION_END', {
380
+ tickets_completed: s.tickets_completed,
381
+ tickets_failed: s.tickets_failed,
382
+ prs_created: s.prs_created,
383
+ step_count: s.step_count,
384
+ });
385
+ // Release session lock
386
+ try {
387
+ const lockPath = path.join(this.bsDir, 'session.lock');
388
+ if (fs.existsSync(lockPath))
389
+ fs.unlinkSync(lockPath);
390
+ }
391
+ catch { /* ignore cleanup failures */ }
392
+ const finalState = { ...s };
393
+ this.state = null;
394
+ this.runDir = null;
395
+ this.eventsPath = null;
396
+ return finalState;
397
+ }
398
+ // -----------------------------------------------------------------------
399
+ // Ticket worker lifecycle (parallel mode)
400
+ // -----------------------------------------------------------------------
401
+ /** Initialize a ticket worker entry */
402
+ initTicketWorker(ticketId, _ticket) {
403
+ const s = this.require();
404
+ s.ticket_workers[ticketId] = {
405
+ phase: 'PLAN',
406
+ plan: null,
407
+ plan_approved: false,
408
+ plan_rejections: 0,
409
+ qa_retries: 0,
410
+ step_count: 0,
411
+ last_active_at_step: s.step_count,
412
+ spindle: emptySpindle(),
413
+ last_qa_failure: null,
414
+ };
415
+ this.persistState();
416
+ this.appendEvent('TICKET_ASSIGNED', { ticket_id: ticketId, parallel: true });
417
+ }
418
+ /** Get a ticket worker state */
419
+ getTicketWorker(ticketId) {
420
+ const s = this.require();
421
+ return s.ticket_workers[ticketId] ?? null;
422
+ }
423
+ /** Update a ticket worker state */
424
+ updateTicketWorker(ticketId, updates) {
425
+ const s = this.require();
426
+ const worker = s.ticket_workers[ticketId];
427
+ if (!worker)
428
+ throw new Error(`No worker for ticket ${ticketId}`);
429
+ Object.assign(worker, updates);
430
+ this.persistState();
431
+ }
432
+ /** Complete a ticket worker — increment counters and remove from workers */
433
+ completeTicketWorker(ticketId) {
434
+ const s = this.require();
435
+ const worker = s.ticket_workers[ticketId];
436
+ if (worker) {
437
+ s.step_count += worker.step_count;
438
+ s.tickets_completed++;
439
+ s.codebase_index_dirty = true;
440
+ delete s.ticket_workers[ticketId];
441
+ this.persistState();
442
+ this.appendEvent('TICKET_COMPLETED', { ticket_id: ticketId, parallel: true });
443
+ }
444
+ }
445
+ /** Fail a ticket worker — increment counters and remove from workers */
446
+ failTicketWorker(ticketId, reason) {
447
+ const s = this.require();
448
+ const worker = s.ticket_workers[ticketId];
449
+ if (worker) {
450
+ s.step_count += worker.step_count;
451
+ s.tickets_failed++;
452
+ s.codebase_index_dirty = true;
453
+ delete s.ticket_workers[ticketId];
454
+ this.persistState();
455
+ this.appendEvent('TICKET_FAILED', { ticket_id: ticketId, reason, parallel: true });
456
+ }
457
+ }
458
+ /** Check if all ticket workers are done */
459
+ allWorkersComplete() {
460
+ const s = this.require();
461
+ return Object.keys(s.ticket_workers).length === 0;
462
+ }
463
+ // -----------------------------------------------------------------------
464
+ // Event logging
465
+ // -----------------------------------------------------------------------
466
+ /** Append an event to events.ndjson */
467
+ appendEvent(type, payload) {
468
+ const step = this.state?.step_count ?? 0;
469
+ const event = {
470
+ ts: new Date().toISOString(),
471
+ step,
472
+ type,
473
+ payload,
474
+ };
475
+ if (this.eventsPath) {
476
+ fs.appendFileSync(this.eventsPath, JSON.stringify(event) + '\n', 'utf8');
477
+ }
478
+ }
479
+ /** Save an artifact file */
480
+ saveArtifact(filename, content) {
481
+ if (!this.runDir)
482
+ return;
483
+ const artifactPath = path.join(this.runDir, 'artifacts', filename);
484
+ fs.writeFileSync(artifactPath, content, 'utf8');
485
+ }
486
+ /** Save a diff/patch file */
487
+ saveDiff(step, ticketId, patch) {
488
+ if (!this.runDir)
489
+ return;
490
+ const diffPath = path.join(this.runDir, 'diffs', `${step}-${ticketId}.patch`);
491
+ fs.writeFileSync(diffPath, patch, 'utf8');
492
+ }
493
+ // -----------------------------------------------------------------------
494
+ // Helpers
495
+ // -----------------------------------------------------------------------
496
+ /** Check if any budget is exhausted */
497
+ isBudgetExhausted() {
498
+ const s = this.require();
499
+ if (s.step_count >= s.step_budget) {
500
+ return { exhausted: true, which: 'step_budget' };
501
+ }
502
+ if (s.ticket_step_count >= s.ticket_step_budget) {
503
+ return { exhausted: true, which: 'ticket_step_budget' };
504
+ }
505
+ // PR limit only applies when creating PRs
506
+ // PR limit only applies when creating PRs
507
+ if (s.create_prs && s.prs_created >= s.max_prs) {
508
+ return { exhausted: true, which: 'max_prs' };
509
+ }
510
+ if (s.expires_at && new Date() > new Date(s.expires_at)) {
511
+ return { exhausted: true, which: 'time_budget' };
512
+ }
513
+ return { exhausted: false };
514
+ }
515
+ /** Check if approaching budget limits (80%) */
516
+ getBudgetWarnings() {
517
+ const s = this.require();
518
+ const warnings = [];
519
+ if (s.step_count >= s.step_budget * 0.8) {
520
+ warnings.push(`step_budget: ${s.step_count}/${s.step_budget}`);
521
+ }
522
+ // Only warn about ticket step budget if it's a real limit (not effectively disabled)
523
+ if (s.ticket_step_budget < 9999 && s.ticket_step_count >= s.ticket_step_budget * 0.8) {
524
+ warnings.push(`ticket_step_budget: ${s.ticket_step_count}/${s.ticket_step_budget}`);
525
+ }
526
+ // Only warn about PR limit when creating PRs
527
+ if (s.create_prs && s.prs_created >= s.max_prs * 0.8) {
528
+ warnings.push(`max_prs: ${s.prs_created}/${s.max_prs}`);
529
+ }
530
+ return warnings;
531
+ }
532
+ /** Build the digest for advance responses */
533
+ buildDigest() {
534
+ const s = this.require();
535
+ const timeRemainingMs = s.expires_at
536
+ ? Math.max(0, new Date(s.expires_at).getTime() - Date.now())
537
+ : null;
538
+ return {
539
+ step: s.step_count,
540
+ phase: s.phase,
541
+ tickets_completed: s.tickets_completed,
542
+ tickets_failed: s.tickets_failed,
543
+ budget_remaining: s.step_budget - s.step_count,
544
+ ticket_budget_remaining: s.ticket_step_budget >= 9999 ? -1 : s.ticket_step_budget - s.ticket_step_count,
545
+ spindle_risk: checkSpindle(s.spindle).risk,
546
+ time_remaining_ms: timeRemainingMs,
547
+ coverage: {
548
+ sectors_scanned: s.sectors_scanned,
549
+ sectors_total: s.sectors_total,
550
+ files_scanned: s.files_scanned,
551
+ files_total: s.files_total,
552
+ percent: s.files_total > 0 ? Math.round((s.files_scanned / s.files_total) * 100) : 0,
553
+ },
554
+ };
555
+ }
556
+ // -----------------------------------------------------------------------
557
+ // Lazy learnings
558
+ // -----------------------------------------------------------------------
559
+ /** Lazy-load learnings from disk on first access. No-op if already loaded or disabled. */
560
+ ensureLearningsLoaded() {
561
+ const s = this.require();
562
+ if (s.learnings_loaded || !s.learnings_enabled)
563
+ return;
564
+ try {
565
+ s.cached_learnings = loadLearnings(this.projectPath, this.learningsDecayRate);
566
+ }
567
+ catch (err) {
568
+ this.appendEvent('LEARNINGS_LOAD_FAILED', { error: err instanceof Error ? err.message : String(err) });
569
+ s.cached_learnings = [];
570
+ }
571
+ s.learnings_loaded = true;
572
+ }
573
+ // -----------------------------------------------------------------------
574
+ // Persistence
575
+ // -----------------------------------------------------------------------
576
+ persistState() {
577
+ if (!this.runDir || !this.state)
578
+ return;
579
+ const statePath = path.join(this.runDir, 'state.json');
580
+ fs.writeFileSync(statePath, JSON.stringify(this.state, null, 2) + '\n', 'utf8');
581
+ }
582
+ }
583
+ //# sourceMappingURL=run-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-manager.js","sourceRoot":"","sources":["../src/run-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Thin bridge for recording quality signals from the MCP/plugin path.
3
+ *
4
+ * Reads and writes `.promptwheel/run-state.json` directly using the same
5
+ * format as CLI's `packages/cli/src/lib/run-state.ts`. Uses tmp+rename
6
+ * atomic write pattern. No mutex needed — MCP and CLI don't run
7
+ * simultaneously on the same project.
8
+ */
9
+ /**
10
+ * Record an execution quality signal. Same format as CLI's recordQualitySignal.
11
+ */
12
+ export declare function recordQualitySignal(projectRoot: string, signal: 'first_pass' | 'retried' | 'qa_pass' | 'qa_fail'): void;
13
+ //# sourceMappingURL=run-state-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-state-bridge.d.ts","sourceRoot":"","sources":["../src/run-state-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA6FH;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GACvD,IAAI,CAgBN"}