@promptwheel/cli 0.6.0 → 0.7.1

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 (151) hide show
  1. package/dist/bin/promptwheel.d.ts +1 -1
  2. package/dist/bin/promptwheel.js +2 -2
  3. package/dist/commands/auto-auth.js +2 -2
  4. package/dist/commands/auto-auth.js.map +1 -1
  5. package/dist/commands/solo-analytics.d.ts.map +1 -1
  6. package/dist/commands/solo-analytics.js +185 -2
  7. package/dist/commands/solo-analytics.js.map +1 -1
  8. package/dist/commands/solo-auto.d.ts.map +1 -1
  9. package/dist/commands/solo-auto.js +11 -12
  10. package/dist/commands/solo-auto.js.map +1 -1
  11. package/dist/commands/solo-daemon.d.ts.map +1 -1
  12. package/dist/commands/solo-daemon.js +4 -0
  13. package/dist/commands/solo-daemon.js.map +1 -1
  14. package/dist/commands/solo-inspect.d.ts.map +1 -1
  15. package/dist/commands/solo-inspect.js +93 -5
  16. package/dist/commands/solo-inspect.js.map +1 -1
  17. package/dist/commands/solo-nudge.d.ts.map +1 -1
  18. package/dist/commands/solo-nudge.js +38 -7
  19. package/dist/commands/solo-nudge.js.map +1 -1
  20. package/dist/commands/solo-trajectory.d.ts.map +1 -1
  21. package/dist/commands/solo-trajectory.js +23 -5
  22. package/dist/commands/solo-trajectory.js.map +1 -1
  23. package/dist/commands/solo.d.ts.map +1 -1
  24. package/dist/commands/solo.js +8 -2
  25. package/dist/commands/solo.js.map +1 -1
  26. package/dist/lib/cycle-context.d.ts +5 -0
  27. package/dist/lib/cycle-context.d.ts.map +1 -1
  28. package/dist/lib/cycle-context.js +12 -4
  29. package/dist/lib/cycle-context.js.map +1 -1
  30. package/dist/lib/daemon-fork.d.ts +1 -0
  31. package/dist/lib/daemon-fork.d.ts.map +1 -1
  32. package/dist/lib/daemon-fork.js +2 -0
  33. package/dist/lib/daemon-fork.js.map +1 -1
  34. package/dist/lib/daemon.d.ts +1 -0
  35. package/dist/lib/daemon.d.ts.map +1 -1
  36. package/dist/lib/daemon.js +2 -1
  37. package/dist/lib/daemon.js.map +1 -1
  38. package/dist/lib/display-adapter-log.d.ts +6 -0
  39. package/dist/lib/display-adapter-log.d.ts.map +1 -1
  40. package/dist/lib/display-adapter-log.js +3 -0
  41. package/dist/lib/display-adapter-log.js.map +1 -1
  42. package/dist/lib/display-adapter-spinner.d.ts +6 -0
  43. package/dist/lib/display-adapter-spinner.d.ts.map +1 -1
  44. package/dist/lib/display-adapter-spinner.js +4 -1
  45. package/dist/lib/display-adapter-spinner.js.map +1 -1
  46. package/dist/lib/display-adapter-tui.d.ts +6 -0
  47. package/dist/lib/display-adapter-tui.d.ts.map +1 -1
  48. package/dist/lib/display-adapter-tui.js +3 -0
  49. package/dist/lib/display-adapter-tui.js.map +1 -1
  50. package/dist/lib/display-adapter.d.ts +6 -0
  51. package/dist/lib/display-adapter.d.ts.map +1 -1
  52. package/dist/lib/error-ledger.d.ts +39 -0
  53. package/dist/lib/error-ledger.d.ts.map +1 -0
  54. package/dist/lib/error-ledger.js +73 -0
  55. package/dist/lib/error-ledger.js.map +1 -0
  56. package/dist/lib/goals.d.ts +1 -1
  57. package/dist/lib/goals.d.ts.map +1 -1
  58. package/dist/lib/goals.js +39 -7
  59. package/dist/lib/goals.js.map +1 -1
  60. package/dist/lib/learnings.d.ts.map +1 -1
  61. package/dist/lib/learnings.js +92 -68
  62. package/dist/lib/learnings.js.map +1 -1
  63. package/dist/lib/pr-outcomes.d.ts +42 -0
  64. package/dist/lib/pr-outcomes.d.ts.map +1 -0
  65. package/dist/lib/pr-outcomes.js +97 -0
  66. package/dist/lib/pr-outcomes.js.map +1 -0
  67. package/dist/lib/qa-stats.d.ts.map +1 -1
  68. package/dist/lib/qa-stats.js +3 -1
  69. package/dist/lib/qa-stats.js.map +1 -1
  70. package/dist/lib/retention.d.ts +3 -3
  71. package/dist/lib/retention.d.ts.map +1 -1
  72. package/dist/lib/retention.js +12 -12
  73. package/dist/lib/retention.js.map +1 -1
  74. package/dist/lib/run-history.d.ts +27 -0
  75. package/dist/lib/run-history.d.ts.map +1 -1
  76. package/dist/lib/run-history.js.map +1 -1
  77. package/dist/lib/run-state.d.ts +42 -0
  78. package/dist/lib/run-state.d.ts.map +1 -1
  79. package/dist/lib/run-state.js +66 -0
  80. package/dist/lib/run-state.js.map +1 -1
  81. package/dist/lib/session-report.d.ts.map +1 -1
  82. package/dist/lib/session-report.js +42 -0
  83. package/dist/lib/session-report.js.map +1 -1
  84. package/dist/lib/solo-auto-between-cycles.d.ts.map +1 -1
  85. package/dist/lib/solo-auto-between-cycles.js +381 -40
  86. package/dist/lib/solo-auto-between-cycles.js.map +1 -1
  87. package/dist/lib/solo-auto-drill.d.ts +228 -0
  88. package/dist/lib/solo-auto-drill.d.ts.map +1 -0
  89. package/dist/lib/solo-auto-drill.js +1229 -0
  90. package/dist/lib/solo-auto-drill.js.map +1 -0
  91. package/dist/lib/solo-auto-execute.d.ts +8 -0
  92. package/dist/lib/solo-auto-execute.d.ts.map +1 -1
  93. package/dist/lib/solo-auto-execute.js +99 -7
  94. package/dist/lib/solo-auto-execute.js.map +1 -1
  95. package/dist/lib/solo-auto-filter.js +3 -3
  96. package/dist/lib/solo-auto-filter.js.map +1 -1
  97. package/dist/lib/solo-auto-finalize.d.ts.map +1 -1
  98. package/dist/lib/solo-auto-finalize.js +32 -2
  99. package/dist/lib/solo-auto-finalize.js.map +1 -1
  100. package/dist/lib/solo-auto-init-qa.d.ts.map +1 -1
  101. package/dist/lib/solo-auto-init-qa.js +3 -1
  102. package/dist/lib/solo-auto-init-qa.js.map +1 -1
  103. package/dist/lib/solo-auto-scout.d.ts +1 -0
  104. package/dist/lib/solo-auto-scout.d.ts.map +1 -1
  105. package/dist/lib/solo-auto-scout.js +44 -13
  106. package/dist/lib/solo-auto-scout.js.map +1 -1
  107. package/dist/lib/solo-auto-state.d.ts.map +1 -1
  108. package/dist/lib/solo-auto-state.js +88 -28
  109. package/dist/lib/solo-auto-state.js.map +1 -1
  110. package/dist/lib/solo-auto-types.d.ts +64 -3
  111. package/dist/lib/solo-auto-types.d.ts.map +1 -1
  112. package/dist/lib/solo-auto.d.ts +3 -3
  113. package/dist/lib/solo-auto.d.ts.map +1 -1
  114. package/dist/lib/solo-auto.js +83 -4
  115. package/dist/lib/solo-auto.js.map +1 -1
  116. package/dist/lib/solo-config.d.ts +51 -3
  117. package/dist/lib/solo-config.d.ts.map +1 -1
  118. package/dist/lib/solo-config.js +43 -2
  119. package/dist/lib/solo-config.js.map +1 -1
  120. package/dist/lib/solo-hints.d.ts +10 -0
  121. package/dist/lib/solo-hints.d.ts.map +1 -1
  122. package/dist/lib/solo-hints.js +22 -0
  123. package/dist/lib/solo-hints.js.map +1 -1
  124. package/dist/lib/solo-session-summary.d.ts +12 -1
  125. package/dist/lib/solo-session-summary.d.ts.map +1 -1
  126. package/dist/lib/solo-session-summary.js +50 -6
  127. package/dist/lib/solo-session-summary.js.map +1 -1
  128. package/dist/lib/spindle-incidents.d.ts +29 -0
  129. package/dist/lib/spindle-incidents.d.ts.map +1 -0
  130. package/dist/lib/spindle-incidents.js +56 -0
  131. package/dist/lib/spindle-incidents.js.map +1 -0
  132. package/dist/lib/spinner.d.ts +1 -1
  133. package/dist/lib/taste-profile.d.ts.map +1 -1
  134. package/dist/lib/taste-profile.js +14 -8
  135. package/dist/lib/taste-profile.js.map +1 -1
  136. package/dist/lib/ticket-steps/step-spindle.d.ts.map +1 -1
  137. package/dist/lib/ticket-steps/step-spindle.js +14 -0
  138. package/dist/lib/ticket-steps/step-spindle.js.map +1 -1
  139. package/dist/lib/trajectory-generate.d.ts +73 -0
  140. package/dist/lib/trajectory-generate.d.ts.map +1 -1
  141. package/dist/lib/trajectory-generate.js +368 -12
  142. package/dist/lib/trajectory-generate.js.map +1 -1
  143. package/dist/lib/trajectory.d.ts +1 -1
  144. package/dist/lib/trajectory.d.ts.map +1 -1
  145. package/dist/lib/trajectory.js +67 -6
  146. package/dist/lib/trajectory.js.map +1 -1
  147. package/dist/tui/screens/auto.d.ts +7 -0
  148. package/dist/tui/screens/auto.d.ts.map +1 -1
  149. package/dist/tui/screens/auto.js +18 -1
  150. package/dist/tui/screens/auto.js.map +1 -1
  151. package/package.json +3 -3
@@ -7,7 +7,7 @@ import * as path from 'node:path';
7
7
  import { runClaude, parseClaudeOutput } from '@promptwheel/core/scout';
8
8
  import { buildCodebaseIndex, formatIndexForPrompt } from './codebase-index.js';
9
9
  import { detectProjectMetadata, formatMetadataForPrompt } from './project-metadata/index.js';
10
- import { serializeTrajectoryToYaml, parseTrajectoryYaml, } from '@promptwheel/core/trajectory/shared';
10
+ import { serializeTrajectoryToYaml, parseTrajectoryYaml, detectCycle, } from '@promptwheel/core/trajectory/shared';
11
11
  export async function generateTrajectory(opts) {
12
12
  // 1. Build codebase context
13
13
  const excludeDirs = ['node_modules', 'dist', 'build', '.git', '.promptwheel', 'coverage', '__pycache__'];
@@ -30,7 +30,7 @@ export async function generateTrajectory(opts) {
30
30
  // 4. Parse JSON response
31
31
  const parsed = parseClaudeOutput(result.output);
32
32
  if (!parsed || !parsed.name || !parsed.steps?.length) {
33
- throw new Error('Failed to parse trajectory from LLM output');
33
+ throw new Error(`Failed to parse trajectory from LLM output (name: ${parsed?.name ?? 'missing'}, steps: ${parsed?.steps?.length ?? 0})`);
34
34
  }
35
35
  // 5. Validate and build Trajectory
36
36
  const trajectory = validateAndBuild(parsed);
@@ -49,6 +49,125 @@ export async function generateTrajectory(opts) {
49
49
  fs.writeFileSync(filePath, yaml, 'utf-8');
50
50
  return { trajectory, yaml, filePath };
51
51
  }
52
+ /**
53
+ * Generate a trajectory from scout proposals (used by drill mode).
54
+ * Clusters and sequences proposals into ordered trajectory steps.
55
+ */
56
+ export async function generateTrajectoryFromProposals(opts) {
57
+ // 1. Build codebase context
58
+ let indexBlock;
59
+ let metaBlock;
60
+ try {
61
+ const excludeDirs = ['node_modules', 'dist', 'build', '.git', '.promptwheel', 'coverage', '__pycache__'];
62
+ const codebaseIndex = buildCodebaseIndex(opts.repoRoot, excludeDirs, true);
63
+ const projectMeta = detectProjectMetadata(opts.repoRoot);
64
+ indexBlock = formatIndexForPrompt(codebaseIndex, 0);
65
+ metaBlock = formatMetadataForPrompt(projectMeta);
66
+ }
67
+ catch (err) {
68
+ throw new Error(`Trajectory generation failed during codebase indexing: ${err instanceof Error ? err.message : String(err)}`);
69
+ }
70
+ // 2. Format proposals and build prompt
71
+ const proposalsBlock = formatProposalsForTrajectoryPrompt(opts.proposals);
72
+ const prompt = buildGenerateFromProposalsPrompt(proposalsBlock, indexBlock, metaBlock, {
73
+ previousTrajectories: opts.previousTrajectories,
74
+ diversityHint: opts.diversityHint,
75
+ sectorContext: opts.sectorContext,
76
+ tasteContext: opts.tasteContext,
77
+ learningsContext: opts.learningsContext,
78
+ dedupContext: opts.dedupContext,
79
+ goalContext: opts.goalContext,
80
+ metricsHint: opts.metricsHint,
81
+ dependencyEdges: opts.dependencyEdges,
82
+ causalContext: opts.causalContext,
83
+ ambitionLevel: opts.ambitionLevel,
84
+ });
85
+ // 3. Call LLM (sonnet for cost efficiency)
86
+ const result = await runClaude({
87
+ prompt,
88
+ cwd: opts.repoRoot,
89
+ timeoutMs: opts.timeoutMs ?? 120_000,
90
+ model: opts.model ?? 'sonnet',
91
+ });
92
+ if (!result.success) {
93
+ throw new Error(`Trajectory generation failed during LLM call: ${result.error}`);
94
+ }
95
+ // 4. Parse JSON response
96
+ const parsed = parseClaudeOutput(result.output);
97
+ if (!parsed || !parsed.name || !parsed.steps?.length) {
98
+ const preview = (result.output || '').slice(0, 200);
99
+ throw new Error(`Trajectory generation failed during response parsing (name: ${parsed?.name ?? 'missing'}, steps: ${parsed?.steps?.length ?? 0}, output: "${preview}")`);
100
+ }
101
+ // 5. Ensure drill- prefix + timestamp for uniqueness
102
+ const timestamp = Date.now();
103
+ if (!parsed.name.startsWith('drill-')) {
104
+ parsed.name = `drill-${parsed.name}`;
105
+ }
106
+ parsed.name = `${parsed.name}-${timestamp}`;
107
+ // 6. Validate and build Trajectory
108
+ let trajectory;
109
+ try {
110
+ trajectory = validateAndBuild(parsed);
111
+ }
112
+ catch (err) {
113
+ throw new Error(`Trajectory generation failed during validation: ${err instanceof Error ? err.message : String(err)}`);
114
+ }
115
+ // 7. Serialize to YAML
116
+ const yaml = serializeTrajectoryToYaml(trajectory);
117
+ // 8. Verify round-trip
118
+ const roundTripped = parseTrajectoryYaml(yaml);
119
+ if (roundTripped.steps.length !== trajectory.steps.length) {
120
+ throw new Error('Trajectory generation failed during YAML round-trip validation');
121
+ }
122
+ // 9. Write to disk
123
+ const slug = slugify(trajectory.name);
124
+ const dir = path.join(opts.repoRoot, '.promptwheel', 'trajectories');
125
+ fs.mkdirSync(dir, { recursive: true });
126
+ const filePath = path.join(dir, `${slug}.yaml`);
127
+ fs.writeFileSync(filePath, yaml, 'utf-8');
128
+ return { trajectory, yaml, filePath };
129
+ }
130
+ // ---------------------------------------------------------------------------
131
+ // Proposal formatting
132
+ // ---------------------------------------------------------------------------
133
+ /**
134
+ * Compute a suggested scope glob from proposal file paths.
135
+ * Finds the common parent directory and appends /** for a targeted scope.
136
+ * Returns undefined if no meaningful scope can be computed.
137
+ */
138
+ export function computeSuggestedScope(files) {
139
+ if (files.length === 0)
140
+ return undefined;
141
+ const dirs = files
142
+ .map(f => f.split('/').slice(0, -1)) // drop filename, keep dir segments
143
+ .filter(d => d.length > 0);
144
+ if (dirs.length === 0)
145
+ return undefined;
146
+ // Find common prefix across all directory paths
147
+ const first = dirs[0];
148
+ let commonLen = first.length;
149
+ for (const dir of dirs.slice(1)) {
150
+ let i = 0;
151
+ while (i < commonLen && i < dir.length && first[i] === dir[i])
152
+ i++;
153
+ commonLen = i;
154
+ }
155
+ if (commonLen === 0)
156
+ return undefined;
157
+ return first.slice(0, commonLen).join('/') + '/**';
158
+ }
159
+ export function formatProposalsForTrajectoryPrompt(proposals) {
160
+ return proposals.map((p, i) => {
161
+ const impact = p.impact_score ?? 5;
162
+ const score = (impact * (p.confidence / 100)).toFixed(1);
163
+ const files = p.files.length > 0 ? p.files.join(', ') : p.allowed_paths.join(', ');
164
+ const suggestedScope = computeSuggestedScope(p.files);
165
+ return `${i + 1}. [${p.category}] ${p.title} (score: ${score}, complexity: ${p.estimated_complexity})
166
+ Files: ${files}${suggestedScope ? `\n Suggested scope: ${suggestedScope}` : ''}
167
+ ${p.description}
168
+ Rationale: ${p.rationale}`;
169
+ }).join('\n\n');
170
+ }
52
171
  // ---------------------------------------------------------------------------
53
172
  // Prompt
54
173
  // ---------------------------------------------------------------------------
@@ -89,6 +208,10 @@ ${indexBlock}
89
208
 
90
209
  6. Keep it to 3-8 steps. Fewer is better if the goal is simple.
91
210
 
211
+ 7. Assign a priority (1-10) to each step. Higher priority steps are executed first among ready steps.
212
+
213
+ 8. Set max_retries per step: 1-2 for trivial steps (adding a function, fixing an import), 3 for standard work, 4-5 for complex architectural changes.
214
+
92
215
  ## Output Format
93
216
 
94
217
  Respond with ONLY a JSON object (no markdown, no explanation):
@@ -105,11 +228,213 @@ Respond with ONLY a JSON object (no markdown, no explanation):
105
228
  "categories": ["refactor"],
106
229
  "acceptance_criteria": ["Criterion that can be checked"],
107
230
  "verification_commands": ["command that exits 0 on success"],
108
- "depends_on": []
231
+ "depends_on": [],
232
+ "priority": 7,
233
+ "max_retries": 3
109
234
  }
110
235
  ]
111
236
  }`;
112
237
  }
238
+ export function buildGenerateFromProposalsPrompt(proposalsBlock, indexBlock, metaBlock, context) {
239
+ const sections = [];
240
+ sections.push(`You are a principal engineer planning a multi-step implementation trajectory from scout proposals.
241
+
242
+ Given a set of improvement proposals found by automated scouting, cluster related proposals and sequence them into an ordered trajectory that an AI coding agent can execute step by step.
243
+
244
+ ## Scout Proposals
245
+
246
+ ${proposalsBlock}
247
+
248
+ ## Codebase Context
249
+
250
+ ${metaBlock}
251
+
252
+ ${indexBlock}`);
253
+ if (context?.sectorContext) {
254
+ sections.push(`## Codebase Sectors
255
+
256
+ The codebase is organized into these sectors. Use this to understand spatial layout and organize steps to move through related areas together.
257
+
258
+ ${context.sectorContext}`);
259
+ }
260
+ if (context?.previousTrajectories) {
261
+ sections.push(`## Previous Trajectories (this session)
262
+
263
+ These trajectories have already been generated and executed. DO NOT repeat the same themes or areas. Pick a different vein to drill into.
264
+
265
+ ${context.previousTrajectories}`);
266
+ }
267
+ if (context?.diversityHint) {
268
+ sections.push(`## Coverage So Far
269
+
270
+ ${context.diversityHint}
271
+
272
+ Prefer under-explored categories and scopes. Avoid creating another trajectory in areas that have already been drilled multiple times.`);
273
+ }
274
+ if (context?.tasteContext) {
275
+ sections.push(`## Project Taste Profile
276
+
277
+ This project has learned preferences from past outcomes. Respect these when choosing trajectory themes:
278
+
279
+ ${context.tasteContext}`);
280
+ }
281
+ if (context?.learningsContext) {
282
+ sections.push(`## Cross-Run Learnings
283
+
284
+ Insights from previous sessions. Use these to avoid repeating mistakes and build on successful patterns:
285
+
286
+ ${context.learningsContext}`);
287
+ }
288
+ if (context?.dedupContext) {
289
+ sections.push(`## Recently Completed/Attempted Work
290
+
291
+ These proposals have already been done or attempted. Do NOT create trajectory steps that duplicate this work:
292
+
293
+ ${context.dedupContext}`);
294
+ }
295
+ if (context?.goalContext) {
296
+ sections.push(`## Active Goal
297
+
298
+ The project has an active goal. Trajectory steps should align with and advance this goal when possible:
299
+
300
+ ${context.goalContext}`);
301
+ }
302
+ if (context?.metricsHint) {
303
+ sections.push(`## Drill Health Metrics
304
+
305
+ Historical performance data — use this to bias toward categories and patterns that succeed:
306
+
307
+ ${context.metricsHint}`);
308
+ }
309
+ if (context?.dependencyEdges) {
310
+ sections.push(`## Module Dependency Graph
311
+
312
+ Use this to order trajectory steps correctly — modules that are imported by others should be fixed first:
313
+
314
+ ${context.dependencyEdges}`);
315
+ }
316
+ if (context?.causalContext) {
317
+ sections.push(`## Trajectory Chain (recent history)
318
+
319
+ Recent trajectories made specific changes. Use this to BUILD ON that work — propose follow-up improvements, tests for newly added code, or fixes that are now unblocked:
320
+
321
+ ${context.causalContext}`);
322
+ }
323
+ sections.push(`## Requirements
324
+
325
+ 1. Cluster related proposals into coherent steps. A step may combine 1-3 related proposals that touch the same area.
326
+
327
+ 2. Each step should be:
328
+ - Self-contained and completable independently (after its dependencies)
329
+ - Scoped to specific files/directories (use glob patterns)
330
+ - Have clear acceptance criteria that an AI can verify
331
+ - Have at least one verification command that exits 0 on success
332
+
333
+ 3. Steps should be ordered logically:
334
+ - Foundation/infrastructure fixes first
335
+ - Core improvements next
336
+ - Testing and cleanup last
337
+ - Use depends_on to express ordering constraints
338
+
339
+ 4. Step IDs should be short kebab-case identifiers (e.g., "fix-types", "add-tests", "refactor-auth")
340
+
341
+ 5. Categories should be from: security, fix, perf, refactor, test, types, cleanup, docs
342
+
343
+ 6. Target step count: ${(() => {
344
+ const a = context?.ambitionLevel ?? 'moderate';
345
+ return a === 'conservative' ? '2-3 steps (short, high-confidence trajectory)' : a === 'ambitious' ? '5-8 steps (longer arc, more ambitious scope)' : '3-5 steps (balanced trajectory)';
346
+ })()} — merge very similar proposals into one step rather than creating many tiny steps.
347
+
348
+ 7. Prioritize higher-scoring proposals. Low-scoring proposals can be dropped if they don't fit the trajectory theme.
349
+
350
+ 8. Assign a priority (1-10) to each step based on impact and urgency. Higher = more important. Steps with the same dependency level will be executed in priority order.
351
+
352
+ ${context?.previousTrajectories ? '9. Choose a DIFFERENT theme from previous trajectories. Explore new areas of the codebase.\n\n10' : '9'}. Set max_retries per step: 1-2 for trivial steps (adding a function, fixing an import), 3 for standard work, 4-5 for complex architectural changes.
353
+
354
+ ${(() => {
355
+ const n = context?.previousTrajectories ? 11 : 10;
356
+ const ambition = context?.ambitionLevel ?? 'moderate';
357
+ const firstStepDirective = ambition === 'conservative'
358
+ ? `**CRITICAL — First step must be trivially safe:** Step 1 MUST touch exactly 1 file, have zero dependencies, and be a guaranteed success (e.g., add a missing type annotation, fix an obvious lint error). The system has low recent completion rates — establish a win before anything else.`
359
+ : ambition === 'ambitious'
360
+ ? `**First step — moderate complexity allowed:** Recent completion rates are strong. Step 1 can tackle a real problem (3-5 files, moderate complexity), but keep it self-contained with zero dependencies on other steps. Save the most complex work for later steps.`
361
+ : `**CRITICAL — First step must be a "gimme":** Step 1 MUST be the simplest, most self-contained change (1-3 files, zero deps, single-cycle completable). Complex work belongs in steps 2+.`;
362
+ const stratificationDirective = `**Complexity gradient across steps:** Structure the trajectory as an escalating difficulty curve:
363
+ - Step 1: ${ambition === 'conservative' ? 'Trivial (1 file, guaranteed win)' : ambition === 'ambitious' ? 'Moderate (real problem, self-contained)' : 'Simple (1-3 files, quick win)'}
364
+ - Step 2: Moderate complexity — builds on step 1, can touch 3-5 files
365
+ - Steps 3+: Full complexity allowed — multi-file refactors, architectural changes
366
+ - Final step: Consolidation — tests for new code, cleanup, or verification
367
+ Each step should be harder than the previous. Never front-load the hardest work.
368
+ For short trajectories (2-3 steps): step 1 stays as described above, remaining steps can be moderate-to-full complexity. The consolidation role merges into the final step.`;
369
+ return `${n}. ${firstStepDirective}\n\n${n + 1}. ${stratificationDirective}`;
370
+ })()}
371
+
372
+ ${context?.previousTrajectories ? '13' : '12'}. **Scope from file paths:** Each proposal lists its relevant files. Compute step scopes from those file paths — use the common parent directory + glob (e.g., if files are "src/auth/login.ts" and "src/auth/session.ts", scope should be "src/auth/**"). Do NOT guess scopes.
373
+
374
+ ## Anti-Patterns to Avoid
375
+
376
+ - Don't scope steps too broadly (e.g., "src/**"). Use specific paths like "src/auth/**" or "packages/core/src/*.ts".
377
+ - Avoid unnecessary dependency chains where every step depends on the previous. Use parallelizable structure when steps are independent.
378
+ - Verification commands MUST be stable and deterministic:
379
+ - Use "npm test", "npx vitest run", "npx tsc --noEmit" — NOT hardcoded line numbers or fragile string matching
380
+ - Do NOT reference specific test files unless they already exist in the codebase
381
+ - Prefer running the full test suite or type checker over narrow assertions
382
+ - Don't create too many tiny steps — merge closely related work into one step.
383
+
384
+ ## Output Format
385
+
386
+ Respond with ONLY a JSON object (no markdown, no explanation):
387
+
388
+ {
389
+ "name": "drill-kebab-case-name",
390
+ "description": "One-line description of the trajectory theme",
391
+ "steps": [
392
+ {
393
+ "id": "step-id",
394
+ "title": "Short imperative title",
395
+ "description": "What this step accomplishes and how",
396
+ "scope": "glob/pattern/**",
397
+ "categories": ["refactor"],
398
+ "acceptance_criteria": ["Criterion that can be checked"],
399
+ "verification_commands": ["command that exits 0 on success"],
400
+ "depends_on": [],
401
+ "priority": 7,
402
+ "max_retries": 3
403
+ }
404
+ ]
405
+ }`);
406
+ return sections.join('\n\n');
407
+ }
408
+ // ---------------------------------------------------------------------------
409
+ // Verification command sanitization
410
+ // ---------------------------------------------------------------------------
411
+ /**
412
+ * Remove empty, nonsensical, or fragile verification commands.
413
+ * Catches common LLM generation issues:
414
+ * - Empty or whitespace-only commands
415
+ * - Pure punctuation/numbers (not real commands)
416
+ * - Commands with hardcoded line numbers (break on any code change)
417
+ */
418
+ export function sanitizeVerificationCommands(commands) {
419
+ return commands.filter(cmd => {
420
+ const trimmed = cmd.trim();
421
+ if (!trimmed)
422
+ return false;
423
+ // Reject pure punctuation/numbers — not a real command
424
+ if (/^[^a-zA-Z]+$/.test(trimmed))
425
+ return false;
426
+ // Reject commands with hardcoded line numbers (fragile — break on any edit)
427
+ // Matches patterns like: grep -n "foo" file.ts:42, --line 15, :123
428
+ if (/:\d+\s*$/.test(trimmed))
429
+ return false;
430
+ if (/--line\s+\d+/.test(trimmed))
431
+ return false;
432
+ // Reject commands that are just "true" or "false" — not a meaningful check
433
+ if (trimmed === 'true' || trimmed === 'false')
434
+ return false;
435
+ return true;
436
+ });
437
+ }
113
438
  export function validateAndBuild(raw) {
114
439
  const steps = raw.steps.map((s) => ({
115
440
  id: String(s.id || '').replace(/[^a-z0-9-]/gi, '-').toLowerCase(),
@@ -118,21 +443,33 @@ export function validateAndBuild(raw) {
118
443
  scope: s.scope ? String(s.scope) : undefined,
119
444
  categories: Array.isArray(s.categories) ? s.categories.map(String) : undefined,
120
445
  acceptance_criteria: Array.isArray(s.acceptance_criteria) ? s.acceptance_criteria.map(String) : [],
121
- verification_commands: Array.isArray(s.verification_commands) ? s.verification_commands.map(String) : [],
446
+ verification_commands: sanitizeVerificationCommands(Array.isArray(s.verification_commands) ? s.verification_commands.map(String) : []),
122
447
  depends_on: Array.isArray(s.depends_on) ? s.depends_on.map(String) : [],
123
- measure: s.measure?.cmd !== undefined && s.measure?.target !== undefined && s.measure?.direction
124
- ? {
448
+ max_retries: typeof s.max_retries === 'number' && s.max_retries > 0 ? s.max_retries : undefined,
449
+ priority: typeof s.priority === 'number' && s.priority >= 1 && s.priority <= 10 ? s.priority : undefined,
450
+ measure: (() => {
451
+ if (!s.measure?.cmd || s.measure?.target === undefined || !s.measure?.direction)
452
+ return undefined;
453
+ const parsedTarget = Number(s.measure.target);
454
+ if (isNaN(parsedTarget))
455
+ return undefined; // reject unparseable measure targets
456
+ return {
125
457
  cmd: String(s.measure.cmd),
126
- target: Number(s.measure.target),
458
+ target: parsedTarget,
127
459
  direction: s.measure.direction === 'down' ? 'down' : 'up',
128
- }
129
- : undefined,
460
+ };
461
+ })(),
130
462
  }));
463
+ // Validate: must have at least one step
464
+ if (steps.length === 0)
465
+ throw new Error('Trajectory has no steps');
131
466
  // Validate: no duplicate IDs
132
467
  const ids = new Set();
133
468
  for (const step of steps) {
134
469
  if (!step.id)
135
470
  throw new Error('Step missing ID');
471
+ if (!step.title)
472
+ throw new Error(`Step "${step.id}" missing title`);
136
473
  if (ids.has(step.id))
137
474
  throw new Error(`Duplicate step ID: ${step.id}`);
138
475
  ids.add(step.id);
@@ -144,6 +481,18 @@ export function validateAndBuild(raw) {
144
481
  throw new Error(`Step "${step.id}" depends on unknown step "${dep}"`);
145
482
  }
146
483
  }
484
+ // Validate: no circular dependencies
485
+ const cycle = detectCycle(steps);
486
+ if (cycle)
487
+ throw new Error(`Circular dependency detected: ${cycle.join(' → ')}`);
488
+ // Validate: step scopes should not be overly broad (top-level wildcards)
489
+ const OVERLY_BROAD_SCOPES = ['**', '*', '.', './**'];
490
+ for (const step of steps) {
491
+ if (step.scope && OVERLY_BROAD_SCOPES.includes(step.scope)) {
492
+ // Sanitize to a more reasonable scope — don't reject, just clear
493
+ step.scope = undefined; // let the session scope handle it
494
+ }
495
+ }
147
496
  return {
148
497
  name: String(raw.name || ''),
149
498
  description: String(raw.description || ''),
@@ -154,10 +503,17 @@ export function validateAndBuild(raw) {
154
503
  // Helpers
155
504
  // ---------------------------------------------------------------------------
156
505
  export function slugify(text) {
157
- return text
506
+ const slug = text
158
507
  .toLowerCase()
159
508
  .replace(/[^a-z0-9]+/g, '-')
160
- .replace(/^-+|-+$/g, '')
161
- .slice(0, 60);
509
+ .replace(/^-+|-+$/g, '');
510
+ // For drill names with timestamp suffix (drill-<name>-<13-digit-ts>),
511
+ // ensure the timestamp is always preserved by capping the name portion
512
+ const timestampMatch = slug.match(/-(\d{13})$/);
513
+ if (timestampMatch) {
514
+ const namepart = slug.slice(0, slug.length - 14); // everything before -<timestamp>
515
+ return namepart.slice(0, 66) + '-' + timestampMatch[1]; // 66 + 1 + 13 = 80 max
516
+ }
517
+ return slug.slice(0, 80);
162
518
  }
163
519
  //# sourceMappingURL=trajectory-generate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"trajectory-generate.js","sourceRoot":"","sources":["../../src/lib/trajectory-generate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trajectory-generate.js","sourceRoot":"","sources":["../../src/lib/trajectory-generate.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@
7
7
  import type { Trajectory, TrajectoryState } from '@promptwheel/core/trajectory/shared';
8
8
  /** Load all trajectory definitions from `.promptwheel/trajectories/`. */
9
9
  export declare function loadTrajectories(repoRoot: string): Trajectory[];
10
- /** Load a single trajectory by name. */
10
+ /** Load a single trajectory by name. Tries slug-based lookup first for O(1), falls back to scan. */
11
11
  export declare function loadTrajectory(repoRoot: string, name: string): Trajectory | null;
12
12
  /** Load the active trajectory state, or null if none. */
13
13
  export declare function loadTrajectoryState(repoRoot: string): TrajectoryState | null;
@@ -1 +1 @@
1
- {"version":3,"file":"trajectory.d.ts","sourceRoot":"","sources":["../../src/lib/trajectory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAuBvF,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CAqB/D;AAED,wCAAwC;AACxC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAGhF;AAMD,yDAAyD;AACzD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAU5E;AAED,qCAAqC;AACrC,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,CAOlF;AAED,2CAA2C;AAC3C,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAK3D;AAMD,kEAAkE;AAClE,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAqBzF"}
1
+ {"version":3,"file":"trajectory.d.ts","sourceRoot":"","sources":["../../src/lib/trajectory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAwBvF,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CAqB/D;AAED,oGAAoG;AACpG,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAwBhF;AAMD,yDAAyD;AACzD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CA4B5E;AAED,qCAAqC;AACrC,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,CAelF;AAED,2CAA2C;AAC3C,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAK3D;AAMD,kEAAkE;AAClE,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CA4BzF"}
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import * as fs from 'node:fs';
8
8
  import * as path from 'node:path';
9
- import { parseTrajectoryYaml, createInitialStepStates, getNextStep, } from '@promptwheel/core/trajectory/shared';
9
+ import { parseTrajectoryYaml, createInitialStepStates, getNextStep, detectCycle, } from '@promptwheel/core/trajectory/shared';
10
10
  // ---------------------------------------------------------------------------
11
11
  // Paths
12
12
  // ---------------------------------------------------------------------------
@@ -35,14 +35,36 @@ export function loadTrajectories(repoRoot) {
35
35
  trajectories.push(trajectory);
36
36
  }
37
37
  }
38
- catch {
39
- // Skip malformed trajectory files
38
+ catch (err) {
39
+ console.warn(`Warning: failed to load trajectory ${file}: ${err instanceof Error ? err.message : String(err)}`);
40
40
  }
41
41
  }
42
42
  return trajectories;
43
43
  }
44
- /** Load a single trajectory by name. */
44
+ /** Load a single trajectory by name. Tries slug-based lookup first for O(1), falls back to scan. */
45
45
  export function loadTrajectory(repoRoot, name) {
46
+ const dir = trajectoriesDir(repoRoot);
47
+ if (!fs.existsSync(dir))
48
+ return null;
49
+ // Fast path: try slug-based file lookup (uses same logic as slugify in trajectory-generate.ts)
50
+ const rawSlug = name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
51
+ const tsMatch = rawSlug.match(/-(\d{13})$/);
52
+ const slug = tsMatch
53
+ ? rawSlug.slice(0, rawSlug.length - 14).slice(0, 66) + '-' + tsMatch[1]
54
+ : rawSlug.slice(0, 80);
55
+ for (const ext of ['.yaml', '.yml']) {
56
+ const filePath = path.join(dir, `${slug}${ext}`);
57
+ if (fs.existsSync(filePath)) {
58
+ try {
59
+ const content = fs.readFileSync(filePath, 'utf-8');
60
+ const trajectory = parseTrajectoryYaml(content);
61
+ if (trajectory.name === name && trajectory.steps.length > 0)
62
+ return trajectory;
63
+ }
64
+ catch { /* fall through to scan */ }
65
+ }
66
+ }
67
+ // Fallback: full scan
46
68
  const trajectories = loadTrajectories(repoRoot);
47
69
  return trajectories.find(t => t.name === name) ?? null;
48
70
  }
@@ -53,8 +75,28 @@ export function loadTrajectory(repoRoot, name) {
53
75
  export function loadTrajectoryState(repoRoot) {
54
76
  const p = trajectoryStatePath(repoRoot);
55
77
  try {
78
+ // Recover from crash: if .tmp exists but main file doesn't, restore it
79
+ const tmp = p + '.tmp';
80
+ if (!fs.existsSync(p) && fs.existsSync(tmp)) {
81
+ try {
82
+ fs.renameSync(tmp, p);
83
+ }
84
+ catch { /* best effort */ }
85
+ }
56
86
  if (fs.existsSync(p)) {
57
- return JSON.parse(fs.readFileSync(p, 'utf-8'));
87
+ const raw = fs.readFileSync(p, 'utf-8');
88
+ if (!raw.trim())
89
+ return null;
90
+ const data = JSON.parse(raw);
91
+ // Structural validation — reject malformed state that passed JSON.parse
92
+ if (!data ||
93
+ typeof data !== 'object' ||
94
+ typeof data.trajectoryName !== 'string' ||
95
+ typeof data.stepStates !== 'object' ||
96
+ data.stepStates === null) {
97
+ return null;
98
+ }
99
+ return data;
58
100
  }
59
101
  }
60
102
  catch {
@@ -69,7 +111,20 @@ export function saveTrajectoryState(repoRoot, state) {
69
111
  if (!fs.existsSync(dir)) {
70
112
  fs.mkdirSync(dir, { recursive: true });
71
113
  }
72
- fs.writeFileSync(p, JSON.stringify(state, null, 2));
114
+ const tmp = p + '.tmp';
115
+ try {
116
+ fs.writeFileSync(tmp, JSON.stringify(state, null, 2));
117
+ fs.renameSync(tmp, p);
118
+ }
119
+ catch (err) {
120
+ // Clean up orphaned .tmp on failure
121
+ if (fs.existsSync(tmp))
122
+ try {
123
+ fs.unlinkSync(tmp);
124
+ }
125
+ catch { /* ignore */ }
126
+ throw err;
127
+ }
73
128
  }
74
129
  /** Clear trajectory state (deactivate). */
75
130
  export function clearTrajectoryState(repoRoot) {
@@ -86,6 +141,12 @@ export function activateTrajectory(repoRoot, name) {
86
141
  const trajectory = loadTrajectory(repoRoot, name);
87
142
  if (!trajectory)
88
143
  return null;
144
+ // Reject trajectories with circular dependencies
145
+ const cycle = detectCycle(trajectory.steps);
146
+ if (cycle) {
147
+ console.warn(`Cannot activate trajectory "${name}": circular dependency detected: ${cycle.join(' → ')}`);
148
+ return null;
149
+ }
89
150
  const stepStates = createInitialStepStates(trajectory);
90
151
  const firstStep = getNextStep(trajectory, stepStates);
91
152
  if (firstStep) {
@@ -1 +1 @@
1
- {"version":3,"file":"trajectory.js","sourceRoot":"","sources":["../../src/lib/trajectory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trajectory.js","sourceRoot":"","sources":["../../src/lib/trajectory.ts"],"names":[],"mappings":"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"}