crewly 1.20.157 → 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 (154) hide show
  1. package/README.md +1 -0
  2. package/config/skills/registry.json +55 -4
  3. package/config/templates/growth-marketing-team.json +5 -5
  4. package/config/templates/personal-assistant-team.json +5 -5
  5. package/dist/backend/backend/src/constants.d.ts +120 -5
  6. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  7. package/dist/backend/backend/src/constants.js +145 -8
  8. package/dist/backend/backend/src/constants.js.map +1 -1
  9. package/dist/backend/backend/src/controllers/worktree-janitor/worktree-janitor.routes.d.ts +2 -1
  10. package/dist/backend/backend/src/controllers/worktree-janitor/worktree-janitor.routes.d.ts.map +1 -1
  11. package/dist/backend/backend/src/controllers/worktree-janitor/worktree-janitor.routes.js +4 -2
  12. package/dist/backend/backend/src/controllers/worktree-janitor/worktree-janitor.routes.js.map +1 -1
  13. package/dist/backend/backend/src/index.d.ts.map +1 -1
  14. package/dist/backend/backend/src/index.js +17 -2
  15. package/dist/backend/backend/src/index.js.map +1 -1
  16. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +9 -0
  17. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  18. package/dist/backend/backend/src/services/agent/agent-registration.service.js +34 -29
  19. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  20. package/dist/backend/backend/src/services/agent/codex-runtime.service.d.ts +4 -3
  21. package/dist/backend/backend/src/services/agent/codex-runtime.service.d.ts.map +1 -1
  22. package/dist/backend/backend/src/services/agent/codex-runtime.service.js +48 -3
  23. package/dist/backend/backend/src/services/agent/codex-runtime.service.js.map +1 -1
  24. package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts +9 -0
  25. package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts.map +1 -1
  26. package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.js +18 -1
  27. package/dist/backend/backend/src/services/agent/crewly-agent/in-process-log-buffer.js.map +1 -1
  28. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  29. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +5 -1
  30. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  31. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  32. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +14 -4
  33. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  34. package/dist/backend/backend/src/services/agent/tmux-command.service.d.ts +14 -2
  35. package/dist/backend/backend/src/services/agent/tmux-command.service.d.ts.map +1 -1
  36. package/dist/backend/backend/src/services/agent/tmux-command.service.js +24 -5
  37. package/dist/backend/backend/src/services/agent/tmux-command.service.js.map +1 -1
  38. package/dist/backend/backend/src/services/agent/tmux.service.d.ts.map +1 -1
  39. package/dist/backend/backend/src/services/agent/tmux.service.js +14 -9
  40. package/dist/backend/backend/src/services/agent/tmux.service.js.map +1 -1
  41. package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts +8 -0
  42. package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts.map +1 -1
  43. package/dist/backend/backend/src/services/backup/backup-archive.service.js +16 -8
  44. package/dist/backend/backend/src/services/backup/backup-archive.service.js.map +1 -1
  45. package/dist/backend/backend/src/services/backup/backup.types.d.ts +19 -0
  46. package/dist/backend/backend/src/services/backup/backup.types.d.ts.map +1 -1
  47. package/dist/backend/backend/src/services/backup/backup.types.js +19 -0
  48. package/dist/backend/backend/src/services/backup/backup.types.js.map +1 -1
  49. package/dist/backend/backend/src/services/security/secret-scrub.service.d.ts +108 -0
  50. package/dist/backend/backend/src/services/security/secret-scrub.service.d.ts.map +1 -0
  51. package/dist/backend/backend/src/services/security/secret-scrub.service.js +200 -0
  52. package/dist/backend/backend/src/services/security/secret-scrub.service.js.map +1 -0
  53. package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts +13 -9
  54. package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts.map +1 -1
  55. package/dist/backend/backend/src/services/session/pty/pty-session-backend.js +30 -14
  56. package/dist/backend/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
  57. package/dist/backend/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
  58. package/dist/backend/backend/src/services/session/pty/pty-session.js +6 -1
  59. package/dist/backend/backend/src/services/session/pty/pty-session.js.map +1 -1
  60. package/dist/backend/backend/src/services/session/session-command-helper.d.ts.map +1 -1
  61. package/dist/backend/backend/src/services/session/session-command-helper.js +3 -2
  62. package/dist/backend/backend/src/services/session/session-command-helper.js.map +1 -1
  63. package/dist/backend/backend/src/services/worktree/low-disk-guard.d.ts +109 -0
  64. package/dist/backend/backend/src/services/worktree/low-disk-guard.d.ts.map +1 -0
  65. package/dist/backend/backend/src/services/worktree/low-disk-guard.js +148 -0
  66. package/dist/backend/backend/src/services/worktree/low-disk-guard.js.map +1 -0
  67. package/dist/backend/backend/src/services/worktree/scratch-janitor.d.ts +140 -0
  68. package/dist/backend/backend/src/services/worktree/scratch-janitor.d.ts.map +1 -0
  69. package/dist/backend/backend/src/services/worktree/scratch-janitor.js +249 -0
  70. package/dist/backend/backend/src/services/worktree/scratch-janitor.js.map +1 -0
  71. package/dist/backend/backend/src/services/worktree/worktree-janitor.git.d.ts +92 -1
  72. package/dist/backend/backend/src/services/worktree/worktree-janitor.git.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/worktree/worktree-janitor.git.js +207 -1
  74. package/dist/backend/backend/src/services/worktree/worktree-janitor.git.js.map +1 -1
  75. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts +135 -28
  76. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts.map +1 -1
  77. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js +248 -39
  78. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js.map +1 -1
  79. package/dist/backend/backend/src/types/team-template.types.d.ts +1 -1
  80. package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
  81. package/dist/backend/backend/src/utils/secret-redactor.d.ts +131 -0
  82. package/dist/backend/backend/src/utils/secret-redactor.d.ts.map +1 -0
  83. package/dist/backend/backend/src/utils/secret-redactor.js +233 -0
  84. package/dist/backend/backend/src/utils/secret-redactor.js.map +1 -0
  85. package/dist/backend/backend/src/utils/shell-history.d.ts +48 -0
  86. package/dist/backend/backend/src/utils/shell-history.d.ts.map +1 -0
  87. package/dist/backend/backend/src/utils/shell-history.js +65 -0
  88. package/dist/backend/backend/src/utils/shell-history.js.map +1 -0
  89. package/dist/backend/build-info.json +2 -2
  90. package/dist/cli/backend/src/constants.d.ts +120 -5
  91. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  92. package/dist/cli/backend/src/constants.js +145 -8
  93. package/dist/cli/backend/src/constants.js.map +1 -1
  94. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +9 -0
  95. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  96. package/dist/cli/backend/src/services/agent/agent-registration.service.js +34 -29
  97. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  98. package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts +4 -3
  99. package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts.map +1 -1
  100. package/dist/cli/backend/src/services/agent/codex-runtime.service.js +48 -3
  101. package/dist/cli/backend/src/services/agent/codex-runtime.service.js.map +1 -1
  102. package/dist/cli/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts +9 -0
  103. package/dist/cli/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts.map +1 -1
  104. package/dist/cli/backend/src/services/agent/crewly-agent/in-process-log-buffer.js +18 -1
  105. package/dist/cli/backend/src/services/agent/crewly-agent/in-process-log-buffer.js.map +1 -1
  106. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  107. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +5 -1
  108. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  109. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  110. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +14 -4
  111. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  112. package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts +8 -0
  113. package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts.map +1 -1
  114. package/dist/cli/backend/src/services/backup/backup-archive.service.js +16 -8
  115. package/dist/cli/backend/src/services/backup/backup-archive.service.js.map +1 -1
  116. package/dist/cli/backend/src/services/backup/backup.types.d.ts +19 -0
  117. package/dist/cli/backend/src/services/backup/backup.types.d.ts.map +1 -1
  118. package/dist/cli/backend/src/services/backup/backup.types.js +19 -0
  119. package/dist/cli/backend/src/services/backup/backup.types.js.map +1 -1
  120. package/dist/cli/backend/src/services/security/secret-scrub.service.d.ts +108 -0
  121. package/dist/cli/backend/src/services/security/secret-scrub.service.d.ts.map +1 -0
  122. package/dist/cli/backend/src/services/security/secret-scrub.service.js +200 -0
  123. package/dist/cli/backend/src/services/security/secret-scrub.service.js.map +1 -0
  124. package/dist/cli/backend/src/services/session/pty/pty-session-backend.d.ts +13 -9
  125. package/dist/cli/backend/src/services/session/pty/pty-session-backend.d.ts.map +1 -1
  126. package/dist/cli/backend/src/services/session/pty/pty-session-backend.js +30 -14
  127. package/dist/cli/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
  128. package/dist/cli/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
  129. package/dist/cli/backend/src/services/session/pty/pty-session.js +6 -1
  130. package/dist/cli/backend/src/services/session/pty/pty-session.js.map +1 -1
  131. package/dist/cli/backend/src/services/session/session-command-helper.d.ts.map +1 -1
  132. package/dist/cli/backend/src/services/session/session-command-helper.js +3 -2
  133. package/dist/cli/backend/src/services/session/session-command-helper.js.map +1 -1
  134. package/dist/cli/backend/src/types/team-template.types.d.ts +1 -1
  135. package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
  136. package/dist/cli/backend/src/utils/secret-redactor.d.ts +131 -0
  137. package/dist/cli/backend/src/utils/secret-redactor.d.ts.map +1 -0
  138. package/dist/cli/backend/src/utils/secret-redactor.js +233 -0
  139. package/dist/cli/backend/src/utils/secret-redactor.js.map +1 -0
  140. package/dist/cli/backend/src/utils/shell-history.d.ts +48 -0
  141. package/dist/cli/backend/src/utils/shell-history.d.ts.map +1 -0
  142. package/dist/cli/backend/src/utils/shell-history.js +65 -0
  143. package/dist/cli/backend/src/utils/shell-history.js.map +1 -0
  144. package/dist/cli/cli/src/commands/security.d.ts +41 -0
  145. package/dist/cli/cli/src/commands/security.d.ts.map +1 -0
  146. package/dist/cli/cli/src/commands/security.js +81 -0
  147. package/dist/cli/cli/src/commands/security.js.map +1 -0
  148. package/dist/cli/cli/src/index.js +9 -0
  149. package/dist/cli/cli/src/index.js.map +1 -1
  150. package/frontend/dist/assets/index-edd6f262.css +42 -0
  151. package/frontend/dist/assets/{index-8d4b3ad2.js → index-f79676aa.js} +268 -268
  152. package/frontend/dist/index.html +2 -2
  153. package/package.json +1 -1
  154. package/frontend/dist/assets/index-b6aded4c.css +0 -42
@@ -0,0 +1,249 @@
1
+ /**
2
+ * Scratch janitor — removes stale Claude Code session scratch dirs.
3
+ *
4
+ * Claude Code gives every session a temp dir
5
+ * `<tmp>/claude-<uid>/<project-slug>/<session-uuid>/` (with `scratchpad/`
6
+ * inside). Agents clone whole repos and build test homes there — 0.5–1.8 GB
7
+ * each — and nothing ever deletes them; one Mac filled its disk with dozens
8
+ * of GB of week-old sessions. These are not worktrees, so the worktree rules
9
+ * never see them.
10
+ *
11
+ * ## Roots
12
+ * `<os.tmpdir()>/claude-<uid>`, `/private/tmp/claude-<uid>` and
13
+ * `/tmp/claude-<uid>`, de-duplicated by real path. Only the
14
+ * `<root>/<slug>/<uuid>/` pattern is a unit; anything else in the root
15
+ * (loose files, worktrees such as `<root>/visa-cm-wt`) is left alone here.
16
+ * Symlinks are never followed out of the root.
17
+ *
18
+ * ## A session dir is deleted only when ALL hold
19
+ * 1. Idle: the newest mtime of the dir and everything in its top two levels,
20
+ * and of every git repo's HEAD / index / logs/HEAD inside it, is older
21
+ * than 3 days (halved in low-disk mode, never below 2 h).
22
+ * 2. No process of this user (nor a Crewly agent session) has its cwd
23
+ * inside. If the probe fails, everything is kept.
24
+ * 3. It holds no linked worktree of a repo outside it — those belong to the
25
+ * worktree rules (`git worktree remove`), never `rm -rf`.
26
+ * 4. Every git repo inside (depth ≤ 3, `node_modules` skipped) is safe:
27
+ * - `git status --porcelain --untracked-files=all` is empty (untracked
28
+ * files count, ignored ones do not);
29
+ * - it has a remote (no remote → kept: its commits may exist nowhere else);
30
+ * - `git rev-list HEAD --branches --not --remotes` is empty (no local
31
+ * commit missing from the remote-tracking refs) and there is no stash;
32
+ * - it has no linked worktree outside the session dir (deleting the
33
+ * clone would orphan it).
34
+ * Any git error keeps the dir.
35
+ *
36
+ * @module services/worktree/scratch-janitor
37
+ */
38
+ import * as fs from 'fs';
39
+ import * as os from 'os';
40
+ import * as path from 'path';
41
+ import { WORKTREE_JANITOR_CONSTANTS } from '../../constants.js';
42
+ import { canonicalPath, diskUsageBytes, EventLoopYielder, findGitCheckouts, isPathInside, latestTreeMtimeMs, latestWorktreeMtimeMs, parsePorcelainWorktrees, readGitFilePointer, } from './worktree-janitor.git.js';
43
+ /**
44
+ * The per-user Claude Code temp roots that exist, de-duplicated by real path.
45
+ *
46
+ * @param uid - User id (default: process.getuid())
47
+ * @param tmpDir - System temp dir (default: os.tmpdir())
48
+ * @returns Existing root directories (real paths)
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * defaultScratchRoots(501); // ['/private/tmp/claude-501']
53
+ * ```
54
+ */
55
+ export function defaultScratchRoots(uid, tmpDir = os.tmpdir()) {
56
+ const id = uid ?? (typeof process.getuid === 'function' ? process.getuid() : os.userInfo().uid);
57
+ const name = `${WORKTREE_JANITOR_CONSTANTS.SCRATCH_ROOT_PREFIX}${id}`;
58
+ const candidates = [tmpDir, ...WORKTREE_JANITOR_CONSTANTS.SCRATCH_TMP_DIRS].map((d) => path.join(d, name));
59
+ const out = new Set();
60
+ for (const c of candidates) {
61
+ try {
62
+ if (fs.lstatSync(c).isDirectory())
63
+ out.add(fs.realpathSync(c));
64
+ }
65
+ catch {
66
+ // missing
67
+ }
68
+ }
69
+ return [...out];
70
+ }
71
+ /**
72
+ * Session dirs (`<root>/<slug>/<uuid>`) under a root. Symlinked slugs or
73
+ * session dirs are skipped, as is anything not matching the pattern. Async;
74
+ * yields to the event loop every few entries.
75
+ *
76
+ * @param root - A scratch root (real path)
77
+ * @returns Absolute session dirs
78
+ */
79
+ export async function listSessionDirs(root) {
80
+ const out = [];
81
+ const yielder = new EventLoopYielder();
82
+ let slugs;
83
+ try {
84
+ slugs = await fs.promises.readdir(root, { withFileTypes: true });
85
+ }
86
+ catch {
87
+ return out;
88
+ }
89
+ for (const slug of slugs) {
90
+ await yielder.tick();
91
+ if (!slug.isDirectory())
92
+ continue;
93
+ const slugDir = path.join(root, slug.name);
94
+ let sessions;
95
+ try {
96
+ sessions = await fs.promises.readdir(slugDir, { withFileTypes: true });
97
+ }
98
+ catch {
99
+ continue;
100
+ }
101
+ for (const s of sessions) {
102
+ if (!s.isDirectory() || !WORKTREE_JANITOR_CONSTANTS.SCRATCH_SESSION_DIR_PATTERN.test(s.name))
103
+ continue;
104
+ out.push(path.join(slugDir, s.name));
105
+ }
106
+ }
107
+ return out;
108
+ }
109
+ /** Git dir of a checkout (`.git` dir, or the one a `.git` file points to). */
110
+ async function gitDirOf(repo) {
111
+ return repo.kind === 'dir' ? path.join(repo.path, '.git') : readGitFilePointer(repo.path);
112
+ }
113
+ /**
114
+ * Evaluate one session dir. Read-only.
115
+ *
116
+ * @param dir - Session dir
117
+ * @param input - Sweep inputs
118
+ * @returns Verdict (not yet acted on)
119
+ */
120
+ export async function evaluateSessionDir(dir, input) {
121
+ const repos = await findGitCheckouts(dir, WORKTREE_JANITOR_CONSTANTS.SCRATCH_REPO_SEARCH_DEPTH);
122
+ const base = { path: dir, repos: repos.map((r) => r.path), removed: false };
123
+ const keep = (reason, detail, idleMs) => ({
124
+ ...base,
125
+ decision: 'keep',
126
+ reason,
127
+ ...(detail ? { detail } : {}),
128
+ ...(idleMs !== undefined ? { idleMs } : {}),
129
+ });
130
+ let newest = await latestTreeMtimeMs(dir, WORKTREE_JANITOR_CONSTANTS.SCRATCH_MTIME_DEPTH);
131
+ for (const r of repos) {
132
+ const gd = await gitDirOf(r);
133
+ const m = latestWorktreeMtimeMs(r.path, gd);
134
+ if (m !== null && (newest === null || m > newest))
135
+ newest = m;
136
+ if (gd) {
137
+ const logs = await latestTreeMtimeMs(path.join(gd, 'logs'), WORKTREE_JANITOR_CONSTANTS.SCRATCH_MTIME_DEPTH);
138
+ if (logs !== null && (newest === null || logs > newest))
139
+ newest = logs;
140
+ }
141
+ }
142
+ const idleMs = newest === null ? undefined : Math.max(0, input.now - newest);
143
+ if (idleMs === undefined || idleMs < input.minIdleMs)
144
+ return keep('recent', undefined, idleMs);
145
+ if (input.busy === null)
146
+ return keep('cwd-probe-failed', undefined, idleMs);
147
+ const hit = input.busy.find((b) => isPathInside(b.cwd, dir));
148
+ if (hit)
149
+ return keep(hit.source === 'agent-session' ? 'agent-session-inside' : 'process-inside', hit.cwd, idleMs);
150
+ for (const r of repos) {
151
+ if (r.kind === 'file') {
152
+ const common = await input.git(['-C', r.path, 'rev-parse', '--path-format=absolute', '--git-common-dir']);
153
+ if (common.code !== 0)
154
+ return keep('git-failed', `${r.path}: ${common.stderr.trim().slice(0, 200)}`, idleMs);
155
+ if (!isPathInside(common.stdout.trim(), dir))
156
+ return keep('contains-worktree', r.path, idleMs);
157
+ }
158
+ const status = await input.git(['-C', r.path, 'status', '--porcelain', '--untracked-files=all']);
159
+ if (status.code !== 0)
160
+ return keep('git-failed', `${r.path}: ${status.stderr.trim().slice(0, 200)}`, idleMs);
161
+ const dirty = status.stdout.split('\n').filter((l) => l.trim() !== '').length;
162
+ if (dirty > 0)
163
+ return keep('dirty', `${r.path}: ${dirty} changed/untracked path(s)`, idleMs);
164
+ const remotes = await input.git(['-C', r.path, 'remote']);
165
+ if (remotes.code !== 0)
166
+ return keep('git-failed', `${r.path}: ${remotes.stderr.trim().slice(0, 200)}`, idleMs);
167
+ if (remotes.stdout.trim() === '')
168
+ return keep('no-remote', r.path, idleMs);
169
+ const unpushed = await input.git(['-C', r.path, 'rev-list', '--max-count=1', 'HEAD', '--branches', '--not', '--remotes']);
170
+ if (unpushed.code !== 0)
171
+ return keep('git-failed', `${r.path}: ${unpushed.stderr.trim().slice(0, 200)}`, idleMs);
172
+ if (unpushed.stdout.trim() !== '')
173
+ return keep('unpushed', `${r.path}: commit ${unpushed.stdout.trim().slice(0, 12)} is on no remote`, idleMs);
174
+ const stash = await input.git(['-C', r.path, 'rev-parse', '--verify', '--quiet', 'refs/stash']);
175
+ if (stash.code === 0)
176
+ return keep('stash', r.path, idleMs);
177
+ const wts = await input.git(['-C', r.path, 'worktree', 'list', '--porcelain']);
178
+ if (wts.code !== 0)
179
+ return keep('git-failed', `${r.path}: ${wts.stderr.trim().slice(0, 200)}`, idleMs);
180
+ const external = parsePorcelainWorktrees(wts.stdout).find((w) => !w.isMain && !w.prunable && fs.existsSync(w.path) && !isPathInside(w.path, dir));
181
+ if (external)
182
+ return keep('has-external-worktrees', `${r.path} → ${external.path}`, idleMs);
183
+ }
184
+ return { ...base, decision: 'remove', reason: 'stale', idleMs };
185
+ }
186
+ /**
187
+ * One sweep over every session dir of every root. Never throws.
188
+ *
189
+ * @param input - Roots, busy cwds, clock, threshold, dry-run flag, git runner
190
+ * @returns Per-dir verdicts and totals
191
+ */
192
+ export async function sweepScratch(input) {
193
+ const summary = {
194
+ roots: input.roots.map(canonicalPath),
195
+ removed: 0,
196
+ wouldRemove: 0,
197
+ kept: 0,
198
+ freedBytes: 0,
199
+ keptReasons: {},
200
+ sessions: [],
201
+ };
202
+ const sizeOf = input.sizeOf ?? diskUsageBytes;
203
+ for (const root of summary.roots) {
204
+ for (const dir of await listSessionDirs(root)) {
205
+ let v;
206
+ try {
207
+ v = await evaluateSessionDir(dir, input);
208
+ }
209
+ catch (err) {
210
+ v = { path: dir, decision: 'keep', reason: 'git-failed', detail: err instanceof Error ? err.message : String(err), repos: [], removed: false };
211
+ }
212
+ if (v.decision === 'remove' && !input.dryRun)
213
+ await removeSessionDir(root, v, sizeOf);
214
+ summary.sessions.push(v);
215
+ if (v.removed) {
216
+ summary.removed++;
217
+ summary.freedBytes += v.freedBytes ?? 0;
218
+ }
219
+ else if (input.dryRun && v.decision === 'remove')
220
+ summary.wouldRemove++;
221
+ else {
222
+ summary.kept++;
223
+ const key = v.error ? 'remove-failed' : v.reason;
224
+ summary.keptReasons[key] = (summary.keptReasons[key] ?? 0) + 1;
225
+ }
226
+ }
227
+ }
228
+ return summary;
229
+ }
230
+ /** Delete one session dir after re-checking it is a real dir inside its root. */
231
+ async function removeSessionDir(root, v, sizeOf) {
232
+ try {
233
+ const st = await fs.promises.lstat(v.path);
234
+ if (!st.isDirectory() || st.isSymbolicLink() || !(await fs.promises.realpath(v.path)).startsWith(root + path.sep)) {
235
+ v.error = 'not a real directory inside the scratch root';
236
+ return;
237
+ }
238
+ const size = await sizeOf(v.path);
239
+ // fs.rm removes symlinks themselves, never their targets.
240
+ await fs.promises.rm(v.path, { recursive: true, force: true });
241
+ v.removed = true;
242
+ if (size !== null)
243
+ v.freedBytes = size;
244
+ }
245
+ catch (err) {
246
+ v.error = (err instanceof Error ? err.message : String(err)).slice(0, 300);
247
+ }
248
+ }
249
+ //# sourceMappingURL=scratch-janitor.js.map
@@ -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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"}