crewly 1.20.158 → 1.20.159

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 (34) hide show
  1. package/config/skills/registry.json +55 -4
  2. package/dist/backend/backend/src/constants.d.ts +54 -3
  3. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  4. package/dist/backend/backend/src/constants.js +54 -3
  5. package/dist/backend/backend/src/constants.js.map +1 -1
  6. package/dist/backend/backend/src/controllers/worktree-janitor/worktree-janitor.routes.d.ts +2 -1
  7. package/dist/backend/backend/src/controllers/worktree-janitor/worktree-janitor.routes.d.ts.map +1 -1
  8. package/dist/backend/backend/src/controllers/worktree-janitor/worktree-janitor.routes.js +4 -2
  9. package/dist/backend/backend/src/controllers/worktree-janitor/worktree-janitor.routes.js.map +1 -1
  10. package/dist/backend/backend/src/index.d.ts.map +1 -1
  11. package/dist/backend/backend/src/index.js +17 -2
  12. package/dist/backend/backend/src/index.js.map +1 -1
  13. package/dist/backend/backend/src/services/worktree/low-disk-guard.d.ts +109 -0
  14. package/dist/backend/backend/src/services/worktree/low-disk-guard.d.ts.map +1 -0
  15. package/dist/backend/backend/src/services/worktree/low-disk-guard.js +148 -0
  16. package/dist/backend/backend/src/services/worktree/low-disk-guard.js.map +1 -0
  17. package/dist/backend/backend/src/services/worktree/scratch-janitor.d.ts +140 -0
  18. package/dist/backend/backend/src/services/worktree/scratch-janitor.d.ts.map +1 -0
  19. package/dist/backend/backend/src/services/worktree/scratch-janitor.js +249 -0
  20. package/dist/backend/backend/src/services/worktree/scratch-janitor.js.map +1 -0
  21. package/dist/backend/backend/src/services/worktree/worktree-janitor.git.d.ts +92 -1
  22. package/dist/backend/backend/src/services/worktree/worktree-janitor.git.d.ts.map +1 -1
  23. package/dist/backend/backend/src/services/worktree/worktree-janitor.git.js +207 -1
  24. package/dist/backend/backend/src/services/worktree/worktree-janitor.git.js.map +1 -1
  25. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts +135 -28
  26. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts.map +1 -1
  27. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js +248 -39
  28. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js.map +1 -1
  29. package/dist/backend/build-info.json +2 -2
  30. package/dist/cli/backend/src/constants.d.ts +54 -3
  31. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  32. package/dist/cli/backend/src/constants.js +54 -3
  33. package/dist/cli/backend/src/constants.js.map +1 -1
  34. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scratch-janitor.js","sourceRoot":"","sources":["../../../../../../backend/src/services/worktree/scratch-janitor.ts"],"names":[],"mappings":"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"}
@@ -30,7 +30,8 @@ export interface RunCommandOptions {
30
30
  * Run a command without a shell and never throw.
31
31
  *
32
32
  * Git and gh are told never to prompt (no credential dialogs, no pager), so a
33
- * periodic background job cannot hang on input.
33
+ * periodic background job cannot hang on input, and git takes no optional
34
+ * locks (a status never rewrites the index).
34
35
  *
35
36
  * @param file - Executable (e.g. `git`, `gh`, or an absolute path)
36
37
  * @param args - Arguments
@@ -128,4 +129,94 @@ export declare function listProcessCwds(): Promise<string[] | null>;
128
129
  * @returns True when `CREWLY_WORKTREE_JANITOR` is `0`/`off`/`false`/`no`
129
130
  */
130
131
  export declare function isJanitorDisabled(env?: NodeJS.ProcessEnv): boolean;
132
+ /**
133
+ * Yield to the event loop every YIELD_EVERY_ENTRIES calls, so a long
134
+ * filesystem walk never holds up Slack, relay polls or PTY I/O.
135
+ */
136
+ export declare class EventLoopYielder {
137
+ private count;
138
+ /**
139
+ * Count one unit of work; every YIELD_EVERY_ENTRIES units, wait one
140
+ * `setImmediate` turn.
141
+ *
142
+ * @returns Resolves when the caller may continue
143
+ */
144
+ tick(): Promise<void>;
145
+ }
146
+ /**
147
+ * Git dir a `.git` file points to (`gitdir: <path>`), resolved against `dir`.
148
+ *
149
+ * @param dir - Directory holding the `.git` file
150
+ * @returns Absolute git dir, or null when there is no readable `.git` file
151
+ */
152
+ export declare function readGitFilePointer(dir: string): Promise<string | null>;
153
+ /**
154
+ * Main worktree of the repo a linked worktree belongs to, read from the
155
+ * worktree's `.git` file (`gitdir: <main>/.git/worktrees/<name>`). Returns
156
+ * null for anything else: a `.git` directory (a normal clone), a submodule
157
+ * (`gitdir: …/.git/modules/…`), or an unreadable file.
158
+ *
159
+ * @param dir - Directory that may be a linked worktree
160
+ * @returns Absolute path of the main worktree, or null
161
+ *
162
+ * @example
163
+ * ```typescript
164
+ * // /tmp/visa-cm-wt/.git contains "gitdir: /src/ce-core/.git/worktrees/visa-cm-wt"
165
+ * await mainRepoOfLinkedWorktree('/tmp/visa-cm-wt'); // '/src/ce-core'
166
+ * ```
167
+ */
168
+ export declare function mainRepoOfLinkedWorktree(dir: string): Promise<string | null>;
169
+ /** A git checkout found on disk. */
170
+ export interface FoundRepo {
171
+ /** Directory holding `.git` */
172
+ path: string;
173
+ /** `dir` for a `.git` directory (clone / main worktree), `file` for a `.git` file (linked worktree or submodule) */
174
+ kind: 'dir' | 'file';
175
+ }
176
+ /**
177
+ * Find git checkouts under `root` without following symlinks. A directory
178
+ * with a `.git` directory or file is a checkout and is not descended into;
179
+ * `node_modules` and `.git` are never descended into. Fully async; yields to
180
+ * the event loop every few directories.
181
+ *
182
+ * @param root - Directory to search (itself included, at depth 0)
183
+ * @param maxDepth - Deepest level searched (root = 0)
184
+ * @param maxDirs - Stop after visiting this many directories
185
+ * @returns Checkouts found, in walk order
186
+ */
187
+ export declare function findGitCheckouts(root: string, maxDepth: number, maxDirs?: number): Promise<FoundRepo[]>;
188
+ /**
189
+ * Main worktrees of every repo that owns a linked worktree somewhere under
190
+ * the given roots (e.g. `/tmp/claude-501/visa-cm-wt` → `~/src/ce-core`), so
191
+ * repos that are not registered projects still get their temp worktrees
192
+ * cleaned. Visits at most DISCOVERY_MAX_DIRS directories per root.
193
+ *
194
+ * @param roots - Temp roots to scan (missing roots are skipped)
195
+ * @returns De-duplicated main-worktree paths
196
+ */
197
+ export declare function discoverLinkedWorktreeRepos(roots: readonly string[]): Promise<string[]>;
198
+ /**
199
+ * Newest mtime (ms) of `dir` and everything within `depth` levels below it,
200
+ * using lstat (symlinks are not followed). Async; yields every few entries.
201
+ *
202
+ * @param dir - Directory
203
+ * @param depth - Levels below `dir` to include (0 = only `dir`)
204
+ * @returns Newest mtime in ms, or null when `dir` cannot be stat'ed
205
+ */
206
+ export declare function latestTreeMtimeMs(dir: string, depth: number): Promise<number | null>;
207
+ /**
208
+ * Disk usage of a path in bytes (`du -sk` in a child process, so the event
209
+ * loop is never blocked; `du` does not follow symlinks).
210
+ *
211
+ * @param p - File or directory
212
+ * @returns Bytes, or null when `du` failed or timed out
213
+ */
214
+ export declare function diskUsageBytes(p: string): Promise<number | null>;
215
+ /**
216
+ * Human-readable size (`1.8 GB`, `512 MB`).
217
+ *
218
+ * @param bytes - Size in bytes
219
+ * @returns Short string with one decimal for GB
220
+ */
221
+ export declare function formatBytes(bytes: number): string;
131
222
  //# sourceMappingURL=worktree-janitor.git.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"worktree-janitor.git.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/worktree/worktree-janitor.git.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,2FAA2F;AAC3F,MAAM,WAAW,aAAa;IAC7B,gEAAgE;IAChE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;CACf;AAED,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IACjC,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,aAAa,CAAC,CAmChH;AAED,oDAAoD;AACpD,MAAM,WAAW,iBAAiB;IACjC,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,wEAAwE;IACxE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,8BAA8B;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,iCAAiC;IACjC,QAAQ,EAAE,OAAO,CAAC;IAClB,6DAA6D;IAC7D,MAAM,EAAE,OAAO,CAAC;IAChB,8BAA8B;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,QAAQ,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,MAAM,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,EAAE,CA+B3E;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAMnE;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAehG;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CA6BhE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAI/E"}
1
+ {"version":3,"file":"worktree-janitor.git.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/worktree/worktree-janitor.git.ts"],"names":[],"mappings":"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"}
@@ -17,7 +17,8 @@ import { WORKTREE_JANITOR_CONSTANTS } from '../../constants.js';
17
17
  * Run a command without a shell and never throw.
18
18
  *
19
19
  * Git and gh are told never to prompt (no credential dialogs, no pager), so a
20
- * periodic background job cannot hang on input.
20
+ * periodic background job cannot hang on input, and git takes no optional
21
+ * locks (a status never rewrites the index).
21
22
  *
22
23
  * @param file - Executable (e.g. `git`, `gh`, or an absolute path)
23
24
  * @param args - Arguments
@@ -41,6 +42,9 @@ export function runCommand(file, args, options = {}) {
41
42
  ...process.env,
42
43
  GIT_TERMINAL_PROMPT: '0',
43
44
  GIT_PAGER: 'cat',
45
+ // `git status` must not rewrite the index: that would bump its
46
+ // mtime (resetting the idle clock) and contend with agents' git.
47
+ GIT_OPTIONAL_LOCKS: '0',
44
48
  GH_PROMPT_DISABLED: '1',
45
49
  GH_NO_UPDATE_NOTIFIER: '1',
46
50
  ...(options.env ?? {}),
@@ -235,4 +239,206 @@ export function isJanitorDisabled(env = process.env) {
235
239
  return false;
236
240
  return WORKTREE_JANITOR_CONSTANTS.DISABLED_VALUES.includes(raw.trim().toLowerCase());
237
241
  }
242
+ /**
243
+ * Yield to the event loop every YIELD_EVERY_ENTRIES calls, so a long
244
+ * filesystem walk never holds up Slack, relay polls or PTY I/O.
245
+ */
246
+ export class EventLoopYielder {
247
+ count = 0;
248
+ /**
249
+ * Count one unit of work; every YIELD_EVERY_ENTRIES units, wait one
250
+ * `setImmediate` turn.
251
+ *
252
+ * @returns Resolves when the caller may continue
253
+ */
254
+ async tick() {
255
+ this.count++;
256
+ if (this.count % WORKTREE_JANITOR_CONSTANTS.YIELD_EVERY_ENTRIES === 0) {
257
+ await new Promise((resolve) => setImmediate(resolve));
258
+ }
259
+ }
260
+ }
261
+ /** lstat that resolves null instead of throwing. */
262
+ async function lstatOrNull(p) {
263
+ try {
264
+ return await fs.promises.lstat(p);
265
+ }
266
+ catch {
267
+ return null;
268
+ }
269
+ }
270
+ /**
271
+ * Git dir a `.git` file points to (`gitdir: <path>`), resolved against `dir`.
272
+ *
273
+ * @param dir - Directory holding the `.git` file
274
+ * @returns Absolute git dir, or null when there is no readable `.git` file
275
+ */
276
+ export async function readGitFilePointer(dir) {
277
+ try {
278
+ const m = /^gitdir:\s*(.+?)\s*$/m.exec(await fs.promises.readFile(path.join(dir, '.git'), 'utf-8'));
279
+ return m ? path.resolve(dir, m[1]) : null;
280
+ }
281
+ catch {
282
+ return null;
283
+ }
284
+ }
285
+ /**
286
+ * Main worktree of the repo a linked worktree belongs to, read from the
287
+ * worktree's `.git` file (`gitdir: <main>/.git/worktrees/<name>`). Returns
288
+ * null for anything else: a `.git` directory (a normal clone), a submodule
289
+ * (`gitdir: …/.git/modules/…`), or an unreadable file.
290
+ *
291
+ * @param dir - Directory that may be a linked worktree
292
+ * @returns Absolute path of the main worktree, or null
293
+ *
294
+ * @example
295
+ * ```typescript
296
+ * // /tmp/visa-cm-wt/.git contains "gitdir: /src/ce-core/.git/worktrees/visa-cm-wt"
297
+ * await mainRepoOfLinkedWorktree('/tmp/visa-cm-wt'); // '/src/ce-core'
298
+ * ```
299
+ */
300
+ export async function mainRepoOfLinkedWorktree(dir) {
301
+ const st = await lstatOrNull(path.join(dir, '.git'));
302
+ if (!st?.isFile())
303
+ return null;
304
+ const gitDir = await readGitFilePointer(dir);
305
+ if (!gitDir)
306
+ return null;
307
+ const worktreesDir = path.dirname(gitDir);
308
+ if (path.basename(worktreesDir) !== 'worktrees')
309
+ return null;
310
+ const commonDir = path.dirname(worktreesDir);
311
+ if (path.basename(commonDir) !== '.git')
312
+ return null;
313
+ return path.dirname(commonDir);
314
+ }
315
+ /**
316
+ * Find git checkouts under `root` without following symlinks. A directory
317
+ * with a `.git` directory or file is a checkout and is not descended into;
318
+ * `node_modules` and `.git` are never descended into. Fully async; yields to
319
+ * the event loop every few directories.
320
+ *
321
+ * @param root - Directory to search (itself included, at depth 0)
322
+ * @param maxDepth - Deepest level searched (root = 0)
323
+ * @param maxDirs - Stop after visiting this many directories
324
+ * @returns Checkouts found, in walk order
325
+ */
326
+ export async function findGitCheckouts(root, maxDepth, maxDirs = Number.POSITIVE_INFINITY) {
327
+ const out = [];
328
+ const yielder = new EventLoopYielder();
329
+ let visited = 0;
330
+ const walk = async (dir, depth) => {
331
+ if (visited >= maxDirs)
332
+ return;
333
+ visited++;
334
+ await yielder.tick();
335
+ const dotGit = await lstatOrNull(path.join(dir, '.git'));
336
+ if (dotGit && (dotGit.isDirectory() || dotGit.isFile())) {
337
+ out.push({ path: dir, kind: dotGit.isDirectory() ? 'dir' : 'file' });
338
+ return;
339
+ }
340
+ if (depth >= maxDepth)
341
+ return;
342
+ let entries;
343
+ try {
344
+ entries = await fs.promises.readdir(dir, { withFileTypes: true });
345
+ }
346
+ catch {
347
+ return;
348
+ }
349
+ for (const e of entries) {
350
+ // Dirent.isDirectory() is false for symlinks, so links are never followed.
351
+ if (!e.isDirectory() || WORKTREE_JANITOR_CONSTANTS.SEARCH_SKIP_DIRS.includes(e.name))
352
+ continue;
353
+ await walk(path.join(dir, e.name), depth + 1);
354
+ }
355
+ };
356
+ await walk(root, 0);
357
+ return out;
358
+ }
359
+ /**
360
+ * Main worktrees of every repo that owns a linked worktree somewhere under
361
+ * the given roots (e.g. `/tmp/claude-501/visa-cm-wt` → `~/src/ce-core`), so
362
+ * repos that are not registered projects still get their temp worktrees
363
+ * cleaned. Visits at most DISCOVERY_MAX_DIRS directories per root.
364
+ *
365
+ * @param roots - Temp roots to scan (missing roots are skipped)
366
+ * @returns De-duplicated main-worktree paths
367
+ */
368
+ export async function discoverLinkedWorktreeRepos(roots) {
369
+ const out = new Set();
370
+ for (const root of roots) {
371
+ if (!(await lstatOrNull(root)))
372
+ continue;
373
+ const found = await findGitCheckouts(root, WORKTREE_JANITOR_CONSTANTS.DISCOVERY_DEPTH, WORKTREE_JANITOR_CONSTANTS.DISCOVERY_MAX_DIRS);
374
+ for (const f of found) {
375
+ if (f.kind !== 'file')
376
+ continue;
377
+ const main = await mainRepoOfLinkedWorktree(f.path);
378
+ if (main && (await lstatOrNull(main)))
379
+ out.add(main);
380
+ }
381
+ }
382
+ return [...out];
383
+ }
384
+ /**
385
+ * Newest mtime (ms) of `dir` and everything within `depth` levels below it,
386
+ * using lstat (symlinks are not followed). Async; yields every few entries.
387
+ *
388
+ * @param dir - Directory
389
+ * @param depth - Levels below `dir` to include (0 = only `dir`)
390
+ * @returns Newest mtime in ms, or null when `dir` cannot be stat'ed
391
+ */
392
+ export async function latestTreeMtimeMs(dir, depth) {
393
+ let newest = null;
394
+ const yielder = new EventLoopYielder();
395
+ const visit = async (p, level) => {
396
+ await yielder.tick();
397
+ const st = await lstatOrNull(p);
398
+ if (!st)
399
+ return;
400
+ if (newest === null || st.mtimeMs > newest)
401
+ newest = st.mtimeMs;
402
+ if (level >= depth || !st.isDirectory())
403
+ return;
404
+ let names;
405
+ try {
406
+ names = await fs.promises.readdir(p);
407
+ }
408
+ catch {
409
+ return;
410
+ }
411
+ for (const n of names)
412
+ await visit(path.join(p, n), level + 1);
413
+ };
414
+ await visit(dir, 0);
415
+ return newest;
416
+ }
417
+ /**
418
+ * Disk usage of a path in bytes (`du -sk` in a child process, so the event
419
+ * loop is never blocked; `du` does not follow symlinks).
420
+ *
421
+ * @param p - File or directory
422
+ * @returns Bytes, or null when `du` failed or timed out
423
+ */
424
+ export async function diskUsageBytes(p) {
425
+ const r = await runCommand('du', ['-sk', p], { timeoutMs: WORKTREE_JANITOR_CONSTANTS.DU_TIMEOUT_MS });
426
+ const kb = Number.parseInt(r.stdout.trim().split(/\s+/)[0] ?? '', 10);
427
+ return Number.isFinite(kb) ? kb * 1024 : null;
428
+ }
429
+ /**
430
+ * Human-readable size (`1.8 GB`, `512 MB`).
431
+ *
432
+ * @param bytes - Size in bytes
433
+ * @returns Short string with one decimal for GB
434
+ */
435
+ export function formatBytes(bytes) {
436
+ const gb = bytes / 1024 ** 3;
437
+ if (gb >= 1)
438
+ return `${gb.toFixed(1)} GB`;
439
+ const mb = bytes / 1024 ** 2;
440
+ if (mb >= 1)
441
+ return `${Math.round(mb)} MB`;
442
+ return `${Math.round(bytes / 1024)} KB`;
443
+ }
238
444
  //# sourceMappingURL=worktree-janitor.git.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"worktree-janitor.git.js","sourceRoot":"","sources":["../../../../../../backend/src/services/worktree/worktree-janitor.git.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worktree-janitor.git.js","sourceRoot":"","sources":["../../../../../../backend/src/services/worktree/worktree-janitor.git.ts"],"names":[],"mappings":"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"}
@@ -1,43 +1,47 @@
1
1
  /**
2
- * Worktree janitor — removes git worktrees whose work has landed.
2
+ * Disk janitor — removes git worktrees whose work has landed, stale Claude
3
+ * Code session scratch dirs, and watches free disk space.
3
4
  *
4
- * Agents create a worktree per code task (`<repo>/.claude/worktrees/<name>`,
5
- * `/tmp/crewly-worktrees/<session>-<slug>`) and never delete it; a busy Mac
6
- * collected 30+ of them, tens of GB. Owner decision: once the PR is merged the
7
- * worktree goes away by itself.
5
+ * Agents create a worktree per code task and never delete it — under
6
+ * `<repo>/.claude/worktrees/`, `/tmp/crewly-worktrees/`, but also at
7
+ * arbitrary paths (`/private/tmp/claude-501/visa-cm-wt`, `../crewly-wt-805`),
8
+ * each with its own node_modules. They also clone whole repos into Claude
9
+ * Code's per-session temp dirs. A Mac filled its disk (ENOSPC) with both.
10
+ * Owner decision: finished work goes away by itself.
8
11
  *
9
12
  * ## Which repos
10
13
  * Every registered project path (projects store) that is inside a git repo,
11
- * plus the Crewly package root when it is a dev checkout. Repos are
12
- * de-duplicated by their main worktree.
14
+ * the Crewly package root when it is a dev checkout, and every repo that owns
15
+ * a linked worktree found under the temp roots (`/tmp`, os.tmpdir(), and the
16
+ * Claude scratch roots `<tmp>/claude-<uid>`, searched a few levels deep) — so
17
+ * a repo that is not a registered project still gets its temp worktrees
18
+ * cleaned. Repos are de-duplicated by their main worktree.
13
19
  *
14
- * ## Removal rules — a worktree is removed only when ALL hold
20
+ * ## Worktree removal rules — a worktree is removed only when ALL hold
15
21
  * 1. It is not the main worktree, not bare, and not `prunable` (a missing
16
- * directory is left to `git worktree prune`).
22
+ * directory is left to `git worktree prune`). Any other linked worktree of
23
+ * a known repo is a candidate, wherever it lives and whatever its branch.
17
24
  * 2. It is not locked (`git worktree lock`; Claude Code locks the worktree of
18
25
  * a running subagent).
19
26
  * 3. It is not under `<repo>/.crewly/worktrees/` — that directory belongs to
20
27
  * the per-WorkItem worktree feature (#814), which does its own
21
28
  * WorkItem-aware cleanup.
22
- * 4. It is an agent worktree: its path is under `<main>/.claude/worktrees/`
23
- * or `<tmp>/crewly-worktrees/` (`/tmp` and `os.tmpdir()`), OR its branch
24
- * starts with an agent-only prefix (`worktree-agent-`, Claude Code's
25
- * automatic subagent branch). Human-made worktrees such as
26
- * `../crewly-wt-805` on `fix/...` are never touched. Deliberately narrow:
27
- * a false "keep" costs disk, a false "remove" costs work.
28
- * 5. Nothing is working in it: no Crewly agent session was started in it and
29
+ * 4. Nothing is working in it: no Crewly agent session was started in it and
29
30
  * no process of this user (PTY shells, runtimes, editors, test runners)
30
31
  * has its cwd inside it. If the process probe fails, everything is kept.
31
- * 6. It was last touched more than 2 hours ago (newest mtime of the
32
- * directory and its git dir's index / HEAD / logs/HEAD).
33
- * 7. `git status --porcelain --untracked-files=all` is empty: no tracked
32
+ * 5. It is idle: last touched (newest mtime of the directory and its git
33
+ * dir's index / HEAD / logs/HEAD) more than 2 hours ago in a known agent
34
+ * location (`<main>/.claude/worktrees/`, `<tmp>/crewly-worktrees/`, or a
35
+ * `worktree-agent-*` branch), more than 24 hours ago anywhere else.
36
+ * 6. `git status --porcelain --untracked-files=all` is empty: no tracked
34
37
  * change and no untracked file. Ignored files (node_modules, dist) do not
35
38
  * count. A failing status keeps it.
36
- * 8. Its work has landed: HEAD is an ancestor of `origin/<default branch>`
39
+ * 7. Its work has landed: HEAD is an ancestor of `origin/<default branch>`
37
40
  * after a quiet `git fetch` (fetch errors ignored), OR — when `gh` is
38
41
  * installed and authenticated — a MERGED PR has this branch as head AND
39
42
  * its head commit equals the worktree HEAD (squash merges; commits made
40
- * after the merge keep the worktree).
43
+ * after the merge keep the worktree). A repo without an origin (not on
44
+ * GitHub) only has the ancestor check, so its worktrees are kept.
41
45
  *
42
46
  * ## Removal
43
47
  * `git worktree remove <path>` without `--force`. If git refuses although
@@ -45,13 +49,34 @@
45
49
  * no submodules, it is retried once with `--force`. Then the local branch is
46
50
  * deleted (never a protected name), and `git worktree prune` runs per repo.
47
51
  *
52
+ * ## Scratch sweep
53
+ * After the worktrees, stale Claude Code session dirs
54
+ * (`<tmp>/claude-<uid>/<slug>/<uuid>/`) are deleted when idle for 3 days,
55
+ * unused, and every git repo inside is clean and fully pushed. See
56
+ * {@link module:services/worktree/scratch-janitor} for the rules.
57
+ *
58
+ * ## Low-disk guard
59
+ * Every 10 minutes the free space of the volume holding CREWLY_HOME is read.
60
+ * Below 15 GB a pass runs at once (at most one per 30 minutes) with every
61
+ * idle threshold halved (never below 2 h); every pass started while space is
62
+ * low uses the halved thresholds. If space is still below 15 GB the owner is
63
+ * told, at most once per 24 h, with the free space and the 5 biggest items
64
+ * the janitor left and why; below 5 GB the notice is urgent and repeats at
65
+ * most every 6 h.
66
+ *
48
67
  * Runs every 30 minutes (first run 10 minutes after boot). Kill switch:
49
- * `CREWLY_WORKTREE_JANITOR=0`. Never throws; logs one summary line per run.
68
+ * `CREWLY_WORKTREE_JANITOR=0` (also stops the low-disk guard). Never throws;
69
+ * logs one summary line per sweep.
50
70
  *
51
71
  * @module services/worktree/worktree-janitor.service
52
72
  */
53
- /** Why a worktree is kept, or why it may go. */
54
- export type WorktreeReason = 'main-worktree' | 'bare' | 'prunable' | 'locked' | 'managed-by-workitem-worktrees' | 'not-agent-worktree' | 'agent-session-inside' | 'process-inside' | 'cwd-probe-failed' | 'recent' | 'dirty' | 'status-failed' | 'not-merged' | 'merged' | 'pr-merged';
73
+ import { type StatFsFn } from './low-disk-guard.js';
74
+ import { type ScratchSweepSummary } from './scratch-janitor.js';
75
+ /**
76
+ * Why a worktree is kept, or why it may go. (`not-agent-worktree` is retired:
77
+ * location no longer decides eligibility, only the idle threshold.)
78
+ */
79
+ export type WorktreeReason = 'main-worktree' | 'bare' | 'prunable' | 'locked' | 'managed-by-workitem-worktrees' | 'agent-session-inside' | 'process-inside' | 'cwd-probe-failed' | 'recent' | 'dirty' | 'status-failed' | 'not-merged' | 'merged' | 'pr-merged';
55
80
  /** Verdict for one worktree (the dry-run output). */
56
81
  export interface WorktreeVerdict {
57
82
  /** Main worktree of the repo this worktree belongs to */
@@ -104,7 +129,30 @@ export interface JanitorRunSummary {
104
129
  keptReasons: Record<string, number>;
105
130
  /** Per-worktree results */
106
131
  worktrees: WorktreeOutcome[];
132
+ /** True when free space was below LOW_DISK_BYTES at the start (thresholds halved) */
133
+ lowDisk: boolean;
134
+ /** Free bytes on the CREWLY_HOME volume at the start, or null when unknown */
135
+ freeBytes: number | null;
136
+ /** Stale scratch sweep result */
137
+ scratch: ScratchSweepSummary | null;
107
138
  }
139
+ /** What one low-disk check did. */
140
+ export interface LowDiskCheckResult {
141
+ /** Free bytes before (null when statfs failed) */
142
+ freeBytesBefore: number | null;
143
+ /** Free bytes after the cleanup pass (same as before when no pass ran) */
144
+ freeBytesAfter: number | null;
145
+ /** True when a cleanup pass ran */
146
+ ranPass: boolean;
147
+ /** Owner notice sent, if any */
148
+ notified: 'urgent' | 'normal' | null;
149
+ }
150
+ /** Owner notice about low disk. Returns true when it was delivered. */
151
+ export type LowDiskNotifier = (notice: {
152
+ title: string;
153
+ message: string;
154
+ urgent: boolean;
155
+ }) => Promise<boolean>;
108
156
  /** A place a live process or agent is working in. */
109
157
  export interface BusyCwd {
110
158
  /** Absolute directory */
@@ -129,10 +177,26 @@ export interface WorktreeJanitorOptions {
129
177
  ghBin?: string | null;
130
178
  /** Clock (default Date.now) */
131
179
  now?: () => number;
132
- /** Minimum idle time before removal (default 2 h) */
180
+ /** Minimum idle time before removal in an agent location (default 2 h) */
133
181
  minIdleMs?: number;
134
- /** Temp roots whose `crewly-worktrees/` holds agent worktrees (default `/tmp` + os.tmpdir()) */
182
+ /** Minimum idle time before removal anywhere else (default 24 h) */
183
+ minIdleOtherMs?: number;
184
+ /** Minimum idle time of a scratch session dir (default 3 days) */
185
+ scratchMinIdleMs?: number;
186
+ /** Temp roots whose `crewly-worktrees/` holds agent worktrees, also scanned for repo discovery (default `/tmp` + os.tmpdir()) */
135
187
  tmpRoots?: string[];
188
+ /** Claude Code scratch roots (default `<tmp>/claude-<uid>` variants that exist) */
189
+ scratchRoots?: string[];
190
+ /** Free-space probe (default fs.promises.statfs) */
191
+ statfs?: StatFsFn;
192
+ /** Path whose volume is watched (default CREWLY_HOME) */
193
+ diskPath?: string;
194
+ /** Owner notifier for low disk (default: none — set by the server via setLowDiskNotifier) */
195
+ notifyOwner?: LowDiskNotifier | null;
196
+ /** Size probe for removed / kept items (default `du -sk`) */
197
+ sizeOf?: (p: string) => Promise<number | null>;
198
+ /** Low-disk notice state file (default `<CREWLY_HOME>/disk-janitor-state.json`); null = in memory */
199
+ statePath?: string | null;
136
200
  /** Environment for the kill switch (default process.env) */
137
201
  env?: NodeJS.ProcessEnv;
138
202
  /** Logger (default: component logger `WorktreeJanitor`) */
@@ -159,10 +223,22 @@ export declare class WorktreeJanitorService {
159
223
  private ghUsable;
160
224
  private lastSummary;
161
225
  private loggerInstance;
226
+ private diskTimer;
227
+ private diskCheckInFlight;
228
+ private lastPassAt;
229
+ private memoryNoticeState;
230
+ private notifier;
162
231
  /**
163
232
  * @param options - Injectable dependencies; defaults use the live backend
164
233
  */
165
234
  constructor(options?: WorktreeJanitorOptions);
235
+ /**
236
+ * Set how the owner is told about low disk (the server wires the existing
237
+ * Slack owner-notification path here).
238
+ *
239
+ * @param notifier - Sender, or null to disable notices
240
+ */
241
+ setLowDiskNotifier(notifier: LowDiskNotifier | null): void;
166
242
  /**
167
243
  * Process-wide instance used by the server and the HTTP routes.
168
244
  *
@@ -179,13 +255,33 @@ export declare class WorktreeJanitorService {
179
255
  isDisabled(): boolean;
180
256
  /**
181
257
  * Schedule the periodic pass: first after FIRST_RUN_DELAY_MS, then every
182
- * INTERVAL_MS. No-op when disabled or already started. Timers are unref'd.
258
+ * INTERVAL_MS; plus the low-disk check every LOW_DISK_CHECK_INTERVAL_MS.
259
+ * No-op when disabled or already started. Timers are unref'd.
183
260
  *
184
261
  * @returns True when scheduled
185
262
  */
186
263
  start(): boolean;
187
264
  /** Cancel scheduled passes. */
188
265
  stop(): void;
266
+ /**
267
+ * Current free space of the watched volume.
268
+ *
269
+ * @returns Watched path, free bytes (null when unknown) and level
270
+ */
271
+ diskStatus(): Promise<{
272
+ path: string;
273
+ freeBytes: number | null;
274
+ level: 'ok' | 'low' | 'critical' | 'unknown';
275
+ }>;
276
+ /**
277
+ * Low-disk check: read free space; below LOW_DISK_BYTES run a pass now
278
+ * (unless one ran within LOW_DISK_PASS_GAP_MS), then, if space is still
279
+ * short, tell the owner within the notice cadence. Never throws. Honours
280
+ * the kill switch. Concurrent calls share the check in flight.
281
+ *
282
+ * @returns What the check did
283
+ */
284
+ checkDisk(): Promise<LowDiskCheckResult>;
189
285
  /**
190
286
  * Summary of the last completed real pass, if any.
191
287
  *
@@ -207,11 +303,22 @@ export declare class WorktreeJanitorService {
207
303
  */
208
304
  run(): Promise<JanitorRunSummary>;
209
305
  private get logger();
306
+ private now;
307
+ private diskPath;
308
+ private scratchRoots;
309
+ private tmpRoots;
310
+ private statePath;
311
+ private readNoticeState;
312
+ private writeNoticeState;
313
+ private doCheckDisk;
314
+ /** Sizes of everything a pass left on disk that the owner could act on. */
315
+ private keptItems;
210
316
  private git;
211
317
  private pass;
212
318
  private resolveRepos;
213
319
  private safeBusyCwds;
214
- private isAgentWorktree;
320
+ /** Known agent location (short idle threshold) vs anywhere else (long one). */
321
+ private isAgentLocation;
215
322
  /**
216
323
  * Apply the removal rules to one worktree (read-only apart from fetch).
217
324
  */