@monoes/monomindcli 2.15.4 → 2.15.6

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 (76) hide show
  1. package/.claude/skills/monodesign/scripts/detector/engines/browser/drivers.mjs +9 -19
  2. package/dist/src/commands/cleanup-plan.d.ts +57 -0
  3. package/dist/src/commands/cleanup-plan.d.ts.map +1 -0
  4. package/dist/src/commands/cleanup-plan.js +379 -0
  5. package/dist/src/commands/cleanup-plan.js.map +1 -0
  6. package/dist/src/commands/cleanup.d.ts.map +1 -1
  7. package/dist/src/commands/cleanup.js +87 -160
  8. package/dist/src/commands/cleanup.js.map +1 -1
  9. package/dist/src/commands/search-universal.d.ts +8 -0
  10. package/dist/src/commands/search-universal.d.ts.map +1 -1
  11. package/dist/src/commands/search-universal.js +14 -0
  12. package/dist/src/commands/search-universal.js.map +1 -1
  13. package/dist/src/index.d.ts.map +1 -1
  14. package/dist/src/index.js +11 -2
  15. package/dist/src/index.js.map +1 -1
  16. package/dist/src/init/kimi-generator.d.ts +17 -0
  17. package/dist/src/init/kimi-generator.d.ts.map +1 -1
  18. package/dist/src/init/kimi-generator.js +29 -0
  19. package/dist/src/init/kimi-generator.js.map +1 -1
  20. package/dist/src/init/write-kimicode.d.ts.map +1 -1
  21. package/dist/src/init/write-kimicode.js +11 -3
  22. package/dist/src/init/write-kimicode.js.map +1 -1
  23. package/dist/src/orgrt/completion-gate.d.ts +25 -0
  24. package/dist/src/orgrt/completion-gate.d.ts.map +1 -1
  25. package/dist/src/orgrt/completion-gate.js +34 -9
  26. package/dist/src/orgrt/completion-gate.js.map +1 -1
  27. package/dist/src/orgrt/daemon.d.ts.map +1 -1
  28. package/dist/src/orgrt/daemon.js +14 -2
  29. package/dist/src/orgrt/daemon.js.map +1 -1
  30. package/dist/src/orgrt/decisions.d.ts +7 -1
  31. package/dist/src/orgrt/decisions.d.ts.map +1 -1
  32. package/dist/src/orgrt/decisions.js +68 -8
  33. package/dist/src/orgrt/decisions.js.map +1 -1
  34. package/dist/src/orgrt/idle-deadline.d.ts +10 -0
  35. package/dist/src/orgrt/idle-deadline.d.ts.map +1 -1
  36. package/dist/src/orgrt/idle-deadline.js +8 -0
  37. package/dist/src/orgrt/idle-deadline.js.map +1 -1
  38. package/dist/src/orgrt/mailbox.d.ts +7 -0
  39. package/dist/src/orgrt/mailbox.d.ts.map +1 -1
  40. package/dist/src/orgrt/mailbox.js +14 -0
  41. package/dist/src/orgrt/mailbox.js.map +1 -1
  42. package/dist/src/orgrt/review-packet.d.ts.map +1 -1
  43. package/dist/src/orgrt/review-packet.js +2 -1
  44. package/dist/src/orgrt/review-packet.js.map +1 -1
  45. package/dist/src/orgrt/role-sandbox.d.ts +1 -0
  46. package/dist/src/orgrt/role-sandbox.d.ts.map +1 -1
  47. package/dist/src/orgrt/role-sandbox.js +6 -1
  48. package/dist/src/orgrt/role-sandbox.js.map +1 -1
  49. package/dist/src/orgrt/session.d.ts.map +1 -1
  50. package/dist/src/orgrt/session.js +3 -1
  51. package/dist/src/orgrt/session.js.map +1 -1
  52. package/dist/src/orgrt/task-dag.d.ts.map +1 -1
  53. package/dist/src/orgrt/task-dag.js +1 -0
  54. package/dist/src/orgrt/task-dag.js.map +1 -1
  55. package/dist/src/orgrt/types.d.ts +3 -0
  56. package/dist/src/orgrt/types.d.ts.map +1 -1
  57. package/dist/src/orgrt/types.js +6 -2
  58. package/dist/src/orgrt/types.js.map +1 -1
  59. package/dist/src/update/checker.d.ts +3 -1
  60. package/dist/src/update/checker.d.ts.map +1 -1
  61. package/dist/src/update/checker.js +7 -3
  62. package/dist/src/update/checker.js.map +1 -1
  63. package/dist/src/update/index.d.ts +16 -0
  64. package/dist/src/update/index.d.ts.map +1 -1
  65. package/dist/src/update/index.js +45 -13
  66. package/dist/src/update/index.js.map +1 -1
  67. package/dist/src/update/refresh-worker.d.ts +9 -0
  68. package/dist/src/update/refresh-worker.d.ts.map +1 -0
  69. package/dist/src/update/refresh-worker.js +17 -0
  70. package/dist/src/update/refresh-worker.js.map +1 -0
  71. package/dist/src/utils/resource-governor.d.ts +44 -2
  72. package/dist/src/utils/resource-governor.d.ts.map +1 -1
  73. package/dist/src/utils/resource-governor.js +157 -40
  74. package/dist/src/utils/resource-governor.js.map +1 -1
  75. package/dist/tsconfig.tsbuildinfo +1 -1
  76. package/package.json +4 -4
@@ -43,12 +43,6 @@ const CDP_PORT_RELEASE_TIMEOUT_MS = process.env.CI ? 15_000 : 5_000;
43
43
  const CDP_PORT_RELEASE_POLL_MS = 25;
44
44
  const PROFILE_CLEANUP_RETRY_MS = 2_000;
45
45
 
46
- // Ports we launch headless Chrome on for detection runs. Deliberately away
47
- // from 9222 (the default `monomind browse` port): we must never attach to a
48
- // browser we did not launch, because browser.close() issues Browser.close.
49
- const MONOBROWSE_PORT_MIN = 9520;
50
- const MONOBROWSE_PORT_RANGE = 380;
51
-
52
46
  function serializeEvalArg(arg) {
53
47
  const json = JSON.stringify(arg);
54
48
  return json === undefined ? 'undefined' : json;
@@ -186,20 +180,16 @@ async function launchMonobrowseBrowser(options = {}) {
186
180
  const headless = options.headless ?? true;
187
181
  const launchArgs = options.launchArgs || (process.env.CI ? ['--no-sandbox', '--disable-setuid-sandbox'] : []);
188
182
 
183
+ // We must never attach to a browser we did not launch: browser.close()
184
+ // issues Browser.close. Picking a "free" port ourselves cannot guarantee
185
+ // that — the port is only probed, and a concurrent launch (node --test runs
186
+ // files in parallel) can pick the same one before either Chrome binds it.
187
+ // The losing Chrome then listens on [::1] instead and its launcher attaches
188
+ // to the winner's browser, which dies under it ("CDP connection closed")
189
+ // when the winner closes. Port 0 has Chrome take a kernel-assigned port and
190
+ // report it in its own profile dir, so the endpoint is always ours.
189
191
  const forcedPort = Number(process.env.MONODESIGN_MONOBROWSE_PORT);
190
- let port = null;
191
- if (Number.isInteger(forcedPort) && forcedPort > 0) {
192
- port = forcedPort;
193
- } else {
194
- // Pick a free-looking port; skip ports where a CDP endpoint already
195
- // listens so we never take over (and later Browser.close) someone
196
- // else's browser session.
197
- for (let attempt = 0; attempt < 5 && port === null; attempt++) {
198
- const candidate = MONOBROWSE_PORT_MIN + Math.floor(Math.random() * MONOBROWSE_PORT_RANGE);
199
- if (!(await mb.isPortOpen(candidate))) port = candidate;
200
- }
201
- if (port === null) throw new Error('Could not find a free CDP port for monobrowse');
202
- }
192
+ const port = Number.isInteger(forcedPort) && forcedPort > 0 ? forcedPort : 0;
203
193
 
204
194
  // CI runners (observed on the Windows GH Actions runner) are slower to get
205
195
  // Chrome's CDP port open than the 10s default — a batch of sequential
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Ownership-checked plan for `monomind cleanup`.
3
+ *
4
+ * Incident 2026-09-22: `cleanup --force` deleted a fixed list of paths
5
+ * (.agents/, .gemini/, AGENTS.md, data/, ...) wholesale. Run in a real
6
+ * repository it removed ~1000 git-tracked files and the project's memory
7
+ * store. The plan below removes a path only when monomind demonstrably owns
8
+ * it, and the same plan drives both the preview and `--force`, so the preview
9
+ * is exactly what `--force` will do.
10
+ *
11
+ * Rules, in order:
12
+ * 1. A git-tracked file, or a directory holding one, is never deleted or
13
+ * rewritten. Its untracked monomind-owned children may still be removed.
14
+ * 2. User data (memory stores, org memory, knowledge index, monograph and
15
+ * other databases, org configs, backups) is kept unless `--purge-data`.
16
+ * 3. Whole-path removal needs proof of ownership: a monomind-only namespace
17
+ * (.monomind/, monomind.config.json, legacy .swarm/.hive-mind), an entry
18
+ * listed in init's manifest, a file named `monomind*` inside a provider
19
+ * dir, or a file whose content is nothing but monomind marker blocks.
20
+ * 4. A file that mixes monomind marker blocks (or a `monomind` JSON entry)
21
+ * with other content only loses the monomind part.
22
+ * 5. Anything else is kept and reported with the reason.
23
+ */
24
+ export type CleanupAction = 'remove' | 'strip' | 'skip';
25
+ export interface CleanupPlanEntry {
26
+ /** Path relative to the project root, `/`-separated. */
27
+ path: string;
28
+ kind: 'dir' | 'file';
29
+ action: CleanupAction;
30
+ reason: string;
31
+ size: number;
32
+ /** True for user data that only `--purge-data` removes. */
33
+ data?: boolean;
34
+ /** New file content for `strip`. */
35
+ content?: string;
36
+ }
37
+ export interface CleanupPlanOptions {
38
+ keepConfig: boolean;
39
+ purgeData: boolean;
40
+ /** MONOMIND_MEMORY_PATH, if set. */
41
+ memoryPath?: string;
42
+ }
43
+ export type CleanupPlanResult = {
44
+ ok: true;
45
+ entries: CleanupPlanEntry[];
46
+ } | {
47
+ ok: false;
48
+ error: string;
49
+ };
50
+ /** Remove every monomind marker block. Returns null when there was none. */
51
+ export declare function stripMonomindBlocks(text: string): string | null;
52
+ /** Cheap, reliable signal that `cwd` is monomind's own source checkout. */
53
+ export declare function isMonomindSourceRepo(cwd: string): boolean;
54
+ export declare function buildCleanupPlan(cwd: string, opts: CleanupPlanOptions): CleanupPlanResult;
55
+ /** Apply one `remove`/`strip` entry; `skip` is a no-op. Throws on failure. */
56
+ export declare function applyCleanupEntry(cwd: string, e: CleanupPlanEntry): void;
57
+ //# sourceMappingURL=cleanup-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup-plan.d.ts","sourceRoot":"","sources":["../../../src/commands/cleanup-plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAQH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAExD,MAAM,WAAW,gBAAgB;IAC/B,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,gBAAgB,EAAE,CAAA;CAAE,GACzC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AA6CjC,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAY/D;AAED,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOzD;AAmRD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,iBAAiB,CAWzF;AAED,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAIxE"}
@@ -0,0 +1,379 @@
1
+ /**
2
+ * Ownership-checked plan for `monomind cleanup`.
3
+ *
4
+ * Incident 2026-09-22: `cleanup --force` deleted a fixed list of paths
5
+ * (.agents/, .gemini/, AGENTS.md, data/, ...) wholesale. Run in a real
6
+ * repository it removed ~1000 git-tracked files and the project's memory
7
+ * store. The plan below removes a path only when monomind demonstrably owns
8
+ * it, and the same plan drives both the preview and `--force`, so the preview
9
+ * is exactly what `--force` will do.
10
+ *
11
+ * Rules, in order:
12
+ * 1. A git-tracked file, or a directory holding one, is never deleted or
13
+ * rewritten. Its untracked monomind-owned children may still be removed.
14
+ * 2. User data (memory stores, org memory, knowledge index, monograph and
15
+ * other databases, org configs, backups) is kept unless `--purge-data`.
16
+ * 3. Whole-path removal needs proof of ownership: a monomind-only namespace
17
+ * (.monomind/, monomind.config.json, legacy .swarm/.hive-mind), an entry
18
+ * listed in init's manifest, a file named `monomind*` inside a provider
19
+ * dir, or a file whose content is nothing but monomind marker blocks.
20
+ * 4. A file that mixes monomind marker blocks (or a `monomind` JSON entry)
21
+ * with other content only loses the monomind part.
22
+ * 5. Anything else is kept and reported with the reason.
23
+ */
24
+ import { execFileSync } from 'node:child_process';
25
+ import { existsSync, lstatSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
26
+ import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
27
+ import { readInitManifest } from '../init/shared.js';
28
+ import { safeJsonRemove } from '../platform-adapters/merge.js';
29
+ /** Directories whose every untracked, non-data entry is monomind's own state. */
30
+ const NAMESPACE_DIRS = ['.monomind', '.swarm', '.hive-mind'];
31
+ /** Agent-tool directories shared with the user and other tools. */
32
+ const SHARED_DIRS = ['.claude', '.agents', '.gemini', '.opencode', '.codex', '.kimi-code'];
33
+ /** Root instruction files that may carry a monomind marker block. */
34
+ const MARKED_FILES = ['CLAUDE.md', 'AGENTS.md', 'GEMINI.md'];
35
+ /** Root JSON files where monomind registers one named entry. */
36
+ const JSON_ENTRY_FILES = [
37
+ { path: '.mcp.json', entry: ['mcpServers', 'monomind'] },
38
+ { path: 'opencode.json', entry: ['mcp', 'monomind'] },
39
+ ];
40
+ /** Data paths (relative to the project root), kept unless --purge-data. */
41
+ const DATA_PATHS = [
42
+ 'data/memory',
43
+ 'data/memory.db',
44
+ 'data/memory.db-wal',
45
+ 'data/memory.db-shm',
46
+ 'data/memory.graph',
47
+ 'memory',
48
+ '.monomind/data',
49
+ '.monomind/org-memory',
50
+ '.monomind/knowledge',
51
+ '.monomind/orgs',
52
+ '.monomind/org-skills',
53
+ '.monomind/backups',
54
+ '.monomind/episodic',
55
+ '.monomind/neural',
56
+ '.monomind/capture',
57
+ '.monomind/graph',
58
+ '.monomind/.monograph',
59
+ ];
60
+ /** Any database file is treated as data wherever it sits. */
61
+ const DATA_FILE_RE = /\.(db|sqlite|sqlite3)(-wal|-shm|-journal)?$/;
62
+ /** Generator title init writes as GEMINI.md's first line. */
63
+ const GEMINI_SIGNATURE_RE = /^# Monomind for Antigravity \(agy\) — v\S+\n/;
64
+ const MAX_MARKER_SCAN_BYTES = 2 * 1024 * 1024;
65
+ const NAMED_BLOCK_RE = /^[\t ]*(?:(?:#|\/\/)\s*|<!--\s*)?monomind:start\s+(\S+)\s*(?:-->)?[^\S\r\n]*(?:\r?\n|$)[\s\S]*?^[\t ]*(?:(?:#|\/\/)\s*|<!--\s*)?monomind:end\s+\1\s*(?:-->)?[^\S\r\n]*(?:\r?\n|$)/gm;
66
+ const TAGGED_BLOCK_RE = /^<!-- monomind-block:(\S+) -->\r?\n[\s\S]*?^<!-- \/monomind-block:\1 -->(?:\r?\n|$)/gm;
67
+ const BARE_HTML_BLOCK_RE = /<!--\s*monomind:start\s*-->[\s\S]*?<!--\s*monomind:end\s*-->\r?\n?/g;
68
+ /** Remove every monomind marker block. Returns null when there was none. */
69
+ export function stripMonomindBlocks(text) {
70
+ let count = 0;
71
+ const count1 = () => {
72
+ count++;
73
+ return '';
74
+ };
75
+ const out = text
76
+ .replace(TAGGED_BLOCK_RE, count1)
77
+ .replace(NAMED_BLOCK_RE, count1)
78
+ .replace(BARE_HTML_BLOCK_RE, count1);
79
+ if (count === 0)
80
+ return null;
81
+ return `${out.replace(/\n{3,}/g, '\n\n').trimEnd()}\n`;
82
+ }
83
+ /** Cheap, reliable signal that `cwd` is monomind's own source checkout. */
84
+ export function isMonomindSourceRepo(cwd) {
85
+ try {
86
+ const pkg = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8'));
87
+ return pkg.name === 'monomind' && existsSync(join(cwd, 'packages', '@monomind', 'cli'));
88
+ }
89
+ catch {
90
+ return false;
91
+ }
92
+ }
93
+ /**
94
+ * Tracked paths under `cwd`, relative to it. An empty set outside a git repo;
95
+ * an error string when a repo is present but cannot be read (fail closed).
96
+ */
97
+ function readTracked(cwd) {
98
+ const files = new Set();
99
+ const dirs = new Set();
100
+ let out;
101
+ try {
102
+ out = execFileSync('git', ['-C', cwd, 'ls-files', '-z', '--cached'], {
103
+ encoding: 'utf8',
104
+ stdio: ['ignore', 'pipe', 'pipe'],
105
+ maxBuffer: 256 * 1024 * 1024,
106
+ });
107
+ }
108
+ catch (err) {
109
+ const stderr = String(err.stderr ?? '');
110
+ if (/not a git repository/i.test(stderr))
111
+ return { files, dirs };
112
+ for (let dir = resolve(cwd);; dir = dirname(dir)) {
113
+ if (existsSync(join(dir, '.git'))) {
114
+ return `cannot list git-tracked files (${err.message.split('\n')[0]}); refusing to delete anything`;
115
+ }
116
+ if (dirname(dir) === dir)
117
+ break;
118
+ }
119
+ return { files, dirs };
120
+ }
121
+ for (const f of out.split('\0')) {
122
+ if (!f)
123
+ continue;
124
+ files.add(f);
125
+ for (let d = f; d.includes('/');) {
126
+ d = d.slice(0, d.lastIndexOf('/'));
127
+ if (dirs.has(d))
128
+ break;
129
+ dirs.add(d);
130
+ }
131
+ }
132
+ return { files, dirs };
133
+ }
134
+ function sizeOf(abs, depth = 0) {
135
+ if (depth > 20)
136
+ return 0;
137
+ try {
138
+ const st = lstatSync(abs);
139
+ if (!st.isDirectory())
140
+ return st.size;
141
+ let total = 0;
142
+ for (const name of readdirSync(abs))
143
+ total += sizeOf(join(abs, name), depth + 1);
144
+ return total;
145
+ }
146
+ catch {
147
+ return 0;
148
+ }
149
+ }
150
+ class Planner {
151
+ cwd;
152
+ tracked;
153
+ opts;
154
+ entries = [];
155
+ dataPaths;
156
+ owned;
157
+ constructor(cwd, tracked, opts) {
158
+ this.cwd = cwd;
159
+ this.tracked = tracked;
160
+ this.opts = opts;
161
+ this.dataPaths = new Set(DATA_PATHS);
162
+ if (opts.memoryPath) {
163
+ const abs = resolve(cwd, opts.memoryPath);
164
+ const rel = relative(cwd, abs);
165
+ if (rel && !rel.startsWith('..') && !isAbsolute(rel))
166
+ this.dataPaths.add(rel.split(sep).join('/'));
167
+ }
168
+ const m = readInitManifest(cwd);
169
+ this.owned = new Set([
170
+ ...(m?.skills ?? []).map((n) => `.claude/skills/${n}`),
171
+ ...(m?.commands ?? []).map((n) => `.claude/commands/${n}`),
172
+ ...(m?.agents ?? []).map((n) => `.claude/agents/${n}`),
173
+ ...(m?.kimiSkills ?? []).map((n) => `.kimi-code/skills/${n}`),
174
+ ...(m?.kimiPluginCommands ?? []).map((n) => `.kimi-code/plugin/commands/${n}`),
175
+ ...(m?.opencodeSkills ?? []).map((n) => `.opencode/skills/${n}`),
176
+ ]);
177
+ }
178
+ abs(rel) {
179
+ return join(this.cwd, ...rel.split('/'));
180
+ }
181
+ isData(rel) {
182
+ return this.dataPaths.has(rel) || DATA_FILE_RE.test(rel);
183
+ }
184
+ hasTracked(rel) {
185
+ return this.tracked.files.has(rel) || this.tracked.dirs.has(rel);
186
+ }
187
+ add(rel, kind, action, reason, extra) {
188
+ this.entries.push({ path: rel, kind, action, reason, size: sizeOf(this.abs(rel)), ...extra });
189
+ }
190
+ kindOf(rel) {
191
+ try {
192
+ const st = lstatSync(this.abs(rel));
193
+ return st.isDirectory() ? 'dir' : 'file';
194
+ }
195
+ catch {
196
+ return null;
197
+ }
198
+ }
199
+ /** Protected data paths outside the directories walked below (data/, memory/, MONOMIND_MEMORY_PATH). */
200
+ planData() {
201
+ for (const rel of [...this.dataPaths].sort()) {
202
+ const top = rel.split('/')[0];
203
+ if (NAMESPACE_DIRS.includes(top) || SHARED_DIRS.includes(top))
204
+ continue; // walked
205
+ const kind = this.kindOf(rel);
206
+ if (kind)
207
+ this.dataEntry(rel, kind);
208
+ }
209
+ }
210
+ dataEntry(rel, kind) {
211
+ if (this.hasTracked(rel))
212
+ this.add(rel, kind, 'skip', 'tracked by git', { data: true });
213
+ else if (this.opts.purgeData)
214
+ this.add(rel, kind, 'remove', 'user data (--purge-data)', { data: true });
215
+ else
216
+ this.add(rel, kind, 'skip', 'user data — kept unless --purge-data', { data: true });
217
+ }
218
+ /**
219
+ * Walk a directory. `ownsUnmarked` says whether an untracked entry with no
220
+ * other evidence is ours (namespace dirs) or not (shared provider dirs).
221
+ * Returns true when every entry below was planned for removal, so the
222
+ * caller can collapse them into one removal of this directory.
223
+ */
224
+ walk(rel, ownsUnmarked) {
225
+ const kind = this.kindOf(rel);
226
+ if (!kind)
227
+ return true;
228
+ if (this.isData(rel)) {
229
+ this.dataEntry(rel, kind);
230
+ return this.opts.purgeData && !this.hasTracked(rel);
231
+ }
232
+ if (this.tracked.files.has(rel)) {
233
+ this.add(rel, kind, 'skip', 'tracked by git');
234
+ return false;
235
+ }
236
+ const owned = this.owned.has(rel) || (ownsUnmarked && kind === 'file');
237
+ if (kind === 'file' || lstatSync(this.abs(rel)).isSymbolicLink()) {
238
+ if (owned || /^monomind/i.test(rel.slice(rel.lastIndexOf('/') + 1))) {
239
+ this.add(rel, kind, 'remove', this.owned.has(rel) ? 'listed in init manifest' : 'monomind-owned');
240
+ return true;
241
+ }
242
+ return this.planMarkedFile(rel);
243
+ }
244
+ if (!this.tracked.dirs.has(rel) &&
245
+ (this.owned.has(rel) || ownsUnmarked) &&
246
+ !this.containsData(rel)) {
247
+ this.add(rel, 'dir', 'remove', this.owned.has(rel) ? 'listed in init manifest' : 'monomind-owned');
248
+ return true;
249
+ }
250
+ const start = this.entries.length;
251
+ let all = true;
252
+ for (const name of readdirSync(this.abs(rel)).sort()) {
253
+ if (!this.walk(`${rel}/${name}`, ownsUnmarked || this.owned.has(rel)))
254
+ all = false;
255
+ }
256
+ if (all && !this.tracked.dirs.has(rel)) {
257
+ // Every child is ours: remove the directory as one unit instead.
258
+ this.entries.splice(start);
259
+ this.add(rel, 'dir', 'remove', 'contains only monomind-owned content');
260
+ return true;
261
+ }
262
+ return false;
263
+ }
264
+ containsData(rel, depth = 0) {
265
+ if (this.isData(rel))
266
+ return true;
267
+ if (depth > 20 || this.kindOf(rel) !== 'dir')
268
+ return false;
269
+ try {
270
+ return readdirSync(this.abs(rel)).some((n) => this.containsData(`${rel}/${n}`, depth + 1));
271
+ }
272
+ catch {
273
+ return true; // unreadable: assume it may hold data
274
+ }
275
+ }
276
+ /** A file carrying monomind marker blocks: strip them, delete only if nothing else remains. */
277
+ planMarkedFile(rel) {
278
+ if (this.tracked.files.has(rel)) {
279
+ this.add(rel, 'file', 'skip', 'tracked by git');
280
+ return false;
281
+ }
282
+ let text;
283
+ try {
284
+ const st = lstatSync(this.abs(rel));
285
+ // Never read or rewrite through a symlink: the target may be outside the project.
286
+ if (st.isSymbolicLink() || st.size > MAX_MARKER_SCAN_BYTES)
287
+ throw new Error('not scanned');
288
+ text = readFileSync(this.abs(rel), 'utf8');
289
+ }
290
+ catch {
291
+ this.add(rel, 'file', 'skip', 'no monomind ownership evidence');
292
+ return false;
293
+ }
294
+ if (rel === 'GEMINI.md' &&
295
+ GEMINI_SIGNATURE_RE.test(text) &&
296
+ stripMonomindBlocks(text) === null) {
297
+ this.add(rel, 'file', 'remove', 'generated by monomind init (signature line)');
298
+ return true;
299
+ }
300
+ const stripped = stripMonomindBlocks(text);
301
+ if (stripped === null) {
302
+ this.add(rel, 'file', 'skip', 'no monomind ownership evidence');
303
+ return false;
304
+ }
305
+ if (stripped.trim() === '') {
306
+ this.add(rel, 'file', 'remove', 'contains only monomind blocks');
307
+ return true;
308
+ }
309
+ this.add(rel, 'file', 'strip', 'remove monomind block, keep the rest', { content: stripped });
310
+ return false;
311
+ }
312
+ planJsonEntry(rel, entryPath) {
313
+ if (this.kindOf(rel) !== 'file')
314
+ return;
315
+ if (this.tracked.files.has(rel)) {
316
+ this.add(rel, 'file', 'skip', 'tracked by git');
317
+ return;
318
+ }
319
+ const text = readFileSync(this.abs(rel), 'utf8');
320
+ const res = safeJsonRemove(text, entryPath.slice(0, -1), entryPath[entryPath.length - 1]);
321
+ if (res.diagnostics.length > 0) {
322
+ this.add(rel, 'file', 'skip', 'unparseable JSON — left alone');
323
+ return;
324
+ }
325
+ if (res.content === text) {
326
+ this.add(rel, 'file', 'skip', 'no monomind entry');
327
+ return;
328
+ }
329
+ const rest = JSON.parse(res.content);
330
+ const parent = rest[entryPath[0]];
331
+ const empty = Object.keys(rest).length === 1 &&
332
+ !!parent &&
333
+ typeof parent === 'object' &&
334
+ Object.keys(parent).length === 0;
335
+ if (empty)
336
+ this.add(rel, 'file', 'remove', 'contains only the monomind entry');
337
+ else
338
+ this.add(rel, 'file', 'strip', 'remove the monomind entry, keep the rest', {
339
+ content: res.content,
340
+ });
341
+ }
342
+ planConfigFile(rel) {
343
+ if (this.kindOf(rel) !== 'file')
344
+ return;
345
+ if (this.tracked.files.has(rel))
346
+ this.add(rel, 'file', 'skip', 'tracked by git');
347
+ else if (this.opts.keepConfig)
348
+ this.add(rel, 'file', 'skip', 'preserved (--keep-config)');
349
+ else
350
+ this.add(rel, 'file', 'remove', 'monomind-owned');
351
+ }
352
+ }
353
+ export function buildCleanupPlan(cwd, opts) {
354
+ const tracked = readTracked(cwd);
355
+ if (typeof tracked === 'string')
356
+ return { ok: false, error: tracked };
357
+ const p = new Planner(cwd, tracked, opts);
358
+ for (const d of NAMESPACE_DIRS)
359
+ p.walk(d, true);
360
+ for (const d of SHARED_DIRS)
361
+ p.walk(d, false);
362
+ p.planConfigFile('monomind.config.json');
363
+ for (const f of MARKED_FILES)
364
+ if (existsSync(join(cwd, f)))
365
+ p.planMarkedFile(f);
366
+ for (const { path, entry } of JSON_ENTRY_FILES)
367
+ p.planJsonEntry(path, entry);
368
+ p.planData();
369
+ return { ok: true, entries: p.entries };
370
+ }
371
+ /** Apply one `remove`/`strip` entry; `skip` is a no-op. Throws on failure. */
372
+ export function applyCleanupEntry(cwd, e) {
373
+ const abs = join(cwd, ...e.path.split('/'));
374
+ if (e.action === 'remove')
375
+ rmSync(abs, { recursive: e.kind === 'dir', force: true });
376
+ else if (e.action === 'strip' && e.content !== undefined)
377
+ writeFileSync(abs, e.content);
378
+ }
379
+ //# sourceMappingURL=cleanup-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup-plan.js","sourceRoot":"","sources":["../../../src/commands/cleanup-plan.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../../src/commands/cleanup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH,OAAO,KAAK,EAAE,OAAO,EAAiC,MAAM,aAAa,CAAC;AA6B1E,6EAA6E;AAC7E,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,OAAO,GAClB,gBAAgB,EAAE,CA+EpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,EAAE,CA6D7E;AAoGD;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,OAiZ5B,CAAC;eAEa,cAAc"}
1
+ {"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../../src/commands/cleanup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkBH,OAAO,KAAK,EAAE,OAAO,EAAiC,MAAM,aAAa,CAAC;AAa1E,6EAA6E;AAC7E,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,OAAO,GAClB,gBAAgB,EAAE,CA+EpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,EAAE,CA6D7E;AAyDD;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,OA6V5B,CAAC;eA0Ba,cAAc"}