@openrig/cli 0.4.0 → 0.4.2

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 (114) hide show
  1. package/daemon/assets/plugins/openrig-core/hooks/claude.json +11 -0
  2. package/daemon/assets/plugins/openrig-core/hooks/codex.json +14 -3
  3. package/daemon/assets/plugins/openrig-core/hooks/scripts/compaction-restore-bridge.cjs +28 -24
  4. package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/scripts/precompact-hook.mjs +72 -11
  5. package/daemon/assets/plugins/openrig-core/skills/queue-handoff/SKILL.md +62 -29
  6. package/daemon/dist/adapters/codex-runtime-adapter.d.ts +32 -0
  7. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  8. package/daemon/dist/adapters/codex-runtime-adapter.js +154 -1
  9. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  10. package/daemon/dist/db/migrations/044_queue_item_summary.d.ts +21 -0
  11. package/daemon/dist/db/migrations/044_queue_item_summary.d.ts.map +1 -0
  12. package/daemon/dist/db/migrations/044_queue_item_summary.js +25 -0
  13. package/daemon/dist/db/migrations/044_queue_item_summary.js.map +1 -0
  14. package/daemon/dist/domain/agent-activity-store.js +11 -0
  15. package/daemon/dist/domain/agent-activity-store.js.map +1 -1
  16. package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
  17. package/daemon/dist/domain/claude-compaction-enforcer.js +69 -1
  18. package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
  19. package/daemon/dist/domain/daemon-version.d.ts +15 -0
  20. package/daemon/dist/domain/daemon-version.d.ts.map +1 -0
  21. package/daemon/dist/domain/daemon-version.js +28 -0
  22. package/daemon/dist/domain/daemon-version.js.map +1 -0
  23. package/daemon/dist/domain/node-cmux-service.d.ts +1 -0
  24. package/daemon/dist/domain/node-cmux-service.d.ts.map +1 -1
  25. package/daemon/dist/domain/node-cmux-service.js +29 -2
  26. package/daemon/dist/domain/node-cmux-service.js.map +1 -1
  27. package/daemon/dist/domain/queue-repository.d.ts +18 -0
  28. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  29. package/daemon/dist/domain/queue-repository.js +18 -0
  30. package/daemon/dist/domain/queue-repository.js.map +1 -1
  31. package/daemon/dist/domain/scope/scope-audit.d.ts +14 -2
  32. package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
  33. package/daemon/dist/domain/scope/scope-audit.js +95 -0
  34. package/daemon/dist/domain/scope/scope-audit.js.map +1 -1
  35. package/daemon/dist/domain/scope/types.d.ts +6 -0
  36. package/daemon/dist/domain/scope/types.d.ts.map +1 -1
  37. package/daemon/dist/domain/scope/types.js +8 -0
  38. package/daemon/dist/domain/scope/types.js.map +1 -1
  39. package/daemon/dist/domain/session-transport.d.ts +10 -0
  40. package/daemon/dist/domain/session-transport.d.ts.map +1 -1
  41. package/daemon/dist/domain/session-transport.js +153 -19
  42. package/daemon/dist/domain/session-transport.js.map +1 -1
  43. package/daemon/dist/domain/slices/slice-detail-projector.d.ts.map +1 -1
  44. package/daemon/dist/domain/slices/slice-detail-projector.js +10 -3
  45. package/daemon/dist/domain/slices/slice-detail-projector.js.map +1 -1
  46. package/daemon/dist/domain/types.d.ts +10 -0
  47. package/daemon/dist/domain/types.d.ts.map +1 -1
  48. package/daemon/dist/domain/types.js.map +1 -1
  49. package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts +1 -0
  50. package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
  51. package/daemon/dist/domain/workspace/default-workspace-scaffold.js +25 -1
  52. package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
  53. package/daemon/dist/routes/bundles.d.ts.map +1 -1
  54. package/daemon/dist/routes/bundles.js +1 -18
  55. package/daemon/dist/routes/bundles.js.map +1 -1
  56. package/daemon/dist/routes/health-summary.d.ts.map +1 -1
  57. package/daemon/dist/routes/health-summary.js +13 -2
  58. package/daemon/dist/routes/health-summary.js.map +1 -1
  59. package/daemon/dist/routes/queue.d.ts.map +1 -1
  60. package/daemon/dist/routes/queue.js +3 -0
  61. package/daemon/dist/routes/queue.js.map +1 -1
  62. package/daemon/dist/routes/scope-audit.d.ts.map +1 -1
  63. package/daemon/dist/routes/scope-audit.js +28 -1
  64. package/daemon/dist/routes/scope-audit.js.map +1 -1
  65. package/daemon/dist/routes/transport.d.ts.map +1 -1
  66. package/daemon/dist/routes/transport.js +22 -0
  67. package/daemon/dist/routes/transport.js.map +1 -1
  68. package/daemon/dist/startup.d.ts.map +1 -1
  69. package/daemon/dist/startup.js +15 -3
  70. package/daemon/dist/startup.js.map +1 -1
  71. package/dist/commands/auth.d.ts +11 -0
  72. package/dist/commands/auth.d.ts.map +1 -0
  73. package/dist/commands/auth.js +145 -0
  74. package/dist/commands/auth.js.map +1 -0
  75. package/dist/commands/config-init-workspace.d.ts.map +1 -1
  76. package/dist/commands/config-init-workspace.js +7 -4
  77. package/dist/commands/config-init-workspace.js.map +1 -1
  78. package/dist/commands/queue.d.ts.map +1 -1
  79. package/dist/commands/queue.js +23 -0
  80. package/dist/commands/queue.js.map +1 -1
  81. package/dist/commands/scope.d.ts.map +1 -1
  82. package/dist/commands/scope.js +64 -6
  83. package/dist/commands/scope.js.map +1 -1
  84. package/dist/commands/send.d.ts.map +1 -1
  85. package/dist/commands/send.js +40 -7
  86. package/dist/commands/send.js.map +1 -1
  87. package/dist/daemon-lifecycle.d.ts +1 -0
  88. package/dist/daemon-lifecycle.d.ts.map +1 -1
  89. package/dist/daemon-lifecycle.js +35 -3
  90. package/dist/daemon-lifecycle.js.map +1 -1
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +2 -0
  93. package/dist/index.js.map +1 -1
  94. package/dist/lib/codex-auth.d.ts +124 -0
  95. package/dist/lib/codex-auth.d.ts.map +1 -0
  96. package/dist/lib/codex-auth.js +418 -0
  97. package/dist/lib/codex-auth.js.map +1 -0
  98. package/dist/lib/scope/scope-audit.d.ts +14 -2
  99. package/dist/lib/scope/scope-audit.d.ts.map +1 -1
  100. package/dist/lib/scope/scope-audit.js +95 -0
  101. package/dist/lib/scope/scope-audit.js.map +1 -1
  102. package/dist/lib/scope/templates.d.ts +9 -0
  103. package/dist/lib/scope/templates.d.ts.map +1 -1
  104. package/dist/lib/scope/templates.js +14 -1
  105. package/dist/lib/scope/templates.js.map +1 -1
  106. package/dist/lib/scope-templates/mission-brief.md +20 -0
  107. package/dist/lib/scope-templates/placeholder.md +8 -0
  108. package/dist/lib/scope-templates/proof.md +17 -0
  109. package/package.json +2 -1
  110. package/ui/dist/assets/index-CnqRX7A3.css +32 -0
  111. package/ui/dist/assets/index-CtL9jXFt.js +582 -0
  112. package/ui/dist/index.html +2 -2
  113. package/ui/dist/assets/index-DMI6jeAX.css +0 -32
  114. package/ui/dist/assets/index-FQgCB6mC.js +0 -580
@@ -0,0 +1,418 @@
1
+ // OPR.0.4.1.29 — rig auth secret-safe core (CLI-LOCAL / daemon-free).
2
+ //
3
+ // This module operates directly on the operator's Codex auth files under CODEX_HOME and is invoked
4
+ // only from the `rig auth` CLI command — it NEVER touches the daemon, so a token can never enter the
5
+ // daemon queue / SSE stream / SQLite / event log (never-queued/never-streamed is true BY CONSTRUCTION).
6
+ //
7
+ // SECRET INVARIANTS (non-negotiable): no auth/refresh/access token value is ever returned in, or used
8
+ // to build, any human-facing string. Functions return STRUCTURED, non-secret result objects
9
+ // (presence / mode / parseability / login-state / names / counts); the auth FILE is snapshotted as a
10
+ // file (mode-guarded byte copy), never read into a printed value. CODEX_HOME defaults to $HOME/.codex
11
+ // and is env-overridable (tests point it at a fixture); no personal/operator path is baked in.
12
+ import path from "node:path";
13
+ import fs from "node:fs";
14
+ import { spawnSync } from "node:child_process";
15
+ /** Strict profile-name whitelist: alnum-led, then [A-Za-z0-9._-], 1..64 chars. Excludes /, \, ~,
16
+ * leading dot, whitespace, control, and shell metacharacters. Fail closed. */
17
+ const PROFILE_NAME_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
18
+ export function validateProfileName(name) {
19
+ return typeof name === "string" && name.length > 0 && name.length <= 64 && PROFILE_NAME_RE.test(name);
20
+ }
21
+ /** Resolve the Codex paths from an env map (default process.env). CODEX_HOME wins; else $HOME/.codex. */
22
+ export function resolveCodexHome(env = process.env) {
23
+ const codexHome = typeof env.CODEX_HOME === "string" && env.CODEX_HOME.length > 0
24
+ ? env.CODEX_HOME
25
+ : path.join(env.HOME ?? "", ".codex");
26
+ return {
27
+ codexHome,
28
+ profileDir: path.join(codexHome, "auth-profiles"),
29
+ activeAuth: path.join(codexHome, "auth.json"),
30
+ registryPath: path.join(codexHome, "auth-seat-registry.tsv"),
31
+ };
32
+ }
33
+ // --- secret-safe fs helpers (no contents ever read into a returned/printed value) ---
34
+ function lstatSafe(p) {
35
+ try {
36
+ return fs.lstatSync(p);
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ }
42
+ function isDir(p) {
43
+ const st = lstatSafe(p);
44
+ return st !== null && st.isDirectory();
45
+ }
46
+ function isFile(p) {
47
+ const st = lstatSafe(p);
48
+ return st !== null && st.isFile();
49
+ }
50
+ /** Octal permission string (e.g. "600") or null when the path is absent/unstatable. */
51
+ function fileModeOctal(p) {
52
+ const st = lstatSafe(p);
53
+ if (st === null)
54
+ return null;
55
+ return (st.mode & 0o777).toString(8).padStart(3, "0");
56
+ }
57
+ /** A profile file is safe iff it exists, is a regular file (not a symlink — which could redirect us
58
+ * out of the profile dir), has link count 1 (a hardlink shares an inode that may live outside the
59
+ * profile dir), and lives directly in profileDir. */
60
+ function isSafeProfileFile(p, profileDir) {
61
+ const st = lstatSafe(p);
62
+ if (st === null || st.isSymbolicLink() || !st.isFile() || st.nlink !== 1)
63
+ return false;
64
+ return path.dirname(p) === profileDir;
65
+ }
66
+ /** True iff `dir` really resolves INSIDE realpath(codexHome). realpath follows every symlink in the
67
+ * chain, so a symlinked parent (e.g. an auth-profiles dir pointing outside) resolves out and is
68
+ * rejected — a lexical startsWith would be fooled. Returns false if either path can't be resolved. */
69
+ function realDirContained(dir, codexHome) {
70
+ try {
71
+ const root = fs.realpathSync(codexHome);
72
+ const resolved = fs.realpathSync(dir);
73
+ return resolved === root || resolved.startsWith(root + path.sep);
74
+ }
75
+ catch {
76
+ return false;
77
+ }
78
+ }
79
+ /** A destination we are about to write SECRET bytes onto is safe to replace iff it is absent, or a
80
+ * regular file (not a symlink) with link count 1. A symlink redirects the write; a hardlink (nlink>1)
81
+ * shares an inode that may live outside CODEX_HOME — writing through either leaks secret bytes out. */
82
+ function destReplaceable(p) {
83
+ const st = lstatSafe(p);
84
+ if (st === null)
85
+ return true;
86
+ return !st.isSymbolicLink() && st.isFile() && st.nlink === 1;
87
+ }
88
+ /** Copy `source` onto `dest` so secret bytes (a) never enter JS memory [copyFileSync does the byte
89
+ * copy] and (b) are never written THROUGH a pre-existing inode at dest: we copy into a freshly
90
+ * created (COPYFILE_EXCL) temp in dest's dir, then atomically rename over dest. Rename swaps the
91
+ * directory entry — any pre-existing hardlink/symlink inode is unlinked, never written. Caller must
92
+ * have already verified dest's parent containment and that dest is replaceable. */
93
+ function copyOntoFresh(source, dest) {
94
+ const tmp = `${dest}.tmp-${process.pid}`;
95
+ try {
96
+ try {
97
+ fs.rmSync(tmp, { force: true });
98
+ }
99
+ catch {
100
+ /* ignore */
101
+ }
102
+ fs.copyFileSync(source, tmp, fs.constants.COPYFILE_EXCL); // fresh inode; never through an existing one
103
+ fs.chmodSync(tmp, 0o600);
104
+ fs.renameSync(tmp, dest); // atomic dir-entry swap; old inode unlinked, not written
105
+ fs.chmodSync(dest, 0o600);
106
+ return true;
107
+ }
108
+ catch {
109
+ try {
110
+ fs.rmSync(tmp, { force: true });
111
+ }
112
+ catch {
113
+ /* ignore */
114
+ }
115
+ return false;
116
+ }
117
+ }
118
+ function countProfiles(profileDir) {
119
+ try {
120
+ return fs.readdirSync(profileDir).filter((n) => n.endsWith(".json") && isFile(path.join(profileDir, n))).length;
121
+ }
122
+ catch {
123
+ return 0;
124
+ }
125
+ }
126
+ /** True iff the string contains a control character (<=0x1f or 0x7f), incl. tab/newline/CR which would
127
+ * corrupt a TSV row. Printable chars (spaces, hyphens, '@', '/') are allowed. Regex-free on purpose. */
128
+ function hasControlChar(v) {
129
+ for (let i = 0; i < v.length; i++) {
130
+ const c = v.charCodeAt(i);
131
+ if (c <= 0x1f || c === 0x7f)
132
+ return true;
133
+ }
134
+ return false;
135
+ }
136
+ /** Default login-state probe: exit code only, output never captured (stdio: ignore = no leak path). */
137
+ function defaultLoginStatus(codexHome) {
138
+ const r = spawnSync("codex", ["login", "status"], {
139
+ stdio: "ignore",
140
+ env: { ...process.env, CODEX_HOME: codexHome },
141
+ });
142
+ if (r.error)
143
+ return "unavailable";
144
+ return r.status === 0 ? "logged_in" : "not_logged_in";
145
+ }
146
+ /** Report auth-file presence/mode/safety + profile count + login-state. NEVER reads token contents. */
147
+ export function authStatus(paths, deps = {}) {
148
+ const activeAuthPresent = isFile(paths.activeAuth);
149
+ const activeAuthMode = activeAuthPresent ? fileModeOctal(paths.activeAuth) : null;
150
+ return {
151
+ codexHome: paths.codexHome,
152
+ codexHomePresent: isDir(paths.codexHome),
153
+ profileDirPresent: isDir(paths.profileDir),
154
+ activeAuthPresent,
155
+ activeAuthMode,
156
+ activeAuthModeSafe: activeAuthMode === null ? "unknown" : activeAuthMode === "600",
157
+ profileCount: countProfiles(paths.profileDir),
158
+ loginStatus: (deps.loginStatus ?? defaultLoginStatus)(paths.codexHome),
159
+ };
160
+ }
161
+ /** Validate a saved profile: name whitelist -> safe regular file -> 0600 -> JSON parseable. The
162
+ * parse is in-memory and the result is discarded; on failure we return a FIXED reason and never the
163
+ * JSON.parse error (its message can include a snippet of the file = a secret). */
164
+ export function authValidate(paths, name) {
165
+ if (!validateProfileName(name))
166
+ return { ok: false, reason: "invalid_profile" };
167
+ const target = path.join(paths.profileDir, `${name}.json`);
168
+ if (lstatSafe(target) === null)
169
+ return { ok: false, reason: "missing_profile" };
170
+ // Safe regular file (no symlink/hardlink) AND a profile dir that really resolves inside CODEX_HOME.
171
+ if (!isSafeProfileFile(target, paths.profileDir) || !realDirContained(paths.profileDir, paths.codexHome)) {
172
+ return { ok: false, reason: "unsafe_path" };
173
+ }
174
+ if (fileModeOctal(target) !== "600")
175
+ return { ok: false, reason: "unsafe_permissions" };
176
+ let content;
177
+ try {
178
+ content = fs.readFileSync(target, "utf8");
179
+ }
180
+ catch {
181
+ return { ok: false, reason: "parse_check_unavailable" };
182
+ }
183
+ try {
184
+ JSON.parse(content);
185
+ }
186
+ catch {
187
+ // Intentionally ignore the error object — its message can echo file content (a secret).
188
+ return { ok: false, reason: "malformed_json" };
189
+ }
190
+ return { ok: true, name, path: target, mode: "600" };
191
+ }
192
+ /** Snapshot the active auth file into a named profile (0600 file in the 0700 profile dir). Byte-copy
193
+ * via copyFileSync — contents never enter JS memory; result reports name/path/mode only. */
194
+ export function authSave(paths, name) {
195
+ if (!validateProfileName(name))
196
+ return { ok: false, reason: "invalid_profile" };
197
+ if (!isFile(paths.activeAuth))
198
+ return { ok: false, reason: "not_configured" };
199
+ const target = path.join(paths.profileDir, `${name}.json`);
200
+ // Refuse a symlinked profile-dir BEFORE mkdir/chmod so we never follow it out of CODEX_HOME or
201
+ // mutate the outside target's mode.
202
+ const pdStat = lstatSafe(paths.profileDir);
203
+ if (pdStat !== null && pdStat.isSymbolicLink())
204
+ return { ok: false, reason: "unsafe_path" };
205
+ try {
206
+ fs.mkdirSync(paths.profileDir, { recursive: true });
207
+ fs.chmodSync(paths.profileDir, 0o700);
208
+ }
209
+ catch {
210
+ return { ok: false, reason: "io_error" };
211
+ }
212
+ // Parent must REALLY resolve inside CODEX_HOME (defeats a symlinked auth-profiles parent), and the
213
+ // existing target must not be a symlink/hardlink/non-regular file (defeats writing secret bytes
214
+ // through an inode that lives outside CODEX_HOME).
215
+ if (!realDirContained(paths.profileDir, paths.codexHome))
216
+ return { ok: false, reason: "unsafe_path" };
217
+ if (!destReplaceable(target))
218
+ return { ok: false, reason: "unsafe_path" };
219
+ if (!copyOntoFresh(paths.activeAuth, target))
220
+ return { ok: false, reason: "io_error" };
221
+ return { ok: true, name, path: target, mode: "600" };
222
+ }
223
+ /** Activate a saved profile (copy it onto the active auth at 0600). Refuses to widen perms over an
224
+ * existing unsafe active file. Byte-copy; no content echoed. */
225
+ export function authSwitch(paths, name) {
226
+ if (!validateProfileName(name))
227
+ return { ok: false, reason: "invalid_profile" };
228
+ const source = path.join(paths.profileDir, `${name}.json`);
229
+ if (lstatSafe(source) === null)
230
+ return { ok: false, reason: "missing_profile" };
231
+ if (!isSafeProfileFile(source, paths.profileDir))
232
+ return { ok: false, reason: "unsafe_path" };
233
+ // Destination guard: a symlink/non-regular OR hardlinked (nlink>1) active auth would let the copy
234
+ // write the selected profile's SECRET bytes THROUGH an inode living outside CODEX_HOME. Refuse it
235
+ // (isFile() is false for a symlink, so the old isFile-gated check silently missed both cases).
236
+ if (!destReplaceable(paths.activeAuth))
237
+ return { ok: false, reason: "unsafe_path" };
238
+ if (isFile(paths.activeAuth)) {
239
+ const m = fileModeOctal(paths.activeAuth);
240
+ if (m !== null && m !== "600")
241
+ return { ok: false, reason: "unsafe_permissions" };
242
+ }
243
+ try {
244
+ fs.mkdirSync(paths.codexHome, { recursive: true });
245
+ }
246
+ catch {
247
+ return { ok: false, reason: "io_error" };
248
+ }
249
+ if (!realDirContained(paths.codexHome, paths.codexHome))
250
+ return { ok: false, reason: "unsafe_path" };
251
+ if (!copyOntoFresh(source, paths.activeAuth))
252
+ return { ok: false, reason: "io_error" };
253
+ return {
254
+ ok: true,
255
+ name,
256
+ activePath: paths.activeAuth,
257
+ mode: "600",
258
+ note: "live Codex sessions do not switch accounts in place; restart the affected seats to pick up the new profile.",
259
+ };
260
+ }
261
+ /** List saved profile names (safe regular *.json files in the profile dir), sorted. No contents read.
262
+ * Refuses to list through a symlinked / out-of-tree profile dir (returns []), so a redirected parent
263
+ * never exposes file names from outside CODEX_HOME. */
264
+ export function authList(paths) {
265
+ if (!realDirContained(paths.profileDir, paths.codexHome))
266
+ return [];
267
+ try {
268
+ return fs
269
+ .readdirSync(paths.profileDir)
270
+ .filter((n) => n.endsWith(".json") && isSafeProfileFile(path.join(paths.profileDir, n), paths.profileDir))
271
+ .map((n) => n.slice(0, -".json".length))
272
+ .sort();
273
+ }
274
+ catch {
275
+ return [];
276
+ }
277
+ }
278
+ // --- Auth-B: seat -> profile METADATA registry (product-native; NO resume_token per orch D2) ---
279
+ /** Stated in command output + docs: a seat label is metadata, never proof of a live account. */
280
+ export const SEAT_REGISTRY_DISCLAIMER = "Seat labels are metadata only; they do NOT prove a running session is actually using that account/profile.";
281
+ // 6 columns; NO resume_token (a print surface is the worst place to hold a secret-class token).
282
+ const SEAT_COLUMNS = ["seat", "rig", "runtime", "cwd", "auth_profile", "updated_ts"];
283
+ const SEAT_HEADER = SEAT_COLUMNS.join("\t");
284
+ const SEAT_TAB_COUNT = SEAT_COLUMNS.length - 1;
285
+ function isSafeRegistryFile(p) {
286
+ const st = lstatSafe(p);
287
+ return st !== null && !st.isSymbolicLink() && st.isFile();
288
+ }
289
+ /** Reject empty + any control character (covers tab/newline/CR, which would corrupt the TSV). */
290
+ function validRegistryField(v) {
291
+ return v.length > 0 && !hasControlChar(v);
292
+ }
293
+ function rawRegistryLines(registryPath) {
294
+ let text;
295
+ try {
296
+ text = fs.readFileSync(registryPath, "utf8");
297
+ }
298
+ catch {
299
+ return [];
300
+ }
301
+ const out = [];
302
+ let first = true;
303
+ for (const line of text.split("\n")) {
304
+ if (line === "" || line.startsWith("#"))
305
+ continue;
306
+ if (first) {
307
+ first = false; // skip header
308
+ continue;
309
+ }
310
+ out.push(line);
311
+ }
312
+ return out;
313
+ }
314
+ function rowMalformed(line) {
315
+ const tabs = (line.match(/\t/g) ?? []).length;
316
+ if (tabs !== SEAT_TAB_COUNT)
317
+ return true;
318
+ return line.split("\t")[0] === "";
319
+ }
320
+ function parseRow(line) {
321
+ // Callers pre-filter via rowMalformed (guaranteed 6 fields); ?? "" satisfies strict indexing.
322
+ const f = line.split("\t");
323
+ return {
324
+ seat: f[0] ?? "",
325
+ rig: f[1] ?? "",
326
+ runtime: f[2] ?? "",
327
+ cwd: f[3] ?? "",
328
+ authProfile: f[4] ?? "",
329
+ updatedTs: f[5] ?? "",
330
+ };
331
+ }
332
+ /** Atomic upsert of a seat metadata row (tmp + rename). Drops pre-existing malformed rows rather than
333
+ * re-emitting fabricated metadata. `now` is injectable for deterministic tests. */
334
+ export function authSeatSet(paths, fields, now = () => new Date().toISOString()) {
335
+ if (!validRegistryField(fields.seat))
336
+ return { ok: false, reason: "invalid_seat" };
337
+ if (!validRegistryField(fields.rig))
338
+ return { ok: false, reason: "invalid_rig" };
339
+ if (fields.runtime !== "codex")
340
+ return { ok: false, reason: "invalid_runtime" }; // v0 whitelist
341
+ const cwd = fields.cwd && fields.cwd.length > 0 ? fields.cwd : "unknown";
342
+ if (!validRegistryField(cwd))
343
+ return { ok: false, reason: "invalid_cwd" };
344
+ const profile = fields.authProfile && fields.authProfile.length > 0 ? fields.authProfile : "unknown";
345
+ if (profile !== "unknown" && !validateProfileName(profile))
346
+ return { ok: false, reason: "invalid_profile" };
347
+ if (lstatSafe(paths.registryPath) !== null && !isSafeRegistryFile(paths.registryPath)) {
348
+ return { ok: false, reason: "unsafe_path" };
349
+ }
350
+ const kept = rawRegistryLines(paths.registryPath)
351
+ .filter((l) => !rowMalformed(l))
352
+ .filter((l) => l.split("\t")[0] !== fields.seat);
353
+ const newRow = [fields.seat, fields.rig, "codex", cwd, profile, now()].join("\t");
354
+ const body = [SEAT_HEADER, ...kept, newRow].join("\n") + "\n";
355
+ const tmp = `${paths.registryPath}.${process.pid}.tmp`;
356
+ try {
357
+ fs.mkdirSync(path.dirname(paths.registryPath), { recursive: true });
358
+ fs.writeFileSync(tmp, body, { mode: 0o600 });
359
+ fs.chmodSync(tmp, 0o600);
360
+ fs.renameSync(tmp, paths.registryPath);
361
+ fs.chmodSync(paths.registryPath, 0o600);
362
+ }
363
+ catch {
364
+ try {
365
+ fs.rmSync(tmp, { force: true });
366
+ }
367
+ catch {
368
+ /* ignore */
369
+ }
370
+ return { ok: false, reason: "io_error" };
371
+ }
372
+ return { ok: true, seat: fields.seat, registryPath: paths.registryPath, mode: "600", disclaimer: SEAT_REGISTRY_DISCLAIMER };
373
+ }
374
+ /** List well-formed seat rows (malformed rows skipped). */
375
+ export function authSeatsList(paths) {
376
+ return rawRegistryLines(paths.registryPath)
377
+ .filter((l) => !rowMalformed(l))
378
+ .map(parseRow);
379
+ }
380
+ export function authSeatShow(paths, seat) {
381
+ if (!validRegistryField(seat))
382
+ return { ok: false, reason: "invalid_seat" };
383
+ if (lstatSafe(paths.registryPath) !== null && !isSafeRegistryFile(paths.registryPath)) {
384
+ return { ok: false, reason: "unsafe_path" };
385
+ }
386
+ const row = authSeatsList(paths).find((r) => r.seat === seat);
387
+ return row ? { ok: true, row } : { ok: false, reason: "missing_seat" };
388
+ }
389
+ export function authSeatsReport(paths) {
390
+ const present = isFile(paths.registryPath);
391
+ const mode = present ? fileModeOctal(paths.registryPath) : null;
392
+ let total = 0;
393
+ let known = 0;
394
+ let unknown = 0;
395
+ let malformed = 0;
396
+ for (const line of rawRegistryLines(paths.registryPath)) {
397
+ if (rowMalformed(line)) {
398
+ malformed += 1;
399
+ continue;
400
+ }
401
+ total += 1;
402
+ const profile = line.split("\t")[4];
403
+ if (!profile || profile === "unknown")
404
+ unknown += 1;
405
+ else
406
+ known += 1;
407
+ }
408
+ return {
409
+ registryPresent: present,
410
+ registryMode: mode,
411
+ registryModeSafe: mode === null ? "unknown" : mode === "600",
412
+ total,
413
+ known,
414
+ unknown,
415
+ malformed,
416
+ };
417
+ }
418
+ //# sourceMappingURL=codex-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-auth.js","sourceRoot":"","sources":["../../src/lib/codex-auth.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  export type RailStatus = "present" | "missing" | "malformed" | "readme-only";
2
- export type FindingSeverity = "high" | "low" | "info";
3
- export type FindingKind = "missing_progress" | "registration_ghost" | "missing_id" | "id_convention_violation" | "orphan_progress";
2
+ export type FindingSeverity = "high" | "medium" | "low" | "info";
3
+ export type FindingKind = "missing_progress" | "registration_ghost" | "missing_id" | "id_convention_violation" | "orphan_progress" | "missing_mission_brief" | "malformed_mission_brief" | "missing_mission_notes" | "missing_proof";
4
4
  export interface AuditFinding {
5
5
  kind: FindingKind;
6
6
  severity: FindingSeverity;
@@ -16,6 +16,18 @@ export interface ScopeAuditInput {
16
16
  readmeOnlyMarker: boolean;
17
17
  isActiveRelease: boolean;
18
18
  level: "mission" | "slice";
19
+ missionBriefExists?: boolean;
20
+ missionBriefPath?: string;
21
+ missionBriefContent?: string | null;
22
+ missionNotesExists?: boolean;
23
+ missionNotesPath?: string;
24
+ proofFileExists?: boolean;
25
+ proofFilePath?: string;
26
+ proofDirExists?: boolean;
27
+ proofDirPath?: string;
28
+ proofDirHasEntries?: boolean;
29
+ hasProofPacket?: boolean;
30
+ sliceStatus?: string | null;
19
31
  }
20
32
  export interface ScopeAuditResult {
21
33
  railStatus: RailStatus;
@@ -1 +1 @@
1
- {"version":3,"file":"scope-audit.d.ts","sourceRoot":"","sources":["../../../src/lib/scope/scope-audit.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,aAAa,CAAC;AAC7E,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AACtD,MAAM,MAAM,WAAW,GACnB,kBAAkB,GAClB,oBAAoB,GACpB,YAAY,GACZ,yBAAyB,GACzB,iBAAiB,CAAC;AAEtB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CA2F1E"}
1
+ {"version":3,"file":"scope-audit.d.ts","sourceRoot":"","sources":["../../../src/lib/scope/scope-audit.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,aAAa,CAAC;AAC7E,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AACjE,MAAM,MAAM,WAAW,GACnB,kBAAkB,GAClB,oBAAoB,GACpB,YAAY,GACZ,yBAAyB,GACzB,iBAAiB,GACjB,uBAAuB,GACvB,yBAAyB,GACzB,uBAAuB,GACvB,eAAe,CAAC;AAEpB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AA+CD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAkJ1E"}
@@ -1,5 +1,49 @@
1
1
  import * as YAML from "yaml";
2
2
  import { isMissionDotId, isSliceDotId } from "./dot-id.js";
3
+ const MISSION_BRIEF_HEADERS = ["What & why", "Building", "Progress", "Proven", "Needs you", "Pointers"];
4
+ function childPath(parent, child) {
5
+ return parent.endsWith("/") ? `${parent}${child}` : `${parent}/${child}`;
6
+ }
7
+ function missionBriefFix() {
8
+ return "Create/populate MISSION_BRIEF.md using the slice-16 schema: # <Mission name> — Brief, then ## What & why, ## Building, ## Progress, ## Proven, ## Needs you, ## Pointers.";
9
+ }
10
+ function missionBriefConforms(content) {
11
+ const lines = content.split(/\r?\n/);
12
+ const title = lines.find((line) => /^#\s+/.test(line) && !/^##\s+/.test(line))?.trim() ?? "";
13
+ if (!/^#\s+.+\s+—\s+Brief\s*$/.test(title))
14
+ return false;
15
+ const h2s = lines
16
+ .map((line) => /^##\s+(.+?)\s*$/.exec(line)?.[1]?.trim() ?? null)
17
+ .filter((header) => header !== null);
18
+ if (h2s.length < MISSION_BRIEF_HEADERS.length)
19
+ return false;
20
+ return MISSION_BRIEF_HEADERS.every((header, idx) => h2s[idx] === header);
21
+ }
22
+ function parseStatusFromFrontmatter(raw) {
23
+ if (raw === null)
24
+ return null;
25
+ try {
26
+ const parsed = YAML.parse(raw);
27
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
28
+ const status = parsed.status;
29
+ return typeof status === "string" ? status : null;
30
+ }
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ return null;
36
+ }
37
+ function statusRequiresProof(status) {
38
+ if (!status)
39
+ return false;
40
+ const normalized = status.toLowerCase().trim();
41
+ return normalized.includes("done")
42
+ || normalized.includes("ship")
43
+ || normalized.includes("close")
44
+ || normalized.includes("proven")
45
+ || normalized.includes("promoted");
46
+ }
3
47
  export function classifyScopeItem(input) {
4
48
  const findings = [];
5
49
  let frontmatterError = null;
@@ -91,6 +135,57 @@ export function classifyScopeItem(input) {
91
135
  }
92
136
  }
93
137
  }
138
+ if (input.level === "mission") {
139
+ const briefPath = input.missionBriefPath ?? childPath(input.path, "MISSION_BRIEF.md");
140
+ if (input.missionBriefExists === false) {
141
+ findings.push({
142
+ kind: "missing_mission_brief",
143
+ severity: "medium",
144
+ path: briefPath,
145
+ message: "Mission has no root MISSION_BRIEF.md, so the Steering tab human-facing brief degrades.",
146
+ remediation: missionBriefFix(),
147
+ });
148
+ }
149
+ else if (input.missionBriefExists === true
150
+ && typeof input.missionBriefContent === "string"
151
+ && !missionBriefConforms(input.missionBriefContent)) {
152
+ findings.push({
153
+ kind: "malformed_mission_brief",
154
+ severity: "medium",
155
+ path: briefPath,
156
+ message: "MISSION_BRIEF.md does not match the canonical MISSION_BRIEF.md section order.",
157
+ remediation: missionBriefFix(),
158
+ });
159
+ }
160
+ if (input.missionNotesExists === false) {
161
+ const notesPath = input.missionNotesPath ?? childPath(input.path, "MISSION_NOTES.md");
162
+ findings.push({
163
+ kind: "missing_mission_notes",
164
+ severity: "low",
165
+ path: notesPath,
166
+ message: "Mission has no MISSION_NOTES.md continuity file.",
167
+ remediation: "Add MISSION_NOTES.md at the mission root and populate it per the mission-notes convention.",
168
+ });
169
+ }
170
+ }
171
+ if (input.level === "slice") {
172
+ const status = input.sliceStatus ?? parseStatusFromFrontmatter(input.readmeFrontmatterRaw);
173
+ const hasProofPacket = input.hasProofPacket === true;
174
+ const hasRootProof = input.proofFileExists === true
175
+ && input.proofDirExists === true
176
+ && input.proofDirHasEntries === true;
177
+ const isProven = statusRequiresProof(status) || hasProofPacket;
178
+ if (isProven && !hasRootProof) {
179
+ const proofPath = input.proofFilePath ?? childPath(input.path, "PROOF.md");
180
+ findings.push({
181
+ kind: "missing_proof",
182
+ severity: "medium",
183
+ path: proofPath,
184
+ message: "Slice is done/proven but does not have complete root PROOF.md plus populated proof/ artifacts.",
185
+ remediation: "Add PROOF.md at the slice root and put verification artifacts under proof/ per the slice-closeout SOP.",
186
+ });
187
+ }
188
+ }
94
189
  return { railStatus, findings, frontmatterError };
95
190
  }
96
191
  //# sourceMappingURL=scope-audit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scope-audit.js","sourceRoot":"","sources":["../../../src/lib/scope/scope-audit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scope-audit.js","sourceRoot":"","sources":["../../../src/lib/scope/scope-audit.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,9 @@ export interface RenderOpts {
7
7
  title: string;
8
8
  created_date: string;
9
9
  release_version?: string;
10
+ intent_visual_image_path?: string;
11
+ intent_visual_diff_path?: string;
12
+ intent_visual_build_command?: string;
10
13
  }
11
14
  export declare function renderSliceTemplate(kind: SliceTemplateKind, opts: RenderOpts): string;
12
15
  export declare function renderMissionTemplate(kind: MissionTemplateKind, opts: RenderOpts): string;
@@ -34,7 +37,13 @@ export declare function renderMissionNotesTemplate(opts: MissionNotesRenderOpts,
34
37
  absPath: string;
35
38
  };
36
39
  export declare function renderMissionProgressTemplate(missionName: string): string;
40
+ export declare function renderMissionBriefTemplate(missionName: string): string;
37
41
  export declare function renderSliceProgressTemplate(sliceName: string): string;
42
+ export interface SliceProofRenderOpts {
43
+ id: string;
44
+ title: string;
45
+ }
46
+ export declare function renderSliceProofTemplate(opts: SliceProofRenderOpts): string;
38
47
  /** Convert a folder-slug to a title-cased display name. */
39
48
  export declare function titleFromSlug(slug: string): string;
40
49
  //# sourceMappingURL=templates.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../src/lib/scope/templates.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA+BzE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAaD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAIrF;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAIzF;AAUD,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AASD;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAczE;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,sBAAsB,EAC5B,QAAQ,CAAC,EAAE,MAAM,GAChB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,KAAK,GAAG,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAUzE;AAED,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGzE;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGrE;AAED,2DAA2D;AAC3D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMlD"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../src/lib/scope/templates.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA+BzE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC;AAgBD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAIrF;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAIzF;AAUD,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AASD;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAczE;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,sBAAsB,EAC5B,QAAQ,CAAC,EAAE,MAAM,GAChB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,KAAK,GAAG,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAUzE;AAED,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGzE;AAED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGtE;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGrE;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAK3E;AAED,2DAA2D;AAC3D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMlD"}