@promptwheel/cli 0.6.0 → 0.7.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.
- package/dist/bin/promptwheel.js +1 -1
- package/dist/commands/solo-analytics.d.ts.map +1 -1
- package/dist/commands/solo-analytics.js +185 -2
- package/dist/commands/solo-analytics.js.map +1 -1
- package/dist/commands/solo-auto.d.ts.map +1 -1
- package/dist/commands/solo-auto.js +7 -6
- package/dist/commands/solo-auto.js.map +1 -1
- package/dist/commands/solo-daemon.d.ts.map +1 -1
- package/dist/commands/solo-daemon.js +4 -0
- package/dist/commands/solo-daemon.js.map +1 -1
- package/dist/commands/solo-inspect.d.ts.map +1 -1
- package/dist/commands/solo-inspect.js +93 -5
- package/dist/commands/solo-inspect.js.map +1 -1
- package/dist/commands/solo-nudge.d.ts.map +1 -1
- package/dist/commands/solo-nudge.js +38 -7
- package/dist/commands/solo-nudge.js.map +1 -1
- package/dist/commands/solo-trajectory.d.ts.map +1 -1
- package/dist/commands/solo-trajectory.js +23 -5
- package/dist/commands/solo-trajectory.js.map +1 -1
- package/dist/commands/solo.d.ts.map +1 -1
- package/dist/commands/solo.js +7 -1
- package/dist/commands/solo.js.map +1 -1
- package/dist/lib/cycle-context.d.ts +5 -0
- package/dist/lib/cycle-context.d.ts.map +1 -1
- package/dist/lib/cycle-context.js +12 -4
- package/dist/lib/cycle-context.js.map +1 -1
- package/dist/lib/daemon-fork.d.ts +1 -0
- package/dist/lib/daemon-fork.d.ts.map +1 -1
- package/dist/lib/daemon-fork.js +2 -0
- package/dist/lib/daemon-fork.js.map +1 -1
- package/dist/lib/daemon.d.ts +1 -0
- package/dist/lib/daemon.d.ts.map +1 -1
- package/dist/lib/daemon.js +2 -1
- package/dist/lib/daemon.js.map +1 -1
- package/dist/lib/display-adapter-log.d.ts +6 -0
- package/dist/lib/display-adapter-log.d.ts.map +1 -1
- package/dist/lib/display-adapter-log.js +3 -0
- package/dist/lib/display-adapter-log.js.map +1 -1
- package/dist/lib/display-adapter-spinner.d.ts +6 -0
- package/dist/lib/display-adapter-spinner.d.ts.map +1 -1
- package/dist/lib/display-adapter-spinner.js +4 -1
- package/dist/lib/display-adapter-spinner.js.map +1 -1
- package/dist/lib/display-adapter-tui.d.ts +6 -0
- package/dist/lib/display-adapter-tui.d.ts.map +1 -1
- package/dist/lib/display-adapter-tui.js +3 -0
- package/dist/lib/display-adapter-tui.js.map +1 -1
- package/dist/lib/display-adapter.d.ts +6 -0
- package/dist/lib/display-adapter.d.ts.map +1 -1
- package/dist/lib/error-ledger.d.ts +39 -0
- package/dist/lib/error-ledger.d.ts.map +1 -0
- package/dist/lib/error-ledger.js +73 -0
- package/dist/lib/error-ledger.js.map +1 -0
- package/dist/lib/goals.d.ts +1 -1
- package/dist/lib/goals.d.ts.map +1 -1
- package/dist/lib/goals.js +39 -7
- package/dist/lib/goals.js.map +1 -1
- package/dist/lib/learnings.d.ts.map +1 -1
- package/dist/lib/learnings.js +92 -68
- package/dist/lib/learnings.js.map +1 -1
- package/dist/lib/pr-outcomes.d.ts +42 -0
- package/dist/lib/pr-outcomes.d.ts.map +1 -0
- package/dist/lib/pr-outcomes.js +97 -0
- package/dist/lib/pr-outcomes.js.map +1 -0
- package/dist/lib/qa-stats.d.ts.map +1 -1
- package/dist/lib/qa-stats.js +3 -1
- package/dist/lib/qa-stats.js.map +1 -1
- package/dist/lib/retention.d.ts +3 -3
- package/dist/lib/retention.d.ts.map +1 -1
- package/dist/lib/retention.js +12 -12
- package/dist/lib/retention.js.map +1 -1
- package/dist/lib/run-history.d.ts +27 -0
- package/dist/lib/run-history.d.ts.map +1 -1
- package/dist/lib/run-history.js.map +1 -1
- package/dist/lib/run-state.d.ts +42 -0
- package/dist/lib/run-state.d.ts.map +1 -1
- package/dist/lib/run-state.js +66 -0
- package/dist/lib/run-state.js.map +1 -1
- package/dist/lib/session-report.d.ts.map +1 -1
- package/dist/lib/session-report.js +42 -0
- package/dist/lib/session-report.js.map +1 -1
- package/dist/lib/solo-auto-between-cycles.d.ts.map +1 -1
- package/dist/lib/solo-auto-between-cycles.js +381 -40
- package/dist/lib/solo-auto-between-cycles.js.map +1 -1
- package/dist/lib/solo-auto-drill.d.ts +228 -0
- package/dist/lib/solo-auto-drill.d.ts.map +1 -0
- package/dist/lib/solo-auto-drill.js +1229 -0
- package/dist/lib/solo-auto-drill.js.map +1 -0
- package/dist/lib/solo-auto-execute.d.ts +8 -0
- package/dist/lib/solo-auto-execute.d.ts.map +1 -1
- package/dist/lib/solo-auto-execute.js +99 -7
- package/dist/lib/solo-auto-execute.js.map +1 -1
- package/dist/lib/solo-auto-filter.js +3 -3
- package/dist/lib/solo-auto-filter.js.map +1 -1
- package/dist/lib/solo-auto-finalize.d.ts.map +1 -1
- package/dist/lib/solo-auto-finalize.js +32 -2
- package/dist/lib/solo-auto-finalize.js.map +1 -1
- package/dist/lib/solo-auto-init-qa.d.ts.map +1 -1
- package/dist/lib/solo-auto-init-qa.js +3 -1
- package/dist/lib/solo-auto-init-qa.js.map +1 -1
- package/dist/lib/solo-auto-scout.d.ts +1 -0
- package/dist/lib/solo-auto-scout.d.ts.map +1 -1
- package/dist/lib/solo-auto-scout.js +44 -13
- package/dist/lib/solo-auto-scout.js.map +1 -1
- package/dist/lib/solo-auto-state.d.ts.map +1 -1
- package/dist/lib/solo-auto-state.js +84 -24
- package/dist/lib/solo-auto-state.js.map +1 -1
- package/dist/lib/solo-auto-types.d.ts +64 -3
- package/dist/lib/solo-auto-types.d.ts.map +1 -1
- package/dist/lib/solo-auto.d.ts +3 -3
- package/dist/lib/solo-auto.d.ts.map +1 -1
- package/dist/lib/solo-auto.js +83 -4
- package/dist/lib/solo-auto.js.map +1 -1
- package/dist/lib/solo-config.d.ts +51 -3
- package/dist/lib/solo-config.d.ts.map +1 -1
- package/dist/lib/solo-config.js +43 -2
- package/dist/lib/solo-config.js.map +1 -1
- package/dist/lib/solo-hints.d.ts +10 -0
- package/dist/lib/solo-hints.d.ts.map +1 -1
- package/dist/lib/solo-hints.js +22 -0
- package/dist/lib/solo-hints.js.map +1 -1
- package/dist/lib/solo-session-summary.d.ts +12 -1
- package/dist/lib/solo-session-summary.d.ts.map +1 -1
- package/dist/lib/solo-session-summary.js +50 -6
- package/dist/lib/solo-session-summary.js.map +1 -1
- package/dist/lib/spindle-incidents.d.ts +29 -0
- package/dist/lib/spindle-incidents.d.ts.map +1 -0
- package/dist/lib/spindle-incidents.js +56 -0
- package/dist/lib/spindle-incidents.js.map +1 -0
- package/dist/lib/spinner.d.ts +1 -1
- package/dist/lib/taste-profile.d.ts.map +1 -1
- package/dist/lib/taste-profile.js +14 -8
- package/dist/lib/taste-profile.js.map +1 -1
- package/dist/lib/ticket-steps/step-spindle.d.ts.map +1 -1
- package/dist/lib/ticket-steps/step-spindle.js +14 -0
- package/dist/lib/ticket-steps/step-spindle.js.map +1 -1
- package/dist/lib/trajectory-generate.d.ts +73 -0
- package/dist/lib/trajectory-generate.d.ts.map +1 -1
- package/dist/lib/trajectory-generate.js +368 -12
- package/dist/lib/trajectory-generate.js.map +1 -1
- package/dist/lib/trajectory.d.ts +1 -1
- package/dist/lib/trajectory.d.ts.map +1 -1
- package/dist/lib/trajectory.js +67 -6
- package/dist/lib/trajectory.js.map +1 -1
- package/dist/tui/screens/auto.d.ts +7 -0
- package/dist/tui/screens/auto.d.ts.map +1 -1
- package/dist/tui/screens/auto.js +18 -1
- package/dist/tui/screens/auto.js.map +1 -1
- 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(
|
|
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
|
-
|
|
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:
|
|
458
|
+
target: parsedTarget,
|
|
127
459
|
direction: s.measure.direction === 'down' ? 'down' : 'up',
|
|
128
|
-
}
|
|
129
|
-
|
|
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
|
-
|
|
506
|
+
const slug = text
|
|
158
507
|
.toLowerCase()
|
|
159
508
|
.replace(/[^a-z0-9]+/g, '-')
|
|
160
|
-
.replace(/^-+|-+$/g, '')
|
|
161
|
-
|
|
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":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC7F,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,WAAW,GAGZ,MAAM,qCAAqC,CAAC;AA4D7C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAqB;IAC5D,4BAA4B;IAC5B,MAAM,WAAW,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IACzG,MAAM,aAAa,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEzD,MAAM,UAAU,GAAG,oBAAoB,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;IAEvD,kBAAkB;IAClB,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAErE,cAAc;IACd,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC;QAC7B,MAAM;QACN,GAAG,EAAE,IAAI,CAAC,QAAQ;QAClB,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,OAAO;QACpC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,QAAQ;KAC9B,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,yBAAyB;IACzB,MAAM,MAAM,GAAG,iBAAiB,CAA0D,MAAM,CAAC,MAAM,CAAC,CAAC;IACzG,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,qDAAqD,MAAM,EAAE,IAAI,IAAI,SAAS,YAAY,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3I,CAAC;IAED,mCAAmC;IACnC,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAE5C,uBAAuB;IACvB,MAAM,IAAI,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;IAEnD,uBAAuB;IACvB,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IAED,mBAAmB;IACnB,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;IACrE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;IAChD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAE1C,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,+BAA+B,CAAC,IAAkC;IACtF,4BAA4B;IAC5B,IAAI,UAAkB,CAAC;IACvB,IAAI,SAAiB,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QACzG,MAAM,aAAa,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QAC3E,MAAM,WAAW,GAAG,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzD,UAAU,GAAG,oBAAoB,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QACpD,SAAS,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,0DAA0D,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChI,CAAC;IAED,uCAAuC;IACvC,MAAM,cAAc,GAAG,kCAAkC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,gCAAgC,CAAC,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE;QACrF,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;QAC/C,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,aAAa,EAAE,IAAI,CAAC,aAAa;KAClC,CAAC,CAAC;IAEH,2CAA2C;IAC3C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC;QAC7B,MAAM;QACN,GAAG,EAAE,IAAI,CAAC,QAAQ;QAClB,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,OAAO;QACpC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,QAAQ;KAC9B,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,iDAAiD,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,yBAAyB;IACzB,MAAM,MAAM,GAAG,iBAAiB,CAA0D,MAAM,CAAC,MAAM,CAAC,CAAC;IACzG,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACrD,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,+DAA+D,MAAM,EAAE,IAAI,IAAI,SAAS,YAAY,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,cAAc,OAAO,IAAI,CAAC,CAAC;IAC3K,CAAC;IAED,qDAAqD;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,GAAG,SAAS,MAAM,CAAC,IAAI,EAAE,CAAC;IACvC,CAAC;IACD,MAAM,CAAC,IAAI,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC;IAE5C,mCAAmC;IACnC,IAAI,UAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,mDAAmD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzH,CAAC;IAED,uBAAuB;IACvB,MAAM,IAAI,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;IAEnD,uBAAuB;IACvB,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACpF,CAAC;IAED,mBAAmB;IACnB,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;IACrE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;IAChD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAE1C,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACxC,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAe;IACnD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAEzC,MAAM,IAAI,GAAG,KAAK;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,mCAAmC;SACvE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE7B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAExC,gDAAgD;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO,CAAC,GAAG,SAAS,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAAE,CAAC,EAAE,CAAC;QACnE,SAAS,GAAG,CAAC,CAAC;IAChB,CAAC;IAED,IAAI,SAAS,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACtC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,SAAoD;IAEpD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC5B,MAAM,MAAM,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnF,MAAM,cAAc,GAAG,qBAAqB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACtD,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,KAAK,YAAY,KAAK,iBAAiB,CAAC,CAAC,oBAAoB;YAC3F,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,yBAAyB,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE;KAC9E,CAAC,CAAC,WAAW;gBACF,CAAC,CAAC,SAAS,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,SAAS,mBAAmB,CAAC,IAAY,EAAE,UAAkB,EAAE,SAAiB;IAC9E,OAAO;;;;;;EAMP,IAAI;;;;EAIJ,SAAS;;EAET,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiDV,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,cAAsB,EACtB,UAAkB,EAClB,SAAiB,EACjB,OAYC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,QAAQ,CAAC,IAAI,CAAC;;;;;;EAMd,cAAc;;;;EAId,SAAS;;EAET,UAAU,EAAE,CAAC,CAAC;IAEd,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC;;;;EAIhB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,OAAO,EAAE,oBAAoB,EAAE,CAAC;QAClC,QAAQ,CAAC,IAAI,CAAC;;;;EAIhB,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC;;EAEhB,OAAO,CAAC,aAAa;;uIAEgH,CAAC,CAAC;IACvI,CAAC;IAED,IAAI,OAAO,EAAE,YAAY,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC;;;;EAIhB,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,IAAI,OAAO,EAAE,gBAAgB,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC;;;;EAIhB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,OAAO,EAAE,YAAY,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC;;;;EAIhB,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC;;;;EAIhB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC;;;;EAIhB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,EAAE,eAAe,EAAE,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC;;;;EAIhB,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC;;;;EAIhB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;wBAoBQ,CAAC,GAAG,EAAE;QAC5B,MAAM,CAAC,GAAG,OAAO,EAAE,aAAa,IAAI,UAAU,CAAC;QAC/C,OAAO,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,+CAA+C,CAAC,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,8CAA8C,CAAC,CAAC,CAAC,iCAAiC,CAAC;IACzL,CAAC,CAAC,EAAE;;;;;;EAMF,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,kGAAkG,CAAC,CAAC,CAAC,GAAG;;EAExI,CAAC,GAAG,EAAE;QACN,MAAM,CAAC,GAAG,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,OAAO,EAAE,aAAa,IAAI,UAAU,CAAC;QACtD,MAAM,kBAAkB,GAAG,QAAQ,KAAK,cAAc;YACpD,CAAC,CAAC,8RAA8R;YAChS,CAAC,CAAC,QAAQ,KAAK,WAAW;gBAC1B,CAAC,CAAC,oQAAoQ;gBACtQ,CAAC,CAAC,0LAA0L,CAAC;QAC/L,MAAM,uBAAuB,GAAG;eACnB,QAAQ,KAAK,cAAc,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,yCAAyC,CAAC,CAAC,CAAC,+BAA+B;;;;;+KAKT,CAAC;QAC9K,OAAO,GAAG,CAAC,KAAK,kBAAkB,OAAO,CAAC,GAAG,CAAC,KAAK,uBAAuB,EAAE,CAAC;IAC/E,CAAC,CAAC,EAAE;;EAEF,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiC3C,CAAC,CAAC;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,8EAA8E;AAC9E,oCAAoC;AACpC,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAAC,QAAkB;IAC7D,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;QAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAC3B,uDAAuD;QACvD,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAC/C,4EAA4E;QAC5E,mEAAmE;QACnE,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3C,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAC/C,2EAA2E;QAC3E,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAoBD,MAAM,UAAU,gBAAgB,CAAC,GAA4D;IAC3F,MAAM,KAAK,GAAsB,GAAG,CAAC,KAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE;QACjE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5B,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;QACxC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC5C,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QAC9E,mBAAmB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QAClG,qBAAqB,EAAE,4BAA4B,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtI,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QACvE,WAAW,EAAE,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;QAC/F,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QACxG,OAAO,EAAE,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS;gBAAE,OAAO,SAAS,CAAC;YAClG,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC9C,IAAI,KAAK,CAAC,YAAY,CAAC;gBAAE,OAAO,SAAS,CAAC,CAAC,qCAAqC;YAChF,OAAO;gBACL,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;gBAC1B,MAAM,EAAE,YAAY;gBACpB,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,MAAe,CAAC,CAAC,CAAC,IAAa;aAC5E,CAAC;QACJ,CAAC,CAAC,EAAE;KACL,CAAC,CAAC,CAAC;IAEJ,wCAAwC;IACxC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAEnE,6BAA6B;IAC7B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACpE,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACvE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IAED,wCAAwC;IACxC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,EAAE,8BAA8B,GAAG,GAAG,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAEjF,yEAAyE;IACzE,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACrD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,KAAK,IAAI,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3D,iEAAiE;YACjE,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,kCAAkC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QAC5B,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;QAC1C,KAAK;KACN,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,MAAM,IAAI,GAAG,IAAI;SACd,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAE3B,sEAAsE;IACtE,uEAAuE;IACvE,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAChD,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,iCAAiC;QACnF,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;IACjF,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC"}
|
package/dist/lib/trajectory.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/lib/trajectory.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,WAAW,GACZ,MAAM,qCAAqC,CAAC;AAE7C,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,SAAS,eAAe,CAAC,QAAgB;IACvC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,uBAAuB,CAAC,CAAC;AACtE,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,yEAAyE;AACzE,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,GAAG,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnC,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACzF,MAAM,YAAY,GAAiB,EAAE,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnD,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAAC,
|
|
1
|
+
{"version":3,"file":"trajectory.js","sourceRoot":"","sources":["../../src/lib/trajectory.ts"],"names":[],"mappings":"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"}
|