@getvibeguard/cli 1.0.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 (128) hide show
  1. package/README.md +166 -0
  2. package/dashboard/dist/assets/Tableau10-B-NsZVaP.js +1 -0
  3. package/dashboard/dist/assets/arc-CZ1oDkm-.js +1 -0
  4. package/dashboard/dist/assets/array-BKyUJesY.js +1 -0
  5. package/dashboard/dist/assets/blockDiagram-c4efeb88-BLITAZDl.js +118 -0
  6. package/dashboard/dist/assets/c4Diagram-c83219d4-DErNj891.js +10 -0
  7. package/dashboard/dist/assets/channel-sWBGOq9p.js +1 -0
  8. package/dashboard/dist/assets/classDiagram-beda092f-Bj8IB6RW.js +2 -0
  9. package/dashboard/dist/assets/classDiagram-v2-2358418a-BZtd2g5W.js +2 -0
  10. package/dashboard/dist/assets/clone-DtEyH3ya.js +1 -0
  11. package/dashboard/dist/assets/createText-1719965b-DkNrTk-5.js +7 -0
  12. package/dashboard/dist/assets/edges-96097737-CYxl0j3g.js +4 -0
  13. package/dashboard/dist/assets/erDiagram-0228fc6a-ClEp9Atg.js +51 -0
  14. package/dashboard/dist/assets/flowDb-c6c81e3f-ClDJCJwu.js +10 -0
  15. package/dashboard/dist/assets/flowDiagram-50d868cf-DYxwClWS.js +4 -0
  16. package/dashboard/dist/assets/flowDiagram-v2-4f6560a1-D7vEnO1T.js +1 -0
  17. package/dashboard/dist/assets/flowchart-elk-definition-6af322e1-C-wX1mNx.js +139 -0
  18. package/dashboard/dist/assets/ganttDiagram-a2739b55-DTeLavAj.js +257 -0
  19. package/dashboard/dist/assets/gitGraphDiagram-82fe8481-ClxNoYya.js +70 -0
  20. package/dashboard/dist/assets/graph-CT-F3Got.js +1 -0
  21. package/dashboard/dist/assets/index-5325376f-C-jTCYZA.js +1 -0
  22. package/dashboard/dist/assets/index-CvYvquQR.js +283 -0
  23. package/dashboard/dist/assets/index-n43poL1x.css +1 -0
  24. package/dashboard/dist/assets/infoDiagram-8eee0895-Zljudo5L.js +7 -0
  25. package/dashboard/dist/assets/init-Gi6I4Gst.js +1 -0
  26. package/dashboard/dist/assets/journeyDiagram-c64418c1-DXzTbuum.js +139 -0
  27. package/dashboard/dist/assets/katex-Cu_Erd72.js +261 -0
  28. package/dashboard/dist/assets/layout-CVO3EizT.js +1 -0
  29. package/dashboard/dist/assets/line-CIgln-0z.js +1 -0
  30. package/dashboard/dist/assets/linear-bmIUMQqg.js +1 -0
  31. package/dashboard/dist/assets/mindmap-definition-8da855dc-BDLTNZYk.js +425 -0
  32. package/dashboard/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  33. package/dashboard/dist/assets/path-CbwjOpE9.js +1 -0
  34. package/dashboard/dist/assets/pieDiagram-a8764435-DtcOKNPc.js +35 -0
  35. package/dashboard/dist/assets/quadrantDiagram-1e28029f-zoSI_Ltf.js +7 -0
  36. package/dashboard/dist/assets/requirementDiagram-08caed73-TsQZ9lTB.js +52 -0
  37. package/dashboard/dist/assets/sankeyDiagram-a04cb91d-DE5ciDwD.js +8 -0
  38. package/dashboard/dist/assets/sequenceDiagram-c5b8d532-DhabPb2n.js +122 -0
  39. package/dashboard/dist/assets/stateDiagram-1ecb1508-Bg2q_YNx.js +1 -0
  40. package/dashboard/dist/assets/stateDiagram-v2-c2b004d7-Bs5iRjYB.js +1 -0
  41. package/dashboard/dist/assets/styles-b4e223ce-DchmAmav.js +160 -0
  42. package/dashboard/dist/assets/styles-ca3715f6-Bu5zjaDx.js +207 -0
  43. package/dashboard/dist/assets/styles-d45a18b0-jCaD8baR.js +116 -0
  44. package/dashboard/dist/assets/svgDrawCommon-b86b1483-BrYVGY4c.js +1 -0
  45. package/dashboard/dist/assets/timeline-definition-faaaa080--sq0bTHe.js +61 -0
  46. package/dashboard/dist/assets/xychartDiagram-f5964ef8-ByvzN0uj.js +7 -0
  47. package/dashboard/dist/index.html +22 -0
  48. package/dist/cli.d.ts +4 -0
  49. package/dist/cli.d.ts.map +1 -0
  50. package/dist/cli.js +641 -0
  51. package/dist/cli.js.map +1 -0
  52. package/dist/commands/dashboard.d.ts +2 -0
  53. package/dist/commands/dashboard.d.ts.map +1 -0
  54. package/dist/commands/dashboard.js +184 -0
  55. package/dist/commands/dashboard.js.map +1 -0
  56. package/dist/commands/init.d.ts +5 -0
  57. package/dist/commands/init.d.ts.map +1 -0
  58. package/dist/commands/init.js +501 -0
  59. package/dist/commands/init.js.map +1 -0
  60. package/dist/index.d.ts +3 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +602 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/librarian/autofix.d.ts +34 -0
  65. package/dist/librarian/autofix.d.ts.map +1 -0
  66. package/dist/librarian/autofix.js +369 -0
  67. package/dist/librarian/autofix.js.map +1 -0
  68. package/dist/librarian/heartbeat.d.ts +38 -0
  69. package/dist/librarian/heartbeat.d.ts.map +1 -0
  70. package/dist/librarian/heartbeat.js +98 -0
  71. package/dist/librarian/heartbeat.js.map +1 -0
  72. package/dist/librarian/initializer.d.ts +41 -0
  73. package/dist/librarian/initializer.d.ts.map +1 -0
  74. package/dist/librarian/initializer.js +202 -0
  75. package/dist/librarian/initializer.js.map +1 -0
  76. package/dist/librarian/memory-manager.d.ts +37 -0
  77. package/dist/librarian/memory-manager.d.ts.map +1 -0
  78. package/dist/librarian/memory-manager.js +205 -0
  79. package/dist/librarian/memory-manager.js.map +1 -0
  80. package/dist/librarian/oracle.d.ts +51 -0
  81. package/dist/librarian/oracle.d.ts.map +1 -0
  82. package/dist/librarian/oracle.js +235 -0
  83. package/dist/librarian/oracle.js.map +1 -0
  84. package/dist/librarian/summarizer.d.ts +19 -0
  85. package/dist/librarian/summarizer.d.ts.map +1 -0
  86. package/dist/librarian/summarizer.js +175 -0
  87. package/dist/librarian/summarizer.js.map +1 -0
  88. package/dist/librarian/watcher.d.ts +51 -0
  89. package/dist/librarian/watcher.d.ts.map +1 -0
  90. package/dist/librarian/watcher.js +189 -0
  91. package/dist/librarian/watcher.js.map +1 -0
  92. package/dist/mcp-server.d.ts +10 -0
  93. package/dist/mcp-server.d.ts.map +1 -0
  94. package/dist/mcp-server.js +879 -0
  95. package/dist/mcp-server.js.map +1 -0
  96. package/dist/services/token-tracker.d.ts +58 -0
  97. package/dist/services/token-tracker.d.ts.map +1 -0
  98. package/dist/services/token-tracker.js +178 -0
  99. package/dist/services/token-tracker.js.map +1 -0
  100. package/dist/utils/chunker.d.ts +5 -0
  101. package/dist/utils/chunker.d.ts.map +1 -0
  102. package/dist/utils/chunker.js +121 -0
  103. package/dist/utils/chunker.js.map +1 -0
  104. package/dist/utils/config-manager.d.ts +65 -0
  105. package/dist/utils/config-manager.d.ts.map +1 -0
  106. package/dist/utils/config-manager.js +243 -0
  107. package/dist/utils/config-manager.js.map +1 -0
  108. package/dist/utils/config.d.ts +46 -0
  109. package/dist/utils/config.d.ts.map +1 -0
  110. package/dist/utils/config.js +171 -0
  111. package/dist/utils/config.js.map +1 -0
  112. package/dist/utils/diff-cleaner.d.ts +13 -0
  113. package/dist/utils/diff-cleaner.d.ts.map +1 -0
  114. package/dist/utils/diff-cleaner.js +80 -0
  115. package/dist/utils/diff-cleaner.js.map +1 -0
  116. package/dist/utils/git.d.ts +71 -0
  117. package/dist/utils/git.d.ts.map +1 -0
  118. package/dist/utils/git.js +285 -0
  119. package/dist/utils/git.js.map +1 -0
  120. package/dist/utils/llm.d.ts +30 -0
  121. package/dist/utils/llm.d.ts.map +1 -0
  122. package/dist/utils/llm.js +308 -0
  123. package/dist/utils/llm.js.map +1 -0
  124. package/dist/utils/pricing.d.ts +47 -0
  125. package/dist/utils/pricing.d.ts.map +1 -0
  126. package/dist/utils/pricing.js +171 -0
  127. package/dist/utils/pricing.js.map +1 -0
  128. package/package.json +45 -0
@@ -0,0 +1,235 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import { generateSummary } from '../utils/llm.js';
4
+ export class OracleService {
5
+ repoPath;
6
+ statePath;
7
+ constructor(repoPath = process.cwd()) {
8
+ this.repoPath = repoPath;
9
+ this.statePath = path.join(repoPath, '.vibeguard', 'oracle.json');
10
+ }
11
+ /**
12
+ * Load oracle state from file
13
+ */
14
+ async loadState() {
15
+ try {
16
+ const content = await fs.readFile(this.statePath, 'utf-8');
17
+ return JSON.parse(content);
18
+ }
19
+ catch (error) {
20
+ // State file doesn't exist - return default
21
+ return {
22
+ prophecies: [],
23
+ lastSeekTime: null,
24
+ };
25
+ }
26
+ }
27
+ /**
28
+ * Save oracle state to file
29
+ */
30
+ async saveState(state) {
31
+ // Ensure .vibeguard directory exists
32
+ const stateDir = path.dirname(this.statePath);
33
+ await fs.mkdir(stateDir, { recursive: true });
34
+ await fs.writeFile(this.statePath, JSON.stringify(state, null, 2), 'utf-8');
35
+ }
36
+ /**
37
+ * Scan the project directory and return file tree structure
38
+ */
39
+ async scanProjectTree() {
40
+ const files = [];
41
+ const repoPath = this.repoPath;
42
+ async function walkDir(dir, prefix = '', depth = 0) {
43
+ if (depth > 15)
44
+ return; // Limit depth to prevent excessive scanning
45
+ try {
46
+ const entries = await fs.readdir(dir, { withFileTypes: true });
47
+ const filtered = entries.filter(entry => {
48
+ const name = entry.name;
49
+ // Filter out common ignore patterns
50
+ return (!name.startsWith('.') ||
51
+ name === '.git' ||
52
+ name === '.env' ||
53
+ name === '.cursor') &&
54
+ name !== 'node_modules' &&
55
+ name !== 'dist' &&
56
+ name !== 'build' &&
57
+ name !== '.vibeguard'; // Don't scan oracle state itself
58
+ });
59
+ for (let i = 0; i < filtered.length; i++) {
60
+ const entry = filtered[i];
61
+ const isLast = i === filtered.length - 1;
62
+ const currentPrefix = isLast ? '└── ' : '├── ';
63
+ const nextPrefix = isLast ? ' ' : '│ ';
64
+ files.push(prefix + currentPrefix + entry.name + (entry.isDirectory() ? '/' : ''));
65
+ if (entry.isDirectory() && entry.name !== '.git' && entry.name !== 'node_modules') {
66
+ const fullPath = path.join(dir, entry.name);
67
+ await walkDir(fullPath, prefix + nextPrefix, depth + 1);
68
+ }
69
+ }
70
+ }
71
+ catch (error) {
72
+ // Ignore permission errors or inaccessible directories
73
+ }
74
+ }
75
+ try {
76
+ await walkDir(repoPath);
77
+ }
78
+ catch (error) {
79
+ throw new Error(`Failed to scan project tree: ${error}`);
80
+ }
81
+ return files.join('\n');
82
+ }
83
+ /**
84
+ * Read PROJECT_MEMORY.md
85
+ */
86
+ async readProjectMemory() {
87
+ const memoryPath = path.join(this.repoPath, 'PROJECT_MEMORY.md');
88
+ try {
89
+ return await fs.readFile(memoryPath, 'utf-8');
90
+ }
91
+ catch (error) {
92
+ throw new Error(`Failed to read PROJECT_MEMORY.md: ${error}`);
93
+ }
94
+ }
95
+ /**
96
+ * Read DIAGRAM.md
97
+ */
98
+ async readDiagram() {
99
+ const diagramPath = path.join(this.repoPath, 'DIAGRAM.md');
100
+ try {
101
+ return await fs.readFile(diagramPath, 'utf-8');
102
+ }
103
+ catch (error) {
104
+ throw new Error(`Failed to read DIAGRAM.md: ${error}`);
105
+ }
106
+ }
107
+ /**
108
+ * Seek prophecy - Compare Project Soul/Rules with actual file structure
109
+ */
110
+ async seekProphecy() {
111
+ console.log('[Oracle] Seeking prophecy...');
112
+ try {
113
+ // Gather context
114
+ const [projectMemory, diagram, fileTree] = await Promise.all([
115
+ this.readProjectMemory(),
116
+ this.readDiagram(),
117
+ this.scanProjectTree(),
118
+ ]);
119
+ // Build the reasoning prompt
120
+ const systemPrompt = `You are an architectural oracle analyzing a codebase for "Architectural Drift" - places where the code has diverged from the intended architecture and rules defined in PROJECT_MEMORY.md.
121
+
122
+ Your task is to identify 3 specific areas where the code is 'drifting' from the intended architecture. Look for:
123
+ - Violated Core Rules (e.g., using barrel imports when forbidden, not following atomic updates, etc.)
124
+ - Undocumented Tech Stack additions (new libraries/dependencies not mentioned in Tech Stack)
125
+ - Structural deviations from DIAGRAM.md (new components/services not reflected in architecture)
126
+ - Anti-patterns that contradict the Project Soul
127
+
128
+ Output your findings as a JSON array with exactly 3 objects. Each object must have:
129
+ - id: A unique identifier (e.g., "prophecy-001")
130
+ - type: One of "Refactor", "RuleViolation", or "Optimization"
131
+ - title: A concise title (max 60 characters)
132
+ - description: Detailed description of the drift (2-4 sentences)
133
+ - suggestedAction: Specific, actionable recommendation (1-2 sentences)
134
+ - priority: "High", "Medium", or "Low" based on severity
135
+
136
+ Format your response as a valid JSON array only. No markdown, no code blocks, just the JSON array.`;
137
+ const userPrompt = `PROJECT_MEMORY.md:
138
+ ${projectMemory}
139
+
140
+ DIAGRAM.md:
141
+ ${diagram}
142
+
143
+ Current File Tree:
144
+ ${fileTree}
145
+
146
+ Analyze the above and identify 3 specific areas of architectural drift. Return a JSON array of prophecies.`;
147
+ // Use Gemini 3 Pro for architectural reasoning
148
+ const response = await generateSummary(userPrompt, systemPrompt, {
149
+ thinkingLevel: 'pro',
150
+ maxTokens: 50000,
151
+ temperature: 0.5,
152
+ feature: 'Oracle',
153
+ });
154
+ // Parse the JSON response
155
+ let prophecies = [];
156
+ try {
157
+ // Try to extract JSON from markdown code blocks if present
158
+ let jsonText = response.trim();
159
+ const jsonMatch = jsonText.match(/```(?:json)?\s*([\s\S]*?)\s*```/);
160
+ if (jsonMatch) {
161
+ jsonText = jsonMatch[1];
162
+ }
163
+ // Parse the JSON array
164
+ const parsed = JSON.parse(jsonText);
165
+ prophecies = Array.isArray(parsed) ? parsed : [parsed];
166
+ // Validate and add timestamps
167
+ prophecies = prophecies.map((p) => ({
168
+ id: p.id || `prophecy-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
169
+ type: p.type || 'Optimization',
170
+ title: p.title || 'Untitled Prophecy',
171
+ description: p.description || '',
172
+ suggestedAction: p.suggestedAction || '',
173
+ priority: p.priority || 'Medium',
174
+ createdAt: p.createdAt || new Date().toISOString(),
175
+ })).slice(0, 3); // Ensure max 3 prophecies
176
+ }
177
+ catch (parseError) {
178
+ console.error('[Oracle] Failed to parse prophecy response:', parseError);
179
+ console.error('[Oracle] Response was:', response);
180
+ // Fallback: Create a single prophecy about parsing failure
181
+ prophecies = [{
182
+ id: `prophecy-error-${Date.now()}`,
183
+ type: 'Optimization',
184
+ title: 'Oracle Response Parsing Failed',
185
+ description: `The oracle response could not be parsed. This may indicate an issue with the LLM response format. Response preview: ${response.substring(0, 200)}...`,
186
+ suggestedAction: 'Review the oracle.ts implementation and ensure proper JSON response handling.',
187
+ priority: 'Low',
188
+ createdAt: new Date().toISOString(),
189
+ }];
190
+ }
191
+ // Load existing state and merge prophecies
192
+ const state = await this.loadState();
193
+ // Remove duplicates based on id
194
+ const existingIds = new Set(state.prophecies.map(p => p.id));
195
+ const newProphecies = prophecies.filter(p => !existingIds.has(p.id));
196
+ // Merge: keep existing + add new (limit to 20 total)
197
+ const allProphecies = [...state.prophecies, ...newProphecies].slice(-20);
198
+ // Update state
199
+ await this.saveState({
200
+ prophecies: allProphecies,
201
+ lastSeekTime: new Date().toISOString(),
202
+ });
203
+ console.log(`[Oracle] Generated ${newProphecies.length} new prophecies`);
204
+ return prophecies;
205
+ }
206
+ catch (error) {
207
+ console.error('[Oracle] Error seeking prophecy:', error);
208
+ throw error;
209
+ }
210
+ }
211
+ /**
212
+ * Get all prophecies
213
+ */
214
+ async getProphecies() {
215
+ const state = await this.loadState();
216
+ return state.prophecies;
217
+ }
218
+ /**
219
+ * Get prophecies by priority
220
+ */
221
+ async getPropheciesByPriority(priority) {
222
+ const prophecies = await this.getProphecies();
223
+ return prophecies.filter(p => p.priority === priority);
224
+ }
225
+ /**
226
+ * Clear all prophecies
227
+ */
228
+ async clearProphecies() {
229
+ await this.saveState({
230
+ prophecies: [],
231
+ lastSeekTime: null,
232
+ });
233
+ }
234
+ }
235
+ //# sourceMappingURL=oracle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oracle.js","sourceRoot":"","sources":["../../src/librarian/oracle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export declare class Summarizer {
2
+ /**
3
+ * Build incremental update prompt (current memory + new diff)
4
+ */
5
+ buildIncrementalPrompt(currentMemory: string, cleanDiff: string): string;
6
+ /**
7
+ * Summarize a diff and return complete updated PROJECT_MEMORY.md
8
+ */
9
+ summarizeDiff(diff: string, currentMemory?: string, thinkingLevel?: 'flash' | 'pro'): Promise<string>;
10
+ /**
11
+ * Infer architecture from file structure and README
12
+ */
13
+ inferArchitecture(fileStructure: string, readme?: string, thinkingLevel?: 'flash' | 'pro'): Promise<string>;
14
+ /**
15
+ * Merge Git conflicts in PROJECT_MEMORY.md
16
+ */
17
+ mergeConflicts(conflictedMemory: string): Promise<string>;
18
+ }
19
+ //# sourceMappingURL=summarizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../../src/librarian/summarizer.ts"],"names":[],"mappings":"AAwCA,qBAAa,UAAU;IACrB;;OAEG;IACH,sBAAsB,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAWxE;;OAEG;IACG,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,aAAa,GAAE,MAAW,EAC1B,aAAa,GAAE,OAAO,GAAG,KAAe,GACvC,OAAO,CAAC,MAAM,CAAC;IAuElB;;OAEG;IACG,iBAAiB,CACrB,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,EACf,aAAa,GAAE,OAAO,GAAG,KAAe,GACvC,OAAO,CAAC,MAAM,CAAC;IAwBlB;;OAEG;IACG,cAAc,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAoChE"}
@@ -0,0 +1,175 @@
1
+ import { generateSummary, estimateTokens } from '../utils/llm.js';
2
+ import { cleanDiff } from '../utils/diff-cleaner.js';
3
+ import { chunkDiff } from '../utils/chunker.js';
4
+ import { getMaxTokens } from '../utils/config.js';
5
+ /**
6
+ * Get the Librarian system prompt with current date
7
+ */
8
+ function getLibrarianSystemPrompt() {
9
+ const today = new Date().toLocaleDateString();
10
+ return `# ROLE
11
+ You are "The Librarian," an expert Software Architect and Context Manager. Your sole purpose is to maintain the \`PROJECT_MEMORY.md\` file, ensuring it serves as a high-density "Single Source of Truth" for AI coding assistants.
12
+
13
+ Today's Date: ${today}
14
+
15
+ # OBJECTIVE
16
+ Analyze the provided [INPUT] (Git diffs, file structures, or current memory) and update the \`PROJECT_MEMORY.md\` to reflect the current "State of the World."
17
+
18
+ # THE MEMORY SCHEMA (Strict Adherence)
19
+ You must maintain the following sections in \`PROJECT_MEMORY.md\`:
20
+ 1. ## Project Soul: A 2-sentence description of what this app is and who it's for.
21
+ 2. ## Tech Stack: A list of core libraries, frameworks, and versions.
22
+ 3. ## Architecture: High-level overview of how data flows (e.g., "Next.js App Router -> Supabase -> Stripe").
23
+ 4. ## Core Rules: Critical "Vibe" rules (e.g., "Always use Tailwind arbitrary values," "No barrel imports").
24
+ 5. ## Recent Decisions (The "Why"): Maintain the existing list of decisions. Append the latest changes to the top of the list. Do not delete older entries; the system's Auto-Pruning logic will handle compaction separately.
25
+ 6. ## Active Tech Debt: Known bugs or "next steps" that the AI should be aware of.
26
+
27
+ # PROCESSING LOGIC (The "Density" Rules)
28
+ - NEVER list individual file changes (e.g., "Modified App.tsx").
29
+ - ALWAYS describe the INTENT (e.g., "Refactored Auth flow to support Multi-tenancy").
30
+ - SHRED THE BLOAT: If a change is purely cosmetic (linting, comments), ignore it.
31
+ - CONFLICTS: If the new diff contradicts the current memory, prioritize the new diff but note the "superseded" decision.
32
+ - TOKEN EFFICIENCY: Focus on maintaining high-density content. The system's Memory Compaction tool handles token efficiency automatically when needed.
33
+ - DATE CORRECTION: If you see any dates in the existing PROJECT_MEMORY.md that are from 2024, update them to 2026 to reflect the current year. Use today's date (${today}) as a reference for new entries.
34
+
35
+ # OUTPUT FORMAT
36
+ Return the complete, updated Markdown for \`PROJECT_MEMORY.md\`. No conversational filler.`;
37
+ }
38
+ export class Summarizer {
39
+ /**
40
+ * Build incremental update prompt (current memory + new diff)
41
+ */
42
+ buildIncrementalPrompt(currentMemory, cleanDiff) {
43
+ const today = new Date().toLocaleDateString();
44
+ return `Current Memory:
45
+ ${currentMemory}
46
+
47
+ New Diff:
48
+ ${cleanDiff}
49
+
50
+ Task: Update the memory to reflect these changes. Ensure 'Recent Decisions' is updated and 'Active Tech Debt' is pruned if the bug was fixed. Also, if you see any dates in the existing memory that are from 2024, update them to 2026. Use today's date (${today}) as a reference for new entries.`;
51
+ }
52
+ /**
53
+ * Summarize a diff and return complete updated PROJECT_MEMORY.md
54
+ */
55
+ async summarizeDiff(diff, currentMemory = '', thinkingLevel = 'flash') {
56
+ // Clean the diff first (pre-shredder)
57
+ const cleaned = cleanDiff(diff);
58
+ // Check if we need chunking
59
+ const maxTokens = await getMaxTokens();
60
+ const diffTokens = estimateTokens(cleaned);
61
+ const memoryTokens = estimateTokens(currentMemory);
62
+ const totalTokens = diffTokens + memoryTokens;
63
+ // Build prompt
64
+ const today = new Date().toLocaleDateString();
65
+ const prompt = currentMemory
66
+ ? this.buildIncrementalPrompt(currentMemory, cleaned)
67
+ : `New Diff:\n${cleaned}\n\nTask: Create or update PROJECT_MEMORY.md based on this diff. If you see any dates in existing memory that are from 2024, update them to 2026. Use today's date (${today}) as a reference for new entries.`;
68
+ // If total is small enough, process directly
69
+ if (totalTokens < maxTokens * 0.7) {
70
+ return await generateSummary(prompt, getLibrarianSystemPrompt(), {
71
+ thinkingLevel,
72
+ maxTokens,
73
+ feature: 'Librarian',
74
+ });
75
+ }
76
+ // Need chunking - split the diff
77
+ const chunks = chunkDiff(cleaned, maxTokens);
78
+ const summaries = [];
79
+ // Process each chunk
80
+ for (let i = 0; i < chunks.length; i++) {
81
+ const chunk = chunks[i];
82
+ const chunkPrompt = currentMemory
83
+ ? this.buildIncrementalPrompt(currentMemory, chunk)
84
+ : `New Diff (Chunk ${i + 1}/${chunks.length}):\n${chunk}`;
85
+ const summary = await generateSummary(chunkPrompt, getLibrarianSystemPrompt(), {
86
+ thinkingLevel,
87
+ maxTokens,
88
+ feature: 'Librarian',
89
+ });
90
+ summaries.push(summary);
91
+ // Update current memory with first summary for context in subsequent chunks
92
+ if (i === 0 && !currentMemory) {
93
+ currentMemory = summary;
94
+ }
95
+ }
96
+ // Aggregate summaries
97
+ // Note: For multiple chunks, we might need to merge them intelligently
98
+ // For now, use the last summary as it should have the most complete context
99
+ if (summaries.length > 1) {
100
+ // Re-summarize all summaries together
101
+ const aggregatedPrompt = `Multiple summaries were generated from different parts of a large diff. Merge them into a single coherent PROJECT_MEMORY.md:
102
+
103
+ ${summaries.map((s, i) => `## Summary ${i + 1}\n${s}`).join('\n\n')}
104
+
105
+ Task: Create a single, unified PROJECT_MEMORY.md that combines all the information from these summaries.`;
106
+ return await generateSummary(aggregatedPrompt, getLibrarianSystemPrompt(), {
107
+ thinkingLevel: 'flash', // Use flash for merging (routine task)
108
+ maxTokens,
109
+ feature: 'Librarian',
110
+ });
111
+ }
112
+ return summaries[0] || '';
113
+ }
114
+ /**
115
+ * Infer architecture from file structure and README
116
+ */
117
+ async inferArchitecture(fileStructure, readme, thinkingLevel = 'flash') {
118
+ const today = new Date().toLocaleDateString();
119
+ const prompt = `File Structure:
120
+ \`\`\`
121
+ ${fileStructure}
122
+ \`\`\`
123
+
124
+ ${readme ? `README.md:\n\`\`\`\n${readme}\n\`\`\`\n\n` : ''}Task: Analyze the file structure${readme ? ' and README' : ''} to infer:
125
+ 1. Project Soul (2 sentences: what this app is and who it's for)
126
+ 2. Tech Stack (core libraries, frameworks, versions - infer from structure)
127
+ 3. Architecture (high-level data flow description)
128
+ 4. Core Rules (if detectable from structure/README)
129
+
130
+ Create a complete PROJECT_MEMORY.md with all required sections. Use today's date (${today}) for any date entries. If you see any dates from 2024 in existing memory, update them to 2026.`;
131
+ const maxTokens = await getMaxTokens();
132
+ return await generateSummary(prompt, getLibrarianSystemPrompt(), {
133
+ thinkingLevel,
134
+ maxTokens,
135
+ feature: 'Librarian',
136
+ });
137
+ }
138
+ /**
139
+ * Merge Git conflicts in PROJECT_MEMORY.md
140
+ */
141
+ async mergeConflicts(conflictedMemory) {
142
+ const prompt = `You are "The Librarian," an expert Software Architect and Context Manager.
143
+
144
+ # TASK
145
+ Merge the following conflicted PROJECT_MEMORY.md file. The file contains Git conflict markers (<<<<<<<, =======, >>>>>>>).
146
+
147
+ # INSTRUCTIONS
148
+ 1. Remove all conflict markers (<<<<<<<, =======, >>>>>>>)
149
+ 2. Intelligently merge the conflicting sections, preserving important information from both versions
150
+ 3. Maintain the required structure:
151
+ - ## Project Soul
152
+ - ## Tech Stack
153
+ - ## Architecture
154
+ - ## Core Rules
155
+ - ## Recent Decisions (The "Why")
156
+ - ## Active Tech Debt
157
+ 4. Preserve all Recent Decisions entries; do not delete older entries during merge
158
+ 5. Return the complete, merged Markdown file with no conflict markers
159
+
160
+ # CONFLICTED FILE
161
+ ${conflictedMemory}
162
+
163
+ # OUTPUT
164
+ Return only the merged Markdown content, no explanations.`;
165
+ const systemPrompt = `You are a Git conflict resolution expert specializing in Markdown files about software architecture.`;
166
+ const maxTokens = await getMaxTokens();
167
+ return await generateSummary(prompt, systemPrompt, {
168
+ thinkingLevel: 'flash',
169
+ temperature: 0.2, // Lower temperature for more consistent merging
170
+ maxTokens,
171
+ feature: 'Librarian',
172
+ });
173
+ }
174
+ }
175
+ //# sourceMappingURL=summarizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../../src/librarian/summarizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ export declare class Watcher {
2
+ private repoPath;
3
+ private gitUtils;
4
+ private statePath;
5
+ private watcher;
6
+ private onCommitCallback;
7
+ private debounceTimer;
8
+ private debounceDelay;
9
+ constructor(repoPath?: string);
10
+ /**
11
+ * Load state from file
12
+ */
13
+ private loadState;
14
+ /**
15
+ * Save state to file
16
+ */
17
+ private saveState;
18
+ /**
19
+ * Detect if there's a new commit
20
+ */
21
+ detectNewCommit(): Promise<string | null>;
22
+ /**
23
+ * Process a new commit (called by debounced handler)
24
+ */
25
+ private processNewCommit;
26
+ /**
27
+ * Debounced commit handler
28
+ */
29
+ private handleChange;
30
+ /**
31
+ * Start watching for Git changes
32
+ */
33
+ startWatching(): Promise<void>;
34
+ /**
35
+ * Register callback for when a commit is detected
36
+ */
37
+ onCommitDetected(callback: () => Promise<void>): void;
38
+ /**
39
+ * Stop watching
40
+ */
41
+ stopWatching(): Promise<void>;
42
+ /**
43
+ * Get last processed commit hash
44
+ */
45
+ getLastProcessedCommit(): Promise<string | null>;
46
+ /**
47
+ * Set last processed commit (useful for initialization)
48
+ */
49
+ setLastProcessedCommit(commitHash: string): Promise<void>;
50
+ }
51
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/librarian/watcher.ts"],"names":[],"mappings":"AAUA,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,gBAAgB,CAAsC;IAC9D,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,aAAa,CAAO;gBAEhB,QAAQ,GAAE,MAAsB;IAM5C;;OAEG;YACW,SAAS;IAavB;;OAEG;YACW,SAAS;IAQvB;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgB/C;;OAEG;YACW,gBAAgB;IAqC9B;;OAEG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IA8CpC;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIrD;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAYnC;;OAEG;IACG,sBAAsB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKtD;;OAEG;IACG,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOhE"}