1use crate::CodeMeta;
13
14pub const ERR_AUBE_NO_LOCKFILE: &str = "ERR_AUBE_NO_LOCKFILE";
16pub const ERR_AUBE_LOCKFILE_PARSE: &str = "ERR_AUBE_LOCKFILE_PARSE";
17pub const ERR_AUBE_LOCKFILE_UNSUPPORTED_FORMAT: &str = "ERR_AUBE_LOCKFILE_UNSUPPORTED_FORMAT";
18
19pub const ERR_AUBE_NO_MATCHING_VERSION: &str = "ERR_AUBE_NO_MATCHING_VERSION";
21pub const ERR_AUBE_NO_MATURE_MATCHING_VERSION: &str = "ERR_AUBE_NO_MATURE_MATCHING_VERSION";
22pub const ERR_AUBE_REGISTRY_ERROR: &str = "ERR_AUBE_REGISTRY_ERROR";
23pub const ERR_AUBE_UNKNOWN_CATALOG: &str = "ERR_AUBE_UNKNOWN_CATALOG";
24pub const ERR_AUBE_UNKNOWN_CATALOG_ENTRY: &str = "ERR_AUBE_UNKNOWN_CATALOG_ENTRY";
25pub const ERR_AUBE_BLOCKED_EXOTIC_SUBDEP: &str = "ERR_AUBE_BLOCKED_EXOTIC_SUBDEP";
26pub const ERR_AUBE_TRUST_DOWNGRADE: &str = "ERR_AUBE_TRUST_DOWNGRADE";
27pub const ERR_AUBE_TRUST_MISSING_TIME: &str = "ERR_AUBE_TRUST_MISSING_TIME";
28#[rustfmt::skip] pub const ERR_AUBE_TRUST_EXCLUDE_INVALID_VERSION_UNION: &str = "ERR_AUBE_TRUST_EXCLUDE_INVALID_VERSION_UNION";
32#[rustfmt::skip] pub const ERR_AUBE_TRUST_EXCLUDE_NAME_GLOB_WITH_VERSIONS: &str = "ERR_AUBE_TRUST_EXCLUDE_NAME_GLOB_WITH_VERSIONS";
33pub const ERR_AUBE_PEER_CONTEXT_NOT_CONVERGED: &str = "ERR_AUBE_PEER_CONTEXT_NOT_CONVERGED";
34
35pub const ERR_AUBE_PACKAGE_NOT_FOUND: &str = "ERR_AUBE_PACKAGE_NOT_FOUND";
37pub const ERR_AUBE_VERSION_NOT_FOUND: &str = "ERR_AUBE_VERSION_NOT_FOUND";
38pub const ERR_AUBE_UNAUTHORIZED: &str = "ERR_AUBE_UNAUTHORIZED";
39pub const ERR_AUBE_OFFLINE: &str = "ERR_AUBE_OFFLINE";
40pub const ERR_AUBE_INVALID_PACKAGE_NAME: &str = "ERR_AUBE_INVALID_PACKAGE_NAME";
41pub const ERR_AUBE_REGISTRY_WRITE_REJECTED: &str = "ERR_AUBE_REGISTRY_WRITE_REJECTED";
42pub const ERR_AUBE_MALICIOUS_PACKAGE: &str = "ERR_AUBE_MALICIOUS_PACKAGE";
43pub const ERR_AUBE_LOW_DOWNLOAD_PACKAGE: &str = "ERR_AUBE_LOW_DOWNLOAD_PACKAGE";
44pub const ERR_AUBE_ADVISORY_CHECK_FAILED: &str = "ERR_AUBE_ADVISORY_CHECK_FAILED";
45pub const ERR_AUBE_SECURITY_SCANNER_FATAL: &str = "ERR_AUBE_SECURITY_SCANNER_FATAL";
46pub const ERR_AUBE_SECURITY_SCANNER_FAILED: &str = "ERR_AUBE_SECURITY_SCANNER_FAILED";
47
48pub const ERR_AUBE_TARBALL_INTEGRITY: &str = "ERR_AUBE_TARBALL_INTEGRITY";
50pub const ERR_AUBE_TARBALL_EXTRACT: &str = "ERR_AUBE_TARBALL_EXTRACT";
51pub const ERR_AUBE_PKG_CONTENT_MISMATCH: &str = "ERR_AUBE_PKG_CONTENT_MISMATCH";
52pub const ERR_AUBE_TARBALL_URL_MISMATCH: &str = "ERR_AUBE_TARBALL_URL_MISMATCH";
53pub const ERR_AUBE_NO_HOME: &str = "ERR_AUBE_NO_HOME";
54pub const ERR_AUBE_GIT_ERROR: &str = "ERR_AUBE_GIT_ERROR";
55
56pub const ERR_AUBE_LINK_FAILED: &str = "ERR_AUBE_LINK_FAILED";
58pub const ERR_AUBE_PATCH_FAILED: &str = "ERR_AUBE_PATCH_FAILED";
59pub const ERR_AUBE_MISSING_PACKAGE_INDEX: &str = "ERR_AUBE_MISSING_PACKAGE_INDEX";
60pub const ERR_AUBE_UNSAFE_INDEX_KEY: &str = "ERR_AUBE_UNSAFE_INDEX_KEY";
61pub const ERR_AUBE_UNSAFE_PACKAGE_NAME: &str = "ERR_AUBE_UNSAFE_PACKAGE_NAME";
62pub const ERR_AUBE_MISSING_STORE_FILE: &str = "ERR_AUBE_MISSING_STORE_FILE";
63
64pub const ERR_AUBE_SCRIPT_SPAWN: &str = "ERR_AUBE_SCRIPT_SPAWN";
66pub const ERR_AUBE_SCRIPT_NON_ZERO_EXIT: &str = "ERR_AUBE_SCRIPT_NON_ZERO_EXIT";
67#[rustfmt::skip] pub const ERR_AUBE_BUILD_POLICY_UNSUPPORTED_VALUE: &str = "ERR_AUBE_BUILD_POLICY_UNSUPPORTED_VALUE";
68#[rustfmt::skip] pub const ERR_AUBE_BUILD_POLICY_INVALID_VERSION_UNION: &str = "ERR_AUBE_BUILD_POLICY_INVALID_VERSION_UNION";
69#[rustfmt::skip] pub const ERR_AUBE_BUILD_POLICY_WILDCARD_WITH_VERSION: &str = "ERR_AUBE_BUILD_POLICY_WILDCARD_WITH_VERSION";
70
71pub const ERR_AUBE_WORKSPACE_PARSE: &str = "ERR_AUBE_WORKSPACE_PARSE";
73pub const ERR_AUBE_FILTER_EMPTY: &str = "ERR_AUBE_FILTER_EMPTY";
74pub const ERR_AUBE_FILTER_GIT_IO: &str = "ERR_AUBE_FILTER_GIT_IO";
75pub const ERR_AUBE_FILTER_GIT_FAILED: &str = "ERR_AUBE_FILTER_GIT_FAILED";
76
77pub const ERR_AUBE_MANIFEST_PARSE: &str = "ERR_AUBE_MANIFEST_PARSE";
79pub const ERR_AUBE_MANIFEST_YAML_PARSE: &str = "ERR_AUBE_MANIFEST_YAML_PARSE";
80
81pub const ERR_AUBE_UNSUPPORTED_ENGINE: &str = "ERR_AUBE_UNSUPPORTED_ENGINE";
83pub const ERR_AUBE_RECURSIVE_NOT_SUPPORTED: &str = "ERR_AUBE_RECURSIVE_NOT_SUPPORTED";
84pub const ERR_AUBE_UNKNOWN_COMMAND: &str = "ERR_AUBE_UNKNOWN_COMMAND";
85pub const ERR_AUBE_NPM_ONLY_COMMAND: &str = "ERR_AUBE_NPM_ONLY_COMMAND";
86pub const ERR_AUBE_COMPLETION_FAILED: &str = "ERR_AUBE_COMPLETION_FAILED";
87pub const ERR_AUBE_REMOVE_PRIOR_INSTALL_DIR: &str = "ERR_AUBE_REMOVE_PRIOR_INSTALL_DIR";
88pub const ERR_AUBE_CONFIG_NESTED_AUBE_KEY: &str = "ERR_AUBE_CONFIG_NESTED_AUBE_KEY";
89pub const ERR_AUBE_CONFLICTING_BUILD_FLAGS: &str = "ERR_AUBE_CONFLICTING_BUILD_FLAGS";
90
91pub const ERR_AUBE_PATCHES_TRACKING_WRITE: &str = "ERR_AUBE_PATCHES_TRACKING_WRITE";
93pub const ERR_AUBE_UNSAFE_SHEBANG_INTERPRETER: &str = "ERR_AUBE_UNSAFE_SHEBANG_INTERPRETER";
94
95pub mod category {
99 pub const LOCKFILE: &str = "Lockfile";
100 pub const RESOLVER: &str = "Resolver";
101 pub const TARBALL_STORE: &str = "Tarball / store";
102 pub const REGISTRY_NETWORK: &str = "Registry / network";
103 pub const SCRIPTS: &str = "Scripts / build";
104 pub const LINKER: &str = "Linker";
105 pub const MANIFEST_WORKSPACE: &str = "Manifest / workspace";
106 pub const ENGINE_CLI: &str = "Engine / CLI";
107 pub const MISC_SAFETY: &str = "Misc / safety";
108 pub const SUPPLY_CHAIN: &str = "Supply chain (add-time)";
111}
112
113pub const ALL: &[CodeMeta] = &[
118 CodeMeta {
120 name: ERR_AUBE_NO_LOCKFILE,
121 category: category::LOCKFILE,
122 description: "An operation that required a lockfile (`--frozen-lockfile`, `aube fetch`, etc.) found none in the project.",
123 exit_code: Some(10),
124 },
125 CodeMeta {
126 name: ERR_AUBE_LOCKFILE_PARSE,
127 category: category::LOCKFILE,
128 description: "Lockfile is structurally invalid — version guard failed, YAML shape is wrong, or `yaml_serde` couldn't round-trip the contents.",
129 exit_code: Some(11),
130 },
131 CodeMeta {
132 name: ERR_AUBE_LOCKFILE_UNSUPPORTED_FORMAT,
133 category: category::LOCKFILE,
134 description: "Lockfile filename was recognized but its format isn't supported on this aube version.",
135 exit_code: Some(12),
136 },
137 CodeMeta {
139 name: ERR_AUBE_NO_MATCHING_VERSION,
140 category: category::RESOLVER,
141 description: "No published version of the named package satisfies the requested range.",
142 exit_code: Some(20),
143 },
144 CodeMeta {
145 name: ERR_AUBE_NO_MATURE_MATCHING_VERSION,
146 category: category::RESOLVER,
147 description: "A version satisfying the range exists but every candidate was younger than `minimumReleaseAge` and `minimumReleaseAgeStrict=true`.",
148 exit_code: Some(21),
149 },
150 CodeMeta {
151 name: ERR_AUBE_BLOCKED_EXOTIC_SUBDEP,
152 category: category::RESOLVER,
153 description: "Transitive dep used a `git:` / `file:` / `tarball` specifier and `blockExoticSubdeps=true`.",
154 exit_code: Some(22),
155 },
156 CodeMeta {
157 name: ERR_AUBE_TRUST_DOWNGRADE,
158 category: category::RESOLVER,
159 description: "Picked version dropped trust evidence the prior version had (`trustPolicy=no-downgrade`).",
160 exit_code: Some(23),
161 },
162 CodeMeta {
163 name: ERR_AUBE_TRUST_MISSING_TIME,
164 category: category::RESOLVER,
165 description: "Registry's packument has no `time` entry for the picked version (`trustPolicy=no-downgrade`).",
166 exit_code: Some(24),
167 },
168 CodeMeta {
169 name: ERR_AUBE_UNKNOWN_CATALOG,
170 category: category::RESOLVER,
171 description: "A `catalog:<name>` reference was used but the catalog isn't defined.",
172 exit_code: Some(25),
173 },
174 CodeMeta {
175 name: ERR_AUBE_UNKNOWN_CATALOG_ENTRY,
176 category: category::RESOLVER,
177 description: "The catalog exists but has no entry for the requested package.",
178 exit_code: Some(26),
179 },
180 CodeMeta {
181 name: ERR_AUBE_PEER_CONTEXT_NOT_CONVERGED,
182 category: category::RESOLVER,
183 description: "Peer-context fixed-point loop hit `MAX_ITERATIONS=16` without converging — usually mutually-recursive peers.",
184 exit_code: Some(27),
185 },
186 CodeMeta {
187 name: ERR_AUBE_REGISTRY_ERROR,
188 category: category::RESOLVER,
189 description: "Generic registry error from inside the resolver.",
190 exit_code: None,
191 },
192 CodeMeta {
193 name: ERR_AUBE_TRUST_EXCLUDE_INVALID_VERSION_UNION,
194 category: category::RESOLVER,
195 description: "A `trustPolicyExclude` pattern had a non-exact version.",
196 exit_code: None,
197 },
198 CodeMeta {
199 name: ERR_AUBE_TRUST_EXCLUDE_NAME_GLOB_WITH_VERSIONS,
200 category: category::RESOLVER,
201 description: "A `trustPolicyExclude` pattern combined a name glob with versions.",
202 exit_code: None,
203 },
204 CodeMeta {
206 name: ERR_AUBE_TARBALL_INTEGRITY,
207 category: category::TARBALL_STORE,
208 description: "Downloaded tarball's hash didn't match the lockfile's / packument's `dist.integrity`.",
209 exit_code: Some(30),
210 },
211 CodeMeta {
212 name: ERR_AUBE_TARBALL_EXTRACT,
213 category: category::TARBALL_STORE,
214 description: "Tarball couldn't be extracted (corrupt gzip, unexpected entry shape, etc.).",
215 exit_code: Some(31),
216 },
217 CodeMeta {
218 name: ERR_AUBE_PKG_CONTENT_MISMATCH,
219 category: category::TARBALL_STORE,
220 description: "Tarball's `package.json` declared a different `(name, version)` than the resolver expected (`strictStorePkgContentCheck=true`).",
221 exit_code: Some(32),
222 },
223 CodeMeta {
224 name: ERR_AUBE_GIT_ERROR,
225 category: category::TARBALL_STORE,
226 description: "Git operation failed during a `git:` dep prepare or checkout.",
227 exit_code: Some(33),
228 },
229 CodeMeta {
230 name: ERR_AUBE_TARBALL_URL_MISMATCH,
231 category: category::TARBALL_STORE,
232 description: "A registry lockfile entry's explicit tarball URL didn't match the registry metadata for that `(name, version)`.",
233 exit_code: Some(34),
234 },
235 CodeMeta {
236 name: ERR_AUBE_NO_HOME,
237 category: category::TARBALL_STORE,
238 description: "`HOME` (or platform equivalent) is unset, so aube can't locate its store.",
239 exit_code: None,
240 },
241 CodeMeta {
243 name: ERR_AUBE_PACKAGE_NOT_FOUND,
244 category: category::REGISTRY_NETWORK,
245 description: "Registry returned 404 for the package name.",
246 exit_code: Some(40),
247 },
248 CodeMeta {
249 name: ERR_AUBE_VERSION_NOT_FOUND,
250 category: category::REGISTRY_NETWORK,
251 description: "Package exists but the requested version doesn't.",
252 exit_code: Some(41),
253 },
254 CodeMeta {
255 name: ERR_AUBE_UNAUTHORIZED,
256 category: category::REGISTRY_NETWORK,
257 description: "Registry returned 401/403 — missing or invalid auth. Run `aube login`.",
258 exit_code: Some(42),
259 },
260 CodeMeta {
261 name: ERR_AUBE_OFFLINE,
262 category: category::REGISTRY_NETWORK,
263 description: "Offline mode and the requested resource isn't in the local cache.",
264 exit_code: Some(43),
265 },
266 CodeMeta {
267 name: ERR_AUBE_INVALID_PACKAGE_NAME,
268 category: category::REGISTRY_NETWORK,
269 description: "A name doesn't match npm's grammar — rejected before any I/O so a hostile manifest can't use the cache-path builder as a write primitive.",
270 exit_code: Some(44),
271 },
272 CodeMeta {
273 name: ERR_AUBE_REGISTRY_WRITE_REJECTED,
274 category: category::REGISTRY_NETWORK,
275 description: "Registry rejected a publish/deprecate/owner write with a non-2xx response.",
276 exit_code: Some(45),
277 },
278 CodeMeta {
279 name: ERR_AUBE_MALICIOUS_PACKAGE,
280 category: category::REGISTRY_NETWORK,
281 description: "`aube add` refused a package because OSV reports it as malicious (`MAL-*` advisory). Hard block — confirmed-malicious advisories aren't a judgement call.",
282 exit_code: Some(46),
283 },
284 CodeMeta {
285 name: ERR_AUBE_LOW_DOWNLOAD_PACKAGE,
286 category: category::REGISTRY_NETWORK,
287 description: "`aube add` refused a package whose weekly downloads fall below `lowDownloadThreshold` in a non-interactive context (or when stdin is not a TTY). Pass `--allow-low-downloads` to bypass.",
288 exit_code: Some(47),
289 },
290 CodeMeta {
291 name: ERR_AUBE_ADVISORY_CHECK_FAILED,
292 category: category::REGISTRY_NETWORK,
293 description: "`aube add` couldn't reach the OSV advisory API and `advisoryCheck = required` is set. Distinct from `ERR_AUBE_MALICIOUS_PACKAGE` so CI tooling can tell a network outage from a confirmed malicious advisory.",
294 exit_code: Some(49),
295 },
296 CodeMeta {
297 name: ERR_AUBE_SECURITY_SCANNER_FATAL,
298 category: category::SUPPLY_CHAIN,
299 description: "User-configured `securityScanner` returned a `fatal`-level advisory against a package the user is trying to add. Bun-style pluggable scanner contract; the scanner itself decides what counts as fatal.",
300 exit_code: Some(48),
301 },
302 CodeMeta {
303 name: ERR_AUBE_SECURITY_SCANNER_FAILED,
304 category: category::SUPPLY_CHAIN,
305 description: "User-configured `securityScanner` couldn't be spawned, exited non-zero, timed out, or emitted unparseable JSON. Fail-closed by design: a configured scanner that can't run is treated as a refusal, not a free pass. Set `securityScanner = \"\"` to disable the integration when bootstrapping or recovering from a broken scanner.",
306 exit_code: None,
307 },
308 CodeMeta {
310 name: ERR_AUBE_SCRIPT_NON_ZERO_EXIT,
311 category: category::SCRIPTS,
312 description: "A lifecycle script (`preinstall` / `install` / `postinstall` / a `package.json` script) exited non-zero.",
313 exit_code: Some(50),
314 },
315 CodeMeta {
316 name: ERR_AUBE_SCRIPT_SPAWN,
317 category: category::SCRIPTS,
318 description: "Couldn't spawn a script's interpreter (shell missing, jail setup failed, etc.).",
319 exit_code: Some(51),
320 },
321 CodeMeta {
322 name: ERR_AUBE_BUILD_POLICY_UNSUPPORTED_VALUE,
323 category: category::SCRIPTS,
324 description: "An entry in `allowBuilds` had a value that wasn't `true`/`false`.",
325 exit_code: None,
326 },
327 CodeMeta {
328 name: ERR_AUBE_BUILD_POLICY_INVALID_VERSION_UNION,
329 category: category::SCRIPTS,
330 description: "An `allowBuilds` pattern's version union was unparseable.",
331 exit_code: None,
332 },
333 CodeMeta {
334 name: ERR_AUBE_BUILD_POLICY_WILDCARD_WITH_VERSION,
335 category: category::SCRIPTS,
336 description: "An `allowBuilds` pattern combined a wildcard name with a version union.",
337 exit_code: None,
338 },
339 CodeMeta {
341 name: ERR_AUBE_PATCH_FAILED,
342 category: category::LINKER,
343 description: "Applying a `pnpm.patchedDependencies` patch failed.",
344 exit_code: Some(60),
345 },
346 CodeMeta {
347 name: ERR_AUBE_LINK_FAILED,
348 category: category::LINKER,
349 description: "Symlink / junction / hardlink couldn't be created — usually permissions or filesystem support.",
350 exit_code: Some(61),
351 },
352 CodeMeta {
353 name: ERR_AUBE_MISSING_PACKAGE_INDEX,
354 category: category::LINKER,
355 description: "Internal: a caller skipped `load_index` but the package wasn't already materialized.",
356 exit_code: Some(62),
357 },
358 CodeMeta {
359 name: ERR_AUBE_MISSING_STORE_FILE,
360 category: category::LINKER,
361 description: "A package index references a CAS shard that doesn't exist on disk. Re-run install to re-fetch.",
362 exit_code: Some(63),
363 },
364 CodeMeta {
366 name: ERR_AUBE_MANIFEST_PARSE,
367 category: category::MANIFEST_WORKSPACE,
368 description: "A `package.json` had a syntax error. miette renders a pointer at the offending byte.",
369 exit_code: Some(70),
370 },
371 CodeMeta {
372 name: ERR_AUBE_WORKSPACE_PARSE,
373 category: category::MANIFEST_WORKSPACE,
374 description: "An `aube-workspace.yaml` / `pnpm-workspace.yaml` was structurally invalid.",
375 exit_code: Some(71),
376 },
377 CodeMeta {
378 name: ERR_AUBE_MANIFEST_YAML_PARSE,
379 category: category::MANIFEST_WORKSPACE,
380 description: "A workspace YAML helper file was structurally invalid (no source pointer available).",
381 exit_code: None,
382 },
383 CodeMeta {
384 name: ERR_AUBE_FILTER_EMPTY,
385 category: category::MANIFEST_WORKSPACE,
386 description: "`--filter` was passed an empty selector.",
387 exit_code: None,
388 },
389 CodeMeta {
390 name: ERR_AUBE_FILTER_GIT_IO,
391 category: category::MANIFEST_WORKSPACE,
392 description: "A `--filter ...[ref]` selector failed to spawn `git`.",
393 exit_code: None,
394 },
395 CodeMeta {
396 name: ERR_AUBE_FILTER_GIT_FAILED,
397 category: category::MANIFEST_WORKSPACE,
398 description: "The git subprocess for a `--filter ...[ref]` selector exited non-zero.",
399 exit_code: None,
400 },
401 CodeMeta {
403 name: ERR_AUBE_UNSUPPORTED_ENGINE,
404 category: category::ENGINE_CLI,
405 description: "One or more packages declared an `engines` constraint incompatible with the running Node/aube and `engine-strict=true`.",
406 exit_code: Some(80),
407 },
408 CodeMeta {
409 name: ERR_AUBE_UNKNOWN_COMMAND,
410 category: category::ENGINE_CLI,
411 description: "The named subcommand isn't a built-in aube command and isn't a script in the manifest.",
412 exit_code: Some(81),
413 },
414 CodeMeta {
415 name: ERR_AUBE_NPM_ONLY_COMMAND,
416 category: category::ENGINE_CLI,
417 description: "The user invoked an npm-only command (`whoami`, `token`, `owner`, `search`, `pkg`, `set-script`) — aube doesn't implement these; use npm.",
418 exit_code: Some(82),
419 },
420 CodeMeta {
421 name: ERR_AUBE_RECURSIVE_NOT_SUPPORTED,
422 category: category::ENGINE_CLI,
423 description: "A command was invoked under `--recursive` but doesn't support recursive execution.",
424 exit_code: None,
425 },
426 CodeMeta {
427 name: ERR_AUBE_COMPLETION_FAILED,
428 category: category::ENGINE_CLI,
429 description: "`aube completion` couldn't invoke `usage` to render the shell completions.",
430 exit_code: None,
431 },
432 CodeMeta {
433 name: ERR_AUBE_REMOVE_PRIOR_INSTALL_DIR,
434 category: category::ENGINE_CLI,
435 description: "Couldn't clean up a prior global install dir before re-installing.",
436 exit_code: None,
437 },
438 CodeMeta {
439 name: ERR_AUBE_CONFIG_NESTED_AUBE_KEY,
440 category: category::ENGINE_CLI,
441 description: "`aube config set <prefix>.<sub> …` was used for a key whose prefix is an aube map setting (e.g. `allowBuilds.<pkg>`). Such nested writes would otherwise land in `.npmrc` where aube doesn't read them and npm warns/errors about the unknown key — set the map in workspace yaml or `package.json#aube.<prefix>` instead.",
442 exit_code: None,
443 },
444 CodeMeta {
445 name: ERR_AUBE_CONFLICTING_BUILD_FLAGS,
446 category: category::ENGINE_CLI,
447 description: "`aube add` was passed the same package name in both `--allow-build` and `--deny-build`.",
448 exit_code: None,
449 },
450 CodeMeta {
452 name: ERR_AUBE_UNSAFE_INDEX_KEY,
453 category: category::MISC_SAFETY,
454 description: "A package index key tried to escape its directory (path traversal defense in depth).",
455 exit_code: Some(90),
456 },
457 CodeMeta {
458 name: ERR_AUBE_UNSAFE_SHEBANG_INTERPRETER,
459 category: category::MISC_SAFETY,
460 description: "A `#!` shebang named an unsafe interpreter when generating a shim — substituted with `node` instead. Surfaced as `tracing::error!` but install continues.",
461 exit_code: Some(91),
462 },
463 CodeMeta {
464 name: ERR_AUBE_UNSAFE_PACKAGE_NAME,
465 category: category::MISC_SAFETY,
466 description: "A package/dependency alias would escape its `node_modules` slot if linked.",
467 exit_code: Some(92),
468 },
469 CodeMeta {
470 name: ERR_AUBE_PATCHES_TRACKING_WRITE,
471 category: category::MISC_SAFETY,
472 description: "Couldn't write `.aube-applied-patches.json` after applying patches. Non-fatal; next install may miss stale patched entries.",
473 exit_code: None,
474 },
475];