@wildorder/nightshift 0.1.0 → 0.2.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 (41) hide show
  1. package/dist/cli.js +229 -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/index.d.ts +5 -0
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +5 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/init-project.d.ts +18 -0
  12. package/dist/init-project.d.ts.map +1 -0
  13. package/dist/init-project.js +259 -0
  14. package/dist/init-project.js.map +1 -0
  15. package/dist/install-prefs.d.ts +17 -0
  16. package/dist/install-prefs.d.ts.map +1 -0
  17. package/dist/install-prefs.js +55 -0
  18. package/dist/install-prefs.js.map +1 -0
  19. package/dist/install-skills.d.ts +83 -0
  20. package/dist/install-skills.d.ts.map +1 -0
  21. package/dist/install-skills.js +311 -0
  22. package/dist/install-skills.js.map +1 -0
  23. package/dist/install-wizard.d.ts +56 -0
  24. package/dist/install-wizard.d.ts.map +1 -0
  25. package/dist/install-wizard.js +166 -0
  26. package/dist/install-wizard.js.map +1 -0
  27. package/dist/package-assets.d.ts +3 -0
  28. package/dist/package-assets.d.ts.map +1 -0
  29. package/dist/package-assets.js +13 -0
  30. package/dist/package-assets.js.map +1 -0
  31. package/dist/skill-roots.d.ts +51 -0
  32. package/dist/skill-roots.d.ts.map +1 -0
  33. package/dist/skill-roots.js +181 -0
  34. package/dist/skill-roots.js.map +1 -0
  35. package/package.json +3 -1
  36. package/skills/init-project/SKILL.md +196 -0
  37. package/skills/plan-program/SKILL.md +274 -0
  38. package/templates/AGENTS.md +29 -0
  39. package/templates/CLAUDE.md +7 -0
  40. package/templates/universal-directives.md +50 -0
  41. package/templates/vision.md +46 -0
package/dist/cli.js CHANGED
@@ -1,18 +1,237 @@
1
1
  #!/usr/bin/env node
2
- import { readFile } from "node:fs/promises";
3
- import { dirname, resolve } from "node:path";
4
- import { fileURLToPath } from "node:url";
2
+ import { spawn } from "node:child_process";
3
+ import { existsSync } from "node:fs";
4
+ import { join, resolve } from "node:path";
5
5
  import { Command } from "commander";
6
- const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
7
- async function packageVersion() {
8
- const raw = await readFile(resolve(packageRoot, "package.json"), "utf8");
9
- return JSON.parse(raw).version;
6
+ import { addDevDependencyCommand, detectPackageManager, isPnpmWorkspaceRoot, PACKAGE_MANAGERS, parsePackageManager, } from "./detect-package-manager.js";
7
+ import { initProject } from "./init-project.js";
8
+ import { ALL_TARGETS, DEFAULT_TARGETS, detectTargets, doctor, installSkills, overrideEnvName, parseRootOverrides, parseTargets, } from "./install-skills.js";
9
+ import { installArgv, planSkillInstall } from "./install-wizard.js";
10
+ import { packageVersion } from "./package-assets.js";
11
+ import { createProjectManifest } from "./project-manifest.js";
12
+ const SCOPES = ["user", "project", "both"];
13
+ function parseScope(value) {
14
+ const scope = value.trim().toLowerCase();
15
+ if (!SCOPES.includes(scope)) {
16
+ throw new Error(`Unknown scope "${value}". Expected: ${SCOPES.join(", ")}.`);
17
+ }
18
+ return scope;
10
19
  }
11
- const program = new Command();
12
- program
20
+ function collect(value, previous) {
21
+ return [...previous, value];
22
+ }
23
+ /** Shared option surface for `install` and `setup`. */
24
+ function withSkillOptions(command) {
25
+ return command
26
+ .option("--cwd <path>", "Project directory", process.cwd())
27
+ .option("--targets <targets>", `Comma-separated targets: ${DEFAULT_TARGETS} (default: detected tools)`)
28
+ .option("--scope <scope>", `Install location: ${SCOPES.join(", ")} (default: user)`)
29
+ .option("--root <target=path>", "Override a target's skills root; repeatable", collect, [])
30
+ .option("--force", "Overwrite conflicting skill files", false)
31
+ .option("--yes", "Accept detected defaults without prompting", false)
32
+ .option("--prune", "Remove unmodified project-scope copies after a user-scope install")
33
+ .option("--no-prune", "Keep project-scope copies");
34
+ }
35
+ function localCliPath(root) {
36
+ return join(root, "node_modules", "@wildorder", "nightshift", "dist", "cli.js");
37
+ }
38
+ /**
39
+ * Resolves the plan (prompting when a human is present), runs the install, and
40
+ * reports it. Returns undefined when the user cancelled or a conflict aborted
41
+ * the write.
42
+ */
43
+ async function runSkillInstall(options, command) {
44
+ const roots = parseRootOverrides(options.root);
45
+ const plan = await planSkillInstall({
46
+ cwd: options.cwd,
47
+ ...(options.targets === undefined
48
+ ? {}
49
+ : { explicitTargets: parseTargets(options.targets) }),
50
+ ...(options.scope === undefined
51
+ ? {}
52
+ : { explicitScope: parseScope(options.scope) }),
53
+ // Commander gives --prune a value either way, so ask where it came from.
54
+ ...(command.getOptionValueSource("prune") === "cli"
55
+ ? { explicitPrune: options.prune ?? false }
56
+ : {}),
57
+ roots,
58
+ yes: options.yes,
59
+ });
60
+ if (plan.cancelled) {
61
+ console.log("cancelled; nothing was written");
62
+ process.exitCode = 130;
63
+ return undefined;
64
+ }
65
+ const result = await installSkills({
66
+ cwd: options.cwd,
67
+ targets: plan.targets,
68
+ scopes: plan.scopes,
69
+ force: options.force,
70
+ pruneProject: plan.pruneProject,
71
+ roots,
72
+ });
73
+ reportInstall(result);
74
+ return result.aborted ? undefined : result;
75
+ }
76
+ function reportInstall(result) {
77
+ for (const path of result.installed)
78
+ console.log(`installed ${path}`);
79
+ for (const path of result.updated)
80
+ console.log(`updated ${path}`);
81
+ for (const path of result.skipped)
82
+ console.log(`unchanged ${path}`);
83
+ for (const path of result.pruned)
84
+ console.log(`removed ${path}`);
85
+ for (const path of result.retired) {
86
+ console.log(`retired ${path}; its work is now a CLI command`);
87
+ }
88
+ for (const path of result.retiredKept) {
89
+ console.warn(`warning kept ${path}; this skill is retired but you edited it, so it was left alone — delete it when you have salvaged anything you need.`);
90
+ }
91
+ for (const path of result.pruneSkipped) {
92
+ console.warn(`warning kept ${path}; edited since generation, so it still shadows the user-scope skill`);
93
+ }
94
+ for (const warning of result.warnings) {
95
+ const ownership = warning.packageManaged ? "package-managed" : "external";
96
+ console.warn(`warning ${warning.scope} ${warning.target} ${warning.kind} (${ownership}) for ${warning.workflow}: ${warning.path}`);
97
+ }
98
+ for (const path of result.conflicts)
99
+ console.warn(`conflict ${path}`);
100
+ if (result.aborted) {
101
+ console.warn("installation aborted before writing files; resolve conflicts or re-run with --force");
102
+ }
103
+ if (result.conflicts.length > 0)
104
+ process.exitCode = 1;
105
+ }
106
+ const program = new Command()
13
107
  .name("nightshift")
14
108
  .description("The crew that builds while you're gone: walk-away engineering programs " +
15
109
  "with a decision ledger instead of gates.")
16
110
  .version(await packageVersion());
17
- program.parse();
111
+ program
112
+ .command("init")
113
+ .description("Initialize or adopt a project with the nightshift structure")
114
+ .option("--name <name>", "Project name (default: package.json name)")
115
+ .option("--stack <stack>", "Primary language and technology stack (default: detected from the repository)")
116
+ .option("--description <description>", "One-line product description (default: package.json description)")
117
+ .option("--cwd <path>", "Project directory", process.cwd())
118
+ .option("--directives <path>", "Universal directives override file (defaults to ~/.nightshift/universal-directives.md, then the packaged template)")
119
+ .action(async (options) => {
120
+ const result = await initProject({
121
+ cwd: options.cwd,
122
+ ...(options.name === undefined ? {} : { name: options.name }),
123
+ ...(options.stack === undefined ? {} : { stack: options.stack }),
124
+ ...(options.description === undefined
125
+ ? {}
126
+ : { description: options.description }),
127
+ ...(options.directives === undefined
128
+ ? {}
129
+ : { directivesPath: options.directives }),
130
+ });
131
+ for (const path of result.created)
132
+ console.log(`created ${path}`);
133
+ for (const path of result.updated)
134
+ console.log(`updated ${path}`);
135
+ for (const path of result.skipped)
136
+ console.log(`skipped ${path}`);
137
+ for (const warning of result.warnings)
138
+ console.warn(`warning ${warning}`);
139
+ });
140
+ withSkillOptions(program
141
+ .command("install")
142
+ .description("Install portable workflow skills for the agent tools on this machine")).action(async (options, command) => {
143
+ await runSkillInstall(options, command);
144
+ });
145
+ withSkillOptions(program
146
+ .command("setup")
147
+ .description("One-step setup: add the package as a devDependency and install workflow skills"))
148
+ .option("--pm <manager>", `Package manager for the devDependency: ${PACKAGE_MANAGERS.join(", ")} (default: detected from the repository)`)
149
+ .option("--no-package-json", "Do not create a placeholder package.json when the directory has none")
150
+ .action(async (options, command) => {
151
+ const root = resolve(options.cwd);
152
+ if (options.packageJson && !existsSync(join(root, "package.json"))) {
153
+ const manifest = await createProjectManifest(root);
154
+ if (manifest.created) {
155
+ console.log(`created package.json (private placeholder, name "${manifest.name}")`);
156
+ }
157
+ else if (manifest.reason === "foreign manifest") {
158
+ console.warn(`warning ${manifest.foreignManifest} found; skipped creating a package.json for a non-Node project`);
159
+ }
160
+ }
161
+ let addedDependency = false;
162
+ if (existsSync(join(root, "package.json"))) {
163
+ const manager = options.pm === undefined
164
+ ? detectPackageManager(root)
165
+ : parsePackageManager(options.pm);
166
+ console.log(`adding @wildorder/nightshift as a devDependency with ${manager}`);
167
+ const exitCode = await new Promise((resolvePromise, rejectPromise) => {
168
+ const child = spawn(addDevDependencyCommand(manager, "@wildorder/nightshift", {
169
+ pnpmWorkspaceRoot: isPnpmWorkspaceRoot(root),
170
+ }), { cwd: root, shell: true, stdio: "inherit", windowsHide: true });
171
+ child.on("error", rejectPromise);
172
+ child.on("close", (code) => resolvePromise(code ?? 1));
173
+ });
174
+ if (exitCode !== 0) {
175
+ console.error(`${manager} install failed; skills were not installed. Fix the ${manager} error and re-run setup (use --pm to override the detected package manager).`);
176
+ process.exitCode = 1;
177
+ return;
178
+ }
179
+ addedDependency = true;
180
+ }
181
+ else {
182
+ console.warn("warning no package.json found; skipped adding the devDependency (run the CLI via npx @wildorder/nightshift)");
183
+ }
184
+ // The dependency install just replaced this package's own files on
185
+ // disk, but this process is still running the code it loaded before
186
+ // that happened. Continuing in-process applies the *old* version's
187
+ // notion of which skills exist to the *new* version's files, which
188
+ // breaks outright the moment a release adds or retires one. Hand off to
189
+ // the CLI that was just installed.
190
+ const upgraded = localCliPath(root);
191
+ if (addedDependency && existsSync(upgraded)) {
192
+ const exitCode = await new Promise((resolvePromise, rejectPromise) => {
193
+ const child = spawn(process.execPath, [
194
+ upgraded,
195
+ ...installArgv({ ...options, cwd: root }, command.getOptionValueSource("prune") === "cli"),
196
+ ], { cwd: root, stdio: "inherit", windowsHide: true });
197
+ child.on("error", rejectPromise);
198
+ child.on("close", (code) => resolvePromise(code ?? 1));
199
+ });
200
+ if (exitCode !== 0) {
201
+ process.exitCode = exitCode;
202
+ return;
203
+ }
204
+ console.log("setup complete; run /init-project from your agent to continue");
205
+ return;
206
+ }
207
+ const result = await runSkillInstall({ ...options, cwd: root }, command);
208
+ if (result) {
209
+ console.log("setup complete; run /init-project from your agent to continue");
210
+ }
211
+ });
212
+ program
213
+ .command("doctor")
214
+ .description("Verify packaged assets and print the resolved skills root for each target")
215
+ .option("--root <target=path>", "Override a target's skills root; repeatable", collect, [])
216
+ .action(async (options) => {
217
+ const detected = await detectTargets({
218
+ roots: parseRootOverrides(options.root),
219
+ });
220
+ const width = Math.max(...detected.map((entry) => entry.label.length));
221
+ console.log("skills roots");
222
+ for (const entry of detected) {
223
+ const state = entry.detected ? "detected" : "not detected";
224
+ console.log(` ${entry.label.padEnd(width)} ${entry.userRoot} [${state}, ${entry.source}]`);
225
+ }
226
+ console.log(`\noverride any row with --root <target>=<path> or ${overrideEnvName(ALL_TARGETS[0] ?? "claude")}-style environment variables\n`);
227
+ const problems = await doctor();
228
+ if (problems.length === 0) {
229
+ console.log("nightshift package is healthy.");
230
+ return;
231
+ }
232
+ for (const problem of problems)
233
+ console.error(problem);
234
+ process.exitCode = 1;
235
+ });
236
+ await program.parseAsync();
18
237
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAE3E,KAAK,UAAU,cAAc;IAC3B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;IACzE,OAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC,OAAO,CAAC;AAC1D,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CACV,yEAAyE;IACvE,0CAA0C,CAC7C;KACA,OAAO,CAAC,MAAM,cAAc,EAAE,CAAC,CAAC;AAEnC,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -23,6 +23,8 @@ export type AgentConfig = z.infer<typeof agentSchema>;
23
23
  * the runner recover from a primary token, quota, or session failure.
24
24
  */
25
25
  declare const configSchema: z.ZodObject<{
26
+ schemaVersion: z.ZodOptional<z.ZodLiteral<1>>;
27
+ nightshiftVersion: z.ZodOptional<z.ZodString>;
26
28
  agent: z.ZodOptional<z.ZodObject<{
27
29
  command: z.ZodString;
28
30
  args: z.ZodDefault<z.ZodArray<z.ZodString>>;
@@ -56,6 +58,8 @@ declare const configSchema: z.ZodObject<{
56
58
  }>>;
57
59
  }, z.core.$strip>>;
58
60
  verify: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
61
+ visionPath: z.ZodDefault<z.ZodString>;
62
+ contextDocs: z.ZodDefault<z.ZodArray<z.ZodString>>;
59
63
  }, z.core.$strip>;
60
64
  export type NightshiftConfig = z.infer<typeof configSchema>;
61
65
  export declare const DEFAULT_CONFIG: NightshiftConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAE/D,QAAA,MAAM,WAAW;;;;;;;iBAIf,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD;;;;;;;;;;;;GAYG;AACH,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAOhB,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAE5D,eAAO,MAAM,cAAc,EAAE,gBAAyC,CAAC;AAEvE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,gBAAgB,CAAC;IACzB,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAyBnE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAE/D,QAAA,MAAM,WAAW;;;;;;;iBAIf,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD;;;;;;;;;;;;GAYG;AACH,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAchB,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAE5D,eAAO,MAAM,cAAc,EAAE,gBAAyC,CAAC;AAEvE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,gBAAgB,CAAC;IACzB,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAyBnE"}
package/dist/config.js CHANGED
@@ -21,12 +21,19 @@ const agentSchema = z.object({
21
21
  * the runner recover from a primary token, quota, or session failure.
22
22
  */
23
23
  const configSchema = z.object({
24
+ schemaVersion: z.literal(1).optional(),
25
+ /** The package version that scaffolded this project, for support triage. */
26
+ nightshiftVersion: z.string().optional(),
24
27
  agent: agentSchema.optional(),
25
28
  deciderAgent: agentSchema.optional(),
26
29
  reviewerAgent: agentSchema.optional(),
27
30
  recoveryAgent: agentSchema.optional(),
28
31
  /** Named verification commands run by the runner itself, never by agents. */
29
32
  verify: z.record(z.string(), z.string()).default({}),
33
+ /** The anchor product vision document, read by planning. */
34
+ visionPath: z.string().default("docs/vision.md"),
35
+ /** Extra human-authored documents planning should read. */
36
+ contextDocs: z.array(z.string()).default([]),
30
37
  });
31
38
  export const DEFAULT_CONFIG = configSchema.parse({});
32
39
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAE/D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACrC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;CAC3D,CAAC,CAAC;AAIH;;;;;;;;;;;;GAYG;AACH,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE;IAC7B,YAAY,EAAE,WAAW,CAAC,QAAQ,EAAE;IACpC,aAAa,EAAE,WAAW,CAAC,QAAQ,EAAE;IACrC,aAAa,EAAE,WAAW,CAAC,QAAQ,EAAE;IACrC,6EAA6E;IAC7E,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACrD,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,cAAc,GAAqB,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAQvE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;IAC/C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACpC,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,GAAG,sBAAsB,uBAAwB,KAAe,CAAC,OAAO,EAAE,EAC1E,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;aAC/B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;aACvE,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,GAAG,sBAAsB,gBAAgB,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -7,4 +7,9 @@ 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 "./init-project.js";
11
+ export * from "./install-skills.js";
12
+ export * from "./install-prefs.js";
13
+ export * from "./install-wizard.js";
14
+ export * from "./package-assets.js";
10
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","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.d.ts","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,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -7,4 +7,9 @@ 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 "./init-project.js";
11
+ export * from "./install-skills.js";
12
+ export * from "./install-prefs.js";
13
+ export * from "./install-wizard.js";
14
+ export * from "./package-assets.js";
10
15
  //# 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,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