@topogram/cli 0.3.64 → 0.3.65
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/package.json +1 -1
- package/src/adoption/plan/index.js +703 -0
- package/src/adoption/plan.js +12 -703
- package/src/agent-ops/query-builders/auth.js +375 -0
- package/src/agent-ops/query-builders/change-risk/change-plan.js +123 -0
- package/src/agent-ops/query-builders/change-risk/import-plan.js +49 -0
- package/src/agent-ops/query-builders/change-risk/maintained.js +286 -0
- package/src/agent-ops/query-builders/change-risk/review-packets.js +123 -0
- package/src/agent-ops/query-builders/change-risk/risk.js +189 -0
- package/src/agent-ops/query-builders/change-risk.js +25 -0
- package/src/agent-ops/query-builders/common.js +149 -0
- package/src/agent-ops/query-builders/maintained-risk.js +539 -0
- package/src/agent-ops/query-builders/maintained-shared.js +120 -0
- package/src/agent-ops/query-builders/multi-agent.js +547 -0
- package/src/agent-ops/query-builders/projection-impacts.js +514 -0
- package/src/agent-ops/query-builders/work-packets.js +417 -0
- package/src/agent-ops/query-builders/workflow-context-shared.js +300 -0
- package/src/agent-ops/query-builders/workflow-context.js +398 -0
- package/src/agent-ops/query-builders/workflow-presets-core.js +676 -0
- package/src/agent-ops/query-builders/workflow-presets.js +341 -0
- package/src/agent-ops/query-builders.d.ts +26 -26
- package/src/agent-ops/query-builders.js +42 -5021
- package/src/catalog/constants.js +10 -0
- package/src/catalog/copy.js +60 -0
- package/src/catalog/diagnostics.js +15 -0
- package/src/catalog/entries.js +42 -0
- package/src/catalog/files.js +67 -0
- package/src/catalog/provenance.js +122 -0
- package/src/catalog/source.js +150 -0
- package/src/catalog/validation.js +252 -0
- package/src/catalog.d.ts +2 -0
- package/src/catalog.js +18 -746
- package/src/cli/commands/catalog/check.js +31 -0
- package/src/cli/commands/catalog/copy.js +59 -0
- package/src/cli/commands/catalog/doctor.js +248 -0
- package/src/cli/commands/catalog/help.js +21 -0
- package/src/cli/commands/catalog/list.js +52 -0
- package/src/cli/commands/catalog/runner.js +92 -0
- package/src/cli/commands/catalog/shared.js +17 -0
- package/src/cli/commands/catalog/show.js +134 -0
- package/src/cli/commands/catalog.js +30 -615
- package/src/cli/commands/generator-policy/package-info.js +162 -0
- package/src/cli/commands/generator-policy/payloads.js +372 -0
- package/src/cli/commands/generator-policy/printers.js +159 -0
- package/src/cli/commands/generator-policy/runner.js +81 -0
- package/src/cli/commands/generator-policy/shared.js +39 -0
- package/src/cli/commands/generator-policy.js +15 -783
- package/src/cli/commands/import/adopt.js +170 -0
- package/src/cli/commands/import/check.js +91 -0
- package/src/cli/commands/import/diff.js +84 -0
- package/src/cli/commands/import/help.js +47 -0
- package/src/cli/commands/import/paths.js +277 -0
- package/src/cli/commands/import/plan.js +284 -0
- package/src/cli/commands/import/refresh.js +470 -0
- package/src/cli/commands/import/status-history.js +196 -0
- package/src/cli/commands/import/workspace.js +230 -0
- package/src/cli/commands/import.js +33 -1732
- package/src/cli/commands/package/constants.js +17 -0
- package/src/cli/commands/package/doctor.js +240 -0
- package/src/cli/commands/package/help.js +27 -0
- package/src/cli/commands/package/lockfile.js +135 -0
- package/src/cli/commands/package/npm.js +97 -0
- package/src/cli/commands/package/reporting.js +35 -0
- package/src/cli/commands/package/runner.js +33 -0
- package/src/cli/commands/package/shared.js +9 -0
- package/src/cli/commands/package/update-cli.js +252 -0
- package/src/cli/commands/package/versions.js +35 -0
- package/src/cli/commands/package.js +29 -813
- package/src/cli/commands/query/change-plan.js +68 -0
- package/src/cli/commands/query/definitions.js +202 -0
- package/src/cli/commands/query/import-adopt.js +121 -0
- package/src/cli/commands/query/runner/artifacts.js +102 -0
- package/src/cli/commands/query/runner/boundaries.js +211 -0
- package/src/cli/commands/query/runner/change.js +182 -0
- package/src/cli/commands/query/runner/import-adopt.js +111 -0
- package/src/cli/commands/query/runner/index.js +31 -0
- package/src/cli/commands/query/runner/output.js +12 -0
- package/src/cli/commands/query/runner/workflow.js +241 -0
- package/src/cli/commands/query/runner.js +3 -0
- package/src/cli/commands/query/workflow-context.js +5 -0
- package/src/cli/commands/query/workspace.js +274 -0
- package/src/cli/commands/query.js +9 -1300
- package/src/cli/commands/template/baseline.js +100 -0
- package/src/cli/commands/template/check.js +466 -0
- package/src/cli/commands/template/constants.js +8 -0
- package/src/cli/commands/template/diagnostics.js +26 -0
- package/src/cli/commands/template/help.js +28 -0
- package/src/cli/commands/template/lifecycle.js +404 -0
- package/src/cli/commands/template/list-show.js +287 -0
- package/src/cli/commands/template/policy.js +422 -0
- package/src/cli/commands/template/shared.js +127 -0
- package/src/cli/commands/template/updates.js +352 -0
- package/src/cli/commands/template.js +41 -2143
- package/src/generator/api/contracts.js +497 -0
- package/src/generator/api/metadata.js +221 -0
- package/src/generator/api/openapi.js +559 -0
- package/src/generator/api/schema.js +124 -0
- package/src/generator/api/types.d.ts +98 -0
- package/src/generator/api.js +3 -1195
- package/src/generator/context/shared/domain-sdlc.js +282 -0
- package/src/generator/context/shared/maintained-boundary.js +665 -0
- package/src/generator/context/shared/metrics.js +85 -0
- package/src/generator/context/shared/primitives.js +64 -0
- package/src/generator/context/shared/relationships.js +453 -0
- package/src/generator/context/shared/summaries.js +263 -0
- package/src/generator/context/shared/types.d.ts +207 -0
- package/src/generator/context/shared.d.ts +42 -0
- package/src/generator/context/shared.js +80 -1390
- package/src/generator/context/slice/core.js +397 -0
- package/src/generator/context/slice/sdlc.js +417 -0
- package/src/generator/context/slice/ui-packets.js +183 -0
- package/src/generator/context/slice.js +2 -859
- package/src/generator/registry/index.js +507 -0
- package/src/generator/registry.js +18 -504
- package/src/generator/runtime/environment/index.js +666 -0
- package/src/generator/runtime/environment.js +4 -666
- package/src/generator/runtime/runtime-check/index.js +554 -0
- package/src/generator/runtime/runtime-check.js +4 -554
- package/src/generator/runtime/shared/index.js +572 -0
- package/src/generator/runtime/shared.js +19 -570
- package/src/generator/shared.d.ts +2 -0
- package/src/generator/surfaces/shared.d.ts +3 -0
- package/src/generator/widget-conformance/behavior-report.js +258 -0
- package/src/generator/widget-conformance/checks.js +371 -0
- package/src/generator/widget-conformance/projection-context.js +200 -0
- package/src/generator/widget-conformance/report.js +166 -0
- package/src/generator/widget-conformance/types.d.ts +121 -0
- package/src/generator/widget-conformance.js +3 -824
- package/src/import/core/context.d.ts +3 -0
- package/src/import/core/contracts.d.ts +1 -0
- package/src/import/core/registry.d.ts +4 -0
- package/src/import/core/runner/candidates.js +217 -0
- package/src/import/core/runner/options.js +22 -0
- package/src/import/core/runner/reports.js +50 -0
- package/src/import/core/runner/run.js +79 -0
- package/src/import/core/runner/tracks.js +150 -0
- package/src/import/core/runner/ui-drafts.js +337 -0
- package/src/import/core/runner.js +3 -698
- package/src/import/core/shared/api-routes.js +221 -0
- package/src/import/core/shared/candidates.js +97 -0
- package/src/import/core/shared/files.js +177 -0
- package/src/import/core/shared/next-app.js +389 -0
- package/src/import/core/shared/types.d.ts +51 -0
- package/src/import/core/shared/ui-routes.js +230 -0
- package/src/import/core/shared.js +60 -861
- package/src/new-project/constants.js +128 -0
- package/src/new-project/create.js +83 -0
- package/src/new-project/json.js +28 -0
- package/src/new-project/metadata.js +96 -0
- package/src/new-project/package-spec.js +161 -0
- package/src/new-project/project-files.js +348 -0
- package/src/new-project/template-policy.js +269 -0
- package/src/new-project/template-resolution.js +368 -0
- package/src/new-project/template-snapshots.js +430 -0
- package/src/new-project/template-updates.js +512 -0
- package/src/new-project/types.d.ts +83 -0
- package/src/new-project.js +6 -2277
- package/src/parser.d.ts +87 -1
- package/src/parser.js +118 -0
- package/src/policy/review-boundaries.d.ts +15 -0
- package/src/project-config/index.js +564 -0
- package/src/project-config.js +19 -561
- package/src/resolver/enrich/acceptance-criterion.js +2 -0
- package/src/resolver/enrich/bug.js +2 -0
- package/src/resolver/enrich/pitch.js +2 -0
- package/src/resolver/enrich/requirement.js +2 -0
- package/src/resolver/enrich/task.js +2 -0
- package/src/resolver/index.js +19 -2089
- package/src/resolver/normalize.js +384 -1
- package/src/resolver/plans.js +168 -0
- package/src/resolver/projections-api.js +494 -0
- package/src/resolver/projections-db.js +133 -0
- package/src/resolver/projections-ui.js +317 -0
- package/src/resolver/shapes.js +251 -0
- package/src/resolver/shared.js +278 -0
- package/src/resolver/widgets.js +132 -0
- package/src/template-trust/constants.js +62 -0
- package/src/template-trust/content.js +258 -0
- package/src/template-trust/diff.js +92 -0
- package/src/template-trust/policy.js +61 -0
- package/src/template-trust/record.js +90 -0
- package/src/template-trust/status.js +182 -0
- package/src/template-trust.js +24 -687
- package/src/text-helpers.d.ts +1 -0
- package/src/topogram-types.d.ts +69 -0
- package/src/validator/common.js +488 -0
- package/src/validator/data-model.js +237 -0
- package/src/validator/docs.js +167 -0
- package/src/validator/expressions.js +146 -1
- package/src/validator/index.d.ts +23 -0
- package/src/validator/index.js +32 -3585
- package/src/validator/kinds.d.ts +41 -0
- package/src/validator/kinds.js +2 -0
- package/src/validator/model-helpers.js +46 -0
- package/src/validator/per-kind/acceptance-criterion.js +5 -0
- package/src/validator/per-kind/bug.js +6 -0
- package/src/validator/per-kind/domain.js +15 -2
- package/src/validator/per-kind/pitch.js +7 -0
- package/src/validator/per-kind/requirement.js +5 -0
- package/src/validator/per-kind/task.js +7 -0
- package/src/validator/per-kind/widget.js +14 -0
- package/src/validator/projections/api-http-async.js +410 -0
- package/src/validator/projections/api-http-authz.js +88 -0
- package/src/validator/projections/api-http-core.js +205 -0
- package/src/validator/projections/api-http-policies.js +339 -0
- package/src/validator/projections/api-http-responses.js +233 -0
- package/src/validator/projections/api-http.js +44 -0
- package/src/validator/projections/db.js +353 -0
- package/src/validator/projections/generator-defaults.js +45 -0
- package/src/validator/projections/helpers.js +87 -0
- package/src/validator/projections/ui-helpers.js +214 -0
- package/src/validator/projections/ui-navigation.js +344 -0
- package/src/validator/projections/ui-structure.js +364 -0
- package/src/validator/projections/ui-widgets.js +493 -0
- package/src/validator/projections/ui.js +46 -0
- package/src/validator/registry.js +48 -1
- package/src/validator/utils.d.ts +20 -0
- package/src/validator/utils.js +115 -12
- package/src/widget-behavior.d.ts +1 -0
- package/src/workflows/import-app/api/collect.js +221 -0
- package/src/workflows/import-app/api/openapi.js +257 -0
- package/src/workflows/import-app/api/routes.js +327 -0
- package/src/workflows/import-app/api/sources.js +22 -0
- package/src/workflows/import-app/api.js +2 -797
- package/src/workflows/reconcile/adoption-plan/build.js +208 -0
- package/src/workflows/reconcile/adoption-plan/dependencies.js +75 -0
- package/src/workflows/reconcile/adoption-plan/outputs.js +143 -0
- package/src/workflows/reconcile/adoption-plan/paths.js +58 -0
- package/src/workflows/reconcile/adoption-plan/projection-patches.js +177 -0
- package/src/workflows/reconcile/adoption-plan/reasons.js +107 -0
- package/src/workflows/reconcile/adoption-plan.js +30 -740
- package/src/workflows/reconcile/auth/closures.js +115 -0
- package/src/workflows/reconcile/auth/formatters.js +142 -0
- package/src/workflows/reconcile/auth/inference.js +330 -0
- package/src/workflows/reconcile/auth/roles.js +122 -0
- package/src/workflows/reconcile/auth.js +35 -690
- package/src/workflows/reconcile/bundle-core/index.js +600 -0
- package/src/workflows/reconcile/bundle-core.js +12 -598
- package/src/workflows/reconcile/canonical-surface.js +1 -1
- package/src/workflows/reconcile/impacts/adoption-plan.js +192 -0
- package/src/workflows/reconcile/impacts/indexes.js +101 -0
- package/src/workflows/reconcile/impacts/patches.js +252 -0
- package/src/workflows/reconcile/impacts/reports.js +80 -0
- package/src/workflows/reconcile/impacts.js +14 -623
- package/src/workspace-docs.d.ts +29 -0
|
@@ -1,617 +1,32 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
console.log(" topogram catalog show hello-web");
|
|
34
|
-
console.log(" topogram catalog doctor");
|
|
35
|
-
console.log(" topogram catalog check topograms.catalog.json");
|
|
36
|
-
console.log(" topogram catalog copy hello ./hello-topogram");
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* @param {unknown} error
|
|
41
|
-
* @returns {string}
|
|
42
|
-
*/
|
|
43
|
-
function messageFromError(error) {
|
|
44
|
-
return error instanceof Error ? error.message : String(error);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* @param {string} value
|
|
49
|
-
* @returns {string}
|
|
50
|
-
*/
|
|
51
|
-
export function shellCommandArg(value) {
|
|
52
|
-
return /^[A-Za-z0-9_./:@=-]+$/.test(value) ? value : JSON.stringify(value);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* @param {string|null} source
|
|
57
|
-
* @returns {{ ok: boolean, source: string, catalog: any, entries: any[], diagnostics: any[], errors: string[] }}
|
|
58
|
-
*/
|
|
59
|
-
export function buildCatalogListPayload(source) {
|
|
60
|
-
const loaded = loadCatalog(source || null);
|
|
61
|
-
return {
|
|
62
|
-
ok: true,
|
|
63
|
-
source: loaded.source,
|
|
64
|
-
catalog: {
|
|
65
|
-
version: loaded.catalog.version,
|
|
66
|
-
entries: loaded.catalog.entries.length
|
|
67
|
-
},
|
|
68
|
-
entries: loaded.catalog.entries,
|
|
69
|
-
diagnostics: loaded.diagnostics,
|
|
70
|
-
errors: []
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* @param {ReturnType<typeof buildCatalogListPayload>} payload
|
|
76
|
-
* @returns {void}
|
|
77
|
-
*/
|
|
78
|
-
export function printCatalogList(payload) {
|
|
79
|
-
console.log("Catalog entries:");
|
|
80
|
-
console.log("Template entries create starters with `topogram new`; topogram entries copy editable Topogram source.");
|
|
81
|
-
console.log(`Catalog: ${payload.source}`);
|
|
82
|
-
console.log(`Version: ${payload.catalog.version}`);
|
|
83
|
-
const catalogOption = payload.source === catalogSourceOrDefault(null)
|
|
84
|
-
? ""
|
|
85
|
-
: ` --catalog ${shellCommandArg(payload.source)}`;
|
|
86
|
-
for (const entry of payload.entries) {
|
|
87
|
-
console.log(`- ${entry.id} (${entry.kind})`);
|
|
88
|
-
console.log(` Package: ${entry.package}@${entry.defaultVersion}`);
|
|
89
|
-
console.log(` Description: ${entry.description}`);
|
|
90
|
-
console.log(` Trust scope: ${entry.trust.scope}`);
|
|
91
|
-
console.log(` Executable implementation: ${entry.trust.includesExecutableImplementation ? "yes" : "no"}`);
|
|
92
|
-
if (entry.kind === "template") {
|
|
93
|
-
console.log(` New: topogram new ./my-app --template ${shellCommandArg(entry.id)}${catalogOption}`);
|
|
94
|
-
} else {
|
|
95
|
-
console.log(` Copy: topogram catalog copy ${shellCommandArg(entry.id)} ./${entry.id}-topogram${catalogOption}`);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* @param {string} id
|
|
102
|
-
* @param {string|null} source
|
|
103
|
-
* @returns {{ ok: boolean, source: string, catalog: { version: string }, entry: any|null, packageSpec: string|null, commands: { primary: string|null, followUp: string[] }, diagnostics: any[], errors: string[] }}
|
|
104
|
-
*/
|
|
105
|
-
export function buildCatalogShowPayload(id, source) {
|
|
106
|
-
if (!id || id.startsWith("-")) {
|
|
107
|
-
throw new Error("topogram catalog show requires <id>.");
|
|
108
|
-
}
|
|
109
|
-
const loaded = loadCatalog(source || null);
|
|
110
|
-
const entry = findCatalogEntry(loaded.catalog, id, null);
|
|
111
|
-
if (!entry) {
|
|
112
|
-
const diagnostic = {
|
|
113
|
-
code: "catalog_entry_not_found",
|
|
114
|
-
severity: "error",
|
|
115
|
-
message: `Catalog entry '${id}' was not found in ${loaded.source}.`,
|
|
116
|
-
path: loaded.source,
|
|
117
|
-
suggestedFix: "Run `topogram catalog list` to see available entries."
|
|
118
|
-
};
|
|
119
|
-
return {
|
|
120
|
-
ok: false,
|
|
121
|
-
source: loaded.source,
|
|
122
|
-
catalog: { version: loaded.catalog.version },
|
|
123
|
-
entry: null,
|
|
124
|
-
packageSpec: null,
|
|
125
|
-
commands: { primary: null, followUp: [] },
|
|
126
|
-
diagnostics: [diagnostic],
|
|
127
|
-
errors: [diagnostic.message]
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
return {
|
|
131
|
-
ok: true,
|
|
132
|
-
source: loaded.source,
|
|
133
|
-
catalog: { version: loaded.catalog.version },
|
|
134
|
-
entry,
|
|
135
|
-
packageSpec: catalogEntryPackageSpec(entry),
|
|
136
|
-
commands: catalogShowCommands(entry, loaded.source),
|
|
137
|
-
diagnostics: loaded.diagnostics,
|
|
138
|
-
errors: []
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* @param {any} entry
|
|
144
|
-
* @param {string} source
|
|
145
|
-
* @returns {{ primary: string, followUp: string[] }}
|
|
146
|
-
*/
|
|
147
|
-
export function catalogShowCommands(entry, source) {
|
|
148
|
-
const catalogOption = source === catalogSourceOrDefault(null)
|
|
149
|
-
? ""
|
|
150
|
-
: ` --catalog ${shellCommandArg(source)}`;
|
|
151
|
-
if (entry.kind === "template") {
|
|
152
|
-
const target = "./my-app";
|
|
153
|
-
return {
|
|
154
|
-
primary: `topogram new ${target} --template ${shellCommandArg(entry.id)}${catalogOption}`,
|
|
155
|
-
followUp: [
|
|
156
|
-
`cd ${target}`,
|
|
157
|
-
"npm install",
|
|
158
|
-
"npm run check",
|
|
159
|
-
"npm run generate"
|
|
160
|
-
]
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
const target = `./${entry.id}-topogram`;
|
|
164
|
-
return {
|
|
165
|
-
primary: `topogram catalog copy ${shellCommandArg(entry.id)} ${target}${catalogOption}`,
|
|
166
|
-
followUp: [
|
|
167
|
-
`cd ${target}`,
|
|
168
|
-
"topogram source status --local",
|
|
169
|
-
"topogram check",
|
|
170
|
-
"topogram generate"
|
|
171
|
-
]
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* @param {ReturnType<typeof buildCatalogShowPayload>} payload
|
|
177
|
-
* @returns {void}
|
|
178
|
-
*/
|
|
179
|
-
export function printCatalogShow(payload) {
|
|
180
|
-
if (!payload.ok || !payload.entry) {
|
|
181
|
-
console.log("Catalog entry not found.");
|
|
182
|
-
console.log(`Catalog: ${payload.source}`);
|
|
183
|
-
for (const diagnostic of payload.diagnostics) {
|
|
184
|
-
const label = diagnostic.severity === "warning" ? "Warning" : "Error";
|
|
185
|
-
console.log(`${label}: ${diagnostic.message}`);
|
|
186
|
-
}
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
const { entry } = payload;
|
|
190
|
-
console.log(`Catalog entry: ${entry.id}`);
|
|
191
|
-
console.log(`Kind: ${entry.kind}`);
|
|
192
|
-
if (entry.kind === "template") {
|
|
193
|
-
console.log("Action: creates a starter app workspace with `topogram new`.");
|
|
194
|
-
} else {
|
|
195
|
-
console.log("Action: copies editable Topogram source with `topogram catalog copy`.");
|
|
196
|
-
console.log("Executable implementation: no (topogram entries cannot include implementation/ in v1).");
|
|
197
|
-
}
|
|
198
|
-
console.log(`Catalog: ${payload.source}`);
|
|
199
|
-
console.log(`Package: ${payload.packageSpec}`);
|
|
200
|
-
console.log(`Description: ${entry.description}`);
|
|
201
|
-
console.log(`Tags: ${entry.tags.join(", ") || "none"}`);
|
|
202
|
-
console.log(`Trust scope: ${entry.trust.scope}`);
|
|
203
|
-
if (entry.kind === "template") {
|
|
204
|
-
console.log(`Executable implementation: ${entry.trust.includesExecutableImplementation ? "yes" : "no"}`);
|
|
205
|
-
}
|
|
206
|
-
if (entry.trust.notes) {
|
|
207
|
-
console.log(`Trust notes: ${entry.trust.notes}`);
|
|
208
|
-
}
|
|
209
|
-
console.log("");
|
|
210
|
-
console.log("Recommended command:");
|
|
211
|
-
console.log(` ${payload.commands.primary}`);
|
|
212
|
-
if (payload.commands.followUp.length > 0) {
|
|
213
|
-
console.log("Follow-up:");
|
|
214
|
-
for (const command of payload.commands.followUp) {
|
|
215
|
-
console.log(` ${command}`);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
if (entry.kind === "topogram") {
|
|
219
|
-
console.log("");
|
|
220
|
-
console.log(`${TOPOGRAM_SOURCE_FILE} will record copy provenance only. Local edits are allowed.`);
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* @param {string|null} source
|
|
226
|
-
* @returns {{ ok: boolean, source: string, auth: { githubTokenEnv: boolean, ghTokenEnv: boolean, ghCli: { checked: boolean, available: boolean, authenticated: boolean, reason: string|null } }, catalog: { reachable: boolean, version: string|null, entries: number }, packages: Array<{ id: string, kind: string, package: string, version: string, packageSpec: string, ok: boolean, checkedVersion: string|null, diagnostics: any[] }>, diagnostics: any[], errors: string[] }}
|
|
227
|
-
*/
|
|
228
|
-
export function buildCatalogDoctorPayload(source) {
|
|
229
|
-
const resolvedSource = catalogSourceOrDefault(source || null);
|
|
230
|
-
const auth = buildCatalogDoctorAuth(resolvedSource);
|
|
231
|
-
const diagnostics = [];
|
|
232
|
-
/** @type {Array<{ id: string, kind: string, package: string, version: string, packageSpec: string, ok: boolean, checkedVersion: string|null, diagnostics: any[] }>} */
|
|
233
|
-
const packages = [];
|
|
234
|
-
let loaded = null;
|
|
235
|
-
try {
|
|
236
|
-
loaded = loadCatalog(source || null);
|
|
237
|
-
} catch (error) {
|
|
238
|
-
const diagnostic = {
|
|
239
|
-
code: "catalog_unreachable",
|
|
240
|
-
severity: "error",
|
|
241
|
-
message: messageFromError(error),
|
|
242
|
-
path: resolvedSource,
|
|
243
|
-
suggestedFix: catalogDoctorSourceFix(resolvedSource)
|
|
244
|
-
};
|
|
245
|
-
return {
|
|
246
|
-
ok: false,
|
|
247
|
-
source: resolvedSource,
|
|
248
|
-
auth,
|
|
249
|
-
catalog: {
|
|
250
|
-
reachable: false,
|
|
251
|
-
version: null,
|
|
252
|
-
entries: 0
|
|
253
|
-
},
|
|
254
|
-
packages,
|
|
255
|
-
diagnostics: [diagnostic],
|
|
256
|
-
errors: [diagnostic.message]
|
|
257
|
-
};
|
|
258
|
-
}
|
|
259
|
-
diagnostics.push(...loaded.diagnostics);
|
|
260
|
-
for (const entry of loaded.catalog.entries) {
|
|
261
|
-
packages.push(checkCatalogDoctorPackage(entry));
|
|
262
|
-
}
|
|
263
|
-
const packageDiagnostics = packages.flatMap((entry) => entry.diagnostics);
|
|
264
|
-
const allDiagnostics = [...diagnostics, ...packageDiagnostics];
|
|
265
|
-
const errors = allDiagnostics
|
|
266
|
-
.filter((diagnostic) => diagnostic.severity === "error")
|
|
267
|
-
.map((diagnostic) => diagnostic.message);
|
|
268
|
-
return {
|
|
269
|
-
ok: errors.length === 0,
|
|
270
|
-
source: loaded.source,
|
|
271
|
-
auth,
|
|
272
|
-
catalog: {
|
|
273
|
-
reachable: true,
|
|
274
|
-
version: loaded.catalog.version,
|
|
275
|
-
entries: loaded.catalog.entries.length
|
|
276
|
-
},
|
|
277
|
-
packages,
|
|
278
|
-
diagnostics: allDiagnostics,
|
|
279
|
-
errors
|
|
280
|
-
};
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
/**
|
|
284
|
-
* @param {string} source
|
|
285
|
-
* @returns {{ githubTokenEnv: boolean, ghTokenEnv: boolean, ghCli: { checked: boolean, available: boolean, authenticated: boolean, reason: string|null } }}
|
|
286
|
-
*/
|
|
287
|
-
export function buildCatalogDoctorAuth(source) {
|
|
288
|
-
const shouldCheckGh = source.startsWith("github:");
|
|
289
|
-
return githubAuthStatus({
|
|
290
|
-
checkGh: shouldCheckGh && !process.env.GITHUB_TOKEN && !process.env.GH_TOKEN
|
|
291
|
-
});
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
/**
|
|
295
|
-
* @param {any} entry
|
|
296
|
-
* @returns {{ id: string, kind: string, package: string, version: string, packageSpec: string, ok: boolean, checkedVersion: string|null, diagnostics: any[] }}
|
|
297
|
-
*/
|
|
298
|
-
function checkCatalogDoctorPackage(entry) {
|
|
299
|
-
const packageSpec = catalogEntryPackageSpec(entry);
|
|
300
|
-
const result = runNpmViewPackageSpec(packageSpec);
|
|
301
|
-
if (result.status === 0) {
|
|
302
|
-
const checkedVersion = String(result.stdout || "").trim().replace(/^"|"$/g, "");
|
|
303
|
-
return {
|
|
304
|
-
id: entry.id,
|
|
305
|
-
kind: entry.kind,
|
|
306
|
-
package: entry.package,
|
|
307
|
-
version: entry.defaultVersion,
|
|
308
|
-
packageSpec,
|
|
309
|
-
ok: checkedVersion === entry.defaultVersion,
|
|
310
|
-
checkedVersion: checkedVersion || null,
|
|
311
|
-
diagnostics: checkedVersion === entry.defaultVersion ? [] : [{
|
|
312
|
-
code: "catalog_package_version_mismatch",
|
|
313
|
-
severity: "error",
|
|
314
|
-
message: `Catalog entry '${entry.id}' expected ${packageSpec}, but npm returned '${checkedVersion || "(empty)"}'.`,
|
|
315
|
-
path: entry.id,
|
|
316
|
-
suggestedFix: "Check defaultVersion in the catalog, or publish the referenced package version."
|
|
317
|
-
}]
|
|
318
|
-
};
|
|
319
|
-
}
|
|
320
|
-
const diagnostic = catalogDoctorPackageDiagnostic(entry, packageSpec, result);
|
|
321
|
-
return {
|
|
322
|
-
id: entry.id,
|
|
323
|
-
kind: entry.kind,
|
|
324
|
-
package: entry.package,
|
|
325
|
-
version: entry.defaultVersion,
|
|
326
|
-
packageSpec,
|
|
327
|
-
ok: false,
|
|
328
|
-
checkedVersion: null,
|
|
329
|
-
diagnostics: [diagnostic]
|
|
330
|
-
};
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
/**
|
|
334
|
-
* @param {string} packageSpec
|
|
335
|
-
* @returns {{ status: number|null, stdout: string, stderr: string, error?: Error }}
|
|
336
|
-
*/
|
|
337
|
-
export function runNpmViewPackageSpec(packageSpec) {
|
|
338
|
-
assertSafeNpmSpec(packageSpec);
|
|
339
|
-
const npmBin = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
340
|
-
return childProcess.spawnSync(npmBin, ["view", "--json", "--", packageSpec, "version"], {
|
|
341
|
-
encoding: "utf8",
|
|
342
|
-
env: {
|
|
343
|
-
...process.env,
|
|
344
|
-
...localNpmrcEnv(process.cwd()),
|
|
345
|
-
PATH: process.env.PATH || ""
|
|
346
|
-
}
|
|
347
|
-
});
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
/**
|
|
351
|
-
* @param {any} entry
|
|
352
|
-
* @param {string} packageSpec
|
|
353
|
-
* @param {{ stdout?: string, stderr?: string, error?: Error }} result
|
|
354
|
-
* @returns {any}
|
|
355
|
-
*/
|
|
356
|
-
export function catalogDoctorPackageDiagnostic(entry, packageSpec, result) {
|
|
357
|
-
const output = [result.error?.message, result.stderr, result.stdout].filter(Boolean).join("\n").trim();
|
|
358
|
-
const normalized = output.toLowerCase();
|
|
359
|
-
if (result.error?.message && result.error.message.includes("ENOENT")) {
|
|
360
|
-
return {
|
|
361
|
-
code: "npm_not_found",
|
|
362
|
-
severity: "error",
|
|
363
|
-
message: "npm is required to check catalog package access.",
|
|
364
|
-
path: entry.id,
|
|
365
|
-
suggestedFix: "Install npm with Node.js, then rerun `topogram catalog doctor`."
|
|
366
|
-
};
|
|
367
|
-
}
|
|
368
|
-
if (/\b(401|e401|authentication|auth token|login)\b/.test(normalized)) {
|
|
369
|
-
return {
|
|
370
|
-
code: "catalog_package_auth_required",
|
|
371
|
-
severity: "error",
|
|
372
|
-
message: `Authentication is required to inspect package '${packageSpec}'.`,
|
|
373
|
-
path: entry.id,
|
|
374
|
-
suggestedFix: "Configure registry-specific npm auth when using private packages."
|
|
375
|
-
};
|
|
376
|
-
}
|
|
377
|
-
if (/\b(403|e403|forbidden|permission|denied)\b/.test(normalized)) {
|
|
378
|
-
return {
|
|
379
|
-
code: "catalog_package_access_denied",
|
|
380
|
-
severity: "error",
|
|
381
|
-
message: `Package access was denied for '${packageSpec}'.`,
|
|
382
|
-
path: entry.id,
|
|
383
|
-
suggestedFix: "Check package visibility and registry-specific npm auth for the consumer environment."
|
|
384
|
-
};
|
|
385
|
-
}
|
|
386
|
-
if (/\b(404|e404|not found)\b/.test(normalized)) {
|
|
387
|
-
return {
|
|
388
|
-
code: "catalog_package_not_found",
|
|
389
|
-
severity: "error",
|
|
390
|
-
message: `Package '${packageSpec}' was not found, or the current npm token cannot see it.`,
|
|
391
|
-
path: entry.id,
|
|
392
|
-
suggestedFix: "Check the package name/version and npm package registry access."
|
|
393
|
-
};
|
|
394
|
-
}
|
|
395
|
-
return {
|
|
396
|
-
code: "catalog_package_check_failed",
|
|
397
|
-
severity: "error",
|
|
398
|
-
message: `Failed to inspect package '${packageSpec}'.${output ? `\n${output}` : ""}`,
|
|
399
|
-
path: entry.id,
|
|
400
|
-
suggestedFix: "Run `npm view <package>@<version> version --json` with the same npm auth configuration to debug package access."
|
|
401
|
-
};
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
/**
|
|
405
|
-
* @param {string} source
|
|
406
|
-
* @returns {string}
|
|
407
|
-
*/
|
|
408
|
-
function catalogDoctorSourceFix(source) {
|
|
409
|
-
if (source.startsWith("github:")) {
|
|
410
|
-
return "Set GITHUB_TOKEN or GH_TOKEN with repository read access, use `gh auth login` only as a local no-token fallback, or pass --catalog ./topograms.catalog.json.";
|
|
411
|
-
}
|
|
412
|
-
if (source.startsWith("http://") || source.startsWith("https://")) {
|
|
413
|
-
return "Check the catalog URL and token access, or pass --catalog ./topograms.catalog.json.";
|
|
414
|
-
}
|
|
415
|
-
return "Check the local catalog path and run `topogram catalog check <path>`.";
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
/**
|
|
419
|
-
* @param {ReturnType<typeof buildCatalogDoctorPayload>} payload
|
|
420
|
-
* @returns {void}
|
|
421
|
-
*/
|
|
422
|
-
export function printCatalogDoctor(payload) {
|
|
423
|
-
console.log(payload.ok ? "Catalog doctor passed." : "Catalog doctor found issues.");
|
|
424
|
-
console.log(`Source: ${payload.source}`);
|
|
425
|
-
if (payload.source.startsWith("github:")) {
|
|
426
|
-
const tokenStatus = payload.auth.githubTokenEnv || payload.auth.ghTokenEnv ? "yes" : "no";
|
|
427
|
-
const ghStatus = payload.auth.ghCli.checked
|
|
428
|
-
? `${payload.auth.ghCli.authenticated ? "authenticated" : "not authenticated"}${payload.auth.ghCli.reason ? ` (${payload.auth.ghCli.reason})` : ""}`
|
|
429
|
-
: "not checked";
|
|
430
|
-
console.log(`GitHub token env: ${tokenStatus}`);
|
|
431
|
-
console.log(`gh auth: ${ghStatus}`);
|
|
432
|
-
}
|
|
433
|
-
console.log(`Catalog reachable: ${payload.catalog.reachable ? "yes" : "no"}`);
|
|
434
|
-
if (payload.catalog.reachable) {
|
|
435
|
-
console.log(`Version: ${payload.catalog.version}`);
|
|
436
|
-
console.log(`Entries: ${payload.catalog.entries}`);
|
|
437
|
-
}
|
|
438
|
-
if (payload.packages.length > 0) {
|
|
439
|
-
console.log("Packages:");
|
|
440
|
-
for (const item of payload.packages) {
|
|
441
|
-
console.log(`- ${item.id} (${item.kind}): ${item.packageSpec} ${item.ok ? "ok" : "failed"}`);
|
|
442
|
-
for (const diagnostic of item.diagnostics) {
|
|
443
|
-
console.log(` Error: ${diagnostic.message}`);
|
|
444
|
-
if (diagnostic.suggestedFix) {
|
|
445
|
-
console.log(` Fix: ${diagnostic.suggestedFix}`);
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
const packageIds = new Set(payload.packages.map((item) => item.id));
|
|
451
|
-
for (const diagnostic of payload.diagnostics.filter((item) => !item.path || !packageIds.has(item.path))) {
|
|
452
|
-
const label = diagnostic.severity === "warning" ? "Warning" : "Error";
|
|
453
|
-
console.log(`${label}: ${diagnostic.message}`);
|
|
454
|
-
if (diagnostic.suggestedFix) {
|
|
455
|
-
console.log(`Fix: ${diagnostic.suggestedFix}`);
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
/**
|
|
461
|
-
* @param {string} source
|
|
462
|
-
* @returns {ReturnType<typeof checkCatalogSource>}
|
|
463
|
-
*/
|
|
464
|
-
export function buildCatalogCheckPayload(source) {
|
|
465
|
-
if (!source) {
|
|
466
|
-
throw new Error("topogram catalog check requires <path-or-url>.");
|
|
467
|
-
}
|
|
468
|
-
return checkCatalogSource(source);
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
/**
|
|
472
|
-
* @param {ReturnType<typeof checkCatalogSource>} payload
|
|
473
|
-
* @returns {void}
|
|
474
|
-
*/
|
|
475
|
-
export function printCatalogCheck(payload) {
|
|
476
|
-
console.log(payload.ok ? "Catalog check passed." : "Catalog check failed.");
|
|
477
|
-
console.log(`Source: ${payload.source}`);
|
|
478
|
-
if (payload.catalog) {
|
|
479
|
-
console.log(`Version: ${payload.catalog.version}`);
|
|
480
|
-
console.log(`Entries: ${payload.catalog.entries.length}`);
|
|
481
|
-
}
|
|
482
|
-
for (const diagnostic of payload.diagnostics) {
|
|
483
|
-
const label = diagnostic.severity === "warning" ? "Warning" : "Error";
|
|
484
|
-
console.log(`${label}: ${diagnostic.message}`);
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
/**
|
|
489
|
-
* @param {string} id
|
|
490
|
-
* @param {string} targetPath
|
|
491
|
-
* @param {{ source?: string|null, version?: string|null }} options
|
|
492
|
-
* @returns {{ ok: boolean, source: string, id: string, kind: "topogram", packageSpec: string, targetPath: string, provenancePath: string, files: string[], diagnostics: any[], errors: string[] }}
|
|
493
|
-
*/
|
|
494
|
-
export function buildCatalogCopyPayload(id, targetPath, options) {
|
|
495
|
-
if (!id || id.startsWith("-")) {
|
|
496
|
-
throw new Error("topogram catalog copy requires <id>.");
|
|
497
|
-
}
|
|
498
|
-
if (!targetPath || targetPath.startsWith("-")) {
|
|
499
|
-
throw new Error("topogram catalog copy requires <target>.");
|
|
500
|
-
}
|
|
501
|
-
const loaded = loadCatalog(options.source || null);
|
|
502
|
-
const entry = findCatalogEntry(loaded.catalog, id, "topogram");
|
|
503
|
-
if (!entry) {
|
|
504
|
-
throw new Error(`Catalog topogram entry '${id}' was not found in ${loaded.source}.`);
|
|
505
|
-
}
|
|
506
|
-
const copied = copyCatalogTopogramEntry(entry, targetPath, {
|
|
507
|
-
catalogSource: loaded.source,
|
|
508
|
-
version: options.version || null
|
|
509
|
-
});
|
|
510
|
-
return {
|
|
511
|
-
source: loaded.source,
|
|
512
|
-
...copied,
|
|
513
|
-
diagnostics: [],
|
|
514
|
-
errors: []
|
|
515
|
-
};
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
/**
|
|
519
|
-
* @param {ReturnType<typeof buildCatalogCopyPayload>} payload
|
|
520
|
-
* @returns {void}
|
|
521
|
-
*/
|
|
522
|
-
export function printCatalogCopy(payload) {
|
|
523
|
-
console.log(`Copied catalog topogram '${payload.id}' to ${payload.targetPath}.`);
|
|
524
|
-
console.log(`Package: ${payload.packageSpec}`);
|
|
525
|
-
console.log(`Source provenance: ${payload.provenancePath}`);
|
|
526
|
-
console.log(`Files: ${payload.files.length}`);
|
|
527
|
-
console.log(`${TOPOGRAM_SOURCE_FILE} records catalog-copy provenance only. Local edits are allowed.`);
|
|
528
|
-
console.log("");
|
|
529
|
-
console.log("Next steps:");
|
|
530
|
-
console.log(` cd ${shellCommandArg(path.relative(process.cwd(), payload.targetPath) || ".")}`);
|
|
531
|
-
console.log(" topogram source status --local");
|
|
532
|
-
console.log(" topogram check");
|
|
533
|
-
console.log(" topogram generate");
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
/**
|
|
537
|
-
* @param {{
|
|
538
|
-
* commandArgs: Record<string, any>,
|
|
539
|
-
* inputPath: string|null|undefined,
|
|
540
|
-
* catalogSource: string|null,
|
|
541
|
-
* requestedVersion: string|null,
|
|
542
|
-
* json: boolean
|
|
543
|
-
* }} context
|
|
544
|
-
* @returns {number}
|
|
545
|
-
*/
|
|
546
|
-
export function runCatalogCommand(context) {
|
|
547
|
-
const { commandArgs, inputPath, catalogSource, requestedVersion, json } = context;
|
|
548
|
-
if (commandArgs.catalogCommand === "list") {
|
|
549
|
-
const payload = buildCatalogListPayload(catalogSource || inputPath || null);
|
|
550
|
-
if (json) {
|
|
551
|
-
console.log(stableStringify(payload));
|
|
552
|
-
} else {
|
|
553
|
-
printCatalogList(payload);
|
|
554
|
-
}
|
|
555
|
-
return 0;
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
if (commandArgs.catalogCommand === "show") {
|
|
559
|
-
if (!inputPath) {
|
|
560
|
-
console.error("Missing required <id>.");
|
|
561
|
-
printCatalogHelp();
|
|
562
|
-
return 1;
|
|
563
|
-
}
|
|
564
|
-
const payload = buildCatalogShowPayload(inputPath, catalogSource);
|
|
565
|
-
if (json) {
|
|
566
|
-
console.log(stableStringify(payload));
|
|
567
|
-
} else {
|
|
568
|
-
printCatalogShow(payload);
|
|
569
|
-
}
|
|
570
|
-
return payload.ok ? 0 : 1;
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
if (commandArgs.catalogCommand === "doctor") {
|
|
574
|
-
const payload = buildCatalogDoctorPayload(catalogSource || inputPath || null);
|
|
575
|
-
if (json) {
|
|
576
|
-
console.log(stableStringify(payload));
|
|
577
|
-
} else {
|
|
578
|
-
printCatalogDoctor(payload);
|
|
579
|
-
}
|
|
580
|
-
return payload.ok ? 0 : 1;
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
if (commandArgs.catalogCommand === "check") {
|
|
584
|
-
if (!inputPath) {
|
|
585
|
-
console.error("Missing required <path-or-url>.");
|
|
586
|
-
printCatalogHelp();
|
|
587
|
-
return 1;
|
|
588
|
-
}
|
|
589
|
-
const payload = buildCatalogCheckPayload(inputPath);
|
|
590
|
-
if (json) {
|
|
591
|
-
console.log(stableStringify(payload));
|
|
592
|
-
} else {
|
|
593
|
-
printCatalogCheck(payload);
|
|
594
|
-
}
|
|
595
|
-
return payload.ok ? 0 : 1;
|
|
596
|
-
}
|
|
597
|
-
|
|
598
|
-
if (commandArgs.catalogCommand === "copy") {
|
|
599
|
-
if (!commandArgs.catalogId || !inputPath) {
|
|
600
|
-
console.error("Missing required <id> or <target>.");
|
|
601
|
-
printCatalogHelp();
|
|
602
|
-
return 1;
|
|
603
|
-
}
|
|
604
|
-
const payload = buildCatalogCopyPayload(commandArgs.catalogId, inputPath, {
|
|
605
|
-
source: catalogSource,
|
|
606
|
-
version: requestedVersion
|
|
607
|
-
});
|
|
608
|
-
if (json) {
|
|
609
|
-
console.log(stableStringify(payload));
|
|
610
|
-
} else {
|
|
611
|
-
printCatalogCopy(payload);
|
|
612
|
-
}
|
|
613
|
-
return 0;
|
|
614
|
-
}
|
|
615
|
-
|
|
616
|
-
throw new Error(`Unknown catalog command '${commandArgs.catalogCommand}'`);
|
|
617
|
-
}
|
|
3
|
+
export { printCatalogHelp } from "./catalog/help.js";
|
|
4
|
+
export {
|
|
5
|
+
messageFromError,
|
|
6
|
+
shellCommandArg
|
|
7
|
+
} from "./catalog/shared.js";
|
|
8
|
+
export {
|
|
9
|
+
buildCatalogListPayload,
|
|
10
|
+
printCatalogList
|
|
11
|
+
} from "./catalog/list.js";
|
|
12
|
+
export {
|
|
13
|
+
buildCatalogShowPayload,
|
|
14
|
+
catalogShowCommands,
|
|
15
|
+
printCatalogShow
|
|
16
|
+
} from "./catalog/show.js";
|
|
17
|
+
export {
|
|
18
|
+
buildCatalogDoctorAuth,
|
|
19
|
+
buildCatalogDoctorPayload,
|
|
20
|
+
catalogDoctorPackageDiagnostic,
|
|
21
|
+
printCatalogDoctor,
|
|
22
|
+
runNpmViewPackageSpec
|
|
23
|
+
} from "./catalog/doctor.js";
|
|
24
|
+
export {
|
|
25
|
+
buildCatalogCheckPayload,
|
|
26
|
+
printCatalogCheck
|
|
27
|
+
} from "./catalog/check.js";
|
|
28
|
+
export {
|
|
29
|
+
buildCatalogCopyPayload,
|
|
30
|
+
printCatalogCopy
|
|
31
|
+
} from "./catalog/copy.js";
|
|
32
|
+
export { runCatalogCommand } from "./catalog/runner.js";
|