@captain_z/zsk 1.2.1 → 1.4.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 (58) hide show
  1. package/README.md +25 -8
  2. package/dist/bin.js +57 -16
  3. package/dist/bin.js.map +1 -1
  4. package/dist/commands/add-flow.d.ts +6 -1
  5. package/dist/commands/add-flow.js +30 -5
  6. package/dist/commands/add-flow.js.map +1 -1
  7. package/dist/commands/add.js +19 -19
  8. package/dist/commands/add.js.map +1 -1
  9. package/dist/commands/check.js +6 -3
  10. package/dist/commands/check.js.map +1 -1
  11. package/dist/commands/config.d.ts +1 -0
  12. package/dist/commands/config.js +23 -0
  13. package/dist/commands/config.js.map +1 -1
  14. package/dist/commands/issue.d.ts +12 -0
  15. package/dist/commands/issue.js +92 -0
  16. package/dist/commands/issue.js.map +1 -0
  17. package/dist/commands/module.d.ts +8 -0
  18. package/dist/commands/module.js +40 -0
  19. package/dist/commands/module.js.map +1 -0
  20. package/dist/commands/prep.js +13 -2
  21. package/dist/commands/prep.js.map +1 -1
  22. package/dist/commands/project-init.js +6 -6
  23. package/dist/commands/project-init.js.map +1 -1
  24. package/dist/core/config.d.ts +19 -3
  25. package/dist/core/config.js +63 -16
  26. package/dist/core/config.js.map +1 -1
  27. package/dist/core/raw-manifest.d.ts +11 -3
  28. package/dist/core/raw-manifest.js +16 -8
  29. package/dist/core/raw-manifest.js.map +1 -1
  30. package/dist/core/scaffolder.d.ts +1 -0
  31. package/dist/core/scaffolder.js +13 -6
  32. package/dist/core/scaffolder.js.map +1 -1
  33. package/dist/ui/prompts.d.ts +1 -0
  34. package/dist/ui/prompts.js +188 -1
  35. package/dist/ui/prompts.js.map +1 -1
  36. package/package.json +4 -3
  37. package/{templates/project-init/.zsk/schemas → schemas}/module.schema.json +36 -25
  38. package/{templates/project-init/.zsk/schemas → schemas}/zsk-config.schema.json +185 -37
  39. package/templates/{project-init/.issues/_templates → issue/default}/issue.md +5 -5
  40. package/templates/module/frontend-module/design.md +6 -0
  41. package/templates/module/frontend-module/module.yaml +26 -0
  42. package/templates/module/frontend-module/spec.md +6 -0
  43. package/templates/module/frontend-module/tasks.md +6 -0
  44. package/templates/module/frontend-module/verification.md +6 -0
  45. package/templates/project-init/.issues/README.md +6 -7
  46. package/templates/project-init/.raws/README.md +11 -34
  47. package/templates/project-init/.zsk/config.yaml +22 -0
  48. package/templates/project-init/{SYSTEM-SPEC.md → docs/SYSTEM-SPEC.md} +16 -18
  49. package/templates/project-init/.raws/FIGMA-INDEX.md +0 -38
  50. package/templates/project-init/.raws/SRS.md +0 -73
  51. package/templates/project-init/.raws/api-contracts/README.md +0 -13
  52. package/templates/project-init/.raws/design-assets/README.md +0 -16
  53. package/templates/project-init/.raws/testing/README.md +0 -10
  54. package/templates/project-init/CLAUDE.md +0 -45
  55. package/templates/project-init/docs/_module-template/module.yaml +0 -32
  56. package/templates/project-init/docs/system/README.md +0 -12
  57. package/templates/project-init/project-config.md +0 -296
  58. package/templates/project-init/zsk.config.yaml +0 -50
@@ -1,5 +1,5 @@
1
1
  // Project scaffolder: copy templates into a target project directory.
2
- // Used by `zsk project-init` to bootstrap project-config.md / .raws/ / CLAUDE.md.
2
+ // Used by `zsk init` to bootstrap project knowledge files.
3
3
  import { readFile, writeFile, mkdir, readdir, access } from "node:fs/promises";
4
4
  import { dirname, join, resolve } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
@@ -35,29 +35,36 @@ export async function scaffoldTemplate(templateSubpath, target, opts = {}) {
35
35
  const src = join(root, templateSubpath);
36
36
  const result = { written: [], skipped: [] };
37
37
  await mkdir(target, { recursive: true });
38
- await copyRecursive(src, target, opts.overwrite === true, result);
38
+ await copyRecursive(src, target, opts.overwrite === true, result, opts.variables ?? {});
39
39
  return result;
40
40
  }
41
- async function copyRecursive(src, dst, overwrite, result) {
41
+ async function copyRecursive(src, dst, overwrite, result, variables) {
42
42
  const entries = await readdir(src, { withFileTypes: true });
43
43
  await mkdir(dst, { recursive: true });
44
44
  for (const e of entries) {
45
45
  const srcPath = join(src, e.name);
46
- const dstPath = join(dst, e.name);
46
+ const dstPath = join(dst, applyTemplateVariables(e.name, variables));
47
47
  if (e.isDirectory()) {
48
- await copyRecursive(srcPath, dstPath, overwrite, result);
48
+ await copyRecursive(srcPath, dstPath, overwrite, result, variables);
49
49
  }
50
50
  else {
51
51
  if (!overwrite && (await fileExists(dstPath))) {
52
52
  result.skipped.push(dstPath);
53
53
  continue;
54
54
  }
55
- const content = await readFile(srcPath, "utf8");
55
+ const content = applyTemplateVariables(await readFile(srcPath, "utf8"), variables);
56
56
  await writeFile(dstPath, content, "utf8");
57
57
  result.written.push(dstPath);
58
58
  }
59
59
  }
60
60
  }
61
+ function applyTemplateVariables(value, variables) {
62
+ let next = value;
63
+ for (const [key, replacement] of Object.entries(variables)) {
64
+ next = next.split(`__${key}__`).join(replacement);
65
+ }
66
+ return next;
67
+ }
61
68
  async function fileExists(p) {
62
69
  try {
63
70
  await access(p);
@@ -1 +1 @@
1
- {"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../../src/core/scaffolder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../../src/core/scaffolder.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { intro as clackIntro, outro as clackOutro, spinner as clackSpinner, note
2
2
  type Primitive = Readonly<string | boolean | number>;
3
3
  export declare function select<T extends Primitive>(message: string, options: Option<T>[], initialValue?: T): Promise<T>;
4
4
  export declare function groupMultiselect<T extends Primitive>(message: string, options: Record<string, Option<T>[]>, initialValues?: T[]): Promise<T[]>;
5
+ export declare function cascadingGroupMultiselect<T extends Primitive>(message: string, groups: Record<string, Option<T>[]>, initialValues?: T[], maxItems?: number): Promise<T[]>;
5
6
  export declare function multiselect<T extends Primitive>(message: string, options: Option<T>[], initialValues?: T[], maxItems?: number): Promise<T[]>;
6
7
  export declare function text(message: string, opts?: {
7
8
  placeholder?: string;
@@ -1,5 +1,6 @@
1
1
  // @clack/prompts wrappers with centralized isCancel handling.
2
2
  // All CLI interactive prompts go through this module so Ctrl+C is handled once.
3
+ import { createInterface, emitKeypressEvents } from "node:readline";
3
4
  import { intro as clackIntro, outro as clackOutro, select as clackSelect, multiselect as clackMultiselect, groupMultiselect as clackGroupMultiselect, confirm as clackConfirm, text as clackText, spinner as clackSpinner, note as clackNote, log, cancel, isCancel, } from "@clack/prompts";
4
5
  function exitIfCancel(value) {
5
6
  if (isCancel(value)) {
@@ -22,6 +23,108 @@ export async function groupMultiselect(message, options, initialValues = []) {
22
23
  exitIfCancel(v);
23
24
  return v;
24
25
  }
26
+ export async function cascadingGroupMultiselect(message, groups, initialValues = [], maxItems = 12) {
27
+ const rows = buildCascadingRows(groups);
28
+ const selected = new Set(initialValues);
29
+ let cursor = rows.findIndex((row) => row.kind === "group" || row.kind === "item");
30
+ if (cursor < 0)
31
+ cursor = 0;
32
+ const input = process.stdin;
33
+ const output = process.stdout;
34
+ let previousLineCount = 0;
35
+ let done = false;
36
+ const selectedValues = () => [...selected];
37
+ const toggleRow = (row) => {
38
+ if (!row)
39
+ return;
40
+ if (row.kind === "item") {
41
+ if (selected.has(row.value))
42
+ selected.delete(row.value);
43
+ else
44
+ selected.add(row.value);
45
+ return;
46
+ }
47
+ const values = row.items.map((item) => item.value);
48
+ const allSelected = values.every((value) => selected.has(value));
49
+ for (const value of values) {
50
+ if (allSelected)
51
+ selected.delete(value);
52
+ else
53
+ selected.add(value);
54
+ }
55
+ };
56
+ const move = (delta) => {
57
+ if (rows.length === 0)
58
+ return;
59
+ cursor = cursor + delta;
60
+ if (cursor < 0)
61
+ cursor = rows.length - 1;
62
+ if (cursor >= rows.length)
63
+ cursor = 0;
64
+ };
65
+ return new Promise((resolve) => {
66
+ const rl = createInterface({
67
+ input,
68
+ output,
69
+ prompt: "",
70
+ terminal: true,
71
+ });
72
+ const cleanup = () => {
73
+ done = true;
74
+ input.off("keypress", onKeypress);
75
+ if (input.isTTY)
76
+ input.setRawMode(false);
77
+ output.write("\x1b[?25h");
78
+ rl.close();
79
+ };
80
+ const finish = () => {
81
+ cleanup();
82
+ render("submit");
83
+ resolve(selectedValues());
84
+ };
85
+ const onKeypress = (_char, key) => {
86
+ if (done)
87
+ return;
88
+ if (key.ctrl && key.name === "c" || key.name === "escape") {
89
+ cleanup();
90
+ cancel("已取消");
91
+ process.exit(0);
92
+ }
93
+ if (key.name === "up" || key.name === "left")
94
+ move(-1);
95
+ if (key.name === "down" || key.name === "right")
96
+ move(1);
97
+ if (key.name === "space")
98
+ toggleRow(rows[cursor]);
99
+ if (key.name === "return" || key.name === "enter") {
100
+ finish();
101
+ return;
102
+ }
103
+ render("active");
104
+ };
105
+ const render = (state) => {
106
+ if (previousLineCount > 0)
107
+ output.write(`\x1b[${previousLineCount}A\x1b[J`);
108
+ const frame = renderCascadingFrame({
109
+ message,
110
+ rows,
111
+ cursor,
112
+ selected,
113
+ maxItems,
114
+ state,
115
+ });
116
+ output.write(`${frame}\n`);
117
+ previousLineCount = frame.split("\n").length;
118
+ };
119
+ emitKeypressEvents(input, rl);
120
+ if (input.isTTY)
121
+ input.setRawMode(true);
122
+ input.resume();
123
+ output.write("\x1b[?25l");
124
+ input.on("keypress", onKeypress);
125
+ render("active");
126
+ });
127
+ }
25
128
  export async function multiselect(message, options, initialValues = [], maxItems = 12) {
26
129
  const v = await clackMultiselect({
27
130
  message,
@@ -33,11 +136,95 @@ export async function multiselect(message, options, initialValues = [], maxItems
33
136
  exitIfCancel(v);
34
137
  return v;
35
138
  }
139
+ function buildCascadingRows(groups) {
140
+ return Object.entries(groups).flatMap(([group, items]) => [
141
+ {
142
+ kind: "group",
143
+ group,
144
+ label: group,
145
+ items,
146
+ },
147
+ ...items.map((item) => ({
148
+ kind: "item",
149
+ group,
150
+ value: item.value,
151
+ label: item.label ?? String(item.value),
152
+ hint: item.hint,
153
+ })),
154
+ ]);
155
+ }
156
+ function renderCascadingFrame(args) {
157
+ const { rows, cursor, selected, maxItems, state } = args;
158
+ const outputColumns = process.stdout.columns || 80;
159
+ const frameWidth = Math.max(40, outputColumns - 1);
160
+ const visibleLimit = Math.max(5, Math.min(maxItems, Math.max(5, (process.stdout.rows || maxItems + 5) - 5)));
161
+ const start = Math.max(0, Math.min(cursor - Math.floor(visibleLimit / 2), Math.max(0, rows.length - visibleLimit)));
162
+ const visible = rows.slice(start, start + visibleLimit);
163
+ const lines = [
164
+ "│",
165
+ `${state === "submit" ? "◇" : "◆"} ${args.message}`,
166
+ ];
167
+ if (start > 0)
168
+ lines.push("│ ...");
169
+ for (const [offset, row] of visible.entries()) {
170
+ const active = start + offset === cursor;
171
+ const prefix = active ? "›" : " ";
172
+ if (row.kind === "group") {
173
+ const values = row.items.map((item) => item.value);
174
+ const selectedCount = values.filter((value) => selected.has(value)).length;
175
+ const mark = selectedCount === values.length
176
+ ? "◼"
177
+ : selectedCount > 0 ? "◩" : "◻";
178
+ lines.push(fitTerminalLine(`│ ${prefix} ${mark} ${row.label} (全选 ${values.length} 个)`, frameWidth));
179
+ continue;
180
+ }
181
+ const mark = selected.has(row.value) ? "◼" : "◻";
182
+ const hint = row.hint ? ` (${row.hint})` : "";
183
+ lines.push(fitTerminalLine(`│ ${prefix} ${mark} ${row.label}${hint}`, frameWidth));
184
+ }
185
+ if (start + visibleLimit < rows.length)
186
+ lines.push("│ ...");
187
+ lines.push("└ ↑/↓ 移动,空格勾选,回车继续");
188
+ return lines.map((line) => fitTerminalLine(line, frameWidth)).join("\n");
189
+ }
190
+ function fitTerminalLine(line, maxWidth) {
191
+ let width = 0;
192
+ let out = "";
193
+ for (const char of line) {
194
+ const charWidth = charDisplayWidth(char);
195
+ if (width + charWidth > maxWidth - 1)
196
+ return `${out}…`;
197
+ out += char;
198
+ width += charWidth;
199
+ }
200
+ return out;
201
+ }
202
+ function charDisplayWidth(char) {
203
+ const code = char.codePointAt(0) ?? 0;
204
+ if (code === 0)
205
+ return 0;
206
+ if (code < 0x20 || code === 0x7f)
207
+ return 0;
208
+ if (code >= 0x1100 && (code <= 0x115f ||
209
+ code === 0x2329 ||
210
+ code === 0x232a ||
211
+ (code >= 0x2e80 && code <= 0xa4cf) ||
212
+ (code >= 0xac00 && code <= 0xd7a3) ||
213
+ (code >= 0xf900 && code <= 0xfaff) ||
214
+ (code >= 0xfe10 && code <= 0xfe19) ||
215
+ (code >= 0xfe30 && code <= 0xfe6f) ||
216
+ (code >= 0xff00 && code <= 0xff60) ||
217
+ (code >= 0xffe0 && code <= 0xffe6)))
218
+ return 2;
219
+ return 1;
220
+ }
36
221
  export async function text(message, opts = {}) {
37
222
  const v = await clackText({
38
223
  message,
39
224
  placeholder: opts.placeholder,
40
- validate: opts.validate,
225
+ validate: opts.validate
226
+ ? (value) => opts.validate?.(value ?? "")
227
+ : undefined,
41
228
  });
42
229
  exitIfCancel(v);
43
230
  return v;
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,gFAAgF;AAEhF,OAAO,EACL,KAAK,IAAI,UAAU,EACnB,KAAK,IAAI,UAAU,EACnB,MAAM,IAAI,WAAW,EACrB,WAAW,IAAI,gBAAgB,EAC/B,gBAAgB,IAAI,qBAAqB,EACzC,OAAO,IAAI,YAAY,EACvB,IAAI,IAAI,SAAS,EACjB,OAAO,IAAI,YAAY,EACvB,IAAI,IAAI,SAAS,EACjB,GAAG,EACH,MAAM,EACN,QAAQ,GAET,MAAM,gBAAgB,CAAC;AAIxB,SAAS,YAAY,CAAI,KAAiB;IACxC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,OAAe,EACf,OAAoB,EACpB,YAAgB;IAEhB,MAAM,CAAC,GAAG,MAAM,WAAW,CAAI,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IACnE,YAAY,CAAC,CAAC,CAAC,CAAC;IAChB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAe,EACf,OAAoC,EACpC,gBAAqB,EAAE;IAEvB,MAAM,CAAC,GAAG,MAAM,qBAAqB,CAAI;QACvC,OAAO;QACP,OAAO;QACP,aAAa;QACb,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IACH,YAAY,CAAC,CAAC,CAAC,CAAC;IAChB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAe,EACf,OAAoB,EACpB,gBAAqB,EAAE,EACvB,QAAQ,GAAG,EAAE;IAEb,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAI;QAClC,OAAO;QACP,OAAO;QACP,aAAa;QACb,QAAQ;QACR,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IACH,YAAY,CAAC,CAAC,CAAC,CAAC;IAChB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,OAAe,EACf,OAGI,EAAE;IAEN,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC;QACxB,OAAO;QACP,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC,CAAC;IACH,YAAY,CAAC,CAAC,CAAC,CAAC;IAChB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,OAAe,EACf,YAAY,GAAG,IAAI;IAEnB,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IACxD,YAAY,CAAC,CAAC,CAAC,CAAC;IAChB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,OAAO,EACL,UAAU,IAAI,KAAK,EACnB,UAAU,IAAI,KAAK,EACnB,YAAY,IAAI,OAAO,EACvB,SAAS,IAAI,IAAI,EACjB,GAAG,GACJ,CAAC"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@captain_z/zsk",
3
- "version": "1.2.1",
3
+ "version": "1.4.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",
@@ -10,16 +10,17 @@
10
10
  "main": "./dist/bin.js",
11
11
  "files": [
12
12
  "dist",
13
+ "schemas",
13
14
  "templates",
14
15
  "README.md"
15
16
  ],
16
17
  "dependencies": {
17
- "@clack/prompts": "^0.9.0",
18
+ "@clack/prompts": "^1.3.0",
18
19
  "ajv": "^8.17.1",
19
20
  "commander": "^12.1.0",
20
21
  "picocolors": "^1.1.1",
21
22
  "yaml": "^2.7.0",
22
- "@captain_z/zsk-skills": "1.2.1"
23
+ "@captain_z/zsk-skills": "1.4.0"
23
24
  },
24
25
  "devDependencies": {
25
26
  "@types/node": "^22.10.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://zsk.dev/schemas/module.schema.json",
3
+ "$id": "https://unpkg.com/@captain_z/zsk@1.3.0/schemas/module.schema.json",
4
4
  "title": "ZSK Module Config",
5
5
  "description": "Module-level resource, runtime, test, and output mapping for ZSK workflows.",
6
6
  "type": "object",
@@ -30,26 +30,19 @@
30
30
  }
31
31
  },
32
32
  "sources": {
33
- "description": "Raw and derived resource inputs consumed by this module.",
33
+ "description": "Project source ids and resource paths consumed by this module.",
34
34
  "type": "object",
35
- "additionalProperties": false,
36
- "required": ["testing"],
35
+ "additionalProperties": {
36
+ "oneOf": [
37
+ {
38
+ "$ref": "#/$defs/pathList"
39
+ },
40
+ {
41
+ "$ref": "#/$defs/moduleSource"
42
+ }
43
+ ]
44
+ },
37
45
  "properties": {
38
- "srs": {
39
- "$ref": "#/$defs/srsSource"
40
- },
41
- "api_contracts": {
42
- "$ref": "#/$defs/pathList"
43
- },
44
- "testing": {
45
- "$ref": "#/$defs/pathList"
46
- },
47
- "design_assets": {
48
- "$ref": "#/$defs/pathList"
49
- },
50
- "figma": {
51
- "$ref": "#/$defs/pathList"
52
- },
53
46
  "metadata": {
54
47
  "$ref": "#/$defs/metadata"
55
48
  }
@@ -155,17 +148,24 @@
155
148
  },
156
149
  "uniqueItems": true
157
150
  },
158
- "srsSource": {
159
- "description": "SRS source path with optional section anchors.",
151
+ "moduleSource": {
152
+ "description": "Module source reference with optional project source id, path, and anchors.",
160
153
  "type": "object",
161
154
  "additionalProperties": false,
162
- "required": ["path"],
163
155
  "properties": {
156
+ "source": {
157
+ "description": "Project-level source id from .zsk/config.yaml.",
158
+ "type": "string",
159
+ "minLength": 1
160
+ },
164
161
  "path": {
165
162
  "$ref": "#/$defs/pathRef"
166
163
  },
164
+ "paths": {
165
+ "$ref": "#/$defs/pathList"
166
+ },
167
167
  "sections": {
168
- "description": "Relevant SRS sections for this module.",
168
+ "description": "Relevant source sections for this module.",
169
169
  "type": "array",
170
170
  "items": {
171
171
  "type": "string",
@@ -174,7 +174,7 @@
174
174
  "uniqueItems": true
175
175
  },
176
176
  "anchors": {
177
- "description": "Stable raw-source anchors such as FR/AC IDs.",
177
+ "description": "Stable source anchors such as FR/AC IDs.",
178
178
  "type": "array",
179
179
  "items": {
180
180
  "type": "string",
@@ -185,7 +185,18 @@
185
185
  "metadata": {
186
186
  "$ref": "#/$defs/metadata"
187
187
  }
188
- }
188
+ },
189
+ "anyOf": [
190
+ {
191
+ "required": ["source"]
192
+ },
193
+ {
194
+ "required": ["path"]
195
+ },
196
+ {
197
+ "required": ["paths"]
198
+ }
199
+ ]
189
200
  },
190
201
  "toolName": {
191
202
  "description": "Known runtime/design verification tool.",