@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.
Files changed (74) hide show
  1. package/README.md +64 -17
  2. package/dist/bin.js +174 -1
  3. package/dist/bin.js.map +1 -1
  4. package/dist/commands/add-flow.d.ts +1 -1
  5. package/dist/commands/add-flow.js +4 -9
  6. package/dist/commands/add-flow.js.map +1 -1
  7. package/dist/commands/add.d.ts +1 -0
  8. package/dist/commands/add.js +55 -11
  9. package/dist/commands/add.js.map +1 -1
  10. package/dist/commands/check.js +10 -2
  11. package/dist/commands/check.js.map +1 -1
  12. package/dist/commands/demo.d.ts +31 -0
  13. package/dist/commands/demo.js +533 -0
  14. package/dist/commands/demo.js.map +1 -0
  15. package/dist/commands/issue.d.ts +8 -0
  16. package/dist/commands/issue.js +170 -6
  17. package/dist/commands/issue.js.map +1 -1
  18. package/dist/commands/module.js +23 -2
  19. package/dist/commands/module.js.map +1 -1
  20. package/dist/commands/project-init.js +1 -0
  21. package/dist/commands/project-init.js.map +1 -1
  22. package/dist/commands/remove.js +5 -7
  23. package/dist/commands/remove.js.map +1 -1
  24. package/dist/core/config.d.ts +14 -0
  25. package/dist/core/config.js.map +1 -1
  26. package/dist/core/installer.d.ts +5 -0
  27. package/dist/core/installer.js +105 -6
  28. package/dist/core/installer.js.map +1 -1
  29. package/dist/core/manifest.d.ts +8 -3
  30. package/dist/core/manifest.js +27 -18
  31. package/dist/core/manifest.js.map +1 -1
  32. package/dist/core/skills.d.ts +3 -4
  33. package/dist/core/skills.js +34 -43
  34. package/dist/core/skills.js.map +1 -1
  35. package/dist/core/targets.js +1 -1
  36. package/dist/core/targets.js.map +1 -1
  37. package/package.json +2 -2
  38. package/schemas/module.schema.json +1 -1
  39. package/schemas/zsk-config.schema.json +122 -2
  40. package/templates/issue/default/assets/index.md +6 -0
  41. package/templates/issue/default/debug-logs/index.md +6 -0
  42. package/templates/issue/default/issue.md +35 -2
  43. package/templates/module/frontend-module/acceptance.md +18 -0
  44. package/templates/module/frontend-module/archive.md +17 -0
  45. package/templates/module/frontend-module/commit.md +15 -0
  46. package/templates/module/frontend-module/demo-outline.md +59 -0
  47. package/templates/module/frontend-module/demo-report.md +23 -0
  48. package/templates/module/frontend-module/deploy.md +18 -0
  49. package/templates/module/frontend-module/design.md +12 -0
  50. package/templates/module/frontend-module/module.yaml +4 -1
  51. package/templates/module/frontend-module/proposal.md +7 -0
  52. package/templates/module/frontend-module/ready.md +12 -0
  53. package/templates/module/frontend-module/review.md +12 -0
  54. package/templates/module/frontend-module/scenarios/index.md +21 -0
  55. package/templates/module/frontend-module/scenarios/p0-happy-path.spec.ts +13 -0
  56. package/templates/module/frontend-module/smoke.md +21 -0
  57. package/templates/module/frontend-module/spec.md +14 -0
  58. package/templates/module/frontend-module/tasks.md +13 -0
  59. package/templates/module/frontend-module/verify.md +12 -0
  60. package/templates/project-init/.issues/README.md +17 -1
  61. package/templates/project-init/.issues/_taxonomy.md +35 -0
  62. package/templates/project-init/.issues/index.md +7 -0
  63. package/templates/project-init/.raws/README.md +2 -1
  64. package/templates/project-init/.raws/backend-repositories/index.md +12 -0
  65. package/templates/project-init/.raws/index.md +3 -0
  66. package/templates/project-init/.raws/issues/index.md +4 -0
  67. package/templates/project-init/.zsk/checkpoints/index.md +4 -0
  68. package/templates/project-init/.zsk/config.yaml +56 -1
  69. package/templates/project-init/.zsk/learning/index.md +14 -0
  70. package/templates/project-init/.zsk/learning/proposals/.gitkeep +1 -0
  71. package/templates/project-init/.zsk/resource-manifest.json +55 -0
  72. package/templates/project-init/.zsk/workflow-state.json +6 -0
  73. package/templates/project-init/docs/_module-index.md +9 -1
  74. package/templates/project-init/project-config.md +5 -3
@@ -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 = skillTargetPath(plan.target, skill);
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 = skillTargetPath(stagingDir, skill);
41
+ const stagingDst = join(stagingDir, skillRelPath(skill, layout));
41
42
  await mkdir(dirname(stagingDst), { recursive: true });
42
- await copyFile(skill.file, stagingDst);
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 skillTargetPath(root, skill) {
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(root, `zsk-${skill.slug}`, "SKILL.md");
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":"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"}
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/core/installer.ts"],"names":[],"mappings":"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"}
@@ -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 — disk matches manifest sha256
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>;
@@ -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 — disk matches manifest sha256
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 p = join(target, s.relPath);
55
- try {
56
- const buf = await readFile(p);
57
- const digest = sha256File(buf);
58
- out.push({
59
- name: s.name,
60
- relPath: s.relPath,
61
- kind: digest === s.sha256 ? "clean" : "modified",
62
- });
63
- }
64
- catch (err) {
65
- if (isENOENT(err)) {
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
- else {
69
- throw err;
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":"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"}
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- declare const DOMAINS: readonly ["sdlc", "frontend", "quality", "design-handoff", "system", "meta"];
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 domain then slug, so UI
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 };
@@ -1,19 +1,12 @@
1
- // Skill resolution: zsk:<slug> → filesystem SKILL.md path + domain metadata.
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/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 (flat layout, no /skills/ wrapper)
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
- for (const domain of DOMAINS) {
43
- const file = resolve(root, domain, slug, "SKILL.md");
44
- try {
45
- await access(file);
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
- throw new Error(`Skill not found in any domain: ${skillName}`);
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 domain then slug, so UI
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
- for (const domain of DOMAINS) {
63
- const domainDir = resolve(root, domain);
64
- let entries;
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
- entries = await readdir(domainDir, { withFileTypes: true });
65
+ await access(file);
67
66
  }
68
67
  catch {
69
- continue; // domain dir may not exist in partial installs
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) => DOMAINS.indexOf(a.domain) - DOMAINS.indexOf(b.domain) ||
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 };
@@ -1 +1 @@
1
- {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@ export const TARGET_OPTIONS = [
18
18
  {
19
19
  kind: "claude-plugin",
20
20
  label: "./.claude-plugin/",
21
- hint: "Claude 插件形态(生成 manifest.json",
21
+ hint: "Claude 插件形态(生成 plugin.json + commands/ + skills/)",
22
22
  resolve: () => resolve(process.cwd(), ".claude-plugin"),
23
23
  },
24
24
  {
@@ -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,+BAA+B;QACrC,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"}
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.4.3",
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.4.3"
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.",