@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,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codev update - Update codev templates and protocols
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import { getTemplatesDir, getTemplateFiles, hashFile, loadHashStore, saveHashStore, isUserDataPath, isUpdatableFile, } from '../lib/templates.js';
|
|
8
|
+
/**
|
|
9
|
+
* Update codev templates in current project
|
|
10
|
+
*/
|
|
11
|
+
export async function update(options = {}) {
|
|
12
|
+
const { dryRun = false, force = false } = options;
|
|
13
|
+
const targetDir = process.cwd();
|
|
14
|
+
const codevDir = path.join(targetDir, 'codev');
|
|
15
|
+
// Check if codev exists
|
|
16
|
+
if (!fs.existsSync(codevDir)) {
|
|
17
|
+
throw new Error("No codev/ directory found. Use 'codev init' or 'codev adopt' first.");
|
|
18
|
+
}
|
|
19
|
+
console.log('');
|
|
20
|
+
console.log(chalk.bold('Updating codev templates'));
|
|
21
|
+
if (dryRun) {
|
|
22
|
+
console.log(chalk.yellow('(dry run - no files will be changed)'));
|
|
23
|
+
}
|
|
24
|
+
console.log('');
|
|
25
|
+
const templatesDir = getTemplatesDir();
|
|
26
|
+
const templateFiles = getTemplateFiles(templatesDir);
|
|
27
|
+
const currentHashes = loadHashStore(targetDir);
|
|
28
|
+
const newHashes = { ...currentHashes };
|
|
29
|
+
const result = {
|
|
30
|
+
updated: [],
|
|
31
|
+
skipped: [],
|
|
32
|
+
conflicts: [],
|
|
33
|
+
newFiles: [],
|
|
34
|
+
};
|
|
35
|
+
for (const relativePath of templateFiles) {
|
|
36
|
+
// Skip user data files
|
|
37
|
+
if (isUserDataPath(relativePath)) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
// Only update updatable files (protocols, roles, agents, etc.)
|
|
41
|
+
if (!isUpdatableFile(relativePath)) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const srcPath = path.join(templatesDir, relativePath);
|
|
45
|
+
const destPath = path.join(codevDir, relativePath);
|
|
46
|
+
// New file - copy it
|
|
47
|
+
if (!fs.existsSync(destPath)) {
|
|
48
|
+
if (!dryRun) {
|
|
49
|
+
const destDir = path.dirname(destPath);
|
|
50
|
+
if (!fs.existsSync(destDir)) {
|
|
51
|
+
fs.mkdirSync(destDir, { recursive: true });
|
|
52
|
+
}
|
|
53
|
+
fs.copyFileSync(srcPath, destPath);
|
|
54
|
+
newHashes[relativePath] = hashFile(destPath);
|
|
55
|
+
}
|
|
56
|
+
result.newFiles.push(relativePath);
|
|
57
|
+
console.log(chalk.green(' + (new)'), `codev/${relativePath}`);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
// File exists - check if it was modified by user
|
|
61
|
+
const currentHash = hashFile(destPath);
|
|
62
|
+
const storedHash = currentHashes[relativePath];
|
|
63
|
+
const newHash = hashFile(srcPath);
|
|
64
|
+
// If the template hasn't changed, skip
|
|
65
|
+
if (currentHash === newHash) {
|
|
66
|
+
result.skipped.push(relativePath);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
// If force mode, overwrite everything
|
|
70
|
+
if (force) {
|
|
71
|
+
if (!dryRun) {
|
|
72
|
+
fs.copyFileSync(srcPath, destPath);
|
|
73
|
+
newHashes[relativePath] = hashFile(destPath);
|
|
74
|
+
}
|
|
75
|
+
result.updated.push(relativePath);
|
|
76
|
+
console.log(chalk.blue(' ~ (force)'), `codev/${relativePath}`);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
// Check if user modified the file
|
|
80
|
+
const userModified = storedHash && currentHash !== storedHash;
|
|
81
|
+
if (userModified) {
|
|
82
|
+
// User modified the file - write as .codev-new and mark as conflict
|
|
83
|
+
if (!dryRun) {
|
|
84
|
+
fs.copyFileSync(srcPath, destPath + '.codev-new');
|
|
85
|
+
}
|
|
86
|
+
result.conflicts.push(relativePath);
|
|
87
|
+
console.log(chalk.yellow(' ! (conflict)'), `codev/${relativePath}`);
|
|
88
|
+
console.log(chalk.dim(' New version saved as:'), `codev/${relativePath}.codev-new`);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// File unchanged by user - safe to overwrite
|
|
92
|
+
if (!dryRun) {
|
|
93
|
+
fs.copyFileSync(srcPath, destPath);
|
|
94
|
+
newHashes[relativePath] = hashFile(destPath);
|
|
95
|
+
}
|
|
96
|
+
result.updated.push(relativePath);
|
|
97
|
+
console.log(chalk.blue(' ~'), `codev/${relativePath}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Save updated hash store
|
|
101
|
+
if (!dryRun) {
|
|
102
|
+
saveHashStore(targetDir, newHashes);
|
|
103
|
+
}
|
|
104
|
+
// Summary
|
|
105
|
+
console.log('');
|
|
106
|
+
console.log(chalk.bold('Summary:'));
|
|
107
|
+
if (result.newFiles.length > 0) {
|
|
108
|
+
console.log(chalk.green(` + ${result.newFiles.length} new files`));
|
|
109
|
+
}
|
|
110
|
+
if (result.updated.length > 0) {
|
|
111
|
+
console.log(chalk.blue(` ~ ${result.updated.length} updated`));
|
|
112
|
+
}
|
|
113
|
+
if (result.skipped.length > 0) {
|
|
114
|
+
console.log(chalk.dim(` - ${result.skipped.length} unchanged (skipped)`));
|
|
115
|
+
}
|
|
116
|
+
if (result.conflicts.length > 0) {
|
|
117
|
+
console.log(chalk.yellow(` ! ${result.conflicts.length} conflicts`));
|
|
118
|
+
console.log('');
|
|
119
|
+
console.log(chalk.yellow('Conflicts detected!'));
|
|
120
|
+
console.log('The following files were modified locally and have new versions available:');
|
|
121
|
+
console.log('');
|
|
122
|
+
for (const file of result.conflicts) {
|
|
123
|
+
console.log(chalk.dim(` codev/${file}`));
|
|
124
|
+
console.log(chalk.dim(` → New version: codev/${file}.codev-new`));
|
|
125
|
+
}
|
|
126
|
+
console.log('');
|
|
127
|
+
console.log('Please review and merge manually, then delete the .codev-new files.');
|
|
128
|
+
}
|
|
129
|
+
if (result.newFiles.length === 0 && result.updated.length === 0 && result.conflicts.length === 0) {
|
|
130
|
+
console.log(chalk.dim(' No updates available - already up to date!'));
|
|
131
|
+
}
|
|
132
|
+
if (dryRun) {
|
|
133
|
+
console.log('');
|
|
134
|
+
console.log(chalk.yellow('Dry run complete. Run without --dry-run to apply changes.'));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template handling utilities for codev init/adopt/update
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Get the path to the embedded templates directory
|
|
6
|
+
*/
|
|
7
|
+
export declare function getTemplatesDir(): string;
|
|
8
|
+
/**
|
|
9
|
+
* Get SHA256 hash of a file
|
|
10
|
+
*/
|
|
11
|
+
export declare function hashFile(filePath: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Get the path to the hash store file
|
|
14
|
+
*/
|
|
15
|
+
export declare function getHashStorePath(targetDir: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Load stored hashes for update tracking
|
|
18
|
+
*/
|
|
19
|
+
export declare function loadHashStore(targetDir: string): Record<string, string>;
|
|
20
|
+
/**
|
|
21
|
+
* Save hash store
|
|
22
|
+
*/
|
|
23
|
+
export declare function saveHashStore(targetDir: string, hashes: Record<string, string>): void;
|
|
24
|
+
/**
|
|
25
|
+
* List of files that should never be copied/updated (user data)
|
|
26
|
+
*/
|
|
27
|
+
export declare const USER_DATA_PATTERNS: string[];
|
|
28
|
+
/**
|
|
29
|
+
* Check if a file path matches user data patterns
|
|
30
|
+
*/
|
|
31
|
+
export declare function isUserDataPath(relativePath: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Validate that a relative path is safe (no directory traversal)
|
|
34
|
+
* Returns true if path is safe, false if it contains traversal attempts
|
|
35
|
+
*/
|
|
36
|
+
export declare function isValidRelativePath(relativePath: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Recursively copy template files to target directory
|
|
39
|
+
*/
|
|
40
|
+
export declare function copyTemplateDir(srcDir: string, targetDir: string, options?: {
|
|
41
|
+
skipExisting?: boolean;
|
|
42
|
+
hashes?: Record<string, string>;
|
|
43
|
+
onFile?: (relativePath: string, action: 'copy' | 'skip' | 'conflict') => void;
|
|
44
|
+
}): void;
|
|
45
|
+
/**
|
|
46
|
+
* Get list of all template files (relative paths)
|
|
47
|
+
*/
|
|
48
|
+
export declare function getTemplateFiles(templatesDir: string): string[];
|
|
49
|
+
/**
|
|
50
|
+
* Files that should be updatable (protocols, roles, agents)
|
|
51
|
+
*/
|
|
52
|
+
export declare const UPDATABLE_PREFIXES: string[];
|
|
53
|
+
/**
|
|
54
|
+
* Check if a file is updatable (not user data)
|
|
55
|
+
*/
|
|
56
|
+
export declare function isUpdatableFile(relativePath: string): boolean;
|
|
57
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAexC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUvE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAOrF;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,UAM9B,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAI5D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAqBjE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,KAAK,IAAI,CAAC;CAC1E,GACL,IAAI,CAoEN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAuB/D;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,UAM9B,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAE7D"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template handling utilities for codev init/adopt/update
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import { createHash } from 'node:crypto';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = path.dirname(__filename);
|
|
10
|
+
/**
|
|
11
|
+
* Get the path to the embedded templates directory
|
|
12
|
+
*/
|
|
13
|
+
export function getTemplatesDir() {
|
|
14
|
+
// In development: packages/codev/templates
|
|
15
|
+
// In installed: node_modules/@cluesmith/codev/templates
|
|
16
|
+
const templatesDir = path.resolve(__dirname, '../../templates');
|
|
17
|
+
if (fs.existsSync(templatesDir)) {
|
|
18
|
+
return templatesDir;
|
|
19
|
+
}
|
|
20
|
+
// Fallback: check dist location
|
|
21
|
+
const distTemplatesDir = path.resolve(__dirname, '../../../templates');
|
|
22
|
+
if (fs.existsSync(distTemplatesDir)) {
|
|
23
|
+
return distTemplatesDir;
|
|
24
|
+
}
|
|
25
|
+
throw new Error('Templates directory not found. Package may be corrupted.');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get SHA256 hash of a file
|
|
29
|
+
*/
|
|
30
|
+
export function hashFile(filePath) {
|
|
31
|
+
const content = fs.readFileSync(filePath);
|
|
32
|
+
return createHash('sha256').update(content).digest('hex');
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get the path to the hash store file
|
|
36
|
+
*/
|
|
37
|
+
export function getHashStorePath(targetDir) {
|
|
38
|
+
return path.join(targetDir, 'codev', '.update-hashes.json');
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Load stored hashes for update tracking
|
|
42
|
+
*/
|
|
43
|
+
export function loadHashStore(targetDir) {
|
|
44
|
+
const hashStorePath = getHashStorePath(targetDir);
|
|
45
|
+
if (fs.existsSync(hashStorePath)) {
|
|
46
|
+
try {
|
|
47
|
+
return JSON.parse(fs.readFileSync(hashStorePath, 'utf-8'));
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return {};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return {};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Save hash store
|
|
57
|
+
*/
|
|
58
|
+
export function saveHashStore(targetDir, hashes) {
|
|
59
|
+
const hashStorePath = getHashStorePath(targetDir);
|
|
60
|
+
const dir = path.dirname(hashStorePath);
|
|
61
|
+
if (!fs.existsSync(dir)) {
|
|
62
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
63
|
+
}
|
|
64
|
+
fs.writeFileSync(hashStorePath, JSON.stringify(hashes, null, 2));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* List of files that should never be copied/updated (user data)
|
|
68
|
+
*/
|
|
69
|
+
export const USER_DATA_PATTERNS = [
|
|
70
|
+
'specs/',
|
|
71
|
+
'plans/',
|
|
72
|
+
'reviews/',
|
|
73
|
+
'resources/',
|
|
74
|
+
'.update-hashes.json',
|
|
75
|
+
];
|
|
76
|
+
/**
|
|
77
|
+
* Check if a file path matches user data patterns
|
|
78
|
+
*/
|
|
79
|
+
export function isUserDataPath(relativePath) {
|
|
80
|
+
return USER_DATA_PATTERNS.some(pattern => relativePath.startsWith(pattern) || relativePath.includes(`/${pattern}`));
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Validate that a relative path is safe (no directory traversal)
|
|
84
|
+
* Returns true if path is safe, false if it contains traversal attempts
|
|
85
|
+
*/
|
|
86
|
+
export function isValidRelativePath(relativePath) {
|
|
87
|
+
// Normalize the path to resolve any . or .. components
|
|
88
|
+
const normalized = path.normalize(relativePath);
|
|
89
|
+
// Check for directory traversal patterns
|
|
90
|
+
if (normalized.startsWith('..') || normalized.includes('../') || normalized.includes('..\\')) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
// Check for absolute paths
|
|
94
|
+
if (path.isAbsolute(normalized)) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
// Ensure the normalized path doesn't escape the base directory
|
|
98
|
+
// by checking it doesn't start with a path separator after normalization
|
|
99
|
+
if (normalized.startsWith(path.sep) || normalized.startsWith('/')) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Recursively copy template files to target directory
|
|
106
|
+
*/
|
|
107
|
+
export function copyTemplateDir(srcDir, targetDir, options = {}) {
|
|
108
|
+
const { skipExisting = false, hashes = {}, onFile } = options;
|
|
109
|
+
function copyRecursive(src, dest, relativeBase) {
|
|
110
|
+
const stat = fs.statSync(src);
|
|
111
|
+
if (stat.isDirectory()) {
|
|
112
|
+
if (!fs.existsSync(dest)) {
|
|
113
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
114
|
+
}
|
|
115
|
+
const entries = fs.readdirSync(src);
|
|
116
|
+
for (const entry of entries) {
|
|
117
|
+
const srcPath = path.join(src, entry);
|
|
118
|
+
const destPath = path.join(dest, entry);
|
|
119
|
+
const relativePath = path.join(relativeBase, entry);
|
|
120
|
+
// Validate relative path to prevent directory traversal
|
|
121
|
+
if (!isValidRelativePath(relativePath)) {
|
|
122
|
+
console.warn(`Skipping unsafe path: ${relativePath}`);
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
copyRecursive(srcPath, destPath, relativePath);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
const relativePath = relativeBase;
|
|
130
|
+
// Validate relative path to prevent directory traversal
|
|
131
|
+
if (!isValidRelativePath(relativePath)) {
|
|
132
|
+
console.warn(`Skipping unsafe path: ${relativePath}`);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
// Skip user data files
|
|
136
|
+
if (isUserDataPath(relativePath)) {
|
|
137
|
+
onFile?.(relativePath, 'skip');
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
// Skip .gitkeep files (they just preserve empty dirs in git)
|
|
141
|
+
if (path.basename(src) === '.gitkeep') {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (fs.existsSync(dest)) {
|
|
145
|
+
if (skipExisting) {
|
|
146
|
+
onFile?.(relativePath, 'skip');
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
// File exists - this is a potential conflict
|
|
150
|
+
onFile?.(relativePath, 'conflict');
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
// Copy the file
|
|
154
|
+
fs.copyFileSync(src, dest);
|
|
155
|
+
// Store hash for future updates
|
|
156
|
+
if (hashes) {
|
|
157
|
+
hashes[relativePath] = hashFile(dest);
|
|
158
|
+
}
|
|
159
|
+
onFile?.(relativePath, 'copy');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
copyRecursive(srcDir, targetDir, '');
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get list of all template files (relative paths)
|
|
166
|
+
*/
|
|
167
|
+
export function getTemplateFiles(templatesDir) {
|
|
168
|
+
const files = [];
|
|
169
|
+
function walk(dir, relativeBase) {
|
|
170
|
+
const entries = fs.readdirSync(dir);
|
|
171
|
+
for (const entry of entries) {
|
|
172
|
+
const fullPath = path.join(dir, entry);
|
|
173
|
+
const relativePath = path.join(relativeBase, entry);
|
|
174
|
+
const stat = fs.statSync(fullPath);
|
|
175
|
+
if (stat.isDirectory()) {
|
|
176
|
+
walk(fullPath, relativePath);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
// Skip .gitkeep
|
|
180
|
+
if (entry !== '.gitkeep') {
|
|
181
|
+
files.push(relativePath);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
walk(templatesDir, '');
|
|
187
|
+
return files;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Files that should be updatable (protocols, roles, agents)
|
|
191
|
+
*/
|
|
192
|
+
export const UPDATABLE_PREFIXES = [
|
|
193
|
+
'protocols/',
|
|
194
|
+
'roles/',
|
|
195
|
+
'agents/',
|
|
196
|
+
'bin/',
|
|
197
|
+
'templates/',
|
|
198
|
+
];
|
|
199
|
+
/**
|
|
200
|
+
* Check if a file is updatable (not user data)
|
|
201
|
+
*/
|
|
202
|
+
export function isUpdatableFile(relativePath) {
|
|
203
|
+
return UPDATABLE_PREFIXES.some(prefix => relativePath.startsWith(prefix));
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cluesmith/codev",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "Codev CLI - AI-assisted software development framework",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"codev": "./bin/codev.js",
|
|
8
|
+
"af": "./bin/af.js",
|
|
9
|
+
"consult": "./bin/consult.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"bin",
|
|
14
|
+
"templates"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"dev": "tsx src/cli.ts",
|
|
19
|
+
"start": "node dist/cli.js",
|
|
20
|
+
"test": "vitest",
|
|
21
|
+
"prepublishOnly": "npm run build"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"better-sqlite3": "^12.5.0",
|
|
25
|
+
"chalk": "^5.3.0",
|
|
26
|
+
"commander": "^12.1.0",
|
|
27
|
+
"open": "^10.1.0",
|
|
28
|
+
"tree-kill": "^1.2.2"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
32
|
+
"@types/node": "^22.10.1",
|
|
33
|
+
"tsx": "^4.19.2",
|
|
34
|
+
"typescript": "^5.7.2",
|
|
35
|
+
"vitest": "^2.1.6"
|
|
36
|
+
},
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=18.0.0"
|
|
39
|
+
},
|
|
40
|
+
"keywords": [
|
|
41
|
+
"cli",
|
|
42
|
+
"codev",
|
|
43
|
+
"ai",
|
|
44
|
+
"development",
|
|
45
|
+
"orchestration",
|
|
46
|
+
"agent-farm",
|
|
47
|
+
"multi-agent"
|
|
48
|
+
],
|
|
49
|
+
"author": "Cluesmith",
|
|
50
|
+
"license": "MIT",
|
|
51
|
+
"repository": {
|
|
52
|
+
"type": "git",
|
|
53
|
+
"url": "https://github.com/cluesmith/codev"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# {{PROJECT_NAME}} - AI Agent Instructions
|
|
2
|
+
|
|
3
|
+
> **Note**: This file follows the [AGENTS.md standard](https://agents.md/) for cross-tool compatibility with Cursor, GitHub Copilot, and other AI coding assistants. A Claude Code-specific version is maintained in `CLAUDE.md`.
|
|
4
|
+
|
|
5
|
+
## Project Overview
|
|
6
|
+
|
|
7
|
+
This project uses **Codev** for AI-assisted development.
|
|
8
|
+
|
|
9
|
+
## Available Protocols
|
|
10
|
+
|
|
11
|
+
- **SPIDER**: Multi-phase development with consultation (`codev/protocols/spider/protocol.md`)
|
|
12
|
+
- **TICK**: Fast autonomous implementation (`codev/protocols/tick/protocol.md`)
|
|
13
|
+
- **EXPERIMENT**: Disciplined experimentation (`codev/protocols/experiment/protocol.md`)
|
|
14
|
+
- **MAINTAIN**: Codebase maintenance (`codev/protocols/maintain/protocol.md`)
|
|
15
|
+
|
|
16
|
+
## Key Locations
|
|
17
|
+
|
|
18
|
+
- **Specs**: `codev/specs/` - Feature specifications (WHAT to build)
|
|
19
|
+
- **Plans**: `codev/plans/` - Implementation plans (HOW to build)
|
|
20
|
+
- **Reviews**: `codev/reviews/` - Reviews and lessons learned
|
|
21
|
+
- **Protocols**: `codev/protocols/` - Development protocols
|
|
22
|
+
|
|
23
|
+
## Quick Start
|
|
24
|
+
|
|
25
|
+
1. For new features, start with the Specification phase
|
|
26
|
+
2. Create exactly THREE documents per feature: spec, plan, and review
|
|
27
|
+
3. Follow the protocol phases as defined in the protocol files
|
|
28
|
+
4. Use multi-agent consultation when specified
|
|
29
|
+
|
|
30
|
+
## File Naming Convention
|
|
31
|
+
|
|
32
|
+
Use sequential numbering with descriptive names:
|
|
33
|
+
- Specification: `codev/specs/0001-feature-name.md`
|
|
34
|
+
- Plan: `codev/plans/0001-feature-name.md`
|
|
35
|
+
- Review: `codev/reviews/0001-feature-name.md`
|
|
36
|
+
|
|
37
|
+
## Git Workflow
|
|
38
|
+
|
|
39
|
+
**NEVER use `git add -A` or `git add .`** - Always add files explicitly.
|
|
40
|
+
|
|
41
|
+
Commit messages format:
|
|
42
|
+
```
|
|
43
|
+
[Spec 0001] Description of change
|
|
44
|
+
[Spec 0001][Phase: implement] feat: Add feature
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## For More Info
|
|
48
|
+
|
|
49
|
+
Read the full protocol documentation in `codev/protocols/`.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# {{PROJECT_NAME}} - Claude Code Instructions
|
|
2
|
+
|
|
3
|
+
## Project Overview
|
|
4
|
+
|
|
5
|
+
This project uses **Codev** for AI-assisted development.
|
|
6
|
+
|
|
7
|
+
## Available Protocols
|
|
8
|
+
|
|
9
|
+
- **SPIDER**: Multi-phase development with consultation (`codev/protocols/spider/protocol.md`)
|
|
10
|
+
- **TICK**: Fast autonomous implementation (`codev/protocols/tick/protocol.md`)
|
|
11
|
+
- **EXPERIMENT**: Disciplined experimentation (`codev/protocols/experiment/protocol.md`)
|
|
12
|
+
- **MAINTAIN**: Codebase maintenance (`codev/protocols/maintain/protocol.md`)
|
|
13
|
+
|
|
14
|
+
## Key Locations
|
|
15
|
+
|
|
16
|
+
- **Specs**: `codev/specs/` - Feature specifications (WHAT to build)
|
|
17
|
+
- **Plans**: `codev/plans/` - Implementation plans (HOW to build)
|
|
18
|
+
- **Reviews**: `codev/reviews/` - Reviews and lessons learned
|
|
19
|
+
- **Protocols**: `codev/protocols/` - Development protocols
|
|
20
|
+
|
|
21
|
+
## Quick Start
|
|
22
|
+
|
|
23
|
+
1. For new features, start with the Specification phase
|
|
24
|
+
2. Create exactly THREE documents per feature: spec, plan, and review
|
|
25
|
+
3. Follow the protocol phases as defined in the protocol files
|
|
26
|
+
4. Use multi-agent consultation when specified
|
|
27
|
+
|
|
28
|
+
## File Naming Convention
|
|
29
|
+
|
|
30
|
+
Use sequential numbering with descriptive names:
|
|
31
|
+
- Specification: `codev/specs/0001-feature-name.md`
|
|
32
|
+
- Plan: `codev/plans/0001-feature-name.md`
|
|
33
|
+
- Review: `codev/reviews/0001-feature-name.md`
|
|
34
|
+
|
|
35
|
+
## Git Workflow
|
|
36
|
+
|
|
37
|
+
**NEVER use `git add -A` or `git add .`** - Always add files explicitly.
|
|
38
|
+
|
|
39
|
+
Commit messages format:
|
|
40
|
+
```
|
|
41
|
+
[Spec 0001] Description of change
|
|
42
|
+
[Spec 0001][Phase: implement] feat: Add feature
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## For More Info
|
|
46
|
+
|
|
47
|
+
Read the full protocol documentation in `codev/protocols/`.
|