@galaxy-tool-util/cli 1.5.0 → 1.6.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.
- package/dist/commands/{_draft-extract.d.ts → draft-extract.d.ts} +1 -1
- package/dist/commands/draft-extract.d.ts.map +1 -0
- package/dist/commands/{_draft-extract.js → draft-extract.js} +8 -8
- package/dist/commands/draft-extract.js.map +1 -0
- package/dist/commands/draft-validate.d.ts +6 -1
- package/dist/commands/draft-validate.d.ts.map +1 -1
- package/dist/commands/draft-validate.js +202 -5
- package/dist/commands/draft-validate.js.map +1 -1
- package/dist/programs/gxwf.js +1 -1
- package/dist/programs/gxwf.js.map +1 -1
- package/dist/workflow/_templates-bundled.d.ts.map +1 -1
- package/dist/workflow/_templates-bundled.js +65 -0
- package/dist/workflow/_templates-bundled.js.map +1 -1
- package/package.json +5 -5
- package/spec/gxwf.json +20 -4
- package/dist/commands/_draft-extract.d.ts.map +0 -1
- package/dist/commands/_draft-extract.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-extract.d.ts","sourceRoot":"","sources":["../../src/commands/draft-extract.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDhG"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `gxwf
|
|
2
|
+
* `gxwf draft-extract` — extract the concrete subset of a draft workflow.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* `class:
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* Runs `extractConcreteSubset` from @galaxy-tool-util/schema, strips
|
|
5
|
+
* `_plan_*` planning fields, and promotes `class: GalaxyWorkflowDraft` →
|
|
6
|
+
* `class: GalaxyWorkflow` on any (sub)workflow that is now fully concrete.
|
|
7
|
+
* Emits the trimmed workflow to stdout (or `-o` file) and an optional
|
|
8
|
+
* sidecar JSON report.
|
|
9
9
|
*
|
|
10
10
|
* Exit codes:
|
|
11
11
|
* 0 — input parses + extract ran (including empty-extract case)
|
|
@@ -33,7 +33,7 @@ export async function runDraftExtract(filePath, opts) {
|
|
|
33
33
|
}
|
|
34
34
|
const format = resolveFormat(data, opts.format);
|
|
35
35
|
if (format === "native") {
|
|
36
|
-
console.error("
|
|
36
|
+
console.error("draft-extract requires format2 — native workflows cannot be drafts");
|
|
37
37
|
process.exitCode = 2;
|
|
38
38
|
return;
|
|
39
39
|
}
|
|
@@ -72,4 +72,4 @@ function outputFormatFor(output, fallback) {
|
|
|
72
72
|
return "native";
|
|
73
73
|
return "format2";
|
|
74
74
|
}
|
|
75
|
-
//# sourceMappingURL=
|
|
75
|
+
//# sourceMappingURL=draft-extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-extract.js","sourceRoot":"","sources":["../../src/commands/draft-extract.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
import { type StrictOptions } from "./strict-options.js";
|
|
2
|
+
export interface DraftValidateOptions extends StrictOptions {
|
|
2
3
|
format?: string;
|
|
3
4
|
json?: boolean;
|
|
4
5
|
reportHtml?: string | boolean;
|
|
5
6
|
reportMarkdown?: string | boolean;
|
|
7
|
+
concrete?: boolean;
|
|
8
|
+
cacheDir?: string;
|
|
9
|
+
toolState?: boolean;
|
|
10
|
+
connections?: boolean;
|
|
6
11
|
}
|
|
7
12
|
export declare function runDraftValidate(filePath: string, opts: DraftValidateOptions): Promise<void>;
|
|
8
13
|
//# sourceMappingURL=draft-validate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"draft-validate.d.ts","sourceRoot":"","sources":["../../src/commands/draft-validate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"draft-validate.d.ts","sourceRoot":"","sources":["../../src/commands/draft-validate.ts"],"names":[],"mappings":"AAuDA,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAI/E,MAAM,WAAW,oBAAqB,SAAQ,aAAa;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,IAAI,CAAC,CA4Cf"}
|
|
@@ -5,15 +5,42 @@
|
|
|
5
5
|
* Wraps `validateDraft` from @galaxy-tool-util/schema. Single-file only; the
|
|
6
6
|
* tree variant is deferred to workstream v2.
|
|
7
7
|
*
|
|
8
|
+
* With `--concrete`, additionally runs the `draft-extract` pipeline
|
|
9
|
+
* (extractConcreteSubset + stripPlanFields + promoteFullyConcreteDrafts) and
|
|
10
|
+
* runs the regular `gxwf validate` checks on the trimmed workflow:
|
|
11
|
+
* - structural decode (always)
|
|
12
|
+
* - --strict-structure / --strict-encoding (when the strict flags are set)
|
|
13
|
+
* - tool-state validation (default on, --no-tool-state to skip, --cache-dir
|
|
14
|
+
* selects the cache)
|
|
15
|
+
* - --strict-state (when set, escalates skipped tool-state steps to errors)
|
|
16
|
+
* - --connections (when set, runs connection-type compatibility)
|
|
17
|
+
*
|
|
18
|
+
* When the extracted subset is still a draft (not fully promoted), every
|
|
19
|
+
* concrete-stage check is skipped, not failed. The concrete pass is also
|
|
20
|
+
* skipped entirely when the draft has structural errors (the projection
|
|
21
|
+
* isn't trustworthy in that case).
|
|
22
|
+
*
|
|
23
|
+
* Exit-code differences vs. `gxwf validate`: `gxwf validate` exits 2 on
|
|
24
|
+
* strict-structure / strict-encoding failures; here, those roll into the
|
|
25
|
+
* concrete report and escalate to exit 1 — the draft itself parsed; only the
|
|
26
|
+
* projection failed.
|
|
27
|
+
*
|
|
8
28
|
* Exit codes (per workstream C):
|
|
9
29
|
* 0 — clean draft (no structure/topology/semantic errors; warnings allowed)
|
|
10
|
-
* 1 — draft validation errors (topology or semantic errors)
|
|
30
|
+
* 1 — draft validation errors (topology or semantic errors), OR --concrete
|
|
31
|
+
* checks surfaced any failure
|
|
11
32
|
* 2 — parse failure, format mismatch, or structural decode failure
|
|
12
33
|
* (class !== GalaxyWorkflowDraft, schema decode error)
|
|
13
34
|
*/
|
|
14
|
-
import {
|
|
35
|
+
import { dirname } from "node:path";
|
|
36
|
+
import { makeNodeToolCache } from "@galaxy-tool-util/core/node";
|
|
37
|
+
import { buildSingleDraftValidationReport, checkStrictEncoding, checkStrictStructure, extractConcreteSubset, promoteFullyConcreteDrafts, resolveFormat, stripPlanFields, validateDraft, } from "@galaxy-tool-util/schema";
|
|
38
|
+
import { decodeStructureErrors, validateFormat2Steps } from "./validate-workflow.js";
|
|
15
39
|
import { readWorkflowFile } from "./workflow-io.js";
|
|
16
40
|
import { findStdoutSinkConflict, writeReportHtml, writeReportOutput } from "./report-output.js";
|
|
41
|
+
import { resolveStrictOptions } from "./strict-options.js";
|
|
42
|
+
import { buildConnectionReport } from "./connection-validation.js";
|
|
43
|
+
import { createDefaultResolver } from "./url-resolver.js";
|
|
17
44
|
export async function runDraftValidate(filePath, opts) {
|
|
18
45
|
const conflict = findStdoutSinkConflict(opts);
|
|
19
46
|
if (conflict) {
|
|
@@ -32,8 +59,16 @@ export async function runDraftValidate(filePath, opts) {
|
|
|
32
59
|
process.exitCode = 2;
|
|
33
60
|
return;
|
|
34
61
|
}
|
|
62
|
+
warnUnusedConcreteFlags(opts);
|
|
35
63
|
const result = validateDraft(data);
|
|
36
|
-
|
|
64
|
+
// Gate the concrete pass on draft-structure cleanliness — extractConcreteSubset
|
|
65
|
+
// early-returns the input object verbatim when class != GalaxyWorkflowDraft,
|
|
66
|
+
// and stripPlanFields would then mutate the original `data`. Skipping also
|
|
67
|
+
// avoids running validate checks on a draft we know is structurally broken.
|
|
68
|
+
const concrete = opts.concrete && result.structureErrors.length === 0
|
|
69
|
+
? await runConcretePass(filePath, data, opts)
|
|
70
|
+
: undefined;
|
|
71
|
+
const report = buildSingleDraftValidationReport(filePath, result, concrete);
|
|
37
72
|
if (opts.json) {
|
|
38
73
|
console.log(JSON.stringify(report, null, 2));
|
|
39
74
|
}
|
|
@@ -42,13 +77,135 @@ export async function runDraftValidate(filePath, opts) {
|
|
|
42
77
|
}
|
|
43
78
|
await writeReportOutput("draft_validate.md.j2", report, opts);
|
|
44
79
|
await writeReportHtml("draft-validate", report, opts.reportHtml);
|
|
45
|
-
process.exitCode = exitCodeFor(result);
|
|
80
|
+
process.exitCode = exitCodeFor(result, concrete);
|
|
46
81
|
}
|
|
47
|
-
function
|
|
82
|
+
function warnUnusedConcreteFlags(opts) {
|
|
83
|
+
if (opts.concrete) {
|
|
84
|
+
if (opts.toolState === false && opts.strictState) {
|
|
85
|
+
console.error("Warning: --strict-state has no effect when tool-state validation is disabled (--no-tool-state)");
|
|
86
|
+
}
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const ignored = [];
|
|
90
|
+
if (opts.cacheDir)
|
|
91
|
+
ignored.push("--cache-dir");
|
|
92
|
+
if (opts.toolState === false)
|
|
93
|
+
ignored.push("--no-tool-state");
|
|
94
|
+
if (opts.connections)
|
|
95
|
+
ignored.push("--connections");
|
|
96
|
+
if (opts.strict || opts.strictStructure || opts.strictEncoding || opts.strictState) {
|
|
97
|
+
ignored.push("--strict*");
|
|
98
|
+
}
|
|
99
|
+
if (ignored.length > 0) {
|
|
100
|
+
console.error(`Warning: ${ignored.join(", ")} only apply with --concrete; ignoring`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async function runConcretePass(filePath, data, opts) {
|
|
104
|
+
const extract = extractConcreteSubset(data);
|
|
105
|
+
stripPlanFields(extract.workflow);
|
|
106
|
+
promoteFullyConcreteDrafts(extract.workflow);
|
|
107
|
+
const trimmed = extract.workflow != null && typeof extract.workflow === "object"
|
|
108
|
+
? extract.workflow
|
|
109
|
+
: {};
|
|
110
|
+
const class_after = trimmed.class === "GalaxyWorkflow" ? "GalaxyWorkflow" : "GalaxyWorkflowDraft";
|
|
111
|
+
// Defense-in-depth: for any draft input the gate at the call site lets
|
|
112
|
+
// through, extract+strip+promote always promotes the outer class. The only
|
|
113
|
+
// way to hit this branch is an exotic shape (e.g. inline subworkflow draft
|
|
114
|
+
// that itself fails promotion). Leaving the check here keeps the contract
|
|
115
|
+
// explicit: never decode an unpromoted subset against GalaxyWorkflowSchema.
|
|
116
|
+
if (class_after !== "GalaxyWorkflow") {
|
|
117
|
+
return {
|
|
118
|
+
class_after,
|
|
119
|
+
skipped_reason: "extracted subset is still a draft — not fully promoted",
|
|
120
|
+
structure_errors: [],
|
|
121
|
+
// ok=null (not true) — concrete validation didn't run, so we cannot
|
|
122
|
+
// claim the subset would have validated. Downstream readers must treat
|
|
123
|
+
// null as "unknown," not as a pass.
|
|
124
|
+
ok: null,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
const strict = resolveStrictOptions(opts);
|
|
128
|
+
const report = {
|
|
129
|
+
class_after,
|
|
130
|
+
skipped_reason: null,
|
|
131
|
+
structure_errors: decodeStructureErrors(trimmed, "format2"),
|
|
132
|
+
ok: true,
|
|
133
|
+
};
|
|
134
|
+
if (strict.strictStructure) {
|
|
135
|
+
report.strict_structure_errors = checkStrictStructure(trimmed, "format2");
|
|
136
|
+
}
|
|
137
|
+
if (strict.strictEncoding) {
|
|
138
|
+
report.strict_encoding_errors = checkStrictEncoding(trimmed, "format2");
|
|
139
|
+
}
|
|
140
|
+
// Tool-state defaults to ON (matches `gxwf validate`); --no-tool-state opts out.
|
|
141
|
+
const toolStateEnabled = opts.toolState !== false;
|
|
142
|
+
if (toolStateEnabled) {
|
|
143
|
+
const cache = makeNodeToolCache({ cacheDir: opts.cacheDir });
|
|
144
|
+
await cache.index.load();
|
|
145
|
+
const expansionOpts = {
|
|
146
|
+
resolver: createDefaultResolver({ workflowDirectory: dirname(filePath) }),
|
|
147
|
+
};
|
|
148
|
+
const stepResults = await validateFormat2Steps(trimmed, cache, "", expansionOpts);
|
|
149
|
+
report.tool_state = {
|
|
150
|
+
results: stepResults,
|
|
151
|
+
summary: summarize(stepResults),
|
|
152
|
+
};
|
|
153
|
+
if (strict.strictState) {
|
|
154
|
+
const skipped = stepResults.filter((r) => r.status !== "ok" && r.status !== "fail");
|
|
155
|
+
report.strict_state_errors = skipped.map((r) => `${r.step} (${r.tool_id ?? "?"}): skipped (${r.status})`);
|
|
156
|
+
}
|
|
157
|
+
if (opts.connections) {
|
|
158
|
+
report.connection_report = await buildConnectionReport(trimmed, cache);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else if (opts.connections) {
|
|
162
|
+
// --connections without tool-state still needs a cache to look up tools.
|
|
163
|
+
const cache = makeNodeToolCache({ cacheDir: opts.cacheDir });
|
|
164
|
+
await cache.index.load();
|
|
165
|
+
report.connection_report = await buildConnectionReport(trimmed, cache);
|
|
166
|
+
}
|
|
167
|
+
report.ok = isConcreteOk(report);
|
|
168
|
+
return report;
|
|
169
|
+
}
|
|
170
|
+
function summarize(results) {
|
|
171
|
+
let ok = 0;
|
|
172
|
+
let fail = 0;
|
|
173
|
+
let skip = 0;
|
|
174
|
+
for (const r of results) {
|
|
175
|
+
if (r.status === "ok")
|
|
176
|
+
ok++;
|
|
177
|
+
else if (r.status === "fail")
|
|
178
|
+
fail++;
|
|
179
|
+
else
|
|
180
|
+
skip++;
|
|
181
|
+
}
|
|
182
|
+
return { ok, fail, skip };
|
|
183
|
+
}
|
|
184
|
+
function isConcreteOk(c) {
|
|
185
|
+
if (c.skipped_reason !== null)
|
|
186
|
+
return null;
|
|
187
|
+
if (c.structure_errors.length > 0)
|
|
188
|
+
return false;
|
|
189
|
+
if (c.strict_structure_errors && c.strict_structure_errors.length > 0)
|
|
190
|
+
return false;
|
|
191
|
+
if (c.strict_encoding_errors && c.strict_encoding_errors.length > 0)
|
|
192
|
+
return false;
|
|
193
|
+
if (c.strict_state_errors && c.strict_state_errors.length > 0)
|
|
194
|
+
return false;
|
|
195
|
+
if (c.tool_state && c.tool_state.summary.fail > 0)
|
|
196
|
+
return false;
|
|
197
|
+
if (c.connection_report && !c.connection_report.valid)
|
|
198
|
+
return false;
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
function exitCodeFor(result, concrete) {
|
|
48
202
|
if (result.structureErrors.length > 0)
|
|
49
203
|
return 2;
|
|
50
204
|
if (result.topologyErrors.length > 0 || result.semanticErrors.length > 0)
|
|
51
205
|
return 1;
|
|
206
|
+
// Only explicit `false` escalates — `null` (skipped) is informational.
|
|
207
|
+
if (concrete && concrete.ok === false)
|
|
208
|
+
return 1;
|
|
52
209
|
return 0;
|
|
53
210
|
}
|
|
54
211
|
function printTextReport(report, result) {
|
|
@@ -62,6 +219,46 @@ function printTextReport(report, result) {
|
|
|
62
219
|
console.log(` Survey: ${survey.todo_count} TODO sentinel${survey.todo_count === 1 ? "" : "s"}` +
|
|
63
220
|
` across ${survey.todo_paths.length} step path${survey.todo_paths.length === 1 ? "" : "s"};` +
|
|
64
221
|
` ${survey.plan_step_paths.length} step${survey.plan_step_paths.length === 1 ? "" : "s"} with _plan_* fields`);
|
|
222
|
+
if (report.concrete)
|
|
223
|
+
printConcrete(report.concrete);
|
|
224
|
+
}
|
|
225
|
+
function printConcrete(concrete) {
|
|
226
|
+
if (concrete.skipped_reason) {
|
|
227
|
+
console.log(` Concrete: SKIPPED (${concrete.skipped_reason})`);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
console.log(` Concrete: ${concrete.ok === true ? "OK" : "FAIL"}`);
|
|
231
|
+
printList(" Structure errors", concrete.structure_errors);
|
|
232
|
+
if (concrete.strict_structure_errors)
|
|
233
|
+
printList(" Strict-structure errors", concrete.strict_structure_errors);
|
|
234
|
+
if (concrete.strict_encoding_errors)
|
|
235
|
+
printList(" Strict-encoding errors", concrete.strict_encoding_errors);
|
|
236
|
+
if (concrete.strict_state_errors)
|
|
237
|
+
printList(" Strict-state errors", concrete.strict_state_errors);
|
|
238
|
+
if (concrete.tool_state) {
|
|
239
|
+
const { ok, fail, skip } = concrete.tool_state.summary;
|
|
240
|
+
console.log(` Tool state: ${ok} ok, ${fail} fail, ${skip} skip`);
|
|
241
|
+
for (const r of concrete.tool_state.results) {
|
|
242
|
+
if (r.status === "ok")
|
|
243
|
+
continue;
|
|
244
|
+
const tag = r.tool_id ? `${r.step} (${r.tool_id})` : r.step;
|
|
245
|
+
console.log(` ${tag} [${r.status}]`);
|
|
246
|
+
for (const e of r.errors)
|
|
247
|
+
console.log(` ${e}`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
if (concrete.connection_report) {
|
|
251
|
+
const cr = concrete.connection_report;
|
|
252
|
+
const { ok = 0, invalid = 0, skip = 0 } = cr.summary;
|
|
253
|
+
console.log(` Connections: ${cr.valid ? "OK" : "INVALID"} — ${ok} ok, ${invalid} invalid, ${skip} skip`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
function printList(label, lines) {
|
|
257
|
+
if (lines.length === 0)
|
|
258
|
+
return;
|
|
259
|
+
console.log(`${label} (${lines.length}):`);
|
|
260
|
+
for (const line of lines)
|
|
261
|
+
console.log(` ${line}`);
|
|
65
262
|
}
|
|
66
263
|
function printBucket(label, diagnostics) {
|
|
67
264
|
if (diagnostics.length === 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"draft-validate.js","sourceRoot":"","sources":["../../src/commands/draft-validate.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"draft-validate.js","sourceRoot":"","sources":["../../src/commands/draft-validate.ts"],"names":[],"mappings":"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"}
|
package/dist/programs/gxwf.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { runClean } from "../commands/clean.js";
|
|
2
2
|
import { runCleanTree } from "../commands/clean-tree.js";
|
|
3
|
-
import { runDraftExtract } from "../commands/
|
|
3
|
+
import { runDraftExtract } from "../commands/draft-extract.js";
|
|
4
4
|
import { runDraftNextStep } from "../commands/draft-next-step.js";
|
|
5
5
|
import { runDraftValidate } from "../commands/draft-validate.js";
|
|
6
6
|
import { runConvert } from "../commands/convert.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gxwf.js","sourceRoot":"","sources":["../../src/programs/gxwf.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM
|
|
1
|
+
{"version":3,"file":"gxwf.js","sourceRoot":"","sources":["../../src/programs/gxwf.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_templates-bundled.d.ts","sourceRoot":"","sources":["../../src/workflow/_templates-bundled.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"_templates-bundled.d.ts","sourceRoot":"","sources":["../../src/workflow/_templates-bundled.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAsbpD,CAAC"}
|
|
@@ -194,6 +194,71 @@ Summary: {{ report.summary }}
|
|
|
194
194
|
- \`\`{% if d.path | length == 0 %}<workflow>{% else %}{{ d.path | join("/") }}{% endif %}\`\` — {{ d.message }}
|
|
195
195
|
{% endfor %}
|
|
196
196
|
|
|
197
|
+
{% endif %}
|
|
198
|
+
{% if report.concrete %}
|
|
199
|
+
## Concrete Subset Validation
|
|
200
|
+
|
|
201
|
+
- Class after extract: \`{{ report.concrete.class_after }}\`
|
|
202
|
+
{% if report.concrete.skipped_reason %}
|
|
203
|
+
- Status: SKIPPED — {{ report.concrete.skipped_reason }}
|
|
204
|
+
{% else %}
|
|
205
|
+
- Status: {% if report.concrete.ok %}OK{% else %}FAIL{% endif %}
|
|
206
|
+
|
|
207
|
+
{% if report.concrete.structure_errors | length > 0 %}
|
|
208
|
+
### Structure Errors ({{ report.concrete.structure_errors | length }})
|
|
209
|
+
|
|
210
|
+
{% for e in report.concrete.structure_errors %}
|
|
211
|
+
- {{ e }}
|
|
212
|
+
{% endfor %}
|
|
213
|
+
|
|
214
|
+
{% endif %}
|
|
215
|
+
{% if report.concrete.strict_structure_errors and report.concrete.strict_structure_errors | length > 0 %}
|
|
216
|
+
### Strict-Structure Errors ({{ report.concrete.strict_structure_errors | length }})
|
|
217
|
+
|
|
218
|
+
{% for e in report.concrete.strict_structure_errors %}
|
|
219
|
+
- {{ e }}
|
|
220
|
+
{% endfor %}
|
|
221
|
+
|
|
222
|
+
{% endif %}
|
|
223
|
+
{% if report.concrete.strict_encoding_errors and report.concrete.strict_encoding_errors | length > 0 %}
|
|
224
|
+
### Strict-Encoding Errors ({{ report.concrete.strict_encoding_errors | length }})
|
|
225
|
+
|
|
226
|
+
{% for e in report.concrete.strict_encoding_errors %}
|
|
227
|
+
- {{ e }}
|
|
228
|
+
{% endfor %}
|
|
229
|
+
|
|
230
|
+
{% endif %}
|
|
231
|
+
{% if report.concrete.strict_state_errors and report.concrete.strict_state_errors | length > 0 %}
|
|
232
|
+
### Strict-State Errors ({{ report.concrete.strict_state_errors | length }})
|
|
233
|
+
|
|
234
|
+
{% for e in report.concrete.strict_state_errors %}
|
|
235
|
+
- {{ e }}
|
|
236
|
+
{% endfor %}
|
|
237
|
+
|
|
238
|
+
{% endif %}
|
|
239
|
+
{% if report.concrete.tool_state %}
|
|
240
|
+
### Tool State
|
|
241
|
+
|
|
242
|
+
- Summary: {{ report.concrete.tool_state.summary.ok }} ok, {{ report.concrete.tool_state.summary.fail }} fail, {{ report.concrete.tool_state.summary.skip }} skip
|
|
243
|
+
|
|
244
|
+
{% for r in report.concrete.tool_state.results %}
|
|
245
|
+
{% if r.status != "ok" %}
|
|
246
|
+
- \`\`{{ r.step }}\`\` ({{ r.tool_id }}) — \`{{ r.status }}\`
|
|
247
|
+
{% for e in r.errors %}
|
|
248
|
+
- {{ e }}
|
|
249
|
+
{% endfor %}
|
|
250
|
+
{% endif %}
|
|
251
|
+
{% endfor %}
|
|
252
|
+
|
|
253
|
+
{% endif %}
|
|
254
|
+
{% if report.concrete.connection_report %}
|
|
255
|
+
### Connections
|
|
256
|
+
|
|
257
|
+
- Status: {% if report.concrete.connection_report.valid %}OK{% else %}INVALID{% endif %} — {{ report.concrete.connection_report.summary.ok }} ok, {{ report.concrete.connection_report.summary.invalid }} invalid, {{ report.concrete.connection_report.summary.skip }} skip
|
|
258
|
+
|
|
259
|
+
{% endif %}
|
|
260
|
+
{% endif %}
|
|
261
|
+
|
|
197
262
|
{% endif %}
|
|
198
263
|
`,
|
|
199
264
|
"export_tree.md.j2": `{#-
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_templates-bundled.js","sourceRoot":"","sources":["../../src/workflow/_templates-bundled.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,eAAe,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4DlB;IACC,kBAAkB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDrB;IACC,0BAA0B,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgC7B;IACC,sBAAsB,EAAE
|
|
1
|
+
{"version":3,"file":"_templates-bundled.js","sourceRoot":"","sources":["../../src/workflow/_templates-bundled.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,eAAe,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4DlB;IACC,kBAAkB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDrB;IACC,0BAA0B,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgC7B;IACC,sBAAsB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoHzB;IACC,mBAAmB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BtB;IACC,iBAAiB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BpB;IACC,sBAAsB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BzB;IACC,sBAAsB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BzB;IACC,qBAAqB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDxB;CACA,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@galaxy-tool-util/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "galaxy-tool-cache CLI — cache and inspect Galaxy tool metadata",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -39,10 +39,10 @@
|
|
|
39
39
|
"effect": "^3.21.0",
|
|
40
40
|
"nunjucks": "^3.2.4",
|
|
41
41
|
"yaml": "^2.8.3",
|
|
42
|
-
"@galaxy-tool-util/connection-validation": "1.
|
|
43
|
-
"@galaxy-tool-util/core": "1.
|
|
44
|
-
"@galaxy-tool-util/schema": "1.
|
|
45
|
-
"@galaxy-tool-util/search": "1.
|
|
42
|
+
"@galaxy-tool-util/connection-validation": "1.6.0",
|
|
43
|
+
"@galaxy-tool-util/core": "1.6.0",
|
|
44
|
+
"@galaxy-tool-util/schema": "1.6.0",
|
|
45
|
+
"@galaxy-tool-util/search": "1.6.0"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@types/node": "^25.5.0",
|
package/spec/gxwf.json
CHANGED
|
@@ -117,14 +117,30 @@
|
|
|
117
117
|
{
|
|
118
118
|
"flags": "--report-markdown [file]",
|
|
119
119
|
"description": "Write Markdown report to file (or stdout if omitted)"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"flags": "--concrete",
|
|
123
|
+
"description": "Additionally extract the concrete subset and run the regular `gxwf validate` checks on it"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"flags": "--cache-dir <dir>",
|
|
127
|
+
"description": "Tool cache directory (for --concrete tool-state validation)"
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"flags": "--no-tool-state",
|
|
131
|
+
"description": "Skip tool-state validation in the --concrete pass (default: enabled when --concrete is set)"
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"flags": "--connections",
|
|
135
|
+
"description": "Validate connection-type compatibility on the --concrete subset (collection algebra, map-over)"
|
|
120
136
|
}
|
|
121
|
-
]
|
|
137
|
+
],
|
|
138
|
+
"optionGroups": ["strict"]
|
|
122
139
|
},
|
|
123
140
|
{
|
|
124
|
-
"name": "
|
|
125
|
-
"description": "Extract the concrete subset of a draft workflow (
|
|
141
|
+
"name": "draft-extract",
|
|
142
|
+
"description": "Extract the concrete subset of a draft workflow (drop drafty steps, strip _plan_* fields, promote class when fully concrete)",
|
|
126
143
|
"handler": "draftExtract",
|
|
127
|
-
"hidden": true,
|
|
128
144
|
"args": [
|
|
129
145
|
{
|
|
130
146
|
"raw": "<file>",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_draft-extract.d.ts","sourceRoot":"","sources":["../../src/commands/_draft-extract.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDhG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_draft-extract.js","sourceRoot":"","sources":["../../src/commands/_draft-extract.ts"],"names":[],"mappings":"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"}
|