@knowzai/cli 0.1.0 → 0.3.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/assets/portable/.env.example +3 -0
- package/assets/portable/docker-compose.yml +18 -0
- package/assets/portable/releases.json +22 -0
- package/assets/selfhosted/.env.example +19 -0
- package/assets/selfhosted/docker-compose.yml +96 -0
- package/assets/selfhosted/releases.json +28 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/base-command.d.ts +21 -2
- package/dist/base-command.d.ts.map +1 -1
- package/dist/base-command.js +47 -4
- package/dist/base-command.js.map +1 -1
- package/dist/commands/ask.d.ts.map +1 -1
- package/dist/commands/ask.js +5 -1
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/auth/status.d.ts +1 -1
- package/dist/commands/auth/status.d.ts.map +1 -1
- package/dist/commands/auth/status.js +4 -0
- package/dist/commands/auth/status.js.map +1 -1
- package/dist/commands/chat.d.ts +5 -0
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +32 -13
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/config/get.d.ts.map +1 -1
- package/dist/commands/config/get.js +3 -1
- package/dist/commands/config/get.js.map +1 -1
- package/dist/commands/config/list.d.ts.map +1 -1
- package/dist/commands/config/list.js +12 -4
- package/dist/commands/config/list.js.map +1 -1
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/down.d.ts +9 -0
- package/dist/commands/down.d.ts.map +1 -1
- package/dist/commands/down.js +16 -1
- package/dist/commands/down.js.map +1 -1
- package/dist/commands/export.d.ts +27 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +155 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/import.d.ts +27 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +124 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/index/scan.d.ts.map +1 -1
- package/dist/commands/index/scan.js +24 -5
- package/dist/commands/index/scan.js.map +1 -1
- package/dist/commands/knowledge/amend.d.ts +1 -0
- package/dist/commands/knowledge/amend.d.ts.map +1 -1
- package/dist/commands/knowledge/amend.js +11 -2
- package/dist/commands/knowledge/amend.js.map +1 -1
- package/dist/commands/knowledge/attach.d.ts +19 -0
- package/dist/commands/knowledge/attach.d.ts.map +1 -0
- package/dist/commands/knowledge/attach.js +51 -0
- package/dist/commands/knowledge/attach.js.map +1 -0
- package/dist/commands/knowledge/create.d.ts +9 -1
- package/dist/commands/knowledge/create.d.ts.map +1 -1
- package/dist/commands/knowledge/create.js +26 -4
- package/dist/commands/knowledge/create.js.map +1 -1
- package/dist/commands/knowledge/update.d.ts +1 -0
- package/dist/commands/knowledge/update.d.ts.map +1 -1
- package/dist/commands/knowledge/update.js +4 -1
- package/dist/commands/knowledge/update.js.map +1 -1
- package/dist/commands/login.d.ts +19 -3
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +113 -64
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +35 -1
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/mcp/serve.d.ts +16 -0
- package/dist/commands/mcp/serve.d.ts.map +1 -0
- package/dist/commands/mcp/serve.js +50 -0
- package/dist/commands/mcp/serve.js.map +1 -0
- package/dist/commands/menu.d.ts.map +1 -1
- package/dist/commands/menu.js +39 -3
- package/dist/commands/menu.js.map +1 -1
- package/dist/commands/peer/accept-fingerprint.d.ts +17 -0
- package/dist/commands/peer/accept-fingerprint.d.ts.map +1 -0
- package/dist/commands/peer/accept-fingerprint.js +35 -0
- package/dist/commands/peer/accept-fingerprint.js.map +1 -0
- package/dist/commands/peer/add.d.ts +22 -0
- package/dist/commands/peer/add.d.ts.map +1 -0
- package/dist/commands/peer/add.js +44 -0
- package/dist/commands/peer/add.js.map +1 -0
- package/dist/commands/peer/cancel.d.ts +13 -0
- package/dist/commands/peer/cancel.d.ts.map +1 -0
- package/dist/commands/peer/cancel.js +20 -0
- package/dist/commands/peer/cancel.js.map +1 -0
- package/dist/commands/peer/link.d.ts +16 -0
- package/dist/commands/peer/link.d.ts.map +1 -0
- package/dist/commands/peer/link.js +32 -0
- package/dist/commands/peer/link.js.map +1 -0
- package/dist/commands/peer/links.d.ts +12 -0
- package/dist/commands/peer/links.d.ts.map +1 -0
- package/dist/commands/peer/links.js +25 -0
- package/dist/commands/peer/links.js.map +1 -0
- package/dist/commands/peer/list.d.ts +10 -0
- package/dist/commands/peer/list.d.ts.map +1 -0
- package/dist/commands/peer/list.js +22 -0
- package/dist/commands/peer/list.js.map +1 -0
- package/dist/commands/peer/pull.d.ts +19 -0
- package/dist/commands/peer/pull.d.ts.map +1 -0
- package/dist/commands/peer/pull.js +30 -0
- package/dist/commands/peer/pull.js.map +1 -0
- package/dist/commands/peer/push.d.ts +19 -0
- package/dist/commands/peer/push.d.ts.map +1 -0
- package/dist/commands/peer/push.js +30 -0
- package/dist/commands/peer/push.js.map +1 -0
- package/dist/commands/peer/remove.d.ts +12 -0
- package/dist/commands/peer/remove.d.ts.map +1 -0
- package/dist/commands/peer/remove.js +19 -0
- package/dist/commands/peer/remove.js.map +1 -0
- package/dist/commands/peer/rotate-key.d.ts +14 -0
- package/dist/commands/peer/rotate-key.d.ts.map +1 -0
- package/dist/commands/peer/rotate-key.js +26 -0
- package/dist/commands/peer/rotate-key.js.map +1 -0
- package/dist/commands/peer/run.d.ts +13 -0
- package/dist/commands/peer/run.d.ts.map +1 -0
- package/dist/commands/peer/run.js +31 -0
- package/dist/commands/peer/run.js.map +1 -0
- package/dist/commands/peer/runs.d.ts +15 -0
- package/dist/commands/peer/runs.d.ts.map +1 -0
- package/dist/commands/peer/runs.js +32 -0
- package/dist/commands/peer/runs.js.map +1 -0
- package/dist/commands/peer/test.d.ts +13 -0
- package/dist/commands/peer/test.d.ts.map +1 -0
- package/dist/commands/peer/test.js +30 -0
- package/dist/commands/peer/test.js.map +1 -0
- package/dist/commands/peer/unlink.d.ts +13 -0
- package/dist/commands/peer/unlink.d.ts.map +1 -0
- package/dist/commands/peer/unlink.js +20 -0
- package/dist/commands/peer/unlink.js.map +1 -0
- package/dist/commands/pg/status.d.ts.map +1 -1
- package/dist/commands/pg/status.js +6 -3
- package/dist/commands/pg/status.js.map +1 -1
- package/dist/commands/pg/up.d.ts.map +1 -1
- package/dist/commands/pg/up.js +9 -4
- package/dist/commands/pg/up.js.map +1 -1
- package/dist/commands/platform/status.d.ts.map +1 -1
- package/dist/commands/platform/status.js +4 -4
- package/dist/commands/platform/status.js.map +1 -1
- package/dist/commands/profile/purge.d.ts +20 -0
- package/dist/commands/profile/purge.d.ts.map +1 -0
- package/dist/commands/profile/purge.js +43 -0
- package/dist/commands/profile/purge.js.map +1 -0
- package/dist/commands/repo/context.d.ts.map +1 -1
- package/dist/commands/repo/context.js +3 -1
- package/dist/commands/repo/context.js.map +1 -1
- package/dist/commands/repo/graph.d.ts +3 -6
- package/dist/commands/repo/graph.d.ts.map +1 -1
- package/dist/commands/repo/graph.js +24 -40
- package/dist/commands/repo/graph.js.map +1 -1
- package/dist/commands/repo/index/index.d.ts +1 -0
- package/dist/commands/repo/index/index.d.ts.map +1 -1
- package/dist/commands/repo/index/index.js +100 -12
- package/dist/commands/repo/index/index.js.map +1 -1
- package/dist/commands/repo/search.d.ts.map +1 -1
- package/dist/commands/repo/search.js +2 -0
- package/dist/commands/repo/search.js.map +1 -1
- package/dist/commands/repo/setup.d.ts +9 -2
- package/dist/commands/repo/setup.d.ts.map +1 -1
- package/dist/commands/repo/setup.js +84 -8
- package/dist/commands/repo/setup.js.map +1 -1
- package/dist/commands/status.d.ts +4 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +21 -3
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/transfer.d.ts +30 -0
- package/dist/commands/transfer.d.ts.map +1 -0
- package/dist/commands/transfer.js +140 -0
- package/dist/commands/transfer.js.map +1 -0
- package/dist/commands/tui.js +1 -1
- package/dist/commands/tui.js.map +1 -1
- package/dist/commands/up.d.ts +6 -27
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +63 -21
- package/dist/commands/up.js.map +1 -1
- package/dist/lib/attach.d.ts +48 -0
- package/dist/lib/attach.d.ts.map +1 -0
- package/dist/lib/attach.js +91 -0
- package/dist/lib/attach.js.map +1 -0
- package/dist/lib/chat-render.d.ts +39 -0
- package/dist/lib/chat-render.d.ts.map +1 -0
- package/dist/lib/chat-render.js +77 -0
- package/dist/lib/chat-render.js.map +1 -0
- package/dist/lib/cmek-guard.d.ts +52 -0
- package/dist/lib/cmek-guard.d.ts.map +1 -0
- package/dist/lib/cmek-guard.js +73 -0
- package/dist/lib/cmek-guard.js.map +1 -0
- package/dist/lib/content.d.ts +7 -0
- package/dist/lib/content.d.ts.map +1 -1
- package/dist/lib/content.js +9 -2
- package/dist/lib/content.js.map +1 -1
- package/dist/lib/credential-purge.d.ts +52 -0
- package/dist/lib/credential-purge.d.ts.map +1 -0
- package/dist/lib/credential-purge.js +37 -0
- package/dist/lib/credential-purge.js.map +1 -0
- package/dist/lib/ingest.d.ts.map +1 -1
- package/dist/lib/ingest.js +7 -3
- package/dist/lib/ingest.js.map +1 -1
- package/dist/lib/local-mcp-server.d.ts +82 -0
- package/dist/lib/local-mcp-server.d.ts.map +1 -0
- package/dist/lib/local-mcp-server.js +252 -0
- package/dist/lib/local-mcp-server.js.map +1 -0
- package/dist/lib/local-mcp-stdio.d.ts +8 -0
- package/dist/lib/local-mcp-stdio.d.ts.map +1 -0
- package/dist/lib/local-mcp-stdio.js +50 -0
- package/dist/lib/local-mcp-stdio.js.map +1 -0
- package/dist/lib/login-guided.d.ts +20 -0
- package/dist/lib/login-guided.d.ts.map +1 -0
- package/dist/lib/login-guided.js +89 -0
- package/dist/lib/login-guided.js.map +1 -0
- package/dist/lib/login.d.ts +58 -12
- package/dist/lib/login.d.ts.map +1 -1
- package/dist/lib/login.js +170 -12
- package/dist/lib/login.js.map +1 -1
- package/dist/lib/onboarding.d.ts +56 -0
- package/dist/lib/onboarding.d.ts.map +1 -0
- package/dist/lib/onboarding.js +67 -0
- package/dist/lib/onboarding.js.map +1 -0
- package/dist/lib/peer-command.d.ts +51 -0
- package/dist/lib/peer-command.d.ts.map +1 -0
- package/dist/lib/peer-command.js +120 -0
- package/dist/lib/peer-command.js.map +1 -0
- package/dist/lib/peer-support.d.ts +67 -0
- package/dist/lib/peer-support.d.ts.map +1 -0
- package/dist/lib/peer-support.js +154 -0
- package/dist/lib/peer-support.js.map +1 -0
- package/dist/lib/platform-edition.d.ts +34 -0
- package/dist/lib/platform-edition.d.ts.map +1 -0
- package/dist/lib/platform-edition.js +47 -0
- package/dist/lib/platform-edition.js.map +1 -0
- package/dist/lib/platform-frontdoor-runtime.d.ts.map +1 -1
- package/dist/lib/platform-frontdoor-runtime.js +32 -1
- package/dist/lib/platform-frontdoor-runtime.js.map +1 -1
- package/dist/lib/platform-frontdoor.d.ts +26 -2
- package/dist/lib/platform-frontdoor.d.ts.map +1 -1
- package/dist/lib/platform-frontdoor.js +363 -126
- package/dist/lib/platform-frontdoor.js.map +1 -1
- package/dist/lib/platform-lifecycle.d.ts +7 -0
- package/dist/lib/platform-lifecycle.d.ts.map +1 -1
- package/dist/lib/platform-lifecycle.js +14 -3
- package/dist/lib/platform-lifecycle.js.map +1 -1
- package/dist/lib/platform-onboarding.d.ts +1 -0
- package/dist/lib/platform-onboarding.d.ts.map +1 -1
- package/dist/lib/platform-onboarding.js +13 -2
- package/dist/lib/platform-onboarding.js.map +1 -1
- package/dist/lib/platform-profile-purge.d.ts +1 -1
- package/dist/lib/platform-profile-purge.d.ts.map +1 -1
- package/dist/lib/platform-profile-purge.js +2 -1
- package/dist/lib/platform-profile-purge.js.map +1 -1
- package/dist/lib/platform-provider-prompt.d.ts +4 -0
- package/dist/lib/platform-provider-prompt.d.ts.map +1 -1
- package/dist/lib/platform-provider-prompt.js +4 -0
- package/dist/lib/platform-provider-prompt.js.map +1 -1
- package/dist/lib/platform-release-manifest.d.ts +15 -1
- package/dist/lib/platform-release-manifest.d.ts.map +1 -1
- package/dist/lib/platform-release-manifest.js +24 -0
- package/dist/lib/platform-release-manifest.js.map +1 -1
- package/dist/lib/portability-shared.d.ts +49 -0
- package/dist/lib/portability-shared.d.ts.map +1 -0
- package/dist/lib/portability-shared.js +220 -0
- package/dist/lib/portability-shared.js.map +1 -0
- package/dist/lib/project-mcp-config.d.ts +14 -0
- package/dist/lib/project-mcp-config.d.ts.map +1 -0
- package/dist/lib/project-mcp-config.js +78 -0
- package/dist/lib/project-mcp-config.js.map +1 -0
- package/dist/lib/release-package-graph.d.ts +154 -0
- package/dist/lib/release-package-graph.d.ts.map +1 -0
- package/dist/lib/release-package-graph.js +249 -0
- package/dist/lib/release-package-graph.js.map +1 -0
- package/dist/lib/repo-binding.d.ts +7 -2
- package/dist/lib/repo-binding.d.ts.map +1 -1
- package/dist/lib/repo-binding.js +131 -18
- package/dist/lib/repo-binding.js.map +1 -1
- package/dist/lib/repo-command-support.d.ts +3 -1
- package/dist/lib/repo-command-support.d.ts.map +1 -1
- package/dist/lib/repo-command-support.js.map +1 -1
- package/dist/lib/repo-local-mcp-backend.d.ts +65 -0
- package/dist/lib/repo-local-mcp-backend.d.ts.map +1 -0
- package/dist/lib/repo-local-mcp-backend.js +288 -0
- package/dist/lib/repo-local-mcp-backend.js.map +1 -0
- package/dist/lib/repo-local-mcp-runtime.d.ts +17 -0
- package/dist/lib/repo-local-mcp-runtime.d.ts.map +1 -0
- package/dist/lib/repo-local-mcp-runtime.js +136 -0
- package/dist/lib/repo-local-mcp-runtime.js.map +1 -0
- package/dist/lib/repo-scope-migration.d.ts +4 -0
- package/dist/lib/repo-scope-migration.d.ts.map +1 -0
- package/dist/lib/repo-scope-migration.js +55 -0
- package/dist/lib/repo-scope-migration.js.map +1 -0
- package/dist/lib/repo-scope.d.ts +9 -0
- package/dist/lib/repo-scope.d.ts.map +1 -0
- package/dist/lib/repo-scope.js +15 -0
- package/dist/lib/repo-scope.js.map +1 -0
- package/dist/lib/safe-file.d.ts +141 -0
- package/dist/lib/safe-file.d.ts.map +1 -0
- package/dist/lib/safe-file.js +296 -0
- package/dist/lib/safe-file.js.map +1 -0
- package/dist/lib/selfhosted-lifecycle.d.ts +78 -0
- package/dist/lib/selfhosted-lifecycle.d.ts.map +1 -0
- package/dist/lib/selfhosted-lifecycle.js +195 -0
- package/dist/lib/selfhosted-lifecycle.js.map +1 -0
- package/dist/lib/setup-console.d.ts +1 -1
- package/dist/lib/setup-console.d.ts.map +1 -1
- package/dist/lib/setup-console.js +3 -1
- package/dist/lib/setup-console.js.map +1 -1
- package/dist/lib/setup-page.d.ts.map +1 -1
- package/dist/lib/setup-page.js +28 -10
- package/dist/lib/setup-page.js.map +1 -1
- package/dist/lib/setup-plan.d.ts +4 -1
- package/dist/lib/setup-plan.d.ts.map +1 -1
- package/dist/lib/setup-plan.js +10 -2
- package/dist/lib/setup-plan.js.map +1 -1
- package/dist/lib/setup-server.d.ts.map +1 -1
- package/dist/lib/setup-server.js +19 -3
- package/dist/lib/setup-server.js.map +1 -1
- package/dist/lib/sso-login.d.ts +42 -0
- package/dist/lib/sso-login.d.ts.map +1 -0
- package/dist/lib/sso-login.js +135 -0
- package/dist/lib/sso-login.js.map +1 -0
- package/dist/lib/transfer.d.ts +80 -0
- package/dist/lib/transfer.d.ts.map +1 -0
- package/dist/lib/transfer.js +173 -0
- package/dist/lib/transfer.js.map +1 -0
- package/dist/lib/tui.d.ts +0 -6
- package/dist/lib/tui.d.ts.map +1 -1
- package/dist/lib/tui.js +6 -1
- package/dist/lib/tui.js.map +1 -1
- package/dist/lib/ui.js +1 -1
- package/dist/lib/ui.js.map +1 -1
- package/dist/lib/up-result.d.ts +46 -0
- package/dist/lib/up-result.d.ts.map +1 -0
- package/dist/lib/up-result.js +25 -0
- package/dist/lib/up-result.js.map +1 -0
- package/dist/menu/run.d.ts +7 -0
- package/dist/menu/run.d.ts.map +1 -1
- package/dist/menu/run.js +38 -2
- package/dist/menu/run.js.map +1 -1
- package/oclif.manifest.json +3585 -1532
- package/package.json +19 -13
|
@@ -65,6 +65,30 @@ export function parsePlatformReleaseManifest(value) {
|
|
|
65
65
|
});
|
|
66
66
|
return { releases };
|
|
67
67
|
}
|
|
68
|
+
/** Semver-newest manifest entry carrying the required flavor; undefined when none does. */
|
|
69
|
+
export function newestManifestVersion(manifest, flavor) {
|
|
70
|
+
let newest;
|
|
71
|
+
for (const release of manifest.releases) {
|
|
72
|
+
if (!release.flavors.includes(flavor))
|
|
73
|
+
continue;
|
|
74
|
+
if (newest === undefined || compareVersions(release.version, newest) > 0)
|
|
75
|
+
newest = release.version;
|
|
76
|
+
}
|
|
77
|
+
return newest;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* §2026-08-31 R4 runtime freshness notice. Pure — the caller supplies the manifest
|
|
81
|
+
* (already-fetched on the self-serve path, bounded advisory fetch elsewhere) and
|
|
82
|
+
* decides whether/where to log. Returns undefined when the booted version is
|
|
83
|
+
* already the newest known release of the flavor (never advises a downgrade).
|
|
84
|
+
* Copy frozen at the WG consistency review (`platform upgrade --version <semver>`).
|
|
85
|
+
*/
|
|
86
|
+
export function releaseFreshnessNotice(input) {
|
|
87
|
+
const newest = newestManifestVersion(input.manifest, input.flavor);
|
|
88
|
+
if (!newest || compareVersions(newest, input.currentVersion) <= 0)
|
|
89
|
+
return undefined;
|
|
90
|
+
return `Newer Knowz Platform ${newest} is available — run 'knowz platform upgrade --version ${newest}' after setup.`;
|
|
91
|
+
}
|
|
68
92
|
export function resolvePlatformRelease(input) {
|
|
69
93
|
const releases = [...input.manifest.releases].sort((a, b) => compareVersions(b.version, a.version));
|
|
70
94
|
if (input.requestedVersion) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-release-manifest.js","sourceRoot":"","sources":["../../src/lib/platform-release-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAsB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"platform-release-manifest.js","sourceRoot":"","sources":["../../src/lib/platform-release-manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { KnowzError } from '@knowzai/core';
|
|
2
|
+
import type { ExportScopeInput, ImportValidation, ImportOutcome } from '@knowzai/api-client';
|
|
3
|
+
/**
|
|
4
|
+
* Pure decision + rendering helpers shared by `knowz export`, `knowz import`
|
|
5
|
+
* and `knowz transfer` (CLI_PortabilityTransfer, CLI_InstanceTransfer).
|
|
6
|
+
* Everything here is unit-testable without a network or a TTY.
|
|
7
|
+
*/
|
|
8
|
+
export declare const PORTABILITY_USER_KEY_GUIDANCE: string;
|
|
9
|
+
/** Reject a tenant `kz_` key BEFORE any HTTP call, naming the profile and the fix. */
|
|
10
|
+
export declare function assertPortabilityKeyKind(key: string | undefined, profile?: string): void;
|
|
11
|
+
/**
|
|
12
|
+
* Fallback for credentials the CLI cannot classify locally: a portability 401
|
|
13
|
+
* means "authenticated but no user identity", not "not logged in" — replace the
|
|
14
|
+
* generic re-login hint with the actionable copy.
|
|
15
|
+
*/
|
|
16
|
+
export declare function mapPortabilityAuthError(e: unknown): KnowzError | undefined;
|
|
17
|
+
export interface ScopeFlags {
|
|
18
|
+
scope?: string;
|
|
19
|
+
vaultId?: string;
|
|
20
|
+
itemIds?: string[];
|
|
21
|
+
}
|
|
22
|
+
export declare function inferExportScope(flags: ScopeFlags): ExportScopeInput;
|
|
23
|
+
export declare function detectPackageKind(path: string): 'zip' | 'json';
|
|
24
|
+
export declare function defaultExportFileName(mode: 'Light' | 'Full', at?: Date): string;
|
|
25
|
+
/** `--out` may name a file OR an existing directory; omitted ⇒ default name in cwd. */
|
|
26
|
+
export declare function resolveExportOutPath(out: string | undefined, mode: 'Light' | 'Full', at?: Date): string;
|
|
27
|
+
/** Multi-part outputs land as `<out>.part{N}.zip` (R5); a trailing .zip on out collapses. */
|
|
28
|
+
export declare function partOutPath(outPath: string, partNumber: number): string;
|
|
29
|
+
/** Part-level resume (R5): skip only when the on-disk size equals `sizeBytes` exactly. */
|
|
30
|
+
export declare function shouldSkipExistingPart(path: string, sizeBytes: number): boolean;
|
|
31
|
+
export type ImportGateDecision = 'proceed' | 'prompt' | 'refuse';
|
|
32
|
+
export declare function decideImportGate(input: {
|
|
33
|
+
confirmationRequired: boolean;
|
|
34
|
+
interactive: boolean;
|
|
35
|
+
yes: boolean;
|
|
36
|
+
}): ImportGateDecision;
|
|
37
|
+
export declare function totalConflicts(v: Pick<ImportValidation, 'conflictingVaults' | 'conflictingKnowledgeItems' | 'conflictingTopics' | 'conflictingPersons'>): number;
|
|
38
|
+
/** Central `/import` has no explicit body-size limit — Kestrel's ~28 MB default applies (R10). */
|
|
39
|
+
export declare const LARGE_JSON_WARN_BYTES: number;
|
|
40
|
+
/** R10 — warn strictly ABOVE the threshold (25 MB exactly is still fine). */
|
|
41
|
+
export declare function shouldWarnLargeJson(sizeBytes: number): boolean;
|
|
42
|
+
export declare function isJobComplete(status: string): boolean;
|
|
43
|
+
export declare function isJobFailed(status: string): boolean;
|
|
44
|
+
export declare function renderValidationPreview(v: ImportValidation): string[];
|
|
45
|
+
/** Per-category report (R9) — a partial import is never collapsed into a cheerful success. */
|
|
46
|
+
export declare function renderImportOutcome(o: ImportOutcome): string[];
|
|
47
|
+
/** A progress ticker on stderr — suppressed for non-TTY stderr and in --json mode (R4). */
|
|
48
|
+
export declare function makeDownloadProgress(jsonMode: boolean): ((bytes: number, total?: number) => void) | undefined;
|
|
49
|
+
//# sourceMappingURL=portability-shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portability-shared.d.ts","sourceRoot":"","sources":["../../src/lib/portability-shared.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAY,MAAM,eAAe,CAAC;AAErD,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EAEd,MAAM,qBAAqB,CAAC;AAE7B;;;;GAIG;AAUH,eAAO,MAAM,6BAA6B,QAGP,CAAC;AAEpC,sFAAsF;AACtF,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAQxF;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAU1E;AAID,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,gBAAgB,CAgCpE;AAMD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAgB9D;AAYD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,EAAE,GAAE,IAAiB,GAAG,MAAM,CAE3F;AAED,uFAAuF;AACvF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,EAAE,GAAE,IAAiB,GAAG,MAAM,CAQnH;AAED,6FAA6F;AAC7F,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,0FAA0F;AAC1F,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAO/E;AAID,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEjE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,WAAW,EAAE,OAAO,CAAC;IACrB,GAAG,EAAE,OAAO,CAAC;CACd,GAAG,kBAAkB,CAGrB;AAED,wBAAgB,cAAc,CAC5B,CAAC,EAAE,IAAI,CACL,gBAAgB,EAChB,mBAAmB,GAAG,2BAA2B,GAAG,mBAAmB,GAAG,oBAAoB,CAC/F,GACA,MAAM,CAER;AAED,kGAAkG;AAClG,eAAO,MAAM,qBAAqB,QAAmB,CAAC;AAEtD,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE9D;AAID,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAID,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAuBrE;AAQD,8FAA8F;AAC9F,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,EAAE,CAqB9D;AAED,2FAA2F;AAC3F,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAU7G"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { closeSync, existsSync, openSync, readSync, statSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { KnowzError, ExitCode } from '@knowzai/core';
|
|
4
|
+
import { ApiError } from '@knowzai/types';
|
|
5
|
+
/**
|
|
6
|
+
* Pure decision + rendering helpers shared by `knowz export`, `knowz import`
|
|
7
|
+
* and `knowz transfer` (CLI_PortabilityTransfer, CLI_InstanceTransfer).
|
|
8
|
+
* Everything here is unit-testable without a network or a TTY.
|
|
9
|
+
*/
|
|
10
|
+
// --- key-kind preflight + 401 mapping (smoke MED) -----------------------------
|
|
11
|
+
//
|
|
12
|
+
// The portability endpoints resolve a USER identity from the credential
|
|
13
|
+
// (`ExtractUserId` in PortabilityEndpoints.cs) — a tenant `kz_` key
|
|
14
|
+
// authenticates but carries none, so the server answers 401 even though the
|
|
15
|
+
// profile IS logged in. Mirror of the peer-command `ukz_` preflight pattern:
|
|
16
|
+
// detect locally where the key is readable; map the 401 for opaque credentials.
|
|
17
|
+
export const PORTABILITY_USER_KEY_GUIDANCE = 'Export/import/transfer need a key that carries a user identity — a personal ukz_ key. ' +
|
|
18
|
+
'Mint one with `knowz login` (choose a personal key) or POST /api/v1/apikeys with keyType "user", ' +
|
|
19
|
+
'then store it for this profile.';
|
|
20
|
+
/** Reject a tenant `kz_` key BEFORE any HTTP call, naming the profile and the fix. */
|
|
21
|
+
export function assertPortabilityKeyKind(key, profile) {
|
|
22
|
+
if (key?.startsWith('kz_')) {
|
|
23
|
+
throw new KnowzError(`${profile ? `Profile '${profile}' holds` : 'The stored credential is'} a tenant API key (kz_), ` +
|
|
24
|
+
`which carries no user identity. ${PORTABILITY_USER_KEY_GUIDANCE}`, ExitCode.Auth);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Fallback for credentials the CLI cannot classify locally: a portability 401
|
|
29
|
+
* means "authenticated but no user identity", not "not logged in" — replace the
|
|
30
|
+
* generic re-login hint with the actionable copy.
|
|
31
|
+
*/
|
|
32
|
+
export function mapPortabilityAuthError(e) {
|
|
33
|
+
if (e instanceof ApiError && e.status === 401) {
|
|
34
|
+
return new KnowzError(`The server rejected this credential for portability (401): it authenticates but carries no ` +
|
|
35
|
+
`user identity. ${PORTABILITY_USER_KEY_GUIDANCE}`, ExitCode.Auth, { cause: e });
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
export function inferExportScope(flags) {
|
|
40
|
+
const items = flags.itemIds?.length ? flags.itemIds : undefined;
|
|
41
|
+
const vaultIds = flags.vaultId ? [flags.vaultId] : undefined;
|
|
42
|
+
switch (flags.scope) {
|
|
43
|
+
case 'tenant':
|
|
44
|
+
if (items || vaultIds) {
|
|
45
|
+
throw new KnowzError('--scope tenant exports everything — drop --vault/--items.', ExitCode.Usage);
|
|
46
|
+
}
|
|
47
|
+
return { scopeType: 'Tenant' };
|
|
48
|
+
case 'vault':
|
|
49
|
+
case 'vault-with-children':
|
|
50
|
+
if (!vaultIds)
|
|
51
|
+
throw new KnowzError(`--scope ${flags.scope} requires --vault.`, ExitCode.Usage);
|
|
52
|
+
return { scopeType: flags.scope === 'vault' ? 'Vault' : 'VaultWithChildren', vaultIds };
|
|
53
|
+
case 'items':
|
|
54
|
+
if (!items)
|
|
55
|
+
throw new KnowzError('--scope items requires --items.', ExitCode.Usage);
|
|
56
|
+
return { scopeType: items.length === 1 ? 'SingleItem' : 'MultiSelect', knowledgeItemIds: items };
|
|
57
|
+
case undefined:
|
|
58
|
+
break;
|
|
59
|
+
default:
|
|
60
|
+
throw new KnowzError(`Unknown --scope '${flags.scope}'.`, ExitCode.Usage);
|
|
61
|
+
}
|
|
62
|
+
if (items && vaultIds) {
|
|
63
|
+
throw new KnowzError('Give either --vault or --items (or an explicit --scope), not both.', ExitCode.Usage);
|
|
64
|
+
}
|
|
65
|
+
if (items)
|
|
66
|
+
return { scopeType: items.length === 1 ? 'SingleItem' : 'MultiSelect', knowledgeItemIds: items };
|
|
67
|
+
if (vaultIds)
|
|
68
|
+
return { scopeType: 'Vault', vaultIds };
|
|
69
|
+
return { scopeType: 'Tenant' };
|
|
70
|
+
}
|
|
71
|
+
// --- payload kind by magic bytes, never by extension (R8) ---------------------
|
|
72
|
+
const ZIP_MAGIC = Buffer.from('PK\x03\x04', 'binary');
|
|
73
|
+
export function detectPackageKind(path) {
|
|
74
|
+
let fd;
|
|
75
|
+
try {
|
|
76
|
+
fd = openSync(path, 'r');
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
// L4 — a missing/unreadable package file is a usage problem, not a crash.
|
|
80
|
+
const code = e.code ?? (e instanceof Error ? e.message : String(e));
|
|
81
|
+
throw new KnowzError(`Cannot read package file '${path}' (${code}).`, ExitCode.Usage);
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
const head = Buffer.alloc(4);
|
|
85
|
+
const read = readSync(fd, head, 0, 4, 0);
|
|
86
|
+
return read === 4 && head.equals(ZIP_MAGIC) ? 'zip' : 'json';
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
closeSync(fd);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// --- out-path handling (R4/R5) ------------------------------------------------
|
|
93
|
+
function utcStamp(at) {
|
|
94
|
+
const p = (n, w = 2) => String(n).padStart(w, '0');
|
|
95
|
+
return (`${at.getUTCFullYear()}${p(at.getUTCMonth() + 1)}${p(at.getUTCDate())}` +
|
|
96
|
+
`-${p(at.getUTCHours())}${p(at.getUTCMinutes())}${p(at.getUTCSeconds())}`);
|
|
97
|
+
}
|
|
98
|
+
export function defaultExportFileName(mode, at = new Date()) {
|
|
99
|
+
return `knowz-export-${utcStamp(at)}.${mode === 'Full' ? 'zip' : 'json'}`;
|
|
100
|
+
}
|
|
101
|
+
/** `--out` may name a file OR an existing directory; omitted ⇒ default name in cwd. */
|
|
102
|
+
export function resolveExportOutPath(out, mode, at = new Date()) {
|
|
103
|
+
if (!out)
|
|
104
|
+
return defaultExportFileName(mode, at);
|
|
105
|
+
try {
|
|
106
|
+
if (statSync(out).isDirectory())
|
|
107
|
+
return join(out, defaultExportFileName(mode, at));
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// not an existing path — treat as a file name
|
|
111
|
+
}
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
/** Multi-part outputs land as `<out>.part{N}.zip` (R5); a trailing .zip on out collapses. */
|
|
115
|
+
export function partOutPath(outPath, partNumber) {
|
|
116
|
+
return `${outPath.replace(/\.zip$/i, '')}.part${partNumber}.zip`;
|
|
117
|
+
}
|
|
118
|
+
/** Part-level resume (R5): skip only when the on-disk size equals `sizeBytes` exactly. */
|
|
119
|
+
export function shouldSkipExistingPart(path, sizeBytes) {
|
|
120
|
+
if (!existsSync(path))
|
|
121
|
+
return false;
|
|
122
|
+
try {
|
|
123
|
+
return statSync(path).size === sizeBytes;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
export function decideImportGate(input) {
|
|
130
|
+
if (!input.confirmationRequired || input.yes)
|
|
131
|
+
return 'proceed';
|
|
132
|
+
return input.interactive ? 'prompt' : 'refuse';
|
|
133
|
+
}
|
|
134
|
+
export function totalConflicts(v) {
|
|
135
|
+
return v.conflictingVaults + v.conflictingKnowledgeItems + v.conflictingTopics + v.conflictingPersons;
|
|
136
|
+
}
|
|
137
|
+
/** Central `/import` has no explicit body-size limit — Kestrel's ~28 MB default applies (R10). */
|
|
138
|
+
export const LARGE_JSON_WARN_BYTES = 25 * 1024 * 1024;
|
|
139
|
+
/** R10 — warn strictly ABOVE the threshold (25 MB exactly is still fine). */
|
|
140
|
+
export function shouldWarnLargeJson(sizeBytes) {
|
|
141
|
+
return sizeBytes > LARGE_JSON_WARN_BYTES;
|
|
142
|
+
}
|
|
143
|
+
// --- export job status classification ----------------------------------------
|
|
144
|
+
export function isJobComplete(status) {
|
|
145
|
+
const s = status.toLowerCase();
|
|
146
|
+
return s === 'complete' || s === 'completed';
|
|
147
|
+
}
|
|
148
|
+
export function isJobFailed(status) {
|
|
149
|
+
return ['failed', 'error', 'cancelled', 'canceled'].includes(status.toLowerCase());
|
|
150
|
+
}
|
|
151
|
+
// --- human rendering ----------------------------------------------------------
|
|
152
|
+
export function renderValidationPreview(v) {
|
|
153
|
+
const lines = [];
|
|
154
|
+
lines.push(`Package: schema v${v.schemaVersion} (${v.schemaCompatible ? 'compatible' : 'INCOMPATIBLE'})` +
|
|
155
|
+
(v.sourceEdition ? ` — source: ${v.sourceEdition}` : ''));
|
|
156
|
+
if (v.schemaError)
|
|
157
|
+
lines.push(`Schema error: ${v.schemaError}`);
|
|
158
|
+
lines.push(`Contents: ${v.totalVaults} vault(s), ${v.totalKnowledgeItems} item(s), ${v.totalTopics} topic(s), ` +
|
|
159
|
+
`${v.totalTags} tag(s), ${v.totalPersons} person(s), ${v.totalLocations} location(s), ` +
|
|
160
|
+
`${v.totalEvents} event(s), ${v.totalComments} comment(s), ${v.totalFileRecords} file(s)`);
|
|
161
|
+
const conflicts = totalConflicts(v);
|
|
162
|
+
lines.push(conflicts > 0
|
|
163
|
+
? `Conflicts: ${v.conflictingVaults} vault(s), ${v.conflictingKnowledgeItems} item(s), ` +
|
|
164
|
+
`${v.conflictingTopics} topic(s), ${v.conflictingPersons} person(s)`
|
|
165
|
+
: 'Conflicts: none');
|
|
166
|
+
for (const w of v.warnings)
|
|
167
|
+
lines.push(`Warning: ${w}`);
|
|
168
|
+
for (const e of v.errors)
|
|
169
|
+
lines.push(`Error: ${e}`);
|
|
170
|
+
lines.push(v.isValid ? 'Validation: PASSED' : 'Validation: FAILED');
|
|
171
|
+
return lines;
|
|
172
|
+
}
|
|
173
|
+
function countsLine(label, c) {
|
|
174
|
+
const total = c.created + c.skipped + c.overwritten + c.merged;
|
|
175
|
+
if (total === 0)
|
|
176
|
+
return undefined;
|
|
177
|
+
return ` ${label}: ${c.created} created, ${c.skipped} skipped, ${c.overwritten} overwritten, ${c.merged} merged`;
|
|
178
|
+
}
|
|
179
|
+
/** Per-category report (R9) — a partial import is never collapsed into a cheerful success. */
|
|
180
|
+
export function renderImportOutcome(o) {
|
|
181
|
+
const lines = [o.success ? 'Import completed.' : `Import FAILED${o.error ? `: ${o.error}` : '.'}`];
|
|
182
|
+
const categories = [
|
|
183
|
+
['vaults', o.vaults],
|
|
184
|
+
['knowledge items', o.knowledgeItems],
|
|
185
|
+
['topics', o.topics],
|
|
186
|
+
['tags', o.tags],
|
|
187
|
+
['persons', o.persons],
|
|
188
|
+
['locations', o.locations],
|
|
189
|
+
['events', o.events],
|
|
190
|
+
['comments', o.comments],
|
|
191
|
+
['file records', o.fileRecords],
|
|
192
|
+
];
|
|
193
|
+
for (const [label, counts] of categories) {
|
|
194
|
+
const line = countsLine(label, counts);
|
|
195
|
+
if (line)
|
|
196
|
+
lines.push(line);
|
|
197
|
+
}
|
|
198
|
+
if (o.junctionsRestored > 0)
|
|
199
|
+
lines.push(` junctions restored: ${o.junctionsRestored}`);
|
|
200
|
+
if (o.filesBlobFailed > 0)
|
|
201
|
+
lines.push(` FILE BLOBS FAILED: ${o.filesBlobFailed}`);
|
|
202
|
+
for (const w of o.warnings)
|
|
203
|
+
lines.push(`Warning: ${w}`);
|
|
204
|
+
return lines;
|
|
205
|
+
}
|
|
206
|
+
/** A progress ticker on stderr — suppressed for non-TTY stderr and in --json mode (R4). */
|
|
207
|
+
export function makeDownloadProgress(jsonMode) {
|
|
208
|
+
if (jsonMode || !process.stderr.isTTY)
|
|
209
|
+
return undefined;
|
|
210
|
+
let lastRender = 0;
|
|
211
|
+
return (bytes, total) => {
|
|
212
|
+
const now = Date.now();
|
|
213
|
+
if (now - lastRender < 200)
|
|
214
|
+
return;
|
|
215
|
+
lastRender = now;
|
|
216
|
+
const mb = (n) => (n / (1024 * 1024)).toFixed(1);
|
|
217
|
+
process.stderr.write(`\r${mb(bytes)} MB${total ? ` / ${mb(total)} MB` : ''} `);
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=portability-shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portability-shared.js","sourceRoot":"","sources":["../../src/lib/portability-shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAQ1C;;;;GAIG;AAEH,iFAAiF;AACjF,EAAE;AACF,wEAAwE;AACxE,oEAAoE;AACpE,4EAA4E;AAC5E,6EAA6E;AAC7E,gFAAgF;AAEhF,MAAM,CAAC,MAAM,6BAA6B,GACxC,wFAAwF;IACxF,mGAAmG;IACnG,iCAAiC,CAAC;AAEpC,sFAAsF;AACtF,MAAM,UAAU,wBAAwB,CAAC,GAAuB,EAAE,OAAgB;IAChF,IAAI,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,UAAU,CAClB,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,OAAO,SAAS,CAAC,CAAC,CAAC,0BAA0B,2BAA2B;YAC/F,mCAAmC,6BAA6B,EAAE,EACpE,QAAQ,CAAC,IAAI,CACd,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,CAAU;IAChD,IAAI,CAAC,YAAY,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC9C,OAAO,IAAI,UAAU,CACnB,6FAA6F;YAC3F,kBAAkB,6BAA6B,EAAE,EACnD,QAAQ,CAAC,IAAI,EACb,EAAE,KAAK,EAAE,CAAC,EAAE,CACb,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAUD,MAAM,UAAU,gBAAgB,CAAC,KAAiB;IAChD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE7D,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,IAAI,KAAK,IAAI,QAAQ,EAAE,CAAC;gBACtB,MAAM,IAAI,UAAU,CAAC,2DAA2D,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YACpG,CAAC;YACD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QACjC,KAAK,OAAO,CAAC;QACb,KAAK,qBAAqB;YACxB,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,UAAU,CAAC,WAAW,KAAK,CAAC,KAAK,oBAAoB,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChG,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,EAAE,QAAQ,EAAE,CAAC;QAC1F,KAAK,OAAO;YACV,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,UAAU,CAAC,iCAAiC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YACpF,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;QACnG,KAAK,SAAS;YACZ,MAAM;QACR;YACE,MAAM,IAAI,UAAU,CAAC,oBAAoB,KAAK,CAAC,KAAK,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,KAAK,IAAI,QAAQ,EAAE,CAAC;QACtB,MAAM,IAAI,UAAU,CAClB,oEAAoE,EACpE,QAAQ,CAAC,KAAK,CACf,CAAC;IACJ,CAAC;IACD,IAAI,KAAK;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;IAC5G,IAAI,QAAQ;QAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AACjC,CAAC;AAED,iFAAiF;AAEjF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AAEtD,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,EAAU,CAAC;IACf,IAAI,CAAC;QACH,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,0EAA0E;QAC1E,MAAM,IAAI,GAAI,CAA2B,CAAC,IAAI,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/F,MAAM,IAAI,UAAU,CAAC,6BAA6B,IAAI,MAAM,IAAI,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACzC,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/D,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,SAAS,QAAQ,CAAC,EAAQ;IACxB,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3D,OAAO,CACL,GAAG,EAAE,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,EAAE;QACvE,IAAI,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,EAAE,CAC1E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAsB,EAAE,KAAW,IAAI,IAAI,EAAE;IACjF,OAAO,gBAAgB,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AAC5E,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,oBAAoB,CAAC,GAAuB,EAAE,IAAsB,EAAE,KAAW,IAAI,IAAI,EAAE;IACzG,IAAI,CAAC,GAAG;QAAE,OAAO,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC;QACH,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;YAAE,OAAO,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IACrF,CAAC;IAAC,MAAM,CAAC;QACP,8CAA8C;IAChD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,UAAkB;IAC7D,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,UAAU,MAAM,CAAC;AACnE,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAE,SAAiB;IACpE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAMD,MAAM,UAAU,gBAAgB,CAAC,KAIhC;IACC,IAAI,CAAC,KAAK,CAAC,oBAAoB,IAAI,KAAK,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC/D,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,CAGC;IAED,OAAO,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,yBAAyB,GAAG,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,kBAAkB,CAAC;AACxG,CAAC;AAED,kGAAkG;AAClG,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEtD,6EAA6E;AAC7E,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,OAAO,SAAS,GAAG,qBAAqB,CAAC;AAC3C,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAC/B,OAAO,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,WAAW,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;AACrF,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,uBAAuB,CAAC,CAAmB;IACzD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CACR,oBAAoB,CAAC,CAAC,aAAa,KAAK,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,GAAG;QAC3F,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAC3D,CAAC;IACF,IAAI,CAAC,CAAC,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAChE,KAAK,CAAC,IAAI,CACR,aAAa,CAAC,CAAC,WAAW,cAAc,CAAC,CAAC,mBAAmB,aAAa,CAAC,CAAC,WAAW,aAAa;QAClG,GAAG,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,YAAY,eAAe,CAAC,CAAC,cAAc,gBAAgB;QACvF,GAAG,CAAC,CAAC,WAAW,cAAc,CAAC,CAAC,aAAa,gBAAgB,CAAC,CAAC,gBAAgB,UAAU,CAC5F,CAAC;IACF,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CACR,SAAS,GAAG,CAAC;QACX,CAAC,CAAC,cAAc,CAAC,CAAC,iBAAiB,cAAc,CAAC,CAAC,yBAAyB,YAAY;YACpF,GAAG,CAAC,CAAC,iBAAiB,cAAc,CAAC,CAAC,kBAAkB,YAAY;QACxE,CAAC,CAAC,iBAAiB,CACtB,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACxD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACpD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;IACpE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,KAAa,EAAE,CAAe;IAChD,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/D,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAClC,OAAO,KAAK,KAAK,KAAK,CAAC,CAAC,OAAO,aAAa,CAAC,CAAC,OAAO,aAAa,CAAC,CAAC,WAAW,iBAAiB,CAAC,CAAC,MAAM,SAAS,CAAC;AACpH,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,mBAAmB,CAAC,CAAgB;IAClD,MAAM,KAAK,GAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7G,MAAM,UAAU,GAA6B;QAC3C,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,CAAC,iBAAiB,EAAE,CAAC,CAAC,cAAc,CAAC;QACrC,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;QAChB,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC;QACtB,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC;QAC1B,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC;QACxB,CAAC,cAAc,EAAE,CAAC,CAAC,WAAW,CAAC;KAChC,CAAC;IACF,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACvC,IAAI,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC,CAAC,iBAAiB,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxF,IAAI,CAAC,CAAC,eAAe,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;IACnF,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACxD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,oBAAoB,CAAC,QAAiB;IACpD,IAAI,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IACxD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,GAAG,GAAG,UAAU,GAAG,GAAG;YAAE,OAAO;QACnC,UAAU,GAAG,GAAG,CAAC;QACjB,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjF,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface ProjectMcpInstallResult {
|
|
2
|
+
path: string;
|
|
3
|
+
changed: boolean;
|
|
4
|
+
dryRun: boolean;
|
|
5
|
+
entry: {
|
|
6
|
+
command: string;
|
|
7
|
+
args: string[];
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export declare function installProjectMcpConfig(repoRoot: string, opts?: {
|
|
11
|
+
dryRun?: boolean;
|
|
12
|
+
command?: string;
|
|
13
|
+
}): ProjectMcpInstallResult;
|
|
14
|
+
//# sourceMappingURL=project-mcp-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-mcp-config.d.ts","sourceRoot":"","sources":["../../src/lib/project-mcp-config.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAC5C;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,uBAAuB,CAqCzB"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { closeSync, constants as fsConstants, existsSync, fstatSync, lstatSync, openSync, readFileSync, realpathSync, renameSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { ExitCode, KnowzError } from '@knowzai/core';
|
|
5
|
+
const MAX_PROJECT_MCP_CONFIG_BYTES = 1024 * 1024;
|
|
6
|
+
const O_NOFOLLOW = fsConstants.O_NOFOLLOW ?? 0;
|
|
7
|
+
export function installProjectMcpConfig(repoRoot, opts = {}) {
|
|
8
|
+
const root = realpathSync(repoRoot);
|
|
9
|
+
const path = join(root, '.mcp.json');
|
|
10
|
+
const entry = {
|
|
11
|
+
command: opts.command ?? 'knowz',
|
|
12
|
+
args: ['mcp', 'serve', '--path', root],
|
|
13
|
+
};
|
|
14
|
+
const current = readExisting(path);
|
|
15
|
+
const servers = current.mcpServers;
|
|
16
|
+
if (servers !== undefined && (!servers || typeof servers !== 'object' || Array.isArray(servers))) {
|
|
17
|
+
throw new KnowzError(`Invalid mcpServers object in ${path}`, ExitCode.Usage);
|
|
18
|
+
}
|
|
19
|
+
const existingEntry = servers?.['knowz-local'];
|
|
20
|
+
const changed = JSON.stringify(existingEntry) !== JSON.stringify(entry);
|
|
21
|
+
const result = { path, changed, dryRun: Boolean(opts.dryRun), entry };
|
|
22
|
+
if (!changed || opts.dryRun)
|
|
23
|
+
return result;
|
|
24
|
+
const next = {
|
|
25
|
+
...current,
|
|
26
|
+
mcpServers: {
|
|
27
|
+
...(servers ?? {}),
|
|
28
|
+
'knowz-local': entry,
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
const temp = join(root, `.mcp.json.${randomUUID()}.tmp`);
|
|
32
|
+
try {
|
|
33
|
+
const fd = openSync(temp, fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL, 0o600);
|
|
34
|
+
try {
|
|
35
|
+
writeFileSync(fd, `${JSON.stringify(next, null, 2)}\n`, 'utf8');
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
closeSync(fd);
|
|
39
|
+
}
|
|
40
|
+
renameSync(temp, path);
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
if (existsSync(temp))
|
|
44
|
+
unlinkSync(temp);
|
|
45
|
+
}
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
function readExisting(path) {
|
|
49
|
+
if (!existsSync(path))
|
|
50
|
+
return {};
|
|
51
|
+
if (lstatSync(path).isSymbolicLink()) {
|
|
52
|
+
throw new KnowzError(`Refusing symbolic link MCP config: ${path}`, ExitCode.Usage);
|
|
53
|
+
}
|
|
54
|
+
let fd;
|
|
55
|
+
try {
|
|
56
|
+
fd = openSync(path, fsConstants.O_RDONLY | O_NOFOLLOW);
|
|
57
|
+
const stat = fstatSync(fd);
|
|
58
|
+
if (!stat.isFile())
|
|
59
|
+
throw new Error('target is not a regular file');
|
|
60
|
+
if (stat.size > MAX_PROJECT_MCP_CONFIG_BYTES) {
|
|
61
|
+
throw new KnowzError(`MCP config exceeds the 1 MiB limit at ${path}`, ExitCode.Usage);
|
|
62
|
+
}
|
|
63
|
+
const parsed = JSON.parse(readFileSync(fd, 'utf8'));
|
|
64
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
65
|
+
throw new Error('root is not an object');
|
|
66
|
+
return parsed;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (error instanceof KnowzError)
|
|
70
|
+
throw error;
|
|
71
|
+
throw new KnowzError(`Malformed MCP JSON at ${path}`, ExitCode.Usage, { cause: error });
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
if (fd !== undefined)
|
|
75
|
+
closeSync(fd);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=project-mcp-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-mcp-config.js","sourceRoot":"","sources":["../../src/lib/project-mcp-config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,SAAS,IAAI,WAAW,EACxB,UAAU,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,UAAU,EACV,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,4BAA4B,GAAG,IAAI,GAAG,IAAI,CAAC;AACjD,MAAM,UAAU,GAAI,WAAuC,CAAC,UAAU,IAAI,CAAC,CAAC;AAS5E,MAAM,UAAU,uBAAuB,CACrC,QAAgB,EAChB,OAA+C,EAAE;IAEjD,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG;QACZ,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO;QAChC,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC;KACvC,CAAC;IACF,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IACnC,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACjG,MAAM,IAAI,UAAU,CAAC,gCAAgC,IAAI,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,aAAa,GAAI,OAA+C,EAAE,CAAC,aAAa,CAAC,CAAC;IACxF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACtE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAE3C,MAAM,IAAI,GAAG;QACX,GAAG,OAAO;QACV,UAAU,EAAE;YACV,GAAG,CAAE,OAA+C,IAAI,EAAE,CAAC;YAC3D,aAAa,EAAE,KAAK;SACrB;KACF,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,UAAU,EAAE,MAAM,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAClG,IAAI,CAAC;YACH,aAAa,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClE,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;QACD,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzB,CAAC;YAAS,CAAC;QACT,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,UAAU,CAAC,sCAAsC,IAAI,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,EAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,QAAQ,GAAG,UAAU,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACpE,IAAI,IAAI,CAAC,IAAI,GAAG,4BAA4B,EAAE,CAAC;YAC7C,MAAM,IAAI,UAAU,CAAC,yCAAyC,IAAI,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxF,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAY,CAAC;QAC/D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC7G,OAAO,MAAiC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,UAAU;YAAE,MAAM,KAAK,CAAC;QAC7C,MAAM,IAAI,UAAU,CAAC,yBAAyB,IAAI,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1F,CAAC;YAAS,CAAC;QACT,IAAI,EAAE,KAAK,SAAS;YAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Release package-graph contract (CLI_SecurityReleaseReadiness H1 + H2).
|
|
3
|
+
*
|
|
4
|
+
* H1 — the release/CI workflows must address the CLI package by its CANONICAL
|
|
5
|
+
* published name, read from `packages/cli/package.json`. A stale `--filter`
|
|
6
|
+
* (e.g. the pre-rename `@knowz/cli`) makes every build/publish step a silent
|
|
7
|
+
* no-op: pnpm exits 0 having matched zero projects, so a release can "succeed"
|
|
8
|
+
* without ever building, packing, or publishing the CLI.
|
|
9
|
+
*
|
|
10
|
+
* H2 — `@knowzai/cli` depends on seven sibling workspace packages via
|
|
11
|
+
* `workspace:*`. Publishing only the CLI produces an UNINSTALLABLE package: the
|
|
12
|
+
* `workspace:*` specifiers are rewritten to the siblings' own (unstamped)
|
|
13
|
+
* versions, which were never published. The whole runtime graph must therefore
|
|
14
|
+
* be stamped to one version and published in dependency order, and a
|
|
15
|
+
* pack/install smoke must prove resolution with no `workspace:` leakage.
|
|
16
|
+
*
|
|
17
|
+
* This module is pure (filesystem reads only) so both the CI scripts and the
|
|
18
|
+
* unit tests drive exactly the same logic.
|
|
19
|
+
*/
|
|
20
|
+
/** Directory name, under `packages/`, of the package that ships the `knowz` bin. */
|
|
21
|
+
export declare const CLI_PACKAGE_DIR = "cli";
|
|
22
|
+
export interface PackageManifest {
|
|
23
|
+
name?: string;
|
|
24
|
+
version?: string;
|
|
25
|
+
private?: boolean;
|
|
26
|
+
bin?: unknown;
|
|
27
|
+
dependencies?: Record<string, string>;
|
|
28
|
+
optionalDependencies?: Record<string, string>;
|
|
29
|
+
devDependencies?: Record<string, string>;
|
|
30
|
+
[key: string]: unknown;
|
|
31
|
+
}
|
|
32
|
+
export interface WorkspacePackage {
|
|
33
|
+
/** Published package name, e.g. `@knowzai/cli`. */
|
|
34
|
+
name: string;
|
|
35
|
+
/** Directory name under `packages/`, e.g. `cli`. */
|
|
36
|
+
dir: string;
|
|
37
|
+
/** Absolute path to the package directory. */
|
|
38
|
+
path: string;
|
|
39
|
+
manifest: PackageManifest;
|
|
40
|
+
}
|
|
41
|
+
export interface WorkflowSource {
|
|
42
|
+
/** Repo-relative path, used only for failure messages. */
|
|
43
|
+
path: string;
|
|
44
|
+
source: string;
|
|
45
|
+
}
|
|
46
|
+
export interface WorkflowFilterUse {
|
|
47
|
+
/** 1-indexed line number within the workflow source. */
|
|
48
|
+
line: number;
|
|
49
|
+
/** The scoped package name the `--filter` addresses. */
|
|
50
|
+
filter: string;
|
|
51
|
+
}
|
|
52
|
+
/** Read every `packages/*` manifest that declares a name. */
|
|
53
|
+
export declare function readWorkspacePackages(packagesDir: string): WorkspacePackage[];
|
|
54
|
+
/**
|
|
55
|
+
* The one true CLI package name. Everything else (workflow filters, publish
|
|
56
|
+
* order, install smoke) is derived from this rather than hardcoded, so a future
|
|
57
|
+
* rename cannot leave a workflow silently addressing a package that no longer
|
|
58
|
+
* exists.
|
|
59
|
+
*/
|
|
60
|
+
export declare function canonicalCliPackageName(packagesDir: string): string;
|
|
61
|
+
/** The npm scope shared by every internal package, derived from the CLI name. */
|
|
62
|
+
export declare function canonicalScope(cliPackageName: string): string;
|
|
63
|
+
/** Internal (workspace-resident) runtime dependencies declared by one manifest. */
|
|
64
|
+
export declare function internalRuntimeDependencies(manifest: PackageManifest, internalNames: ReadonlySet<string>): string[];
|
|
65
|
+
/**
|
|
66
|
+
* Dependency-ordered publish plan for the runtime graph reachable from `rootName`.
|
|
67
|
+
* Dependencies always precede their dependents, so each `npm publish` lands only
|
|
68
|
+
* after everything it declares is already resolvable on the registry.
|
|
69
|
+
*/
|
|
70
|
+
export declare function resolvePublishOrder(packages: readonly WorkspacePackage[], rootName: string): WorkspacePackage[];
|
|
71
|
+
/**
|
|
72
|
+
* Every `pnpm --filter <@scope/name>` use in a workflow. Both `--filter x` and
|
|
73
|
+
* `--filter=x` spellings are recognised; unscoped filters (paths, globs) are
|
|
74
|
+
* ignored because only the scoped package identity is under contract here.
|
|
75
|
+
*/
|
|
76
|
+
export declare function findWorkflowPackageFilters(source: string): WorkflowFilterUse[];
|
|
77
|
+
/**
|
|
78
|
+
* VERIFY H1 — fail when any workflow filter diverges from the canonical package
|
|
79
|
+
* identity. Returns human-readable failures (empty ⇒ pass) so both the CI script
|
|
80
|
+
* and the unit test can assert on the same values.
|
|
81
|
+
*/
|
|
82
|
+
export declare function assertCanonicalWorkflowFilters(workflows: readonly WorkflowSource[], knownPackageNames: ReadonlySet<string>): string[];
|
|
83
|
+
/**
|
|
84
|
+
* VERIFY H1 (stronger half) — the workflows must actually address the canonical
|
|
85
|
+
* CLI package somewhere, so a filter that is simply deleted is caught too.
|
|
86
|
+
*/
|
|
87
|
+
export declare function assertCliPackageIsAddressed(workflows: readonly WorkflowSource[], cliPackageName: string): string[];
|
|
88
|
+
/**
|
|
89
|
+
* VERIFY H2 — a manifest that is about to be packed/published must not leak a
|
|
90
|
+
* `workspace:` specifier, and every internal dependency must be pinned to the
|
|
91
|
+
* exact release version (they are published together, so a range would let a
|
|
92
|
+
* consumer resolve a sibling from a different release).
|
|
93
|
+
*/
|
|
94
|
+
export declare function assertPublishableManifest(manifest: PackageManifest, opts: {
|
|
95
|
+
version: string;
|
|
96
|
+
internalNames: ReadonlySet<string>;
|
|
97
|
+
label: string;
|
|
98
|
+
}): string[];
|
|
99
|
+
/** A semver prerelease is anything with a `-` pre-release segment (`1.2.3-rc.1`). */
|
|
100
|
+
export declare function isPrereleaseVersion(version: string): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Decide the npm dist-tag for a publish run, and REFUSE rather than guess.
|
|
103
|
+
*
|
|
104
|
+
* npm's default when no `--tag` is given is `latest`, which is the tag `npm
|
|
105
|
+
* install @knowzai/cli` resolves. Publishing `1.2.3-rc.1` with that default
|
|
106
|
+
* hands every user of the plain install command an unreleased build — and the
|
|
107
|
+
* only way back is to re-point `latest` at the previous version by hand.
|
|
108
|
+
*
|
|
109
|
+
* A release version keeps `latest`. A prerelease MUST name its own tag: the
|
|
110
|
+
* caller is the one that knows whether this is an `rc`, a `next`, or a `canary`,
|
|
111
|
+
* and a default here would just reintroduce the same silent choice one layer
|
|
112
|
+
* down. So a prerelease with no tag is an error, not a fallback.
|
|
113
|
+
*/
|
|
114
|
+
export declare function resolveDistTag(opts: {
|
|
115
|
+
version: string;
|
|
116
|
+
tag?: string;
|
|
117
|
+
}): string;
|
|
118
|
+
/** What to do with one package in a resumable publish run. */
|
|
119
|
+
export type PublishAction = 'publish' | 'skip' | 'fail';
|
|
120
|
+
export interface PublishStep {
|
|
121
|
+
action: PublishAction;
|
|
122
|
+
/** One line explaining the decision, safe to print verbatim. */
|
|
123
|
+
reason: string;
|
|
124
|
+
/** Non-empty only for `fail` — why the already-published copy is unusable. */
|
|
125
|
+
failures: string[];
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* H2 (resumability) — decide whether one package still needs publishing.
|
|
129
|
+
*
|
|
130
|
+
* A publish run is not atomic: eight packages go out one at a time, and a
|
|
131
|
+
* network blip, an OTP timeout, or a rate limit can strand the run halfway.
|
|
132
|
+
* Re-running used to be impossible — npm rejects a republish of an existing
|
|
133
|
+
* `name@version` with E403, so the retry died on the first already-published
|
|
134
|
+
* package and the remaining ones stayed unpublished. Recovering meant bumping
|
|
135
|
+
* every version for no reason.
|
|
136
|
+
*
|
|
137
|
+
* So an exact `name@version` that is ALREADY on the registry is not an error:
|
|
138
|
+
* it is work that is already done. It is verified against the same contract a
|
|
139
|
+
* fresh publish must satisfy (no `workspace:` leakage, internal deps pinned to
|
|
140
|
+
* the release version) and then skipped. A published copy that does NOT satisfy
|
|
141
|
+
* that contract is the one case that must stop the run — silently accepting it
|
|
142
|
+
* would ship a graph whose consumers cannot resolve.
|
|
143
|
+
*
|
|
144
|
+
* Pure so the script and the tests exercise identical logic; the caller owns the
|
|
145
|
+
* registry lookup and passes `null` for "not published".
|
|
146
|
+
*/
|
|
147
|
+
export declare function decidePublishStep(opts: {
|
|
148
|
+
name: string;
|
|
149
|
+
version: string;
|
|
150
|
+
/** Manifest of the exact `name@version` on the registry, or null if absent. */
|
|
151
|
+
registryManifest: PackageManifest | null | undefined;
|
|
152
|
+
internalNames: ReadonlySet<string>;
|
|
153
|
+
}): PublishStep;
|
|
154
|
+
//# sourceMappingURL=release-package-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-package-graph.d.ts","sourceRoot":"","sources":["../../src/lib/release-package-graph.ts"],"names":[],"mappings":"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"}
|