@cluesmith/codev 1.5.9 → 1.5.11
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/agent-farm/commands/architect.d.ts.map +1 -1
- package/dist/agent-farm/commands/architect.js +5 -20
- package/dist/agent-farm/commands/architect.js.map +1 -1
- package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn.js +35 -22
- package/dist/agent-farm/commands/spawn.js.map +1 -1
- package/dist/agent-farm/commands/start.d.ts.map +1 -1
- package/dist/agent-farm/commands/start.js +35 -21
- package/dist/agent-farm/commands/start.js.map +1 -1
- package/dist/agent-farm/servers/dashboard-server.js +5 -53
- package/dist/agent-farm/servers/dashboard-server.js.map +1 -1
- package/dist/agent-farm/servers/open-server.js +14 -22
- package/dist/agent-farm/servers/open-server.js.map +1 -1
- package/dist/agent-farm/servers/tower-server.js +2 -54
- package/dist/agent-farm/servers/tower-server.js.map +1 -1
- package/dist/agent-farm/utils/roles.d.ts +32 -0
- package/dist/agent-farm/utils/roles.d.ts.map +1 -0
- package/dist/agent-farm/utils/roles.js +43 -0
- package/dist/agent-farm/utils/roles.js.map +1 -0
- package/dist/agent-farm/utils/server-utils.d.ts +24 -0
- package/dist/agent-farm/utils/server-utils.d.ts.map +1 -0
- package/dist/agent-farm/utils/server-utils.js +66 -0
- package/dist/agent-farm/utils/server-utils.js.map +1 -0
- package/dist/commands/adopt.d.ts.map +1 -1
- package/dist/commands/adopt.js +37 -157
- package/dist/commands/adopt.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +26 -138
- package/dist/commands/init.js.map +1 -1
- package/dist/lib/cli-prompts.d.ts +20 -0
- package/dist/lib/cli-prompts.d.ts.map +1 -0
- package/dist/lib/cli-prompts.js +51 -0
- package/dist/lib/cli-prompts.js.map +1 -0
- package/dist/lib/scaffold.d.ts +81 -0
- package/dist/lib/scaffold.d.ts.map +1 -0
- package/dist/lib/scaffold.js +189 -0
- package/dist/lib/scaffold.js.map +1 -0
- package/package.json +1 -1
- package/templates/dashboard/js/activity.js +4 -130
- package/templates/dashboard/js/dialogs.js +4 -49
- package/templates/dashboard/js/files.js +2 -29
- package/templates/dashboard/js/main.js +2 -31
- package/templates/dashboard/js/tabs.js +6 -30
- package/templates/dashboard/js/utils.js +199 -0
- package/templates/open.html +8 -8
package/dist/commands/init.js
CHANGED
|
@@ -6,47 +6,11 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import * as fs from 'node:fs';
|
|
8
8
|
import * as path from 'node:path';
|
|
9
|
-
import * as readline from 'node:readline';
|
|
10
9
|
import chalk from 'chalk';
|
|
11
10
|
import { getTemplatesDir } from '../lib/templates.js';
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
async function prompt(question, defaultValue) {
|
|
16
|
-
const rl = readline.createInterface({
|
|
17
|
-
input: process.stdin,
|
|
18
|
-
output: process.stdout,
|
|
19
|
-
});
|
|
20
|
-
return new Promise((resolve) => {
|
|
21
|
-
const promptText = defaultValue ? `${question} [${defaultValue}]: ` : `${question}: `;
|
|
22
|
-
rl.question(promptText, (answer) => {
|
|
23
|
-
rl.close();
|
|
24
|
-
resolve(answer.trim() || defaultValue || '');
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Prompt for yes/no confirmation
|
|
30
|
-
*/
|
|
31
|
-
async function confirm(question, defaultYes = true) {
|
|
32
|
-
const rl = readline.createInterface({
|
|
33
|
-
input: process.stdin,
|
|
34
|
-
output: process.stdout,
|
|
35
|
-
});
|
|
36
|
-
return new Promise((resolve) => {
|
|
37
|
-
const hint = defaultYes ? '[Y/n]' : '[y/N]';
|
|
38
|
-
rl.question(`${question} ${hint}: `, (answer) => {
|
|
39
|
-
rl.close();
|
|
40
|
-
const normalized = answer.trim().toLowerCase();
|
|
41
|
-
if (normalized === '') {
|
|
42
|
-
resolve(defaultYes);
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
resolve(normalized === 'y' || normalized === 'yes');
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
}
|
|
11
|
+
import { prompt, confirm } from '../lib/cli-prompts.js';
|
|
12
|
+
import { createUserDirs, copyProjectlist, copyProjectlistArchive, copyResourceTemplates, copyRootFiles, createGitignore, } from '../lib/scaffold.js';
|
|
13
|
+
// prompt and confirm imported from ../lib/cli-prompts.js
|
|
50
14
|
/**
|
|
51
15
|
* Initialize a new codev project
|
|
52
16
|
*/
|
|
@@ -80,121 +44,45 @@ export async function init(projectName, options = {}) {
|
|
|
80
44
|
}
|
|
81
45
|
// Create directory
|
|
82
46
|
fs.mkdirSync(targetDir, { recursive: true });
|
|
83
|
-
// Create minimal codev structure
|
|
84
|
-
// Framework files (protocols, roles) are provided by embedded skeleton at runtime
|
|
47
|
+
// Create minimal codev structure using shared scaffold utilities
|
|
85
48
|
let fileCount = 0;
|
|
86
49
|
console.log(chalk.dim('Creating minimal codev structure...'));
|
|
87
50
|
console.log(chalk.dim('(Framework files provided by @cluesmith/codev at runtime)'));
|
|
88
51
|
console.log('');
|
|
89
|
-
// Create user data directories
|
|
90
|
-
const userDirs = ['specs', 'plans', 'reviews'];
|
|
91
|
-
for (const dir of userDirs) {
|
|
92
|
-
const dirPath = path.join(targetDir, 'codev', dir);
|
|
93
|
-
fs.mkdirSync(dirPath, { recursive: true });
|
|
94
|
-
// Create .gitkeep to preserve empty directory
|
|
95
|
-
fs.writeFileSync(path.join(dirPath, '.gitkeep'), '');
|
|
96
|
-
console.log(chalk.green(' +'), `codev/${dir}/`);
|
|
97
|
-
fileCount++;
|
|
98
|
-
}
|
|
99
52
|
// Get skeleton directory for templates
|
|
100
53
|
const skeletonDir = getTemplatesDir();
|
|
101
|
-
// Create
|
|
102
|
-
const
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
fs.copyFileSync(projectlistTemplatePath, projectlistPath);
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
// Fallback to inline template if skeleton template not found
|
|
109
|
-
const projectlistContent = `# Project List
|
|
110
|
-
|
|
111
|
-
Track all projects here. See codev documentation for status values.
|
|
112
|
-
|
|
113
|
-
\`\`\`yaml
|
|
114
|
-
projects:
|
|
115
|
-
- id: "0001"
|
|
116
|
-
title: "Example Project"
|
|
117
|
-
summary: "Brief description"
|
|
118
|
-
status: conceived
|
|
119
|
-
priority: medium
|
|
120
|
-
files:
|
|
121
|
-
spec: null
|
|
122
|
-
plan: null
|
|
123
|
-
review: null
|
|
124
|
-
dependencies: []
|
|
125
|
-
tags: []
|
|
126
|
-
notes: "Replace with your first project"
|
|
127
|
-
\`\`\`
|
|
128
|
-
`;
|
|
129
|
-
fs.writeFileSync(projectlistPath, projectlistContent);
|
|
130
|
-
}
|
|
131
|
-
console.log(chalk.green(' +'), 'codev/projectlist.md');
|
|
132
|
-
fileCount++;
|
|
133
|
-
// Create projectlist-archive.md from skeleton template
|
|
134
|
-
const projectlistArchivePath = path.join(targetDir, 'codev', 'projectlist-archive.md');
|
|
135
|
-
const projectlistArchiveTemplatePath = path.join(skeletonDir, 'templates', 'projectlist-archive.md');
|
|
136
|
-
if (fs.existsSync(projectlistArchiveTemplatePath)) {
|
|
137
|
-
fs.copyFileSync(projectlistArchiveTemplatePath, projectlistArchivePath);
|
|
138
|
-
console.log(chalk.green(' +'), 'codev/projectlist-archive.md');
|
|
54
|
+
// Create user data directories (specs, plans, reviews)
|
|
55
|
+
const dirsResult = createUserDirs(targetDir);
|
|
56
|
+
for (const dir of dirsResult.created) {
|
|
57
|
+
console.log(chalk.green(' +'), `codev/${dir}/`);
|
|
139
58
|
fileCount++;
|
|
140
59
|
}
|
|
141
|
-
// Create
|
|
142
|
-
const
|
|
143
|
-
if (
|
|
144
|
-
|
|
145
|
-
}
|
|
146
|
-
// Copy lessons-learned.md template
|
|
147
|
-
const lessonsPath = path.join(resourcesDir, 'lessons-learned.md');
|
|
148
|
-
const lessonsTemplatePath = path.join(skeletonDir, 'templates', 'lessons-learned.md');
|
|
149
|
-
if (fs.existsSync(lessonsTemplatePath)) {
|
|
150
|
-
fs.copyFileSync(lessonsTemplatePath, lessonsPath);
|
|
151
|
-
console.log(chalk.green(' +'), 'codev/resources/lessons-learned.md');
|
|
60
|
+
// Create projectlist.md
|
|
61
|
+
const projectlistResult = copyProjectlist(targetDir, skeletonDir);
|
|
62
|
+
if (projectlistResult.copied) {
|
|
63
|
+
console.log(chalk.green(' +'), 'codev/projectlist.md');
|
|
152
64
|
fileCount++;
|
|
153
65
|
}
|
|
154
|
-
//
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
fs.copyFileSync(archTemplatePath, archPath);
|
|
159
|
-
console.log(chalk.green(' +'), 'codev/resources/arch.md');
|
|
66
|
+
// Create projectlist-archive.md
|
|
67
|
+
const archiveResult = copyProjectlistArchive(targetDir, skeletonDir);
|
|
68
|
+
if (archiveResult.copied) {
|
|
69
|
+
console.log(chalk.green(' +'), 'codev/projectlist-archive.md');
|
|
160
70
|
fileCount++;
|
|
161
71
|
}
|
|
162
|
-
//
|
|
163
|
-
const
|
|
164
|
-
const
|
|
165
|
-
|
|
166
|
-
const content = fs.readFileSync(claudeMdSrc, 'utf-8')
|
|
167
|
-
.replace(/\{\{PROJECT_NAME\}\}/g, projectBaseName);
|
|
168
|
-
fs.writeFileSync(path.join(targetDir, 'CLAUDE.md'), content);
|
|
169
|
-
console.log(chalk.green(' +'), 'CLAUDE.md');
|
|
72
|
+
// Copy resource templates (lessons-learned.md, arch.md)
|
|
73
|
+
const resourcesResult = copyResourceTemplates(targetDir, skeletonDir);
|
|
74
|
+
for (const file of resourcesResult.copied) {
|
|
75
|
+
console.log(chalk.green(' +'), `codev/resources/${file}`);
|
|
170
76
|
fileCount++;
|
|
171
77
|
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
console.log(chalk.green(' +'), 'AGENTS.md');
|
|
78
|
+
// Copy root files (CLAUDE.md, AGENTS.md)
|
|
79
|
+
const rootResult = copyRootFiles(targetDir, skeletonDir, projectBaseName);
|
|
80
|
+
for (const file of rootResult.copied) {
|
|
81
|
+
console.log(chalk.green(' +'), file);
|
|
177
82
|
fileCount++;
|
|
178
83
|
}
|
|
179
84
|
// Create .gitignore
|
|
180
|
-
|
|
181
|
-
.agent-farm/
|
|
182
|
-
.consult/
|
|
183
|
-
codev/.update-hashes.json
|
|
184
|
-
.builders/
|
|
185
|
-
|
|
186
|
-
# Dependencies
|
|
187
|
-
node_modules/
|
|
188
|
-
|
|
189
|
-
# Build output
|
|
190
|
-
dist/
|
|
191
|
-
|
|
192
|
-
# OS files
|
|
193
|
-
.DS_Store
|
|
194
|
-
*.swp
|
|
195
|
-
*.swo
|
|
196
|
-
`;
|
|
197
|
-
fs.writeFileSync(path.join(targetDir, '.gitignore'), gitignoreContent);
|
|
85
|
+
createGitignore(targetDir);
|
|
198
86
|
console.log(chalk.green(' +'), '.gitignore');
|
|
199
87
|
fileCount++;
|
|
200
88
|
// Initialize git if requested
|
|
@@ -204,7 +92,7 @@ dist/
|
|
|
204
92
|
execSync('git init', { cwd: targetDir, stdio: 'pipe' });
|
|
205
93
|
console.log(chalk.green(' ✓'), 'Git repository initialized');
|
|
206
94
|
}
|
|
207
|
-
catch
|
|
95
|
+
catch {
|
|
208
96
|
console.log(chalk.yellow(' ⚠'), 'Failed to initialize git repository');
|
|
209
97
|
}
|
|
210
98
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI prompt utilities
|
|
3
|
+
* Extracted from init.ts and adopt.ts to eliminate duplication
|
|
4
|
+
* (Maintenance Run 0004)
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Prompt user for text input
|
|
8
|
+
* @param question - The question to display
|
|
9
|
+
* @param defaultValue - Optional default value shown in brackets
|
|
10
|
+
* @returns The user's input or the default value
|
|
11
|
+
*/
|
|
12
|
+
export declare function prompt(question: string, defaultValue?: string): Promise<string>;
|
|
13
|
+
/**
|
|
14
|
+
* Prompt for yes/no confirmation
|
|
15
|
+
* @param question - The question to display
|
|
16
|
+
* @param defaultYes - Whether 'yes' is the default (true) or 'no' is (false)
|
|
17
|
+
* @returns true if user confirmed, false otherwise
|
|
18
|
+
*/
|
|
19
|
+
export declare function confirm(question: string, defaultYes?: boolean): Promise<boolean>;
|
|
20
|
+
//# sourceMappingURL=cli-prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-prompts.d.ts","sourceRoot":"","sources":["../../src/lib/cli-prompts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAarF;AAED;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,UAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBnF"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI prompt utilities
|
|
3
|
+
* Extracted from init.ts and adopt.ts to eliminate duplication
|
|
4
|
+
* (Maintenance Run 0004)
|
|
5
|
+
*/
|
|
6
|
+
import * as readline from 'node:readline';
|
|
7
|
+
/**
|
|
8
|
+
* Prompt user for text input
|
|
9
|
+
* @param question - The question to display
|
|
10
|
+
* @param defaultValue - Optional default value shown in brackets
|
|
11
|
+
* @returns The user's input or the default value
|
|
12
|
+
*/
|
|
13
|
+
export async function prompt(question, defaultValue) {
|
|
14
|
+
const rl = readline.createInterface({
|
|
15
|
+
input: process.stdin,
|
|
16
|
+
output: process.stdout,
|
|
17
|
+
});
|
|
18
|
+
return new Promise((resolve) => {
|
|
19
|
+
const promptText = defaultValue ? `${question} [${defaultValue}]: ` : `${question}: `;
|
|
20
|
+
rl.question(promptText, (answer) => {
|
|
21
|
+
rl.close();
|
|
22
|
+
resolve(answer.trim() || defaultValue || '');
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Prompt for yes/no confirmation
|
|
28
|
+
* @param question - The question to display
|
|
29
|
+
* @param defaultYes - Whether 'yes' is the default (true) or 'no' is (false)
|
|
30
|
+
* @returns true if user confirmed, false otherwise
|
|
31
|
+
*/
|
|
32
|
+
export async function confirm(question, defaultYes = true) {
|
|
33
|
+
const rl = readline.createInterface({
|
|
34
|
+
input: process.stdin,
|
|
35
|
+
output: process.stdout,
|
|
36
|
+
});
|
|
37
|
+
return new Promise((resolve) => {
|
|
38
|
+
const hint = defaultYes ? '[Y/n]' : '[y/N]';
|
|
39
|
+
rl.question(`${question} ${hint}: `, (answer) => {
|
|
40
|
+
rl.close();
|
|
41
|
+
const normalized = answer.trim().toLowerCase();
|
|
42
|
+
if (normalized === '') {
|
|
43
|
+
resolve(defaultYes);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
resolve(normalized === 'y' || normalized === 'yes');
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=cli-prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-prompts.js","sourceRoot":"","sources":["../../src/lib/cli-prompts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,QAAgB,EAAE,YAAqB;IAClE,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,CAAC;QACtF,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE;YACjC,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,YAAY,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,QAAgB,EAAE,UAAU,GAAG,IAAI;IAC/D,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5C,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,IAAI,IAAI,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;YAC9C,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC/C,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;gBACtB,OAAO,CAAC,UAAU,CAAC,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK,CAAC,CAAC;YACtD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scaffold utilities for codev init and adopt commands
|
|
3
|
+
* Extracted to eliminate duplication (Maintenance Run 0004)
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Standard gitignore entries for codev projects
|
|
7
|
+
*/
|
|
8
|
+
export declare const CODEV_GITIGNORE_ENTRIES = "# Codev\n.agent-farm/\n.consult/\ncodev/.update-hashes.json\n.builders/\n";
|
|
9
|
+
/**
|
|
10
|
+
* Full gitignore content for new projects
|
|
11
|
+
*/
|
|
12
|
+
export declare const FULL_GITIGNORE_CONTENT = "# Codev\n.agent-farm/\n.consult/\ncodev/.update-hashes.json\n.builders/\n\n# Dependencies\nnode_modules/\n\n# Build output\ndist/\n\n# OS files\n.DS_Store\n*.swp\n*.swo\n";
|
|
13
|
+
interface CreateUserDirsOptions {
|
|
14
|
+
skipExisting?: boolean;
|
|
15
|
+
}
|
|
16
|
+
interface CreateUserDirsResult {
|
|
17
|
+
created: string[];
|
|
18
|
+
skipped: string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create user data directories (specs, plans, reviews) with .gitkeep files
|
|
22
|
+
*/
|
|
23
|
+
export declare function createUserDirs(targetDir: string, options?: CreateUserDirsOptions): CreateUserDirsResult;
|
|
24
|
+
interface CopyProjectlistOptions {
|
|
25
|
+
skipExisting?: boolean;
|
|
26
|
+
}
|
|
27
|
+
interface CopyProjectlistResult {
|
|
28
|
+
copied: boolean;
|
|
29
|
+
skipped?: boolean;
|
|
30
|
+
usedFallback?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Copy projectlist.md from skeleton template, with inline fallback
|
|
34
|
+
*/
|
|
35
|
+
export declare function copyProjectlist(targetDir: string, skeletonDir: string, options?: CopyProjectlistOptions): CopyProjectlistResult;
|
|
36
|
+
interface CopyProjectlistArchiveResult {
|
|
37
|
+
copied: boolean;
|
|
38
|
+
skipped?: boolean;
|
|
39
|
+
templateNotFound?: boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Copy projectlist-archive.md from skeleton template
|
|
43
|
+
*/
|
|
44
|
+
export declare function copyProjectlistArchive(targetDir: string, skeletonDir: string, options?: CopyProjectlistOptions): CopyProjectlistArchiveResult;
|
|
45
|
+
interface CopyResourceTemplatesOptions {
|
|
46
|
+
skipExisting?: boolean;
|
|
47
|
+
}
|
|
48
|
+
interface CopyResourceTemplatesResult {
|
|
49
|
+
copied: string[];
|
|
50
|
+
skipped: string[];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Copy resource templates (lessons-learned.md, arch.md)
|
|
54
|
+
*/
|
|
55
|
+
export declare function copyResourceTemplates(targetDir: string, skeletonDir: string, options?: CopyResourceTemplatesOptions): CopyResourceTemplatesResult;
|
|
56
|
+
interface CopyRootFilesOptions {
|
|
57
|
+
handleConflicts?: boolean;
|
|
58
|
+
}
|
|
59
|
+
interface CopyRootFilesResult {
|
|
60
|
+
copied: string[];
|
|
61
|
+
conflicts: string[];
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Copy root files (CLAUDE.md, AGENTS.md) with project name substitution
|
|
65
|
+
*/
|
|
66
|
+
export declare function copyRootFiles(targetDir: string, skeletonDir: string, projectName: string, options?: CopyRootFilesOptions): CopyRootFilesResult;
|
|
67
|
+
/**
|
|
68
|
+
* Create a new .gitignore file with full content (for init)
|
|
69
|
+
*/
|
|
70
|
+
export declare function createGitignore(targetDir: string): void;
|
|
71
|
+
interface UpdateGitignoreResult {
|
|
72
|
+
updated: boolean;
|
|
73
|
+
created: boolean;
|
|
74
|
+
alreadyPresent: boolean;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Update existing .gitignore or create if not exists (for adopt)
|
|
78
|
+
*/
|
|
79
|
+
export declare function updateGitignore(targetDir: string): UpdateGitignoreResult;
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=scaffold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/lib/scaffold.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;GAEG;AACH,eAAO,MAAM,uBAAuB,8EAKnC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,+KAWlC,CAAC;AA0BF,UAAU,qBAAqB;IAC7B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,UAAU,oBAAoB;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,qBAA0B,GAClC,oBAAoB,CAkBtB;AAED,UAAU,sBAAsB;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,UAAU,qBAAqB;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,sBAA2B,GACnC,qBAAqB,CAiBvB;AAED,UAAU,4BAA4B;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,sBAA2B,GACnC,4BAA4B,CAe9B;AAED,UAAU,4BAA4B;IACpC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,UAAU,2BAA2B;IACnC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,4BAAiC,GACzC,2BAA2B,CA4B7B;AAED,UAAU,oBAAoB;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,mBAAmB;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CA+BrB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAGvD;AAED,UAAU,qBAAqB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,qBAAqB,CAexE"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scaffold utilities for codev init and adopt commands
|
|
3
|
+
* Extracted to eliminate duplication (Maintenance Run 0004)
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'node:fs';
|
|
6
|
+
import * as path from 'node:path';
|
|
7
|
+
/**
|
|
8
|
+
* Standard gitignore entries for codev projects
|
|
9
|
+
*/
|
|
10
|
+
export const CODEV_GITIGNORE_ENTRIES = `# Codev
|
|
11
|
+
.agent-farm/
|
|
12
|
+
.consult/
|
|
13
|
+
codev/.update-hashes.json
|
|
14
|
+
.builders/
|
|
15
|
+
`;
|
|
16
|
+
/**
|
|
17
|
+
* Full gitignore content for new projects
|
|
18
|
+
*/
|
|
19
|
+
export const FULL_GITIGNORE_CONTENT = `${CODEV_GITIGNORE_ENTRIES}
|
|
20
|
+
# Dependencies
|
|
21
|
+
node_modules/
|
|
22
|
+
|
|
23
|
+
# Build output
|
|
24
|
+
dist/
|
|
25
|
+
|
|
26
|
+
# OS files
|
|
27
|
+
.DS_Store
|
|
28
|
+
*.swp
|
|
29
|
+
*.swo
|
|
30
|
+
`;
|
|
31
|
+
/**
|
|
32
|
+
* Inline fallback template for projectlist.md
|
|
33
|
+
*/
|
|
34
|
+
const PROJECTLIST_FALLBACK = `# Project List
|
|
35
|
+
|
|
36
|
+
Track all projects here. See codev documentation for status values.
|
|
37
|
+
|
|
38
|
+
\`\`\`yaml
|
|
39
|
+
projects:
|
|
40
|
+
- id: "0001"
|
|
41
|
+
title: "Example Project"
|
|
42
|
+
summary: "Brief description"
|
|
43
|
+
status: conceived
|
|
44
|
+
priority: medium
|
|
45
|
+
files:
|
|
46
|
+
spec: null
|
|
47
|
+
plan: null
|
|
48
|
+
review: null
|
|
49
|
+
dependencies: []
|
|
50
|
+
tags: []
|
|
51
|
+
notes: "Replace with your first project"
|
|
52
|
+
\`\`\`
|
|
53
|
+
`;
|
|
54
|
+
/**
|
|
55
|
+
* Create user data directories (specs, plans, reviews) with .gitkeep files
|
|
56
|
+
*/
|
|
57
|
+
export function createUserDirs(targetDir, options = {}) {
|
|
58
|
+
const { skipExisting = false } = options;
|
|
59
|
+
const userDirs = ['specs', 'plans', 'reviews'];
|
|
60
|
+
const created = [];
|
|
61
|
+
const skipped = [];
|
|
62
|
+
for (const dir of userDirs) {
|
|
63
|
+
const dirPath = path.join(targetDir, 'codev', dir);
|
|
64
|
+
if (skipExisting && fs.existsSync(dirPath)) {
|
|
65
|
+
skipped.push(dir);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
69
|
+
fs.writeFileSync(path.join(dirPath, '.gitkeep'), '');
|
|
70
|
+
created.push(dir);
|
|
71
|
+
}
|
|
72
|
+
return { created, skipped };
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Copy projectlist.md from skeleton template, with inline fallback
|
|
76
|
+
*/
|
|
77
|
+
export function copyProjectlist(targetDir, skeletonDir, options = {}) {
|
|
78
|
+
const { skipExisting = false } = options;
|
|
79
|
+
const projectlistPath = path.join(targetDir, 'codev', 'projectlist.md');
|
|
80
|
+
if (skipExisting && fs.existsSync(projectlistPath)) {
|
|
81
|
+
return { copied: false, skipped: true };
|
|
82
|
+
}
|
|
83
|
+
const templatePath = path.join(skeletonDir, 'templates', 'projectlist.md');
|
|
84
|
+
if (fs.existsSync(templatePath)) {
|
|
85
|
+
fs.copyFileSync(templatePath, projectlistPath);
|
|
86
|
+
return { copied: true };
|
|
87
|
+
}
|
|
88
|
+
// Fallback to inline template
|
|
89
|
+
fs.writeFileSync(projectlistPath, PROJECTLIST_FALLBACK);
|
|
90
|
+
return { copied: true, usedFallback: true };
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Copy projectlist-archive.md from skeleton template
|
|
94
|
+
*/
|
|
95
|
+
export function copyProjectlistArchive(targetDir, skeletonDir, options = {}) {
|
|
96
|
+
const { skipExisting = false } = options;
|
|
97
|
+
const archivePath = path.join(targetDir, 'codev', 'projectlist-archive.md');
|
|
98
|
+
if (skipExisting && fs.existsSync(archivePath)) {
|
|
99
|
+
return { copied: false, skipped: true };
|
|
100
|
+
}
|
|
101
|
+
const templatePath = path.join(skeletonDir, 'templates', 'projectlist-archive.md');
|
|
102
|
+
if (!fs.existsSync(templatePath)) {
|
|
103
|
+
return { copied: false, templateNotFound: true };
|
|
104
|
+
}
|
|
105
|
+
fs.copyFileSync(templatePath, archivePath);
|
|
106
|
+
return { copied: true };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Copy resource templates (lessons-learned.md, arch.md)
|
|
110
|
+
*/
|
|
111
|
+
export function copyResourceTemplates(targetDir, skeletonDir, options = {}) {
|
|
112
|
+
const { skipExisting = false } = options;
|
|
113
|
+
const resourcesDir = path.join(targetDir, 'codev', 'resources');
|
|
114
|
+
const copied = [];
|
|
115
|
+
const skipped = [];
|
|
116
|
+
// Ensure resources directory exists
|
|
117
|
+
if (!fs.existsSync(resourcesDir)) {
|
|
118
|
+
fs.mkdirSync(resourcesDir, { recursive: true });
|
|
119
|
+
}
|
|
120
|
+
const templates = ['lessons-learned.md', 'arch.md'];
|
|
121
|
+
for (const template of templates) {
|
|
122
|
+
const destPath = path.join(resourcesDir, template);
|
|
123
|
+
const srcPath = path.join(skeletonDir, 'templates', template);
|
|
124
|
+
if (skipExisting && fs.existsSync(destPath)) {
|
|
125
|
+
skipped.push(template);
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (fs.existsSync(srcPath)) {
|
|
129
|
+
fs.copyFileSync(srcPath, destPath);
|
|
130
|
+
copied.push(template);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return { copied, skipped };
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Copy root files (CLAUDE.md, AGENTS.md) with project name substitution
|
|
137
|
+
*/
|
|
138
|
+
export function copyRootFiles(targetDir, skeletonDir, projectName, options = {}) {
|
|
139
|
+
const { handleConflicts = false } = options;
|
|
140
|
+
const copied = [];
|
|
141
|
+
const conflicts = [];
|
|
142
|
+
const rootFiles = ['CLAUDE.md', 'AGENTS.md'];
|
|
143
|
+
for (const file of rootFiles) {
|
|
144
|
+
const srcPath = path.join(skeletonDir, 'templates', file);
|
|
145
|
+
const destPath = path.join(targetDir, file);
|
|
146
|
+
if (!fs.existsSync(srcPath)) {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const content = fs.readFileSync(srcPath, 'utf-8')
|
|
150
|
+
.replace(/\{\{PROJECT_NAME\}\}/g, projectName);
|
|
151
|
+
if (fs.existsSync(destPath)) {
|
|
152
|
+
if (handleConflicts) {
|
|
153
|
+
// Create .codev-new for merge
|
|
154
|
+
fs.writeFileSync(destPath + '.codev-new', content);
|
|
155
|
+
conflicts.push(file);
|
|
156
|
+
}
|
|
157
|
+
// Skip if exists and not handling conflicts
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
fs.writeFileSync(destPath, content);
|
|
161
|
+
copied.push(file);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return { copied, conflicts };
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Create a new .gitignore file with full content (for init)
|
|
168
|
+
*/
|
|
169
|
+
export function createGitignore(targetDir) {
|
|
170
|
+
const gitignorePath = path.join(targetDir, '.gitignore');
|
|
171
|
+
fs.writeFileSync(gitignorePath, FULL_GITIGNORE_CONTENT);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Update existing .gitignore or create if not exists (for adopt)
|
|
175
|
+
*/
|
|
176
|
+
export function updateGitignore(targetDir) {
|
|
177
|
+
const gitignorePath = path.join(targetDir, '.gitignore');
|
|
178
|
+
if (!fs.existsSync(gitignorePath)) {
|
|
179
|
+
fs.writeFileSync(gitignorePath, CODEV_GITIGNORE_ENTRIES.trim() + '\n');
|
|
180
|
+
return { updated: false, created: true, alreadyPresent: false };
|
|
181
|
+
}
|
|
182
|
+
const existing = fs.readFileSync(gitignorePath, 'utf-8');
|
|
183
|
+
if (existing.includes('.agent-farm/')) {
|
|
184
|
+
return { updated: false, created: false, alreadyPresent: true };
|
|
185
|
+
}
|
|
186
|
+
fs.appendFileSync(gitignorePath, '\n' + CODEV_GITIGNORE_ENTRIES);
|
|
187
|
+
return { updated: true, created: false, alreadyPresent: false };
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/lib/scaffold.ts"],"names":[],"mappings":"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"}
|