ingestron 0.14.0 → 0.15.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,22 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.15.0
4
+
5
+ - Add `provider install` and `connector install` with matching list/update commands. They use the existing immutable package cache and reject a package of the wrong type before changing the lock.
6
+ - Move direct provider command execution to `provider exec`. Keep `plugin install` and the older `providers install` spelling for existing scripts.
7
+ - Pin core 0.12.2 so connected flows can resolve reviewed model-pack contracts in the same way as planning.
8
+
9
+ ## 0.14.2
10
+
11
+ - Add the qualified `sql-server` source shortcut to CLI and MCP. `sql-server@1.0.0`
12
+ resolves to its immutable source tag; installation still only caches the package.
13
+ - Offer every current official plugin in the interactive install prompt.
14
+
15
+ ## 0.14.1
16
+
17
+ - Add `azure-blob` and `azure-blob@1.0.0` shortcuts, including qualified latest selection and MCP parity. No tag-prefix option is needed.
18
+ - Derive official-name help from the shared alias map and suggest checking/updating the CLI when a name is unknown.
19
+
3
20
  ## 0.14.0
4
21
 
5
22
  - Add the official `files` plugin alias to CLI and MCP, with exact qualified catalogue resolution and unchanged cache-only installation.
package/README.md CHANGED
@@ -29,29 +29,29 @@ To install this checkout's CLI in your terminal:
29
29
 
30
30
  ```sh
31
31
  pnpm pack --pack-destination build/release
32
- npm install --global ./build/release/ingestron-0.13.1.tgz
32
+ npm install --global ./build/release/ingestron-0.14.2.tgz
33
33
  ingestron --version
34
34
  ```
35
35
 
36
36
  This source release prepares the npm package named `ingestron`; it does not claim
37
37
  that the same CLI version is already published on npm. Its core dependency is the
38
- public, exact version `@ingestron/core@0.12.1`.
38
+ public, exact version `@ingestron/core@0.12.2`.
39
39
 
40
40
  Follow the [five-minute quickstart](docs/quickstart.md) for a project you can keep.
41
41
 
42
42
  ## Work with projects and plugins
43
43
 
44
- Commands use resource groups such as `source`, `contract`, `flow`, `config` and
45
- `plugin`. Installed plugins can add their own namespace:
44
+ Commands use resource groups such as `source`, `contract`, `flow`, `config`,
45
+ `provider` and `connector`. Installed packages can add their own namespace:
46
46
 
47
47
  ```text
48
- ingestron plugin install local
49
- ingestron plugin install github
48
+ ingestron provider install local
49
+ ingestron connector install github
50
50
  ingestron <namespace> <resource> <verb> --input request.json
51
51
  ```
52
52
 
53
53
  Installation caches an exact, qualified version without changing project configuration.
54
- Use `github@1.32.1` for an explicit pin, or `plugin update github` to check for a newer
54
+ Use `github@1.33.0` for an explicit pin, or `connector update github` to check for a newer
55
55
  qualified release. Browse installed packages with `ingestron plugin browse`. Command help
56
56
  shows the selected plugin's input schema without executing it.
57
57
 
@@ -75,7 +75,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
75
75
  SOFTWARE.
76
76
  ```
77
77
 
78
- ### @ingestron/core@0.12.1
78
+ ### @ingestron/core@0.12.2
79
79
 
80
80
  Declared licence: Apache-2.0
81
81
 
@@ -3601,6 +3601,28 @@ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
3601
3601
  THIS SOFTWARE.
3602
3602
  ```
3603
3603
 
3604
+ ### yaml@2.9.1
3605
+
3606
+ Declared licence: ISC
3607
+
3608
+ LICENSE:
3609
+
3610
+ ```text
3611
+ Copyright Eemeli Aro <eemeli@gmail.com>
3612
+
3613
+ Permission to use, copy, modify, and/or distribute this software for any purpose
3614
+ with or without fee is hereby granted, provided that the above copyright notice
3615
+ and this permission notice appear in all copies.
3616
+
3617
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
3618
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
3619
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
3620
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
3621
+ OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
3622
+ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
3623
+ THIS SOFTWARE.
3624
+ ```
3625
+
3604
3626
  ### zod-to-json-schema@3.25.2
3605
3627
 
3606
3628
  Declared licence: ISC
@@ -3625,7 +3647,7 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3625
3647
  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3626
3648
  ```
3627
3649
 
3628
- ### zod@4.5.4
3650
+ ### zod@4.6.5
3629
3651
 
3630
3652
  Declared licence: MIT
3631
3653
 
@@ -326,6 +326,9 @@ connections
326
326
  print(result);
327
327
  });
328
328
  const providerCommands = app.commands.find((command) => command.name() === "providers");
329
+ providerCommands.configureHelp({
330
+ visibleCommands: (command) => command.commands.filter((child) => !["install", "update"].includes(child.name())),
331
+ });
329
332
  for (const update of [false, true])
330
333
  providerCommands
331
334
  .command(`${update ? "update" : "install"} <reference>`)
@@ -342,9 +345,16 @@ providerCommands
342
345
  .command("commands <configuration>")
343
346
  .description("List provider-owned commands and input schemas without executing plugin code")
344
347
  .action((configuration) => run("provider_commands", { configuration }));
345
- app
346
- .command("provider <configuration> <command...>")
347
- .description("Run an installed provider's offline command; inspect providers commands first")
348
+ const provider = app
349
+ .command("provider")
350
+ .description("Install an execution provider or run its offline commands")
351
+ .arguments("<configuration> <command...>")
352
+ .option("--input <file>", "Project-relative JSON input file")
353
+ .option("--out <file>", "Save the provider result JSON to a new project file")
354
+ .action((configuration, words, command) => providerAction("provider_command", { configuration, command: words.join(" ") }, command));
355
+ provider
356
+ .command("exec <configuration> <command...>")
357
+ .description("Run a configured provider command; inspect providers commands first")
348
358
  .option("--input <file>", "Project-relative JSON input file")
349
359
  .option("--out <file>", "Save the provider result JSON to a new project file")
350
360
  .action((configuration, words, command) => providerAction("provider_command", { configuration, command: words.join(" ") }, command));
@@ -70,16 +70,16 @@ export function terminal(result, verbose = false, args = {}) {
70
70
  .map((p) => ` ${clean(p.id).padEnd(13)} ${clean(p.name)} [${clean(p.kindLabel)} · ${clean(p.availability)}]\n ${clean(p.description)}\n ${clean(p.url)}`)
71
71
  .join("\n\n")
72
72
  : "No installed plugins match this search.") +
73
- "\n\nBrowse versions: ingestron plugin versions github\nGuided install: ingestron plugin install\nInstall: ingestron plugin install github");
73
+ "\n\nInstall a provider: ingestron provider install local\nInstall a connector: ingestron connector install github");
74
74
  case "plugin_versions":
75
75
  return (lines(`Versions for ${value.provider}`, value.versions.map((v) => `${v.reference}${v.ambiguous ? " (conflicting tags; select a commit)" : ""}`), "No stable version tags found.") +
76
76
  "\n\n" +
77
77
  value.evidence +
78
78
  "\nInstall: ingestron plugin install <owner/repository>@<version>");
79
79
  case "packages_install":
80
- return `${value.cached ? "Using cached" : "Installed"} plugin ${clean(pluginLabel(args.reference ?? value.reference ?? "package"))}.\nUse --verbose for the exact reference and licence information.`;
80
+ return `${value.cached ? "Using cached" : "Installed"} ${args.kind ?? "plugin"} ${clean(pluginLabel(args.reference ?? value.reference ?? "package"))}.\nUse --verbose for the exact reference and licence information.`;
81
81
  case "packages_list":
82
- return lines("Installed plugins", Object.keys(value.packages).map(pluginLabel), "No plugins installed.\nNext: ingestron plugin install local");
82
+ return lines("Installed plugins", Object.keys(value.packages).map(pluginLabel), "No plugins installed.\nNext: ingestron provider install local");
83
83
  case "source_list":
84
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>");
85
85
  case "source_show":
@@ -1,21 +1,36 @@
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 "azure-blob": {
5
+ readonly kind: "connector";
6
+ readonly repository: "ingestron/connectors";
7
+ readonly path: "connectors/azure-blob/connector.yaml";
8
+ readonly tagPrefix: "azure-blob-";
9
+ };
4
10
  readonly files: {
11
+ readonly kind: "connector";
5
12
  readonly repository: "ingestron/connectors";
6
13
  readonly path: "connectors/files/connector.yaml";
7
14
  readonly tagPrefix: "files-";
8
15
  };
9
16
  readonly github: {
17
+ readonly kind: "connector";
10
18
  readonly repository: "ingestron/connectors";
11
19
  readonly path: "connectors/github/connector.yaml";
12
20
  readonly tagPrefix: "github-";
13
21
  };
14
22
  readonly local: {
23
+ readonly kind: "provider";
15
24
  readonly repository: "ingestron/provider-local";
16
25
  readonly path: "plugin/provider.yaml";
17
26
  readonly tagPrefix: "";
18
27
  };
28
+ readonly "sql-server": {
29
+ readonly kind: "connector";
30
+ readonly repository: "ingestron/connectors";
31
+ readonly path: "connectors/sql-server/connector.yaml";
32
+ readonly tagPrefix: "sql-server-";
33
+ };
19
34
  };
20
35
  export declare function officialName(reference: string): {
21
36
  name: keyof typeof officialPlugins;
@@ -3,21 +3,36 @@ 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
+ "azure-blob": {
7
+ kind: "connector",
8
+ repository: "ingestron/connectors",
9
+ path: "connectors/azure-blob/connector.yaml",
10
+ tagPrefix: "azure-blob-",
11
+ },
6
12
  files: {
13
+ kind: "connector",
7
14
  repository: "ingestron/connectors",
8
15
  path: "connectors/files/connector.yaml",
9
16
  tagPrefix: "files-",
10
17
  },
11
18
  github: {
19
+ kind: "connector",
12
20
  repository: "ingestron/connectors",
13
21
  path: "connectors/github/connector.yaml",
14
22
  tagPrefix: "github-",
15
23
  },
16
24
  local: {
25
+ kind: "provider",
17
26
  repository: "ingestron/provider-local",
18
27
  path: "plugin/provider.yaml",
19
28
  tagPrefix: "",
20
29
  },
30
+ "sql-server": {
31
+ kind: "connector",
32
+ repository: "ingestron/connectors",
33
+ path: "connectors/sql-server/connector.yaml",
34
+ tagPrefix: "sql-server-",
35
+ },
21
36
  };
22
37
  const catalogueUrl = "https://raw.githubusercontent.com/ingestron/connectors/main/catalogue.json";
23
38
  const stable = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;
@@ -29,7 +44,7 @@ export function officialName(reference) {
29
44
  if (reference.includes("/"))
30
45
  return undefined;
31
46
  const [name, version, extra] = reference.split("@");
32
- check(Object.hasOwn(officialPlugins, name), "PACKAGE", `Unknown official plugin '${name}'. Use files, github, local, or an explicit owner/repository reference.`);
47
+ check(Object.hasOwn(officialPlugins, name), "PACKAGE", `Unknown official plugin '${name}'. Use ${Object.keys(officialPlugins).join(", ")}, or an explicit owner/repository reference. Check ingestron --version and update the CLI if a documented name is missing.`);
33
48
  check(extra === undefined &&
34
49
  (version === undefined || version === "latest" || stable.test(version)), "PACKAGE", "Use a stable version, @latest, or omit the version for an official plugin");
35
50
  return { name: name, version };
@@ -97,6 +112,8 @@ export async function resolvePluginArgs(context, operation, args, catalogue = fe
97
112
  if (!alias)
98
113
  return args;
99
114
  const identity = officialPlugins[alias.name];
115
+ if (operation === "packages_install" && args.kind)
116
+ check(args.kind === identity.kind, "PACKAGE", `${alias.name} is a ${identity.kind}; use ingestron ${identity.kind} install ${alias.name}`);
100
117
  check(args.tagPrefix === undefined || args.tagPrefix === identity.tagPrefix, "OPTION", "Official plugin tag prefixes cannot be overridden; use an explicit reference for custom tags");
101
118
  if (operation === "plugin_versions")
102
119
  return {
@@ -1,4 +1,4 @@
1
- import { officialName } from "./plugin-resolution.js";
1
+ import { officialName, officialPlugins } from "./plugin-resolution.js";
2
2
  import { browsePlugins } from "./plugin-browser.js";
3
3
  import * as prompts from "@clack/prompts";
4
4
  import { friendlyReference } from "@ingestron/core/adapter";
@@ -175,14 +175,18 @@ export function workflowCommands(app, host) {
175
175
  .description("Read the durable local run receipt")
176
176
  .action((id) => run("run_status", { id }));
177
177
  // Installation is explicit; browsing only inspects installed packages.
178
- const installProvider = async (reference, options, update = false) => {
178
+ const installPlugin = async (reference, options, update = false, kind) => {
179
+ const names = Object.entries(officialPlugins)
180
+ .filter(([, plugin]) => !kind || plugin.kind === kind)
181
+ .map(([name]) => name);
179
182
  if (!reference) {
180
- check(canPrompt(), "INPUT", "Choose an official plugin: plugin install github or plugin install local; explicit owner/repository@version references also work.");
183
+ check(canPrompt(), "INPUT", `Choose an official ${kind ?? "plugin"}: ${names.join(", ")}; explicit owner/repository@version references also work.`);
181
184
  reference = await answer(prompts.text({
182
- message: "Official plugin name or owner/repository",
183
- validate: (value) => /^(github|local|[\w.-]+\/[\w.-]+)$/.test(value ?? "")
185
+ message: `Official ${kind ?? "plugin"} name or owner/repository`,
186
+ validate: (value) => names.includes(value ?? "") ||
187
+ /^[\w.-]+\/[\w.-]+$/.test(value ?? "")
184
188
  ? undefined
185
- : "Use files, github, local or owner/repository",
189
+ : `Use ${names.join(", ")} or owner/repository`,
186
190
  }));
187
191
  }
188
192
  check(typeof reference === "string", "INPUT", "Choose a plugin reference");
@@ -209,11 +213,12 @@ export function workflowCommands(app, host) {
209
213
  })),
210
214
  }));
211
215
  }
212
- check(typeof reference === "string", "INPUT", "Choose a provider version");
216
+ check(typeof reference === "string", "INPUT", "Choose a package version");
213
217
  officialName(reference);
214
218
  check(!options.name, "OPTION", "Installation no longer configures projects. Use plugin configure <exact-reference> --name <configuration>.");
215
219
  const result = await perform("packages_install", {
216
220
  reference,
221
+ ...(kind ? { kind } : {}),
217
222
  update,
218
223
  frozen: !!options.frozen,
219
224
  ...(options.fromGit ? { fromGit: options.fromGit } : {}),
@@ -223,7 +228,7 @@ export function workflowCommands(app, host) {
223
228
  print(result);
224
229
  return;
225
230
  }
226
- print(result, { reference: result.result.reference });
231
+ print(result, { reference: result.result.reference, kind });
227
232
  };
228
233
  const plugin = app
229
234
  .command("plugin")
@@ -273,7 +278,26 @@ export function workflowCommands(app, host) {
273
278
  .option("--frozen", "Require an existing immutable lock")
274
279
  .option("--name <configuration>", "Removed: use plugin configure --name instead")
275
280
  .option("--cache-only", "Compatibility option; cache-only is now the default")
276
- .action((reference, options) => installProvider(reference, options, update));
281
+ .action((reference, options) => installPlugin(reference, options, update));
282
+ const typedInstall = (group, kind) => {
283
+ for (const update of [false, true])
284
+ group
285
+ .command(`${update ? "update" : "install"} <reference>`)
286
+ .description(`${update ? "Check for a newer" : "Cache and lock a"} ${kind} package without changing project configuration`)
287
+ .option("--from-git <directory>", "Local Git source")
288
+ .option("--tag-prefix <prefix>", "Component tag prefix in a shared repository")
289
+ .option("--frozen", "Require an existing immutable lock")
290
+ .action((reference, options) => installPlugin(reference, options, update, kind));
291
+ group
292
+ .command("list")
293
+ .description(`List installed ${kind} packages`)
294
+ .action(() => run("plugin_browse", { kind }));
295
+ };
296
+ const provider = app.commands.find((c) => c.name() === "provider");
297
+ typedInstall(provider, "provider");
298
+ typedInstall(app
299
+ .command("connector")
300
+ .description("Install and inspect source connectors"), "connector");
277
301
  plugin
278
302
  .command("configure <reference>")
279
303
  .description("Register a cached provider with project configuration")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ingestron",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "type": "module",
5
5
  "description": "Build repeatable data pipelines from reviewed contracts and versioned standards.",
6
6
  "license": "Apache-2.0",
@@ -22,9 +22,25 @@
22
22
  "engines": {
23
23
  "node": ">=22.12.0"
24
24
  },
25
+ "packageManager": "pnpm@10.15.0",
26
+ "scripts": {
27
+ "build": "node scripts/clean-build.mjs && tsc",
28
+ "test": "tsx --test --test-concurrency=1 test/unit/*.test.ts test/providers/*.test.ts test/integration/*.test.ts",
29
+ "format": "prettier --write .",
30
+ "format:check": "prettier --check .",
31
+ "secrets:check": "node scripts/secrets.mjs",
32
+ "validate": "pnpm format:check && pnpm build && pnpm test && pnpm examples:check && pnpm secrets:check && pnpm docs:check && pnpm release:check && pnpm package:check",
33
+ "prepack": "pnpm build",
34
+ "package:check": "tsx scripts/package-check.ts",
35
+ "release:check": "node scripts/release-check.mjs",
36
+ "prepublishOnly": "node scripts/release-check.mjs --publish",
37
+ "docs:check": "node scripts/docs-check.mjs",
38
+ "examples:check": "node examples/quickstart.mjs",
39
+ "licences:inventory": "node scripts/licence-inventory.mjs"
40
+ },
25
41
  "dependencies": {
26
42
  "@clack/prompts": "1.7.0",
27
- "@ingestron/core": "0.12.1",
43
+ "@ingestron/core": "0.12.2",
28
44
  "@modelcontextprotocol/sdk": "1.30.0",
29
45
  "commander": "15.0.0",
30
46
  "yaml": "2.9.0"
@@ -56,18 +72,5 @@
56
72
  "cli",
57
73
  "mcp",
58
74
  "code-generation"
59
- ],
60
- "scripts": {
61
- "build": "node scripts/clean-build.mjs && tsc",
62
- "test": "tsx --test --test-concurrency=1 test/unit/*.test.ts test/providers/*.test.ts test/integration/*.test.ts",
63
- "format": "prettier --write .",
64
- "format:check": "prettier --check .",
65
- "secrets:check": "node scripts/secrets.mjs",
66
- "validate": "pnpm format:check && pnpm build && pnpm test && pnpm examples:check && pnpm secrets:check && pnpm docs:check && pnpm release:check && pnpm package:check",
67
- "package:check": "tsx scripts/package-check.ts",
68
- "release:check": "node scripts/release-check.mjs",
69
- "docs:check": "node scripts/docs-check.mjs",
70
- "examples:check": "node examples/quickstart.mjs",
71
- "licences:inventory": "node scripts/licence-inventory.mjs"
72
- }
73
- }
75
+ ]
76
+ }