@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.
Files changed (45) hide show
  1. package/dist/agent-farm/commands/architect.d.ts.map +1 -1
  2. package/dist/agent-farm/commands/architect.js +5 -20
  3. package/dist/agent-farm/commands/architect.js.map +1 -1
  4. package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
  5. package/dist/agent-farm/commands/spawn.js +35 -22
  6. package/dist/agent-farm/commands/spawn.js.map +1 -1
  7. package/dist/agent-farm/commands/start.d.ts.map +1 -1
  8. package/dist/agent-farm/commands/start.js +35 -21
  9. package/dist/agent-farm/commands/start.js.map +1 -1
  10. package/dist/agent-farm/servers/dashboard-server.js +5 -53
  11. package/dist/agent-farm/servers/dashboard-server.js.map +1 -1
  12. package/dist/agent-farm/servers/open-server.js +14 -22
  13. package/dist/agent-farm/servers/open-server.js.map +1 -1
  14. package/dist/agent-farm/servers/tower-server.js +2 -54
  15. package/dist/agent-farm/servers/tower-server.js.map +1 -1
  16. package/dist/agent-farm/utils/roles.d.ts +32 -0
  17. package/dist/agent-farm/utils/roles.d.ts.map +1 -0
  18. package/dist/agent-farm/utils/roles.js +43 -0
  19. package/dist/agent-farm/utils/roles.js.map +1 -0
  20. package/dist/agent-farm/utils/server-utils.d.ts +24 -0
  21. package/dist/agent-farm/utils/server-utils.d.ts.map +1 -0
  22. package/dist/agent-farm/utils/server-utils.js +66 -0
  23. package/dist/agent-farm/utils/server-utils.js.map +1 -0
  24. package/dist/commands/adopt.d.ts.map +1 -1
  25. package/dist/commands/adopt.js +37 -157
  26. package/dist/commands/adopt.js.map +1 -1
  27. package/dist/commands/init.d.ts.map +1 -1
  28. package/dist/commands/init.js +26 -138
  29. package/dist/commands/init.js.map +1 -1
  30. package/dist/lib/cli-prompts.d.ts +20 -0
  31. package/dist/lib/cli-prompts.d.ts.map +1 -0
  32. package/dist/lib/cli-prompts.js +51 -0
  33. package/dist/lib/cli-prompts.js.map +1 -0
  34. package/dist/lib/scaffold.d.ts +81 -0
  35. package/dist/lib/scaffold.d.ts.map +1 -0
  36. package/dist/lib/scaffold.js +189 -0
  37. package/dist/lib/scaffold.js.map +1 -0
  38. package/package.json +1 -1
  39. package/templates/dashboard/js/activity.js +4 -130
  40. package/templates/dashboard/js/dialogs.js +4 -49
  41. package/templates/dashboard/js/files.js +2 -29
  42. package/templates/dashboard/js/main.js +2 -31
  43. package/templates/dashboard/js/tabs.js +6 -30
  44. package/templates/dashboard/js/utils.js +199 -0
  45. package/templates/open.html +8 -8
@@ -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
- * Prompt user for input
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 projectlist.md from skeleton template
102
- const projectlistPath = path.join(targetDir, 'codev', 'projectlist.md');
103
- const projectlistTemplatePath = path.join(skeletonDir, 'templates', 'projectlist.md');
104
- if (fs.existsSync(projectlistTemplatePath)) {
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 resources directory and copy templates
142
- const resourcesDir = path.join(targetDir, 'codev', 'resources');
143
- if (!fs.existsSync(resourcesDir)) {
144
- fs.mkdirSync(resourcesDir, { recursive: true });
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
- // Copy arch.md template
155
- const archPath = path.join(resourcesDir, 'arch.md');
156
- const archTemplatePath = path.join(skeletonDir, 'templates', 'arch.md');
157
- if (fs.existsSync(archTemplatePath)) {
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
- // Create CLAUDE.md / AGENTS.md at project root from skeleton templates
163
- const claudeMdSrc = path.join(skeletonDir, 'templates', 'CLAUDE.md');
164
- const agentsMdSrc = path.join(skeletonDir, 'templates', 'AGENTS.md');
165
- if (fs.existsSync(claudeMdSrc)) {
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
- if (fs.existsSync(agentsMdSrc)) {
173
- const content = fs.readFileSync(agentsMdSrc, 'utf-8')
174
- .replace(/\{\{PROJECT_NAME\}\}/g, projectBaseName);
175
- fs.writeFileSync(path.join(targetDir, 'AGENTS.md'), content);
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
- const gitignoreContent = `# Codev
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 (error) {
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":"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"}
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":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;;;;;CAKtC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,uBAAuB;;;;;;;;;;;CAW/D,CAAC;AAEF;;GAEG;AACH,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;CAmB5B,CAAC;AAWF;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,SAAiB,EACjB,UAAiC,EAAE;IAEnC,MAAM,EAAE,YAAY,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACzC,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QACnD,IAAI,YAAY,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QACD,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AAYD;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,SAAiB,EACjB,WAAmB,EACnB,UAAkC,EAAE;IAEpC,MAAM,EAAE,YAAY,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACzC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAExE,IAAI,YAAY,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACnD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAC3E,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QAC/C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED,8BAA8B;IAC9B,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;IACxD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AAC9C,CAAC;AAQD;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,SAAiB,EACjB,WAAmB,EACnB,UAAkC,EAAE;IAEpC,MAAM,EAAE,YAAY,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACzC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,wBAAwB,CAAC,CAAC;IAE5E,IAAI,YAAY,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,wBAAwB,CAAC,CAAC;IACnF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;IACnD,CAAC;IAED,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAC3C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC;AAWD;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAAiB,EACjB,WAAmB,EACnB,UAAwC,EAAE;IAE1C,MAAM,EAAE,YAAY,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACzC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAChE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,oCAAoC;IACpC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;IACpD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAE9D,IAAI,YAAY,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,SAAS;QACX,CAAC;QAED,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AAWD;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,SAAiB,EACjB,WAAmB,EACnB,WAAmB,EACnB,UAAgC,EAAE;IAElC,MAAM,EAAE,eAAe,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAC5C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,MAAM,SAAS,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAE5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC;aAC9C,OAAO,CAAC,uBAAuB,EAAE,WAAW,CAAC,CAAC;QAEjD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,IAAI,eAAe,EAAE,CAAC;gBACpB,8BAA8B;gBAC9B,EAAE,CAAC,aAAa,CAAC,QAAQ,GAAG,YAAY,EAAE,OAAO,CAAC,CAAC;gBACnD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;YACD,4CAA4C;QAC9C,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACzD,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;AAC1D,CAAC;AAQD;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAEzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,uBAAuB,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;QACvE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACzD,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;IAClE,CAAC;IAED,EAAE,CAAC,cAAc,CAAC,aAAa,EAAE,IAAI,GAAG,uBAAuB,CAAC,CAAC;IACjE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;AAClE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cluesmith/codev",
3
- "version": "1.5.9",
3
+ "version": "1.5.11",
4
4
  "description": "Codev CLI - AI-assisted software development framework",
5
5
  "type": "module",
6
6
  "bin": {