@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.
- package/README.md +166 -0
- package/dashboard/dist/assets/Tableau10-B-NsZVaP.js +1 -0
- package/dashboard/dist/assets/arc-CZ1oDkm-.js +1 -0
- package/dashboard/dist/assets/array-BKyUJesY.js +1 -0
- package/dashboard/dist/assets/blockDiagram-c4efeb88-BLITAZDl.js +118 -0
- package/dashboard/dist/assets/c4Diagram-c83219d4-DErNj891.js +10 -0
- package/dashboard/dist/assets/channel-sWBGOq9p.js +1 -0
- package/dashboard/dist/assets/classDiagram-beda092f-Bj8IB6RW.js +2 -0
- package/dashboard/dist/assets/classDiagram-v2-2358418a-BZtd2g5W.js +2 -0
- package/dashboard/dist/assets/clone-DtEyH3ya.js +1 -0
- package/dashboard/dist/assets/createText-1719965b-DkNrTk-5.js +7 -0
- package/dashboard/dist/assets/edges-96097737-CYxl0j3g.js +4 -0
- package/dashboard/dist/assets/erDiagram-0228fc6a-ClEp9Atg.js +51 -0
- package/dashboard/dist/assets/flowDb-c6c81e3f-ClDJCJwu.js +10 -0
- package/dashboard/dist/assets/flowDiagram-50d868cf-DYxwClWS.js +4 -0
- package/dashboard/dist/assets/flowDiagram-v2-4f6560a1-D7vEnO1T.js +1 -0
- package/dashboard/dist/assets/flowchart-elk-definition-6af322e1-C-wX1mNx.js +139 -0
- package/dashboard/dist/assets/ganttDiagram-a2739b55-DTeLavAj.js +257 -0
- package/dashboard/dist/assets/gitGraphDiagram-82fe8481-ClxNoYya.js +70 -0
- package/dashboard/dist/assets/graph-CT-F3Got.js +1 -0
- package/dashboard/dist/assets/index-5325376f-C-jTCYZA.js +1 -0
- package/dashboard/dist/assets/index-CvYvquQR.js +283 -0
- package/dashboard/dist/assets/index-n43poL1x.css +1 -0
- package/dashboard/dist/assets/infoDiagram-8eee0895-Zljudo5L.js +7 -0
- package/dashboard/dist/assets/init-Gi6I4Gst.js +1 -0
- package/dashboard/dist/assets/journeyDiagram-c64418c1-DXzTbuum.js +139 -0
- package/dashboard/dist/assets/katex-Cu_Erd72.js +261 -0
- package/dashboard/dist/assets/layout-CVO3EizT.js +1 -0
- package/dashboard/dist/assets/line-CIgln-0z.js +1 -0
- package/dashboard/dist/assets/linear-bmIUMQqg.js +1 -0
- package/dashboard/dist/assets/mindmap-definition-8da855dc-BDLTNZYk.js +425 -0
- package/dashboard/dist/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dashboard/dist/assets/path-CbwjOpE9.js +1 -0
- package/dashboard/dist/assets/pieDiagram-a8764435-DtcOKNPc.js +35 -0
- package/dashboard/dist/assets/quadrantDiagram-1e28029f-zoSI_Ltf.js +7 -0
- package/dashboard/dist/assets/requirementDiagram-08caed73-TsQZ9lTB.js +52 -0
- package/dashboard/dist/assets/sankeyDiagram-a04cb91d-DE5ciDwD.js +8 -0
- package/dashboard/dist/assets/sequenceDiagram-c5b8d532-DhabPb2n.js +122 -0
- package/dashboard/dist/assets/stateDiagram-1ecb1508-Bg2q_YNx.js +1 -0
- package/dashboard/dist/assets/stateDiagram-v2-c2b004d7-Bs5iRjYB.js +1 -0
- package/dashboard/dist/assets/styles-b4e223ce-DchmAmav.js +160 -0
- package/dashboard/dist/assets/styles-ca3715f6-Bu5zjaDx.js +207 -0
- package/dashboard/dist/assets/styles-d45a18b0-jCaD8baR.js +116 -0
- package/dashboard/dist/assets/svgDrawCommon-b86b1483-BrYVGY4c.js +1 -0
- package/dashboard/dist/assets/timeline-definition-faaaa080--sq0bTHe.js +61 -0
- package/dashboard/dist/assets/xychartDiagram-f5964ef8-ByvzN0uj.js +7 -0
- package/dashboard/dist/index.html +22 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +641 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/dashboard.d.ts +2 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +184 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +501 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +602 -0
- package/dist/index.js.map +1 -0
- package/dist/librarian/autofix.d.ts +34 -0
- package/dist/librarian/autofix.d.ts.map +1 -0
- package/dist/librarian/autofix.js +369 -0
- package/dist/librarian/autofix.js.map +1 -0
- package/dist/librarian/heartbeat.d.ts +38 -0
- package/dist/librarian/heartbeat.d.ts.map +1 -0
- package/dist/librarian/heartbeat.js +98 -0
- package/dist/librarian/heartbeat.js.map +1 -0
- package/dist/librarian/initializer.d.ts +41 -0
- package/dist/librarian/initializer.d.ts.map +1 -0
- package/dist/librarian/initializer.js +202 -0
- package/dist/librarian/initializer.js.map +1 -0
- package/dist/librarian/memory-manager.d.ts +37 -0
- package/dist/librarian/memory-manager.d.ts.map +1 -0
- package/dist/librarian/memory-manager.js +205 -0
- package/dist/librarian/memory-manager.js.map +1 -0
- package/dist/librarian/oracle.d.ts +51 -0
- package/dist/librarian/oracle.d.ts.map +1 -0
- package/dist/librarian/oracle.js +235 -0
- package/dist/librarian/oracle.js.map +1 -0
- package/dist/librarian/summarizer.d.ts +19 -0
- package/dist/librarian/summarizer.d.ts.map +1 -0
- package/dist/librarian/summarizer.js +175 -0
- package/dist/librarian/summarizer.js.map +1 -0
- package/dist/librarian/watcher.d.ts +51 -0
- package/dist/librarian/watcher.d.ts.map +1 -0
- package/dist/librarian/watcher.js +189 -0
- package/dist/librarian/watcher.js.map +1 -0
- package/dist/mcp-server.d.ts +10 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +879 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/services/token-tracker.d.ts +58 -0
- package/dist/services/token-tracker.d.ts.map +1 -0
- package/dist/services/token-tracker.js +178 -0
- package/dist/services/token-tracker.js.map +1 -0
- package/dist/utils/chunker.d.ts +5 -0
- package/dist/utils/chunker.d.ts.map +1 -0
- package/dist/utils/chunker.js +121 -0
- package/dist/utils/chunker.js.map +1 -0
- package/dist/utils/config-manager.d.ts +65 -0
- package/dist/utils/config-manager.d.ts.map +1 -0
- package/dist/utils/config-manager.js +243 -0
- package/dist/utils/config-manager.js.map +1 -0
- package/dist/utils/config.d.ts +46 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +171 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/diff-cleaner.d.ts +13 -0
- package/dist/utils/diff-cleaner.d.ts.map +1 -0
- package/dist/utils/diff-cleaner.js +80 -0
- package/dist/utils/diff-cleaner.js.map +1 -0
- package/dist/utils/git.d.ts +71 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +285 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/llm.d.ts +30 -0
- package/dist/utils/llm.d.ts.map +1 -0
- package/dist/utils/llm.js +308 -0
- package/dist/utils/llm.js.map +1 -0
- package/dist/utils/pricing.d.ts +47 -0
- package/dist/utils/pricing.d.ts.map +1 -0
- package/dist/utils/pricing.js +171 -0
- package/dist/utils/pricing.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { GitUtils } from '../utils/git.js';
|
|
2
|
+
import { Summarizer } from './summarizer.js';
|
|
3
|
+
import { MemoryManager } from './memory-manager.js';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
export class Initializer {
|
|
6
|
+
repoPath;
|
|
7
|
+
gitUtils;
|
|
8
|
+
summarizer;
|
|
9
|
+
memoryManager;
|
|
10
|
+
constructor(repoPath = process.cwd()) {
|
|
11
|
+
this.repoPath = repoPath;
|
|
12
|
+
this.gitUtils = new GitUtils(repoPath);
|
|
13
|
+
this.summarizer = new Summarizer();
|
|
14
|
+
this.memoryManager = new MemoryManager(repoPath);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Ensure PROJECT_MEMORY.md is tracked in Git
|
|
18
|
+
*/
|
|
19
|
+
async ensureMemoryTrackedInGit() {
|
|
20
|
+
const memoryPath = path.join(this.repoPath, 'PROJECT_MEMORY.md');
|
|
21
|
+
const isIgnored = await this.gitUtils.isInGitignore(memoryPath);
|
|
22
|
+
if (isIgnored) {
|
|
23
|
+
console.log('Removing PROJECT_MEMORY.md from .gitignore...');
|
|
24
|
+
await this.gitUtils.removeFromGitignore(memoryPath);
|
|
25
|
+
}
|
|
26
|
+
// Stage the file if it exists
|
|
27
|
+
try {
|
|
28
|
+
await this.gitUtils.stageFile(memoryPath);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
// File doesn't exist yet - that's fine
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Tier 1: Oneline Sweep (0 tokens)
|
|
36
|
+
* Parse git log locally to identify milestone commits
|
|
37
|
+
*/
|
|
38
|
+
async tier1OnelineSweep() {
|
|
39
|
+
console.log('Tier 1: Analyzing commit history (oneline sweep)...');
|
|
40
|
+
try {
|
|
41
|
+
// Get last 100 commits or last 6 months
|
|
42
|
+
const sixMonthsAgo = new Date();
|
|
43
|
+
sixMonthsAgo.setMonth(sixMonthsAgo.getMonth() - 6);
|
|
44
|
+
const since = sixMonthsAgo.toISOString().split('T')[0];
|
|
45
|
+
const commits = await this.gitUtils.getOnelineLog(100, since);
|
|
46
|
+
if (commits.length === 0) {
|
|
47
|
+
console.log('No commit history found. This appears to be a brand new repository.');
|
|
48
|
+
return {
|
|
49
|
+
milestones: [],
|
|
50
|
+
totalCommits: 0,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const milestones = [];
|
|
54
|
+
// Keywords that indicate significant changes
|
|
55
|
+
const significantKeywords = [
|
|
56
|
+
'refactor',
|
|
57
|
+
'architecture',
|
|
58
|
+
'init',
|
|
59
|
+
'migration',
|
|
60
|
+
'restructure',
|
|
61
|
+
'redesign',
|
|
62
|
+
'major',
|
|
63
|
+
'breaking',
|
|
64
|
+
];
|
|
65
|
+
for (const commit of commits) {
|
|
66
|
+
let type = 'other';
|
|
67
|
+
const message = commit.message.toLowerCase();
|
|
68
|
+
// Check for tags (we'd need to check git tags separately)
|
|
69
|
+
// For now, we'll focus on merge commits and keywords
|
|
70
|
+
// Check for merge commits
|
|
71
|
+
if (message.includes('merge') || commit.hash.includes('merge')) {
|
|
72
|
+
type = 'merge';
|
|
73
|
+
milestones.push({
|
|
74
|
+
hash: commit.hash,
|
|
75
|
+
message: commit.message,
|
|
76
|
+
date: commit.date,
|
|
77
|
+
type,
|
|
78
|
+
});
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
// Check for significant keywords
|
|
82
|
+
for (const keyword of significantKeywords) {
|
|
83
|
+
if (message.includes(keyword)) {
|
|
84
|
+
type = 'keyword';
|
|
85
|
+
milestones.push({
|
|
86
|
+
hash: commit.hash,
|
|
87
|
+
message: commit.message,
|
|
88
|
+
date: commit.date,
|
|
89
|
+
type,
|
|
90
|
+
});
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
console.log(`Found ${milestones.length} milestone commits out of ${commits.length} total`);
|
|
96
|
+
return {
|
|
97
|
+
milestones,
|
|
98
|
+
totalCommits: commits.length,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
// Fallback for brand new repositories or Git errors
|
|
103
|
+
console.warn('Could not analyze commit history:', error.message || error);
|
|
104
|
+
console.log('Continuing with empty history...');
|
|
105
|
+
return {
|
|
106
|
+
milestones: [],
|
|
107
|
+
totalCommits: 0,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Tier 2: Deep Context (Mid-cost)
|
|
113
|
+
* Process last 5-10 commits with Gemini
|
|
114
|
+
*/
|
|
115
|
+
async tier2DeepContext() {
|
|
116
|
+
console.log('Tier 2: Processing recent commits (deep context)...');
|
|
117
|
+
const commitCount = 10; // Process last 10 commits
|
|
118
|
+
const commits = await this.gitUtils.getLatestCommits(commitCount);
|
|
119
|
+
if (commits.length === 0) {
|
|
120
|
+
return '';
|
|
121
|
+
}
|
|
122
|
+
// Get diffs for all commits
|
|
123
|
+
const diffs = [];
|
|
124
|
+
for (const commit of commits) {
|
|
125
|
+
try {
|
|
126
|
+
const diff = await this.gitUtils.getCommitDiff(commit.hash);
|
|
127
|
+
diffs.push(`## Commit: ${commit.message}\n\n${diff}`);
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
console.warn(`Failed to get diff for commit ${commit.hash}:`, error);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const combinedDiff = diffs.join('\n\n---\n\n');
|
|
134
|
+
// Read current memory if it exists
|
|
135
|
+
const currentMemory = await this.memoryManager.readMemory();
|
|
136
|
+
// Summarize with Gemini
|
|
137
|
+
const updatedMemory = await this.summarizer.summarizeDiff(combinedDiff, currentMemory, 'flash' // OPTIMIZATION: Use Flash for diff summarization (faster/cheaper)
|
|
138
|
+
);
|
|
139
|
+
return updatedMemory;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Tier 3: Skeleton Scan (High value)
|
|
143
|
+
* Infer architecture from file structure and README
|
|
144
|
+
*/
|
|
145
|
+
async tier3SkeletonScan() {
|
|
146
|
+
console.log('Tier 3: Analyzing project structure (skeleton scan)...');
|
|
147
|
+
// Get file structure
|
|
148
|
+
const fileStructure = await this.gitUtils.getFileStructure();
|
|
149
|
+
// Read README if it exists
|
|
150
|
+
const readme = await this.gitUtils.readReadme();
|
|
151
|
+
// Infer architecture with high thinking level
|
|
152
|
+
const memory = await this.summarizer.inferArchitecture(fileStructure, readme || undefined, 'pro' // OPTIMIZATION: Use Pro for "Big Picture" architecture work
|
|
153
|
+
);
|
|
154
|
+
return memory;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Main initialization orchestrator
|
|
158
|
+
*/
|
|
159
|
+
async initialize() {
|
|
160
|
+
console.log('Starting three-tier initialization...\n');
|
|
161
|
+
// Ensure memory is tracked in Git
|
|
162
|
+
await this.ensureMemoryTrackedInGit();
|
|
163
|
+
// Tier 1: Oneline sweep (0 tokens, local only)
|
|
164
|
+
const timeline = await this.tier1OnelineSweep();
|
|
165
|
+
console.log(`Tier 1 complete: ${timeline.milestones.length} milestones identified\n`);
|
|
166
|
+
// Tier 2: Deep context (process recent commits)
|
|
167
|
+
let tier2Memory = '';
|
|
168
|
+
try {
|
|
169
|
+
tier2Memory = await this.tier2DeepContext();
|
|
170
|
+
console.log('Tier 2 complete: Recent commits processed\n');
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
console.error('Tier 2 error:', error);
|
|
174
|
+
// Continue with Tier 3 even if Tier 2 fails
|
|
175
|
+
}
|
|
176
|
+
// Tier 3: Skeleton scan (infer architecture)
|
|
177
|
+
let tier3Memory = '';
|
|
178
|
+
try {
|
|
179
|
+
tier3Memory = await this.tier3SkeletonScan();
|
|
180
|
+
console.log('Tier 3 complete: Architecture inferred\n');
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
console.error('Tier 3 error:', error);
|
|
184
|
+
throw error; // Tier 3 is critical
|
|
185
|
+
}
|
|
186
|
+
// Merge Tier 2 and Tier 3 results
|
|
187
|
+
// If we have Tier 2 results, use them as base and enhance with Tier 3
|
|
188
|
+
// Otherwise, use Tier 3 as the base
|
|
189
|
+
let finalMemory = tier2Memory || tier3Memory;
|
|
190
|
+
// If we have both, merge them intelligently
|
|
191
|
+
if (tier2Memory && tier3Memory && tier2Memory !== tier3Memory) {
|
|
192
|
+
// Use Tier 3 as base (architecture) and merge Tier 2 (recent decisions)
|
|
193
|
+
// The summarizer can handle this by using Tier 2 as "current memory" and Tier 3 as "new diff"
|
|
194
|
+
finalMemory = await this.summarizer.summarizeDiff(`# Architecture Update\n\n${tier3Memory}`, tier2Memory, 'pro' // OPTIMIZATION: Use Pro for "Big Picture" architecture work
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
// Write the final memory
|
|
198
|
+
await this.memoryManager.writeMemory(finalMemory);
|
|
199
|
+
console.log('Initialization complete! PROJECT_MEMORY.md has been created/updated.');
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=initializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initializer.js","sourceRoot":"","sources":["../../src/librarian/initializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export declare class MemoryManager {
|
|
2
|
+
private repoPath;
|
|
3
|
+
private gitUtils;
|
|
4
|
+
constructor(repoPath?: string);
|
|
5
|
+
/**
|
|
6
|
+
* Get the full path to PROJECT_MEMORY.md
|
|
7
|
+
*/
|
|
8
|
+
private getMemoryPath;
|
|
9
|
+
/**
|
|
10
|
+
* Read existing PROJECT_MEMORY.md
|
|
11
|
+
*/
|
|
12
|
+
readMemory(): Promise<string>;
|
|
13
|
+
/**
|
|
14
|
+
* Validate memory file structure
|
|
15
|
+
*/
|
|
16
|
+
validateMemoryStructure(content: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Write memory file atomically
|
|
19
|
+
*/
|
|
20
|
+
writeMemory(content: string): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Stage PROJECT_MEMORY.md in Git
|
|
23
|
+
*/
|
|
24
|
+
stageMemoryFile(): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Append content to a specific section in PROJECT_MEMORY.md
|
|
27
|
+
* If the section exists, appends the content under that header.
|
|
28
|
+
* If not, appends to the end of the file.
|
|
29
|
+
* Uses atomic writes for safety.
|
|
30
|
+
*/
|
|
31
|
+
appendToSection(section: string, content: string): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Resolve Git conflicts using Gemini
|
|
34
|
+
*/
|
|
35
|
+
resolveConflicts(conflictedContent: string): Promise<string>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=memory-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-manager.d.ts","sourceRoot":"","sources":["../../src/librarian/memory-manager.ts"],"names":[],"mappings":"AAgBA,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAW;gBAEf,QAAQ,GAAE,MAAsB;IAK5C;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAsBnC;;OAEG;IACH,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAejD;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtC;;;;;OAKG;IACG,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgFtE;;OAEG;IACG,gBAAgB,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CA4CnE"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import writeFileAtomic from 'write-file-atomic';
|
|
4
|
+
import { GitUtils } from '../utils/git.js';
|
|
5
|
+
import { generateSummary } from '../utils/llm.js';
|
|
6
|
+
const MEMORY_FILE = 'PROJECT_MEMORY.md';
|
|
7
|
+
const REQUIRED_SECTIONS = [
|
|
8
|
+
'## Project Soul',
|
|
9
|
+
'## Tech Stack',
|
|
10
|
+
'## Architecture',
|
|
11
|
+
'## Core Rules',
|
|
12
|
+
'## Recent Decisions',
|
|
13
|
+
'## Active Tech Debt',
|
|
14
|
+
];
|
|
15
|
+
export class MemoryManager {
|
|
16
|
+
repoPath;
|
|
17
|
+
gitUtils;
|
|
18
|
+
constructor(repoPath = process.cwd()) {
|
|
19
|
+
this.repoPath = repoPath;
|
|
20
|
+
this.gitUtils = new GitUtils(repoPath);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get the full path to PROJECT_MEMORY.md
|
|
24
|
+
*/
|
|
25
|
+
getMemoryPath() {
|
|
26
|
+
return path.join(this.repoPath, MEMORY_FILE);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Read existing PROJECT_MEMORY.md
|
|
30
|
+
*/
|
|
31
|
+
async readMemory() {
|
|
32
|
+
const memoryPath = this.getMemoryPath();
|
|
33
|
+
try {
|
|
34
|
+
const content = await fs.readFile(memoryPath, 'utf-8');
|
|
35
|
+
// Check for conflict markers
|
|
36
|
+
if (this.gitUtils.hasConflictMarkers(content)) {
|
|
37
|
+
// Resolve conflicts using Gemini
|
|
38
|
+
return await this.resolveConflicts(content);
|
|
39
|
+
}
|
|
40
|
+
return content;
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (error.code === 'ENOENT') {
|
|
44
|
+
// File doesn't exist - return empty string
|
|
45
|
+
return '';
|
|
46
|
+
}
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Validate memory file structure
|
|
52
|
+
*/
|
|
53
|
+
validateMemoryStructure(content) {
|
|
54
|
+
if (!content || content.trim().length === 0) {
|
|
55
|
+
return false; // Empty file is invalid
|
|
56
|
+
}
|
|
57
|
+
// Check for all required sections
|
|
58
|
+
for (const section of REQUIRED_SECTIONS) {
|
|
59
|
+
if (!content.includes(section)) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Write memory file atomically
|
|
67
|
+
*/
|
|
68
|
+
async writeMemory(content) {
|
|
69
|
+
// Validate structure
|
|
70
|
+
if (!this.validateMemoryStructure(content)) {
|
|
71
|
+
throw new Error('Invalid PROJECT_MEMORY.md structure: missing required sections');
|
|
72
|
+
}
|
|
73
|
+
// Write atomically
|
|
74
|
+
const memoryPath = this.getMemoryPath();
|
|
75
|
+
await writeFileAtomic(memoryPath, content, 'utf-8');
|
|
76
|
+
// Auto-stage the file
|
|
77
|
+
await this.stageMemoryFile();
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Stage PROJECT_MEMORY.md in Git
|
|
81
|
+
*/
|
|
82
|
+
async stageMemoryFile() {
|
|
83
|
+
const memoryPath = this.getMemoryPath();
|
|
84
|
+
await this.gitUtils.stageFile(memoryPath);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Append content to a specific section in PROJECT_MEMORY.md
|
|
88
|
+
* If the section exists, appends the content under that header.
|
|
89
|
+
* If not, appends to the end of the file.
|
|
90
|
+
* Uses atomic writes for safety.
|
|
91
|
+
*/
|
|
92
|
+
async appendToSection(section, content) {
|
|
93
|
+
// Normalize section name to match markdown header format (## Section Name)
|
|
94
|
+
let sectionHeader = section.trim();
|
|
95
|
+
if (!sectionHeader.startsWith('##')) {
|
|
96
|
+
sectionHeader = `## ${sectionHeader}`;
|
|
97
|
+
}
|
|
98
|
+
// Read current memory
|
|
99
|
+
let currentContent = await this.readMemory();
|
|
100
|
+
// If file is empty, create basic structure
|
|
101
|
+
if (!currentContent || currentContent.trim().length === 0) {
|
|
102
|
+
currentContent = `# PROJECT_MEMORY.md\n\n${sectionHeader}\n\n`;
|
|
103
|
+
}
|
|
104
|
+
const lines = currentContent.split('\n');
|
|
105
|
+
const updatedLines = [];
|
|
106
|
+
let sectionFound = false;
|
|
107
|
+
let sectionIndex = -1;
|
|
108
|
+
// Find the section header (handle variations like "## Recent Decisions (The "Why")")
|
|
109
|
+
const normalizedSectionHeader = sectionHeader.replace(/^##\s+/, ''); // Remove ## prefix for comparison
|
|
110
|
+
for (let i = 0; i < lines.length; i++) {
|
|
111
|
+
const line = lines[i].trim();
|
|
112
|
+
// Match exact header or header with additional text in parentheses
|
|
113
|
+
if (line === sectionHeader ||
|
|
114
|
+
(line.startsWith('## ') && line.replace(/^##\s+/, '').split('(')[0].trim() === normalizedSectionHeader)) {
|
|
115
|
+
sectionFound = true;
|
|
116
|
+
sectionIndex = i;
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (sectionFound && sectionIndex >= 0) {
|
|
121
|
+
// Section exists - append content after the header
|
|
122
|
+
for (let i = 0; i <= sectionIndex; i++) {
|
|
123
|
+
updatedLines.push(lines[i]);
|
|
124
|
+
}
|
|
125
|
+
// Find the end of the section (next ## header or end of file)
|
|
126
|
+
let insertIndex = sectionIndex + 1;
|
|
127
|
+
// Skip blank lines after header
|
|
128
|
+
while (insertIndex < lines.length && lines[insertIndex].trim() === '') {
|
|
129
|
+
updatedLines.push(lines[insertIndex]);
|
|
130
|
+
insertIndex++;
|
|
131
|
+
}
|
|
132
|
+
// Add the new content with proper formatting
|
|
133
|
+
const formattedContent = content.trim();
|
|
134
|
+
if (formattedContent) {
|
|
135
|
+
updatedLines.push(formattedContent);
|
|
136
|
+
updatedLines.push(''); // Add blank line after content
|
|
137
|
+
}
|
|
138
|
+
// Add remaining lines
|
|
139
|
+
for (let i = insertIndex; i < lines.length; i++) {
|
|
140
|
+
updatedLines.push(lines[i]);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
// Section doesn't exist - append to end
|
|
145
|
+
updatedLines.push(...lines);
|
|
146
|
+
if (lines[lines.length - 1] !== '') {
|
|
147
|
+
updatedLines.push(''); // Ensure blank line before new section
|
|
148
|
+
}
|
|
149
|
+
updatedLines.push(sectionHeader);
|
|
150
|
+
updatedLines.push(''); // Blank line after header
|
|
151
|
+
updatedLines.push(content.trim());
|
|
152
|
+
}
|
|
153
|
+
const updatedContent = updatedLines.join('\n');
|
|
154
|
+
// Write atomically
|
|
155
|
+
const memoryPath = this.getMemoryPath();
|
|
156
|
+
await writeFileAtomic(memoryPath, updatedContent, 'utf-8');
|
|
157
|
+
// Auto-stage the file
|
|
158
|
+
await this.stageMemoryFile();
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Resolve Git conflicts using Gemini
|
|
162
|
+
*/
|
|
163
|
+
async resolveConflicts(conflictedContent) {
|
|
164
|
+
const conflictPrompt = `You are "The Librarian," an expert Software Architect and Context Manager.
|
|
165
|
+
|
|
166
|
+
# TASK
|
|
167
|
+
Merge the following conflicted PROJECT_MEMORY.md file. The file contains Git conflict markers (<<<<<<<, =======, >>>>>>>).
|
|
168
|
+
|
|
169
|
+
# INSTRUCTIONS
|
|
170
|
+
1. Remove all conflict markers (<<<<<<<, =======, >>>>>>>)
|
|
171
|
+
2. Intelligently merge the conflicting sections, preserving important information from both versions
|
|
172
|
+
3. Maintain the required structure:
|
|
173
|
+
- ## Project Soul
|
|
174
|
+
- ## Tech Stack
|
|
175
|
+
- ## Architecture
|
|
176
|
+
- ## Core Rules
|
|
177
|
+
- ## Recent Decisions (The "Why")
|
|
178
|
+
- ## Active Tech Debt
|
|
179
|
+
4. Preserve all Recent Decisions entries; do not delete older entries during merge
|
|
180
|
+
5. Return the complete, merged Markdown file with no conflict markers
|
|
181
|
+
|
|
182
|
+
# CONFLICTED FILE
|
|
183
|
+
${conflictedContent}
|
|
184
|
+
|
|
185
|
+
# OUTPUT
|
|
186
|
+
Return only the merged Markdown content, no explanations.`;
|
|
187
|
+
const systemPrompt = `You are a Git conflict resolution expert specializing in Markdown files about software architecture.`;
|
|
188
|
+
try {
|
|
189
|
+
const merged = await generateSummary(conflictPrompt, systemPrompt, {
|
|
190
|
+
thinkingLevel: 'flash',
|
|
191
|
+
temperature: 0.2, // Lower temperature for more consistent merging
|
|
192
|
+
feature: 'Librarian',
|
|
193
|
+
});
|
|
194
|
+
// Validate the merged result
|
|
195
|
+
if (this.gitUtils.hasConflictMarkers(merged)) {
|
|
196
|
+
throw new Error('Conflict resolution failed: merged content still contains conflict markers');
|
|
197
|
+
}
|
|
198
|
+
return merged;
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
throw new Error(`Failed to resolve conflicts: ${error}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=memory-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-manager.js","sourceRoot":"","sources":["../../src/librarian/memory-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export interface Prophecy {
|
|
2
|
+
id: string;
|
|
3
|
+
type: 'Refactor' | 'RuleViolation' | 'Optimization';
|
|
4
|
+
title: string;
|
|
5
|
+
description: string;
|
|
6
|
+
suggestedAction: string;
|
|
7
|
+
priority: 'High' | 'Medium' | 'Low';
|
|
8
|
+
createdAt: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class OracleService {
|
|
11
|
+
private repoPath;
|
|
12
|
+
private statePath;
|
|
13
|
+
constructor(repoPath?: string);
|
|
14
|
+
/**
|
|
15
|
+
* Load oracle state from file
|
|
16
|
+
*/
|
|
17
|
+
private loadState;
|
|
18
|
+
/**
|
|
19
|
+
* Save oracle state to file
|
|
20
|
+
*/
|
|
21
|
+
private saveState;
|
|
22
|
+
/**
|
|
23
|
+
* Scan the project directory and return file tree structure
|
|
24
|
+
*/
|
|
25
|
+
private scanProjectTree;
|
|
26
|
+
/**
|
|
27
|
+
* Read PROJECT_MEMORY.md
|
|
28
|
+
*/
|
|
29
|
+
private readProjectMemory;
|
|
30
|
+
/**
|
|
31
|
+
* Read DIAGRAM.md
|
|
32
|
+
*/
|
|
33
|
+
private readDiagram;
|
|
34
|
+
/**
|
|
35
|
+
* Seek prophecy - Compare Project Soul/Rules with actual file structure
|
|
36
|
+
*/
|
|
37
|
+
seekProphecy(): Promise<Prophecy[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Get all prophecies
|
|
40
|
+
*/
|
|
41
|
+
getProphecies(): Promise<Prophecy[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Get prophecies by priority
|
|
44
|
+
*/
|
|
45
|
+
getPropheciesByPriority(priority: 'High' | 'Medium' | 'Low'): Promise<Prophecy[]>;
|
|
46
|
+
/**
|
|
47
|
+
* Clear all prophecies
|
|
48
|
+
*/
|
|
49
|
+
clearProphecies(): Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=oracle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oracle.d.ts","sourceRoot":"","sources":["../../src/librarian/oracle.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,GAAG,eAAe,GAAG,cAAc,CAAC;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;gBAEd,QAAQ,GAAE,MAAsB;IAK5C;;OAEG;YACW,SAAS;IAavB;;OAEG;YACW,SAAS;IAQvB;;OAEG;YACW,eAAe;IAoD7B;;OAEG;YACW,iBAAiB;IAS/B;;OAEG;YACW,WAAW;IASzB;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAkHzC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAK1C;;OAEG;IACG,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAKvF;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;CAMvC"}
|