@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.
- package/daemon/assets/plugins/openrig-core/hooks/claude.json +11 -0
- package/daemon/assets/plugins/openrig-core/hooks/codex.json +14 -3
- package/daemon/assets/plugins/openrig-core/hooks/scripts/compaction-restore-bridge.cjs +28 -24
- package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/scripts/precompact-hook.mjs +72 -11
- package/daemon/assets/plugins/openrig-core/skills/queue-handoff/SKILL.md +62 -29
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts +32 -0
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +154 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/db/migrations/044_queue_item_summary.d.ts +21 -0
- package/daemon/dist/db/migrations/044_queue_item_summary.d.ts.map +1 -0
- package/daemon/dist/db/migrations/044_queue_item_summary.js +25 -0
- package/daemon/dist/db/migrations/044_queue_item_summary.js.map +1 -0
- package/daemon/dist/domain/agent-activity-store.js +11 -0
- package/daemon/dist/domain/agent-activity-store.js.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.js +69 -1
- package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
- package/daemon/dist/domain/daemon-version.d.ts +15 -0
- package/daemon/dist/domain/daemon-version.d.ts.map +1 -0
- package/daemon/dist/domain/daemon-version.js +28 -0
- package/daemon/dist/domain/daemon-version.js.map +1 -0
- package/daemon/dist/domain/node-cmux-service.d.ts +1 -0
- package/daemon/dist/domain/node-cmux-service.d.ts.map +1 -1
- package/daemon/dist/domain/node-cmux-service.js +29 -2
- package/daemon/dist/domain/node-cmux-service.js.map +1 -1
- package/daemon/dist/domain/queue-repository.d.ts +18 -0
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +18 -0
- package/daemon/dist/domain/queue-repository.js.map +1 -1
- package/daemon/dist/domain/scope/scope-audit.d.ts +14 -2
- package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-audit.js +95 -0
- package/daemon/dist/domain/scope/scope-audit.js.map +1 -1
- package/daemon/dist/domain/scope/types.d.ts +6 -0
- package/daemon/dist/domain/scope/types.d.ts.map +1 -1
- package/daemon/dist/domain/scope/types.js +8 -0
- package/daemon/dist/domain/scope/types.js.map +1 -1
- package/daemon/dist/domain/session-transport.d.ts +10 -0
- package/daemon/dist/domain/session-transport.d.ts.map +1 -1
- package/daemon/dist/domain/session-transport.js +153 -19
- package/daemon/dist/domain/session-transport.js.map +1 -1
- package/daemon/dist/domain/slices/slice-detail-projector.d.ts.map +1 -1
- package/daemon/dist/domain/slices/slice-detail-projector.js +10 -3
- package/daemon/dist/domain/slices/slice-detail-projector.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +10 -0
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts +1 -0
- package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js +25 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
- package/daemon/dist/routes/bundles.d.ts.map +1 -1
- package/daemon/dist/routes/bundles.js +1 -18
- package/daemon/dist/routes/bundles.js.map +1 -1
- package/daemon/dist/routes/health-summary.d.ts.map +1 -1
- package/daemon/dist/routes/health-summary.js +13 -2
- package/daemon/dist/routes/health-summary.js.map +1 -1
- package/daemon/dist/routes/queue.d.ts.map +1 -1
- package/daemon/dist/routes/queue.js +3 -0
- package/daemon/dist/routes/queue.js.map +1 -1
- package/daemon/dist/routes/scope-audit.d.ts.map +1 -1
- package/daemon/dist/routes/scope-audit.js +28 -1
- package/daemon/dist/routes/scope-audit.js.map +1 -1
- package/daemon/dist/routes/transport.d.ts.map +1 -1
- package/daemon/dist/routes/transport.js +22 -0
- package/daemon/dist/routes/transport.js.map +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +15 -3
- package/daemon/dist/startup.js.map +1 -1
- package/dist/commands/auth.d.ts +11 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +145 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/config-init-workspace.d.ts.map +1 -1
- package/dist/commands/config-init-workspace.js +7 -4
- package/dist/commands/config-init-workspace.js.map +1 -1
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +23 -0
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/scope.d.ts.map +1 -1
- package/dist/commands/scope.js +64 -6
- package/dist/commands/scope.js.map +1 -1
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +40 -7
- package/dist/commands/send.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts +1 -0
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +35 -3
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/codex-auth.d.ts +124 -0
- package/dist/lib/codex-auth.d.ts.map +1 -0
- package/dist/lib/codex-auth.js +418 -0
- package/dist/lib/codex-auth.js.map +1 -0
- package/dist/lib/scope/scope-audit.d.ts +14 -2
- package/dist/lib/scope/scope-audit.d.ts.map +1 -1
- package/dist/lib/scope/scope-audit.js +95 -0
- package/dist/lib/scope/scope-audit.js.map +1 -1
- package/dist/lib/scope/templates.d.ts +9 -0
- package/dist/lib/scope/templates.d.ts.map +1 -1
- package/dist/lib/scope/templates.js +14 -1
- package/dist/lib/scope/templates.js.map +1 -1
- package/dist/lib/scope-templates/mission-brief.md +20 -0
- package/dist/lib/scope-templates/placeholder.md +8 -0
- package/dist/lib/scope-templates/proof.md +17 -0
- package/package.json +2 -1
- package/ui/dist/assets/index-CnqRX7A3.css +32 -0
- package/ui/dist/assets/index-CtL9jXFt.js +582 -0
- package/ui/dist/index.html +2 -2
- package/ui/dist/assets/index-DMI6jeAX.css +0 -32
- 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;
|
|
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":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"scope-audit.js","sourceRoot":"","sources":["../../../src/lib/scope/scope-audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmD3D,MAAM,qBAAqB,GAAG,CAAC,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;AAExG,SAAS,SAAS,CAAC,MAAc,EAAE,KAAa;IAC9C,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,2KAA2K,CAAC;AACrL,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAe;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC7F,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACzD,MAAM,GAAG,GAAG,KAAK;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;SAChE,MAAM,CAAC,CAAC,MAAM,EAAoB,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;IACzD,IAAI,GAAG,CAAC,MAAM,GAAG,qBAAqB,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC5D,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,0BAA0B,CAAC,GAAkB;IACpD,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnE,MAAM,MAAM,GAAI,MAAkC,CAAC,MAAM,CAAC;YAC1D,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACpD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAiC;IAC5D,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAC/C,OAAO,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;WAC7B,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;WAC3B,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC;WAC5B,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;WAC7B,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAsB;IACtD,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAC3C,IAAI,UAAsB,CAAC;IAE3B,cAAc;IACd,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC3B,UAAU,GAAG,aAAa,CAAC;IAC7B,CAAC;SAAM,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;QACpC,UAAU,GAAG,SAAS,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,SAAS,CAAC;QACvB,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;YAChD,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,GAAG,KAAK,CAAC,KAAK,+CAA+C;YACtE,WAAW,EAAE,kBAAkB,KAAK,CAAC,KAAK,yFAAyF;SACpI,CAAC,CAAC;IACL,CAAC;IAED,iEAAiE;IACjE,IAAI,KAAK,CAAC,oBAAoB,KAAK,IAAI,EAAE,CAAC;QACxC,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;YAChD,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,oDAAoD;YAC7D,WAAW,EAAE,sDAAsD;SACpE,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,IAAI,MAAM,GAAY,IAAI,CAAC;QAC3B,IAAI,UAAU,GAAkB,IAAI,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAE9D,IAAI,UAAU,EAAE,CAAC;YACf,gBAAgB,GAAG,UAAU,CAAC;YAC9B,UAAU,GAAG,WAAW,CAAC;YACzB,IAAI,SAAS,EAAE,CAAC;gBACd,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,oBAAoB;oBAC1B,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;oBAChD,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO,EAAE,+EAA+E,UAAU,EAAE;oBACpG,WAAW,EAAE,6DAA6D;iBAC3E,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,oBAAoB;oBAC1B,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;oBAChD,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO,EAAE,sCAAsC,UAAU,EAAE;oBAC3D,WAAW,EAAE,uCAAuC;iBACrD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,GAAG,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBACvE,CAAC,CAAC,MAAiC;gBACnC,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAEpD,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,YAAY;oBAClB,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;oBAChD,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO,EAAE,oCAAoC;oBAC7C,WAAW,EAAE,iFAAiF;iBAC/F,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC;gBAC5E,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;oBACnB,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,yBAAyB;wBAC/B,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;wBACjD,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,OAAO,EAAE,OAAO,EAAE,wBAAwB,KAAK,CAAC,KAAK,oBAAoB;wBACzE,WAAW,EAAE,eAAe,KAAK,CAAC,KAAK,gBAAgB;qBACxD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,gBAAgB,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;QACtF,IAAI,KAAK,CAAC,kBAAkB,KAAK,KAAK,EAAE,CAAC;YACvC,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,uBAAuB;gBAC7B,QAAQ,EAAE,QAAQ;gBAClB,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,wFAAwF;gBACjG,WAAW,EAAE,eAAe,EAAE;aAC/B,CAAC,CAAC;QACL,CAAC;aAAM,IACL,KAAK,CAAC,kBAAkB,KAAK,IAAI;eAC9B,OAAO,KAAK,CAAC,mBAAmB,KAAK,QAAQ;eAC7C,CAAC,oBAAoB,CAAC,KAAK,CAAC,mBAAmB,CAAC,EACnD,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,yBAAyB;gBAC/B,QAAQ,EAAE,QAAQ;gBAClB,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,+EAA+E;gBACxF,WAAW,EAAE,eAAe,EAAE;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,IAAI,KAAK,CAAC,kBAAkB,KAAK,KAAK,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,KAAK,CAAC,gBAAgB,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;YACtF,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,uBAAuB;gBAC7B,QAAQ,EAAE,KAAK;gBACf,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,kDAAkD;gBAC3D,WAAW,EAAE,4FAA4F;aAC1G,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,IAAI,0BAA0B,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC3F,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,KAAK,IAAI,CAAC;QACrD,MAAM,YAAY,GAAG,KAAK,CAAC,eAAe,KAAK,IAAI;eAC9C,KAAK,CAAC,cAAc,KAAK,IAAI;eAC7B,KAAK,CAAC,kBAAkB,KAAK,IAAI,CAAC;QACvC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC;QAC/D,IAAI,QAAQ,IAAI,CAAC,YAAY,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC3E,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,eAAe;gBACrB,QAAQ,EAAE,QAAQ;gBAClB,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,gGAAgG;gBACzG,WAAW,EAAE,wGAAwG;aACtH,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;AACpD,CAAC"}
|
|
@@ -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;
|
|
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"}
|