@wildorder/nightshift 0.1.0 → 0.3.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 (57) hide show
  1. package/dist/cli.js +252 -10
  2. package/dist/cli.js.map +1 -1
  3. package/dist/config.d.ts +4 -0
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +7 -0
  6. package/dist/config.js.map +1 -1
  7. package/dist/decision-ledger.d.ts +68 -0
  8. package/dist/decision-ledger.d.ts.map +1 -0
  9. package/dist/decision-ledger.js +108 -0
  10. package/dist/decision-ledger.js.map +1 -0
  11. package/dist/decision.d.ts +59 -0
  12. package/dist/decision.d.ts.map +1 -0
  13. package/dist/decision.js +0 -0
  14. package/dist/decision.js.map +1 -0
  15. package/dist/index.d.ts +9 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +9 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/init-project.d.ts +18 -0
  20. package/dist/init-project.d.ts.map +1 -0
  21. package/dist/init-project.js +259 -0
  22. package/dist/init-project.js.map +1 -0
  23. package/dist/install-prefs.d.ts +17 -0
  24. package/dist/install-prefs.d.ts.map +1 -0
  25. package/dist/install-prefs.js +55 -0
  26. package/dist/install-prefs.js.map +1 -0
  27. package/dist/install-skills.d.ts +83 -0
  28. package/dist/install-skills.d.ts.map +1 -0
  29. package/dist/install-skills.js +311 -0
  30. package/dist/install-skills.js.map +1 -0
  31. package/dist/install-wizard.d.ts +56 -0
  32. package/dist/install-wizard.d.ts.map +1 -0
  33. package/dist/install-wizard.js +166 -0
  34. package/dist/install-wizard.js.map +1 -0
  35. package/dist/manifest.d.ts +76 -0
  36. package/dist/manifest.d.ts.map +1 -0
  37. package/dist/manifest.js +95 -0
  38. package/dist/manifest.js.map +1 -0
  39. package/dist/package-assets.d.ts +3 -0
  40. package/dist/package-assets.d.ts.map +1 -0
  41. package/dist/package-assets.js +13 -0
  42. package/dist/package-assets.js.map +1 -0
  43. package/dist/run-program.d.ts +72 -0
  44. package/dist/run-program.d.ts.map +1 -0
  45. package/dist/run-program.js +482 -0
  46. package/dist/run-program.js.map +1 -0
  47. package/dist/skill-roots.d.ts +51 -0
  48. package/dist/skill-roots.d.ts.map +1 -0
  49. package/dist/skill-roots.js +181 -0
  50. package/dist/skill-roots.js.map +1 -0
  51. package/package.json +3 -1
  52. package/skills/init-project/SKILL.md +196 -0
  53. package/skills/plan-program/SKILL.md +274 -0
  54. package/templates/AGENTS.md +29 -0
  55. package/templates/CLAUDE.md +7 -0
  56. package/templates/universal-directives.md +50 -0
  57. package/templates/vision.md +46 -0
@@ -0,0 +1,482 @@
1
+ import { execFile } from "node:child_process";
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+ import { join, resolve } from "node:path";
4
+ import { promisify } from "node:util";
5
+ import { defaultAgentRunner, defaultVerifyRunner, describeAgent, resolveAgent, resolveDeciderAgent, resolveRecoveryAgent, tail, } from "./agent-runner.js";
6
+ import { resolveSummary, summaryContract } from "./agent-summary.js";
7
+ import { decisionContract, decisionFingerprint, extractDecisions, } from "./decision.js";
8
+ import { appendLedgerEvents, readDecisionLedger, } from "./decision-ledger.js";
9
+ import { findCycles, stableTopologicalOrder } from "./graph.js";
10
+ import { loadManifest, saveManifest, } from "./manifest.js";
11
+ const execFileAsync = promisify(execFile);
12
+ export const defaultGitOps = {
13
+ async isRepository(cwd) {
14
+ try {
15
+ await execFileAsync("git", ["rev-parse", "--is-inside-work-tree"], { cwd });
16
+ return true;
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ },
22
+ async currentCommit(cwd) {
23
+ try {
24
+ const { stdout } = await execFileAsync("git", ["rev-parse", "HEAD"], { cwd });
25
+ return stdout.trim();
26
+ }
27
+ catch {
28
+ return undefined;
29
+ }
30
+ },
31
+ async commitAll(cwd, message) {
32
+ await execFileAsync("git", ["add", "-A"], { cwd });
33
+ try {
34
+ await execFileAsync("git", ["commit", "-m", message], { cwd });
35
+ }
36
+ catch (error) {
37
+ const output = String(error.stdout ?? "");
38
+ // An empty commit is not a failure; anything else is.
39
+ if (/nothing to commit|nothing added to commit/u.test(output)) {
40
+ return undefined;
41
+ }
42
+ throw error;
43
+ }
44
+ return this.currentCommit(cwd);
45
+ },
46
+ async diffSince(cwd, commit) {
47
+ try {
48
+ const { stdout } = await execFileAsync("git", ["diff", commit, "--", ".", ":!docs/programs"], { cwd, maxBuffer: 10 * 1024 * 1024 });
49
+ return stdout;
50
+ }
51
+ catch {
52
+ return "";
53
+ }
54
+ },
55
+ };
56
+ const DIFF_LIMIT = 20_000;
57
+ function implementerBrief(manifest, workstream, spec, priorFailure) {
58
+ const roster = manifest.workstreams
59
+ .map((entry) => {
60
+ const scope = entry.scope?.summary ?? entry.name;
61
+ return `- ${entry.id} ${entry.name}: ${scope}`;
62
+ })
63
+ .join("\n");
64
+ return [
65
+ `# Workstream ${workstream.id}: ${workstream.name}`,
66
+ "",
67
+ `Program: ${manifest.program.id} — ${manifest.program.name}`,
68
+ "",
69
+ "You are implementing exactly one workstream of a larger program. The",
70
+ "full roster, so you know what exists and do not rebuild another",
71
+ "workstream's work (conform only to your declared dependencies):",
72
+ "",
73
+ roster,
74
+ "",
75
+ ...(priorFailure
76
+ ? [
77
+ "## Previous attempt failed",
78
+ "",
79
+ "A previous attempt at this workstream failed. Its diagnosis:",
80
+ "",
81
+ priorFailure,
82
+ "",
83
+ "Start from the diagnosis; the working tree may already contain",
84
+ "partial work from that attempt.",
85
+ "",
86
+ ]
87
+ : []),
88
+ "## Specification",
89
+ "",
90
+ spec.trim(),
91
+ "",
92
+ "## Rules",
93
+ "",
94
+ "- Never commit; the runner owns commits and commits only verified work.",
95
+ "- Follow the repository's AGENTS.md if present.",
96
+ "- Run the project's checks yourself as you work; the runner verifies",
97
+ " independently afterwards and your claim of success is never trusted",
98
+ " without it.",
99
+ "",
100
+ decisionContract(),
101
+ "",
102
+ summaryContract(),
103
+ ].join("\n");
104
+ }
105
+ function deciderBrief(manifest, record, diff) {
106
+ const clippedDiff = diff.length > DIFF_LIMIT
107
+ ? `${diff.slice(0, DIFF_LIMIT)}\n… (diff clipped at ${DIFF_LIMIT} characters)`
108
+ : diff;
109
+ return [
110
+ "# Review one decision",
111
+ "",
112
+ `Program: ${manifest.program.id} — ${manifest.program.name}`,
113
+ `Workstream: ${record.workstream}`,
114
+ "",
115
+ "An implementing agent made the judgment call below and continued. Your",
116
+ "job is to review that one decision — not the code style, not the whole",
117
+ "diff — from the program's point of view. You never edit anything.",
118
+ "",
119
+ "```json",
120
+ JSON.stringify(record.decision, null, 2),
121
+ "```",
122
+ "",
123
+ "The work that resulted:",
124
+ "",
125
+ "```diff",
126
+ clippedDiff.trim() === "" ? "(no diff available)" : clippedDiff,
127
+ "```",
128
+ "",
129
+ "Reply with exactly one verdict block:",
130
+ "",
131
+ "```verdict",
132
+ "{",
133
+ ' "verdict": "ratify" | "escalate",',
134
+ ' "rationale": "One or two sentences, written for the human who reads the run report."',
135
+ "}",
136
+ "```",
137
+ "",
138
+ "Ratify when the choice is defensible — it does not have to be the one",
139
+ "you would have made. Escalate when the choice materially affects",
140
+ "user-visible behavior, data, or a public contract AND you believe the",
141
+ "human would plausibly choose differently; say what you would ask them.",
142
+ "One review, one verdict: this is a judgment, not a dialogue.",
143
+ ].join("\n");
144
+ }
145
+ function extractVerdict(output) {
146
+ const matches = [...output.matchAll(/```verdict[^\S\r\n]*\r?\n([\s\S]*?)```/gu)];
147
+ for (const match of matches.reverse()) {
148
+ try {
149
+ const parsed = JSON.parse(match[1] ?? "");
150
+ if ((parsed.verdict === "ratify" || parsed.verdict === "escalate") &&
151
+ typeof parsed.rationale === "string") {
152
+ return { verdict: parsed.verdict, rationale: parsed.rationale };
153
+ }
154
+ }
155
+ catch {
156
+ // Try an earlier block.
157
+ }
158
+ }
159
+ return undefined;
160
+ }
161
+ async function invokeAgent(runner, agent, prompt, cwd) {
162
+ return runner({
163
+ command: agent.command,
164
+ args: agent.args,
165
+ prompt,
166
+ promptMode: agent.promptMode,
167
+ cwd,
168
+ });
169
+ }
170
+ /** Every workstream in the transitive downstream cone of the given ids. */
171
+ export function downstreamCone(workstreams, rootIds) {
172
+ const cone = new Set(rootIds);
173
+ let grew = true;
174
+ while (grew) {
175
+ grew = false;
176
+ for (const workstream of workstreams) {
177
+ if (cone.has(workstream.id))
178
+ continue;
179
+ if (workstream.dependencies.some((dependency) => cone.has(dependency))) {
180
+ cone.add(workstream.id);
181
+ grew = true;
182
+ }
183
+ }
184
+ }
185
+ for (const id of rootIds)
186
+ cone.delete(id);
187
+ return cone;
188
+ }
189
+ /**
190
+ * The decide-and-continue runner.
191
+ *
192
+ * A run always terminates: either everything built, or the failures are
193
+ * parked with a diagnosis while everything outside their downstream cones
194
+ * built anyway. Decisions agents surface are journaled with the commit that
195
+ * preceded them, reviewed by the decider when one is configured, and
196
+ * reported — the run never stops to ask. The runner owns commits, runs the
197
+ * verify commands itself, and writes the run report last, whatever happened.
198
+ */
199
+ export async function runProgram(options) {
200
+ const root = resolve(options.cwd);
201
+ const config = options.config;
202
+ const agentRunner = options.agentRunner ?? defaultAgentRunner;
203
+ const verifyRunner = options.verifyRunner ?? defaultVerifyRunner;
204
+ const git = options.git ?? defaultGitOps;
205
+ const log = options.log ?? ((line) => console.log(line));
206
+ const now = options.now ?? (() => new Date());
207
+ const manifest = await loadManifest(root, options.programId);
208
+ const resolvedAgent = resolveAgent(config);
209
+ if (!resolvedAgent) {
210
+ throw new Error("No implementer configured. Set the `agent` block in nightshift.config.json.");
211
+ }
212
+ const agent = resolvedAgent;
213
+ const recovery = resolveRecoveryAgent(config);
214
+ const decider = resolveDeciderAgent(config);
215
+ log(`implementer: ${describeAgent(agent)}`);
216
+ log(decider
217
+ ? `decider: ${describeAgent(decider)}`
218
+ : "decider: none configured — implementer defaults will stand unratified");
219
+ const cycles = findCycles(manifest.workstreams);
220
+ if (cycles.length > 0) {
221
+ // A cyclic graph cannot be ordered; this is a planning defect, not a
222
+ // decision the runner can take. Terminate with the diagnosis.
223
+ throw new Error(`Dependency cycle(s) in the manifest: ${cycles
224
+ .map((cycle) => cycle.join(" -> "))
225
+ .join("; ")}. Re-plan with /plan-program.`);
226
+ }
227
+ const isRepository = await git.isRepository(root);
228
+ if (!isRepository) {
229
+ log("warning: not a git repository — commits, decision anchors, and replay are unavailable");
230
+ }
231
+ const ordered = stableTopologicalOrder(manifest.workstreams);
232
+ const results = [];
233
+ const blocked = new Set();
234
+ for (const workstream of ordered) {
235
+ if (workstream.status === "complete") {
236
+ results.push({
237
+ id: workstream.id,
238
+ name: workstream.name,
239
+ outcome: { status: "skipped", reason: "already complete" },
240
+ decisionIds: [],
241
+ decisionErrors: [],
242
+ });
243
+ continue;
244
+ }
245
+ if (blocked.has(workstream.id)) {
246
+ workstream.status = "parked";
247
+ results.push({
248
+ id: workstream.id,
249
+ name: workstream.name,
250
+ outcome: {
251
+ status: "parked",
252
+ reason: "an upstream dependency failed; parked, not attempted",
253
+ },
254
+ decisionIds: [],
255
+ decisionErrors: [],
256
+ });
257
+ continue;
258
+ }
259
+ const result = await runWorkstream(workstream);
260
+ results.push(result);
261
+ if (result.outcome.status === "failed") {
262
+ // Failure isolation: park the downstream cone, keep building the rest.
263
+ for (const id of downstreamCone(manifest.workstreams, [workstream.id])) {
264
+ blocked.add(id);
265
+ }
266
+ }
267
+ }
268
+ const ledger = await readDecisionLedger(root, options.programId);
269
+ const escalations = ledger.decisions.filter((decision) => decision.status === "escalated");
270
+ const complete = results.every((result) => result.outcome.status === "complete" ||
271
+ result.outcome.status === "skipped");
272
+ manifest.program.status = complete ? "complete" : "partial";
273
+ await saveManifest(root, options.programId, manifest);
274
+ const reportPath = join(root, "docs", "programs", `${options.programId}-run-report.md`);
275
+ await writeFile(reportPath, renderRunReport(manifest, results, ledger.decisions, escalations, now()), "utf8");
276
+ if (isRepository) {
277
+ await git.commitAll(root, `nightshift(${options.programId}): run report and decision ledger`);
278
+ }
279
+ log(`run report: ${reportPath}`);
280
+ return {
281
+ programId: options.programId,
282
+ complete,
283
+ workstreams: results,
284
+ escalations,
285
+ reportPath,
286
+ };
287
+ async function runWorkstream(workstream) {
288
+ const base = {
289
+ id: workstream.id,
290
+ name: workstream.name,
291
+ outcome: { status: "failed", reason: "not attempted" },
292
+ decisionIds: [],
293
+ decisionErrors: [],
294
+ };
295
+ let spec;
296
+ try {
297
+ spec = await readFile(join(root, workstream.taskFile), "utf8");
298
+ }
299
+ catch {
300
+ base.outcome = {
301
+ status: "parked",
302
+ reason: `spec not found at ${workstream.taskFile}`,
303
+ };
304
+ return base;
305
+ }
306
+ workstream.status = "in_progress";
307
+ await saveManifest(root, options.programId, manifest);
308
+ const baseCommit = isRepository
309
+ ? await git.currentCommit(root)
310
+ : undefined;
311
+ let priorFailure;
312
+ const attempts = [
313
+ { agent, label: "implementer" },
314
+ ];
315
+ if (recovery && !recovery.borrowedImplementer) {
316
+ attempts.push({ agent: recovery.agent, label: "recovery" });
317
+ }
318
+ for (const [index, attempt] of attempts.entries()) {
319
+ log(`${workstream.id} ${workstream.name}: ${attempt.label} attempt`);
320
+ const brief = implementerBrief(manifest, workstream, spec, priorFailure);
321
+ const invocation = await invokeAgent(agentRunner, attempt.agent, brief, root);
322
+ const summary = resolveSummary(invocation.output);
323
+ base.summary = summary.text;
324
+ const parsed = extractDecisions(invocation.output);
325
+ base.decisionErrors.push(...parsed.errors);
326
+ await journalDecisions(workstream, parsed.decisions, baseCommit);
327
+ base.decisionIds = parsed.decisions.map((decision) => decisionFingerprint(workstream.id, decision));
328
+ const failure = await verifyAttempt(invocation.exitCode);
329
+ if (failure === undefined) {
330
+ workstream.status = "complete";
331
+ await saveManifest(root, options.programId, manifest);
332
+ let commit;
333
+ if (isRepository) {
334
+ commit = await git.commitAll(root, `nightshift(${options.programId}): ${workstream.id} ${workstream.name}`);
335
+ }
336
+ await reviewDecisions(workstream, parsed.decisions, baseCommit);
337
+ base.outcome = {
338
+ status: "complete",
339
+ ...(commit === undefined ? {} : { commit }),
340
+ };
341
+ return base;
342
+ }
343
+ priorFailure = failure;
344
+ log(`${workstream.id}: ${attempt.label} attempt failed — ${failure}`);
345
+ if (index === attempts.length - 1) {
346
+ workstream.status = "failed";
347
+ await saveManifest(root, options.programId, manifest);
348
+ // The work stays in the tree for a resume; decisions made on the way
349
+ // to a failure are still journaled and still reviewable.
350
+ await reviewDecisions(workstream, parsed.decisions, baseCommit);
351
+ base.outcome = { status: "failed", reason: failure };
352
+ return base;
353
+ }
354
+ }
355
+ return base;
356
+ }
357
+ /** Undefined means the attempt verified clean; otherwise the diagnosis. */
358
+ async function verifyAttempt(agentExitCode) {
359
+ if (agentExitCode !== 0) {
360
+ return `agent exited with code ${agentExitCode}`;
361
+ }
362
+ for (const [name, command] of Object.entries(config.verify)) {
363
+ const result = await verifyRunner(command, root);
364
+ if (result.exitCode !== 0) {
365
+ return `verify \`${name}\` (${command}) exited ${result.exitCode}:\n${tail(result.output, 1500)}`;
366
+ }
367
+ }
368
+ return undefined;
369
+ }
370
+ async function journalDecisions(workstream, decisions, baseCommit) {
371
+ const events = decisions.map((decision) => ({
372
+ kind: "decision-recorded",
373
+ at: now().toISOString(),
374
+ id: decisionFingerprint(workstream.id, decision),
375
+ workstream: workstream.id,
376
+ decision,
377
+ ...(baseCommit === undefined ? {} : { baseCommit }),
378
+ decidedBy: "implementer",
379
+ }));
380
+ await appendLedgerEvents(root, options.programId, events);
381
+ for (const decision of decisions) {
382
+ log(`${workstream.id} decision: ${decision.title} -> ${decision.chosen}`);
383
+ }
384
+ }
385
+ /**
386
+ * Post-hoc review: the decider sees each decision with the diff it
387
+ * produced. One decision, one invocation, one verdict — a judgment, not a
388
+ * dialogue. No decider configured means defaults stand unratified, which
389
+ * the report says plainly.
390
+ */
391
+ async function reviewDecisions(workstream, decisions, baseCommit) {
392
+ if (!decider || decisions.length === 0)
393
+ return;
394
+ const diff = isRepository && baseCommit !== undefined
395
+ ? await git.diffSince(root, baseCommit)
396
+ : "";
397
+ for (const decision of decisions) {
398
+ const id = decisionFingerprint(workstream.id, decision);
399
+ const brief = deciderBrief(manifest, { workstream: workstream.id, decision }, diff);
400
+ const invocation = await invokeAgent(agentRunner, decider, brief, root);
401
+ const verdict = extractVerdict(invocation.output);
402
+ if (invocation.exitCode !== 0 || verdict === undefined) {
403
+ // Fail open: an unreviewable decision stays unratified and the
404
+ // report says so; it never blocks the run.
405
+ log(`${workstream.id} decision ${id}: decider produced no verdict; left unratified`);
406
+ continue;
407
+ }
408
+ await appendLedgerEvents(root, options.programId, [
409
+ {
410
+ kind: "decision-reviewed",
411
+ at: now().toISOString(),
412
+ id,
413
+ verdict: verdict.verdict,
414
+ rationale: verdict.rationale,
415
+ reviewedBy: "decider",
416
+ },
417
+ ]);
418
+ log(`${workstream.id} decision ${id}: ${verdict.verdict}`);
419
+ }
420
+ }
421
+ }
422
+ function renderRunReport(manifest, results, decisions, escalations, at) {
423
+ const built = results.filter((result) => result.outcome.status === "complete" ||
424
+ result.outcome.status === "skipped").length;
425
+ const lines = [
426
+ `# Run report: ${manifest.program.name} (${manifest.program.id})`,
427
+ "",
428
+ `_${at.toISOString()}_`,
429
+ "",
430
+ `**Outcome: ${built} of ${results.length} workstreams built.**`,
431
+ "",
432
+ ];
433
+ if (escalations.length > 0) {
434
+ lines.push("## Needs your attention", "", "The decider reviewed these choices and believes you might decide", "differently. Each is anchored to the commit before it was made:", "");
435
+ for (const record of escalations) {
436
+ lines.push(`### ${record.decision.title} (${record.id})`, "", `- **Workstream:** ${record.workstream}`, `- **Chosen:** ${record.decision.chosen}`, `- **Decider says:** ${record.reviewRationale ?? "(no rationale recorded)"}`, ...(record.baseCommit
437
+ ? [`- **To revisit:** roll back to \`${record.baseCommit}\` and re-run.`]
438
+ : []), "");
439
+ }
440
+ }
441
+ const failures = results.filter((result) => result.outcome.status === "failed" || result.outcome.status === "parked");
442
+ if (failures.length > 0) {
443
+ lines.push("## Not built", "");
444
+ for (const result of failures) {
445
+ const reason = result.outcome.status === "failed" || result.outcome.status === "parked"
446
+ ? result.outcome.reason
447
+ : "";
448
+ lines.push(`### ${result.id} ${result.name} — ${result.outcome.status}`, "", reason, "", `Retry after fixing: \`npx --yes @wildorder/nightshift run ${manifest.program.id}\``, "(completed workstreams are skipped automatically).", "");
449
+ }
450
+ }
451
+ lines.push("## Workstreams", "");
452
+ for (const result of results) {
453
+ lines.push(`- **${result.id} ${result.name}** — ${result.outcome.status}`);
454
+ if (result.summary) {
455
+ lines.push(` - ${result.summary.replace(/\s+/gu, " ").trim()}`);
456
+ }
457
+ }
458
+ lines.push("");
459
+ if (decisions.length > 0) {
460
+ lines.push("## Decisions made along the way", "", "Every judgment call an agent surfaced, with its review status.", "Anything here can be revisited: roll back to the anchor commit and", "re-run, or just say which option you want changed.", "");
461
+ for (const record of decisions) {
462
+ const alternatives = record.decision.options
463
+ .filter((option) => option.label !== record.decision.chosen)
464
+ .map((option) => option.label)
465
+ .join(", ");
466
+ lines.push(`### ${record.decision.title} (${record.id}) — ${record.status}`, "", `- **Workstream:** ${record.workstream}${record.oneWay ? " · **one-way door**" : ""}`, `- **Context:** ${record.decision.context}`, `- **Chosen:** ${record.decision.chosen} — ${record.decision.rationale}`, `- **Alternatives:** ${alternatives === "" ? "(none listed)" : alternatives}`, ...(record.reviewRationale
467
+ ? [`- **Decider:** ${record.reviewRationale}`]
468
+ : []), ...(record.baseCommit
469
+ ? [`- **Anchor commit:** \`${record.baseCommit}\``]
470
+ : []), "");
471
+ }
472
+ }
473
+ else {
474
+ lines.push("## Decisions made along the way", "", "None surfaced.", "");
475
+ }
476
+ const decisionErrors = results.flatMap((result) => result.decisionErrors);
477
+ if (decisionErrors.length > 0) {
478
+ lines.push("## Decision blocks the runner could not read", "", ...decisionErrors.map((error) => `- ${error}`), "");
479
+ }
480
+ return lines.join("\n");
481
+ }
482
+ //# sourceMappingURL=run-program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-program.js","sourceRoot":"","sources":["../src/run-program.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ export type SkillTarget = "cursor" | "claude" | "openclaw" | "codex" | "gemini";
2
+ export type InstallScope = "user" | "project";
3
+ /** Where a definition was found, for warnings that never become writes. */
4
+ export interface ScanRoot {
5
+ kind: "command" | "skill";
6
+ scope: InstallScope;
7
+ root: string;
8
+ }
9
+ export declare const ALL_TARGETS: SkillTarget[];
10
+ export declare const DEFAULT_TARGETS: string;
11
+ /** How a target's skills root was chosen, for `doctor` output. */
12
+ export type RootSource = "flag" | "env" | "default";
13
+ export interface DetectedTarget {
14
+ target: SkillTarget;
15
+ label: string;
16
+ /** Resolved absolute user-scope skills root. */
17
+ userRoot: string;
18
+ /** Project-scope skills root, relative to the project root. */
19
+ projectRoot: string;
20
+ /** Directory whose presence implies the tool is installed. */
21
+ configHome: string;
22
+ detected: boolean;
23
+ source: RootSource;
24
+ }
25
+ export interface ResolveContext {
26
+ home?: string;
27
+ env?: NodeJS.ProcessEnv;
28
+ /** Per-target `--root` overrides; highest precedence. */
29
+ roots?: Partial<Record<SkillTarget, string>>;
30
+ }
31
+ export declare function pathExists(path: string): Promise<boolean>;
32
+ /** The escape hatch for a layout this package does not know about. */
33
+ export declare function overrideEnvName(target: SkillTarget): string;
34
+ export declare function parseTargets(value: string): SkillTarget[];
35
+ /** `--root claude=/path` entries into a per-target override map. */
36
+ export declare function parseRootOverrides(entries: string[]): Partial<Record<SkillTarget, string>>;
37
+ /**
38
+ * Resolve every target's roots and report which tools are actually present.
39
+ * Detection is what keeps an install from creating config directories for
40
+ * tools the developer does not use.
41
+ */
42
+ export declare function detectTargets(context?: ResolveContext): Promise<DetectedTarget[]>;
43
+ /**
44
+ * Every root worth scanning for a competing definition of a workflow: each
45
+ * target's own skills roots at both scopes, plus the command directories and
46
+ * cross-tool trees that shadow them.
47
+ */
48
+ export declare function scanRoots(detected: DetectedTarget[], projectRoot: string, home: string): Array<ScanRoot & {
49
+ target: SkillTarget;
50
+ }>;
51
+ //# sourceMappingURL=skill-roots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-roots.d.ts","sourceRoot":"","sources":["../src/skill-roots.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAChF,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,CAAC;AAE9C,2EAA2E;AAC3E,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAC1B,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAkGD,eAAO,MAAM,WAAW,eAAmC,CAAC;AAC5D,eAAO,MAAM,eAAe,QAAwB,CAAC;AAErD,kEAAkE;AAClE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,yDAAyD;IACzD,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;CAC9C;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/D;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE3D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAczD;AAED,oEAAoE;AACpE,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAmBtC;AAWD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,cAAc,EAAE,CAAC,CAwC3B;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,cAAc,EAAE,EAC1B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,KAAK,CAAC,QAAQ,GAAG;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC,CA0B3C"}