@stackmemoryai/stackmemory 0.5.22 → 0.5.24

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.
Files changed (77) hide show
  1. package/dist/cli/claude-sm.js +2 -0
  2. package/dist/cli/claude-sm.js.map +2 -2
  3. package/dist/cli/commands/discovery.js +279 -0
  4. package/dist/cli/commands/discovery.js.map +7 -0
  5. package/dist/cli/commands/retrieval.js +248 -0
  6. package/dist/cli/commands/retrieval.js.map +7 -0
  7. package/dist/cli/index.js +4 -0
  8. package/dist/cli/index.js.map +2 -2
  9. package/dist/core/retrieval/llm-context-retrieval.js +33 -1
  10. package/dist/core/retrieval/llm-context-retrieval.js.map +2 -2
  11. package/dist/core/retrieval/llm-provider.js +128 -0
  12. package/dist/core/retrieval/llm-provider.js.map +7 -0
  13. package/dist/core/retrieval/retrieval-audit.js +236 -0
  14. package/dist/core/retrieval/retrieval-audit.js.map +7 -0
  15. package/dist/integrations/linear/client.js +125 -0
  16. package/dist/integrations/linear/client.js.map +2 -2
  17. package/dist/integrations/mcp/handlers/discovery-handlers.js +497 -0
  18. package/dist/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
  19. package/dist/integrations/mcp/handlers/index.js +40 -12
  20. package/dist/integrations/mcp/handlers/index.js.map +2 -2
  21. package/dist/integrations/mcp/server.js +270 -0
  22. package/dist/integrations/mcp/server.js.map +2 -2
  23. package/dist/integrations/mcp/tool-definitions.js +141 -5
  24. package/dist/integrations/mcp/tool-definitions.js.map +2 -2
  25. package/package.json +1 -1
  26. package/dist/cli/commands/agent.js +0 -286
  27. package/dist/cli/commands/agent.js.map +0 -7
  28. package/dist/cli/commands/chromadb.js +0 -482
  29. package/dist/cli/commands/chromadb.js.map +0 -7
  30. package/dist/cli/commands/gc.js +0 -251
  31. package/dist/cli/commands/gc.js.map +0 -7
  32. package/dist/cli/commands/infinite-storage.js +0 -292
  33. package/dist/cli/commands/infinite-storage.js.map +0 -7
  34. package/dist/cli/commands/linear-create.js +0 -171
  35. package/dist/cli/commands/linear-create.js.map +0 -7
  36. package/dist/cli/commands/linear-list.js +0 -103
  37. package/dist/cli/commands/linear-list.js.map +0 -7
  38. package/dist/cli/commands/linear-migrate.js +0 -64
  39. package/dist/cli/commands/linear-migrate.js.map +0 -7
  40. package/dist/cli/commands/linear-test.js +0 -134
  41. package/dist/cli/commands/linear-test.js.map +0 -7
  42. package/dist/cli/commands/tui.js +0 -77
  43. package/dist/cli/commands/tui.js.map +0 -7
  44. package/dist/cli/commands/webhook.js +0 -181
  45. package/dist/cli/commands/webhook.js.map +0 -7
  46. package/dist/cli/streamlined-cli.js +0 -144
  47. package/dist/cli/streamlined-cli.js.map +0 -7
  48. package/dist/core/events/event-bus.js +0 -110
  49. package/dist/core/events/event-bus.js.map +0 -7
  50. package/dist/core/frame/workflow-templates-stub.js +0 -42
  51. package/dist/core/frame/workflow-templates-stub.js.map +0 -7
  52. package/dist/core/plugins/plugin-interface.js +0 -87
  53. package/dist/core/plugins/plugin-interface.js.map +0 -7
  54. package/dist/core/session/clear-survival-stub.js +0 -53
  55. package/dist/core/session/clear-survival-stub.js.map +0 -7
  56. package/dist/core/storage/chromadb-simple.js +0 -172
  57. package/dist/core/storage/chromadb-simple.js.map +0 -7
  58. package/dist/core/storage/simplified-storage.js +0 -328
  59. package/dist/core/storage/simplified-storage.js.map +0 -7
  60. package/dist/features/tasks/pebbles-task-store.js +0 -647
  61. package/dist/features/tasks/pebbles-task-store.js.map +0 -7
  62. package/dist/integrations/linear/sync-enhanced.js +0 -202
  63. package/dist/integrations/linear/sync-enhanced.js.map +0 -7
  64. package/dist/plugins/linear/index.js +0 -166
  65. package/dist/plugins/linear/index.js.map +0 -7
  66. package/dist/plugins/loader.js +0 -57
  67. package/dist/plugins/loader.js.map +0 -7
  68. package/dist/plugins/plugin-interface.js +0 -67
  69. package/dist/plugins/plugin-interface.js.map +0 -7
  70. package/dist/plugins/ralph/simple-ralph-plugin.js +0 -305
  71. package/dist/plugins/ralph/simple-ralph-plugin.js.map +0 -7
  72. package/dist/plugins/ralph/use-cases/code-generator.js +0 -151
  73. package/dist/plugins/ralph/use-cases/code-generator.js.map +0 -7
  74. package/dist/plugins/ralph/use-cases/test-generator.js +0 -201
  75. package/dist/plugins/ralph/use-cases/test-generator.js.map +0 -7
  76. package/dist/utils/logger.js +0 -52
  77. package/dist/utils/logger.js.map +0 -7
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/cli/commands/agent.ts"],
4
- "sourcesContent": ["/**\n * Agent command - Integrates Spotify's background coding agent strategies\n * with StackMemory's task system\n *\n * Usage: stackmemory agent <action> [options]\n */\n\nimport { Command } from 'commander';\nimport Database from 'better-sqlite3';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { LinearTaskManager } from '../../features/tasks/linear-task-manager.js';\nimport { FrameManager } from '../../core/context/frame-manager.js';\nimport {\n AgentTaskManager,\n AgentTaskSession,\n} from '../../agents/core/agent-task-manager.js';\nimport { FormatterVerifier } from '../../agents/verifiers/formatter-verifier.js';\nimport { LLMJudge } from '../../agents/verifiers/llm-judge.js';\nimport { logger } from '../../core/monitoring/logger.js';\n\nexport function createAgentCommand(): Command {\n const agent = new Command('agent')\n .description('AI agent task execution with Spotify-inspired strategies')\n .option('-p, --project <path>', 'Project root directory', process.cwd());\n\n agent\n .command('execute <taskId>')\n .description('Execute a task with agent assistance')\n .option('-f, --frame <frameId>', 'Frame ID to use')\n .option('--max-turns <number>', 'Maximum turns per session', '10')\n .option('--no-verify', 'Skip verification loops')\n .action(async (taskId: string, options) => {\n const spinner = ora('Initializing agent...').start();\n\n try {\n const { taskManager, session } = await initializeAgent(\n options.project,\n taskId,\n options.frame,\n parseInt(options.maxTurns)\n );\n\n spinner.succeed('Agent initialized');\n\n // Display session info\n console.log(chalk.cyan('\\n\uD83D\uDCCB Task Session Started'));\n console.log(chalk.gray(' Session ID:'), session.id);\n console.log(chalk.gray(' Task ID:'), session.taskId);\n console.log(chalk.gray(' Max Turns:'), session.maxTurns);\n console.log(\n chalk.gray(' Verification:'),\n options.verify ? 'Enabled' : 'Disabled'\n );\n\n // Execute task with feedback loop\n await executeTaskWithFeedback(taskManager, session, options.verify);\n } catch (error: unknown) {\n spinner.fail('Agent execution failed');\n console.error(\n chalk.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n\n agent\n .command('status')\n .description('Show active agent sessions')\n .action(async (options) => {\n const spinner = ora('Loading sessions...').start();\n\n try {\n const projectRoot = options.parent?.project || process.cwd();\n const { taskManager } = await initializeAgentManager(projectRoot);\n\n const sessions = taskManager.getActiveSessions();\n spinner.stop();\n\n if (sessions.length === 0) {\n console.log(chalk.yellow('No active agent sessions'));\n return;\n }\n\n console.log(chalk.cyan('\\n\uD83E\uDD16 Active Agent Sessions\\n'));\n\n for (const session of sessions) {\n console.log(chalk.bold(`Session: ${session.sessionId}`));\n console.log(chalk.gray(' Task:'), session.taskId);\n console.log(\n chalk.gray(' Status:'),\n getStatusColor(session.status)(session.status)\n );\n console.log(chalk.gray(' Turn:'), `${session.turnCount}/10`);\n console.log(\n chalk.gray(' Started:'),\n session.startedAt.toLocaleString()\n );\n console.log('');\n }\n } catch (error: unknown) {\n spinner.fail('Failed to load sessions');\n console.error(\n chalk.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n\n agent\n .command('retry <sessionId>')\n .description('Retry a failed session with learned context')\n .action(async (sessionId: string, options) => {\n const spinner = ora('Retrying session...').start();\n\n try {\n const projectRoot = options.parent?.project || process.cwd();\n const { taskManager } = await initializeAgentManager(projectRoot);\n\n const newSession = await taskManager.retrySession(sessionId);\n\n if (!newSession) {\n spinner.fail(\n 'Cannot retry session (max retries reached or session active)'\n );\n return;\n }\n\n spinner.succeed('Session retry started');\n console.log(chalk.cyan('\\n\u267B\uFE0F Retry Session Started'));\n console.log(chalk.gray(' New Session ID:'), newSession.id);\n console.log(chalk.gray(' Task ID:'), newSession.taskId);\n\n // Execute with feedback\n await executeTaskWithFeedback(taskManager, newSession, true);\n } catch (error: unknown) {\n spinner.fail('Retry failed');\n console.error(\n chalk.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n\n agent\n .command('breakdown <taskId>')\n .description('Break down a complex task into subtasks')\n .action(async (taskId: string, options) => {\n const spinner = ora('Analyzing task complexity...').start();\n\n try {\n const projectRoot = options.parent?.project || process.cwd();\n const db = await openDatabase(projectRoot);\n const taskStore = new LinearTaskManager(projectRoot, db);\n\n const task = taskStore.getTask(taskId);\n if (!task) {\n spinner.fail(`Task ${taskId} not found`);\n return;\n }\n\n spinner.text = 'Breaking down task...';\n\n // Simulate task breakdown (in production, would use LLM)\n const subtasks = generateTaskBreakdown(\n task.title,\n task.description || ''\n );\n\n spinner.succeed('Task breakdown complete');\n\n console.log(chalk.cyan(`\\n\uD83D\uDCCA Task Breakdown: ${task.title}\\n`));\n\n subtasks.forEach((subtask, index) => {\n console.log(chalk.bold(`${index + 1}. ${subtask.title}`));\n console.log(chalk.gray(' Description:'), subtask.description);\n console.log(\n chalk.gray(' Estimated turns:'),\n subtask.estimatedTurns\n );\n console.log(\n chalk.gray(' Verifiers:'),\n subtask.verifiers.join(', ')\n );\n console.log('');\n });\n\n console.log(\n chalk.yellow('Total estimated turns:'),\n subtasks.reduce((sum, st) => sum + st.estimatedTurns, 0)\n );\n } catch (error: unknown) {\n spinner.fail('Breakdown failed');\n console.error(\n chalk.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n\n return agent;\n}\n\n/**\n * Initialize agent and start task session\n */\nasync function initializeAgent(\n projectRoot: string,\n taskId: string,\n frameId?: string,\n maxTurns = 10\n): Promise<{\n taskManager: AgentTaskManager;\n session: AgentTaskSession;\n}> {\n const { taskManager, frameManager, taskStore } =\n await initializeAgentManager(projectRoot);\n\n // Create or get frame\n const finalFrameId =\n frameId ||\n frameManager.createFrame({\n type: 'task',\n name: `Agent task execution for ${taskId}`,\n inputs: { taskId, agentSession: true },\n });\n\n // Start session\n const session = await taskManager.startTaskSession(taskId, finalFrameId);\n\n // Override max turns if specified\n if (maxTurns !== 10) {\n session.maxTurns = maxTurns;\n }\n\n return { taskManager, session };\n}\n\n/**\n * Initialize agent manager components\n */\nasync function initializeAgentManager(projectRoot: string): Promise<{\n taskManager: AgentTaskManager;\n frameManager: FrameManager;\n taskStore: LinearTaskManager;\n}> {\n const db = await openDatabase(projectRoot);\n const taskStore = new LinearTaskManager(projectRoot, db);\n const frameManager = new FrameManager(db, projectRoot, undefined);\n const taskManager = new AgentTaskManager(taskStore, frameManager);\n\n return { taskManager, frameManager, taskStore };\n}\n\n/**\n * Execute task with feedback loop (Spotify pattern)\n */\nasync function executeTaskWithFeedback(\n taskManager: AgentTaskManager,\n session: AgentTaskSession,\n enableVerification: boolean\n): Promise<void> {\n console.log(chalk.cyan('\\n\uD83D\uDD04 Starting execution loop...\\n'));\n\n let turnCount = 0;\n let shouldContinue = true;\n let lastFeedback = '';\n\n while (shouldContinue && turnCount < session.maxTurns) {\n turnCount++;\n\n console.log(chalk.bold(`\\n\u2550\u2550\u2550 Turn ${turnCount}/${session.maxTurns} \u2550\u2550\u2550`));\n\n // Simulate agent action (in production, would use actual AI)\n const action = generateMockAction(turnCount, lastFeedback);\n console.log(chalk.gray('Action:'), action.substring(0, 100) + '...');\n\n // Execute turn with verification\n const spinner = ora('Executing...').start();\n\n const result = await taskManager.executeTurn(session.id, action, {\n codeChange: turnCount > 1,\n testsPresent: turnCount > 2,\n enableVerification,\n });\n\n if (result.success) {\n spinner.succeed('Turn completed successfully');\n } else {\n spinner.warn('Turn completed with issues');\n }\n\n // Display feedback\n console.log(chalk.yellow('\\n\uD83D\uDCDD Feedback:'));\n console.log(result.feedback);\n\n // Display verification results if any\n if (result.verificationResults.length > 0) {\n console.log(chalk.cyan('\\n\u2713 Verification Results:'));\n for (const vr of result.verificationResults) {\n const icon = vr.passed ? '\u2713' : '\u2717';\n const color = vr.passed ? chalk.green : chalk.red;\n console.log(color(` ${icon} ${vr.verifierId}: ${vr.message}`));\n }\n }\n\n shouldContinue = result.shouldContinue;\n lastFeedback = result.feedback;\n\n // Short delay for readability\n await delay(1000);\n }\n\n // Final status\n console.log(chalk.cyan('\\n\u2550\u2550\u2550 Session Complete \u2550\u2550\u2550\\n'));\n console.log(chalk.gray('Total turns:'), turnCount);\n console.log(chalk.gray('Final status:'), session.status);\n}\n\n/**\n * Generate mock action for demonstration\n */\nfunction generateMockAction(turn: number, previousFeedback: string): string {\n const actions = [\n 'Analyzing task requirements and constraints',\n 'Setting up project structure and dependencies',\n 'Implementing core functionality',\n 'Adding error handling and validation',\n 'Writing unit tests',\n 'Refactoring for better code organization',\n 'Adding documentation and comments',\n 'Running final verification checks',\n 'Optimizing performance',\n 'Completing final cleanup',\n ];\n\n if (previousFeedback.includes('error')) {\n return `Fixing issues: ${previousFeedback.substring(0, 50)}...`;\n }\n\n return actions[Math.min(turn - 1, actions.length - 1)];\n}\n\n/**\n * Generate task breakdown for complex tasks\n */\nfunction generateTaskBreakdown(\n title: string,\n description: string\n): Array<{\n title: string;\n description: string;\n estimatedTurns: number;\n verifiers: string[];\n}> {\n // Simple heuristic breakdown (in production, would use LLM)\n return [\n {\n title: `Analyze and plan: ${title}`,\n description: 'Understand requirements and create implementation plan',\n estimatedTurns: 2,\n verifiers: ['semantic-validator'],\n },\n {\n title: `Implement core: ${title}`,\n description: 'Build main functionality',\n estimatedTurns: 4,\n verifiers: ['formatter', 'linter', 'semantic-validator'],\n },\n {\n title: `Test and validate: ${title}`,\n description: 'Add tests and validate implementation',\n estimatedTurns: 3,\n verifiers: ['test-runner', 'semantic-validator'],\n },\n {\n title: `Polish and document: ${title}`,\n description: 'Final improvements and documentation',\n estimatedTurns: 1,\n verifiers: ['formatter', 'linter'],\n },\n ];\n}\n\n/**\n * Open or create database\n */\nasync function openDatabase(projectRoot: string): Promise<Database.Database> {\n const dbPath = join(projectRoot, '.stackmemory', 'cache.db');\n\n if (!existsSync(join(projectRoot, '.stackmemory'))) {\n throw new Error(\n 'StackMemory not initialized. Run \"stackmemory init\" first.'\n );\n }\n\n return new Database(dbPath);\n}\n\n/**\n * Get color function for status\n */\nfunction getStatusColor(status: string): (text: string) => string {\n switch (status) {\n case 'active':\n return chalk.green;\n case 'completed':\n return chalk.blue;\n case 'failed':\n return chalk.red;\n case 'timeout':\n return chalk.yellow;\n default:\n return chalk.gray;\n }\n}\n\n/**\n * Delay helper\n */\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,482 +0,0 @@
1
- import { Command } from "commander";
2
- import chalk from "chalk";
3
- import ora from "ora";
4
- import { ChromaDBAdapter } from "../../core/storage/chromadb-adapter.js";
5
- import { FrameManager } from "../../core/context/frame-manager.js";
6
- import { logger } from "../../core/monitoring/logger.js";
7
- import { RepoIngestionSkill } from "../../skills/repo-ingestion-skill.js";
8
- import Table from "cli-table3";
9
- import dotenv from "dotenv";
10
- import path from "path";
11
- import { fileURLToPath } from "url";
12
- import fs from "fs";
13
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
14
- dotenv.config({
15
- path: path.join(__dirname, "../../../.env"),
16
- override: true
17
- });
18
- function createChromaDBCommand() {
19
- const chromadb = new Command("chromadb").description("Manage ChromaDB vector storage for context").alias("chroma");
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) => {
21
- const spinner = ora("Initializing ChromaDB...").start();
22
- try {
23
- const config = {
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"
27
- };
28
- const userId = options.userId || process.env["USER"] || "default";
29
- const teamId = options.teamId || process.env["CHROMADB_TEAM_ID"];
30
- if (!config.apiKey || !config.tenant) {
31
- spinner.fail("Missing ChromaDB credentials");
32
- console.log(chalk.yellow("\nPlease provide:"));
33
- console.log(" --api-key <key> ChromaDB API key");
34
- console.log(" --tenant <tenant> ChromaDB tenant ID");
35
- console.log("\nOr set environment variables:");
36
- console.log(" CHROMADB_API_KEY");
37
- console.log(" CHROMADB_TENANT");
38
- return;
39
- }
40
- const adapter = new ChromaDBAdapter(config, userId, teamId);
41
- await adapter.initialize();
42
- const envPath = path.join(__dirname, "../../../.env");
43
- let envContent = "";
44
- if (fs.existsSync(envPath)) {
45
- envContent = fs.readFileSync(envPath, "utf8");
46
- }
47
- const updates = [];
48
- if (!envContent.includes("CHROMADB_API_KEY")) {
49
- updates.push(`CHROMADB_API_KEY=${config.apiKey}`);
50
- }
51
- if (!envContent.includes("CHROMADB_TENANT")) {
52
- updates.push(`CHROMADB_TENANT=${config.tenant}`);
53
- }
54
- if (!envContent.includes("CHROMADB_DATABASE")) {
55
- updates.push(`CHROMADB_DATABASE=${config.database}`);
56
- }
57
- if (updates.length > 0) {
58
- fs.appendFileSync(
59
- envPath,
60
- "\n# ChromaDB Configuration\n" + updates.join("\n") + "\n"
61
- );
62
- }
63
- spinner.succeed("ChromaDB initialized successfully");
64
- console.log(chalk.green("\n\u2705 Configuration:"));
65
- console.log(` Tenant: ${config.tenant}`);
66
- console.log(` Database: ${config.database}`);
67
- console.log(` User ID: ${userId}`);
68
- if (teamId) {
69
- console.log(` Team ID: ${teamId}`);
70
- }
71
- } catch (error) {
72
- spinner.fail("Failed to initialize ChromaDB");
73
- logger.error("Initialization error", error);
74
- console.error(
75
- chalk.red(error instanceof Error ? error.message : "Unknown error")
76
- );
77
- }
78
- });
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) => {
84
- const spinner = ora("Storing context...").start();
85
- try {
86
- const config = {
87
- apiKey: process.env["CHROMADB_API_KEY"] || "",
88
- tenant: process.env["CHROMADB_TENANT"] || "",
89
- database: process.env["CHROMADB_DATABASE"] || "stackmemory"
90
- };
91
- const userId = process.env["USER"] || "default";
92
- const teamId = process.env["CHROMADB_TEAM_ID"];
93
- const adapter = new ChromaDBAdapter(config, userId, teamId);
94
- await adapter.initialize();
95
- if (options.type === "frame") {
96
- const frameManager = new FrameManager();
97
- const frames = frameManager.getAllFrames();
98
- for (const frame of frames) {
99
- await adapter.storeFrame(frame);
100
- }
101
- spinner.succeed(`Stored ${frames.length} frames`);
102
- } else {
103
- const content = options.content || `${options.type} at ${(/* @__PURE__ */ new Date()).toISOString()}`;
104
- const metadata = {
105
- project_name: options.project || path.basename(process.cwd())
106
- };
107
- if (process.env["STACKMEMORY_SESSION_ID"]) {
108
- metadata.session_id = process.env["STACKMEMORY_SESSION_ID"];
109
- }
110
- await adapter.storeContext(
111
- options.type,
112
- content,
113
- metadata
114
- );
115
- spinner.succeed(`Stored ${options.type}`);
116
- }
117
- } catch (error) {
118
- spinner.fail("Failed to store context");
119
- logger.error("Store error", error);
120
- console.error(
121
- chalk.red(error instanceof Error ? error.message : "Unknown error")
122
- );
123
- }
124
- });
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) => {
126
- const spinner = ora("Searching...").start();
127
- try {
128
- const config = {
129
- apiKey: process.env["CHROMADB_API_KEY"] || "",
130
- tenant: process.env["CHROMADB_TENANT"] || "",
131
- database: process.env["CHROMADB_DATABASE"] || "stackmemory"
132
- };
133
- const userId = process.env["USER"] || "default";
134
- const teamId = process.env["CHROMADB_TEAM_ID"];
135
- const adapter = new ChromaDBAdapter(config, userId, teamId);
136
- await adapter.initialize();
137
- const filters = {};
138
- if (options.type) {
139
- filters.type = [options.type];
140
- }
141
- if (options.project) {
142
- filters.projectName = options.project;
143
- }
144
- const results = await adapter.queryContexts(
145
- search,
146
- parseInt(options.limit),
147
- filters
148
- );
149
- spinner.stop();
150
- if (results.length === 0) {
151
- console.log(chalk.yellow("No results found"));
152
- return;
153
- }
154
- const table = new Table({
155
- head: ["Type", "Project", "Content", "Distance"],
156
- colWidths: [15, 20, 50, 10],
157
- wordWrap: true
158
- });
159
- for (const result of results) {
160
- const content = result.content.substring(0, 100) + (result.content.length > 100 ? "..." : "");
161
- table.push([
162
- result.metadata.type || "unknown",
163
- result.metadata.project_name || "default",
164
- content,
165
- result.distance.toFixed(3)
166
- ]);
167
- }
168
- console.log(table.toString());
169
- console.log(chalk.green(`
170
- \u2705 Found ${results.length} results`));
171
- } catch (error) {
172
- spinner.fail("Failed to query contexts");
173
- logger.error("Query error", error);
174
- console.error(
175
- chalk.red(error instanceof Error ? error.message : "Unknown error")
176
- );
177
- }
178
- });
179
- chromadb.command("recent").description("Get recent contexts").option("--limit <n>", "Number of results", "20").option("--type <type>", "Filter by type").action(async (options) => {
180
- const spinner = ora("Fetching recent contexts...").start();
181
- try {
182
- const config = {
183
- apiKey: process.env["CHROMADB_API_KEY"] || "",
184
- tenant: process.env["CHROMADB_TENANT"] || "",
185
- database: process.env["CHROMADB_DATABASE"] || "stackmemory"
186
- };
187
- const userId = process.env["USER"] || "default";
188
- const teamId = process.env["CHROMADB_TEAM_ID"];
189
- const adapter = new ChromaDBAdapter(config, userId, teamId);
190
- await adapter.initialize();
191
- const results = await adapter.getRecentContexts(
192
- parseInt(options.limit),
193
- options.type
194
- );
195
- spinner.stop();
196
- if (results.length === 0) {
197
- console.log(chalk.yellow("No recent contexts found"));
198
- return;
199
- }
200
- const table = new Table({
201
- head: ["Time", "Type", "Project", "Content"],
202
- colWidths: [20, 12, 20, 48],
203
- wordWrap: true
204
- });
205
- for (const result of results) {
206
- const time = new Date(result.metadata.timestamp).toLocaleString();
207
- const content = result.content.substring(0, 100) + (result.content.length > 100 ? "..." : "");
208
- table.push([
209
- time,
210
- result.metadata.type || "unknown",
211
- result.metadata.project_name || "default",
212
- content
213
- ]);
214
- }
215
- console.log(table.toString());
216
- console.log(
217
- chalk.green(`
218
- \u2705 Found ${results.length} recent contexts`)
219
- );
220
- } catch (error) {
221
- spinner.fail("Failed to get recent contexts");
222
- logger.error("Recent error", error);
223
- console.error(
224
- chalk.red(error instanceof Error ? error.message : "Unknown error")
225
- );
226
- }
227
- });
228
- chromadb.command("stats").description("Get ChromaDB storage statistics").action(async () => {
229
- const spinner = ora("Fetching statistics...").start();
230
- try {
231
- const config = {
232
- apiKey: process.env["CHROMADB_API_KEY"] || "",
233
- tenant: process.env["CHROMADB_TENANT"] || "",
234
- database: process.env["CHROMADB_DATABASE"] || "stackmemory"
235
- };
236
- const userId = process.env["USER"] || "default";
237
- const teamId = process.env["CHROMADB_TEAM_ID"];
238
- const adapter = new ChromaDBAdapter(config, userId, teamId);
239
- await adapter.initialize();
240
- const stats = await adapter.getStats();
241
- spinner.stop();
242
- console.log(chalk.cyan("\n\u{1F4CA} ChromaDB Statistics\n"));
243
- console.log(`Total Documents: ${chalk.bold(stats.totalDocuments)}`);
244
- console.log(`User Documents: ${chalk.bold(stats.userDocuments)}`);
245
- if (stats.teamDocuments !== void 0) {
246
- console.log(`Team Documents: ${chalk.bold(stats.teamDocuments)}`);
247
- }
248
- console.log("\nDocuments by Type:");
249
- for (const [type, count] of Object.entries(stats.documentsByType)) {
250
- console.log(` ${type}: ${count}`);
251
- }
252
- } catch (error) {
253
- spinner.fail("Failed to get statistics");
254
- logger.error("Stats error", error);
255
- console.error(
256
- chalk.red(error instanceof Error ? error.message : "Unknown error")
257
- );
258
- }
259
- });
260
- chromadb.command("clean").description("Clean old contexts").option("--days <n>", "Delete contexts older than N days", "30").action(async (options) => {
261
- const spinner = ora("Cleaning old contexts...").start();
262
- try {
263
- const config = {
264
- apiKey: process.env["CHROMADB_API_KEY"] || "",
265
- tenant: process.env["CHROMADB_TENANT"] || "",
266
- database: process.env["CHROMADB_DATABASE"] || "stackmemory"
267
- };
268
- const userId = process.env["USER"] || "default";
269
- const teamId = process.env["CHROMADB_TEAM_ID"];
270
- const adapter = new ChromaDBAdapter(config, userId, teamId);
271
- await adapter.initialize();
272
- const deleted = await adapter.deleteOldContexts(parseInt(options.days));
273
- spinner.succeed(`Deleted ${deleted} old contexts`);
274
- } catch (error) {
275
- spinner.fail("Failed to clean contexts");
276
- logger.error("Clean error", 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
- );
475
- }
476
- });
477
- return chromadb;
478
- }
479
- export {
480
- createChromaDBCommand
481
- };
482
- //# sourceMappingURL=chromadb.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 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 { 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
- "names": []
7
- }