@fredericboyer/dev-team 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -11
- package/dist/bin/dev-team.js +12 -12
- package/dist/bin/dev-team.js.map +1 -1
- package/dist/create-agent.js +6 -6
- package/dist/create-agent.js.map +1 -1
- package/dist/doctor.js +15 -16
- package/dist/doctor.js.map +1 -1
- package/dist/files.js +2 -0
- package/dist/files.js.map +1 -1
- package/dist/init.js +36 -44
- package/dist/init.js.map +1 -1
- package/dist/scan.js +9 -9
- package/dist/scan.js.map +1 -1
- package/dist/status.js +11 -11
- package/dist/status.js.map +1 -1
- package/dist/update.d.ts +1 -4
- package/dist/update.js +178 -59
- package/dist/update.js.map +1 -1
- package/package.json +3 -3
- package/templates/CLAUDE.md +7 -6
- package/templates/agents/dev-team-beck.md +7 -0
- package/templates/agents/dev-team-borges.md +4 -4
- package/templates/agents/dev-team-conway.md +7 -0
- package/templates/agents/dev-team-deming.md +15 -2
- package/templates/agents/dev-team-drucker.md +12 -2
- package/templates/agents/dev-team-hamilton.md +10 -2
- package/templates/agents/dev-team-mori.md +10 -2
- package/templates/agents/dev-team-tufte.md +7 -0
- package/templates/agents/dev-team-voss.md +10 -2
- package/templates/hooks/dev-team-post-change-review.js +1 -25
- package/templates/hooks/dev-team-pre-commit-gate.js +38 -46
- package/templates/hooks/dev-team-watch-list.js +3 -3
- package/templates/settings.json +6 -20
- package/templates/skills/dev-team-assess/SKILL.md +167 -0
- package/templates/skills/dev-team-audit/SKILL.md +8 -3
- package/templates/skills/dev-team-merge/SKILL.md +95 -0
- package/templates/skills/dev-team-review/SKILL.md +9 -4
- package/templates/skills/dev-team-task/SKILL.md +28 -41
- package/dist/parallel.d.ts +0 -127
- package/dist/parallel.js +0 -323
- package/dist/parallel.js.map +0 -1
- package/templates/hooks/dev-team-parallel-loop.js +0 -188
- package/templates/hooks/dev-team-task-loop.js +0 -73
package/dist/scan.js
CHANGED
|
@@ -8,7 +8,7 @@ exports.formatScanReport = formatScanReport;
|
|
|
8
8
|
exports.parseCiScripts = parseCiScripts;
|
|
9
9
|
exports.parseHookCommands = parseHookCommands;
|
|
10
10
|
const path_1 = __importDefault(require("path"));
|
|
11
|
-
const
|
|
11
|
+
const files_js_1 = require("./files.js");
|
|
12
12
|
/**
|
|
13
13
|
* Scans a project directory for existing tooling and identifies gaps.
|
|
14
14
|
* Returns a list of findings with actionable recommendations.
|
|
@@ -29,7 +29,7 @@ function scanProject(targetDir) {
|
|
|
29
29
|
{ file: ".rubocop.yml", tool: "RuboCop" },
|
|
30
30
|
{ file: ".golangci.yml", tool: "golangci-lint" },
|
|
31
31
|
];
|
|
32
|
-
const foundLinter = linters.find((l) => (0,
|
|
32
|
+
const foundLinter = linters.find((l) => (0, files_js_1.fileExists)(path_1.default.join(targetDir, l.file)));
|
|
33
33
|
if (foundLinter) {
|
|
34
34
|
findings.push({
|
|
35
35
|
category: "linter",
|
|
@@ -40,7 +40,7 @@ function scanProject(targetDir) {
|
|
|
40
40
|
}
|
|
41
41
|
else {
|
|
42
42
|
// Check package.json for lint script
|
|
43
|
-
const pkg = (0,
|
|
43
|
+
const pkg = (0, files_js_1.readFile)(path_1.default.join(targetDir, "package.json"));
|
|
44
44
|
if (pkg && pkg.includes('"lint"')) {
|
|
45
45
|
findings.push({
|
|
46
46
|
category: "linter",
|
|
@@ -69,7 +69,7 @@ function scanProject(targetDir) {
|
|
|
69
69
|
{ file: "rustfmt.toml", tool: "rustfmt" },
|
|
70
70
|
{ file: ".clang-format", tool: "clang-format" },
|
|
71
71
|
];
|
|
72
|
-
const foundFormatter = formatters.find((f) => (0,
|
|
72
|
+
const foundFormatter = formatters.find((f) => (0, files_js_1.fileExists)(path_1.default.join(targetDir, f.file)));
|
|
73
73
|
if (foundFormatter) {
|
|
74
74
|
findings.push({
|
|
75
75
|
category: "formatter",
|
|
@@ -96,7 +96,7 @@ function scanProject(targetDir) {
|
|
|
96
96
|
{ file: ".bandit", tool: "Bandit" },
|
|
97
97
|
{ file: ".safety-policy.yml", tool: "Safety" },
|
|
98
98
|
];
|
|
99
|
-
const foundSast = sastConfigs.find((s) => (0,
|
|
99
|
+
const foundSast = sastConfigs.find((s) => (0, files_js_1.fileExists)(path_1.default.join(targetDir, s.file)));
|
|
100
100
|
if (foundSast) {
|
|
101
101
|
findings.push({
|
|
102
102
|
category: "sast",
|
|
@@ -125,7 +125,7 @@ function scanProject(targetDir) {
|
|
|
125
125
|
];
|
|
126
126
|
const foundCi = ciConfigs.find((c) => {
|
|
127
127
|
const fullPath = path_1.default.join(targetDir, c.path);
|
|
128
|
-
return (0,
|
|
128
|
+
return (0, files_js_1.fileExists)(fullPath) || (0, files_js_1.dirExists)(fullPath);
|
|
129
129
|
});
|
|
130
130
|
if (foundCi) {
|
|
131
131
|
findings.push({
|
|
@@ -153,7 +153,7 @@ function scanProject(targetDir) {
|
|
|
153
153
|
{ file: "Cargo.lock", tool: "cargo audit" },
|
|
154
154
|
{ file: "go.sum", tool: "govulncheck" },
|
|
155
155
|
];
|
|
156
|
-
const foundLock = lockFiles.find((l) => (0,
|
|
156
|
+
const foundLock = lockFiles.find((l) => (0, files_js_1.fileExists)(path_1.default.join(targetDir, l.file)));
|
|
157
157
|
if (foundLock) {
|
|
158
158
|
findings.push({
|
|
159
159
|
category: "dependency",
|
|
@@ -246,7 +246,7 @@ function formatScanReport(findings) {
|
|
|
246
246
|
*/
|
|
247
247
|
function parseCiScripts(targetDir) {
|
|
248
248
|
const ciRelevantScripts = ["lint", "format:check", "test", "typecheck", "build"];
|
|
249
|
-
const pkgContent = (0,
|
|
249
|
+
const pkgContent = (0, files_js_1.readFile)(path_1.default.join(targetDir, "package.json"));
|
|
250
250
|
if (!pkgContent)
|
|
251
251
|
return [];
|
|
252
252
|
try {
|
|
@@ -263,7 +263,7 @@ function parseCiScripts(targetDir) {
|
|
|
263
263
|
* Returns an array of command strings found across all hook events.
|
|
264
264
|
*/
|
|
265
265
|
function parseHookCommands(targetDir) {
|
|
266
|
-
const settingsContent = (0,
|
|
266
|
+
const settingsContent = (0, files_js_1.readFile)(path_1.default.join(targetDir, ".claude", "settings.json"));
|
|
267
267
|
if (!settingsContent)
|
|
268
268
|
return [];
|
|
269
269
|
try {
|
package/dist/scan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":";;;;;AAcA,kCA6NC;AAKD,4CA2BC;AAMD,wCAYC;AAMD,8CAyBC;AA5TD,gDAAwB;AACxB,
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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"}
|
package/dist/status.js
CHANGED
|
@@ -6,11 +6,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.status = status;
|
|
7
7
|
const path_1 = __importDefault(require("path"));
|
|
8
8
|
const fs_1 = __importDefault(require("fs"));
|
|
9
|
-
const
|
|
9
|
+
const files_js_1 = require("./files.js");
|
|
10
10
|
function status(targetDir) {
|
|
11
|
-
const
|
|
12
|
-
const prefsPath = path_1.default.join(
|
|
13
|
-
const prefsContent = (0,
|
|
11
|
+
const devTeamDir = path_1.default.join(targetDir, ".dev-team");
|
|
12
|
+
const prefsPath = path_1.default.join(devTeamDir, "config.json");
|
|
13
|
+
const prefsContent = (0, files_js_1.readFile)(prefsPath);
|
|
14
14
|
if (!prefsContent) {
|
|
15
15
|
console.error("Not a dev-team project. Run `npx dev-team init` first.");
|
|
16
16
|
process.exit(1);
|
|
@@ -20,7 +20,7 @@ function status(targetDir) {
|
|
|
20
20
|
prefs = JSON.parse(prefsContent);
|
|
21
21
|
}
|
|
22
22
|
catch {
|
|
23
|
-
console.error("
|
|
23
|
+
console.error("config.json is corrupted.");
|
|
24
24
|
process.exit(1);
|
|
25
25
|
}
|
|
26
26
|
console.log("\ndev-team status\n");
|
|
@@ -36,8 +36,8 @@ function status(targetDir) {
|
|
|
36
36
|
const hooks = prefs.hooks || [];
|
|
37
37
|
console.log(` Hooks: ${hooks.join(", ")} (${hooks.length})`);
|
|
38
38
|
// Skills (auto-discovered)
|
|
39
|
-
const skillsDir = path_1.default.join(
|
|
40
|
-
const skills = (0,
|
|
39
|
+
const skillsDir = path_1.default.join(devTeamDir, "skills");
|
|
40
|
+
const skills = (0, files_js_1.listSubdirectories)(skillsDir).map((s) => s.replace("dev-team-", ""));
|
|
41
41
|
console.log(` Skills: ${skills.length > 0 ? skills.join(", ") : "none"} (${skills.length})`);
|
|
42
42
|
// Workflow
|
|
43
43
|
if (prefs.issueTracker) {
|
|
@@ -48,11 +48,11 @@ function status(targetDir) {
|
|
|
48
48
|
}
|
|
49
49
|
// Memory status
|
|
50
50
|
console.log("\n Memory:");
|
|
51
|
-
const memoryDir = path_1.default.join(
|
|
51
|
+
const memoryDir = path_1.default.join(devTeamDir, "agent-memory");
|
|
52
52
|
for (const label of agents) {
|
|
53
53
|
const dirName = `dev-team-${label.toLowerCase()}`;
|
|
54
54
|
const memPath = path_1.default.join(memoryDir, dirName, "MEMORY.md");
|
|
55
|
-
if ((0,
|
|
55
|
+
if ((0, files_js_1.fileExists)(memPath)) {
|
|
56
56
|
try {
|
|
57
57
|
const stat = fs_1.default.statSync(memPath);
|
|
58
58
|
const hasContent = stat.size > 200; // Template is ~200 bytes
|
|
@@ -67,8 +67,8 @@ function status(targetDir) {
|
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
// Shared learnings
|
|
70
|
-
const learningsPath = path_1.default.join(
|
|
71
|
-
if ((0,
|
|
70
|
+
const learningsPath = path_1.default.join(devTeamDir, "learnings.md");
|
|
71
|
+
if ((0, files_js_1.fileExists)(learningsPath)) {
|
|
72
72
|
try {
|
|
73
73
|
const stat = fs_1.default.statSync(learningsPath);
|
|
74
74
|
console.log(` Shared learnings: ${stat.size > 300 ? "has content" : "template only"}`);
|
package/dist/status.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":";;;;;AAIA,wBA8EC;AAlFD,gDAAwB;AACxB,4CAAoB;AACpB,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}
|
package/dist/update.d.ts
CHANGED
|
@@ -1,5 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* Update flow: upgrades installed agents, hooks, and skills to latest templates.
|
|
3
|
-
* Preserves user customizations in CLAUDE.md and agent memory files.
|
|
4
|
-
*/
|
|
1
|
+
export declare function compareSemver(a: string, b: string): number;
|
|
5
2
|
export declare function update(targetDir: string): Promise<void>;
|
package/dist/update.js
CHANGED
|
@@ -3,11 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.compareSemver = compareSemver;
|
|
6
7
|
exports.update = update;
|
|
7
8
|
const path_1 = __importDefault(require("path"));
|
|
8
|
-
const
|
|
9
|
+
const files_js_1 = require("./files.js");
|
|
9
10
|
const fs_1 = __importDefault(require("fs"));
|
|
10
|
-
const
|
|
11
|
+
const init_js_1 = require("./init.js");
|
|
11
12
|
const MIGRATIONS = [
|
|
12
13
|
{
|
|
13
14
|
version: "0.4.0",
|
|
@@ -39,19 +40,29 @@ const MIGRATIONS = [
|
|
|
39
40
|
],
|
|
40
41
|
},
|
|
41
42
|
];
|
|
42
|
-
function
|
|
43
|
+
function compareSemver(a, b) {
|
|
44
|
+
const pa = a.split(".").map((n) => parseInt(n, 10));
|
|
45
|
+
const pb = b.split(".").map((n) => parseInt(n, 10));
|
|
46
|
+
for (let i = 0; i < 3; i++) {
|
|
47
|
+
const diff = (pa[i] || 0) - (pb[i] || 0);
|
|
48
|
+
if (diff !== 0)
|
|
49
|
+
return diff;
|
|
50
|
+
}
|
|
51
|
+
return 0;
|
|
52
|
+
}
|
|
53
|
+
function runMigrations(prefs, fromVersion, devTeamDir) {
|
|
43
54
|
const log = [];
|
|
44
55
|
for (const migration of MIGRATIONS) {
|
|
45
56
|
// Skip migrations for versions already applied
|
|
46
|
-
if (fromVersion
|
|
57
|
+
if (compareSemver(fromVersion, migration.version) >= 0)
|
|
47
58
|
continue;
|
|
48
59
|
if (migration.agentRenames) {
|
|
49
60
|
for (const rename of migration.agentRenames) {
|
|
50
|
-
const agentsDir = path_1.default.join(
|
|
51
|
-
const memoryDir = path_1.default.join(
|
|
61
|
+
const agentsDir = path_1.default.join(devTeamDir, "agents");
|
|
62
|
+
const memoryDir = path_1.default.join(devTeamDir, "agent-memory");
|
|
52
63
|
// Rename agent file
|
|
53
64
|
const oldAgentPath = path_1.default.join(agentsDir, rename.oldFile);
|
|
54
|
-
if ((0,
|
|
65
|
+
if ((0, files_js_1.fileExists)(oldAgentPath)) {
|
|
55
66
|
try {
|
|
56
67
|
fs_1.default.unlinkSync(oldAgentPath);
|
|
57
68
|
}
|
|
@@ -63,8 +74,8 @@ function runMigrations(prefs, fromVersion, claudeDir) {
|
|
|
63
74
|
// Rename memory directory (preserve calibration data)
|
|
64
75
|
const oldMemDir = path_1.default.join(memoryDir, rename.oldFile.replace(".md", ""));
|
|
65
76
|
const newMemDir = path_1.default.join(memoryDir, rename.newFile.replace(".md", ""));
|
|
66
|
-
if ((0,
|
|
67
|
-
!(0,
|
|
77
|
+
if ((0, files_js_1.fileExists)(path_1.default.join(oldMemDir, "MEMORY.md")) &&
|
|
78
|
+
!(0, files_js_1.fileExists)(path_1.default.join(newMemDir, "MEMORY.md"))) {
|
|
68
79
|
try {
|
|
69
80
|
fs_1.default.mkdirSync(newMemDir, { recursive: true });
|
|
70
81
|
fs_1.default.renameSync(path_1.default.join(oldMemDir, "MEMORY.md"), path_1.default.join(newMemDir, "MEMORY.md"));
|
|
@@ -86,21 +97,129 @@ function runMigrations(prefs, fromVersion, claudeDir) {
|
|
|
86
97
|
return log;
|
|
87
98
|
}
|
|
88
99
|
// Derived from init.ts — single source of truth, no drift
|
|
89
|
-
const AGENT_FILES = Object.fromEntries(
|
|
90
|
-
const HOOK_FILES = Object.fromEntries(
|
|
100
|
+
const AGENT_FILES = Object.fromEntries(init_js_1.ALL_AGENTS.map((a) => [a.label, a.file]));
|
|
101
|
+
const HOOK_FILES = Object.fromEntries(init_js_1.QUALITY_HOOKS.map((h) => [h.label, h.file]));
|
|
91
102
|
// Skills auto-discovered at runtime from templates/skills/
|
|
92
103
|
/**
|
|
93
104
|
* Update flow: upgrades installed agents, hooks, and skills to latest templates.
|
|
94
105
|
* Preserves user customizations in CLAUDE.md and agent memory files.
|
|
95
106
|
*/
|
|
107
|
+
/**
|
|
108
|
+
* Migrates files from .claude/ to .dev-team/ directory structure.
|
|
109
|
+
* Preserves all user content (memories, learnings).
|
|
110
|
+
*/
|
|
111
|
+
function migrateFromClaude(targetDir) {
|
|
112
|
+
const log = [];
|
|
113
|
+
const claudeDir = path_1.default.join(targetDir, ".claude");
|
|
114
|
+
const devTeamDir = path_1.default.join(targetDir, ".dev-team");
|
|
115
|
+
// Directories to move
|
|
116
|
+
const dirMappings = [
|
|
117
|
+
{ from: path_1.default.join(claudeDir, "agents"), to: path_1.default.join(devTeamDir, "agents") },
|
|
118
|
+
{ from: path_1.default.join(claudeDir, "agent-memory"), to: path_1.default.join(devTeamDir, "agent-memory") },
|
|
119
|
+
{ from: path_1.default.join(claudeDir, "hooks"), to: path_1.default.join(devTeamDir, "hooks") },
|
|
120
|
+
{ from: path_1.default.join(claudeDir, "skills"), to: path_1.default.join(devTeamDir, "skills") },
|
|
121
|
+
];
|
|
122
|
+
// Protected files that must never be overwritten during migration
|
|
123
|
+
const protectedPatterns = ["learnings.md", "MEMORY.md"];
|
|
124
|
+
for (const { from, to } of dirMappings) {
|
|
125
|
+
if ((0, files_js_1.dirExists)(from)) {
|
|
126
|
+
const files = (0, files_js_1.listFilesRecursive)(from);
|
|
127
|
+
for (const filePath of files) {
|
|
128
|
+
const relativePath = path_1.default.relative(from, filePath);
|
|
129
|
+
const destPath = path_1.default.join(to, relativePath);
|
|
130
|
+
// Never overwrite existing files in .dev-team/ (partial migration safety)
|
|
131
|
+
if (!(0, files_js_1.fileExists)(destPath)) {
|
|
132
|
+
(0, files_js_1.copyFile)(filePath, destPath);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
log.push(`Migrated ${path_1.default.basename(from)}/ → .dev-team/${path_1.default.basename(to)}/`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// File mappings
|
|
139
|
+
const fileMappings = [
|
|
140
|
+
{
|
|
141
|
+
from: path_1.default.join(claudeDir, "dev-team-learnings.md"),
|
|
142
|
+
to: path_1.default.join(devTeamDir, "learnings.md"),
|
|
143
|
+
},
|
|
144
|
+
{ from: path_1.default.join(claudeDir, "dev-team.json"), to: path_1.default.join(devTeamDir, "config.json") },
|
|
145
|
+
];
|
|
146
|
+
for (const { from, to } of fileMappings) {
|
|
147
|
+
if ((0, files_js_1.fileExists)(from)) {
|
|
148
|
+
const isProtected = protectedPatterns.some((p) => to.endsWith(p));
|
|
149
|
+
// Never overwrite protected files (learnings, memory)
|
|
150
|
+
if (!isProtected || !(0, files_js_1.fileExists)(to)) {
|
|
151
|
+
(0, files_js_1.copyFile)(from, to);
|
|
152
|
+
}
|
|
153
|
+
log.push(`Migrated ${path_1.default.basename(from)} → .dev-team/${path_1.default.basename(to)}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Rewrite settings.json hook paths from .claude/hooks/ to .dev-team/hooks/
|
|
157
|
+
const settingsPath = path_1.default.join(claudeDir, "settings.json");
|
|
158
|
+
const settingsContent = (0, files_js_1.readFile)(settingsPath);
|
|
159
|
+
if (settingsContent) {
|
|
160
|
+
const updated = settingsContent.replace(/\.claude\/hooks\//g, ".dev-team/hooks/");
|
|
161
|
+
(0, files_js_1.writeFile)(settingsPath, updated);
|
|
162
|
+
log.push("Rewrote settings.json hook paths to .dev-team/hooks/");
|
|
163
|
+
}
|
|
164
|
+
// Clean up old .claude/ files (except settings.json and settings.local.json)
|
|
165
|
+
for (const { from } of dirMappings) {
|
|
166
|
+
if ((0, files_js_1.dirExists)(from)) {
|
|
167
|
+
try {
|
|
168
|
+
fs_1.default.rmSync(from, { recursive: true });
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
// best effort
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
for (const { from } of fileMappings) {
|
|
176
|
+
if ((0, files_js_1.fileExists)(from)) {
|
|
177
|
+
try {
|
|
178
|
+
fs_1.default.unlinkSync(from);
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// best effort
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Clean up other dev-team files in .claude/
|
|
186
|
+
const otherFiles = [
|
|
187
|
+
path_1.default.join(claudeDir, "dev-team-review-pending.json"),
|
|
188
|
+
path_1.default.join(claudeDir, "dev-team-task.json"),
|
|
189
|
+
];
|
|
190
|
+
for (const f of otherFiles) {
|
|
191
|
+
if ((0, files_js_1.fileExists)(f)) {
|
|
192
|
+
try {
|
|
193
|
+
fs_1.default.unlinkSync(f);
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
// best effort
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return log;
|
|
201
|
+
}
|
|
96
202
|
async function update(targetDir) {
|
|
97
203
|
console.log("\ndev-team update — Upgrading to latest templates\n");
|
|
98
204
|
const claudeDir = path_1.default.join(targetDir, ".claude");
|
|
99
|
-
const
|
|
205
|
+
const devTeamDir = path_1.default.join(targetDir, ".dev-team");
|
|
206
|
+
// Check if migration from .claude/ to .dev-team/ is needed
|
|
207
|
+
const oldPrefsPath = path_1.default.join(claudeDir, "dev-team.json");
|
|
208
|
+
const newPrefsPath = path_1.default.join(devTeamDir, "config.json");
|
|
209
|
+
const needsMigration = (0, files_js_1.fileExists)(oldPrefsPath) && !(0, files_js_1.fileExists)(newPrefsPath);
|
|
210
|
+
if (needsMigration) {
|
|
211
|
+
console.log("Migrating from .claude/ to .dev-team/ directory structure...\n");
|
|
212
|
+
const migrationLog = migrateFromClaude(targetDir);
|
|
213
|
+
for (const entry of migrationLog) {
|
|
214
|
+
console.log(` ${entry}`);
|
|
215
|
+
}
|
|
216
|
+
console.log("");
|
|
217
|
+
}
|
|
218
|
+
const prefsPath = newPrefsPath;
|
|
100
219
|
// Step 1: Read existing preferences
|
|
101
|
-
const prefsContent = (0,
|
|
220
|
+
const prefsContent = (0, files_js_1.readFile)(prefsPath);
|
|
102
221
|
if (!prefsContent) {
|
|
103
|
-
console.error("Error: No dev-team.json found. Run `npx dev-team init` first.");
|
|
222
|
+
console.error("Error: No .dev-team/config.json found. Run `npx dev-team init` first.");
|
|
104
223
|
process.exit(1);
|
|
105
224
|
}
|
|
106
225
|
let prefs;
|
|
@@ -110,7 +229,7 @@ async function update(targetDir) {
|
|
|
110
229
|
catch {
|
|
111
230
|
const backupPath = prefsPath + ".bak";
|
|
112
231
|
try {
|
|
113
|
-
(0,
|
|
232
|
+
(0, files_js_1.copyFile)(prefsPath, backupPath);
|
|
114
233
|
console.error(`Error: dev-team.json is corrupted. Backed up to ${backupPath}. Run \`npx dev-team init\` to reinitialize.`);
|
|
115
234
|
}
|
|
116
235
|
catch {
|
|
@@ -118,7 +237,7 @@ async function update(targetDir) {
|
|
|
118
237
|
}
|
|
119
238
|
process.exit(1);
|
|
120
239
|
}
|
|
121
|
-
const packageVersion = (0,
|
|
240
|
+
const packageVersion = (0, files_js_1.getPackageVersion)();
|
|
122
241
|
if (prefs.version === packageVersion) {
|
|
123
242
|
console.log(`Already at latest version (v${packageVersion})`);
|
|
124
243
|
}
|
|
@@ -126,10 +245,10 @@ async function update(targetDir) {
|
|
|
126
245
|
console.log(`Upgrading from v${prefs.version} to v${packageVersion}`);
|
|
127
246
|
}
|
|
128
247
|
// Run version migrations before updating agents
|
|
129
|
-
const
|
|
130
|
-
if (
|
|
248
|
+
const agentMigrationLog = runMigrations(prefs, prefs.version || "0.0.0", devTeamDir);
|
|
249
|
+
if (agentMigrationLog.length > 0) {
|
|
131
250
|
console.log("Migrations:");
|
|
132
|
-
for (const entry of
|
|
251
|
+
for (const entry of agentMigrationLog) {
|
|
133
252
|
console.log(` ${entry}`);
|
|
134
253
|
}
|
|
135
254
|
console.log("");
|
|
@@ -137,7 +256,7 @@ async function update(targetDir) {
|
|
|
137
256
|
console.log(` Agents: ${prefs.agents.join(", ")}`);
|
|
138
257
|
console.log(` Hooks: ${prefs.hooks.join(", ")}`);
|
|
139
258
|
console.log("");
|
|
140
|
-
const templates = (0,
|
|
259
|
+
const templates = (0, files_js_1.templateDir)();
|
|
141
260
|
const summary = {
|
|
142
261
|
agents: { updated: [], added: [] },
|
|
143
262
|
hooks: { updated: [], added: [] },
|
|
@@ -146,34 +265,34 @@ async function update(targetDir) {
|
|
|
146
265
|
settings: false,
|
|
147
266
|
};
|
|
148
267
|
// Step 2: Update agents
|
|
149
|
-
const agentsDir = path_1.default.join(
|
|
150
|
-
const memoryDir = path_1.default.join(
|
|
268
|
+
const agentsDir = path_1.default.join(devTeamDir, "agents");
|
|
269
|
+
const memoryDir = path_1.default.join(devTeamDir, "agent-memory");
|
|
151
270
|
for (const label of prefs.agents) {
|
|
152
271
|
const file = AGENT_FILES[label];
|
|
153
272
|
if (!file)
|
|
154
273
|
continue;
|
|
155
274
|
const src = path_1.default.join(templates, "agents", file);
|
|
156
275
|
const dest = path_1.default.join(agentsDir, file);
|
|
157
|
-
if (!(0,
|
|
276
|
+
if (!(0, files_js_1.fileExists)(src))
|
|
158
277
|
continue;
|
|
159
|
-
if ((0,
|
|
160
|
-
const srcContent = (0,
|
|
161
|
-
const destContent = (0,
|
|
278
|
+
if ((0, files_js_1.fileExists)(dest)) {
|
|
279
|
+
const srcContent = (0, files_js_1.readFile)(src);
|
|
280
|
+
const destContent = (0, files_js_1.readFile)(dest);
|
|
162
281
|
if (srcContent !== destContent) {
|
|
163
|
-
(0,
|
|
282
|
+
(0, files_js_1.copyFile)(src, dest);
|
|
164
283
|
summary.agents.updated.push(label);
|
|
165
284
|
}
|
|
166
285
|
}
|
|
167
286
|
else {
|
|
168
|
-
(0,
|
|
287
|
+
(0, files_js_1.copyFile)(src, dest);
|
|
169
288
|
summary.agents.added.push(label);
|
|
170
289
|
}
|
|
171
290
|
// Create memory template if missing (never overwrite existing memory)
|
|
172
291
|
const agentName = file.replace(".md", "");
|
|
173
292
|
const memorySrc = path_1.default.join(templates, "agent-memory", agentName, "MEMORY.md");
|
|
174
293
|
const memoryDest = path_1.default.join(memoryDir, agentName, "MEMORY.md");
|
|
175
|
-
if (!(0,
|
|
176
|
-
(0,
|
|
294
|
+
if (!(0, files_js_1.fileExists)(memoryDest) && (0, files_js_1.fileExists)(memorySrc)) {
|
|
295
|
+
(0, files_js_1.copyFile)(memorySrc, memoryDest);
|
|
177
296
|
}
|
|
178
297
|
}
|
|
179
298
|
// Detect new agents available in templates but not in preferences
|
|
@@ -181,39 +300,39 @@ async function update(targetDir) {
|
|
|
181
300
|
if (prefs.agents.includes(label))
|
|
182
301
|
continue;
|
|
183
302
|
const src = path_1.default.join(templates, "agents", file);
|
|
184
|
-
if ((0,
|
|
303
|
+
if ((0, files_js_1.fileExists)(src)) {
|
|
185
304
|
const dest = path_1.default.join(agentsDir, file);
|
|
186
|
-
(0,
|
|
305
|
+
(0, files_js_1.copyFile)(src, dest);
|
|
187
306
|
summary.agents.added.push(label);
|
|
188
307
|
prefs.agents.push(label);
|
|
189
308
|
const agentName = file.replace(".md", "");
|
|
190
309
|
const memorySrc = path_1.default.join(templates, "agent-memory", agentName, "MEMORY.md");
|
|
191
310
|
const memoryDest = path_1.default.join(memoryDir, agentName, "MEMORY.md");
|
|
192
|
-
if (!(0,
|
|
193
|
-
(0,
|
|
311
|
+
if (!(0, files_js_1.fileExists)(memoryDest) && (0, files_js_1.fileExists)(memorySrc)) {
|
|
312
|
+
(0, files_js_1.copyFile)(memorySrc, memoryDest);
|
|
194
313
|
}
|
|
195
314
|
}
|
|
196
315
|
}
|
|
197
316
|
// Step 3: Update hooks
|
|
198
|
-
const hooksDir = path_1.default.join(
|
|
317
|
+
const hooksDir = path_1.default.join(devTeamDir, "hooks");
|
|
199
318
|
for (const label of prefs.hooks) {
|
|
200
319
|
const file = HOOK_FILES[label];
|
|
201
320
|
if (!file)
|
|
202
321
|
continue;
|
|
203
322
|
const src = path_1.default.join(templates, "hooks", file);
|
|
204
323
|
const dest = path_1.default.join(hooksDir, file);
|
|
205
|
-
if (!(0,
|
|
324
|
+
if (!(0, files_js_1.fileExists)(src))
|
|
206
325
|
continue;
|
|
207
|
-
if ((0,
|
|
208
|
-
const srcContent = (0,
|
|
209
|
-
const destContent = (0,
|
|
326
|
+
if ((0, files_js_1.fileExists)(dest)) {
|
|
327
|
+
const srcContent = (0, files_js_1.readFile)(src);
|
|
328
|
+
const destContent = (0, files_js_1.readFile)(dest);
|
|
210
329
|
if (srcContent !== destContent) {
|
|
211
|
-
(0,
|
|
330
|
+
(0, files_js_1.copyFile)(src, dest);
|
|
212
331
|
summary.hooks.updated.push(label);
|
|
213
332
|
}
|
|
214
333
|
}
|
|
215
334
|
else {
|
|
216
|
-
(0,
|
|
335
|
+
(0, files_js_1.copyFile)(src, dest);
|
|
217
336
|
summary.hooks.added.push(label);
|
|
218
337
|
}
|
|
219
338
|
}
|
|
@@ -222,16 +341,16 @@ async function update(targetDir) {
|
|
|
222
341
|
if (prefs.hooks.includes(label))
|
|
223
342
|
continue;
|
|
224
343
|
const src = path_1.default.join(templates, "hooks", file);
|
|
225
|
-
if ((0,
|
|
344
|
+
if ((0, files_js_1.fileExists)(src)) {
|
|
226
345
|
const dest = path_1.default.join(hooksDir, file);
|
|
227
|
-
(0,
|
|
346
|
+
(0, files_js_1.copyFile)(src, dest);
|
|
228
347
|
summary.hooks.added.push(label);
|
|
229
348
|
prefs.hooks.push(label);
|
|
230
349
|
}
|
|
231
350
|
}
|
|
232
351
|
// Step 4: Update settings
|
|
233
352
|
const settingsPath = path_1.default.join(claudeDir, "settings.json");
|
|
234
|
-
const settingsContent = (0,
|
|
353
|
+
const settingsContent = (0, files_js_1.readFile)(path_1.default.join(templates, "settings.json"));
|
|
235
354
|
if (settingsContent) {
|
|
236
355
|
const settingsTemplate = JSON.parse(settingsContent);
|
|
237
356
|
const selectedHookFiles = prefs.hooks.map((label) => HOOK_FILES[label]).filter(Boolean);
|
|
@@ -247,46 +366,46 @@ async function update(targetDir) {
|
|
|
247
366
|
filteredSettings.hooks[event] = filteredEntries;
|
|
248
367
|
}
|
|
249
368
|
}
|
|
250
|
-
(0,
|
|
369
|
+
(0, files_js_1.mergeSettings)(settingsPath, filteredSettings);
|
|
251
370
|
summary.settings = true;
|
|
252
371
|
}
|
|
253
372
|
// Step 5: Update skills (auto-discovered from templates/skills/)
|
|
254
|
-
const skillsDir = path_1.default.join(
|
|
373
|
+
const skillsDir = path_1.default.join(devTeamDir, "skills");
|
|
255
374
|
const skillsSrcDir = path_1.default.join(templates, "skills");
|
|
256
|
-
const discoveredSkills = (0,
|
|
375
|
+
const discoveredSkills = (0, files_js_1.listSubdirectories)(skillsSrcDir);
|
|
257
376
|
for (const skillDir of discoveredSkills) {
|
|
258
377
|
const src = path_1.default.join(skillsSrcDir, skillDir, "SKILL.md");
|
|
259
378
|
const dest = path_1.default.join(skillsDir, skillDir, "SKILL.md");
|
|
260
|
-
if (!(0,
|
|
379
|
+
if (!(0, files_js_1.fileExists)(src))
|
|
261
380
|
continue;
|
|
262
|
-
if ((0,
|
|
263
|
-
const srcContent = (0,
|
|
264
|
-
const destContent = (0,
|
|
381
|
+
if ((0, files_js_1.fileExists)(dest)) {
|
|
382
|
+
const srcContent = (0, files_js_1.readFile)(src);
|
|
383
|
+
const destContent = (0, files_js_1.readFile)(dest);
|
|
265
384
|
if (srcContent !== destContent) {
|
|
266
|
-
(0,
|
|
385
|
+
(0, files_js_1.copyFile)(src, dest);
|
|
267
386
|
summary.skills.updated.push(skillDir.replace("dev-team-", ""));
|
|
268
387
|
}
|
|
269
388
|
}
|
|
270
389
|
else {
|
|
271
|
-
(0,
|
|
390
|
+
(0, files_js_1.copyFile)(src, dest);
|
|
272
391
|
summary.skills.added.push(skillDir.replace("dev-team-", ""));
|
|
273
392
|
}
|
|
274
393
|
}
|
|
275
394
|
// Step 6: Update CLAUDE.md (preserves user content outside markers)
|
|
276
395
|
const claudeMdPath = path_1.default.join(targetDir, "CLAUDE.md");
|
|
277
|
-
const claudeMdTemplate = (0,
|
|
396
|
+
const claudeMdTemplate = (0, files_js_1.readFile)(path_1.default.join(templates, "CLAUDE.md"));
|
|
278
397
|
if (claudeMdTemplate) {
|
|
279
|
-
summary.claudeMd = (0,
|
|
398
|
+
summary.claudeMd = (0, files_js_1.mergeClaudeMd)(claudeMdPath, claudeMdTemplate);
|
|
280
399
|
}
|
|
281
400
|
// Step 7: Update shared learnings template (only if missing)
|
|
282
401
|
const learningsSrc = path_1.default.join(templates, "dev-team-learnings.md");
|
|
283
|
-
const learningsDest = path_1.default.join(
|
|
284
|
-
if (!(0,
|
|
285
|
-
(0,
|
|
402
|
+
const learningsDest = path_1.default.join(devTeamDir, "learnings.md");
|
|
403
|
+
if (!(0, files_js_1.fileExists)(learningsDest)) {
|
|
404
|
+
(0, files_js_1.copyFile)(learningsSrc, learningsDest);
|
|
286
405
|
}
|
|
287
406
|
// Step 8: Save updated preferences (stamp current package version)
|
|
288
407
|
prefs.version = packageVersion;
|
|
289
|
-
(0,
|
|
408
|
+
(0, files_js_1.writeFile)(prefsPath, JSON.stringify(prefs, null, 2) + "\n");
|
|
290
409
|
// Step 9: Print summary
|
|
291
410
|
console.log("Update summary:\n");
|
|
292
411
|
const agentChanges = [...summary.agents.updated, ...summary.agents.added];
|