@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.
- package/dist/cli.js +252 -10
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +7 -0
- package/dist/config.js.map +1 -1
- package/dist/decision-ledger.d.ts +68 -0
- package/dist/decision-ledger.d.ts.map +1 -0
- package/dist/decision-ledger.js +108 -0
- package/dist/decision-ledger.js.map +1 -0
- package/dist/decision.d.ts +59 -0
- package/dist/decision.d.ts.map +1 -0
- package/dist/decision.js +0 -0
- package/dist/decision.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/init-project.d.ts +18 -0
- package/dist/init-project.d.ts.map +1 -0
- package/dist/init-project.js +259 -0
- package/dist/init-project.js.map +1 -0
- package/dist/install-prefs.d.ts +17 -0
- package/dist/install-prefs.d.ts.map +1 -0
- package/dist/install-prefs.js +55 -0
- package/dist/install-prefs.js.map +1 -0
- package/dist/install-skills.d.ts +83 -0
- package/dist/install-skills.d.ts.map +1 -0
- package/dist/install-skills.js +311 -0
- package/dist/install-skills.js.map +1 -0
- package/dist/install-wizard.d.ts +56 -0
- package/dist/install-wizard.d.ts.map +1 -0
- package/dist/install-wizard.js +166 -0
- package/dist/install-wizard.js.map +1 -0
- package/dist/manifest.d.ts +76 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +95 -0
- package/dist/manifest.js.map +1 -0
- package/dist/package-assets.d.ts +3 -0
- package/dist/package-assets.d.ts.map +1 -0
- package/dist/package-assets.js +13 -0
- package/dist/package-assets.js.map +1 -0
- package/dist/run-program.d.ts +72 -0
- package/dist/run-program.d.ts.map +1 -0
- package/dist/run-program.js +482 -0
- package/dist/run-program.js.map +1 -0
- package/dist/skill-roots.d.ts +51 -0
- package/dist/skill-roots.d.ts.map +1 -0
- package/dist/skill-roots.js +181 -0
- package/dist/skill-roots.js.map +1 -0
- package/package.json +3 -1
- package/skills/init-project/SKILL.md +196 -0
- package/skills/plan-program/SKILL.md +274 -0
- package/templates/AGENTS.md +29 -0
- package/templates/CLAUDE.md +7 -0
- package/templates/universal-directives.md +50 -0
- package/templates/vision.md +46 -0
package/dist/index.js
CHANGED
|
@@ -7,4 +7,13 @@ export * from "./project-manifest.js";
|
|
|
7
7
|
export * from "./program-memory.js";
|
|
8
8
|
export * from "./worktree-guard.js";
|
|
9
9
|
export * from "./detect-package-manager.js";
|
|
10
|
+
export * from "./decision.js";
|
|
11
|
+
export * from "./decision-ledger.js";
|
|
12
|
+
export * from "./manifest.js";
|
|
13
|
+
export * from "./run-program.js";
|
|
14
|
+
export * from "./init-project.js";
|
|
15
|
+
export * from "./install-skills.js";
|
|
16
|
+
export * from "./install-prefs.js";
|
|
17
|
+
export * from "./install-wizard.js";
|
|
18
|
+
export * from "./package-assets.js";
|
|
10
19
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const initOptionsSchema: z.ZodObject<{
|
|
3
|
+
cwd: z.ZodString;
|
|
4
|
+
name: z.ZodOptional<z.ZodString>;
|
|
5
|
+
stack: z.ZodOptional<z.ZodString>;
|
|
6
|
+
description: z.ZodOptional<z.ZodString>;
|
|
7
|
+
home: z.ZodOptional<z.ZodString>;
|
|
8
|
+
directivesPath: z.ZodOptional<z.ZodString>;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
export type InitOptions = z.infer<typeof initOptionsSchema>;
|
|
11
|
+
export interface InitResult {
|
|
12
|
+
created: string[];
|
|
13
|
+
updated: string[];
|
|
14
|
+
skipped: string[];
|
|
15
|
+
warnings: string[];
|
|
16
|
+
}
|
|
17
|
+
export declare function initProject(input: InitOptions): Promise<InitResult>;
|
|
18
|
+
//# sourceMappingURL=init-project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-project.d.ts","sourceRoot":"","sources":["../src/init-project.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,iBAAiB;;;;;;;iBAO5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAoPD,wBAAsB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA8FzE"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { access, appendFile, mkdir, readdir, readFile, writeFile, } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, join, relative, resolve } from "node:path";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { PACKAGE_ROOT, packageVersion } from "./package-assets.js";
|
|
6
|
+
export const initOptionsSchema = z.object({
|
|
7
|
+
cwd: z.string().min(1),
|
|
8
|
+
name: z.string().min(1).optional(),
|
|
9
|
+
stack: z.string().min(1).optional(),
|
|
10
|
+
description: z.string().min(1).optional(),
|
|
11
|
+
home: z.string().min(1).optional(),
|
|
12
|
+
directivesPath: z.string().min(1).optional(),
|
|
13
|
+
});
|
|
14
|
+
const UNIVERSAL_PATTERN = /<!-- BEGIN UNIVERSAL[\s\S]*?<!-- END UNIVERSAL -->/u;
|
|
15
|
+
async function exists(path) {
|
|
16
|
+
try {
|
|
17
|
+
await access(path);
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function interpolate(template, values) {
|
|
25
|
+
return Object.entries(values).reduce((output, [key, value]) => output.replaceAll(`{{${key}}}`, value), template);
|
|
26
|
+
}
|
|
27
|
+
async function writeIfMissing(root, relativePath, content, result) {
|
|
28
|
+
const destination = join(root, relativePath);
|
|
29
|
+
if (await exists(destination)) {
|
|
30
|
+
result.skipped.push(relativePath);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
await mkdir(dirname(destination), { recursive: true });
|
|
34
|
+
await writeFile(destination, content, "utf8");
|
|
35
|
+
result.created.push(relativePath);
|
|
36
|
+
}
|
|
37
|
+
async function loadUniversalDirectives(home, explicitPath) {
|
|
38
|
+
if (explicitPath) {
|
|
39
|
+
const path = resolve(explicitPath);
|
|
40
|
+
if (!(await exists(path))) {
|
|
41
|
+
throw new Error(`Universal directives override not found: ${path}`);
|
|
42
|
+
}
|
|
43
|
+
return { content: await readFile(path, "utf8"), source: path };
|
|
44
|
+
}
|
|
45
|
+
const override = join(home, ".nightshift", "universal-directives.md");
|
|
46
|
+
if (await exists(override)) {
|
|
47
|
+
return { content: await readFile(override, "utf8"), source: override };
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
content: await loadTemplate("universal-directives.md"),
|
|
51
|
+
source: "@wildorder/nightshift packaged default",
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async function loadTemplate(name) {
|
|
55
|
+
return readFile(join(PACKAGE_ROOT, "templates", name), "utf8");
|
|
56
|
+
}
|
|
57
|
+
async function readPackageMetadata(root) {
|
|
58
|
+
try {
|
|
59
|
+
return JSON.parse(await readFile(join(root, "package.json"), "utf8"));
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function detectVerifyCommands(pkg) {
|
|
66
|
+
const scripts = pkg?.scripts ?? {};
|
|
67
|
+
const verify = {};
|
|
68
|
+
if (scripts.build)
|
|
69
|
+
verify.build = "npm run build";
|
|
70
|
+
if (scripts.typecheck)
|
|
71
|
+
verify.typecheck = "npm run typecheck";
|
|
72
|
+
if (scripts.lint)
|
|
73
|
+
verify.lint = "npm run lint";
|
|
74
|
+
if (scripts.test)
|
|
75
|
+
verify.test = "npm test";
|
|
76
|
+
return verify;
|
|
77
|
+
}
|
|
78
|
+
const KNOWN_FRAMEWORKS = {
|
|
79
|
+
react: "React",
|
|
80
|
+
next: "Next.js",
|
|
81
|
+
vue: "Vue",
|
|
82
|
+
svelte: "Svelte",
|
|
83
|
+
express: "Express",
|
|
84
|
+
fastify: "Fastify",
|
|
85
|
+
"@nestjs/core": "NestJS",
|
|
86
|
+
electron: "Electron",
|
|
87
|
+
commander: "Commander CLI",
|
|
88
|
+
};
|
|
89
|
+
const KNOWN_TEST_RUNNERS = ["vitest", "jest", "mocha", "playwright"];
|
|
90
|
+
async function detectStack(root, pkg) {
|
|
91
|
+
const parts = [];
|
|
92
|
+
if (pkg) {
|
|
93
|
+
const dependencies = {
|
|
94
|
+
...pkg.dependencies,
|
|
95
|
+
...pkg.devDependencies,
|
|
96
|
+
};
|
|
97
|
+
const usesTypeScript = Boolean(dependencies.typescript) ||
|
|
98
|
+
(await exists(join(root, "tsconfig.json")));
|
|
99
|
+
const node = pkg.engines?.node ? `Node ${pkg.engines.node}` : "Node.js";
|
|
100
|
+
parts.push(usesTypeScript ? `TypeScript on ${node}` : `JavaScript on ${node}`);
|
|
101
|
+
const frameworks = Object.entries(KNOWN_FRAMEWORKS)
|
|
102
|
+
.filter(([dependency]) => dependencies[dependency])
|
|
103
|
+
.map(([, label]) => label);
|
|
104
|
+
if (frameworks.length > 0)
|
|
105
|
+
parts.push(`frameworks: ${frameworks.join(", ")}`);
|
|
106
|
+
const testRunners = KNOWN_TEST_RUNNERS.filter((runner) => dependencies[runner]);
|
|
107
|
+
if (testRunners.length > 0)
|
|
108
|
+
parts.push(`tests: ${testRunners.join(", ")}`);
|
|
109
|
+
}
|
|
110
|
+
if ((await exists(join(root, "pyproject.toml"))) ||
|
|
111
|
+
(await exists(join(root, "requirements.txt")))) {
|
|
112
|
+
parts.push("Python");
|
|
113
|
+
}
|
|
114
|
+
if (await exists(join(root, "go.mod")))
|
|
115
|
+
parts.push("Go");
|
|
116
|
+
if (await exists(join(root, "Cargo.toml")))
|
|
117
|
+
parts.push("Rust");
|
|
118
|
+
return parts.length > 0 ? parts.join("; ") : undefined;
|
|
119
|
+
}
|
|
120
|
+
function dependencyRows(pkg) {
|
|
121
|
+
const entries = Object.entries(pkg?.dependencies ?? {}).slice(0, 15);
|
|
122
|
+
if (entries.length === 0)
|
|
123
|
+
return "| [Package] | [Version] |";
|
|
124
|
+
return entries
|
|
125
|
+
.map(([name, version]) => `| ${name} | ${version} |`)
|
|
126
|
+
.join("\n");
|
|
127
|
+
}
|
|
128
|
+
const PIPELINE_OWNED_DOCS = new Set(["AGENTS.md", "CLAUDE.md"]);
|
|
129
|
+
const CONTEXT_DOC_LIMIT = 25;
|
|
130
|
+
async function detectContextDocs(root) {
|
|
131
|
+
const docs = [];
|
|
132
|
+
try {
|
|
133
|
+
for (const entry of await readdir(root, { withFileTypes: true })) {
|
|
134
|
+
if (entry.isFile() &&
|
|
135
|
+
entry.name.toLowerCase().endsWith(".md") &&
|
|
136
|
+
!PIPELINE_OWNED_DOCS.has(entry.name)) {
|
|
137
|
+
docs.push(entry.name);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return [];
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
for (const entry of await readdir(join(root, "docs"), {
|
|
146
|
+
recursive: true,
|
|
147
|
+
withFileTypes: true,
|
|
148
|
+
})) {
|
|
149
|
+
if (!entry.isFile() || !entry.name.toLowerCase().endsWith(".md"))
|
|
150
|
+
continue;
|
|
151
|
+
const relativePath = relative(root, join(entry.parentPath, entry.name)).replaceAll("\\", "/");
|
|
152
|
+
if (relativePath === "docs/vision.md" ||
|
|
153
|
+
relativePath === "docs/as-built.md" ||
|
|
154
|
+
relativePath.startsWith("docs/programs/") ||
|
|
155
|
+
relativePath.startsWith("docs/snapshots/")) {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
docs.push(relativePath);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// No docs directory yet.
|
|
163
|
+
}
|
|
164
|
+
return [...new Set(docs)].sort().slice(0, CONTEXT_DOC_LIMIT);
|
|
165
|
+
}
|
|
166
|
+
async function upsertUniversalBlock(root, block, values, result) {
|
|
167
|
+
const destination = join(root, "AGENTS.md");
|
|
168
|
+
if (!(await exists(destination))) {
|
|
169
|
+
const template = await loadTemplate("AGENTS.md");
|
|
170
|
+
await writeFile(destination, interpolate(template, values), "utf8");
|
|
171
|
+
result.created.push("AGENTS.md");
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const current = await readFile(destination, "utf8");
|
|
175
|
+
if (UNIVERSAL_PATTERN.test(current)) {
|
|
176
|
+
const next = current.replace(UNIVERSAL_PATTERN, block);
|
|
177
|
+
if (next === current) {
|
|
178
|
+
result.skipped.push("AGENTS.md");
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
await writeFile(destination, next, "utf8");
|
|
182
|
+
result.updated.push("AGENTS.md (universal block updated)");
|
|
183
|
+
}
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
await writeFile(destination, `${block}\n\n---\n\n${current}`, "utf8");
|
|
187
|
+
result.updated.push("AGENTS.md (universal block added)");
|
|
188
|
+
}
|
|
189
|
+
export async function initProject(input) {
|
|
190
|
+
const options = initOptionsSchema.parse(input);
|
|
191
|
+
const root = resolve(options.cwd);
|
|
192
|
+
const home = resolve(options.home ?? homedir());
|
|
193
|
+
const result = { created: [], updated: [], skipped: [], warnings: [] };
|
|
194
|
+
const pkg = await readPackageMetadata(root);
|
|
195
|
+
const name = options.name ?? pkg?.name;
|
|
196
|
+
if (!name) {
|
|
197
|
+
throw new Error("Project name not provided and no package.json name found; pass --name.");
|
|
198
|
+
}
|
|
199
|
+
const description = options.description ?? pkg?.description;
|
|
200
|
+
if (!description) {
|
|
201
|
+
throw new Error("Project description not provided and no package.json description found; pass --description.");
|
|
202
|
+
}
|
|
203
|
+
let stack = options.stack ?? (await detectStack(root, pkg));
|
|
204
|
+
if (!stack) {
|
|
205
|
+
stack = "[Document the stack]";
|
|
206
|
+
result.warnings.push("Stack not provided and none detected; edit the Tech Stack sections or re-run with --stack.");
|
|
207
|
+
}
|
|
208
|
+
const contextDocs = await detectContextDocs(root);
|
|
209
|
+
const universal = await loadUniversalDirectives(home, options.directivesPath);
|
|
210
|
+
const values = {
|
|
211
|
+
PROJECT_NAME: name,
|
|
212
|
+
STACK: stack,
|
|
213
|
+
DESCRIPTION: description,
|
|
214
|
+
UNIVERSAL_DIRECTIVES: universal.content.trim(),
|
|
215
|
+
UNIVERSAL_SOURCE: universal.source,
|
|
216
|
+
DEPENDENCY_ROWS: dependencyRows(pkg),
|
|
217
|
+
};
|
|
218
|
+
const universalBlock = `<!-- BEGIN UNIVERSAL — source: ${universal.source} -->\n${universal.content.trim()}\n<!-- END UNIVERSAL -->`;
|
|
219
|
+
await mkdir(root, { recursive: true });
|
|
220
|
+
await Promise.all([
|
|
221
|
+
mkdir(join(root, "docs", "programs"), { recursive: true }),
|
|
222
|
+
mkdir(join(root, "docs", "snapshots"), { recursive: true }),
|
|
223
|
+
mkdir(join(root, "tasks"), { recursive: true }),
|
|
224
|
+
mkdir(join(root, "build-logs"), { recursive: true }),
|
|
225
|
+
]);
|
|
226
|
+
await upsertUniversalBlock(root, universalBlock, values, result);
|
|
227
|
+
for (const [relativePath, templateName] of [
|
|
228
|
+
["docs/vision.md", "vision.md"],
|
|
229
|
+
["CLAUDE.md", "CLAUDE.md"],
|
|
230
|
+
]) {
|
|
231
|
+
const template = await loadTemplate(templateName);
|
|
232
|
+
await writeIfMissing(root, relativePath, interpolate(template, values), result);
|
|
233
|
+
}
|
|
234
|
+
const config = `${JSON.stringify({
|
|
235
|
+
schemaVersion: 1,
|
|
236
|
+
nightshiftVersion: await packageVersion(),
|
|
237
|
+
visionPath: "docs/vision.md",
|
|
238
|
+
verify: detectVerifyCommands(pkg),
|
|
239
|
+
contextDocs,
|
|
240
|
+
}, null, 2)}\n`;
|
|
241
|
+
await writeIfMissing(root, "nightshift.config.json", config, result);
|
|
242
|
+
const gitignore = join(root, ".gitignore");
|
|
243
|
+
if (!(await exists(gitignore))) {
|
|
244
|
+
await writeFile(gitignore, "build-logs/\n", "utf8");
|
|
245
|
+
result.created.push(".gitignore");
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
const content = await readFile(gitignore, "utf8");
|
|
249
|
+
if (!content.split(/\r?\n/u).includes("build-logs/")) {
|
|
250
|
+
await appendFile(gitignore, `${content.endsWith("\n") ? "" : "\n"}build-logs/\n`, "utf8");
|
|
251
|
+
result.created.push(".gitignore (updated)");
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
result.skipped.push(".gitignore");
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return result;
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=init-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-project.js","sourceRoot":"","sources":["../src/init-project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type InstallScope, type SkillTarget } from "./skill-roots.js";
|
|
2
|
+
/**
|
|
3
|
+
* Which agent tools a developer uses is a property of the developer, not of
|
|
4
|
+
* any one repository — so the wizard's answer is remembered per machine.
|
|
5
|
+
* Without this, the `prepare` hook and every later non-interactive run would
|
|
6
|
+
* silently re-derive defaults and undo the choice.
|
|
7
|
+
*/
|
|
8
|
+
export declare const PREFS_PATH: string;
|
|
9
|
+
export type PreferredScope = InstallScope | "both";
|
|
10
|
+
export interface InstallPrefs {
|
|
11
|
+
targets: SkillTarget[];
|
|
12
|
+
scope: PreferredScope;
|
|
13
|
+
}
|
|
14
|
+
/** Returns undefined when no usable preference has been recorded yet. */
|
|
15
|
+
export declare function loadInstallPrefs(home?: string): Promise<InstallPrefs | undefined>;
|
|
16
|
+
export declare function saveInstallPrefs(prefs: InstallPrefs, home?: string): Promise<string>;
|
|
17
|
+
//# sourceMappingURL=install-prefs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-prefs.d.ts","sourceRoot":"","sources":["../src/install-prefs.ts"],"names":[],"mappings":"AAIA,OAAO,EAAe,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpF;;;;;GAKG;AACH,eAAO,MAAM,UAAU,QAAsC,CAAC;AAE9D,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,MAAM,CAAC;AAQnD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,KAAK,EAAE,cAAc,CAAC;CACvB;AAMD,yEAAyE;AACzE,wBAAsB,gBAAgB,CACpC,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CA2BnC;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,YAAY,EACnB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,CASjB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, join, resolve } from "node:path";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { ALL_TARGETS } from "./skill-roots.js";
|
|
6
|
+
/**
|
|
7
|
+
* Which agent tools a developer uses is a property of the developer, not of
|
|
8
|
+
* any one repository — so the wizard's answer is remembered per machine.
|
|
9
|
+
* Without this, the `prepare` hook and every later non-interactive run would
|
|
10
|
+
* silently re-derive defaults and undo the choice.
|
|
11
|
+
*/
|
|
12
|
+
export const PREFS_PATH = join(".nightshift", "install.json");
|
|
13
|
+
const prefsSchema = z.object({
|
|
14
|
+
schemaVersion: z.literal(1),
|
|
15
|
+
targets: z.array(z.string()).default([]),
|
|
16
|
+
scope: z.enum(["user", "project", "both"]).default("user"),
|
|
17
|
+
});
|
|
18
|
+
function prefsFile(home) {
|
|
19
|
+
return join(resolve(home ?? homedir()), PREFS_PATH);
|
|
20
|
+
}
|
|
21
|
+
/** Returns undefined when no usable preference has been recorded yet. */
|
|
22
|
+
export async function loadInstallPrefs(home) {
|
|
23
|
+
let raw;
|
|
24
|
+
try {
|
|
25
|
+
raw = await readFile(prefsFile(home), "utf8");
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
let parsed;
|
|
31
|
+
try {
|
|
32
|
+
parsed = JSON.parse(raw);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// A hand-corrupted preference file must not break installs; the caller
|
|
36
|
+
// falls back to detection.
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
const result = prefsSchema.safeParse(parsed);
|
|
40
|
+
if (!result.success)
|
|
41
|
+
return undefined;
|
|
42
|
+
// Unknown targets are dropped rather than rejected, so a file written by a
|
|
43
|
+
// newer version stays usable after a downgrade.
|
|
44
|
+
const targets = result.data.targets.filter((target) => ALL_TARGETS.includes(target));
|
|
45
|
+
if (targets.length === 0)
|
|
46
|
+
return undefined;
|
|
47
|
+
return { targets, scope: result.data.scope };
|
|
48
|
+
}
|
|
49
|
+
export async function saveInstallPrefs(prefs, home) {
|
|
50
|
+
const path = prefsFile(home);
|
|
51
|
+
await mkdir(dirname(path), { recursive: true });
|
|
52
|
+
await writeFile(path, `${JSON.stringify({ schemaVersion: 1, ...prefs }, null, 2)}\n`, "utf8");
|
|
53
|
+
return path;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=install-prefs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-prefs.js","sourceRoot":"","sources":["../src/install-prefs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAuC,MAAM,kBAAkB,CAAC;AAEpF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;AAI9D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;CAC3D,CAAC,CAAC;AAOH,SAAS,SAAS,CAAC,IAAwB;IACzC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;AACtD,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAa;IAEb,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;QACvE,2BAA2B;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAEtC,2EAA2E;IAC3E,gDAAgD;IAChD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAyB,EAAE,CAC3E,WAAW,CAAC,QAAQ,CAAC,MAAqB,CAAC,CAC5C,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAmB,EACnB,IAAa;IAEb,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,SAAS,CACb,IAAI,EACJ,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAC9D,MAAM,CACP,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { type InstallScope, type SkillTarget } from "./skill-roots.js";
|
|
2
|
+
export { ALL_TARGETS, DEFAULT_TARGETS, detectTargets, overrideEnvName, parseRootOverrides, parseTargets, type DetectedTarget, type InstallScope, type RootSource, type SkillTarget, } from "./skill-roots.js";
|
|
3
|
+
/**
|
|
4
|
+
* The skills that ship: the two human-judgment steps that sit outside the
|
|
5
|
+
* automated loop — deciding how the project is set up, and deciding what to
|
|
6
|
+
* build. Everything downstream of planning is a CLI command that composes
|
|
7
|
+
* its own brief and spawns clean agents.
|
|
8
|
+
*/
|
|
9
|
+
export declare const WORKFLOWS: readonly ["init-project", "plan-program"];
|
|
10
|
+
/**
|
|
11
|
+
* Skills this package used to install and now removes. Empty so far — kept
|
|
12
|
+
* because the mechanism matters: a retired skill left in a skills directory
|
|
13
|
+
* keeps instructing an agent to do work that has since moved into a command.
|
|
14
|
+
* Never list another package's skills here (program-pipeline's included);
|
|
15
|
+
* retirement is only for names this package itself installed.
|
|
16
|
+
*/
|
|
17
|
+
export declare const RETIRED_WORKFLOWS: readonly [];
|
|
18
|
+
export type Workflow = (typeof WORKFLOWS)[number];
|
|
19
|
+
export type RetiredWorkflow = (typeof RETIRED_WORKFLOWS)[number];
|
|
20
|
+
export type KnownWorkflow = Workflow | RetiredWorkflow;
|
|
21
|
+
export interface InstallSkillsOptions {
|
|
22
|
+
cwd: string;
|
|
23
|
+
targets: SkillTarget[];
|
|
24
|
+
force?: boolean;
|
|
25
|
+
home?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Where the skills land. Defaults to project scope so existing programmatic
|
|
28
|
+
* callers keep their behavior; the CLI chooses user scope explicitly.
|
|
29
|
+
*/
|
|
30
|
+
scopes?: InstallScope[];
|
|
31
|
+
/**
|
|
32
|
+
* Remove project-scope copies that this package generated and the user has
|
|
33
|
+
* not edited. Project skills shadow user skills in most harnesses, so a
|
|
34
|
+
* user-scope install is silently ineffective until the stale copies go.
|
|
35
|
+
*/
|
|
36
|
+
pruneProject?: boolean;
|
|
37
|
+
/** Per-target root overrides, from `--root <target>=<path>`. */
|
|
38
|
+
roots?: Partial<Record<SkillTarget, string>>;
|
|
39
|
+
env?: NodeJS.ProcessEnv;
|
|
40
|
+
}
|
|
41
|
+
export interface DefinitionWarning {
|
|
42
|
+
workflow: KnownWorkflow;
|
|
43
|
+
kind: "command" | "skill";
|
|
44
|
+
scope: InstallScope;
|
|
45
|
+
target: SkillTarget;
|
|
46
|
+
path: string;
|
|
47
|
+
packageManaged: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface InstallSkillsResult {
|
|
50
|
+
installed: string[];
|
|
51
|
+
updated: string[];
|
|
52
|
+
skipped: string[];
|
|
53
|
+
conflicts: string[];
|
|
54
|
+
warnings: DefinitionWarning[];
|
|
55
|
+
/** Project-scope copies removed because their marker proved them unmodified. */
|
|
56
|
+
pruned: string[];
|
|
57
|
+
/** Project-scope copies left alone because the user had edited them. */
|
|
58
|
+
pruneSkipped: string[];
|
|
59
|
+
/** Retired skills removed because their marker proved them unmodified. */
|
|
60
|
+
retired: string[];
|
|
61
|
+
/** Retired skills left in place because the user had edited them. */
|
|
62
|
+
retiredKept: string[];
|
|
63
|
+
aborted: boolean;
|
|
64
|
+
}
|
|
65
|
+
export interface ProjectCopies {
|
|
66
|
+
/** Generated by this package and unmodified — safe to remove. */
|
|
67
|
+
managed: string[];
|
|
68
|
+
/** Edited since generation, or never ours — only a human should touch these. */
|
|
69
|
+
modified: string[];
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Project-scope skill files for the given targets. Project skills shadow
|
|
73
|
+
* user-scope ones, so the caller needs this before a user-scope install to
|
|
74
|
+
* know whether the install would actually take effect.
|
|
75
|
+
*/
|
|
76
|
+
export declare function findProjectCopies(cwd: string, targets: SkillTarget[], options?: {
|
|
77
|
+
home?: string;
|
|
78
|
+
env?: NodeJS.ProcessEnv;
|
|
79
|
+
roots?: Partial<Record<SkillTarget, string>>;
|
|
80
|
+
}): Promise<ProjectCopies>;
|
|
81
|
+
export declare function installSkills(input: InstallSkillsOptions): Promise<InstallSkillsResult>;
|
|
82
|
+
export declare function doctor(): Promise<string[]>;
|
|
83
|
+
//# sourceMappingURL=install-skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-skills.d.ts","sourceRoot":"","sources":["../src/install-skills.ts"],"names":[],"mappings":"AAKA,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,WAAW,EACX,eAAe,EACf,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,kBAAkB,CAAC;AAE1B;;;;;GAKG;AACH,eAAO,MAAM,SAAS,2CAA4C,CAAC;AAEnE;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,aAAc,CAAC;AAE7C,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAClD,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AACjE,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,eAAe,CAAC;AAQvD,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gEAAgE;IAChE,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAC1B,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,gFAAgF;IAChF,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,wEAAwE;IACxE,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,qEAAqE;IACrE,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB;AAsGD,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gFAAgF;IAChF,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,EAAE,EACtB,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAA;CAAO,GACrG,OAAO,CAAC,aAAa,CAAC,CAwBxB;AA+ED,wBAAsB,aAAa,CACjC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CA6G9B;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBhD"}
|