@galaxy-tool-util/cli 0.2.0 → 1.0.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 (104) hide show
  1. package/dist/bin/gxwf.js +51 -19
  2. package/dist/bin/gxwf.js.map +1 -1
  3. package/dist/commands/add.js +2 -2
  4. package/dist/commands/add.js.map +1 -1
  5. package/dist/commands/clean-tree.d.ts +3 -17
  6. package/dist/commands/clean-tree.d.ts.map +1 -1
  7. package/dist/commands/clean-tree.js +30 -29
  8. package/dist/commands/clean-tree.js.map +1 -1
  9. package/dist/commands/clean.d.ts +3 -0
  10. package/dist/commands/clean.d.ts.map +1 -1
  11. package/dist/commands/clean.js +12 -2
  12. package/dist/commands/clean.js.map +1 -1
  13. package/dist/commands/clear.js +4 -4
  14. package/dist/commands/clear.js.map +1 -1
  15. package/dist/commands/convert-tree.d.ts +2 -1
  16. package/dist/commands/convert-tree.d.ts.map +1 -1
  17. package/dist/commands/convert-tree.js +23 -7
  18. package/dist/commands/convert-tree.js.map +1 -1
  19. package/dist/commands/convert.d.ts +2 -1
  20. package/dist/commands/convert.d.ts.map +1 -1
  21. package/dist/commands/convert.js +36 -4
  22. package/dist/commands/convert.js.map +1 -1
  23. package/dist/commands/info.d.ts.map +1 -1
  24. package/dist/commands/info.js +5 -4
  25. package/dist/commands/info.js.map +1 -1
  26. package/dist/commands/lint-tree.d.ts +3 -19
  27. package/dist/commands/lint-tree.d.ts.map +1 -1
  28. package/dist/commands/lint-tree.js +46 -58
  29. package/dist/commands/lint-tree.js.map +1 -1
  30. package/dist/commands/lint.d.ts +8 -4
  31. package/dist/commands/lint.d.ts.map +1 -1
  32. package/dist/commands/lint.js +61 -13
  33. package/dist/commands/lint.js.map +1 -1
  34. package/dist/commands/list.js +3 -3
  35. package/dist/commands/list.js.map +1 -1
  36. package/dist/commands/mermaid.d.ts +6 -0
  37. package/dist/commands/mermaid.d.ts.map +1 -0
  38. package/dist/commands/mermaid.js +22 -0
  39. package/dist/commands/mermaid.js.map +1 -0
  40. package/dist/commands/populate-workflow.js +2 -2
  41. package/dist/commands/populate-workflow.js.map +1 -1
  42. package/dist/commands/render-results.d.ts +3 -3
  43. package/dist/commands/render-results.d.ts.map +1 -1
  44. package/dist/commands/render-results.js +8 -4
  45. package/dist/commands/render-results.js.map +1 -1
  46. package/dist/commands/report-output.d.ts +34 -0
  47. package/dist/commands/report-output.d.ts.map +1 -0
  48. package/dist/commands/report-output.js +70 -0
  49. package/dist/commands/report-output.js.map +1 -0
  50. package/dist/commands/resolve-tool.d.ts +2 -1
  51. package/dist/commands/resolve-tool.d.ts.map +1 -1
  52. package/dist/commands/resolve-tool.js +1 -1
  53. package/dist/commands/resolve-tool.js.map +1 -1
  54. package/dist/commands/roundtrip-tree.d.ts +3 -1
  55. package/dist/commands/roundtrip-tree.d.ts.map +1 -1
  56. package/dist/commands/roundtrip-tree.js +67 -5
  57. package/dist/commands/roundtrip-tree.js.map +1 -1
  58. package/dist/commands/roundtrip.d.ts +2 -1
  59. package/dist/commands/roundtrip.d.ts.map +1 -1
  60. package/dist/commands/roundtrip.js +30 -8
  61. package/dist/commands/roundtrip.js.map +1 -1
  62. package/dist/commands/schema.js +2 -2
  63. package/dist/commands/schema.js.map +1 -1
  64. package/dist/commands/strict-options.d.ts +22 -0
  65. package/dist/commands/strict-options.d.ts.map +1 -0
  66. package/dist/commands/strict-options.js +18 -0
  67. package/dist/commands/strict-options.js.map +1 -0
  68. package/dist/commands/validate-tests-tree.d.ts +36 -0
  69. package/dist/commands/validate-tests-tree.d.ts.map +1 -0
  70. package/dist/commands/validate-tests-tree.js +191 -0
  71. package/dist/commands/validate-tests-tree.js.map +1 -0
  72. package/dist/commands/validate-tests.d.ts +21 -0
  73. package/dist/commands/validate-tests.d.ts.map +1 -0
  74. package/dist/commands/validate-tests.js +83 -0
  75. package/dist/commands/validate-tests.js.map +1 -0
  76. package/dist/commands/validate-tree.d.ts +3 -20
  77. package/dist/commands/validate-tree.d.ts.map +1 -1
  78. package/dist/commands/validate-tree.js +53 -47
  79. package/dist/commands/validate-tree.js.map +1 -1
  80. package/dist/commands/validate-workflow-json-schema.d.ts +8 -2
  81. package/dist/commands/validate-workflow-json-schema.d.ts.map +1 -1
  82. package/dist/commands/validate-workflow-json-schema.js +104 -58
  83. package/dist/commands/validate-workflow-json-schema.js.map +1 -1
  84. package/dist/commands/validate-workflow.d.ts +17 -10
  85. package/dist/commands/validate-workflow.d.ts.map +1 -1
  86. package/dist/commands/validate-workflow.js +185 -59
  87. package/dist/commands/validate-workflow.js.map +1 -1
  88. package/dist/commands/workflow-io.d.ts +2 -11
  89. package/dist/commands/workflow-io.d.ts.map +1 -1
  90. package/dist/commands/workflow-io.js +7 -16
  91. package/dist/commands/workflow-io.js.map +1 -1
  92. package/dist/index.d.ts +15 -0
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +12 -0
  95. package/dist/index.js.map +1 -1
  96. package/dist/workflow/_templates-bundled.d.ts +2 -0
  97. package/dist/workflow/_templates-bundled.d.ts.map +1 -0
  98. package/dist/workflow/_templates-bundled.js +324 -0
  99. package/dist/workflow/_templates-bundled.js.map +1 -0
  100. package/dist/workflow/report-templates.d.ts +13 -0
  101. package/dist/workflow/report-templates.d.ts.map +1 -0
  102. package/dist/workflow/report-templates.js +91 -0
  103. package/dist/workflow/report-templates.js.map +1 -0
  104. package/package.json +7 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strict-options.js","sourceRoot":"","sources":["../../src/commands/strict-options.ts"],"names":[],"mappings":"AAoBA,iEAAiE;AACjE,MAAM,UAAU,oBAAoB,CAAC,IAAmB;IACtD,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1B,OAAO;QACL,eAAe,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe;QAC9C,cAAc,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc;QAC5C,WAAW,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW;KACvC,CAAC;AACJ,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,OAAO,GAAG;SACP,MAAM,CAAC,UAAU,EAAE,mEAAmE,CAAC;SACvF,MAAM,CAAC,oBAAoB,EAAE,4CAA4C,CAAC;SAC1E,MAAM,CAAC,mBAAmB,EAAE,wDAAwD,CAAC;SACrF,MAAM,CAAC,gBAAgB,EAAE,uDAAuD,CAAC,CAAC;AACvF,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * ``gxwf validate-tests-tree`` — batch-validate every workflow-test file
3
+ * (``*-tests.yml``, ``*-tests.yaml``, ``*.gxwf-tests.yml``, ``*.gxwf-tests.yaml``)
4
+ * under a directory against the ``galaxy.tool_util_models.Tests`` JSON Schema.
5
+ *
6
+ * Unlike ``validate-tree`` this uses its own discovery pass because test
7
+ * documents don't carry a ``class: GalaxyWorkflow`` / ``a_galaxy_workflow``
8
+ * marker — classification is filename-based.
9
+ *
10
+ * With ``--auto-workflow``, each test file is paired with a sibling workflow
11
+ * by suffix convention and cross-checked. Silent no-op when no sibling is
12
+ * found.
13
+ */
14
+ import { type TestFormatDiagnostic } from "@galaxy-tool-util/schema";
15
+ export interface ValidateTestsTreeOptions {
16
+ json?: boolean;
17
+ autoWorkflow?: boolean;
18
+ }
19
+ export interface TestsTreeFileReport {
20
+ path: string;
21
+ valid: boolean;
22
+ errors: TestFormatDiagnostic[];
23
+ workflow?: string;
24
+ }
25
+ export interface ValidateTestsTreeReport {
26
+ root: string;
27
+ files: TestsTreeFileReport[];
28
+ summary: {
29
+ total: number;
30
+ ok: number;
31
+ fail: number;
32
+ error: number;
33
+ };
34
+ }
35
+ export declare function runValidateTestsTree(dir: string, opts?: ValidateTestsTreeOptions): Promise<void>;
36
+ //# sourceMappingURL=validate-tests-tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-tests-tree.d.ts","sourceRoot":"","sources":["../../src/commands/validate-tests-tree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAML,KAAK,oBAAoB,EAE1B,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACrE;AAuID,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,wBAA6B,GAClC,OAAO,CAAC,IAAI,CAAC,CA6Cf"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * ``gxwf validate-tests-tree`` — batch-validate every workflow-test file
3
+ * (``*-tests.yml``, ``*-tests.yaml``, ``*.gxwf-tests.yml``, ``*.gxwf-tests.yaml``)
4
+ * under a directory against the ``galaxy.tool_util_models.Tests`` JSON Schema.
5
+ *
6
+ * Unlike ``validate-tree`` this uses its own discovery pass because test
7
+ * documents don't carry a ``class: GalaxyWorkflow`` / ``a_galaxy_workflow``
8
+ * marker — classification is filename-based.
9
+ *
10
+ * With ``--auto-workflow``, each test file is paired with a sibling workflow
11
+ * by suffix convention and cross-checked. Silent no-op when no sibling is
12
+ * found.
13
+ */
14
+ import { readdir, readFile, stat } from "node:fs/promises";
15
+ import { dirname, join, relative } from "node:path";
16
+ import { parse as parseYaml } from "yaml";
17
+ import { checkTestsAgainstWorkflow, extractWorkflowInputs, extractWorkflowOutputs, resolveFormat, validateTestsFile, } from "@galaxy-tool-util/schema";
18
+ const EXCLUDE_DIRS = new Set([".git", ".hg", ".venv", "node_modules", "__pycache__", ".snakemake"]);
19
+ const TEST_SUFFIXES = [".gxwf-tests.yml", ".gxwf-tests.yaml", "-tests.yml", "-tests.yaml"];
20
+ const WORKFLOW_EXTS = [".gxwf.yml", ".gxwf.yaml", ".yml", ".yaml", ".ga"];
21
+ function isTestFile(name) {
22
+ return TEST_SUFFIXES.some((s) => name.endsWith(s));
23
+ }
24
+ /**
25
+ * Derive the workflow basename a given tests file pairs with.
26
+ * `foo.gxwf-tests.yml` → `foo`; `bar-tests.yml` → `bar`.
27
+ */
28
+ function stripTestsSuffix(name) {
29
+ for (const suffix of TEST_SUFFIXES) {
30
+ if (name.endsWith(suffix))
31
+ return name.slice(0, -suffix.length);
32
+ }
33
+ return undefined;
34
+ }
35
+ async function fileExists(path) {
36
+ try {
37
+ const s = await stat(path);
38
+ return s.isFile();
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }
44
+ /**
45
+ * Locate a sibling workflow for a tests file. Returns the first existing
46
+ * candidate in suffix-priority order, or undefined if none found.
47
+ */
48
+ async function findSiblingWorkflow(testsPath) {
49
+ const base = stripTestsSuffix(testsPath.split("/").pop() ?? "");
50
+ if (!base)
51
+ return undefined;
52
+ const dir = dirname(testsPath);
53
+ for (const ext of WORKFLOW_EXTS) {
54
+ const candidate = join(dir, `${base}${ext}`);
55
+ if (await fileExists(candidate))
56
+ return candidate;
57
+ }
58
+ return undefined;
59
+ }
60
+ async function loadWorkflowShape(path) {
61
+ const raw = await readFile(path, "utf-8");
62
+ const parsed = path.endsWith(".ga") || path.endsWith(".json") ? JSON.parse(raw) : parseYaml(raw);
63
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
64
+ throw new Error(`Workflow ${path} did not parse to an object.`);
65
+ }
66
+ const dict = parsed;
67
+ const format = resolveFormat(dict);
68
+ return {
69
+ inputs: extractWorkflowInputs(dict, format),
70
+ outputs: extractWorkflowOutputs(dict, format),
71
+ };
72
+ }
73
+ async function discoverTestFiles(root) {
74
+ const out = [];
75
+ await walk(root, out);
76
+ out.sort();
77
+ return out;
78
+ }
79
+ async function walk(dir, out) {
80
+ let entries;
81
+ try {
82
+ entries = await readdir(dir, { withFileTypes: true });
83
+ }
84
+ catch {
85
+ return;
86
+ }
87
+ for (const entry of entries) {
88
+ if (entry.isDirectory()) {
89
+ if (!EXCLUDE_DIRS.has(entry.name)) {
90
+ await walk(join(dir, entry.name), out);
91
+ }
92
+ continue;
93
+ }
94
+ if (entry.isFile() && isTestFile(entry.name)) {
95
+ out.push(join(dir, entry.name));
96
+ }
97
+ }
98
+ }
99
+ async function validateOne(path, root, autoWorkflow) {
100
+ const rel = relative(root, path);
101
+ let parsed;
102
+ try {
103
+ const raw = await readFile(path, "utf-8");
104
+ parsed = parseYaml(raw);
105
+ }
106
+ catch (err) {
107
+ const msg = err instanceof Error ? err.message : String(err);
108
+ return {
109
+ path: rel,
110
+ valid: false,
111
+ loadError: true,
112
+ errors: [
113
+ { path: "(root)", message: `YAML parse error: ${msg}`, keyword: "yaml", params: {} },
114
+ ],
115
+ };
116
+ }
117
+ const { valid: schemaValid, errors } = validateTestsFile(parsed);
118
+ const allErrors = [...errors];
119
+ let pairedWorkflow;
120
+ if (autoWorkflow) {
121
+ const sibling = await findSiblingWorkflow(path);
122
+ if (sibling) {
123
+ pairedWorkflow = relative(root, sibling);
124
+ try {
125
+ const shape = await loadWorkflowShape(sibling);
126
+ allErrors.push(...checkTestsAgainstWorkflow(parsed, shape));
127
+ }
128
+ catch (err) {
129
+ const msg = err instanceof Error ? err.message : String(err);
130
+ allErrors.push({
131
+ path: "(root)",
132
+ message: `Failed to load workflow ${pairedWorkflow}: ${msg}`,
133
+ keyword: "workflow_load_error",
134
+ params: { workflow: pairedWorkflow },
135
+ });
136
+ }
137
+ }
138
+ }
139
+ const valid = schemaValid && allErrors.length === 0;
140
+ const report = { path: rel, valid, errors: allErrors };
141
+ if (pairedWorkflow)
142
+ report.workflow = pairedWorkflow;
143
+ return report;
144
+ }
145
+ export async function runValidateTestsTree(dir, opts = {}) {
146
+ const paths = await discoverTestFiles(dir);
147
+ const files = [];
148
+ for (const p of paths) {
149
+ files.push(await validateOne(p, dir, opts.autoWorkflow === true));
150
+ }
151
+ const summary = {
152
+ total: files.length,
153
+ ok: files.filter((f) => f.valid).length,
154
+ fail: files.filter((f) => !f.valid && !f.loadError).length,
155
+ error: files.filter((f) => f.loadError).length,
156
+ };
157
+ const report = {
158
+ root: dir,
159
+ files: files.map(({ path, valid, errors, workflow }) => {
160
+ const entry = { path, valid, errors };
161
+ if (workflow)
162
+ entry.workflow = workflow;
163
+ return entry;
164
+ }),
165
+ summary,
166
+ };
167
+ if (opts.json) {
168
+ console.log(JSON.stringify(report, null, 2));
169
+ }
170
+ else {
171
+ for (const f of files) {
172
+ const wfNote = f.workflow ? ` [workflow: ${f.workflow}]` : "";
173
+ if (f.loadError) {
174
+ console.error(` ${f.path}: ERROR (${f.errors[0]?.message ?? "load failed"})`);
175
+ }
176
+ else if (f.valid) {
177
+ console.log(` ${f.path}: OK${wfNote}`);
178
+ }
179
+ else {
180
+ console.error(` ${f.path}: ${f.errors.length} validation error(s)${wfNote}`);
181
+ for (const e of f.errors) {
182
+ console.error(` ${e.path}: ${e.message} [${e.keyword}]`);
183
+ }
184
+ }
185
+ }
186
+ const s = summary;
187
+ console.log(`\nSummary: ${s.total} files | ${s.ok} OK, ${s.fail} FAIL, ${s.error} ERROR`);
188
+ }
189
+ process.exitCode = summary.fail > 0 || summary.error > 0 ? 1 : 0;
190
+ }
191
+ //# sourceMappingURL=validate-tests-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-tests-tree.js","sourceRoot":"","sources":["../../src/commands/validate-tests-tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * ``gxwf validate-tests`` — validate a workflow-test file (``*-tests.yml`` /
3
+ * ``*.gxwf-tests.yml``) against the JSON Schema synced from Galaxy's
4
+ * ``galaxy.tool_util_models.Tests`` Pydantic model.
5
+ *
6
+ * With ``--workflow <path>`` also cross-checks inputs/outputs against the
7
+ * referenced workflow: unknown job keys, missing required inputs, type
8
+ * mismatches, unknown output assertions.
9
+ */
10
+ import { type TestFormatDiagnostic } from "@galaxy-tool-util/schema";
11
+ export interface ValidateTestsOptions {
12
+ json?: boolean;
13
+ workflow?: string;
14
+ }
15
+ export interface ValidateTestsReport {
16
+ file: string;
17
+ valid: boolean;
18
+ errors: TestFormatDiagnostic[];
19
+ }
20
+ export declare function runValidateTests(filePath: string, opts?: ValidateTestsOptions): Promise<void>;
21
+ //# sourceMappingURL=validate-tests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-tests.d.ts","sourceRoot":"","sources":["../../src/commands/validate-tests.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAML,KAAK,oBAAoB,EAE1B,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,oBAAoB,EAAE,CAAC;CAChC;AAiBD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAwDf"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * ``gxwf validate-tests`` — validate a workflow-test file (``*-tests.yml`` /
3
+ * ``*.gxwf-tests.yml``) against the JSON Schema synced from Galaxy's
4
+ * ``galaxy.tool_util_models.Tests`` Pydantic model.
5
+ *
6
+ * With ``--workflow <path>`` also cross-checks inputs/outputs against the
7
+ * referenced workflow: unknown job keys, missing required inputs, type
8
+ * mismatches, unknown output assertions.
9
+ */
10
+ import { readFile } from "node:fs/promises";
11
+ import { parse as parseYaml } from "yaml";
12
+ import { checkTestsAgainstWorkflow, extractWorkflowInputs, extractWorkflowOutputs, resolveFormat, validateTestsFile, } from "@galaxy-tool-util/schema";
13
+ async function loadWorkflowShape(path) {
14
+ const raw = await readFile(path, "utf-8");
15
+ const parsed = path.endsWith(".ga") || path.endsWith(".json") ? JSON.parse(raw) : parseYaml(raw);
16
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
17
+ throw new Error(`Workflow ${path} did not parse to an object.`);
18
+ }
19
+ const dict = parsed;
20
+ const format = resolveFormat(dict);
21
+ return {
22
+ inputs: extractWorkflowInputs(dict, format),
23
+ outputs: extractWorkflowOutputs(dict, format),
24
+ };
25
+ }
26
+ export async function runValidateTests(filePath, opts = {}) {
27
+ const raw = await readFile(filePath, "utf-8");
28
+ let parsed;
29
+ try {
30
+ parsed = parseYaml(raw);
31
+ }
32
+ catch (err) {
33
+ const msg = err instanceof Error ? err.message : String(err);
34
+ if (opts.json) {
35
+ const report = {
36
+ file: filePath,
37
+ valid: false,
38
+ errors: [
39
+ { path: "(root)", message: `YAML parse error: ${msg}`, keyword: "yaml", params: {} },
40
+ ],
41
+ };
42
+ console.log(JSON.stringify(report, null, 2));
43
+ }
44
+ else {
45
+ console.error(`${filePath}: YAML parse error: ${msg}`);
46
+ }
47
+ process.exitCode = 2;
48
+ return;
49
+ }
50
+ const { valid: schemaValid, errors } = validateTestsFile(parsed);
51
+ const allErrors = [...errors];
52
+ if (opts.workflow) {
53
+ try {
54
+ const shape = await loadWorkflowShape(opts.workflow);
55
+ allErrors.push(...checkTestsAgainstWorkflow(parsed, shape));
56
+ }
57
+ catch (err) {
58
+ const msg = err instanceof Error ? err.message : String(err);
59
+ allErrors.push({
60
+ path: "(root)",
61
+ message: `Failed to load workflow ${opts.workflow}: ${msg}`,
62
+ keyword: "workflow_load_error",
63
+ params: { workflow: opts.workflow },
64
+ });
65
+ }
66
+ }
67
+ const valid = schemaValid && allErrors.length === 0;
68
+ if (opts.json) {
69
+ const report = { file: filePath, valid, errors: allErrors };
70
+ console.log(JSON.stringify(report, null, 2));
71
+ }
72
+ else if (valid) {
73
+ console.log(`${filePath}: OK`);
74
+ }
75
+ else {
76
+ console.error(`${filePath}: ${allErrors.length} validation error(s)`);
77
+ for (const e of allErrors) {
78
+ console.error(` ${e.path}: ${e.message} [${e.keyword}]`);
79
+ }
80
+ }
81
+ process.exitCode = valid ? 0 : 1;
82
+ }
83
+ //# sourceMappingURL=validate-tests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-tests.js","sourceRoot":"","sources":["../../src/commands/validate-tests.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,aAAa,EACb,iBAAiB,GAGlB,MAAM,0BAA0B,CAAC;AAalC,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAC3C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,MAAM,GACV,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACpF,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,8BAA8B,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,IAAI,GAAG,MAAiC,CAAC;IAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO;QACL,MAAM,EAAE,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC;QAC3C,OAAO,EAAE,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,OAA6B,EAAE;IAE/B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,MAAM,GAAwB;gBAClC,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE;oBACN,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,qBAAqB,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;iBACrF;aACF,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,GAAG,QAAQ,uBAAuB,GAAG,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IAE9B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrD,SAAS,CAAC,IAAI,CAAC,GAAG,yBAAyB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,2BAA2B,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE;gBAC3D,OAAO,EAAE,qBAAqB;gBAC9B,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;aACpC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC;IAEpD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,MAAM,GAAwB,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,IAAI,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,MAAM,CAAC,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,GAAG,QAAQ,KAAK,SAAS,CAAC,MAAM,sBAAsB,CAAC,CAAC;QACtE,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC"}
@@ -1,6 +1,6 @@
1
- import { type StepValidationResult } from "./validate-workflow.js";
2
- import { type TreeSummary } from "./tree.js";
3
- export interface ValidateTreeOptions {
1
+ import { type StrictOptions } from "./strict-options.js";
2
+ import { type ReportOutputOptions } from "./report-output.js";
3
+ export interface ValidateTreeOptions extends StrictOptions, ReportOutputOptions {
4
4
  format?: string;
5
5
  toolState?: boolean;
6
6
  cacheDir?: string;
@@ -8,22 +8,5 @@ export interface ValidateTreeOptions {
8
8
  toolSchemaDir?: string;
9
9
  json?: boolean;
10
10
  }
11
- export interface WorkflowValidateResult {
12
- relativePath: string;
13
- format: string;
14
- steps: StepValidationResult[];
15
- }
16
- export interface ValidateTreeReport {
17
- root: string;
18
- results: (WorkflowValidateResult | {
19
- relativePath: string;
20
- error: string;
21
- })[];
22
- summary: TreeSummary & {
23
- stepOk: number;
24
- stepFail: number;
25
- stepSkip: number;
26
- };
27
- }
28
11
  export declare function runValidateTree(dir: string, opts: ValidateTreeOptions): Promise<void>;
29
12
  //# sourceMappingURL=validate-tree.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate-tree.d.ts","sourceRoot":"","sources":["../../src/commands/validate-tree.ts"],"names":[],"mappings":"AAQA,OAAO,EAGL,KAAK,oBAAoB,EAE1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAmD,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAE9F,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,oBAAoB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,sBAAsB,GAAG;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IAC9E,OAAO,EAAE,WAAW,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/E;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsF3F"}
1
+ {"version":3,"file":"validate-tree.d.ts","sourceRoot":"","sources":["../../src/commands/validate-tree.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAQ/E,OAAO,EAAsC,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAElG,MAAM,WAAW,mBAAoB,SAAQ,aAAa,EAAE,mBAAmB;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyG3F"}
@@ -1,19 +1,19 @@
1
- /**
2
- * `gxwf validate-tree` batch validate all workflows under a directory.
3
- */
4
- import { ToolCache } from "@galaxy-tool-util/core";
1
+ import { makeNodeToolCache } from "@galaxy-tool-util/core/node";
2
+ import { checkStrictEncoding, checkStrictStructure, buildWorkflowValidationResult, buildTreeValidationReport, } from "@galaxy-tool-util/schema";
5
3
  import { dirname } from "node:path";
6
4
  import { createDefaultResolver } from "./url-resolver.js";
5
+ import { resolveStrictOptions } from "./strict-options.js";
7
6
  import { resolveFormat } from "./workflow-io.js";
8
7
  import { validateNativeSteps, validateFormat2Steps, } from "./validate-workflow.js";
9
- import { collectTree, summarizeOutcomes } from "./tree.js";
8
+ import { collectTree } from "./tree.js";
9
+ import { writeReportOutput, writeReportHtml } from "./report-output.js";
10
10
  export async function runValidateTree(dir, opts) {
11
11
  const mode = opts.mode === "json-schema" ? "json-schema" : "effect";
12
12
  // Load tool cache once for all files
13
13
  let cache;
14
14
  if (opts.toolState !== false) {
15
15
  try {
16
- cache = new ToolCache({ cacheDir: opts.cacheDir });
16
+ cache = makeNodeToolCache({ cacheDir: opts.cacheDir });
17
17
  await cache.index.load();
18
18
  }
19
19
  catch (e) {
@@ -29,89 +29,95 @@ export async function runValidateTree(dir, opts) {
29
29
  validateNativeStepsJsonSchema = (data, cache, prefix, expansionOpts) => mod.validateNativeStepsJsonSchema(data, cache, opts.toolSchemaDir, prefix, expansionOpts);
30
30
  validateFormat2StepsJsonSchema = (data, cache, prefix, expansionOpts) => mod.validateFormat2StepsJsonSchema(data, cache, opts.toolSchemaDir, prefix, expansionOpts);
31
31
  }
32
+ const strict = resolveStrictOptions(opts);
32
33
  const treeResult = await collectTree(dir, async (info, data) => {
33
34
  const format = resolveFormat(data, opts.format);
35
+ // Per-file strict checks
36
+ if (strict.strictEncoding) {
37
+ const encErrors = checkStrictEncoding(data, format);
38
+ if (encErrors.length > 0) {
39
+ throw new Error(`Encoding: ${encErrors.join("; ")}`);
40
+ }
41
+ }
42
+ if (strict.strictStructure) {
43
+ const structErrors = checkStrictStructure(data, format);
44
+ if (structErrors.length > 0) {
45
+ throw new Error(`Structure: ${structErrors.join("; ")}`);
46
+ }
47
+ }
34
48
  const expansionOpts = {
35
49
  resolver: createDefaultResolver({ workflowDirectory: dirname(info.path) }),
36
50
  };
37
- let steps = [];
51
+ let stepResults = [];
38
52
  if (cache && opts.toolState !== false) {
39
53
  const validateNative = validateNativeStepsJsonSchema ?? validateNativeSteps;
40
54
  const validateF2 = validateFormat2StepsJsonSchema ?? validateFormat2Steps;
41
- steps =
55
+ stepResults =
42
56
  format === "native"
43
57
  ? await validateNative(data, cache, "", expansionOpts)
44
58
  : await validateF2(data, cache, "", expansionOpts);
45
59
  }
46
- return { relativePath: info.relativePath, format, steps };
60
+ // --strict-state: promote skips to failures
61
+ if (strict.strictState && stepResults.some((s) => s.status !== "ok" && s.status !== "fail")) {
62
+ throw new Error("Strict state: skipped steps not allowed");
63
+ }
64
+ return buildWorkflowValidationResult(info.relativePath, stepResults);
47
65
  });
48
- const report = buildValidateReport(treeResult);
66
+ const report = buildReport(treeResult);
67
+ await writeReportOutput("validate_tree.md.j2", report, { reportMarkdown: opts.reportMarkdown });
68
+ await writeReportHtml("validate-tree", report, opts.reportHtml);
49
69
  if (opts.json) {
50
70
  console.log(JSON.stringify(report, null, 2));
51
71
  process.exitCode = computeValidateExitCode(report);
52
72
  return;
53
73
  }
54
74
  // Text output
55
- for (const outcome of treeResult.outcomes) {
56
- if (outcome.error) {
57
- console.error(` ${outcome.info.relativePath}: ERROR (${outcome.error})`);
75
+ for (const wf of report.workflows) {
76
+ if (wf.error) {
77
+ console.error(` ${wf.path}: ERROR (${wf.error})`);
58
78
  continue;
59
79
  }
60
- if (outcome.skipped) {
61
- console.warn(` ${outcome.info.relativePath}: SKIPPED (${outcome.skipReason})`);
80
+ if (wf.skipped_reason) {
81
+ console.warn(` ${wf.path}: SKIPPED (${wf.skipped_reason})`);
62
82
  continue;
63
83
  }
64
- const r = outcome.result;
65
- const ok = r.steps.filter((s) => s.status === "ok").length;
66
- const fail = r.steps.filter((s) => s.status === "fail").length;
67
- const skip = r.steps.filter((s) => s.status === "skip").length;
68
- const total = r.steps.length;
69
- if (fail > 0) {
70
- console.error(` ${r.relativePath}: ${total} steps (${ok} OK, ${fail} FAIL, ${skip} SKIP)`);
71
- for (const s of r.steps.filter((s) => s.status === "fail")) {
72
- for (const err of s.errors) {
73
- console.error(` Step ${s.stepLabel} (${s.toolId}): ${err}`);
74
- }
84
+ const s = wf.summary;
85
+ const total = s.ok + s.fail + s.skip;
86
+ if (s.fail > 0) {
87
+ console.error(` ${wf.path}: ${total} steps (${s.ok} OK, ${s.fail} FAIL, ${s.skip} SKIP)`);
88
+ for (const f of wf.failures ?? []) {
89
+ console.error(` Step ${f.step} (${f.tool_id}): ${f.message}`);
75
90
  }
76
91
  }
77
92
  else {
78
- console.log(` ${r.relativePath}: ${total} steps (${ok} OK, ${skip} SKIP)`);
93
+ console.log(` ${wf.path}: ${total} steps (${s.ok} OK, ${s.skip} SKIP)`);
79
94
  }
80
95
  }
81
96
  const s = report.summary;
82
- console.log(`\nSummary: ${s.total} workflows | ${s.stepOk} OK, ${s.stepFail} FAIL, ${s.stepSkip} SKIP`);
97
+ const total = report.workflows.length;
98
+ console.log(`\nSummary: ${total} workflows | ${s.ok} OK, ${s.fail} FAIL, ${s.skip} SKIP`);
83
99
  process.exitCode = computeValidateExitCode(report);
84
100
  }
85
- function buildValidateReport(treeResult) {
86
- const results = [];
87
- let stepOk = 0;
88
- let stepFail = 0;
89
- let stepSkip = 0;
101
+ function buildReport(treeResult) {
102
+ const workflows = [];
90
103
  for (const o of treeResult.outcomes) {
91
104
  if (o.error) {
92
- results.push({ relativePath: o.info.relativePath, error: o.error });
105
+ workflows.push(buildWorkflowValidationResult(o.info.relativePath, [], { error: o.error }));
93
106
  continue;
94
107
  }
95
108
  if (o.skipped) {
96
- results.push({ relativePath: o.info.relativePath, error: `SKIPPED: ${o.skipReason}` });
109
+ workflows.push(buildWorkflowValidationResult(o.info.relativePath, [], {
110
+ skipped_reason: o.skipReason ?? null,
111
+ }));
97
112
  continue;
98
113
  }
99
- const r = o.result;
100
- results.push(r);
101
- stepOk += r.steps.filter((s) => s.status === "ok").length;
102
- stepFail += r.steps.filter((s) => s.status === "fail").length;
103
- stepSkip += r.steps.filter((s) => s.status === "skip").length;
114
+ workflows.push(o.result);
104
115
  }
105
- const wfSummary = summarizeOutcomes(treeResult.outcomes, (r) => r.steps.some((s) => s.status === "fail"));
106
- return {
107
- root: treeResult.root,
108
- results,
109
- summary: { ...wfSummary, stepOk, stepFail, stepSkip },
110
- };
116
+ return buildTreeValidationReport(treeResult.root, workflows);
111
117
  }
112
118
  function computeValidateExitCode(report) {
113
119
  const s = report.summary;
114
- if (s.stepFail > 0 || s.error > 0)
120
+ if (s.fail > 0 || s.error > 0)
115
121
  return 1;
116
122
  return 0;
117
123
  }
@@ -1 +1 @@
1
- {"version":3,"file":"validate-tree.js","sourceRoot":"","sources":["../../src/commands/validate-tree.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate-tree.js","sourceRoot":"","sources":["../../src/commands/validate-tree.ts"],"names":[],"mappings":"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"}
@@ -7,10 +7,16 @@
7
7
  *
8
8
  * Mirrors Galaxy's validation_json_schema.py.
9
9
  */
10
- import { ToolCache } from "@galaxy-tool-util/core";
10
+ import type { ToolCache } from "@galaxy-tool-util/core";
11
11
  import { type ExpansionOptions } from "@galaxy-tool-util/schema";
12
12
  import type { ValidateWorkflowOptions, WorkflowFormat, StepValidationResult } from "./validate-workflow.js";
13
- export declare function runValidateWorkflowJsonSchema(data: Record<string, unknown>, format: WorkflowFormat, opts: ValidateWorkflowOptions, expansionOpts?: ExpansionOptions): Promise<void>;
13
+ /**
14
+ * Validate workflow structure using the AJV-compiled JSON Schema (Draft 2020-12).
15
+ * Returns an array of error strings; empty if valid.
16
+ * Mirrors `decodeStructureErrors` but uses the AJV path instead of Effect decode.
17
+ */
18
+ export declare function decodeStructureErrorsJsonSchema(data: Record<string, unknown>, format: WorkflowFormat): string[];
19
+ export declare function runValidateWorkflowJsonSchema(filePath: string, data: Record<string, unknown>, format: WorkflowFormat, opts: ValidateWorkflowOptions, expansionOpts?: ExpansionOptions): Promise<void>;
14
20
  export declare function validateNativeStepsJsonSchema(data: Record<string, unknown>, cache: ToolCache, toolSchemaDir?: string, prefix?: string, expansionOpts?: ExpansionOptions): Promise<StepValidationResult[]>;
15
21
  export declare function validateFormat2StepsJsonSchema(data: Record<string, unknown>, cache: ToolCache, toolSchemaDir?: string, prefix?: string, expansionOpts?: ExpansionOptions): Promise<StepValidationResult[]>;
16
22
  //# sourceMappingURL=validate-workflow-json-schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate-workflow-json-schema.d.ts","sourceRoot":"","sources":["../../src/commands/validate-workflow-json-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAcL,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAC;AAMlC,OAAO,KAAK,EACV,uBAAuB,EACvB,cAAc,EACd,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AA4HhC,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,uBAAuB,EAC7B,aAAa,CAAC,EAAE,gBAAgB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAqFf;AAID,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,SAAS,EAChB,aAAa,CAAC,EAAE,MAAM,EACtB,MAAM,SAAK,EACX,aAAa,CAAC,EAAE,gBAAgB,GAC/B,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAGjC;AA4GD,wBAAsB,8BAA8B,CAClD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,SAAS,EAChB,aAAa,CAAC,EAAE,MAAM,EACtB,MAAM,SAAK,EACX,aAAa,CAAC,EAAE,gBAAgB,GAC/B,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAGjC"}
1
+ {"version":3,"file":"validate-workflow-json-schema.d.ts","sourceRoot":"","sources":["../../src/commands/validate-workflow-json-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAeL,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAC;AAOlC,OAAO,KAAK,EACV,uBAAuB,EACvB,cAAc,EACd,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AA0HhC;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,cAAc,GACrB,MAAM,EAAE,CAOV;AAID,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,uBAAuB,EAC7B,aAAa,CAAC,EAAE,gBAAgB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAsGf;AAID,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,SAAS,EAChB,aAAa,CAAC,EAAE,MAAM,EACtB,MAAM,SAAK,EACX,aAAa,CAAC,EAAE,gBAAgB,GAC/B,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAGjC;AAwHD,wBAAsB,8BAA8B,CAClD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,SAAS,EAChB,aAAa,CAAC,EAAE,MAAM,EACtB,MAAM,SAAK,EACX,aAAa,CAAC,EAAE,gBAAgB,GAC/B,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAGjC"}