@withandeo/cli 0.19.11 → 0.19.12

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.
@@ -0,0 +1,3 @@
1
+ export declare function atomicJson(path: string, value: unknown): Promise<void>;
2
+ export declare function withUpdateLock<T>(path: string, action: () => Promise<T>): Promise<T>;
3
+ //# sourceMappingURL=update-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-storage.d.ts","sourceRoot":"","sources":["../src/update-storage.ts"],"names":[],"mappings":"AAKA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAO5E;AAID,wBAAsB,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAsB1F"}
@@ -0,0 +1,69 @@
1
+ import { lstat, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+ import { CliError } from "./errors.js";
5
+ export async function atomicJson(path, value) {
6
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
7
+ const temporary = `${path}.${randomUUID()}.tmp`;
8
+ try {
9
+ await writeFile(temporary, `${JSON.stringify(value, null, 2)}\n`, { mode: 0o600, flag: "wx" });
10
+ await rename(temporary, path);
11
+ }
12
+ finally {
13
+ await rm(temporary, { force: true });
14
+ }
15
+ }
16
+ // A dead process may leave a lock. Reclaim only locks whose recorded process
17
+ // definitely no longer exists, never a live installer or a malformed lock.
18
+ export async function withUpdateLock(path, action) {
19
+ await mkdir(dirname(path), { recursive: true });
20
+ try {
21
+ await mkdir(path);
22
+ }
23
+ catch (error) {
24
+ if (error.code !== "EEXIST")
25
+ throw error;
26
+ const recovery = `${path}.recovery`;
27
+ try {
28
+ await mkdir(recovery);
29
+ }
30
+ catch {
31
+ throw busy();
32
+ }
33
+ try {
34
+ const info = await lstat(path);
35
+ if (info.isSymbolicLink() || !info.isDirectory())
36
+ throw busy();
37
+ const pid = Number(await readFile(`${path}/pid`, "utf8").catch(() => ""));
38
+ if (!Number.isSafeInteger(pid) || pid <= 0)
39
+ throw busy();
40
+ try {
41
+ process.kill(pid, 0);
42
+ throw busy();
43
+ }
44
+ catch (failure) {
45
+ if (failure.code !== "ESRCH")
46
+ throw failure;
47
+ }
48
+ await rm(path, { recursive: true });
49
+ try {
50
+ await mkdir(path);
51
+ }
52
+ catch {
53
+ throw busy();
54
+ }
55
+ }
56
+ finally {
57
+ await rm(recovery, { recursive: true, force: true });
58
+ }
59
+ }
60
+ try {
61
+ await writeFile(`${path}/pid`, String(process.pid), { flag: "wx", mode: 0o600 });
62
+ return await action();
63
+ }
64
+ finally {
65
+ await rm(path, { recursive: true, force: true });
66
+ }
67
+ }
68
+ function busy() { return new CliError("update_busy", "Another Andeo update is in progress. Retry after it finishes."); }
69
+ //# sourceMappingURL=update-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-storage.js","sourceRoot":"","sources":["../src/update-storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ export declare const CLI_PACKAGE_DIRECTORY: string;
2
+ type Manager = "npm" | "pnpm" | "yarn";
3
+ export type UpdateRunner = (command: string, args: string[], cwd: string, environment: NodeJS.ProcessEnv) => Promise<string>;
4
+ export declare const runUpdateCommand: UpdateRunner;
5
+ export interface UpdateRuntime {
6
+ version: string;
7
+ homeDirectory: string;
8
+ cwd: string;
9
+ environment: NodeJS.ProcessEnv;
10
+ packageDirectory: string;
11
+ fetcher: typeof fetch;
12
+ runner: UpdateRunner;
13
+ now(): number;
14
+ notify(message: string): void;
15
+ }
16
+ export declare function defaultUpdateRuntime(version: string): UpdateRuntime;
17
+ export declare function configureAutoUpgrade(action: string, runtime: UpdateRuntime): Promise<{
18
+ enabled: boolean;
19
+ cadence: string;
20
+ automaticRange: string;
21
+ scope: string;
22
+ skillSync: string;
23
+ lastCheck: number | null;
24
+ }>;
25
+ export declare function detectGlobalInstallation(runtime: UpdateRuntime): Promise<{
26
+ manager: Manager;
27
+ root: string;
28
+ } | null>;
29
+ interface Release {
30
+ version: string;
31
+ engines?: {
32
+ node?: string;
33
+ };
34
+ dist?: {
35
+ tarball: string;
36
+ integrity: string;
37
+ };
38
+ }
39
+ export declare function automaticRelease(current: string, available: Release[]): Release | undefined;
40
+ export declare function upgradeCli(runtime: UpdateRuntime): Promise<{
41
+ status: string;
42
+ previousVersion: string;
43
+ version: string;
44
+ manager: Manager;
45
+ message: string;
46
+ } | {
47
+ status: string;
48
+ version: string;
49
+ }>;
50
+ export declare function maintainCli(argv: string[], runtime: UpdateRuntime): Promise<void>;
51
+ export {};
52
+ //# sourceMappingURL=updates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updates.d.ts","sourceRoot":"","sources":["../src/updates.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,qBAAqB,QAAiD,CAAC;AACpF,KAAK,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AACvC,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAI7H,eAAO,MAAM,gBAAgB,EAAE,YAM7B,CAAC;AAEH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,OAAO,KAAK,CAAC;IACtB,MAAM,EAAE,YAAY,CAAC;IACrB,GAAG,IAAI,MAAM,CAAC;IACd,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAInE;AAgBD,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa;;;;;;;GAYhF;AAQD,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAoBzH;AAED,UAAU,OAAO;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE;AAmCjH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,GAAG,SAAS,CAO3F;AA2DD,wBAAsB,UAAU,CAAC,OAAO,EAAE,aAAa;;;;;;;;;GAStD;AAID,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CvF"}
@@ -0,0 +1,297 @@
1
+ import { execFile } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { lstat, mkdir, mkdtemp, readFile, realpath, rename, rm, writeFile } from "node:fs/promises";
4
+ import { homedir } from "node:os";
5
+ import { isAbsolute, join, resolve } from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+ import semver from "semver";
8
+ import { CliError } from "./errors.js";
9
+ import { syncDocumentation } from "./documentation.js";
10
+ import { atomicJson, withUpdateLock } from "./update-storage.js";
11
+ const PACKAGE = "@withandeo/cli";
12
+ const REGISTRY_ORIGIN = "https://registry.npmjs.org";
13
+ const REGISTRY = `${REGISTRY_ORIGIN}/@withandeo%2fcli`;
14
+ const MAX_ARCHIVE_BYTES = 64 * 1024 * 1024;
15
+ const DAY = 24 * 60 * 60 * 1000;
16
+ export const CLI_PACKAGE_DIRECTORY = fileURLToPath(new URL("../", import.meta.url));
17
+ // No shell, no elevation, bounded output and runtime. Child output never enters
18
+ // CLI stdout or exposes package-manager configuration/credentials on failure.
19
+ export const runUpdateCommand = (command, args, cwd, environment) => new Promise((accept, reject) => {
20
+ const installing = args[0] === "install" || args[0] === "global" && args[1] === "add";
21
+ execFile(command, args, { cwd, env: environment, timeout: installing ? 60_000 : 3000, maxBuffer: 1024 * 1024 }, (error, stdout) => {
22
+ if (error)
23
+ reject(new CliError("cli_upgrade_failed", "The package-manager command failed or timed out. Retry andeo upgrade, or update using your package manager."));
24
+ else
25
+ accept(stdout.trim());
26
+ });
27
+ });
28
+ export function defaultUpdateRuntime(version) {
29
+ return { version, homeDirectory: homedir(), cwd: process.cwd(), environment: process.env,
30
+ packageDirectory: CLI_PACKAGE_DIRECTORY, fetcher: fetch, runner: runUpdateCommand,
31
+ now: Date.now, notify: message => { process.stderr.write(`${message}\n`); } };
32
+ }
33
+ function directory(runtime) { return resolve(runtime.homeDirectory, ".config/andeo/updates"); }
34
+ async function settings(runtime) {
35
+ try {
36
+ const value = JSON.parse(await readFile(join(directory(runtime), "settings.json"), "utf8"));
37
+ if (value?.schema !== "andeo.updates/v1" || typeof value.autoUpgrade !== "boolean"
38
+ || value.lastCheck !== undefined && (!Number.isSafeInteger(value.lastCheck) || value.lastCheck < 0))
39
+ throw new Error();
40
+ return value;
41
+ }
42
+ catch (error) {
43
+ if (error.code === "ENOENT")
44
+ return { schema: "andeo.updates/v1", autoUpgrade: true };
45
+ throw new CliError("update_config_invalid", "Andeo update settings could not be read. Repair ~/.config/andeo/updates/settings.json before updating.");
46
+ }
47
+ }
48
+ export async function configureAutoUpgrade(action, runtime) {
49
+ if (!["on", "off", "status"].includes(action))
50
+ throw new CliError("argument_invalid", "Use andeo config autoupgrade on|off|status.");
51
+ return withUpdateLock(join(directory(runtime), ".lock"), async () => {
52
+ const state = await settings(runtime);
53
+ if (action !== "status") {
54
+ state.autoUpgrade = action === "on";
55
+ delete state.lastCheck;
56
+ await atomicJson(join(directory(runtime), "settings.json"), state);
57
+ }
58
+ return { enabled: state.autoUpgrade, cadence: "daily", automaticRange: semver.major(runtime.version) === 0 ? "current_minor" : "current_major",
59
+ scope: "verified_global_installs", skillSync: "independent", lastCheck: state.lastCheck ?? null };
60
+ });
61
+ }
62
+ function ci(environment) {
63
+ return ["CI", "CONTINUOUS_INTEGRATION", "BUILD_NUMBER", "GITHUB_ACTIONS", "TF_BUILD"].some(key => {
64
+ const value = environment[key];
65
+ return !!value && !["0", "false"].includes(value.toLowerCase());
66
+ });
67
+ }
68
+ export async function detectGlobalInstallation(runtime) {
69
+ const actual = await realpath(runtime.packageDirectory);
70
+ // Source checkouts and temporary package-runner caches cannot own a global
71
+ // install. npm's execution environment alone is not proof of installation.
72
+ if (!actual.replaceAll("\\", "/").includes("/node_modules/")
73
+ || /(?:^|[/\\])(?:_npx|_cacache|dlx)(?:[/\\]|$)/u.test(actual))
74
+ return null;
75
+ const candidates = [
76
+ { manager: "pnpm", args: ["root", "-g"] },
77
+ { manager: "yarn", args: ["global", "dir"] },
78
+ { manager: "npm", args: ["root", "-g"] },
79
+ ];
80
+ for (const { manager, args } of candidates) {
81
+ try {
82
+ const output = (await runtime.runner(manager, args, runtime.homeDirectory, runtime.environment)).trim();
83
+ if (!isAbsolute(output) || output.includes("\n"))
84
+ continue;
85
+ const root = manager === "yarn" ? join(output, "node_modules") : output;
86
+ if (await realpath(join(root, PACKAGE)) === actual)
87
+ return { manager, root };
88
+ }
89
+ catch { /* An unavailable or unrelated manager does not establish ownership. */ }
90
+ }
91
+ return null;
92
+ }
93
+ async function releases(runtime) {
94
+ let response;
95
+ try {
96
+ response = await runtime.fetcher(REGISTRY, { redirect: "error", credentials: "omit", signal: AbortSignal.timeout(5000),
97
+ headers: { accept: "application/vnd.npm.install-v1+json" } });
98
+ }
99
+ catch {
100
+ throw new CliError("cli_update_unavailable", "Could not check Andeo CLI releases; the installed CLI was retained.");
101
+ }
102
+ if (!response.ok || !response.body) {
103
+ await response.body?.cancel();
104
+ throw new CliError("cli_update_unavailable", "Could not check Andeo CLI releases; the installed CLI was retained.");
105
+ }
106
+ const reader = response.body.getReader();
107
+ const chunks = [];
108
+ let length = 0;
109
+ try {
110
+ while (true) {
111
+ const item = await reader.read();
112
+ if (item.done)
113
+ break;
114
+ length += item.value.byteLength;
115
+ if (length > 4 * 1024 * 1024) {
116
+ await reader.cancel();
117
+ throw new Error();
118
+ }
119
+ chunks.push(item.value);
120
+ }
121
+ const value = JSON.parse(Buffer.concat(chunks).toString("utf8"));
122
+ const latestVersion = value?.["dist-tags"]?.latest;
123
+ if (value.name !== PACKAGE || typeof latestVersion !== "string" || !semver.valid(latestVersion) || semver.prerelease(latestVersion)
124
+ || !value.versions || typeof value.versions !== "object")
125
+ throw new Error();
126
+ const versions = Object.entries(value.versions).flatMap(([version, info]) => {
127
+ if (!semver.valid(version) || semver.prerelease(version) || !info || typeof info !== "object"
128
+ || info.version !== version)
129
+ return [];
130
+ const engines = info.engines;
131
+ if (engines?.node !== undefined && (typeof engines.node !== "string" || !semver.validRange(engines.node)))
132
+ return [];
133
+ return [{ version, ...(engines ? { engines } : {}), dist: info.dist }];
134
+ });
135
+ const latest = versions.find(release => release.version === latestVersion);
136
+ if (!latest)
137
+ throw new Error();
138
+ return { latest, versions };
139
+ }
140
+ catch {
141
+ throw new CliError("cli_update_invalid", "The Andeo release response was invalid; the installed CLI was retained.");
142
+ }
143
+ }
144
+ export function automaticRelease(current, available) {
145
+ return available.filter(release => semver.gt(release.version, current)
146
+ && !semver.prerelease(release.version)
147
+ && semver.major(release.version) === semver.major(current)
148
+ && (semver.major(current) !== 0 || semver.minor(release.version) === semver.minor(current))
149
+ && semver.satisfies(process.versions.node, release.engines?.node ?? "*"))
150
+ .sort((a, b) => semver.rcompare(a.version, b.version))[0];
151
+ }
152
+ async function installRelease(release, installation, runtime) {
153
+ if (!semver.satisfies(process.versions.node, release.engines?.node ?? "*"))
154
+ throw new CliError("cli_node_upgrade_required", `CLI ${release.version} requires Node ${release.engines?.node}; upgrade Node before upgrading the CLI.`);
155
+ // An older process must not roll back a concurrently upgraded installation.
156
+ if (await installedVersion(installation.root) !== runtime.version)
157
+ throw new CliError("cli_installation_changed", "The installed CLI changed while this command was running. Retry with the current CLI.");
158
+ const archive = await verifiedArchive(release, runtime);
159
+ const args = installation.manager === "yarn" ? ["global", "add", archive] : ["install", "-g", archive];
160
+ args.push(`--registry=${REGISTRY_ORIGIN}/`);
161
+ await runtime.runner(installation.manager, args, runtime.homeDirectory, runtime.environment);
162
+ if (await installedVersion(installation.root) !== release.version)
163
+ throw new CliError("cli_upgrade_failed", "The package manager did not install the verified CLI version. Update through your package manager before syncing guidance.");
164
+ return { status: "updated", previousVersion: runtime.version, version: release.version, manager: installation.manager,
165
+ message: "The next Andeo invocation uses the updated CLI." };
166
+ }
167
+ async function installedVersion(root) {
168
+ try {
169
+ const value = JSON.parse(await readFile(join(root, PACKAGE, "package.json"), "utf8"));
170
+ return value.name === PACKAGE && typeof value.version === "string" && semver.valid(value.version) ? value.version : null;
171
+ }
172
+ catch {
173
+ return null;
174
+ }
175
+ }
176
+ async function verifiedArchive(release, runtime) {
177
+ // Bind the executable bytes to the metadata we checked, not a second name
178
+ // resolution through a user's scoped registry, mirror, or package-manager cache.
179
+ const expectedUrl = `${REGISTRY_ORIGIN}/${PACKAGE}/-/cli-${release.version}.tgz`;
180
+ if (release.dist?.tarball !== expectedUrl || !/^sha512-[A-Za-z0-9+/]{86}==$/u.test(release.dist?.integrity ?? ""))
181
+ throw new CliError("cli_update_invalid", "The CLI release is missing a trusted archive URL or SHA-512 integrity. The installed CLI was retained.");
182
+ let bytes;
183
+ try {
184
+ const response = await runtime.fetcher(expectedUrl, { redirect: "error", credentials: "omit", signal: AbortSignal.timeout(30_000) });
185
+ if (!response.ok || !response.body) {
186
+ await response.body?.cancel();
187
+ throw new Error();
188
+ }
189
+ const reader = response.body.getReader(), chunks = [];
190
+ let length = 0;
191
+ while (true) {
192
+ const item = await reader.read();
193
+ if (item.done)
194
+ break;
195
+ length += item.value.byteLength;
196
+ if (length > MAX_ARCHIVE_BYTES) {
197
+ await reader.cancel();
198
+ throw new Error();
199
+ }
200
+ chunks.push(item.value);
201
+ }
202
+ bytes = Buffer.concat(chunks);
203
+ if (`sha512-${createHash("sha512").update(bytes).digest("base64")}` !== release.dist.integrity)
204
+ throw new Error();
205
+ }
206
+ catch {
207
+ throw new CliError("cli_update_invalid", "The CLI archive could not be downloaded and verified. The installed CLI was retained.");
208
+ }
209
+ const archives = join(directory(runtime), "packages");
210
+ await mkdir(archives, { recursive: true, mode: 0o700 });
211
+ const stage = await mkdtemp(join(archives, ".download-"));
212
+ // pnpm and Yarn record file specs in their global manifest. Keep immutable,
213
+ // content-addressed archives available for subsequent manager operations.
214
+ const archive = join(archives, `cli-${release.version}-${createHash("sha256").update(bytes).digest("hex")}.tgz`);
215
+ try {
216
+ await writeFile(join(stage, "cli.tgz"), bytes, { mode: 0o600, flag: "wx" });
217
+ await rename(join(stage, "cli.tgz"), archive);
218
+ }
219
+ finally {
220
+ await rm(stage, { recursive: true, force: true });
221
+ }
222
+ return archive;
223
+ }
224
+ export async function upgradeCli(runtime) {
225
+ if (ci(runtime.environment))
226
+ throw new CliError("cli_upgrade_skipped", "CI uses its pinned CLI. Update the dependency through your package manager.");
227
+ return withUpdateLock(join(directory(runtime), ".lock"), async () => {
228
+ const installation = await detectGlobalInstallation(runtime);
229
+ if (!installation)
230
+ throw new CliError("cli_installation_unmanaged", "Only verified global npm, pnpm or Yarn 1 installations can self-upgrade. Update this installation through its package manager.");
231
+ const { latest } = await releases(runtime);
232
+ if (!semver.gt(latest.version, runtime.version))
233
+ return { status: "up_to_date", version: runtime.version };
234
+ return installRelease(latest, installation, runtime);
235
+ });
236
+ }
237
+ // Called only by the executable after a successful normal command. Help,
238
+ // version and explicit maintenance commands remain quick and side-effect free.
239
+ export async function maintainCli(argv, runtime) {
240
+ if (ci(runtime.environment) || !argv.length || ["help", "version", "--version", "--help", "-h", "-v", "upgrade", "config", "skill"].includes(argv[0])
241
+ || argv.includes("--help") || argv.includes("-h"))
242
+ return;
243
+ try {
244
+ const snapshot = await settings(runtime);
245
+ if (snapshot.lastCheck !== undefined && runtime.now() - snapshot.lastCheck < DAY)
246
+ return;
247
+ const installation = await detectGlobalInstallation(runtime);
248
+ if (!installation)
249
+ return;
250
+ await withUpdateLock(join(directory(runtime), ".lock"), async () => {
251
+ const state = await settings(runtime);
252
+ if (state.lastCheck !== undefined && runtime.now() - state.lastCheck < DAY)
253
+ return;
254
+ // Record attempted checks too, so outages do not delay every invocation.
255
+ state.lastCheck = runtime.now();
256
+ await atomicJson(join(directory(runtime), "settings.json"), state);
257
+ let installedVersion = runtime.version;
258
+ try {
259
+ const { latest, versions } = await releases(runtime);
260
+ const eligible = automaticRelease(runtime.version, versions.filter(release => semver.lte(release.version, latest.version)));
261
+ if (state.autoUpgrade && eligible) {
262
+ await installRelease(eligible, installation, runtime);
263
+ installedVersion = eligible.version;
264
+ runtime.notify(`Andeo CLI updated to ${eligible.version}; the next invocation uses it.`);
265
+ }
266
+ if (semver.gt(latest.version, installedVersion))
267
+ runtime.notify(`Andeo CLI ${latest.version} is available. Run andeo upgrade to update explicitly.`);
268
+ }
269
+ catch {
270
+ runtime.notify("Andeo CLI update check or upgrade failed. Run andeo upgrade to retry; your command result is unchanged.");
271
+ }
272
+ for (const agent of [".agents", ".claude"]) {
273
+ const base = resolve(runtime.homeDirectory, agent, "skills");
274
+ if (!await lstat(resolve(base, "andeo")).catch(() => null))
275
+ continue;
276
+ try {
277
+ const result = await syncDocumentation(base, installedVersion, { fetcher: runtime.fetcher });
278
+ if (result.status === "updated")
279
+ runtime.notify("Andeo skill updated. Reread SKILL.md and relevant references before continuing in this chat.");
280
+ else if (["local_changes", "unmanaged"].includes(result.status))
281
+ runtime.notify(`Andeo skill ${result.status}: local files preserved. Run andeo skill status --json to inspect.`);
282
+ }
283
+ catch (error) {
284
+ runtime.notify(error instanceof CliError && error.code === "skill_cli_upgrade_required"
285
+ ? `${error.message} Run andeo upgrade, then andeo skill sync --json.`
286
+ : "Andeo skill could not be refreshed; installed guidance retained. Run andeo skill sync --json to retry.");
287
+ }
288
+ }
289
+ });
290
+ }
291
+ catch (error) {
292
+ if (error instanceof CliError && error.code === "update_busy")
293
+ return;
294
+ runtime.notify("Andeo automatic maintenance could not complete. Run andeo config autoupgrade status to inspect settings.");
295
+ }
296
+ }
297
+ //# sourceMappingURL=updates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updates.js","sourceRoot":"","sources":["../src/updates.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@withandeo/cli",
3
- "version": "0.19.11",
3
+ "version": "0.19.12",
4
4
  "description": "Developer CLI for Andeo applications",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
@@ -30,6 +30,7 @@
30
30
  "@cloudflare/flagship": "0.5.0",
31
31
  "@openfeature/server-sdk": "1.23.0",
32
32
  "@types/node": "^26.2.0",
33
+ "@types/semver": "^7.8.0",
33
34
  "typescript": "^7.0.2",
34
35
  "vitest": "^4.1.11"
35
36
  },
@@ -38,6 +39,7 @@
38
39
  "esbuild": "0.28.1",
39
40
  "jsonc-parser": "3.3.1",
40
41
  "miniflare": "5.20260918.0-alpha",
42
+ "semver": "^7.8.5",
41
43
  "smol-toml": "1.8.0"
42
44
  },
43
45
  "exports": {
@@ -1,3 +1,3 @@
1
1
  {
2
- "minimumCliVersion": "0.19.11"
2
+ "minimumCliVersion": "0.19.12"
3
3
  }
@@ -5,7 +5,15 @@ description: Build, preview, diagnose and operate merchant-owned Andeo apps with
5
5
 
6
6
  # Andeo applications
7
7
 
8
- Use `npx @withandeo/cli` as the merchant platform interface. Keep merchant behavior in merchant source and provider credentials/customer authorization server-side. Use Andeo in customer-facing copy; retain existing technical identifiers and configuration schemas.
8
+ Use `andeo` as the merchant platform interface. A project-local CLI stays pinned to its dependency; use `npx @withandeo/cli@latest` when an explicitly current temporary CLI is needed. Keep merchant behavior in merchant source and provider credentials/customer authorization server-side. Use Andeo in customer-facing copy; retain existing technical identifiers and configuration schemas.
9
+
10
+ ## Check guidance freshness before each Andeo task
11
+
12
+ Run `andeo skill sync --agent codex --json` for a Codex installation, or use `--agent claude` for Claude. For a custom installation, pass its parent directory with `--directory PATH`. Sync refreshes an existing, unchanged managed guide without login. After `status=updated`, reread this `SKILL.md` and task-relevant references before continuing; an active chat retains previously loaded instructions.
13
+
14
+ For `local_changes` or `unmanaged`, preserve local files and report the result; inspect with `andeo skill status --json` using the same destination. Never use `--force` automatically. For `not_installed`, use `skill install` only when asked to install guidance. On an outage, state that freshness is unverified and use current CLI help, bundled `andeo docs`, and live capabilities. If the guide requires a newer CLI, run `andeo upgrade` for a supported global installation; update a project-local dependency through its package manager.
15
+
16
+ Global installations automatically maintain the CLI and existing default Codex/Claude guides once daily after successful commands. `andeo config autoupgrade off` disables CLI installation while retaining update reminders and independent skill refresh. Detailed guidance remains in the references, CLI help and maintained practice catalog.
9
17
 
10
18
  ## Discover scope before acting
11
19
 
@@ -1,8 +1,11 @@
1
1
  # Authenticated skills
2
2
 
3
3
  The global Andeo guide is public and updates independently of CLI releases.
4
- Run `andeo skill install --agent codex --force --json` to refresh its latest
5
- compatible revision, without login. Check the returned source and revision;
4
+ Run `andeo skill sync --agent codex --json` to refresh its latest
5
+ compatible revision, without login or overwriting local edits. Use `--agent claude`
6
+ for Claude or `--directory PATH` for a custom installation. Check freshness with
7
+ `andeo skill status --json` using the same destination. After an update, reread the
8
+ entrypoint and relevant references in active chats. Check the returned source and revision;
6
9
  `--bundled` selects the CLI's offline snapshot. `andeo doctor` checks global
7
10
  guidance against the public revision. The private practice skills below still
8
11
  require authentication and do not use this public endpoint.