@cogenta/cli 0.3.0 → 0.6.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 +3856 -0
- package/dist/admin-assets/assets/index-CxZHGwVA.css +1 -0
- package/dist/admin-assets/assets/index-fYXyHpn8.js +1090 -0
- package/dist/admin-assets/assets/vips-_dmTUXFO.wasm +0 -0
- package/dist/admin-assets/assets/vips-es6-DrQTTS8Q.js +7 -0
- package/dist/admin-assets/branding/logo-cogenta-dark.png +0 -0
- package/dist/admin-assets/branding/logo-cogenta-icon.png +0 -0
- package/dist/admin-assets/branding/logo-cogenta-light.png +0 -0
- package/dist/admin-assets/branding/logo-cogenta-small.png +0 -0
- package/dist/admin-assets/branding/logo-cogenta-transparent.png +0 -0
- package/dist/admin-assets/branding/logo-cogenta.png +0 -0
- package/dist/admin-assets/favicon.png +0 -0
- package/dist/admin-assets/fonts/ibm-plex-mono-400.woff2 +0 -0
- package/dist/admin-assets/fonts/ibm-plex-mono-500.woff2 +0 -0
- package/dist/admin-assets/fonts/ibm-plex-mono-600.woff2 +0 -0
- package/dist/admin-assets/fonts/ibm-plex-mono-700.woff2 +0 -0
- package/dist/admin-assets/fonts/ibm-plex-sans-var.woff2 +0 -0
- package/dist/admin-assets/fonts/jetbrains-mono-var.woff2 +0 -0
- package/dist/admin-assets/fonts/space-grotesk-var.woff2 +0 -0
- package/dist/admin-assets/index.html +3 -2
- package/dist/bin.js +6 -0
- package/dist/bin.js.map +1 -1
- package/dist/commands/admin-assets.d.ts +1 -0
- package/dist/commands/admin-assets.d.ts.map +1 -1
- package/dist/commands/admin-assets.js +19 -1
- package/dist/commands/admin-assets.js.map +1 -1
- package/dist/commands/agent-runtime.d.ts +151 -0
- package/dist/commands/agent-runtime.d.ts.map +1 -0
- package/dist/commands/agent-runtime.js +519 -0
- package/dist/commands/agent-runtime.js.map +1 -0
- package/dist/commands/assistant.d.ts +89 -3
- package/dist/commands/assistant.d.ts.map +1 -1
- package/dist/commands/assistant.js +206 -39
- package/dist/commands/assistant.js.map +1 -1
- package/dist/commands/audit-integrity-alert.d.ts +23 -0
- package/dist/commands/audit-integrity-alert.d.ts.map +1 -0
- package/dist/commands/audit-integrity-alert.js +33 -0
- package/dist/commands/audit-integrity-alert.js.map +1 -0
- package/dist/commands/backup.d.ts +78 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +238 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/channels.d.ts +47 -0
- package/dist/commands/channels.d.ts.map +1 -0
- package/dist/commands/channels.js +277 -0
- package/dist/commands/channels.js.map +1 -0
- package/dist/commands/default-logo.d.ts +27 -0
- package/dist/commands/default-logo.d.ts.map +1 -0
- package/dist/commands/default-logo.js +30 -0
- package/dist/commands/default-logo.js.map +1 -0
- package/dist/commands/doctor.d.ts +5 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +74 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/export.d.ts +22 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +182 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/forms-page.d.ts +75 -0
- package/dist/commands/forms-page.d.ts.map +1 -0
- package/dist/commands/forms-page.js +191 -0
- package/dist/commands/forms-page.js.map +1 -0
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +13 -1
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/mcp.d.ts +35 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +277 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/roles.d.ts +22 -0
- package/dist/commands/roles.d.ts.map +1 -0
- package/dist/commands/roles.js +79 -0
- package/dist/commands/roles.js.map +1 -0
- package/dist/commands/search-page.d.ts +15 -0
- package/dist/commands/search-page.d.ts.map +1 -1
- package/dist/commands/search-page.js +22 -16
- package/dist/commands/search-page.js.map +1 -1
- package/dist/commands/seo.d.ts +92 -4
- package/dist/commands/seo.d.ts.map +1 -1
- package/dist/commands/seo.js +168 -4
- package/dist/commands/seo.js.map +1 -1
- package/dist/commands/serve.d.ts +489 -6
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +3883 -164
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/site-plan.d.ts +27 -1
- package/dist/commands/site-plan.d.ts.map +1 -1
- package/dist/commands/site-plan.js +71 -4
- package/dist/commands/site-plan.js.map +1 -1
- package/dist/commands/term-archive-page.d.ts +94 -0
- package/dist/commands/term-archive-page.d.ts.map +1 -0
- package/dist/commands/term-archive-page.js +195 -0
- package/dist/commands/term-archive-page.js.map +1 -0
- package/dist/commands/theme-css.d.ts +22 -7
- package/dist/commands/theme-css.d.ts.map +1 -1
- package/dist/commands/theme-css.js +33 -8
- package/dist/commands/theme-css.js.map +1 -1
- package/dist/commands/theme-registry.d.ts +94 -0
- package/dist/commands/theme-registry.d.ts.map +1 -0
- package/dist/commands/theme-registry.js +130 -0
- package/dist/commands/theme-registry.js.map +1 -0
- package/dist/commands/theme-render.d.ts +360 -2
- package/dist/commands/theme-render.d.ts.map +1 -1
- package/dist/commands/theme-render.js +984 -29
- package/dist/commands/theme-render.js.map +1 -1
- package/dist/commands/theme-wiring.d.ts +107 -0
- package/dist/commands/theme-wiring.d.ts.map +1 -0
- package/dist/commands/theme-wiring.js +295 -0
- package/dist/commands/theme-wiring.js.map +1 -0
- package/dist/commands/tools.d.ts +71 -0
- package/dist/commands/tools.d.ts.map +1 -0
- package/dist/commands/tools.js +330 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/update.d.ts +25 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +193 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/users.d.ts.map +1 -1
- package/dist/commands/users.js +6 -36
- package/dist/commands/users.js.map +1 -1
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +146 -4
- package/dist/index.js.map +1 -1
- package/dist/invite-mail.d.ts +39 -0
- package/dist/invite-mail.d.ts.map +1 -0
- package/dist/invite-mail.js +39 -0
- package/dist/invite-mail.js.map +1 -0
- package/dist/reset-mail.d.ts +39 -0
- package/dist/reset-mail.d.ts.map +1 -0
- package/dist/reset-mail.js +45 -0
- package/dist/reset-mail.js.map +1 -0
- package/dist/update/apply.d.ts +54 -0
- package/dist/update/apply.d.ts.map +1 -0
- package/dist/update/apply.js +77 -0
- package/dist/update/apply.js.map +1 -0
- package/dist/update/changelog-risk.d.ts +20 -0
- package/dist/update/changelog-risk.d.ts.map +1 -0
- package/dist/update/changelog-risk.js +55 -0
- package/dist/update/changelog-risk.js.map +1 -0
- package/dist/update/check.d.ts +60 -0
- package/dist/update/check.d.ts.map +1 -0
- package/dist/update/check.js +56 -0
- package/dist/update/check.js.map +1 -0
- package/dist/update/contract-risk.d.ts +55 -0
- package/dist/update/contract-risk.d.ts.map +1 -0
- package/dist/update/contract-risk.js +75 -0
- package/dist/update/contract-risk.js.map +1 -0
- package/dist/update/history.d.ts +30 -0
- package/dist/update/history.d.ts.map +1 -0
- package/dist/update/history.js +38 -0
- package/dist/update/history.js.map +1 -0
- package/dist/update/index.d.ts +28 -0
- package/dist/update/index.d.ts.map +1 -0
- package/dist/update/index.js +11 -0
- package/dist/update/index.js.map +1 -0
- package/dist/update/list-restore-points.d.ts +20 -0
- package/dist/update/list-restore-points.d.ts.map +1 -0
- package/dist/update/list-restore-points.js +35 -0
- package/dist/update/list-restore-points.js.map +1 -0
- package/dist/update/npm-registry.d.ts +11 -0
- package/dist/update/npm-registry.d.ts.map +1 -0
- package/dist/update/npm-registry.js +74 -0
- package/dist/update/npm-registry.js.map +1 -0
- package/dist/update/restore-point.d.ts +26 -0
- package/dist/update/restore-point.d.ts.map +1 -0
- package/dist/update/restore-point.js +23 -0
- package/dist/update/restore-point.js.map +1 -0
- package/dist/update/tar.d.ts +27 -0
- package/dist/update/tar.d.ts.map +1 -0
- package/dist/update/tar.js +56 -0
- package/dist/update/tar.js.map +1 -0
- package/dist/update/version-compare.d.ts +17 -0
- package/dist/update/version-compare.d.ts.map +1 -0
- package/dist/update/version-compare.js +42 -0
- package/dist/update/version-compare.js.map +1 -0
- package/dist/version.d.ts +13 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +18 -0
- package/dist/version.js.map +1 -0
- package/package.json +33 -13
- package/dist/admin-assets/assets/index-Buwdj1V2.js +0 -71
- package/dist/admin-assets/assets/index-Csef0SiA.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/update/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEvD,OAAO,EAAE,8BAA8B,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAE5F,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAEjF,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAE1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAE7D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAErE,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,YAAY,GACb,MAAM,sBAAsB,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The restore-point half of "historique des mises à jour et des points de
|
|
3
|
+
* restauration" (L22 task 9, point 5) — exactly `cogenta backup list`'s own
|
|
4
|
+
* directory scan (`.cogenta/backups`), reused rather than re-implemented,
|
|
5
|
+
* with one addition: `triggeredByUpdate` is read straight off the filename
|
|
6
|
+
* prefix `restore-point.ts` writes (`update-…zip` vs. `backup-…zip`), so the
|
|
7
|
+
* admin's history view can show *which* restore points exist because an
|
|
8
|
+
* update took them automatically, without a second manifest field.
|
|
9
|
+
*/
|
|
10
|
+
export interface RestorePointSummary {
|
|
11
|
+
readonly path: string;
|
|
12
|
+
readonly createdAt: string;
|
|
13
|
+
readonly rows: number;
|
|
14
|
+
readonly tables: number;
|
|
15
|
+
readonly checksum: string;
|
|
16
|
+
readonly encrypted: boolean;
|
|
17
|
+
readonly triggeredByUpdate: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function listRestorePoints(dir: string): Promise<readonly RestorePointSummary[]>;
|
|
20
|
+
//# sourceMappingURL=list-restore-points.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-restore-points.d.ts","sourceRoot":"","sources":["../../src/update/list-restore-points.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAA;CACpC;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,mBAAmB,EAAE,CAAC,CA6B5F"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { readdir } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { readBackupManifest } from '@cogenta/export';
|
|
4
|
+
export async function listRestorePoints(dir) {
|
|
5
|
+
let files;
|
|
6
|
+
try {
|
|
7
|
+
files = (await readdir(dir)).filter((name) => name.endsWith('.zip'));
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
// No backup directory yet — nothing has ever been backed up.
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
const summaries = [];
|
|
14
|
+
for (const file of files) {
|
|
15
|
+
try {
|
|
16
|
+
const manifest = await readBackupManifest(join(dir, file));
|
|
17
|
+
summaries.push({
|
|
18
|
+
path: join(dir, file),
|
|
19
|
+
createdAt: manifest.createdAt,
|
|
20
|
+
rows: manifest.tables.reduce((sum, table) => sum + table.rows, 0),
|
|
21
|
+
tables: manifest.tables.length,
|
|
22
|
+
checksum: manifest.checksum,
|
|
23
|
+
encrypted: manifest.encrypted,
|
|
24
|
+
triggeredByUpdate: file.startsWith('update-'),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// A manifest that fails to read (corrupted, mid-write) is skipped
|
|
29
|
+
// rather than crashing the whole history view — `cogenta backup list`
|
|
30
|
+
// makes the same choice for the same reason.
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return summaries.sort((a, b) => (a.createdAt < b.createdAt ? 1 : -1));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=list-restore-points.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-restore-points.js","sourceRoot":"","sources":["../../src/update/list-restore-points.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAsBpD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW;IACjD,IAAI,KAAwB,CAAA;IAC5B,IAAI,CAAC;QACH,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,6DAA6D;QAC7D,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,SAAS,GAA0B,EAAE,CAAA;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;YAC1D,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;gBACrB,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBACjE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM;gBAC9B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,iBAAiB,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;aAC9C,CAAC,CAAA;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,kEAAkE;YAClE,sEAAsE;YACtE,6CAA6C;QAC/C,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACvE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface NpmPackageSummary {
|
|
2
|
+
readonly name: string;
|
|
3
|
+
/** `dist-tags.latest` — the version `npm install <name>` would resolve to today. */
|
|
4
|
+
readonly latest: string;
|
|
5
|
+
/** Every version the registry lists, in whatever order it returned them (usually publish order). */
|
|
6
|
+
readonly versions: readonly string[];
|
|
7
|
+
/** `dist.tarball` per version — only present for a version this response actually described. */
|
|
8
|
+
readonly tarballUrl: Readonly<Record<string, string>>;
|
|
9
|
+
}
|
|
10
|
+
export declare function fetchNpmPackageSummary(packageName: string, fetchImpl?: typeof fetch): Promise<NpmPackageSummary>;
|
|
11
|
+
//# sourceMappingURL=npm-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-registry.d.ts","sourceRoot":"","sources":["../../src/update/npm-registry.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,oFAAoF;IACpF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,oGAAoG;IACpG,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,gGAAgG;IAChG,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CACtD;AAoBD,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,iBAAiB,CAAC,CA0C5B"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { CogentaError } from '@cogenta/core';
|
|
2
|
+
/**
|
|
3
|
+
* The one piece of real network access `cogenta update` needs: "what is the
|
|
4
|
+
* newest published version of this package, and where is its tarball" — the
|
|
5
|
+
* npm registry's own abbreviated packument
|
|
6
|
+
* (`Accept: application/vnd.npm.install-v1+json`), which is a small fraction
|
|
7
|
+
* of the full packument (no per-version readme, no full dependency graph)
|
|
8
|
+
* but still carries `dist-tags.latest` and, per version, `dist.tarball` —
|
|
9
|
+
* exactly what `contract-risk.ts` needs to fetch one tarball and read its
|
|
10
|
+
* `CHANGELOG.md`.
|
|
11
|
+
*
|
|
12
|
+
* `registry.npmjs.org` only — never a CDN mirror (unpkg, jsdelivr…), which
|
|
13
|
+
* would be a second external host this optional feature depends on for no
|
|
14
|
+
* real gain. Every caller degrades to "could not check" on failure (R1's
|
|
15
|
+
* spirit: checking for an update is optional infrastructure, never something
|
|
16
|
+
* the rest of the CMS needs to run).
|
|
17
|
+
*/
|
|
18
|
+
const REGISTRY_BASE = 'https://registry.npmjs.org';
|
|
19
|
+
const FETCH_TIMEOUT_MS = 10_000;
|
|
20
|
+
function registryUrl(packageName) {
|
|
21
|
+
// A scoped name (`@cogenta/core`) needs the whole name percent-encoded as
|
|
22
|
+
// one segment — `encodeURIComponent` turns `/` into `%2F`, which is what
|
|
23
|
+
// the registry expects for a scoped package's single-segment route.
|
|
24
|
+
return `${REGISTRY_BASE}/${encodeURIComponent(packageName)}`;
|
|
25
|
+
}
|
|
26
|
+
function checkFailed(packageName, reason, cause) {
|
|
27
|
+
const npmPage = `https://www.npmjs.com/package/${packageName}`;
|
|
28
|
+
return new CogentaError({
|
|
29
|
+
code: 'UPDATE_CHECK_FAILED',
|
|
30
|
+
message: `Could not check npm for the latest version of "${packageName}": ${reason}`,
|
|
31
|
+
hint: `This needs outbound network access to registry.npmjs.org. Everything else in this admin works without it (R1) — try again later, or check manually at ${npmPage}.`,
|
|
32
|
+
cause,
|
|
33
|
+
details: { packageName },
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export async function fetchNpmPackageSummary(packageName, fetchImpl = fetch) {
|
|
37
|
+
let response;
|
|
38
|
+
try {
|
|
39
|
+
response = await fetchImpl(registryUrl(packageName), {
|
|
40
|
+
headers: { accept: 'application/vnd.npm.install-v1+json' },
|
|
41
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
throw checkFailed(packageName, 'the request failed', error);
|
|
46
|
+
}
|
|
47
|
+
if (response.status === 404) {
|
|
48
|
+
throw checkFailed(packageName, 'npm has no package by this name');
|
|
49
|
+
}
|
|
50
|
+
if (!response.ok) {
|
|
51
|
+
throw checkFailed(packageName, `npm responded with HTTP ${response.status}`);
|
|
52
|
+
}
|
|
53
|
+
let body;
|
|
54
|
+
try {
|
|
55
|
+
body = await response.json();
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
throw checkFailed(packageName, 'the response was not valid JSON', error);
|
|
59
|
+
}
|
|
60
|
+
const record = body;
|
|
61
|
+
const latest = record['dist-tags']?.latest;
|
|
62
|
+
if (typeof latest !== 'string' || latest === '') {
|
|
63
|
+
throw checkFailed(packageName, 'the response carried no "dist-tags.latest"');
|
|
64
|
+
}
|
|
65
|
+
const versions = record.versions ?? {};
|
|
66
|
+
const tarballUrl = {};
|
|
67
|
+
for (const [version, meta] of Object.entries(versions)) {
|
|
68
|
+
const tarball = meta.dist?.tarball;
|
|
69
|
+
if (typeof tarball === 'string' && tarball !== '')
|
|
70
|
+
tarballUrl[version] = tarball;
|
|
71
|
+
}
|
|
72
|
+
return { name: packageName, latest, versions: Object.keys(versions), tarballUrl };
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=npm-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-registry.js","sourceRoot":"","sources":["../../src/update/npm-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE5C;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,aAAa,GAAG,4BAA4B,CAAA;AAClD,MAAM,gBAAgB,GAAG,MAAM,CAAA;AAY/B,SAAS,WAAW,CAAC,WAAmB;IACtC,0EAA0E;IAC1E,yEAAyE;IACzE,oEAAoE;IACpE,OAAO,GAAG,aAAa,IAAI,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAA;AAC9D,CAAC;AAED,SAAS,WAAW,CAAC,WAAmB,EAAE,MAAc,EAAE,KAAe;IACvE,MAAM,OAAO,GAAG,iCAAiC,WAAW,EAAE,CAAA;IAC9D,OAAO,IAAI,YAAY,CAAC;QACtB,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EAAE,kDAAkD,WAAW,MAAM,MAAM,EAAE;QACpF,IAAI,EAAE,yJAAyJ,OAAO,GAAG;QACzK,KAAK;QACL,OAAO,EAAE,EAAE,WAAW,EAAE;KACzB,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,WAAmB,EACnB,SAAS,GAAiB,KAAK;IAE/B,IAAI,QAAkB,CAAA;IACtB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE;YACnD,OAAO,EAAE,EAAE,MAAM,EAAE,qCAAqC,EAAE;YAC1D,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC;SAC9C,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,WAAW,CAAC,WAAW,EAAE,oBAAoB,EAAE,KAAK,CAAC,CAAA;IAC7D,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,WAAW,CAAC,WAAW,EAAE,iCAAiC,CAAC,CAAA;IACnE,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,WAAW,CAAC,WAAW,EAAE,2BAA2B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAC9E,CAAC;IAED,IAAI,IAAa,CAAA;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,WAAW,CAAC,WAAW,EAAE,iCAAiC,EAAE,KAAK,CAAC,CAAA;IAC1E,CAAC;IAED,MAAM,MAAM,GAAG,IAGd,CAAA;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC1C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QAChD,MAAM,WAAW,CAAC,WAAW,EAAE,4CAA4C,CAAC,CAAA;IAC9E,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAA;IACtC,MAAM,UAAU,GAA2B,EAAE,CAAA;IAC7C,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAA;QAClC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,EAAE;YAAE,UAAU,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;IAClF,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAA;AACnF,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type Logger } from '@cogenta/core';
|
|
2
|
+
/**
|
|
3
|
+
* "Un point de restauration obligatoire avant toute mise à jour" (L22 task
|
|
4
|
+
* 9, point 2) — this is the *entire* implementation: one call into
|
|
5
|
+
* `createSiteBackup`, the exact function `cogenta backup create` itself
|
|
6
|
+
* calls, tagged with the `update-` filename prefix so it shows up
|
|
7
|
+
* identifiably in `cogenta backup list` and in the admin's own history view
|
|
8
|
+
* without a second backup format or a second directory. Never a smaller,
|
|
9
|
+
* update-specific backup — a restore point has to be able to put the whole
|
|
10
|
+
* site back, and `createSiteBackup` already is that.
|
|
11
|
+
*/
|
|
12
|
+
export interface CreateUpdateRestorePointOptions {
|
|
13
|
+
readonly cwd?: string;
|
|
14
|
+
readonly env?: Record<string, string | undefined>;
|
|
15
|
+
readonly logger?: Logger;
|
|
16
|
+
readonly dir?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface UpdateRestorePoint {
|
|
19
|
+
readonly path: string;
|
|
20
|
+
readonly createdAt: string;
|
|
21
|
+
readonly tableCount: number;
|
|
22
|
+
readonly rowCount: number;
|
|
23
|
+
readonly checksum: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function createUpdateRestorePoint(options: CreateUpdateRestorePointOptions): Promise<UpdateRestorePoint>;
|
|
26
|
+
//# sourceMappingURL=restore-point.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore-point.d.ts","sourceRoot":"","sources":["../../src/update/restore-point.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,eAAe,CAAA;AAGzD;;;;;;;;;GASG;AAEH,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,kBAAkB,CAAC,CAkB7B"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { CogentaError } from '@cogenta/core';
|
|
2
|
+
import { createSiteBackup } from '../commands/backup.js';
|
|
3
|
+
export async function createUpdateRestorePoint(options) {
|
|
4
|
+
try {
|
|
5
|
+
const { path, manifest } = await createSiteBackup({ ...options, filenamePrefix: 'update-' });
|
|
6
|
+
return {
|
|
7
|
+
path,
|
|
8
|
+
createdAt: manifest.createdAt,
|
|
9
|
+
tableCount: manifest.tables.length,
|
|
10
|
+
rowCount: manifest.tables.reduce((sum, table) => sum + table.rows, 0),
|
|
11
|
+
checksum: manifest.checksum,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
throw new CogentaError({
|
|
16
|
+
code: 'UPDATE_RESTORE_POINT_FAILED',
|
|
17
|
+
message: 'Could not create a restore point before the update — nothing was changed.',
|
|
18
|
+
hint: 'This update was refused rather than applied without a safety net. Check the underlying error, free up disk space if that is the cause, and try again.',
|
|
19
|
+
cause: error,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=restore-point.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore-point.js","sourceRoot":"","sources":["../../src/update/restore-point.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAe,MAAM,eAAe,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AA4BxD,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAwC;IAExC,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,gBAAgB,CAAC,EAAE,GAAG,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAAA;QAC5F,OAAO;YACL,IAAI;YACJ,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM;YAClC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACrE,QAAQ,EAAE,QAAQ,CAAC,QAAQ;SAC5B,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,YAAY,CAAC;YACrB,IAAI,EAAE,6BAA6B;YACnC,OAAO,EAAE,2EAA2E;YACpF,IAAI,EAAE,uJAAuJ;YAC7J,KAAK,EAAE,KAAK;SACb,CAAC,CAAA;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A minimal, read-only ustar/pax reader — just enough to pull one small,
|
|
3
|
+
* short-named text file (`package/CHANGELOG.md`) out of an npm tarball,
|
|
4
|
+
* fetched straight from `registry.npmjs.org`'s own `dist.tarball` URL.
|
|
5
|
+
*
|
|
6
|
+
* No `tar` dependency (R9): npm tarballs are always ustar/pax, and the one
|
|
7
|
+
* thing this needs from that format — "walk 512-byte header blocks, read a
|
|
8
|
+
* file's name/size, skip to the next block" — is a couple dozen lines.
|
|
9
|
+
* `readTarEntries` is deliberately **not** a general-purpose extractor: it
|
|
10
|
+
* does not honour a pax extended header's own `path`/`size` overrides (typeflag
|
|
11
|
+
* `x`), it only skips past them by their own declared size and reads the
|
|
12
|
+
* *following* ustar header's `name`/`size` fields directly. That is exactly
|
|
13
|
+
* enough for a path like `package/CHANGELOG.md` — well under the 100-byte
|
|
14
|
+
* ustar name field, so no pax override is ever needed to represent it — and
|
|
15
|
+
* deliberately not extended further than that real, verified need.
|
|
16
|
+
*/
|
|
17
|
+
export interface TarEntry {
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly content: Buffer;
|
|
20
|
+
}
|
|
21
|
+
/** Parses an already-decompressed tar archive. */
|
|
22
|
+
export declare function readTarEntries(tar: Buffer): readonly TarEntry[];
|
|
23
|
+
/** Gunzips, then parses — the shape an npm registry `dist.tarball` download actually arrives in. */
|
|
24
|
+
export declare function readTarGz(gzipped: Buffer): readonly TarEntry[];
|
|
25
|
+
/** `package/<relativePath>` — every npm tarball's own file entries are rooted at `package/`. */
|
|
26
|
+
export declare function findPackageFile(entries: readonly TarEntry[], relativePath: string): Buffer | null;
|
|
27
|
+
//# sourceMappingURL=tar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tar.d.ts","sourceRoot":"","sources":["../../src/update/tar.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAyBD,kDAAkD;AAClD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,QAAQ,EAAE,CA4B/D;AAED,oGAAoG;AACpG,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,QAAQ,EAAE,CAE9D;AAED,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIjG"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { gunzipSync } from 'node:zlib';
|
|
2
|
+
const BLOCK_SIZE = 512;
|
|
3
|
+
/** Type flags this reader treats as "a real file to read", per the ustar spec. `'0'` and `'\0'` both mean "regular file". */
|
|
4
|
+
const REGULAR_FILE_TYPEFLAGS = new Set(['0', '\0']);
|
|
5
|
+
function readNullPaddedField(header, offset, length) {
|
|
6
|
+
const raw = header.subarray(offset, offset + length);
|
|
7
|
+
const nul = raw.indexOf(0);
|
|
8
|
+
const trimmed = (nul === -1 ? raw : raw.subarray(0, nul)).toString('utf8');
|
|
9
|
+
return trimmed.trim();
|
|
10
|
+
}
|
|
11
|
+
function readOctalSize(header, offset, length) {
|
|
12
|
+
const raw = readNullPaddedField(header, offset, length);
|
|
13
|
+
if (raw === '')
|
|
14
|
+
return 0;
|
|
15
|
+
const parsed = Number.parseInt(raw, 8);
|
|
16
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
17
|
+
}
|
|
18
|
+
function roundUpToBlock(size) {
|
|
19
|
+
return Math.ceil(size / BLOCK_SIZE) * BLOCK_SIZE;
|
|
20
|
+
}
|
|
21
|
+
/** Parses an already-decompressed tar archive. */
|
|
22
|
+
export function readTarEntries(tar) {
|
|
23
|
+
const entries = [];
|
|
24
|
+
let offset = 0;
|
|
25
|
+
while (offset + BLOCK_SIZE <= tar.length) {
|
|
26
|
+
const header = tar.subarray(offset, offset + BLOCK_SIZE);
|
|
27
|
+
// Two consecutive all-zero blocks mark the end of the archive.
|
|
28
|
+
if (header.every((byte) => byte === 0))
|
|
29
|
+
break;
|
|
30
|
+
const name = readNullPaddedField(header, 0, 100);
|
|
31
|
+
const size = readOctalSize(header, 124, 12);
|
|
32
|
+
const typeflag = String.fromCharCode(header[156] ?? 0);
|
|
33
|
+
const dataStart = offset + BLOCK_SIZE;
|
|
34
|
+
const dataEnd = dataStart + size;
|
|
35
|
+
if (REGULAR_FILE_TYPEFLAGS.has(typeflag) && name !== '') {
|
|
36
|
+
entries.push({ name, content: Buffer.from(tar.subarray(dataStart, dataEnd)) });
|
|
37
|
+
}
|
|
38
|
+
// Every other typeflag (pax extended header 'x'/'g', directory '5',
|
|
39
|
+
// symlink '2', GNU long-name 'L'…) is skipped the same way: its data is
|
|
40
|
+
// exactly `size` bytes, block-padded, whether or not this reader
|
|
41
|
+
// understands what the bytes mean.
|
|
42
|
+
offset = dataStart + roundUpToBlock(size);
|
|
43
|
+
}
|
|
44
|
+
return entries;
|
|
45
|
+
}
|
|
46
|
+
/** Gunzips, then parses — the shape an npm registry `dist.tarball` download actually arrives in. */
|
|
47
|
+
export function readTarGz(gzipped) {
|
|
48
|
+
return readTarEntries(gunzipSync(gzipped));
|
|
49
|
+
}
|
|
50
|
+
/** `package/<relativePath>` — every npm tarball's own file entries are rooted at `package/`. */
|
|
51
|
+
export function findPackageFile(entries, relativePath) {
|
|
52
|
+
const wanted = `package/${relativePath}`;
|
|
53
|
+
const found = entries.find((entry) => entry.name === wanted);
|
|
54
|
+
return found === undefined ? null : found.content;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=tar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tar.js","sourceRoot":"","sources":["../../src/update/tar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classifies the difference between two real version strings. Built on
|
|
3
|
+
* `@cogenta/plugins`'s own `parseVersion`/`compareVersions` (the semver
|
|
4
|
+
* comparator L8's fleet package already reuses for its own version-drift
|
|
5
|
+
* detection) rather than a second implementation, and rather than a new
|
|
6
|
+
* `semver` dependency (R9) — `@cogenta/cli` already depends on
|
|
7
|
+
* `@cogenta/plugins`.
|
|
8
|
+
*/
|
|
9
|
+
export type UpdateBump = 'none' | 'patch' | 'minor' | 'major' | 'unknown';
|
|
10
|
+
export declare function classifyBump(from: string, to: string): UpdateBump;
|
|
11
|
+
/** Every closed choice `updates.autoUpdatePolicy` (the site-settings registry entry) may hold. */
|
|
12
|
+
export declare const AUTO_UPDATE_POLICIES: readonly ['off', 'patch', 'patch-minor', 'patch-minor-major'];
|
|
13
|
+
export type AutoUpdatePolicy = (typeof AUTO_UPDATE_POLICIES)[number];
|
|
14
|
+
/** Whether `bump` is one this policy allows to apply unattended. `'unknown'` and `'none'` are never allowed — nothing to apply, or nothing safely comparable. */
|
|
15
|
+
export declare function policyAllows(policy: AutoUpdatePolicy, bump: UpdateBump): boolean;
|
|
16
|
+
export declare function higherRiskBump(a: UpdateBump, b: UpdateBump): UpdateBump;
|
|
17
|
+
//# sourceMappingURL=version-compare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-compare.d.ts","sourceRoot":"","sources":["../../src/update/version-compare.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAA;AAEzE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,UAAU,CAUjE;AAED,kGAAkG;AAClG,eAAO,MAAM,oBAAoB,YAAI,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,mBAAmB,CAAU,CAAA;AACjG,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEpE,iKAAiK;AACjK,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAWhF;AAWD,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,UAAU,CAEvE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { compareVersions, parseVersion } from '@cogenta/plugins';
|
|
2
|
+
export function classifyBump(from, to) {
|
|
3
|
+
const fromVersion = parseVersion(from);
|
|
4
|
+
const toVersion = parseVersion(to);
|
|
5
|
+
if (fromVersion === null || toVersion === null)
|
|
6
|
+
return 'unknown';
|
|
7
|
+
const cmp = compareVersions(toVersion, fromVersion);
|
|
8
|
+
if (cmp <= 0)
|
|
9
|
+
return 'none';
|
|
10
|
+
if (toVersion.major !== fromVersion.major)
|
|
11
|
+
return 'major';
|
|
12
|
+
if (toVersion.minor !== fromVersion.minor)
|
|
13
|
+
return 'minor';
|
|
14
|
+
return 'patch';
|
|
15
|
+
}
|
|
16
|
+
/** Every closed choice `updates.autoUpdatePolicy` (the site-settings registry entry) may hold. */
|
|
17
|
+
export const AUTO_UPDATE_POLICIES = ['off', 'patch', 'patch-minor', 'patch-minor-major'];
|
|
18
|
+
/** Whether `bump` is one this policy allows to apply unattended. `'unknown'` and `'none'` are never allowed — nothing to apply, or nothing safely comparable. */
|
|
19
|
+
export function policyAllows(policy, bump) {
|
|
20
|
+
switch (policy) {
|
|
21
|
+
case 'off':
|
|
22
|
+
return false;
|
|
23
|
+
case 'patch':
|
|
24
|
+
return bump === 'patch';
|
|
25
|
+
case 'patch-minor':
|
|
26
|
+
return bump === 'patch' || bump === 'minor';
|
|
27
|
+
case 'patch-minor-major':
|
|
28
|
+
return bump === 'patch' || bump === 'minor' || bump === 'major';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** The higher-risk of two bumps, `'unknown'` treated as higher risk than `'major'` since it means "could not tell". */
|
|
32
|
+
const BUMP_RANK = {
|
|
33
|
+
none: 0,
|
|
34
|
+
patch: 1,
|
|
35
|
+
minor: 2,
|
|
36
|
+
major: 3,
|
|
37
|
+
unknown: 4,
|
|
38
|
+
};
|
|
39
|
+
export function higherRiskBump(a, b) {
|
|
40
|
+
return BUMP_RANK[a] >= BUMP_RANK[b] ? a : b;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=version-compare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-compare.js","sourceRoot":"","sources":["../../src/update/version-compare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAYhE,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,EAAU;IACnD,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IACtC,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,CAAC,CAAA;IAClC,IAAI,WAAW,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,SAAS,CAAA;IAEhE,MAAM,GAAG,GAAG,eAAe,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IACnD,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,MAAM,CAAA;IAC3B,IAAI,SAAS,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK;QAAE,OAAO,OAAO,CAAA;IACzD,IAAI,SAAS,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK;QAAE,OAAO,OAAO,CAAA;IACzD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,kGAAkG;AAClG,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,mBAAmB,CAAU,CAAA;AAGjG,iKAAiK;AACjK,MAAM,UAAU,YAAY,CAAC,MAAwB,EAAE,IAAgB;IACrE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,KAAK;YACR,OAAO,KAAK,CAAA;QACd,KAAK,OAAO;YACV,OAAO,IAAI,KAAK,OAAO,CAAA;QACzB,KAAK,aAAa;YAChB,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,CAAA;QAC7C,KAAK,mBAAmB;YACtB,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,CAAA;IACnE,CAAC;AACH,CAAC;AAED,uHAAuH;AACvH,MAAM,SAAS,GAAyC;IACtD,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;CACX,CAAA;AAED,MAAM,UAAU,cAAc,CAAC,CAAa,EAAE,CAAa;IACzD,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC7C,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@cogenta/cli`'s own installed version — self-describing, read from this
|
|
3
|
+
* package's own `package.json`, never bundled into a constant at build
|
|
4
|
+
* time. See `@cogenta/core`'s `readOwnPackageVersion` for why, and its own
|
|
5
|
+
* `getCoreVersion` for the sibling function — lazy for the exact same
|
|
6
|
+
* reason: never touch the filesystem merely because a module was imported.
|
|
7
|
+
*
|
|
8
|
+
* Kept in its own module (not `index.ts`) so `commands/update.ts` can import
|
|
9
|
+
* it directly without a circular import through `index.ts`, which re-exports
|
|
10
|
+
* this same function for external callers.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getCliVersion(): string;
|
|
13
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAGtC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { readOwnPackageVersion } from '@cogenta/core';
|
|
2
|
+
let cachedCliVersion;
|
|
3
|
+
/**
|
|
4
|
+
* `@cogenta/cli`'s own installed version — self-describing, read from this
|
|
5
|
+
* package's own `package.json`, never bundled into a constant at build
|
|
6
|
+
* time. See `@cogenta/core`'s `readOwnPackageVersion` for why, and its own
|
|
7
|
+
* `getCoreVersion` for the sibling function — lazy for the exact same
|
|
8
|
+
* reason: never touch the filesystem merely because a module was imported.
|
|
9
|
+
*
|
|
10
|
+
* Kept in its own module (not `index.ts`) so `commands/update.ts` can import
|
|
11
|
+
* it directly without a circular import through `index.ts`, which re-exports
|
|
12
|
+
* this same function for external callers.
|
|
13
|
+
*/
|
|
14
|
+
export function getCliVersion() {
|
|
15
|
+
cachedCliVersion ??= readOwnPackageVersion(new URL('../', import.meta.url));
|
|
16
|
+
return cachedCliVersion;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAErD,IAAI,gBAAoC,CAAA;AAExC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa;IAC3B,gBAAgB,KAAK,qBAAqB,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IAC3E,OAAO,gBAAgB,CAAA;AACzB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cogenta/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "The Cogenta command line: diagnose an install, run migrations, inspect drivers.",
|
|
5
5
|
"license": "MPL-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
}
|
|
15
15
|
},
|
|
16
16
|
"files": [
|
|
17
|
-
"dist"
|
|
17
|
+
"dist",
|
|
18
|
+
"CHANGELOG.md"
|
|
18
19
|
],
|
|
19
20
|
"engines": {
|
|
20
21
|
"node": ">=22.11.0"
|
|
@@ -30,17 +31,36 @@
|
|
|
30
31
|
},
|
|
31
32
|
"dependencies": {
|
|
32
33
|
"graphql": "^17.0.2",
|
|
33
|
-
"@cogenta/agents": "0.
|
|
34
|
-
"@cogenta/
|
|
35
|
-
"@cogenta/
|
|
36
|
-
"@cogenta/
|
|
37
|
-
"@cogenta/
|
|
38
|
-
"@cogenta/
|
|
39
|
-
"@cogenta/
|
|
40
|
-
"@cogenta/
|
|
41
|
-
"@cogenta/
|
|
42
|
-
"@cogenta/
|
|
43
|
-
"@cogenta/
|
|
34
|
+
"@cogenta/agents": "0.4.0",
|
|
35
|
+
"@cogenta/agents-builtin": "0.3.0",
|
|
36
|
+
"@cogenta/analytics": "0.3.1",
|
|
37
|
+
"@cogenta/auth": "0.5.0",
|
|
38
|
+
"@cogenta/api": "2.1.0",
|
|
39
|
+
"@cogenta/blocks": "1.0.1",
|
|
40
|
+
"@cogenta/comments": "0.2.1",
|
|
41
|
+
"@cogenta/commerce": "0.4.0",
|
|
42
|
+
"@cogenta/core": "0.6.0",
|
|
43
|
+
"@cogenta/forms": "0.2.1",
|
|
44
|
+
"@cogenta/import": "0.2.1",
|
|
45
|
+
"@cogenta/channels": "0.3.1",
|
|
46
|
+
"@cogenta/mcp": "0.3.0",
|
|
47
|
+
"@cogenta/schema": "0.4.1",
|
|
48
|
+
"@cogenta/observability": "0.2.1",
|
|
49
|
+
"@cogenta/plugins": "0.3.1",
|
|
50
|
+
"@cogenta/export": "0.2.1",
|
|
51
|
+
"@cogenta/seo": "0.3.1",
|
|
52
|
+
"@cogenta/render": "0.2.1",
|
|
53
|
+
"@cogenta/theme-blog": "0.3.0",
|
|
54
|
+
"@cogenta/theme-association": "0.3.0",
|
|
55
|
+
"@cogenta/theme-canonical": "1.1.0",
|
|
56
|
+
"@cogenta/theme-ecommerce": "1.1.0",
|
|
57
|
+
"@cogenta/theme-entreprise": "1.1.0",
|
|
58
|
+
"@cogenta/theme-kit": "0.3.0",
|
|
59
|
+
"@cogenta/theme-docs": "0.3.0",
|
|
60
|
+
"@cogenta/theme-magazine": "1.1.0",
|
|
61
|
+
"@cogenta/theme-portfolio": "1.1.0",
|
|
62
|
+
"@cogenta/theme-saas": "0.3.0",
|
|
63
|
+
"@cogenta/theme-restaurant": "0.3.0"
|
|
44
64
|
},
|
|
45
65
|
"devDependencies": {
|
|
46
66
|
"typescript": "^7.0.2",
|