@stackmemoryai/stackmemory 0.3.6 → 0.3.8
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/dist/agents/core/agent-task-manager.js +5 -5
- package/dist/agents/core/agent-task-manager.js.map +2 -2
- package/dist/agents/verifiers/base-verifier.js +2 -2
- package/dist/agents/verifiers/base-verifier.js.map +2 -2
- package/dist/agents/verifiers/formatter-verifier.js.map +2 -2
- package/dist/agents/verifiers/llm-judge.js.map +2 -2
- package/dist/cli/claude-sm.js +13 -13
- package/dist/cli/claude-sm.js.map +2 -2
- package/dist/cli/codex-sm.js +13 -13
- package/dist/cli/codex-sm.js.map +2 -2
- package/dist/cli/commands/agent.js.map +2 -2
- package/dist/cli/commands/chromadb.js +261 -46
- package/dist/cli/commands/chromadb.js.map +2 -2
- package/dist/cli/commands/clear.js +10 -3
- package/dist/cli/commands/clear.js.map +2 -2
- package/dist/cli/commands/config.js +43 -33
- package/dist/cli/commands/config.js.map +2 -2
- package/dist/cli/commands/context.js +13 -2
- package/dist/cli/commands/context.js.map +2 -2
- package/dist/cli/commands/dashboard.js +41 -13
- package/dist/cli/commands/dashboard.js.map +2 -2
- package/dist/cli/commands/gc.js +251 -0
- package/dist/cli/commands/gc.js.map +7 -0
- package/dist/cli/commands/handoff.js +12 -1
- package/dist/cli/commands/handoff.js.map +2 -2
- package/dist/cli/commands/infinite-storage.js +92 -40
- package/dist/cli/commands/infinite-storage.js.map +2 -2
- package/dist/cli/commands/linear-create.js +49 -10
- package/dist/cli/commands/linear-create.js.map +2 -2
- package/dist/cli/commands/linear-list.js +45 -11
- package/dist/cli/commands/linear-list.js.map +2 -2
- package/dist/cli/commands/linear-migrate.js +29 -5
- package/dist/cli/commands/linear-migrate.js.map +2 -2
- package/dist/cli/commands/linear-test.js +26 -7
- package/dist/cli/commands/linear-test.js.map +2 -2
- package/dist/cli/commands/linear-unified.js +350 -0
- package/dist/cli/commands/linear-unified.js.map +7 -0
- package/dist/cli/commands/linear.js +17 -6
- package/dist/cli/commands/linear.js.map +2 -2
- package/dist/cli/commands/monitor.js.map +2 -2
- package/dist/cli/commands/onboard.js +35 -8
- package/dist/cli/commands/onboard.js.map +2 -2
- package/dist/cli/commands/quality.js +2 -7
- package/dist/cli/commands/quality.js.map +2 -2
- package/dist/cli/commands/search.js.map +2 -2
- package/dist/cli/commands/session.js +23 -6
- package/dist/cli/commands/session.js.map +2 -2
- package/dist/cli/commands/skills.js +84 -28
- package/dist/cli/commands/skills.js.map +2 -2
- package/dist/cli/commands/storage.js +119 -38
- package/dist/cli/commands/storage.js.map +2 -2
- package/dist/cli/commands/tasks.js.map +2 -2
- package/dist/cli/commands/tui.js +13 -2
- package/dist/cli/commands/tui.js.map +2 -2
- package/dist/cli/commands/webhook.js +71 -21
- package/dist/cli/commands/webhook.js.map +2 -2
- package/dist/cli/commands/workflow.js +11 -7
- package/dist/cli/commands/workflow.js.map +2 -2
- package/dist/cli/commands/worktree.js +34 -13
- package/dist/cli/commands/worktree.js.map +2 -2
- package/dist/cli/index.js +7 -5
- package/dist/cli/index.js.map +2 -2
- package/dist/core/config/config-manager.js.map +2 -2
- package/dist/core/config/types.js.map +1 -1
- package/dist/core/context/auto-context.js +10 -6
- package/dist/core/context/auto-context.js.map +2 -2
- package/dist/core/context/compaction-handler.js.map +2 -2
- package/dist/core/context/context-bridge.js.map +2 -2
- package/dist/core/context/dual-stack-manager.js.map +2 -2
- package/dist/core/context/frame-database.js +13 -3
- package/dist/core/context/frame-database.js.map +2 -2
- package/dist/core/context/frame-digest.js +7 -5
- package/dist/core/context/frame-digest.js.map +2 -2
- package/dist/core/context/frame-handoff-manager.js.map +2 -2
- package/dist/core/context/frame-manager.js +12 -1
- package/dist/core/context/frame-manager.js.map +2 -2
- package/dist/core/context/frame-stack.js +16 -5
- package/dist/core/context/frame-stack.js.map +2 -2
- package/dist/core/context/incremental-gc.js +286 -0
- package/dist/core/context/incremental-gc.js.map +7 -0
- package/dist/core/context/index.js.map +1 -1
- package/dist/core/context/permission-manager.js +12 -1
- package/dist/core/context/permission-manager.js.map +2 -2
- package/dist/core/context/refactored-frame-manager.js +12 -3
- package/dist/core/context/refactored-frame-manager.js.map +2 -2
- package/dist/core/context/shared-context-layer.js +16 -3
- package/dist/core/context/shared-context-layer.js.map +2 -2
- package/dist/core/context/stack-merge-resolver.js.map +2 -2
- package/dist/core/context/validation.js.map +2 -2
- package/dist/core/database/batch-operations.js +112 -86
- package/dist/core/database/batch-operations.js.map +2 -2
- package/dist/core/database/connection-pool.js.map +2 -2
- package/dist/core/database/migration-manager.js.map +2 -2
- package/dist/core/database/paradedb-adapter.js.map +2 -2
- package/dist/core/database/query-cache.js +19 -9
- package/dist/core/database/query-cache.js.map +2 -2
- package/dist/core/database/query-router.js.map +2 -2
- package/dist/core/database/sqlite-adapter.js +1 -1
- package/dist/core/database/sqlite-adapter.js.map +2 -2
- package/dist/core/digest/enhanced-hybrid-digest.js +8 -2
- package/dist/core/digest/enhanced-hybrid-digest.js.map +2 -2
- package/dist/core/errors/recovery.js +9 -2
- package/dist/core/errors/recovery.js.map +2 -2
- package/dist/core/frame/workflow-templates-stub.js.map +1 -1
- package/dist/core/frame/workflow-templates.js +40 -1
- package/dist/core/frame/workflow-templates.js.map +2 -2
- package/dist/core/merge/resolution-engine.js.map +2 -2
- package/dist/core/monitoring/error-handler.js.map +2 -2
- package/dist/core/monitoring/logger.js +19 -3
- package/dist/core/monitoring/logger.js.map +2 -2
- package/dist/core/monitoring/metrics.js +13 -2
- package/dist/core/monitoring/metrics.js.map +2 -2
- package/dist/core/monitoring/progress-tracker.js +12 -1
- package/dist/core/monitoring/progress-tracker.js.map +2 -2
- package/dist/core/monitoring/session-monitor.js.map +2 -2
- package/dist/core/performance/context-cache.js.map +2 -2
- package/dist/core/performance/lazy-context-loader.js +24 -20
- package/dist/core/performance/lazy-context-loader.js.map +2 -2
- package/dist/core/performance/monitor.js.map +2 -2
- package/dist/core/performance/optimized-frame-context.js +27 -12
- package/dist/core/performance/optimized-frame-context.js.map +2 -2
- package/dist/core/performance/performance-benchmark.js +10 -6
- package/dist/core/performance/performance-benchmark.js.map +2 -2
- package/dist/core/performance/performance-profiler.js +63 -15
- package/dist/core/performance/performance-profiler.js.map +2 -2
- package/dist/core/performance/streaming-jsonl-parser.js +5 -1
- package/dist/core/performance/streaming-jsonl-parser.js.map +2 -2
- package/dist/core/persistence/postgres-adapter.js.map +2 -2
- package/dist/core/projects/project-manager.js +14 -20
- package/dist/core/projects/project-manager.js.map +2 -2
- package/dist/core/retrieval/context-retriever.js.map +2 -2
- package/dist/core/retrieval/graph-retrieval.js.map +2 -2
- package/dist/core/retrieval/llm-context-retrieval.js.map +2 -2
- package/dist/core/retrieval/retrieval-benchmarks.js.map +2 -2
- package/dist/core/retrieval/summary-generator.js.map +2 -2
- package/dist/core/session/clear-survival-stub.js +5 -1
- package/dist/core/session/clear-survival-stub.js.map +2 -2
- package/dist/core/session/clear-survival.js +35 -0
- package/dist/core/session/clear-survival.js.map +2 -2
- package/dist/core/session/handoff-generator.js.map +2 -2
- package/dist/core/session/index.js.map +1 -1
- package/dist/core/session/session-manager.js +16 -5
- package/dist/core/session/session-manager.js.map +2 -2
- package/dist/core/skills/skill-storage.js +13 -2
- package/dist/core/skills/skill-storage.js.map +2 -2
- package/dist/core/storage/chromadb-adapter.js +6 -2
- package/dist/core/storage/chromadb-adapter.js.map +2 -2
- package/dist/core/storage/chromadb-simple.js +17 -5
- package/dist/core/storage/chromadb-simple.js.map +2 -2
- package/dist/core/storage/infinite-storage.js +109 -46
- package/dist/core/storage/infinite-storage.js.map +2 -2
- package/dist/core/storage/railway-optimized-storage.js +67 -30
- package/dist/core/storage/railway-optimized-storage.js.map +2 -2
- package/dist/core/storage/remote-storage.js +53 -24
- package/dist/core/storage/remote-storage.js.map +2 -2
- package/dist/core/trace/cli-trace-wrapper.js +25 -7
- package/dist/core/trace/cli-trace-wrapper.js.map +2 -2
- package/dist/core/trace/db-trace-wrapper.js +96 -68
- package/dist/core/trace/db-trace-wrapper.js.map +2 -2
- package/dist/core/trace/debug-trace.js +44 -16
- package/dist/core/trace/debug-trace.js.map +2 -2
- package/dist/core/trace/index.js +50 -35
- package/dist/core/trace/index.js.map +2 -2
- package/dist/core/trace/linear-api-wrapper.js +10 -5
- package/dist/core/trace/linear-api-wrapper.js.map +2 -2
- package/dist/core/trace/trace-demo.js +26 -11
- package/dist/core/trace/trace-demo.js.map +2 -2
- package/dist/core/trace/trace-detector.js +9 -2
- package/dist/core/trace/trace-detector.js.map +2 -2
- package/dist/core/trace/trace-store.js.map +2 -2
- package/dist/core/trace/types.js.map +1 -1
- package/dist/core/utils/compression.js.map +1 -1
- package/dist/core/utils/update-checker.js.map +2 -2
- package/dist/core/worktree/worktree-manager.js +18 -7
- package/dist/core/worktree/worktree-manager.js.map +2 -2
- package/dist/features/analytics/api/analytics-api.js.map +2 -2
- package/dist/features/analytics/core/analytics-service.js +12 -1
- package/dist/features/analytics/core/analytics-service.js.map +2 -2
- package/dist/features/analytics/queries/metrics-queries.js +1 -1
- package/dist/features/analytics/queries/metrics-queries.js.map +2 -2
- package/dist/features/tasks/pebbles-task-store.js.map +2 -2
- package/dist/features/tui/components/analytics-panel.js +36 -15
- package/dist/features/tui/components/analytics-panel.js.map +2 -2
- package/dist/features/tui/components/pr-tracker.js +19 -7
- package/dist/features/tui/components/pr-tracker.js.map +2 -2
- package/dist/features/tui/components/session-monitor.js +22 -9
- package/dist/features/tui/components/session-monitor.js.map +2 -2
- package/dist/features/tui/components/subagent-fleet.js +20 -13
- package/dist/features/tui/components/subagent-fleet.js.map +2 -2
- package/dist/features/tui/components/task-board.js +666 -2
- package/dist/features/tui/components/task-board.js.map +2 -2
- package/dist/features/tui/index.js +16 -5
- package/dist/features/tui/index.js.map +2 -2
- package/dist/features/tui/services/data-service.js +30 -15
- package/dist/features/tui/services/data-service.js.map +2 -2
- package/dist/features/tui/services/linear-task-reader.js +3 -1
- package/dist/features/tui/services/linear-task-reader.js.map +2 -2
- package/dist/features/tui/services/websocket-client.js +16 -3
- package/dist/features/tui/services/websocket-client.js.map +2 -2
- package/dist/features/tui/terminal-compat.js +33 -18
- package/dist/features/tui/terminal-compat.js.map +2 -2
- package/dist/features/web/client/stores/task-store.js.map +2 -2
- package/dist/features/web/server/index.js +31 -12
- package/dist/features/web/server/index.js.map +2 -2
- package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +2 -2
- package/dist/integrations/claude-code/lifecycle-hooks.js.map +2 -2
- package/dist/integrations/claude-code/post-task-hooks.js.map +2 -2
- package/dist/integrations/linear/auth.js +17 -6
- package/dist/integrations/linear/auth.js.map +2 -2
- package/dist/integrations/linear/auto-sync.js.map +2 -2
- package/dist/integrations/linear/client.js.map +2 -2
- package/dist/integrations/linear/config.js.map +2 -2
- package/dist/integrations/linear/migration.js.map +2 -2
- package/dist/integrations/linear/oauth-server.js +13 -2
- package/dist/integrations/linear/oauth-server.js.map +2 -2
- package/dist/integrations/linear/rest-client.js.map +2 -2
- package/dist/integrations/linear/sync-enhanced.js +202 -0
- package/dist/integrations/linear/sync-enhanced.js.map +7 -0
- package/dist/integrations/linear/sync-manager.js.map +2 -2
- package/dist/integrations/linear/sync-service.js +24 -14
- package/dist/integrations/linear/sync-service.js.map +2 -2
- package/dist/integrations/linear/sync.js +196 -3
- package/dist/integrations/linear/sync.js.map +2 -2
- package/dist/integrations/linear/unified-sync.js +560 -0
- package/dist/integrations/linear/unified-sync.js.map +7 -0
- package/dist/integrations/linear/webhook-handler.js +12 -1
- package/dist/integrations/linear/webhook-handler.js.map +2 -2
- package/dist/integrations/linear/webhook-server.js +29 -19
- package/dist/integrations/linear/webhook-server.js.map +2 -2
- package/dist/integrations/linear/webhook.js +12 -1
- package/dist/integrations/linear/webhook.js.map +2 -2
- package/dist/integrations/mcp/handlers/context-handlers.js.map +2 -2
- package/dist/integrations/mcp/handlers/linear-handlers.js.map +2 -2
- package/dist/integrations/mcp/handlers/skill-handlers.js +13 -2
- package/dist/integrations/mcp/handlers/skill-handlers.js.map +2 -2
- package/dist/integrations/mcp/handlers/task-handlers.js.map +2 -2
- package/dist/integrations/mcp/handlers/trace-handlers.js.map +2 -2
- package/dist/integrations/mcp/middleware/tool-scoring.js.map +2 -2
- package/dist/integrations/mcp/refactored-server.js +15 -4
- package/dist/integrations/mcp/refactored-server.js.map +2 -2
- package/dist/integrations/mcp/server.js +12 -1
- package/dist/integrations/mcp/server.js.map +2 -2
- package/dist/integrations/mcp/tool-definitions.js.map +2 -2
- package/dist/integrations/pg-aiguide/embedding-provider.js +13 -2
- package/dist/integrations/pg-aiguide/embedding-provider.js.map +2 -2
- package/dist/integrations/pg-aiguide/semantic-search.js.map +2 -2
- package/dist/mcp/stackmemory-mcp-server.js +1 -1
- package/dist/mcp/stackmemory-mcp-server.js.map +2 -2
- package/dist/middleware/exponential-rate-limiter.js.map +2 -2
- package/dist/servers/production/auth-middleware.js +13 -2
- package/dist/servers/production/auth-middleware.js.map +2 -2
- package/dist/servers/railway/index.js +22 -11
- package/dist/servers/railway/index.js.map +2 -2
- package/dist/services/config-service.js +6 -7
- package/dist/services/config-service.js.map +2 -2
- package/dist/services/context-service.js +11 -12
- package/dist/services/context-service.js.map +2 -2
- package/dist/skills/claude-skills.js +108 -3
- package/dist/skills/claude-skills.js.map +2 -2
- package/dist/skills/dashboard-launcher.js.map +2 -2
- package/dist/skills/repo-ingestion-skill.js +561 -0
- package/dist/skills/repo-ingestion-skill.js.map +7 -0
- package/dist/utils/env.js +46 -0
- package/dist/utils/env.js.map +7 -0
- package/dist/utils/logger.js +1 -1
- package/dist/utils/logger.js.map +2 -2
- package/package.json +5 -1
|
@@ -3,7 +3,8 @@ import chalk from "chalk";
|
|
|
3
3
|
import ora from "ora";
|
|
4
4
|
import { ChromaDBAdapter } from "../../core/storage/chromadb-adapter.js";
|
|
5
5
|
import { FrameManager } from "../../core/context/frame-manager.js";
|
|
6
|
-
import {
|
|
6
|
+
import { logger } from "../../core/monitoring/logger.js";
|
|
7
|
+
import { RepoIngestionSkill } from "../../skills/repo-ingestion-skill.js";
|
|
7
8
|
import Table from "cli-table3";
|
|
8
9
|
import dotenv from "dotenv";
|
|
9
10
|
import path from "path";
|
|
@@ -12,22 +13,20 @@ import fs from "fs";
|
|
|
12
13
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
13
14
|
dotenv.config({
|
|
14
15
|
path: path.join(__dirname, "../../../.env"),
|
|
15
|
-
override: true
|
|
16
|
-
silent: true
|
|
16
|
+
override: true
|
|
17
17
|
});
|
|
18
|
-
const logger = new Logger("ChromaDB-CLI");
|
|
19
18
|
function createChromaDBCommand() {
|
|
20
19
|
const chromadb = new Command("chromadb").description("Manage ChromaDB vector storage for context").alias("chroma");
|
|
21
20
|
chromadb.command("init").description("Initialize ChromaDB connection").option("--api-key <key>", "ChromaDB API key").option("--tenant <tenant>", "ChromaDB tenant ID").option("--database <database>", "ChromaDB database name").option("--user-id <id>", "User ID for segmentation").option("--team-id <id>", "Team ID for segmentation").action(async (options) => {
|
|
22
21
|
const spinner = ora("Initializing ChromaDB...").start();
|
|
23
22
|
try {
|
|
24
23
|
const config = {
|
|
25
|
-
apiKey: options.apiKey || process.env
|
|
26
|
-
tenant: options.tenant || process.env
|
|
27
|
-
database: options.database || process.env
|
|
24
|
+
apiKey: options.apiKey || process.env["CHROMADB_API_KEY"] || "",
|
|
25
|
+
tenant: options.tenant || process.env["CHROMADB_TENANT"] || "",
|
|
26
|
+
database: options.database || process.env["CHROMADB_DATABASE"] || "stackmemory"
|
|
28
27
|
};
|
|
29
|
-
const userId = options.userId || process.env
|
|
30
|
-
const teamId = options.teamId || process.env
|
|
28
|
+
const userId = options.userId || process.env["USER"] || "default";
|
|
29
|
+
const teamId = options.teamId || process.env["CHROMADB_TEAM_ID"];
|
|
31
30
|
if (!config.apiKey || !config.tenant) {
|
|
32
31
|
spinner.fail("Missing ChromaDB credentials");
|
|
33
32
|
console.log(chalk.yellow("\nPlease provide:"));
|
|
@@ -56,7 +55,10 @@ function createChromaDBCommand() {
|
|
|
56
55
|
updates.push(`CHROMADB_DATABASE=${config.database}`);
|
|
57
56
|
}
|
|
58
57
|
if (updates.length > 0) {
|
|
59
|
-
fs.appendFileSync(
|
|
58
|
+
fs.appendFileSync(
|
|
59
|
+
envPath,
|
|
60
|
+
"\n# ChromaDB Configuration\n" + updates.join("\n") + "\n"
|
|
61
|
+
);
|
|
60
62
|
}
|
|
61
63
|
spinner.succeed("ChromaDB initialized successfully");
|
|
62
64
|
console.log(chalk.green("\n\u2705 Configuration:"));
|
|
@@ -69,19 +71,25 @@ function createChromaDBCommand() {
|
|
|
69
71
|
} catch (error) {
|
|
70
72
|
spinner.fail("Failed to initialize ChromaDB");
|
|
71
73
|
logger.error("Initialization error", error);
|
|
72
|
-
console.error(
|
|
74
|
+
console.error(
|
|
75
|
+
chalk.red(error instanceof Error ? error.message : "Unknown error")
|
|
76
|
+
);
|
|
73
77
|
}
|
|
74
78
|
});
|
|
75
|
-
chromadb.command("store").description("Store current context in ChromaDB").option(
|
|
79
|
+
chromadb.command("store").description("Store current context in ChromaDB").option(
|
|
80
|
+
"--type <type>",
|
|
81
|
+
"Context type (frame/decision/observation)",
|
|
82
|
+
"frame"
|
|
83
|
+
).option("--content <content>", "Content to store").option("--project <name>", "Project name").action(async (options) => {
|
|
76
84
|
const spinner = ora("Storing context...").start();
|
|
77
85
|
try {
|
|
78
86
|
const config = {
|
|
79
|
-
apiKey: process.env
|
|
80
|
-
tenant: process.env
|
|
81
|
-
database: process.env
|
|
87
|
+
apiKey: process.env["CHROMADB_API_KEY"] || "",
|
|
88
|
+
tenant: process.env["CHROMADB_TENANT"] || "",
|
|
89
|
+
database: process.env["CHROMADB_DATABASE"] || "stackmemory"
|
|
82
90
|
};
|
|
83
|
-
const userId = process.env
|
|
84
|
-
const teamId = process.env
|
|
91
|
+
const userId = process.env["USER"] || "default";
|
|
92
|
+
const teamId = process.env["CHROMADB_TEAM_ID"];
|
|
85
93
|
const adapter = new ChromaDBAdapter(config, userId, teamId);
|
|
86
94
|
await adapter.initialize();
|
|
87
95
|
if (options.type === "frame") {
|
|
@@ -96,8 +104,8 @@ function createChromaDBCommand() {
|
|
|
96
104
|
const metadata = {
|
|
97
105
|
project_name: options.project || path.basename(process.cwd())
|
|
98
106
|
};
|
|
99
|
-
if (process.env
|
|
100
|
-
metadata.session_id = process.env
|
|
107
|
+
if (process.env["STACKMEMORY_SESSION_ID"]) {
|
|
108
|
+
metadata.session_id = process.env["STACKMEMORY_SESSION_ID"];
|
|
101
109
|
}
|
|
102
110
|
await adapter.storeContext(
|
|
103
111
|
options.type,
|
|
@@ -109,19 +117,21 @@ function createChromaDBCommand() {
|
|
|
109
117
|
} catch (error) {
|
|
110
118
|
spinner.fail("Failed to store context");
|
|
111
119
|
logger.error("Store error", error);
|
|
112
|
-
console.error(
|
|
120
|
+
console.error(
|
|
121
|
+
chalk.red(error instanceof Error ? error.message : "Unknown error")
|
|
122
|
+
);
|
|
113
123
|
}
|
|
114
124
|
});
|
|
115
125
|
chromadb.command("query <search>").description("Query contexts from ChromaDB").option("--limit <n>", "Number of results", "10").option("--type <type>", "Filter by type").option("--project <name>", "Filter by project").action(async (search, options) => {
|
|
116
126
|
const spinner = ora("Searching...").start();
|
|
117
127
|
try {
|
|
118
128
|
const config = {
|
|
119
|
-
apiKey: process.env
|
|
120
|
-
tenant: process.env
|
|
121
|
-
database: process.env
|
|
129
|
+
apiKey: process.env["CHROMADB_API_KEY"] || "",
|
|
130
|
+
tenant: process.env["CHROMADB_TENANT"] || "",
|
|
131
|
+
database: process.env["CHROMADB_DATABASE"] || "stackmemory"
|
|
122
132
|
};
|
|
123
|
-
const userId = process.env
|
|
124
|
-
const teamId = process.env
|
|
133
|
+
const userId = process.env["USER"] || "default";
|
|
134
|
+
const teamId = process.env["CHROMADB_TEAM_ID"];
|
|
125
135
|
const adapter = new ChromaDBAdapter(config, userId, teamId);
|
|
126
136
|
await adapter.initialize();
|
|
127
137
|
const filters = {};
|
|
@@ -161,19 +171,21 @@ function createChromaDBCommand() {
|
|
|
161
171
|
} catch (error) {
|
|
162
172
|
spinner.fail("Failed to query contexts");
|
|
163
173
|
logger.error("Query error", error);
|
|
164
|
-
console.error(
|
|
174
|
+
console.error(
|
|
175
|
+
chalk.red(error instanceof Error ? error.message : "Unknown error")
|
|
176
|
+
);
|
|
165
177
|
}
|
|
166
178
|
});
|
|
167
179
|
chromadb.command("recent").description("Get recent contexts").option("--limit <n>", "Number of results", "20").option("--type <type>", "Filter by type").action(async (options) => {
|
|
168
180
|
const spinner = ora("Fetching recent contexts...").start();
|
|
169
181
|
try {
|
|
170
182
|
const config = {
|
|
171
|
-
apiKey: process.env
|
|
172
|
-
tenant: process.env
|
|
173
|
-
database: process.env
|
|
183
|
+
apiKey: process.env["CHROMADB_API_KEY"] || "",
|
|
184
|
+
tenant: process.env["CHROMADB_TENANT"] || "",
|
|
185
|
+
database: process.env["CHROMADB_DATABASE"] || "stackmemory"
|
|
174
186
|
};
|
|
175
|
-
const userId = process.env
|
|
176
|
-
const teamId = process.env
|
|
187
|
+
const userId = process.env["USER"] || "default";
|
|
188
|
+
const teamId = process.env["CHROMADB_TEAM_ID"];
|
|
177
189
|
const adapter = new ChromaDBAdapter(config, userId, teamId);
|
|
178
190
|
await adapter.initialize();
|
|
179
191
|
const results = await adapter.getRecentContexts(
|
|
@@ -201,24 +213,28 @@ function createChromaDBCommand() {
|
|
|
201
213
|
]);
|
|
202
214
|
}
|
|
203
215
|
console.log(table.toString());
|
|
204
|
-
console.log(
|
|
205
|
-
|
|
216
|
+
console.log(
|
|
217
|
+
chalk.green(`
|
|
218
|
+
\u2705 Found ${results.length} recent contexts`)
|
|
219
|
+
);
|
|
206
220
|
} catch (error) {
|
|
207
221
|
spinner.fail("Failed to get recent contexts");
|
|
208
222
|
logger.error("Recent error", error);
|
|
209
|
-
console.error(
|
|
223
|
+
console.error(
|
|
224
|
+
chalk.red(error instanceof Error ? error.message : "Unknown error")
|
|
225
|
+
);
|
|
210
226
|
}
|
|
211
227
|
});
|
|
212
228
|
chromadb.command("stats").description("Get ChromaDB storage statistics").action(async () => {
|
|
213
229
|
const spinner = ora("Fetching statistics...").start();
|
|
214
230
|
try {
|
|
215
231
|
const config = {
|
|
216
|
-
apiKey: process.env
|
|
217
|
-
tenant: process.env
|
|
218
|
-
database: process.env
|
|
232
|
+
apiKey: process.env["CHROMADB_API_KEY"] || "",
|
|
233
|
+
tenant: process.env["CHROMADB_TENANT"] || "",
|
|
234
|
+
database: process.env["CHROMADB_DATABASE"] || "stackmemory"
|
|
219
235
|
};
|
|
220
|
-
const userId = process.env
|
|
221
|
-
const teamId = process.env
|
|
236
|
+
const userId = process.env["USER"] || "default";
|
|
237
|
+
const teamId = process.env["CHROMADB_TEAM_ID"];
|
|
222
238
|
const adapter = new ChromaDBAdapter(config, userId, teamId);
|
|
223
239
|
await adapter.initialize();
|
|
224
240
|
const stats = await adapter.getStats();
|
|
@@ -236,19 +252,21 @@ function createChromaDBCommand() {
|
|
|
236
252
|
} catch (error) {
|
|
237
253
|
spinner.fail("Failed to get statistics");
|
|
238
254
|
logger.error("Stats error", error);
|
|
239
|
-
console.error(
|
|
255
|
+
console.error(
|
|
256
|
+
chalk.red(error instanceof Error ? error.message : "Unknown error")
|
|
257
|
+
);
|
|
240
258
|
}
|
|
241
259
|
});
|
|
242
260
|
chromadb.command("clean").description("Clean old contexts").option("--days <n>", "Delete contexts older than N days", "30").action(async (options) => {
|
|
243
261
|
const spinner = ora("Cleaning old contexts...").start();
|
|
244
262
|
try {
|
|
245
263
|
const config = {
|
|
246
|
-
apiKey: process.env
|
|
247
|
-
tenant: process.env
|
|
248
|
-
database: process.env
|
|
264
|
+
apiKey: process.env["CHROMADB_API_KEY"] || "",
|
|
265
|
+
tenant: process.env["CHROMADB_TENANT"] || "",
|
|
266
|
+
database: process.env["CHROMADB_DATABASE"] || "stackmemory"
|
|
249
267
|
};
|
|
250
|
-
const userId = process.env
|
|
251
|
-
const teamId = process.env
|
|
268
|
+
const userId = process.env["USER"] || "default";
|
|
269
|
+
const teamId = process.env["CHROMADB_TEAM_ID"];
|
|
252
270
|
const adapter = new ChromaDBAdapter(config, userId, teamId);
|
|
253
271
|
await adapter.initialize();
|
|
254
272
|
const deleted = await adapter.deleteOldContexts(parseInt(options.days));
|
|
@@ -256,7 +274,204 @@ function createChromaDBCommand() {
|
|
|
256
274
|
} catch (error) {
|
|
257
275
|
spinner.fail("Failed to clean contexts");
|
|
258
276
|
logger.error("Clean error", error);
|
|
259
|
-
console.error(
|
|
277
|
+
console.error(
|
|
278
|
+
chalk.red(error instanceof Error ? error.message : "Unknown error")
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
chromadb.command("ingest <name>").description("Ingest a repository into ChromaDB for code search").option("--path <path>", "Repository path (default: current directory)").option("--incremental", "Only process changed files").option("--include-tests", "Include test files").option("--include-docs", "Include documentation files").option("--force-update", "Force re-indexing of all files").option("--max-file-size <bytes>", "Maximum file size to process").option("--chunk-size <lines>", "Lines per chunk").action(async (name, options) => {
|
|
283
|
+
const spinner = ora("Ingesting repository...").start();
|
|
284
|
+
try {
|
|
285
|
+
const config = {
|
|
286
|
+
apiKey: process.env["CHROMADB_API_KEY"] || "",
|
|
287
|
+
tenant: process.env["CHROMADB_TENANT"] || "",
|
|
288
|
+
database: process.env["CHROMADB_DATABASE"] || "stackmemory",
|
|
289
|
+
collectionName: "stackmemory_repos"
|
|
290
|
+
};
|
|
291
|
+
if (!config.apiKey || !config.tenant) {
|
|
292
|
+
spinner.fail("ChromaDB not configured");
|
|
293
|
+
console.log(chalk.yellow("\nPlease run: stackmemory chromadb init"));
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
const userId = process.env["USER"] || "default";
|
|
297
|
+
const teamId = process.env["CHROMADB_TEAM_ID"];
|
|
298
|
+
const skill = new RepoIngestionSkill(config, userId, teamId);
|
|
299
|
+
await skill.initialize();
|
|
300
|
+
const repoPath = options.path || process.cwd();
|
|
301
|
+
const result = await skill.ingestRepository(repoPath, name, {
|
|
302
|
+
incremental: options.incremental,
|
|
303
|
+
forceUpdate: options.forceUpdate,
|
|
304
|
+
includeTests: options.includeTests,
|
|
305
|
+
includeDocs: options.includeDocs,
|
|
306
|
+
maxFileSize: options.maxFileSize ? parseInt(options.maxFileSize) : void 0,
|
|
307
|
+
chunkSize: options.chunkSize ? parseInt(options.chunkSize) : void 0
|
|
308
|
+
});
|
|
309
|
+
if (result.success) {
|
|
310
|
+
spinner.succeed(result.message);
|
|
311
|
+
if (result.stats) {
|
|
312
|
+
console.log(chalk.green("\n\u{1F4CA} Ingestion Statistics:"));
|
|
313
|
+
console.log(` Files processed: ${result.stats.filesProcessed}`);
|
|
314
|
+
console.log(` Chunks created: ${result.stats.chunksCreated}`);
|
|
315
|
+
console.log(
|
|
316
|
+
` Total size: ${(result.stats.totalSize / 1024 / 1024).toFixed(2)} MB`
|
|
317
|
+
);
|
|
318
|
+
console.log(
|
|
319
|
+
` Time elapsed: ${(result.stats.timeElapsed / 1e3).toFixed(2)} seconds`
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
} else {
|
|
323
|
+
spinner.fail(result.message);
|
|
324
|
+
}
|
|
325
|
+
} catch (error) {
|
|
326
|
+
spinner.fail("Failed to ingest repository");
|
|
327
|
+
logger.error("Ingestion error", error);
|
|
328
|
+
console.error(
|
|
329
|
+
chalk.red(error instanceof Error ? error.message : "Unknown error")
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
chromadb.command("update <name>").description("Update an existing repository in ChromaDB").option("--path <path>", "Repository path (default: current directory)").option("--force-update", "Force re-indexing of all files").action(async (name, options) => {
|
|
334
|
+
const spinner = ora("Updating repository...").start();
|
|
335
|
+
try {
|
|
336
|
+
const config = {
|
|
337
|
+
apiKey: process.env["CHROMADB_API_KEY"] || "",
|
|
338
|
+
tenant: process.env["CHROMADB_TENANT"] || "",
|
|
339
|
+
database: process.env["CHROMADB_DATABASE"] || "stackmemory",
|
|
340
|
+
collectionName: "stackmemory_repos"
|
|
341
|
+
};
|
|
342
|
+
if (!config.apiKey || !config.tenant) {
|
|
343
|
+
spinner.fail("ChromaDB not configured");
|
|
344
|
+
console.log(chalk.yellow("\nPlease run: stackmemory chromadb init"));
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
const userId = process.env["USER"] || "default";
|
|
348
|
+
const teamId = process.env["CHROMADB_TEAM_ID"];
|
|
349
|
+
const skill = new RepoIngestionSkill(config, userId, teamId);
|
|
350
|
+
await skill.initialize();
|
|
351
|
+
const repoPath = options.path || process.cwd();
|
|
352
|
+
const result = await skill.updateRepository(repoPath, name, {
|
|
353
|
+
forceUpdate: options.forceUpdate
|
|
354
|
+
});
|
|
355
|
+
if (result.success) {
|
|
356
|
+
spinner.succeed(result.message);
|
|
357
|
+
if (result.stats) {
|
|
358
|
+
console.log(chalk.green("\n\u{1F4CA} Update Statistics:"));
|
|
359
|
+
console.log(` Files updated: ${result.stats.filesUpdated}`);
|
|
360
|
+
console.log(` Files added: ${result.stats.filesAdded}`);
|
|
361
|
+
console.log(` Files removed: ${result.stats.filesRemoved}`);
|
|
362
|
+
console.log(
|
|
363
|
+
` Time elapsed: ${(result.stats.timeElapsed / 1e3).toFixed(2)} seconds`
|
|
364
|
+
);
|
|
365
|
+
}
|
|
366
|
+
} else {
|
|
367
|
+
spinner.fail(result.message);
|
|
368
|
+
}
|
|
369
|
+
} catch (error) {
|
|
370
|
+
spinner.fail("Failed to update repository");
|
|
371
|
+
logger.error("Update error", error);
|
|
372
|
+
console.error(
|
|
373
|
+
chalk.red(error instanceof Error ? error.message : "Unknown error")
|
|
374
|
+
);
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
chromadb.command("search-code <query>").description("Search code in ingested repositories").option("--repo <name>", "Filter by repository name").option("--language <lang>", "Filter by programming language").option("--limit <n>", "Maximum results", "20").action(async (query, options) => {
|
|
378
|
+
const spinner = ora("Searching code...").start();
|
|
379
|
+
try {
|
|
380
|
+
const config = {
|
|
381
|
+
apiKey: process.env["CHROMADB_API_KEY"] || "",
|
|
382
|
+
tenant: process.env["CHROMADB_TENANT"] || "",
|
|
383
|
+
database: process.env["CHROMADB_DATABASE"] || "stackmemory",
|
|
384
|
+
collectionName: "stackmemory_repos"
|
|
385
|
+
};
|
|
386
|
+
if (!config.apiKey || !config.tenant) {
|
|
387
|
+
spinner.fail("ChromaDB not configured");
|
|
388
|
+
console.log(chalk.yellow("\nPlease run: stackmemory chromadb init"));
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
const userId = process.env["USER"] || "default";
|
|
392
|
+
const teamId = process.env["CHROMADB_TEAM_ID"];
|
|
393
|
+
const skill = new RepoIngestionSkill(config, userId, teamId);
|
|
394
|
+
await skill.initialize();
|
|
395
|
+
const results = await skill.searchCode(query, {
|
|
396
|
+
repoName: options.repo,
|
|
397
|
+
language: options.language,
|
|
398
|
+
limit: parseInt(options.limit)
|
|
399
|
+
});
|
|
400
|
+
spinner.stop();
|
|
401
|
+
if (results.length === 0) {
|
|
402
|
+
console.log(chalk.yellow("No results found"));
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
console.log(chalk.cyan(`
|
|
406
|
+
\u{1F50D} Found ${results.length} code matches:
|
|
407
|
+
`));
|
|
408
|
+
for (const result of results) {
|
|
409
|
+
console.log(chalk.green(`\u{1F4C1} ${result.repoName}/${result.filePath}`));
|
|
410
|
+
console.log(
|
|
411
|
+
chalk.gray(
|
|
412
|
+
` Lines ${result.startLine}-${result.endLine} | Score: ${result.score.toFixed(3)}`
|
|
413
|
+
)
|
|
414
|
+
);
|
|
415
|
+
const lines = result.content.split("\n").slice(0, 3);
|
|
416
|
+
lines.forEach((line) => {
|
|
417
|
+
console.log(
|
|
418
|
+
chalk.dim(
|
|
419
|
+
` ${line.slice(0, 80)}${line.length > 80 ? "..." : ""}`
|
|
420
|
+
)
|
|
421
|
+
);
|
|
422
|
+
});
|
|
423
|
+
console.log();
|
|
424
|
+
}
|
|
425
|
+
} catch (error) {
|
|
426
|
+
spinner.fail("Failed to search code");
|
|
427
|
+
logger.error("Search error", error);
|
|
428
|
+
console.error(
|
|
429
|
+
chalk.red(error instanceof Error ? error.message : "Unknown error")
|
|
430
|
+
);
|
|
431
|
+
}
|
|
432
|
+
});
|
|
433
|
+
chromadb.command("repo-stats [name]").description("Get statistics for ingested repositories").action(async (name) => {
|
|
434
|
+
const spinner = ora("Fetching repository statistics...").start();
|
|
435
|
+
try {
|
|
436
|
+
const config = {
|
|
437
|
+
apiKey: process.env["CHROMADB_API_KEY"] || "",
|
|
438
|
+
tenant: process.env["CHROMADB_TENANT"] || "",
|
|
439
|
+
database: process.env["CHROMADB_DATABASE"] || "stackmemory",
|
|
440
|
+
collectionName: "stackmemory_repos"
|
|
441
|
+
};
|
|
442
|
+
if (!config.apiKey || !config.tenant) {
|
|
443
|
+
spinner.fail("ChromaDB not configured");
|
|
444
|
+
console.log(chalk.yellow("\nPlease run: stackmemory chromadb init"));
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
const userId = process.env["USER"] || "default";
|
|
448
|
+
const teamId = process.env["CHROMADB_TEAM_ID"];
|
|
449
|
+
const skill = new RepoIngestionSkill(config, userId, teamId);
|
|
450
|
+
await skill.initialize();
|
|
451
|
+
const stats = await skill.getRepoStats(name);
|
|
452
|
+
spinner.stop();
|
|
453
|
+
console.log(chalk.cyan("\n\u{1F4CA} Repository Statistics\n"));
|
|
454
|
+
console.log(`Total repositories: ${chalk.bold(stats.totalRepos)}`);
|
|
455
|
+
console.log(`Total files: ${chalk.bold(stats.totalFiles)}`);
|
|
456
|
+
console.log(`Total chunks: ${chalk.bold(stats.totalChunks)}`);
|
|
457
|
+
if (Object.keys(stats.languages).length > 0) {
|
|
458
|
+
console.log("\nLanguages:");
|
|
459
|
+
for (const [lang, count] of Object.entries(stats.languages)) {
|
|
460
|
+
console.log(` ${lang}: ${count}`);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
if (Object.keys(stats.frameworks).length > 0) {
|
|
464
|
+
console.log("\nFrameworks:");
|
|
465
|
+
for (const [framework, count] of Object.entries(stats.frameworks)) {
|
|
466
|
+
console.log(` ${framework}: ${count}`);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
} catch (error) {
|
|
470
|
+
spinner.fail("Failed to get repository statistics");
|
|
471
|
+
logger.error("Stats error", error);
|
|
472
|
+
console.error(
|
|
473
|
+
chalk.red(error instanceof Error ? error.message : "Unknown error")
|
|
474
|
+
);
|
|
260
475
|
}
|
|
261
476
|
});
|
|
262
477
|
return chromadb;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/commands/chromadb.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * ChromaDB CLI Commands for StackMemory\n * \n * Provides commands to interact with ChromaDB vector storage\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { ChromaDBAdapter } from '../../core/storage/chromadb-adapter.js';\nimport { FrameManager } from '../../core/context/frame-manager.js';\nimport { Logger } from '../../core/monitoring/logger.js';\nimport Table from 'cli-table3';\nimport dotenv from 'dotenv';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport fs from 'fs';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// Load environment variables\ndotenv.config({ \n path: path.join(__dirname, '../../../.env'),\n override: true,\n silent: true\n});\n\nconst logger = new Logger('ChromaDB-CLI');\n\nexport function createChromaDBCommand(): Command {\n const chromadb = new Command('chromadb')\n .description('Manage ChromaDB vector storage for context')\n .alias('chroma');\n\n // Initialize ChromaDB\n chromadb\n .command('init')\n .description('Initialize ChromaDB connection')\n .option('--api-key <key>', 'ChromaDB API key')\n .option('--tenant <tenant>', 'ChromaDB tenant ID')\n .option('--database <database>', 'ChromaDB database name')\n .option('--user-id <id>', 'User ID for segmentation')\n .option('--team-id <id>', 'Team ID for segmentation')\n .action(async (options) => {\n const spinner = ora('Initializing ChromaDB...').start();\n\n try {\n // Get config from options or environment\n const config = {\n apiKey: options.apiKey || process.env.CHROMADB_API_KEY || '',\n tenant: options.tenant || process.env.CHROMADB_TENANT || '',\n database: options.database || process.env.CHROMADB_DATABASE || 'stackmemory',\n };\n\n const userId = options.userId || process.env.USER || 'default';\n const teamId = options.teamId || process.env.CHROMADB_TEAM_ID;\n\n if (!config.apiKey || !config.tenant) {\n spinner.fail('Missing ChromaDB credentials');\n console.log(chalk.yellow('\\nPlease provide:'));\n console.log(' --api-key <key> ChromaDB API key');\n console.log(' --tenant <tenant> ChromaDB tenant ID');\n console.log('\\nOr set environment variables:');\n console.log(' CHROMADB_API_KEY');\n console.log(' CHROMADB_TENANT');\n return;\n }\n\n // Initialize adapter\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n // Save config to .env if not present\n const envPath = path.join(__dirname, '../../../.env');\n let envContent = '';\n \n if (fs.existsSync(envPath)) {\n envContent = fs.readFileSync(envPath, 'utf8');\n }\n\n const updates: string[] = [];\n if (!envContent.includes('CHROMADB_API_KEY')) {\n updates.push(`CHROMADB_API_KEY=${config.apiKey}`);\n }\n if (!envContent.includes('CHROMADB_TENANT')) {\n updates.push(`CHROMADB_TENANT=${config.tenant}`);\n }\n if (!envContent.includes('CHROMADB_DATABASE')) {\n updates.push(`CHROMADB_DATABASE=${config.database}`);\n }\n\n if (updates.length > 0) {\n fs.appendFileSync(envPath, '\\n# ChromaDB Configuration\\n' + updates.join('\\n') + '\\n');\n }\n\n spinner.succeed('ChromaDB initialized successfully');\n \n console.log(chalk.green('\\n\u2705 Configuration:'));\n console.log(` Tenant: ${config.tenant}`);\n console.log(` Database: ${config.database}`);\n console.log(` User ID: ${userId}`);\n if (teamId) {\n console.log(` Team ID: ${teamId}`);\n }\n } catch (error) {\n spinner.fail('Failed to initialize ChromaDB');\n logger.error('Initialization error', error);\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n });\n\n // Store current context\n chromadb\n .command('store')\n .description('Store current context in ChromaDB')\n .option('--type <type>', 'Context type (frame/decision/observation)', 'frame')\n .option('--content <content>', 'Content to store')\n .option('--project <name>', 'Project name')\n .action(async (options) => {\n const spinner = ora('Storing context...').start();\n\n try {\n const config = {\n apiKey: process.env.CHROMADB_API_KEY || '',\n tenant: process.env.CHROMADB_TENANT || '',\n database: process.env.CHROMADB_DATABASE || 'stackmemory',\n };\n\n const userId = process.env.USER || 'default';\n const teamId = process.env.CHROMADB_TEAM_ID;\n\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n if (options.type === 'frame') {\n // Store current frames\n const frameManager = new FrameManager();\n const frames = frameManager.getAllFrames();\n \n for (const frame of frames) {\n await adapter.storeFrame(frame);\n }\n \n spinner.succeed(`Stored ${frames.length} frames`);\n } else {\n // Store decision or observation\n const content = options.content || `${options.type} at ${new Date().toISOString()}`;\n const metadata: any = {\n project_name: options.project || path.basename(process.cwd()),\n };\n \n // Only add session_id if it exists\n if (process.env.STACKMEMORY_SESSION_ID) {\n metadata.session_id = process.env.STACKMEMORY_SESSION_ID;\n }\n \n await adapter.storeContext(\n options.type as 'decision' | 'observation',\n content,\n metadata\n );\n \n spinner.succeed(`Stored ${options.type}`);\n }\n } catch (error) {\n spinner.fail('Failed to store context');\n logger.error('Store error', error);\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n });\n\n // Query contexts\n chromadb\n .command('query <search>')\n .description('Query contexts from ChromaDB')\n .option('--limit <n>', 'Number of results', '10')\n .option('--type <type>', 'Filter by type')\n .option('--project <name>', 'Filter by project')\n .action(async (search, options) => {\n const spinner = ora('Searching...').start();\n\n try {\n const config = {\n apiKey: process.env.CHROMADB_API_KEY || '',\n tenant: process.env.CHROMADB_TENANT || '',\n database: process.env.CHROMADB_DATABASE || 'stackmemory',\n };\n\n const userId = process.env.USER || 'default';\n const teamId = process.env.CHROMADB_TEAM_ID;\n\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n const filters: any = {};\n if (options.type) {\n filters.type = [options.type];\n }\n if (options.project) {\n filters.projectName = options.project;\n }\n\n const results = await adapter.queryContexts(\n search,\n parseInt(options.limit),\n filters\n );\n\n spinner.stop();\n\n if (results.length === 0) {\n console.log(chalk.yellow('No results found'));\n return;\n }\n\n // Display results\n const table = new Table({\n head: ['Type', 'Project', 'Content', 'Distance'],\n colWidths: [15, 20, 50, 10],\n wordWrap: true,\n });\n\n for (const result of results) {\n const content = result.content.substring(0, 100) + \n (result.content.length > 100 ? '...' : '');\n \n table.push([\n result.metadata.type || 'unknown',\n result.metadata.project_name || 'default',\n content,\n result.distance.toFixed(3),\n ]);\n }\n\n console.log(table.toString());\n console.log(chalk.green(`\\n\u2705 Found ${results.length} results`));\n } catch (error) {\n spinner.fail('Failed to query contexts');\n logger.error('Query error', error);\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n });\n\n // Get recent contexts\n chromadb\n .command('recent')\n .description('Get recent contexts')\n .option('--limit <n>', 'Number of results', '20')\n .option('--type <type>', 'Filter by type')\n .action(async (options) => {\n const spinner = ora('Fetching recent contexts...').start();\n\n try {\n const config = {\n apiKey: process.env.CHROMADB_API_KEY || '',\n tenant: process.env.CHROMADB_TENANT || '',\n database: process.env.CHROMADB_DATABASE || 'stackmemory',\n };\n\n const userId = process.env.USER || 'default';\n const teamId = process.env.CHROMADB_TEAM_ID;\n\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n const results = await adapter.getRecentContexts(\n parseInt(options.limit),\n options.type\n );\n\n spinner.stop();\n\n if (results.length === 0) {\n console.log(chalk.yellow('No recent contexts found'));\n return;\n }\n\n // Display results\n const table = new Table({\n head: ['Time', 'Type', 'Project', 'Content'],\n colWidths: [20, 12, 20, 48],\n wordWrap: true,\n });\n\n for (const result of results) {\n const time = new Date(result.metadata.timestamp).toLocaleString();\n const content = result.content.substring(0, 100) + \n (result.content.length > 100 ? '...' : '');\n \n table.push([\n time,\n result.metadata.type || 'unknown',\n result.metadata.project_name || 'default',\n content,\n ]);\n }\n\n console.log(table.toString());\n console.log(chalk.green(`\\n\u2705 Found ${results.length} recent contexts`));\n } catch (error) {\n spinner.fail('Failed to get recent contexts');\n logger.error('Recent error', error);\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n });\n\n // Get statistics\n chromadb\n .command('stats')\n .description('Get ChromaDB storage statistics')\n .action(async () => {\n const spinner = ora('Fetching statistics...').start();\n\n try {\n const config = {\n apiKey: process.env.CHROMADB_API_KEY || '',\n tenant: process.env.CHROMADB_TENANT || '',\n database: process.env.CHROMADB_DATABASE || 'stackmemory',\n };\n\n const userId = process.env.USER || 'default';\n const teamId = process.env.CHROMADB_TEAM_ID;\n\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n const stats = await adapter.getStats();\n\n spinner.stop();\n\n console.log(chalk.cyan('\\n\uD83D\uDCCA ChromaDB Statistics\\n'));\n console.log(`Total Documents: ${chalk.bold(stats.totalDocuments)}`);\n console.log(`User Documents: ${chalk.bold(stats.userDocuments)}`);\n \n if (stats.teamDocuments !== undefined) {\n console.log(`Team Documents: ${chalk.bold(stats.teamDocuments)}`);\n }\n\n console.log('\\nDocuments by Type:');\n for (const [type, count] of Object.entries(stats.documentsByType)) {\n console.log(` ${type}: ${count}`);\n }\n } catch (error) {\n spinner.fail('Failed to get statistics');\n logger.error('Stats error', error);\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n });\n\n // Clean old contexts\n chromadb\n .command('clean')\n .description('Clean old contexts')\n .option('--days <n>', 'Delete contexts older than N days', '30')\n .action(async (options) => {\n const spinner = ora('Cleaning old contexts...').start();\n\n try {\n const config = {\n apiKey: process.env.CHROMADB_API_KEY || '',\n tenant: process.env.CHROMADB_TENANT || '',\n database: process.env.CHROMADB_DATABASE || 'stackmemory',\n };\n\n const userId = process.env.USER || 'default';\n const teamId = process.env.CHROMADB_TEAM_ID;\n\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n const deleted = await adapter.deleteOldContexts(parseInt(options.days));\n\n spinner.succeed(`Deleted ${deleted} old contexts`);\n } catch (error) {\n spinner.fail('Failed to clean contexts');\n logger.error('Clean error', error);\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n });\n\n return chromadb;\n}"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * ChromaDB CLI Commands for StackMemory\n *\n * Provides commands to interact with ChromaDB vector storage\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { ChromaDBAdapter } from '../../core/storage/chromadb-adapter.js';\nimport { FrameManager } from '../../core/context/frame-manager.js';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { RepoIngestionSkill } from '../../skills/repo-ingestion-skill.js';\nimport Table from 'cli-table3';\nimport dotenv from 'dotenv';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport fs from 'fs';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// Load environment variables\ndotenv.config({\n path: path.join(__dirname, '../../../.env'),\n override: true,\n});\n\n\n\nexport function createChromaDBCommand(): Command {\n const chromadb = new Command('chromadb')\n .description('Manage ChromaDB vector storage for context')\n .alias('chroma');\n\n // Initialize ChromaDB\n chromadb\n .command('init')\n .description('Initialize ChromaDB connection')\n .option('--api-key <key>', 'ChromaDB API key')\n .option('--tenant <tenant>', 'ChromaDB tenant ID')\n .option('--database <database>', 'ChromaDB database name')\n .option('--user-id <id>', 'User ID for segmentation')\n .option('--team-id <id>', 'Team ID for segmentation')\n .action(async (options) => {\n const spinner = ora('Initializing ChromaDB...').start();\n\n try {\n // Get config from options or environment\n const config = {\n apiKey: options.apiKey || process.env['CHROMADB_API_KEY'] || '',\n tenant: options.tenant || process.env['CHROMADB_TENANT'] || '',\n database:\n options.database ||\n process.env['CHROMADB_DATABASE'] ||\n 'stackmemory',\n };\n\n const userId = options.userId || process.env['USER'] || 'default';\n const teamId = options.teamId || process.env['CHROMADB_TEAM_ID'];\n\n if (!config.apiKey || !config.tenant) {\n spinner.fail('Missing ChromaDB credentials');\n console.log(chalk.yellow('\\nPlease provide:'));\n console.log(' --api-key <key> ChromaDB API key');\n console.log(' --tenant <tenant> ChromaDB tenant ID');\n console.log('\\nOr set environment variables:');\n console.log(' CHROMADB_API_KEY');\n console.log(' CHROMADB_TENANT');\n return;\n }\n\n // Initialize adapter\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n // Save config to .env if not present\n const envPath = path.join(__dirname, '../../../.env');\n let envContent = '';\n\n if (fs.existsSync(envPath)) {\n envContent = fs.readFileSync(envPath, 'utf8');\n }\n\n const updates: string[] = [];\n if (!envContent.includes('CHROMADB_API_KEY')) {\n updates.push(`CHROMADB_API_KEY=${config.apiKey}`);\n }\n if (!envContent.includes('CHROMADB_TENANT')) {\n updates.push(`CHROMADB_TENANT=${config.tenant}`);\n }\n if (!envContent.includes('CHROMADB_DATABASE')) {\n updates.push(`CHROMADB_DATABASE=${config.database}`);\n }\n\n if (updates.length > 0) {\n fs.appendFileSync(\n envPath,\n '\\n# ChromaDB Configuration\\n' + updates.join('\\n') + '\\n'\n );\n }\n\n spinner.succeed('ChromaDB initialized successfully');\n\n console.log(chalk.green('\\n\u2705 Configuration:'));\n console.log(` Tenant: ${config.tenant}`);\n console.log(` Database: ${config.database}`);\n console.log(` User ID: ${userId}`);\n if (teamId) {\n console.log(` Team ID: ${teamId}`);\n }\n } catch (error: unknown) {\n spinner.fail('Failed to initialize ChromaDB');\n logger.error('Initialization error', error);\n console.error(\n chalk.red(error instanceof Error ? error.message : 'Unknown error')\n );\n }\n });\n\n // Store current context\n chromadb\n .command('store')\n .description('Store current context in ChromaDB')\n .option(\n '--type <type>',\n 'Context type (frame/decision/observation)',\n 'frame'\n )\n .option('--content <content>', 'Content to store')\n .option('--project <name>', 'Project name')\n .action(async (options) => {\n const spinner = ora('Storing context...').start();\n\n try {\n const config = {\n apiKey: process.env['CHROMADB_API_KEY'] || '',\n tenant: process.env['CHROMADB_TENANT'] || '',\n database: process.env['CHROMADB_DATABASE'] || 'stackmemory',\n };\n\n const userId = process.env['USER'] || 'default';\n const teamId = process.env['CHROMADB_TEAM_ID'];\n\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n if (options.type === 'frame') {\n // Store current frames\n const frameManager = new FrameManager();\n const frames = frameManager.getAllFrames();\n\n for (const frame of frames) {\n await adapter.storeFrame(frame);\n }\n\n spinner.succeed(`Stored ${frames.length} frames`);\n } else {\n // Store decision or observation\n const content =\n options.content || `${options.type} at ${new Date().toISOString()}`;\n const metadata: any = {\n project_name: options.project || path.basename(process.cwd()),\n };\n\n // Only add session_id if it exists\n if (process.env['STACKMEMORY_SESSION_ID']) {\n metadata.session_id = process.env['STACKMEMORY_SESSION_ID'];\n }\n\n await adapter.storeContext(\n options.type as 'decision' | 'observation',\n content,\n metadata\n );\n\n spinner.succeed(`Stored ${options.type}`);\n }\n } catch (error: unknown) {\n spinner.fail('Failed to store context');\n logger.error('Store error', error);\n console.error(\n chalk.red(error instanceof Error ? error.message : 'Unknown error')\n );\n }\n });\n\n // Query contexts\n chromadb\n .command('query <search>')\n .description('Query contexts from ChromaDB')\n .option('--limit <n>', 'Number of results', '10')\n .option('--type <type>', 'Filter by type')\n .option('--project <name>', 'Filter by project')\n .action(async (search, options) => {\n const spinner = ora('Searching...').start();\n\n try {\n const config = {\n apiKey: process.env['CHROMADB_API_KEY'] || '',\n tenant: process.env['CHROMADB_TENANT'] || '',\n database: process.env['CHROMADB_DATABASE'] || 'stackmemory',\n };\n\n const userId = process.env['USER'] || 'default';\n const teamId = process.env['CHROMADB_TEAM_ID'];\n\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n const filters: any = {};\n if (options.type) {\n filters.type = [options.type];\n }\n if (options.project) {\n filters.projectName = options.project;\n }\n\n const results = await adapter.queryContexts(\n search,\n parseInt(options.limit),\n filters\n );\n\n spinner.stop();\n\n if (results.length === 0) {\n console.log(chalk.yellow('No results found'));\n return;\n }\n\n // Display results\n const table = new Table({\n head: ['Type', 'Project', 'Content', 'Distance'],\n colWidths: [15, 20, 50, 10],\n wordWrap: true,\n });\n\n for (const result of results) {\n const content =\n result.content.substring(0, 100) +\n (result.content.length > 100 ? '...' : '');\n\n table.push([\n result.metadata.type || 'unknown',\n result.metadata.project_name || 'default',\n content,\n result.distance.toFixed(3),\n ]);\n }\n\n console.log(table.toString());\n console.log(chalk.green(`\\n\u2705 Found ${results.length} results`));\n } catch (error: unknown) {\n spinner.fail('Failed to query contexts');\n logger.error('Query error', error);\n console.error(\n chalk.red(error instanceof Error ? error.message : 'Unknown error')\n );\n }\n });\n\n // Get recent contexts\n chromadb\n .command('recent')\n .description('Get recent contexts')\n .option('--limit <n>', 'Number of results', '20')\n .option('--type <type>', 'Filter by type')\n .action(async (options) => {\n const spinner = ora('Fetching recent contexts...').start();\n\n try {\n const config = {\n apiKey: process.env['CHROMADB_API_KEY'] || '',\n tenant: process.env['CHROMADB_TENANT'] || '',\n database: process.env['CHROMADB_DATABASE'] || 'stackmemory',\n };\n\n const userId = process.env['USER'] || 'default';\n const teamId = process.env['CHROMADB_TEAM_ID'];\n\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n const results = await adapter.getRecentContexts(\n parseInt(options.limit),\n options.type\n );\n\n spinner.stop();\n\n if (results.length === 0) {\n console.log(chalk.yellow('No recent contexts found'));\n return;\n }\n\n // Display results\n const table = new Table({\n head: ['Time', 'Type', 'Project', 'Content'],\n colWidths: [20, 12, 20, 48],\n wordWrap: true,\n });\n\n for (const result of results) {\n const time = new Date(result.metadata.timestamp).toLocaleString();\n const content =\n result.content.substring(0, 100) +\n (result.content.length > 100 ? '...' : '');\n\n table.push([\n time,\n result.metadata.type || 'unknown',\n result.metadata.project_name || 'default',\n content,\n ]);\n }\n\n console.log(table.toString());\n console.log(\n chalk.green(`\\n\u2705 Found ${results.length} recent contexts`)\n );\n } catch (error: unknown) {\n spinner.fail('Failed to get recent contexts');\n logger.error('Recent error', error);\n console.error(\n chalk.red(error instanceof Error ? error.message : 'Unknown error')\n );\n }\n });\n\n // Get statistics\n chromadb\n .command('stats')\n .description('Get ChromaDB storage statistics')\n .action(async () => {\n const spinner = ora('Fetching statistics...').start();\n\n try {\n const config = {\n apiKey: process.env['CHROMADB_API_KEY'] || '',\n tenant: process.env['CHROMADB_TENANT'] || '',\n database: process.env['CHROMADB_DATABASE'] || 'stackmemory',\n };\n\n const userId = process.env['USER'] || 'default';\n const teamId = process.env['CHROMADB_TEAM_ID'];\n\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n const stats = await adapter.getStats();\n\n spinner.stop();\n\n console.log(chalk.cyan('\\n\uD83D\uDCCA ChromaDB Statistics\\n'));\n console.log(`Total Documents: ${chalk.bold(stats.totalDocuments)}`);\n console.log(`User Documents: ${chalk.bold(stats.userDocuments)}`);\n\n if (stats.teamDocuments !== undefined) {\n console.log(`Team Documents: ${chalk.bold(stats.teamDocuments)}`);\n }\n\n console.log('\\nDocuments by Type:');\n for (const [type, count] of Object.entries(stats.documentsByType)) {\n console.log(` ${type}: ${count}`);\n }\n } catch (error: unknown) {\n spinner.fail('Failed to get statistics');\n logger.error('Stats error', error);\n console.error(\n chalk.red(error instanceof Error ? error.message : 'Unknown error')\n );\n }\n });\n\n // Clean old contexts\n chromadb\n .command('clean')\n .description('Clean old contexts')\n .option('--days <n>', 'Delete contexts older than N days', '30')\n .action(async (options) => {\n const spinner = ora('Cleaning old contexts...').start();\n\n try {\n const config = {\n apiKey: process.env['CHROMADB_API_KEY'] || '',\n tenant: process.env['CHROMADB_TENANT'] || '',\n database: process.env['CHROMADB_DATABASE'] || 'stackmemory',\n };\n\n const userId = process.env['USER'] || 'default';\n const teamId = process.env['CHROMADB_TEAM_ID'];\n\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initialize();\n\n const deleted = await adapter.deleteOldContexts(parseInt(options.days));\n\n spinner.succeed(`Deleted ${deleted} old contexts`);\n } catch (error: unknown) {\n spinner.fail('Failed to clean contexts');\n logger.error('Clean error', error);\n console.error(\n chalk.red(error instanceof Error ? error.message : 'Unknown error')\n );\n }\n });\n\n // Ingest repository\n chromadb\n .command('ingest <name>')\n .description('Ingest a repository into ChromaDB for code search')\n .option('--path <path>', 'Repository path (default: current directory)')\n .option('--incremental', 'Only process changed files')\n .option('--include-tests', 'Include test files')\n .option('--include-docs', 'Include documentation files')\n .option('--force-update', 'Force re-indexing of all files')\n .option('--max-file-size <bytes>', 'Maximum file size to process')\n .option('--chunk-size <lines>', 'Lines per chunk')\n .action(async (name, options) => {\n const spinner = ora('Ingesting repository...').start();\n\n try {\n const config = {\n apiKey: process.env['CHROMADB_API_KEY'] || '',\n tenant: process.env['CHROMADB_TENANT'] || '',\n database: process.env['CHROMADB_DATABASE'] || 'stackmemory',\n collectionName: 'stackmemory_repos',\n };\n\n if (!config.apiKey || !config.tenant) {\n spinner.fail('ChromaDB not configured');\n console.log(chalk.yellow('\\nPlease run: stackmemory chromadb init'));\n return;\n }\n\n const userId = process.env['USER'] || 'default';\n const teamId = process.env['CHROMADB_TEAM_ID'];\n\n const skill = new RepoIngestionSkill(config, userId, teamId);\n await skill.initialize();\n\n const repoPath = options.path || process.cwd();\n const result = await skill.ingestRepository(repoPath, name, {\n incremental: options.incremental,\n forceUpdate: options.forceUpdate,\n includeTests: options.includeTests,\n includeDocs: options.includeDocs,\n maxFileSize: options.maxFileSize\n ? parseInt(options.maxFileSize)\n : undefined,\n chunkSize: options.chunkSize\n ? parseInt(options.chunkSize)\n : undefined,\n });\n\n if (result.success) {\n spinner.succeed(result.message);\n if (result.stats) {\n console.log(chalk.green('\\n\uD83D\uDCCA Ingestion Statistics:'));\n console.log(` Files processed: ${result.stats.filesProcessed}`);\n console.log(` Chunks created: ${result.stats.chunksCreated}`);\n console.log(\n ` Total size: ${(result.stats.totalSize / 1024 / 1024).toFixed(2)} MB`\n );\n console.log(\n ` Time elapsed: ${(result.stats.timeElapsed / 1000).toFixed(2)} seconds`\n );\n }\n } else {\n spinner.fail(result.message);\n }\n } catch (error: unknown) {\n spinner.fail('Failed to ingest repository');\n logger.error('Ingestion error', error);\n console.error(\n chalk.red(error instanceof Error ? error.message : 'Unknown error')\n );\n }\n });\n\n // Update repository\n chromadb\n .command('update <name>')\n .description('Update an existing repository in ChromaDB')\n .option('--path <path>', 'Repository path (default: current directory)')\n .option('--force-update', 'Force re-indexing of all files')\n .action(async (name, options) => {\n const spinner = ora('Updating repository...').start();\n\n try {\n const config = {\n apiKey: process.env['CHROMADB_API_KEY'] || '',\n tenant: process.env['CHROMADB_TENANT'] || '',\n database: process.env['CHROMADB_DATABASE'] || 'stackmemory',\n collectionName: 'stackmemory_repos',\n };\n\n if (!config.apiKey || !config.tenant) {\n spinner.fail('ChromaDB not configured');\n console.log(chalk.yellow('\\nPlease run: stackmemory chromadb init'));\n return;\n }\n\n const userId = process.env['USER'] || 'default';\n const teamId = process.env['CHROMADB_TEAM_ID'];\n\n const skill = new RepoIngestionSkill(config, userId, teamId);\n await skill.initialize();\n\n const repoPath = options.path || process.cwd();\n const result = await skill.updateRepository(repoPath, name, {\n forceUpdate: options.forceUpdate,\n });\n\n if (result.success) {\n spinner.succeed(result.message);\n if (result.stats) {\n console.log(chalk.green('\\n\uD83D\uDCCA Update Statistics:'));\n console.log(` Files updated: ${result.stats.filesUpdated}`);\n console.log(` Files added: ${result.stats.filesAdded}`);\n console.log(` Files removed: ${result.stats.filesRemoved}`);\n console.log(\n ` Time elapsed: ${(result.stats.timeElapsed / 1000).toFixed(2)} seconds`\n );\n }\n } else {\n spinner.fail(result.message);\n }\n } catch (error: unknown) {\n spinner.fail('Failed to update repository');\n logger.error('Update error', error);\n console.error(\n chalk.red(error instanceof Error ? error.message : 'Unknown error')\n );\n }\n });\n\n // Search code\n chromadb\n .command('search-code <query>')\n .description('Search code in ingested repositories')\n .option('--repo <name>', 'Filter by repository name')\n .option('--language <lang>', 'Filter by programming language')\n .option('--limit <n>', 'Maximum results', '20')\n .action(async (query, options) => {\n const spinner = ora('Searching code...').start();\n\n try {\n const config = {\n apiKey: process.env['CHROMADB_API_KEY'] || '',\n tenant: process.env['CHROMADB_TENANT'] || '',\n database: process.env['CHROMADB_DATABASE'] || 'stackmemory',\n collectionName: 'stackmemory_repos',\n };\n\n if (!config.apiKey || !config.tenant) {\n spinner.fail('ChromaDB not configured');\n console.log(chalk.yellow('\\nPlease run: stackmemory chromadb init'));\n return;\n }\n\n const userId = process.env['USER'] || 'default';\n const teamId = process.env['CHROMADB_TEAM_ID'];\n\n const skill = new RepoIngestionSkill(config, userId, teamId);\n await skill.initialize();\n\n const results = await skill.searchCode(query, {\n repoName: options.repo,\n language: options.language,\n limit: parseInt(options.limit),\n });\n\n spinner.stop();\n\n if (results.length === 0) {\n console.log(chalk.yellow('No results found'));\n return;\n }\n\n console.log(chalk.cyan(`\\n\uD83D\uDD0D Found ${results.length} code matches:\\n`));\n\n for (const result of results) {\n console.log(chalk.green(`\uD83D\uDCC1 ${result.repoName}/${result.filePath}`));\n console.log(\n chalk.gray(\n ` Lines ${result.startLine}-${result.endLine} | Score: ${result.score.toFixed(3)}`\n )\n );\n\n // Show snippet\n const lines = result.content.split('\\n').slice(0, 3);\n lines.forEach((line) => {\n console.log(\n chalk.dim(\n ` ${line.slice(0, 80)}${line.length > 80 ? '...' : ''}`\n )\n );\n });\n console.log();\n }\n } catch (error: unknown) {\n spinner.fail('Failed to search code');\n logger.error('Search error', error);\n console.error(\n chalk.red(error instanceof Error ? error.message : 'Unknown error')\n );\n }\n });\n\n // Repository stats\n chromadb\n .command('repo-stats [name]')\n .description('Get statistics for ingested repositories')\n .action(async (name) => {\n const spinner = ora('Fetching repository statistics...').start();\n\n try {\n const config = {\n apiKey: process.env['CHROMADB_API_KEY'] || '',\n tenant: process.env['CHROMADB_TENANT'] || '',\n database: process.env['CHROMADB_DATABASE'] || 'stackmemory',\n collectionName: 'stackmemory_repos',\n };\n\n if (!config.apiKey || !config.tenant) {\n spinner.fail('ChromaDB not configured');\n console.log(chalk.yellow('\\nPlease run: stackmemory chromadb init'));\n return;\n }\n\n const userId = process.env['USER'] || 'default';\n const teamId = process.env['CHROMADB_TEAM_ID'];\n\n const skill = new RepoIngestionSkill(config, userId, teamId);\n await skill.initialize();\n\n const stats = await skill.getRepoStats(name);\n\n spinner.stop();\n\n console.log(chalk.cyan('\\n\uD83D\uDCCA Repository Statistics\\n'));\n console.log(`Total repositories: ${chalk.bold(stats.totalRepos)}`);\n console.log(`Total files: ${chalk.bold(stats.totalFiles)}`);\n console.log(`Total chunks: ${chalk.bold(stats.totalChunks)}`);\n\n if (Object.keys(stats.languages).length > 0) {\n console.log('\\nLanguages:');\n for (const [lang, count] of Object.entries(stats.languages)) {\n console.log(` ${lang}: ${count}`);\n }\n }\n\n if (Object.keys(stats.frameworks).length > 0) {\n console.log('\\nFrameworks:');\n for (const [framework, count] of Object.entries(stats.frameworks)) {\n console.log(` ${framework}: ${count}`);\n }\n }\n } catch (error: unknown) {\n spinner.fail('Failed to get repository statistics');\n logger.error('Stats error', error);\n console.error(\n chalk.red(error instanceof Error ? error.message : 'Unknown error')\n );\n }\n });\n\n return chromadb;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -6,7 +6,7 @@ import * as fs from "fs/promises";
|
|
|
6
6
|
import * as path from "path";
|
|
7
7
|
import Database from "better-sqlite3";
|
|
8
8
|
import { existsSync } from "fs";
|
|
9
|
-
import { ClearSurvival } from "../../core/session/clear-survival
|
|
9
|
+
import { ClearSurvival } from "../../core/session/clear-survival.js";
|
|
10
10
|
import { FrameManager } from "../../core/context/frame-manager.js";
|
|
11
11
|
import { sessionManager } from "../../core/session/session-manager.js";
|
|
12
12
|
const clearCommand = new Command("clear").description("Manage context clearing with ledger preservation").option("--save", "Save continuity ledger before clearing").option("--restore", "Restore from continuity ledger").option("--check", "Check if clear is recommended").option("--auto", "Automatically save if needed and clear").option("--status", "Show current context usage").option("--show-ledger", "Display current ledger").action(async (options) => {
|
|
@@ -31,8 +31,13 @@ const clearCommand = new Command("clear").description("Manage context clearing w
|
|
|
31
31
|
generateHandoff: () => Promise.resolve("Mock handoff"),
|
|
32
32
|
getHandoffPath: () => "mock.md"
|
|
33
33
|
};
|
|
34
|
+
const dbManager = {
|
|
35
|
+
getCurrentSessionId: () => Promise.resolve(session.id),
|
|
36
|
+
getSession: () => Promise.resolve(session)
|
|
37
|
+
};
|
|
34
38
|
const clearSurvival = new ClearSurvival(
|
|
35
39
|
frameManager,
|
|
40
|
+
dbManager,
|
|
36
41
|
handoffGenerator,
|
|
37
42
|
projectRoot
|
|
38
43
|
);
|
|
@@ -59,7 +64,7 @@ const clearCommand = new Command("clear").description("Manage context clearing w
|
|
|
59
64
|
}
|
|
60
65
|
} catch (error) {
|
|
61
66
|
console.error(chalk.red("Error: " + error.message));
|
|
62
|
-
if (process.env
|
|
67
|
+
if (process.env["NODE_ENV"] !== "test") {
|
|
63
68
|
process.exit(1);
|
|
64
69
|
}
|
|
65
70
|
}
|
|
@@ -105,7 +110,9 @@ async function saveLedger(clearSurvival, spinner) {
|
|
|
105
110
|
console.log("\nSaved:");
|
|
106
111
|
console.log(` \u2022 ${ledger.activeFrames.length} active frames`);
|
|
107
112
|
console.log(` \u2022 ${ledger.decisions.length} key decisions`);
|
|
108
|
-
console.log(
|
|
113
|
+
console.log(
|
|
114
|
+
` \u2022 ${ledger.context.importantTasks?.length || 0} important tasks`
|
|
115
|
+
);
|
|
109
116
|
}
|
|
110
117
|
async function restoreFromLedger(clearSurvival, spinner) {
|
|
111
118
|
spinner.start("Restoring from continuity ledger...");
|