aicodeman 1.34.0 → 1.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/README.md +3 -0
  2. package/dist/config/dependency-registry.d.ts +7 -0
  3. package/dist/config/dependency-registry.d.ts.map +1 -1
  4. package/dist/config/dependency-registry.js +15 -0
  5. package/dist/config/dependency-registry.js.map +1 -1
  6. package/dist/config/path-probe.d.ts +37 -0
  7. package/dist/config/path-probe.d.ts.map +1 -0
  8. package/dist/config/path-probe.js +43 -0
  9. package/dist/config/path-probe.js.map +1 -0
  10. package/dist/git-workspace-status.d.ts +220 -0
  11. package/dist/git-workspace-status.d.ts.map +1 -0
  12. package/dist/git-workspace-status.js +606 -0
  13. package/dist/git-workspace-status.js.map +1 -0
  14. package/dist/hooks-config.d.ts.map +1 -1
  15. package/dist/hooks-config.js +83 -13
  16. package/dist/hooks-config.js.map +1 -1
  17. package/dist/types/api.d.ts +7 -0
  18. package/dist/types/api.d.ts.map +1 -1
  19. package/dist/types/api.js.map +1 -1
  20. package/dist/utils/bounded-path-probe.d.ts +99 -0
  21. package/dist/utils/bounded-path-probe.d.ts.map +1 -0
  22. package/dist/utils/bounded-path-probe.js +228 -0
  23. package/dist/utils/bounded-path-probe.js.map +1 -0
  24. package/dist/utils/cli-executable-resolver.d.ts +2 -0
  25. package/dist/utils/cli-executable-resolver.d.ts.map +1 -1
  26. package/dist/utils/cli-executable-resolver.js +2 -1
  27. package/dist/utils/cli-executable-resolver.js.map +1 -1
  28. package/dist/utils/dependency-checker.d.ts +2 -0
  29. package/dist/utils/dependency-checker.d.ts.map +1 -1
  30. package/dist/utils/dependency-checker.js +37 -9
  31. package/dist/utils/dependency-checker.js.map +1 -1
  32. package/dist/utils/index.d.ts +2 -0
  33. package/dist/utils/index.d.ts.map +1 -1
  34. package/dist/utils/index.js +1 -0
  35. package/dist/utils/index.js.map +1 -1
  36. package/dist/web/case-path.d.ts +58 -0
  37. package/dist/web/case-path.d.ts.map +1 -0
  38. package/dist/web/case-path.js +182 -0
  39. package/dist/web/case-path.js.map +1 -0
  40. package/dist/web/public/admin-ui.js.gz +0 -0
  41. package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
  42. package/dist/web/public/app.b9516c7b.js +43 -0
  43. package/dist/web/public/app.b9516c7b.js.br +0 -0
  44. package/dist/web/public/app.b9516c7b.js.gz +0 -0
  45. package/dist/web/public/approvals-ui.js.gz +0 -0
  46. package/dist/web/public/constants.d95fade9.js.gz +0 -0
  47. package/dist/web/public/cron-ui.js.gz +0 -0
  48. package/dist/web/public/entrance-animations.js.gz +0 -0
  49. package/dist/web/public/git-status-ui.js +673 -0
  50. package/dist/web/public/git-status-ui.js.br +0 -0
  51. package/dist/web/public/git-status-ui.js.gz +0 -0
  52. package/dist/web/public/home-sessions.js.gz +0 -0
  53. package/dist/web/public/host-wake-ui.js.gz +0 -0
  54. package/dist/web/public/i18n.52f5b7cc.js +1 -0
  55. package/dist/web/public/i18n.52f5b7cc.js.br +0 -0
  56. package/dist/web/public/i18n.52f5b7cc.js.gz +0 -0
  57. package/dist/web/public/image-input.a216cf9e.js.gz +0 -0
  58. package/dist/web/public/index.html +79 -12
  59. package/dist/web/public/index.html.br +0 -0
  60. package/dist/web/public/index.html.gz +0 -0
  61. package/dist/web/public/input-cjk.8bc46081.js.gz +0 -0
  62. package/dist/web/public/keyboard-accessory.c1e7c7b7.js.gz +0 -0
  63. package/dist/web/public/mobile-handlers.23a85db1.js.gz +0 -0
  64. package/dist/web/public/mobile-ime-preview.2dbaf262.js.gz +0 -0
  65. package/dist/web/public/mobile-overview.js.gz +0 -0
  66. package/dist/web/public/mobile.1aa4952d.css.gz +0 -0
  67. package/dist/web/public/notification-manager.50bb87d8.js.gz +0 -0
  68. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  69. package/dist/web/public/panels-ui.6a5898d9.js.gz +0 -0
  70. package/dist/web/public/ralph-panel.b350e2ef.js.gz +0 -0
  71. package/dist/web/public/ralph-wizard.b6c0dd19.js.gz +0 -0
  72. package/dist/web/public/readmymind-ui.js.gz +0 -0
  73. package/dist/web/public/reboot-restore-ui.js.gz +0 -0
  74. package/dist/web/public/respawn-ui.ff0dae4c.js.gz +0 -0
  75. package/dist/web/public/sanitize-html.e7147e76.js.gz +0 -0
  76. package/dist/web/public/session-lineage.js.gz +0 -0
  77. package/dist/web/public/session-ui.6bddf916.js +89 -0
  78. package/dist/web/public/session-ui.6bddf916.js.br +0 -0
  79. package/dist/web/public/session-ui.6bddf916.js.gz +0 -0
  80. package/dist/web/public/settings-ui.6e798b7b.js +97 -0
  81. package/dist/web/public/settings-ui.6e798b7b.js.br +0 -0
  82. package/dist/web/public/settings-ui.6e798b7b.js.gz +0 -0
  83. package/dist/web/public/styles.2d175c60.css +1 -0
  84. package/dist/web/public/styles.2d175c60.css.br +0 -0
  85. package/dist/web/public/styles.2d175c60.css.gz +0 -0
  86. package/dist/web/public/subagent-windows.e6ca799f.js.gz +0 -0
  87. package/dist/web/public/sw.js +2 -2
  88. package/dist/web/public/sw.js.br +0 -0
  89. package/dist/web/public/sw.js.gz +0 -0
  90. package/dist/web/public/tab-layout-browser.065fcba4.js +1 -0
  91. package/dist/web/public/tab-layout-browser.065fcba4.js.br +0 -0
  92. package/dist/web/public/tab-layout-browser.065fcba4.js.gz +0 -0
  93. package/dist/web/public/{tab-rail-resize.dcdc5772.js → tab-rail-resize.94cd59f0.js} +1 -1
  94. package/dist/web/public/tab-rail-resize.94cd59f0.js.br +0 -0
  95. package/dist/web/public/tab-rail-resize.94cd59f0.js.gz +0 -0
  96. package/dist/web/public/terminal-keycode229-recovery.fb91b25b.js.gz +0 -0
  97. package/dist/web/public/terminal-split.js.gz +0 -0
  98. package/dist/web/public/terminal-ui.a4535311.js.gz +0 -0
  99. package/dist/web/public/ultracode-panel.js.gz +0 -0
  100. package/dist/web/public/ultracode-windows.js.gz +0 -0
  101. package/dist/web/public/upload.html.gz +0 -0
  102. package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
  103. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  104. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  105. package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
  106. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  107. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  108. package/dist/web/public/vendor/xterm-predictive-echo.ae5e3d5d.js.gz +0 -0
  109. package/dist/web/public/vendor/xterm-zerolag-input.bbb5f84c.js.gz +0 -0
  110. package/dist/web/public/vendor/xterm.css.gz +0 -0
  111. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  112. package/dist/web/public/voice-input.c4b51eb6.js.gz +0 -0
  113. package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
  114. package/dist/web/public/webview-tabs.js.gz +0 -0
  115. package/dist/web/routes/case-routes.d.ts.map +1 -1
  116. package/dist/web/routes/case-routes.js +136 -18
  117. package/dist/web/routes/case-routes.js.map +1 -1
  118. package/dist/web/routes/doctor-routes.d.ts +23 -0
  119. package/dist/web/routes/doctor-routes.d.ts.map +1 -0
  120. package/dist/web/routes/doctor-routes.js +83 -0
  121. package/dist/web/routes/doctor-routes.js.map +1 -0
  122. package/dist/web/routes/git-status-routes.d.ts +16 -0
  123. package/dist/web/routes/git-status-routes.d.ts.map +1 -0
  124. package/dist/web/routes/git-status-routes.js +71 -0
  125. package/dist/web/routes/git-status-routes.js.map +1 -0
  126. package/dist/web/routes/index.d.ts +2 -0
  127. package/dist/web/routes/index.d.ts.map +1 -1
  128. package/dist/web/routes/index.js +2 -0
  129. package/dist/web/routes/index.js.map +1 -1
  130. package/dist/web/routes/session-routes.d.ts.map +1 -1
  131. package/dist/web/routes/session-routes.js +20 -8
  132. package/dist/web/routes/session-routes.js.map +1 -1
  133. package/dist/web/schemas.d.ts +1 -0
  134. package/dist/web/schemas.d.ts.map +1 -1
  135. package/dist/web/schemas.js +7 -0
  136. package/dist/web/schemas.js.map +1 -1
  137. package/dist/web/server.d.ts.map +1 -1
  138. package/dist/web/server.js +3 -1
  139. package/dist/web/server.js.map +1 -1
  140. package/package.json +1 -1
  141. package/skills/codeman/reference/verbs.md +3 -0
  142. package/dist/web/public/app.cf0db8ce.js +0 -43
  143. package/dist/web/public/app.cf0db8ce.js.br +0 -0
  144. package/dist/web/public/app.cf0db8ce.js.gz +0 -0
  145. package/dist/web/public/i18n.398b8331.js +0 -1
  146. package/dist/web/public/i18n.398b8331.js.br +0 -0
  147. package/dist/web/public/i18n.398b8331.js.gz +0 -0
  148. package/dist/web/public/session-ui.bf66c13b.js +0 -89
  149. package/dist/web/public/session-ui.bf66c13b.js.br +0 -0
  150. package/dist/web/public/session-ui.bf66c13b.js.gz +0 -0
  151. package/dist/web/public/settings-ui.331d3b1d.js +0 -97
  152. package/dist/web/public/settings-ui.331d3b1d.js.br +0 -0
  153. package/dist/web/public/settings-ui.331d3b1d.js.gz +0 -0
  154. package/dist/web/public/styles.8c485d26.css +0 -1
  155. package/dist/web/public/styles.8c485d26.css.br +0 -0
  156. package/dist/web/public/styles.8c485d26.css.gz +0 -0
  157. package/dist/web/public/tab-layout-browser.4e0ed50c.js +0 -1
  158. package/dist/web/public/tab-layout-browser.4e0ed50c.js.br +0 -0
  159. package/dist/web/public/tab-layout-browser.4e0ed50c.js.gz +0 -0
  160. package/dist/web/public/tab-rail-resize.dcdc5772.js.br +0 -0
  161. package/dist/web/public/tab-rail-resize.dcdc5772.js.gz +0 -0
@@ -0,0 +1,182 @@
1
+ /**
2
+ * @fileoverview Validation for "create a new case in a custom folder" (`POST /api/cases` with a
3
+ * `path`). Creating a case writes a scaffold (`CLAUDE.md`, `src/`, `.claude/settings.local.json`)
4
+ * and registers the folder in the shared, ownerless linked-cases registry, so the target has to be
5
+ * judged before anything is created:
6
+ *
7
+ * - it must be an absolute path (a leading `~` is expanded) with no traversal and none of the shell
8
+ * metacharacters a session's working directory is later rejected for (`isValidWorkingDir`), so
9
+ * a case this accepts is one a session can actually start in;
10
+ * - it must not be a system directory, the home directory itself, Codeman's own data directory, or
11
+ * a credential/config tree (`~/.ssh`, `~/.aws`, `~/.claude`, ...). Judged on the path as typed AND on
12
+ * its symlink-resolved form, against both the given and the symlink-resolved roots (a home reached
13
+ * through a link, macOS's `/etc` -> `/private/etc`), so a link into a blocked tree is not a way
14
+ * around it;
15
+ * - it must not be, or be inside, a cases directory: a case there is a plain Create New, and the same
16
+ * folder listed both as a local case and as a linked one would make deleting it remove files;
17
+ * - its parent must already exist (one folder is created, never a whole chain), and the folder
18
+ * itself must not exist or must be an EMPTY directory (a folder with contents is Link Existing's
19
+ * job, and silently scaffolding into someone's project is the one thing this must never do);
20
+ * - it must not be a symlink.
21
+ *
22
+ * Pure except for the filesystem reads in `prepareNewCasePath`; the policy lives in `blockedReason`
23
+ * so it can be tested without a disk.
24
+ *
25
+ * @module web/case-path
26
+ */
27
+ import { promises as fs } from 'node:fs';
28
+ import { basename, dirname, join, resolve, sep } from 'node:path';
29
+ import { isValidWorkingDir } from './schemas.js';
30
+ import { describeUnknownPath, probePath } from '../utils/index.js';
31
+ /** System trees nobody creates a project in; creating one here is a mistake or an attack. */
32
+ const BLOCKED_SYSTEM_ROOTS = [
33
+ '/bin',
34
+ '/boot',
35
+ '/dev',
36
+ '/etc',
37
+ '/lib',
38
+ '/lib32',
39
+ '/lib64',
40
+ '/proc',
41
+ '/run',
42
+ '/sbin',
43
+ '/sys',
44
+ '/usr',
45
+ ];
46
+ /** Home-relative trees that hold credentials or other tools' own configuration. */
47
+ const BLOCKED_HOME_DIRS = ['.ssh', '.gnupg', '.aws', '.kube', '.docker', '.claude', '.codex', '.gemini'];
48
+ const isWithin = (child, root) => child === root || child.startsWith(root.endsWith(sep) ? root : root + sep);
49
+ /** `~` and `~/x` to the home directory; anything else is returned unchanged. */
50
+ export function expandHome(raw, home) {
51
+ if (raw === '~')
52
+ return home;
53
+ if (raw.startsWith('~/'))
54
+ return join(home, raw.slice(2));
55
+ return raw;
56
+ }
57
+ /**
58
+ * Why a case may not live at this (already absolute and normalised) path, or null. `systemRoots`
59
+ * defaults to the system trees as spelled; pass their symlink-resolved forms to judge a resolved path.
60
+ */
61
+ export function blockedReason(absPath, ctx, systemRoots = BLOCKED_SYSTEM_ROOTS) {
62
+ if (absPath === sep)
63
+ return 'The filesystem root cannot be a case';
64
+ for (const root of systemRoots) {
65
+ if (isWithin(absPath, root))
66
+ return `${root} is a system directory`;
67
+ }
68
+ if (absPath === ctx.home)
69
+ return 'The home folder itself cannot be a case; pick a folder inside it';
70
+ for (const dir of BLOCKED_HOME_DIRS) {
71
+ if (isWithin(absPath, join(ctx.home, dir)))
72
+ return `~/${dir} holds credentials or another tool's configuration`;
73
+ }
74
+ if (isWithin(absPath, ctx.dataDir))
75
+ return "Codeman's own data folder cannot be a case";
76
+ // Any Codeman instance's data dir under the home folder (~/.codeman, ~/.codeman-beta, ...), not only
77
+ // the one this process uses.
78
+ if (absPath.startsWith(ctx.home + sep)) {
79
+ const firstSegment = absPath.slice(ctx.home.length + 1).split(sep)[0];
80
+ if (/^\.codeman/.test(firstSegment))
81
+ return "Codeman's own data folder cannot be a case";
82
+ }
83
+ for (const dir of ctx.casesDirs ?? []) {
84
+ if (isWithin(absPath, dir)) {
85
+ return 'That folder is inside the cases folder; create a case there with plain Create New (no custom folder)';
86
+ }
87
+ }
88
+ return null;
89
+ }
90
+ /** `p` with its symlinks resolved, or `p` itself when it does not exist (or cannot be read). */
91
+ async function realpathOr(p) {
92
+ try {
93
+ return await fs.realpath(p);
94
+ }
95
+ catch {
96
+ return p;
97
+ }
98
+ }
99
+ /** The context and system roots with their symlinks resolved, for judging a resolved path. */
100
+ async function resolvedPolicy(ctx) {
101
+ const [home, dataDir, casesDirs, systemRoots] = await Promise.all([
102
+ realpathOr(ctx.home),
103
+ realpathOr(ctx.dataDir),
104
+ Promise.all((ctx.casesDirs ?? []).map(realpathOr)),
105
+ Promise.all(BLOCKED_SYSTEM_ROOTS.map(realpathOr)),
106
+ ]);
107
+ return [{ home, dataDir, casesDirs }, systemRoots];
108
+ }
109
+ /**
110
+ * Judge `raw` as the folder for a new case and, if it is acceptable, say what to create.
111
+ * Never creates anything.
112
+ */
113
+ export async function prepareNewCasePath(raw, ctx) {
114
+ const typed = raw.trim();
115
+ if (!typed)
116
+ return { ok: false, code: 'INVALID', reason: 'Enter a folder path' };
117
+ const expanded = expandHome(typed, ctx.home);
118
+ if (!isValidWorkingDir(expanded)) {
119
+ return {
120
+ ok: false,
121
+ code: 'INVALID',
122
+ reason: 'Use an absolute path with letters, numbers, spaces, - _ . only (no .., no shell characters)',
123
+ };
124
+ }
125
+ const target = resolve(expanded);
126
+ const typedBlock = blockedReason(target, ctx);
127
+ if (typedBlock)
128
+ return { ok: false, code: 'BLOCKED', reason: typedBlock };
129
+ // Bounded first: the parent can sit on a network mount that stopped answering, where the
130
+ // realpath/stat/lstat/readdir below would each hold a threadpool worker until it returns.
131
+ // It is one folder the user named, so the probe may pass the bulk cap (never the ceiling).
132
+ const parentState = await probePath(dirname(target), { pastCap: true });
133
+ if (parentState === 'absent') {
134
+ return { ok: false, code: 'NOT_FOUND', reason: `The parent folder ${dirname(target)} does not exist` };
135
+ }
136
+ if (parentState === 'unknown') {
137
+ return {
138
+ ok: false,
139
+ code: 'UNREACHABLE',
140
+ reason: describeUnknownPath('The parent folder', dirname(target), { pastCap: true }),
141
+ };
142
+ }
143
+ // Resolve the parent's symlinks, then judge again: a link into a blocked tree must not pass.
144
+ let realParent;
145
+ try {
146
+ realParent = await fs.realpath(dirname(target));
147
+ if (!(await fs.stat(realParent)).isDirectory()) {
148
+ return { ok: false, code: 'INVALID', reason: `${dirname(target)} is not a folder` };
149
+ }
150
+ }
151
+ catch {
152
+ return { ok: false, code: 'NOT_FOUND', reason: `The parent folder ${dirname(target)} does not exist` };
153
+ }
154
+ const real = join(realParent, basename(target));
155
+ // The resolved path against the roots as given AND as resolved: with home reached through a link, a
156
+ // link to <real home>/.ssh is only caught by the resolved home; on macOS /etc is /private/etc.
157
+ const [resolvedCtx, resolvedSystemRoots] = await resolvedPolicy(ctx);
158
+ const realBlock = blockedReason(real, ctx) ?? blockedReason(real, resolvedCtx, resolvedSystemRoots);
159
+ if (realBlock)
160
+ return { ok: false, code: 'BLOCKED', reason: realBlock };
161
+ try {
162
+ const st = await fs.lstat(real);
163
+ if (st.isSymbolicLink())
164
+ return { ok: false, code: 'INVALID', reason: `${target} is a symbolic link` };
165
+ if (!st.isDirectory())
166
+ return { ok: false, code: 'INVALID', reason: `${target} exists and is not a folder` };
167
+ if ((await fs.readdir(real)).length > 0) {
168
+ return {
169
+ ok: false,
170
+ code: 'EXISTS',
171
+ reason: `${target} already has files in it. Use "Link Existing" for a project that already exists`,
172
+ };
173
+ }
174
+ return { ok: true, path: real, existedEmpty: true };
175
+ }
176
+ catch (err) {
177
+ if (err.code === 'ENOENT')
178
+ return { ok: true, path: real, existedEmpty: false };
179
+ return { ok: false, code: 'INVALID', reason: `Cannot read ${target}: ${err.message}` };
180
+ }
181
+ }
182
+ //# sourceMappingURL=case-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"case-path.js","sourceRoot":"","sources":["../../src/web/case-path.ts"],"names":[],"mappings":"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"}
Binary file