@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
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { Args, Flags } from '@oclif/core';
|
|
2
|
-
import { existsSync
|
|
3
|
-
import {
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { openLocalStore } from '@knowzai/local-store';
|
|
4
|
+
import { TreeSitterIndexer } from '@knowzai/indexer';
|
|
4
5
|
import { ExitCode, KnowzError } from '@knowzai/core';
|
|
5
6
|
import { BaseCommand } from '../../base-command.js';
|
|
6
7
|
import { findRepoBinding, resolveRepoPath } from '../../lib/repo-binding.js';
|
|
7
8
|
import { requireRepoBinding } from '../../lib/repo-command-support.js';
|
|
9
|
+
import { assertRepoScopeReady } from '../../lib/repo-scope.js';
|
|
8
10
|
export default class RepoGraph extends BaseCommand {
|
|
9
11
|
static id = 'repo:graph';
|
|
10
12
|
static description = 'Query local code graph stats, symbols, or file neighborhoods for the bound repository.';
|
|
@@ -17,56 +19,38 @@ export default class RepoGraph extends BaseCommand {
|
|
|
17
19
|
neighborhood: Flags.string({ description: 'Node id or symbol name whose adjacent graph nodes should be returned' }),
|
|
18
20
|
kind: Flags.string({ description: 'Restrict results to a graph node kind' }),
|
|
19
21
|
limit: Flags.integer({ description: 'Max matched nodes', default: 20 }),
|
|
22
|
+
offset: Flags.integer({ description: 'Skip matched nodes', default: 0 }),
|
|
20
23
|
};
|
|
21
24
|
async run() {
|
|
22
25
|
const { args, flags } = await this.parse(RepoGraph);
|
|
23
26
|
const binding = requireRepoBinding(findRepoBinding(args.path));
|
|
24
|
-
const
|
|
25
|
-
if (!existsSync(
|
|
27
|
+
const dbPath = resolveRepoPath(binding, binding.dbPath);
|
|
28
|
+
if (!existsSync(dbPath)) {
|
|
26
29
|
throw new KnowzError('No repo code graph found. Run `knowz repo index` first.', ExitCode.NotFound);
|
|
27
30
|
}
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
const indexer = new TreeSitterIndexer();
|
|
32
|
+
const store = await openLocalStore({ driver: 'sqlite', dbPath, dim: indexer.dim });
|
|
33
|
+
let result;
|
|
34
|
+
try {
|
|
35
|
+
await assertRepoScopeReady(store, binding);
|
|
36
|
+
result = await store.queryGraph(binding.vaultId, {
|
|
37
|
+
...(flags.symbol ? { symbol: flags.symbol } : {}),
|
|
38
|
+
...(flags.file ? { file: flags.file } : {}),
|
|
39
|
+
...(flags.neighborhood ? { neighborhood: flags.neighborhood } : {}),
|
|
40
|
+
...(flags.kind ? { kind: flags.kind } : {}),
|
|
41
|
+
limit: flags.limit,
|
|
42
|
+
offset: flags.offset,
|
|
43
|
+
});
|
|
34
44
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
nodes = allNodes.filter((n) => n.name.toLowerCase().includes(q) || n.id.toLowerCase().includes(q));
|
|
45
|
+
finally {
|
|
46
|
+
await store.close();
|
|
38
47
|
}
|
|
39
|
-
else if (flags.file) {
|
|
40
|
-
const q = flags.file.replace(/\\/g, '/').toLowerCase();
|
|
41
|
-
nodes = allNodes.filter((n) => n.file.replace(/\\/g, '/').toLowerCase().includes(q));
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
nodes = allNodes;
|
|
45
|
-
}
|
|
46
|
-
if (flags.kind)
|
|
47
|
-
nodes = nodes.filter((n) => n.kind === flags.kind);
|
|
48
|
-
nodes = nodes.slice(0, flags.limit);
|
|
49
|
-
const ids = new Set(nodes.map((n) => n.id));
|
|
50
|
-
const edges = graph.edges.filter((e) => ids.has(e.from) || ids.has(e.to));
|
|
51
|
-
const result = { stats, nodes, edges };
|
|
52
48
|
if (this.jsonEnabled())
|
|
53
49
|
return result;
|
|
54
|
-
this.log(`nodes: ${stats.
|
|
55
|
-
for (const n of nodes)
|
|
50
|
+
this.log(`nodes: ${result.stats.nodeCount} edges: ${result.stats.edgeCount}`);
|
|
51
|
+
for (const n of result.nodes)
|
|
56
52
|
this.log(`${n.kind.padEnd(9)} ${n.name} ${n.file}`);
|
|
57
53
|
return result;
|
|
58
54
|
}
|
|
59
55
|
}
|
|
60
|
-
function neighborhood(graph, query) {
|
|
61
|
-
const q = query.toLowerCase();
|
|
62
|
-
const matched = [...graph.nodes.values()].filter((n) => n.id.toLowerCase() === q || n.name.toLowerCase() === q || n.id.toLowerCase().includes(q));
|
|
63
|
-
const ids = new Set(matched.map((n) => n.id));
|
|
64
|
-
for (const e of graph.edges) {
|
|
65
|
-
if (ids.has(e.from))
|
|
66
|
-
ids.add(e.to);
|
|
67
|
-
if (ids.has(e.to))
|
|
68
|
-
ids.add(e.from);
|
|
69
|
-
}
|
|
70
|
-
return [...ids].map((id) => graph.nodes.get(id)).filter((n) => Boolean(n));
|
|
71
|
-
}
|
|
72
56
|
//# sourceMappingURL=graph.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/commands/repo/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/commands/repo/graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,7 @@ export default class RepoIndex extends BaseCommand {
|
|
|
21
21
|
static flags: {
|
|
22
22
|
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
23
23
|
sync: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
24
|
+
passphrase: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
24
25
|
};
|
|
25
26
|
run(): Promise<RepoIndexResult>;
|
|
26
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/repo/index/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/repo/index/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAWvD,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAqDD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,OAAgB,EAAE,SAAgB;IAClC,OAAgB,WAAW,SAAwE;IACnG,OAAgB,IAAI;;MAElB;IACF,OAAgB,KAAK;;;;MAInB;IAEI,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC;CAoFtC"}
|
|
@@ -1,11 +1,69 @@
|
|
|
1
1
|
import { Args, Flags } from '@oclif/core';
|
|
2
|
-
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
3
|
-
import {
|
|
2
|
+
import { closeSync, constants as fsConstants, existsSync, fstatSync, mkdirSync, openSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
3
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
4
|
+
import { dirname, isAbsolute, relative, resolve } from 'node:path';
|
|
4
5
|
import { TreeSitterIndexer } from '@knowzai/indexer';
|
|
5
|
-
import { SyncEngine, openLocalStore } from '@knowzai/local-store';
|
|
6
|
+
import { LegacyGraphRebuildRequiredError, SyncEngine, openLocalStore, } from '@knowzai/local-store';
|
|
7
|
+
import { ExitCode, KnowzError } from '@knowzai/core';
|
|
6
8
|
import { BaseCommand } from '../../../base-command.js';
|
|
7
9
|
import { findRepoBinding, resolveRepoPath, saveRepoBinding, updateRepoBindingIndex, } from '../../../lib/repo-binding.js';
|
|
8
10
|
import { requireRepoBinding } from '../../../lib/repo-command-support.js';
|
|
11
|
+
import { isSafeToIndex } from '../../../lib/safe-file.js';
|
|
12
|
+
import { assertRepoScopeReady } from '../../../lib/repo-scope.js';
|
|
13
|
+
const MAX_GRAPH_SIDECAR_BYTES = 64 * 1024 * 1024;
|
|
14
|
+
const O_NOFOLLOW = fsConstants.O_NOFOLLOW ?? 0;
|
|
15
|
+
class GraphSidecarIgnoredError extends Error {
|
|
16
|
+
}
|
|
17
|
+
function readGraphSidecar(repoRoot, graphPath) {
|
|
18
|
+
const root = resolve(repoRoot);
|
|
19
|
+
const path = resolve(graphPath);
|
|
20
|
+
const rel = relative(root, path);
|
|
21
|
+
if (!rel || rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\' : '/'}`) || isAbsolute(rel)) {
|
|
22
|
+
throw new KnowzError('Repo graph sidecar must stay inside the bound repository.', ExitCode.Usage);
|
|
23
|
+
}
|
|
24
|
+
if (O_NOFOLLOW === 0) {
|
|
25
|
+
throw new GraphSidecarIgnoredError('This platform cannot safely import a graph sidecar without O_NOFOLLOW');
|
|
26
|
+
}
|
|
27
|
+
let fd;
|
|
28
|
+
try {
|
|
29
|
+
fd = openSync(path, fsConstants.O_RDONLY | O_NOFOLLOW);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
const code = error.code;
|
|
33
|
+
if (code === 'ELOOP' || code === 'EMLINK') {
|
|
34
|
+
throw new GraphSidecarIgnoredError('Refusing to follow a graph sidecar symlink');
|
|
35
|
+
}
|
|
36
|
+
throw new KnowzError('Unable to safely open the repo graph sidecar.', ExitCode.Usage, { cause: error });
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const stat = fstatSync(fd);
|
|
40
|
+
if (!stat.isFile() || stat.size > MAX_GRAPH_SIDECAR_BYTES) {
|
|
41
|
+
throw new KnowzError('Repo graph sidecar is not a bounded regular file.', ExitCode.Usage);
|
|
42
|
+
}
|
|
43
|
+
const content = readFileSync(fd, 'utf8');
|
|
44
|
+
return {
|
|
45
|
+
records: JSON.parse(content),
|
|
46
|
+
sha256: createHash('sha256').update(content).digest('hex'),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
closeSync(fd);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function writeGraphSidecar(graphPath, value) {
|
|
54
|
+
const temp = `${graphPath}.tmp-${process.pid}-${randomBytes(6).toString('hex')}`;
|
|
55
|
+
try {
|
|
56
|
+
writeFileSync(temp, `${JSON.stringify(value)}\n`, { encoding: 'utf8', mode: 0o600, flag: 'wx' });
|
|
57
|
+
renameSync(temp, graphPath);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
try {
|
|
61
|
+
unlinkSync(temp);
|
|
62
|
+
}
|
|
63
|
+
catch { /* no temporary file to remove */ }
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
9
67
|
export default class RepoIndex extends BaseCommand {
|
|
10
68
|
static id = 'repo:index';
|
|
11
69
|
static description = 'Index the bound repository into its repo-local Knowz SQLite store.';
|
|
@@ -15,36 +73,66 @@ export default class RepoIndex extends BaseCommand {
|
|
|
15
73
|
static flags = {
|
|
16
74
|
force: Flags.boolean({ description: 'Re-index unchanged files' }),
|
|
17
75
|
sync: Flags.boolean({ description: 'Push indexed rows for the bound vault after indexing' }),
|
|
76
|
+
passphrase: Flags.string({ description: 'CMEK passphrase (if the profile is CMEK-enabled)' }),
|
|
18
77
|
};
|
|
19
78
|
async run() {
|
|
20
79
|
const { args, flags } = await this.parse(RepoIndex);
|
|
21
80
|
const found = findRepoBinding(args.path);
|
|
22
81
|
const binding = requireRepoBinding(found);
|
|
82
|
+
if (flags.sync && binding.scopeKind === 'local') {
|
|
83
|
+
throw new KnowzError('A local-scope repository cannot sync. Graduate it with `knowz repo setup --vault <hosted>` first.', ExitCode.Usage);
|
|
84
|
+
}
|
|
23
85
|
const dbPath = resolveRepoPath(binding, binding.dbPath);
|
|
24
86
|
const graphPath = resolveRepoPath(binding, binding.graphPath);
|
|
25
|
-
|
|
87
|
+
// H7 — same shared gate as `index scan`; `repo index --sync` pushes what it
|
|
88
|
+
// indexes to the cloud, so a credential file caught here never leaves the box.
|
|
89
|
+
const indexer = new TreeSitterIndexer({ pathFilter: isSafeToIndex });
|
|
26
90
|
const store = await openLocalStore({ driver: 'sqlite', dbPath, dim: indexer.dim });
|
|
27
91
|
let syncReport;
|
|
28
92
|
let result;
|
|
29
93
|
try {
|
|
94
|
+
await assertRepoScopeReady(store, binding);
|
|
95
|
+
let forceGraphRebuild = Boolean(flags.force);
|
|
96
|
+
let legacySidecarSha256;
|
|
97
|
+
if ((await store.graphStats(binding.vaultId)).nodeCount === 0 && existsSync(graphPath)) {
|
|
98
|
+
let sidecar;
|
|
99
|
+
try {
|
|
100
|
+
sidecar = readGraphSidecar(binding.repoRoot, graphPath);
|
|
101
|
+
await store.importGraphJson(binding.vaultId, sidecar.records, sidecar.sha256);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (!(error instanceof LegacyGraphRebuildRequiredError) && !(error instanceof GraphSidecarIgnoredError))
|
|
105
|
+
throw error;
|
|
106
|
+
forceGraphRebuild = true;
|
|
107
|
+
if (error instanceof LegacyGraphRebuildRequiredError)
|
|
108
|
+
legacySidecarSha256 = sidecar?.sha256;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
30
111
|
const report = await indexer.indexDirectory(binding.repoRoot, store, {
|
|
31
112
|
vaultId: binding.vaultId,
|
|
32
|
-
force:
|
|
113
|
+
force: forceGraphRebuild,
|
|
114
|
+
repoRoot: binding.repoRoot,
|
|
33
115
|
});
|
|
34
116
|
mkdirSync(dirname(graphPath), { recursive: true });
|
|
35
|
-
|
|
36
|
-
|
|
117
|
+
if (legacySidecarSha256)
|
|
118
|
+
await store.markGraphRebuildComplete(binding.vaultId, legacySidecarSha256);
|
|
119
|
+
const graph = await store.exportGraphJson(binding.vaultId);
|
|
120
|
+
writeGraphSidecar(graphPath, graph);
|
|
121
|
+
const stats = await store.graphStats(binding.vaultId);
|
|
37
122
|
const updated = updateRepoBindingIndex(binding, {
|
|
38
123
|
filesIndexed: report.filesIndexed,
|
|
39
124
|
filesSkipped: report.filesSkipped,
|
|
40
125
|
chunks: report.chunks,
|
|
41
|
-
graphNodes: stats.
|
|
42
|
-
graphEdges: stats.
|
|
126
|
+
graphNodes: stats.nodeCount,
|
|
127
|
+
graphEdges: stats.edgeCount,
|
|
43
128
|
});
|
|
44
129
|
saveRepoBinding(updated);
|
|
45
130
|
if (flags.sync) {
|
|
46
131
|
const client = await this.apiClient({ profile: binding.profile, 'api-url': binding.apiUrl, vault: binding.vaultId });
|
|
47
|
-
|
|
132
|
+
// H4 — without the encryptor this pushes repository SOURCE to the cloud
|
|
133
|
+
// in plaintext on a CMEK-enabled profile.
|
|
134
|
+
const encryptor = this.cmekEncryptor({ profile: binding.profile, passphrase: flags.passphrase });
|
|
135
|
+
syncReport = await new SyncEngine(store, client, { encryptor }).push({ vaultId: binding.vaultId });
|
|
48
136
|
}
|
|
49
137
|
result = {
|
|
50
138
|
repoRoot: binding.repoRoot,
|
|
@@ -54,8 +142,8 @@ export default class RepoIndex extends BaseCommand {
|
|
|
54
142
|
filesIndexed: report.filesIndexed,
|
|
55
143
|
filesSkipped: report.filesSkipped,
|
|
56
144
|
chunks: report.chunks,
|
|
57
|
-
nodes: stats.
|
|
58
|
-
edges: stats.
|
|
145
|
+
nodes: stats.nodeCount,
|
|
146
|
+
edges: stats.edgeCount,
|
|
59
147
|
...(syncReport ? { sync: syncReport } : {}),
|
|
60
148
|
};
|
|
61
149
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/repo/index/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/repo/index/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/commands/repo/search.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/commands/repo/search.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKpD,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,WAAW;IACjD,OAAgB,EAAE,SAAiB;IACnC,OAAgB,WAAW,SAAkF;IAC7G,OAAgB,IAAI;;MAElB;IACF,OAAgB,KAAK;;;MAGnB;IAEI,GAAG,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;CA8BtC"}
|
|
@@ -4,6 +4,7 @@ import { openLocalStore, relevanceFromDistance } from '@knowzai/local-store';
|
|
|
4
4
|
import { BaseCommand } from '../../base-command.js';
|
|
5
5
|
import { findRepoBinding, resolveRepoPath } from '../../lib/repo-binding.js';
|
|
6
6
|
import { requireRepoBinding } from '../../lib/repo-command-support.js';
|
|
7
|
+
import { assertRepoScopeReady } from '../../lib/repo-scope.js';
|
|
7
8
|
export default class RepoSearch extends BaseCommand {
|
|
8
9
|
static id = 'repo:search';
|
|
9
10
|
static description = 'Search the bound repository locally using its repo-local Knowz SQLite index.';
|
|
@@ -21,6 +22,7 @@ export default class RepoSearch extends BaseCommand {
|
|
|
21
22
|
const store = await openLocalStore({ driver: 'sqlite', dbPath: resolveRepoPath(binding, binding.dbPath), dim: indexer.dim });
|
|
22
23
|
const hits = [];
|
|
23
24
|
try {
|
|
25
|
+
await assertRepoScopeReady(store, binding);
|
|
24
26
|
const results = await store.knnSearch(indexer.embedQuery(args.query), flags.limit, { vaultId: binding.vaultId });
|
|
25
27
|
for (const h of results) {
|
|
26
28
|
const item = await store.getItem(h.chunk.itemId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/commands/repo/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/commands/repo/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
import type { SyncReport } from '@knowzai/local-store';
|
|
2
2
|
import { BaseCommand } from '../../base-command.js';
|
|
3
|
+
import { type ProjectMcpInstallResult } from '../../lib/project-mcp-config.js';
|
|
3
4
|
interface RepoSetupResult {
|
|
4
|
-
configured:
|
|
5
|
+
configured: boolean;
|
|
5
6
|
repoRoot: string;
|
|
6
7
|
bindingPath: string;
|
|
7
8
|
profile: string;
|
|
8
|
-
apiUrl
|
|
9
|
+
apiUrl?: string;
|
|
9
10
|
vaultId: string;
|
|
11
|
+
scopeKind: 'local' | 'hosted';
|
|
10
12
|
vaultName?: string;
|
|
11
13
|
dbPath: string;
|
|
12
14
|
graphPath: string;
|
|
13
15
|
hooksPath?: string;
|
|
14
16
|
mcpCommand?: string;
|
|
17
|
+
mcpInstall?: ProjectMcpInstallResult;
|
|
15
18
|
sync?: SyncReport;
|
|
16
19
|
}
|
|
17
20
|
export default class RepoSetup extends BaseCommand {
|
|
@@ -26,12 +29,16 @@ export default class RepoSetup extends BaseCommand {
|
|
|
26
29
|
graph: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
27
30
|
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
28
31
|
sync: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
32
|
+
offline: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
29
33
|
'create-vault': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
30
34
|
description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
31
35
|
'parent-id': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
32
36
|
'vault-type': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
33
37
|
'install-hooks': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
34
38
|
mcp: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
39
|
+
'install-mcp': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
40
|
+
'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
41
|
+
passphrase: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
35
42
|
'command-prefix': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
36
43
|
};
|
|
37
44
|
run(): Promise<RepoSetupResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/commands/repo/setup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/commands/repo/setup.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAYpD,OAAO,EAA2B,KAAK,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAGxG,UAAU,eAAe;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,OAAgB,EAAE,SAAgB;IAClC,OAAgB,WAAW,SAC0D;IACrF,OAAgB,QAAQ,WAKtB;IACF,OAAgB,IAAI;;MAElB;IACF,OAAgB,KAAK;;;;;;;;;;;;;;;;MAmBnB;IAEI,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC;YAoJvB,YAAY;CAqC3B"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Args, Flags } from '@oclif/core';
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
3
4
|
import { join } from 'node:path';
|
|
4
5
|
import { SyncEngine, openLocalStore } from '@knowzai/local-store';
|
|
5
6
|
import { ExitCode, KnowzError, loadConfig, resolveApiUrl, resolveProfileName } from '@knowzai/core';
|
|
@@ -7,6 +8,8 @@ import { BaseCommand } from '../../base-command.js';
|
|
|
7
8
|
import { isGuid, resolveVaultRef } from '../../lib/vault.js';
|
|
8
9
|
import { defaultRepoBinding, equivalentRepoBinding, findRepoBinding, normalizeRepoRoot, resolveRepoPath, saveRepoBinding, } from '../../lib/repo-binding.js';
|
|
9
10
|
import { buildHostedMcpCommand, installRepoHooks } from '../../lib/repo-command-support.js';
|
|
11
|
+
import { installProjectMcpConfig } from '../../lib/project-mcp-config.js';
|
|
12
|
+
import { graduateLocalScope, recoverHostedScopeMarker } from '../../lib/repo-scope-migration.js';
|
|
10
13
|
export default class RepoSetup extends BaseCommand {
|
|
11
14
|
static id = 'repo:setup';
|
|
12
15
|
static description = 'Bind a repository checkout to a Knowz vault and repo-local SQLite context store.';
|
|
@@ -14,6 +17,7 @@ export default class RepoSetup extends BaseCommand {
|
|
|
14
17
|
'<%= config.bin %> repo setup --vault 00000000-0000-4000-8000-000000000000',
|
|
15
18
|
'<%= config.bin %> repo setup . --vault "Platform Code" --install-hooks --mcp',
|
|
16
19
|
'<%= config.bin %> repo setup . --create-vault "Platform Code"',
|
|
20
|
+
'<%= config.bin %> repo setup . --offline --install-mcp',
|
|
17
21
|
];
|
|
18
22
|
static args = {
|
|
19
23
|
path: Args.string({ description: 'Repository checkout path', default: '.' }),
|
|
@@ -23,12 +27,16 @@ export default class RepoSetup extends BaseCommand {
|
|
|
23
27
|
graph: Flags.string({ description: 'Repo-local graph sidecar path', default: '.knowz/graph.json' }),
|
|
24
28
|
force: Flags.boolean({ description: 'Overwrite an existing binding when values change' }),
|
|
25
29
|
sync: Flags.boolean({ description: 'Pull the bound vault into the repo-local store after setup' }),
|
|
30
|
+
offline: Flags.boolean({ description: 'Create a signed-out local-only repository scope' }),
|
|
26
31
|
'create-vault': Flags.string({ description: 'Create a new Knowz vault with this name and bind to it' }),
|
|
27
32
|
description: Flags.string({ description: 'Description for --create-vault' }),
|
|
28
33
|
'parent-id': Flags.string({ description: 'Parent vault id for --create-vault' }),
|
|
29
34
|
'vault-type': Flags.string({ description: 'Vault type for --create-vault', default: 'CodeBase' }),
|
|
30
35
|
'install-hooks': Flags.boolean({ description: 'Install repo-pinned Claude Code hooks in this checkout' }),
|
|
31
36
|
mcp: Flags.boolean({ description: 'Print hosted Knowz MCP setup guidance for this bound vault' }),
|
|
37
|
+
'install-mcp': Flags.boolean({ description: 'Install knowz-local in project .mcp.json' }),
|
|
38
|
+
'dry-run': Flags.boolean({ description: 'Preview --install-mcp without writing setup or config state' }),
|
|
39
|
+
passphrase: Flags.string({ description: 'CMEK passphrase (if the profile is CMEK-enabled)' }),
|
|
32
40
|
'command-prefix': Flags.string({
|
|
33
41
|
description: 'How generated hooks should invoke the CLI',
|
|
34
42
|
default: 'knowz',
|
|
@@ -36,17 +44,72 @@ export default class RepoSetup extends BaseCommand {
|
|
|
36
44
|
};
|
|
37
45
|
async run() {
|
|
38
46
|
const { args, flags } = await this.parse(RepoSetup);
|
|
47
|
+
if (flags['dry-run'] && !flags['install-mcp']) {
|
|
48
|
+
throw new KnowzError('--dry-run is valid only with --install-mcp.', ExitCode.Usage);
|
|
49
|
+
}
|
|
50
|
+
if (flags.offline && (flags.sync || flags.vault || flags['create-vault'])) {
|
|
51
|
+
throw new KnowzError('--offline cannot be combined with --sync, --vault, or --create-vault.', ExitCode.Usage);
|
|
52
|
+
}
|
|
39
53
|
const cfg = loadConfig();
|
|
40
54
|
const repoRoot = normalizeRepoRoot(args.path);
|
|
41
55
|
const profile = resolveProfileName({ profileFlag: flags.profile }, cfg);
|
|
42
|
-
const apiUrl = resolveApiUrl({ apiUrlFlag: flags['api-url'], profileFlag: flags.profile }, cfg);
|
|
43
56
|
const existing = findRepoBinding(repoRoot)?.binding;
|
|
57
|
+
if (flags.offline) {
|
|
58
|
+
if (existing?.scopeKind === 'hosted') {
|
|
59
|
+
throw new KnowzError('This repository is already hosted-scoped; offline setup cannot downgrade it.', ExitCode.Usage);
|
|
60
|
+
}
|
|
61
|
+
const desired = defaultRepoBinding({
|
|
62
|
+
repoRoot,
|
|
63
|
+
profile,
|
|
64
|
+
vaultId: existing?.vaultId ?? randomUUID(),
|
|
65
|
+
scopeKind: 'local',
|
|
66
|
+
dbPath: flags.db,
|
|
67
|
+
graphPath: flags.graph,
|
|
68
|
+
syncEnabled: false,
|
|
69
|
+
});
|
|
70
|
+
const binding = existing
|
|
71
|
+
? { ...desired, createdAt: existing.createdAt, index: existing.index, updatedAt: new Date().toISOString() }
|
|
72
|
+
: desired;
|
|
73
|
+
const dbPath = resolveRepoPath(binding, binding.dbPath);
|
|
74
|
+
const graphPath = resolveRepoPath(binding, binding.graphPath);
|
|
75
|
+
const mcpInstall = flags['install-mcp']
|
|
76
|
+
? installProjectMcpConfig(repoRoot, { dryRun: flags['dry-run'] })
|
|
77
|
+
: undefined;
|
|
78
|
+
if (!flags['dry-run'])
|
|
79
|
+
saveRepoBinding(binding);
|
|
80
|
+
const result = {
|
|
81
|
+
configured: !flags['dry-run'],
|
|
82
|
+
repoRoot,
|
|
83
|
+
bindingPath: join(repoRoot, '.knowz', 'repo.json'),
|
|
84
|
+
profile,
|
|
85
|
+
vaultId: binding.vaultId,
|
|
86
|
+
scopeKind: 'local',
|
|
87
|
+
dbPath,
|
|
88
|
+
graphPath,
|
|
89
|
+
...(mcpInstall ? { mcpInstall } : {}),
|
|
90
|
+
};
|
|
91
|
+
if (this.jsonEnabled())
|
|
92
|
+
return result;
|
|
93
|
+
if (flags['dry-run'])
|
|
94
|
+
this.log(`Would install knowz-local in ${mcpInstall.path}`);
|
|
95
|
+
else
|
|
96
|
+
this.log(`Knowz repo configured offline: ${repoRoot}`);
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
if (existing?.scopeKind === 'hosted' && !flags['dry-run']) {
|
|
100
|
+
await recoverHostedScopeMarker(existing);
|
|
101
|
+
}
|
|
102
|
+
const apiUrl = resolveApiUrl({ apiUrlFlag: flags['api-url'], profileFlag: flags.profile }, cfg);
|
|
103
|
+
if (existing?.scopeKind === 'local' && !flags.vault && !flags['create-vault']) {
|
|
104
|
+
throw new KnowzError('Graduate a local repository with --vault <hosted> or --create-vault <name>.', ExitCode.Usage);
|
|
105
|
+
}
|
|
44
106
|
const vault = await this.resolveVault(flags, cfg, profile, existing);
|
|
45
107
|
const desired = defaultRepoBinding({
|
|
46
108
|
repoRoot,
|
|
47
109
|
profile,
|
|
48
110
|
apiUrl,
|
|
49
111
|
vaultId: vault.id,
|
|
112
|
+
scopeKind: 'hosted',
|
|
50
113
|
vaultName: vault.name,
|
|
51
114
|
dbPath: flags.db,
|
|
52
115
|
graphPath: flags.graph,
|
|
@@ -54,7 +117,8 @@ export default class RepoSetup extends BaseCommand {
|
|
|
54
117
|
});
|
|
55
118
|
let binding = desired;
|
|
56
119
|
if (existing) {
|
|
57
|
-
|
|
120
|
+
const graduation = existing.scopeKind === 'local' && desired.scopeKind === 'hosted';
|
|
121
|
+
if (!equivalentRepoBinding(existing, desired) && !flags.force && !graduation) {
|
|
58
122
|
throw new KnowzError('Knowz repo binding already exists with different values. Re-run with --force to update it.', ExitCode.Usage);
|
|
59
123
|
}
|
|
60
124
|
binding = {
|
|
@@ -64,40 +128,52 @@ export default class RepoSetup extends BaseCommand {
|
|
|
64
128
|
updatedAt: new Date().toISOString(),
|
|
65
129
|
};
|
|
66
130
|
}
|
|
67
|
-
saveRepoBinding(binding);
|
|
68
131
|
const dbPath = resolveRepoPath(binding, binding.dbPath);
|
|
69
132
|
const graphPath = resolveRepoPath(binding, binding.graphPath);
|
|
133
|
+
if (existing?.scopeKind === 'local' && binding.scopeKind === 'hosted' && !flags['dry-run']) {
|
|
134
|
+
await graduateLocalScope(existing, binding);
|
|
135
|
+
}
|
|
136
|
+
const mcpInstall = flags['install-mcp']
|
|
137
|
+
? installProjectMcpConfig(repoRoot, { dryRun: flags['dry-run'] })
|
|
138
|
+
: undefined;
|
|
139
|
+
if (!flags['dry-run'])
|
|
140
|
+
saveRepoBinding(binding);
|
|
70
141
|
let syncReport;
|
|
71
|
-
if (flags.sync) {
|
|
142
|
+
if (flags.sync && !flags['dry-run']) {
|
|
72
143
|
const store = await openLocalStore({ driver: 'sqlite', dbPath });
|
|
73
144
|
try {
|
|
74
145
|
const client = await this.apiClient({ ...flags, profile, 'api-url': apiUrl });
|
|
75
|
-
|
|
146
|
+
// H4 — without the encryptor this pull writes undecrypted CMEK
|
|
147
|
+
// ciphertext into the repo-local store.
|
|
148
|
+
const encryptor = this.cmekEncryptor({ ...flags, profile, passphrase: flags.passphrase });
|
|
149
|
+
syncReport = await new SyncEngine(store, client, { encryptor }).pull({ vaultId: binding.vaultId });
|
|
76
150
|
}
|
|
77
151
|
finally {
|
|
78
152
|
await store.close();
|
|
79
153
|
}
|
|
80
154
|
}
|
|
81
|
-
const hooksPath = flags['install-hooks']
|
|
155
|
+
const hooksPath = flags['install-hooks'] && !flags['dry-run']
|
|
82
156
|
? installRepoHooks(join(repoRoot, '.claude', 'settings.json'), {
|
|
83
157
|
binding,
|
|
84
158
|
dbPath,
|
|
85
159
|
commandPrefix: flags['command-prefix'],
|
|
86
160
|
}).path
|
|
87
161
|
: undefined;
|
|
88
|
-
const mcpCommand = flags.mcp ? buildHostedMcpCommand(binding) : undefined;
|
|
162
|
+
const mcpCommand = flags.mcp ? buildHostedMcpCommand({ apiUrl, vaultId: binding.vaultId }) : undefined;
|
|
89
163
|
const result = {
|
|
90
|
-
configured:
|
|
164
|
+
configured: !flags['dry-run'],
|
|
91
165
|
repoRoot,
|
|
92
166
|
bindingPath: join(repoRoot, '.knowz', 'repo.json'),
|
|
93
167
|
profile,
|
|
94
168
|
apiUrl,
|
|
95
169
|
vaultId: binding.vaultId,
|
|
170
|
+
scopeKind: 'hosted',
|
|
96
171
|
...(binding.vaultName ? { vaultName: binding.vaultName } : {}),
|
|
97
172
|
dbPath,
|
|
98
173
|
graphPath,
|
|
99
174
|
...(hooksPath ? { hooksPath } : {}),
|
|
100
175
|
...(mcpCommand ? { mcpCommand } : {}),
|
|
176
|
+
...(mcpInstall ? { mcpInstall } : {}),
|
|
101
177
|
...(syncReport ? { sync: syncReport } : {}),
|
|
102
178
|
};
|
|
103
179
|
if (this.jsonEnabled())
|