claude-memory-store 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 (158) hide show
  1. package/README.md +364 -0
  2. package/dist/acknowledgement.d.ts +14 -0
  3. package/dist/acknowledgement.d.ts.map +1 -0
  4. package/dist/acknowledgement.js +55 -0
  5. package/dist/acknowledgement.js.map +1 -0
  6. package/dist/atlas/client.d.ts +9 -0
  7. package/dist/atlas/client.d.ts.map +1 -0
  8. package/dist/atlas/client.js +64 -0
  9. package/dist/atlas/client.js.map +1 -0
  10. package/dist/atlas/embeddings.d.ts +18 -0
  11. package/dist/atlas/embeddings.d.ts.map +1 -0
  12. package/dist/atlas/embeddings.js +56 -0
  13. package/dist/atlas/embeddings.js.map +1 -0
  14. package/dist/atlas/indexes.d.ts +4 -0
  15. package/dist/atlas/indexes.d.ts.map +1 -0
  16. package/dist/atlas/indexes.js +78 -0
  17. package/dist/atlas/indexes.js.map +1 -0
  18. package/dist/atlas/vector.d.ts +17 -0
  19. package/dist/atlas/vector.d.ts.map +1 -0
  20. package/dist/atlas/vector.js +61 -0
  21. package/dist/atlas/vector.js.map +1 -0
  22. package/dist/bin/claude-memory.d.ts +3 -0
  23. package/dist/bin/claude-memory.d.ts.map +1 -0
  24. package/dist/bin/claude-memory.js +648 -0
  25. package/dist/bin/claude-memory.js.map +1 -0
  26. package/dist/bin/mcp-server.d.ts +3 -0
  27. package/dist/bin/mcp-server.d.ts.map +1 -0
  28. package/dist/bin/mcp-server.js +165 -0
  29. package/dist/bin/mcp-server.js.map +1 -0
  30. package/dist/cache/command-cache.d.ts +12 -0
  31. package/dist/cache/command-cache.d.ts.map +1 -0
  32. package/dist/cache/command-cache.js +63 -0
  33. package/dist/cache/command-cache.js.map +1 -0
  34. package/dist/cleanup.d.ts +8 -0
  35. package/dist/cleanup.d.ts.map +1 -0
  36. package/dist/cleanup.js +22 -0
  37. package/dist/cleanup.js.map +1 -0
  38. package/dist/config.d.ts +10 -0
  39. package/dist/config.d.ts.map +1 -0
  40. package/dist/config.js +97 -0
  41. package/dist/config.js.map +1 -0
  42. package/dist/detector.d.ts +20 -0
  43. package/dist/detector.d.ts.map +1 -0
  44. package/dist/detector.js +92 -0
  45. package/dist/detector.js.map +1 -0
  46. package/dist/editor/file-editor.d.ts +7 -0
  47. package/dist/editor/file-editor.d.ts.map +1 -0
  48. package/dist/editor/file-editor.js +73 -0
  49. package/dist/editor/file-editor.js.map +1 -0
  50. package/dist/editor/tui.d.ts +11 -0
  51. package/dist/editor/tui.d.ts.map +1 -0
  52. package/dist/editor/tui.js +75 -0
  53. package/dist/editor/tui.js.map +1 -0
  54. package/dist/hooks/post-tool-use.d.ts +11 -0
  55. package/dist/hooks/post-tool-use.d.ts.map +1 -0
  56. package/dist/hooks/post-tool-use.js +36 -0
  57. package/dist/hooks/post-tool-use.js.map +1 -0
  58. package/dist/hooks/pre-tool-use.d.ts +5 -0
  59. package/dist/hooks/pre-tool-use.d.ts.map +1 -0
  60. package/dist/hooks/pre-tool-use.js +103 -0
  61. package/dist/hooks/pre-tool-use.js.map +1 -0
  62. package/dist/hooks/startup.d.ts +25 -0
  63. package/dist/hooks/startup.d.ts.map +1 -0
  64. package/dist/hooks/startup.js +62 -0
  65. package/dist/hooks/startup.js.map +1 -0
  66. package/dist/hooks/stop.d.ts +39 -0
  67. package/dist/hooks/stop.d.ts.map +1 -0
  68. package/dist/hooks/stop.js +102 -0
  69. package/dist/hooks/stop.js.map +1 -0
  70. package/dist/index.d.ts +35 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +166 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/memory/commands.d.ts +15 -0
  75. package/dist/memory/commands.d.ts.map +1 -0
  76. package/dist/memory/commands.js +55 -0
  77. package/dist/memory/commands.js.map +1 -0
  78. package/dist/memory/developer.d.ts +17 -0
  79. package/dist/memory/developer.d.ts.map +1 -0
  80. package/dist/memory/developer.js +233 -0
  81. package/dist/memory/developer.js.map +1 -0
  82. package/dist/memory/project.d.ts +25 -0
  83. package/dist/memory/project.d.ts.map +1 -0
  84. package/dist/memory/project.js +341 -0
  85. package/dist/memory/project.js.map +1 -0
  86. package/dist/memory/threads.d.ts +10 -0
  87. package/dist/memory/threads.d.ts.map +1 -0
  88. package/dist/memory/threads.js +57 -0
  89. package/dist/memory/threads.js.map +1 -0
  90. package/dist/memory/working.d.ts +16 -0
  91. package/dist/memory/working.d.ts.map +1 -0
  92. package/dist/memory/working.js +80 -0
  93. package/dist/memory/working.js.map +1 -0
  94. package/dist/natural-language/intent.d.ts +4 -0
  95. package/dist/natural-language/intent.d.ts.map +1 -0
  96. package/dist/natural-language/intent.js +169 -0
  97. package/dist/natural-language/intent.js.map +1 -0
  98. package/dist/natural-language/parser.d.ts +5 -0
  99. package/dist/natural-language/parser.d.ts.map +1 -0
  100. package/dist/natural-language/parser.js +63 -0
  101. package/dist/natural-language/parser.js.map +1 -0
  102. package/dist/natural-language/router.d.ts +9 -0
  103. package/dist/natural-language/router.d.ts.map +1 -0
  104. package/dist/natural-language/router.js +171 -0
  105. package/dist/natural-language/router.js.map +1 -0
  106. package/dist/project-id.d.ts +5 -0
  107. package/dist/project-id.d.ts.map +1 -0
  108. package/dist/project-id.js +78 -0
  109. package/dist/project-id.js.map +1 -0
  110. package/dist/slash-commands/edit.d.ts +10 -0
  111. package/dist/slash-commands/edit.d.ts.map +1 -0
  112. package/dist/slash-commands/edit.js +312 -0
  113. package/dist/slash-commands/edit.js.map +1 -0
  114. package/dist/slash-commands/memory.d.ts +3 -0
  115. package/dist/slash-commands/memory.d.ts.map +1 -0
  116. package/dist/slash-commands/memory.js +69 -0
  117. package/dist/slash-commands/memory.js.map +1 -0
  118. package/dist/slash-commands/recall.d.ts +2 -0
  119. package/dist/slash-commands/recall.d.ts.map +1 -0
  120. package/dist/slash-commands/recall.js +81 -0
  121. package/dist/slash-commands/recall.js.map +1 -0
  122. package/dist/slash-commands/remember.d.ts +2 -0
  123. package/dist/slash-commands/remember.d.ts.map +1 -0
  124. package/dist/slash-commands/remember.js +21 -0
  125. package/dist/slash-commands/remember.js.map +1 -0
  126. package/dist/slash-commands/stats.d.ts +2 -0
  127. package/dist/slash-commands/stats.d.ts.map +1 -0
  128. package/dist/slash-commands/stats.js +55 -0
  129. package/dist/slash-commands/stats.js.map +1 -0
  130. package/dist/slash-commands/threads.d.ts +4 -0
  131. package/dist/slash-commands/threads.d.ts.map +1 -0
  132. package/dist/slash-commands/threads.js +36 -0
  133. package/dist/slash-commands/threads.js.map +1 -0
  134. package/dist/startup/conversation.d.ts +17 -0
  135. package/dist/startup/conversation.d.ts.map +1 -0
  136. package/dist/startup/conversation.js +78 -0
  137. package/dist/startup/conversation.js.map +1 -0
  138. package/dist/startup/feature-search.d.ts +9 -0
  139. package/dist/startup/feature-search.d.ts.map +1 -0
  140. package/dist/startup/feature-search.js +62 -0
  141. package/dist/startup/feature-search.js.map +1 -0
  142. package/dist/startup/injector.d.ts +4 -0
  143. package/dist/startup/injector.d.ts.map +1 -0
  144. package/dist/startup/injector.js +190 -0
  145. package/dist/startup/injector.js.map +1 -0
  146. package/dist/summarizer.d.ts +15 -0
  147. package/dist/summarizer.d.ts.map +1 -0
  148. package/dist/summarizer.js +92 -0
  149. package/dist/summarizer.js.map +1 -0
  150. package/dist/types.d.ts +151 -0
  151. package/dist/types.d.ts.map +1 -0
  152. package/dist/types.js +3 -0
  153. package/dist/types.js.map +1 -0
  154. package/dist/utils.d.ts +5 -0
  155. package/dist/utils.d.ts.map +1 -0
  156. package/dist/utils.js +16 -0
  157. package/dist/utils.js.map +1 -0
  158. package/package.json +67 -0
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.threadsCommand = threadsCommand;
4
+ exports.addThreadCommand = addThreadCommand;
5
+ exports.closeThreadCommand = closeThreadCommand;
6
+ const threads_js_1 = require("../memory/threads.js");
7
+ const project_id_js_1 = require("../project-id.js");
8
+ async function threadsCommand() {
9
+ const threads = await (0, threads_js_1.listThreads)();
10
+ if (threads.length === 0) {
11
+ return 'No open threads.';
12
+ }
13
+ const lines = [];
14
+ lines.push(`OPEN THREADS -- ${(0, project_id_js_1.getProjectName)()} (${threads.length})\n`);
15
+ threads.forEach((thread, i) => {
16
+ lines.push((0, threads_js_1.formatThread)(thread, i + 1));
17
+ lines.push('');
18
+ });
19
+ lines.push('(c) Close a thread (a) Add a thread (e) Edit a thread');
20
+ return lines.join('\n');
21
+ }
22
+ async function addThreadCommand(description, context = '') {
23
+ if (!description) {
24
+ return 'Usage: provide a thread description.';
25
+ }
26
+ const thread = await (0, threads_js_1.createThread)(description, context || 'Added via /memory threads');
27
+ return `[MEMORY] Open thread created:\n! ${thread.description} (${thread.status})\n ID: ${thread.id.slice(0, 8)}`;
28
+ }
29
+ async function closeThreadCommand(threadId) {
30
+ const closed = await (0, threads_js_1.resolveThread)(threadId);
31
+ if (closed) {
32
+ return `[MEMORY] Thread closed.`;
33
+ }
34
+ return `[MEMORY] Thread not found: ${threadId}`;
35
+ }
36
+ //# sourceMappingURL=threads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads.js","sourceRoot":"","sources":["../../src/slash-commands/threads.ts"],"names":[],"mappings":";;AAGA,wCAkBC;AAED,4CAOC;AAED,gDAMC;AAtCD,qDAA8F;AAC9F,oDAAkD;AAE3C,KAAK,UAAU,cAAc;IAClC,MAAM,OAAO,GAAG,MAAM,IAAA,wBAAW,GAAE,CAAC;IAEpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAA,8BAAc,GAAE,KAAK,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;IAExE,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC5B,KAAK,CAAC,IAAI,CAAC,IAAA,yBAAY,EAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IAEtE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAEM,KAAK,UAAU,gBAAgB,CAAC,WAAmB,EAAE,UAAkB,EAAE;IAC9E,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,sCAAsC,CAAC;IAChD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAY,EAAC,WAAW,EAAE,OAAO,IAAI,2BAA2B,CAAC,CAAC;IACvF,OAAO,oCAAoC,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,MAAM,YAAY,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACrH,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IACvD,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAa,EAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,yBAAyB,CAAC;IACnC,CAAC;IACD,OAAO,8BAA8B,QAAQ,EAAE,CAAC;AAClD,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { WorkingMemory, ProjectMeta, DeveloperMeta } from '../types.js';
2
+ export interface StartupData {
3
+ projectName: string;
4
+ totalSessions: number;
5
+ lastSession: WorkingMemory | null;
6
+ projectMemory: ProjectMeta | null;
7
+ developerMemory: DeveloperMeta | null;
8
+ archCount: number;
9
+ patternCount: number;
10
+ avoidCount: number;
11
+ openThreadCount: number;
12
+ commandCount: number;
13
+ totalCost: number;
14
+ }
15
+ export declare function gatherStartupData(): Promise<StartupData>;
16
+ export declare function formatStartupBanner(data: StartupData): string;
17
+ //# sourceMappingURL=conversation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/startup/conversation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAiB,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5F,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,aAAa,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,WAAW,GAAG,IAAI,CAAC;IAClC,eAAe,EAAE,aAAa,GAAG,IAAI,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC,CA2B9D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CA2B7D"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gatherStartupData = gatherStartupData;
4
+ exports.formatStartupBanner = formatStartupBanner;
5
+ const working_js_1 = require("../memory/working.js");
6
+ const project_js_1 = require("../memory/project.js");
7
+ const developer_js_1 = require("../memory/developer.js");
8
+ const project_id_js_1 = require("../project-id.js");
9
+ async function gatherStartupData() {
10
+ const [lastSession, projectMemory, developerMemory, architecture, patterns, avoidRules, openThreads, commands] = await Promise.all([
11
+ (0, working_js_1.getLastSession)(),
12
+ (0, project_js_1.getProjectMeta)(),
13
+ (0, developer_js_1.getDeveloperMeta)(),
14
+ (0, project_js_1.getArchitectureDecisions)(),
15
+ (0, project_js_1.getPatterns)(),
16
+ (0, project_js_1.getAvoidRules)(),
17
+ (0, project_js_1.getOpenThreads)(),
18
+ (0, project_js_1.getAllCommands)(),
19
+ ]);
20
+ const activeThreads = openThreads.filter((t) => t.status !== 'watching');
21
+ return {
22
+ projectName: (0, project_id_js_1.getProjectName)(),
23
+ totalSessions: projectMemory?.total_sessions || 0,
24
+ lastSession,
25
+ projectMemory,
26
+ developerMemory,
27
+ archCount: architecture.length,
28
+ patternCount: patterns.length,
29
+ avoidCount: avoidRules.length,
30
+ openThreadCount: activeThreads.length,
31
+ commandCount: Object.keys(commands).length,
32
+ totalCost: projectMemory?.total_cost_usd || 0,
33
+ };
34
+ }
35
+ function formatStartupBanner(data) {
36
+ const lines = [];
37
+ const costStr = data.totalCost > 0 ? ` | Total cost: $${data.totalCost.toFixed(2)}` : '';
38
+ lines.push(`=== CLAUDE MEMORY -- ${data.projectName} ===`);
39
+ lines.push(`Sessions: ${data.totalSessions}${data.lastSession ? ` | Last: ${getRelativeDate(data.lastSession.session_date)}` : ''}${costStr}`);
40
+ // Ultra-minimal stats line — details are available on-demand via search
41
+ const parts = [];
42
+ if (data.archCount > 0)
43
+ parts.push(`${data.archCount} decisions`);
44
+ if (data.patternCount > 0)
45
+ parts.push(`${data.patternCount} patterns`);
46
+ if (data.avoidCount > 0)
47
+ parts.push(`${data.avoidCount} avoid rules`);
48
+ if (data.openThreadCount > 0)
49
+ parts.push(`${data.openThreadCount} threads`);
50
+ if (data.commandCount > 0)
51
+ parts.push(`${data.commandCount} commands`);
52
+ if (parts.length > 0) {
53
+ lines.push(`Memory available — ${parts.join(', ')}`);
54
+ }
55
+ lines.push('');
56
+ lines.push('What are we doing today?');
57
+ lines.push('(c) Continue -- pick up where we left off');
58
+ lines.push('(n) Something new');
59
+ lines.push('(f) Specific feature or area');
60
+ lines.push('(r) Review / update memory');
61
+ lines.push('(?) Show full memory context');
62
+ return lines.join('\n');
63
+ }
64
+ function formatDate(date) {
65
+ return new Date(date).toISOString().split('T')[0];
66
+ }
67
+ function getRelativeDate(date) {
68
+ const d = new Date(date);
69
+ const now = new Date();
70
+ const ms = now.getTime() - d.getTime();
71
+ const days = Math.floor(ms / (1000 * 60 * 60 * 24));
72
+ if (days === 0)
73
+ return 'today';
74
+ if (days === 1)
75
+ return 'yesterday';
76
+ return `${days} days ago`;
77
+ }
78
+ //# sourceMappingURL=conversation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../src/startup/conversation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { WorkingMemory } from '../types.js';
2
+ export interface FeatureSearchResult {
3
+ date: string;
4
+ summary: string;
5
+ session: WorkingMemory;
6
+ }
7
+ export declare function searchFeatureHistory(featureDescription: string, limit?: number): Promise<FeatureSearchResult[]>;
8
+ export declare function formatFeatureSearchResults(results: FeatureSearchResult[]): string;
9
+ //# sourceMappingURL=feature-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-search.d.ts","sourceRoot":"","sources":["../../src/startup/feature-search.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,wBAAsB,oBAAoB,CACxC,kBAAkB,EAAE,MAAM,EAC1B,KAAK,GAAE,MAAU,GAChB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAuBhC;AA6BD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAYjF"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.searchFeatureHistory = searchFeatureHistory;
4
+ exports.formatFeatureSearchResults = formatFeatureSearchResults;
5
+ const vector_js_1 = require("../atlas/vector.js");
6
+ const working_js_1 = require("../memory/working.js");
7
+ const project_id_js_1 = require("../project-id.js");
8
+ async function searchFeatureHistory(featureDescription, limit = 5) {
9
+ const projectId = (0, project_id_js_1.getProjectId)();
10
+ const results = await (0, vector_js_1.search)(featureDescription, projectId, limit);
11
+ // Filter to working memory entries and format
12
+ const workingResults = results
13
+ .filter((r) => r.type === 'working')
14
+ .map((r) => {
15
+ const session = r.document;
16
+ return {
17
+ date: new Date(session.session_date).toISOString().split('T')[0],
18
+ summary: session.current_state,
19
+ session,
20
+ };
21
+ });
22
+ // If semantic search didn't find working memory, search directly
23
+ if (workingResults.length === 0) {
24
+ return searchWorkingMemoryByKeyword(featureDescription, limit);
25
+ }
26
+ return workingResults;
27
+ }
28
+ async function searchWorkingMemoryByKeyword(query, limit) {
29
+ const recentSessions = await (0, working_js_1.getRecentWorkingMemory)(20);
30
+ const words = query.toLowerCase().split(/\s+/).filter((w) => w.length > 2);
31
+ const scored = recentSessions
32
+ .map((session) => {
33
+ const text = session.searchable_text.toLowerCase();
34
+ let score = 0;
35
+ for (const word of words) {
36
+ if (text.includes(word))
37
+ score++;
38
+ }
39
+ return { session, score };
40
+ })
41
+ .filter((s) => s.score > 0)
42
+ .sort((a, b) => b.score - a.score)
43
+ .slice(0, limit);
44
+ return scored.map((s) => ({
45
+ date: new Date(s.session.session_date).toISOString().split('T')[0],
46
+ summary: s.session.current_state,
47
+ session: s.session,
48
+ }));
49
+ }
50
+ function formatFeatureSearchResults(results) {
51
+ if (results.length === 0) {
52
+ return 'No relevant sessions found.';
53
+ }
54
+ const lines = [`Found ${results.length} relevant session${results.length > 1 ? 's' : ''}:`];
55
+ for (const r of results) {
56
+ lines.push(` ${r.date}: "${r.summary}"`);
57
+ }
58
+ lines.push('');
59
+ lines.push(`Inject all ${results.length}? (a) Top 1 only? (1) Let me choose? (c)`);
60
+ return lines.join('\n');
61
+ }
62
+ //# sourceMappingURL=feature-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-search.js","sourceRoot":"","sources":["../../src/startup/feature-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { StartupChoice } from '../types.js';
2
+ export declare function buildContextForChoice(choice: StartupChoice): Promise<string>;
3
+ export declare function buildFeatureContext(featureDescription: string): Promise<string>;
4
+ //# sourceMappingURL=injector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injector.d.ts","sourceRoot":"","sources":["../../src/startup/injector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAA8D,MAAM,aAAa,CAAC;AAE7G,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBlF;AA2ID,wBAAsB,mBAAmB,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BrF"}
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildContextForChoice = buildContextForChoice;
4
+ exports.buildFeatureContext = buildFeatureContext;
5
+ const working_js_1 = require("../memory/working.js");
6
+ const project_js_1 = require("../memory/project.js");
7
+ const developer_js_1 = require("../memory/developer.js");
8
+ async function buildContextForChoice(choice) {
9
+ switch (choice) {
10
+ case 'c':
11
+ return buildContinueContext();
12
+ case 'n':
13
+ return buildNewContext();
14
+ case 'f':
15
+ // Feature context is built after the developer specifies the feature
16
+ return '';
17
+ case 'r':
18
+ return buildReviewContext();
19
+ case '?':
20
+ return buildFullContext();
21
+ default:
22
+ return '';
23
+ }
24
+ }
25
+ async function buildContinueContext() {
26
+ const [lastSession, openThreads] = await Promise.all([
27
+ (0, working_js_1.getRecentWorkingMemory)(1).then((s) => s[0] || null),
28
+ (0, project_js_1.getOpenThreads)(),
29
+ ]);
30
+ if (!lastSession) {
31
+ return 'No previous sessions found. Memory available via search.';
32
+ }
33
+ const parts = [];
34
+ parts.push(`Last session: ${lastSession.feature_context || lastSession.current_state}.`);
35
+ parts.push(`Left off: ${lastSession.current_state}.`);
36
+ if (lastSession.next_steps.length > 0) {
37
+ parts.push(`Next: ${lastSession.next_steps.join(', ')}.`);
38
+ }
39
+ const threadCount = openThreads.filter((t) => t.status !== 'watching').length;
40
+ if (threadCount > 0) {
41
+ parts.push(`${threadCount} open thread${threadCount > 1 ? 's' : ''}.`);
42
+ }
43
+ parts.push('Memory available via search — ask about any topic.');
44
+ return parts.join(' ');
45
+ }
46
+ async function buildNewContext() {
47
+ // Zero context cost — memory surfaces on-demand via preToolUse
48
+ return '';
49
+ }
50
+ async function buildReviewContext() {
51
+ const [pm, architecture, patterns, avoidRules, openThreads, commands] = await Promise.all([
52
+ (0, project_js_1.getProjectMeta)(),
53
+ (0, project_js_1.getArchitectureDecisions)(),
54
+ (0, project_js_1.getPatterns)(),
55
+ (0, project_js_1.getAvoidRules)(),
56
+ (0, project_js_1.getOpenThreads)(),
57
+ (0, project_js_1.getAllCommands)(),
58
+ ]);
59
+ if (!pm)
60
+ return 'No project memory stored yet.';
61
+ const sections = [];
62
+ sections.push(`Project: ${pm.project_name}`);
63
+ sections.push(`Sessions: ${pm.total_sessions} | Cost: $${pm.total_cost_usd.toFixed(2)}`);
64
+ sections.push(`Architecture: ${architecture.length} decisions`);
65
+ sections.push(`Patterns: ${patterns.length}`);
66
+ sections.push(`Avoid: ${avoidRules.length}`);
67
+ sections.push(`Open Threads: ${openThreads.length}`);
68
+ sections.push(`Commands: ${Object.keys(commands).length}`);
69
+ return sections.join('\n');
70
+ }
71
+ async function buildFullContext() {
72
+ const [recentSessions, pm, dm, architecture, patterns, avoidRules, openThreads, commands, preferences, styles, defaults, devAvoidRules] = await Promise.all([
73
+ (0, working_js_1.getRecentWorkingMemory)(10),
74
+ (0, project_js_1.getProjectMeta)(),
75
+ (0, developer_js_1.getDeveloperMeta)(),
76
+ (0, project_js_1.getArchitectureDecisions)(),
77
+ (0, project_js_1.getPatterns)(),
78
+ (0, project_js_1.getAvoidRules)(),
79
+ (0, project_js_1.getOpenThreads)(),
80
+ (0, project_js_1.getAllCommands)(),
81
+ (0, developer_js_1.getPreferences)(),
82
+ (0, developer_js_1.getStyles)(),
83
+ (0, developer_js_1.getDefaults)(),
84
+ (0, developer_js_1.getDevAvoidRules)(),
85
+ ]);
86
+ const sections = [];
87
+ sections.push('=== FULL MEMORY DUMP ===\n');
88
+ if (pm) {
89
+ sections.push('--- PROJECT MEMORY ---');
90
+ sections.push(`Project: ${pm.project_name}`);
91
+ sections.push(`Git remote: ${pm.git_remote}`);
92
+ sections.push(`Sessions: ${pm.total_sessions} | Cost: $${pm.total_cost_usd.toFixed(2)}`);
93
+ if (architecture.length) {
94
+ sections.push('\nArchitecture:');
95
+ architecture.forEach((a) => sections.push(` - ${a}`));
96
+ }
97
+ if (patterns.length) {
98
+ sections.push('\nPatterns:');
99
+ patterns.forEach((p) => sections.push(` - ${p}`));
100
+ }
101
+ if (avoidRules.length) {
102
+ sections.push('\nAvoid:');
103
+ avoidRules.forEach((a) => sections.push(` - ${a}`));
104
+ }
105
+ if (openThreads.length) {
106
+ sections.push('\nOpen Threads:');
107
+ openThreads.forEach((t) => sections.push(` ! ${t.description} (${t.status}) -- ${t.context}`));
108
+ }
109
+ if (Object.keys(commands).length) {
110
+ sections.push('\nCommands:');
111
+ for (const [trigger, cmd] of Object.entries(commands)) {
112
+ sections.push(formatCommand(trigger, cmd));
113
+ }
114
+ }
115
+ sections.push('');
116
+ }
117
+ if (dm) {
118
+ sections.push('--- DEVELOPER MEMORY ---');
119
+ sections.push(`Sessions: ${dm.session_count} | Cost: $${dm.total_cost_usd.toFixed(2)}`);
120
+ if (preferences.length) {
121
+ sections.push('Preferences:');
122
+ preferences.forEach((p) => sections.push(` - ${p}`));
123
+ }
124
+ if (styles.length) {
125
+ sections.push('Style:');
126
+ styles.forEach((s) => sections.push(` - ${s}`));
127
+ }
128
+ if (defaults.length) {
129
+ sections.push('Defaults:');
130
+ defaults.forEach((d) => sections.push(` - ${d}`));
131
+ }
132
+ if (devAvoidRules.length) {
133
+ sections.push('Avoid:');
134
+ devAvoidRules.forEach((a) => sections.push(` - ${a}`));
135
+ }
136
+ sections.push('');
137
+ }
138
+ if (recentSessions.length) {
139
+ sections.push('--- RECENT SESSIONS ---');
140
+ recentSessions.forEach((s) => sections.push(formatWorkingMemory(s)));
141
+ }
142
+ return sections.join('\n');
143
+ }
144
+ async function buildFeatureContext(featureDescription) {
145
+ const [architecture, commands, preferences] = await Promise.all([
146
+ (0, project_js_1.getArchitectureDecisions)(),
147
+ (0, project_js_1.getAllCommands)(),
148
+ (0, developer_js_1.getPreferences)(),
149
+ ]);
150
+ const sections = [];
151
+ sections.push(`=== FEATURE CONTEXT: ${featureDescription} ===\n`);
152
+ if (architecture.length) {
153
+ sections.push('Architecture:');
154
+ architecture.forEach((a) => sections.push(` - ${a}`));
155
+ }
156
+ if (Object.keys(commands).length > 0) {
157
+ sections.push('\nVerified Commands:');
158
+ for (const [trigger, cmd] of Object.entries(commands)) {
159
+ sections.push(` ${trigger}: ${cmd.description}`);
160
+ }
161
+ }
162
+ if (preferences.length) {
163
+ sections.push('\nDeveloper Preferences:');
164
+ preferences.forEach((p) => sections.push(` - ${p}`));
165
+ }
166
+ return sections.join('\n');
167
+ }
168
+ function formatWorkingMemory(session) {
169
+ const date = new Date(session.session_date).toISOString().split('T')[0];
170
+ const lines = [
171
+ ` ${date}: ${session.feature_context || session.current_state}`,
172
+ ` State: ${session.current_state}`,
173
+ ];
174
+ if (session.next_steps.length) {
175
+ lines.push(` Next: ${session.next_steps.join(', ')}`);
176
+ }
177
+ if (session.blockers.length) {
178
+ lines.push(` Blockers: ${session.blockers.join(', ')}`);
179
+ }
180
+ return lines.join('\n');
181
+ }
182
+ function formatCommand(trigger, cmd) {
183
+ const lines = [` ${trigger} (verified ${cmd.verified_count}x):`];
184
+ lines.push(` ${cmd.description}`);
185
+ cmd.steps.forEach((step, i) => lines.push(` ${i + 1}. ${step}`));
186
+ if (cmd.notes)
187
+ lines.push(` Notes: ${cmd.notes}`);
188
+ return lines.join('\n');
189
+ }
190
+ //# sourceMappingURL=injector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injector.js","sourceRoot":"","sources":["../../src/startup/injector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { SummaryItem } from './types.js';
2
+ /**
3
+ * Build the prompt that gets sent to Claude at session end to summarize
4
+ * what happened and classify items for long-term storage.
5
+ */
6
+ export declare function buildSummarizationPrompt(sessionContext: string): string;
7
+ /**
8
+ * Parse Claude's JSON response into structured summary items.
9
+ */
10
+ export declare function parseSummaryResponse(response: string): SummaryItem[];
11
+ /**
12
+ * Format summary items for display to the developer.
13
+ */
14
+ export declare function formatSummaryForReview(items: SummaryItem[]): string;
15
+ //# sourceMappingURL=summarizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../src/summarizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,YAAY,CAAC;AAE/D;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAmBvE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE,CAuBpE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAyCnE"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildSummarizationPrompt = buildSummarizationPrompt;
4
+ exports.parseSummaryResponse = parseSummaryResponse;
5
+ exports.formatSummaryForReview = formatSummaryForReview;
6
+ /**
7
+ * Build the prompt that gets sent to Claude at session end to summarize
8
+ * what happened and classify items for long-term storage.
9
+ */
10
+ function buildSummarizationPrompt(sessionContext) {
11
+ return `Review this session. Identify items worth storing in long-term memory.
12
+ Classify each as:
13
+
14
+ ARCHITECTURE -- permanent decision for this project
15
+ PATTERN -- recurring approach confirmed multiple times this session
16
+ AVOID -- approach that failed, do not repeat
17
+ OPEN_THREAD -- something unresolved that needs to surface next session
18
+ DEVELOPER_PREF -- personal preference crossing all projects
19
+ WORKING -- current state, files, next steps (always include one)
20
+ TRANSIENT -- one-off thing not worth storing (exclude)
21
+
22
+ Do NOT include anything already stored via explicit developer command
23
+ during this session. Those are already saved.
24
+ Be selective. Future Claude only needs what genuinely matters.
25
+ Return valid JSON only, as an array of objects with "category" and "content" fields.
26
+
27
+ Session context:
28
+ ${sessionContext}`;
29
+ }
30
+ /**
31
+ * Parse Claude's JSON response into structured summary items.
32
+ */
33
+ function parseSummaryResponse(response) {
34
+ try {
35
+ // Try to extract JSON from the response
36
+ const jsonMatch = response.match(/\[[\s\S]*\]/);
37
+ if (!jsonMatch)
38
+ return [];
39
+ const parsed = JSON.parse(jsonMatch[0]);
40
+ if (!Array.isArray(parsed))
41
+ return [];
42
+ return parsed
43
+ .filter((item) => item.category &&
44
+ item.content &&
45
+ item.category !== 'TRANSIENT')
46
+ .map((item) => ({
47
+ category: item.category,
48
+ content: String(item.content),
49
+ }));
50
+ }
51
+ catch {
52
+ return [];
53
+ }
54
+ }
55
+ /**
56
+ * Format summary items for display to the developer.
57
+ */
58
+ function formatSummaryForReview(items) {
59
+ const projectItems = items.filter((i) => i.category === 'ARCHITECTURE' ||
60
+ i.category === 'PATTERN' ||
61
+ i.category === 'AVOID' ||
62
+ i.category === 'OPEN_THREAD');
63
+ const devItems = items.filter((i) => i.category === 'DEVELOPER_PREF');
64
+ const workingItems = items.filter((i) => i.category === 'WORKING');
65
+ const lines = [];
66
+ if (projectItems.length > 0) {
67
+ lines.push('PROJECT MEMORY');
68
+ lines.push('--------------');
69
+ projectItems.forEach((item, i) => {
70
+ lines.push(`[${i + 1}] ${item.category}: "${item.content}"`);
71
+ });
72
+ lines.push('');
73
+ }
74
+ if (devItems.length > 0) {
75
+ lines.push('DEVELOPER MEMORY');
76
+ lines.push('----------------');
77
+ devItems.forEach((item, i) => {
78
+ lines.push(`[${projectItems.length + i + 1}] PREFERENCE: "${item.content}"`);
79
+ });
80
+ lines.push('');
81
+ }
82
+ if (workingItems.length > 0) {
83
+ lines.push('WORKING MEMORY (auto-saved)');
84
+ lines.push('---------------------------');
85
+ workingItems.forEach((item) => {
86
+ lines.push(` ${item.content}`);
87
+ });
88
+ lines.push('');
89
+ }
90
+ return lines.join('\n');
91
+ }
92
+ //# sourceMappingURL=summarizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../src/summarizer.ts"],"names":[],"mappings":";;AAMA,4DAmBC;AAKD,oDAuBC;AAKD,wDAyCC;AAjGD;;;GAGG;AACH,SAAgB,wBAAwB,CAAC,cAAsB;IAC7D,OAAO;;;;;;;;;;;;;;;;;EAiBP,cAAc,EAAE,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAAC,QAAgB;IACnD,IAAI,CAAC;QACH,wCAAwC;QACxC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAChD,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAC;QAE1B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QAEtC,OAAO,MAAM;aACV,MAAM,CACL,CAAC,IAAS,EAAE,EAAE,CACZ,IAAI,CAAC,QAAQ;YACb,IAAI,CAAC,OAAO;YACZ,IAAI,CAAC,QAAQ,KAAK,WAAW,CAChC;aACA,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC;YACnB,QAAQ,EAAE,IAAI,CAAC,QAA2B;YAC1C,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC,CAAC;IACR,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,KAAoB;IACzD,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAC/B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,QAAQ,KAAK,cAAc;QAC7B,CAAC,CAAC,QAAQ,KAAK,SAAS;QACxB,CAAC,CAAC,QAAQ,KAAK,OAAO;QACtB,CAAC,CAAC,QAAQ,KAAK,aAAa,CAC/B,CAAC;IACF,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,gBAAgB,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;IAEnE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7B,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YAC/B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,QAAQ,MAAM,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/B,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YAC3B,KAAK,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QAC/E,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC1C,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAC5B,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}