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.
Files changed (155) hide show
  1. package/README.md +132 -0
  2. package/package.json +86 -0
  3. package/packages/README.md +139 -0
  4. package/packages/cli/README.md +92 -0
  5. package/packages/cli/bin/chronicle.js +2 -0
  6. package/packages/cli/dist/commands/add.d.ts +2 -0
  7. package/packages/cli/dist/commands/add.d.ts.map +1 -0
  8. package/packages/cli/dist/commands/add.js +82 -0
  9. package/packages/cli/dist/commands/add.js.map +1 -0
  10. package/packages/cli/dist/commands/diff.d.ts +11 -0
  11. package/packages/cli/dist/commands/diff.d.ts.map +1 -0
  12. package/packages/cli/dist/commands/diff.js +164 -0
  13. package/packages/cli/dist/commands/diff.js.map +1 -0
  14. package/packages/cli/dist/commands/init.d.ts +2 -0
  15. package/packages/cli/dist/commands/init.d.ts.map +1 -0
  16. package/packages/cli/dist/commands/init.js +54 -0
  17. package/packages/cli/dist/commands/init.js.map +1 -0
  18. package/packages/cli/dist/commands/list.d.ts +2 -0
  19. package/packages/cli/dist/commands/list.d.ts.map +1 -0
  20. package/packages/cli/dist/commands/list.js +62 -0
  21. package/packages/cli/dist/commands/list.js.map +1 -0
  22. package/packages/cli/dist/commands/log.d.ts +4 -0
  23. package/packages/cli/dist/commands/log.d.ts.map +1 -0
  24. package/packages/cli/dist/commands/log.js +223 -0
  25. package/packages/cli/dist/commands/log.js.map +1 -0
  26. package/packages/cli/dist/commands/pause.d.ts +3 -0
  27. package/packages/cli/dist/commands/pause.d.ts.map +1 -0
  28. package/packages/cli/dist/commands/pause.js +49 -0
  29. package/packages/cli/dist/commands/pause.js.map +1 -0
  30. package/packages/cli/dist/commands/queue.d.ts +2 -0
  31. package/packages/cli/dist/commands/queue.d.ts.map +1 -0
  32. package/packages/cli/dist/commands/queue.js +96 -0
  33. package/packages/cli/dist/commands/queue.js.map +1 -0
  34. package/packages/cli/dist/commands/remove.d.ts +2 -0
  35. package/packages/cli/dist/commands/remove.d.ts.map +1 -0
  36. package/packages/cli/dist/commands/remove.js +80 -0
  37. package/packages/cli/dist/commands/remove.js.map +1 -0
  38. package/packages/cli/dist/commands/reset.d.ts +5 -0
  39. package/packages/cli/dist/commands/reset.d.ts.map +1 -0
  40. package/packages/cli/dist/commands/reset.js +90 -0
  41. package/packages/cli/dist/commands/reset.js.map +1 -0
  42. package/packages/cli/dist/commands/restart.d.ts +2 -0
  43. package/packages/cli/dist/commands/restart.d.ts.map +1 -0
  44. package/packages/cli/dist/commands/restart.js +72 -0
  45. package/packages/cli/dist/commands/restart.js.map +1 -0
  46. package/packages/cli/dist/commands/start.d.ts +2 -0
  47. package/packages/cli/dist/commands/start.d.ts.map +1 -0
  48. package/packages/cli/dist/commands/start.js +127 -0
  49. package/packages/cli/dist/commands/start.js.map +1 -0
  50. package/packages/cli/dist/commands/status.d.ts +2 -0
  51. package/packages/cli/dist/commands/status.d.ts.map +1 -0
  52. package/packages/cli/dist/commands/status.js +181 -0
  53. package/packages/cli/dist/commands/status.js.map +1 -0
  54. package/packages/cli/dist/commands/stop.d.ts +2 -0
  55. package/packages/cli/dist/commands/stop.d.ts.map +1 -0
  56. package/packages/cli/dist/commands/stop.js +64 -0
  57. package/packages/cli/dist/commands/stop.js.map +1 -0
  58. package/packages/cli/dist/index.d.ts +2 -0
  59. package/packages/cli/dist/index.d.ts.map +1 -0
  60. package/packages/cli/dist/index.js +85 -0
  61. package/packages/cli/dist/index.js.map +1 -0
  62. package/packages/cli/dist/utils/paths.d.ts +26 -0
  63. package/packages/cli/dist/utils/paths.d.ts.map +1 -0
  64. package/packages/cli/dist/utils/paths.js +183 -0
  65. package/packages/cli/dist/utils/paths.js.map +1 -0
  66. package/packages/cli/package.json +25 -0
  67. package/packages/daemon/README.md +83 -0
  68. package/packages/daemon/dist/ai_test.d.ts +2 -0
  69. package/packages/daemon/dist/ai_test.d.ts.map +1 -0
  70. package/packages/daemon/dist/ai_test.js +4 -0
  71. package/packages/daemon/dist/ai_test.js.map +1 -0
  72. package/packages/daemon/dist/index.d.ts +2 -0
  73. package/packages/daemon/dist/index.d.ts.map +1 -0
  74. package/packages/daemon/dist/index.js +147 -0
  75. package/packages/daemon/dist/index.js.map +1 -0
  76. package/packages/daemon/dist/jobs/AIProcessor.d.ts +6 -0
  77. package/packages/daemon/dist/jobs/AIProcessor.d.ts.map +1 -0
  78. package/packages/daemon/dist/jobs/AIProcessor.js +58 -0
  79. package/packages/daemon/dist/jobs/AIProcessor.js.map +1 -0
  80. package/packages/daemon/dist/jobs/DocProcessor.d.ts +8 -0
  81. package/packages/daemon/dist/jobs/DocProcessor.d.ts.map +1 -0
  82. package/packages/daemon/dist/jobs/DocProcessor.js +336 -0
  83. package/packages/daemon/dist/jobs/DocProcessor.js.map +1 -0
  84. package/packages/daemon/dist/jobs/FileProcessor.d.ts +7 -0
  85. package/packages/daemon/dist/jobs/FileProcessor.d.ts.map +1 -0
  86. package/packages/daemon/dist/jobs/FileProcessor.js +29 -0
  87. package/packages/daemon/dist/jobs/FileProcessor.js.map +1 -0
  88. package/packages/daemon/dist/jobs/SystemProcessor.d.ts +13 -0
  89. package/packages/daemon/dist/jobs/SystemProcessor.d.ts.map +1 -0
  90. package/packages/daemon/dist/jobs/SystemProcessor.js +38 -0
  91. package/packages/daemon/dist/jobs/SystemProcessor.js.map +1 -0
  92. package/packages/daemon/dist/jobs/UpdateProcessor.d.ts +21 -0
  93. package/packages/daemon/dist/jobs/UpdateProcessor.d.ts.map +1 -0
  94. package/packages/daemon/dist/jobs/UpdateProcessor.js +222 -0
  95. package/packages/daemon/dist/jobs/UpdateProcessor.js.map +1 -0
  96. package/packages/daemon/dist/services/AIService.d.ts +90 -0
  97. package/packages/daemon/dist/services/AIService.d.ts.map +1 -0
  98. package/packages/daemon/dist/services/AIService.js +451 -0
  99. package/packages/daemon/dist/services/AIService.js.map +1 -0
  100. package/packages/daemon/dist/services/ConfigService.d.ts +30 -0
  101. package/packages/daemon/dist/services/ConfigService.d.ts.map +1 -0
  102. package/packages/daemon/dist/services/ConfigService.js +69 -0
  103. package/packages/daemon/dist/services/ConfigService.js.map +1 -0
  104. package/packages/daemon/dist/services/DatabaseService.d.ts +204 -0
  105. package/packages/daemon/dist/services/DatabaseService.d.ts.map +1 -0
  106. package/packages/daemon/dist/services/DatabaseService.js +692 -0
  107. package/packages/daemon/dist/services/DatabaseService.js.map +1 -0
  108. package/packages/daemon/dist/services/GitService.d.ts +12 -0
  109. package/packages/daemon/dist/services/GitService.d.ts.map +1 -0
  110. package/packages/daemon/dist/services/GitService.js +68 -0
  111. package/packages/daemon/dist/services/GitService.js.map +1 -0
  112. package/packages/daemon/dist/services/QueueService.d.ts +16 -0
  113. package/packages/daemon/dist/services/QueueService.d.ts.map +1 -0
  114. package/packages/daemon/dist/services/QueueService.js +87 -0
  115. package/packages/daemon/dist/services/QueueService.js.map +1 -0
  116. package/packages/daemon/dist/services/TriggerService.d.ts +37 -0
  117. package/packages/daemon/dist/services/TriggerService.d.ts.map +1 -0
  118. package/packages/daemon/dist/services/TriggerService.js +150 -0
  119. package/packages/daemon/dist/services/TriggerService.js.map +1 -0
  120. package/packages/daemon/dist/services/WatcherService.d.ts +12 -0
  121. package/packages/daemon/dist/services/WatcherService.d.ts.map +1 -0
  122. package/packages/daemon/dist/services/WatcherService.js +77 -0
  123. package/packages/daemon/dist/services/WatcherService.js.map +1 -0
  124. package/packages/daemon/dist/services/index.d.ts +2 -0
  125. package/packages/daemon/dist/services/index.d.ts.map +1 -0
  126. package/packages/daemon/dist/services/index.js +18 -0
  127. package/packages/daemon/dist/services/index.js.map +1 -0
  128. package/packages/daemon/dist/test-ignore.js +0 -0
  129. package/packages/daemon/package.json +28 -0
  130. package/packages/ui/app/actions.ts +73 -0
  131. package/packages/ui/app/api/ai-activity/route.ts +14 -0
  132. package/packages/ui/app/globals.css +98 -0
  133. package/packages/ui/app/layout.tsx +29 -0
  134. package/packages/ui/app/page.tsx +109 -0
  135. package/packages/ui/components/AutoRefresh.tsx +18 -0
  136. package/packages/ui/components/DocumentationViewer.tsx +276 -0
  137. package/packages/ui/components/FileList.tsx +69 -0
  138. package/packages/ui/components/HeaderWithThinking.tsx +102 -0
  139. package/packages/ui/components/JobQueue.tsx +194 -0
  140. package/packages/ui/components/JobQueueWrapper.tsx +31 -0
  141. package/packages/ui/components/MermaidInit.tsx +24 -0
  142. package/packages/ui/components/ProjectContentArea.tsx +186 -0
  143. package/packages/ui/components/ProjectList.tsx +136 -0
  144. package/packages/ui/components/ThinkingDrawer.tsx +377 -0
  145. package/packages/ui/components/ThinkingPanel.tsx +63 -0
  146. package/packages/ui/components/TriggerSettings.tsx +185 -0
  147. package/packages/ui/components/VersionSelector.tsx +132 -0
  148. package/packages/ui/lib/db.ts +521 -0
  149. package/packages/ui/next-env.d.ts +5 -0
  150. package/packages/ui/next.config.js +4 -0
  151. package/packages/ui/package.json +32 -0
  152. package/packages/ui/postcss.config.js +6 -0
  153. package/packages/ui/public/logo.png +0 -0
  154. package/packages/ui/tailwind.config.ts +32 -0
  155. 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"}