@galaxy-tool-util/cli 0.1.0 → 0.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 (121) hide show
  1. package/LICENSE +21 -0
  2. package/dist/bin/galaxy-tool-cache.js +15 -0
  3. package/dist/bin/galaxy-tool-cache.js.map +1 -1
  4. package/dist/bin/gxwf.d.ts +3 -0
  5. package/dist/bin/gxwf.d.ts.map +1 -0
  6. package/dist/bin/gxwf.js +150 -0
  7. package/dist/bin/gxwf.js.map +1 -0
  8. package/dist/commands/add.js +2 -2
  9. package/dist/commands/add.js.map +1 -1
  10. package/dist/commands/clean-tree.d.ts +9 -0
  11. package/dist/commands/clean-tree.d.ts.map +1 -0
  12. package/dist/commands/clean-tree.js +69 -0
  13. package/dist/commands/clean-tree.js.map +1 -0
  14. package/dist/commands/clean.d.ts +10 -0
  15. package/dist/commands/clean.d.ts.map +1 -0
  16. package/dist/commands/clean.js +48 -0
  17. package/dist/commands/clean.js.map +1 -0
  18. package/dist/commands/clear.js +4 -4
  19. package/dist/commands/clear.js.map +1 -1
  20. package/dist/commands/convert-tree.d.ts +32 -0
  21. package/dist/commands/convert-tree.d.ts.map +1 -0
  22. package/dist/commands/convert-tree.js +229 -0
  23. package/dist/commands/convert-tree.js.map +1 -0
  24. package/dist/commands/convert.d.ts +13 -0
  25. package/dist/commands/convert.d.ts.map +1 -0
  26. package/dist/commands/convert.js +151 -0
  27. package/dist/commands/convert.js.map +1 -0
  28. package/dist/commands/info.d.ts.map +1 -1
  29. package/dist/commands/info.js +5 -4
  30. package/dist/commands/info.js.map +1 -1
  31. package/dist/commands/lint-tree.d.ts +11 -0
  32. package/dist/commands/lint-tree.d.ts.map +1 -0
  33. package/dist/commands/lint-tree.js +104 -0
  34. package/dist/commands/lint-tree.js.map +1 -0
  35. package/dist/commands/lint.d.ts +34 -0
  36. package/dist/commands/lint.d.ts.map +1 -0
  37. package/dist/commands/lint.js +195 -0
  38. package/dist/commands/lint.js.map +1 -0
  39. package/dist/commands/list.js +3 -3
  40. package/dist/commands/list.js.map +1 -1
  41. package/dist/commands/populate-workflow.d.ts +6 -0
  42. package/dist/commands/populate-workflow.d.ts.map +1 -0
  43. package/dist/commands/populate-workflow.js +55 -0
  44. package/dist/commands/populate-workflow.js.map +1 -0
  45. package/dist/commands/render-results.d.ts +11 -0
  46. package/dist/commands/render-results.d.ts.map +1 -0
  47. package/dist/commands/render-results.js +27 -0
  48. package/dist/commands/render-results.js.map +1 -0
  49. package/dist/commands/report-output.d.ts +34 -0
  50. package/dist/commands/report-output.d.ts.map +1 -0
  51. package/dist/commands/report-output.js +70 -0
  52. package/dist/commands/report-output.js.map +1 -0
  53. package/dist/commands/resolve-tool.js +1 -1
  54. package/dist/commands/resolve-tool.js.map +1 -1
  55. package/dist/commands/roundtrip-tree.d.ts +15 -0
  56. package/dist/commands/roundtrip-tree.d.ts.map +1 -0
  57. package/dist/commands/roundtrip-tree.js +178 -0
  58. package/dist/commands/roundtrip-tree.js.map +1 -0
  59. package/dist/commands/roundtrip.d.ts +31 -0
  60. package/dist/commands/roundtrip.d.ts.map +1 -0
  61. package/dist/commands/roundtrip.js +144 -0
  62. package/dist/commands/roundtrip.js.map +1 -0
  63. package/dist/commands/schema.js +2 -2
  64. package/dist/commands/schema.js.map +1 -1
  65. package/dist/commands/stateful-tool-inputs.d.ts +33 -0
  66. package/dist/commands/stateful-tool-inputs.d.ts.map +1 -0
  67. package/dist/commands/stateful-tool-inputs.js +73 -0
  68. package/dist/commands/stateful-tool-inputs.js.map +1 -0
  69. package/dist/commands/strict-options.d.ts +22 -0
  70. package/dist/commands/strict-options.d.ts.map +1 -0
  71. package/dist/commands/strict-options.js +18 -0
  72. package/dist/commands/strict-options.js.map +1 -0
  73. package/dist/commands/structural-schema.d.ts +6 -0
  74. package/dist/commands/structural-schema.d.ts.map +1 -0
  75. package/dist/commands/structural-schema.js +31 -0
  76. package/dist/commands/structural-schema.js.map +1 -0
  77. package/dist/commands/tree.d.ts +45 -0
  78. package/dist/commands/tree.d.ts.map +1 -0
  79. package/dist/commands/tree.js +155 -0
  80. package/dist/commands/tree.js.map +1 -0
  81. package/dist/commands/validate-tests-tree.d.ts +36 -0
  82. package/dist/commands/validate-tests-tree.d.ts.map +1 -0
  83. package/dist/commands/validate-tests-tree.js +191 -0
  84. package/dist/commands/validate-tests-tree.js.map +1 -0
  85. package/dist/commands/validate-tests.d.ts +21 -0
  86. package/dist/commands/validate-tests.d.ts.map +1 -0
  87. package/dist/commands/validate-tests.js +83 -0
  88. package/dist/commands/validate-tests.js.map +1 -0
  89. package/dist/commands/validate-tree.d.ts +12 -0
  90. package/dist/commands/validate-tree.d.ts.map +1 -0
  91. package/dist/commands/validate-tree.js +124 -0
  92. package/dist/commands/validate-tree.js.map +1 -0
  93. package/dist/commands/validate-workflow-json-schema.d.ts +8 -2
  94. package/dist/commands/validate-workflow-json-schema.d.ts.map +1 -1
  95. package/dist/commands/validate-workflow-json-schema.js +129 -50
  96. package/dist/commands/validate-workflow-json-schema.js.map +1 -1
  97. package/dist/commands/validate-workflow.d.ts +18 -10
  98. package/dist/commands/validate-workflow.d.ts.map +1 -1
  99. package/dist/commands/validate-workflow.js +215 -88
  100. package/dist/commands/validate-workflow.js.map +1 -1
  101. package/dist/commands/workflow-io.d.ts +7 -0
  102. package/dist/commands/workflow-io.d.ts.map +1 -0
  103. package/dist/commands/workflow-io.js +38 -0
  104. package/dist/commands/workflow-io.js.map +1 -0
  105. package/dist/index.d.ts +41 -0
  106. package/dist/index.d.ts.map +1 -1
  107. package/dist/index.js +36 -0
  108. package/dist/index.js.map +1 -1
  109. package/dist/workflow/_templates-bundled.d.ts +2 -0
  110. package/dist/workflow/_templates-bundled.d.ts.map +1 -0
  111. package/dist/workflow/_templates-bundled.js +324 -0
  112. package/dist/workflow/_templates-bundled.js.map +1 -0
  113. package/dist/workflow/report-templates.d.ts +13 -0
  114. package/dist/workflow/report-templates.d.ts.map +1 -0
  115. package/dist/workflow/report-templates.js +91 -0
  116. package/dist/workflow/report-templates.js.map +1 -0
  117. package/package.json +18 -16
  118. package/dist/bin/galaxy-workflow-validate.d.ts +0 -3
  119. package/dist/bin/galaxy-workflow-validate.d.ts.map +0 -1
  120. package/dist/bin/galaxy-workflow-validate.js +0 -17
  121. package/dist/bin/galaxy-workflow-validate.js.map +0 -1
@@ -0,0 +1,229 @@
1
+ import { makeNodeToolCache } from "@galaxy-tool-util/core/node";
2
+ import { toFormat2, toFormat2Stateful, toNative, toNativeStateful, checkStrictEncoding, checkStrictStructure, } from "@galaxy-tool-util/schema";
3
+ import { mkdir, writeFile } from "node:fs/promises";
4
+ import { dirname, join, basename } from "node:path";
5
+ import { loadToolInputsForWorkflow } from "./stateful-tool-inputs.js";
6
+ import { createDefaultResolver } from "./url-resolver.js";
7
+ import { resolveStrictOptions } from "./strict-options.js";
8
+ import { resolveFormat, serializeWorkflow } from "./workflow-io.js";
9
+ import { collectTree, summarizeOutcomes } from "./tree.js";
10
+ export async function runConvertTree(dir, opts) {
11
+ const outputDir = opts.outputDir;
12
+ if (!outputDir) {
13
+ console.error("--output-dir is required for convert-tree");
14
+ process.exitCode = 1;
15
+ return;
16
+ }
17
+ // Shared tool cache for stateful mode (loaded once per run)
18
+ let cache = null;
19
+ if (opts.stateful) {
20
+ cache = makeNodeToolCache({ cacheDir: opts.cacheDir });
21
+ await cache.index.load();
22
+ if ((await cache.index.listAll()).length === 0) {
23
+ console.warn("Tool cache is empty — stateful conversion will fall back for every step");
24
+ }
25
+ }
26
+ const strict = resolveStrictOptions(opts);
27
+ const treeResult = await collectTree(dir, async (info, data) => {
28
+ const sourceFormat = resolveFormat(data, opts.format);
29
+ const targetFormat = resolveTargetFormat(sourceFormat, opts.to);
30
+ // Per-file strict checks on input
31
+ if (strict.strictEncoding) {
32
+ const encErrors = checkStrictEncoding(data, sourceFormat);
33
+ if (encErrors.length > 0) {
34
+ throw new Error(`Encoding: ${encErrors.join("; ")}`);
35
+ }
36
+ }
37
+ if (strict.strictStructure) {
38
+ const structErrors = checkStrictStructure(data, sourceFormat);
39
+ if (structErrors.length > 0) {
40
+ throw new Error(`Structure: ${structErrors.join("; ")}`);
41
+ }
42
+ }
43
+ if (sourceFormat === targetFormat) {
44
+ return {
45
+ relativePath: info.relativePath,
46
+ sourceFormat,
47
+ targetFormat,
48
+ };
49
+ }
50
+ let result;
51
+ let statefulSteps;
52
+ let toolLoadErrors;
53
+ if (opts.stateful && cache) {
54
+ const expansionOpts = {
55
+ resolver: createDefaultResolver({
56
+ workflowDirectory: dirname(join(dir, info.relativePath)),
57
+ }),
58
+ };
59
+ const { resolver, status: toolStatus } = await loadToolInputsForWorkflow(data, sourceFormat, cache, expansionOpts);
60
+ const failedLoads = toolStatus.filter((s) => !s.loaded);
61
+ if (failedLoads.length > 0)
62
+ toolLoadErrors = failedLoads;
63
+ if (targetFormat === "format2") {
64
+ const r = toFormat2Stateful(data, resolver);
65
+ result = r.workflow;
66
+ statefulSteps = r.steps;
67
+ if (opts.compact)
68
+ stripPositionInfo(result);
69
+ }
70
+ else {
71
+ const r = toNativeStateful(data, resolver);
72
+ result = r.workflow;
73
+ statefulSteps = r.steps;
74
+ }
75
+ }
76
+ else if (targetFormat === "format2") {
77
+ result = toFormat2(data);
78
+ if (opts.compact) {
79
+ stripPositionInfo(result);
80
+ }
81
+ }
82
+ else {
83
+ result = toNative(data);
84
+ }
85
+ const serialized = serializeWorkflow(result, targetFormat, {
86
+ json: opts.json,
87
+ yaml: opts.yaml,
88
+ });
89
+ // Write to output dir, adjusting extension for target format
90
+ const outName = renameForFormat(info.relativePath, targetFormat);
91
+ const outPath = join(outputDir, outName);
92
+ await mkdir(dirname(outPath), { recursive: true });
93
+ await writeFile(outPath, serialized, "utf-8");
94
+ // --strict-state: require all stateful steps to convert successfully
95
+ if (strict.strictState && statefulSteps?.some((s) => !s.converted)) {
96
+ throw new Error("Strict state: all steps must convert successfully");
97
+ }
98
+ return {
99
+ relativePath: info.relativePath,
100
+ sourceFormat,
101
+ targetFormat,
102
+ statefulSteps,
103
+ toolLoadErrors,
104
+ };
105
+ });
106
+ const report = buildConvertReport(treeResult);
107
+ // Aggregate stateful step counts across files
108
+ let statefulFallbacks = 0;
109
+ if (opts.stateful) {
110
+ for (const r of report.results) {
111
+ if ("statefulSteps" in r && r.statefulSteps) {
112
+ statefulFallbacks += r.statefulSteps.filter((s) => !s.converted).length;
113
+ }
114
+ }
115
+ }
116
+ if (opts.reportJson) {
117
+ console.log(JSON.stringify(report, null, 2));
118
+ process.exitCode = report.summary.error > 0 || statefulFallbacks > 0 ? 1 : 0;
119
+ return;
120
+ }
121
+ // Text output
122
+ for (const outcome of treeResult.outcomes) {
123
+ if (outcome.error) {
124
+ console.error(` ${outcome.info.relativePath}: ERROR (${outcome.error})`);
125
+ continue;
126
+ }
127
+ const r = outcome.result;
128
+ if (r.sourceFormat === r.targetFormat) {
129
+ console.warn(` ${r.relativePath}: already ${r.targetFormat}, skipped`);
130
+ }
131
+ else {
132
+ let line = ` ${r.relativePath}: ${r.sourceFormat} → ${r.targetFormat}`;
133
+ if (r.statefulSteps) {
134
+ const converted = r.statefulSteps.filter((s) => s.converted).length;
135
+ line += ` [stateful ${converted}/${r.statefulSteps.length}]`;
136
+ }
137
+ console.log(line);
138
+ if (r.toolLoadErrors) {
139
+ for (const t of r.toolLoadErrors) {
140
+ const ver = t.toolVersion ? `@${t.toolVersion}` : "";
141
+ console.error(` tool ${t.toolId}${ver}: ${t.error}`);
142
+ }
143
+ }
144
+ }
145
+ }
146
+ const s = report.summary;
147
+ console.log(`\nSummary: ${s.total} workflows converted (written to ${outputDir})`);
148
+ if (opts.stateful) {
149
+ console.log(`Stateful: ${statefulFallbacks} step(s) fell back to schema-free`);
150
+ // Aggregate failure classes across all files
151
+ const byClass = new Map();
152
+ for (const r of report.results) {
153
+ if ("statefulSteps" in r && r.statefulSteps) {
154
+ for (const step of r.statefulSteps) {
155
+ if (!step.converted) {
156
+ const cls = step.failureClass ?? "unknown";
157
+ byClass.set(cls, (byClass.get(cls) ?? 0) + 1);
158
+ }
159
+ }
160
+ }
161
+ }
162
+ if (byClass.size > 0) {
163
+ const summary = Array.from(byClass.entries())
164
+ .map(([k, v]) => `${k}=${v}`)
165
+ .join(", ");
166
+ console.log(` fallback breakdown: ${summary}`);
167
+ }
168
+ }
169
+ process.exitCode = s.error > 0 || statefulFallbacks > 0 ? 1 : 0;
170
+ }
171
+ function resolveTargetFormat(sourceFormat, toOpt) {
172
+ if (toOpt === "native" || toOpt === "format2")
173
+ return toOpt;
174
+ return sourceFormat === "native" ? "format2" : "native";
175
+ }
176
+ /** Rename a relative path's extension for the target format. */
177
+ function renameForFormat(relPath, targetFormat) {
178
+ const dir = dirname(relPath);
179
+ let name = basename(relPath);
180
+ // Strip known workflow extensions
181
+ if (name.endsWith(".gxwf.yml"))
182
+ name = name.slice(0, -9);
183
+ else if (name.endsWith(".gxwf.yaml"))
184
+ name = name.slice(0, -10);
185
+ else if (name.endsWith(".ga"))
186
+ name = name.slice(0, -3);
187
+ else if (name.endsWith(".json"))
188
+ name = name.slice(0, -5);
189
+ else if (name.endsWith(".yml"))
190
+ name = name.slice(0, -4);
191
+ else if (name.endsWith(".yaml"))
192
+ name = name.slice(0, -5);
193
+ const ext = targetFormat === "format2" ? ".gxwf.yml" : ".ga";
194
+ const newName = name + ext;
195
+ return dir === "." ? newName : join(dir, newName);
196
+ }
197
+ /** Recursively remove position-related keys from format2 output. */
198
+ function stripPositionInfo(obj) {
199
+ delete obj.position;
200
+ for (const val of Object.values(obj)) {
201
+ if (Array.isArray(val)) {
202
+ for (const item of val) {
203
+ if (item && typeof item === "object") {
204
+ stripPositionInfo(item);
205
+ }
206
+ }
207
+ }
208
+ else if (val && typeof val === "object") {
209
+ stripPositionInfo(val);
210
+ }
211
+ }
212
+ }
213
+ function buildConvertReport(treeResult) {
214
+ const results = [];
215
+ for (const o of treeResult.outcomes) {
216
+ if (o.error) {
217
+ results.push({ relativePath: o.info.relativePath, error: o.error });
218
+ continue;
219
+ }
220
+ if (o.skipped) {
221
+ results.push({ relativePath: o.info.relativePath, error: `SKIPPED: ${o.skipReason}` });
222
+ continue;
223
+ }
224
+ results.push(o.result);
225
+ }
226
+ const wfSummary = summarizeOutcomes(treeResult.outcomes);
227
+ return { root: treeResult.root, results, summary: wfSummary };
228
+ }
229
+ //# sourceMappingURL=convert-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-tree.js","sourceRoot":"","sources":["../../src/commands/convert-tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type StrictOptions } from "./strict-options.js";
2
+ export interface ConvertOptions extends StrictOptions {
3
+ to?: string;
4
+ output?: string;
5
+ compact?: boolean;
6
+ json?: boolean;
7
+ yaml?: boolean;
8
+ format?: string;
9
+ stateful?: boolean;
10
+ cacheDir?: string;
11
+ }
12
+ export declare function runConvert(filePath: string, opts: ConvertOptions): Promise<void>;
13
+ //# sourceMappingURL=convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAQ/E,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAkGtF"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * `gxwf convert` — convert between native (.ga) and format2 (.gxwf.yml) formats.
3
+ */
4
+ import { makeNodeToolCache } from "@galaxy-tool-util/core/node";
5
+ import { toFormat2, toFormat2Stateful, toNative, toNativeStateful, checkStrictEncoding, checkStrictStructure, } from "@galaxy-tool-util/schema";
6
+ import { dirname } from "node:path";
7
+ import { loadToolInputsForWorkflow } from "./stateful-tool-inputs.js";
8
+ import { createDefaultResolver } from "./url-resolver.js";
9
+ import { resolveStrictOptions } from "./strict-options.js";
10
+ import { readWorkflowFile, resolveFormat, serializeWorkflow, writeWorkflowOutput, } from "./workflow-io.js";
11
+ export async function runConvert(filePath, opts) {
12
+ const data = await readWorkflowFile(filePath);
13
+ if (!data)
14
+ return;
15
+ const sourceFormat = resolveFormat(data, opts.format);
16
+ const targetFormat = resolveTargetFormat(sourceFormat, opts.to);
17
+ const strict = resolveStrictOptions(opts);
18
+ // Pre-conversion strict checks on input
19
+ if (strict.strictEncoding) {
20
+ const encErrors = checkStrictEncoding(data, sourceFormat);
21
+ if (encErrors.length > 0) {
22
+ console.error("Encoding errors:");
23
+ for (const e of encErrors)
24
+ console.error(` ${e}`);
25
+ process.exitCode = 2;
26
+ return;
27
+ }
28
+ }
29
+ if (strict.strictStructure) {
30
+ const structErrors = checkStrictStructure(data, sourceFormat);
31
+ if (structErrors.length > 0) {
32
+ console.error("Structure errors (strict):");
33
+ for (const e of structErrors)
34
+ console.error(` ${e}`);
35
+ process.exitCode = 2;
36
+ return;
37
+ }
38
+ }
39
+ if (sourceFormat === targetFormat) {
40
+ console.error(`Source and target formats are both ${sourceFormat}. ` +
41
+ `Use --to to specify the target format.`);
42
+ process.exitCode = 1;
43
+ return;
44
+ }
45
+ let result;
46
+ let stepStatuses = null;
47
+ if (opts.stateful) {
48
+ const cache = makeNodeToolCache({ cacheDir: opts.cacheDir });
49
+ await cache.index.load();
50
+ if ((await cache.index.listAll()).length === 0) {
51
+ console.warn("Tool cache is empty — stateful conversion will fall back for every step");
52
+ }
53
+ const expansionOpts = {
54
+ resolver: createDefaultResolver({ workflowDirectory: dirname(filePath) }),
55
+ };
56
+ const { resolver, status: toolStatus } = await loadToolInputsForWorkflow(data, sourceFormat, cache, expansionOpts);
57
+ for (const s of toolStatus) {
58
+ if (!s.loaded) {
59
+ const ver = s.toolVersion ? `@${s.toolVersion}` : "";
60
+ console.error(` tool ${s.toolId}${ver}: ${s.error}`);
61
+ }
62
+ }
63
+ if (targetFormat === "format2") {
64
+ const r = toFormat2Stateful(data, resolver);
65
+ result = r.workflow;
66
+ stepStatuses = r.steps;
67
+ if (opts.compact)
68
+ stripPositionInfo(result);
69
+ }
70
+ else {
71
+ const r = toNativeStateful(data, resolver);
72
+ result = r.workflow;
73
+ stepStatuses = r.steps;
74
+ }
75
+ }
76
+ else if (targetFormat === "format2") {
77
+ result = toFormat2(data);
78
+ if (opts.compact) {
79
+ stripPositionInfo(result);
80
+ }
81
+ }
82
+ else {
83
+ result = toNative(data);
84
+ }
85
+ const output = serializeWorkflow(result, targetFormat, { json: opts.json, yaml: opts.yaml });
86
+ await writeWorkflowOutput(output, opts.output, "Converted workflow");
87
+ if (stepStatuses !== null) {
88
+ reportStepStatuses(stepStatuses);
89
+ // --strict-state: require all steps to convert successfully
90
+ if (strict.strictState) {
91
+ const hasFailures = stepStatuses.some((s) => !s.converted);
92
+ if (hasFailures) {
93
+ console.error("Strict state: all steps must convert successfully");
94
+ process.exitCode = 2;
95
+ return;
96
+ }
97
+ }
98
+ }
99
+ }
100
+ function reportStepStatuses(statuses) {
101
+ const converted = statuses.filter((s) => s.converted).length;
102
+ const failed = statuses.length - converted;
103
+ console.error(`\nStateful conversion: ${converted}/${statuses.length} steps converted` +
104
+ (failed > 0 ? `, ${failed} fell back` : ""));
105
+ // Aggregate fallbacks by failure class
106
+ if (failed > 0) {
107
+ const byClass = new Map();
108
+ for (const s of statuses) {
109
+ if (!s.converted) {
110
+ const cls = s.failureClass ?? "unknown";
111
+ byClass.set(cls, (byClass.get(cls) ?? 0) + 1);
112
+ }
113
+ }
114
+ const summary = Array.from(byClass.entries())
115
+ .map(([k, v]) => `${k}=${v}`)
116
+ .join(", ");
117
+ console.error(` fallback breakdown: ${summary}`);
118
+ }
119
+ for (const s of statuses) {
120
+ if (!s.converted) {
121
+ const label = s.toolId ? `${s.stepId} (${s.toolId})` : s.stepId;
122
+ const cls = s.failureClass ?? "unknown";
123
+ console.error(` step ${label} [${cls}]: ${s.error ?? "unknown error"}`);
124
+ }
125
+ }
126
+ if (failed > 0)
127
+ process.exitCode = 1;
128
+ }
129
+ function resolveTargetFormat(sourceFormat, toOpt) {
130
+ if (toOpt === "native" || toOpt === "format2")
131
+ return toOpt;
132
+ // Infer opposite
133
+ return sourceFormat === "native" ? "format2" : "native";
134
+ }
135
+ /** Recursively remove position-related keys from format2 output. */
136
+ function stripPositionInfo(obj) {
137
+ delete obj.position;
138
+ for (const val of Object.values(obj)) {
139
+ if (Array.isArray(val)) {
140
+ for (const item of val) {
141
+ if (item && typeof item === "object") {
142
+ stripPositionInfo(item);
143
+ }
144
+ }
145
+ }
146
+ else if (val && typeof val === "object") {
147
+ stripPositionInfo(val);
148
+ }
149
+ }
150
+ }
151
+ //# sourceMappingURL=convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B9E"}
1
+ {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B9E"}
@@ -1,6 +1,7 @@
1
- import { ToolCache, cacheKey } from "@galaxy-tool-util/core";
1
+ import { cacheKey } from "@galaxy-tool-util/core";
2
+ import { makeNodeToolCache } from "@galaxy-tool-util/core/node";
2
3
  export async function runInfo(toolId, opts) {
3
- const cache = new ToolCache({ cacheDir: opts.cacheDir });
4
+ const cache = makeNodeToolCache({ cacheDir: opts.cacheDir });
4
5
  await cache.index.load();
5
6
  const coords = cache.resolveToolCoordinates(toolId, opts.version);
6
7
  if (coords.version === null) {
@@ -8,14 +9,14 @@ export async function runInfo(toolId, opts) {
8
9
  process.exitCode = 1;
9
10
  return;
10
11
  }
11
- const key = cacheKey(coords.toolshedUrl, coords.trsToolId, coords.version);
12
+ const key = await cacheKey(coords.toolshedUrl, coords.trsToolId, coords.version);
12
13
  const tool = await cache.loadCached(key);
13
14
  if (tool === null) {
14
15
  console.error(`Tool not found in cache: ${toolId}`);
15
16
  process.exitCode = 1;
16
17
  return;
17
18
  }
18
- const indexEntry = cache.index.listAll().find((e) => e.cache_key === key);
19
+ const indexEntry = (await cache.index.listAll()).find((e) => e.cache_key === key);
19
20
  console.log(`Name: ${tool.name}`);
20
21
  console.log(`ID: ${tool.id}`);
21
22
  console.log(`Version: ${tool.version ?? "unknown"}`);
@@ -1 +1 @@
1
- {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAO7D,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAc,EAAE,IAAiB;IAC7D,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzD,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,KAAK,CAAC,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAClE,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,kCAAkC,MAAM,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC,CAAC;IAE1E,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC,CAAC;IACtD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,gBAAgB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,gBAAgB,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAOhE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAc,EAAE,IAAiB;IAC7D,MAAM,KAAK,GAAG,iBAAiB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7D,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,KAAK,CAAC,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAClE,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,kCAAkC,MAAM,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACjF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC,CAAC;IAElF,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC,CAAC;IACtD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,gBAAgB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,gBAAgB,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type StrictOptions } from "./strict-options.js";
2
+ import { type ReportOutputOptions } from "./report-output.js";
3
+ export interface LintTreeOptions extends StrictOptions, ReportOutputOptions {
4
+ format?: string;
5
+ skipBestPractices?: boolean;
6
+ skipStateValidation?: boolean;
7
+ cacheDir?: string;
8
+ json?: boolean;
9
+ }
10
+ export declare function runLintTree(dir: string, opts: LintTreeOptions): Promise<void>;
11
+ //# sourceMappingURL=lint-tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint-tree.d.ts","sourceRoot":"","sources":["../../src/commands/lint-tree.ts"],"names":[],"mappings":"AAcA,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAG/E,OAAO,EAAsC,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAElG,MAAM,WAAW,eAAgB,SAAQ,aAAa,EAAE,mBAAmB;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAUD,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAyEnF"}
@@ -0,0 +1,104 @@
1
+ import { makeNodeToolCache } from "@galaxy-tool-util/core/node";
2
+ import { buildLintWorkflowResult, buildLintTreeReport as schemaBuildLintTreeReport, } from "@galaxy-tool-util/schema";
3
+ import { resolveFormat } from "./workflow-io.js";
4
+ import { resolveStrictOptions } from "./strict-options.js";
5
+ import { lintWorkflowReport } from "./lint.js";
6
+ import { collectTree } from "./tree.js";
7
+ import { writeReportOutput, writeReportHtml } from "./report-output.js";
8
+ /** Map internal LintReport to schema's flat LintWorkflowResult fields. */
9
+ function toLintWorkflowResult(relativePath, lr) {
10
+ const lint_errors = lr.structural.error_count + (lr.bestPractices?.error_count ?? 0);
11
+ const lint_warnings = lr.structural.warn_count + (lr.bestPractices?.warn_count ?? 0);
12
+ const stepResults = lr.stateValidation ?? [];
13
+ return buildLintWorkflowResult(relativePath, lint_errors, lint_warnings, stepResults);
14
+ }
15
+ export async function runLintTree(dir, opts) {
16
+ // Load tool cache once for all files
17
+ let cache;
18
+ if (!opts.skipStateValidation) {
19
+ try {
20
+ cache = makeNodeToolCache({ cacheDir: opts.cacheDir });
21
+ await cache.index.load();
22
+ if ((await cache.index.listAll()).length === 0) {
23
+ console.warn("Tool cache is empty — skipping tool state validation for all files");
24
+ cache = undefined;
25
+ }
26
+ }
27
+ catch (e) {
28
+ const msg = e instanceof Error ? e.message : String(e);
29
+ console.warn(`Failed to load tool cache: ${msg}`);
30
+ }
31
+ }
32
+ const strict = resolveStrictOptions(opts);
33
+ const treeResult = await collectTree(dir, async (info, data) => {
34
+ const format = resolveFormat(data, opts.format);
35
+ const lr = await lintWorkflowReport(info.path, data, format, {
36
+ skipBestPractices: opts.skipBestPractices,
37
+ skipStateValidation: opts.skipStateValidation,
38
+ cache,
39
+ strict,
40
+ });
41
+ return toLintWorkflowResult(info.relativePath, lr);
42
+ });
43
+ const report = buildReport(treeResult);
44
+ await writeReportOutput("lint_tree.md.j2", report, { reportMarkdown: opts.reportMarkdown });
45
+ await writeReportHtml("lint-tree", report, opts.reportHtml);
46
+ if (opts.json) {
47
+ console.log(JSON.stringify(report, null, 2));
48
+ process.exitCode = computeLintExitCode(report);
49
+ return;
50
+ }
51
+ // Text output
52
+ for (const wf of report.workflows) {
53
+ if (wf.error) {
54
+ console.error(` ${wf.path}: ERROR (${wf.error})`);
55
+ continue;
56
+ }
57
+ if (wf.skipped_reason) {
58
+ console.warn(` ${wf.path}: SKIPPED (${wf.skipped_reason})`);
59
+ continue;
60
+ }
61
+ const stateFails = wf.results.filter((s) => s.status === "fail").length;
62
+ if (wf.lint_errors > 0 || stateFails > 0) {
63
+ console.error(` ${wf.path}: ${wf.lint_errors} errors, ${wf.lint_warnings} warnings, ${stateFails} state failures`);
64
+ // Detailed error output would require the internal LintReport;
65
+ // for tree output we show the summary counts per workflow.
66
+ }
67
+ else if (wf.lint_warnings > 0) {
68
+ console.warn(` ${wf.path}: ${wf.lint_warnings} warnings`);
69
+ }
70
+ else {
71
+ console.log(` ${wf.path}: OK`);
72
+ }
73
+ }
74
+ const s = report.summary;
75
+ const total = report.workflows.length;
76
+ console.log(`\nSummary: ${total} workflows | ${s.lint_errors} errors, ${s.lint_warnings} warnings, ${s.state_fail} state failures`);
77
+ process.exitCode = computeLintExitCode(report);
78
+ }
79
+ function buildReport(treeResult) {
80
+ const workflows = [];
81
+ for (const o of treeResult.outcomes) {
82
+ if (o.error) {
83
+ workflows.push(buildLintWorkflowResult(o.info.relativePath, 0, 0, [], { error: o.error }));
84
+ continue;
85
+ }
86
+ if (o.skipped) {
87
+ workflows.push(buildLintWorkflowResult(o.info.relativePath, 0, 0, [], {
88
+ skipped_reason: o.skipReason ?? null,
89
+ }));
90
+ continue;
91
+ }
92
+ workflows.push(o.result);
93
+ }
94
+ return schemaBuildLintTreeReport(treeResult.root, workflows);
95
+ }
96
+ function computeLintExitCode(report) {
97
+ const s = report.summary;
98
+ if (s.lint_errors > 0 || s.state_fail > 0 || s.errors > 0)
99
+ return 2;
100
+ if (s.lint_warnings > 0)
101
+ return 1;
102
+ return 0;
103
+ }
104
+ //# sourceMappingURL=lint-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint-tree.js","sourceRoot":"","sources":["../../src/commands/lint-tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * `gxwf lint` — unified lint combining structural checks, best practices,
3
+ * and tool state validation.
4
+ */
5
+ import type { ToolCache } from "@galaxy-tool-util/core";
6
+ import { type LintResult, type ValidationStepResult as StepValidationResult } from "@galaxy-tool-util/schema";
7
+ import { type StrictOptions, type ResolvedStrictOptions } from "./strict-options.js";
8
+ export interface LintOptions extends StrictOptions {
9
+ format?: string;
10
+ skipBestPractices?: boolean;
11
+ skipStateValidation?: boolean;
12
+ cacheDir?: string;
13
+ json?: boolean;
14
+ reportHtml?: string | boolean;
15
+ }
16
+ export interface LintReportOptions {
17
+ skipBestPractices?: boolean;
18
+ skipStateValidation?: boolean;
19
+ cache?: ToolCache;
20
+ strict?: ResolvedStrictOptions;
21
+ }
22
+ export interface LintReport {
23
+ structural: LintResult;
24
+ bestPractices: LintResult | null;
25
+ stateValidation: StepValidationResult[] | null;
26
+ stateSkipped: boolean;
27
+ encodingErrors: string[];
28
+ structureErrors: string[];
29
+ exitCode: number;
30
+ }
31
+ export declare function runLint(filePath: string, opts: LintOptions): Promise<void>;
32
+ /** Lint a workflow, returning a structured report. Pure logic — no CLI I/O. */
33
+ export declare function lintWorkflowReport(filePath: string, data: Record<string, unknown>, format: string, opts: LintReportOptions): Promise<LintReport>;
34
+ //# sourceMappingURL=lint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAQL,KAAK,UAAU,EAGf,KAAK,oBAAoB,IAAI,oBAAoB,EAClD,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAS7B,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,UAAU,GAAG,IAAI,CAAC;IACjC,eAAe,EAAE,oBAAoB,EAAE,GAAG,IAAI,CAAC;IAC/C,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAaD,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA4GhF;AAED,+EAA+E;AAC/E,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,UAAU,CAAC,CA8ErB"}