@fredericboyer/dev-team 0.1.2 → 0.3.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 +128 -0
- package/bin/dev-team.js +1 -21
- package/dist/bin/dev-team.d.ts +1 -0
- package/dist/bin/dev-team.js +36 -0
- package/dist/bin/dev-team.js.map +1 -0
- package/dist/create-agent.d.ts +1 -0
- package/dist/create-agent.js +106 -0
- package/dist/create-agent.js.map +1 -0
- package/dist/files.d.ts +51 -0
- package/dist/files.js +155 -0
- package/dist/files.js.map +1 -0
- package/dist/init.d.ts +24 -0
- package/dist/init.js +358 -0
- package/dist/init.js.map +1 -0
- package/dist/prompts.d.ts +25 -0
- package/dist/prompts.js +109 -0
- package/dist/prompts.js.map +1 -0
- package/dist/scan.d.ts +15 -0
- package/dist/scan.js +187 -0
- package/dist/scan.js.map +1 -0
- package/dist/update.d.ts +5 -0
- package/dist/update.js +229 -0
- package/dist/update.js.map +1 -0
- package/package.json +30 -9
- package/templates/CLAUDE.md +21 -0
- package/templates/agent-memory/dev-team-architect/MEMORY.md +12 -0
- package/templates/agent-memory/dev-team-docs/MEMORY.md +12 -0
- package/templates/agent-memory/dev-team-lead/MEMORY.md +12 -0
- package/templates/agent-memory/dev-team-release/MEMORY.md +12 -0
- package/templates/agents/dev-team-architect.md +62 -0
- package/templates/agents/dev-team-deming.md +2 -1
- package/templates/agents/dev-team-docs.md +63 -0
- package/templates/agents/dev-team-lead.md +95 -0
- package/templates/agents/dev-team-release.md +65 -0
- package/templates/hooks/dev-team-post-change-review.js +63 -10
- package/templates/hooks/dev-team-pre-commit-gate.js +43 -14
- package/templates/hooks/dev-team-safety-guard.js +21 -11
- package/templates/hooks/dev-team-task-loop.js +17 -9
- package/templates/hooks/dev-team-tdd-enforce.js +42 -23
- package/templates/hooks/dev-team-watch-list.js +84 -0
- package/templates/settings.json +4 -0
- package/templates/skills/dev-team-audit/SKILL.md +85 -0
- package/templates/skills/dev-team-review/SKILL.md +68 -0
- package/lib/files.js +0 -160
- package/lib/init.js +0 -206
- package/lib/prompts.js +0 -123
package/dist/scan.js
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.scanProject = scanProject;
|
|
7
|
+
exports.formatScanReport = formatScanReport;
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const files_1 = require("./files");
|
|
10
|
+
/**
|
|
11
|
+
* Scans a project directory for existing tooling and identifies gaps.
|
|
12
|
+
* Returns a list of findings with actionable recommendations.
|
|
13
|
+
*/
|
|
14
|
+
function scanProject(targetDir) {
|
|
15
|
+
const findings = [];
|
|
16
|
+
// Linters
|
|
17
|
+
const linters = [
|
|
18
|
+
{ file: ".eslintrc.js", tool: "ESLint" },
|
|
19
|
+
{ file: ".eslintrc.json", tool: "ESLint" },
|
|
20
|
+
{ file: ".eslintrc.yml", tool: "ESLint" },
|
|
21
|
+
{ file: "eslint.config.js", tool: "ESLint (flat config)" },
|
|
22
|
+
{ file: "eslint.config.mjs", tool: "ESLint (flat config)" },
|
|
23
|
+
{ file: "biome.json", tool: "Biome" },
|
|
24
|
+
{ file: ".pylintrc", tool: "pylint" },
|
|
25
|
+
{ file: "setup.cfg", tool: "flake8/pylint" },
|
|
26
|
+
{ file: "pyproject.toml", tool: "ruff/pylint" },
|
|
27
|
+
{ file: ".rubocop.yml", tool: "RuboCop" },
|
|
28
|
+
{ file: ".golangci.yml", tool: "golangci-lint" },
|
|
29
|
+
];
|
|
30
|
+
const foundLinter = linters.find((l) => (0, files_1.fileExists)(path_1.default.join(targetDir, l.file)));
|
|
31
|
+
if (foundLinter) {
|
|
32
|
+
findings.push({
|
|
33
|
+
category: "linter",
|
|
34
|
+
status: "found",
|
|
35
|
+
tool: foundLinter.tool,
|
|
36
|
+
recommendation: `${foundLinter.tool} detected. Consider adding a PostToolUse hook to run it on file save for immediate feedback.`,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// Check package.json for lint script
|
|
41
|
+
const pkg = (0, files_1.readFile)(path_1.default.join(targetDir, "package.json"));
|
|
42
|
+
if (pkg && pkg.includes('"lint"')) {
|
|
43
|
+
findings.push({
|
|
44
|
+
category: "linter",
|
|
45
|
+
status: "found",
|
|
46
|
+
tool: "npm lint script",
|
|
47
|
+
recommendation: "Lint script found in package.json. Consider adding a PostToolUse hook to run it automatically.",
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
findings.push({
|
|
52
|
+
category: "linter",
|
|
53
|
+
status: "missing",
|
|
54
|
+
tool: "none",
|
|
55
|
+
recommendation: "No linter detected. Add ESLint, Biome, or a language-appropriate linter to catch issues early.",
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Formatters
|
|
60
|
+
const formatters = [
|
|
61
|
+
{ file: ".prettierrc", tool: "Prettier" },
|
|
62
|
+
{ file: ".prettierrc.js", tool: "Prettier" },
|
|
63
|
+
{ file: ".prettierrc.json", tool: "Prettier" },
|
|
64
|
+
{ file: "prettier.config.js", tool: "Prettier" },
|
|
65
|
+
{ file: ".editorconfig", tool: "EditorConfig" },
|
|
66
|
+
{ file: "biome.json", tool: "Biome" },
|
|
67
|
+
{ file: "rustfmt.toml", tool: "rustfmt" },
|
|
68
|
+
{ file: ".clang-format", tool: "clang-format" },
|
|
69
|
+
];
|
|
70
|
+
const foundFormatter = formatters.find((f) => (0, files_1.fileExists)(path_1.default.join(targetDir, f.file)));
|
|
71
|
+
if (foundFormatter) {
|
|
72
|
+
findings.push({
|
|
73
|
+
category: "formatter",
|
|
74
|
+
status: "found",
|
|
75
|
+
tool: foundFormatter.tool,
|
|
76
|
+
recommendation: `${foundFormatter.tool} detected. Consider a pre-commit hook or PostToolUse hook to auto-format on save.`,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
findings.push({
|
|
81
|
+
category: "formatter",
|
|
82
|
+
status: "missing",
|
|
83
|
+
tool: "none",
|
|
84
|
+
recommendation: "No formatter detected. Add Prettier, Biome, or a language-appropriate formatter to enforce consistent style.",
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
// SAST / Security scanning
|
|
88
|
+
const sastConfigs = [
|
|
89
|
+
{ file: ".semgrep.yml", tool: "Semgrep" },
|
|
90
|
+
{ file: ".semgrep", tool: "Semgrep" },
|
|
91
|
+
{ file: ".snyk", tool: "Snyk" },
|
|
92
|
+
{ file: ".trivyignore", tool: "Trivy" },
|
|
93
|
+
{ file: "sonar-project.properties", tool: "SonarQube" },
|
|
94
|
+
{ file: ".bandit", tool: "Bandit" },
|
|
95
|
+
{ file: ".safety-policy.yml", tool: "Safety" },
|
|
96
|
+
];
|
|
97
|
+
const foundSast = sastConfigs.find((s) => (0, files_1.fileExists)(path_1.default.join(targetDir, s.file)));
|
|
98
|
+
if (foundSast) {
|
|
99
|
+
findings.push({
|
|
100
|
+
category: "sast",
|
|
101
|
+
status: "found",
|
|
102
|
+
tool: foundSast.tool,
|
|
103
|
+
recommendation: `${foundSast.tool} detected. Ensure it runs in CI and consider adding @dev-team-szabo for complementary AI-driven security review.`,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
findings.push({
|
|
108
|
+
category: "sast",
|
|
109
|
+
status: "missing",
|
|
110
|
+
tool: "none",
|
|
111
|
+
recommendation: "No SAST tool detected. Consider adding Semgrep, Snyk, or language-appropriate static analysis. @dev-team-szabo provides AI review but does not replace automated scanning.",
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
// CI/CD
|
|
115
|
+
const ciConfigs = [
|
|
116
|
+
{ path: ".github/workflows", tool: "GitHub Actions" },
|
|
117
|
+
{ path: ".gitlab-ci.yml", tool: "GitLab CI" },
|
|
118
|
+
{ path: ".circleci", tool: "CircleCI" },
|
|
119
|
+
{ path: "Jenkinsfile", tool: "Jenkins" },
|
|
120
|
+
{ path: ".travis.yml", tool: "Travis CI" },
|
|
121
|
+
{ path: "azure-pipelines.yml", tool: "Azure Pipelines" },
|
|
122
|
+
{ path: "bitbucket-pipelines.yml", tool: "Bitbucket Pipelines" },
|
|
123
|
+
];
|
|
124
|
+
const foundCi = ciConfigs.find((c) => {
|
|
125
|
+
const fullPath = path_1.default.join(targetDir, c.path);
|
|
126
|
+
return (0, files_1.fileExists)(fullPath) || (0, files_1.dirExists)(fullPath);
|
|
127
|
+
});
|
|
128
|
+
if (foundCi) {
|
|
129
|
+
findings.push({
|
|
130
|
+
category: "ci",
|
|
131
|
+
status: "found",
|
|
132
|
+
tool: foundCi.tool,
|
|
133
|
+
recommendation: `${foundCi.tool} detected. Verify it runs lint, format check, tests, and security scans. Consider parallel steps for independent jobs.`,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
findings.push({
|
|
138
|
+
category: "ci",
|
|
139
|
+
status: "missing",
|
|
140
|
+
tool: "none",
|
|
141
|
+
recommendation: "No CI/CD pipeline detected. Add GitHub Actions, GitLab CI, or equivalent. At minimum: lint, format check, and test steps.",
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// Dependency audit
|
|
145
|
+
const lockFiles = [
|
|
146
|
+
{ file: "package-lock.json", tool: "npm audit" },
|
|
147
|
+
{ file: "yarn.lock", tool: "yarn audit" },
|
|
148
|
+
{ file: "pnpm-lock.yaml", tool: "pnpm audit" },
|
|
149
|
+
{ file: "Gemfile.lock", tool: "bundle audit" },
|
|
150
|
+
{ file: "poetry.lock", tool: "pip-audit / safety" },
|
|
151
|
+
{ file: "Cargo.lock", tool: "cargo audit" },
|
|
152
|
+
{ file: "go.sum", tool: "govulncheck" },
|
|
153
|
+
];
|
|
154
|
+
const foundLock = lockFiles.find((l) => (0, files_1.fileExists)(path_1.default.join(targetDir, l.file)));
|
|
155
|
+
if (foundLock) {
|
|
156
|
+
findings.push({
|
|
157
|
+
category: "dependency",
|
|
158
|
+
status: "found",
|
|
159
|
+
tool: foundLock.tool,
|
|
160
|
+
recommendation: `Lock file detected (${foundLock.file}). Run \`${foundLock.tool}\` regularly and add it to CI.`,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
return findings;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Formats scan findings as a human-readable report.
|
|
167
|
+
*/
|
|
168
|
+
function formatScanReport(findings) {
|
|
169
|
+
const lines = [];
|
|
170
|
+
lines.push("Deming scan — Project tooling assessment\n");
|
|
171
|
+
const missing = findings.filter((f) => f.status === "missing");
|
|
172
|
+
const found = findings.filter((f) => f.status === "found");
|
|
173
|
+
if (missing.length === 0) {
|
|
174
|
+
lines.push(" All checked tooling categories are covered.\n");
|
|
175
|
+
}
|
|
176
|
+
for (const f of found) {
|
|
177
|
+
lines.push(` [OK] ${f.category}: ${f.tool}`);
|
|
178
|
+
}
|
|
179
|
+
for (const f of missing) {
|
|
180
|
+
lines.push(` [MISSING] ${f.category}: ${f.recommendation}`);
|
|
181
|
+
}
|
|
182
|
+
if (missing.length > 0) {
|
|
183
|
+
lines.push("\n Tip: Run @dev-team-deming for deeper analysis and automated setup.");
|
|
184
|
+
}
|
|
185
|
+
return lines.join("\n");
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=scan.js.map
|
package/dist/scan.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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"}
|
package/dist/update.d.ts
ADDED
package/dist/update.js
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.update = update;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const files_1 = require("./files");
|
|
9
|
+
/**
|
|
10
|
+
* Maps agent labels to filenames. Must stay in sync with init.ts ALL_AGENTS.
|
|
11
|
+
*/
|
|
12
|
+
const AGENT_FILES = {
|
|
13
|
+
Voss: "dev-team-voss.md",
|
|
14
|
+
Mori: "dev-team-mori.md",
|
|
15
|
+
Szabo: "dev-team-szabo.md",
|
|
16
|
+
Knuth: "dev-team-knuth.md",
|
|
17
|
+
Beck: "dev-team-beck.md",
|
|
18
|
+
Deming: "dev-team-deming.md",
|
|
19
|
+
};
|
|
20
|
+
const HOOK_FILES = {
|
|
21
|
+
"TDD enforcement": "dev-team-tdd-enforce.js",
|
|
22
|
+
"Safety guard": "dev-team-safety-guard.js",
|
|
23
|
+
"Post-change review": "dev-team-post-change-review.js",
|
|
24
|
+
"Pre-commit gate": "dev-team-pre-commit-gate.js",
|
|
25
|
+
"Task loop": "dev-team-task-loop.js",
|
|
26
|
+
};
|
|
27
|
+
const SKILL_DIRS = ["dev-team-challenge", "dev-team-task"];
|
|
28
|
+
/**
|
|
29
|
+
* Update flow: upgrades installed agents, hooks, and skills to latest templates.
|
|
30
|
+
* Preserves user customizations in CLAUDE.md and agent memory files.
|
|
31
|
+
*/
|
|
32
|
+
async function update(targetDir) {
|
|
33
|
+
console.log("\ndev-team update — Upgrading to latest templates\n");
|
|
34
|
+
const claudeDir = path_1.default.join(targetDir, ".claude");
|
|
35
|
+
const prefsPath = path_1.default.join(claudeDir, "dev-team.json");
|
|
36
|
+
// Step 1: Read existing preferences
|
|
37
|
+
const prefsContent = (0, files_1.readFile)(prefsPath);
|
|
38
|
+
if (!prefsContent) {
|
|
39
|
+
console.error("Error: No dev-team.json found. Run `npx dev-team init` first.");
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
let prefs;
|
|
43
|
+
try {
|
|
44
|
+
prefs = JSON.parse(prefsContent);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
console.error("Error: dev-team.json is corrupted. Run `npx dev-team init` to reinitialize.");
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
console.log(`Current installation: v${prefs.version}`);
|
|
51
|
+
console.log(` Agents: ${prefs.agents.join(", ")}`);
|
|
52
|
+
console.log(` Hooks: ${prefs.hooks.join(", ")}`);
|
|
53
|
+
console.log("");
|
|
54
|
+
const templates = (0, files_1.templateDir)();
|
|
55
|
+
const summary = {
|
|
56
|
+
agents: { updated: [], added: [] },
|
|
57
|
+
hooks: { updated: [], added: [] },
|
|
58
|
+
skills: { updated: [], added: [] },
|
|
59
|
+
claudeMd: "unchanged",
|
|
60
|
+
settings: false,
|
|
61
|
+
};
|
|
62
|
+
// Step 2: Update agents
|
|
63
|
+
const agentsDir = path_1.default.join(claudeDir, "agents");
|
|
64
|
+
const memoryDir = path_1.default.join(claudeDir, "agent-memory");
|
|
65
|
+
for (const label of prefs.agents) {
|
|
66
|
+
const file = AGENT_FILES[label];
|
|
67
|
+
if (!file)
|
|
68
|
+
continue;
|
|
69
|
+
const src = path_1.default.join(templates, "agents", file);
|
|
70
|
+
const dest = path_1.default.join(agentsDir, file);
|
|
71
|
+
if (!(0, files_1.fileExists)(src))
|
|
72
|
+
continue;
|
|
73
|
+
if ((0, files_1.fileExists)(dest)) {
|
|
74
|
+
const srcContent = (0, files_1.readFile)(src);
|
|
75
|
+
const destContent = (0, files_1.readFile)(dest);
|
|
76
|
+
if (srcContent !== destContent) {
|
|
77
|
+
(0, files_1.copyFile)(src, dest);
|
|
78
|
+
summary.agents.updated.push(label);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
(0, files_1.copyFile)(src, dest);
|
|
83
|
+
summary.agents.added.push(label);
|
|
84
|
+
}
|
|
85
|
+
// Create memory template if missing (never overwrite existing memory)
|
|
86
|
+
const agentName = file.replace(".md", "");
|
|
87
|
+
const memorySrc = path_1.default.join(templates, "agent-memory", agentName, "MEMORY.md");
|
|
88
|
+
const memoryDest = path_1.default.join(memoryDir, agentName, "MEMORY.md");
|
|
89
|
+
if (!(0, files_1.fileExists)(memoryDest) && (0, files_1.fileExists)(memorySrc)) {
|
|
90
|
+
(0, files_1.copyFile)(memorySrc, memoryDest);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Detect new agents available in templates but not in preferences
|
|
94
|
+
for (const [label, file] of Object.entries(AGENT_FILES)) {
|
|
95
|
+
if (prefs.agents.includes(label))
|
|
96
|
+
continue;
|
|
97
|
+
const src = path_1.default.join(templates, "agents", file);
|
|
98
|
+
if ((0, files_1.fileExists)(src)) {
|
|
99
|
+
const dest = path_1.default.join(agentsDir, file);
|
|
100
|
+
(0, files_1.copyFile)(src, dest);
|
|
101
|
+
summary.agents.added.push(label);
|
|
102
|
+
prefs.agents.push(label);
|
|
103
|
+
const agentName = file.replace(".md", "");
|
|
104
|
+
const memorySrc = path_1.default.join(templates, "agent-memory", agentName, "MEMORY.md");
|
|
105
|
+
const memoryDest = path_1.default.join(memoryDir, agentName, "MEMORY.md");
|
|
106
|
+
if (!(0, files_1.fileExists)(memoryDest) && (0, files_1.fileExists)(memorySrc)) {
|
|
107
|
+
(0, files_1.copyFile)(memorySrc, memoryDest);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Step 3: Update hooks
|
|
112
|
+
const hooksDir = path_1.default.join(claudeDir, "hooks");
|
|
113
|
+
for (const label of prefs.hooks) {
|
|
114
|
+
const file = HOOK_FILES[label];
|
|
115
|
+
if (!file)
|
|
116
|
+
continue;
|
|
117
|
+
const src = path_1.default.join(templates, "hooks", file);
|
|
118
|
+
const dest = path_1.default.join(hooksDir, file);
|
|
119
|
+
if (!(0, files_1.fileExists)(src))
|
|
120
|
+
continue;
|
|
121
|
+
if ((0, files_1.fileExists)(dest)) {
|
|
122
|
+
const srcContent = (0, files_1.readFile)(src);
|
|
123
|
+
const destContent = (0, files_1.readFile)(dest);
|
|
124
|
+
if (srcContent !== destContent) {
|
|
125
|
+
(0, files_1.copyFile)(src, dest);
|
|
126
|
+
summary.hooks.updated.push(label);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
(0, files_1.copyFile)(src, dest);
|
|
131
|
+
summary.hooks.added.push(label);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Step 4: Update settings
|
|
135
|
+
const settingsPath = path_1.default.join(claudeDir, "settings.json");
|
|
136
|
+
const settingsContent = (0, files_1.readFile)(path_1.default.join(templates, "settings.json"));
|
|
137
|
+
if (settingsContent) {
|
|
138
|
+
const settingsTemplate = JSON.parse(settingsContent);
|
|
139
|
+
const selectedHookFiles = prefs.hooks.map((label) => HOOK_FILES[label]).filter(Boolean);
|
|
140
|
+
const filteredSettings = { hooks: {} };
|
|
141
|
+
for (const [event, entries] of Object.entries(settingsTemplate.hooks)) {
|
|
142
|
+
const filteredEntries = entries
|
|
143
|
+
.map((entry) => ({
|
|
144
|
+
...entry,
|
|
145
|
+
hooks: (entry.hooks || []).filter((h) => selectedHookFiles.some((f) => h.command && h.command.includes(f))),
|
|
146
|
+
}))
|
|
147
|
+
.filter((entry) => entry.hooks.length > 0);
|
|
148
|
+
if (filteredEntries.length > 0) {
|
|
149
|
+
filteredSettings.hooks[event] = filteredEntries;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
(0, files_1.mergeSettings)(settingsPath, filteredSettings);
|
|
153
|
+
summary.settings = true;
|
|
154
|
+
}
|
|
155
|
+
// Step 5: Update skills
|
|
156
|
+
const skillsDir = path_1.default.join(claudeDir, "skills");
|
|
157
|
+
const skillsSrcDir = path_1.default.join(templates, "skills");
|
|
158
|
+
for (const skillDir of SKILL_DIRS) {
|
|
159
|
+
const src = path_1.default.join(skillsSrcDir, skillDir, "SKILL.md");
|
|
160
|
+
const dest = path_1.default.join(skillsDir, skillDir, "SKILL.md");
|
|
161
|
+
if (!(0, files_1.fileExists)(src))
|
|
162
|
+
continue;
|
|
163
|
+
if ((0, files_1.fileExists)(dest)) {
|
|
164
|
+
const srcContent = (0, files_1.readFile)(src);
|
|
165
|
+
const destContent = (0, files_1.readFile)(dest);
|
|
166
|
+
if (srcContent !== destContent) {
|
|
167
|
+
(0, files_1.copyFile)(src, dest);
|
|
168
|
+
summary.skills.updated.push(skillDir.replace("dev-team-", ""));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
(0, files_1.copyFile)(src, dest);
|
|
173
|
+
summary.skills.added.push(skillDir.replace("dev-team-", ""));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Step 6: Update CLAUDE.md (preserves user content outside markers)
|
|
177
|
+
const claudeMdPath = path_1.default.join(targetDir, "CLAUDE.md");
|
|
178
|
+
const claudeMdTemplate = (0, files_1.readFile)(path_1.default.join(templates, "CLAUDE.md"));
|
|
179
|
+
if (claudeMdTemplate) {
|
|
180
|
+
summary.claudeMd = (0, files_1.mergeClaudeMd)(claudeMdPath, claudeMdTemplate);
|
|
181
|
+
}
|
|
182
|
+
// Step 7: Update shared learnings template (only if missing)
|
|
183
|
+
const learningsSrc = path_1.default.join(templates, "dev-team-learnings.md");
|
|
184
|
+
const learningsDest = path_1.default.join(claudeDir, "dev-team-learnings.md");
|
|
185
|
+
if (!(0, files_1.fileExists)(learningsDest)) {
|
|
186
|
+
(0, files_1.copyFile)(learningsSrc, learningsDest);
|
|
187
|
+
}
|
|
188
|
+
// Step 8: Save updated preferences
|
|
189
|
+
(0, files_1.writeFile)(prefsPath, JSON.stringify(prefs, null, 2) + "\n");
|
|
190
|
+
// Step 9: Print summary
|
|
191
|
+
console.log("Update summary:\n");
|
|
192
|
+
const agentChanges = [...summary.agents.updated, ...summary.agents.added];
|
|
193
|
+
const hookChanges = [...summary.hooks.updated, ...summary.hooks.added];
|
|
194
|
+
const skillChanges = [...summary.skills.updated, ...summary.skills.added];
|
|
195
|
+
if (agentChanges.length === 0 &&
|
|
196
|
+
hookChanges.length === 0 &&
|
|
197
|
+
skillChanges.length === 0 &&
|
|
198
|
+
summary.claudeMd === "unchanged") {
|
|
199
|
+
console.log(" Already up to date. No changes needed.\n");
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (summary.agents.updated.length > 0) {
|
|
203
|
+
console.log(` Agents updated: ${summary.agents.updated.join(", ")}`);
|
|
204
|
+
}
|
|
205
|
+
if (summary.agents.added.length > 0) {
|
|
206
|
+
console.log(` Agents added: ${summary.agents.added.join(", ")}`);
|
|
207
|
+
}
|
|
208
|
+
if (summary.hooks.updated.length > 0) {
|
|
209
|
+
console.log(` Hooks updated: ${summary.hooks.updated.join(", ")}`);
|
|
210
|
+
}
|
|
211
|
+
if (summary.hooks.added.length > 0) {
|
|
212
|
+
console.log(` Hooks added: ${summary.hooks.added.join(", ")}`);
|
|
213
|
+
}
|
|
214
|
+
if (summary.skills.updated.length > 0) {
|
|
215
|
+
console.log(` Skills updated: ${summary.skills.updated.join(", ")}`);
|
|
216
|
+
}
|
|
217
|
+
if (summary.skills.added.length > 0) {
|
|
218
|
+
console.log(` Skills added: ${summary.skills.added.join(", ")}`);
|
|
219
|
+
}
|
|
220
|
+
if (summary.claudeMd !== "unchanged") {
|
|
221
|
+
console.log(` CLAUDE.md: ${summary.claudeMd}`);
|
|
222
|
+
}
|
|
223
|
+
console.log("\nPreserved:");
|
|
224
|
+
console.log(" Agent memory files (not overwritten)");
|
|
225
|
+
console.log(" Shared team learnings (not overwritten)");
|
|
226
|
+
console.log(" CLAUDE.md content outside dev-team markers");
|
|
227
|
+
console.log("");
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,23 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fredericboyer/dev-team",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Adversarial AI agent team for any project — installs Claude Code agents, hooks, and skills that enforce quality through productive friction",
|
|
5
|
+
"main": "dist/init.js",
|
|
6
|
+
"types": "dist/init.d.ts",
|
|
5
7
|
"bin": {
|
|
6
8
|
"dev-team": "bin/dev-team.js"
|
|
7
9
|
},
|
|
8
10
|
"files": [
|
|
9
11
|
"bin/",
|
|
10
|
-
"
|
|
12
|
+
"dist/",
|
|
11
13
|
"templates/"
|
|
12
14
|
],
|
|
13
15
|
"scripts": {
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"pretest": "npm run build",
|
|
18
|
+
"test": "node --test tests/unit/files.test.js tests/unit/hooks.test.js tests/unit/scan.test.js tests/integration/fresh-project.test.js tests/integration/idempotency.test.js tests/integration/update.test.js tests/scenarios/node-project.test.js tests/scenarios/python-project.test.js tests/scenarios/upgrade-path.test.js",
|
|
19
|
+
"test:unit": "node --test tests/unit/files.test.js tests/unit/hooks.test.js",
|
|
16
20
|
"test:integration": "node --test tests/integration/fresh-project.test.js tests/integration/idempotency.test.js",
|
|
17
|
-
"test:scenarios": "node --test tests/scenarios/",
|
|
18
|
-
"lint": "
|
|
19
|
-
"format
|
|
20
|
-
"
|
|
21
|
+
"test:scenarios": "node --test tests/scenarios/node-project.test.js tests/scenarios/python-project.test.js tests/scenarios/upgrade-path.test.js",
|
|
22
|
+
"lint": "oxlint src/ scripts/ templates/hooks/",
|
|
23
|
+
"format": "oxfmt --write src/ scripts/ templates/hooks/",
|
|
24
|
+
"format:check": "oxfmt --check src/ scripts/ templates/hooks/",
|
|
25
|
+
"validate:agents": "node scripts/validate-agents.js",
|
|
26
|
+
"validate:hooks": "node scripts/validate-hooks.js",
|
|
27
|
+
"prepublishOnly": "npm run build"
|
|
21
28
|
},
|
|
22
29
|
"keywords": [
|
|
23
30
|
"claude-code",
|
|
@@ -27,9 +34,23 @@
|
|
|
27
34
|
"tdd",
|
|
28
35
|
"security"
|
|
29
36
|
],
|
|
30
|
-
"author": "",
|
|
37
|
+
"author": "Frederic Boyer",
|
|
31
38
|
"license": "MIT",
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "https://github.com/fredericboyer/dev-team.git"
|
|
42
|
+
},
|
|
43
|
+
"bugs": {
|
|
44
|
+
"url": "https://github.com/fredericboyer/dev-team/issues"
|
|
45
|
+
},
|
|
46
|
+
"homepage": "https://github.com/fredericboyer/dev-team#readme",
|
|
32
47
|
"engines": {
|
|
33
48
|
"node": ">=18.0.0"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/node": "^25.5.0",
|
|
52
|
+
"oxfmt": "^0.41.0",
|
|
53
|
+
"oxlint": "^1.56.0",
|
|
54
|
+
"typescript": "^5.9.3"
|
|
34
55
|
}
|
|
35
56
|
}
|
package/templates/CLAUDE.md
CHANGED
|
@@ -14,9 +14,15 @@ This project uses [dev-team](https://github.com/dev-team) — adversarial AI age
|
|
|
14
14
|
| `@dev-team-knuth` | Quality Auditor | Coverage gaps, boundary conditions, correctness verification |
|
|
15
15
|
| `@dev-team-beck` | Test Implementer | Writing tests, TDD cycles, translating audit findings into test cases |
|
|
16
16
|
| `@dev-team-deming` | Tooling Optimizer | Linters, formatters, CI/CD, hooks, onboarding, automation |
|
|
17
|
+
| `@dev-team-docs` | Documentation Engineer | Doc accuracy, stale docs, README/API docs, doc-code sync |
|
|
18
|
+
| `@dev-team-architect` | Architect | Architectural review, coupling, dependency direction, ADR compliance |
|
|
19
|
+
| `@dev-team-release` | Release Manager | Versioning, changelog, release readiness, semver validation |
|
|
20
|
+
| `@dev-team-lead` | Team Lead / Orchestrator | Auto-delegates to specialists, manages review loops, resolves conflicts |
|
|
17
21
|
|
|
18
22
|
### Workflow
|
|
19
23
|
|
|
24
|
+
For automatic delegation, use `@dev-team-lead` — it analyzes the task and routes to the right specialist.
|
|
25
|
+
|
|
20
26
|
For non-trivial work: explore the area first, then implement, then review.
|
|
21
27
|
|
|
22
28
|
Agents challenge each other using classified findings:
|
|
@@ -27,5 +33,20 @@ Agents challenge each other using classified findings:
|
|
|
27
33
|
|
|
28
34
|
- `/dev-team:challenge` — critically examine a proposal or implementation
|
|
29
35
|
- `/dev-team:task` — start an iterative task loop with adversarial review gates
|
|
36
|
+
- `/dev-team:review` — orchestrated multi-agent parallel review of changes
|
|
37
|
+
- `/dev-team:audit` — full codebase security + quality + tooling audit
|
|
38
|
+
|
|
39
|
+
### Learnings — where to write what
|
|
40
|
+
|
|
41
|
+
All project and process learnings MUST go to in-repo files, NOT to machine-local memory (`~/.claude/projects/`). Machine-local memory is invisible to other developers, agents, and sessions.
|
|
42
|
+
|
|
43
|
+
| What | Where | Examples |
|
|
44
|
+
|------|-------|---------|
|
|
45
|
+
| Project patterns, process rules, tech debt, overruled challenges | `.claude/dev-team-learnings.md` | "We use PostgreSQL", "Hooks over guidelines", "Knuth's finding X was overruled because Y" |
|
|
46
|
+
| Agent-specific calibration | `.claude/agent-memory/<agent>/MEMORY.md` | Szabo: "Auth uses JWT not sessions", Knuth: "Coverage weak in parsers" |
|
|
47
|
+
| Formal architecture decisions | `docs/adr/` | ADR format, not learnings |
|
|
48
|
+
| User-specific preferences only | Machine-local memory | Personal style, name, role — things that vary per person, not per project |
|
|
49
|
+
|
|
50
|
+
When the human gives feedback about process, coding style, or tool behavior: write it to `dev-team-learnings.md`. Only use machine-local memory for things that are truly personal and would not apply to another developer on the same project.
|
|
30
51
|
|
|
31
52
|
<!-- dev-team:end -->
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Agent Memory: Architect
|
|
2
|
+
<!-- First 200 lines are loaded into agent context. Keep concise. -->
|
|
3
|
+
|
|
4
|
+
## Project Conventions
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
## Patterns to Watch For
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
## Calibration Log
|
|
11
|
+
<!-- Challenges accepted/overruled — tunes adversarial intensity over time -->
|
|
12
|
+
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Agent Memory: Docs (Documentation Engineer)
|
|
2
|
+
<!-- First 200 lines are loaded into agent context. Keep concise. -->
|
|
3
|
+
|
|
4
|
+
## Project Conventions
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
## Patterns to Watch For
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
## Calibration Log
|
|
11
|
+
<!-- Challenges accepted/overruled — tunes adversarial intensity over time -->
|
|
12
|
+
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Agent Memory: Lead (Orchestrator)
|
|
2
|
+
<!-- First 200 lines are loaded into agent context. Keep concise. -->
|
|
3
|
+
|
|
4
|
+
## Delegation Patterns
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
## Conflict Resolution Log
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
## Calibration Log
|
|
11
|
+
<!-- Delegation decisions that worked well or poorly — tunes routing over time -->
|
|
12
|
+
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Agent Memory: Release (Release Manager)
|
|
2
|
+
<!-- First 200 lines are loaded into agent context. Keep concise. -->
|
|
3
|
+
|
|
4
|
+
## Project Conventions
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
## Patterns to Watch For
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
## Calibration Log
|
|
11
|
+
<!-- Challenges accepted/overruled — tunes adversarial intensity over time -->
|
|
12
|
+
|