mulch-cli 0.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.
Files changed (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +104 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +33 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/add.d.ts +3 -0
  8. package/dist/commands/add.d.ts.map +1 -0
  9. package/dist/commands/add.js +30 -0
  10. package/dist/commands/add.js.map +1 -0
  11. package/dist/commands/edit.d.ts +3 -0
  12. package/dist/commands/edit.d.ts.map +1 -0
  13. package/dist/commands/edit.js +128 -0
  14. package/dist/commands/edit.js.map +1 -0
  15. package/dist/commands/init.d.ts +3 -0
  16. package/dist/commands/init.d.ts.map +1 -0
  17. package/dist/commands/init.js +20 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/onboard.d.ts +8 -0
  20. package/dist/commands/onboard.d.ts.map +1 -0
  21. package/dist/commands/onboard.js +144 -0
  22. package/dist/commands/onboard.js.map +1 -0
  23. package/dist/commands/prime.d.ts +3 -0
  24. package/dist/commands/prime.d.ts.map +1 -0
  25. package/dist/commands/prime.js +107 -0
  26. package/dist/commands/prime.js.map +1 -0
  27. package/dist/commands/prune.d.ts +3 -0
  28. package/dist/commands/prune.d.ts.map +1 -0
  29. package/dist/commands/prune.js +71 -0
  30. package/dist/commands/prune.js.map +1 -0
  31. package/dist/commands/query.d.ts +3 -0
  32. package/dist/commands/query.d.ts.map +1 -0
  33. package/dist/commands/query.js +58 -0
  34. package/dist/commands/query.js.map +1 -0
  35. package/dist/commands/record.d.ts +3 -0
  36. package/dist/commands/record.d.ts.map +1 -0
  37. package/dist/commands/record.js +206 -0
  38. package/dist/commands/record.js.map +1 -0
  39. package/dist/commands/search.d.ts +3 -0
  40. package/dist/commands/search.d.ts.map +1 -0
  41. package/dist/commands/search.js +80 -0
  42. package/dist/commands/search.js.map +1 -0
  43. package/dist/commands/setup.d.ts +29 -0
  44. package/dist/commands/setup.d.ts.map +1 -0
  45. package/dist/commands/setup.js +497 -0
  46. package/dist/commands/setup.js.map +1 -0
  47. package/dist/commands/status.d.ts +3 -0
  48. package/dist/commands/status.d.ts.map +1 -0
  49. package/dist/commands/status.js +32 -0
  50. package/dist/commands/status.js.map +1 -0
  51. package/dist/commands/validate.d.ts +3 -0
  52. package/dist/commands/validate.d.ts.map +1 -0
  53. package/dist/commands/validate.js +62 -0
  54. package/dist/commands/validate.js.map +1 -0
  55. package/dist/index.d.ts +4 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +2 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/schemas/config.d.ts +17 -0
  60. package/dist/schemas/config.d.ts.map +1 -0
  61. package/dist/schemas/config.js +16 -0
  62. package/dist/schemas/config.js.map +1 -0
  63. package/dist/schemas/index.d.ts +4 -0
  64. package/dist/schemas/index.d.ts.map +1 -0
  65. package/dist/schemas/index.js +2 -0
  66. package/dist/schemas/index.js.map +1 -0
  67. package/dist/schemas/record-schema.d.ts +230 -0
  68. package/dist/schemas/record-schema.d.ts.map +1 -0
  69. package/dist/schemas/record-schema.js +111 -0
  70. package/dist/schemas/record-schema.js.map +1 -0
  71. package/dist/schemas/record.d.ts +49 -0
  72. package/dist/schemas/record.d.ts.map +1 -0
  73. package/dist/schemas/record.js +2 -0
  74. package/dist/schemas/record.js.map +1 -0
  75. package/dist/utils/config.d.ts +11 -0
  76. package/dist/utils/config.d.ts.map +1 -0
  77. package/dist/utils/config.js +83 -0
  78. package/dist/utils/config.js.map +1 -0
  79. package/dist/utils/expertise.d.ts +14 -0
  80. package/dist/utils/expertise.d.ts.map +1 -0
  81. package/dist/utils/expertise.js +107 -0
  82. package/dist/utils/expertise.js.map +1 -0
  83. package/dist/utils/format.d.ts +28 -0
  84. package/dist/utils/format.d.ts.map +1 -0
  85. package/dist/utils/format.js +373 -0
  86. package/dist/utils/format.js.map +1 -0
  87. package/dist/utils/index.d.ts +4 -0
  88. package/dist/utils/index.d.ts.map +1 -0
  89. package/dist/utils/index.js +4 -0
  90. package/dist/utils/index.js.map +1 -0
  91. package/package.json +50 -0
@@ -0,0 +1,497 @@
1
+ import { existsSync } from "node:fs";
2
+ import { readFile, writeFile, mkdir, chmod, unlink } from "node:fs/promises";
3
+ import { join, dirname } from "node:path";
4
+ import chalk from "chalk";
5
+ import { getMulchDir } from "../utils/config.js";
6
+ /** Supported provider names. */
7
+ const SUPPORTED_PROVIDERS = [
8
+ "claude",
9
+ "cursor",
10
+ "codex",
11
+ "gemini",
12
+ "windsurf",
13
+ "aider",
14
+ ];
15
+ function isProvider(value) {
16
+ return SUPPORTED_PROVIDERS.includes(value);
17
+ }
18
+ // ────────────────────────────────────────────────────────────
19
+ // Git hook helpers
20
+ // ────────────────────────────────────────────────────────────
21
+ const HOOK_MARKER_START = "# mulch:start";
22
+ const HOOK_MARKER_END = "# mulch:end";
23
+ const MULCH_HOOK_SECTION = `${HOOK_MARKER_START}
24
+ # Run mulch validate before committing
25
+ if command -v mulch >/dev/null 2>&1; then
26
+ mulch validate
27
+ if [ $? -ne 0 ]; then
28
+ echo "mulch validate failed. Commit aborted."
29
+ exit 1
30
+ fi
31
+ fi
32
+ ${HOOK_MARKER_END}`;
33
+ async function installGitHook(cwd) {
34
+ const gitDir = join(cwd, ".git");
35
+ if (!existsSync(gitDir)) {
36
+ return { success: false, message: "Not a git repository — .git directory not found." };
37
+ }
38
+ const hooksDir = join(gitDir, "hooks");
39
+ await mkdir(hooksDir, { recursive: true });
40
+ const hookPath = join(hooksDir, "pre-commit");
41
+ let content = "";
42
+ if (existsSync(hookPath)) {
43
+ content = await readFile(hookPath, "utf-8");
44
+ if (content.includes(HOOK_MARKER_START)) {
45
+ return { success: true, message: "Git pre-commit hook already installed." };
46
+ }
47
+ }
48
+ if (content) {
49
+ content = content.trimEnd() + "\n\n" + MULCH_HOOK_SECTION + "\n";
50
+ }
51
+ else {
52
+ content = "#!/bin/sh\n\n" + MULCH_HOOK_SECTION + "\n";
53
+ }
54
+ await writeFile(hookPath, content, "utf-8");
55
+ await chmod(hookPath, 0o755);
56
+ return { success: true, message: "Installed mulch pre-commit git hook." };
57
+ }
58
+ async function checkGitHook(cwd) {
59
+ const hookPath = join(cwd, ".git", "hooks", "pre-commit");
60
+ if (!existsSync(hookPath)) {
61
+ return { success: false, message: "Git pre-commit hook not found." };
62
+ }
63
+ const content = await readFile(hookPath, "utf-8");
64
+ if (!content.includes(HOOK_MARKER_START)) {
65
+ return { success: false, message: "Git pre-commit hook exists but has no mulch section." };
66
+ }
67
+ return { success: true, message: "Git pre-commit hook is installed." };
68
+ }
69
+ async function removeGitHook(cwd) {
70
+ const hookPath = join(cwd, ".git", "hooks", "pre-commit");
71
+ if (!existsSync(hookPath)) {
72
+ return { success: true, message: "Git pre-commit hook not found; nothing to remove." };
73
+ }
74
+ const content = await readFile(hookPath, "utf-8");
75
+ if (!content.includes(HOOK_MARKER_START)) {
76
+ return { success: true, message: "No mulch section in pre-commit hook; nothing to remove." };
77
+ }
78
+ const startIdx = content.indexOf(HOOK_MARKER_START);
79
+ const endIdx = content.indexOf(HOOK_MARKER_END);
80
+ const before = content.substring(0, startIdx);
81
+ const after = content.substring(endIdx + HOOK_MARKER_END.length);
82
+ const cleaned = (before + after).replace(/\n{3,}/g, "\n\n").trim();
83
+ // If only the shebang (or nothing) remains, delete the file
84
+ if (!cleaned || cleaned === "#!/bin/sh") {
85
+ await unlink(hookPath);
86
+ return { success: true, message: "Removed mulch pre-commit hook (file deleted)." };
87
+ }
88
+ await writeFile(hookPath, cleaned + "\n", "utf-8");
89
+ return { success: true, message: "Removed mulch section from pre-commit hook." };
90
+ }
91
+ const CLAUDE_HOOK_COMMAND = "mulch prime";
92
+ function claudeSettingsPath(cwd) {
93
+ return join(cwd, ".claude", "settings.json");
94
+ }
95
+ function hasMulchHook(groups) {
96
+ return groups.some((g) => g.hooks.some((h) => h.command === CLAUDE_HOOK_COMMAND));
97
+ }
98
+ function removeMulchHookGroups(groups) {
99
+ return groups.filter((g) => !g.hooks.some((h) => h.command === CLAUDE_HOOK_COMMAND));
100
+ }
101
+ function createMulchHookGroup() {
102
+ return {
103
+ matcher: "",
104
+ hooks: [{ type: "command", command: CLAUDE_HOOK_COMMAND }],
105
+ };
106
+ }
107
+ const claudeRecipe = {
108
+ async install(cwd) {
109
+ const settingsPath = claudeSettingsPath(cwd);
110
+ let settings = {};
111
+ if (existsSync(settingsPath)) {
112
+ const raw = await readFile(settingsPath, "utf-8");
113
+ settings = JSON.parse(raw);
114
+ }
115
+ if (!settings.hooks) {
116
+ settings.hooks = {};
117
+ }
118
+ const events = ["SessionStart", "PreCompact"];
119
+ let alreadyInstalled = true;
120
+ for (const event of events) {
121
+ if (!settings.hooks[event]) {
122
+ settings.hooks[event] = [];
123
+ }
124
+ if (!hasMulchHook(settings.hooks[event])) {
125
+ settings.hooks[event].push(createMulchHookGroup());
126
+ alreadyInstalled = false;
127
+ }
128
+ }
129
+ if (alreadyInstalled) {
130
+ return { success: true, message: "Claude hooks already installed." };
131
+ }
132
+ await mkdir(dirname(settingsPath), { recursive: true });
133
+ await writeFile(settingsPath, JSON.stringify(settings, null, 2) + "\n", "utf-8");
134
+ return { success: true, message: "Installed Claude hooks for SessionStart and PreCompact." };
135
+ },
136
+ async check(cwd) {
137
+ const settingsPath = claudeSettingsPath(cwd);
138
+ if (!existsSync(settingsPath)) {
139
+ return { success: false, message: "Claude settings.json not found." };
140
+ }
141
+ const raw = await readFile(settingsPath, "utf-8");
142
+ const settings = JSON.parse(raw);
143
+ if (!settings.hooks) {
144
+ return { success: false, message: "No hooks configured in Claude settings." };
145
+ }
146
+ const events = ["SessionStart", "PreCompact"];
147
+ const missing = [];
148
+ for (const event of events) {
149
+ if (!settings.hooks[event] || !hasMulchHook(settings.hooks[event])) {
150
+ missing.push(event);
151
+ }
152
+ }
153
+ if (missing.length > 0) {
154
+ return { success: false, message: `Missing hooks for: ${missing.join(", ")}.` };
155
+ }
156
+ return { success: true, message: "Claude hooks are installed and correct." };
157
+ },
158
+ async remove(cwd) {
159
+ const settingsPath = claudeSettingsPath(cwd);
160
+ if (!existsSync(settingsPath)) {
161
+ return { success: true, message: "Claude settings.json not found; nothing to remove." };
162
+ }
163
+ const raw = await readFile(settingsPath, "utf-8");
164
+ const settings = JSON.parse(raw);
165
+ if (!settings.hooks) {
166
+ return { success: true, message: "No hooks in Claude settings; nothing to remove." };
167
+ }
168
+ let removed = false;
169
+ for (const event of Object.keys(settings.hooks)) {
170
+ const before = settings.hooks[event].length;
171
+ settings.hooks[event] = removeMulchHookGroups(settings.hooks[event]);
172
+ if (settings.hooks[event].length < before) {
173
+ removed = true;
174
+ }
175
+ if (settings.hooks[event].length === 0) {
176
+ delete settings.hooks[event];
177
+ }
178
+ }
179
+ if (Object.keys(settings.hooks).length === 0) {
180
+ delete settings.hooks;
181
+ }
182
+ await writeFile(settingsPath, JSON.stringify(settings, null, 2) + "\n", "utf-8");
183
+ return {
184
+ success: true,
185
+ message: removed
186
+ ? "Removed mulch hooks from Claude settings."
187
+ : "No mulch hooks found in Claude settings.",
188
+ };
189
+ },
190
+ };
191
+ // ── Cursor ──────────────────────────────────────────────────
192
+ function cursorRulePath(cwd) {
193
+ return join(cwd, ".cursor", "rules", "mulch.mdc");
194
+ }
195
+ const CURSOR_RULE_CONTENT = `---
196
+ description: Mulch expertise integration
197
+ globs: *
198
+ alwaysApply: true
199
+ ---
200
+
201
+ # Mulch Expertise
202
+
203
+ At the start of every session, run the following command to load project expertise:
204
+
205
+ \`\`\`
206
+ mulch prime
207
+ \`\`\`
208
+
209
+ When you learn something new about this project (conventions, patterns, failures, decisions),
210
+ record it with:
211
+
212
+ \`\`\`
213
+ mulch record <domain> --type <convention|pattern|failure|decision> [options]
214
+ \`\`\`
215
+
216
+ Run \`mulch --help\` for full usage.
217
+ `;
218
+ const cursorRecipe = {
219
+ async install(cwd) {
220
+ const rulePath = cursorRulePath(cwd);
221
+ if (existsSync(rulePath)) {
222
+ const existing = await readFile(rulePath, "utf-8");
223
+ if (existing === CURSOR_RULE_CONTENT) {
224
+ return { success: true, message: "Cursor rule already installed." };
225
+ }
226
+ }
227
+ await mkdir(dirname(rulePath), { recursive: true });
228
+ await writeFile(rulePath, CURSOR_RULE_CONTENT, "utf-8");
229
+ return { success: true, message: "Installed Cursor rule at .cursor/rules/mulch.mdc." };
230
+ },
231
+ async check(cwd) {
232
+ const rulePath = cursorRulePath(cwd);
233
+ if (!existsSync(rulePath)) {
234
+ return { success: false, message: "Cursor rule file not found." };
235
+ }
236
+ const content = await readFile(rulePath, "utf-8");
237
+ if (content !== CURSOR_RULE_CONTENT) {
238
+ return { success: false, message: "Cursor rule file exists but has been modified." };
239
+ }
240
+ return { success: true, message: "Cursor rule is installed and correct." };
241
+ },
242
+ async remove(cwd) {
243
+ const rulePath = cursorRulePath(cwd);
244
+ if (!existsSync(rulePath)) {
245
+ return { success: true, message: "Cursor rule not found; nothing to remove." };
246
+ }
247
+ await unlink(rulePath);
248
+ return { success: true, message: "Removed Cursor rule file." };
249
+ },
250
+ };
251
+ // ── Codex ───────────────────────────────────────────────────
252
+ function codexAgentsPath(cwd) {
253
+ return join(cwd, "AGENTS.md");
254
+ }
255
+ const CODEX_SECTION_MARKER_START = "<!-- mulch:start -->";
256
+ const CODEX_SECTION_MARKER_END = "<!-- mulch:end -->";
257
+ const CODEX_SECTION = `${CODEX_SECTION_MARKER_START}
258
+ ## Mulch Expertise
259
+
260
+ At the start of every session, run \`mulch prime\` to load project expertise.
261
+
262
+ When you learn something new about this project, record it with:
263
+
264
+ \`\`\`
265
+ mulch record <domain> --type <convention|pattern|failure|decision> [options]
266
+ \`\`\`
267
+ ${CODEX_SECTION_MARKER_END}`;
268
+ function hasMulchSection(content) {
269
+ return content.includes(CODEX_SECTION_MARKER_START);
270
+ }
271
+ function removeMulchSection(content) {
272
+ const startIdx = content.indexOf(CODEX_SECTION_MARKER_START);
273
+ const endIdx = content.indexOf(CODEX_SECTION_MARKER_END);
274
+ if (startIdx === -1 || endIdx === -1)
275
+ return content;
276
+ const before = content.substring(0, startIdx);
277
+ const after = content.substring(endIdx + CODEX_SECTION_MARKER_END.length);
278
+ // Clean up extra newlines left behind
279
+ return (before + after).replace(/\n{3,}/g, "\n\n").trim() + "\n";
280
+ }
281
+ const codexRecipe = {
282
+ async install(cwd) {
283
+ const agentsPath = codexAgentsPath(cwd);
284
+ let content = "";
285
+ if (existsSync(agentsPath)) {
286
+ content = await readFile(agentsPath, "utf-8");
287
+ if (hasMulchSection(content)) {
288
+ return { success: true, message: "AGENTS.md already contains mulch section." };
289
+ }
290
+ }
291
+ const newContent = content
292
+ ? content.trimEnd() + "\n\n" + CODEX_SECTION + "\n"
293
+ : CODEX_SECTION + "\n";
294
+ await writeFile(agentsPath, newContent, "utf-8");
295
+ return { success: true, message: "Added mulch section to AGENTS.md." };
296
+ },
297
+ async check(cwd) {
298
+ const agentsPath = codexAgentsPath(cwd);
299
+ if (!existsSync(agentsPath)) {
300
+ return { success: false, message: "AGENTS.md not found." };
301
+ }
302
+ const content = await readFile(agentsPath, "utf-8");
303
+ if (!hasMulchSection(content)) {
304
+ return { success: false, message: "AGENTS.md exists but has no mulch section." };
305
+ }
306
+ return { success: true, message: "AGENTS.md contains mulch section." };
307
+ },
308
+ async remove(cwd) {
309
+ const agentsPath = codexAgentsPath(cwd);
310
+ if (!existsSync(agentsPath)) {
311
+ return { success: true, message: "AGENTS.md not found; nothing to remove." };
312
+ }
313
+ const content = await readFile(agentsPath, "utf-8");
314
+ if (!hasMulchSection(content)) {
315
+ return { success: true, message: "No mulch section in AGENTS.md; nothing to remove." };
316
+ }
317
+ const cleaned = removeMulchSection(content);
318
+ await writeFile(agentsPath, cleaned, "utf-8");
319
+ return { success: true, message: "Removed mulch section from AGENTS.md." };
320
+ },
321
+ };
322
+ function createMarkdownRecipe(config) {
323
+ const MARKER_START = "<!-- mulch:start -->";
324
+ const MARKER_END = "<!-- mulch:end -->";
325
+ const section = `${MARKER_START}
326
+ ## Mulch Expertise
327
+
328
+ At the start of every session, run \`mulch prime\` to load project expertise.
329
+
330
+ When you learn something new about this project, record it with:
331
+
332
+ \`\`\`
333
+ mulch record <domain> --type <convention|pattern|failure|decision> [options]
334
+ \`\`\`
335
+ ${MARKER_END}`;
336
+ return {
337
+ async install(cwd) {
338
+ const filePath = config.filePath(cwd);
339
+ let content = "";
340
+ if (existsSync(filePath)) {
341
+ content = await readFile(filePath, "utf-8");
342
+ if (content.includes(MARKER_START)) {
343
+ return { success: true, message: `${config.fileName} already contains mulch section.` };
344
+ }
345
+ }
346
+ const newContent = content
347
+ ? content.trimEnd() + "\n\n" + section + "\n"
348
+ : section + "\n";
349
+ await mkdir(dirname(filePath), { recursive: true });
350
+ await writeFile(filePath, newContent, "utf-8");
351
+ return { success: true, message: `Added mulch section to ${config.fileName}.` };
352
+ },
353
+ async check(cwd) {
354
+ const filePath = config.filePath(cwd);
355
+ if (!existsSync(filePath)) {
356
+ return { success: false, message: `${config.fileName} not found.` };
357
+ }
358
+ const content = await readFile(filePath, "utf-8");
359
+ if (!content.includes(MARKER_START)) {
360
+ return { success: false, message: `${config.fileName} exists but has no mulch section.` };
361
+ }
362
+ return { success: true, message: `${config.fileName} contains mulch section.` };
363
+ },
364
+ async remove(cwd) {
365
+ const filePath = config.filePath(cwd);
366
+ if (!existsSync(filePath)) {
367
+ return { success: true, message: `${config.fileName} not found; nothing to remove.` };
368
+ }
369
+ const content = await readFile(filePath, "utf-8");
370
+ if (!content.includes(MARKER_START)) {
371
+ return { success: true, message: `No mulch section in ${config.fileName}; nothing to remove.` };
372
+ }
373
+ const startIdx = content.indexOf(MARKER_START);
374
+ const endIdx = content.indexOf(MARKER_END);
375
+ const before = content.substring(0, startIdx);
376
+ const after = content.substring(endIdx + MARKER_END.length);
377
+ const cleaned = (before + after).replace(/\n{3,}/g, "\n\n").trim() + "\n";
378
+ await writeFile(filePath, cleaned, "utf-8");
379
+ return { success: true, message: `Removed mulch section from ${config.fileName}.` };
380
+ },
381
+ };
382
+ }
383
+ const geminiRecipe = createMarkdownRecipe({
384
+ filePath: (cwd) => join(cwd, ".gemini", "settings.md"),
385
+ fileName: ".gemini/settings.md",
386
+ });
387
+ const windsurfRecipe = createMarkdownRecipe({
388
+ filePath: (cwd) => join(cwd, ".windsurf", "rules.md"),
389
+ fileName: ".windsurf/rules.md",
390
+ });
391
+ const aiderRecipe = createMarkdownRecipe({
392
+ filePath: (cwd) => join(cwd, ".aider.conf.md"),
393
+ fileName: ".aider.conf.md",
394
+ });
395
+ // ── Recipe registry ─────────────────────────────────────────
396
+ const recipes = {
397
+ claude: claudeRecipe,
398
+ cursor: cursorRecipe,
399
+ codex: codexRecipe,
400
+ gemini: geminiRecipe,
401
+ windsurf: windsurfRecipe,
402
+ aider: aiderRecipe,
403
+ };
404
+ // ── Exported helpers for testing ────────────────────────────
405
+ export { recipes, SUPPORTED_PROVIDERS, CURSOR_RULE_CONTENT, CODEX_SECTION, CLAUDE_HOOK_COMMAND, MULCH_HOOK_SECTION, installGitHook, checkGitHook, removeGitHook, };
406
+ // ── Command registration ────────────────────────────────────
407
+ export function registerSetupCommand(program) {
408
+ program
409
+ .command("setup")
410
+ .argument("[provider]", `agent provider (${SUPPORTED_PROVIDERS.join(", ")})`)
411
+ .description("Set up mulch integration for a specific agent provider")
412
+ .option("--check", "verify provider integration is installed")
413
+ .option("--remove", "remove provider integration")
414
+ .option("--hooks", "install a pre-commit git hook running mulch validate")
415
+ .action(async (provider, options) => {
416
+ // Verify .mulch/ exists
417
+ const mulchDir = getMulchDir();
418
+ if (!existsSync(mulchDir)) {
419
+ console.error(chalk.red("Error: No .mulch/ directory found. Run `mulch init` first."));
420
+ process.exitCode = 1;
421
+ return;
422
+ }
423
+ if (!provider && !options.hooks) {
424
+ console.error(chalk.red("Error: specify a provider or use --hooks."));
425
+ process.exitCode = 1;
426
+ return;
427
+ }
428
+ // Handle --hooks
429
+ if (options.hooks) {
430
+ const cwd = process.cwd();
431
+ let hookResult;
432
+ if (options.check) {
433
+ hookResult = await checkGitHook(cwd);
434
+ }
435
+ else if (options.remove) {
436
+ hookResult = await removeGitHook(cwd);
437
+ }
438
+ else {
439
+ hookResult = await installGitHook(cwd);
440
+ }
441
+ if (hookResult.success) {
442
+ console.log(chalk.green(`\u2714 ${hookResult.message}`));
443
+ }
444
+ else {
445
+ console.error(chalk.red(`\u2716 ${hookResult.message}`));
446
+ process.exitCode = 1;
447
+ }
448
+ // If no provider, stop here
449
+ if (!provider)
450
+ return;
451
+ }
452
+ // Handle provider
453
+ if (!provider)
454
+ return;
455
+ if (!isProvider(provider)) {
456
+ console.error(chalk.red(`Error: unknown provider "${provider}".`));
457
+ console.error(chalk.red(`Supported providers: ${SUPPORTED_PROVIDERS.join(", ")}`));
458
+ process.exitCode = 1;
459
+ return;
460
+ }
461
+ {
462
+ const recipe = recipes[provider];
463
+ if (options.check) {
464
+ const result = await recipe.check(process.cwd());
465
+ if (result.success) {
466
+ console.log(chalk.green(`\u2714 ${result.message}`));
467
+ }
468
+ else {
469
+ console.log(chalk.yellow(`\u2716 ${result.message}`));
470
+ process.exitCode = 1;
471
+ }
472
+ return;
473
+ }
474
+ if (options.remove) {
475
+ const result = await recipe.remove(process.cwd());
476
+ if (result.success) {
477
+ console.log(chalk.green(`\u2714 ${result.message}`));
478
+ }
479
+ else {
480
+ console.error(chalk.red(`Error: ${result.message}`));
481
+ process.exitCode = 1;
482
+ }
483
+ return;
484
+ }
485
+ // Default: install
486
+ const result = await recipe.install(process.cwd());
487
+ if (result.success) {
488
+ console.log(chalk.green(`\u2714 ${result.message}`));
489
+ }
490
+ else {
491
+ console.error(chalk.red(`Error: ${result.message}`));
492
+ process.exitCode = 1;
493
+ }
494
+ }
495
+ });
496
+ }
497
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerStatusCommand(program: Command): void;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiC5D"}
@@ -0,0 +1,32 @@
1
+ import { existsSync } from "node:fs";
2
+ import chalk from "chalk";
3
+ import { getMulchDir, readConfig, getExpertisePath } from "../utils/config.js";
4
+ import { readExpertiseFile, countRecords, getFileModTime } from "../utils/expertise.js";
5
+ import { formatStatusOutput } from "../utils/format.js";
6
+ export function registerStatusCommand(program) {
7
+ program
8
+ .command("status")
9
+ .description("Show status of expertise records")
10
+ .action(async () => {
11
+ const mulchDir = getMulchDir();
12
+ if (!existsSync(mulchDir)) {
13
+ console.error(chalk.red("No .mulch/ directory found. Run `mulch init` first."));
14
+ process.exitCode = 1;
15
+ return;
16
+ }
17
+ const config = await readConfig();
18
+ const domainStats = await Promise.all(config.domains.map(async (domain) => {
19
+ const filePath = getExpertisePath(domain);
20
+ const records = await readExpertiseFile(filePath);
21
+ const lastUpdated = await getFileModTime(filePath);
22
+ return {
23
+ domain,
24
+ count: countRecords(records),
25
+ lastUpdated,
26
+ };
27
+ }));
28
+ const output = formatStatusOutput(domainStats, config.governance);
29
+ console.log(output);
30
+ });
31
+ }
32
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAE/B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CACjE,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAElC,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CACnC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAClC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAClD,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;YACnD,OAAO;gBACL,MAAM;gBACN,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC;gBAC5B,WAAW;aACZ,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerValidateCommand(program: Command): void;
3
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0E9D"}
@@ -0,0 +1,62 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import _Ajv from "ajv";
3
+ const Ajv = _Ajv.default ?? _Ajv;
4
+ import chalk from "chalk";
5
+ import { readConfig, getExpertisePath } from "../utils/config.js";
6
+ import { recordSchema } from "../schemas/record-schema.js";
7
+ export function registerValidateCommand(program) {
8
+ program
9
+ .command("validate")
10
+ .description("Validate expertise records against schemas")
11
+ .action(async () => {
12
+ const config = await readConfig();
13
+ const domains = config.domains;
14
+ const ajv = new Ajv();
15
+ const validate = ajv.compile(recordSchema);
16
+ let totalRecords = 0;
17
+ let totalErrors = 0;
18
+ for (const domain of domains) {
19
+ const filePath = getExpertisePath(domain);
20
+ let content;
21
+ try {
22
+ content = await readFile(filePath, "utf-8");
23
+ }
24
+ catch {
25
+ // File doesn't exist yet, skip
26
+ continue;
27
+ }
28
+ const lines = content.split("\n");
29
+ for (let i = 0; i < lines.length; i++) {
30
+ const line = lines[i].trim();
31
+ if (line.length === 0)
32
+ continue;
33
+ totalRecords++;
34
+ const lineNumber = i + 1;
35
+ let parsed;
36
+ try {
37
+ parsed = JSON.parse(line);
38
+ }
39
+ catch {
40
+ totalErrors++;
41
+ console.error(chalk.red(`${domain}:${lineNumber} - Invalid JSON: failed to parse`));
42
+ continue;
43
+ }
44
+ if (!validate(parsed)) {
45
+ totalErrors++;
46
+ console.error(chalk.red(`${domain}:${lineNumber} - Schema validation failed:`));
47
+ for (const err of validate.errors ?? []) {
48
+ console.error(chalk.red(` ${err.instancePath} ${err.message}`));
49
+ }
50
+ }
51
+ }
52
+ }
53
+ if (totalErrors > 0) {
54
+ console.log(chalk.red(`${totalRecords} records validated, ${totalErrors} errors found`));
55
+ process.exit(1);
56
+ }
57
+ else {
58
+ console.log(chalk.green(`${totalRecords} records validated, ${totalErrors} errors found`));
59
+ }
60
+ });
61
+ }
62
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type { RecordType, Classification, Evidence, ConventionRecord, PatternRecord, FailureRecord, DecisionRecord, ExpertiseRecord, } from "./schemas/index.js";
2
+ export type { MulchConfig } from "./schemas/index.js";
3
+ export { DEFAULT_CONFIG } from "./schemas/index.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}