@lotics/cli 0.76.0 → 0.83.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.
@@ -1,24 +1,24 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import { generatePackageAppFields } from "./generate_package_fields.js";
3
- const contract = {
4
- entities: [
5
- {
6
- alias: "tasks",
7
- fields: [
8
- { alias: "title" },
9
- {
10
- alias: "status",
11
- options: [{ alias: "to_do" }, { alias: "doing" }, { alias: "done" }],
12
- },
13
- ],
14
- },
15
- { alias: "projects", fields: [{ alias: "name" }] },
16
- ],
17
- roles: [{ alias: "approver" }],
3
+ // A live installation binding — fully-qualified alias → concrete id. The
4
+ // generator sources the alias SET here (never a contract file); the emitted
5
+ // module resolves the SAME keys through `getAppBinding()` at runtime.
6
+ const binding = {
7
+ fields: {
8
+ "tasks.title": "fld_title",
9
+ "tasks.status": "fld_status",
10
+ "projects.name": "fld_name",
11
+ },
12
+ options: {
13
+ "tasks.status:to_do": "opt_todo",
14
+ "tasks.status:doing": "opt_doing",
15
+ "tasks.status:done": "opt_done",
16
+ },
17
+ roles: { approver: "grp_approver" },
18
18
  };
19
19
  describe("generatePackageAppFields", () => {
20
- it("emits runtime-resolved F/OPT/ROLE keyed by contract aliases", () => {
21
- const src = generatePackageAppFields(contract);
20
+ it("emits runtime-resolved F/OPT/ROLE keyed by the binding's aliases", () => {
21
+ const src = generatePackageAppFields(binding);
22
22
  // Resolves through the SDK binding at module load (top-level await).
23
23
  expect(src).toContain('import { getAppBinding } from "@lotics/app-sdk";');
24
24
  expect(src).toContain("const binding = await getAppBinding();");
@@ -31,21 +31,29 @@ describe("generatePackageAppFields", () => {
31
31
  expect(src).toContain('to_do: bound(binding.options, "tasks.status:to_do", "option")');
32
32
  expect(src).toContain('done: bound(binding.options, "tasks.status:done", "option")');
33
33
  expect(src).not.toContain('"tasks.title:');
34
- // ROLE map from contract roles.
34
+ // ROLE map from the binding's roles.
35
35
  expect(src).toContain('approver: bound(binding.roles, "approver", "role")');
36
36
  // No concrete id in any VALUE position — the module is workspace-agnostic.
37
37
  // (Doc comments legitimately name the id prefixes, so match quoted ids.)
38
38
  expect(src).not.toMatch(/"(fld|opt|tbl|grp)_/);
39
39
  });
40
- it("emits valid empty maps for an empty contract", () => {
41
- const src = generatePackageAppFields({});
40
+ it("emits valid empty maps for an empty binding", () => {
41
+ const src = generatePackageAppFields({ fields: {}, options: {}, roles: {} });
42
42
  expect(src).toContain("export const F = {} as const;");
43
43
  expect(src).toContain("export const OPT = {} as const;");
44
44
  expect(src).toContain("export const ROLE = {} as const;");
45
45
  // Still imports the SDK so the module shape is uniform.
46
46
  expect(src).toContain("const binding = await getAppBinding();");
47
47
  });
48
- it("is deterministic same contract, same bytes", () => {
49
- expect(generatePackageAppFields(contract)).toBe(generatePackageAppFields(contract));
48
+ it("quotes an alias that is not a valid identifier", () => {
49
+ const src = generatePackageAppFields({
50
+ fields: { "tasks.2nd_field": "fld_x" },
51
+ options: {},
52
+ roles: {},
53
+ });
54
+ expect(src).toContain('"2nd_field": bound(binding.fields, "tasks.2nd_field", "field")');
55
+ });
56
+ it("is deterministic — same binding, same bytes", () => {
57
+ expect(generatePackageAppFields(binding)).toBe(generatePackageAppFields(binding));
50
58
  });
51
59
  });
@@ -1,164 +1,46 @@
1
- import { LoticsClient, type PackageBinding, type ExtractFinding } from "./client.js";
2
- /** One dev workspace's pinned installation of this package (manifest bookkeeping). */
3
- interface PackageDevInstallation {
4
- app_id: string;
5
- version: number;
6
- }
7
- /**
8
- * The `package.json#lotics.package` block of a package project. `id` is null
9
- * until the first publish (which creates the registry package); `version` tracks
10
- * the latest version this project has published; `dev` maps a dev workspace id to
11
- * the installation it scaffold-syncs into.
12
- */
13
- interface PackageManifest {
14
- id: string | null;
15
- name: string;
16
- description: string | null;
17
- version: number | null;
18
- dev: Record<string, PackageDevInstallation>;
19
- }
20
- interface PackageProjectFile {
21
- /** Parsed package.json, carrying the `lotics.package` manifest under `lotics`. */
22
- pkgJson: Record<string, unknown>;
23
- manifest: PackageManifest;
24
- }
25
- /** Read the package project's manifest, failing loud when the dir isn't one. */
26
- export declare function readPackageProject(projectDir: string): PackageProjectFile;
27
- /** Persist an updated manifest back into the project's package.json (atomic write). */
28
- export declare function writePackageManifest(projectDir: string, project: PackageProjectFile): void;
29
- /**
30
- * The package.json to ship INSIDE `source.tar.gz`: the on-disk manifest with the
31
- * author-local `lotics.package.dev` map stripped. `dev` is the author's private
32
- * dev-workspace → installation bookkeeping; it must never reach a consumer (every
33
- * install carries the source, and `lotics app pull` ejects it). Returns a
34
- * sanitized copy — the on-disk package.json is left untouched. `id`/`name`/
35
- * `description`/`version` are the package's stable identity and stay.
36
- */
37
- export declare function sanitizePackageJsonForSource(pkgJson: Record<string, unknown>): Record<string, unknown>;
38
- /**
39
- * Transform an app project's package.json (the source archive `lotics app pull`
40
- * downloads, carrying the `lotics.app_id`/`workspace_id` app manifest) into a
41
- * package project's `PackageProjectFile`: the app manifest is stripped ENTIRELY
42
- * and a fresh, unpublished `lotics.package` manifest (id/version null) is
43
- * grafted. Pure — returns a new value, never mutates the input;
44
- * `writePackageManifest` writes it (atomic). The bespoke→package promotion's
45
- * manifest inversion.
46
- */
47
- export declare function draftPackageProjectFromApp(appPkgJson: Record<string, unknown>, args: {
48
- name: string;
49
- description: string | null;
50
- }): PackageProjectFile;
51
- /**
52
- * Parse + validate `.lotics/adopt_binding.json` against the app being adopted.
53
- * REFUSES a pin recorded for a different app: a binding maps ONE workspace's
54
- * concrete ids, so replaying it onto another app would bind the wrong objects.
55
- * Pure; the CLI never interprets the binding, only round-trips it to the server.
56
- */
57
- export declare function parseAdoptBindingFile(raw: unknown, expectedAppId: string): {
58
- app_id: string;
59
- workspace_id: string;
60
- binding: PackageBinding;
61
- };
62
- /**
63
- * Render an extraction report grouped by severity (errors, then warnings, then
64
- * info), one ` [<severity>] <area>: <message>` line each, and classify whether
65
- * any `error` finding is present. An `error` ⇒ the draft is not publishable
66
- * as-is, so `lotics package extract` exits non-zero. Pure — the command prints
67
- * `lines` to stderr and gates on `hasError`.
1
+ import { LoticsClient, type ExtractFinding } from "./client.js";
2
+ import { type UpgradeResolutions } from "@lotics/shared/schemas/packages";
3
+ /**
4
+ * Read the local APP project's manifest (`package.json#lotics.app_id` +
5
+ * `lotics.knowledge`) — what `lotics app pull` writes. `lotics app publish` /
6
+ * `release` run from a pulled app project resolve the app id from it, and
7
+ * `publish` forwards the package-managed knowledge declaration to the server
8
+ * (agents reference docs by free text, so the author declares which the package
9
+ * owns). Returns null when the dir has no package.json. `app_id` is null when the
10
+ * manifest is a package/non-app project.
11
+ */
12
+ export declare function readLocalAppManifest(projectDir: string): {
13
+ app_id: string | null;
14
+ knowledge: Array<{
15
+ alias: string;
16
+ doc_id: string;
17
+ }>;
18
+ } | null;
19
+ /** Parse repeated `--rename old=new` flags into `{ from, to }[]` (first-publish alias fixes). */
20
+ export declare function parseRenameFlags(renames: string[]): Array<{
21
+ from: string;
22
+ to: string;
23
+ }>;
24
+ /**
25
+ * Render a package-extract report grouped by severity (errors, then warnings,
26
+ * then info), one ` [<severity>] <area>: <message>` line each, and classify
27
+ * whether any `error` finding is present. Shared by the release preview display.
28
+ * Pure the command prints `lines` to stderr and gates on `hasError`.
68
29
  */
69
30
  export declare function formatExtractReport(report: ExtractFinding[]): {
70
31
  lines: string[];
71
32
  hasError: boolean;
72
33
  };
73
34
  /**
74
- * Copy the project's source tree into `sourceStage` with explicit TOP-LEVEL
75
- * excludes, writing a sanitized `package.json` in place of the on-disk one.
76
- * Deliberately not tar `--exclude` flags: those match at any depth (a nested
77
- * `templates/dist/` would be silently dropped) and GNU tar vs bsdtar (macOS)
78
- * disagree on `./`-prefixed patterns, which broke the sanitized-package.json
79
- * graft on macOS.
80
- */
81
- export declare function stagePackageSource(projectDir: string, sourceStage: string): void;
82
- /** The minimal, valid starting contract a `package new` scaffold ships. */
83
- export declare function starterContract(name: string): Record<string, unknown>;
84
- /**
85
- * `lotics package new <name> [path]` — scaffold a package project. Reuses the
86
- * app starter (Vite+React+TS) for the code surface, swaps its app manifest for a
87
- * package manifest, and adds a starter `contract.json`. The project publishes
88
- * with `lotics package publish` and runs against a dev workspace with
89
- * `lotics package dev`.
90
- */
91
- export declare function packageNew(args: {
92
- name: string;
93
- targetPath?: string;
94
- }): Promise<void>;
95
- /**
96
- * `lotics package build [path]` — build the publishable bundle and write it to
97
- * `bundle.tar.gz` in the project. Mostly a local sanity check / CI artifact;
98
- * `publish` and `dev`/`sync` build the bundle in memory directly.
99
- */
100
- export declare function packageBuild(args: {
101
- projectDir?: string;
102
- }): Promise<void>;
103
- /**
104
- * `lotics package publish [path] [-m <changelog>]` — publish a new version.
105
- */
106
- export declare function packagePublish(client: LoticsClient, args: {
107
- projectDir?: string;
108
- changelog?: string;
109
- }): Promise<void>;
110
- /**
111
- * Fail loud unless `workspace` is a throwaway dev workspace. The dev/sync
112
- * scaffold path publishes a new version and scaffold-installs package tables into
113
- * the resolved workspace, so the target MUST be a dev workspace — this mirrors
114
- * the server-side `package reset` gate so a forgotten `--workspace` (prod
115
- * selected) can never scaffold package tables into prod. Fails closed: an absent
116
- * `is_dev` (a server that doesn't yet serialize it) is treated as non-dev.
117
- */
118
- export declare function assertDevWorkspace(workspace: {
119
- id: string;
120
- name: string;
121
- is_dev?: boolean;
122
- }): void;
123
- /**
124
- * `lotics package sync [path]` — re-run the scaffold-sync into the dev workspace
125
- * (the continuous loop: edit contract → sync additively migrates + re-materializes).
126
- */
127
- export declare function packageSync(client: LoticsClient, args: {
128
- projectDir?: string;
129
- }): Promise<void>;
130
- /**
131
- * `lotics package dev [path] [--workspace <dev_ws>] [--view-as <member>]` —
132
- * scaffold-sync the package into the dev workspace, then run the existing app
133
- * dev server against the resulting installation (HMR over the local source, RPC
134
- * forwarded to the live installation). The inner loop: edit contract → re-run to
135
- * sync; edit code → hot reload.
136
- */
137
- export declare function packageDev(client: LoticsClient, args: {
138
- projectDir?: string;
139
- port?: number;
140
- vitePort?: number;
141
- }): Promise<void>;
142
- /**
143
- * `lotics package reset [path]` — DEV-ONLY, hard-gated. Drops the dev
144
- * installation's package-owned scaffolded tables and re-scaffolds them clean. The
145
- * backend refuses any workspace not flagged as a dev workspace, so this can never
146
- * erase a real workspace's data. The dev installation is resolved from the
147
- * project manifest's pin for the selected workspace.
148
- */
149
- export declare function packageReset(client: LoticsClient, args: {
150
- projectDir?: string;
151
- }): Promise<void>;
152
- export type UpgradeResolutionValue = "recreate" | "revert" | "keep" | {
153
- bind_to: string;
154
- };
155
- /**
156
- * Parse repeated `--resolve <key>=<value>` flags. Drift entries
157
- * (`<namespace>.<alias>`) take `recreate` or an existing id; modified
158
- * artifacts (`<kind>.<alias>`) take `revert` or `keep`. Any other value is a
159
- * bind_to id; the server validates value-kind against what the key resolves.
35
+ * Parse repeated `--resolve <key>=<value>` flags into the ONE namespaced
36
+ * resolutions map every upgrade wire takes. Keys pass through verbatim a
37
+ * drifted binding entry (`<namespace>.<alias>`), a modified artifact
38
+ * (`<kind>.<alias>`), a bundled/standalone knowledge doc (`knowledge.<alias>`),
39
+ * or a live-role re-point (`roles.<alias>`). A value that is one of the
40
+ * resolution verbs stays a verb; anything else is a `{ bind_to }` id. The
41
+ * server validates value-kind against what each key resolves.
160
42
  */
161
- export declare function parseResolveFlags(resolve: string[]): Record<string, UpgradeResolutionValue>;
43
+ export declare function parseResolveFlags(resolve: string[]): UpgradeResolutions;
162
44
  /**
163
45
  * Health check: version pin vs. registry latest + binding drift. Exits
164
46
  * non-zero when drift is found so scripts can gate on it.
@@ -167,28 +49,90 @@ export declare function packageDoctor(client: LoticsClient, args: {
167
49
  app_id?: string;
168
50
  }): Promise<void>;
169
51
  /**
170
- * Preview-then-apply upgrade. Prints the additive plan + informational
171
- * removals; refuses (exit 1, with the exact --resolve syntax) while any
172
- * binding drift lacks a resolution.
52
+ * Preview-then-apply an app-installation upgrade. Prints the additive plan +
53
+ * informational removals + any bundled-knowledge changes; refuses (exit 1, with
54
+ * the exact --resolve syntax) while any binding drift, modified core artifact, or
55
+ * consent-requiring bundled-knowledge doc lacks a resolution.
56
+ *
57
+ * `--resolve` speaks ONE namespaced grammar, passed to the server verbatim: a
58
+ * drifted binding entry (`<namespace>.<alias>`), a modified artifact
59
+ * (`<kind>.<alias>`), a bundled knowledge doc (`knowledge.<alias>` —
60
+ * apply|keep|archive|recreate|unbind), or a live-role re-point
61
+ * (`roles.<alias>=<grp_id>`). `--bind-to` consents an added-knowledge-doc name
62
+ * collision; `--apply-all` accepts the package's version for every
63
+ * consent-requiring knowledge doc (overwriting local edits).
173
64
  */
174
65
  export declare function packageUpgrade(client: LoticsClient, args: {
175
66
  app_id: string;
176
67
  version?: number;
177
- resolutions: Record<string, UpgradeResolutionValue>;
68
+ resolve: string[];
69
+ bindTo: string[];
70
+ applyAll: boolean;
178
71
  }): Promise<void>;
179
72
  /**
180
73
  * `lotics package show <package_id>` — registry metadata + version history
181
74
  * (trust badge, retirement, per-version channel/yank/changelog). The read
182
- * surface for "what is this package and what shipped when".
75
+ * surface for "what is this package and what shipped when". Kind-agnostic — a
76
+ * content package shows here the same way.
183
77
  */
184
78
  export declare function packageShow(client: LoticsClient, args: {
185
79
  package_id: string;
186
80
  }): Promise<void>;
81
+ /**
82
+ * Preview-then-apply a STANDALONE content installation upgrade — knowledge docs
83
+ * AND document templates behind one review gate. Prints the per-alias plan;
84
+ * refuses (exit 1, with the exact `--resolve` syntax) while any consent-requiring
85
+ * entry lacks a resolution — a modified knowledge change/removal or drift, or a
86
+ * locally-edited changed template. `--apply-all` auto-resolves EVERY consent entry
87
+ * by accepting the package's version (knowledge changed→apply, removed→archive,
88
+ * drifted→recreate; template→revert) — an explicit bulk "take upstream" that
89
+ * discards local edits. `--resolve knowledge.<alias>=<value>` /
90
+ * `--resolve template.<alias>=revert|keep` and `--bind-to <alias>=<kdc_id>`
91
+ * resolve entries individually — the ONE namespaced grammar, passed to the
92
+ * server verbatim.
93
+ */
94
+ export declare function packageUpgradeKnowledge(client: LoticsClient, args: {
95
+ installation_id: string;
96
+ version?: number;
97
+ /** Raw `--resolve <alias>=<value>` flags, routed to knowledge/templates after the preview. */
98
+ resolve: string[];
99
+ bind_to: Record<string, string>;
100
+ applyAll: boolean;
101
+ }): Promise<void>;
102
+ /** Parse repeated `--bind-to alias=kdc_id` flags into an alias → doc-id consent map. */
103
+ export declare function parseBindToFlags(bindTo: string[]): Record<string, string>;
187
104
  export declare function packageInstall(client: LoticsClient, args: {
188
105
  package_id: string;
189
106
  version?: number;
107
+ /** Content-kind only: adopt a same-named workspace doc on a knowledge collision. */
108
+ bind_to?: Record<string, string>;
109
+ /** App-kind only: per-knob config overrides applied over the contract defaults. */
190
110
  config?: Record<string, string | number | boolean>;
191
111
  }): Promise<void>;
112
+ /**
113
+ * `lotics uninstall <app_id|pci_id>` — ONE top-level command over both installation
114
+ * kinds, dispatched by the id form (mirrors `lotics upgrade`):
115
+ * - a `pci_` id → a STANDALONE CONTENT installation: deletes the row and (unless
116
+ * `--keep-content`) archives its package-bound docs AND templates, listing each
117
+ * archived id.
118
+ * - anything else (an `app_id`) → an APP installation: archives its workflow
119
+ * artifacts and — with `--archive-tables` — the scaffolded entity tables
120
+ * (provenance- + reference-gated server-side).
121
+ * A flag used on the wrong path is a loud error, never silently ignored.
122
+ */
123
+ export declare function packageUninstall(client: LoticsClient, args: {
124
+ id: string;
125
+ keep_content: boolean;
126
+ archive_tables: boolean;
127
+ }): Promise<void>;
128
+ /**
129
+ * `lotics package list-content` — list the selected workspace's STANDALONE
130
+ * content installations (an app-bundled corpus rides its app's
131
+ * `binding.knowledge` and shows on the Apps surface instead), each with its
132
+ * registry status. The read surface that surfaces a `pci_` id for
133
+ * `upgrade` / `uninstall` (install prints it once; nothing else did before).
134
+ */
135
+ export declare function packageListContent(client: LoticsClient): Promise<void>;
192
136
  export declare function packageEject(client: LoticsClient, args: {
193
137
  app_id: string;
194
138
  }): Promise<void>;
@@ -204,59 +148,53 @@ export declare function packageConfig(client: LoticsClient, args: {
204
148
  sets: string[];
205
149
  }): Promise<void>;
206
150
  /**
207
- * `lotics package uninstall <app_id> [--archive-tables]` — remove a package
208
- * installation. Prints what will be archived (workflow artifacts, plus the
209
- * scaffolded tables when the flag is set), then uninstalls.
210
- */
211
- export declare function packageUninstall(client: LoticsClient, args: {
212
- app_id: string;
213
- archive_tables: boolean;
214
- }): Promise<void>;
215
- /**
216
- * `lotics package retire <package_id> [--undo]` — retire (or un-retire) a
217
- * registry package. Owner-org admin-only.
151
+ * `lotics app unpublish <app_id|package_id> [--undo]` — take a published package
152
+ * off the shelf (or `--undo` restore it): new installs refuse it and it hides
153
+ * from other orgs, while existing installations keep working and may still
154
+ * upgrade. Given an app id (an installation of the package) it resolves the
155
+ * package from the app; a package id targets it directly. Owner-org admin-only.
218
156
  */
219
- export declare function packageRetire(client: LoticsClient, args: {
220
- package_id: string;
157
+ export declare function appUnpublish(client: LoticsClient, args: {
158
+ id: string;
221
159
  undo: boolean;
222
160
  }): Promise<void>;
223
161
  /**
224
- * `lotics package extract <app_id> [path]` promote a bespoke app to a DRAFT
225
- * package project (docs/app_packages.md § Promotion). Calls the extract read,
226
- * prints the findings report grouped by severity, then ALWAYS emits the draft
227
- * project (a broken contract is still the reviewable starting point): the app's
228
- * current source archive (same mechanics as `lotics app pull`) with the app
229
- * manifest swapped for an unpublished package manifest, `contract.json`, the
230
- * file-backed templates staged at their `bytes_ref` paths, and
231
- * `.lotics/adopt_binding.json` (the origin pin the `adopt` step reads back).
232
- * Exits non-zero when any `error` finding exists the draft is written, but
233
- * publish re-validates and nothing should ship unreviewed.
234
- */
235
- export declare function packageExtract(client: LoticsClient, args: {
236
- app_id: string;
237
- targetPath?: string;
162
+ * `lotics app publish [app_id|.] [--rename old=new ...] [-m <changelog>] [--yes]`
163
+ * FIRST-RELEASE a bespoke app as a package (docs/packages.md § Promotion). Nothing
164
+ * starts as a package. Mirrors `app release`'s preview→apply UX: it first shows the
165
+ * dry-run preview (GET, no writes) the package name, the auto-minted RENAMABLE
166
+ * aliases (the exact `--rename` keys, so v1's frozen aliases are inspected first,
167
+ * never a blind publish), and the extract findings — then APPLIES only with
168
+ * `--yes` (else exits 1 with the re-run hint). On apply the server extracts the
169
+ * contract, creates the registry package, publishes v1 from the DEPLOYED source +
170
+ * dist, and pins the origin as installation #1. `--rename old=new` fixes an
171
+ * auto-minted alias before v1 freezes it; an `error` finding blocks the apply. An
172
+ * already-linked app releases with `lotics app release` instead. The app id is the
173
+ * positional (`.`/omitted resolved from the local app project manifest).
174
+ */
175
+ export declare function appPublish(client: LoticsClient, args: {
176
+ app_id?: string;
177
+ renames: string[];
178
+ changelog?: string;
179
+ yes: boolean;
180
+ projectDir?: string;
238
181
  }): Promise<void>;
239
182
  /**
240
- * `lotics package adopt <app_id> [path]` — bind the published package project
241
- * onto the origin app (docs/app_packages.md § Promotion). Reads the project
242
- * manifest (must be published refuses otherwise), resolves the version
243
- * (`--version N` else the manifest's), and reads `.lotics/adopt_binding.json`,
244
- * REFUSING a pin recorded for a different app. On success the app becomes
245
- * installation #1 and is upgradeable again; a server ConflictError (naming the
246
- * unfaithful aliases) surfaces verbatim.
183
+ * `lotics app release [app_id|.] -m <changelog> [--yes]` — snapshot an
184
+ * adopted/installed origin app into its next registry version (docs/packages.md
185
+ * § Promotion). The origin is the permanent working copy; a release binding-aware-
186
+ * extracts it (stable aliases), repackages its DEPLOYED source + dist as the
187
+ * bundle, publishes the next version, and re-pins the origin. Prints the preview
188
+ * first (next version, new + changed aliases, findings); applies only with
189
+ * `--yes`, else exits 1 so a review step can't be skipped. An `error` finding
190
+ * blocks the apply.
247
191
  */
248
- export declare function packageAdopt(client: LoticsClient, args: {
249
- app_id: string;
250
- version?: number;
192
+ export declare function appRelease(client: LoticsClient, args: {
193
+ app_id?: string;
194
+ changelog: string;
195
+ yes: boolean;
251
196
  projectDir?: string;
252
197
  }): Promise<void>;
253
- /**
254
- * `lotics package fleet-upgrade <package_id> [--version N]` — bring every
255
- * installation of the package across the caller's org to the target version.
256
- * Hands-off applies only where the preview is clean; skipped/failed
257
- * installations are reported per line and the process exits 1 so a release
258
- * script can gate on "fleet fully current".
259
- */
260
198
  /**
261
199
  * `lotics package yank <package_id> <version> [--undo]` — mark a published
262
200
  * version uninstallable (or restore it). New installs/upgrades/adopts refuse a
@@ -268,8 +206,14 @@ export declare function packageYank(client: LoticsClient, args: {
268
206
  version: number;
269
207
  undo: boolean;
270
208
  }): Promise<void>;
209
+ /**
210
+ * `lotics upgrade <package_id> [--version N]` (fleet path) — bring every
211
+ * installation of the package across the caller's org to the target version.
212
+ * Hands-off applies only where the preview is clean; skipped/failed
213
+ * installations are reported per line and the process exits 1 so a release
214
+ * script can gate on "fleet fully current".
215
+ */
271
216
  export declare function packageFleetUpgrade(client: LoticsClient, args: {
272
217
  package_id: string;
273
218
  version?: number;
274
219
  }): Promise<void>;
275
- export {};