ingestron 0.13.1 → 0.14.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/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.14.0
|
|
4
|
+
|
|
5
|
+
- Add the official `files` plugin alias to CLI and MCP, with exact qualified catalogue resolution and unchanged cache-only installation.
|
|
6
|
+
- Keep core pinned to published 0.12.1; existing plugin identities and locks remain unchanged.
|
|
7
|
+
|
|
8
|
+
## 0.13.2
|
|
9
|
+
|
|
10
|
+
- Keep official plugin names short in ordinary install/list output; exact references remain in verbose and JSON output.
|
|
11
|
+
- Link help to complete walkthroughs and explain the separate provider-configuration step.
|
|
12
|
+
- Summarise configured resources and show Python preparation/reuse details from the local provider.
|
|
13
|
+
|
|
3
14
|
## 0.13.1 — Node.js runtime compatibility
|
|
4
15
|
|
|
5
16
|
- Require Node 22.12 or newer instead of excluding newer major versions. CI tests
|
package/build/cli/cli/output.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* serialise arbitrary plugin data or resolved bindings in the default summary. */
|
|
4
4
|
import { friendlyReference } from "@ingestron/core/adapter";
|
|
5
5
|
import { stringify } from "yaml";
|
|
6
|
+
import { officialPlugins } from "./plugin-resolution.js";
|
|
6
7
|
export function exitCode(result) {
|
|
7
8
|
if (result.ok)
|
|
8
9
|
return 0;
|
|
@@ -26,6 +27,21 @@ export function exitCode(result) {
|
|
|
26
27
|
return 2;
|
|
27
28
|
}
|
|
28
29
|
const clean = (value) => String(value).replace(/[\u0000-\u001f\u007f-\u009f]/g, " ");
|
|
30
|
+
function pluginLabel(reference) {
|
|
31
|
+
for (const [name, entry] of Object.entries(officialPlugins)) {
|
|
32
|
+
const prefixes = [
|
|
33
|
+
`${entry.repository}/${entry.path}@`,
|
|
34
|
+
...(name === "local" ? [`${entry.repository}@`] : []),
|
|
35
|
+
];
|
|
36
|
+
for (const prefix of prefixes)
|
|
37
|
+
if (reference.startsWith(prefix)) {
|
|
38
|
+
const version = reference.slice(prefix.length);
|
|
39
|
+
if (/^\d+\.\d+\.\d+$/.test(version))
|
|
40
|
+
return `${name}@${version}`;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return friendlyReference(reference);
|
|
44
|
+
}
|
|
29
45
|
function lines(title, items, empty) {
|
|
30
46
|
if (!items.length)
|
|
31
47
|
return empty;
|
|
@@ -61,9 +77,9 @@ export function terminal(result, verbose = false, args = {}) {
|
|
|
61
77
|
value.evidence +
|
|
62
78
|
"\nInstall: ingestron plugin install <owner/repository>@<version>");
|
|
63
79
|
case "packages_install":
|
|
64
|
-
return `${value.cached ? "Using cached" : "Installed"} plugin ${clean(
|
|
80
|
+
return `${value.cached ? "Using cached" : "Installed"} plugin ${clean(pluginLabel(args.reference ?? value.reference ?? "package"))}.\nUse --verbose for the exact reference and licence information.`;
|
|
65
81
|
case "packages_list":
|
|
66
|
-
return lines("Installed plugins", Object.keys(value.packages).map(
|
|
82
|
+
return lines("Installed plugins", Object.keys(value.packages).map(pluginLabel), "No plugins installed.\nNext: ingestron plugin install local");
|
|
67
83
|
case "source_list":
|
|
68
84
|
return lines("Sources", value.map((s) => `${s.id} ${s.type}${s.format ? "/" + s.format : ""} ${s.execution}`), "No sources configured.\nNext: ingestron source add <name> --type <type>");
|
|
69
85
|
case "source_show":
|
|
@@ -93,6 +109,11 @@ export function terminal(result, verbose = false, args = {}) {
|
|
|
93
109
|
case "doctor":
|
|
94
110
|
return `Project ${clean(value.project)} (${clean(value.environment)})\n${value.pending.length} unresolved inputs.\n${clean(value.platformAccess)}\nNext: ${clean(value.next)}`;
|
|
95
111
|
case "runtime_prepare":
|
|
112
|
+
return (`Runtime ${clean(value.status)} for ${value.flows.map(clean).join(", ")}.` +
|
|
113
|
+
(value.result?.flows ?? [])
|
|
114
|
+
.map((f) => `\n ${clean(f.flow)}: Python ${clean(f.pythonVersion ?? "3.12")} (${f.reused ? "reused" : "prepared"})`)
|
|
115
|
+
.join("") +
|
|
116
|
+
`\nUse ingestron run status ${clean(value.id)} --verbose for environment paths and details.`);
|
|
96
117
|
case "run":
|
|
97
118
|
case "run_status":
|
|
98
119
|
return `Run ${clean(value.id)}: ${clean(value.status)} (${clean(value.action)}).\nTarget: ${clean(value.configuration)}; flows: ${value.flows.map(clean).join(", ")}.\nUse ingestron run status ${clean(value.id)} to inspect the receipt.`;
|
|
@@ -120,7 +141,15 @@ export function terminal(result, verbose = false, args = {}) {
|
|
|
120
141
|
case "config_explain":
|
|
121
142
|
return `Configuration: ${clean(value.path)} (${clean(value.environment)})\nUse --verbose to inspect declared and resolved values.`;
|
|
122
143
|
case "resolve":
|
|
123
|
-
return `
|
|
144
|
+
return (`Project ${clean(value.project.id)} — resolved build configuration\n` +
|
|
145
|
+
`Providers: ${Object.keys(value.project.providers?.configurations ?? {})
|
|
146
|
+
.map(clean)
|
|
147
|
+
.join(", ") || "none"}\n` +
|
|
148
|
+
`Connections: ${Object.keys(value.project.connections ?? {})
|
|
149
|
+
.map(clean)
|
|
150
|
+
.join(", ") || "none"}\n` +
|
|
151
|
+
`Flows: ${value.flows.length}; unresolved inputs: ${value.pending.length}.\n` +
|
|
152
|
+
"Authored files: ingestron source list; ingestron contract list.\nUse --verbose for resolved configuration and input-file digests.");
|
|
124
153
|
case "read":
|
|
125
154
|
return value.content;
|
|
126
155
|
case "schema":
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
/** Official-name convenience at the adapter boundary; core only receives exact references. */
|
|
2
2
|
import { type Context, type OperationName, type Result } from "@ingestron/core";
|
|
3
3
|
export declare const officialPlugins: {
|
|
4
|
+
readonly files: {
|
|
5
|
+
readonly repository: "ingestron/connectors";
|
|
6
|
+
readonly path: "connectors/files/connector.yaml";
|
|
7
|
+
readonly tagPrefix: "files-";
|
|
8
|
+
};
|
|
4
9
|
readonly github: {
|
|
5
10
|
readonly repository: "ingestron/connectors";
|
|
6
11
|
readonly path: "connectors/github/connector.yaml";
|
|
@@ -3,6 +3,11 @@ import { executeAsync, operationSchemas, } from "@ingestron/core";
|
|
|
3
3
|
import { check, packageLock, Problem } from "@ingestron/core/adapter";
|
|
4
4
|
import { coreVersion } from "../version.js";
|
|
5
5
|
export const officialPlugins = {
|
|
6
|
+
files: {
|
|
7
|
+
repository: "ingestron/connectors",
|
|
8
|
+
path: "connectors/files/connector.yaml",
|
|
9
|
+
tagPrefix: "files-",
|
|
10
|
+
},
|
|
6
11
|
github: {
|
|
7
12
|
repository: "ingestron/connectors",
|
|
8
13
|
path: "connectors/github/connector.yaml",
|
|
@@ -24,7 +29,7 @@ export function officialName(reference) {
|
|
|
24
29
|
if (reference.includes("/"))
|
|
25
30
|
return undefined;
|
|
26
31
|
const [name, version, extra] = reference.split("@");
|
|
27
|
-
check(Object.hasOwn(officialPlugins, name), "PACKAGE", `Unknown official plugin '${name}'. Use github, local, or an explicit owner/repository reference.`);
|
|
32
|
+
check(Object.hasOwn(officialPlugins, name), "PACKAGE", `Unknown official plugin '${name}'. Use files, github, local, or an explicit owner/repository reference.`);
|
|
28
33
|
check(extra === undefined &&
|
|
29
34
|
(version === undefined || version === "latest" || stable.test(version)), "PACKAGE", "Use a stable version, @latest, or omit the version for an official plugin");
|
|
30
35
|
return { name: name, version };
|
|
@@ -182,7 +182,7 @@ export function workflowCommands(app, host) {
|
|
|
182
182
|
message: "Official plugin name or owner/repository",
|
|
183
183
|
validate: (value) => /^(github|local|[\w.-]+\/[\w.-]+)$/.test(value ?? "")
|
|
184
184
|
? undefined
|
|
185
|
-
: "Use github, local or owner/repository",
|
|
185
|
+
: "Use files, github, local or owner/repository",
|
|
186
186
|
}));
|
|
187
187
|
}
|
|
188
188
|
check(typeof reference === "string", "INPUT", "Choose a plugin reference");
|
|
@@ -372,5 +372,5 @@ export function workflowCommands(app, host) {
|
|
|
372
372
|
visibleCommands: (command) => command.commands.filter((c) => (command !== app || !hidden.has(c.name())) &&
|
|
373
373
|
(command !== contract || c.name() !== "validate")),
|
|
374
374
|
});
|
|
375
|
-
app.addHelpText("after", "\nStart:
|
|
375
|
+
app.addHelpText("after", "\nStart with a complete walkthrough: https://docs.ingestron.io/docs/start/first-contract\nRun a public GitHub example: https://docs.ingestron.io/docs/tutorials/github-to-parquet\nPlugin installation caches packages; use plugin configure to add a provider to your project.\nUse --json for automation; --verbose for detailed terminal output.");
|
|
376
376
|
}
|