@wildorder/nightshift 0.13.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -19
- package/dist/agent-probe.d.ts +21 -2
- package/dist/agent-probe.d.ts.map +1 -1
- package/dist/agent-probe.js +76 -22
- package/dist/agent-probe.js.map +1 -1
- package/dist/agent-runner.d.ts +90 -2
- package/dist/agent-runner.d.ts.map +1 -1
- package/dist/agent-runner.js +382 -24
- package/dist/agent-runner.js.map +1 -1
- package/dist/agent-summary.d.ts +15 -0
- package/dist/agent-summary.d.ts.map +1 -1
- package/dist/agent-summary.js +32 -2
- package/dist/agent-summary.js.map +1 -1
- package/dist/as-built.d.ts +6 -0
- package/dist/as-built.d.ts.map +1 -1
- package/dist/as-built.js +7 -0
- package/dist/as-built.js.map +1 -1
- package/dist/author.d.ts +9 -0
- package/dist/author.d.ts.map +1 -1
- package/dist/author.js +118 -24
- package/dist/author.js.map +1 -1
- package/dist/ci-init.d.ts.map +1 -1
- package/dist/ci-init.js +17 -12
- package/dist/ci-init.js.map +1 -1
- package/dist/cli.js +71 -8
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -0
- package/dist/config.js.map +1 -1
- package/dist/crash-report.d.ts +58 -0
- package/dist/crash-report.d.ts.map +1 -0
- package/dist/crash-report.js +115 -0
- package/dist/crash-report.js.map +1 -0
- package/dist/decide.js +1 -1
- package/dist/decide.js.map +1 -1
- package/dist/decider-review.d.ts +33 -5
- package/dist/decider-review.d.ts.map +1 -1
- package/dist/decider-review.js +55 -9
- package/dist/decider-review.js.map +1 -1
- package/dist/decision-ledger.d.ts +44 -1
- package/dist/decision-ledger.d.ts.map +1 -1
- package/dist/decision-ledger.js +46 -1
- package/dist/decision-ledger.js.map +1 -1
- package/dist/decision-view.d.ts +10 -1
- package/dist/decision-view.d.ts.map +1 -1
- package/dist/decision-view.js +41 -0
- package/dist/decision-view.js.map +1 -1
- package/dist/manifest.d.ts +21 -1
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +221 -11
- package/dist/manifest.js.map +1 -1
- package/dist/permits.d.ts +135 -0
- package/dist/permits.d.ts.map +1 -0
- package/dist/permits.js +397 -0
- package/dist/permits.js.map +1 -0
- package/dist/publish.d.ts +35 -0
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +149 -16
- package/dist/publish.js.map +1 -1
- package/dist/run-program.d.ts +53 -2
- package/dist/run-program.d.ts.map +1 -1
- package/dist/run-program.js +529 -54
- package/dist/run-program.js.map +1 -1
- package/dist/whole-program-review.d.ts +4 -0
- package/dist/whole-program-review.d.ts.map +1 -1
- package/dist/whole-program-review.js +9 -1
- package/dist/whole-program-review.js.map +1 -1
- package/package.json +2 -2
- package/dist/verify-allowlist.d.ts +0 -23
- package/dist/verify-allowlist.d.ts.map +0 -1
- package/dist/verify-allowlist.js +0 -46
- package/dist/verify-allowlist.js.map +0 -1
package/dist/permits.js
ADDED
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { rmSync } from "node:fs";
|
|
3
|
+
import { rm as nodeRm, writeFile as nodeWriteFile } from "node:fs/promises";
|
|
4
|
+
import { platform as osPlatform, tmpdir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import crossSpawn from "cross-spawn";
|
|
7
|
+
/**
|
|
8
|
+
* Fixed per-role postures — mirrors the write/exec split `agent-probe.ts`
|
|
9
|
+
* already encoded as WRITE_ROLES/EXEC_ROLES. Exported so the probe sources
|
|
10
|
+
* its write/read split from here rather than keeping a second copy that can
|
|
11
|
+
* drift.
|
|
12
|
+
*/
|
|
13
|
+
export const ROLE_POSTURE = {
|
|
14
|
+
agent: "workspace",
|
|
15
|
+
recoveryAgent: "workspace",
|
|
16
|
+
authorAgent: "workspace",
|
|
17
|
+
deciderAgent: "read-only",
|
|
18
|
+
reviewerAgent: "read-only",
|
|
19
|
+
};
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Explicit flags win (SC-05)
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
const CLAUDE_PERMISSION_FLAGS = [
|
|
24
|
+
"--permission-mode",
|
|
25
|
+
"--allowedTools",
|
|
26
|
+
"--allowed-tools",
|
|
27
|
+
"--disallowedTools",
|
|
28
|
+
"--dangerously-skip-permissions",
|
|
29
|
+
"--settings",
|
|
30
|
+
];
|
|
31
|
+
const CODEX_SANDBOX_FLAG = "--sandbox";
|
|
32
|
+
function permissionFlagsFor(command) {
|
|
33
|
+
if (command === "claude")
|
|
34
|
+
return CLAUDE_PERMISSION_FLAGS;
|
|
35
|
+
if (command === "codex")
|
|
36
|
+
return [CODEX_SANDBOX_FLAG];
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Command transcript observability (WS-02)
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
const OUTPUT_FORMAT_FLAG = "--output-format";
|
|
43
|
+
/** True when the agent's own args already pin an output format — an operator
|
|
44
|
+
* who chose one (stream-json or otherwise) keeps it untouched. */
|
|
45
|
+
function hasOutputFormatFlag(agent) {
|
|
46
|
+
return agent.args.some((arg) => {
|
|
47
|
+
const token = arg.includes("=") ? arg.slice(0, arg.indexOf("=")) : arg;
|
|
48
|
+
return token === OUTPUT_FORMAT_FLAG;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The two flags that turn a Claude spawn's stdout into the NDJSON stream
|
|
53
|
+
* `src/agent-runner.ts`'s demultiplexer reads (WS-02). `--verbose` is
|
|
54
|
+
* required alongside `--output-format stream-json`: in print mode the CLI
|
|
55
|
+
* emits only the final result event unless `--verbose` is set, and the
|
|
56
|
+
* demultiplexer needs the intermediate `tool_use` events. Empty when the
|
|
57
|
+
* agent already pins its own output format — this derivation only adds
|
|
58
|
+
* flags, it never overrides one an operator wrote.
|
|
59
|
+
*/
|
|
60
|
+
function observabilityFlags(agent) {
|
|
61
|
+
return hasOutputFormatFlag(agent) ? [] : [OUTPUT_FORMAT_FLAG, "stream-json", "--verbose"];
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* True when the agent's own args already carry a permission-bearing flag —
|
|
65
|
+
* `--flag value` and `--flag=value` both match. An agent that trips this is
|
|
66
|
+
* spawned untouched and labeled operator-configured; rewriting an operator's
|
|
67
|
+
* authored flags is the override the charter forbids.
|
|
68
|
+
*/
|
|
69
|
+
export function hasExplicitPermissionFlag(agent) {
|
|
70
|
+
const flags = permissionFlagsFor(agent.command);
|
|
71
|
+
if (flags.length === 0)
|
|
72
|
+
return false;
|
|
73
|
+
return agent.args.some((arg) => {
|
|
74
|
+
const token = arg.includes("=") ? arg.slice(0, arg.indexOf("=")) : arg;
|
|
75
|
+
return flags.includes(token);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// permits config -> settings file content
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
/** One `--allowedTools`/settings allow entry per configured verify command. Relocated from verify-allowlist.ts. */
|
|
82
|
+
export function claudeVerifyAllowedTools(verify) {
|
|
83
|
+
return Object.values(verify).map((command) => `Bash(${command}:*)`);
|
|
84
|
+
}
|
|
85
|
+
function baseAllowDeny(verify, permits) {
|
|
86
|
+
return {
|
|
87
|
+
allow: [...claudeVerifyAllowedTools(verify), ...(permits?.allow ?? [])],
|
|
88
|
+
deny: [...(permits?.deny ?? [])],
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/** The workspace settings file: verify rules + permits.allow/deny, plus a sandbox block on darwin/linux. */
|
|
92
|
+
export function workspaceSettingsContent(verify, permits, platform) {
|
|
93
|
+
const { allow, deny } = baseAllowDeny(verify, permits);
|
|
94
|
+
const settings = { permissions: { allow, deny } };
|
|
95
|
+
if (platform === "darwin" || platform === "linux") {
|
|
96
|
+
settings.sandbox = { enabled: true, autoAllowBashIfSandboxed: true };
|
|
97
|
+
}
|
|
98
|
+
return JSON.stringify(settings, null, 2);
|
|
99
|
+
}
|
|
100
|
+
/** The read-only settings file: same allow/deny lists, never a sandbox block. */
|
|
101
|
+
export function readOnlySettingsContent(verify, permits) {
|
|
102
|
+
const { allow, deny } = baseAllowDeny(verify, permits);
|
|
103
|
+
return JSON.stringify({ permissions: { allow, deny } }, null, 2);
|
|
104
|
+
}
|
|
105
|
+
const UNDETECTED_CAPABILITIES = {
|
|
106
|
+
detected: false,
|
|
107
|
+
autoMode: false,
|
|
108
|
+
dontAskMode: false,
|
|
109
|
+
permissionPrompts: false,
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* Turns a finished `--help` spawn into its text or a rejection. Exported so
|
|
113
|
+
* the nonzero-exit-code case (a `claude` on PATH that fails, rather than a
|
|
114
|
+
* missing command) is unit-testable without an actual child process: a
|
|
115
|
+
* nonzero exit must be reported as a detection failure, never parsed as if
|
|
116
|
+
* it were successful help output.
|
|
117
|
+
*/
|
|
118
|
+
export function helpRunnerOutcome(code, output) {
|
|
119
|
+
if (code === 0)
|
|
120
|
+
return output;
|
|
121
|
+
throw new Error(`claude --help exited with code ${code ?? "null"}: ${output.slice(0, 500)}`);
|
|
122
|
+
}
|
|
123
|
+
export const defaultClaudeHelpRunner = (command) => new Promise((resolvePromise, rejectPromise) => {
|
|
124
|
+
let output = "";
|
|
125
|
+
const child = crossSpawn(command, ["--help"], {
|
|
126
|
+
windowsHide: true,
|
|
127
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
128
|
+
});
|
|
129
|
+
child.stdout?.setEncoding("utf8");
|
|
130
|
+
child.stderr?.setEncoding("utf8");
|
|
131
|
+
child.stdout?.on("data", (chunk) => (output += chunk));
|
|
132
|
+
child.stderr?.on("data", (chunk) => (output += chunk));
|
|
133
|
+
child.on("error", rejectPromise);
|
|
134
|
+
child.on("close", (code) => {
|
|
135
|
+
try {
|
|
136
|
+
resolvePromise(helpRunnerOutcome(code, output));
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
rejectPromise(error);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
/** The `--permission-mode` option's own text, up to the next `--flag` line. */
|
|
144
|
+
function optionBlock(helpText, flag) {
|
|
145
|
+
const idx = helpText.indexOf(flag);
|
|
146
|
+
if (idx === -1)
|
|
147
|
+
return "";
|
|
148
|
+
const rest = helpText.slice(idx + flag.length);
|
|
149
|
+
const stop = rest.match(/\n[^\S\r\n]*--/u);
|
|
150
|
+
return stop?.index === undefined ? rest : rest.slice(0, stop.index);
|
|
151
|
+
}
|
|
152
|
+
/** Parses `claude --help` text into capabilities. Exported for fixture-driven tests. */
|
|
153
|
+
export function parseClaudeHelp(helpText) {
|
|
154
|
+
const modeBlock = optionBlock(helpText, "--permission-mode");
|
|
155
|
+
return {
|
|
156
|
+
detected: true,
|
|
157
|
+
autoMode: /"auto"/u.test(modeBlock),
|
|
158
|
+
dontAskMode: /"dontAsk"/u.test(modeBlock),
|
|
159
|
+
permissionPrompts: /--permission-prompts\b/u.test(helpText),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Detects once per process per resolved command string, caching the promise
|
|
164
|
+
* so concurrent derivations for the same command share one spawn. Detection
|
|
165
|
+
* failure (not on PATH, a throwing help runner) is reported as
|
|
166
|
+
* `detected: false`, never thrown — the derivation then takes the fallback.
|
|
167
|
+
*/
|
|
168
|
+
const capabilityCache = new Map();
|
|
169
|
+
export function detectClaudeCapabilities(command, helpRunner = defaultClaudeHelpRunner) {
|
|
170
|
+
let cached = capabilityCache.get(command);
|
|
171
|
+
if (!cached) {
|
|
172
|
+
cached = helpRunner(command).then(parseClaudeHelp).catch(() => UNDETECTED_CAPABILITIES);
|
|
173
|
+
capabilityCache.set(command, cached);
|
|
174
|
+
}
|
|
175
|
+
return cached;
|
|
176
|
+
}
|
|
177
|
+
/** Test-only: clears the process-wide capability cache between fixture scenarios. */
|
|
178
|
+
export function resetClaudeCapabilityCacheForTests() {
|
|
179
|
+
capabilityCache.clear();
|
|
180
|
+
}
|
|
181
|
+
function deriveClaude(input) {
|
|
182
|
+
const { agent, role, containmentEnv, platform, claudeCapabilities, workspaceSettingsPath, readOnlySettingsPath } = input;
|
|
183
|
+
const posture = ROLE_POSTURE[role];
|
|
184
|
+
const caps = claudeCapabilities ?? UNDETECTED_CAPABILITIES;
|
|
185
|
+
const observability = observabilityFlags(agent);
|
|
186
|
+
if (posture === "read-only") {
|
|
187
|
+
if (caps.dontAskMode) {
|
|
188
|
+
const args = [...agent.args, "--permission-mode", "dontAsk", "--settings", readOnlySettingsPath];
|
|
189
|
+
if (caps.permissionPrompts)
|
|
190
|
+
args.push("--permission-prompts", "none");
|
|
191
|
+
args.push(...observability);
|
|
192
|
+
return {
|
|
193
|
+
agent: { ...agent, args },
|
|
194
|
+
label: "read-only",
|
|
195
|
+
operatorConfigured: false,
|
|
196
|
+
settingsPath: readOnlySettingsPath,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
const args = [
|
|
200
|
+
...agent.args,
|
|
201
|
+
"--permission-mode",
|
|
202
|
+
"default",
|
|
203
|
+
"--settings",
|
|
204
|
+
readOnlySettingsPath,
|
|
205
|
+
...observability,
|
|
206
|
+
];
|
|
207
|
+
return {
|
|
208
|
+
agent: { ...agent, args },
|
|
209
|
+
label: caps.detected ? "read-only fallback (default+verify)" : "read-only fallback (detection failed)",
|
|
210
|
+
operatorConfigured: false,
|
|
211
|
+
settingsPath: readOnlySettingsPath,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
// workspace posture
|
|
215
|
+
if (containmentEnv === "ephemeral") {
|
|
216
|
+
const args = [
|
|
217
|
+
...agent.args,
|
|
218
|
+
"--dangerously-skip-permissions",
|
|
219
|
+
"--settings",
|
|
220
|
+
workspaceSettingsPath,
|
|
221
|
+
...observability,
|
|
222
|
+
];
|
|
223
|
+
return {
|
|
224
|
+
agent: { ...agent, args },
|
|
225
|
+
label: "ephemeral",
|
|
226
|
+
operatorConfigured: false,
|
|
227
|
+
settingsPath: workspaceSettingsPath,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
if (caps.autoMode) {
|
|
231
|
+
const args = [...agent.args, "--permission-mode", "auto", "--settings", workspaceSettingsPath];
|
|
232
|
+
if (caps.permissionPrompts)
|
|
233
|
+
args.push("--permission-prompts", "none");
|
|
234
|
+
args.push(...observability);
|
|
235
|
+
const sandboxed = platform === "darwin" || platform === "linux";
|
|
236
|
+
return {
|
|
237
|
+
agent: { ...agent, args },
|
|
238
|
+
label: sandboxed ? "auto+sandbox" : "auto",
|
|
239
|
+
operatorConfigured: false,
|
|
240
|
+
settingsPath: workspaceSettingsPath,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
const args = [
|
|
244
|
+
...agent.args,
|
|
245
|
+
"--permission-mode",
|
|
246
|
+
"acceptEdits",
|
|
247
|
+
"--settings",
|
|
248
|
+
workspaceSettingsPath,
|
|
249
|
+
...observability,
|
|
250
|
+
];
|
|
251
|
+
return {
|
|
252
|
+
agent: { ...agent, args },
|
|
253
|
+
label: caps.detected ? "fallback (acceptEdits+verify)" : "fallback (detection failed)",
|
|
254
|
+
operatorConfigured: false,
|
|
255
|
+
settingsPath: workspaceSettingsPath,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
const CODEX_DENY_NOTE = "codex has no per-command deny rules; permits.deny does not bind on this seat.";
|
|
259
|
+
function deriveCodex(input) {
|
|
260
|
+
const { agent, role, containmentEnv, platform } = input;
|
|
261
|
+
const posture = ROLE_POSTURE[role];
|
|
262
|
+
if (posture === "read-only") {
|
|
263
|
+
// Said explicitly, never assumed: `codex exec` ships read-only by
|
|
264
|
+
// default, but a user config can widen that default (a Windows
|
|
265
|
+
// `sandbox = "elevated"` setting, a trusted-project entry), and a seat
|
|
266
|
+
// labeled read-only that can write is the legibility failure this
|
|
267
|
+
// module exists to prevent. Independent of containment — a read-only
|
|
268
|
+
// seat has no reason to escalate on an ephemeral host either.
|
|
269
|
+
const args = [...agent.args, "--sandbox", "read-only"];
|
|
270
|
+
return { agent: { ...agent, args }, label: "read-only", operatorConfigured: false, note: CODEX_DENY_NOTE };
|
|
271
|
+
}
|
|
272
|
+
if (containmentEnv === "ephemeral") {
|
|
273
|
+
// Left at its own sandbox — an ephemeral host has no reason to escalate
|
|
274
|
+
// codex further, and codex ships no skip-permissions equivalent.
|
|
275
|
+
return { agent, label: "ephemeral", operatorConfigured: false, note: CODEX_DENY_NOTE };
|
|
276
|
+
}
|
|
277
|
+
const args = [...agent.args, "--sandbox", "workspace-write"];
|
|
278
|
+
const sandboxed = platform === "darwin" || platform === "linux";
|
|
279
|
+
return {
|
|
280
|
+
agent: { ...agent, args },
|
|
281
|
+
label: sandboxed ? "auto+sandbox" : "auto",
|
|
282
|
+
operatorConfigured: false,
|
|
283
|
+
note: CODEX_DENY_NOTE,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* The whole derivation, pure: role + posture + containment + capabilities +
|
|
288
|
+
* the agent's existing args -> the flags to spawn with. No I/O — capability
|
|
289
|
+
* detection and the settings-file write happen in the context builder below.
|
|
290
|
+
*/
|
|
291
|
+
export function deriveAgentInvocation(input) {
|
|
292
|
+
if (hasExplicitPermissionFlag(input.agent)) {
|
|
293
|
+
return { agent: input.agent, label: "operator-configured", operatorConfigured: true };
|
|
294
|
+
}
|
|
295
|
+
if (input.agent.command === "claude")
|
|
296
|
+
return deriveClaude(input);
|
|
297
|
+
if (input.agent.command === "codex")
|
|
298
|
+
return deriveCodex(input);
|
|
299
|
+
// Any other provider: no known flag vocabulary — deriving the wrong flag
|
|
300
|
+
// is worse than deriving none.
|
|
301
|
+
return { agent: input.agent, label: "unmanaged", operatorConfigured: false };
|
|
302
|
+
}
|
|
303
|
+
const realPermitsFs = {
|
|
304
|
+
writeFile: (path, content) => nodeWriteFile(path, content, "utf8"),
|
|
305
|
+
rm: (path) => nodeRm(path, { force: true }),
|
|
306
|
+
};
|
|
307
|
+
/**
|
|
308
|
+
* Settings files written by contexts that have not been disposed yet. One
|
|
309
|
+
* exit hook, registered on first use, removes them synchronously — the only
|
|
310
|
+
* kind of work an `exit` handler can do — so a run that crashes mid-way, a
|
|
311
|
+
* test process, or a command that never reaches its own dispose still leaves
|
|
312
|
+
* the temp directory as it found it.
|
|
313
|
+
*/
|
|
314
|
+
const undisposedSettingsPaths = new Set();
|
|
315
|
+
let exitHookRegistered = false;
|
|
316
|
+
function registerExitCleanup() {
|
|
317
|
+
if (exitHookRegistered)
|
|
318
|
+
return;
|
|
319
|
+
exitHookRegistered = true;
|
|
320
|
+
process.on("exit", () => {
|
|
321
|
+
for (const path of undisposedSettingsPaths) {
|
|
322
|
+
try {
|
|
323
|
+
rmSync(path, { force: true });
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
// Best effort at exit; nothing useful can be reported from here.
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
undisposedSettingsPaths.clear();
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Builds the run's (or doctor probe's, or as-built refresh's) one
|
|
334
|
+
* `PermitsContext`: writes the two settings files once under `os.tmpdir()`
|
|
335
|
+
* and returns a `derive` function that detects claude's capabilities on
|
|
336
|
+
* first use per command string and applies the pure derivation above.
|
|
337
|
+
*/
|
|
338
|
+
export async function buildPermitsContext(options) {
|
|
339
|
+
const platform = options.platform ?? osPlatform();
|
|
340
|
+
const containmentEnv = options.containmentEnv ?? process.env.NIGHTSHIFT_CONTAINMENT;
|
|
341
|
+
const helpRunner = options.helpRunner ?? defaultClaudeHelpRunner;
|
|
342
|
+
const fs = options.fs ?? realPermitsFs;
|
|
343
|
+
const nonce = randomBytes(4).toString("hex");
|
|
344
|
+
const workspaceSettingsPath = join(tmpdir(), `nightshift-permits-${nonce}-workspace.json`);
|
|
345
|
+
const readOnlySettingsPath = join(tmpdir(), `nightshift-permits-${nonce}-read-only.json`);
|
|
346
|
+
await fs.writeFile(workspaceSettingsPath, workspaceSettingsContent(options.config.verify, options.config.permits, platform));
|
|
347
|
+
await fs.writeFile(readOnlySettingsPath, readOnlySettingsContent(options.config.verify, options.config.permits));
|
|
348
|
+
// Only real files are tracked for exit cleanup; an injected fake fs wrote
|
|
349
|
+
// nowhere the hook could (or should) remove.
|
|
350
|
+
const tracked = options.fs === undefined;
|
|
351
|
+
if (tracked) {
|
|
352
|
+
registerExitCleanup();
|
|
353
|
+
undisposedSettingsPaths.add(workspaceSettingsPath);
|
|
354
|
+
undisposedSettingsPaths.add(readOnlySettingsPath);
|
|
355
|
+
}
|
|
356
|
+
return {
|
|
357
|
+
workspaceSettingsPath,
|
|
358
|
+
readOnlySettingsPath,
|
|
359
|
+
async dispose() {
|
|
360
|
+
for (const path of [workspaceSettingsPath, readOnlySettingsPath]) {
|
|
361
|
+
undisposedSettingsPaths.delete(path);
|
|
362
|
+
await fs.rm?.(path);
|
|
363
|
+
}
|
|
364
|
+
},
|
|
365
|
+
async derive(role, agent) {
|
|
366
|
+
const claudeCapabilities = agent.command === "claude" ? await detectClaudeCapabilities(agent.command, helpRunner) : undefined;
|
|
367
|
+
return deriveAgentInvocation({
|
|
368
|
+
role,
|
|
369
|
+
agent,
|
|
370
|
+
containmentEnv,
|
|
371
|
+
platform,
|
|
372
|
+
claudeCapabilities,
|
|
373
|
+
workspaceSettingsPath,
|
|
374
|
+
readOnlySettingsPath,
|
|
375
|
+
});
|
|
376
|
+
},
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* A context that appends nothing and detects nothing — the injectable
|
|
381
|
+
* default for options that accept `permits` optionally, so a test exercising
|
|
382
|
+
* unrelated logic spawns exactly as it did before this workstream. Every
|
|
383
|
+
* real entry point (`run`, `doctor --agents`, `nightshift author`,
|
|
384
|
+
* `nightshift as-built`/`publish`) builds and passes a real context instead
|
|
385
|
+
* of relying on this default.
|
|
386
|
+
*/
|
|
387
|
+
export const NOOP_PERMITS_CONTEXT = {
|
|
388
|
+
workspaceSettingsPath: "",
|
|
389
|
+
readOnlySettingsPath: "",
|
|
390
|
+
derive(_role, agent) {
|
|
391
|
+
return Promise.resolve({ agent, label: "operator-configured", operatorConfigured: true });
|
|
392
|
+
},
|
|
393
|
+
dispose() {
|
|
394
|
+
return Promise.resolve();
|
|
395
|
+
},
|
|
396
|
+
};
|
|
397
|
+
//# sourceMappingURL=permits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permits.js","sourceRoot":"","sources":["../src/permits.ts"],"names":[],"mappings":"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"}
|
package/dist/publish.d.ts
CHANGED
|
@@ -55,6 +55,17 @@ export interface GhClient {
|
|
|
55
55
|
updateComment(cwd: string, commentId: string, body: string): Promise<void>;
|
|
56
56
|
/** Removes a now-stale nightshift-authored comment. */
|
|
57
57
|
deleteComment(cwd: string, commentId: string): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* GitHub's mergeability computation for a PR, as raw gh strings. `mergeable`
|
|
60
|
+
* is one of MERGEABLE | CONFLICTING | UNKNOWN; `mergeStateStatus` is the
|
|
61
|
+
* fuller state (CLEAN | DIRTY | BLOCKED | BEHIND | DRAFT | UNSTABLE |
|
|
62
|
+
* HAS_HOOKS | UNKNOWN). Normalization and the UNKNOWN retry live in
|
|
63
|
+
* `publish`, not here, so the boundary stays thin and the retry is testable.
|
|
64
|
+
*/
|
|
65
|
+
viewMergeability(cwd: string, prNumber: number): Promise<{
|
|
66
|
+
mergeable: string;
|
|
67
|
+
mergeStateStatus: string;
|
|
68
|
+
}>;
|
|
58
69
|
}
|
|
59
70
|
/**
|
|
60
71
|
* Git operations `publish` needs beyond `program-branch.ts`'s derivation —
|
|
@@ -112,7 +123,23 @@ export interface PublishOptions {
|
|
|
112
123
|
/** Passed straight through to the pre-publish as-built refresh; default reviewer runner. */
|
|
113
124
|
agentRunner?: AgentRunner;
|
|
114
125
|
log?: (line: string) => void;
|
|
126
|
+
/** Injected for tests so the UNKNOWN retry does not actually wait. */
|
|
127
|
+
sleep?: (ms: number) => Promise<void>;
|
|
115
128
|
}
|
|
129
|
+
/** GitHub's answer to "does this PR merge cleanly into its base?" */
|
|
130
|
+
export type MergeableState = "mergeable" | "conflicting" | "unknown";
|
|
131
|
+
/** What the pre-publish base sync did. */
|
|
132
|
+
export type BaseSyncOutcome = {
|
|
133
|
+
status: "up-to-date";
|
|
134
|
+
} | {
|
|
135
|
+
status: "merged";
|
|
136
|
+
} | {
|
|
137
|
+
status: "conflict";
|
|
138
|
+
paths: string[];
|
|
139
|
+
} | {
|
|
140
|
+
status: "skipped";
|
|
141
|
+
reason: string;
|
|
142
|
+
};
|
|
116
143
|
export interface PublishResult {
|
|
117
144
|
prNumber: number;
|
|
118
145
|
prUrl: string;
|
|
@@ -121,7 +148,15 @@ export interface PublishResult {
|
|
|
121
148
|
escalationComments: number;
|
|
122
149
|
/** Report-continuation comments upserted this publish (0 when the report fits). */
|
|
123
150
|
continuationComments: number;
|
|
151
|
+
/** GitHub's mergeable state for the upserted PR (SC-07). */
|
|
152
|
+
mergeable: MergeableState;
|
|
153
|
+
/** What the pre-publish base sync did (SC-08). */
|
|
154
|
+
baseSync: BaseSyncOutcome;
|
|
124
155
|
}
|
|
156
|
+
/** The named `nightshift publish` / `nightshift run --publish` mergeability line (SC-07). */
|
|
157
|
+
export declare function mergeabilityLine(mergeable: MergeableState): string;
|
|
158
|
+
/** The named `nightshift publish` / `nightshift run --publish` base-sync line (SC-08). */
|
|
159
|
+
export declare function baseSyncLine(baseSync: BaseSyncOutcome): string;
|
|
125
160
|
interface ReportChunk {
|
|
126
161
|
/** A verbatim, contiguous slice of the report — never rewritten or decorated. */
|
|
127
162
|
payload: string;
|
package/dist/publish.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"AAKA,OAAO,EAAwB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE3E,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAchE;;;;;;;;;;;;GAYG;AAGH,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAa3C,MAAM,WAAW,SAAS;IACxB,qEAAqE;IACrE,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,iFAAiF;IACjF,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACpC,mEAAmE;IACnE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB;;;;OAIG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC;;;;;OAKG;IACH,mBAAmB,CACjB,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;IACtC,wEAAwE;IACxE,sBAAsB,CACpB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAC7E,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,kFAAkF;IAClF,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAChE,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,uDAAuD;IACvD,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"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"}
|