@stackmemoryai/stackmemory 0.3.3 → 0.3.6

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 (36) hide show
  1. package/README.md +19 -18
  2. package/dist/cli/commands/chromadb.js +267 -0
  3. package/dist/cli/commands/chromadb.js.map +7 -0
  4. package/dist/cli/commands/context.js +15 -5
  5. package/dist/cli/commands/context.js.map +2 -2
  6. package/dist/cli/commands/infinite-storage.js +240 -0
  7. package/dist/cli/commands/infinite-storage.js.map +7 -0
  8. package/dist/cli/commands/skills.js +262 -0
  9. package/dist/cli/commands/skills.js.map +7 -0
  10. package/dist/cli/index.js +7 -0
  11. package/dist/cli/index.js.map +2 -2
  12. package/dist/core/context/frame-handoff-manager.js +399 -9
  13. package/dist/core/context/frame-handoff-manager.js.map +2 -2
  14. package/dist/core/context/frame-manager.js +11 -2
  15. package/dist/core/context/frame-manager.js.map +2 -2
  16. package/dist/core/storage/chromadb-adapter.js +346 -0
  17. package/dist/core/storage/chromadb-adapter.js.map +7 -0
  18. package/dist/core/storage/chromadb-simple.js +160 -0
  19. package/dist/core/storage/chromadb-simple.js.map +7 -0
  20. package/dist/core/storage/infinite-storage.js +443 -0
  21. package/dist/core/storage/infinite-storage.js.map +7 -0
  22. package/dist/core/utils/compression.js +79 -0
  23. package/dist/core/utils/compression.js.map +7 -0
  24. package/dist/features/tui/services/data-service.js +12 -40
  25. package/dist/features/tui/services/data-service.js.map +2 -2
  26. package/dist/features/tui/services/linear-task-reader.js +100 -0
  27. package/dist/features/tui/services/linear-task-reader.js.map +7 -0
  28. package/dist/features/web/client/stores/task-store.js +22 -0
  29. package/dist/features/web/client/stores/task-store.js.map +7 -0
  30. package/dist/features/web/server/index.js +171 -0
  31. package/dist/features/web/server/index.js.map +7 -0
  32. package/dist/skills/claude-skills.js +712 -0
  33. package/dist/skills/claude-skills.js.map +7 -0
  34. package/dist/skills/dashboard-launcher.js +212 -0
  35. package/dist/skills/dashboard-launcher.js.map +7 -0
  36. package/package.json +23 -31
@@ -0,0 +1,240 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import Table from "cli-table3";
5
+ import { InfiniteStorageSystem } from "../../core/storage/infinite-storage.js";
6
+ import { FrameManager } from "../../core/context/frame-manager.js";
7
+ import { Logger } from "../../core/monitoring/logger.js";
8
+ import dotenv from "dotenv";
9
+ import path from "path";
10
+ import { fileURLToPath } from "url";
11
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
12
+ dotenv.config({
13
+ path: path.join(__dirname, "../../../.env"),
14
+ override: true,
15
+ silent: true
16
+ });
17
+ const logger = new Logger("InfiniteStorage-CLI");
18
+ function createInfiniteStorageCommand() {
19
+ const storage = new Command("infinite-storage").description("Manage infinite storage system with tiered storage").alias("storage");
20
+ storage.command("init").description("Initialize infinite storage system").option("--redis-url <url>", "Redis connection URL").option("--timeseries-url <url>", "TimeSeries DB connection URL").option("--s3-bucket <bucket>", "S3 bucket name").option("--s3-region <region>", "S3 region", "us-east-1").action(async (options) => {
21
+ const spinner = ora("Initializing infinite storage...").start();
22
+ try {
23
+ const config = {
24
+ redis: {
25
+ url: options.redisUrl || process.env.REDIS_URL || "redis://localhost:6379",
26
+ ttlSeconds: 3600,
27
+ maxMemoryMB: parseInt(process.env.REDIS_MAX_MEMORY_MB || "512")
28
+ },
29
+ timeseries: {
30
+ connectionString: options.timeseriesUrl || process.env.TIMESERIES_URL || "",
31
+ retentionDays: 30
32
+ },
33
+ s3: {
34
+ bucket: options.s3Bucket || process.env.S3_BUCKET || "",
35
+ region: options.s3Region || process.env.AWS_REGION || "us-east-1",
36
+ accessKeyId: process.env.AWS_ACCESS_KEY_ID,
37
+ secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
38
+ },
39
+ tiers: []
40
+ };
41
+ const storage2 = new InfiniteStorageSystem(config);
42
+ await storage2.initialize();
43
+ spinner.succeed("Infinite storage initialized");
44
+ console.log(chalk.green("\n\u2705 Storage Tiers Configured:"));
45
+ console.log(" Hot (Redis): < 1 hour, 5ms latency");
46
+ console.log(" Warm (TimeSeries): 1h - 7 days, 50ms latency");
47
+ console.log(" Cold (S3): 7 - 30 days, 100ms latency");
48
+ console.log(" Archive (Glacier): > 30 days, 1h latency");
49
+ const envPath = path.join(__dirname, "../../../.env");
50
+ const updates = [];
51
+ if (!process.env.REDIS_URL && options.redisUrl) {
52
+ updates.push(`REDIS_URL=${options.redisUrl}`);
53
+ }
54
+ if (!process.env.TIMESERIES_URL && options.timeseriesUrl) {
55
+ updates.push(`TIMESERIES_URL=${options.timeseriesUrl}`);
56
+ }
57
+ if (!process.env.S3_BUCKET && options.s3Bucket) {
58
+ updates.push(`S3_BUCKET=${options.s3Bucket}`);
59
+ }
60
+ if (updates.length > 0) {
61
+ const fs = await import("fs");
62
+ fs.appendFileSync(envPath, "\n# Infinite Storage Configuration\n" + updates.join("\n") + "\n");
63
+ }
64
+ } catch (error) {
65
+ spinner.fail("Failed to initialize storage");
66
+ logger.error("Initialization error", error);
67
+ console.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
68
+ }
69
+ });
70
+ storage.command("store").description("Store current frames in infinite storage").option("--project <name>", "Project name").option("--user <id>", "User ID").action(async (options) => {
71
+ const spinner = ora("Storing frames...").start();
72
+ try {
73
+ const config = getStorageConfig();
74
+ const storage2 = new InfiniteStorageSystem(config);
75
+ await storage2.initialize();
76
+ const frameManager = new FrameManager();
77
+ const frames = frameManager.getAllFrames();
78
+ const userId = options.user || process.env.USER || "default";
79
+ for (const frame of frames) {
80
+ await storage2.storeFrame(frame, userId);
81
+ }
82
+ spinner.succeed(`Stored ${frames.length} frames`);
83
+ } catch (error) {
84
+ spinner.fail("Failed to store frames");
85
+ logger.error("Store error", error);
86
+ console.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
87
+ }
88
+ });
89
+ storage.command("retrieve <frameId>").description("Retrieve a frame from storage").option("--user <id>", "User ID").action(async (frameId, options) => {
90
+ const spinner = ora("Retrieving frame...").start();
91
+ try {
92
+ const config = getStorageConfig();
93
+ const storage2 = new InfiniteStorageSystem(config);
94
+ await storage2.initialize();
95
+ const userId = options.user || process.env.USER || "default";
96
+ const frame = await storage2.retrieveFrame(frameId, userId);
97
+ spinner.stop();
98
+ if (frame) {
99
+ console.log(chalk.green("\n\u2705 Frame Retrieved:"));
100
+ console.log(JSON.stringify(frame, null, 2));
101
+ } else {
102
+ console.log(chalk.yellow("Frame not found"));
103
+ }
104
+ } catch (error) {
105
+ spinner.fail("Failed to retrieve frame");
106
+ logger.error("Retrieve error", error);
107
+ console.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
108
+ }
109
+ });
110
+ storage.command("metrics").description("Show storage system metrics").action(async () => {
111
+ const spinner = ora("Fetching metrics...").start();
112
+ try {
113
+ const config = getStorageConfig();
114
+ const storage2 = new InfiniteStorageSystem(config);
115
+ await storage2.initialize();
116
+ const metrics = await storage2.getMetrics();
117
+ spinner.stop();
118
+ console.log(chalk.cyan("\n\u{1F4CA} Infinite Storage Metrics\n"));
119
+ const table = new Table({
120
+ head: ["Metric", "Value"],
121
+ colWidths: [30, 40]
122
+ });
123
+ table.push(
124
+ ["Total Objects", metrics.totalObjects.toString()],
125
+ ["Storage Size", formatBytes(metrics.storageBytes)],
126
+ ["Avg Latency", `${metrics.avgLatencyMs.toFixed(2)}ms`],
127
+ ["P50 Latency", `${metrics.p50LatencyMs}ms`],
128
+ ["P99 Latency", `${metrics.p99LatencyMs}ms`]
129
+ );
130
+ console.log(table.toString());
131
+ if (Object.keys(metrics.tierDistribution).length > 0) {
132
+ console.log("\nTier Distribution:");
133
+ for (const [tier, count] of Object.entries(metrics.tierDistribution)) {
134
+ const percentage = (count / metrics.totalObjects * 100).toFixed(1);
135
+ console.log(` ${tier}: ${count} objects (${percentage}%)`);
136
+ }
137
+ }
138
+ console.log(chalk.cyan("\n\u{1F3AF} STA-287 Performance Targets:"));
139
+ const p50Target = metrics.p50LatencyMs <= 50;
140
+ const p99Target = metrics.p99LatencyMs <= 500;
141
+ console.log(` P50 \u2264 50ms: ${p50Target ? chalk.green("\u2705 PASS") : chalk.red("\u274C FAIL")} (${metrics.p50LatencyMs}ms)`);
142
+ console.log(` P99 \u2264 500ms: ${p99Target ? chalk.green("\u2705 PASS") : chalk.red("\u274C FAIL")} (${metrics.p99LatencyMs}ms)`);
143
+ } catch (error) {
144
+ spinner.fail("Failed to get metrics");
145
+ logger.error("Metrics error", error);
146
+ console.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
147
+ }
148
+ });
149
+ storage.command("migrate").description("Manually trigger tier migration").action(async () => {
150
+ const spinner = ora("Running migration...").start();
151
+ try {
152
+ const config = getStorageConfig();
153
+ const storage2 = new InfiniteStorageSystem(config);
154
+ await storage2.initialize();
155
+ await storage2.migrateAgedData();
156
+ spinner.succeed("Migration completed");
157
+ } catch (error) {
158
+ spinner.fail("Migration failed");
159
+ logger.error("Migration error", error);
160
+ console.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
161
+ }
162
+ });
163
+ storage.command("status").description("Check storage system status").action(async () => {
164
+ const spinner = ora("Checking status...").start();
165
+ try {
166
+ const config = getStorageConfig();
167
+ spinner.stop();
168
+ console.log(chalk.cyan("\n\u{1F4E6} Storage System Status\n"));
169
+ if (config.redis?.url) {
170
+ try {
171
+ const { createClient } = await import("redis");
172
+ const client = createClient({ url: config.redis.url });
173
+ await client.connect();
174
+ await client.ping();
175
+ await client.quit();
176
+ console.log("Redis (Hot Tier): " + chalk.green("\u2705 Connected"));
177
+ } catch {
178
+ console.log("Redis (Hot Tier): " + chalk.red("\u274C Not connected"));
179
+ }
180
+ } else {
181
+ console.log("Redis (Hot Tier): " + chalk.yellow("\u26A0\uFE0F Not configured"));
182
+ }
183
+ if (config.timeseries?.connectionString) {
184
+ try {
185
+ const { Pool } = await import("pg");
186
+ const pool = new Pool({ connectionString: config.timeseries.connectionString });
187
+ await pool.query("SELECT 1");
188
+ await pool.end();
189
+ console.log("TimeSeries DB (Warm Tier): " + chalk.green("\u2705 Connected"));
190
+ } catch {
191
+ console.log("TimeSeries DB (Warm Tier): " + chalk.red("\u274C Not connected"));
192
+ }
193
+ } else {
194
+ console.log("TimeSeries DB (Warm Tier): " + chalk.yellow("\u26A0\uFE0F Not configured"));
195
+ }
196
+ if (config.s3?.bucket) {
197
+ console.log(`S3 (Cold/Archive Tier): ${chalk.green("\u2705")} Bucket: ${config.s3.bucket}`);
198
+ } else {
199
+ console.log("S3 (Cold/Archive Tier): " + chalk.yellow("\u26A0\uFE0F Not configured"));
200
+ }
201
+ console.log("\n" + chalk.gray("Configure missing tiers with: stackmemory infinite-storage init"));
202
+ } catch (error) {
203
+ spinner.fail("Failed to check status");
204
+ logger.error("Status error", error);
205
+ console.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
206
+ }
207
+ });
208
+ return storage;
209
+ }
210
+ function getStorageConfig() {
211
+ return {
212
+ redis: {
213
+ url: process.env.REDIS_URL || "redis://localhost:6379",
214
+ ttlSeconds: parseInt(process.env.REDIS_TTL || "3600"),
215
+ maxMemoryMB: parseInt(process.env.REDIS_MAX_MEMORY_MB || "512")
216
+ },
217
+ timeseries: {
218
+ connectionString: process.env.TIMESERIES_URL || "",
219
+ retentionDays: parseInt(process.env.TIMESERIES_RETENTION_DAYS || "30")
220
+ },
221
+ s3: {
222
+ bucket: process.env.S3_BUCKET || "",
223
+ region: process.env.AWS_REGION || "us-east-1",
224
+ accessKeyId: process.env.AWS_ACCESS_KEY_ID,
225
+ secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
226
+ },
227
+ tiers: []
228
+ };
229
+ }
230
+ function formatBytes(bytes) {
231
+ if (bytes === 0) return "0 Bytes";
232
+ const k = 1024;
233
+ const sizes = ["Bytes", "KB", "MB", "GB", "TB"];
234
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
235
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
236
+ }
237
+ export {
238
+ createInfiniteStorageCommand
239
+ };
240
+ //# sourceMappingURL=infinite-storage.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/cli/commands/infinite-storage.ts"],
4
+ "sourcesContent": ["/**\n * CLI commands for Infinite Storage System management\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport Table from 'cli-table3';\nimport { InfiniteStorageSystem, StorageConfig } from '../../core/storage/infinite-storage.js';\nimport { FrameManager } from '../../core/context/frame-manager.js';\nimport { Logger } from '../../core/monitoring/logger.js';\nimport dotenv from 'dotenv';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\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('InfiniteStorage-CLI');\n\nexport function createInfiniteStorageCommand(): Command {\n const storage = new Command('infinite-storage')\n .description('Manage infinite storage system with tiered storage')\n .alias('storage');\n\n // Initialize storage system\n storage\n .command('init')\n .description('Initialize infinite storage system')\n .option('--redis-url <url>', 'Redis connection URL')\n .option('--timeseries-url <url>', 'TimeSeries DB connection URL')\n .option('--s3-bucket <bucket>', 'S3 bucket name')\n .option('--s3-region <region>', 'S3 region', 'us-east-1')\n .action(async (options) => {\n const spinner = ora('Initializing infinite storage...').start();\n\n try {\n const config: StorageConfig = {\n redis: {\n url: options.redisUrl || process.env.REDIS_URL || 'redis://localhost:6379',\n ttlSeconds: 3600,\n maxMemoryMB: parseInt(process.env.REDIS_MAX_MEMORY_MB || '512'),\n },\n timeseries: {\n connectionString: options.timeseriesUrl || process.env.TIMESERIES_URL || '',\n retentionDays: 30,\n },\n s3: {\n bucket: options.s3Bucket || process.env.S3_BUCKET || '',\n region: options.s3Region || process.env.AWS_REGION || 'us-east-1',\n accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,\n },\n tiers: [],\n };\n\n const storage = new InfiniteStorageSystem(config);\n await storage.initialize();\n\n spinner.succeed('Infinite storage initialized');\n \n console.log(chalk.green('\\n\u2705 Storage Tiers Configured:'));\n console.log(' Hot (Redis): < 1 hour, 5ms latency');\n console.log(' Warm (TimeSeries): 1h - 7 days, 50ms latency');\n console.log(' Cold (S3): 7 - 30 days, 100ms latency');\n console.log(' Archive (Glacier): > 30 days, 1h latency');\n \n // Save config to env\n const envPath = path.join(__dirname, '../../../.env');\n const updates: string[] = [];\n \n if (!process.env.REDIS_URL && options.redisUrl) {\n updates.push(`REDIS_URL=${options.redisUrl}`);\n }\n if (!process.env.TIMESERIES_URL && options.timeseriesUrl) {\n updates.push(`TIMESERIES_URL=${options.timeseriesUrl}`);\n }\n if (!process.env.S3_BUCKET && options.s3Bucket) {\n updates.push(`S3_BUCKET=${options.s3Bucket}`);\n }\n \n if (updates.length > 0) {\n const fs = await import('fs');\n fs.appendFileSync(envPath, '\\n# Infinite Storage Configuration\\n' + updates.join('\\n') + '\\n');\n }\n } catch (error) {\n spinner.fail('Failed to initialize storage');\n logger.error('Initialization error', error);\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n });\n\n // Store frames\n storage\n .command('store')\n .description('Store current frames in infinite storage')\n .option('--project <name>', 'Project name')\n .option('--user <id>', 'User ID')\n .action(async (options) => {\n const spinner = ora('Storing frames...').start();\n\n try {\n const config = getStorageConfig();\n const storage = new InfiniteStorageSystem(config);\n await storage.initialize();\n\n const frameManager = new FrameManager();\n const frames = frameManager.getAllFrames();\n const userId = options.user || process.env.USER || 'default';\n\n for (const frame of frames) {\n await storage.storeFrame(frame, userId);\n }\n\n spinner.succeed(`Stored ${frames.length} frames`);\n } catch (error) {\n spinner.fail('Failed to store frames');\n logger.error('Store error', error);\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n });\n\n // Retrieve frame\n storage\n .command('retrieve <frameId>')\n .description('Retrieve a frame from storage')\n .option('--user <id>', 'User ID')\n .action(async (frameId, options) => {\n const spinner = ora('Retrieving frame...').start();\n\n try {\n const config = getStorageConfig();\n const storage = new InfiniteStorageSystem(config);\n await storage.initialize();\n\n const userId = options.user || process.env.USER || 'default';\n const frame = await storage.retrieveFrame(frameId, userId);\n\n spinner.stop();\n\n if (frame) {\n console.log(chalk.green('\\n\u2705 Frame Retrieved:'));\n console.log(JSON.stringify(frame, null, 2));\n } else {\n console.log(chalk.yellow('Frame not found'));\n }\n } catch (error) {\n spinner.fail('Failed to retrieve frame');\n logger.error('Retrieve error', error);\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n });\n\n // Show metrics\n storage\n .command('metrics')\n .description('Show storage system metrics')\n .action(async () => {\n const spinner = ora('Fetching metrics...').start();\n\n try {\n const config = getStorageConfig();\n const storage = new InfiniteStorageSystem(config);\n await storage.initialize();\n\n const metrics = await storage.getMetrics();\n\n spinner.stop();\n\n console.log(chalk.cyan('\\n\uD83D\uDCCA Infinite Storage Metrics\\n'));\n \n const table = new Table({\n head: ['Metric', 'Value'],\n colWidths: [30, 40],\n });\n\n table.push(\n ['Total Objects', metrics.totalObjects.toString()],\n ['Storage Size', formatBytes(metrics.storageBytes)],\n ['Avg Latency', `${metrics.avgLatencyMs.toFixed(2)}ms`],\n ['P50 Latency', `${metrics.p50LatencyMs}ms`],\n ['P99 Latency', `${metrics.p99LatencyMs}ms`],\n );\n\n console.log(table.toString());\n\n if (Object.keys(metrics.tierDistribution).length > 0) {\n console.log('\\nTier Distribution:');\n for (const [tier, count] of Object.entries(metrics.tierDistribution)) {\n const percentage = ((count / metrics.totalObjects) * 100).toFixed(1);\n console.log(` ${tier}: ${count} objects (${percentage}%)`);\n }\n }\n\n // Check if meeting STA-287 targets\n console.log(chalk.cyan('\\n\uD83C\uDFAF STA-287 Performance Targets:'));\n const p50Target = metrics.p50LatencyMs <= 50;\n const p99Target = metrics.p99LatencyMs <= 500;\n \n console.log(` P50 \u2264 50ms: ${p50Target ? chalk.green('\u2705 PASS') : chalk.red('\u274C FAIL')} (${metrics.p50LatencyMs}ms)`);\n console.log(` P99 \u2264 500ms: ${p99Target ? chalk.green('\u2705 PASS') : chalk.red('\u274C FAIL')} (${metrics.p99LatencyMs}ms)`);\n } catch (error) {\n spinner.fail('Failed to get metrics');\n logger.error('Metrics error', error);\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n });\n\n // Migrate data\n storage\n .command('migrate')\n .description('Manually trigger tier migration')\n .action(async () => {\n const spinner = ora('Running migration...').start();\n\n try {\n const config = getStorageConfig();\n const storage = new InfiniteStorageSystem(config);\n await storage.initialize();\n\n // Trigger migration (this would normally run automatically)\n // @ts-ignore - accessing private method for manual trigger\n await storage.migrateAgedData();\n\n spinner.succeed('Migration completed');\n } catch (error) {\n spinner.fail('Migration failed');\n logger.error('Migration error', error);\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n });\n\n // Status command\n storage\n .command('status')\n .description('Check storage system status')\n .action(async () => {\n const spinner = ora('Checking status...').start();\n\n try {\n const config = getStorageConfig();\n \n spinner.stop();\n \n console.log(chalk.cyan('\\n\uD83D\uDCE6 Storage System Status\\n'));\n \n // Check Redis\n if (config.redis?.url) {\n try {\n const { createClient } = await import('redis');\n const client = createClient({ url: config.redis.url });\n await client.connect();\n await client.ping();\n await client.quit();\n console.log('Redis (Hot Tier): ' + chalk.green('\u2705 Connected'));\n } catch {\n console.log('Redis (Hot Tier): ' + chalk.red('\u274C Not connected'));\n }\n } else {\n console.log('Redis (Hot Tier): ' + chalk.yellow('\u26A0\uFE0F Not configured'));\n }\n\n // Check TimeSeries DB\n if (config.timeseries?.connectionString) {\n try {\n const { Pool } = await import('pg');\n const pool = new Pool({ connectionString: config.timeseries.connectionString });\n await pool.query('SELECT 1');\n await pool.end();\n console.log('TimeSeries DB (Warm Tier): ' + chalk.green('\u2705 Connected'));\n } catch {\n console.log('TimeSeries DB (Warm Tier): ' + chalk.red('\u274C Not connected'));\n }\n } else {\n console.log('TimeSeries DB (Warm Tier): ' + chalk.yellow('\u26A0\uFE0F Not configured'));\n }\n\n // Check S3\n if (config.s3?.bucket) {\n console.log(`S3 (Cold/Archive Tier): ${chalk.green('\u2705')} Bucket: ${config.s3.bucket}`);\n } else {\n console.log('S3 (Cold/Archive Tier): ' + chalk.yellow('\u26A0\uFE0F Not configured'));\n }\n\n console.log('\\n' + chalk.gray('Configure missing tiers with: stackmemory infinite-storage init'));\n } catch (error) {\n spinner.fail('Failed to check status');\n logger.error('Status error', error);\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n });\n\n return storage;\n}\n\nfunction getStorageConfig(): StorageConfig {\n return {\n redis: {\n url: process.env.REDIS_URL || 'redis://localhost:6379',\n ttlSeconds: parseInt(process.env.REDIS_TTL || '3600'),\n maxMemoryMB: parseInt(process.env.REDIS_MAX_MEMORY_MB || '512'),\n },\n timeseries: {\n connectionString: process.env.TIMESERIES_URL || '',\n retentionDays: parseInt(process.env.TIMESERIES_RETENTION_DAYS || '30'),\n },\n s3: {\n bucket: process.env.S3_BUCKET || '',\n region: process.env.AWS_REGION || 'us-east-1',\n accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,\n },\n tiers: [],\n };\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}"],
5
+ "mappings": "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",
6
+ "names": ["storage"]
7
+ }
@@ -0,0 +1,262 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import chalk from "chalk";
4
+ import ora from "ora";
5
+ import { ClaudeSkillsManager } from "../../skills/claude-skills.js";
6
+ import { DualStackManager } from "../../core/context/dual-stack-manager.js";
7
+ import { FrameHandoffManager } from "../../core/context/frame-handoff-manager.js";
8
+ import { ContextRetriever } from "../../core/retrieval/context-retriever.js";
9
+ import { SQLiteAdapter } from "../../core/database/sqlite-adapter.js";
10
+ import { ConfigManager } from "../../core/config/config-manager.js";
11
+ import * as path from "path";
12
+ import * as os from "os";
13
+ async function initializeSkillContext() {
14
+ const config = ConfigManager.getInstance();
15
+ const projectId = config.get("project.id");
16
+ const userId = config.get("user.id") || process.env.USER || "default";
17
+ const dbPath = path.join(
18
+ os.homedir(),
19
+ ".stackmemory",
20
+ "data",
21
+ projectId,
22
+ "stackmemory.db"
23
+ );
24
+ const database = new SQLiteAdapter(projectId, { dbPath });
25
+ await database.connect();
26
+ const dualStackManager = new DualStackManager(database, projectId, userId);
27
+ const handoffManager = new FrameHandoffManager(dualStackManager);
28
+ const contextRetriever = new ContextRetriever(database);
29
+ return {
30
+ projectId,
31
+ userId,
32
+ dualStackManager,
33
+ handoffManager,
34
+ contextRetriever,
35
+ database
36
+ };
37
+ }
38
+ function createSkillsCommand() {
39
+ const skillsCmd = new Command("skills").description("Execute Claude skills for enhanced workflow");
40
+ skillsCmd.command("handoff <targetUser> <message>").description("Streamline frame handoffs between team members").option("-p, --priority <level>", "Set priority (low, medium, high, critical)", "medium").option("-f, --frames <frames...>", "Specific frames to handoff").option("--no-auto-detect", "Disable auto-detection of frames").action(async (targetUser, message, options) => {
41
+ const spinner = ora("Initiating handoff...").start();
42
+ try {
43
+ const context = await initializeSkillContext();
44
+ const skillsManager = new ClaudeSkillsManager(context);
45
+ const result = await skillsManager.executeSkill("handoff", [targetUser, message], {
46
+ priority: options.priority,
47
+ frames: options.frames,
48
+ autoDetect: options.autoDetect !== false
49
+ });
50
+ spinner.stop();
51
+ if (result.success) {
52
+ console.log(chalk.green("\u2713"), result.message);
53
+ if (result.data) {
54
+ console.log(chalk.cyan("\nHandoff Details:"));
55
+ console.log(` ID: ${result.data.handoffId}`);
56
+ console.log(` Frames: ${result.data.frameCount}`);
57
+ console.log(` Priority: ${result.data.priority}`);
58
+ if (result.data.actionItems?.length > 0) {
59
+ console.log(chalk.yellow("\n Action Items:"));
60
+ result.data.actionItems.forEach((item) => {
61
+ console.log(` \u2022 ${item}`);
62
+ });
63
+ }
64
+ }
65
+ } else {
66
+ console.log(chalk.red("\u2717"), result.message);
67
+ }
68
+ await context.database.disconnect();
69
+ } catch (error) {
70
+ spinner.stop();
71
+ console.error(chalk.red("Error:"), error.message);
72
+ process.exit(1);
73
+ }
74
+ });
75
+ const checkpointCmd = skillsCmd.command("checkpoint").description("Create and manage recovery points");
76
+ checkpointCmd.command("create <description>").description("Create a new checkpoint").option("--files <files...>", "Include specific files in checkpoint").option("--auto-detect-risky", "Auto-detect risky operations").action(async (description, options) => {
77
+ const spinner = ora("Creating checkpoint...").start();
78
+ try {
79
+ const context = await initializeSkillContext();
80
+ const skillsManager = new ClaudeSkillsManager(context);
81
+ const result = await skillsManager.executeSkill("checkpoint", ["create", description], {
82
+ includeFiles: options.files,
83
+ autoDetectRisky: options.autoDetectRisky
84
+ });
85
+ spinner.stop();
86
+ if (result.success) {
87
+ console.log(chalk.green("\u2713"), result.message);
88
+ if (result.data) {
89
+ console.log(chalk.cyan("\nCheckpoint Info:"));
90
+ console.log(` ID: ${result.data.checkpointId}`);
91
+ console.log(` Time: ${result.data.timestamp}`);
92
+ console.log(` Frames: ${result.data.frameCount}`);
93
+ }
94
+ } else {
95
+ console.log(chalk.red("\u2717"), result.message);
96
+ }
97
+ await context.database.disconnect();
98
+ } catch (error) {
99
+ spinner.stop();
100
+ console.error(chalk.red("Error:"), error.message);
101
+ process.exit(1);
102
+ }
103
+ });
104
+ checkpointCmd.command("restore <checkpointId>").description("Restore from a checkpoint").action(async (checkpointId) => {
105
+ const spinner = ora("Restoring checkpoint...").start();
106
+ try {
107
+ const context = await initializeSkillContext();
108
+ const skillsManager = new ClaudeSkillsManager(context);
109
+ const result = await skillsManager.executeSkill("checkpoint", ["restore", checkpointId]);
110
+ spinner.stop();
111
+ if (result.success) {
112
+ console.log(chalk.green("\u2713"), result.message);
113
+ if (result.data) {
114
+ console.log(chalk.cyan("\nRestored:"));
115
+ console.log(` Frames: ${result.data.frameCount}`);
116
+ console.log(` Files: ${result.data.filesRestored}`);
117
+ }
118
+ } else {
119
+ console.log(chalk.red("\u2717"), result.message);
120
+ }
121
+ await context.database.disconnect();
122
+ } catch (error) {
123
+ spinner.stop();
124
+ console.error(chalk.red("Error:"), error.message);
125
+ process.exit(1);
126
+ }
127
+ });
128
+ checkpointCmd.command("list").description("List available checkpoints").option("-l, --limit <number>", "Limit number of results", "10").option("-s, --since <date>", "Show checkpoints since date").action(async (options) => {
129
+ const spinner = ora("Loading checkpoints...").start();
130
+ try {
131
+ const context = await initializeSkillContext();
132
+ const skillsManager = new ClaudeSkillsManager(context);
133
+ const result = await skillsManager.executeSkill("checkpoint", ["list"], {
134
+ limit: parseInt(options.limit),
135
+ since: options.since ? new Date(options.since) : void 0
136
+ });
137
+ spinner.stop();
138
+ if (result.success) {
139
+ console.log(chalk.cyan("Available Checkpoints:\n"));
140
+ if (result.data && result.data.length > 0) {
141
+ result.data.forEach((cp) => {
142
+ const riskIndicator = cp.risky ? chalk.yellow(" [RISKY]") : "";
143
+ console.log(`${chalk.bold(cp.id)}${riskIndicator}`);
144
+ console.log(` ${cp.description}`);
145
+ console.log(chalk.gray(` ${cp.timestamp} (${cp.frameCount} frames)
146
+ `));
147
+ });
148
+ } else {
149
+ console.log(chalk.gray("No checkpoints found"));
150
+ }
151
+ } else {
152
+ console.log(chalk.red("\u2717"), result.message);
153
+ }
154
+ await context.database.disconnect();
155
+ } catch (error) {
156
+ spinner.stop();
157
+ console.error(chalk.red("Error:"), error.message);
158
+ process.exit(1);
159
+ }
160
+ });
161
+ checkpointCmd.command("diff <checkpoint1> <checkpoint2>").description("Show differences between two checkpoints").action(async (checkpoint1, checkpoint2) => {
162
+ const spinner = ora("Comparing checkpoints...").start();
163
+ try {
164
+ const context = await initializeSkillContext();
165
+ const skillsManager = new ClaudeSkillsManager(context);
166
+ const result = await skillsManager.executeSkill("checkpoint", ["diff", checkpoint1, checkpoint2]);
167
+ spinner.stop();
168
+ if (result.success) {
169
+ console.log(chalk.cyan("Checkpoint Diff:\n"));
170
+ if (result.data) {
171
+ console.log(` Time difference: ${result.data.timeDiff}`);
172
+ console.log(` Frame difference: ${result.data.framesDiff}`);
173
+ console.log(` New frames: ${result.data.newFrames}`);
174
+ console.log(` Removed frames: ${result.data.removedFrames}`);
175
+ console.log(` Modified frames: ${result.data.modifiedFrames}`);
176
+ }
177
+ } else {
178
+ console.log(chalk.red("\u2717"), result.message);
179
+ }
180
+ await context.database.disconnect();
181
+ } catch (error) {
182
+ spinner.stop();
183
+ console.error(chalk.red("Error:"), error.message);
184
+ process.exit(1);
185
+ }
186
+ });
187
+ skillsCmd.command("dig <query>").description("Deep historical context retrieval").option("-d, --depth <depth>", "Search depth (e.g., 30days, 6months, all)", "30days").option("--patterns", "Extract patterns from results").option("--decisions", "Extract key decisions").option("--timeline", "Generate activity timeline").action(async (query, options) => {
188
+ const spinner = ora("Digging through context...").start();
189
+ try {
190
+ const context = await initializeSkillContext();
191
+ const skillsManager = new ClaudeSkillsManager(context);
192
+ const result = await skillsManager.executeSkill("dig", [query], {
193
+ depth: options.depth,
194
+ patterns: options.patterns,
195
+ decisions: options.decisions,
196
+ timeline: options.timeline
197
+ });
198
+ spinner.stop();
199
+ if (result.success) {
200
+ console.log(chalk.green("\u2713"), result.message);
201
+ if (result.data) {
202
+ console.log(chalk.cyan(`
203
+ Searched ${result.data.timeRange.from} to ${result.data.timeRange.to}`));
204
+ if (result.data.summary) {
205
+ console.log("\n" + result.data.summary);
206
+ } else {
207
+ if (result.data.topResults?.length > 0) {
208
+ console.log(chalk.cyan("\nTop Results:"));
209
+ result.data.topResults.forEach((r) => {
210
+ console.log(` ${chalk.yellow(`[${r.score.toFixed(2)}]`)} ${r.summary}`);
211
+ });
212
+ }
213
+ if (result.data.patterns?.length > 0) {
214
+ console.log(chalk.cyan("\nDetected Patterns:"));
215
+ result.data.patterns.forEach((p) => {
216
+ console.log(` ${p.name}: ${p.count} occurrences`);
217
+ });
218
+ }
219
+ if (result.data.decisions?.length > 0) {
220
+ console.log(chalk.cyan("\nKey Decisions:"));
221
+ result.data.decisions.slice(0, 5).forEach((d) => {
222
+ console.log(` ${chalk.gray(new Date(d.timestamp).toLocaleDateString())}: ${d.decision}`);
223
+ });
224
+ }
225
+ if (result.data.timeline?.length > 0) {
226
+ console.log(chalk.cyan("\nActivity Timeline:"));
227
+ result.data.timeline.slice(0, 5).forEach((t) => {
228
+ console.log(` ${t.date}: ${t.itemCount} activities`);
229
+ });
230
+ }
231
+ }
232
+ }
233
+ } else {
234
+ console.log(chalk.red("\u2717"), result.message);
235
+ }
236
+ await context.database.disconnect();
237
+ } catch (error) {
238
+ spinner.stop();
239
+ console.error(chalk.red("Error:"), error.message);
240
+ process.exit(1);
241
+ }
242
+ });
243
+ skillsCmd.command("help [skill]").description("Show help for a specific skill").action(async (skill) => {
244
+ const context = await initializeSkillContext();
245
+ const skillsManager = new ClaudeSkillsManager(context);
246
+ if (skill) {
247
+ console.log(skillsManager.getSkillHelp(skill));
248
+ } else {
249
+ console.log(chalk.cyan("Available Claude Skills:\n"));
250
+ console.log(" handoff - Streamline frame handoffs between team members");
251
+ console.log(" checkpoint - Create and manage recovery points");
252
+ console.log(" dig - Deep historical context retrieval\n");
253
+ console.log('Use "stackmemory skills help <skill>" for detailed help on each skill');
254
+ }
255
+ await context.database.disconnect();
256
+ });
257
+ return skillsCmd;
258
+ }
259
+ export {
260
+ createSkillsCommand
261
+ };
262
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/cli/commands/skills.ts"],
4
+ "sourcesContent": ["#!/usr/bin/env node\n/**\n * Claude Skills CLI Commands\n * Integrates Claude skills into the stackmemory CLI\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { ClaudeSkillsManager, type SkillContext } from '../../skills/claude-skills.js';\nimport { DualStackManager } from '../../core/context/dual-stack-manager.js';\nimport { FrameHandoffManager } from '../../core/context/frame-handoff-manager.js';\nimport { ContextRetriever } from '../../core/retrieval/context-retriever.js';\nimport { SQLiteAdapter } from '../../core/database/sqlite-adapter.js';\nimport { ConfigManager } from '../../core/config/config-manager.js';\nimport * as path from 'path';\nimport * as os from 'os';\n\nasync function initializeSkillContext(): Promise<SkillContext> {\n const config = ConfigManager.getInstance();\n const projectId = config.get('project.id');\n const userId = config.get('user.id') || process.env.USER || 'default';\n \n const dbPath = path.join(\n os.homedir(),\n '.stackmemory',\n 'data',\n projectId,\n 'stackmemory.db'\n );\n\n const database = new SQLiteAdapter(projectId, { dbPath });\n await database.connect();\n\n const dualStackManager = new DualStackManager(database, projectId, userId);\n const handoffManager = new FrameHandoffManager(dualStackManager);\n const contextRetriever = new ContextRetriever(database);\n\n return {\n projectId,\n userId,\n dualStackManager,\n handoffManager,\n contextRetriever,\n database,\n };\n}\n\nexport function createSkillsCommand(): Command {\n const skillsCmd = new Command('skills')\n .description('Execute Claude skills for enhanced workflow');\n\n // Handoff skill command\n skillsCmd\n .command('handoff <targetUser> <message>')\n .description('Streamline frame handoffs between team members')\n .option('-p, --priority <level>', 'Set priority (low, medium, high, critical)', 'medium')\n .option('-f, --frames <frames...>', 'Specific frames to handoff')\n .option('--no-auto-detect', 'Disable auto-detection of frames')\n .action(async (targetUser, message, options) => {\n const spinner = ora('Initiating handoff...').start();\n \n try {\n const context = await initializeSkillContext();\n const skillsManager = new ClaudeSkillsManager(context);\n \n const result = await skillsManager.executeSkill('handoff', [targetUser, message], {\n priority: options.priority,\n frames: options.frames,\n autoDetect: options.autoDetect !== false,\n });\n\n spinner.stop();\n\n if (result.success) {\n console.log(chalk.green('\u2713'), result.message);\n if (result.data) {\n console.log(chalk.cyan('\\nHandoff Details:'));\n console.log(` ID: ${result.data.handoffId}`);\n console.log(` Frames: ${result.data.frameCount}`);\n console.log(` Priority: ${result.data.priority}`);\n if (result.data.actionItems?.length > 0) {\n console.log(chalk.yellow('\\n Action Items:'));\n result.data.actionItems.forEach(item => {\n console.log(` \u2022 ${item}`);\n });\n }\n }\n } else {\n console.log(chalk.red('\u2717'), result.message);\n }\n\n await context.database.disconnect();\n } catch (error) {\n spinner.stop();\n console.error(chalk.red('Error:'), error.message);\n process.exit(1);\n }\n });\n\n // Checkpoint skill commands\n const checkpointCmd = skillsCmd.command('checkpoint')\n .description('Create and manage recovery points');\n\n checkpointCmd\n .command('create <description>')\n .description('Create a new checkpoint')\n .option('--files <files...>', 'Include specific files in checkpoint')\n .option('--auto-detect-risky', 'Auto-detect risky operations')\n .action(async (description, options) => {\n const spinner = ora('Creating checkpoint...').start();\n \n try {\n const context = await initializeSkillContext();\n const skillsManager = new ClaudeSkillsManager(context);\n \n const result = await skillsManager.executeSkill('checkpoint', ['create', description], {\n includeFiles: options.files,\n autoDetectRisky: options.autoDetectRisky,\n });\n\n spinner.stop();\n\n if (result.success) {\n console.log(chalk.green('\u2713'), result.message);\n if (result.data) {\n console.log(chalk.cyan('\\nCheckpoint Info:'));\n console.log(` ID: ${result.data.checkpointId}`);\n console.log(` Time: ${result.data.timestamp}`);\n console.log(` Frames: ${result.data.frameCount}`);\n }\n } else {\n console.log(chalk.red('\u2717'), result.message);\n }\n\n await context.database.disconnect();\n } catch (error) {\n spinner.stop();\n console.error(chalk.red('Error:'), error.message);\n process.exit(1);\n }\n });\n\n checkpointCmd\n .command('restore <checkpointId>')\n .description('Restore from a checkpoint')\n .action(async (checkpointId) => {\n const spinner = ora('Restoring checkpoint...').start();\n \n try {\n const context = await initializeSkillContext();\n const skillsManager = new ClaudeSkillsManager(context);\n \n const result = await skillsManager.executeSkill('checkpoint', ['restore', checkpointId]);\n\n spinner.stop();\n\n if (result.success) {\n console.log(chalk.green('\u2713'), result.message);\n if (result.data) {\n console.log(chalk.cyan('\\nRestored:'));\n console.log(` Frames: ${result.data.frameCount}`);\n console.log(` Files: ${result.data.filesRestored}`);\n }\n } else {\n console.log(chalk.red('\u2717'), result.message);\n }\n\n await context.database.disconnect();\n } catch (error) {\n spinner.stop();\n console.error(chalk.red('Error:'), error.message);\n process.exit(1);\n }\n });\n\n checkpointCmd\n .command('list')\n .description('List available checkpoints')\n .option('-l, --limit <number>', 'Limit number of results', '10')\n .option('-s, --since <date>', 'Show checkpoints since date')\n .action(async (options) => {\n const spinner = ora('Loading checkpoints...').start();\n \n try {\n const context = await initializeSkillContext();\n const skillsManager = new ClaudeSkillsManager(context);\n \n const result = await skillsManager.executeSkill('checkpoint', ['list'], {\n limit: parseInt(options.limit),\n since: options.since ? new Date(options.since) : undefined,\n });\n\n spinner.stop();\n\n if (result.success) {\n console.log(chalk.cyan('Available Checkpoints:\\n'));\n if (result.data && result.data.length > 0) {\n result.data.forEach((cp: any) => {\n const riskIndicator = cp.risky ? chalk.yellow(' [RISKY]') : '';\n console.log(`${chalk.bold(cp.id)}${riskIndicator}`);\n console.log(` ${cp.description}`);\n console.log(chalk.gray(` ${cp.timestamp} (${cp.frameCount} frames)\\n`));\n });\n } else {\n console.log(chalk.gray('No checkpoints found'));\n }\n } else {\n console.log(chalk.red('\u2717'), result.message);\n }\n\n await context.database.disconnect();\n } catch (error) {\n spinner.stop();\n console.error(chalk.red('Error:'), error.message);\n process.exit(1);\n }\n });\n\n checkpointCmd\n .command('diff <checkpoint1> <checkpoint2>')\n .description('Show differences between two checkpoints')\n .action(async (checkpoint1, checkpoint2) => {\n const spinner = ora('Comparing checkpoints...').start();\n \n try {\n const context = await initializeSkillContext();\n const skillsManager = new ClaudeSkillsManager(context);\n \n const result = await skillsManager.executeSkill('checkpoint', ['diff', checkpoint1, checkpoint2]);\n\n spinner.stop();\n\n if (result.success) {\n console.log(chalk.cyan('Checkpoint Diff:\\n'));\n if (result.data) {\n console.log(` Time difference: ${result.data.timeDiff}`);\n console.log(` Frame difference: ${result.data.framesDiff}`);\n console.log(` New frames: ${result.data.newFrames}`);\n console.log(` Removed frames: ${result.data.removedFrames}`);\n console.log(` Modified frames: ${result.data.modifiedFrames}`);\n }\n } else {\n console.log(chalk.red('\u2717'), result.message);\n }\n\n await context.database.disconnect();\n } catch (error) {\n spinner.stop();\n console.error(chalk.red('Error:'), error.message);\n process.exit(1);\n }\n });\n\n // Context Archaeologist skill command\n skillsCmd\n .command('dig <query>')\n .description('Deep historical context retrieval')\n .option('-d, --depth <depth>', 'Search depth (e.g., 30days, 6months, all)', '30days')\n .option('--patterns', 'Extract patterns from results')\n .option('--decisions', 'Extract key decisions')\n .option('--timeline', 'Generate activity timeline')\n .action(async (query, options) => {\n const spinner = ora('Digging through context...').start();\n \n try {\n const context = await initializeSkillContext();\n const skillsManager = new ClaudeSkillsManager(context);\n \n const result = await skillsManager.executeSkill('dig', [query], {\n depth: options.depth,\n patterns: options.patterns,\n decisions: options.decisions,\n timeline: options.timeline,\n });\n\n spinner.stop();\n\n if (result.success) {\n console.log(chalk.green('\u2713'), result.message);\n \n if (result.data) {\n console.log(chalk.cyan(`\\nSearched ${result.data.timeRange.from} to ${result.data.timeRange.to}`));\n \n if (result.data.summary) {\n console.log('\\n' + result.data.summary);\n } else {\n // Display top results\n if (result.data.topResults?.length > 0) {\n console.log(chalk.cyan('\\nTop Results:'));\n result.data.topResults.forEach((r: any) => {\n console.log(` ${chalk.yellow(`[${r.score.toFixed(2)}]`)} ${r.summary}`);\n });\n }\n\n // Display patterns if found\n if (result.data.patterns?.length > 0) {\n console.log(chalk.cyan('\\nDetected Patterns:'));\n result.data.patterns.forEach((p: any) => {\n console.log(` ${p.name}: ${p.count} occurrences`);\n });\n }\n\n // Display decisions if found\n if (result.data.decisions?.length > 0) {\n console.log(chalk.cyan('\\nKey Decisions:'));\n result.data.decisions.slice(0, 5).forEach((d: any) => {\n console.log(` ${chalk.gray(new Date(d.timestamp).toLocaleDateString())}: ${d.decision}`);\n });\n }\n\n // Display timeline if generated\n if (result.data.timeline?.length > 0) {\n console.log(chalk.cyan('\\nActivity Timeline:'));\n result.data.timeline.slice(0, 5).forEach((t: any) => {\n console.log(` ${t.date}: ${t.itemCount} activities`);\n });\n }\n }\n }\n } else {\n console.log(chalk.red('\u2717'), result.message);\n }\n\n await context.database.disconnect();\n } catch (error) {\n spinner.stop();\n console.error(chalk.red('Error:'), error.message);\n process.exit(1);\n }\n });\n\n // Help command for skills\n skillsCmd\n .command('help [skill]')\n .description('Show help for a specific skill')\n .action(async (skill) => {\n const context = await initializeSkillContext();\n const skillsManager = new ClaudeSkillsManager(context);\n \n if (skill) {\n console.log(skillsManager.getSkillHelp(skill));\n } else {\n console.log(chalk.cyan('Available Claude Skills:\\n'));\n console.log(' handoff - Streamline frame handoffs between team members');\n console.log(' checkpoint - Create and manage recovery points');\n console.log(' dig - Deep historical context retrieval\\n');\n console.log('Use \"stackmemory skills help <skill>\" for detailed help on each skill');\n }\n \n await context.database.disconnect();\n });\n\n return skillsCmd;\n}"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/dist/cli/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+ process.env.STACKMEMORY_CLI = "true";
2
3
  import { program } from "commander";
3
4
  import { logger } from "../core/monitoring/logger.js";
4
5
  import { FrameManager } from "../core/context/frame-manager.js";
@@ -27,6 +28,8 @@ import { registerLinearTestCommand } from "./commands/linear-test.js";
27
28
  import { registerLinearListCommand } from "./commands/linear-list.js";
28
29
  import { registerLinearMigrateCommand } from "./commands/linear-migrate.js";
29
30
  import { registerLinearCreateCommand } from "./commands/linear-create.js";
31
+ import { createChromaDBCommand } from "./commands/chromadb.js";
32
+ import { createInfiniteStorageCommand } from "./commands/infinite-storage.js";
30
33
  import { createSessionCommands } from "./commands/session.js";
31
34
  import { registerWorktreeCommands } from "./commands/worktree.js";
32
35
  import { registerOnboardingCommand } from "./commands/onboard.js";
@@ -39,6 +42,7 @@ import { createConfigCommand } from "./commands/config.js";
39
42
  import { createAgentCommand } from "./commands/agent.js";
40
43
  import { createHandoffCommand } from "./commands/handoff.js";
41
44
  import { createStorageCommand } from "./commands/storage.js";
45
+ import { createSkillsCommand } from "./commands/skills.js";
42
46
  import clearCommand from "./commands/clear.js";
43
47
  import createWorkflowCommand from "./commands/workflow.js";
44
48
  import monitorCommand from "./commands/monitor.js";
@@ -970,6 +974,8 @@ registerLinearTestCommand(program);
970
974
  registerLinearListCommand(program);
971
975
  registerLinearMigrateCommand(program);
972
976
  registerLinearCreateCommand(program);
977
+ program.addCommand(createChromaDBCommand());
978
+ program.addCommand(createInfiniteStorageCommand());
973
979
  program.addCommand(createSessionCommands());
974
980
  program.addCommand(webhookCommand());
975
981
  program.addCommand(createTaskCommands());
@@ -980,6 +986,7 @@ program.addCommand(createConfigCommand());
980
986
  program.addCommand(createAgentCommand());
981
987
  program.addCommand(createHandoffCommand());
982
988
  program.addCommand(createStorageCommand());
989
+ program.addCommand(createSkillsCommand());
983
990
  program.addCommand(clearCommand);
984
991
  program.addCommand(createWorkflowCommand());
985
992
  program.addCommand(monitorCommand);