@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,195 @@
1
+ import { makeNodeToolCache } from "@galaxy-tool-util/core/node";
2
+ import { lintWorkflow, lintBestPracticesNative, lintBestPracticesFormat2, checkStrictEncoding, checkStrictStructure, buildSingleLintReport, } from "@galaxy-tool-util/schema";
3
+ import { dirname } from "node:path";
4
+ import { renderStepResults } from "./render-results.js";
5
+ import { readWorkflowFile, resolveFormat } from "./workflow-io.js";
6
+ import { createDefaultResolver } from "./url-resolver.js";
7
+ import { resolveStrictOptions, } from "./strict-options.js";
8
+ import { validateNativeSteps, validateFormat2Steps, decodeStructureErrors, detectEncodingErrors, } from "./validate-workflow.js";
9
+ import { writeReportHtml } from "./report-output.js";
10
+ function mergeLintResults(...results) {
11
+ const errors = [];
12
+ const warnings = [];
13
+ for (const r of results) {
14
+ if (!r)
15
+ continue;
16
+ errors.push(...r.errors);
17
+ warnings.push(...r.warnings);
18
+ }
19
+ return { errors, warnings, error_count: errors.length, warn_count: warnings.length };
20
+ }
21
+ export async function runLint(filePath, opts) {
22
+ const data = await readWorkflowFile(filePath);
23
+ if (!data)
24
+ return;
25
+ const format = resolveFormat(data, opts.format);
26
+ // Build or load tool cache for state validation
27
+ let cache;
28
+ if (!opts.skipStateValidation) {
29
+ try {
30
+ cache = makeNodeToolCache({ cacheDir: opts.cacheDir });
31
+ await cache.index.load();
32
+ }
33
+ catch (e) {
34
+ const msg = e instanceof Error ? e.message : String(e);
35
+ console.warn(`Failed to load tool cache: ${msg}`);
36
+ }
37
+ }
38
+ const strict = resolveStrictOptions(opts);
39
+ const report = await lintWorkflowReport(filePath, data, format, {
40
+ skipBestPractices: opts.skipBestPractices,
41
+ skipStateValidation: opts.skipStateValidation,
42
+ cache,
43
+ strict,
44
+ });
45
+ if (opts.json || opts.reportHtml) {
46
+ const lintErrors = report.structural.error_count + (report.bestPractices?.error_count ?? 0);
47
+ const lintWarnings = report.structural.warn_count + (report.bestPractices?.warn_count ?? 0);
48
+ // Effect Schema decode for structure_errors
49
+ const structureErrors = decodeStructureErrors(data, format);
50
+ // Legacy encoding detection for encoding_errors
51
+ let encodingErrors = [];
52
+ if (cache && !opts.skipStateValidation) {
53
+ const expansionOpts = {
54
+ resolver: createDefaultResolver({ workflowDirectory: dirname(filePath) }),
55
+ };
56
+ encodingErrors = await detectEncodingErrors(data, cache, format, expansionOpts);
57
+ }
58
+ const singleReport = buildSingleLintReport(filePath, lintErrors, lintWarnings, report.stateValidation ?? [], { structure_errors: structureErrors, encoding_errors: encodingErrors });
59
+ if (opts.json) {
60
+ console.log(JSON.stringify(singleReport, null, 2));
61
+ }
62
+ await writeReportHtml("lint", singleReport, opts.reportHtml);
63
+ process.exitCode = report.exitCode;
64
+ return;
65
+ }
66
+ // Strict checks
67
+ if (report.encodingErrors.length > 0) {
68
+ console.error("Encoding errors:");
69
+ for (const e of report.encodingErrors)
70
+ console.error(` ${e}`);
71
+ }
72
+ if (report.structureErrors.length > 0) {
73
+ console.error("Structure errors (strict):");
74
+ for (const e of report.structureErrors)
75
+ console.error(` ${e}`);
76
+ }
77
+ // Structural lint
78
+ const { structural } = report;
79
+ if (structural.error_count > 0) {
80
+ console.error("Structural lint errors:");
81
+ for (const e of structural.errors)
82
+ console.error(` ${e}`);
83
+ }
84
+ if (structural.warn_count > 0) {
85
+ console.warn("Structural lint warnings:");
86
+ for (const w of structural.warnings)
87
+ console.warn(` ${w}`);
88
+ }
89
+ if (structural.error_count === 0 && structural.warn_count === 0) {
90
+ console.log("Structural lint: OK");
91
+ }
92
+ // Best practices
93
+ if (report.bestPractices) {
94
+ const bp = report.bestPractices;
95
+ if (bp.error_count > 0) {
96
+ console.error("Best practices errors:");
97
+ for (const e of bp.errors)
98
+ console.error(` ${e}`);
99
+ }
100
+ if (bp.warn_count > 0) {
101
+ console.warn("Best practices warnings:");
102
+ for (const w of bp.warnings)
103
+ console.warn(` ${w}`);
104
+ }
105
+ if (bp.error_count === 0 && bp.warn_count === 0) {
106
+ console.log("Best practices: OK");
107
+ }
108
+ }
109
+ // Tool state validation
110
+ if (report.stateValidation) {
111
+ const { validated, skipped } = renderStepResults(report.stateValidation);
112
+ if (report.stateValidation.length > 0) {
113
+ console.log(`\nTool state: ${validated} validated, ${skipped} skipped`);
114
+ }
115
+ }
116
+ else if (report.stateSkipped) {
117
+ console.log("Tool state validation: skipped");
118
+ }
119
+ process.exitCode = report.exitCode;
120
+ }
121
+ /** Lint a workflow, returning a structured report. Pure logic — no CLI I/O. */
122
+ export async function lintWorkflowReport(filePath, data, format, opts) {
123
+ const strict = opts.strict ?? {
124
+ strictStructure: false,
125
+ strictEncoding: false,
126
+ strictState: false,
127
+ };
128
+ const fmt = format;
129
+ // Strict encoding check
130
+ const encodingErrors = strict.strictEncoding ? checkStrictEncoding(data, fmt) : [];
131
+ // Strict structure check
132
+ const structureErrors = strict.strictStructure ? checkStrictStructure(data, fmt) : [];
133
+ // Phase 1: Structural lint (always runs)
134
+ const structural = lintWorkflow(data);
135
+ // Phase 2: Best practices
136
+ let bestPractices = null;
137
+ if (!opts.skipBestPractices) {
138
+ bestPractices =
139
+ format === "native" ? lintBestPracticesNative(data) : lintBestPracticesFormat2(data);
140
+ }
141
+ // Phase 3: Tool state validation
142
+ let stateValidation = null;
143
+ let stateSkipped = !!opts.skipStateValidation;
144
+ if (!opts.skipStateValidation) {
145
+ const cache = opts.cache;
146
+ if (!cache) {
147
+ stateSkipped = true;
148
+ }
149
+ else {
150
+ try {
151
+ const isEmpty = (await cache.index.listAll()).length === 0;
152
+ if (isEmpty) {
153
+ console.warn("Tool cache is empty — skipping tool state validation");
154
+ stateSkipped = true;
155
+ }
156
+ else {
157
+ const workflowDirectory = dirname(filePath);
158
+ const expansionOpts = {
159
+ resolver: createDefaultResolver({ workflowDirectory }),
160
+ };
161
+ if (format === "native") {
162
+ stateValidation = await validateNativeSteps(data, cache, "", expansionOpts);
163
+ }
164
+ else {
165
+ stateValidation = await validateFormat2Steps(data, cache, "", expansionOpts);
166
+ }
167
+ }
168
+ }
169
+ catch (e) {
170
+ const msg = e instanceof Error ? e.message : String(e);
171
+ console.warn(`Tool state validation failed: ${msg}`);
172
+ stateSkipped = true;
173
+ }
174
+ }
175
+ }
176
+ // Compute exit code: 0 = clean, 1 = warnings only, 2 = errors
177
+ const merged = mergeLintResults(structural, bestPractices);
178
+ const hasStateErrors = stateValidation?.some((r) => r.status === "fail") ?? false;
179
+ const hasStrictErrors = encodingErrors.length > 0 || structureErrors.length > 0;
180
+ const hasStrictStateSkips = strict.strictState &&
181
+ (stateValidation?.some((r) => r.status !== "ok" && r.status !== "fail") ?? false);
182
+ const hasErrors = merged.error_count > 0 || hasStateErrors || hasStrictErrors || hasStrictStateSkips;
183
+ const hasWarnings = merged.warn_count > 0;
184
+ const exitCode = hasErrors ? 2 : hasWarnings ? 1 : 0;
185
+ return {
186
+ structural,
187
+ bestPractices,
188
+ stateValidation,
189
+ stateSkipped,
190
+ encodingErrors,
191
+ structureErrors,
192
+ exitCode,
193
+ };
194
+ }
195
+ //# 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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"}
@@ -1,8 +1,8 @@
1
- import { ToolCache } from "@galaxy-tool-util/core";
1
+ import { makeNodeToolCache } from "@galaxy-tool-util/core/node";
2
2
  export async function runList(opts) {
3
- const cache = new ToolCache({ cacheDir: opts.cacheDir });
3
+ const cache = makeNodeToolCache({ cacheDir: opts.cacheDir });
4
4
  await cache.index.load();
5
- const entries = cache.listCached();
5
+ const entries = await cache.listCached();
6
6
  if (entries.length === 0) {
7
7
  console.log("Cache is empty.");
8
8
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAOnD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAiB;IAC7C,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,OAAO,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;IAEnC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAEpF,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACzF,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAExD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAOhE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAiB;IAC7C,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,OAAO,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;IAEzC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAEpF,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACzF,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAExD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,CAAC;AACH,CAAC"}
@@ -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 { makeNodeToolInfoService } from "@galaxy-tool-util/core/node";
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 = makeNodeToolInfoService({
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,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,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,uBAAuB,CAAC;QACtC,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 ValidationStepResult arrays.
3
+ */
4
+ import { type ValidationStepResult } from "@galaxy-tool-util/schema";
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: ValidationStepResult[]): 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,EAAiB,KAAK,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEpF,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,27 @@
1
+ /**
2
+ * Shared rendering for ValidationStepResult arrays.
3
+ */
4
+ import { SKIP_STATUSES } from "@galaxy-tool-util/schema";
5
+ /** Render step validation results to console, returning counts. */
6
+ export function renderStepResults(results) {
7
+ let validated = 0;
8
+ let skipped = 0;
9
+ for (const r of results) {
10
+ if (SKIP_STATUSES.has(r.status)) {
11
+ skipped++;
12
+ console.warn(` [${r.step}] skipped — ${r.errors[0] ?? "unknown"}`);
13
+ }
14
+ else if (r.status === "fail") {
15
+ validated++;
16
+ console.error(` [${r.step}] tool_state errors (${r.tool_id}):`);
17
+ for (const line of r.errors)
18
+ console.error(` ${line}`);
19
+ }
20
+ else {
21
+ validated++;
22
+ console.log(` [${r.step}] tool_state: OK`);
23
+ }
24
+ }
25
+ return { validated, skipped };
26
+ }
27
+ //# sourceMappingURL=render-results.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-results.js","sourceRoot":"","sources":["../../src/commands/render-results.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,aAAa,EAA6B,MAAM,0BAA0B,CAAC;AAOpF,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,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;QACtE,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC/B,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,wBAAwB,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;YACjE,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,IAAI,kBAAkB,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAChC,CAAC"}
@@ -0,0 +1,34 @@
1
+ export type ReportType = "validate" | "lint" | "clean" | "validate-tree" | "lint-tree" | "clean-tree" | "roundtrip-tree";
2
+ export interface ReportOutputOptions {
3
+ /**
4
+ * Path to write Markdown report to. Commander sets this to `true` (boolean)
5
+ * when `--report-markdown` is passed without a filename — treat as stdout.
6
+ * Use `"-"` explicitly to write to stdout.
7
+ */
8
+ reportMarkdown?: string | boolean;
9
+ /** Same semantics as reportMarkdown but for HTML output. */
10
+ reportHtml?: string | boolean;
11
+ }
12
+ /**
13
+ * Render and write report output if --report-markdown / --report-html flags
14
+ * were passed. Both can be specified simultaneously.
15
+ *
16
+ * @param templateName - e.g. "validate_tree.md.j2"
17
+ * @param report - the tree report object
18
+ * @param opts - parsed CLI options
19
+ */
20
+ export declare function writeReportOutput(templateName: string, report: unknown, opts: ReportOutputOptions): Promise<void>;
21
+ /**
22
+ * Generate a standalone HTML page that loads the gxwf-report-shell IIFE
23
+ * bundle from CDN and renders the given report data.
24
+ *
25
+ * The resulting HTML is self-contained (aside from the CDN network request).
26
+ * Use this for --report-html on single-workflow and tree commands.
27
+ */
28
+ export declare function buildReportHtml(type: ReportType, data: unknown, title?: string): string;
29
+ /**
30
+ * Write an HTML report to the given destination if set.
31
+ * dest follows the same string | boolean convention as reportHtml/reportMarkdown.
32
+ */
33
+ export declare function writeReportHtml(type: ReportType, data: unknown, dest: string | boolean | undefined, title?: string): Promise<void>;
34
+ //# sourceMappingURL=report-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-output.d.ts","sourceRoot":"","sources":["../../src/commands/report-output.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,UAAU,GAClB,UAAU,GACV,MAAM,GACN,OAAO,GACP,eAAe,GACf,WAAW,GACX,YAAY,GACZ,gBAAgB,CAAC;AAErB,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,SAAgB,GAAG,MAAM,CAgB9F;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,EAClC,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAQf"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Helpers for writing Markdown/HTML rendered reports from CLI commands.
3
+ */
4
+ import { writeFile } from "node:fs/promises";
5
+ import { renderReport } from "../workflow/report-templates.js";
6
+ // Pin to a specific published gxwf-report-shell version.
7
+ // Bump when a new shell version with user-visible changes is released to npm.
8
+ const SHELL_CDN_VERSION = "0.1.0";
9
+ const SHELL_CDN_BASE = `https://cdn.jsdelivr.net/npm/@galaxy-tool-util/gxwf-report-shell@${SHELL_CDN_VERSION}/dist`;
10
+ /**
11
+ * Render and write report output if --report-markdown / --report-html flags
12
+ * were passed. Both can be specified simultaneously.
13
+ *
14
+ * @param templateName - e.g. "validate_tree.md.j2"
15
+ * @param report - the tree report object
16
+ * @param opts - parsed CLI options
17
+ */
18
+ export async function writeReportOutput(templateName, report, opts) {
19
+ const dest = opts.reportMarkdown;
20
+ if (!dest)
21
+ return;
22
+ const content = await renderReport(templateName, report);
23
+ // Commander sets dest = true when flag is passed without a filename argument
24
+ if (dest === true || dest === "-") {
25
+ process.stdout.write(content);
26
+ }
27
+ else {
28
+ await writeFile(dest, content, "utf-8");
29
+ }
30
+ }
31
+ /**
32
+ * Generate a standalone HTML page that loads the gxwf-report-shell IIFE
33
+ * bundle from CDN and renders the given report data.
34
+ *
35
+ * The resulting HTML is self-contained (aside from the CDN network request).
36
+ * Use this for --report-html on single-workflow and tree commands.
37
+ */
38
+ export function buildReportHtml(type, data, title = "gxwf Report") {
39
+ const payload = JSON.stringify({ type, data });
40
+ return `<!DOCTYPE html>
41
+ <html lang="en">
42
+ <head>
43
+ <meta charset="UTF-8">
44
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
45
+ <title>${title}</title>
46
+ <link rel="stylesheet" href="${SHELL_CDN_BASE}/shell.css">
47
+ </head>
48
+ <body>
49
+ <div id="gxwf-report"></div>
50
+ <script>window.__GXWF_REPORT__ = ${payload};</script>
51
+ <script src="${SHELL_CDN_BASE}/shell.iife.js"></script>
52
+ </body>
53
+ </html>`;
54
+ }
55
+ /**
56
+ * Write an HTML report to the given destination if set.
57
+ * dest follows the same string | boolean convention as reportHtml/reportMarkdown.
58
+ */
59
+ export async function writeReportHtml(type, data, dest, title) {
60
+ if (!dest)
61
+ return;
62
+ const content = buildReportHtml(type, data, title);
63
+ if (dest === true || dest === "-") {
64
+ process.stdout.write(content);
65
+ }
66
+ else {
67
+ await writeFile(dest, content, "utf-8");
68
+ }
69
+ }
70
+ //# sourceMappingURL=report-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-output.js","sourceRoot":"","sources":["../../src/commands/report-output.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE/D,yDAAyD;AACzD,8EAA8E;AAC9E,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAClC,MAAM,cAAc,GAAG,oEAAoE,iBAAiB,OAAO,CAAC;AAsBpH;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,YAAoB,EACpB,MAAe,EACf,IAAyB;IAEzB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC;IACjC,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACzD,6EAA6E;IAC7E,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAgB,EAAE,IAAa,EAAE,KAAK,GAAG,aAAa;IACpF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,OAAO;;;;;WAKE,KAAK;iCACiB,cAAc;;;;qCAIV,OAAO;iBAC3B,cAAc;;QAEvB,CAAC;AACT,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAgB,EAChB,IAAa,EACb,IAAkC,EAClC,KAAc;IAEd,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACnD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,CAAC,IAAc,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;AACH,CAAC"}
@@ -7,7 +7,7 @@ export async function loadCachedTool(cache, toolId, version) {
7
7
  if (coords.version === null) {
8
8
  return { kind: "no_version", toolId };
9
9
  }
10
- const key = cacheKey(coords.toolshedUrl, coords.trsToolId, coords.version);
10
+ const key = await cacheKey(coords.toolshedUrl, coords.trsToolId, coords.version);
11
11
  const tool = await cache.loadCached(key);
12
12
  if (tool === null) {
13
13
  return { kind: "not_cached", toolId, key };
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-tool.js","sourceRoot":"","sources":["../../src/commands/resolve-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,QAAQ,EAAmB,MAAM,wBAAwB,CAAC;AAWnF,MAAM,UAAU,cAAc,CAAC,CAA8B;IAC3D,OAAO,MAAM,IAAI,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAgB,EAChB,MAAc,EACd,OAAuB;IAEvB,MAAM,MAAM,GAAG,KAAK,CAAC,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;IACxC,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,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC7C,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"resolve-tool.js","sourceRoot":"","sources":["../../src/commands/resolve-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,QAAQ,EAAmB,MAAM,wBAAwB,CAAC;AAWnF,MAAM,UAAU,cAAc,CAAC,CAA8B;IAC3D,OAAO,MAAM,IAAI,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAgB,EAChB,MAAc,EACd,OAAuB;IAEvB,MAAM,MAAM,GAAG,KAAK,CAAC,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;IACxC,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,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC7C,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACvB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type StrictOptions } from "./strict-options.js";
2
+ import { type ReportOutputOptions } from "./report-output.js";
3
+ export interface RoundtripTreeOptions extends StrictOptions, ReportOutputOptions {
4
+ cacheDir?: string;
5
+ format?: string;
6
+ json?: boolean;
7
+ /** Only list files with error-severity diffs or failures. */
8
+ errorsOnly?: boolean;
9
+ /** Only list files with benign diffs (no errors, no failures). */
10
+ benignOnly?: boolean;
11
+ /** Suppress per-file lines; print only the aggregate summary. */
12
+ brief?: boolean;
13
+ }
14
+ export declare function runRoundtripTree(dir: string, opts: RoundtripTreeOptions): Promise<void>;
15
+ //# 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":"AAgBA,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAI/E,OAAO,EAAsC,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAElG,MAAM,WAAW,oBAAqB,SAAQ,aAAa,EAAE,mBAAmB;IAC9E,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,CA4I7F"}