chronicle-ai 0.0.1
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 +132 -0
- package/package.json +86 -0
- package/packages/README.md +139 -0
- package/packages/cli/README.md +92 -0
- package/packages/cli/bin/chronicle.js +2 -0
- package/packages/cli/dist/commands/add.d.ts +2 -0
- package/packages/cli/dist/commands/add.d.ts.map +1 -0
- package/packages/cli/dist/commands/add.js +82 -0
- package/packages/cli/dist/commands/add.js.map +1 -0
- package/packages/cli/dist/commands/diff.d.ts +11 -0
- package/packages/cli/dist/commands/diff.d.ts.map +1 -0
- package/packages/cli/dist/commands/diff.js +164 -0
- package/packages/cli/dist/commands/diff.js.map +1 -0
- package/packages/cli/dist/commands/init.d.ts +2 -0
- package/packages/cli/dist/commands/init.d.ts.map +1 -0
- package/packages/cli/dist/commands/init.js +54 -0
- package/packages/cli/dist/commands/init.js.map +1 -0
- package/packages/cli/dist/commands/list.d.ts +2 -0
- package/packages/cli/dist/commands/list.d.ts.map +1 -0
- package/packages/cli/dist/commands/list.js +62 -0
- package/packages/cli/dist/commands/list.js.map +1 -0
- package/packages/cli/dist/commands/log.d.ts +4 -0
- package/packages/cli/dist/commands/log.d.ts.map +1 -0
- package/packages/cli/dist/commands/log.js +223 -0
- package/packages/cli/dist/commands/log.js.map +1 -0
- package/packages/cli/dist/commands/pause.d.ts +3 -0
- package/packages/cli/dist/commands/pause.d.ts.map +1 -0
- package/packages/cli/dist/commands/pause.js +49 -0
- package/packages/cli/dist/commands/pause.js.map +1 -0
- package/packages/cli/dist/commands/queue.d.ts +2 -0
- package/packages/cli/dist/commands/queue.d.ts.map +1 -0
- package/packages/cli/dist/commands/queue.js +96 -0
- package/packages/cli/dist/commands/queue.js.map +1 -0
- package/packages/cli/dist/commands/remove.d.ts +2 -0
- package/packages/cli/dist/commands/remove.d.ts.map +1 -0
- package/packages/cli/dist/commands/remove.js +80 -0
- package/packages/cli/dist/commands/remove.js.map +1 -0
- package/packages/cli/dist/commands/reset.d.ts +5 -0
- package/packages/cli/dist/commands/reset.d.ts.map +1 -0
- package/packages/cli/dist/commands/reset.js +90 -0
- package/packages/cli/dist/commands/reset.js.map +1 -0
- package/packages/cli/dist/commands/restart.d.ts +2 -0
- package/packages/cli/dist/commands/restart.d.ts.map +1 -0
- package/packages/cli/dist/commands/restart.js +72 -0
- package/packages/cli/dist/commands/restart.js.map +1 -0
- package/packages/cli/dist/commands/start.d.ts +2 -0
- package/packages/cli/dist/commands/start.d.ts.map +1 -0
- package/packages/cli/dist/commands/start.js +127 -0
- package/packages/cli/dist/commands/start.js.map +1 -0
- package/packages/cli/dist/commands/status.d.ts +2 -0
- package/packages/cli/dist/commands/status.d.ts.map +1 -0
- package/packages/cli/dist/commands/status.js +181 -0
- package/packages/cli/dist/commands/status.js.map +1 -0
- package/packages/cli/dist/commands/stop.d.ts +2 -0
- package/packages/cli/dist/commands/stop.d.ts.map +1 -0
- package/packages/cli/dist/commands/stop.js +64 -0
- package/packages/cli/dist/commands/stop.js.map +1 -0
- package/packages/cli/dist/index.d.ts +2 -0
- package/packages/cli/dist/index.d.ts.map +1 -0
- package/packages/cli/dist/index.js +85 -0
- package/packages/cli/dist/index.js.map +1 -0
- package/packages/cli/dist/utils/paths.d.ts +26 -0
- package/packages/cli/dist/utils/paths.d.ts.map +1 -0
- package/packages/cli/dist/utils/paths.js +183 -0
- package/packages/cli/dist/utils/paths.js.map +1 -0
- package/packages/cli/package.json +25 -0
- package/packages/daemon/README.md +83 -0
- package/packages/daemon/dist/ai_test.d.ts +2 -0
- package/packages/daemon/dist/ai_test.d.ts.map +1 -0
- package/packages/daemon/dist/ai_test.js +4 -0
- package/packages/daemon/dist/ai_test.js.map +1 -0
- package/packages/daemon/dist/index.d.ts +2 -0
- package/packages/daemon/dist/index.d.ts.map +1 -0
- package/packages/daemon/dist/index.js +147 -0
- package/packages/daemon/dist/index.js.map +1 -0
- package/packages/daemon/dist/jobs/AIProcessor.d.ts +6 -0
- package/packages/daemon/dist/jobs/AIProcessor.d.ts.map +1 -0
- package/packages/daemon/dist/jobs/AIProcessor.js +58 -0
- package/packages/daemon/dist/jobs/AIProcessor.js.map +1 -0
- package/packages/daemon/dist/jobs/DocProcessor.d.ts +8 -0
- package/packages/daemon/dist/jobs/DocProcessor.d.ts.map +1 -0
- package/packages/daemon/dist/jobs/DocProcessor.js +336 -0
- package/packages/daemon/dist/jobs/DocProcessor.js.map +1 -0
- package/packages/daemon/dist/jobs/FileProcessor.d.ts +7 -0
- package/packages/daemon/dist/jobs/FileProcessor.d.ts.map +1 -0
- package/packages/daemon/dist/jobs/FileProcessor.js +29 -0
- package/packages/daemon/dist/jobs/FileProcessor.js.map +1 -0
- package/packages/daemon/dist/jobs/SystemProcessor.d.ts +13 -0
- package/packages/daemon/dist/jobs/SystemProcessor.d.ts.map +1 -0
- package/packages/daemon/dist/jobs/SystemProcessor.js +38 -0
- package/packages/daemon/dist/jobs/SystemProcessor.js.map +1 -0
- package/packages/daemon/dist/jobs/UpdateProcessor.d.ts +21 -0
- package/packages/daemon/dist/jobs/UpdateProcessor.d.ts.map +1 -0
- package/packages/daemon/dist/jobs/UpdateProcessor.js +222 -0
- package/packages/daemon/dist/jobs/UpdateProcessor.js.map +1 -0
- package/packages/daemon/dist/services/AIService.d.ts +90 -0
- package/packages/daemon/dist/services/AIService.d.ts.map +1 -0
- package/packages/daemon/dist/services/AIService.js +451 -0
- package/packages/daemon/dist/services/AIService.js.map +1 -0
- package/packages/daemon/dist/services/ConfigService.d.ts +30 -0
- package/packages/daemon/dist/services/ConfigService.d.ts.map +1 -0
- package/packages/daemon/dist/services/ConfigService.js +69 -0
- package/packages/daemon/dist/services/ConfigService.js.map +1 -0
- package/packages/daemon/dist/services/DatabaseService.d.ts +204 -0
- package/packages/daemon/dist/services/DatabaseService.d.ts.map +1 -0
- package/packages/daemon/dist/services/DatabaseService.js +692 -0
- package/packages/daemon/dist/services/DatabaseService.js.map +1 -0
- package/packages/daemon/dist/services/GitService.d.ts +12 -0
- package/packages/daemon/dist/services/GitService.d.ts.map +1 -0
- package/packages/daemon/dist/services/GitService.js +68 -0
- package/packages/daemon/dist/services/GitService.js.map +1 -0
- package/packages/daemon/dist/services/QueueService.d.ts +16 -0
- package/packages/daemon/dist/services/QueueService.d.ts.map +1 -0
- package/packages/daemon/dist/services/QueueService.js +87 -0
- package/packages/daemon/dist/services/QueueService.js.map +1 -0
- package/packages/daemon/dist/services/TriggerService.d.ts +37 -0
- package/packages/daemon/dist/services/TriggerService.d.ts.map +1 -0
- package/packages/daemon/dist/services/TriggerService.js +150 -0
- package/packages/daemon/dist/services/TriggerService.js.map +1 -0
- package/packages/daemon/dist/services/WatcherService.d.ts +12 -0
- package/packages/daemon/dist/services/WatcherService.d.ts.map +1 -0
- package/packages/daemon/dist/services/WatcherService.js +77 -0
- package/packages/daemon/dist/services/WatcherService.js.map +1 -0
- package/packages/daemon/dist/services/index.d.ts +2 -0
- package/packages/daemon/dist/services/index.d.ts.map +1 -0
- package/packages/daemon/dist/services/index.js +18 -0
- package/packages/daemon/dist/services/index.js.map +1 -0
- package/packages/daemon/dist/test-ignore.js +0 -0
- package/packages/daemon/package.json +28 -0
- package/packages/ui/app/actions.ts +73 -0
- package/packages/ui/app/api/ai-activity/route.ts +14 -0
- package/packages/ui/app/globals.css +98 -0
- package/packages/ui/app/layout.tsx +29 -0
- package/packages/ui/app/page.tsx +109 -0
- package/packages/ui/components/AutoRefresh.tsx +18 -0
- package/packages/ui/components/DocumentationViewer.tsx +276 -0
- package/packages/ui/components/FileList.tsx +69 -0
- package/packages/ui/components/HeaderWithThinking.tsx +102 -0
- package/packages/ui/components/JobQueue.tsx +194 -0
- package/packages/ui/components/JobQueueWrapper.tsx +31 -0
- package/packages/ui/components/MermaidInit.tsx +24 -0
- package/packages/ui/components/ProjectContentArea.tsx +186 -0
- package/packages/ui/components/ProjectList.tsx +136 -0
- package/packages/ui/components/ThinkingDrawer.tsx +377 -0
- package/packages/ui/components/ThinkingPanel.tsx +63 -0
- package/packages/ui/components/TriggerSettings.tsx +185 -0
- package/packages/ui/components/VersionSelector.tsx +132 -0
- package/packages/ui/lib/db.ts +521 -0
- package/packages/ui/next-env.d.ts +5 -0
- package/packages/ui/next.config.js +4 -0
- package/packages/ui/package.json +32 -0
- package/packages/ui/postcss.config.js +6 -0
- package/packages/ui/public/logo.png +0 -0
- package/packages/ui/tailwind.config.ts +32 -0
- package/packages/ui/tsconfig.json +40 -0
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AIService = void 0;
|
|
4
|
+
const genai_1 = require("@google/genai");
|
|
5
|
+
class AIService {
|
|
6
|
+
genAI;
|
|
7
|
+
apiKey;
|
|
8
|
+
// Model names
|
|
9
|
+
THINKING_MODEL = 'gemini-3-pro-preview';
|
|
10
|
+
FAST_MODEL = 'gemini-3-flash-preview';
|
|
11
|
+
EMBEDDING_MODEL = 'text-embedding-004';
|
|
12
|
+
constructor(apiKey) {
|
|
13
|
+
this.apiKey = apiKey;
|
|
14
|
+
this.genAI = new genai_1.GoogleGenAI({ apiKey });
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generates a vector embedding for the given text.
|
|
18
|
+
* Returns a 768-element Float32Array (or number array).
|
|
19
|
+
*/
|
|
20
|
+
async generateEmbedding(text) {
|
|
21
|
+
const result = await this.genAI.models.embedContent({
|
|
22
|
+
model: this.EMBEDDING_MODEL,
|
|
23
|
+
contents: text
|
|
24
|
+
});
|
|
25
|
+
return result.embeddings?.[0]?.values || [];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Helper to generate content with retry logic for rate limiting.
|
|
29
|
+
*/
|
|
30
|
+
async generateWithRetry(prompt, model = this.FAST_MODEL, thinkingLevel, retries = 5, delay = 30000) {
|
|
31
|
+
for (let i = 0; i < retries; i++) {
|
|
32
|
+
try {
|
|
33
|
+
const result = await this.genAI.models.generateContent({
|
|
34
|
+
model,
|
|
35
|
+
contents: prompt,
|
|
36
|
+
config: thinkingLevel ? {
|
|
37
|
+
thinkingConfig: { thinkingLevel }
|
|
38
|
+
} : undefined
|
|
39
|
+
});
|
|
40
|
+
return result.text || '';
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (error?.status === 429 || error?.message?.includes('429')) {
|
|
44
|
+
console.warn(`⏳ Quota exceeded. Retrying in ${delay / 1000}s... (Attempt ${i + 1}/${retries})`);
|
|
45
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
46
|
+
delay *= 1.5; // Exponential backoff
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
throw new Error('Max retries exceeded for AI generation');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Generates content with thinking and returns both the content and thought summaries.
|
|
57
|
+
* Uses HIGH thinking level with includeThoughts for capturing reasoning.
|
|
58
|
+
*/
|
|
59
|
+
async generateWithThoughts(prompt, context, retries = 5, delay = 30000) {
|
|
60
|
+
// Log activity start
|
|
61
|
+
let activityId;
|
|
62
|
+
if (context) {
|
|
63
|
+
try {
|
|
64
|
+
activityId = context.db.logAIActivity({
|
|
65
|
+
projectId: context.projectId,
|
|
66
|
+
versionId: context.versionId,
|
|
67
|
+
activityType: context.activityType || 'generate',
|
|
68
|
+
promptSummary: prompt.slice(0, 500),
|
|
69
|
+
status: 'running',
|
|
70
|
+
thinkingSummary: 'Thinking...'
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
console.error('Failed to log AI activity start:', e);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const startTime = Date.now();
|
|
78
|
+
for (let i = 0; i < retries; i++) {
|
|
79
|
+
try {
|
|
80
|
+
const result = await this.genAI.models.generateContent({
|
|
81
|
+
model: this.THINKING_MODEL,
|
|
82
|
+
contents: prompt,
|
|
83
|
+
config: {
|
|
84
|
+
thinkingConfig: {
|
|
85
|
+
thinkingLevel: genai_1.ThinkingLevel.HIGH,
|
|
86
|
+
includeThoughts: true
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
const thoughts = [];
|
|
91
|
+
let content = '';
|
|
92
|
+
let hasExtendedReasoning = false;
|
|
93
|
+
// Parse response parts to separate thoughts from content
|
|
94
|
+
const candidate = result.candidates?.[0];
|
|
95
|
+
if (candidate?.content?.parts) {
|
|
96
|
+
for (const part of candidate.content.parts) {
|
|
97
|
+
// Check for thoughtSignature (indicates extended reasoning was used)
|
|
98
|
+
if (part.thoughtSignature) {
|
|
99
|
+
hasExtendedReasoning = true;
|
|
100
|
+
}
|
|
101
|
+
if (part.text) {
|
|
102
|
+
// Check for thought property
|
|
103
|
+
if (part.thought === true) {
|
|
104
|
+
thoughts.push(part.text);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
content += part.text;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Fallback to standard text if parts parsing failed
|
|
113
|
+
if (!content) {
|
|
114
|
+
content = result.text || '';
|
|
115
|
+
}
|
|
116
|
+
const duration = Date.now() - startTime;
|
|
117
|
+
// Build thinking summary
|
|
118
|
+
let thinkingSummary = '';
|
|
119
|
+
if (thoughts.length > 0) {
|
|
120
|
+
thinkingSummary = thoughts.join('\n\n');
|
|
121
|
+
}
|
|
122
|
+
else if (hasExtendedReasoning) {
|
|
123
|
+
thinkingSummary = '✓ Extended reasoning used';
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
thinkingSummary = 'No thoughts captured.';
|
|
127
|
+
}
|
|
128
|
+
// Log activity completion
|
|
129
|
+
if (context && activityId) {
|
|
130
|
+
try {
|
|
131
|
+
context.db.updateAIActivity(activityId, {
|
|
132
|
+
responsePreview: content.slice(0, 500),
|
|
133
|
+
thinkingSummary,
|
|
134
|
+
durationMs: duration,
|
|
135
|
+
status: 'completed'
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
catch (e) {
|
|
139
|
+
console.error('Failed to log AI activity completion:', e);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return { content, thoughts, hasExtendedReasoning };
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
if (error?.status === 429 || error?.message?.includes('429')) {
|
|
146
|
+
console.warn(`⏳ Quota exceeded. Retrying in ${delay / 1000}s... (Attempt ${i + 1}/${retries})`);
|
|
147
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
148
|
+
delay *= 1.5;
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
// Log error
|
|
152
|
+
if (context && activityId) {
|
|
153
|
+
try {
|
|
154
|
+
context.db.updateAIActivity(activityId, {
|
|
155
|
+
status: 'error',
|
|
156
|
+
responsePreview: `Error: ${error.message}`
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
catch (e) {
|
|
160
|
+
console.error('Failed to log AI activity error:', e);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
throw error;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
throw new Error('Max retries exceeded for AI generation with thoughts');
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Generates a concise summary of the provided text.
|
|
171
|
+
*/
|
|
172
|
+
async generateSummary(text) {
|
|
173
|
+
const prompt = `
|
|
174
|
+
Please provide a concise technical summary of the following code or documentation.
|
|
175
|
+
Focus on purpose, key functionality, and dependencies.
|
|
176
|
+
|
|
177
|
+
Text:
|
|
178
|
+
${text.slice(0, 10000)} -- Truncated for token limits if excessively large
|
|
179
|
+
`;
|
|
180
|
+
return this.generateWithRetry(prompt, this.FAST_MODEL);
|
|
181
|
+
}
|
|
182
|
+
async analyzeProjectStructure(files) {
|
|
183
|
+
const fileList = files.slice(0, 500).join('\n'); // Avoid token limits
|
|
184
|
+
const prompt = `
|
|
185
|
+
You are an expert Software Architect acting as a "Living Documentation Daemon".
|
|
186
|
+
Analyze the following file structure of a software project.
|
|
187
|
+
Infer the tech stack, key modules, architecture type, and likely purpose.
|
|
188
|
+
|
|
189
|
+
Files:
|
|
190
|
+
${fileList}
|
|
191
|
+
|
|
192
|
+
Output a concise JSON summary with keys:
|
|
193
|
+
- name (inferred)
|
|
194
|
+
- type (e.g. valid 'monorepo', 'backend', 'frontend', 'cli')
|
|
195
|
+
- stack (array of key techs e.g. 'Typescript', 'React', 'Go')
|
|
196
|
+
- summary (2 sentences)
|
|
197
|
+
`;
|
|
198
|
+
const text = await this.generateWithRetry(prompt, this.THINKING_MODEL, genai_1.ThinkingLevel.HIGH);
|
|
199
|
+
return text.replace(/```json/g, '').replace(/```/g, '');
|
|
200
|
+
}
|
|
201
|
+
async generateReadme(analysis, files) {
|
|
202
|
+
const prompt = `
|
|
203
|
+
CRITICAL: Output ONLY the raw markdown content. Do NOT include any preamble like "Here is...", "I've created...", or any other conversational text. Start directly with the markdown.
|
|
204
|
+
|
|
205
|
+
Generate a professional README.md for this project based on the analysis below.
|
|
206
|
+
It should be modern, clean, and use badges if applicable.
|
|
207
|
+
|
|
208
|
+
Analysis:
|
|
209
|
+
${analysis}
|
|
210
|
+
|
|
211
|
+
Structure:
|
|
212
|
+
- Title & Description
|
|
213
|
+
- Tech Stack
|
|
214
|
+
- Structure (High level modules based on file list)
|
|
215
|
+
- Getting Started (inferred from standard package.json/Makefile patterns if visible in file list keys)
|
|
216
|
+
|
|
217
|
+
File List Sample:
|
|
218
|
+
${files.slice(0, 50).join('\n')}
|
|
219
|
+
|
|
220
|
+
REMINDER: Start your response with the markdown heading (e.g., "# Project Name"). No introductory text.
|
|
221
|
+
`;
|
|
222
|
+
return this.generateWithRetry(prompt, this.THINKING_MODEL, genai_1.ThinkingLevel.LOW);
|
|
223
|
+
}
|
|
224
|
+
async generateChronicleInit(analysis) {
|
|
225
|
+
const prompt = `
|
|
226
|
+
CRITICAL: Output ONLY the raw markdown content. Do NOT include any preamble like "Here is...", "I've created...", or any other conversational text. Start directly with the markdown.
|
|
227
|
+
|
|
228
|
+
Create a 'chronicle.md' file content.
|
|
229
|
+
This file serves as the "Living History" of the documentation daemon's actions.
|
|
230
|
+
|
|
231
|
+
It should start with a header: "# Chronicle: Living Documentation Log"
|
|
232
|
+
And an initial entry:
|
|
233
|
+
"## [Init] Daemon Attached"
|
|
234
|
+
- Date: ${new Date().toISOString()}
|
|
235
|
+
- Action: Initial Reconnaissance
|
|
236
|
+
- Insights: [Summarize the analysis here briefly]
|
|
237
|
+
|
|
238
|
+
Analysis Context:
|
|
239
|
+
${analysis}
|
|
240
|
+
|
|
241
|
+
REMINDER: Start your response with "# Chronicle:". No introductory text.
|
|
242
|
+
`;
|
|
243
|
+
return this.generateWithRetry(prompt, this.THINKING_MODEL, genai_1.ThinkingLevel.LOW);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Generates a single chronicle entry to append (not full file).
|
|
247
|
+
*/
|
|
248
|
+
async generateChronicleEntry(action, details) {
|
|
249
|
+
const date = new Date().toISOString().split('T')[0];
|
|
250
|
+
const prompt = `
|
|
251
|
+
CRITICAL: Output ONLY the raw markdown. No preamble, no "Here is...", no conversational text.
|
|
252
|
+
|
|
253
|
+
Generate a brief markdown changelog entry for a documentation update.
|
|
254
|
+
Format:
|
|
255
|
+
## [${date}] ${action}
|
|
256
|
+
- [1-2 bullet points summarizing what changed]
|
|
257
|
+
|
|
258
|
+
Details:
|
|
259
|
+
${details}
|
|
260
|
+
|
|
261
|
+
Keep it under 5 lines total. Be concise. Start directly with "## [". No intro.
|
|
262
|
+
`;
|
|
263
|
+
return this.generateWithRetry(prompt, this.FAST_MODEL);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Generates ARCHITECTURE.md content.
|
|
267
|
+
*/
|
|
268
|
+
async generateArchitectureDoc(analysis, files) {
|
|
269
|
+
const prompt = `
|
|
270
|
+
CRITICAL: Output ONLY the raw markdown content. Do NOT include any preamble like "Here is...", "I've created...", or any other conversational text. Start directly with the markdown.
|
|
271
|
+
|
|
272
|
+
Generate an ARCHITECTURE.md document for this project.
|
|
273
|
+
|
|
274
|
+
Include:
|
|
275
|
+
1. Overview - High level purpose
|
|
276
|
+
2. System Components - Key modules/packages and their roles
|
|
277
|
+
3. Data Flow - How data moves through the system
|
|
278
|
+
4. Dependencies - External services/APIs used
|
|
279
|
+
5. Diagrams (describe in text, e.g. "Component A -> Component B")
|
|
280
|
+
|
|
281
|
+
Use numbered sections (1.0, 1.1, 2.0, etc.).
|
|
282
|
+
Be thorough but concise.
|
|
283
|
+
|
|
284
|
+
Analysis:
|
|
285
|
+
${analysis}
|
|
286
|
+
|
|
287
|
+
File Structure Sample:
|
|
288
|
+
${files.slice(0, 100).join('\n')}
|
|
289
|
+
|
|
290
|
+
REMINDER: Start with "# ARCHITECTURE". No introductory text.
|
|
291
|
+
`;
|
|
292
|
+
return this.generateWithRetry(prompt, this.THINKING_MODEL, genai_1.ThinkingLevel.LOW);
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Generates MODULES.md content.
|
|
296
|
+
*/
|
|
297
|
+
async generateModulesDoc(analysis, files) {
|
|
298
|
+
const prompt = `
|
|
299
|
+
CRITICAL: Output ONLY the raw markdown content. Do NOT include any preamble like "Here is...", "I've created...", or any other conversational text. Start directly with the markdown.
|
|
300
|
+
|
|
301
|
+
Generate a MODULES.md document that describes each module/package in this project.
|
|
302
|
+
|
|
303
|
+
For each module include:
|
|
304
|
+
- Name
|
|
305
|
+
- Purpose (1-2 sentences)
|
|
306
|
+
- Key files
|
|
307
|
+
- Dependencies on other modules
|
|
308
|
+
|
|
309
|
+
Use numbered sections. Group by package/folder if it's a monorepo.
|
|
310
|
+
|
|
311
|
+
Analysis:
|
|
312
|
+
${analysis}
|
|
313
|
+
|
|
314
|
+
File Structure:
|
|
315
|
+
${files.slice(0, 200).join('\n')}
|
|
316
|
+
|
|
317
|
+
REMINDER: Start with "# MODULES". No introductory text.
|
|
318
|
+
`;
|
|
319
|
+
return this.generateWithRetry(prompt, this.THINKING_MODEL, genai_1.ThinkingLevel.HIGH);
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Detects project type to determine which docs to generate.
|
|
323
|
+
*/
|
|
324
|
+
async detectProjectType(files) {
|
|
325
|
+
const fileList = files.slice(0, 300).join('\n');
|
|
326
|
+
const prompt = `
|
|
327
|
+
Analyze this file structure and determine:
|
|
328
|
+
1. Does this project have an HTTP API/server? (look for routes, handlers, express, fastify, etc.)
|
|
329
|
+
2. Does this project have a CLI? (look for commander, yargs, bin/, cli commands)
|
|
330
|
+
3. Is this a monorepo? (look for packages/, workspaces, lerna, turborepo)
|
|
331
|
+
|
|
332
|
+
Files:
|
|
333
|
+
${fileList}
|
|
334
|
+
|
|
335
|
+
Respond ONLY with JSON: { "hasApi": boolean, "hasCli": boolean, "isMonorepo": boolean }
|
|
336
|
+
`;
|
|
337
|
+
const text = await this.generateWithRetry(prompt, this.THINKING_MODEL, genai_1.ThinkingLevel.HIGH);
|
|
338
|
+
try {
|
|
339
|
+
return JSON.parse(text.replace(/```json/g, '').replace(/```/g, '').trim());
|
|
340
|
+
}
|
|
341
|
+
catch {
|
|
342
|
+
return { hasApi: false, hasCli: false, isMonorepo: false };
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Creates a documentation coverage plan - Stage 1 of multi-stage documentation.
|
|
347
|
+
* Returns a structured plan for what docs to generate and in what folder structure.
|
|
348
|
+
*/
|
|
349
|
+
async planDocumentation(analysis, files, projectType) {
|
|
350
|
+
const fileList = files.slice(0, 300).join('\n');
|
|
351
|
+
const prompt = `
|
|
352
|
+
You are a documentation architect. Create a comprehensive documentation plan for this project.
|
|
353
|
+
|
|
354
|
+
CRITICAL: Output ONLY valid JSON. No preamble, no markdown code blocks, just pure JSON.
|
|
355
|
+
|
|
356
|
+
Project Analysis:
|
|
357
|
+
${analysis}
|
|
358
|
+
|
|
359
|
+
Project Type:
|
|
360
|
+
- Is Monorepo: ${projectType.isMonorepo}
|
|
361
|
+
- Has API: ${projectType.hasApi}
|
|
362
|
+
- Has CLI: ${projectType.hasCli}
|
|
363
|
+
|
|
364
|
+
File Structure:
|
|
365
|
+
${fileList}
|
|
366
|
+
|
|
367
|
+
Create a documentation plan with:
|
|
368
|
+
1. "folders": Array of folder paths to create in docs/ with their purpose
|
|
369
|
+
2. "files": Array of markdown files to generate with path, title, description
|
|
370
|
+
3. "stages": 4 stages of documentation depth, each listing which files to create
|
|
371
|
+
|
|
372
|
+
For a monorepo, create folders for each package.
|
|
373
|
+
Include architecture diagrams (will use mermaid).
|
|
374
|
+
The first file should always be docs/index.md as entry point.
|
|
375
|
+
|
|
376
|
+
Example structure for output:
|
|
377
|
+
{
|
|
378
|
+
"folders": [
|
|
379
|
+
{ "path": "docs/architecture", "purpose": "System design and diagrams" },
|
|
380
|
+
{ "path": "docs/packages/cli", "purpose": "CLI package documentation" }
|
|
381
|
+
],
|
|
382
|
+
"files": [
|
|
383
|
+
{ "path": "docs/index.md", "title": "Documentation Index", "description": "Entry point with links to all docs" },
|
|
384
|
+
{ "path": "docs/architecture/index.md", "title": "Architecture Overview", "description": "System design with mermaid diagrams" }
|
|
385
|
+
],
|
|
386
|
+
"stages": [
|
|
387
|
+
{ "stage": 1, "focus": "Create index and folder structure", "files": ["docs/index.md"] },
|
|
388
|
+
{ "stage": 2, "focus": "Document core architecture", "files": ["docs/architecture/index.md"] },
|
|
389
|
+
{ "stage": 3, "focus": "Document packages in detail", "files": ["docs/packages/*/index.md"] },
|
|
390
|
+
{ "stage": 4, "focus": "Add diagrams and implementation details", "files": ["docs/architecture/data-flow.md"] }
|
|
391
|
+
]
|
|
392
|
+
}
|
|
393
|
+
`;
|
|
394
|
+
const text = await this.generateWithRetry(prompt, this.THINKING_MODEL, genai_1.ThinkingLevel.HIGH);
|
|
395
|
+
try {
|
|
396
|
+
return JSON.parse(text.replace(/```json/g, '').replace(/```/g, '').trim());
|
|
397
|
+
}
|
|
398
|
+
catch {
|
|
399
|
+
// Fallback structure
|
|
400
|
+
return {
|
|
401
|
+
folders: [
|
|
402
|
+
{ path: 'docs/architecture', purpose: 'System design' },
|
|
403
|
+
{ path: 'docs/guides', purpose: 'User guides' }
|
|
404
|
+
],
|
|
405
|
+
files: [
|
|
406
|
+
{ path: 'docs/index.md', title: 'Documentation', description: 'Entry point' },
|
|
407
|
+
{ path: 'docs/architecture/index.md', title: 'Architecture', description: 'System overview' }
|
|
408
|
+
],
|
|
409
|
+
stages: [
|
|
410
|
+
{ stage: 1, focus: 'Create index', files: ['docs/index.md'] },
|
|
411
|
+
{ stage: 2, focus: 'Architecture', files: ['docs/architecture/index.md'] },
|
|
412
|
+
{ stage: 3, focus: 'Details', files: [] },
|
|
413
|
+
{ stage: 4, focus: 'Diagrams', files: [] }
|
|
414
|
+
]
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Generates a single documentation file based on the plan.
|
|
420
|
+
* Used in stages 2-4 of multi-stage documentation.
|
|
421
|
+
*/
|
|
422
|
+
async generateDocFile(filePath, title, description, analysis, files, includeMermaid = false) {
|
|
423
|
+
const relevantFiles = files.slice(0, 100).join('\n');
|
|
424
|
+
const prompt = `
|
|
425
|
+
CRITICAL: Output ONLY the raw markdown content. No preamble, no "Here is...", start directly with the heading.
|
|
426
|
+
|
|
427
|
+
Generate documentation for: ${title}
|
|
428
|
+
Description: ${description}
|
|
429
|
+
File path: ${filePath}
|
|
430
|
+
|
|
431
|
+
Project context:
|
|
432
|
+
${analysis}
|
|
433
|
+
|
|
434
|
+
Relevant files:
|
|
435
|
+
${relevantFiles}
|
|
436
|
+
|
|
437
|
+
Requirements:
|
|
438
|
+
- Start with "# ${title}"
|
|
439
|
+
- Be thorough but concise
|
|
440
|
+
- Use proper markdown formatting
|
|
441
|
+
- Include code examples where relevant
|
|
442
|
+
${includeMermaid ? '- Include at least one mermaid diagram (```mermaid ... ```) showing relationships or flow' : ''}
|
|
443
|
+
- Cross-link to other docs where appropriate using relative paths
|
|
444
|
+
|
|
445
|
+
REMINDER: Start directly with "# ${title}". No intro text.
|
|
446
|
+
`;
|
|
447
|
+
return this.generateWithRetry(prompt, this.THINKING_MODEL, genai_1.ThinkingLevel.LOW);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
exports.AIService = AIService;
|
|
451
|
+
//# sourceMappingURL=AIService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIService.js","sourceRoot":"","sources":["../../src/services/AIService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface ChronicleConfig {
|
|
2
|
+
version: number;
|
|
3
|
+
ignore: string[];
|
|
4
|
+
triggers: {
|
|
5
|
+
on_change: {
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
debounce_ms: number;
|
|
8
|
+
};
|
|
9
|
+
on_commit: {
|
|
10
|
+
enabled: boolean;
|
|
11
|
+
};
|
|
12
|
+
schedule: {
|
|
13
|
+
enabled: boolean;
|
|
14
|
+
interval_hours: number;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
documentation: {
|
|
18
|
+
modules_folder: string;
|
|
19
|
+
api_folder: string;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export declare class ConfigService {
|
|
23
|
+
constructor();
|
|
24
|
+
/**
|
|
25
|
+
* Loads config from the project root, merging with defaults.
|
|
26
|
+
*/
|
|
27
|
+
loadConfig(projectRoot: string): ChronicleConfig;
|
|
28
|
+
generateDefaultConfigFile(projectRoot: string): void;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=ConfigService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigService.d.ts","sourceRoot":"","sources":["../../src/services/ConfigService.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE;QACN,SAAS,EAAE;YACP,OAAO,EAAE,OAAO,CAAC;YACjB,WAAW,EAAE,MAAM,CAAC;SACvB,CAAC;QACF,SAAS,EAAE;YACP,OAAO,EAAE,OAAO,CAAC;SACpB,CAAC;QACF,QAAQ,EAAE;YACN,OAAO,EAAE,OAAO,CAAC;YACjB,cAAc,EAAE,MAAM,CAAC;SAC1B,CAAC;KACL,CAAC;IACF,aAAa,EAAE;QACX,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;KACtB,CAAC;CACL;AAwBD,qBAAa,aAAa;;IAGtB;;OAEG;IACI,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe;IA2BhD,yBAAyB,CAAC,WAAW,EAAE,MAAM;CAOvD"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ConfigService = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const DEFAULT_CONFIG = {
|
|
10
|
+
version: 1,
|
|
11
|
+
ignore: [
|
|
12
|
+
'**/node_modules/**',
|
|
13
|
+
'**/.git/**',
|
|
14
|
+
'**/dist/**',
|
|
15
|
+
'**/.chronicle/**',
|
|
16
|
+
'**/build/**',
|
|
17
|
+
'**/.next/**',
|
|
18
|
+
'**/coverage/**'
|
|
19
|
+
],
|
|
20
|
+
triggers: {
|
|
21
|
+
on_change: { enabled: true, debounce_ms: 10000 },
|
|
22
|
+
on_commit: { enabled: true },
|
|
23
|
+
schedule: { enabled: true, interval_hours: 24 }
|
|
24
|
+
},
|
|
25
|
+
documentation: {
|
|
26
|
+
modules_folder: 'docs/modules',
|
|
27
|
+
api_folder: 'docs/api'
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
class ConfigService {
|
|
31
|
+
constructor() { }
|
|
32
|
+
/**
|
|
33
|
+
* Loads config from the project root, merging with defaults.
|
|
34
|
+
*/
|
|
35
|
+
loadConfig(projectRoot) {
|
|
36
|
+
const configPath = path_1.default.join(projectRoot, '.chronicle.json');
|
|
37
|
+
if (!fs_1.default.existsSync(configPath)) {
|
|
38
|
+
// If doesn't exist, return defaults (don't write file automatically to avoid clutter?)
|
|
39
|
+
// Or maybe we SHOULD write it so user knows it exists?
|
|
40
|
+
// For now, return defaults.
|
|
41
|
+
return DEFAULT_CONFIG;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const fileContent = fs_1.default.readFileSync(configPath, 'utf-8');
|
|
45
|
+
const userConfig = JSON.parse(fileContent);
|
|
46
|
+
// Deep merge logic: arrays like 'ignore' should be replaced, not merged
|
|
47
|
+
return {
|
|
48
|
+
...DEFAULT_CONFIG,
|
|
49
|
+
...userConfig,
|
|
50
|
+
ignore: userConfig.ignore || DEFAULT_CONFIG.ignore,
|
|
51
|
+
triggers: { ...DEFAULT_CONFIG.triggers, ...userConfig.triggers },
|
|
52
|
+
documentation: { ...DEFAULT_CONFIG.documentation, ...userConfig.documentation }
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.warn(`⚠️ Failed to parse .chronicle.json in ${projectRoot}. Using defaults.`, error);
|
|
57
|
+
return DEFAULT_CONFIG;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
generateDefaultConfigFile(projectRoot) {
|
|
61
|
+
const configPath = path_1.default.join(projectRoot, '.chronicle.json');
|
|
62
|
+
if (!fs_1.default.existsSync(configPath)) {
|
|
63
|
+
fs_1.default.writeFileSync(configPath, JSON.stringify(DEFAULT_CONFIG, null, 2));
|
|
64
|
+
console.log(`Checking config at ${configPath} -> Created default.`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.ConfigService = ConfigService;
|
|
69
|
+
//# sourceMappingURL=ConfigService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigService.js","sourceRoot":"","sources":["../../src/services/ConfigService.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AAwBxB,MAAM,cAAc,GAAoB;IACpC,OAAO,EAAE,CAAC;IACV,MAAM,EAAE;QACJ,oBAAoB;QACpB,YAAY;QACZ,YAAY;QACZ,kBAAkB;QAClB,aAAa;QACb,aAAa;QACb,gBAAgB;KACnB;IACD,QAAQ,EAAE;QACN,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE;QAChD,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QAC5B,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE;KAClD;IACD,aAAa,EAAE;QACX,cAAc,EAAE,cAAc;QAC9B,UAAU,EAAE,UAAU;KACzB;CACJ,CAAC;AAEF,MAAa,aAAa;IACtB,gBAAgB,CAAC;IAEjB;;OAEG;IACI,UAAU,CAAC,WAAmB;QACjC,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QAE7D,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,uFAAuF;YACvF,uDAAuD;YACvD,4BAA4B;YAC5B,OAAO,cAAc,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC;YACD,MAAM,WAAW,GAAG,YAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC3C,wEAAwE;YACxE,OAAO;gBACH,GAAG,cAAc;gBACjB,GAAG,UAAU;gBACb,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM;gBAClD,QAAQ,EAAE,EAAE,GAAG,cAAc,CAAC,QAAQ,EAAE,GAAG,UAAU,CAAC,QAAQ,EAAE;gBAChE,aAAa,EAAE,EAAE,GAAG,cAAc,CAAC,aAAa,EAAE,GAAG,UAAU,CAAC,aAAa,EAAE;aAClF,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,yCAAyC,WAAW,mBAAmB,EAAE,KAAK,CAAC,CAAC;YAC7F,OAAO,cAAc,CAAC;QAC1B,CAAC;IACL,CAAC;IAEM,yBAAyB,CAAC,WAAmB;QAChD,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QAC7D,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,YAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,sBAAsB,UAAU,sBAAsB,CAAC,CAAC;QACxE,CAAC;IACL,CAAC;CACJ;AAxCD,sCAwCC"}
|