@wildorder/nightshift 0.12.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.
Files changed (90) hide show
  1. package/README.md +46 -19
  2. package/dist/agent-probe.d.ts +21 -2
  3. package/dist/agent-probe.d.ts.map +1 -1
  4. package/dist/agent-probe.js +76 -22
  5. package/dist/agent-probe.js.map +1 -1
  6. package/dist/agent-runner.d.ts +90 -2
  7. package/dist/agent-runner.d.ts.map +1 -1
  8. package/dist/agent-runner.js +382 -24
  9. package/dist/agent-runner.js.map +1 -1
  10. package/dist/agent-summary.d.ts +15 -0
  11. package/dist/agent-summary.d.ts.map +1 -1
  12. package/dist/agent-summary.js +32 -2
  13. package/dist/agent-summary.js.map +1 -1
  14. package/dist/as-built.d.ts +6 -0
  15. package/dist/as-built.d.ts.map +1 -1
  16. package/dist/as-built.js +7 -0
  17. package/dist/as-built.js.map +1 -1
  18. package/dist/author.d.ts +9 -0
  19. package/dist/author.d.ts.map +1 -1
  20. package/dist/author.js +161 -24
  21. package/dist/author.js.map +1 -1
  22. package/dist/ci-init.d.ts.map +1 -1
  23. package/dist/ci-init.js +17 -12
  24. package/dist/ci-init.js.map +1 -1
  25. package/dist/cli.js +144 -11
  26. package/dist/cli.js.map +1 -1
  27. package/dist/config.d.ts +11 -0
  28. package/dist/config.d.ts.map +1 -1
  29. package/dist/config.js +13 -0
  30. package/dist/config.js.map +1 -1
  31. package/dist/crash-report.d.ts +58 -0
  32. package/dist/crash-report.d.ts.map +1 -0
  33. package/dist/crash-report.js +115 -0
  34. package/dist/crash-report.js.map +1 -0
  35. package/dist/decide.js +1 -1
  36. package/dist/decide.js.map +1 -1
  37. package/dist/decider-review.d.ts +33 -5
  38. package/dist/decider-review.d.ts.map +1 -1
  39. package/dist/decider-review.js +55 -9
  40. package/dist/decider-review.js.map +1 -1
  41. package/dist/decision-ledger.d.ts +54 -1
  42. package/dist/decision-ledger.d.ts.map +1 -1
  43. package/dist/decision-ledger.js +53 -1
  44. package/dist/decision-ledger.js.map +1 -1
  45. package/dist/decision-view.d.ts +10 -1
  46. package/dist/decision-view.d.ts.map +1 -1
  47. package/dist/decision-view.js +41 -0
  48. package/dist/decision-view.js.map +1 -1
  49. package/dist/exit-codes.d.ts +16 -2
  50. package/dist/exit-codes.d.ts.map +1 -1
  51. package/dist/exit-codes.js +17 -2
  52. package/dist/exit-codes.js.map +1 -1
  53. package/dist/index.d.ts +1 -0
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +1 -0
  56. package/dist/index.js.map +1 -1
  57. package/dist/manifest.d.ts +68 -14
  58. package/dist/manifest.d.ts.map +1 -1
  59. package/dist/manifest.js +301 -22
  60. package/dist/manifest.js.map +1 -1
  61. package/dist/permits.d.ts +135 -0
  62. package/dist/permits.d.ts.map +1 -0
  63. package/dist/permits.js +397 -0
  64. package/dist/permits.js.map +1 -0
  65. package/dist/preflight.d.ts +73 -0
  66. package/dist/preflight.d.ts.map +1 -0
  67. package/dist/preflight.js +225 -0
  68. package/dist/preflight.js.map +1 -0
  69. package/dist/publish.d.ts +71 -0
  70. package/dist/publish.d.ts.map +1 -1
  71. package/dist/publish.js +319 -1
  72. package/dist/publish.js.map +1 -1
  73. package/dist/run-program.d.ts +70 -2
  74. package/dist/run-program.d.ts.map +1 -1
  75. package/dist/run-program.js +677 -60
  76. package/dist/run-program.js.map +1 -1
  77. package/dist/skill-roots.d.ts +11 -3
  78. package/dist/skill-roots.d.ts.map +1 -1
  79. package/dist/skill-roots.js +59 -12
  80. package/dist/skill-roots.js.map +1 -1
  81. package/dist/whole-program-review.d.ts +4 -0
  82. package/dist/whole-program-review.d.ts.map +1 -1
  83. package/dist/whole-program-review.js +9 -1
  84. package/dist/whole-program-review.js.map +1 -1
  85. package/package.json +2 -2
  86. package/skills/plan-program/SKILL.md +125 -5
  87. package/dist/verify-allowlist.d.ts +0 -23
  88. package/dist/verify-allowlist.d.ts.map +0 -1
  89. package/dist/verify-allowlist.js +0 -46
  90. package/dist/verify-allowlist.js.map +0 -1
package/dist/manifest.js CHANGED
@@ -4,9 +4,10 @@ import { join, resolve } from "node:path";
4
4
  import { z } from "zod";
5
5
  /**
6
6
  * The program manifest: the single canonical home for success criteria, the
7
- * workstream roster, dependencies, and scope. `/plan-program` writes it; the
8
- * runner reads it and writes workstream status back. Narrative belongs in
9
- * the program document, never here — one canonical home per fact.
7
+ * workstream roster, dependencies, scope, and human prerequisites. `/plan-
8
+ * program` writes it; the runner reads it and writes workstream status back.
9
+ * Narrative belongs in the program document, never here — one canonical home
10
+ * per fact.
10
11
  */
11
12
  export const WORKSTREAM_STATUSES = [
12
13
  "not_started",
@@ -14,13 +15,38 @@ export const WORKSTREAM_STATUSES = [
14
15
  "complete",
15
16
  "failed",
16
17
  "parked",
18
+ "awaiting_human",
17
19
  ];
20
+ export const PREREQUISITE_STATUSES = ["pending", "satisfied"];
21
+ export const prerequisiteSchema = z.object({
22
+ /**
23
+ * Stable id, conventionally `HP-xx` (a documented convention, not a
24
+ * schema-enforced format). Unique within a manifest — a duplicate is a
25
+ * named load error (see {@link loadManifest}).
26
+ */
27
+ id: z.string().min(1),
28
+ /** Human-facing statement of the action only a human can perform. */
29
+ description: z.string().min(1),
30
+ /** The exact commands or console steps that perform the action. */
31
+ remediation: z.string().min(1),
32
+ /**
33
+ * A shell command that exits zero iff the action is done. Executed by the
34
+ * runner itself as a deterministic subprocess, never by a model. Trust
35
+ * boundary: the manifest is repo-tracked and human-reviewed at planning
36
+ * time, so this string is the same trust class as the verify commands in
37
+ * `nightshift.config.json` (see `configSchema.verify` in `src/config.ts`)
38
+ * — no sandbox beyond a bounded timeout and fail-open-to-unmet, both owned
39
+ * by the runner.
40
+ */
41
+ verifyCommand: z.string().min(1),
42
+ status: z.enum(PREREQUISITE_STATUSES).default("pending"),
43
+ });
18
44
  const scopeSchema = z.object({
19
45
  summary: z.string().min(1),
20
46
  includes: z.array(z.string()).default([]),
21
47
  excludes: z.array(z.string()).default([]),
22
48
  });
23
- const workstreamSchema = z.object({
49
+ export const workstreamSchema = z.object({
24
50
  id: z.string().min(1),
25
51
  name: z.string().min(1),
26
52
  taskFile: z.string().min(1),
@@ -31,6 +57,15 @@ const workstreamSchema = z.object({
31
57
  scope: scopeSchema.optional(),
32
58
  dependencies: z.array(z.string()).default([]),
33
59
  packages: z.array(z.string()).default([]),
60
+ /**
61
+ * Ids of program-level prerequisites this workstream waits on. Validated
62
+ * at load exactly as {@link Workstream.dependencies} are — an id with no
63
+ * matching entry in the manifest's `prerequisites` array is a named load
64
+ * error, not a runtime surprise. Each referenced id resolves to exactly
65
+ * one record, because program-level prerequisite ids are unique (checked
66
+ * at load). Absent on manifests without prerequisites.
67
+ */
68
+ prerequisites: z.array(z.string()).default([]),
34
69
  /**
35
70
  * {@link specInputsHash} of the manifest inputs the spec was authored
36
71
  * from, stamped by the authoring stage. A mismatch on a later run means
@@ -59,19 +94,27 @@ const manifestSchema = z
59
94
  packages: z.array(z.record(z.string(), z.unknown())).default([]),
60
95
  workstreams: z.array(workstreamSchema.loose()).min(1),
61
96
  outOfScope: z.array(z.string()).default([]),
97
+ prerequisites: z.array(prerequisiteSchema.loose()).default([]),
62
98
  })
63
99
  .loose();
64
100
  /**
65
101
  * Fingerprint of everything the authoring brief projects from the manifest
66
- * for one workstream: its name and scope, its dependency edges, and the
67
- * program-wide success criteria. Deliberately excludes runner-owned
68
- * bookkeeping (status, commit, specHash itself) and taskFile (moving the
69
- * file makes the spec missing, which re-authors anyway). Computed after
70
- * authoring's own dependency merges and stamped as `specHash`, so a run can
71
- * tell "the human edited the manifest after this spec was written" from
72
- * "the manifest is as the author saw it".
102
+ * for one workstream: its name and scope, its dependency edges, the
103
+ * program-wide success criteria, and when the workstream references at
104
+ * least one its prerequisites resolved to exactly the fields the brief
105
+ * projects (id, description, verifyCommand; sorted by id). `remediation` and
106
+ * `status` are excluded: the brief never projects remediation, and a
107
+ * `pending` `satisfied` flip must never re-author a spec. The key is
108
+ * omitted entirely for prerequisite-free workstreams so their hash stays
109
+ * byte-identical to before prerequisites existed. Deliberately excludes
110
+ * runner-owned bookkeeping (status, commit, specHash itself) and taskFile
111
+ * (moving the file makes the spec missing, which re-authors anyway).
112
+ * Computed after authoring's own dependency merges and stamped as
113
+ * `specHash`, so a run can tell "the human edited the manifest after this
114
+ * spec was written" from "the manifest is as the author saw it".
73
115
  */
74
116
  export function specInputsHash(manifest, workstream) {
117
+ const prerequisiteById = new Map(manifest.prerequisites.map((entry) => [entry.id, entry]));
75
118
  const inputs = {
76
119
  name: workstream.name,
77
120
  scope: workstream.scope ?? null,
@@ -80,6 +123,18 @@ export function specInputsHash(manifest, workstream) {
80
123
  id: criterion.id,
81
124
  description: criterion.description,
82
125
  })),
126
+ ...(workstream.prerequisites.length > 0
127
+ ? {
128
+ prerequisites: [...workstream.prerequisites].sort().map((id) => {
129
+ const entry = prerequisiteById.get(id);
130
+ return {
131
+ id,
132
+ description: entry?.description ?? null,
133
+ verifyCommand: entry?.verifyCommand ?? null,
134
+ };
135
+ }),
136
+ }
137
+ : {}),
83
138
  };
84
139
  return createHash("sha256")
85
140
  .update(JSON.stringify(inputs))
@@ -89,15 +144,12 @@ export function specInputsHash(manifest, workstream) {
89
144
  export function manifestPath(root, programId) {
90
145
  return join(resolve(root), "docs", "programs", `${programId}-manifest.json`);
91
146
  }
92
- export async function loadManifest(root, programId) {
93
- const path = manifestPath(root, programId);
94
- let raw;
95
- try {
96
- raw = await readFile(path, "utf8");
97
- }
98
- catch {
99
- throw new Error(`No manifest at ${path}. Plan the program first with /plan-program.`);
100
- }
147
+ /**
148
+ * Parse-and-validate body shared by `loadManifest` and the drift path in
149
+ * `saveManifest` — both need the identical diagnosis for the identical
150
+ * class of invalid content, so there is exactly one definition of "valid".
151
+ */
152
+ function parseManifest(raw, path) {
101
153
  let parsed;
102
154
  try {
103
155
  parsed = JSON.parse(raw);
@@ -123,9 +175,236 @@ export async function loadManifest(root, programId) {
123
175
  }
124
176
  }
125
177
  }
178
+ const prerequisiteIds = new Set();
179
+ for (const prerequisite of manifest.prerequisites) {
180
+ if (prerequisiteIds.has(prerequisite.id)) {
181
+ throw new Error(`${path}: duplicate prerequisite id "${prerequisite.id}"`);
182
+ }
183
+ prerequisiteIds.add(prerequisite.id);
184
+ }
185
+ for (const workstream of manifest.workstreams) {
186
+ for (const prerequisite of workstream.prerequisites) {
187
+ if (!prerequisiteIds.has(prerequisite)) {
188
+ throw new Error(`${path}: ${workstream.id} requires unknown prerequisite "${prerequisite}"`);
189
+ }
190
+ }
191
+ }
126
192
  return manifest;
127
193
  }
128
- export async function saveManifest(root, programId, manifest) {
129
- await writeFile(manifestPath(root, programId), `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
194
+ // The exact bytes this process last read (loadManifest) or wrote
195
+ // (saveManifest) for each manifest path the drift baseline. "Drift" is a
196
+ // byte-for-byte difference between this and what is on disk at save time, so
197
+ // a whitespace-only human edit is a real (harmless) merge and the comparison
198
+ // is deterministic without a model. Keyed by the resolved absolute manifest
199
+ // path so two programs, or two tmpdirs in tests, never collide.
200
+ const lastBytes = new Map();
201
+ // Total merged-on-drift saves performed this process for each path. Only
202
+ // ever incremented (never reset), so a run can snapshot it at start and
203
+ // compare at report time without a reload clearing history mid-run.
204
+ const mergeCount = new Map();
205
+ export async function loadManifest(root, programId) {
206
+ const path = manifestPath(root, programId);
207
+ let raw;
208
+ try {
209
+ raw = await readFile(path, "utf8");
210
+ }
211
+ catch {
212
+ throw new Error(`No manifest at ${path}. Plan the program first with /plan-program.`);
213
+ }
214
+ const manifest = parseManifest(raw, path);
215
+ lastBytes.set(path, raw);
216
+ return manifest;
217
+ }
218
+ /**
219
+ * Every field of a manifest has exactly one authoritative writer. The
220
+ * runner owns `program.status`; each workstream's `status`, `specHash`,
221
+ * `commit`, `dependencies`, and (see {@link mergeManifests}'s doc comment)
222
+ * `prerequisites`; and each prerequisite record's `status`. The human owns
223
+ * everything else, including which workstreams and prerequisite records
224
+ * exist at all. A save that finds the on-disk copy has drifted since this
225
+ * process last read or wrote it reloads that copy, overlays only the
226
+ * runner-owned fields from memory onto it, and writes the merge — never a
227
+ * blind whole-object overwrite. See `docs/programs/clear-backlog-manifest.json`
228
+ * (WS-02) for the full contract this implements.
229
+ */
230
+ export async function saveManifest(root, programId, manifest, options) {
231
+ const path = manifestPath(root, programId);
232
+ const serialized = `${JSON.stringify(manifest, null, 2)}\n`;
233
+ let currentOnDisk;
234
+ try {
235
+ currentOnDisk = await readFile(path, "utf8");
236
+ }
237
+ catch {
238
+ currentOnDisk = undefined;
239
+ }
240
+ if (currentOnDisk === undefined) {
241
+ await writeFile(path, serialized, "utf8");
242
+ lastBytes.set(path, serialized);
243
+ return { merged: false };
244
+ }
245
+ const baseline = lastBytes.get(path);
246
+ if (baseline === undefined || currentOnDisk === baseline) {
247
+ await writeFile(path, serialized, "utf8");
248
+ lastBytes.set(path, serialized);
249
+ return { merged: false };
250
+ }
251
+ // Drift: the bytes on disk differ from what this process last read or
252
+ // wrote. The on-disk copy must still be valid to merge onto.
253
+ let disk;
254
+ try {
255
+ disk = parseManifest(currentOnDisk, path);
256
+ }
257
+ catch (error) {
258
+ throw new Error(`${path} was amended on disk since this run last read it, but the ` +
259
+ `amended copy could not be merged: ${error.message}`, { cause: error });
260
+ }
261
+ const { manifest: merged, removedWorkstreamIds, removedPrerequisiteIds } = mergeManifests(disk, manifest);
262
+ const mergedSerialized = `${JSON.stringify(merged, null, 2)}\n`;
263
+ try {
264
+ parseManifest(mergedSerialized, path);
265
+ }
266
+ catch (error) {
267
+ throw new Error(`${path} was amended on disk since this run last read it, and merging ` +
268
+ `the run's changes onto the amendment produced an invalid manifest: ` +
269
+ `${error.message}`, { cause: error });
270
+ }
271
+ await writeFile(path, mergedSerialized, "utf8");
272
+ lastBytes.set(path, mergedSerialized);
273
+ mergeCount.set(path, (mergeCount.get(path) ?? 0) + 1);
274
+ adoptMerged(manifest, merged);
275
+ options?.log?.(`manifest: on-disk copy was amended since this run loaded it; merged ` +
276
+ `the human's edits and kept the runner's status changes (${path})`);
277
+ for (const id of removedWorkstreamIds) {
278
+ options?.log?.(`manifest: workstream "${id}" was removed from the manifest by a ` +
279
+ `human edit; discarding this run's in-memory progress for it (${path})`);
280
+ }
281
+ for (const id of removedPrerequisiteIds) {
282
+ options?.log?.(`manifest: prerequisite "${id}" was removed from the manifest by a ` +
283
+ `human edit; discarding this run's in-memory progress for it (${path})`);
284
+ }
285
+ return { merged: true };
286
+ }
287
+ export function manifestMergeCount(root, programId) {
288
+ return mergeCount.get(manifestPath(root, programId)) ?? 0;
289
+ }
290
+ /**
291
+ * Field-level merge of a runner-held in-memory manifest onto a validated
292
+ * on-disk copy. `disk` is the base — every field the human owns comes from
293
+ * it, including roster membership. Only the runner-owned fields listed in
294
+ * the module doc comment are overlaid from `memory`. Returns a new object;
295
+ * does not mutate either input (the caller adopts the result into `memory`
296
+ * separately, preserving object identity — see `adoptMerged`). Does not log:
297
+ * the caller only logs once the merge has been validated and written.
298
+ */
299
+ function mergeManifests(disk, memory) {
300
+ const memoryWorkstreamById = new Map(memory.workstreams.map((w) => [w.id, w]));
301
+ const diskWorkstreamIds = new Set(disk.workstreams.map((w) => w.id));
302
+ const diskPrerequisiteIds = new Set(disk.prerequisites.map((p) => p.id));
303
+ const mergedWorkstreams = disk.workstreams.map((diskWorkstream) => {
304
+ const memoryWorkstream = memoryWorkstreamById.get(diskWorkstream.id);
305
+ if (!memoryWorkstream)
306
+ return diskWorkstream;
307
+ const mergedDependencies = memoryWorkstream.dependencies.filter((id) => diskWorkstreamIds.has(id));
308
+ // Which prerequisites gate a workstream is treated as runner-owned, not
309
+ // human-owned like the rest of the workstream's structural fields: a
310
+ // from-disk merge here cannot tell a genuine human edit from an agent's
311
+ // own file write landing on disk mid-run, and the latter must never let
312
+ // a workstream strip its own gate (SC-11 — see
313
+ // test/run-program.test.ts's "self-satisfying HP-01" case, and the
314
+ // WS-02 decision log for the full reasoning).
315
+ const mergedPrerequisiteRefs = memoryWorkstream.prerequisites.filter((id) => diskPrerequisiteIds.has(id));
316
+ const merged = {
317
+ ...diskWorkstream,
318
+ status: memoryWorkstream.status,
319
+ dependencies: mergedDependencies,
320
+ prerequisites: mergedPrerequisiteRefs,
321
+ };
322
+ if (memoryWorkstream.specHash === undefined) {
323
+ delete merged.specHash;
324
+ }
325
+ else {
326
+ merged.specHash = memoryWorkstream.specHash;
327
+ }
328
+ if (memoryWorkstream.commit === undefined) {
329
+ delete merged.commit;
330
+ }
331
+ else {
332
+ merged.commit = memoryWorkstream.commit;
333
+ }
334
+ return merged;
335
+ });
336
+ const removedWorkstreamIds = memory.workstreams
337
+ .map((w) => w.id)
338
+ .filter((id) => !diskWorkstreamIds.has(id));
339
+ const memoryPrerequisiteById = new Map(memory.prerequisites.map((p) => [p.id, p]));
340
+ const mergedPrerequisites = disk.prerequisites.map((diskPrerequisite) => {
341
+ const memoryPrerequisite = memoryPrerequisiteById.get(diskPrerequisite.id);
342
+ if (!memoryPrerequisite)
343
+ return diskPrerequisite;
344
+ return { ...diskPrerequisite, status: memoryPrerequisite.status };
345
+ });
346
+ const removedPrerequisiteIds = memory.prerequisites
347
+ .map((p) => p.id)
348
+ .filter((id) => !diskPrerequisiteIds.has(id));
349
+ const manifest = {
350
+ ...disk,
351
+ program: { ...disk.program, status: memory.program.status },
352
+ workstreams: mergedWorkstreams,
353
+ prerequisites: mergedPrerequisites,
354
+ };
355
+ return { manifest, removedWorkstreamIds, removedPrerequisiteIds };
356
+ }
357
+ /**
358
+ * Replaces every enumerable key of `target` with `source`'s keys — not a
359
+ * shallow `Object.assign`, which would leave a key deleted on `source` (a
360
+ * human removing a workstream's optional `size`, or a top-level `.loose()`
361
+ * key) stranded on `target`. Preserves `target`'s object identity.
362
+ */
363
+ function replaceContents(target, source) {
364
+ const targetBag = target;
365
+ const sourceBag = source;
366
+ for (const key of Object.keys(targetBag))
367
+ delete targetBag[key];
368
+ Object.assign(targetBag, sourceBag);
369
+ }
370
+ /**
371
+ * Adopts a merged manifest into the run's existing in-memory object by
372
+ * updating objects in place rather than swapping references — the build
373
+ * loop and topological order hold references to the original workstream
374
+ * objects, and swapping would detach them (see WS-02 decision: "Adopt the
375
+ * merged manifest by updating memory's objects in place").
376
+ */
377
+ function adoptMerged(memory, merged) {
378
+ const mergedWorkstreamById = new Map(merged.workstreams.map((w) => [w.id, w]));
379
+ const survivingWorkstreams = memory.workstreams.filter((workstream) => {
380
+ const match = mergedWorkstreamById.get(workstream.id);
381
+ if (!match)
382
+ return false;
383
+ replaceContents(workstream, match);
384
+ return true;
385
+ });
386
+ const survivingWorkstreamIds = new Set(survivingWorkstreams.map((w) => w.id));
387
+ for (const mergedWorkstream of merged.workstreams) {
388
+ if (!survivingWorkstreamIds.has(mergedWorkstream.id)) {
389
+ survivingWorkstreams.push({ ...mergedWorkstream });
390
+ }
391
+ }
392
+ const mergedPrerequisiteById = new Map(merged.prerequisites.map((p) => [p.id, p]));
393
+ const survivingPrerequisites = memory.prerequisites.filter((prerequisite) => {
394
+ const match = mergedPrerequisiteById.get(prerequisite.id);
395
+ if (!match)
396
+ return false;
397
+ replaceContents(prerequisite, match);
398
+ return true;
399
+ });
400
+ const survivingPrerequisiteIds = new Set(survivingPrerequisites.map((p) => p.id));
401
+ for (const mergedPrerequisite of merged.prerequisites) {
402
+ if (!survivingPrerequisiteIds.has(mergedPrerequisite.id)) {
403
+ survivingPrerequisites.push({ ...mergedPrerequisite });
404
+ }
405
+ }
406
+ replaceContents(memory, merged);
407
+ memory.workstreams = survivingWorkstreams;
408
+ memory.prerequisites = survivingPrerequisites;
130
409
  }
131
410
  //# sourceMappingURL=manifest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ import type { AgentConfig, NightshiftConfig, PermitsConfig } from "./config.js";
2
+ /**
3
+ * The permission posture nightshift derives for each agent spawn — from the
4
+ * agent's role, the provider it runs, and the host it runs on — replacing
5
+ * the hand-written `--permission-mode`/`--allowedTools` flags an operator
6
+ * used to maintain by hand. See docs/programs's WS-01 spec for the full
7
+ * design: this module builds no judge of its own, it only chooses among
8
+ * containments the providers already ship (claude's `auto` classifier and
9
+ * OS sandbox, codex's workspace-write sandbox).
10
+ */
11
+ /** The five spawn seats; postures are fixed, never configured. */
12
+ export type AgentRole = "agent" | "recoveryAgent" | "authorAgent" | "deciderAgent" | "reviewerAgent";
13
+ export type Posture = "workspace" | "read-only";
14
+ /**
15
+ * Fixed per-role postures — mirrors the write/exec split `agent-probe.ts`
16
+ * already encoded as WRITE_ROLES/EXEC_ROLES. Exported so the probe sources
17
+ * its write/read split from here rather than keeping a second copy that can
18
+ * drift.
19
+ */
20
+ export declare const ROLE_POSTURE: Record<AgentRole, Posture>;
21
+ /**
22
+ * The containment/mode label rendered on the `permissions:` startup line and
23
+ * the doctor probe. `unmanaged` covers a provider this module has no flag
24
+ * vocabulary for (gemini, cursor-agent, …) — SC-07's seven labels are all
25
+ * claude/codex-specific; this is the honest label for everything else.
26
+ */
27
+ export type ContainmentLabel = "ephemeral" | "auto+sandbox" | "auto" | "read-only" | "operator-configured" | "fallback (acceptEdits+verify)" | "fallback (detection failed)" | "read-only fallback (default+verify)" | "read-only fallback (detection failed)" | "unmanaged";
28
+ export interface DerivedInvocation {
29
+ /** Same command/promptMode; args carry the derived flags appended, or are untouched when operator-configured. */
30
+ agent: AgentConfig;
31
+ label: ContainmentLabel;
32
+ operatorConfigured: boolean;
33
+ /** The settings file this invocation reads, when one applies (claude only). */
34
+ settingsPath?: string;
35
+ /** An extra sentence for the startup line — e.g. codex's deny-rules caveat. */
36
+ note?: string;
37
+ }
38
+ /**
39
+ * True when the agent's own args already carry a permission-bearing flag —
40
+ * `--flag value` and `--flag=value` both match. An agent that trips this is
41
+ * spawned untouched and labeled operator-configured; rewriting an operator's
42
+ * authored flags is the override the charter forbids.
43
+ */
44
+ export declare function hasExplicitPermissionFlag(agent: AgentConfig): boolean;
45
+ /** One `--allowedTools`/settings allow entry per configured verify command. Relocated from verify-allowlist.ts. */
46
+ export declare function claudeVerifyAllowedTools(verify: Record<string, string>): string[];
47
+ /** The workspace settings file: verify rules + permits.allow/deny, plus a sandbox block on darwin/linux. */
48
+ export declare function workspaceSettingsContent(verify: Record<string, string>, permits: PermitsConfig | undefined, platform: NodeJS.Platform): string;
49
+ /** The read-only settings file: same allow/deny lists, never a sandbox block. */
50
+ export declare function readOnlySettingsContent(verify: Record<string, string>, permits: PermitsConfig | undefined): string;
51
+ export interface ClaudeCapabilities {
52
+ /** False when `--help` could not be run at all (not on PATH, spawn error). */
53
+ detected: boolean;
54
+ autoMode: boolean;
55
+ dontAskMode: boolean;
56
+ permissionPrompts: boolean;
57
+ }
58
+ /** Injectable boundary: resolves to the CLI's `--help` text, rejects on spawn failure. */
59
+ export type ClaudeHelpRunner = (command: string) => Promise<string>;
60
+ /**
61
+ * Turns a finished `--help` spawn into its text or a rejection. Exported so
62
+ * the nonzero-exit-code case (a `claude` on PATH that fails, rather than a
63
+ * missing command) is unit-testable without an actual child process: a
64
+ * nonzero exit must be reported as a detection failure, never parsed as if
65
+ * it were successful help output.
66
+ */
67
+ export declare function helpRunnerOutcome(code: number | null, output: string): string;
68
+ export declare const defaultClaudeHelpRunner: ClaudeHelpRunner;
69
+ /** Parses `claude --help` text into capabilities. Exported for fixture-driven tests. */
70
+ export declare function parseClaudeHelp(helpText: string): ClaudeCapabilities;
71
+ export declare function detectClaudeCapabilities(command: string, helpRunner?: ClaudeHelpRunner): Promise<ClaudeCapabilities>;
72
+ /** Test-only: clears the process-wide capability cache between fixture scenarios. */
73
+ export declare function resetClaudeCapabilityCacheForTests(): void;
74
+ export interface DerivationInput {
75
+ role: AgentRole;
76
+ agent: AgentConfig;
77
+ /** Raw `NIGHTSHIFT_CONTAINMENT` value; only `"ephemeral"` has meaning. */
78
+ containmentEnv: string | undefined;
79
+ platform: NodeJS.Platform;
80
+ /** Undefined for a non-claude command — capabilities are claude-specific. */
81
+ claudeCapabilities: ClaudeCapabilities | undefined;
82
+ workspaceSettingsPath: string;
83
+ readOnlySettingsPath: string;
84
+ }
85
+ /**
86
+ * The whole derivation, pure: role + posture + containment + capabilities +
87
+ * the agent's existing args -> the flags to spawn with. No I/O — capability
88
+ * detection and the settings-file write happen in the context builder below.
89
+ */
90
+ export declare function deriveAgentInvocation(input: DerivationInput): DerivedInvocation;
91
+ export interface PermitsContext {
92
+ workspaceSettingsPath: string;
93
+ readOnlySettingsPath: string;
94
+ derive(role: AgentRole, agent: AgentConfig): Promise<DerivedInvocation>;
95
+ /**
96
+ * Removes the settings files this context wrote. The owner of a context
97
+ * (the command that built it) calls this when its spawns are done; a
98
+ * process-exit hook removes whatever an owner never got to, so a crash or
99
+ * an early return does not leave the pair behind in the OS temp directory.
100
+ * Optional so a test fake that only implements `derive` stays a valid
101
+ * context; owners call it as `permits.dispose?.()`.
102
+ */
103
+ dispose?(): Promise<void>;
104
+ }
105
+ /** Injectable filesystem boundary for the settings-file write and removal. */
106
+ export interface PermitsFs {
107
+ writeFile(path: string, content: string): Promise<void>;
108
+ /** Optional so a write-capturing fake stays valid; removal is then a no-op. */
109
+ rm?(path: string): Promise<void>;
110
+ }
111
+ export interface BuildPermitsContextOptions {
112
+ config: NightshiftConfig;
113
+ platform?: NodeJS.Platform;
114
+ /** Defaults to `process.env.NIGHTSHIFT_CONTAINMENT`. */
115
+ containmentEnv?: string | undefined;
116
+ helpRunner?: ClaudeHelpRunner;
117
+ fs?: PermitsFs;
118
+ }
119
+ /**
120
+ * Builds the run's (or doctor probe's, or as-built refresh's) one
121
+ * `PermitsContext`: writes the two settings files once under `os.tmpdir()`
122
+ * and returns a `derive` function that detects claude's capabilities on
123
+ * first use per command string and applies the pure derivation above.
124
+ */
125
+ export declare function buildPermitsContext(options: BuildPermitsContextOptions): Promise<PermitsContext>;
126
+ /**
127
+ * A context that appends nothing and detects nothing — the injectable
128
+ * default for options that accept `permits` optionally, so a test exercising
129
+ * unrelated logic spawns exactly as it did before this workstream. Every
130
+ * real entry point (`run`, `doctor --agents`, `nightshift author`,
131
+ * `nightshift as-built`/`publish`) builds and passes a real context instead
132
+ * of relying on this default.
133
+ */
134
+ export declare const NOOP_PERMITS_CONTEXT: PermitsContext;
135
+ //# sourceMappingURL=permits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permits.d.ts","sourceRoot":"","sources":["../src/permits.ts"],"names":[],"mappings":"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"}