@stackmemoryai/stackmemory 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +317 -0
  2. package/dist/attention-scoring/src/attention-tracker.d.ts +79 -0
  3. package/dist/attention-scoring/src/attention-tracker.d.ts.map +1 -0
  4. package/dist/attention-scoring/src/attention-tracker.js +488 -0
  5. package/dist/attention-scoring/src/attention-tracker.js.map +1 -0
  6. package/dist/attention-scoring/src/mcp-integration.d.ts +56 -0
  7. package/dist/attention-scoring/src/mcp-integration.d.ts.map +1 -0
  8. package/dist/attention-scoring/src/mcp-integration.js +369 -0
  9. package/dist/attention-scoring/src/mcp-integration.js.map +1 -0
  10. package/dist/p2p-sync/src/p2p-sync.d.ts +81 -0
  11. package/dist/p2p-sync/src/p2p-sync.d.ts.map +1 -0
  12. package/dist/p2p-sync/src/p2p-sync.js +457 -0
  13. package/dist/p2p-sync/src/p2p-sync.js.map +1 -0
  14. package/dist/p2p-sync/src/team-context-sync.d.ts +99 -0
  15. package/dist/p2p-sync/src/team-context-sync.d.ts.map +1 -0
  16. package/dist/p2p-sync/src/team-context-sync.js +491 -0
  17. package/dist/p2p-sync/src/team-context-sync.js.map +1 -0
  18. package/dist/scripts/initialize.d.ts +6 -0
  19. package/dist/scripts/initialize.d.ts.map +1 -0
  20. package/dist/scripts/initialize.js +93 -0
  21. package/dist/scripts/initialize.js.map +1 -0
  22. package/dist/scripts/status.d.ts +6 -0
  23. package/dist/scripts/status.d.ts.map +1 -0
  24. package/dist/scripts/status.js +87 -0
  25. package/dist/scripts/status.js.map +1 -0
  26. package/dist/src/cli.d.ts +7 -0
  27. package/dist/src/cli.d.ts.map +1 -0
  28. package/dist/src/cli.js +73 -0
  29. package/dist/src/cli.js.map +1 -0
  30. package/dist/src/error-handler.d.ts +42 -0
  31. package/dist/src/error-handler.d.ts.map +1 -0
  32. package/dist/src/error-handler.js +155 -0
  33. package/dist/src/error-handler.js.map +1 -0
  34. package/dist/src/frame-manager.d.ts +106 -0
  35. package/dist/src/frame-manager.d.ts.map +1 -0
  36. package/dist/src/frame-manager.js +361 -0
  37. package/dist/src/frame-manager.js.map +1 -0
  38. package/dist/src/index.d.ts +21 -0
  39. package/dist/src/index.d.ts.map +1 -0
  40. package/dist/src/index.js +9 -0
  41. package/dist/src/index.js.map +1 -0
  42. package/dist/src/logger.d.ts +24 -0
  43. package/dist/src/logger.d.ts.map +1 -0
  44. package/dist/src/logger.js +120 -0
  45. package/dist/src/logger.js.map +1 -0
  46. package/dist/src/mcp-server.d.ts +32 -0
  47. package/dist/src/mcp-server.d.ts.map +1 -0
  48. package/dist/src/mcp-server.js +441 -0
  49. package/dist/src/mcp-server.js.map +1 -0
  50. package/package.json +69 -0
@@ -0,0 +1,491 @@
1
+ /**
2
+ * Team Shared Context Management
3
+ *
4
+ * Per-project shared context that syncs across team members
5
+ * Optimized for LLM context windows and collaborative AI coding
6
+ */
7
+ import { P2PSync } from './p2p-sync';
8
+ import Database from 'better-sqlite3';
9
+ import { v4 as uuidv4 } from 'uuid';
10
+ import { createHash } from 'crypto';
11
+ // ============================================
12
+ // Team Context Manager
13
+ // ============================================
14
+ export class TeamContextManager {
15
+ p2pSync;
16
+ db;
17
+ projectId;
18
+ teamId;
19
+ userId;
20
+ // Context layers
21
+ sharedContext;
22
+ personalContext;
23
+ activeFrames = new Map();
24
+ constructor(config) {
25
+ this.projectId = config.projectId;
26
+ this.teamId = config.teamId;
27
+ this.userId = config.userId;
28
+ this.db = new Database(config.dbPath || `.stackmemory/${this.projectId}/context.db`);
29
+ this.initDB();
30
+ // Initialize P2P sync for team
31
+ this.p2pSync = new P2PSync({
32
+ userId: this.userId,
33
+ teamId: this.teamId,
34
+ signalingServer: config.signalingServer || 'wss://signal.stackmemory.dev',
35
+ dbPath: `.stackmemory/${this.projectId}/sync.db`
36
+ });
37
+ this.sharedContext = new SharedContext(this.db, this.p2pSync);
38
+ this.personalContext = new PersonalContext(this.db);
39
+ this.setupSyncHandlers();
40
+ }
41
+ // ============================================
42
+ // Database Schema
43
+ // ============================================
44
+ initDB() {
45
+ this.db.exec(`
46
+ -- Shared context visible to all team members
47
+ CREATE TABLE IF NOT EXISTS shared_context (
48
+ context_id TEXT PRIMARY KEY,
49
+ project_id TEXT NOT NULL,
50
+ type TEXT NOT NULL, -- 'decision', 'constraint', 'architecture', 'learning'
51
+ content TEXT NOT NULL,
52
+ importance REAL DEFAULT 0.5,
53
+ author_id TEXT NOT NULL,
54
+ created_at INTEGER DEFAULT (unixepoch()),
55
+ updated_at INTEGER DEFAULT (unixepoch()),
56
+ vector_clock TEXT NOT NULL,
57
+ active BOOLEAN DEFAULT TRUE
58
+ );
59
+
60
+ -- Personal context (not shared)
61
+ CREATE TABLE IF NOT EXISTS personal_context (
62
+ context_id TEXT PRIMARY KEY,
63
+ user_id TEXT NOT NULL,
64
+ project_id TEXT NOT NULL,
65
+ type TEXT NOT NULL,
66
+ content TEXT NOT NULL,
67
+ importance REAL DEFAULT 0.5,
68
+ created_at INTEGER DEFAULT (unixepoch())
69
+ );
70
+
71
+ -- Active working frames (ephemeral, shared during collaboration)
72
+ CREATE TABLE IF NOT EXISTS active_frames (
73
+ frame_id TEXT PRIMARY KEY,
74
+ project_id TEXT NOT NULL,
75
+ user_id TEXT NOT NULL,
76
+ task TEXT NOT NULL,
77
+ status TEXT DEFAULT 'active', -- 'active', 'paused', 'completed'
78
+ context_snapshot TEXT, -- Compressed context at frame creation
79
+ started_at INTEGER DEFAULT (unixepoch()),
80
+ last_activity INTEGER DEFAULT (unixepoch())
81
+ );
82
+
83
+ -- Project-level aggregated knowledge
84
+ CREATE TABLE IF NOT EXISTS project_knowledge (
85
+ knowledge_id TEXT PRIMARY KEY,
86
+ project_id TEXT NOT NULL,
87
+ category TEXT NOT NULL, -- 'patterns', 'gotchas', 'conventions', 'dependencies'
88
+ title TEXT NOT NULL,
89
+ content TEXT NOT NULL,
90
+ confidence REAL DEFAULT 0.5,
91
+ usage_count INTEGER DEFAULT 0,
92
+ last_used INTEGER DEFAULT (unixepoch())
93
+ );
94
+
95
+ -- Context importance decay tracking
96
+ CREATE TABLE IF NOT EXISTS context_decay (
97
+ context_id TEXT PRIMARY KEY,
98
+ last_accessed INTEGER DEFAULT (unixepoch()),
99
+ access_count INTEGER DEFAULT 1,
100
+ decay_rate REAL DEFAULT 0.1
101
+ );
102
+
103
+ -- Indexes for performance
104
+ CREATE INDEX IF NOT EXISTS idx_shared_project ON shared_context(project_id, importance DESC);
105
+ CREATE INDEX IF NOT EXISTS idx_shared_type ON shared_context(type, active);
106
+ CREATE INDEX IF NOT EXISTS idx_personal_user ON personal_context(user_id, project_id);
107
+ CREATE INDEX IF NOT EXISTS idx_frames_active ON active_frames(project_id, status);
108
+ CREATE INDEX IF NOT EXISTS idx_knowledge_category ON project_knowledge(project_id, category);
109
+ `);
110
+ }
111
+ // ============================================
112
+ // Context Management
113
+ // ============================================
114
+ /**
115
+ * Add a decision or constraint that should be shared with the team
116
+ */
117
+ addSharedContext(type, content, importance = 0.5) {
118
+ const contextId = this.generateContextId(content);
119
+ // Check if similar context exists
120
+ const existing = this.findSimilarContext(content);
121
+ if (existing) {
122
+ this.reinforceContext(existing.context_id);
123
+ return existing.context_id;
124
+ }
125
+ // Add to shared context
126
+ const vectorClock = this.p2pSync.incrementClock();
127
+ this.db.prepare(`
128
+ INSERT INTO shared_context
129
+ (context_id, project_id, type, content, importance, author_id, vector_clock)
130
+ VALUES (?, ?, ?, ?, ?, ?, ?)
131
+ `).run(contextId, this.projectId, type, content, importance, this.userId, JSON.stringify(vectorClock));
132
+ // Broadcast to team
133
+ this.p2pSync.createFrame({
134
+ id: contextId,
135
+ type: 'shared_context',
136
+ content: {
137
+ type,
138
+ content,
139
+ importance,
140
+ author_id: this.userId
141
+ }
142
+ });
143
+ return contextId;
144
+ }
145
+ /**
146
+ * Add personal context (not shared with team)
147
+ */
148
+ addPersonalContext(type, content) {
149
+ const contextId = this.generateContextId(content);
150
+ this.db.prepare(`
151
+ INSERT INTO personal_context
152
+ (context_id, user_id, project_id, type, content)
153
+ VALUES (?, ?, ?, ?, ?)
154
+ `).run(contextId, this.userId, this.projectId, type, content);
155
+ return contextId;
156
+ }
157
+ /**
158
+ * Start a new working frame (task/feature/debug session)
159
+ */
160
+ startFrame(task) {
161
+ const frameId = uuidv4();
162
+ // Capture current context snapshot
163
+ const snapshot = this.captureContextSnapshot();
164
+ this.db.prepare(`
165
+ INSERT INTO active_frames
166
+ (frame_id, project_id, user_id, task, context_snapshot)
167
+ VALUES (?, ?, ?, ?, ?)
168
+ `).run(frameId, this.projectId, this.userId, task, JSON.stringify(snapshot));
169
+ // Share frame with team (they see you're working on this)
170
+ this.p2pSync.createFrame({
171
+ id: frameId,
172
+ type: 'active_frame',
173
+ content: {
174
+ task,
175
+ user_id: this.userId,
176
+ started_at: Date.now()
177
+ }
178
+ });
179
+ this.activeFrames.set(frameId, {
180
+ id: frameId,
181
+ task,
182
+ startedAt: Date.now(),
183
+ context: snapshot
184
+ });
185
+ return frameId;
186
+ }
187
+ /**
188
+ * Complete a frame and extract learnings
189
+ */
190
+ completeFrame(frameId, summary, learnings) {
191
+ const frame = this.activeFrames.get(frameId);
192
+ if (!frame)
193
+ return;
194
+ // Update frame status
195
+ this.db.prepare(`
196
+ UPDATE active_frames
197
+ SET status = 'completed', last_activity = unixepoch()
198
+ WHERE frame_id = ?
199
+ `).run(frameId);
200
+ // Extract and share important learnings
201
+ learnings.forEach(learning => {
202
+ this.addSharedContext('learning', learning, 0.7);
203
+ });
204
+ // Add to project knowledge if significant
205
+ if (learnings.length > 0) {
206
+ this.addProjectKnowledge('patterns', frame.task, summary);
207
+ }
208
+ // Notify team of completion
209
+ this.p2pSync.updateFrame(frameId, {
210
+ content: {
211
+ ...this.p2pSync.getFrame(frameId)?.content,
212
+ status: 'completed',
213
+ summary,
214
+ learnings,
215
+ completed_at: Date.now()
216
+ }
217
+ });
218
+ this.activeFrames.delete(frameId);
219
+ }
220
+ // ============================================
221
+ // Context Assembly for LLM
222
+ // ============================================
223
+ /**
224
+ * Get optimized context bundle for LLM
225
+ */
226
+ async getContextBundle(intent, tokenBudget = 8000) {
227
+ const bundle = {
228
+ shared: [],
229
+ personal: [],
230
+ active: [],
231
+ knowledge: [],
232
+ stats: {
233
+ tokenCount: 0,
234
+ sources: 0
235
+ }
236
+ };
237
+ let tokensUsed = 0;
238
+ const maxTokens = tokenBudget;
239
+ // 1. Critical shared context (30% budget)
240
+ const criticalShared = this.db.prepare(`
241
+ SELECT * FROM shared_context
242
+ WHERE project_id = ? AND active = TRUE
243
+ ORDER BY importance DESC, updated_at DESC
244
+ LIMIT 20
245
+ `).all(this.projectId);
246
+ for (const ctx of criticalShared) {
247
+ const tokens = this.estimateTokens(ctx.content);
248
+ if (tokensUsed + tokens > maxTokens * 0.3)
249
+ break;
250
+ bundle.shared.push({
251
+ type: ctx.type,
252
+ content: ctx.content,
253
+ author: ctx.author_id,
254
+ importance: ctx.importance
255
+ });
256
+ tokensUsed += tokens;
257
+ }
258
+ // 2. Active team frames (20% budget)
259
+ const activeFrames = this.db.prepare(`
260
+ SELECT * FROM active_frames
261
+ WHERE project_id = ? AND status = 'active'
262
+ ORDER BY last_activity DESC
263
+ LIMIT 10
264
+ `).all(this.projectId);
265
+ for (const frame of activeFrames) {
266
+ const tokens = this.estimateTokens(frame.task);
267
+ if (tokensUsed + tokens > maxTokens * 0.5)
268
+ break;
269
+ bundle.active.push({
270
+ user: frame.user_id,
271
+ task: frame.task,
272
+ duration: Date.now() - frame.started_at * 1000
273
+ });
274
+ tokensUsed += tokens;
275
+ }
276
+ // 3. Relevant project knowledge (30% budget)
277
+ const knowledge = this.db.prepare(`
278
+ SELECT * FROM project_knowledge
279
+ WHERE project_id = ?
280
+ ORDER BY confidence DESC, usage_count DESC
281
+ LIMIT 15
282
+ `).all(this.projectId);
283
+ for (const k of knowledge) {
284
+ const tokens = this.estimateTokens(k.content);
285
+ if (tokensUsed + tokens > maxTokens * 0.8)
286
+ break;
287
+ bundle.knowledge.push({
288
+ category: k.category,
289
+ title: k.title,
290
+ content: k.content,
291
+ confidence: k.confidence
292
+ });
293
+ tokensUsed += tokens;
294
+ }
295
+ // 4. Personal context (remaining budget)
296
+ const personal = this.db.prepare(`
297
+ SELECT * FROM personal_context
298
+ WHERE user_id = ? AND project_id = ?
299
+ ORDER BY created_at DESC
300
+ LIMIT 10
301
+ `).all(this.userId, this.projectId);
302
+ for (const p of personal) {
303
+ const tokens = this.estimateTokens(p.content);
304
+ if (tokensUsed + tokens > maxTokens * 0.95)
305
+ break;
306
+ bundle.personal.push({
307
+ type: p.type,
308
+ content: p.content
309
+ });
310
+ tokensUsed += tokens;
311
+ }
312
+ bundle.stats.tokenCount = tokensUsed;
313
+ bundle.stats.sources = bundle.shared.length + bundle.personal.length +
314
+ bundle.active.length + bundle.knowledge.length;
315
+ return bundle;
316
+ }
317
+ // ============================================
318
+ // Knowledge Extraction & Learning
319
+ // ============================================
320
+ addProjectKnowledge(category, title, content) {
321
+ const knowledgeId = this.generateContextId(content);
322
+ this.db.prepare(`
323
+ INSERT OR REPLACE INTO project_knowledge
324
+ (knowledge_id, project_id, category, title, content, confidence)
325
+ VALUES (?, ?, ?, ?, ?, ?)
326
+ `).run(knowledgeId, this.projectId, category, title, content, 0.5);
327
+ // Share significant knowledge with team
328
+ this.p2pSync.createFrame({
329
+ id: knowledgeId,
330
+ type: 'project_knowledge',
331
+ content: {
332
+ category,
333
+ title,
334
+ content
335
+ }
336
+ });
337
+ }
338
+ findSimilarContext(content) {
339
+ // Simple similarity check - in production use embeddings
340
+ const words = content.toLowerCase().split(/\s+/);
341
+ const results = this.db.prepare(`
342
+ SELECT * FROM shared_context
343
+ WHERE project_id = ? AND active = TRUE
344
+ `).all(this.projectId);
345
+ for (const ctx of results) {
346
+ const ctxWords = ctx.content.toLowerCase().split(/\s+/);
347
+ const overlap = words.filter(w => ctxWords.includes(w)).length;
348
+ if (overlap / words.length > 0.7) {
349
+ return ctx;
350
+ }
351
+ }
352
+ return null;
353
+ }
354
+ reinforceContext(contextId) {
355
+ // Increase importance when context is referenced again
356
+ this.db.prepare(`
357
+ UPDATE shared_context
358
+ SET importance = MIN(1.0, importance + 0.1),
359
+ updated_at = unixepoch()
360
+ WHERE context_id = ?
361
+ `).run(contextId);
362
+ // Update decay tracking
363
+ this.db.prepare(`
364
+ INSERT INTO context_decay (context_id, last_accessed, access_count)
365
+ VALUES (?, unixepoch(), 1)
366
+ ON CONFLICT(context_id) DO UPDATE SET
367
+ last_accessed = unixepoch(),
368
+ access_count = access_count + 1
369
+ `).run(contextId);
370
+ }
371
+ // ============================================
372
+ // Sync Handlers
373
+ // ============================================
374
+ setupSyncHandlers() {
375
+ // Listen for shared context updates from team
376
+ setInterval(() => {
377
+ this.syncSharedContext();
378
+ }, 5000);
379
+ // Decay old context importance
380
+ setInterval(() => {
381
+ this.decayOldContext();
382
+ }, 3600000); // Every hour
383
+ }
384
+ async syncSharedContext() {
385
+ // P2P sync handles the actual synchronization
386
+ // This method processes received updates
387
+ const stats = await this.p2pSync.sync();
388
+ console.log(`Synced with ${stats.connectedPeers} peers`);
389
+ }
390
+ decayOldContext() {
391
+ // Reduce importance of unused context
392
+ this.db.prepare(`
393
+ UPDATE shared_context
394
+ SET importance = importance * 0.95
395
+ WHERE project_id = ?
396
+ AND updated_at < unixepoch() - 86400 * 7 -- 7 days old
397
+ AND importance > 0.1
398
+ `).run(this.projectId);
399
+ }
400
+ // ============================================
401
+ // Utilities
402
+ // ============================================
403
+ generateContextId(content) {
404
+ return createHash('sha256')
405
+ .update(content)
406
+ .digest('hex')
407
+ .substring(0, 12);
408
+ }
409
+ estimateTokens(text) {
410
+ // Rough estimate: 1 token per 4 characters
411
+ return Math.ceil(text.length / 4);
412
+ }
413
+ captureContextSnapshot() {
414
+ const shared = this.db.prepare(`
415
+ SELECT type, content, importance FROM shared_context
416
+ WHERE project_id = ? AND active = TRUE
417
+ ORDER BY importance DESC
418
+ LIMIT 10
419
+ `).all(this.projectId);
420
+ const personal = this.db.prepare(`
421
+ SELECT type, content FROM personal_context
422
+ WHERE user_id = ? AND project_id = ?
423
+ ORDER BY created_at DESC
424
+ LIMIT 5
425
+ `).all(this.userId, this.projectId);
426
+ return {
427
+ timestamp: Date.now(),
428
+ shared: shared,
429
+ personal: personal
430
+ };
431
+ }
432
+ // ============================================
433
+ // Public API
434
+ // ============================================
435
+ getTeamActivity() {
436
+ const activeFrames = this.db.prepare(`
437
+ SELECT user_id, task, started_at FROM active_frames
438
+ WHERE project_id = ? AND status = 'active'
439
+ `).all(this.projectId);
440
+ const recentContext = this.db.prepare(`
441
+ SELECT type, COUNT(*) as count FROM shared_context
442
+ WHERE project_id = ? AND created_at > unixepoch() - 3600
443
+ GROUP BY type
444
+ `).all(this.projectId);
445
+ return {
446
+ activeUsers: [...new Set(activeFrames.map(f => f.user_id))],
447
+ activeFrames: activeFrames.map(f => ({
448
+ user: f.user_id,
449
+ task: f.task,
450
+ duration: Date.now() - f.started_at * 1000
451
+ })),
452
+ recentContext: recentContext
453
+ };
454
+ }
455
+ exportContext() {
456
+ const shared = this.db.prepare(`
457
+ SELECT * FROM shared_context WHERE project_id = ?
458
+ `).all(this.projectId);
459
+ const knowledge = this.db.prepare(`
460
+ SELECT * FROM project_knowledge WHERE project_id = ?
461
+ `).all(this.projectId);
462
+ return JSON.stringify({
463
+ projectId: this.projectId,
464
+ exported: Date.now(),
465
+ sharedContext: shared,
466
+ projectKnowledge: knowledge
467
+ }, null, 2);
468
+ }
469
+ disconnect() {
470
+ this.p2pSync.disconnect();
471
+ this.db.close();
472
+ }
473
+ }
474
+ // ============================================
475
+ // Helper Classes
476
+ // ============================================
477
+ class SharedContext {
478
+ db;
479
+ p2pSync;
480
+ constructor(db, p2pSync) {
481
+ this.db = db;
482
+ this.p2pSync = p2pSync;
483
+ }
484
+ }
485
+ class PersonalContext {
486
+ db;
487
+ constructor(db) {
488
+ this.db = db;
489
+ }
490
+ }
491
+ //# sourceMappingURL=team-context-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-context-sync.js","sourceRoot":"","sources":["../../../p2p-sync/src/team-context-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Initialize StackMemory in the current project
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=initialize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initialize.d.ts","sourceRoot":"","sources":["../../scripts/initialize.ts"],"names":[],"mappings":";AACA;;GAEG"}
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Initialize StackMemory in the current project
4
+ */
5
+ import { existsSync, mkdirSync, writeFileSync } from 'fs';
6
+ import { join } from 'path';
7
+ import { execSync } from 'child_process';
8
+ import chalk from 'chalk';
9
+ const projectRoot = process.cwd();
10
+ console.log(chalk.blue.bold('\nšŸš€ Initializing StackMemory...\n'));
11
+ // 1. Create .stackmemory directory
12
+ const stackDir = join(projectRoot, '.stackmemory');
13
+ if (!existsSync(stackDir)) {
14
+ mkdirSync(stackDir, { recursive: true });
15
+ console.log(chalk.green('āœ“') + ' Created .stackmemory directory');
16
+ }
17
+ else {
18
+ console.log(chalk.yellow('⚠') + ' .stackmemory directory already exists');
19
+ }
20
+ // 2. Add to .gitignore
21
+ const gitignorePath = join(projectRoot, '.gitignore');
22
+ const gitignoreEntry = '\n# StackMemory\n.stackmemory/*.db\n.stackmemory/*.db-*\n';
23
+ if (existsSync(gitignorePath)) {
24
+ const gitignore = require('fs').readFileSync(gitignorePath, 'utf-8');
25
+ if (!gitignore.includes('.stackmemory')) {
26
+ require('fs').appendFileSync(gitignorePath, gitignoreEntry);
27
+ console.log(chalk.green('āœ“') + ' Added .stackmemory to .gitignore');
28
+ }
29
+ }
30
+ else {
31
+ writeFileSync(gitignorePath, gitignoreEntry);
32
+ console.log(chalk.green('āœ“') + ' Created .gitignore with .stackmemory');
33
+ }
34
+ // 3. Create config file
35
+ const configPath = join(stackDir, 'config.json');
36
+ if (!existsSync(configPath)) {
37
+ const config = {
38
+ projectId: projectRoot.split('/').pop(),
39
+ userId: process.env.USER || 'default',
40
+ teamId: 'local',
41
+ initialized: new Date().toISOString()
42
+ };
43
+ writeFileSync(configPath, JSON.stringify(config, null, 2));
44
+ console.log(chalk.green('āœ“') + ' Created config file');
45
+ }
46
+ // 4. Create initial JSONL file
47
+ const jsonlPath = join(stackDir, 'frames.jsonl');
48
+ if (!existsSync(jsonlPath)) {
49
+ const initialFrame = {
50
+ id: 'init_' + Date.now(),
51
+ type: 'system',
52
+ content: 'StackMemory initialized',
53
+ timestamp: Date.now()
54
+ };
55
+ writeFileSync(jsonlPath, JSON.stringify(initialFrame) + '\n');
56
+ console.log(chalk.green('āœ“') + ' Created frames.jsonl');
57
+ }
58
+ // 5. Create MCP config for Claude Code
59
+ const mcpConfigPath = join(process.env.HOME || '~', '.config', 'claude', 'mcp.json');
60
+ console.log(chalk.blue('\nšŸ“ MCP Configuration for Claude Code:\n'));
61
+ const mcpConfig = {
62
+ "mcpServers": {
63
+ "stackmemory": {
64
+ "command": "node",
65
+ "args": [join(projectRoot, "dist", "mcp-server.js")],
66
+ "env": {
67
+ "PROJECT_ROOT": projectRoot
68
+ }
69
+ }
70
+ }
71
+ };
72
+ console.log(chalk.gray('Add this to your Claude Code MCP configuration:'));
73
+ console.log(chalk.gray('(' + mcpConfigPath + ')\n'));
74
+ console.log(chalk.cyan(JSON.stringify(mcpConfig, null, 2)));
75
+ // 6. Build the project
76
+ console.log(chalk.blue('\nšŸ“¦ Building TypeScript files...\n'));
77
+ try {
78
+ execSync('npm run build', { stdio: 'inherit', cwd: projectRoot });
79
+ console.log(chalk.green('āœ“') + ' Build completed');
80
+ }
81
+ catch (e) {
82
+ console.log(chalk.yellow('⚠') + ' Build failed - run npm run build manually');
83
+ }
84
+ console.log(chalk.green.bold('\nāœ… StackMemory initialized successfully!\n'));
85
+ console.log(chalk.gray('Next steps:'));
86
+ console.log(chalk.gray('1. Add the MCP configuration above to Claude Code'));
87
+ console.log(chalk.gray('2. Restart Claude Code'));
88
+ console.log(chalk.gray('3. Start using context tracking!'));
89
+ console.log(chalk.gray('\nUseful commands:'));
90
+ console.log(chalk.cyan(' npm run mcp:dev') + ' - Start MCP server in dev mode');
91
+ console.log(chalk.cyan(' npm run status') + ' - Check StackMemory status');
92
+ console.log(chalk.cyan(' npm run analyze') + ' - Analyze context usage\n');
93
+ //# sourceMappingURL=initialize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initialize.js","sourceRoot":"","sources":["../../scripts/initialize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Check StackMemory status and statistics
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../scripts/status.ts"],"names":[],"mappings":";AACA;;GAEG"}