mulch-cli 0.1.0 → 0.2.1

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 (96) hide show
  1. package/README.md +29 -8
  2. package/dist/cli.js +15 -2
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/add.d.ts.map +1 -1
  5. package/dist/commands/add.js +20 -3
  6. package/dist/commands/add.js.map +1 -1
  7. package/dist/commands/compact.d.ts +3 -0
  8. package/dist/commands/compact.d.ts.map +1 -0
  9. package/dist/commands/compact.js +364 -0
  10. package/dist/commands/compact.js.map +1 -0
  11. package/dist/commands/delete.d.ts +3 -0
  12. package/dist/commands/delete.d.ts.map +1 -0
  13. package/dist/commands/delete.js +110 -0
  14. package/dist/commands/delete.js.map +1 -0
  15. package/dist/commands/doctor.d.ts +3 -0
  16. package/dist/commands/doctor.d.ts.map +1 -0
  17. package/dist/commands/doctor.js +364 -0
  18. package/dist/commands/doctor.js.map +1 -0
  19. package/dist/commands/edit.d.ts.map +1 -1
  20. package/dist/commands/edit.js +103 -22
  21. package/dist/commands/edit.js.map +1 -1
  22. package/dist/commands/init.d.ts.map +1 -1
  23. package/dist/commands/init.js +11 -1
  24. package/dist/commands/init.js.map +1 -1
  25. package/dist/commands/learn.d.ts +12 -0
  26. package/dist/commands/learn.d.ts.map +1 -0
  27. package/dist/commands/learn.js +130 -0
  28. package/dist/commands/learn.js.map +1 -0
  29. package/dist/commands/onboard.d.ts +1 -0
  30. package/dist/commands/onboard.d.ts.map +1 -1
  31. package/dist/commands/onboard.js +41 -50
  32. package/dist/commands/onboard.js.map +1 -1
  33. package/dist/commands/prime.d.ts.map +1 -1
  34. package/dist/commands/prime.js +75 -17
  35. package/dist/commands/prime.js.map +1 -1
  36. package/dist/commands/prune.d.ts +5 -0
  37. package/dist/commands/prune.d.ts.map +1 -1
  38. package/dist/commands/prune.js +16 -4
  39. package/dist/commands/prune.js.map +1 -1
  40. package/dist/commands/query.d.ts.map +1 -1
  41. package/dist/commands/query.js +56 -15
  42. package/dist/commands/query.js.map +1 -1
  43. package/dist/commands/ready.d.ts +3 -0
  44. package/dist/commands/ready.d.ts.map +1 -0
  45. package/dist/commands/ready.js +160 -0
  46. package/dist/commands/ready.js.map +1 -0
  47. package/dist/commands/record.d.ts.map +1 -1
  48. package/dist/commands/record.js +137 -23
  49. package/dist/commands/record.js.map +1 -1
  50. package/dist/commands/search.d.ts.map +1 -1
  51. package/dist/commands/search.js +76 -26
  52. package/dist/commands/search.js.map +1 -1
  53. package/dist/commands/setup.d.ts +2 -2
  54. package/dist/commands/setup.d.ts.map +1 -1
  55. package/dist/commands/setup.js +77 -33
  56. package/dist/commands/setup.js.map +1 -1
  57. package/dist/commands/status.d.ts.map +1 -1
  58. package/dist/commands/status.js +24 -3
  59. package/dist/commands/status.js.map +1 -1
  60. package/dist/commands/sync.d.ts +3 -0
  61. package/dist/commands/sync.d.ts.map +1 -0
  62. package/dist/commands/sync.js +176 -0
  63. package/dist/commands/sync.js.map +1 -0
  64. package/dist/commands/validate.d.ts.map +1 -1
  65. package/dist/commands/validate.js +30 -6
  66. package/dist/commands/validate.js.map +1 -1
  67. package/dist/schemas/record-schema.d.ts +108 -0
  68. package/dist/schemas/record-schema.d.ts.map +1 -1
  69. package/dist/schemas/record-schema.js +19 -0
  70. package/dist/schemas/record-schema.js.map +1 -1
  71. package/dist/schemas/record.d.ts +3 -0
  72. package/dist/schemas/record.d.ts.map +1 -1
  73. package/dist/utils/config.d.ts +1 -1
  74. package/dist/utils/config.d.ts.map +1 -1
  75. package/dist/utils/config.js +4 -4
  76. package/dist/utils/expertise.d.ts +1 -0
  77. package/dist/utils/expertise.d.ts.map +1 -1
  78. package/dist/utils/expertise.js +33 -0
  79. package/dist/utils/expertise.js.map +1 -1
  80. package/dist/utils/format.d.ts +2 -0
  81. package/dist/utils/format.d.ts.map +1 -1
  82. package/dist/utils/format.js +76 -19
  83. package/dist/utils/format.js.map +1 -1
  84. package/dist/utils/git.d.ts +6 -0
  85. package/dist/utils/git.d.ts.map +1 -0
  86. package/dist/utils/git.js +81 -0
  87. package/dist/utils/git.js.map +1 -0
  88. package/dist/utils/index.d.ts +4 -2
  89. package/dist/utils/index.d.ts.map +1 -1
  90. package/dist/utils/index.js +4 -2
  91. package/dist/utils/index.js.map +1 -1
  92. package/dist/utils/json-output.d.ts +8 -0
  93. package/dist/utils/json-output.d.ts.map +1 -0
  94. package/dist/utils/json-output.js +7 -0
  95. package/dist/utils/json-output.js.map +1 -0
  96. package/package.json +2 -2
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Mulch — Growing Expertise for Coding Agents
1
+ # Mulch — Let your agents grow 🌱
2
2
 
3
3
  Structured expertise files that accumulate over time, live in git, work with any agent, and run locally with zero dependencies.
4
4
 
@@ -6,10 +6,22 @@ Agents start every session from zero. The pattern your agent discovered yesterda
6
6
 
7
7
  **Mulch is a passive layer.** It does not contain an LLM. Agents use Mulch — Mulch does not use agents.
8
8
 
9
+ ## Install
10
+
11
+ ```bash
12
+ npm install -g mulch-cli
13
+ ```
14
+
15
+ Or use directly with npx — no install required:
16
+
17
+ ```bash
18
+ npx mulch-cli <command>
19
+ ```
20
+
9
21
  ## Quick Start
10
22
 
11
23
  ```bash
12
- npx mulch-cli init # Create .mulch/ in your project
24
+ mulch init # Create .mulch/ in your project
13
25
  mulch add database # Add a domain
14
26
  mulch record database --type convention "Use WAL mode for SQLite"
15
27
  mulch record database --type failure \
@@ -51,15 +63,22 @@ Everything is git-tracked. Clone a repo and your agents immediately have the pro
51
63
  |---------|-------------|
52
64
  | `mulch init` | Initialize `.mulch/` in the current project |
53
65
  | `mulch add <domain>` | Add a new expertise domain |
54
- | `mulch record <domain> --type <type>` | Record an expertise entry |
66
+ | `mulch record <domain> --type <type>` | Record an expertise record (`--tags`, `--force`, `--relates-to`, `--supersedes`) |
67
+ | `mulch edit <domain> <id>` | Edit an existing record by ID or 1-based index |
68
+ | `mulch delete <domain> <id>` | Delete a record by ID or 1-based index |
55
69
  | `mulch query [domain]` | Query expertise (use `--all` for all domains) |
56
- | `mulch prime [domain]` | Output AI-optimized expertise context (optionally scoped) |
57
- | `mulch search <query>` | Search records across domains (`--domain`, `--type` filters) |
70
+ | `mulch prime [domains...]` | Output AI-optimized expertise context (multi-domain, `--context`, `--format`, `--export`) |
71
+ | `mulch search [query]` | Search records across domains (`--domain`, `--type`, `--tag` filters) |
72
+ | `mulch compact [domain]` | Analyze compaction candidates or apply a compaction (`--analyze`, `--apply`) |
58
73
  | `mulch status` | Show expertise freshness and counts |
59
74
  | `mulch validate` | Schema validation across all files |
60
- | `mulch setup <provider>` | Install provider-specific hooks |
75
+ | `mulch doctor` | Run health checks on expertise records (`--fix` to auto-fix) |
76
+ | `mulch setup [provider]` | Install provider-specific hooks (claude, cursor, codex, gemini, windsurf, aider) |
61
77
  | `mulch onboard` | Generate AGENTS.md/CLAUDE.md snippet |
62
- | `mulch prune` | Remove stale tactical entries |
78
+ | `mulch prune` | Remove stale tactical/observational entries |
79
+ | `mulch ready` | Show recently added or updated records (`--since`, `--domain`, `--limit`) |
80
+ | `mulch sync` | Validate, stage, and commit `.mulch/` changes |
81
+ | `mulch learn` | Show changed files and suggest domains for recording learnings |
63
82
 
64
83
  ## Record Types
65
84
 
@@ -69,8 +88,10 @@ Everything is git-tracked. Clone a repo and your agents immediately have the pro
69
88
  | `pattern` | name, description | Named patterns with optional file references |
70
89
  | `failure` | description, resolution | What went wrong and how to avoid it |
71
90
  | `decision` | title, rationale | Architectural decisions and their reasoning |
91
+ | `reference` | name, description | Key files, endpoints, or resources worth remembering |
92
+ | `guide` | name, description | Step-by-step procedures for recurring tasks |
72
93
 
73
- All records support optional `--classification` (foundational / tactical / observational) and evidence flags (`--evidence-commit`, `--evidence-issue`, `--evidence-file`).
94
+ All records support optional `--classification` (foundational / tactical / observational), evidence flags (`--evidence-commit`, `--evidence-issue`, `--evidence-file`), `--tags`, `--relates-to`, and `--supersedes` for linking.
74
95
 
75
96
  ## Example Output
76
97
 
package/dist/cli.js CHANGED
@@ -12,11 +12,18 @@ import { registerStatusCommand } from "./commands/status.js";
12
12
  import { registerValidateCommand } from "./commands/validate.js";
13
13
  import { registerPruneCommand } from "./commands/prune.js";
14
14
  import { registerSearchCommand } from "./commands/search.js";
15
+ import { registerDoctorCommand } from "./commands/doctor.js";
16
+ import { registerReadyCommand } from "./commands/ready.js";
17
+ import { registerSyncCommand } from "./commands/sync.js";
18
+ import { registerDeleteCommand } from "./commands/delete.js";
19
+ import { registerLearnCommand } from "./commands/learn.js";
20
+ import { registerCompactCommand } from "./commands/compact.js";
15
21
  const program = new Command();
16
22
  program
17
23
  .name("mulch")
18
- .description("Growing Expertise for Coding Agents")
19
- .version("0.1.0");
24
+ .description("Let your agents grow 🌱")
25
+ .version("0.2.1")
26
+ .option("--json", "output as structured JSON");
20
27
  registerInitCommand(program);
21
28
  registerAddCommand(program);
22
29
  registerRecordCommand(program);
@@ -29,5 +36,11 @@ registerStatusCommand(program);
29
36
  registerValidateCommand(program);
30
37
  registerPruneCommand(program);
31
38
  registerSearchCommand(program);
39
+ registerDoctorCommand(program);
40
+ registerReadyCommand(program);
41
+ registerSyncCommand(program);
42
+ registerDeleteCommand(program);
43
+ registerLearnCommand(program);
44
+ registerCompactCommand(program);
32
45
  program.parse();
33
46
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,qCAAqC,CAAC;KAClD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAE/B,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,yBAAyB,CAAC;KACtC,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,QAAQ,EAAE,2BAA2B,CAAC,CAAC;AAEjD,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAEhC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkCzD"}
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+CzD"}
@@ -2,21 +2,33 @@ import { existsSync } from "node:fs";
2
2
  import chalk from "chalk";
3
3
  import { getMulchDir, readConfig, writeConfig, getExpertisePath } from "../utils/config.js";
4
4
  import { createExpertiseFile } from "../utils/expertise.js";
5
+ import { outputJson, outputJsonError } from "../utils/json-output.js";
5
6
  export function registerAddCommand(program) {
6
7
  program
7
8
  .command("add")
8
9
  .argument("<domain>", "expertise domain to add")
9
10
  .description("Add a new expertise domain")
10
11
  .action(async (domain) => {
12
+ const jsonMode = program.opts().json === true;
11
13
  const mulchDir = getMulchDir();
12
14
  if (!existsSync(mulchDir)) {
13
- console.error(chalk.red("No .mulch/ directory found. Run `mulch init` first."));
15
+ if (jsonMode) {
16
+ outputJsonError("add", "No .mulch/ directory found. Run `mulch init` first.");
17
+ }
18
+ else {
19
+ console.error(chalk.red("No .mulch/ directory found. Run `mulch init` first."));
20
+ }
14
21
  process.exitCode = 1;
15
22
  return;
16
23
  }
17
24
  const config = await readConfig();
18
25
  if (config.domains.includes(domain)) {
19
- console.error(chalk.red(`Domain "${domain}" already exists.`));
26
+ if (jsonMode) {
27
+ outputJsonError("add", `Domain "${domain}" already exists.`);
28
+ }
29
+ else {
30
+ console.error(chalk.red(`Domain "${domain}" already exists.`));
31
+ }
20
32
  process.exitCode = 1;
21
33
  return;
22
34
  }
@@ -24,7 +36,12 @@ export function registerAddCommand(program) {
24
36
  await createExpertiseFile(expertisePath);
25
37
  config.domains.push(domain);
26
38
  await writeConfig(config);
27
- console.log(chalk.green(`Added domain "${domain}".`));
39
+ if (jsonMode) {
40
+ outputJson({ success: true, command: "add", domain });
41
+ }
42
+ else {
43
+ console.log(chalk.green(`Added domain "${domain}".`));
44
+ }
28
45
  });
29
46
  }
30
47
  //# sourceMappingURL=add.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,UAAU,EAAE,yBAAyB,CAAC;SAC/C,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,EAAE;QAC/B,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,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,WAAW,MAAM,mBAAmB,CAAC,CAChD,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,mBAAmB,CAAC,aAAa,CAAC,CAAC;QAEzC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QAE1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,MAAM,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAEtE,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,UAAU,EAAE,yBAAyB,CAAC;SAC/C,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,EAAE;QAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;QAC9C,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAE/B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,IAAI,QAAQ,EAAE,CAAC;gBACb,eAAe,CAAC,KAAK,EAAE,qDAAqD,CAAC,CAAC;YAChF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CACjE,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAElC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,IAAI,QAAQ,EAAE,CAAC;gBACb,eAAe,CAAC,KAAK,EAAE,WAAW,MAAM,mBAAmB,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,WAAW,MAAM,mBAAmB,CAAC,CAChD,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,mBAAmB,CAAC,aAAa,CAAC,CAAC;QAEzC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QAE1B,IAAI,QAAQ,EAAE,CAAC;YACb,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,MAAM,IAAI,CAAC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerCompactCommand(program: Command): void;
3
+ //# sourceMappingURL=compact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compact.d.ts","sourceRoot":"","sources":["../../src/commands/compact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+FpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+C7D"}
@@ -0,0 +1,364 @@
1
+ import chalk from "chalk";
2
+ import { readConfig, getExpertisePath } from "../utils/config.js";
3
+ import { readExpertiseFile, writeExpertiseFile, generateRecordId, } from "../utils/expertise.js";
4
+ import { recordSchema } from "../schemas/record-schema.js";
5
+ import { outputJson, outputJsonError } from "../utils/json-output.js";
6
+ import { getRecordSummary } from "../utils/format.js";
7
+ import _Ajv from "ajv";
8
+ const Ajv = _Ajv.default ?? _Ajv;
9
+ function findCandidates(domain, records, now, shelfLife) {
10
+ // Group records by type
11
+ const byType = new Map();
12
+ for (let i = 0; i < records.length; i++) {
13
+ const r = records[i];
14
+ if (!byType.has(r.type)) {
15
+ byType.set(r.type, []);
16
+ }
17
+ byType.get(r.type).push({ index: i + 1, record: r });
18
+ }
19
+ const candidates = [];
20
+ for (const [type, group] of byType) {
21
+ if (group.length < 2)
22
+ continue;
23
+ // Include groups where at least one record is stale or the group is large (3+)
24
+ const hasStale = group.some((g) => {
25
+ if (g.record.classification === "foundational")
26
+ return false;
27
+ const ageMs = now.getTime() - new Date(g.record.recorded_at).getTime();
28
+ const ageDays = Math.floor(ageMs / (1000 * 60 * 60 * 24));
29
+ if (g.record.classification === "tactical")
30
+ return ageDays > shelfLife.tactical;
31
+ if (g.record.classification === "observational")
32
+ return ageDays > shelfLife.observational;
33
+ return false;
34
+ });
35
+ if (hasStale || group.length >= 3) {
36
+ candidates.push({
37
+ domain,
38
+ type,
39
+ records: group.map((g) => ({
40
+ index: g.index,
41
+ id: g.record.id,
42
+ summary: getRecordSummary(g.record),
43
+ recorded_at: g.record.recorded_at,
44
+ })),
45
+ });
46
+ }
47
+ }
48
+ return candidates;
49
+ }
50
+ function resolveRecordIndices(records, identifiers) {
51
+ const indices = [];
52
+ for (const id of identifiers) {
53
+ if (id.startsWith("mx-")) {
54
+ const found = records.findIndex((r) => r.id === id);
55
+ if (found === -1) {
56
+ throw new Error(`Record with ID "${id}" not found.`);
57
+ }
58
+ indices.push(found);
59
+ }
60
+ else {
61
+ const idx = parseInt(id, 10);
62
+ if (isNaN(idx) || idx < 1 || idx > records.length) {
63
+ throw new Error(`Invalid index "${id}". Must be 1-${records.length}.`);
64
+ }
65
+ indices.push(idx - 1);
66
+ }
67
+ }
68
+ return indices;
69
+ }
70
+ export function registerCompactCommand(program) {
71
+ program
72
+ .command("compact")
73
+ .argument("[domain]", "expertise domain (required for --apply)")
74
+ .description("Compact records: analyze candidates or apply a compaction")
75
+ .option("--analyze", "show compaction candidates")
76
+ .option("--apply", "apply a compaction (replace records with summary)")
77
+ .option("--records <ids>", "comma-separated record IDs or indices to compact")
78
+ .option("--type <type>", "record type for the replacement")
79
+ .option("--name <name>", "name for replacement (pattern/reference/guide)")
80
+ .option("--title <title>", "title for replacement (decision)")
81
+ .option("--description <description>", "description for replacement")
82
+ .option("--content <content>", "content for replacement (convention)")
83
+ .option("--resolution <resolution>", "resolution for replacement (failure)")
84
+ .option("--rationale <rationale>", "rationale for replacement (decision)")
85
+ .action(async (domain, options) => {
86
+ const jsonMode = program.opts().json === true;
87
+ if (options.analyze) {
88
+ await handleAnalyze(jsonMode);
89
+ }
90
+ else if (options.apply) {
91
+ if (!domain) {
92
+ const msg = "Domain is required for --apply.";
93
+ if (jsonMode) {
94
+ outputJsonError("compact", msg);
95
+ }
96
+ else {
97
+ console.error(chalk.red(`Error: ${msg}`));
98
+ }
99
+ process.exitCode = 1;
100
+ return;
101
+ }
102
+ await handleApply(domain, options, jsonMode);
103
+ }
104
+ else {
105
+ const msg = "Specify --analyze or --apply.";
106
+ if (jsonMode) {
107
+ outputJsonError("compact", msg);
108
+ }
109
+ else {
110
+ console.error(chalk.red(`Error: ${msg}`));
111
+ }
112
+ process.exitCode = 1;
113
+ }
114
+ });
115
+ }
116
+ async function handleAnalyze(jsonMode) {
117
+ const config = await readConfig();
118
+ const now = new Date();
119
+ const shelfLife = config.classification_defaults.shelf_life;
120
+ const allCandidates = [];
121
+ for (const domain of config.domains) {
122
+ const filePath = getExpertisePath(domain);
123
+ const records = await readExpertiseFile(filePath);
124
+ if (records.length < 2)
125
+ continue;
126
+ const candidates = findCandidates(domain, records, now, shelfLife);
127
+ allCandidates.push(...candidates);
128
+ }
129
+ if (jsonMode) {
130
+ outputJson({
131
+ success: true,
132
+ command: "compact",
133
+ action: "analyze",
134
+ candidates: allCandidates,
135
+ });
136
+ return;
137
+ }
138
+ if (allCandidates.length === 0) {
139
+ console.log(chalk.green("No compaction candidates found."));
140
+ return;
141
+ }
142
+ console.log(chalk.bold("Compaction candidates:\n"));
143
+ for (const c of allCandidates) {
144
+ console.log(chalk.cyan(`${c.domain}/${c.type}`) + ` (${c.records.length} records)`);
145
+ for (const r of c.records) {
146
+ const idLabel = r.id ? ` ${r.id}` : "";
147
+ console.log(` #${r.index}${idLabel}: ${r.summary}`);
148
+ }
149
+ console.log();
150
+ }
151
+ console.log(chalk.dim("To compact, run: mulch compact <domain> --apply --records <ids> --type <type> [fields...]"));
152
+ }
153
+ async function handleApply(domain, options, jsonMode) {
154
+ const config = await readConfig();
155
+ if (!config.domains.includes(domain)) {
156
+ const msg = `Domain "${domain}" not found in config.`;
157
+ if (jsonMode) {
158
+ outputJsonError("compact", msg);
159
+ }
160
+ else {
161
+ console.error(chalk.red(`Error: ${msg}`));
162
+ }
163
+ process.exitCode = 1;
164
+ return;
165
+ }
166
+ if (typeof options.records !== "string") {
167
+ const msg = "--records is required for --apply.";
168
+ if (jsonMode) {
169
+ outputJsonError("compact", msg);
170
+ }
171
+ else {
172
+ console.error(chalk.red(`Error: ${msg}`));
173
+ }
174
+ process.exitCode = 1;
175
+ return;
176
+ }
177
+ const filePath = getExpertisePath(domain);
178
+ const records = await readExpertiseFile(filePath);
179
+ const identifiers = options.records.split(",").map((s) => s.trim()).filter(Boolean);
180
+ let indicesToRemove;
181
+ try {
182
+ indicesToRemove = resolveRecordIndices(records, identifiers);
183
+ }
184
+ catch (err) {
185
+ const msg = err.message;
186
+ if (jsonMode) {
187
+ outputJsonError("compact", msg);
188
+ }
189
+ else {
190
+ console.error(chalk.red(`Error: ${msg}`));
191
+ }
192
+ process.exitCode = 1;
193
+ return;
194
+ }
195
+ if (indicesToRemove.length < 2) {
196
+ const msg = "Compaction requires at least 2 records.";
197
+ if (jsonMode) {
198
+ outputJsonError("compact", msg);
199
+ }
200
+ else {
201
+ console.error(chalk.red(`Error: ${msg}`));
202
+ }
203
+ process.exitCode = 1;
204
+ return;
205
+ }
206
+ // Build replacement record
207
+ const recordType = options.type ?? records[indicesToRemove[0]].type;
208
+ const recordedAt = new Date().toISOString();
209
+ const compactedFrom = indicesToRemove.map((i) => records[i].id).filter(Boolean);
210
+ let replacement;
211
+ switch (recordType) {
212
+ case "convention": {
213
+ const content = options.content ?? options.description;
214
+ if (!content) {
215
+ const msg = "Replacement convention requires --content or --description.";
216
+ if (jsonMode) {
217
+ outputJsonError("compact", msg);
218
+ }
219
+ else {
220
+ console.error(chalk.red(`Error: ${msg}`));
221
+ }
222
+ process.exitCode = 1;
223
+ return;
224
+ }
225
+ replacement = { type: "convention", content, classification: "foundational", recorded_at: recordedAt };
226
+ break;
227
+ }
228
+ case "pattern": {
229
+ const name = options.name;
230
+ const description = options.description;
231
+ if (!name || !description) {
232
+ const msg = "Replacement pattern requires --name and --description.";
233
+ if (jsonMode) {
234
+ outputJsonError("compact", msg);
235
+ }
236
+ else {
237
+ console.error(chalk.red(`Error: ${msg}`));
238
+ }
239
+ process.exitCode = 1;
240
+ return;
241
+ }
242
+ replacement = { type: "pattern", name, description, classification: "foundational", recorded_at: recordedAt };
243
+ break;
244
+ }
245
+ case "failure": {
246
+ const description = options.description;
247
+ const resolution = options.resolution;
248
+ if (!description || !resolution) {
249
+ const msg = "Replacement failure requires --description and --resolution.";
250
+ if (jsonMode) {
251
+ outputJsonError("compact", msg);
252
+ }
253
+ else {
254
+ console.error(chalk.red(`Error: ${msg}`));
255
+ }
256
+ process.exitCode = 1;
257
+ return;
258
+ }
259
+ replacement = { type: "failure", description, resolution, classification: "foundational", recorded_at: recordedAt };
260
+ break;
261
+ }
262
+ case "decision": {
263
+ const title = options.title;
264
+ const rationale = options.rationale;
265
+ if (!title || !rationale) {
266
+ const msg = "Replacement decision requires --title and --rationale.";
267
+ if (jsonMode) {
268
+ outputJsonError("compact", msg);
269
+ }
270
+ else {
271
+ console.error(chalk.red(`Error: ${msg}`));
272
+ }
273
+ process.exitCode = 1;
274
+ return;
275
+ }
276
+ replacement = { type: "decision", title, rationale, classification: "foundational", recorded_at: recordedAt };
277
+ break;
278
+ }
279
+ case "reference": {
280
+ const name = options.name;
281
+ const description = options.description;
282
+ if (!name || !description) {
283
+ const msg = "Replacement reference requires --name and --description.";
284
+ if (jsonMode) {
285
+ outputJsonError("compact", msg);
286
+ }
287
+ else {
288
+ console.error(chalk.red(`Error: ${msg}`));
289
+ }
290
+ process.exitCode = 1;
291
+ return;
292
+ }
293
+ replacement = { type: "reference", name, description, classification: "foundational", recorded_at: recordedAt };
294
+ break;
295
+ }
296
+ case "guide": {
297
+ const name = options.name;
298
+ const description = options.description;
299
+ if (!name || !description) {
300
+ const msg = "Replacement guide requires --name and --description.";
301
+ if (jsonMode) {
302
+ outputJsonError("compact", msg);
303
+ }
304
+ else {
305
+ console.error(chalk.red(`Error: ${msg}`));
306
+ }
307
+ process.exitCode = 1;
308
+ return;
309
+ }
310
+ replacement = { type: "guide", name, description, classification: "foundational", recorded_at: recordedAt };
311
+ break;
312
+ }
313
+ default: {
314
+ const msg = `Unknown record type "${recordType}".`;
315
+ if (jsonMode) {
316
+ outputJsonError("compact", msg);
317
+ }
318
+ else {
319
+ console.error(chalk.red(`Error: ${msg}`));
320
+ }
321
+ process.exitCode = 1;
322
+ return;
323
+ }
324
+ }
325
+ // Add supersedes links to the compacted-from records
326
+ if (compactedFrom.length > 0) {
327
+ replacement.supersedes = compactedFrom;
328
+ }
329
+ // Validate replacement
330
+ const ajv = new Ajv();
331
+ const validate = ajv.compile(recordSchema);
332
+ replacement.id = generateRecordId(replacement);
333
+ if (!validate(replacement)) {
334
+ const errors = (validate.errors ?? []).map((err) => `${err.instancePath} ${err.message}`);
335
+ const msg = `Replacement record failed validation: ${errors.join("; ")}`;
336
+ if (jsonMode) {
337
+ outputJsonError("compact", msg);
338
+ }
339
+ else {
340
+ console.error(chalk.red(`Error: ${msg}`));
341
+ }
342
+ process.exitCode = 1;
343
+ return;
344
+ }
345
+ // Remove old records and append replacement
346
+ const removeSet = new Set(indicesToRemove);
347
+ const remaining = records.filter((_, i) => !removeSet.has(i));
348
+ remaining.push(replacement);
349
+ await writeExpertiseFile(filePath, remaining);
350
+ if (jsonMode) {
351
+ outputJson({
352
+ success: true,
353
+ command: "compact",
354
+ action: "applied",
355
+ domain,
356
+ removed: indicesToRemove.length,
357
+ replacement,
358
+ });
359
+ }
360
+ else {
361
+ console.log(chalk.green(`\u2714 Compacted ${indicesToRemove.length} ${recordType} records into 1 in ${domain}`));
362
+ }
363
+ }
364
+ //# sourceMappingURL=compact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compact.js","sourceRoot":"","sources":["../../src/commands/compact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerDeleteCommand(program: Command): void;
3
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyH5D"}