@stoneforge/quarry 0.1.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/LICENSE +13 -0
- package/README.md +160 -0
- package/dist/api/index.d.ts +8 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +8 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/quarry-api.d.ts +268 -0
- package/dist/api/quarry-api.d.ts.map +1 -0
- package/dist/api/quarry-api.js +3905 -0
- package/dist/api/quarry-api.js.map +1 -0
- package/dist/api/types.d.ts +1359 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +204 -0
- package/dist/api/types.js.map +1 -0
- package/dist/bin/sf.d.ts +3 -0
- package/dist/bin/sf.d.ts.map +1 -0
- package/dist/bin/sf.js +9 -0
- package/dist/bin/sf.js.map +1 -0
- package/dist/cli/commands/admin.d.ts +11 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +465 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/commands/alias.d.ts +8 -0
- package/dist/cli/commands/alias.d.ts.map +1 -0
- package/dist/cli/commands/alias.js +70 -0
- package/dist/cli/commands/alias.js.map +1 -0
- package/dist/cli/commands/channel.d.ts +13 -0
- package/dist/cli/commands/channel.d.ts.map +1 -0
- package/dist/cli/commands/channel.js +680 -0
- package/dist/cli/commands/channel.js.map +1 -0
- package/dist/cli/commands/completion.d.ts +8 -0
- package/dist/cli/commands/completion.d.ts.map +1 -0
- package/dist/cli/commands/completion.js +87 -0
- package/dist/cli/commands/completion.js.map +1 -0
- package/dist/cli/commands/config.d.ts +12 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +242 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/crud.d.ts +64 -0
- package/dist/cli/commands/crud.d.ts.map +1 -0
- package/dist/cli/commands/crud.js +805 -0
- package/dist/cli/commands/crud.js.map +1 -0
- package/dist/cli/commands/dep.d.ts +16 -0
- package/dist/cli/commands/dep.d.ts.map +1 -0
- package/dist/cli/commands/dep.js +499 -0
- package/dist/cli/commands/dep.js.map +1 -0
- package/dist/cli/commands/document.d.ts +12 -0
- package/dist/cli/commands/document.d.ts.map +1 -0
- package/dist/cli/commands/document.js +1039 -0
- package/dist/cli/commands/document.js.map +1 -0
- package/dist/cli/commands/embeddings.d.ts +12 -0
- package/dist/cli/commands/embeddings.d.ts.map +1 -0
- package/dist/cli/commands/embeddings.js +273 -0
- package/dist/cli/commands/embeddings.js.map +1 -0
- package/dist/cli/commands/entity.d.ts +16 -0
- package/dist/cli/commands/entity.d.ts.map +1 -0
- package/dist/cli/commands/entity.js +522 -0
- package/dist/cli/commands/entity.js.map +1 -0
- package/dist/cli/commands/gc.d.ts +10 -0
- package/dist/cli/commands/gc.d.ts.map +1 -0
- package/dist/cli/commands/gc.js +257 -0
- package/dist/cli/commands/gc.js.map +1 -0
- package/dist/cli/commands/help.d.ts +11 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +169 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/history.d.ts +9 -0
- package/dist/cli/commands/history.d.ts.map +1 -0
- package/dist/cli/commands/history.js +160 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/identity.d.ts +18 -0
- package/dist/cli/commands/identity.d.ts.map +1 -0
- package/dist/cli/commands/identity.js +698 -0
- package/dist/cli/commands/identity.js.map +1 -0
- package/dist/cli/commands/inbox.d.ts +20 -0
- package/dist/cli/commands/inbox.d.ts.map +1 -0
- package/dist/cli/commands/inbox.js +493 -0
- package/dist/cli/commands/inbox.js.map +1 -0
- package/dist/cli/commands/init.d.ts +20 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +144 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install.d.ts +9 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +200 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/library.d.ts +12 -0
- package/dist/cli/commands/library.d.ts.map +1 -0
- package/dist/cli/commands/library.js +665 -0
- package/dist/cli/commands/library.js.map +1 -0
- package/dist/cli/commands/message.d.ts +11 -0
- package/dist/cli/commands/message.d.ts.map +1 -0
- package/dist/cli/commands/message.js +608 -0
- package/dist/cli/commands/message.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +17 -0
- package/dist/cli/commands/plan.d.ts.map +1 -0
- package/dist/cli/commands/plan.js +698 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/playbook.d.ts +12 -0
- package/dist/cli/commands/playbook.d.ts.map +1 -0
- package/dist/cli/commands/playbook.js +730 -0
- package/dist/cli/commands/playbook.js.map +1 -0
- package/dist/cli/commands/reset.d.ts +12 -0
- package/dist/cli/commands/reset.d.ts.map +1 -0
- package/dist/cli/commands/reset.js +306 -0
- package/dist/cli/commands/reset.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +11 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +106 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +8 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +82 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +14 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +370 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/task.d.ts +25 -0
- package/dist/cli/commands/task.d.ts.map +1 -0
- package/dist/cli/commands/task.js +1153 -0
- package/dist/cli/commands/task.js.map +1 -0
- package/dist/cli/commands/team.d.ts +13 -0
- package/dist/cli/commands/team.d.ts.map +1 -0
- package/dist/cli/commands/team.js +471 -0
- package/dist/cli/commands/team.js.map +1 -0
- package/dist/cli/commands/workflow.d.ts +16 -0
- package/dist/cli/commands/workflow.d.ts.map +1 -0
- package/dist/cli/commands/workflow.js +753 -0
- package/dist/cli/commands/workflow.js.map +1 -0
- package/dist/cli/completion.d.ts +28 -0
- package/dist/cli/completion.d.ts.map +1 -0
- package/dist/cli/completion.js +295 -0
- package/dist/cli/completion.js.map +1 -0
- package/dist/cli/db.d.ts +38 -0
- package/dist/cli/db.d.ts.map +1 -0
- package/dist/cli/db.js +90 -0
- package/dist/cli/db.js.map +1 -0
- package/dist/cli/formatter.d.ts +87 -0
- package/dist/cli/formatter.d.ts.map +1 -0
- package/dist/cli/formatter.js +464 -0
- package/dist/cli/formatter.js.map +1 -0
- package/dist/cli/index.d.ts +33 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +38 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/parser.d.ts +45 -0
- package/dist/cli/parser.d.ts.map +1 -0
- package/dist/cli/parser.js +256 -0
- package/dist/cli/parser.js.map +1 -0
- package/dist/cli/plugin-loader.d.ts +39 -0
- package/dist/cli/plugin-loader.d.ts.map +1 -0
- package/dist/cli/plugin-loader.js +165 -0
- package/dist/cli/plugin-loader.js.map +1 -0
- package/dist/cli/plugin-registry.d.ts +50 -0
- package/dist/cli/plugin-registry.d.ts.map +1 -0
- package/dist/cli/plugin-registry.js +206 -0
- package/dist/cli/plugin-registry.js.map +1 -0
- package/dist/cli/plugin-types.d.ts +106 -0
- package/dist/cli/plugin-types.d.ts.map +1 -0
- package/dist/cli/plugin-types.js +103 -0
- package/dist/cli/plugin-types.js.map +1 -0
- package/dist/cli/runner.d.ts +35 -0
- package/dist/cli/runner.d.ts.map +1 -0
- package/dist/cli/runner.js +340 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/cli/suggest.d.ts +15 -0
- package/dist/cli/suggest.d.ts.map +1 -0
- package/dist/cli/suggest.js +49 -0
- package/dist/cli/suggest.js.map +1 -0
- package/dist/cli/types.d.ts +138 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +63 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/config/config.d.ts +86 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +348 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/defaults.d.ts +66 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +114 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/duration.d.ts +75 -0
- package/dist/config/duration.d.ts.map +1 -0
- package/dist/config/duration.js +190 -0
- package/dist/config/duration.js.map +1 -0
- package/dist/config/env.d.ts +67 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +207 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/file.d.ts +97 -0
- package/dist/config/file.d.ts.map +1 -0
- package/dist/config/file.js +365 -0
- package/dist/config/file.js.map +1 -0
- package/dist/config/index.d.ts +35 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +41 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/merge.d.ts +53 -0
- package/dist/config/merge.d.ts.map +1 -0
- package/dist/config/merge.js +226 -0
- package/dist/config/merge.js.map +1 -0
- package/dist/config/types.d.ts +257 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +72 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validation.d.ts +55 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/config/validation.js +251 -0
- package/dist/config/validation.js.map +1 -0
- package/dist/http/index.d.ts +8 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +12 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/sync-handlers.d.ts +162 -0
- package/dist/http/sync-handlers.d.ts.map +1 -0
- package/dist/http/sync-handlers.js +271 -0
- package/dist/http/sync-handlers.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/dist/server/index.d.ts +34 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +3329 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/static.d.ts +18 -0
- package/dist/server/static.d.ts.map +1 -0
- package/dist/server/static.js +71 -0
- package/dist/server/static.js.map +1 -0
- package/dist/server/ws/broadcaster.d.ts +8 -0
- package/dist/server/ws/broadcaster.d.ts.map +1 -0
- package/dist/server/ws/broadcaster.js +7 -0
- package/dist/server/ws/broadcaster.js.map +1 -0
- package/dist/server/ws/handler.d.ts +55 -0
- package/dist/server/ws/handler.d.ts.map +1 -0
- package/dist/server/ws/handler.js +160 -0
- package/dist/server/ws/handler.js.map +1 -0
- package/dist/services/blocked-cache.d.ts +297 -0
- package/dist/services/blocked-cache.d.ts.map +1 -0
- package/dist/services/blocked-cache.js +755 -0
- package/dist/services/blocked-cache.js.map +1 -0
- package/dist/services/dependency.d.ts +205 -0
- package/dist/services/dependency.d.ts.map +1 -0
- package/dist/services/dependency.js +566 -0
- package/dist/services/dependency.js.map +1 -0
- package/dist/services/embeddings/fusion.d.ts +33 -0
- package/dist/services/embeddings/fusion.d.ts.map +1 -0
- package/dist/services/embeddings/fusion.js +34 -0
- package/dist/services/embeddings/fusion.js.map +1 -0
- package/dist/services/embeddings/index.d.ts +12 -0
- package/dist/services/embeddings/index.d.ts.map +1 -0
- package/dist/services/embeddings/index.js +10 -0
- package/dist/services/embeddings/index.js.map +1 -0
- package/dist/services/embeddings/local-provider.d.ts +31 -0
- package/dist/services/embeddings/local-provider.d.ts.map +1 -0
- package/dist/services/embeddings/local-provider.js +80 -0
- package/dist/services/embeddings/local-provider.js.map +1 -0
- package/dist/services/embeddings/service.d.ts +76 -0
- package/dist/services/embeddings/service.d.ts.map +1 -0
- package/dist/services/embeddings/service.js +153 -0
- package/dist/services/embeddings/service.js.map +1 -0
- package/dist/services/embeddings/types.d.ts +70 -0
- package/dist/services/embeddings/types.d.ts.map +1 -0
- package/dist/services/embeddings/types.js +8 -0
- package/dist/services/embeddings/types.js.map +1 -0
- package/dist/services/id-length-cache.d.ts +156 -0
- package/dist/services/id-length-cache.d.ts.map +1 -0
- package/dist/services/id-length-cache.js +197 -0
- package/dist/services/id-length-cache.js.map +1 -0
- package/dist/services/inbox.d.ts +147 -0
- package/dist/services/inbox.d.ts.map +1 -0
- package/dist/services/inbox.js +428 -0
- package/dist/services/inbox.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +10 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/priority-service.d.ts +145 -0
- package/dist/services/priority-service.d.ts.map +1 -0
- package/dist/services/priority-service.js +272 -0
- package/dist/services/priority-service.js.map +1 -0
- package/dist/services/search-utils.d.ts +47 -0
- package/dist/services/search-utils.d.ts.map +1 -0
- package/dist/services/search-utils.js +83 -0
- package/dist/services/search-utils.js.map +1 -0
- package/dist/sync/hash.d.ts +48 -0
- package/dist/sync/hash.d.ts.map +1 -0
- package/dist/sync/hash.js +136 -0
- package/dist/sync/hash.js.map +1 -0
- package/dist/sync/index.d.ts +11 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +16 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/merge.d.ts +80 -0
- package/dist/sync/merge.d.ts.map +1 -0
- package/dist/sync/merge.js +310 -0
- package/dist/sync/merge.js.map +1 -0
- package/dist/sync/serialization.d.ts +132 -0
- package/dist/sync/serialization.d.ts.map +1 -0
- package/dist/sync/serialization.js +306 -0
- package/dist/sync/serialization.js.map +1 -0
- package/dist/sync/service.d.ts +102 -0
- package/dist/sync/service.d.ts.map +1 -0
- package/dist/sync/service.js +493 -0
- package/dist/sync/service.js.map +1 -0
- package/dist/sync/types.d.ts +275 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +76 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/systems/identity.d.ts +479 -0
- package/dist/systems/identity.d.ts.map +1 -0
- package/dist/systems/identity.js +817 -0
- package/dist/systems/identity.js.map +1 -0
- package/dist/systems/index.d.ts +8 -0
- package/dist/systems/index.d.ts.map +1 -0
- package/dist/systems/index.js +29 -0
- package/dist/systems/index.js.map +1 -0
- package/package.json +121 -0
- package/web/assets/charts-vendor-D1YcbGux.js +55 -0
- package/web/assets/dnd-vendor-DmxE-_ZH.js +5 -0
- package/web/assets/editor-vendor-BxraAWts.js +279 -0
- package/web/assets/index-B77vv208.js +341 -0
- package/web/assets/index-CF_XnVLh.css +1 -0
- package/web/assets/router-vendor-BCKpRBrB.js +41 -0
- package/web/assets/ui-vendor-DUahGnbT.js +45 -0
- package/web/assets/utils-vendor-CfYKiENT.js +813 -0
- package/web/favicon.ico +0 -0
- package/web/index.html +23 -0
- package/web/logo.png +0 -0
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin Commands - System health and maintenance operations
|
|
3
|
+
*
|
|
4
|
+
* Provides commands for:
|
|
5
|
+
* - doctor: Check system health and diagnose issues
|
|
6
|
+
* - migrate: Run database migrations
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { success, failure, ExitCode } from '../types.js';
|
|
11
|
+
import { createStorage } from '@stoneforge/storage';
|
|
12
|
+
import { initializeSchema, getSchemaVersion, isSchemaUpToDate, getPendingMigrations, validateSchema, CURRENT_SCHEMA_VERSION, MIGRATIONS, } from '@stoneforge/storage';
|
|
13
|
+
import { resolveDatabasePath, STONEFORGE_DIR, DEFAULT_DB_NAME } from '../db.js';
|
|
14
|
+
async function doctorHandler(_args, options) {
|
|
15
|
+
const diagnostics = [];
|
|
16
|
+
// 1. Check workspace exists
|
|
17
|
+
const stoneforgeDir = join(process.cwd(), STONEFORGE_DIR);
|
|
18
|
+
const workspaceExists = existsSync(stoneforgeDir);
|
|
19
|
+
if (!workspaceExists && !options.db) {
|
|
20
|
+
diagnostics.push({
|
|
21
|
+
name: 'workspace',
|
|
22
|
+
status: 'error',
|
|
23
|
+
message: 'No .stoneforge directory found',
|
|
24
|
+
details: { path: stoneforgeDir },
|
|
25
|
+
});
|
|
26
|
+
return buildDoctorResult(diagnostics, options);
|
|
27
|
+
}
|
|
28
|
+
diagnostics.push({
|
|
29
|
+
name: 'workspace',
|
|
30
|
+
status: 'ok',
|
|
31
|
+
message: options.db ? `Using custom database path: ${options.db}` : `Workspace found at ${stoneforgeDir}`,
|
|
32
|
+
});
|
|
33
|
+
// 2. Check database file exists
|
|
34
|
+
const dbPath = resolveDatabasePath(options);
|
|
35
|
+
if (!dbPath) {
|
|
36
|
+
diagnostics.push({
|
|
37
|
+
name: 'database',
|
|
38
|
+
status: 'error',
|
|
39
|
+
message: 'Database file not found',
|
|
40
|
+
details: { expectedPath: join(stoneforgeDir, DEFAULT_DB_NAME) },
|
|
41
|
+
});
|
|
42
|
+
return buildDoctorResult(diagnostics, options);
|
|
43
|
+
}
|
|
44
|
+
diagnostics.push({
|
|
45
|
+
name: 'database',
|
|
46
|
+
status: 'ok',
|
|
47
|
+
message: `Database found at ${dbPath}`,
|
|
48
|
+
});
|
|
49
|
+
// 3. Check database can be opened
|
|
50
|
+
let backend;
|
|
51
|
+
try {
|
|
52
|
+
// Use create: true to allow opening existing databases without error
|
|
53
|
+
// This doesn't create a new database, just allows opening existing ones
|
|
54
|
+
backend = createStorage({ path: dbPath, create: true });
|
|
55
|
+
diagnostics.push({
|
|
56
|
+
name: 'connection',
|
|
57
|
+
status: 'ok',
|
|
58
|
+
message: 'Database connection successful',
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
63
|
+
diagnostics.push({
|
|
64
|
+
name: 'connection',
|
|
65
|
+
status: 'error',
|
|
66
|
+
message: `Failed to open database: ${message}`,
|
|
67
|
+
});
|
|
68
|
+
return buildDoctorResult(diagnostics, options);
|
|
69
|
+
}
|
|
70
|
+
// 4. Check schema version
|
|
71
|
+
const schemaVersion = getSchemaVersion(backend);
|
|
72
|
+
const schemaUpToDate = isSchemaUpToDate(backend);
|
|
73
|
+
if (schemaVersion === 0) {
|
|
74
|
+
diagnostics.push({
|
|
75
|
+
name: 'schema_version',
|
|
76
|
+
status: 'error',
|
|
77
|
+
message: 'Database schema not initialized',
|
|
78
|
+
details: { currentVersion: 0, expectedVersion: CURRENT_SCHEMA_VERSION },
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
else if (!schemaUpToDate) {
|
|
82
|
+
const pendingMigrations = getPendingMigrations(backend);
|
|
83
|
+
diagnostics.push({
|
|
84
|
+
name: 'schema_version',
|
|
85
|
+
status: 'warning',
|
|
86
|
+
message: `Schema version ${schemaVersion} is behind (current: ${CURRENT_SCHEMA_VERSION})`,
|
|
87
|
+
details: {
|
|
88
|
+
currentVersion: schemaVersion,
|
|
89
|
+
expectedVersion: CURRENT_SCHEMA_VERSION,
|
|
90
|
+
pendingMigrations: pendingMigrations.map((m) => ({
|
|
91
|
+
version: m.version,
|
|
92
|
+
description: m.description,
|
|
93
|
+
})),
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
diagnostics.push({
|
|
99
|
+
name: 'schema_version',
|
|
100
|
+
status: 'ok',
|
|
101
|
+
message: `Schema is at version ${schemaVersion} (up to date)`,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
// 5. Validate schema tables
|
|
105
|
+
const schemaValidation = validateSchema(backend);
|
|
106
|
+
if (!schemaValidation.valid) {
|
|
107
|
+
diagnostics.push({
|
|
108
|
+
name: 'schema_tables',
|
|
109
|
+
status: 'error',
|
|
110
|
+
message: `Missing tables: ${schemaValidation.missingTables.join(', ')}`,
|
|
111
|
+
details: {
|
|
112
|
+
missingTables: schemaValidation.missingTables,
|
|
113
|
+
extraTables: schemaValidation.extraTables,
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
diagnostics.push({
|
|
119
|
+
name: 'schema_tables',
|
|
120
|
+
status: 'ok',
|
|
121
|
+
message: 'All expected tables present',
|
|
122
|
+
details: schemaValidation.extraTables.length > 0
|
|
123
|
+
? { extraTables: schemaValidation.extraTables }
|
|
124
|
+
: undefined,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
// 6. Check database integrity
|
|
128
|
+
try {
|
|
129
|
+
const integrityResult = backend.query('PRAGMA integrity_check');
|
|
130
|
+
if (integrityResult.length === 1 && integrityResult[0].integrity_check === 'ok') {
|
|
131
|
+
diagnostics.push({
|
|
132
|
+
name: 'integrity',
|
|
133
|
+
status: 'ok',
|
|
134
|
+
message: 'Database integrity check passed',
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
diagnostics.push({
|
|
139
|
+
name: 'integrity',
|
|
140
|
+
status: 'error',
|
|
141
|
+
message: 'Database integrity check failed',
|
|
142
|
+
details: { issues: integrityResult.map((r) => r.integrity_check) },
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
148
|
+
diagnostics.push({
|
|
149
|
+
name: 'integrity',
|
|
150
|
+
status: 'error',
|
|
151
|
+
message: `Integrity check failed: ${message}`,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
// 7. Check foreign key integrity
|
|
155
|
+
try {
|
|
156
|
+
const fkResult = backend.query('PRAGMA foreign_key_check');
|
|
157
|
+
if (fkResult.length === 0) {
|
|
158
|
+
diagnostics.push({
|
|
159
|
+
name: 'foreign_keys',
|
|
160
|
+
status: 'ok',
|
|
161
|
+
message: 'Foreign key constraints satisfied',
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
diagnostics.push({
|
|
166
|
+
name: 'foreign_keys',
|
|
167
|
+
status: 'warning',
|
|
168
|
+
message: `${fkResult.length} foreign key violations found`,
|
|
169
|
+
details: {
|
|
170
|
+
violations: fkResult.slice(0, 10).map((r) => ({
|
|
171
|
+
table: r.table,
|
|
172
|
+
rowid: r.rowid,
|
|
173
|
+
parent: r.parent,
|
|
174
|
+
})),
|
|
175
|
+
totalViolations: fkResult.length,
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
182
|
+
diagnostics.push({
|
|
183
|
+
name: 'foreign_keys',
|
|
184
|
+
status: 'warning',
|
|
185
|
+
message: `Foreign key check failed: ${message}`,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
// 8. Check blocked cache consistency
|
|
189
|
+
try {
|
|
190
|
+
// Check 1: Orphaned entries - cache entries referencing elements that don't exist
|
|
191
|
+
const orphanedCache = backend.query(`
|
|
192
|
+
SELECT COUNT(*) as count
|
|
193
|
+
FROM blocked_cache bc
|
|
194
|
+
LEFT JOIN elements e ON bc.element_id = e.id
|
|
195
|
+
WHERE e.id IS NULL
|
|
196
|
+
`);
|
|
197
|
+
// Check 2: Tasks with status='blocked' but no blocked_cache entry
|
|
198
|
+
// These are tasks that have blocked status but the cache doesn't know about them
|
|
199
|
+
const tasksWithBlockedStatusMissingCache = backend.query(`
|
|
200
|
+
SELECT COUNT(*) as count
|
|
201
|
+
FROM elements e
|
|
202
|
+
WHERE e.deleted_at IS NULL
|
|
203
|
+
AND e.type = 'task'
|
|
204
|
+
AND json_extract(e.data, '$.status') = 'blocked'
|
|
205
|
+
AND e.id NOT IN (SELECT element_id FROM blocked_cache)
|
|
206
|
+
`);
|
|
207
|
+
// Check 3: Get total counts for diagnostics
|
|
208
|
+
const blockedCacheCount = backend.query('SELECT COUNT(*) as count FROM blocked_cache');
|
|
209
|
+
const blockedStatusCount = backend.query(`
|
|
210
|
+
SELECT COUNT(*) as count
|
|
211
|
+
FROM elements e
|
|
212
|
+
WHERE e.deleted_at IS NULL
|
|
213
|
+
AND e.type = 'task'
|
|
214
|
+
AND json_extract(e.data, '$.status') = 'blocked'
|
|
215
|
+
`);
|
|
216
|
+
const orphanCount = orphanedCache[0].count;
|
|
217
|
+
const missingCacheCount = tasksWithBlockedStatusMissingCache[0].count;
|
|
218
|
+
const cacheEntries = blockedCacheCount[0].count;
|
|
219
|
+
const tasksWithBlockedStatus = blockedStatusCount[0].count;
|
|
220
|
+
if (orphanCount === 0 && missingCacheCount === 0) {
|
|
221
|
+
diagnostics.push({
|
|
222
|
+
name: 'blocked_cache',
|
|
223
|
+
status: 'ok',
|
|
224
|
+
message: 'Blocked cache is consistent',
|
|
225
|
+
details: options.verbose ? { cacheEntries, tasksWithBlockedStatus } : undefined,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
const issues = [];
|
|
230
|
+
const details = { cacheEntries, tasksWithBlockedStatus };
|
|
231
|
+
if (orphanCount > 0) {
|
|
232
|
+
issues.push(`${orphanCount} orphaned cache entries`);
|
|
233
|
+
details.orphanedCount = orphanCount;
|
|
234
|
+
}
|
|
235
|
+
if (missingCacheCount > 0) {
|
|
236
|
+
issues.push(`${missingCacheCount} blocked tasks missing from cache`);
|
|
237
|
+
details.missingCacheCount = missingCacheCount;
|
|
238
|
+
}
|
|
239
|
+
diagnostics.push({
|
|
240
|
+
name: 'blocked_cache',
|
|
241
|
+
status: 'warning',
|
|
242
|
+
message: `Blocked cache inconsistent: ${issues.join(', ')}. Cache may need rebuild.`,
|
|
243
|
+
details,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
249
|
+
diagnostics.push({
|
|
250
|
+
name: 'blocked_cache',
|
|
251
|
+
status: 'warning',
|
|
252
|
+
message: `Blocked cache check failed: ${message}`,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
// 9. Check database statistics
|
|
256
|
+
try {
|
|
257
|
+
const stats = backend.getStats();
|
|
258
|
+
diagnostics.push({
|
|
259
|
+
name: 'storage',
|
|
260
|
+
status: 'ok',
|
|
261
|
+
message: `Database size: ${formatBytes(stats.fileSize)}`,
|
|
262
|
+
details: { fileSize: stats.fileSize },
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
267
|
+
diagnostics.push({
|
|
268
|
+
name: 'storage',
|
|
269
|
+
status: 'warning',
|
|
270
|
+
message: `Could not get storage stats: ${message}`,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
return buildDoctorResult(diagnostics, options);
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Format bytes to human-readable size
|
|
277
|
+
*/
|
|
278
|
+
function formatBytes(bytes) {
|
|
279
|
+
if (bytes === 0)
|
|
280
|
+
return '0 B';
|
|
281
|
+
const k = 1024;
|
|
282
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
283
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
284
|
+
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Build the doctor result from diagnostics
|
|
288
|
+
*/
|
|
289
|
+
function buildDoctorResult(diagnostics, options) {
|
|
290
|
+
const summary = {
|
|
291
|
+
ok: diagnostics.filter((d) => d.status === 'ok').length,
|
|
292
|
+
warning: diagnostics.filter((d) => d.status === 'warning').length,
|
|
293
|
+
error: diagnostics.filter((d) => d.status === 'error').length,
|
|
294
|
+
};
|
|
295
|
+
const healthy = summary.error === 0;
|
|
296
|
+
const result = {
|
|
297
|
+
healthy,
|
|
298
|
+
diagnostics,
|
|
299
|
+
summary,
|
|
300
|
+
};
|
|
301
|
+
// Build human-readable output
|
|
302
|
+
const lines = [];
|
|
303
|
+
lines.push('System Health Check');
|
|
304
|
+
lines.push('');
|
|
305
|
+
for (const diag of diagnostics) {
|
|
306
|
+
const statusIcon = diag.status === 'ok' ? '[OK]' : diag.status === 'warning' ? '[WARN]' : '[ERROR]';
|
|
307
|
+
lines.push(`${statusIcon} ${diag.name}: ${diag.message}`);
|
|
308
|
+
if (options.verbose && diag.details) {
|
|
309
|
+
for (const [key, value] of Object.entries(diag.details)) {
|
|
310
|
+
const valueStr = typeof value === 'object' ? JSON.stringify(value) : String(value);
|
|
311
|
+
lines.push(` ${key}: ${valueStr}`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
lines.push('');
|
|
316
|
+
lines.push(`Summary: ${summary.ok} ok, ${summary.warning} warnings, ${summary.error} errors`);
|
|
317
|
+
if (healthy) {
|
|
318
|
+
lines.push('');
|
|
319
|
+
lines.push('System is healthy.');
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
lines.push('');
|
|
323
|
+
lines.push('Issues detected. Run "sf migrate" to fix schema issues.');
|
|
324
|
+
}
|
|
325
|
+
return {
|
|
326
|
+
exitCode: healthy ? ExitCode.SUCCESS : ExitCode.GENERAL_ERROR,
|
|
327
|
+
data: result,
|
|
328
|
+
message: lines.join('\n'),
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
async function migrateHandler(_args, options) {
|
|
332
|
+
// Check if database path can be resolved
|
|
333
|
+
const dbPath = resolveDatabasePath(options, false);
|
|
334
|
+
if (!dbPath) {
|
|
335
|
+
return failure('No database found. Run "sf init" to initialize a workspace, or specify --db path', ExitCode.GENERAL_ERROR);
|
|
336
|
+
}
|
|
337
|
+
// For dry-run, we need the database to exist
|
|
338
|
+
if (options.dryRun && !existsSync(dbPath)) {
|
|
339
|
+
return failure('No database found. Run "sf init" to initialize a workspace, or specify --db path', ExitCode.GENERAL_ERROR);
|
|
340
|
+
}
|
|
341
|
+
// Open database
|
|
342
|
+
let backend;
|
|
343
|
+
try {
|
|
344
|
+
backend = createStorage({ path: dbPath, create: true });
|
|
345
|
+
}
|
|
346
|
+
catch (err) {
|
|
347
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
348
|
+
return failure(`Failed to open database: ${message}`, ExitCode.GENERAL_ERROR);
|
|
349
|
+
}
|
|
350
|
+
const previousVersion = getSchemaVersion(backend);
|
|
351
|
+
const pendingMigrations = getPendingMigrations(backend);
|
|
352
|
+
if (pendingMigrations.length === 0) {
|
|
353
|
+
return success({
|
|
354
|
+
previousVersion,
|
|
355
|
+
currentVersion: previousVersion,
|
|
356
|
+
migrationsApplied: [],
|
|
357
|
+
}, `Database is already at version ${previousVersion} (up to date)`);
|
|
358
|
+
}
|
|
359
|
+
// Dry run: just show what would be done
|
|
360
|
+
if (options.dryRun) {
|
|
361
|
+
const lines = [];
|
|
362
|
+
lines.push('Migrations to apply (dry run):');
|
|
363
|
+
lines.push('');
|
|
364
|
+
for (const migration of pendingMigrations) {
|
|
365
|
+
lines.push(` v${migration.version}: ${migration.description}`);
|
|
366
|
+
}
|
|
367
|
+
lines.push('');
|
|
368
|
+
lines.push(`Run "sf migrate" without --dry-run to apply these migrations.`);
|
|
369
|
+
return success({
|
|
370
|
+
previousVersion,
|
|
371
|
+
currentVersion: previousVersion,
|
|
372
|
+
pendingMigrations: pendingMigrations.map((m) => ({
|
|
373
|
+
version: m.version,
|
|
374
|
+
description: m.description,
|
|
375
|
+
})),
|
|
376
|
+
}, lines.join('\n'));
|
|
377
|
+
}
|
|
378
|
+
// Apply migrations
|
|
379
|
+
try {
|
|
380
|
+
const result = initializeSchema(backend);
|
|
381
|
+
const currentVersion = getSchemaVersion(backend);
|
|
382
|
+
const migrationsApplied = result.applied.map((version) => {
|
|
383
|
+
const migration = MIGRATIONS.find((m) => m.version === version);
|
|
384
|
+
return {
|
|
385
|
+
version,
|
|
386
|
+
description: migration?.description ?? 'Unknown migration',
|
|
387
|
+
};
|
|
388
|
+
});
|
|
389
|
+
const lines = [];
|
|
390
|
+
lines.push('Migration complete');
|
|
391
|
+
lines.push('');
|
|
392
|
+
lines.push(`Previous version: ${previousVersion}`);
|
|
393
|
+
lines.push(`Current version: ${currentVersion}`);
|
|
394
|
+
lines.push('');
|
|
395
|
+
if (migrationsApplied.length > 0) {
|
|
396
|
+
lines.push('Migrations applied:');
|
|
397
|
+
for (const m of migrationsApplied) {
|
|
398
|
+
lines.push(` v${m.version}: ${m.description}`);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return success({
|
|
402
|
+
previousVersion,
|
|
403
|
+
currentVersion,
|
|
404
|
+
migrationsApplied,
|
|
405
|
+
}, lines.join('\n'));
|
|
406
|
+
}
|
|
407
|
+
catch (err) {
|
|
408
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
409
|
+
return failure(`Migration failed: ${message}`, ExitCode.GENERAL_ERROR);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// ============================================================================
|
|
413
|
+
// Command Definitions
|
|
414
|
+
// ============================================================================
|
|
415
|
+
export const doctorCommand = {
|
|
416
|
+
name: 'doctor',
|
|
417
|
+
description: 'Check system health and diagnose issues',
|
|
418
|
+
usage: 'sf doctor',
|
|
419
|
+
help: `Check system health and diagnose issues.
|
|
420
|
+
|
|
421
|
+
Performs the following checks:
|
|
422
|
+
- Workspace exists (.stoneforge directory)
|
|
423
|
+
- Database file exists and can be opened
|
|
424
|
+
- Schema version is current
|
|
425
|
+
- All expected tables are present
|
|
426
|
+
- Database integrity check (PRAGMA integrity_check)
|
|
427
|
+
- Foreign key constraint validation
|
|
428
|
+
- Blocked cache consistency
|
|
429
|
+
- Storage statistics
|
|
430
|
+
|
|
431
|
+
Use --verbose to see detailed diagnostic information.
|
|
432
|
+
|
|
433
|
+
Examples:
|
|
434
|
+
sf doctor Run all diagnostics
|
|
435
|
+
sf doctor --verbose Show detailed information
|
|
436
|
+
sf doctor --json Output as JSON`,
|
|
437
|
+
handler: doctorHandler,
|
|
438
|
+
};
|
|
439
|
+
export const migrateCommand = {
|
|
440
|
+
name: 'migrate',
|
|
441
|
+
description: 'Run database migrations',
|
|
442
|
+
usage: 'sf migrate [--dry-run]',
|
|
443
|
+
help: `Run database migrations to update the schema.
|
|
444
|
+
|
|
445
|
+
Migrations are run automatically when needed, but this command can be used to:
|
|
446
|
+
- Check what migrations would be applied (--dry-run)
|
|
447
|
+
- Manually trigger migration
|
|
448
|
+
- Verify migration status
|
|
449
|
+
|
|
450
|
+
Options:
|
|
451
|
+
--dry-run Show what migrations would be applied without running them
|
|
452
|
+
|
|
453
|
+
Examples:
|
|
454
|
+
sf migrate Run pending migrations
|
|
455
|
+
sf migrate --dry-run Preview migrations without applying`,
|
|
456
|
+
options: [
|
|
457
|
+
{
|
|
458
|
+
name: 'dry-run',
|
|
459
|
+
description: 'Show what would be done without making changes',
|
|
460
|
+
hasValue: false,
|
|
461
|
+
},
|
|
462
|
+
],
|
|
463
|
+
handler: migrateHandler,
|
|
464
|
+
};
|
|
465
|
+
//# sourceMappingURL=admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../../src/cli/commands/admin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alias.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/alias.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,aAAa,CAAC;AA2D1D,eAAO,MAAM,YAAY,EAAE,OAsB1B,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alias Command - Show and manage command aliases
|
|
3
|
+
*
|
|
4
|
+
* Displays available command aliases.
|
|
5
|
+
*/
|
|
6
|
+
import { success } from '../types.js';
|
|
7
|
+
import { getOutputMode, getFormatter } from '../formatter.js';
|
|
8
|
+
import { getAllAliases } from '../runner.js';
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Handler
|
|
11
|
+
// ============================================================================
|
|
12
|
+
function aliasHandler(_args, options) {
|
|
13
|
+
const aliasMap = getAllAliases();
|
|
14
|
+
const mode = getOutputMode(options);
|
|
15
|
+
if (mode === 'json') {
|
|
16
|
+
const aliases = {};
|
|
17
|
+
for (const [alias, target] of aliasMap) {
|
|
18
|
+
aliases[alias] = target;
|
|
19
|
+
}
|
|
20
|
+
return success(aliases);
|
|
21
|
+
}
|
|
22
|
+
if (aliasMap.size === 0) {
|
|
23
|
+
return success(null, 'No aliases defined');
|
|
24
|
+
}
|
|
25
|
+
if (mode === 'quiet') {
|
|
26
|
+
const lines = [];
|
|
27
|
+
for (const [alias, target] of aliasMap) {
|
|
28
|
+
lines.push(`${alias}=${target}`);
|
|
29
|
+
}
|
|
30
|
+
return success(lines.join('\n'));
|
|
31
|
+
}
|
|
32
|
+
// Human-readable output
|
|
33
|
+
const formatter = getFormatter(mode);
|
|
34
|
+
const headers = ['ALIAS', 'COMMAND'];
|
|
35
|
+
const rows = [];
|
|
36
|
+
// Sort aliases alphabetically
|
|
37
|
+
const sortedAliases = Array.from(aliasMap.entries()).sort((a, b) => a[0].localeCompare(b[0]));
|
|
38
|
+
for (const [alias, target] of sortedAliases) {
|
|
39
|
+
rows.push([alias, target]);
|
|
40
|
+
}
|
|
41
|
+
const table = formatter.table(headers, rows);
|
|
42
|
+
return success(null, `Command Aliases:\n\n${table}`);
|
|
43
|
+
}
|
|
44
|
+
// ============================================================================
|
|
45
|
+
// Command Definition
|
|
46
|
+
// ============================================================================
|
|
47
|
+
export const aliasCommand = {
|
|
48
|
+
name: 'alias',
|
|
49
|
+
description: 'Show command aliases',
|
|
50
|
+
usage: 'sf alias',
|
|
51
|
+
help: `Display all available command aliases.
|
|
52
|
+
|
|
53
|
+
Aliases provide shorter or more intuitive names for existing commands.
|
|
54
|
+
|
|
55
|
+
Examples:
|
|
56
|
+
sf alias # Show all aliases
|
|
57
|
+
sf alias --json # Output as JSON
|
|
58
|
+
|
|
59
|
+
Built-in aliases:
|
|
60
|
+
add, new -> create
|
|
61
|
+
rm, remove -> delete
|
|
62
|
+
ls -> list
|
|
63
|
+
s, get -> show
|
|
64
|
+
todo, tasks -> ready
|
|
65
|
+
done, complete -> close
|
|
66
|
+
st -> status`,
|
|
67
|
+
options: [],
|
|
68
|
+
handler: aliasHandler,
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=alias.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alias.js","sourceRoot":"","sources":["../../../src/cli/commands/alias.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,SAAS,YAAY,CACnB,KAAe,EACf,OAAsB;IAEtB,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAEpC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;QAC1B,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,wBAAwB;IACxB,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACrC,MAAM,IAAI,GAAe,EAAE,CAAC;IAE5B,8BAA8B;IAC9B,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACjE,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACzB,CAAC;IAEF,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC,IAAI,EAAE,uBAAuB,KAAK,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E,MAAM,CAAC,MAAM,YAAY,GAAY;IACnC,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,sBAAsB;IACnC,KAAK,EAAE,UAAU;IACjB,IAAI,EAAE;;;;;;;;;;;;;;;yBAeiB;IACvB,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,YAAY;CACtB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Channel Commands - Collection command interface for channels
|
|
3
|
+
*
|
|
4
|
+
* Provides CLI commands for channel operations:
|
|
5
|
+
* - channel create: Create a new channel
|
|
6
|
+
* - channel join: Join a channel
|
|
7
|
+
* - channel leave: Leave a channel
|
|
8
|
+
* - channel list: List channels
|
|
9
|
+
* - channel members: List channel members
|
|
10
|
+
*/
|
|
11
|
+
import type { Command } from '../types.js';
|
|
12
|
+
export declare const channelCommand: Command;
|
|
13
|
+
//# sourceMappingURL=channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAA+C,MAAM,aAAa,CAAC;AA0wBxF,eAAO,MAAM,cAAc,EAAE,OAyD5B,CAAC"}
|