@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,178 @@
1
+ /**
2
+ * `gxwf roundtrip-tree` — batch roundtrip validation across a directory.
3
+ * Mirrors the patterns in convert-tree.ts.
4
+ */
5
+ import { makeNodeToolCache } from "@galaxy-tool-util/core/node";
6
+ import { roundtripValidate, buildRoundTripTreeReport, categoryOf, } from "@galaxy-tool-util/schema";
7
+ import { dirname, join } from "node:path";
8
+ import { loadToolInputsForWorkflow } from "./stateful-tool-inputs.js";
9
+ import { createDefaultResolver } from "./url-resolver.js";
10
+ import { resolveStrictOptions } from "./strict-options.js";
11
+ import { resolveFormat } from "./workflow-io.js";
12
+ import { collectTree, skipWorkflow } from "./tree.js";
13
+ import { countDiffs } from "./roundtrip.js";
14
+ import { writeReportOutput, writeReportHtml } from "./report-output.js";
15
+ export async function runRoundtripTree(dir, opts) {
16
+ const cache = makeNodeToolCache({ cacheDir: opts.cacheDir });
17
+ await cache.index.load();
18
+ if ((await cache.index.listAll()).length === 0) {
19
+ console.warn("Tool cache is empty — all steps will fall back (no roundtrip possible)");
20
+ }
21
+ const strict = resolveStrictOptions(opts);
22
+ // Only native workflows are eligible; format2 files are skipped.
23
+ const treeResult = await collectTree(dir, async (info, data) => {
24
+ const sourceFormat = resolveFormat(data, opts.format);
25
+ if (sourceFormat !== "native") {
26
+ skipWorkflow(`not a native workflow (${sourceFormat})`);
27
+ }
28
+ const expansionOpts = {
29
+ resolver: createDefaultResolver({
30
+ workflowDirectory: dirname(join(dir, info.relativePath)),
31
+ }),
32
+ };
33
+ const { resolver, status: toolStatus } = await loadToolInputsForWorkflow(data, "native", cache, expansionOpts);
34
+ const failedLoads = toolStatus.filter((s) => !s.loaded);
35
+ const result = roundtripValidate(data, resolver, {
36
+ strictEncoding: strict.strictEncoding,
37
+ strictStructure: strict.strictStructure,
38
+ strictState: strict.strictState,
39
+ });
40
+ if (result.encodingErrors.length > 0 || result.structureErrors.length > 0) {
41
+ const allErrors = [...result.encodingErrors, ...result.structureErrors];
42
+ throw new Error(`Strict: ${allErrors.join("; ")}`);
43
+ }
44
+ return {
45
+ relativePath: info.relativePath,
46
+ result,
47
+ toolLoadErrors: failedLoads.length > 0 ? failedLoads : undefined,
48
+ };
49
+ }, false);
50
+ // Aggregate
51
+ let totalBenign = 0;
52
+ let totalErrors = 0;
53
+ let filesClean = 0;
54
+ let filesBenignOnly = 0;
55
+ let filesFailed = 0;
56
+ const fileResults = [];
57
+ for (const o of treeResult.outcomes) {
58
+ if (o.error || o.skipped || !o.result)
59
+ continue;
60
+ fileResults.push(o.result);
61
+ const counts = countDiffs(o.result.result);
62
+ totalBenign += counts.benign;
63
+ totalErrors += counts.error;
64
+ if (!o.result.result.success)
65
+ filesFailed++;
66
+ else if (o.result.result.clean)
67
+ filesClean++;
68
+ else
69
+ filesBenignOnly++;
70
+ }
71
+ // Build RoundTripTreeReport for Markdown/HTML rendering
72
+ const roundtripWorkflows = treeResult.outcomes.map((o) => {
73
+ const relPath = o.info.relativePath;
74
+ if (o.error)
75
+ return makeRoundTripResult(relPath, null, o.error, null);
76
+ if (o.skipped)
77
+ return makeRoundTripResult(relPath, null, null, "legacy_encoding");
78
+ return makeRoundTripResult(relPath, o.result.result, null, null);
79
+ });
80
+ const roundtripReport = buildRoundTripTreeReport(treeResult.root, roundtripWorkflows);
81
+ await writeReportOutput("roundtrip_tree.md.j2", roundtripReport, {
82
+ reportMarkdown: opts.reportMarkdown,
83
+ });
84
+ await writeReportHtml("roundtrip-tree", roundtripReport, opts.reportHtml);
85
+ if (opts.json) {
86
+ console.log(JSON.stringify({
87
+ root: treeResult.root,
88
+ files: fileResults,
89
+ summary: {
90
+ total: fileResults.length,
91
+ clean: filesClean,
92
+ benignOnly: filesBenignOnly,
93
+ failed: filesFailed,
94
+ benignDiffs: totalBenign,
95
+ errorDiffs: totalErrors,
96
+ },
97
+ }, null, 2));
98
+ }
99
+ else {
100
+ if (!opts.brief) {
101
+ for (const o of treeResult.outcomes) {
102
+ if (o.error) {
103
+ // File-level errors always shown unless --benign-only.
104
+ if (!opts.benignOnly) {
105
+ console.error(` ${o.info.relativePath}: ERROR (${o.error})`);
106
+ }
107
+ continue;
108
+ }
109
+ if (o.skipped)
110
+ continue;
111
+ const r = o.result;
112
+ const c = countDiffs(r.result);
113
+ const isFail = !r.result.success;
114
+ const isClean = r.result.clean;
115
+ const isBenign = !isFail && !isClean;
116
+ if (opts.errorsOnly && !isFail)
117
+ continue;
118
+ if (opts.benignOnly && !isBenign)
119
+ continue;
120
+ const status = isFail ? "FAIL" : isClean ? "clean" : "benign";
121
+ console.log(` ${r.relativePath}: ${status} (${c.benign} benign, ${c.error} real diff, ${c.failed} conversion failure)`);
122
+ if (r.toolLoadErrors) {
123
+ for (const t of r.toolLoadErrors) {
124
+ const ver = t.toolVersion ? `@${t.toolVersion}` : "";
125
+ console.error(` tool ${t.toolId}${ver}: ${t.error}`);
126
+ }
127
+ }
128
+ }
129
+ }
130
+ console.log(`\nSummary: ${fileResults.length} file(s): ${filesClean} clean, ${filesBenignOnly} benign-only, ${filesFailed} failed`);
131
+ console.log(`Diffs: ${totalBenign} benign, ${totalErrors} real`);
132
+ }
133
+ // Exit code: 2 if any failure, 1 if benign-only, 0 if all clean
134
+ if (filesFailed > 0 || totalErrors > 0)
135
+ process.exitCode = 2;
136
+ else if (totalBenign > 0)
137
+ process.exitCode = 1;
138
+ else
139
+ process.exitCode = 0;
140
+ }
141
+ /** Map the TS-internal RoundtripResult to the report-model shape for template rendering. */
142
+ function makeRoundTripResult(relPath, result, error, skippedReason) {
143
+ const allDiffs = result?.stepResults.flatMap((s) => s.diffs) ?? [];
144
+ const errorDiffs = allDiffs.filter((d) => d.severity === "error");
145
+ const benignDiffs = allDiffs.filter((d) => d.severity === "benign");
146
+ const ok = result ? result.success : false;
147
+ let status;
148
+ if (error)
149
+ status = "error";
150
+ else if (skippedReason)
151
+ status = "skipped";
152
+ else if (ok)
153
+ status = "ok";
154
+ else
155
+ status = "roundtrip_mismatch";
156
+ const conversionFailureLines = result?.stepResults
157
+ .filter((s) => !s.success)
158
+ .map((s) => s.error ?? `Step ${s.stepId} failed`) ?? [];
159
+ return {
160
+ workflow_path: relPath,
161
+ category: categoryOf(relPath),
162
+ conversion_result: null,
163
+ diffs: allDiffs,
164
+ step_id_mapping: null,
165
+ stale_clean_results: null,
166
+ error,
167
+ skipped_reason: skippedReason,
168
+ structure_errors: result?.structureErrors ?? [],
169
+ encoding_errors: result?.encodingErrors ?? [],
170
+ error_diffs: errorDiffs,
171
+ benign_diffs: benignDiffs,
172
+ ok,
173
+ status,
174
+ conversion_failure_lines: conversionFailureLines,
175
+ summary_line: status.toUpperCase(),
176
+ };
177
+ }
178
+ //# sourceMappingURL=roundtrip-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roundtrip-tree.js","sourceRoot":"","sources":["../../src/commands/roundtrip-tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type RoundtripResult } from "@galaxy-tool-util/schema";
2
+ import { type StrictOptions } from "./strict-options.js";
3
+ export interface RoundtripOptions extends StrictOptions {
4
+ cacheDir?: string;
5
+ format?: string;
6
+ json?: boolean;
7
+ /** Only show steps with error-severity diffs. */
8
+ errorsOnly?: boolean;
9
+ /** Only show steps with benign diffs (suppress clean + real-error steps). */
10
+ benignOnly?: boolean;
11
+ /** Suppress the per-diff list; show only per-step counts and summary. */
12
+ brief?: boolean;
13
+ }
14
+ export declare function runRoundtrip(filePath: string, opts: RoundtripOptions): Promise<void>;
15
+ export interface ReportFilter {
16
+ errorsOnly?: boolean;
17
+ benignOnly?: boolean;
18
+ brief?: boolean;
19
+ }
20
+ /**
21
+ * Exit code policy: 0 clean, 1 benign-only, 2 real diffs or errors.
22
+ * Exposed for reuse by the tree command.
23
+ */
24
+ export declare function exitCodeFor(result: RoundtripResult): number;
25
+ /** Count diffs across a result by severity — reused by tree aggregation. */
26
+ export declare function countDiffs(result: RoundtripResult): {
27
+ benign: number;
28
+ error: number;
29
+ failed: number;
30
+ };
31
+ //# sourceMappingURL=roundtrip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roundtrip.d.ts","sourceRoot":"","sources":["../../src/commands/roundtrip.ts"],"names":[],"mappings":"AAUA,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAG/E,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iDAAiD;IACjD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yEAAyE;IACzE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmE1F;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAmED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAI3D;AAED,4EAA4E;AAC5E,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAOA"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * `gxwf roundtrip` — roundtrip-validate a native workflow through format2
3
+ * and back, reporting per-step diffs and classifying them as benign or real.
4
+ *
5
+ * Exit codes:
6
+ * 0 clean roundtrip (no diffs)
7
+ * 1 benign diffs only (type coercions, stale keys, connection moves)
8
+ * 2 real diffs or conversion errors
9
+ */
10
+ import { makeNodeToolCache } from "@galaxy-tool-util/core/node";
11
+ import { roundtripValidate, } from "@galaxy-tool-util/schema";
12
+ import { dirname } from "node:path";
13
+ import { loadToolInputsForWorkflow } from "./stateful-tool-inputs.js";
14
+ import { createDefaultResolver } from "./url-resolver.js";
15
+ import { resolveStrictOptions } from "./strict-options.js";
16
+ import { readWorkflowFile, resolveFormat } from "./workflow-io.js";
17
+ export async function runRoundtrip(filePath, opts) {
18
+ const data = await readWorkflowFile(filePath);
19
+ if (!data)
20
+ return;
21
+ const sourceFormat = resolveFormat(data, opts.format);
22
+ const strict = resolveStrictOptions(opts);
23
+ if (sourceFormat !== "native") {
24
+ console.error(`Roundtrip source must be a native (.ga) workflow; got ${sourceFormat}.` +
25
+ ` Convert to native first or pass a .ga file.`);
26
+ process.exitCode = 2;
27
+ return;
28
+ }
29
+ const cache = makeNodeToolCache({ cacheDir: opts.cacheDir });
30
+ await cache.index.load();
31
+ if ((await cache.index.listAll()).length === 0) {
32
+ console.warn("Tool cache is empty — all steps will fall back (no roundtrip possible)");
33
+ }
34
+ const expansionOpts = {
35
+ resolver: createDefaultResolver({ workflowDirectory: dirname(filePath) }),
36
+ };
37
+ const { resolver, status: toolStatus } = await loadToolInputsForWorkflow(data, "native", cache, expansionOpts);
38
+ for (const s of toolStatus) {
39
+ if (!s.loaded) {
40
+ const ver = s.toolVersion ? `@${s.toolVersion}` : "";
41
+ console.error(` tool ${s.toolId}${ver}: ${s.error}`);
42
+ }
43
+ }
44
+ const result = roundtripValidate(data, resolver, {
45
+ strictEncoding: strict.strictEncoding,
46
+ strictStructure: strict.strictStructure,
47
+ strictState: strict.strictState,
48
+ });
49
+ if (opts.json) {
50
+ console.log(JSON.stringify(result, null, 2));
51
+ }
52
+ else {
53
+ // Report strict errors before step-level results
54
+ if (result.encodingErrors.length > 0) {
55
+ console.error("Encoding errors:");
56
+ for (const e of result.encodingErrors)
57
+ console.error(` ${e}`);
58
+ }
59
+ if (result.structureErrors.length > 0) {
60
+ console.error("Structure errors (strict):");
61
+ for (const e of result.structureErrors)
62
+ console.error(` ${e}`);
63
+ }
64
+ reportResult(filePath, result, opts);
65
+ }
66
+ let exitCode = exitCodeFor(result);
67
+ // --strict-state: require all steps to roundtrip (no skips/failures)
68
+ if (strict.strictState && result.stepResults.some((s) => !s.success)) {
69
+ exitCode = 2;
70
+ }
71
+ process.exitCode = exitCode;
72
+ }
73
+ function reportResult(filePath, result, filter) {
74
+ const total = result.stepResults.length;
75
+ const failed = result.stepResults.filter((s) => !s.success).length;
76
+ const benignCount = result.stepResults.reduce((n, s) => n + s.diffs.filter((d) => d.severity === "benign").length, 0);
77
+ const errorCount = result.stepResults.reduce((n, s) => n + s.diffs.filter((d) => d.severity === "error").length, 0);
78
+ console.log(`Roundtrip: ${filePath}`);
79
+ console.log(` ${total - failed}/${total} step(s) ok, ${benignCount} benign diff(s), ${errorCount} real diff(s)`);
80
+ // --brief short-circuits: skip the per-step detail entirely. Still prints
81
+ // the one-line summary above, which is the whole point of --brief.
82
+ if (filter.brief)
83
+ return;
84
+ for (const step of result.stepResults) {
85
+ const hasError = step.diffs.some((d) => d.severity === "error");
86
+ const hasBenign = step.diffs.some((d) => d.severity === "benign");
87
+ if (filter.errorsOnly && !hasError && step.success)
88
+ continue;
89
+ if (filter.benignOnly) {
90
+ // Show only steps with benign diffs and no errors and no failure.
91
+ if (!hasBenign || hasError || !step.success)
92
+ continue;
93
+ }
94
+ // Default: skip clean-passing tool steps but keep informational
95
+ // subworkflow notes (failureClass set, success true) visible.
96
+ if (!filter.errorsOnly &&
97
+ !filter.benignOnly &&
98
+ step.diffs.length === 0 &&
99
+ step.success &&
100
+ !step.failureClass) {
101
+ continue;
102
+ }
103
+ // Indent nested subworkflow steps (depth>0) so the hierarchy is visible.
104
+ const indent = " ".repeat(step.depth);
105
+ const label = step.toolId ? `${step.stepId} (${step.toolId})` : step.stepId;
106
+ if (!step.success) {
107
+ console.error(`${indent} step ${label}: ${step.failureClass ?? "failed"} — ${step.error ?? ""}`);
108
+ }
109
+ else if (step.failureClass) {
110
+ console.log(`${indent} step ${label}: ${step.failureClass} (${step.error ?? ""})`);
111
+ }
112
+ const diffsToShow = filter.errorsOnly
113
+ ? step.diffs.filter((d) => d.severity === "error")
114
+ : filter.benignOnly
115
+ ? step.diffs.filter((d) => d.severity === "benign")
116
+ : step.diffs;
117
+ for (const d of diffsToShow) {
118
+ const tag = d.severity === "error" ? "ERROR" : `benign:${d.benign_artifact?.reason ?? "?"}`;
119
+ const loc = d.key_path || "<root>";
120
+ console.log(`${indent} [${tag}] ${loc}: ${d.description}`);
121
+ }
122
+ }
123
+ }
124
+ /**
125
+ * Exit code policy: 0 clean, 1 benign-only, 2 real diffs or errors.
126
+ * Exposed for reuse by the tree command.
127
+ */
128
+ export function exitCodeFor(result) {
129
+ if (!result.success)
130
+ return 2;
131
+ if (!result.clean)
132
+ return 1;
133
+ return 0;
134
+ }
135
+ /** Count diffs across a result by severity — reused by tree aggregation. */
136
+ export function countDiffs(result) {
137
+ const flat = result.stepResults.flatMap((s) => s.diffs);
138
+ return {
139
+ benign: flat.filter((d) => d.severity === "benign").length,
140
+ error: flat.filter((d) => d.severity === "error").length,
141
+ failed: result.stepResults.filter((s) => !s.success).length,
142
+ };
143
+ }
144
+ //# sourceMappingURL=roundtrip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roundtrip.js","sourceRoot":"","sources":["../../src/commands/roundtrip.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { ToolCache } from "@galaxy-tool-util/core";
1
+ import { makeNodeToolCache } from "@galaxy-tool-util/core/node";
2
2
  import { createFieldModel, STATE_REPRESENTATIONS, } from "@galaxy-tool-util/schema";
3
3
  import * as JSONSchema from "effect/JSONSchema";
4
4
  import { writeFile } from "node:fs/promises";
@@ -11,7 +11,7 @@ export async function runSchema(toolId, opts) {
11
11
  return;
12
12
  }
13
13
  const stateRep = repName;
14
- const cache = new ToolCache({ cacheDir: opts.cacheDir });
14
+ const cache = makeNodeToolCache({ cacheDir: opts.cacheDir });
15
15
  await cache.index.load();
16
16
  const result = await loadCachedTool(cache, toolId, opts.version);
17
17
  if (isResolveError(result)) {
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/commands/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EACL,gBAAgB,EAChB,qBAAqB,GAGtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AASnE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAc,EAAE,IAAmB;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,IAAI,eAAe,CAAC;IACvD,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,OAA8B,CAAC,EAAE,CAAC;QACpE,OAAO,CAAC,KAAK,CACX,2BAA2B,OAAO,gBAAgB,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrF,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,MAAM,QAAQ,GAAG,OAA8B,CAAC;IAEhD,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,MAAM,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACjE,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACjC,OAAO,CAAC,KAAK,CAAC,kCAAkC,MAAM,EAAE,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,4BAA4B,MAAM,sCAAsC,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAA6B;QACvC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,MAAgD;KACzE,CAAC;IAEF,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,EAAE,QAA+B,CAAC,CAAC;IAC/E,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,2EAA2E,CAAC,CAAC;QAC3F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,UAAmB,CAAC;IACxB,IAAI,CAAC;QACH,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,KAAK,CAAC,kCAAkC,GAAG,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEnD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/commands/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EACL,gBAAgB,EAChB,qBAAqB,GAGtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AASnE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAc,EAAE,IAAmB;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,IAAI,eAAe,CAAC;IACvD,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,OAA8B,CAAC,EAAE,CAAC;QACpE,OAAO,CAAC,KAAK,CACX,2BAA2B,OAAO,gBAAgB,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrF,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,MAAM,QAAQ,GAAG,OAA8B,CAAC;IAEhD,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,MAAM,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACjE,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACjC,OAAO,CAAC,KAAK,CAAC,kCAAkC,MAAM,EAAE,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,4BAA4B,MAAM,sCAAsC,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAA6B;QACvC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,MAAgD;KACzE,CAAC;IAEF,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,EAAE,QAA+B,CAAC,CAAC;IAC/E,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,2EAA2E,CAAC,CAAC;QAC3F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,UAAmB,CAAC;IACxB,IAAI,CAAC;QACH,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,KAAK,CAAC,kCAAkC,GAAG,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEnD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Helper for stateful workflow conversion: expand a workflow, walk every
3
+ * step (including subworkflows), and preload tool parameter definitions
4
+ * from a `ToolCache` into a synchronous `ToolInputsResolver` suitable for
5
+ * `toFormat2Stateful` / `toNativeStateful`.
6
+ *
7
+ * Using `expandedNative` / `expandedFormat2` ensures externally-referenced
8
+ * subworkflows (@import, URL, TRS) contribute their tools — not just
9
+ * inline subworkflows (which is all `unique_tools` would cover).
10
+ *
11
+ * Keys inputs by `${tool_id}\0${tool_version ?? ""}` so multi-version
12
+ * workflows don't collide. Matches gxformat2's `ConversionOptions`
13
+ * callback-shaped design: callers pass the resolver, not the map.
14
+ */
15
+ import type { ToolCache } from "@galaxy-tool-util/core";
16
+ import { type ExpansionOptions, type ToolInputsResolver, type WorkflowFormat } from "@galaxy-tool-util/schema";
17
+ export interface ToolLoadStatus {
18
+ toolId: string;
19
+ toolVersion: string | null;
20
+ loaded: boolean;
21
+ error?: string;
22
+ }
23
+ export interface LoadedToolInputs {
24
+ resolver: ToolInputsResolver;
25
+ status: ToolLoadStatus[];
26
+ }
27
+ /**
28
+ * Expand the workflow, walk every step, and preload tool inputs from the
29
+ * cache. Returns a sync resolver for `toFormat2Stateful` / `toNativeStateful`
30
+ * plus a per-tool load status list.
31
+ */
32
+ export declare function loadToolInputsForWorkflow(data: Record<string, unknown>, format: WorkflowFormat, cache: ToolCache, expansionOpts?: ExpansionOptions): Promise<LoadedToolInputs>;
33
+ //# sourceMappingURL=stateful-tool-inputs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateful-tool-inputs.d.ts","sourceRoot":"","sources":["../../src/commands/stateful-tool-inputs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAGL,KAAK,gBAAgB,EAKrB,KAAK,kBAAkB,EAEvB,KAAK,cAAc,EACpB,MAAM,0BAA0B,CAAC;AAKlC,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B;AAMD;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,SAAS,EAChB,aAAa,CAAC,EAAE,gBAAgB,GAC/B,OAAO,CAAC,gBAAgB,CAAC,CAyB3B"}
@@ -0,0 +1,73 @@
1
+ import { expandedFormat2, expandedNative, } from "@galaxy-tool-util/schema";
2
+ import { isResolveError, loadCachedTool } from "./resolve-tool.js";
3
+ function toolKey(toolId, version) {
4
+ return `${toolId}\0${version ?? ""}`;
5
+ }
6
+ /**
7
+ * Expand the workflow, walk every step, and preload tool inputs from the
8
+ * cache. Returns a sync resolver for `toFormat2Stateful` / `toNativeStateful`
9
+ * plus a per-tool load status list.
10
+ */
11
+ export async function loadToolInputsForWorkflow(data, format, cache, expansionOpts) {
12
+ const refs = format === "native"
13
+ ? collectNativeToolRefs(await expandedNative(data, expansionOpts))
14
+ : collectFormat2ToolRefs(await expandedFormat2(data, expansionOpts));
15
+ const loaded = new Map();
16
+ const status = [];
17
+ for (const [toolId, version] of refs) {
18
+ const key = toolKey(toolId, version);
19
+ if (loaded.has(key))
20
+ continue;
21
+ const resolved = await loadCachedTool(cache, toolId, version);
22
+ if (isResolveError(resolved)) {
23
+ const reason = resolved.kind === "no_version" ? `no version for ${toolId}` : `${toolId} not in cache`;
24
+ status.push({ toolId, toolVersion: version, loaded: false, error: reason });
25
+ continue;
26
+ }
27
+ loaded.set(key, resolved.tool.inputs);
28
+ status.push({ toolId, toolVersion: version, loaded: true });
29
+ }
30
+ const resolver = (toolId, version) => loaded.get(toolKey(toolId, version));
31
+ return { resolver, status };
32
+ }
33
+ // --- Step walkers over expanded workflows ---
34
+ function collectNativeToolRefs(wf) {
35
+ const seen = new Set();
36
+ const refs = [];
37
+ const walk = (steps) => {
38
+ for (const step of Object.values(steps)) {
39
+ if (step.tool_id != null) {
40
+ const key = toolKey(step.tool_id, step.tool_version ?? null);
41
+ if (!seen.has(key)) {
42
+ seen.add(key);
43
+ refs.push([step.tool_id, step.tool_version ?? null]);
44
+ }
45
+ }
46
+ if (step.subworkflow)
47
+ walk(step.subworkflow.steps);
48
+ }
49
+ };
50
+ walk(wf.steps);
51
+ return refs;
52
+ }
53
+ function collectFormat2ToolRefs(wf) {
54
+ const seen = new Set();
55
+ const refs = [];
56
+ const walk = (steps) => {
57
+ for (const step of steps) {
58
+ if (step.tool_id != null) {
59
+ const key = toolKey(step.tool_id, step.tool_version ?? null);
60
+ if (!seen.has(key)) {
61
+ seen.add(key);
62
+ refs.push([step.tool_id, step.tool_version ?? null]);
63
+ }
64
+ }
65
+ if (step.run && typeof step.run === "object") {
66
+ walk(step.run.steps);
67
+ }
68
+ }
69
+ };
70
+ walk(wf.steps);
71
+ return refs;
72
+ }
73
+ //# sourceMappingURL=stateful-tool-inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateful-tool-inputs.js","sourceRoot":"","sources":["../../src/commands/stateful-tool-inputs.ts"],"names":[],"mappings":"AAeA,OAAO,EACL,eAAe,EACf,cAAc,GASf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAgBnE,SAAS,OAAO,CAAC,MAAc,EAAE,OAAsB;IACrD,OAAO,GAAG,MAAM,KAAK,OAAO,IAAI,EAAE,EAAE,CAAC;AACvC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,IAA6B,EAC7B,MAAsB,EACtB,KAAgB,EAChB,aAAgC;IAEhC,MAAM,IAAI,GACR,MAAM,KAAK,QAAQ;QACjB,CAAC,CAAC,qBAAqB,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAClE,CAAC,CAAC,sBAAsB,CAAC,MAAM,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;IAEzE,MAAM,MAAM,GAA4B,IAAI,GAAG,EAAE,CAAC;IAClD,MAAM,MAAM,GAAqB,EAAE,CAAC;IAEpC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC9B,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9D,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,MAAM,GACV,QAAQ,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,kBAAkB,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,eAAe,CAAC;YACzF,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5E,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAoB,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,QAAQ,GAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/F,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC;AAED,+CAA+C;AAE/C,SAAS,qBAAqB,CAAC,EAA4B;IACzD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,IAAI,GAAmC,EAAE,CAAC;IAChD,MAAM,IAAI,GAAG,CAAC,KAAwC,EAAQ,EAAE;QAC9D,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAA2B,EAAE,CAAC;YAClE,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC;gBAC7D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACd,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,WAAW;gBAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IACf,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,sBAAsB,CAAC,EAA6B;IAC3D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,IAAI,GAAmC,EAAE,CAAC;IAChD,MAAM,IAAI,GAAG,CAAC,KAAuC,EAAQ,EAAE;QAC7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC;gBAC7D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACd,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC7C,IAAI,CAAE,IAAI,CAAC,GAAiC,CAAC,KAAK,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IACf,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Strict validation options — decomposed into three orthogonal dimensions.
3
+ *
4
+ * --strict is shorthand for --strict-structure --strict-encoding --strict-state.
5
+ */
6
+ import type { Command } from "commander";
7
+ export interface StrictOptions {
8
+ strict?: boolean;
9
+ strictStructure?: boolean;
10
+ strictEncoding?: boolean;
11
+ strictState?: boolean;
12
+ }
13
+ export interface ResolvedStrictOptions {
14
+ strictStructure: boolean;
15
+ strictEncoding: boolean;
16
+ strictState: boolean;
17
+ }
18
+ /** Expand --strict shorthand into the three individual flags. */
19
+ export declare function resolveStrictOptions(opts: StrictOptions): ResolvedStrictOptions;
20
+ /** Register --strict, --strict-structure, --strict-encoding, --strict-state on a Commander command. */
21
+ export declare function addStrictOptions(cmd: Command): Command;
22
+ //# sourceMappingURL=strict-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strict-options.d.ts","sourceRoot":"","sources":["../../src/commands/strict-options.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,iEAAiE;AACjE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,aAAa,GAAG,qBAAqB,CAO/E;AAED,uGAAuG;AACvG,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAMtD"}
@@ -0,0 +1,18 @@
1
+ /** Expand --strict shorthand into the three individual flags. */
2
+ export function resolveStrictOptions(opts) {
3
+ const all = !!opts.strict;
4
+ return {
5
+ strictStructure: all || !!opts.strictStructure,
6
+ strictEncoding: all || !!opts.strictEncoding,
7
+ strictState: all || !!opts.strictState,
8
+ };
9
+ }
10
+ /** Register --strict, --strict-structure, --strict-encoding, --strict-state on a Commander command. */
11
+ export function addStrictOptions(cmd) {
12
+ return cmd
13
+ .option("--strict", "Shorthand for --strict-structure --strict-encoding --strict-state")
14
+ .option("--strict-structure", "Reject unknown keys at envelope/step level")
15
+ .option("--strict-encoding", "Reject JSON-string tool_state and format2 field misuse")
16
+ .option("--strict-state", "Require every tool step to validate; no skips allowed");
17
+ }
18
+ //# sourceMappingURL=strict-options.js.map
@@ -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,6 @@
1
+ export interface StructuralSchemaOptions {
2
+ format?: string;
3
+ output?: string;
4
+ }
5
+ export declare function runStructuralSchema(opts: StructuralSchemaOptions): Promise<void>;
6
+ //# sourceMappingURL=structural-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structural-schema.d.ts","sourceRoot":"","sources":["../../src/commands/structural-schema.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBtF"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * `galaxy-tool-cache structural-schema` — export the structural JSON Schema
3
+ * for Galaxy workflow validation (gxformat2 or native).
4
+ */
5
+ import { GalaxyWorkflowSchema, NativeGalaxyWorkflowSchema } from "@galaxy-tool-util/schema";
6
+ import * as JSONSchema from "effect/JSONSchema";
7
+ import { writeWorkflowOutput } from "./workflow-io.js";
8
+ export async function runStructuralSchema(opts) {
9
+ const format = opts.format ?? "format2";
10
+ if (format !== "format2" && format !== "native") {
11
+ console.error(`Unknown format: ${format}. Use 'format2' (default) or 'native'.`);
12
+ process.exitCode = 1;
13
+ return;
14
+ }
15
+ let jsonSchema;
16
+ try {
17
+ jsonSchema =
18
+ format === "native"
19
+ ? JSONSchema.make(NativeGalaxyWorkflowSchema)
20
+ : JSONSchema.make(GalaxyWorkflowSchema);
21
+ }
22
+ catch (e) {
23
+ const msg = e instanceof Error ? e.message : String(e);
24
+ console.error(`JSON Schema generation failed: ${msg}`);
25
+ process.exitCode = 1;
26
+ return;
27
+ }
28
+ const output = JSON.stringify(jsonSchema, null, 2) + "\n";
29
+ await writeWorkflowOutput(output, opts.output, "Structural schema");
30
+ }
31
+ //# sourceMappingURL=structural-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structural-schema.js","sourceRoot":"","sources":["../../src/commands/structural-schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAC5F,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAOvD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAA6B;IACrE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;IACxC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,CAAC,KAAK,CAAC,mBAAmB,MAAM,wCAAwC,CAAC,CAAC;QACjF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,UAAmB,CAAC;IACxB,IAAI,CAAC;QACH,UAAU;YACR,MAAM,KAAK,QAAQ;gBACjB,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,0BAA0B,CAAC;gBAC7C,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,KAAK,CAAC,kCAAkC,GAAG,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAC1D,MAAM,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;AACtE,CAAC"}