mulch-cli 0.4.3 → 0.6.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 +24 -4
- package/package.json +11 -16
- package/src/api.ts +310 -0
- package/src/cli.ts +54 -0
- package/src/commands/add.ts +61 -0
- package/src/commands/compact.ts +924 -0
- package/src/commands/delete.ts +103 -0
- package/src/commands/diff.ts +209 -0
- package/src/commands/doctor.ts +586 -0
- package/src/commands/edit.ts +253 -0
- package/src/commands/init.ts +33 -0
- package/src/commands/learn.ts +170 -0
- package/src/commands/onboard.ts +362 -0
- package/src/commands/prime.ts +327 -0
- package/src/commands/prune.ts +128 -0
- package/src/commands/query.ts +177 -0
- package/src/commands/ready.ts +194 -0
- package/src/commands/record.ts +959 -0
- package/src/commands/search.ts +234 -0
- package/src/commands/setup.ts +823 -0
- package/src/commands/status.ts +83 -0
- package/src/commands/sync.ts +224 -0
- package/src/commands/update.ts +112 -0
- package/src/commands/validate.ts +107 -0
- package/src/index.ts +50 -0
- package/src/schemas/config.ts +31 -0
- package/src/schemas/index.ts +18 -0
- package/src/schemas/record-schema.ts +177 -0
- package/src/schemas/record.ts +83 -0
- package/src/utils/bm25.ts +243 -0
- package/src/utils/budget.ts +157 -0
- package/src/utils/config.ts +117 -0
- package/src/utils/expertise.ts +379 -0
- package/src/utils/format.ts +767 -0
- package/src/utils/git.ts +89 -0
- package/src/utils/index.ts +54 -0
- package/src/utils/json-output.ts +13 -0
- package/src/utils/lock.ts +82 -0
- package/src/utils/markers.ts +51 -0
- package/src/utils/scoring.ts +101 -0
- package/src/utils/version.ts +46 -0
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -50
- package/dist/cli.js.map +0 -1
- package/dist/commands/add.d.ts +0 -3
- package/dist/commands/add.d.ts.map +0 -1
- package/dist/commands/add.js +0 -47
- package/dist/commands/add.js.map +0 -1
- package/dist/commands/compact.d.ts +0 -5
- package/dist/commands/compact.d.ts.map +0 -1
- package/dist/commands/compact.js +0 -709
- package/dist/commands/compact.js.map +0 -1
- package/dist/commands/delete.d.ts +0 -3
- package/dist/commands/delete.d.ts.map +0 -1
- package/dist/commands/delete.js +0 -82
- package/dist/commands/delete.js.map +0 -1
- package/dist/commands/diff.d.ts +0 -11
- package/dist/commands/diff.d.ts.map +0 -1
- package/dist/commands/diff.js +0 -170
- package/dist/commands/diff.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -3
- package/dist/commands/doctor.d.ts.map +0 -1
- package/dist/commands/doctor.js +0 -391
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/edit.d.ts +0 -3
- package/dist/commands/edit.d.ts.map +0 -1
- package/dist/commands/edit.js +0 -210
- package/dist/commands/edit.js.map +0 -1
- package/dist/commands/init.d.ts +0 -3
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -30
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/learn.d.ts +0 -12
- package/dist/commands/learn.d.ts.map +0 -1
- package/dist/commands/learn.js +0 -130
- package/dist/commands/learn.js.map +0 -1
- package/dist/commands/onboard.d.ts +0 -10
- package/dist/commands/onboard.d.ts.map +0 -1
- package/dist/commands/onboard.js +0 -286
- package/dist/commands/onboard.js.map +0 -1
- package/dist/commands/prime.d.ts +0 -3
- package/dist/commands/prime.d.ts.map +0 -1
- package/dist/commands/prime.js +0 -242
- package/dist/commands/prime.js.map +0 -1
- package/dist/commands/prune.d.ts +0 -8
- package/dist/commands/prune.d.ts.map +0 -1
- package/dist/commands/prune.js +0 -90
- package/dist/commands/prune.js.map +0 -1
- package/dist/commands/query.d.ts +0 -3
- package/dist/commands/query.d.ts.map +0 -1
- package/dist/commands/query.js +0 -118
- package/dist/commands/query.js.map +0 -1
- package/dist/commands/ready.d.ts +0 -3
- package/dist/commands/ready.d.ts.map +0 -1
- package/dist/commands/ready.js +0 -160
- package/dist/commands/ready.js.map +0 -1
- package/dist/commands/record.d.ts +0 -13
- package/dist/commands/record.d.ts.map +0 -1
- package/dist/commands/record.js +0 -688
- package/dist/commands/record.js.map +0 -1
- package/dist/commands/search.d.ts +0 -3
- package/dist/commands/search.d.ts.map +0 -1
- package/dist/commands/search.js +0 -163
- package/dist/commands/search.js.map +0 -1
- package/dist/commands/setup.d.ts +0 -29
- package/dist/commands/setup.d.ts.map +0 -1
- package/dist/commands/setup.js +0 -548
- package/dist/commands/setup.js.map +0 -1
- package/dist/commands/status.d.ts +0 -3
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -61
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/sync.d.ts +0 -3
- package/dist/commands/sync.d.ts.map +0 -1
- package/dist/commands/sync.js +0 -176
- package/dist/commands/sync.js.map +0 -1
- package/dist/commands/update.d.ts +0 -3
- package/dist/commands/update.d.ts.map +0 -1
- package/dist/commands/update.js +0 -72
- package/dist/commands/update.js.map +0 -1
- package/dist/commands/validate.d.ts +0 -3
- package/dist/commands/validate.d.ts.map +0 -1
- package/dist/commands/validate.js +0 -86
- package/dist/commands/validate.js.map +0 -1
- package/dist/index.d.ts +0 -7
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -8
- package/dist/index.js.map +0 -1
- package/dist/schemas/config.d.ts +0 -17
- package/dist/schemas/config.d.ts.map +0 -1
- package/dist/schemas/config.js +0 -16
- package/dist/schemas/config.js.map +0 -1
- package/dist/schemas/index.d.ts +0 -5
- package/dist/schemas/index.d.ts.map +0 -1
- package/dist/schemas/index.js +0 -3
- package/dist/schemas/index.js.map +0 -1
- package/dist/schemas/record-schema.d.ts +0 -379
- package/dist/schemas/record-schema.d.ts.map +0 -1
- package/dist/schemas/record-schema.js +0 -148
- package/dist/schemas/record-schema.js.map +0 -1
- package/dist/schemas/record.d.ts +0 -60
- package/dist/schemas/record.d.ts.map +0 -1
- package/dist/schemas/record.js +0 -2
- package/dist/schemas/record.js.map +0 -1
- package/dist/utils/bm25.d.ts +0 -39
- package/dist/utils/bm25.d.ts.map +0 -1
- package/dist/utils/bm25.js +0 -171
- package/dist/utils/bm25.js.map +0 -1
- package/dist/utils/budget.d.ts +0 -35
- package/dist/utils/budget.d.ts.map +0 -1
- package/dist/utils/budget.js +0 -114
- package/dist/utils/budget.js.map +0 -1
- package/dist/utils/config.d.ts +0 -12
- package/dist/utils/config.d.ts.map +0 -1
- package/dist/utils/config.js +0 -89
- package/dist/utils/config.js.map +0 -1
- package/dist/utils/expertise.d.ts +0 -57
- package/dist/utils/expertise.d.ts.map +0 -1
- package/dist/utils/expertise.js +0 -264
- package/dist/utils/expertise.js.map +0 -1
- package/dist/utils/format.d.ts +0 -31
- package/dist/utils/format.d.ts.map +0 -1
- package/dist/utils/format.js +0 -556
- package/dist/utils/format.js.map +0 -1
- package/dist/utils/git.d.ts +0 -6
- package/dist/utils/git.d.ts.map +0 -1
- package/dist/utils/git.js +0 -81
- package/dist/utils/git.js.map +0 -1
- package/dist/utils/index.d.ts +0 -8
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -8
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/json-output.d.ts +0 -8
- package/dist/utils/json-output.d.ts.map +0 -1
- package/dist/utils/json-output.js +0 -7
- package/dist/utils/json-output.js.map +0 -1
- package/dist/utils/lock.d.ts +0 -6
- package/dist/utils/lock.d.ts.map +0 -1
- package/dist/utils/lock.js +0 -70
- package/dist/utils/lock.js.map +0 -1
- package/dist/utils/markers.d.ts +0 -22
- package/dist/utils/markers.d.ts.map +0 -1
- package/dist/utils/markers.js +0 -42
- package/dist/utils/markers.js.map +0 -1
- package/dist/utils/scoring.d.ts +0 -73
- package/dist/utils/scoring.d.ts.map +0 -1
- package/dist/utils/scoring.js +0 -80
- package/dist/utils/scoring.js.map +0 -1
- package/dist/utils/version.d.ts +0 -15
- package/dist/utils/version.d.ts.map +0 -1
- package/dist/utils/version.js +0 -48
- package/dist/utils/version.js.map +0 -1
package/dist/commands/setup.js
DELETED
|
@@ -1,548 +0,0 @@
|
|
|
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
|
-
import { outputJson, outputJsonError } from "../utils/json-output.js";
|
|
7
|
-
import { MARKER_START, MARKER_END, hasMarkerSection, removeMarkerSection, } from "../utils/markers.js";
|
|
8
|
-
/** Supported provider names. */
|
|
9
|
-
const SUPPORTED_PROVIDERS = [
|
|
10
|
-
"claude",
|
|
11
|
-
"cursor",
|
|
12
|
-
"codex",
|
|
13
|
-
"gemini",
|
|
14
|
-
"windsurf",
|
|
15
|
-
"aider",
|
|
16
|
-
];
|
|
17
|
-
function isProvider(value) {
|
|
18
|
-
return SUPPORTED_PROVIDERS.includes(value);
|
|
19
|
-
}
|
|
20
|
-
// ────────────────────────────────────────────────────────────
|
|
21
|
-
// Git hook helpers
|
|
22
|
-
// ────────────────────────────────────────────────────────────
|
|
23
|
-
const HOOK_MARKER_START = "# mulch:start";
|
|
24
|
-
const HOOK_MARKER_END = "# mulch:end";
|
|
25
|
-
const MULCH_HOOK_SECTION = `${HOOK_MARKER_START}
|
|
26
|
-
# Run mulch validate before committing
|
|
27
|
-
if command -v mulch >/dev/null 2>&1; then
|
|
28
|
-
mulch validate
|
|
29
|
-
if [ $? -ne 0 ]; then
|
|
30
|
-
echo "mulch validate failed. Commit aborted."
|
|
31
|
-
exit 1
|
|
32
|
-
fi
|
|
33
|
-
fi
|
|
34
|
-
${HOOK_MARKER_END}`;
|
|
35
|
-
async function installGitHook(cwd) {
|
|
36
|
-
const gitDir = join(cwd, ".git");
|
|
37
|
-
if (!existsSync(gitDir)) {
|
|
38
|
-
return { success: false, message: "Not a git repository — .git directory not found." };
|
|
39
|
-
}
|
|
40
|
-
const hooksDir = join(gitDir, "hooks");
|
|
41
|
-
await mkdir(hooksDir, { recursive: true });
|
|
42
|
-
const hookPath = join(hooksDir, "pre-commit");
|
|
43
|
-
let content = "";
|
|
44
|
-
if (existsSync(hookPath)) {
|
|
45
|
-
content = await readFile(hookPath, "utf-8");
|
|
46
|
-
if (content.includes(HOOK_MARKER_START)) {
|
|
47
|
-
return { success: true, message: "Git pre-commit hook already installed." };
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
if (content) {
|
|
51
|
-
content = content.trimEnd() + "\n\n" + MULCH_HOOK_SECTION + "\n";
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
content = "#!/bin/sh\n\n" + MULCH_HOOK_SECTION + "\n";
|
|
55
|
-
}
|
|
56
|
-
await writeFile(hookPath, content, "utf-8");
|
|
57
|
-
await chmod(hookPath, 0o755);
|
|
58
|
-
return { success: true, message: "Installed mulch pre-commit git hook." };
|
|
59
|
-
}
|
|
60
|
-
async function checkGitHook(cwd) {
|
|
61
|
-
const hookPath = join(cwd, ".git", "hooks", "pre-commit");
|
|
62
|
-
if (!existsSync(hookPath)) {
|
|
63
|
-
return { success: false, message: "Git pre-commit hook not found." };
|
|
64
|
-
}
|
|
65
|
-
const content = await readFile(hookPath, "utf-8");
|
|
66
|
-
if (!content.includes(HOOK_MARKER_START)) {
|
|
67
|
-
return { success: false, message: "Git pre-commit hook exists but has no mulch section." };
|
|
68
|
-
}
|
|
69
|
-
return { success: true, message: "Git pre-commit hook is installed." };
|
|
70
|
-
}
|
|
71
|
-
async function removeGitHook(cwd) {
|
|
72
|
-
const hookPath = join(cwd, ".git", "hooks", "pre-commit");
|
|
73
|
-
if (!existsSync(hookPath)) {
|
|
74
|
-
return { success: true, message: "Git pre-commit hook not found; nothing to remove." };
|
|
75
|
-
}
|
|
76
|
-
const content = await readFile(hookPath, "utf-8");
|
|
77
|
-
if (!content.includes(HOOK_MARKER_START)) {
|
|
78
|
-
return { success: true, message: "No mulch section in pre-commit hook; nothing to remove." };
|
|
79
|
-
}
|
|
80
|
-
const startIdx = content.indexOf(HOOK_MARKER_START);
|
|
81
|
-
const endIdx = content.indexOf(HOOK_MARKER_END);
|
|
82
|
-
const before = content.substring(0, startIdx);
|
|
83
|
-
const after = content.substring(endIdx + HOOK_MARKER_END.length);
|
|
84
|
-
const cleaned = (before + after).replace(/\n{3,}/g, "\n\n").trim();
|
|
85
|
-
// If only the shebang (or nothing) remains, delete the file
|
|
86
|
-
if (!cleaned || cleaned === "#!/bin/sh") {
|
|
87
|
-
await unlink(hookPath);
|
|
88
|
-
return { success: true, message: "Removed mulch pre-commit hook (file deleted)." };
|
|
89
|
-
}
|
|
90
|
-
await writeFile(hookPath, cleaned + "\n", "utf-8");
|
|
91
|
-
return { success: true, message: "Removed mulch section from pre-commit hook." };
|
|
92
|
-
}
|
|
93
|
-
const CLAUDE_HOOK_COMMAND = "mulch prime";
|
|
94
|
-
function claudeSettingsPath(cwd) {
|
|
95
|
-
return join(cwd, ".claude", "settings.json");
|
|
96
|
-
}
|
|
97
|
-
function hasMulchHook(groups) {
|
|
98
|
-
return groups.some((g) => g.hooks.some((h) => h.command === CLAUDE_HOOK_COMMAND));
|
|
99
|
-
}
|
|
100
|
-
function removeMulchHookGroups(groups) {
|
|
101
|
-
return groups.filter((g) => !g.hooks.some((h) => h.command === CLAUDE_HOOK_COMMAND));
|
|
102
|
-
}
|
|
103
|
-
function createMulchHookGroup() {
|
|
104
|
-
return {
|
|
105
|
-
matcher: "",
|
|
106
|
-
hooks: [{ type: "command", command: CLAUDE_HOOK_COMMAND }],
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
const claudeRecipe = {
|
|
110
|
-
async install(cwd) {
|
|
111
|
-
const settingsPath = claudeSettingsPath(cwd);
|
|
112
|
-
let settings = {};
|
|
113
|
-
if (existsSync(settingsPath)) {
|
|
114
|
-
const raw = await readFile(settingsPath, "utf-8");
|
|
115
|
-
settings = JSON.parse(raw);
|
|
116
|
-
}
|
|
117
|
-
if (!settings.hooks) {
|
|
118
|
-
settings.hooks = {};
|
|
119
|
-
}
|
|
120
|
-
const events = ["SessionStart", "PreCompact"];
|
|
121
|
-
let alreadyInstalled = true;
|
|
122
|
-
for (const event of events) {
|
|
123
|
-
if (!settings.hooks[event]) {
|
|
124
|
-
settings.hooks[event] = [];
|
|
125
|
-
}
|
|
126
|
-
if (!hasMulchHook(settings.hooks[event])) {
|
|
127
|
-
settings.hooks[event].push(createMulchHookGroup());
|
|
128
|
-
alreadyInstalled = false;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
if (alreadyInstalled) {
|
|
132
|
-
return { success: true, message: "Claude hooks already installed." };
|
|
133
|
-
}
|
|
134
|
-
await mkdir(dirname(settingsPath), { recursive: true });
|
|
135
|
-
await writeFile(settingsPath, JSON.stringify(settings, null, 2) + "\n", "utf-8");
|
|
136
|
-
return { success: true, message: "Installed Claude hooks for SessionStart and PreCompact." };
|
|
137
|
-
},
|
|
138
|
-
async check(cwd) {
|
|
139
|
-
const settingsPath = claudeSettingsPath(cwd);
|
|
140
|
-
if (!existsSync(settingsPath)) {
|
|
141
|
-
return { success: false, message: "Claude settings.json not found." };
|
|
142
|
-
}
|
|
143
|
-
const raw = await readFile(settingsPath, "utf-8");
|
|
144
|
-
const settings = JSON.parse(raw);
|
|
145
|
-
if (!settings.hooks) {
|
|
146
|
-
return { success: false, message: "No hooks configured in Claude settings." };
|
|
147
|
-
}
|
|
148
|
-
const events = ["SessionStart", "PreCompact"];
|
|
149
|
-
const missing = [];
|
|
150
|
-
for (const event of events) {
|
|
151
|
-
if (!settings.hooks[event] || !hasMulchHook(settings.hooks[event])) {
|
|
152
|
-
missing.push(event);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
if (missing.length > 0) {
|
|
156
|
-
return { success: false, message: `Missing hooks for: ${missing.join(", ")}.` };
|
|
157
|
-
}
|
|
158
|
-
return { success: true, message: "Claude hooks are installed and correct." };
|
|
159
|
-
},
|
|
160
|
-
async remove(cwd) {
|
|
161
|
-
const settingsPath = claudeSettingsPath(cwd);
|
|
162
|
-
if (!existsSync(settingsPath)) {
|
|
163
|
-
return { success: true, message: "Claude settings.json not found; nothing to remove." };
|
|
164
|
-
}
|
|
165
|
-
const raw = await readFile(settingsPath, "utf-8");
|
|
166
|
-
const settings = JSON.parse(raw);
|
|
167
|
-
if (!settings.hooks) {
|
|
168
|
-
return { success: true, message: "No hooks in Claude settings; nothing to remove." };
|
|
169
|
-
}
|
|
170
|
-
let removed = false;
|
|
171
|
-
for (const event of Object.keys(settings.hooks)) {
|
|
172
|
-
const before = settings.hooks[event].length;
|
|
173
|
-
settings.hooks[event] = removeMulchHookGroups(settings.hooks[event]);
|
|
174
|
-
if (settings.hooks[event].length < before) {
|
|
175
|
-
removed = true;
|
|
176
|
-
}
|
|
177
|
-
if (settings.hooks[event].length === 0) {
|
|
178
|
-
delete settings.hooks[event];
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
if (Object.keys(settings.hooks).length === 0) {
|
|
182
|
-
delete settings.hooks;
|
|
183
|
-
}
|
|
184
|
-
await writeFile(settingsPath, JSON.stringify(settings, null, 2) + "\n", "utf-8");
|
|
185
|
-
return {
|
|
186
|
-
success: true,
|
|
187
|
-
message: removed
|
|
188
|
-
? "Removed mulch hooks from Claude settings."
|
|
189
|
-
: "No mulch hooks found in Claude settings.",
|
|
190
|
-
};
|
|
191
|
-
},
|
|
192
|
-
};
|
|
193
|
-
// ── Cursor ──────────────────────────────────────────────────
|
|
194
|
-
function cursorRulePath(cwd) {
|
|
195
|
-
return join(cwd, ".cursor", "rules", "mulch.mdc");
|
|
196
|
-
}
|
|
197
|
-
const CURSOR_RULE_CONTENT = `---
|
|
198
|
-
description: Mulch expertise integration
|
|
199
|
-
globs: *
|
|
200
|
-
alwaysApply: true
|
|
201
|
-
---
|
|
202
|
-
|
|
203
|
-
# Mulch Expertise
|
|
204
|
-
|
|
205
|
-
At the start of every session, run the following command to load project expertise:
|
|
206
|
-
|
|
207
|
-
\`\`\`
|
|
208
|
-
mulch prime
|
|
209
|
-
\`\`\`
|
|
210
|
-
|
|
211
|
-
This injects project-specific conventions, patterns, decisions, and other learnings into your context.
|
|
212
|
-
Use \`mulch prime --files src/foo.ts\` to load only records relevant to specific files.
|
|
213
|
-
|
|
214
|
-
**Before completing your task**, review your work for insights worth preserving — conventions discovered,
|
|
215
|
-
patterns applied, failures encountered, or decisions made — and record them:
|
|
216
|
-
|
|
217
|
-
\`\`\`
|
|
218
|
-
mulch record <domain> --type <convention|pattern|failure|decision|reference|guide> [options]
|
|
219
|
-
\`\`\`
|
|
220
|
-
|
|
221
|
-
Link evidence: \`--evidence-commit <sha>\`, \`--evidence-bead <id>\`
|
|
222
|
-
|
|
223
|
-
**Before you finish**, run:
|
|
224
|
-
|
|
225
|
-
\`\`\`
|
|
226
|
-
mulch learn # see what files changed — decide what to record
|
|
227
|
-
mulch record ... # record learnings
|
|
228
|
-
mulch sync # validate, stage, and commit .mulch/ changes
|
|
229
|
-
\`\`\`
|
|
230
|
-
`;
|
|
231
|
-
const cursorRecipe = {
|
|
232
|
-
async install(cwd) {
|
|
233
|
-
const rulePath = cursorRulePath(cwd);
|
|
234
|
-
if (existsSync(rulePath)) {
|
|
235
|
-
const existing = await readFile(rulePath, "utf-8");
|
|
236
|
-
if (existing === CURSOR_RULE_CONTENT) {
|
|
237
|
-
return { success: true, message: "Cursor rule already installed." };
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
await mkdir(dirname(rulePath), { recursive: true });
|
|
241
|
-
await writeFile(rulePath, CURSOR_RULE_CONTENT, "utf-8");
|
|
242
|
-
return { success: true, message: "Installed Cursor rule at .cursor/rules/mulch.mdc." };
|
|
243
|
-
},
|
|
244
|
-
async check(cwd) {
|
|
245
|
-
const rulePath = cursorRulePath(cwd);
|
|
246
|
-
if (!existsSync(rulePath)) {
|
|
247
|
-
return { success: false, message: "Cursor rule file not found." };
|
|
248
|
-
}
|
|
249
|
-
const content = await readFile(rulePath, "utf-8");
|
|
250
|
-
if (content !== CURSOR_RULE_CONTENT) {
|
|
251
|
-
return { success: false, message: "Cursor rule file exists but has been modified." };
|
|
252
|
-
}
|
|
253
|
-
return { success: true, message: "Cursor rule is installed and correct." };
|
|
254
|
-
},
|
|
255
|
-
async remove(cwd) {
|
|
256
|
-
const rulePath = cursorRulePath(cwd);
|
|
257
|
-
if (!existsSync(rulePath)) {
|
|
258
|
-
return { success: true, message: "Cursor rule not found; nothing to remove." };
|
|
259
|
-
}
|
|
260
|
-
await unlink(rulePath);
|
|
261
|
-
return { success: true, message: "Removed Cursor rule file." };
|
|
262
|
-
},
|
|
263
|
-
};
|
|
264
|
-
// ── Codex ───────────────────────────────────────────────────
|
|
265
|
-
function codexAgentsPath(cwd) {
|
|
266
|
-
return join(cwd, "AGENTS.md");
|
|
267
|
-
}
|
|
268
|
-
const CODEX_SECTION = `${MARKER_START}
|
|
269
|
-
## Mulch Expertise
|
|
270
|
-
|
|
271
|
-
At the start of every session, run \`mulch prime\` to load project expertise.
|
|
272
|
-
|
|
273
|
-
This injects project-specific conventions, patterns, decisions, and other learnings into your context.
|
|
274
|
-
Use \`mulch prime --files src/foo.ts\` to load only records relevant to specific files.
|
|
275
|
-
|
|
276
|
-
**Before completing your task**, review your work for insights worth preserving — conventions discovered,
|
|
277
|
-
patterns applied, failures encountered, or decisions made — and record them:
|
|
278
|
-
|
|
279
|
-
\`\`\`
|
|
280
|
-
mulch record <domain> --type <convention|pattern|failure|decision|reference|guide> [options]
|
|
281
|
-
\`\`\`
|
|
282
|
-
|
|
283
|
-
Link evidence: \`--evidence-commit <sha>\`, \`--evidence-bead <id>\`
|
|
284
|
-
|
|
285
|
-
**Before you finish**, run:
|
|
286
|
-
|
|
287
|
-
\`\`\`
|
|
288
|
-
mulch learn # see what files changed — decide what to record
|
|
289
|
-
mulch record ... # record learnings
|
|
290
|
-
mulch sync # validate, stage, and commit .mulch/ changes
|
|
291
|
-
\`\`\`
|
|
292
|
-
${MARKER_END}`;
|
|
293
|
-
const codexRecipe = {
|
|
294
|
-
async install(cwd) {
|
|
295
|
-
const agentsPath = codexAgentsPath(cwd);
|
|
296
|
-
let content = "";
|
|
297
|
-
if (existsSync(agentsPath)) {
|
|
298
|
-
content = await readFile(agentsPath, "utf-8");
|
|
299
|
-
if (hasMarkerSection(content)) {
|
|
300
|
-
return { success: true, message: "AGENTS.md already contains mulch section." };
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
const newContent = content
|
|
304
|
-
? content.trimEnd() + "\n\n" + CODEX_SECTION + "\n"
|
|
305
|
-
: CODEX_SECTION + "\n";
|
|
306
|
-
await writeFile(agentsPath, newContent, "utf-8");
|
|
307
|
-
return { success: true, message: "Added mulch section to AGENTS.md." };
|
|
308
|
-
},
|
|
309
|
-
async check(cwd) {
|
|
310
|
-
const agentsPath = codexAgentsPath(cwd);
|
|
311
|
-
if (!existsSync(agentsPath)) {
|
|
312
|
-
return { success: false, message: "AGENTS.md not found." };
|
|
313
|
-
}
|
|
314
|
-
const content = await readFile(agentsPath, "utf-8");
|
|
315
|
-
if (!hasMarkerSection(content)) {
|
|
316
|
-
return { success: false, message: "AGENTS.md exists but has no mulch section." };
|
|
317
|
-
}
|
|
318
|
-
return { success: true, message: "AGENTS.md contains mulch section." };
|
|
319
|
-
},
|
|
320
|
-
async remove(cwd) {
|
|
321
|
-
const agentsPath = codexAgentsPath(cwd);
|
|
322
|
-
if (!existsSync(agentsPath)) {
|
|
323
|
-
return { success: true, message: "AGENTS.md not found; nothing to remove." };
|
|
324
|
-
}
|
|
325
|
-
const content = await readFile(agentsPath, "utf-8");
|
|
326
|
-
if (!hasMarkerSection(content)) {
|
|
327
|
-
return { success: true, message: "No mulch section in AGENTS.md; nothing to remove." };
|
|
328
|
-
}
|
|
329
|
-
const cleaned = removeMarkerSection(content);
|
|
330
|
-
await writeFile(agentsPath, cleaned, "utf-8");
|
|
331
|
-
return { success: true, message: "Removed mulch section from AGENTS.md." };
|
|
332
|
-
},
|
|
333
|
-
};
|
|
334
|
-
function createMarkdownRecipe(config) {
|
|
335
|
-
const section = `${MARKER_START}
|
|
336
|
-
## Mulch Expertise
|
|
337
|
-
|
|
338
|
-
At the start of every session, run \`mulch prime\` to load project expertise.
|
|
339
|
-
|
|
340
|
-
This injects project-specific conventions, patterns, decisions, and other learnings into your context.
|
|
341
|
-
Use \`mulch prime --files src/foo.ts\` to load only records relevant to specific files.
|
|
342
|
-
|
|
343
|
-
**Before completing your task**, review your work for insights worth preserving — conventions discovered,
|
|
344
|
-
patterns applied, failures encountered, or decisions made — and record them:
|
|
345
|
-
|
|
346
|
-
\`\`\`
|
|
347
|
-
mulch record <domain> --type <convention|pattern|failure|decision|reference|guide> [options]
|
|
348
|
-
\`\`\`
|
|
349
|
-
|
|
350
|
-
Link evidence: \`--evidence-commit <sha>\`, \`--evidence-bead <id>\`
|
|
351
|
-
|
|
352
|
-
**Before you finish**, run:
|
|
353
|
-
|
|
354
|
-
\`\`\`
|
|
355
|
-
mulch learn # see what files changed — decide what to record
|
|
356
|
-
mulch record ... # record learnings
|
|
357
|
-
mulch sync # validate, stage, and commit .mulch/ changes
|
|
358
|
-
\`\`\`
|
|
359
|
-
${MARKER_END}`;
|
|
360
|
-
return {
|
|
361
|
-
async install(cwd) {
|
|
362
|
-
const filePath = config.filePath(cwd);
|
|
363
|
-
let content = "";
|
|
364
|
-
if (existsSync(filePath)) {
|
|
365
|
-
content = await readFile(filePath, "utf-8");
|
|
366
|
-
if (hasMarkerSection(content)) {
|
|
367
|
-
return { success: true, message: `${config.fileName} already contains mulch section.` };
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
const newContent = content
|
|
371
|
-
? content.trimEnd() + "\n\n" + section + "\n"
|
|
372
|
-
: section + "\n";
|
|
373
|
-
await mkdir(dirname(filePath), { recursive: true });
|
|
374
|
-
await writeFile(filePath, newContent, "utf-8");
|
|
375
|
-
return { success: true, message: `Added mulch section to ${config.fileName}.` };
|
|
376
|
-
},
|
|
377
|
-
async check(cwd) {
|
|
378
|
-
const filePath = config.filePath(cwd);
|
|
379
|
-
if (!existsSync(filePath)) {
|
|
380
|
-
return { success: false, message: `${config.fileName} not found.` };
|
|
381
|
-
}
|
|
382
|
-
const content = await readFile(filePath, "utf-8");
|
|
383
|
-
if (!hasMarkerSection(content)) {
|
|
384
|
-
return { success: false, message: `${config.fileName} exists but has no mulch section.` };
|
|
385
|
-
}
|
|
386
|
-
return { success: true, message: `${config.fileName} contains mulch section.` };
|
|
387
|
-
},
|
|
388
|
-
async remove(cwd) {
|
|
389
|
-
const filePath = config.filePath(cwd);
|
|
390
|
-
if (!existsSync(filePath)) {
|
|
391
|
-
return { success: true, message: `${config.fileName} not found; nothing to remove.` };
|
|
392
|
-
}
|
|
393
|
-
const content = await readFile(filePath, "utf-8");
|
|
394
|
-
if (!hasMarkerSection(content)) {
|
|
395
|
-
return { success: true, message: `No mulch section in ${config.fileName}; nothing to remove.` };
|
|
396
|
-
}
|
|
397
|
-
const cleaned = removeMarkerSection(content);
|
|
398
|
-
await writeFile(filePath, cleaned, "utf-8");
|
|
399
|
-
return { success: true, message: `Removed mulch section from ${config.fileName}.` };
|
|
400
|
-
},
|
|
401
|
-
};
|
|
402
|
-
}
|
|
403
|
-
const geminiRecipe = createMarkdownRecipe({
|
|
404
|
-
filePath: (cwd) => join(cwd, ".gemini", "settings.md"),
|
|
405
|
-
fileName: ".gemini/settings.md",
|
|
406
|
-
});
|
|
407
|
-
const windsurfRecipe = createMarkdownRecipe({
|
|
408
|
-
filePath: (cwd) => join(cwd, ".windsurf", "rules.md"),
|
|
409
|
-
fileName: ".windsurf/rules.md",
|
|
410
|
-
});
|
|
411
|
-
const aiderRecipe = createMarkdownRecipe({
|
|
412
|
-
filePath: (cwd) => join(cwd, ".aider.conf.md"),
|
|
413
|
-
fileName: ".aider.conf.md",
|
|
414
|
-
});
|
|
415
|
-
// ── Recipe registry ─────────────────────────────────────────
|
|
416
|
-
const recipes = {
|
|
417
|
-
claude: claudeRecipe,
|
|
418
|
-
cursor: cursorRecipe,
|
|
419
|
-
codex: codexRecipe,
|
|
420
|
-
gemini: geminiRecipe,
|
|
421
|
-
windsurf: windsurfRecipe,
|
|
422
|
-
aider: aiderRecipe,
|
|
423
|
-
};
|
|
424
|
-
// ── Exported helpers for testing ────────────────────────────
|
|
425
|
-
export { recipes, SUPPORTED_PROVIDERS, CURSOR_RULE_CONTENT, CODEX_SECTION, CLAUDE_HOOK_COMMAND, MULCH_HOOK_SECTION, installGitHook, checkGitHook, removeGitHook, };
|
|
426
|
-
// ── Command registration ────────────────────────────────────
|
|
427
|
-
export function registerSetupCommand(program) {
|
|
428
|
-
program
|
|
429
|
-
.command("setup")
|
|
430
|
-
.argument("[provider]", `agent provider (${SUPPORTED_PROVIDERS.join(", ")})`)
|
|
431
|
-
.description("Set up mulch integration for a specific agent provider")
|
|
432
|
-
.option("--check", "verify provider integration is installed")
|
|
433
|
-
.option("--remove", "remove provider integration")
|
|
434
|
-
.option("--hooks", "install a pre-commit git hook running mulch validate")
|
|
435
|
-
.action(async (provider, options) => {
|
|
436
|
-
const jsonMode = program.opts().json === true;
|
|
437
|
-
// Verify .mulch/ exists
|
|
438
|
-
const mulchDir = getMulchDir();
|
|
439
|
-
if (!existsSync(mulchDir)) {
|
|
440
|
-
if (jsonMode) {
|
|
441
|
-
outputJsonError("setup", "No .mulch/ directory found. Run `mulch init` first.");
|
|
442
|
-
}
|
|
443
|
-
else {
|
|
444
|
-
console.error(chalk.red("Error: No .mulch/ directory found. Run `mulch init` first."));
|
|
445
|
-
}
|
|
446
|
-
process.exitCode = 1;
|
|
447
|
-
return;
|
|
448
|
-
}
|
|
449
|
-
if (!provider && !options.hooks) {
|
|
450
|
-
if (jsonMode) {
|
|
451
|
-
outputJsonError("setup", "Specify a provider or use --hooks.");
|
|
452
|
-
}
|
|
453
|
-
else {
|
|
454
|
-
console.error(chalk.red("Error: specify a provider or use --hooks."));
|
|
455
|
-
}
|
|
456
|
-
process.exitCode = 1;
|
|
457
|
-
return;
|
|
458
|
-
}
|
|
459
|
-
// Handle --hooks
|
|
460
|
-
if (options.hooks) {
|
|
461
|
-
const cwd = process.cwd();
|
|
462
|
-
let hookResult;
|
|
463
|
-
const action = options.check ? "check" : options.remove ? "remove" : "install";
|
|
464
|
-
if (options.check) {
|
|
465
|
-
hookResult = await checkGitHook(cwd);
|
|
466
|
-
}
|
|
467
|
-
else if (options.remove) {
|
|
468
|
-
hookResult = await removeGitHook(cwd);
|
|
469
|
-
}
|
|
470
|
-
else {
|
|
471
|
-
hookResult = await installGitHook(cwd);
|
|
472
|
-
}
|
|
473
|
-
if (jsonMode) {
|
|
474
|
-
outputJson({
|
|
475
|
-
success: hookResult.success,
|
|
476
|
-
command: "setup",
|
|
477
|
-
target: "hooks",
|
|
478
|
-
action,
|
|
479
|
-
message: hookResult.message,
|
|
480
|
-
});
|
|
481
|
-
}
|
|
482
|
-
else if (hookResult.success) {
|
|
483
|
-
console.log(chalk.green(`\u2714 ${hookResult.message}`));
|
|
484
|
-
}
|
|
485
|
-
else {
|
|
486
|
-
console.error(chalk.red(`\u2716 ${hookResult.message}`));
|
|
487
|
-
}
|
|
488
|
-
if (!hookResult.success) {
|
|
489
|
-
process.exitCode = 1;
|
|
490
|
-
}
|
|
491
|
-
// If no provider, stop here
|
|
492
|
-
if (!provider)
|
|
493
|
-
return;
|
|
494
|
-
}
|
|
495
|
-
// Handle provider
|
|
496
|
-
if (!provider)
|
|
497
|
-
return;
|
|
498
|
-
if (!isProvider(provider)) {
|
|
499
|
-
if (jsonMode) {
|
|
500
|
-
outputJsonError("setup", `Unknown provider "${provider}". Supported providers: ${SUPPORTED_PROVIDERS.join(", ")}`);
|
|
501
|
-
}
|
|
502
|
-
else {
|
|
503
|
-
console.error(chalk.red(`Error: unknown provider "${provider}".`));
|
|
504
|
-
console.error(chalk.red(`Supported providers: ${SUPPORTED_PROVIDERS.join(", ")}`));
|
|
505
|
-
}
|
|
506
|
-
process.exitCode = 1;
|
|
507
|
-
return;
|
|
508
|
-
}
|
|
509
|
-
{
|
|
510
|
-
const recipe = recipes[provider];
|
|
511
|
-
const action = options.check ? "check" : options.remove ? "remove" : "install";
|
|
512
|
-
let result;
|
|
513
|
-
if (options.check) {
|
|
514
|
-
result = await recipe.check(process.cwd());
|
|
515
|
-
}
|
|
516
|
-
else if (options.remove) {
|
|
517
|
-
result = await recipe.remove(process.cwd());
|
|
518
|
-
}
|
|
519
|
-
else {
|
|
520
|
-
result = await recipe.install(process.cwd());
|
|
521
|
-
}
|
|
522
|
-
if (jsonMode) {
|
|
523
|
-
outputJson({
|
|
524
|
-
success: result.success,
|
|
525
|
-
command: "setup",
|
|
526
|
-
provider,
|
|
527
|
-
action,
|
|
528
|
-
message: result.message,
|
|
529
|
-
});
|
|
530
|
-
}
|
|
531
|
-
else if (result.success) {
|
|
532
|
-
console.log(chalk.green(`\u2714 ${result.message}`));
|
|
533
|
-
}
|
|
534
|
-
else {
|
|
535
|
-
if (options.check) {
|
|
536
|
-
console.log(chalk.yellow(`\u2716 ${result.message}`));
|
|
537
|
-
}
|
|
538
|
-
else {
|
|
539
|
-
console.error(chalk.red(`Error: ${result.message}`));
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
if (!result.success) {
|
|
543
|
-
process.exitCode = 1;
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
});
|
|
547
|
-
}
|
|
548
|
-
//# sourceMappingURL=setup.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkE5D"}
|
package/dist/commands/status.js
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
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, calculateDomainHealth } from "../utils/expertise.js";
|
|
5
|
-
import { formatStatusOutput } from "../utils/format.js";
|
|
6
|
-
import { outputJson, outputJsonError } from "../utils/json-output.js";
|
|
7
|
-
export function registerStatusCommand(program) {
|
|
8
|
-
program
|
|
9
|
-
.command("status")
|
|
10
|
-
.description("Show status of expertise records")
|
|
11
|
-
.action(async () => {
|
|
12
|
-
const jsonMode = program.opts().json === true;
|
|
13
|
-
const mulchDir = getMulchDir();
|
|
14
|
-
if (!existsSync(mulchDir)) {
|
|
15
|
-
if (jsonMode) {
|
|
16
|
-
outputJsonError("status", "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
|
-
}
|
|
21
|
-
process.exitCode = 1;
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
const config = await readConfig();
|
|
25
|
-
const domainStats = await Promise.all(config.domains.map(async (domain) => {
|
|
26
|
-
const filePath = getExpertisePath(domain);
|
|
27
|
-
const records = await readExpertiseFile(filePath);
|
|
28
|
-
const lastUpdated = await getFileModTime(filePath);
|
|
29
|
-
const health = calculateDomainHealth(records, config.governance.max_entries, config.classification_defaults.shelf_life);
|
|
30
|
-
return {
|
|
31
|
-
domain,
|
|
32
|
-
count: countRecords(records),
|
|
33
|
-
lastUpdated,
|
|
34
|
-
health,
|
|
35
|
-
records,
|
|
36
|
-
};
|
|
37
|
-
}));
|
|
38
|
-
if (jsonMode) {
|
|
39
|
-
outputJson({
|
|
40
|
-
success: true,
|
|
41
|
-
command: "status",
|
|
42
|
-
domains: domainStats.map((s) => ({
|
|
43
|
-
domain: s.domain,
|
|
44
|
-
count: s.count,
|
|
45
|
-
lastUpdated: s.lastUpdated?.toISOString() ?? null,
|
|
46
|
-
health: s.health,
|
|
47
|
-
})),
|
|
48
|
-
governance: config.governance,
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
const output = formatStatusOutput(domainStats.map((s) => ({
|
|
53
|
-
domain: s.domain,
|
|
54
|
-
count: s.count,
|
|
55
|
-
lastUpdated: s.lastUpdated,
|
|
56
|
-
})), config.governance);
|
|
57
|
-
console.log(output);
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=status.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/sync.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmFpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoG1D"}
|