@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.
Files changed (46) hide show
  1. package/README.md +128 -0
  2. package/bin/dev-team.js +1 -21
  3. package/dist/bin/dev-team.d.ts +1 -0
  4. package/dist/bin/dev-team.js +36 -0
  5. package/dist/bin/dev-team.js.map +1 -0
  6. package/dist/create-agent.d.ts +1 -0
  7. package/dist/create-agent.js +106 -0
  8. package/dist/create-agent.js.map +1 -0
  9. package/dist/files.d.ts +51 -0
  10. package/dist/files.js +155 -0
  11. package/dist/files.js.map +1 -0
  12. package/dist/init.d.ts +24 -0
  13. package/dist/init.js +358 -0
  14. package/dist/init.js.map +1 -0
  15. package/dist/prompts.d.ts +25 -0
  16. package/dist/prompts.js +109 -0
  17. package/dist/prompts.js.map +1 -0
  18. package/dist/scan.d.ts +15 -0
  19. package/dist/scan.js +187 -0
  20. package/dist/scan.js.map +1 -0
  21. package/dist/update.d.ts +5 -0
  22. package/dist/update.js +229 -0
  23. package/dist/update.js.map +1 -0
  24. package/package.json +30 -9
  25. package/templates/CLAUDE.md +21 -0
  26. package/templates/agent-memory/dev-team-architect/MEMORY.md +12 -0
  27. package/templates/agent-memory/dev-team-docs/MEMORY.md +12 -0
  28. package/templates/agent-memory/dev-team-lead/MEMORY.md +12 -0
  29. package/templates/agent-memory/dev-team-release/MEMORY.md +12 -0
  30. package/templates/agents/dev-team-architect.md +62 -0
  31. package/templates/agents/dev-team-deming.md +2 -1
  32. package/templates/agents/dev-team-docs.md +63 -0
  33. package/templates/agents/dev-team-lead.md +95 -0
  34. package/templates/agents/dev-team-release.md +65 -0
  35. package/templates/hooks/dev-team-post-change-review.js +63 -10
  36. package/templates/hooks/dev-team-pre-commit-gate.js +43 -14
  37. package/templates/hooks/dev-team-safety-guard.js +21 -11
  38. package/templates/hooks/dev-team-task-loop.js +17 -9
  39. package/templates/hooks/dev-team-tdd-enforce.js +42 -23
  40. package/templates/hooks/dev-team-watch-list.js +84 -0
  41. package/templates/settings.json +4 -0
  42. package/templates/skills/dev-team-audit/SKILL.md +85 -0
  43. package/templates/skills/dev-team-review/SKILL.md +68 -0
  44. package/lib/files.js +0 -160
  45. package/lib/init.js +0 -206
  46. 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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
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
+ */
5
+ export declare function update(targetDir: string): Promise<void>;
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.1.2",
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
- "lib/",
12
+ "dist/",
11
13
  "templates/"
12
14
  ],
13
15
  "scripts": {
14
- "test": "node --test tests/unit/files.test.js tests/integration/fresh-project.test.js tests/integration/idempotency.test.js",
15
- "test:unit": "node --test tests/unit/files.test.js",
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": "eslint bin/ lib/ templates/hooks/",
19
- "format:check": "prettier --check .",
20
- "validate:agents": "node scripts/validate-agents.js"
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
  }
@@ -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
+