@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.
- package/README.md +66 -32
- package/dist/app_commands.d.ts +9 -4
- package/dist/app_commands.js +44 -10
- package/dist/app_commands.test.js +69 -0
- package/dist/args.d.ts +19 -5
- package/dist/args.js +36 -14
- package/dist/args.test.js +25 -17
- package/dist/cli.js +214 -215
- package/dist/cli_dispatch.test.js +77 -25
- package/dist/client.d.ts +240 -170
- package/dist/client.js +122 -111
- package/dist/generate_package_fields.d.ts +39 -38
- package/dist/generate_package_fields.js +113 -60
- package/dist/generate_package_fields.test.js +30 -22
- package/dist/package_commands.d.ts +148 -204
- package/dist/package_commands.js +586 -828
- package/dist/package_commands.test.js +99 -226
- package/dist/src/cli.js +18680 -2572
- package/dist/starter_template.d.ts +0 -19
- package/dist/starter_template.js +0 -389
- package/dist/starter_template.test.js +1 -69
- package/package.json +1 -1
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
2
|
import { generatePackageAppFields } from "./generate_package_fields.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
roles:
|
|
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
|
|
21
|
-
const src = generatePackageAppFields(
|
|
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
|
|
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
|
|
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("
|
|
49
|
-
|
|
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
|
|
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
|
-
* 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
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
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[]):
|
|
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 +
|
|
171
|
-
* removals; refuses (exit 1, with
|
|
172
|
-
* binding drift
|
|
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
|
-
|
|
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
|
|
208
|
-
*
|
|
209
|
-
*
|
|
210
|
-
|
|
211
|
-
|
|
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
|
|
220
|
-
|
|
157
|
+
export declare function appUnpublish(client: LoticsClient, args: {
|
|
158
|
+
id: string;
|
|
221
159
|
undo: boolean;
|
|
222
160
|
}): Promise<void>;
|
|
223
161
|
/**
|
|
224
|
-
* `lotics
|
|
225
|
-
* package
|
|
226
|
-
*
|
|
227
|
-
*
|
|
228
|
-
*
|
|
229
|
-
*
|
|
230
|
-
*
|
|
231
|
-
*
|
|
232
|
-
*
|
|
233
|
-
*
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
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
|
|
241
|
-
*
|
|
242
|
-
*
|
|
243
|
-
*
|
|
244
|
-
*
|
|
245
|
-
*
|
|
246
|
-
*
|
|
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
|
|
249
|
-
app_id
|
|
250
|
-
|
|
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 {};
|