@cluesmith/codev 1.1.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/bin/af.js +8 -0
- package/bin/codev.js +4 -0
- package/bin/consult.js +7 -0
- package/dist/agent-farm/cli.d.ts +11 -0
- package/dist/agent-farm/cli.d.ts.map +1 -0
- package/dist/agent-farm/cli.js +359 -0
- package/dist/agent-farm/cli.js.map +1 -0
- package/dist/agent-farm/commands/cleanup.d.ts +12 -0
- package/dist/agent-farm/commands/cleanup.d.ts.map +1 -0
- package/dist/agent-farm/commands/cleanup.js +154 -0
- package/dist/agent-farm/commands/cleanup.js.map +1 -0
- package/dist/agent-farm/commands/db.d.ts +38 -0
- package/dist/agent-farm/commands/db.d.ts.map +1 -0
- package/dist/agent-farm/commands/db.js +133 -0
- package/dist/agent-farm/commands/db.js.map +1 -0
- package/dist/agent-farm/commands/index.d.ts +11 -0
- package/dist/agent-farm/commands/index.d.ts.map +1 -0
- package/dist/agent-farm/commands/index.js +11 -0
- package/dist/agent-farm/commands/index.js.map +1 -0
- package/dist/agent-farm/commands/open.d.ts +15 -0
- package/dist/agent-farm/commands/open.d.ts.map +1 -0
- package/dist/agent-farm/commands/open.js +118 -0
- package/dist/agent-farm/commands/open.js.map +1 -0
- package/dist/agent-farm/commands/rename.d.ts +13 -0
- package/dist/agent-farm/commands/rename.d.ts.map +1 -0
- package/dist/agent-farm/commands/rename.js +33 -0
- package/dist/agent-farm/commands/rename.js.map +1 -0
- package/dist/agent-farm/commands/send.d.ts +9 -0
- package/dist/agent-farm/commands/send.d.ts.map +1 -0
- package/dist/agent-farm/commands/send.js +282 -0
- package/dist/agent-farm/commands/send.js.map +1 -0
- package/dist/agent-farm/commands/spawn.d.ts +15 -0
- package/dist/agent-farm/commands/spawn.d.ts.map +1 -0
- package/dist/agent-farm/commands/spawn.js +575 -0
- package/dist/agent-farm/commands/spawn.js.map +1 -0
- package/dist/agent-farm/commands/start.d.ts +9 -0
- package/dist/agent-farm/commands/start.d.ts.map +1 -0
- package/dist/agent-farm/commands/start.js +175 -0
- package/dist/agent-farm/commands/start.js.map +1 -0
- package/dist/agent-farm/commands/status.d.ts +8 -0
- package/dist/agent-farm/commands/status.d.ts.map +1 -0
- package/dist/agent-farm/commands/status.js +123 -0
- package/dist/agent-farm/commands/status.js.map +1 -0
- package/dist/agent-farm/commands/stop.d.ts +8 -0
- package/dist/agent-farm/commands/stop.d.ts.map +1 -0
- package/dist/agent-farm/commands/stop.js +76 -0
- package/dist/agent-farm/commands/stop.js.map +1 -0
- package/dist/agent-farm/commands/tower.d.ts +19 -0
- package/dist/agent-farm/commands/tower.d.ts.map +1 -0
- package/dist/agent-farm/commands/tower.js +125 -0
- package/dist/agent-farm/commands/tower.js.map +1 -0
- package/dist/agent-farm/commands/tutorial.d.ts +10 -0
- package/dist/agent-farm/commands/tutorial.d.ts.map +1 -0
- package/dist/agent-farm/commands/tutorial.js +49 -0
- package/dist/agent-farm/commands/tutorial.js.map +1 -0
- package/dist/agent-farm/commands/util.d.ts +15 -0
- package/dist/agent-farm/commands/util.d.ts.map +1 -0
- package/dist/agent-farm/commands/util.js +108 -0
- package/dist/agent-farm/commands/util.js.map +1 -0
- package/dist/agent-farm/db/errors.d.ts +17 -0
- package/dist/agent-farm/db/errors.d.ts.map +1 -0
- package/dist/agent-farm/db/errors.js +46 -0
- package/dist/agent-farm/db/errors.js.map +1 -0
- package/dist/agent-farm/db/index.d.ts +41 -0
- package/dist/agent-farm/db/index.d.ts.map +1 -0
- package/dist/agent-farm/db/index.js +168 -0
- package/dist/agent-farm/db/index.js.map +1 -0
- package/dist/agent-farm/db/migrate.d.ts +15 -0
- package/dist/agent-farm/db/migrate.d.ts.map +1 -0
- package/dist/agent-farm/db/migrate.js +137 -0
- package/dist/agent-farm/db/migrate.js.map +1 -0
- package/dist/agent-farm/db/schema.d.ts +16 -0
- package/dist/agent-farm/db/schema.d.ts.map +1 -0
- package/dist/agent-farm/db/schema.js +103 -0
- package/dist/agent-farm/db/schema.js.map +1 -0
- package/dist/agent-farm/db/types.d.ts +87 -0
- package/dist/agent-farm/db/types.d.ts.map +1 -0
- package/dist/agent-farm/db/types.js +65 -0
- package/dist/agent-farm/db/types.js.map +1 -0
- package/dist/agent-farm/index.d.ts +7 -0
- package/dist/agent-farm/index.d.ts.map +1 -0
- package/dist/agent-farm/index.js +373 -0
- package/dist/agent-farm/index.js.map +1 -0
- package/dist/agent-farm/servers/annotate-server.d.ts +9 -0
- package/dist/agent-farm/servers/annotate-server.d.ts.map +1 -0
- package/dist/agent-farm/servers/annotate-server.js +136 -0
- package/dist/agent-farm/servers/annotate-server.js.map +1 -0
- package/dist/agent-farm/servers/dashboard-server.d.ts +9 -0
- package/dist/agent-farm/servers/dashboard-server.d.ts.map +1 -0
- package/dist/agent-farm/servers/dashboard-server.js +939 -0
- package/dist/agent-farm/servers/dashboard-server.js.map +1 -0
- package/dist/agent-farm/servers/tower-server.d.ts +9 -0
- package/dist/agent-farm/servers/tower-server.d.ts.map +1 -0
- package/dist/agent-farm/servers/tower-server.js +463 -0
- package/dist/agent-farm/servers/tower-server.js.map +1 -0
- package/dist/agent-farm/state.d.ts +93 -0
- package/dist/agent-farm/state.d.ts.map +1 -0
- package/dist/agent-farm/state.js +253 -0
- package/dist/agent-farm/state.js.map +1 -0
- package/dist/agent-farm/tutorial/index.d.ts +8 -0
- package/dist/agent-farm/tutorial/index.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/index.js +8 -0
- package/dist/agent-farm/tutorial/index.js.map +1 -0
- package/dist/agent-farm/tutorial/prompts.d.ts +57 -0
- package/dist/agent-farm/tutorial/prompts.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/prompts.js +147 -0
- package/dist/agent-farm/tutorial/prompts.js.map +1 -0
- package/dist/agent-farm/tutorial/runner.d.ts +52 -0
- package/dist/agent-farm/tutorial/runner.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/runner.js +204 -0
- package/dist/agent-farm/tutorial/runner.js.map +1 -0
- package/dist/agent-farm/tutorial/state.d.ts +26 -0
- package/dist/agent-farm/tutorial/state.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/state.js +89 -0
- package/dist/agent-farm/tutorial/state.js.map +1 -0
- package/dist/agent-farm/tutorial/steps/first-spec.d.ts +7 -0
- package/dist/agent-farm/tutorial/steps/first-spec.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/steps/first-spec.js +136 -0
- package/dist/agent-farm/tutorial/steps/first-spec.js.map +1 -0
- package/dist/agent-farm/tutorial/steps/implementation.d.ts +7 -0
- package/dist/agent-farm/tutorial/steps/implementation.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/steps/implementation.js +76 -0
- package/dist/agent-farm/tutorial/steps/implementation.js.map +1 -0
- package/dist/agent-farm/tutorial/steps/index.d.ts +10 -0
- package/dist/agent-farm/tutorial/steps/index.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/steps/index.js +10 -0
- package/dist/agent-farm/tutorial/steps/index.js.map +1 -0
- package/dist/agent-farm/tutorial/steps/planning.d.ts +7 -0
- package/dist/agent-farm/tutorial/steps/planning.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/steps/planning.js +143 -0
- package/dist/agent-farm/tutorial/steps/planning.js.map +1 -0
- package/dist/agent-farm/tutorial/steps/review.d.ts +7 -0
- package/dist/agent-farm/tutorial/steps/review.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/steps/review.js +78 -0
- package/dist/agent-farm/tutorial/steps/review.js.map +1 -0
- package/dist/agent-farm/tutorial/steps/setup.d.ts +7 -0
- package/dist/agent-farm/tutorial/steps/setup.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/steps/setup.js +126 -0
- package/dist/agent-farm/tutorial/steps/setup.js.map +1 -0
- package/dist/agent-farm/tutorial/steps/welcome.d.ts +7 -0
- package/dist/agent-farm/tutorial/steps/welcome.d.ts.map +1 -0
- package/dist/agent-farm/tutorial/steps/welcome.js +50 -0
- package/dist/agent-farm/tutorial/steps/welcome.js.map +1 -0
- package/dist/agent-farm/types.d.ts +131 -0
- package/dist/agent-farm/types.d.ts.map +1 -0
- package/dist/agent-farm/types.js +5 -0
- package/dist/agent-farm/types.js.map +1 -0
- package/dist/agent-farm/utils/config.d.ts +27 -0
- package/dist/agent-farm/utils/config.d.ts.map +1 -0
- package/dist/agent-farm/utils/config.js +242 -0
- package/dist/agent-farm/utils/config.js.map +1 -0
- package/dist/agent-farm/utils/deps.d.ts +51 -0
- package/dist/agent-farm/utils/deps.d.ts.map +1 -0
- package/dist/agent-farm/utils/deps.js +194 -0
- package/dist/agent-farm/utils/deps.js.map +1 -0
- package/dist/agent-farm/utils/index.d.ts +6 -0
- package/dist/agent-farm/utils/index.d.ts.map +1 -0
- package/dist/agent-farm/utils/index.js +6 -0
- package/dist/agent-farm/utils/index.js.map +1 -0
- package/dist/agent-farm/utils/logger.d.ts +31 -0
- package/dist/agent-farm/utils/logger.d.ts.map +1 -0
- package/dist/agent-farm/utils/logger.js +58 -0
- package/dist/agent-farm/utils/logger.js.map +1 -0
- package/dist/agent-farm/utils/orphan-handler.d.ts +27 -0
- package/dist/agent-farm/utils/orphan-handler.d.ts.map +1 -0
- package/dist/agent-farm/utils/orphan-handler.js +127 -0
- package/dist/agent-farm/utils/orphan-handler.js.map +1 -0
- package/dist/agent-farm/utils/port-registry.d.ts +58 -0
- package/dist/agent-farm/utils/port-registry.d.ts.map +1 -0
- package/dist/agent-farm/utils/port-registry.js +149 -0
- package/dist/agent-farm/utils/port-registry.js.map +1 -0
- package/dist/agent-farm/utils/shell.d.ts +45 -0
- package/dist/agent-farm/utils/shell.d.ts.map +1 -0
- package/dist/agent-farm/utils/shell.js +120 -0
- package/dist/agent-farm/utils/shell.js.map +1 -0
- package/dist/cli.d.ts +10 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +160 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/adopt.d.ts +12 -0
- package/dist/commands/adopt.d.ts.map +1 -0
- package/dist/commands/adopt.js +178 -0
- package/dist/commands/adopt.js.map +1 -0
- package/dist/commands/consult/index.d.ts +17 -0
- package/dist/commands/consult/index.d.ts.map +1 -0
- package/dist/commands/consult/index.js +405 -0
- package/dist/commands/consult/index.js.map +1 -0
- package/dist/commands/doctor.d.ts +10 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +346 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +12 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +167 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/tower.d.ts +16 -0
- package/dist/commands/tower.d.ts.map +1 -0
- package/dist/commands/tower.js +21 -0
- package/dist/commands/tower.js.map +1 -0
- package/dist/commands/update.d.ts +13 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +137 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/lib/templates.d.ts +57 -0
- package/dist/lib/templates.d.ts.map +1 -0
- package/dist/lib/templates.js +205 -0
- package/dist/lib/templates.js.map +1 -0
- package/package.json +55 -0
- package/templates/AGENTS.md +49 -0
- package/templates/CLAUDE.md +47 -0
- package/templates/DEPENDENCIES.md +344 -0
- package/templates/agents/architecture-documenter.md +189 -0
- package/templates/agents/codev-updater.md +276 -0
- package/templates/agents/spider-protocol-updater.md +118 -0
- package/templates/annotate.html +903 -0
- package/templates/bin/agent-farm +18 -0
- package/templates/bin/annotate-server.js +140 -0
- package/templates/bin/codev-doctor +335 -0
- package/templates/builders.md +30 -0
- package/templates/config.json +7 -0
- package/templates/dashboard-split.html +1679 -0
- package/templates/dashboard.html +149 -0
- package/templates/plans/.gitkeep +0 -0
- package/templates/protocols/experiment/protocol.md +229 -0
- package/templates/protocols/experiment/templates/notes.md +97 -0
- package/templates/protocols/maintain/protocol.md +235 -0
- package/templates/protocols/spider/protocol.md +639 -0
- package/templates/protocols/spider/templates/plan.md +169 -0
- package/templates/protocols/spider/templates/review.md +207 -0
- package/templates/protocols/spider/templates/spec.md +140 -0
- package/templates/protocols/spider-solo/protocol.md +619 -0
- package/templates/protocols/spider-solo/templates/plan.md +169 -0
- package/templates/protocols/spider-solo/templates/review.md +207 -0
- package/templates/protocols/spider-solo/templates/spec.md +140 -0
- package/templates/protocols/tick/protocol.md +250 -0
- package/templates/protocols/tick/templates/plan.md +67 -0
- package/templates/protocols/tick/templates/review.md +90 -0
- package/templates/protocols/tick/templates/spec.md +61 -0
- package/templates/reviews/.gitkeep +0 -0
- package/templates/roles/architect.md +230 -0
- package/templates/roles/builder.md +175 -0
- package/templates/roles/consultant.md +27 -0
- package/templates/specs/.gitkeep +0 -0
- package/templates/templates/projectlist.md +129 -0
- package/templates/tower.html +1032 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tutorial step runner infrastructure
|
|
3
|
+
* Manages step execution, state, and progress
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync } from 'node:fs';
|
|
6
|
+
import { execSync } from 'node:child_process';
|
|
7
|
+
import { resolve, basename } from 'node:path';
|
|
8
|
+
import { getConfig } from '../utils/index.js';
|
|
9
|
+
import { loadTutorialState, saveTutorialState, getOrCreateTutorialState, completeStep } from './state.js';
|
|
10
|
+
import * as prompts from './prompts.js';
|
|
11
|
+
import { logger } from '../utils/logger.js';
|
|
12
|
+
/**
|
|
13
|
+
* Detect project type based on files present
|
|
14
|
+
*/
|
|
15
|
+
function detectProjectType(projectPath) {
|
|
16
|
+
if (existsSync(resolve(projectPath, 'package.json'))) {
|
|
17
|
+
return 'nodejs';
|
|
18
|
+
}
|
|
19
|
+
if (existsSync(resolve(projectPath, 'pyproject.toml')) ||
|
|
20
|
+
existsSync(resolve(projectPath, 'setup.py')) ||
|
|
21
|
+
existsSync(resolve(projectPath, 'requirements.txt'))) {
|
|
22
|
+
return 'python';
|
|
23
|
+
}
|
|
24
|
+
return 'other';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Check if directory is a git repository
|
|
28
|
+
*/
|
|
29
|
+
function hasGitRepo(projectPath) {
|
|
30
|
+
try {
|
|
31
|
+
execSync('git rev-parse --git-dir', {
|
|
32
|
+
cwd: projectPath,
|
|
33
|
+
stdio: 'ignore',
|
|
34
|
+
});
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Check if codev directory exists
|
|
43
|
+
*/
|
|
44
|
+
function hasCodevDir(projectPath) {
|
|
45
|
+
return existsSync(resolve(projectPath, 'codev'));
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Build step context from current state
|
|
49
|
+
*/
|
|
50
|
+
async function buildContext(state) {
|
|
51
|
+
const config = getConfig();
|
|
52
|
+
return {
|
|
53
|
+
state,
|
|
54
|
+
projectPath: config.projectRoot,
|
|
55
|
+
projectName: basename(config.projectRoot),
|
|
56
|
+
projectType: detectProjectType(config.projectRoot),
|
|
57
|
+
hasGit: hasGitRepo(config.projectRoot),
|
|
58
|
+
hasCodev: hasCodevDir(config.projectRoot),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Find the index of the current step
|
|
63
|
+
*/
|
|
64
|
+
function findCurrentStepIndex(steps, currentStepId) {
|
|
65
|
+
return steps.findIndex((s) => s.id === currentStepId);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Show tutorial status/progress
|
|
69
|
+
*/
|
|
70
|
+
export async function showStatus(steps) {
|
|
71
|
+
const state = await loadTutorialState();
|
|
72
|
+
if (!state) {
|
|
73
|
+
logger.info('No tutorial in progress. Run `af tutorial` to start.');
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const currentIndex = findCurrentStepIndex(steps, state.currentStep);
|
|
77
|
+
logger.header('Tutorial Progress');
|
|
78
|
+
logger.kv('Started', new Date(state.startedAt).toLocaleDateString());
|
|
79
|
+
logger.kv('Last active', new Date(state.lastActiveAt).toLocaleDateString());
|
|
80
|
+
logger.blank();
|
|
81
|
+
for (let i = 0; i < steps.length; i++) {
|
|
82
|
+
const step = steps[i];
|
|
83
|
+
const isCompleted = state.completedSteps.includes(step.id);
|
|
84
|
+
const isCurrent = i === currentIndex;
|
|
85
|
+
let prefix = ' ';
|
|
86
|
+
if (isCompleted) {
|
|
87
|
+
prefix = '✓ ';
|
|
88
|
+
}
|
|
89
|
+
else if (isCurrent) {
|
|
90
|
+
prefix = '→ ';
|
|
91
|
+
}
|
|
92
|
+
const status = isCompleted ? '(completed)' : isCurrent ? '(current)' : '';
|
|
93
|
+
console.log(`${prefix}${i + 1}. ${step.title} ${status}`);
|
|
94
|
+
}
|
|
95
|
+
logger.blank();
|
|
96
|
+
const completed = state.completedSteps.length;
|
|
97
|
+
const total = steps.length;
|
|
98
|
+
logger.info(`Progress: ${completed}/${total} steps completed`);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Skip to the next step
|
|
102
|
+
*/
|
|
103
|
+
export async function skipCurrentStep(steps) {
|
|
104
|
+
const state = await loadTutorialState();
|
|
105
|
+
if (!state) {
|
|
106
|
+
logger.error('No tutorial in progress. Run `af tutorial` to start.');
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const currentIndex = findCurrentStepIndex(steps, state.currentStep);
|
|
110
|
+
if (currentIndex < 0) {
|
|
111
|
+
logger.error('Current step not found. Try resetting the tutorial.');
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (currentIndex >= steps.length - 1) {
|
|
115
|
+
logger.info('Already at the last step.');
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const currentStep = steps[currentIndex];
|
|
119
|
+
const nextStep = steps[currentIndex + 1];
|
|
120
|
+
await completeStep(state, currentStep.id, nextStep.id);
|
|
121
|
+
logger.success(`Skipped "${currentStep.title}"`);
|
|
122
|
+
logger.info(`Now at: "${nextStep.title}"`);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Run the tutorial from current step
|
|
126
|
+
*/
|
|
127
|
+
export async function runTutorial(steps) {
|
|
128
|
+
const state = await getOrCreateTutorialState();
|
|
129
|
+
let ctx = await buildContext(state);
|
|
130
|
+
let currentIndex = findCurrentStepIndex(steps, state.currentStep);
|
|
131
|
+
// If current step not found, start from the beginning
|
|
132
|
+
if (currentIndex < 0) {
|
|
133
|
+
currentIndex = 0;
|
|
134
|
+
state.currentStep = steps[0].id;
|
|
135
|
+
await saveTutorialState(state);
|
|
136
|
+
}
|
|
137
|
+
// Show welcome if resuming
|
|
138
|
+
if (state.completedSteps.length > 0) {
|
|
139
|
+
prompts.section('Resuming Tutorial');
|
|
140
|
+
prompts.info(`You're on step ${currentIndex + 1} of ${steps.length}: ${steps[currentIndex].title}`);
|
|
141
|
+
console.log();
|
|
142
|
+
const shouldContinue = await prompts.confirm('Continue from where you left off?');
|
|
143
|
+
if (!shouldContinue) {
|
|
144
|
+
const restart = await prompts.confirm('Start from the beginning?', false);
|
|
145
|
+
if (restart) {
|
|
146
|
+
state.currentStep = steps[0].id;
|
|
147
|
+
state.completedSteps = [];
|
|
148
|
+
state.userResponses = {};
|
|
149
|
+
await saveTutorialState(state);
|
|
150
|
+
currentIndex = 0;
|
|
151
|
+
ctx = await buildContext(state);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
logger.info('Tutorial paused. Run `af tutorial` to resume later.');
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Run steps sequentially
|
|
160
|
+
while (currentIndex < steps.length) {
|
|
161
|
+
const step = steps[currentIndex];
|
|
162
|
+
prompts.section(`Step ${currentIndex + 1}/${steps.length}: ${step.title}`);
|
|
163
|
+
try {
|
|
164
|
+
const result = await step.run(ctx);
|
|
165
|
+
if (result.status === 'aborted') {
|
|
166
|
+
// Save current position and exit
|
|
167
|
+
await saveTutorialState(ctx.state);
|
|
168
|
+
logger.info('Tutorial paused. Run `af tutorial` to resume.');
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
// Update state with results
|
|
172
|
+
const nextStepId = currentIndex < steps.length - 1 ? steps[currentIndex + 1].id : null;
|
|
173
|
+
ctx.state = await completeStep(ctx.state, step.id, nextStepId, result.responses);
|
|
174
|
+
// Refresh context in case step modified things (like creating codev dir)
|
|
175
|
+
ctx = await buildContext(ctx.state);
|
|
176
|
+
currentIndex++;
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
// Handle Ctrl+C gracefully
|
|
180
|
+
if (error instanceof Error && error.message.includes('readline was closed')) {
|
|
181
|
+
console.log();
|
|
182
|
+
await saveTutorialState(ctx.state);
|
|
183
|
+
logger.info('Tutorial paused. Run `af tutorial` to resume.');
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
throw error;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Tutorial complete!
|
|
190
|
+
prompts.section('Tutorial Complete!');
|
|
191
|
+
prompts.success('Congratulations! You\'ve completed the Agent Farm tutorial.');
|
|
192
|
+
console.log();
|
|
193
|
+
prompts.content('You now know how to:');
|
|
194
|
+
prompts.bullet('Set up Codev in your project');
|
|
195
|
+
prompts.bullet('Create specifications for new features');
|
|
196
|
+
prompts.bullet('Write implementation plans');
|
|
197
|
+
prompts.bullet('Use the Architect/Builder pattern');
|
|
198
|
+
console.log();
|
|
199
|
+
prompts.content('For more information, check out:');
|
|
200
|
+
prompts.bullet('CLAUDE.md or AGENTS.md in your project');
|
|
201
|
+
prompts.bullet('codev/protocols/ for protocol documentation');
|
|
202
|
+
prompts.bullet('Run `af --help` to see all available commands');
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/agent-farm/tutorial/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tutorial state management
|
|
3
|
+
* Persists tutorial progress to disk
|
|
4
|
+
*/
|
|
5
|
+
import type { TutorialState } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Load tutorial state from disk
|
|
8
|
+
*/
|
|
9
|
+
export declare function loadTutorialState(): Promise<TutorialState | null>;
|
|
10
|
+
/**
|
|
11
|
+
* Save tutorial state to disk
|
|
12
|
+
*/
|
|
13
|
+
export declare function saveTutorialState(state: TutorialState): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Reset tutorial state (delete the file)
|
|
16
|
+
*/
|
|
17
|
+
export declare function resetTutorialState(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Get or create tutorial state
|
|
20
|
+
*/
|
|
21
|
+
export declare function getOrCreateTutorialState(): Promise<TutorialState>;
|
|
22
|
+
/**
|
|
23
|
+
* Mark a step as completed and advance to the next step
|
|
24
|
+
*/
|
|
25
|
+
export declare function completeStep(state: TutorialState, stepId: string, nextStepId: string | null, responses?: Record<string, string>): Promise<TutorialState>;
|
|
26
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/tutorial/state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAsBjD;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAavE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAS3E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAMxD;AAED;;GAEG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,aAAa,CAAC,CASvE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,aAAa,CAAC,CAexB"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tutorial state management
|
|
3
|
+
* Persists tutorial progress to disk
|
|
4
|
+
*/
|
|
5
|
+
import { readFile, writeFile, unlink } from 'node:fs/promises';
|
|
6
|
+
import { existsSync } from 'node:fs';
|
|
7
|
+
import { resolve } from 'node:path';
|
|
8
|
+
import { getConfig, ensureDirectories } from '../utils/index.js';
|
|
9
|
+
const TUTORIAL_STATE_FILE = 'tutorial.json';
|
|
10
|
+
function getTutorialStatePath() {
|
|
11
|
+
const config = getConfig();
|
|
12
|
+
return resolve(config.stateDir, TUTORIAL_STATE_FILE);
|
|
13
|
+
}
|
|
14
|
+
function getDefaultTutorialState() {
|
|
15
|
+
const config = getConfig();
|
|
16
|
+
return {
|
|
17
|
+
projectPath: config.projectRoot,
|
|
18
|
+
currentStep: 'welcome',
|
|
19
|
+
completedSteps: [],
|
|
20
|
+
userResponses: {},
|
|
21
|
+
startedAt: new Date().toISOString(),
|
|
22
|
+
lastActiveAt: new Date().toISOString(),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Load tutorial state from disk
|
|
27
|
+
*/
|
|
28
|
+
export async function loadTutorialState() {
|
|
29
|
+
const statePath = getTutorialStatePath();
|
|
30
|
+
if (!existsSync(statePath)) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const content = await readFile(statePath, 'utf-8');
|
|
35
|
+
return JSON.parse(content);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Save tutorial state to disk
|
|
43
|
+
*/
|
|
44
|
+
export async function saveTutorialState(state) {
|
|
45
|
+
const config = getConfig();
|
|
46
|
+
await ensureDirectories(config);
|
|
47
|
+
// Update lastActiveAt on every save
|
|
48
|
+
state.lastActiveAt = new Date().toISOString();
|
|
49
|
+
const statePath = getTutorialStatePath();
|
|
50
|
+
await writeFile(statePath, JSON.stringify(state, null, 2));
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Reset tutorial state (delete the file)
|
|
54
|
+
*/
|
|
55
|
+
export async function resetTutorialState() {
|
|
56
|
+
const statePath = getTutorialStatePath();
|
|
57
|
+
if (existsSync(statePath)) {
|
|
58
|
+
await unlink(statePath);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get or create tutorial state
|
|
63
|
+
*/
|
|
64
|
+
export async function getOrCreateTutorialState() {
|
|
65
|
+
const existing = await loadTutorialState();
|
|
66
|
+
if (existing) {
|
|
67
|
+
return existing;
|
|
68
|
+
}
|
|
69
|
+
const newState = getDefaultTutorialState();
|
|
70
|
+
await saveTutorialState(newState);
|
|
71
|
+
return newState;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Mark a step as completed and advance to the next step
|
|
75
|
+
*/
|
|
76
|
+
export async function completeStep(state, stepId, nextStepId, responses) {
|
|
77
|
+
if (!state.completedSteps.includes(stepId)) {
|
|
78
|
+
state.completedSteps.push(stepId);
|
|
79
|
+
}
|
|
80
|
+
if (nextStepId) {
|
|
81
|
+
state.currentStep = nextStepId;
|
|
82
|
+
}
|
|
83
|
+
if (responses) {
|
|
84
|
+
state.userResponses = { ...state.userResponses, ...responses };
|
|
85
|
+
}
|
|
86
|
+
await saveTutorialState(state);
|
|
87
|
+
return state;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/agent-farm/tutorial/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"first-spec.d.ts","sourceRoot":"","sources":["../../../../src/agent-farm/tutorial/steps/first-spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,cAAc,CAAC;AAsDlE,eAAO,MAAM,aAAa,EAAE,IA2F3B,CAAC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tutorial Step 3: First Spec Walkthrough
|
|
3
|
+
* Guides user through creating their first specification
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync } from 'node:fs';
|
|
6
|
+
import { writeFile } from 'node:fs/promises';
|
|
7
|
+
import { resolve } from 'node:path';
|
|
8
|
+
import * as prompts from '../prompts.js';
|
|
9
|
+
function generateSpec(title, description, projectType) {
|
|
10
|
+
const projectContext = projectType === 'nodejs'
|
|
11
|
+
? 'Node.js/TypeScript'
|
|
12
|
+
: projectType === 'python'
|
|
13
|
+
? 'Python'
|
|
14
|
+
: 'your project';
|
|
15
|
+
return `# Specification: ${title}
|
|
16
|
+
|
|
17
|
+
## Overview
|
|
18
|
+
|
|
19
|
+
${description}
|
|
20
|
+
|
|
21
|
+
## Goals
|
|
22
|
+
|
|
23
|
+
1. [Primary goal for this feature]
|
|
24
|
+
2. [Secondary goal]
|
|
25
|
+
3. [Success criteria]
|
|
26
|
+
|
|
27
|
+
## Technical Requirements
|
|
28
|
+
|
|
29
|
+
### Context
|
|
30
|
+
|
|
31
|
+
This feature will be implemented in a ${projectContext} codebase.
|
|
32
|
+
|
|
33
|
+
### Implementation Notes
|
|
34
|
+
|
|
35
|
+
[Add technical details here]
|
|
36
|
+
|
|
37
|
+
## User Experience
|
|
38
|
+
|
|
39
|
+
[Describe how users will interact with this feature]
|
|
40
|
+
|
|
41
|
+
## Success Criteria
|
|
42
|
+
|
|
43
|
+
- [ ] [Measurable criterion 1]
|
|
44
|
+
- [ ] [Measurable criterion 2]
|
|
45
|
+
- [ ] Tests pass
|
|
46
|
+
- [ ] Documentation updated
|
|
47
|
+
|
|
48
|
+
## Open Questions
|
|
49
|
+
|
|
50
|
+
1. [Any decisions that need to be made]
|
|
51
|
+
2. [Unknowns to investigate]
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
*Created via Agent Farm tutorial*
|
|
56
|
+
`;
|
|
57
|
+
}
|
|
58
|
+
export const firstSpecStep = {
|
|
59
|
+
id: 'first-spec',
|
|
60
|
+
title: 'Write Your First Spec',
|
|
61
|
+
async run(ctx) {
|
|
62
|
+
prompts.content('Now let\'s create your first specification!\n');
|
|
63
|
+
prompts.content('A spec is a document that describes WHAT you want to build.');
|
|
64
|
+
prompts.content('It should be clear enough that anyone (human or AI) can understand the goal.\n');
|
|
65
|
+
prompts.content('Good specs include:');
|
|
66
|
+
prompts.bullet('Clear goals and success criteria');
|
|
67
|
+
prompts.bullet('Technical requirements and constraints');
|
|
68
|
+
prompts.bullet('User experience considerations');
|
|
69
|
+
prompts.bullet('Open questions that need answers');
|
|
70
|
+
console.log();
|
|
71
|
+
// Ask what they want to build
|
|
72
|
+
prompts.content('Think of something small you\'d like to add to your project.');
|
|
73
|
+
prompts.content('Start small! A good first spec might be:');
|
|
74
|
+
prompts.bullet('Add a utility function');
|
|
75
|
+
prompts.bullet('Fix a small bug');
|
|
76
|
+
prompts.bullet('Add a configuration option');
|
|
77
|
+
prompts.bullet('Improve error handling');
|
|
78
|
+
console.log();
|
|
79
|
+
const title = await prompts.prompt('What do you want to build? (short title)');
|
|
80
|
+
if (!title) {
|
|
81
|
+
prompts.info('Using example: "Add logging utility"');
|
|
82
|
+
const exampleTitle = 'Add logging utility';
|
|
83
|
+
const exampleDesc = 'Create a simple logging utility that provides consistent log formatting across the application.';
|
|
84
|
+
prompts.content('\nHere\'s what a basic spec looks like:');
|
|
85
|
+
prompts.code(generateSpec(exampleTitle, exampleDesc, ctx.projectType).slice(0, 500) + '...');
|
|
86
|
+
console.log();
|
|
87
|
+
await prompts.pressEnter();
|
|
88
|
+
return {
|
|
89
|
+
status: 'completed',
|
|
90
|
+
responses: { specTitle: exampleTitle, specSkipped: 'true' },
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
const description = await prompts.prompt('Describe it in one sentence');
|
|
94
|
+
// Generate the spec
|
|
95
|
+
const specContent = generateSpec(title, description || `Implement ${title}`, ctx.projectType);
|
|
96
|
+
// Show preview
|
|
97
|
+
prompts.content('\nHere\'s your spec:\n');
|
|
98
|
+
console.log(specContent.slice(0, 800));
|
|
99
|
+
if (specContent.length > 800) {
|
|
100
|
+
console.log('...\n');
|
|
101
|
+
}
|
|
102
|
+
const shouldSave = await prompts.confirm('Save this spec to codev/specs/tutorial-example.md?');
|
|
103
|
+
if (shouldSave) {
|
|
104
|
+
const specsDir = resolve(ctx.projectPath, 'codev', 'specs');
|
|
105
|
+
const specPath = resolve(specsDir, 'tutorial-example.md');
|
|
106
|
+
try {
|
|
107
|
+
// Ensure specs directory exists
|
|
108
|
+
if (!existsSync(specsDir)) {
|
|
109
|
+
const { mkdirSync } = await import('node:fs');
|
|
110
|
+
mkdirSync(specsDir, { recursive: true });
|
|
111
|
+
}
|
|
112
|
+
await writeFile(specPath, specContent);
|
|
113
|
+
prompts.success(`Saved to codev/specs/tutorial-example.md`);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
prompts.warn(`Failed to save: ${error instanceof Error ? error.message : String(error)}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
prompts.info('Spec not saved. You can create it manually later.');
|
|
121
|
+
}
|
|
122
|
+
console.log();
|
|
123
|
+
prompts.content('Tips for writing good specs:');
|
|
124
|
+
prompts.bullet('Be specific about what success looks like');
|
|
125
|
+
prompts.bullet('Include constraints and non-goals');
|
|
126
|
+
prompts.bullet('List open questions explicitly');
|
|
127
|
+
prompts.bullet('Keep it focused - one feature per spec');
|
|
128
|
+
console.log();
|
|
129
|
+
await prompts.pressEnter();
|
|
130
|
+
return {
|
|
131
|
+
status: 'completed',
|
|
132
|
+
responses: { specTitle: title, specDescription: description },
|
|
133
|
+
};
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
//# sourceMappingURL=first-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"first-spec.js","sourceRoot":"","sources":["../../../../src/agent-farm/tutorial/steps/first-spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implementation.d.ts","sourceRoot":"","sources":["../../../../src/agent-farm/tutorial/steps/implementation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,cAAc,CAAC;AAGlE,eAAO,MAAM,kBAAkB,EAAE,IA+EhC,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tutorial Step 5: Implementation Demo
|
|
3
|
+
* Shows how to implement using TICK or the Architect/Builder pattern
|
|
4
|
+
*/
|
|
5
|
+
import * as prompts from '../prompts.js';
|
|
6
|
+
export const implementationStep = {
|
|
7
|
+
id: 'implementation',
|
|
8
|
+
title: 'Implementation Workflow',
|
|
9
|
+
async run(ctx) {
|
|
10
|
+
prompts.content('Now let\'s talk about implementation!\n');
|
|
11
|
+
prompts.content('There are two main ways to implement your specs:\n');
|
|
12
|
+
// TICK protocol
|
|
13
|
+
prompts.content('1. TICK Protocol (Simple Tasks)\n');
|
|
14
|
+
prompts.content('For small, well-defined work, just implement directly:');
|
|
15
|
+
prompts.code(`# Work with your AI assistant
|
|
16
|
+
"Please implement the spec at codev/specs/0001-tutorial-task.md
|
|
17
|
+
following the plan at codev/plans/0001-tutorial-task.md"
|
|
18
|
+
|
|
19
|
+
# The assistant will:
|
|
20
|
+
# 1. Read the spec and plan
|
|
21
|
+
# 2. Implement the changes
|
|
22
|
+
# 3. Write tests
|
|
23
|
+
# 4. Create a PR when done`);
|
|
24
|
+
console.log();
|
|
25
|
+
// Architect/Builder pattern
|
|
26
|
+
prompts.content('2. Architect/Builder Pattern (Complex Work)\n');
|
|
27
|
+
prompts.content('For larger features or parallel development:\n');
|
|
28
|
+
prompts.code(`# Start the dashboard
|
|
29
|
+
af start
|
|
30
|
+
|
|
31
|
+
# Spawn a builder for a spec
|
|
32
|
+
af spawn --project 0001
|
|
33
|
+
|
|
34
|
+
# Or spawn for an ad-hoc task
|
|
35
|
+
af spawn --task "Fix the login validation"`);
|
|
36
|
+
console.log();
|
|
37
|
+
prompts.content('The Architect/Builder pattern:');
|
|
38
|
+
prompts.bullet('Architect (you + AI): Creates specs, reviews work');
|
|
39
|
+
prompts.bullet('Builders (autonomous AI): Implement in isolated worktrees');
|
|
40
|
+
prompts.bullet('Each builder gets its own branch and terminal');
|
|
41
|
+
prompts.bullet('Multiple builders can work in parallel');
|
|
42
|
+
console.log();
|
|
43
|
+
// Key commands
|
|
44
|
+
prompts.content('Key Commands:\n');
|
|
45
|
+
prompts.step(1, 'af start - Launch the architect dashboard');
|
|
46
|
+
prompts.step(2, 'af spawn -p X - Spawn a builder for spec X');
|
|
47
|
+
prompts.step(3, 'af status - Check status of all agents');
|
|
48
|
+
prompts.step(4, 'af send X - Send instructions to a builder');
|
|
49
|
+
prompts.step(5, 'af open F - Open file F in annotation viewer');
|
|
50
|
+
prompts.step(6, 'af stop - Stop all agent farm processes');
|
|
51
|
+
console.log();
|
|
52
|
+
// Practical advice
|
|
53
|
+
prompts.content('Best Practices:\n');
|
|
54
|
+
prompts.bullet('Start with TICK for simple tasks');
|
|
55
|
+
prompts.bullet('Use Architect/Builder when you have multiple specs');
|
|
56
|
+
prompts.bullet('Keep specs focused - one feature per builder');
|
|
57
|
+
prompts.bullet('Review builder output before merging');
|
|
58
|
+
console.log();
|
|
59
|
+
const wantToTry = await prompts.confirm('Would you like to try starting the dashboard?', false);
|
|
60
|
+
if (wantToTry) {
|
|
61
|
+
prompts.content('\nTo start the dashboard, run in your terminal:\n');
|
|
62
|
+
prompts.highlight('af start');
|
|
63
|
+
console.log();
|
|
64
|
+
prompts.content('This will open a web-based dashboard where you can:');
|
|
65
|
+
prompts.bullet('See the architect terminal');
|
|
66
|
+
prompts.bullet('View spawned builders');
|
|
67
|
+
prompts.bullet('Open files in the annotation viewer');
|
|
68
|
+
console.log();
|
|
69
|
+
prompts.info('The dashboard runs at http://localhost:4200 by default.');
|
|
70
|
+
}
|
|
71
|
+
console.log();
|
|
72
|
+
await prompts.pressEnter();
|
|
73
|
+
return { status: 'completed' };
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=implementation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implementation.js","sourceRoot":"","sources":["../../../../src/agent-farm/tutorial/steps/implementation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Export all tutorial steps
|
|
3
|
+
*/
|
|
4
|
+
export { welcomeStep } from './welcome.js';
|
|
5
|
+
export { setupStep } from './setup.js';
|
|
6
|
+
export { firstSpecStep } from './first-spec.js';
|
|
7
|
+
export { planningStep } from './planning.js';
|
|
8
|
+
export { implementationStep } from './implementation.js';
|
|
9
|
+
export { reviewStep } from './review.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/agent-farm/tutorial/steps/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Export all tutorial steps
|
|
3
|
+
*/
|
|
4
|
+
export { welcomeStep } from './welcome.js';
|
|
5
|
+
export { setupStep } from './setup.js';
|
|
6
|
+
export { firstSpecStep } from './first-spec.js';
|
|
7
|
+
export { planningStep } from './planning.js';
|
|
8
|
+
export { implementationStep } from './implementation.js';
|
|
9
|
+
export { reviewStep } from './review.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/agent-farm/tutorial/steps/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planning.d.ts","sourceRoot":"","sources":["../../../../src/agent-farm/tutorial/steps/planning.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,cAAc,CAAC;AA0DlE,eAAO,MAAM,YAAY,EAAE,IA4F1B,CAAC"}
|