@captain_z/zsk 1.4.3 → 1.6.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/README.md +64 -17
- package/dist/bin.js +174 -1
- package/dist/bin.js.map +1 -1
- package/dist/commands/add-flow.d.ts +1 -1
- package/dist/commands/add-flow.js +4 -9
- package/dist/commands/add-flow.js.map +1 -1
- package/dist/commands/add.d.ts +1 -0
- package/dist/commands/add.js +55 -11
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/check.js +10 -2
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/demo.d.ts +31 -0
- package/dist/commands/demo.js +533 -0
- package/dist/commands/demo.js.map +1 -0
- package/dist/commands/issue.d.ts +8 -0
- package/dist/commands/issue.js +170 -6
- package/dist/commands/issue.js.map +1 -1
- package/dist/commands/module.js +23 -2
- package/dist/commands/module.js.map +1 -1
- package/dist/commands/project-init.js +1 -0
- package/dist/commands/project-init.js.map +1 -1
- package/dist/commands/remove.js +5 -7
- package/dist/commands/remove.js.map +1 -1
- package/dist/core/config.d.ts +14 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/installer.d.ts +5 -0
- package/dist/core/installer.js +105 -6
- package/dist/core/installer.js.map +1 -1
- package/dist/core/manifest.d.ts +8 -3
- package/dist/core/manifest.js +27 -18
- package/dist/core/manifest.js.map +1 -1
- package/dist/core/skills.d.ts +3 -4
- package/dist/core/skills.js +34 -43
- package/dist/core/skills.js.map +1 -1
- package/dist/core/targets.js +1 -1
- package/dist/core/targets.js.map +1 -1
- package/package.json +2 -2
- package/schemas/module.schema.json +1 -1
- package/schemas/zsk-config.schema.json +122 -2
- package/templates/issue/default/assets/index.md +6 -0
- package/templates/issue/default/debug-logs/index.md +6 -0
- package/templates/issue/default/issue.md +35 -2
- package/templates/module/frontend-module/acceptance.md +18 -0
- package/templates/module/frontend-module/archive.md +17 -0
- package/templates/module/frontend-module/commit.md +15 -0
- package/templates/module/frontend-module/demo-outline.md +59 -0
- package/templates/module/frontend-module/demo-report.md +23 -0
- package/templates/module/frontend-module/deploy.md +18 -0
- package/templates/module/frontend-module/design.md +12 -0
- package/templates/module/frontend-module/module.yaml +4 -1
- package/templates/module/frontend-module/proposal.md +7 -0
- package/templates/module/frontend-module/ready.md +12 -0
- package/templates/module/frontend-module/review.md +12 -0
- package/templates/module/frontend-module/scenarios/index.md +21 -0
- package/templates/module/frontend-module/scenarios/p0-happy-path.spec.ts +13 -0
- package/templates/module/frontend-module/smoke.md +21 -0
- package/templates/module/frontend-module/spec.md +14 -0
- package/templates/module/frontend-module/tasks.md +13 -0
- package/templates/module/frontend-module/verify.md +12 -0
- package/templates/project-init/.issues/README.md +17 -1
- package/templates/project-init/.issues/_taxonomy.md +35 -0
- package/templates/project-init/.issues/index.md +7 -0
- package/templates/project-init/.raws/README.md +2 -1
- package/templates/project-init/.raws/backend-repositories/index.md +12 -0
- package/templates/project-init/.raws/index.md +3 -0
- package/templates/project-init/.raws/issues/index.md +4 -0
- package/templates/project-init/.zsk/checkpoints/index.md +4 -0
- package/templates/project-init/.zsk/config.yaml +56 -1
- package/templates/project-init/.zsk/learning/index.md +14 -0
- package/templates/project-init/.zsk/learning/proposals/.gitkeep +1 -0
- package/templates/project-init/.zsk/resource-manifest.json +55 -0
- package/templates/project-init/.zsk/workflow-state.json +6 -0
- package/templates/project-init/docs/_module-index.md +9 -1
- package/templates/project-init/project-config.md +5 -3
package/dist/core/installer.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// Install engine: staging → rename + conflict resolution + backup.
|
|
2
|
-
import { mkdir, copyFile, rm, rename, readdir, access, } from "node:fs/promises";
|
|
2
|
+
import { mkdir, cp, copyFile, rm, rename, readdir, access, lstat, readFile, writeFile, } from "node:fs/promises";
|
|
3
3
|
import { dirname, join, relative } from "node:path";
|
|
4
4
|
import { loadSkill } from "./skills.js";
|
|
5
5
|
export async function install(plan) {
|
|
6
|
+
const layout = plan.layout ?? "flat";
|
|
6
7
|
const result = {
|
|
7
8
|
written: [],
|
|
8
9
|
skipped: [],
|
|
@@ -18,7 +19,7 @@ export async function install(plan) {
|
|
|
18
19
|
for (const skillName of plan.skills) {
|
|
19
20
|
try {
|
|
20
21
|
const skill = await loadSkill(skillName);
|
|
21
|
-
const dst =
|
|
22
|
+
const dst = join(plan.target, skillRelPath(skill, layout));
|
|
22
23
|
result.written.push(dst);
|
|
23
24
|
}
|
|
24
25
|
catch (err) {
|
|
@@ -37,9 +38,15 @@ export async function install(plan) {
|
|
|
37
38
|
for (const skillName of plan.skills) {
|
|
38
39
|
try {
|
|
39
40
|
const skill = await loadSkill(skillName);
|
|
40
|
-
const stagingDst =
|
|
41
|
+
const stagingDst = join(stagingDir, skillRelPath(skill, layout));
|
|
41
42
|
await mkdir(dirname(stagingDst), { recursive: true });
|
|
42
|
-
|
|
43
|
+
if (layout === "claude-plugin") {
|
|
44
|
+
await copySkillDirectory(skill, dirname(stagingDst));
|
|
45
|
+
await writeFile(stagingDst, await toClaudePluginSkill(skill), "utf8");
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
await copySkillDirectory(skill, dirname(stagingDst));
|
|
49
|
+
}
|
|
43
50
|
}
|
|
44
51
|
catch (err) {
|
|
45
52
|
result.errors.push({
|
|
@@ -48,6 +55,9 @@ export async function install(plan) {
|
|
|
48
55
|
});
|
|
49
56
|
}
|
|
50
57
|
}
|
|
58
|
+
if (layout === "claude-plugin") {
|
|
59
|
+
await stageClaudePluginFiles(stagingDir, plan.skills, plan.zskVersion ?? "0.0.0");
|
|
60
|
+
}
|
|
51
61
|
// Commit staging → target, handling conflicts per skill file
|
|
52
62
|
await commitStaging(stagingDir, plan.target, plan.onConflict, backupDir, result);
|
|
53
63
|
}
|
|
@@ -56,17 +66,61 @@ export async function install(plan) {
|
|
|
56
66
|
}
|
|
57
67
|
return result;
|
|
58
68
|
}
|
|
59
|
-
function
|
|
69
|
+
async function copySkillDirectory(skill, dstDir) {
|
|
70
|
+
await rm(dstDir, { recursive: true, force: true });
|
|
71
|
+
await mkdir(dstDir, { recursive: true });
|
|
72
|
+
await cp(dirname(skill.file), dstDir, { recursive: true, force: true });
|
|
73
|
+
}
|
|
74
|
+
export function skillRelPath(skill, layout = "flat") {
|
|
75
|
+
if (layout === "claude-plugin") {
|
|
76
|
+
return join("skills", skill.slug, "SKILL.md");
|
|
77
|
+
}
|
|
60
78
|
// Flat layout: <target>/zsk-<slug>/SKILL.md
|
|
61
79
|
// Claude / Codex scan `<root>/<dir>/SKILL.md` one level deep; nested
|
|
62
80
|
// <domain>/<slug>/ would be skipped. `zsk-` prefix namespaces against
|
|
63
81
|
// existing flat skills (archive / coding / design / reviewing etc).
|
|
64
|
-
return join(
|
|
82
|
+
return join(`zsk-${skill.slug}`, "SKILL.md");
|
|
83
|
+
}
|
|
84
|
+
async function toClaudePluginSkill(skill) {
|
|
85
|
+
const raw = await readFile(skill.file, "utf8");
|
|
86
|
+
// Package-installed skills are namespaced as zsk:<slug>. Claude plugin
|
|
87
|
+
// skills should keep the bare slug so slash commands resolve as /zsk:<slug>.
|
|
88
|
+
return raw.replace(/^name:\s+zsk:([a-z0-9-]+)\s*$/m, `name: ${skill.slug}`);
|
|
89
|
+
}
|
|
90
|
+
async function stageClaudePluginFiles(stagingDir, skillNames, zskVersion) {
|
|
91
|
+
const pluginDir = join(stagingDir, ".claude-plugin");
|
|
92
|
+
await mkdir(pluginDir, { recursive: true });
|
|
93
|
+
await writeFile(join(pluginDir, "plugin.json"), `${JSON.stringify({
|
|
94
|
+
name: "zsk",
|
|
95
|
+
version: zskVersion,
|
|
96
|
+
description: "ZNorth Standard Kit harness-first delivery workflow skills",
|
|
97
|
+
author: {
|
|
98
|
+
name: "codeshareman",
|
|
99
|
+
},
|
|
100
|
+
}, null, 2)}\n`, "utf8");
|
|
101
|
+
for (const name of skillNames) {
|
|
102
|
+
const skill = await loadSkill(name);
|
|
103
|
+
const commandFile = join(stagingDir, "commands", `${skill.slug}.md`);
|
|
104
|
+
await mkdir(dirname(commandFile), { recursive: true });
|
|
105
|
+
await writeFile(commandFile, [
|
|
106
|
+
"---",
|
|
107
|
+
`description: Run the ZSK ${skill.slug} workflow skill`,
|
|
108
|
+
"---",
|
|
109
|
+
"",
|
|
110
|
+
`Use the bundled \`${skill.slug}\` skill from this zsk Claude plugin for the current request.`,
|
|
111
|
+
"Load its SKILL.md instructions, enforce the installed harness contract, and report evidence before claiming completion.",
|
|
112
|
+
"",
|
|
113
|
+
].join("\n"), "utf8");
|
|
114
|
+
}
|
|
65
115
|
}
|
|
66
116
|
async function commitStaging(stagingDir, target, onConflict, backupDir, result) {
|
|
117
|
+
const handledRoots = await replaceSymlinkRoots(stagingDir, target, onConflict, backupDir, result);
|
|
67
118
|
const files = await walk(stagingDir);
|
|
68
119
|
for (const src of files) {
|
|
69
120
|
const rel = relative(stagingDir, src);
|
|
121
|
+
const [root] = rel.split(/[\\/]/);
|
|
122
|
+
if (root && handledRoots.has(root))
|
|
123
|
+
continue;
|
|
70
124
|
const dst = join(target, rel);
|
|
71
125
|
const exists = await fileExists(dst);
|
|
72
126
|
if (exists) {
|
|
@@ -88,6 +142,45 @@ async function commitStaging(stagingDir, target, onConflict, backupDir, result)
|
|
|
88
142
|
result.written.push(dst);
|
|
89
143
|
}
|
|
90
144
|
}
|
|
145
|
+
async function replaceSymlinkRoots(stagingDir, target, onConflict, backupDir, result) {
|
|
146
|
+
const handled = new Set();
|
|
147
|
+
const entries = await readdir(stagingDir, { withFileTypes: true });
|
|
148
|
+
for (const entry of entries) {
|
|
149
|
+
const src = join(stagingDir, entry.name);
|
|
150
|
+
const dst = join(target, entry.name);
|
|
151
|
+
if (!(await isSymlink(dst)))
|
|
152
|
+
continue;
|
|
153
|
+
if (onConflict === "skip") {
|
|
154
|
+
result.skipped.push(dst);
|
|
155
|
+
handled.add(entry.name);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
if (onConflict === "backup") {
|
|
159
|
+
const backupPath = join(backupDir, entry.name);
|
|
160
|
+
await mkdir(dirname(backupPath), { recursive: true });
|
|
161
|
+
await rename(dst, backupPath);
|
|
162
|
+
result.backedUp.push(backupPath);
|
|
163
|
+
result.backupDir = backupDir;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
await rm(dst, { recursive: true, force: true });
|
|
167
|
+
}
|
|
168
|
+
await mkdir(dirname(dst), { recursive: true });
|
|
169
|
+
await cp(src, dst, { recursive: true, force: true });
|
|
170
|
+
for (const written of await walkEntry(dst))
|
|
171
|
+
result.written.push(written);
|
|
172
|
+
handled.add(entry.name);
|
|
173
|
+
}
|
|
174
|
+
return handled;
|
|
175
|
+
}
|
|
176
|
+
async function isSymlink(p) {
|
|
177
|
+
try {
|
|
178
|
+
return (await lstat(p)).isSymbolicLink();
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
91
184
|
async function fileExists(p) {
|
|
92
185
|
try {
|
|
93
186
|
await access(p);
|
|
@@ -111,4 +204,10 @@ async function walk(dir) {
|
|
|
111
204
|
}
|
|
112
205
|
return out;
|
|
113
206
|
}
|
|
207
|
+
async function walkEntry(path) {
|
|
208
|
+
const stat = await lstat(path);
|
|
209
|
+
if (!stat.isDirectory())
|
|
210
|
+
return [path];
|
|
211
|
+
return walk(path);
|
|
212
|
+
}
|
|
114
213
|
//# sourceMappingURL=installer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/core/installer.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAEnE,OAAO,EACL,KAAK,EACL,QAAQ,EACR,EAAE,EACF,MAAM,EACN,OAAO,EACP,MAAM,
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/core/installer.ts"],"names":[],"mappings":"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"}
|
package/dist/core/manifest.d.ts
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
export declare const MANIFEST_FILENAME = "zsk-manifest.json";
|
|
2
2
|
export declare const MANIFEST_SCHEMA_VERSION = 1;
|
|
3
|
+
export type ManifestFile = {
|
|
4
|
+
relPath: string;
|
|
5
|
+
sha256: string;
|
|
6
|
+
};
|
|
3
7
|
export type ManifestSkill = {
|
|
4
8
|
name: string;
|
|
5
9
|
version: string;
|
|
6
10
|
sha256: string;
|
|
7
11
|
relPath: string;
|
|
12
|
+
files?: ManifestFile[];
|
|
8
13
|
};
|
|
9
14
|
export type Manifest = {
|
|
10
15
|
$schema: string;
|
|
@@ -31,9 +36,9 @@ export declare function buildManifest(params: {
|
|
|
31
36
|
/**
|
|
32
37
|
* Compare manifest-recorded skills against on-disk files.
|
|
33
38
|
* Returns per-skill drift classification:
|
|
34
|
-
* clean —
|
|
35
|
-
* modified — file exists but sha256 differs (hand-edited)
|
|
36
|
-
* missing — file removed
|
|
39
|
+
* clean — all owned files match manifest sha256 values
|
|
40
|
+
* modified — any owned file exists but sha256 differs (hand-edited)
|
|
41
|
+
* missing — any owned file was removed
|
|
37
42
|
*/
|
|
38
43
|
export declare function detectDrift(target: string, manifest: Manifest): Promise<DriftEntry[]>;
|
|
39
44
|
export declare function hasManifest(target: string): Promise<boolean>;
|
package/dist/core/manifest.js
CHANGED
|
@@ -44,31 +44,40 @@ export function buildManifest(params) {
|
|
|
44
44
|
/**
|
|
45
45
|
* Compare manifest-recorded skills against on-disk files.
|
|
46
46
|
* Returns per-skill drift classification:
|
|
47
|
-
* clean —
|
|
48
|
-
* modified — file exists but sha256 differs (hand-edited)
|
|
49
|
-
* missing — file removed
|
|
47
|
+
* clean — all owned files match manifest sha256 values
|
|
48
|
+
* modified — any owned file exists but sha256 differs (hand-edited)
|
|
49
|
+
* missing — any owned file was removed
|
|
50
50
|
*/
|
|
51
51
|
export async function detectDrift(target, manifest) {
|
|
52
52
|
const out = [];
|
|
53
53
|
for (const s of manifest.skills) {
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
out.push({ name: s.name, relPath: s.relPath, kind: "missing" });
|
|
54
|
+
const files = s.files?.length
|
|
55
|
+
? s.files
|
|
56
|
+
: [{ relPath: s.relPath, sha256: s.sha256 }];
|
|
57
|
+
let missing = false;
|
|
58
|
+
let modified = false;
|
|
59
|
+
for (const file of files) {
|
|
60
|
+
const p = join(target, file.relPath);
|
|
61
|
+
try {
|
|
62
|
+
const buf = await readFile(p);
|
|
63
|
+
const digest = sha256File(buf);
|
|
64
|
+
if (digest !== file.sha256)
|
|
65
|
+
modified = true;
|
|
67
66
|
}
|
|
68
|
-
|
|
69
|
-
|
|
67
|
+
catch (err) {
|
|
68
|
+
if (isENOENT(err)) {
|
|
69
|
+
missing = true;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
throw err;
|
|
73
|
+
}
|
|
70
74
|
}
|
|
71
75
|
}
|
|
76
|
+
out.push({
|
|
77
|
+
name: s.name,
|
|
78
|
+
relPath: s.relPath,
|
|
79
|
+
kind: missing ? "missing" : modified ? "modified" : "clean",
|
|
80
|
+
});
|
|
72
81
|
}
|
|
73
82
|
return out;
|
|
74
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,EAAE;AACF,8EAA8E;AAC9E,gFAAgF;AAEhF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AACrD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"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"}
|
package/dist/core/skills.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
declare const DOMAINS: readonly ["
|
|
1
|
+
declare const DOMAINS: readonly ["core"];
|
|
2
2
|
export type Domain = (typeof DOMAINS)[number];
|
|
3
3
|
export type Skill = {
|
|
4
4
|
name: string;
|
|
@@ -9,9 +9,8 @@ export type Skill = {
|
|
|
9
9
|
export declare function resolveSkillsRoot(): Promise<string>;
|
|
10
10
|
export declare function loadSkill(skillName: string): Promise<Skill>;
|
|
11
11
|
/**
|
|
12
|
-
* Enumerate every installable skill by walking the skills root directly.
|
|
13
|
-
* Returns names in `zsk:<slug>` form, sorted by
|
|
14
|
-
* groupings are stable across runs.
|
|
12
|
+
* Enumerate every installable core skill by walking the skills root directly.
|
|
13
|
+
* Returns names in `zsk:<slug>` form, sorted by slug.
|
|
15
14
|
*/
|
|
16
15
|
export declare function enumerateSkills(): Promise<Skill[]>;
|
|
17
16
|
export { DOMAINS };
|
package/dist/core/skills.js
CHANGED
|
@@ -1,19 +1,12 @@
|
|
|
1
|
-
// Skill resolution: zsk:<slug> → filesystem SKILL.md path +
|
|
1
|
+
// Skill resolution: zsk:<slug> → filesystem SKILL.md path + install metadata.
|
|
2
2
|
//
|
|
3
3
|
// Dev (monorepo): resolves via ../../../../capabilities/skills/
|
|
4
|
-
// Production: resolves via @captain_z/zsk-skills
|
|
4
|
+
// Production: resolves via @captain_z/zsk-skills package root
|
|
5
5
|
import { access, readdir } from "node:fs/promises";
|
|
6
6
|
import { dirname, resolve } from "node:path";
|
|
7
7
|
import { fileURLToPath } from "node:url";
|
|
8
8
|
import { createRequire } from "node:module";
|
|
9
|
-
const DOMAINS = [
|
|
10
|
-
"sdlc",
|
|
11
|
-
"frontend",
|
|
12
|
-
"quality",
|
|
13
|
-
"design-handoff",
|
|
14
|
-
"system",
|
|
15
|
-
"meta",
|
|
16
|
-
];
|
|
9
|
+
const DOMAINS = ["core"];
|
|
17
10
|
let skillsRootCache = null;
|
|
18
11
|
export async function resolveSkillsRoot() {
|
|
19
12
|
if (skillsRootCache)
|
|
@@ -29,7 +22,7 @@ export async function resolveSkillsRoot() {
|
|
|
29
22
|
catch {
|
|
30
23
|
// fall through
|
|
31
24
|
}
|
|
32
|
-
// Production: @captain_z/zsk-skills package
|
|
25
|
+
// Production: @captain_z/zsk-skills package ships skill dirs at package root.
|
|
33
26
|
const require = createRequire(import.meta.url);
|
|
34
27
|
const pkgPath = require.resolve("@captain_z/zsk-skills/package.json");
|
|
35
28
|
const skillsDir = dirname(pkgPath);
|
|
@@ -39,50 +32,48 @@ export async function resolveSkillsRoot() {
|
|
|
39
32
|
export async function loadSkill(skillName) {
|
|
40
33
|
const slug = skillName.replace(/^zsk:/, "");
|
|
41
34
|
const root = await resolveSkillsRoot();
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
return { name: skillName, domain, slug, file };
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
// try next domain
|
|
50
|
-
}
|
|
35
|
+
const file = resolve(root, slug, "SKILL.md");
|
|
36
|
+
try {
|
|
37
|
+
await access(file);
|
|
38
|
+
return { name: skillName, domain: "core", slug, file };
|
|
51
39
|
}
|
|
52
|
-
|
|
40
|
+
catch {
|
|
41
|
+
// fall through
|
|
42
|
+
}
|
|
43
|
+
throw new Error(`Core skill not found: ${skillName}`);
|
|
53
44
|
}
|
|
54
45
|
/**
|
|
55
|
-
* Enumerate every installable skill by walking the skills root directly.
|
|
56
|
-
* Returns names in `zsk:<slug>` form, sorted by
|
|
57
|
-
* groupings are stable across runs.
|
|
46
|
+
* Enumerate every installable core skill by walking the skills root directly.
|
|
47
|
+
* Returns names in `zsk:<slug>` form, sorted by slug.
|
|
58
48
|
*/
|
|
59
49
|
export async function enumerateSkills() {
|
|
60
50
|
const root = await resolveSkillsRoot();
|
|
61
51
|
const out = [];
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
52
|
+
const seen = new Set();
|
|
53
|
+
let entries;
|
|
54
|
+
try {
|
|
55
|
+
entries = await readdir(root, { withFileTypes: true });
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
entries = [];
|
|
59
|
+
}
|
|
60
|
+
for (const e of entries) {
|
|
61
|
+
if (!e.isDirectory())
|
|
62
|
+
continue;
|
|
63
|
+
const file = resolve(root, e.name, "SKILL.md");
|
|
65
64
|
try {
|
|
66
|
-
|
|
65
|
+
await access(file);
|
|
67
66
|
}
|
|
68
67
|
catch {
|
|
69
|
-
continue; //
|
|
70
|
-
}
|
|
71
|
-
for (const e of entries) {
|
|
72
|
-
if (!e.isDirectory())
|
|
73
|
-
continue;
|
|
74
|
-
const file = resolve(domainDir, e.name, "SKILL.md");
|
|
75
|
-
try {
|
|
76
|
-
await access(file);
|
|
77
|
-
}
|
|
78
|
-
catch {
|
|
79
|
-
continue; // directory without SKILL.md → not a skill
|
|
80
|
-
}
|
|
81
|
-
out.push({ name: `zsk:${e.name}`, domain, slug: e.name, file });
|
|
68
|
+
continue; // directory without SKILL.md → not a skill
|
|
82
69
|
}
|
|
70
|
+
const name = `zsk:${e.name}`;
|
|
71
|
+
if (seen.has(name))
|
|
72
|
+
continue;
|
|
73
|
+
seen.add(name);
|
|
74
|
+
out.push({ name, domain: "core", slug: e.name, file });
|
|
83
75
|
}
|
|
84
|
-
out.sort((a, b) =>
|
|
85
|
-
a.slug.localeCompare(b.slug));
|
|
76
|
+
out.sort((a, b) => a.slug.localeCompare(b.slug));
|
|
86
77
|
return out;
|
|
87
78
|
}
|
|
88
79
|
export { DOMAINS };
|
package/dist/core/skills.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,EAAE;AACF,gEAAgE;AAChE,mEAAmE;AAEnE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,CAAC,MAAM,CAAU,CAAC;AAWlC,IAAI,eAAe,GAAkB,IAAI,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,eAAe;QAAE,OAAO,eAAe,CAAC;IAE5C,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxD,8DAA8D;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,iCAAiC,CAAC,CAAC;IACpE,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACtB,eAAe,GAAG,OAAO,CAAC;QAC1B,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;IACD,8EAA8E;IAC9E,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,eAAe,GAAG,SAAS,CAAC;IAC5B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAAiB;IAC/C,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAEvC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,IAAI,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACvC,MAAM,GAAG,GAAY,EAAE,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,OAAuD,CAAC;IAC5D,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,EAAE,CAAC;IACf,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;YAAE,SAAS;QAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,2CAA2C;QACvD,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/core/targets.js
CHANGED
|
@@ -18,7 +18,7 @@ export const TARGET_OPTIONS = [
|
|
|
18
18
|
{
|
|
19
19
|
kind: "claude-plugin",
|
|
20
20
|
label: "./.claude-plugin/",
|
|
21
|
-
hint: "Claude 插件形态(生成
|
|
21
|
+
hint: "Claude 插件形态(生成 plugin.json + commands/ + skills/)",
|
|
22
22
|
resolve: () => resolve(process.cwd(), ".claude-plugin"),
|
|
23
23
|
},
|
|
24
24
|
{
|
package/dist/core/targets.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"targets.js","sourceRoot":"","sources":["../../src/core/targets.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,0DAA0D;AAE1D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAiBhD,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C;QACE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,mBAAmB;QAC1B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC;KACpD;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,mBAAmB;QAC1B,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC;KACxD;IACD;QACE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,mBAAmB;QAC1B,IAAI,EAAE
|
|
1
|
+
{"version":3,"file":"targets.js","sourceRoot":"","sources":["../../src/core/targets.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,0DAA0D;AAE1D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAiBhD,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C;QACE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,mBAAmB;QAC1B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC;KACpD;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,mBAAmB;QAC1B,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC;KACxD;IACD;QACE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,mBAAmB;QAC1B,IAAI,EAAE,mDAAmD;QACzD,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC;KACxD;IACD;QACE,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,kBAAkB;QACzB,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC;KACnD;IACD;QACE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,kBAAkB;QACzB,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC;KACvD;IACD;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;KAClB;CACF,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@captain_z/zsk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "ZNorth Standard Kit — CLI installer for zsk skill bundles (npx @captain_z/zsk add)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"commander": "^12.1.0",
|
|
21
21
|
"picocolors": "^1.1.1",
|
|
22
22
|
"yaml": "^2.7.0",
|
|
23
|
-
"@captain_z/zsk-skills": "1.
|
|
23
|
+
"@captain_z/zsk-skills": "1.6.0"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@types/node": "^22.10.0",
|
|
@@ -201,7 +201,7 @@
|
|
|
201
201
|
"toolName": {
|
|
202
202
|
"description": "Known runtime/design verification tool.",
|
|
203
203
|
"type": "string",
|
|
204
|
-
"enum": ["computer_use", "browser_use", "figma_mcp", "script", "manual", "skill"]
|
|
204
|
+
"enum": ["computer_use", "browser_use", "playwright", "playwright_cli", "playwright_mcp", "figma_mcp", "script", "manual", "skill"]
|
|
205
205
|
},
|
|
206
206
|
"metadata": {
|
|
207
207
|
"description": "Explicit extension point for project-specific metadata.",
|
|
@@ -104,6 +104,105 @@
|
|
|
104
104
|
}
|
|
105
105
|
}
|
|
106
106
|
},
|
|
107
|
+
"automation": {
|
|
108
|
+
"description": "Harness automation defaults for workflow stages.",
|
|
109
|
+
"type": "object",
|
|
110
|
+
"additionalProperties": false,
|
|
111
|
+
"properties": {
|
|
112
|
+
"smoke": {
|
|
113
|
+
"$ref": "#/$defs/commandStage"
|
|
114
|
+
},
|
|
115
|
+
"deploy": {
|
|
116
|
+
"$ref": "#/$defs/commandStage"
|
|
117
|
+
},
|
|
118
|
+
"demo": {
|
|
119
|
+
"type": "object",
|
|
120
|
+
"additionalProperties": false,
|
|
121
|
+
"properties": {
|
|
122
|
+
"defaultMode": {
|
|
123
|
+
"type": "string",
|
|
124
|
+
"enum": ["manual", "script", "playwright", "computer-use", "hybrid"]
|
|
125
|
+
},
|
|
126
|
+
"baseUrl": {
|
|
127
|
+
"type": "string",
|
|
128
|
+
"minLength": 1
|
|
129
|
+
},
|
|
130
|
+
"command": {
|
|
131
|
+
"type": "string",
|
|
132
|
+
"minLength": 1
|
|
133
|
+
},
|
|
134
|
+
"evidenceDir": {
|
|
135
|
+
"$ref": "#/$defs/pathRef"
|
|
136
|
+
},
|
|
137
|
+
"scenarioDir": {
|
|
138
|
+
"$ref": "#/$defs/pathRef"
|
|
139
|
+
},
|
|
140
|
+
"playwright": {
|
|
141
|
+
"type": "object",
|
|
142
|
+
"additionalProperties": false,
|
|
143
|
+
"properties": {
|
|
144
|
+
"config": {
|
|
145
|
+
"$ref": "#/$defs/pathRef"
|
|
146
|
+
},
|
|
147
|
+
"project": {
|
|
148
|
+
"type": "string",
|
|
149
|
+
"minLength": 1
|
|
150
|
+
},
|
|
151
|
+
"cli": {
|
|
152
|
+
"type": "string",
|
|
153
|
+
"minLength": 1
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
"computerUse": {
|
|
158
|
+
"type": "object",
|
|
159
|
+
"additionalProperties": false,
|
|
160
|
+
"properties": {
|
|
161
|
+
"enabled": {
|
|
162
|
+
"type": "boolean"
|
|
163
|
+
},
|
|
164
|
+
"role": {
|
|
165
|
+
"type": "string",
|
|
166
|
+
"const": "understand-and-decide"
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
"bridge": {
|
|
171
|
+
"type": "object",
|
|
172
|
+
"additionalProperties": false,
|
|
173
|
+
"properties": {
|
|
174
|
+
"enabled": {
|
|
175
|
+
"type": "boolean"
|
|
176
|
+
},
|
|
177
|
+
"decisionTool": {
|
|
178
|
+
"type": "string",
|
|
179
|
+
"enum": ["browser_use", "computer_use", "playwright_mcp"]
|
|
180
|
+
},
|
|
181
|
+
"executionTool": {
|
|
182
|
+
"type": "string",
|
|
183
|
+
"enum": ["playwright"]
|
|
184
|
+
},
|
|
185
|
+
"planFile": {
|
|
186
|
+
"$ref": "#/$defs/pathRef"
|
|
187
|
+
},
|
|
188
|
+
"executionFile": {
|
|
189
|
+
"$ref": "#/$defs/pathRef"
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
"metadata": {
|
|
194
|
+
"$ref": "#/$defs/metadata"
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
"verify": {
|
|
199
|
+
"$ref": "#/$defs/commandStage"
|
|
200
|
+
},
|
|
201
|
+
"metadata": {
|
|
202
|
+
"$ref": "#/$defs/metadata"
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
},
|
|
107
206
|
"sync": {
|
|
108
207
|
"description": "Optional deterministic or AI-assisted raw resource sync configuration.",
|
|
109
208
|
"type": "object",
|
|
@@ -124,12 +223,33 @@
|
|
|
124
223
|
"toolName": {
|
|
125
224
|
"description": "Known tool or capability name.",
|
|
126
225
|
"type": "string",
|
|
127
|
-
"enum": ["computer_use", "browser_use", "figma_mcp", "script", "manual", "skill"]
|
|
226
|
+
"enum": ["computer_use", "browser_use", "playwright", "playwright_cli", "playwright_mcp", "figma_mcp", "script", "manual", "skill"]
|
|
227
|
+
},
|
|
228
|
+
"commandStage": {
|
|
229
|
+
"description": "Automation command list for a workflow stage.",
|
|
230
|
+
"type": "object",
|
|
231
|
+
"additionalProperties": false,
|
|
232
|
+
"properties": {
|
|
233
|
+
"command": {
|
|
234
|
+
"type": "string",
|
|
235
|
+
"minLength": 1
|
|
236
|
+
},
|
|
237
|
+
"commands": {
|
|
238
|
+
"type": "array",
|
|
239
|
+
"items": {
|
|
240
|
+
"type": "string",
|
|
241
|
+
"minLength": 1
|
|
242
|
+
}
|
|
243
|
+
},
|
|
244
|
+
"metadata": {
|
|
245
|
+
"$ref": "#/$defs/metadata"
|
|
246
|
+
}
|
|
247
|
+
}
|
|
128
248
|
},
|
|
129
249
|
"sourceType": {
|
|
130
250
|
"description": "Resource role.",
|
|
131
251
|
"type": "string",
|
|
132
|
-
"enum": ["srs", "prd", "design", "api_contract", "test_case", "design_asset", "vendor_doc", "manual"]
|
|
252
|
+
"enum": ["srs", "prd", "design", "api_contract", "backend_repo", "test_case", "design_asset", "vendor_doc", "manual"]
|
|
133
253
|
},
|
|
134
254
|
"sourceRef": {
|
|
135
255
|
"description": "Resource source reference.",
|