@galaxy-tool-util/cli 0.1.0 → 0.2.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 (83) 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 +126 -0
  7. package/dist/bin/gxwf.js.map +1 -0
  8. package/dist/commands/clean-tree.d.ts +23 -0
  9. package/dist/commands/clean-tree.d.ts.map +1 -0
  10. package/dist/commands/clean-tree.js +68 -0
  11. package/dist/commands/clean-tree.js.map +1 -0
  12. package/dist/commands/clean.d.ts +7 -0
  13. package/dist/commands/clean.d.ts.map +1 -0
  14. package/dist/commands/clean.js +38 -0
  15. package/dist/commands/clean.js.map +1 -0
  16. package/dist/commands/convert-tree.d.ts +31 -0
  17. package/dist/commands/convert-tree.d.ts.map +1 -0
  18. package/dist/commands/convert-tree.js +213 -0
  19. package/dist/commands/convert-tree.js.map +1 -0
  20. package/dist/commands/convert.d.ts +12 -0
  21. package/dist/commands/convert.d.ts.map +1 -0
  22. package/dist/commands/convert.js +119 -0
  23. package/dist/commands/convert.js.map +1 -0
  24. package/dist/commands/lint-tree.d.ts +27 -0
  25. package/dist/commands/lint-tree.d.ts.map +1 -0
  26. package/dist/commands/lint-tree.js +116 -0
  27. package/dist/commands/lint-tree.js.map +1 -0
  28. package/dist/commands/lint.d.ts +30 -0
  29. package/dist/commands/lint.d.ts.map +1 -0
  30. package/dist/commands/lint.js +147 -0
  31. package/dist/commands/lint.js.map +1 -0
  32. package/dist/commands/populate-workflow.d.ts +6 -0
  33. package/dist/commands/populate-workflow.d.ts.map +1 -0
  34. package/dist/commands/populate-workflow.js +55 -0
  35. package/dist/commands/populate-workflow.js.map +1 -0
  36. package/dist/commands/render-results.d.ts +11 -0
  37. package/dist/commands/render-results.d.ts.map +1 -0
  38. package/dist/commands/render-results.js +23 -0
  39. package/dist/commands/render-results.js.map +1 -0
  40. package/dist/commands/roundtrip-tree.d.ts +13 -0
  41. package/dist/commands/roundtrip-tree.d.ts.map +1 -0
  42. package/dist/commands/roundtrip-tree.js +116 -0
  43. package/dist/commands/roundtrip-tree.js.map +1 -0
  44. package/dist/commands/roundtrip.d.ts +30 -0
  45. package/dist/commands/roundtrip.d.ts.map +1 -0
  46. package/dist/commands/roundtrip.js +122 -0
  47. package/dist/commands/roundtrip.js.map +1 -0
  48. package/dist/commands/stateful-tool-inputs.d.ts +33 -0
  49. package/dist/commands/stateful-tool-inputs.d.ts.map +1 -0
  50. package/dist/commands/stateful-tool-inputs.js +73 -0
  51. package/dist/commands/stateful-tool-inputs.js.map +1 -0
  52. package/dist/commands/structural-schema.d.ts +6 -0
  53. package/dist/commands/structural-schema.d.ts.map +1 -0
  54. package/dist/commands/structural-schema.js +31 -0
  55. package/dist/commands/structural-schema.js.map +1 -0
  56. package/dist/commands/tree.d.ts +45 -0
  57. package/dist/commands/tree.d.ts.map +1 -0
  58. package/dist/commands/tree.js +155 -0
  59. package/dist/commands/tree.js.map +1 -0
  60. package/dist/commands/validate-tree.d.ts +29 -0
  61. package/dist/commands/validate-tree.d.ts.map +1 -0
  62. package/dist/commands/validate-tree.js +118 -0
  63. package/dist/commands/validate-tree.js.map +1 -0
  64. package/dist/commands/validate-workflow-json-schema.d.ts.map +1 -1
  65. package/dist/commands/validate-workflow-json-schema.js +49 -16
  66. package/dist/commands/validate-workflow-json-schema.js.map +1 -1
  67. package/dist/commands/validate-workflow.d.ts +1 -0
  68. package/dist/commands/validate-workflow.d.ts.map +1 -1
  69. package/dist/commands/validate-workflow.js +57 -56
  70. package/dist/commands/validate-workflow.js.map +1 -1
  71. package/dist/commands/workflow-io.d.ts +16 -0
  72. package/dist/commands/workflow-io.d.ts.map +1 -0
  73. package/dist/commands/workflow-io.js +47 -0
  74. package/dist/commands/workflow-io.js.map +1 -0
  75. package/dist/index.d.ts +26 -0
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +24 -0
  78. package/dist/index.js.map +1 -1
  79. package/package.json +15 -15
  80. package/dist/bin/galaxy-workflow-validate.d.ts +0 -3
  81. package/dist/bin/galaxy-workflow-validate.d.ts.map +0 -1
  82. package/dist/bin/galaxy-workflow-validate.js +0 -17
  83. package/dist/bin/galaxy-workflow-validate.js.map +0 -1
@@ -0,0 +1,12 @@
1
+ export interface ConvertOptions {
2
+ to?: string;
3
+ output?: string;
4
+ compact?: boolean;
5
+ json?: boolean;
6
+ yaml?: boolean;
7
+ format?: string;
8
+ stateful?: boolean;
9
+ cacheDir?: string;
10
+ }
11
+ export declare function runConvert(filePath: string, opts: ConvertOptions): Promise<void>;
12
+ //# sourceMappingURL=convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,cAAc;IAC7B,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,CAoEtF"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * `gxwf convert` — convert between native (.ga) and format2 (.gxwf.yml) formats.
3
+ */
4
+ import { ToolCache } from "@galaxy-tool-util/core";
5
+ import { toFormat2, toFormat2Stateful, toNative, toNativeStateful, } 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 { readWorkflowFile, resolveFormat, serializeWorkflow, writeWorkflowOutput, } from "./workflow-io.js";
10
+ export async function runConvert(filePath, opts) {
11
+ const data = await readWorkflowFile(filePath);
12
+ if (!data)
13
+ return;
14
+ const sourceFormat = resolveFormat(data, opts.format);
15
+ const targetFormat = resolveTargetFormat(sourceFormat, opts.to);
16
+ if (sourceFormat === targetFormat) {
17
+ console.error(`Source and target formats are both ${sourceFormat}. ` +
18
+ `Use --to to specify the target format.`);
19
+ process.exitCode = 1;
20
+ return;
21
+ }
22
+ let result;
23
+ let stepStatuses = null;
24
+ if (opts.stateful) {
25
+ const cache = new ToolCache({ cacheDir: opts.cacheDir });
26
+ await cache.index.load();
27
+ if (cache.index.listAll().length === 0) {
28
+ console.warn("Tool cache is empty — stateful conversion will fall back for every step");
29
+ }
30
+ const expansionOpts = {
31
+ resolver: createDefaultResolver({ workflowDirectory: dirname(filePath) }),
32
+ };
33
+ const { resolver, status: toolStatus } = await loadToolInputsForWorkflow(data, sourceFormat, cache, expansionOpts);
34
+ for (const s of toolStatus) {
35
+ if (!s.loaded) {
36
+ const ver = s.toolVersion ? `@${s.toolVersion}` : "";
37
+ console.error(` tool ${s.toolId}${ver}: ${s.error}`);
38
+ }
39
+ }
40
+ if (targetFormat === "format2") {
41
+ const r = toFormat2Stateful(data, resolver);
42
+ result = r.workflow;
43
+ stepStatuses = r.steps;
44
+ if (opts.compact)
45
+ stripPositionInfo(result);
46
+ }
47
+ else {
48
+ const r = toNativeStateful(data, resolver);
49
+ result = r.workflow;
50
+ stepStatuses = r.steps;
51
+ }
52
+ }
53
+ else if (targetFormat === "format2") {
54
+ result = toFormat2(data);
55
+ if (opts.compact) {
56
+ stripPositionInfo(result);
57
+ }
58
+ }
59
+ else {
60
+ result = toNative(data);
61
+ }
62
+ const output = serializeWorkflow(result, targetFormat, { json: opts.json, yaml: opts.yaml });
63
+ await writeWorkflowOutput(output, opts.output, "Converted workflow");
64
+ if (stepStatuses !== null) {
65
+ reportStepStatuses(stepStatuses);
66
+ }
67
+ }
68
+ function reportStepStatuses(statuses) {
69
+ const converted = statuses.filter((s) => s.converted).length;
70
+ const failed = statuses.length - converted;
71
+ console.error(`\nStateful conversion: ${converted}/${statuses.length} steps converted` +
72
+ (failed > 0 ? `, ${failed} fell back` : ""));
73
+ // Aggregate fallbacks by failure class
74
+ if (failed > 0) {
75
+ const byClass = new Map();
76
+ for (const s of statuses) {
77
+ if (!s.converted) {
78
+ const cls = s.failureClass ?? "unknown";
79
+ byClass.set(cls, (byClass.get(cls) ?? 0) + 1);
80
+ }
81
+ }
82
+ const summary = Array.from(byClass.entries())
83
+ .map(([k, v]) => `${k}=${v}`)
84
+ .join(", ");
85
+ console.error(` fallback breakdown: ${summary}`);
86
+ }
87
+ for (const s of statuses) {
88
+ if (!s.converted) {
89
+ const label = s.toolId ? `${s.stepId} (${s.toolId})` : s.stepId;
90
+ const cls = s.failureClass ?? "unknown";
91
+ console.error(` step ${label} [${cls}]: ${s.error ?? "unknown error"}`);
92
+ }
93
+ }
94
+ if (failed > 0)
95
+ process.exitCode = 1;
96
+ }
97
+ function resolveTargetFormat(sourceFormat, toOpt) {
98
+ if (toOpt === "native" || toOpt === "format2")
99
+ return toOpt;
100
+ // Infer opposite
101
+ return sourceFormat === "native" ? "format2" : "native";
102
+ }
103
+ /** Recursively remove position-related keys from format2 output. */
104
+ function stripPositionInfo(obj) {
105
+ delete obj.position;
106
+ for (const val of Object.values(obj)) {
107
+ if (Array.isArray(val)) {
108
+ for (const item of val) {
109
+ if (item && typeof item === "object") {
110
+ stripPositionInfo(item);
111
+ }
112
+ }
113
+ }
114
+ else if (val && typeof val === "object") {
115
+ stripPositionInfo(val);
116
+ }
117
+ }
118
+ }
119
+ //# 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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"}
@@ -0,0 +1,27 @@
1
+ import { type LintReport } from "./lint.js";
2
+ import { type TreeSummary } from "./tree.js";
3
+ export interface LintTreeOptions {
4
+ format?: string;
5
+ skipBestPractices?: boolean;
6
+ skipStateValidation?: boolean;
7
+ cacheDir?: string;
8
+ json?: boolean;
9
+ }
10
+ export interface WorkflowLintResult {
11
+ relativePath: string;
12
+ report: LintReport;
13
+ }
14
+ export interface LintTreeReport {
15
+ root: string;
16
+ results: (WorkflowLintResult | {
17
+ relativePath: string;
18
+ error: string;
19
+ })[];
20
+ summary: TreeSummary & {
21
+ lintErrors: number;
22
+ lintWarnings: number;
23
+ stateFail: number;
24
+ };
25
+ }
26
+ export declare function runLintTree(dir: string, opts: LintTreeOptions): Promise<void>;
27
+ //# 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":"AAKA,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAmD,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAE9F,MAAM,WAAW,eAAe;IAC9B,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;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,kBAAkB,GAAG;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IAC1E,OAAO,EAAE,WAAW,GAAG;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CACxF;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA6EnF"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * `gxwf lint-tree` — batch lint all workflows under a directory.
3
+ */
4
+ import { ToolCache } from "@galaxy-tool-util/core";
5
+ import { resolveFormat } from "./workflow-io.js";
6
+ import { lintWorkflowReport } from "./lint.js";
7
+ import { collectTree, summarizeOutcomes } from "./tree.js";
8
+ export async function runLintTree(dir, opts) {
9
+ // Load tool cache once for all files
10
+ let cache;
11
+ if (!opts.skipStateValidation) {
12
+ try {
13
+ cache = new ToolCache({ cacheDir: opts.cacheDir });
14
+ await cache.index.load();
15
+ if (cache.index.listAll().length === 0) {
16
+ console.warn("Tool cache is empty — skipping tool state validation for all files");
17
+ cache = undefined;
18
+ }
19
+ }
20
+ catch (e) {
21
+ const msg = e instanceof Error ? e.message : String(e);
22
+ console.warn(`Failed to load tool cache: ${msg}`);
23
+ }
24
+ }
25
+ const treeResult = await collectTree(dir, async (info, data) => {
26
+ const format = resolveFormat(data, opts.format);
27
+ const report = await lintWorkflowReport(info.path, data, format, {
28
+ skipBestPractices: opts.skipBestPractices,
29
+ skipStateValidation: opts.skipStateValidation,
30
+ cache,
31
+ });
32
+ return { relativePath: info.relativePath, report };
33
+ });
34
+ const report = buildLintTreeReport(treeResult);
35
+ if (opts.json) {
36
+ console.log(JSON.stringify(report, null, 2));
37
+ process.exitCode = computeLintExitCode(report);
38
+ return;
39
+ }
40
+ // Text output
41
+ for (const outcome of treeResult.outcomes) {
42
+ if (outcome.error) {
43
+ console.error(` ${outcome.info.relativePath}: ERROR (${outcome.error})`);
44
+ continue;
45
+ }
46
+ if (outcome.skipped) {
47
+ console.warn(` ${outcome.info.relativePath}: SKIPPED (${outcome.skipReason})`);
48
+ continue;
49
+ }
50
+ const r = outcome.result;
51
+ const lr = r.report;
52
+ const errors = lr.structural.error_count + (lr.bestPractices?.error_count ?? 0);
53
+ const warnings = lr.structural.warn_count + (lr.bestPractices?.warn_count ?? 0);
54
+ const stateFails = lr.stateValidation?.filter((s) => s.status === "fail").length ?? 0;
55
+ if (errors > 0 || stateFails > 0) {
56
+ console.error(` ${r.relativePath}: ${errors} errors, ${warnings} warnings, ${stateFails} state failures`);
57
+ for (const e of lr.structural.errors)
58
+ console.error(` [structural] ${e}`);
59
+ if (lr.bestPractices) {
60
+ for (const e of lr.bestPractices.errors)
61
+ console.error(` [best-practices] ${e}`);
62
+ }
63
+ if (lr.stateValidation) {
64
+ for (const s of lr.stateValidation.filter((s) => s.status === "fail")) {
65
+ for (const err of s.errors)
66
+ console.error(` [state] Step ${s.stepLabel} (${s.toolId}): ${err}`);
67
+ }
68
+ }
69
+ }
70
+ else if (warnings > 0) {
71
+ console.warn(` ${r.relativePath}: ${warnings} warnings`);
72
+ }
73
+ else {
74
+ console.log(` ${r.relativePath}: OK`);
75
+ }
76
+ }
77
+ const s = report.summary;
78
+ console.log(`\nSummary: ${s.total} workflows | ${s.lintErrors} errors, ${s.lintWarnings} warnings, ${s.stateFail} state failures`);
79
+ process.exitCode = computeLintExitCode(report);
80
+ }
81
+ function buildLintTreeReport(treeResult) {
82
+ const results = [];
83
+ let lintErrors = 0;
84
+ let lintWarnings = 0;
85
+ let stateFail = 0;
86
+ for (const o of treeResult.outcomes) {
87
+ if (o.error) {
88
+ results.push({ relativePath: o.info.relativePath, error: o.error });
89
+ continue;
90
+ }
91
+ if (o.skipped) {
92
+ results.push({ relativePath: o.info.relativePath, error: `SKIPPED: ${o.skipReason}` });
93
+ continue;
94
+ }
95
+ const r = o.result;
96
+ results.push(r);
97
+ lintErrors += r.report.structural.error_count + (r.report.bestPractices?.error_count ?? 0);
98
+ lintWarnings += r.report.structural.warn_count + (r.report.bestPractices?.warn_count ?? 0);
99
+ stateFail += r.report.stateValidation?.filter((s) => s.status === "fail").length ?? 0;
100
+ }
101
+ const wfSummary = summarizeOutcomes(treeResult.outcomes, (r) => r.report.exitCode >= 2);
102
+ return {
103
+ root: treeResult.root,
104
+ results,
105
+ summary: { ...wfSummary, lintErrors, lintWarnings, stateFail },
106
+ };
107
+ }
108
+ function computeLintExitCode(report) {
109
+ const s = report.summary;
110
+ if (s.lintErrors > 0 || s.stateFail > 0 || s.error > 0)
111
+ return 2;
112
+ if (s.lintWarnings > 0)
113
+ return 1;
114
+ return 0;
115
+ }
116
+ //# 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,30 @@
1
+ /**
2
+ * `gxwf lint` — unified lint combining structural checks, best practices,
3
+ * and tool state validation.
4
+ */
5
+ import { ToolCache } from "@galaxy-tool-util/core";
6
+ import { type LintResult } from "@galaxy-tool-util/schema";
7
+ import { type StepValidationResult } from "./validate-workflow.js";
8
+ export interface LintOptions {
9
+ format?: string;
10
+ skipBestPractices?: boolean;
11
+ skipStateValidation?: boolean;
12
+ cacheDir?: string;
13
+ json?: boolean;
14
+ }
15
+ export interface LintReportOptions {
16
+ skipBestPractices?: boolean;
17
+ skipStateValidation?: boolean;
18
+ cache?: ToolCache;
19
+ }
20
+ export interface LintReport {
21
+ structural: LintResult;
22
+ bestPractices: LintResult | null;
23
+ stateValidation: StepValidationResult[] | null;
24
+ stateSkipped: boolean;
25
+ exitCode: number;
26
+ }
27
+ export declare function runLint(filePath: string, opts: LintOptions): Promise<void>;
28
+ /** Lint a workflow, returning a structured report. Pure logic — no CLI I/O. */
29
+ export declare function lintWorkflowReport(filePath: string, data: Record<string, unknown>, format: string, opts: LintReportOptions): Promise<LintReport>;
30
+ //# 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,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAIL,KAAK,UAAU,EAEhB,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,WAAW;IAC1B,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;AAED,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;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,QAAQ,EAAE,MAAM,CAAC;CAClB;AAaD,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuEhF;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,CAoDrB"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * `gxwf lint` — unified lint combining structural checks, best practices,
3
+ * and tool state validation.
4
+ */
5
+ import { ToolCache } from "@galaxy-tool-util/core";
6
+ import { lintWorkflow, lintBestPracticesNative, lintBestPracticesFormat2, } from "@galaxy-tool-util/schema";
7
+ import { dirname } from "node:path";
8
+ import { renderStepResults } from "./render-results.js";
9
+ import { readWorkflowFile, resolveFormat } from "./workflow-io.js";
10
+ import { createDefaultResolver } from "./url-resolver.js";
11
+ import { validateNativeSteps, validateFormat2Steps, } from "./validate-workflow.js";
12
+ function mergeLintResults(...results) {
13
+ const errors = [];
14
+ const warnings = [];
15
+ for (const r of results) {
16
+ if (!r)
17
+ continue;
18
+ errors.push(...r.errors);
19
+ warnings.push(...r.warnings);
20
+ }
21
+ return { errors, warnings, error_count: errors.length, warn_count: warnings.length };
22
+ }
23
+ export async function runLint(filePath, opts) {
24
+ const data = await readWorkflowFile(filePath);
25
+ if (!data)
26
+ return;
27
+ const format = resolveFormat(data, opts.format);
28
+ // Build or load tool cache for state validation
29
+ let cache;
30
+ if (!opts.skipStateValidation) {
31
+ try {
32
+ cache = new ToolCache({ cacheDir: opts.cacheDir });
33
+ await cache.index.load();
34
+ }
35
+ catch (e) {
36
+ const msg = e instanceof Error ? e.message : String(e);
37
+ console.warn(`Failed to load tool cache: ${msg}`);
38
+ }
39
+ }
40
+ const report = await lintWorkflowReport(filePath, data, format, {
41
+ skipBestPractices: opts.skipBestPractices,
42
+ skipStateValidation: opts.skipStateValidation,
43
+ cache,
44
+ });
45
+ if (opts.json) {
46
+ console.log(JSON.stringify(report, null, 2));
47
+ process.exitCode = report.exitCode;
48
+ return;
49
+ }
50
+ // Structural lint
51
+ const { structural } = report;
52
+ if (structural.error_count > 0) {
53
+ console.error("Structural lint errors:");
54
+ for (const e of structural.errors)
55
+ console.error(` ${e}`);
56
+ }
57
+ if (structural.warn_count > 0) {
58
+ console.warn("Structural lint warnings:");
59
+ for (const w of structural.warnings)
60
+ console.warn(` ${w}`);
61
+ }
62
+ if (structural.error_count === 0 && structural.warn_count === 0) {
63
+ console.log("Structural lint: OK");
64
+ }
65
+ // Best practices
66
+ if (report.bestPractices) {
67
+ const bp = report.bestPractices;
68
+ if (bp.error_count > 0) {
69
+ console.error("Best practices errors:");
70
+ for (const e of bp.errors)
71
+ console.error(` ${e}`);
72
+ }
73
+ if (bp.warn_count > 0) {
74
+ console.warn("Best practices warnings:");
75
+ for (const w of bp.warnings)
76
+ console.warn(` ${w}`);
77
+ }
78
+ if (bp.error_count === 0 && bp.warn_count === 0) {
79
+ console.log("Best practices: OK");
80
+ }
81
+ }
82
+ // Tool state validation
83
+ if (report.stateValidation) {
84
+ const { validated, skipped } = renderStepResults(report.stateValidation);
85
+ if (report.stateValidation.length > 0) {
86
+ console.log(`\nTool state: ${validated} validated, ${skipped} skipped`);
87
+ }
88
+ }
89
+ else if (report.stateSkipped) {
90
+ console.log("Tool state validation: skipped");
91
+ }
92
+ process.exitCode = report.exitCode;
93
+ }
94
+ /** Lint a workflow, returning a structured report. Pure logic — no CLI I/O. */
95
+ export async function lintWorkflowReport(filePath, data, format, opts) {
96
+ // Phase 1: Structural lint (always runs)
97
+ const structural = lintWorkflow(data);
98
+ // Phase 2: Best practices
99
+ let bestPractices = null;
100
+ if (!opts.skipBestPractices) {
101
+ bestPractices =
102
+ format === "native" ? lintBestPracticesNative(data) : lintBestPracticesFormat2(data);
103
+ }
104
+ // Phase 3: Tool state validation
105
+ let stateValidation = null;
106
+ let stateSkipped = !!opts.skipStateValidation;
107
+ if (!opts.skipStateValidation) {
108
+ const cache = opts.cache;
109
+ if (!cache) {
110
+ stateSkipped = true;
111
+ }
112
+ else {
113
+ try {
114
+ const isEmpty = cache.index.listAll().length === 0;
115
+ if (isEmpty) {
116
+ console.warn("Tool cache is empty — skipping tool state validation");
117
+ stateSkipped = true;
118
+ }
119
+ else {
120
+ const workflowDirectory = dirname(filePath);
121
+ const expansionOpts = {
122
+ resolver: createDefaultResolver({ workflowDirectory }),
123
+ };
124
+ if (format === "native") {
125
+ stateValidation = await validateNativeSteps(data, cache, "", expansionOpts);
126
+ }
127
+ else {
128
+ stateValidation = await validateFormat2Steps(data, cache, "", expansionOpts);
129
+ }
130
+ }
131
+ }
132
+ catch (e) {
133
+ const msg = e instanceof Error ? e.message : String(e);
134
+ console.warn(`Tool state validation failed: ${msg}`);
135
+ stateSkipped = true;
136
+ }
137
+ }
138
+ }
139
+ // Compute exit code: 0 = clean, 1 = warnings only, 2 = errors
140
+ const merged = mergeLintResults(structural, bestPractices);
141
+ const hasStateErrors = stateValidation?.some((r) => r.status === "fail") ?? false;
142
+ const hasErrors = merged.error_count > 0 || hasStateErrors;
143
+ const hasWarnings = merged.warn_count > 0;
144
+ const exitCode = hasErrors ? 2 : hasWarnings ? 1 : 0;
145
+ return { structural, bestPractices, stateValidation, stateSkipped, exitCode };
146
+ }
147
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface PopulateWorkflowOptions {
2
+ cacheDir?: string;
3
+ galaxyUrl?: string;
4
+ }
5
+ export declare function runPopulateWorkflow(filePath: string, opts: PopulateWorkflowOptions): Promise<void>;
6
+ //# sourceMappingURL=populate-workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"populate-workflow.d.ts","sourceRoot":"","sources":["../../src/commands/populate-workflow.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAgDf"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * `galaxy-tool-cache populate-workflow` — scan workflow(s) for tool references
3
+ * and populate the cache with each unique tool.
4
+ */
5
+ import { ToolInfoService } from "@galaxy-tool-util/core";
6
+ import { expandedNative, expandedFormat2, } from "@galaxy-tool-util/schema";
7
+ import { dirname } from "node:path";
8
+ import { readWorkflowFile, resolveFormat } from "./workflow-io.js";
9
+ import { createDefaultResolver } from "./url-resolver.js";
10
+ export async function runPopulateWorkflow(filePath, opts) {
11
+ const data = await readWorkflowFile(filePath);
12
+ if (!data)
13
+ return;
14
+ const format = resolveFormat(data);
15
+ const workflowDirectory = dirname(filePath);
16
+ const expansionOpts = {
17
+ resolver: createDefaultResolver({ workflowDirectory }),
18
+ };
19
+ let tools;
20
+ if (format === "native") {
21
+ const expanded = await expandedNative(data, expansionOpts);
22
+ tools = expanded.unique_tools;
23
+ }
24
+ else {
25
+ const expanded = await expandedFormat2(data, expansionOpts);
26
+ tools = expanded.unique_tools;
27
+ }
28
+ if (tools.size === 0) {
29
+ console.log("No tool steps found in workflow.");
30
+ return;
31
+ }
32
+ const service = new ToolInfoService({
33
+ cacheDir: opts.cacheDir,
34
+ galaxyUrl: opts.galaxyUrl,
35
+ });
36
+ let cached = 0;
37
+ let failed = 0;
38
+ const total = tools.size;
39
+ for (const ref of tools) {
40
+ const result = await service.getToolInfo(ref.tool_id, ref.tool_version);
41
+ if (result) {
42
+ cached++;
43
+ console.log(` Cached: ${ref.tool_id} v${ref.tool_version ?? "latest"}`);
44
+ }
45
+ else {
46
+ failed++;
47
+ console.warn(` Failed: ${ref.tool_id} v${ref.tool_version ?? "latest"}`);
48
+ }
49
+ }
50
+ console.log(`\nPopulated ${cached}/${total} tools${failed > 0 ? `, ${failed} failed` : ""}`);
51
+ if (failed > 0) {
52
+ process.exitCode = 1;
53
+ }
54
+ }
55
+ //# sourceMappingURL=populate-workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"populate-workflow.js","sourceRoot":"","sources":["../../src/commands/populate-workflow.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,cAAc,EACd,eAAe,GAGhB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAO1D,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAgB,EAChB,IAA6B;IAE7B,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI;QAAE,OAAO;IAElB,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,iBAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAqB;QACtC,QAAQ,EAAE,qBAAqB,CAAC,EAAE,iBAAiB,EAAE,CAAC;KACvD,CAAC;IAEF,IAAI,KAAyB,CAAC;IAC9B,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC3D,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC5D,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC;IAChC,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC;QAClC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC,CAAC;IAEH,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;IAEzB,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;QACxE,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,YAAY,IAAI,QAAQ,EAAE,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,YAAY,IAAI,QAAQ,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,IAAI,KAAK,SAAS,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7F,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Shared rendering for StepValidationResult arrays.
3
+ */
4
+ import type { StepValidationResult } from "./validate-workflow.js";
5
+ export interface RenderSummary {
6
+ validated: number;
7
+ skipped: number;
8
+ }
9
+ /** Render step validation results to console, returning counts. */
10
+ export declare function renderStepResults(results: StepValidationResult[]): RenderSummary;
11
+ //# sourceMappingURL=render-results.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-results.d.ts","sourceRoot":"","sources":["../../src/commands/render-results.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,aAAa,CAiBhF"}
@@ -0,0 +1,23 @@
1
+ /** Render step validation results to console, returning counts. */
2
+ export function renderStepResults(results) {
3
+ let validated = 0;
4
+ let skipped = 0;
5
+ for (const r of results) {
6
+ if (r.status === "skip") {
7
+ skipped++;
8
+ console.warn(` [${r.stepLabel}] skipped — ${r.errors[0] ?? "unknown"}`);
9
+ }
10
+ else if (r.status === "fail") {
11
+ validated++;
12
+ console.error(` [${r.stepLabel}] tool_state errors (${r.toolId}):`);
13
+ for (const line of r.errors)
14
+ console.error(` ${line}`);
15
+ }
16
+ else {
17
+ validated++;
18
+ console.log(` [${r.stepLabel}] tool_state: OK`);
19
+ }
20
+ }
21
+ return { validated, skipped };
22
+ }
23
+ //# sourceMappingURL=render-results.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-results.js","sourceRoot":"","sources":["../../src/commands/render-results.ts"],"names":[],"mappings":"AAUA,mEAAmE;AACnE,MAAM,UAAU,iBAAiB,CAAC,OAA+B;IAC/D,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACxB,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,SAAS,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;QAC3E,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC/B,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,wBAAwB,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;YACrE,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,MAAM;gBAAE,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,SAAS,kBAAkB,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAChC,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface RoundtripTreeOptions {
2
+ cacheDir?: string;
3
+ format?: string;
4
+ json?: boolean;
5
+ /** Only list files with error-severity diffs or failures. */
6
+ errorsOnly?: boolean;
7
+ /** Only list files with benign diffs (no errors, no failures). */
8
+ benignOnly?: boolean;
9
+ /** Suppress per-file lines; print only the aggregate summary. */
10
+ brief?: boolean;
11
+ }
12
+ export declare function runRoundtripTree(dir: string, opts: RoundtripTreeOptions): Promise<void>;
13
+ //# sourceMappingURL=roundtrip-tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roundtrip-tree.d.ts","sourceRoot":"","sources":["../../src/commands/roundtrip-tree.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,6DAA6D;IAC7D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kEAAkE;IAClE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iEAAiE;IACjE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAQD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoH7F"}