@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.
- package/dist/cli.js +229 -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/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -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/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/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
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { loadInstallPrefs, saveInstallPrefs, } from "./install-prefs.js";
|
|
4
|
+
import { findProjectCopies } from "./install-skills.js";
|
|
5
|
+
import { chooseMany, chooseOne, confirm, defaultStreams, isInteractive, } from "./prompt.js";
|
|
6
|
+
import { ALL_TARGETS, detectTargets, } from "./skill-roots.js";
|
|
7
|
+
/**
|
|
8
|
+
* Rebuild a run's skill options as an `install` argv, so `setup` can hand off
|
|
9
|
+
* to the CLI it just installed rather than continuing in its own process —
|
|
10
|
+
* where the code in memory predates the files on disk.
|
|
11
|
+
*
|
|
12
|
+
* Every option must survive the round trip. Dropping `--scope` here would
|
|
13
|
+
* silently install to a different root than the user asked for, which is the
|
|
14
|
+
* exact class of failure this handoff exists to prevent.
|
|
15
|
+
*/
|
|
16
|
+
export function installArgv(options, pruneCameFromCli) {
|
|
17
|
+
const argv = ["install", "--cwd", options.cwd];
|
|
18
|
+
if (options.targets !== undefined)
|
|
19
|
+
argv.push("--targets", options.targets);
|
|
20
|
+
if (options.scope !== undefined)
|
|
21
|
+
argv.push("--scope", options.scope);
|
|
22
|
+
for (const override of options.root)
|
|
23
|
+
argv.push("--root", override);
|
|
24
|
+
if (options.force)
|
|
25
|
+
argv.push("--force");
|
|
26
|
+
if (options.yes)
|
|
27
|
+
argv.push("--yes");
|
|
28
|
+
// Commander gives --prune a value either way, so only forward a real one.
|
|
29
|
+
if (pruneCameFromCli)
|
|
30
|
+
argv.push(options.prune ? "--prune" : "--no-prune");
|
|
31
|
+
return argv;
|
|
32
|
+
}
|
|
33
|
+
export function scopesFor(scope) {
|
|
34
|
+
if (scope === "both")
|
|
35
|
+
return ["user", "project"];
|
|
36
|
+
return [scope];
|
|
37
|
+
}
|
|
38
|
+
function describeScope(scopes) {
|
|
39
|
+
return scopes.length === 2 ? "user and project" : (scopes[0] ?? "project");
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Decide what to install and where. Interactive only when a human is on both
|
|
43
|
+
* ends of the terminal and has not already answered on the command line;
|
|
44
|
+
* every other path resolves silently from detection and saved preferences.
|
|
45
|
+
*/
|
|
46
|
+
export async function planSkillInstall(options) {
|
|
47
|
+
const env = options.env ?? process.env;
|
|
48
|
+
const home = resolve(options.home ?? homedir());
|
|
49
|
+
const streams = options.streams ?? defaultStreams();
|
|
50
|
+
const log = options.log ?? ((line) => console.log(line));
|
|
51
|
+
const detected = await detectTargets({
|
|
52
|
+
home,
|
|
53
|
+
env,
|
|
54
|
+
...(options.roots ? { roots: options.roots } : {}),
|
|
55
|
+
});
|
|
56
|
+
const present = detected.filter((entry) => entry.detected);
|
|
57
|
+
// With nothing detected — a fresh container, an unusual layout — installing
|
|
58
|
+
// everything is the old behavior and beats a silent no-op.
|
|
59
|
+
const fallbackTargets = present.length > 0 ? present.map((entry) => entry.target) : [...ALL_TARGETS];
|
|
60
|
+
const prefs = await loadInstallPrefs(home);
|
|
61
|
+
const interactive = !options.explicitTargets &&
|
|
62
|
+
!options.yes &&
|
|
63
|
+
isInteractive(streams, env);
|
|
64
|
+
if (!interactive) {
|
|
65
|
+
const targets = options.explicitTargets ?? prefs?.targets ?? fallbackTargets;
|
|
66
|
+
const scopes = scopesFor(options.explicitScope ?? prefs?.scope ?? "user");
|
|
67
|
+
if (!options.explicitTargets) {
|
|
68
|
+
const source = prefs ? "saved preferences" : "detected tools";
|
|
69
|
+
log(`installing to ${targets.join(", ")} at ${describeScope(scopes)} scope ` +
|
|
70
|
+
`(non-interactive, from ${source}; pass --targets or --scope to override)`);
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
targets,
|
|
74
|
+
scopes,
|
|
75
|
+
pruneProject: options.explicitPrune ?? false,
|
|
76
|
+
cancelled: false,
|
|
77
|
+
detected,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const chosen = await chooseMany({
|
|
81
|
+
title: "Where should the workflow skills go?",
|
|
82
|
+
choices: detected.map((entry) => ({
|
|
83
|
+
value: entry.target,
|
|
84
|
+
label: entry.label,
|
|
85
|
+
hint: entry.detected
|
|
86
|
+
? entry.userRoot
|
|
87
|
+
: `${entry.userRoot} (not detected)`,
|
|
88
|
+
})),
|
|
89
|
+
initial: prefs?.targets ?? fallbackTargets,
|
|
90
|
+
streams,
|
|
91
|
+
env,
|
|
92
|
+
});
|
|
93
|
+
if (!chosen)
|
|
94
|
+
return emptyPlan(detected);
|
|
95
|
+
if (chosen.length === 0) {
|
|
96
|
+
log("no targets selected; nothing to install");
|
|
97
|
+
return emptyPlan(detected);
|
|
98
|
+
}
|
|
99
|
+
let scope = options.explicitScope;
|
|
100
|
+
if (!scope) {
|
|
101
|
+
const picked = await chooseOne({
|
|
102
|
+
title: "Install for this machine or just this project?",
|
|
103
|
+
choices: [
|
|
104
|
+
{
|
|
105
|
+
value: "user",
|
|
106
|
+
label: "This machine",
|
|
107
|
+
hint: "one update covers every repository",
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
value: "project",
|
|
111
|
+
label: "This project",
|
|
112
|
+
hint: "checked into the repo, pinned per project",
|
|
113
|
+
},
|
|
114
|
+
{ value: "both", label: "Both", hint: "project copies shadow machine ones" },
|
|
115
|
+
],
|
|
116
|
+
initial: prefs?.scope ?? "user",
|
|
117
|
+
streams,
|
|
118
|
+
env,
|
|
119
|
+
});
|
|
120
|
+
if (!picked)
|
|
121
|
+
return emptyPlan(detected);
|
|
122
|
+
scope = picked;
|
|
123
|
+
}
|
|
124
|
+
const scopes = scopesFor(scope);
|
|
125
|
+
let pruneProject = options.explicitPrune ?? false;
|
|
126
|
+
// Only worth asking when project copies would shadow what we just installed.
|
|
127
|
+
if (options.explicitPrune === undefined &&
|
|
128
|
+
scopes.includes("user") &&
|
|
129
|
+
!scopes.includes("project")) {
|
|
130
|
+
const copies = await findProjectCopies(options.cwd, chosen, {
|
|
131
|
+
home,
|
|
132
|
+
env,
|
|
133
|
+
...(options.roots ? { roots: options.roots } : {}),
|
|
134
|
+
});
|
|
135
|
+
if (copies.managed.length > 0) {
|
|
136
|
+
const answer = await confirm({
|
|
137
|
+
title: `Found ${copies.managed.length} project-scope skill file(s) in this repo. ` +
|
|
138
|
+
"They shadow the machine-wide ones. Remove them?",
|
|
139
|
+
initial: true,
|
|
140
|
+
streams,
|
|
141
|
+
env,
|
|
142
|
+
});
|
|
143
|
+
if (answer === undefined)
|
|
144
|
+
return emptyPlan(detected);
|
|
145
|
+
pruneProject = answer;
|
|
146
|
+
}
|
|
147
|
+
if (copies.modified.length > 0) {
|
|
148
|
+
log(`note ${copies.modified.length} edited project-scope skill file(s) will be left in place and keep shadowing:`);
|
|
149
|
+
for (const path of copies.modified)
|
|
150
|
+
log(` ${path}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const savedTo = await saveInstallPrefs({ targets: chosen, scope }, home);
|
|
154
|
+
log(`saved install preferences to ${savedTo}`);
|
|
155
|
+
return { targets: chosen, scopes, pruneProject, cancelled: false, detected };
|
|
156
|
+
}
|
|
157
|
+
function emptyPlan(detected) {
|
|
158
|
+
return {
|
|
159
|
+
targets: [],
|
|
160
|
+
scopes: [],
|
|
161
|
+
pruneProject: false,
|
|
162
|
+
cancelled: true,
|
|
163
|
+
detected,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=install-wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-wizard.js","sourceRoot":"","sources":["../src/install-wizard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-assets.d.ts","sourceRoot":"","sources":["../src/package-assets.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,YAAY,QAGxB,CAAC;AAMF,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAKtD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
export const PACKAGE_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
6
|
+
const packageMetadataSchema = z.object({
|
|
7
|
+
version: z.string().min(1),
|
|
8
|
+
});
|
|
9
|
+
export async function packageVersion() {
|
|
10
|
+
const metadata = JSON.parse(await readFile(resolve(PACKAGE_ROOT, "package.json"), "utf8"));
|
|
11
|
+
return packageMetadataSchema.parse(metadata).version;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=package-assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-assets.js","sourceRoot":"","sources":["../src/package-assets.ts"],"names":[],"mappings":"AAAA,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,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CACjC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EACvC,IAAI,CACL,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,QAAQ,GAAY,IAAI,CAAC,KAAK,CAClC,MAAM,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAC9D,CAAC;IACF,OAAO,qBAAqB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;AACvD,CAAC"}
|
|
@@ -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"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { access } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
const SPECS = [
|
|
5
|
+
{
|
|
6
|
+
target: "claude",
|
|
7
|
+
label: "Claude Code",
|
|
8
|
+
configDir: ".claude",
|
|
9
|
+
homeEnv: "CLAUDE_CONFIG_DIR",
|
|
10
|
+
userSkills: (configHome) => join(configHome, "skills"),
|
|
11
|
+
projectSkills: join(".claude", "skills"),
|
|
12
|
+
extraScan: ({ home, projectRoot }) => [
|
|
13
|
+
{ kind: "command", scope: "project", root: join(projectRoot, ".claude", "commands") },
|
|
14
|
+
{ kind: "command", scope: "user", root: join(home, ".claude", "commands") },
|
|
15
|
+
],
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
target: "cursor",
|
|
19
|
+
label: "Cursor",
|
|
20
|
+
configDir: ".cursor",
|
|
21
|
+
userSkills: (configHome) => join(configHome, "skills"),
|
|
22
|
+
projectSkills: join(".cursor", "skills"),
|
|
23
|
+
// Cursor also reads the cross-tool .agents tree and Claude's skills dir,
|
|
24
|
+
// so a definition in either shadows what we install.
|
|
25
|
+
extraScan: ({ home, projectRoot }) => [
|
|
26
|
+
{ kind: "command", scope: "project", root: join(projectRoot, ".cursor", "commands") },
|
|
27
|
+
{ kind: "command", scope: "user", root: join(home, ".cursor", "commands") },
|
|
28
|
+
{ kind: "skill", scope: "project", root: join(projectRoot, ".agents", "skills") },
|
|
29
|
+
{ kind: "skill", scope: "project", root: join(projectRoot, ".claude", "skills") },
|
|
30
|
+
{ kind: "skill", scope: "user", root: join(home, ".agents", "skills") },
|
|
31
|
+
{ kind: "skill", scope: "user", root: join(home, ".claude", "skills") },
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
target: "codex",
|
|
36
|
+
label: "Codex",
|
|
37
|
+
configDir: ".codex",
|
|
38
|
+
homeEnv: "CODEX_HOME",
|
|
39
|
+
// Codex discovers skills in the cross-tool .agents directory, which does
|
|
40
|
+
// not move with CODEX_HOME — so detection and the write root diverge here
|
|
41
|
+
// on purpose.
|
|
42
|
+
userSkills: (_configHome, home) => join(home, ".agents", "skills"),
|
|
43
|
+
projectSkills: join(".agents", "skills"),
|
|
44
|
+
extraScan: ({ configHome }) => [
|
|
45
|
+
{ kind: "skill", scope: "user", root: join(configHome, "skills") },
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
target: "gemini",
|
|
50
|
+
label: "Gemini CLI",
|
|
51
|
+
configDir: ".gemini",
|
|
52
|
+
userSkills: (configHome) => join(configHome, "skills"),
|
|
53
|
+
projectSkills: join(".gemini", "skills"),
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
target: "openclaw",
|
|
57
|
+
label: "OpenClaw",
|
|
58
|
+
configDir: ".openclaw",
|
|
59
|
+
userSkills: (configHome) => join(configHome, "skills"),
|
|
60
|
+
projectSkills: "skills",
|
|
61
|
+
extraScan: ({ configHome }) => [
|
|
62
|
+
{ kind: "skill", scope: "user", root: join(configHome, "workspace", "skills") },
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
export const ALL_TARGETS = SPECS.map((spec) => spec.target);
|
|
67
|
+
export const DEFAULT_TARGETS = ALL_TARGETS.join(",");
|
|
68
|
+
export async function pathExists(path) {
|
|
69
|
+
try {
|
|
70
|
+
await access(path);
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/** The escape hatch for a layout this package does not know about. */
|
|
78
|
+
export function overrideEnvName(target) {
|
|
79
|
+
return `NIGHTSHIFT_SKILLS_ROOT_${target.toUpperCase()}`;
|
|
80
|
+
}
|
|
81
|
+
export function parseTargets(value) {
|
|
82
|
+
const values = value
|
|
83
|
+
.split(",")
|
|
84
|
+
.map((target) => target.trim().toLowerCase())
|
|
85
|
+
.filter(Boolean);
|
|
86
|
+
const invalid = values.filter((target) => !ALL_TARGETS.includes(target));
|
|
87
|
+
if (invalid.length > 0) {
|
|
88
|
+
throw new Error(`Unknown target(s): ${invalid.join(", ")}. Expected: ${ALL_TARGETS.join(", ")}.`);
|
|
89
|
+
}
|
|
90
|
+
return [...new Set(values)];
|
|
91
|
+
}
|
|
92
|
+
/** `--root claude=/path` entries into a per-target override map. */
|
|
93
|
+
export function parseRootOverrides(entries) {
|
|
94
|
+
const overrides = {};
|
|
95
|
+
for (const entry of entries) {
|
|
96
|
+
const separator = entry.indexOf("=");
|
|
97
|
+
if (separator < 1) {
|
|
98
|
+
throw new Error(`Invalid --root "${entry}"; expected <target>=<path>, e.g. claude=/opt/claude/skills.`);
|
|
99
|
+
}
|
|
100
|
+
const [target] = parseTargets(entry.slice(0, separator));
|
|
101
|
+
const path = entry.slice(separator + 1).trim();
|
|
102
|
+
if (!target || !path) {
|
|
103
|
+
throw new Error(`Invalid --root "${entry}"; expected <target>=<path>, e.g. claude=/opt/claude/skills.`);
|
|
104
|
+
}
|
|
105
|
+
overrides[target] = resolve(path);
|
|
106
|
+
}
|
|
107
|
+
return overrides;
|
|
108
|
+
}
|
|
109
|
+
function configHomeFor(spec, home, env) {
|
|
110
|
+
const override = spec.homeEnv ? env[spec.homeEnv]?.trim() : undefined;
|
|
111
|
+
return override ? resolve(override) : join(home, spec.configDir);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Resolve every target's roots and report which tools are actually present.
|
|
115
|
+
* Detection is what keeps an install from creating config directories for
|
|
116
|
+
* tools the developer does not use.
|
|
117
|
+
*/
|
|
118
|
+
export async function detectTargets(context = {}) {
|
|
119
|
+
const env = context.env ?? process.env;
|
|
120
|
+
const home = resolve(context.home ?? homedir());
|
|
121
|
+
return Promise.all(SPECS.map(async (spec) => {
|
|
122
|
+
const configHome = configHomeFor(spec, home, env);
|
|
123
|
+
const flag = context.roots?.[spec.target];
|
|
124
|
+
const envOverride = env[overrideEnvName(spec.target)]?.trim();
|
|
125
|
+
let userRoot;
|
|
126
|
+
let source;
|
|
127
|
+
if (flag) {
|
|
128
|
+
userRoot = resolve(flag);
|
|
129
|
+
source = "flag";
|
|
130
|
+
}
|
|
131
|
+
else if (envOverride) {
|
|
132
|
+
userRoot = resolve(envOverride);
|
|
133
|
+
source = "env";
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
userRoot = spec.userSkills(configHome, home);
|
|
137
|
+
// The tool's own home variable only counts as the source when it
|
|
138
|
+
// actually moved the skills root; for Codex it moves detection only.
|
|
139
|
+
const fromDefaultHome = spec.userSkills(join(home, spec.configDir), home);
|
|
140
|
+
source = userRoot === fromDefaultHome ? "default" : "env";
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
target: spec.target,
|
|
144
|
+
label: spec.label,
|
|
145
|
+
userRoot,
|
|
146
|
+
projectRoot: spec.projectSkills,
|
|
147
|
+
configHome,
|
|
148
|
+
detected: await pathExists(configHome),
|
|
149
|
+
source,
|
|
150
|
+
};
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Every root worth scanning for a competing definition of a workflow: each
|
|
155
|
+
* target's own skills roots at both scopes, plus the command directories and
|
|
156
|
+
* cross-tool trees that shadow them.
|
|
157
|
+
*/
|
|
158
|
+
export function scanRoots(detected, projectRoot, home) {
|
|
159
|
+
const roots = [];
|
|
160
|
+
const byTarget = new Map(detected.map((entry) => [entry.target, entry]));
|
|
161
|
+
for (const spec of SPECS) {
|
|
162
|
+
const entry = byTarget.get(spec.target);
|
|
163
|
+
if (!entry)
|
|
164
|
+
continue;
|
|
165
|
+
roots.push({
|
|
166
|
+
target: spec.target,
|
|
167
|
+
kind: "skill",
|
|
168
|
+
scope: "project",
|
|
169
|
+
root: join(projectRoot, entry.projectRoot),
|
|
170
|
+
}, { target: spec.target, kind: "skill", scope: "user", root: entry.userRoot });
|
|
171
|
+
for (const extra of spec.extraScan?.({
|
|
172
|
+
home,
|
|
173
|
+
projectRoot,
|
|
174
|
+
configHome: entry.configHome,
|
|
175
|
+
}) ?? []) {
|
|
176
|
+
roots.push({ target: spec.target, ...extra });
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return roots;
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=skill-roots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-roots.js","sourceRoot":"","sources":["../src/skill-roots.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wildorder/nightshift",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "The crew that builds while you're gone: walk-away, CI-dispatched engineering programs with a decision ledger instead of gates",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -20,6 +20,8 @@
|
|
|
20
20
|
},
|
|
21
21
|
"files": [
|
|
22
22
|
"dist",
|
|
23
|
+
"skills",
|
|
24
|
+
"templates",
|
|
23
25
|
"README.md",
|
|
24
26
|
"LICENSE"
|
|
25
27
|
],
|