@phmotad/fire-code 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +379 -0
  3. package/dist/agents/BaseAgent.d.ts +32 -0
  4. package/dist/agents/BaseAgent.d.ts.map +1 -0
  5. package/dist/agents/BaseAgent.js +19 -0
  6. package/dist/agents/BaseAgent.js.map +1 -0
  7. package/dist/agents/CodeAgent.d.ts +7 -0
  8. package/dist/agents/CodeAgent.d.ts.map +1 -0
  9. package/dist/agents/CodeAgent.js +130 -0
  10. package/dist/agents/CodeAgent.js.map +1 -0
  11. package/dist/cli/commands/corpus.d.ts +20 -0
  12. package/dist/cli/commands/corpus.d.ts.map +1 -0
  13. package/dist/cli/commands/corpus.js +60 -0
  14. package/dist/cli/commands/corpus.js.map +1 -0
  15. package/dist/cli/commands/daemon.d.ts +5 -0
  16. package/dist/cli/commands/daemon.d.ts.map +1 -0
  17. package/dist/cli/commands/daemon.js +79 -0
  18. package/dist/cli/commands/daemon.js.map +1 -0
  19. package/dist/cli/commands/dev.d.ts +2 -0
  20. package/dist/cli/commands/dev.d.ts.map +1 -0
  21. package/dist/cli/commands/dev.js +20 -0
  22. package/dist/cli/commands/dev.js.map +1 -0
  23. package/dist/cli/commands/index-cmd.d.ts +6 -0
  24. package/dist/cli/commands/index-cmd.d.ts.map +1 -0
  25. package/dist/cli/commands/index-cmd.js +57 -0
  26. package/dist/cli/commands/index-cmd.js.map +1 -0
  27. package/dist/cli/commands/init.d.ts +2 -0
  28. package/dist/cli/commands/init.d.ts.map +1 -0
  29. package/dist/cli/commands/init.js +173 -0
  30. package/dist/cli/commands/init.js.map +1 -0
  31. package/dist/cli/commands/install.d.ts +8 -0
  32. package/dist/cli/commands/install.d.ts.map +1 -0
  33. package/dist/cli/commands/install.js +154 -0
  34. package/dist/cli/commands/install.js.map +1 -0
  35. package/dist/cli/commands/observe.d.ts +19 -0
  36. package/dist/cli/commands/observe.d.ts.map +1 -0
  37. package/dist/cli/commands/observe.js +86 -0
  38. package/dist/cli/commands/observe.js.map +1 -0
  39. package/dist/cli/index.d.ts +3 -0
  40. package/dist/cli/index.d.ts.map +1 -0
  41. package/dist/cli/index.js +162 -0
  42. package/dist/cli/index.js.map +1 -0
  43. package/dist/config/defaults.d.ts +3 -0
  44. package/dist/config/defaults.d.ts.map +1 -0
  45. package/dist/config/defaults.js +8 -0
  46. package/dist/config/defaults.js.map +1 -0
  47. package/dist/config/loader.d.ts +3 -0
  48. package/dist/config/loader.d.ts.map +1 -0
  49. package/dist/config/loader.js +96 -0
  50. package/dist/config/loader.js.map +1 -0
  51. package/dist/config/types.d.ts +436 -0
  52. package/dist/config/types.d.ts.map +1 -0
  53. package/dist/config/types.js +73 -0
  54. package/dist/config/types.js.map +1 -0
  55. package/dist/core/ExecutionEngine.d.ts +26 -0
  56. package/dist/core/ExecutionEngine.d.ts.map +1 -0
  57. package/dist/core/ExecutionEngine.js +102 -0
  58. package/dist/core/ExecutionEngine.js.map +1 -0
  59. package/dist/core/TaskRouter.d.ts +3 -0
  60. package/dist/core/TaskRouter.d.ts.map +1 -0
  61. package/dist/core/TaskRouter.js +29 -0
  62. package/dist/core/TaskRouter.js.map +1 -0
  63. package/dist/daemon/DaemonClient.d.ts +8 -0
  64. package/dist/daemon/DaemonClient.d.ts.map +1 -0
  65. package/dist/daemon/DaemonClient.js +61 -0
  66. package/dist/daemon/DaemonClient.js.map +1 -0
  67. package/dist/daemon/DaemonServer.d.ts +17 -0
  68. package/dist/daemon/DaemonServer.d.ts.map +1 -0
  69. package/dist/daemon/DaemonServer.js +235 -0
  70. package/dist/daemon/DaemonServer.js.map +1 -0
  71. package/dist/db/DatabaseManager.d.ts +79 -0
  72. package/dist/db/DatabaseManager.d.ts.map +1 -0
  73. package/dist/db/DatabaseManager.js +212 -0
  74. package/dist/db/DatabaseManager.js.map +1 -0
  75. package/dist/db/schema.d.ts +2 -0
  76. package/dist/db/schema.d.ts.map +1 -0
  77. package/dist/db/schema.js +127 -0
  78. package/dist/db/schema.js.map +1 -0
  79. package/dist/git/CommitFormatter.d.ts +19 -0
  80. package/dist/git/CommitFormatter.d.ts.map +1 -0
  81. package/dist/git/CommitFormatter.js +47 -0
  82. package/dist/git/CommitFormatter.js.map +1 -0
  83. package/dist/git/GitManager.d.ts +28 -0
  84. package/dist/git/GitManager.d.ts.map +1 -0
  85. package/dist/git/GitManager.js +147 -0
  86. package/dist/git/GitManager.js.map +1 -0
  87. package/dist/graph/GraphStore.d.ts +54 -0
  88. package/dist/graph/GraphStore.d.ts.map +1 -0
  89. package/dist/graph/GraphStore.js +3 -0
  90. package/dist/graph/GraphStore.js.map +1 -0
  91. package/dist/graph/InMemoryGraphStore.d.ts +16 -0
  92. package/dist/graph/InMemoryGraphStore.d.ts.map +1 -0
  93. package/dist/graph/InMemoryGraphStore.js +75 -0
  94. package/dist/graph/InMemoryGraphStore.js.map +1 -0
  95. package/dist/graph/SQLiteGraphStore.d.ts +31 -0
  96. package/dist/graph/SQLiteGraphStore.d.ts.map +1 -0
  97. package/dist/graph/SQLiteGraphStore.js +158 -0
  98. package/dist/graph/SQLiteGraphStore.js.map +1 -0
  99. package/dist/index.d.ts +16 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +32 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/indexing/ASTParser.d.ts +32 -0
  104. package/dist/indexing/ASTParser.d.ts.map +1 -0
  105. package/dist/indexing/ASTParser.js +185 -0
  106. package/dist/indexing/ASTParser.js.map +1 -0
  107. package/dist/indexing/EmbeddingGenerator.d.ts +15 -0
  108. package/dist/indexing/EmbeddingGenerator.d.ts.map +1 -0
  109. package/dist/indexing/EmbeddingGenerator.js +66 -0
  110. package/dist/indexing/EmbeddingGenerator.js.map +1 -0
  111. package/dist/indexing/FileScanner.d.ts +10 -0
  112. package/dist/indexing/FileScanner.d.ts.map +1 -0
  113. package/dist/indexing/FileScanner.js +58 -0
  114. package/dist/indexing/FileScanner.js.map +1 -0
  115. package/dist/indexing/GraphBuilder.d.ts +4 -0
  116. package/dist/indexing/GraphBuilder.d.ts.map +1 -0
  117. package/dist/indexing/GraphBuilder.js +51 -0
  118. package/dist/indexing/GraphBuilder.js.map +1 -0
  119. package/dist/indexing/Indexer.d.ts +13 -0
  120. package/dist/indexing/Indexer.d.ts.map +1 -0
  121. package/dist/indexing/Indexer.js +68 -0
  122. package/dist/indexing/Indexer.js.map +1 -0
  123. package/dist/mcp/server.d.ts +2 -0
  124. package/dist/mcp/server.d.ts.map +1 -0
  125. package/dist/mcp/server.js +155 -0
  126. package/dist/mcp/server.js.map +1 -0
  127. package/dist/mcp/tools/corpus_search.d.ts +14 -0
  128. package/dist/mcp/tools/corpus_search.d.ts.map +1 -0
  129. package/dist/mcp/tools/corpus_search.js +33 -0
  130. package/dist/mcp/tools/corpus_search.js.map +1 -0
  131. package/dist/mcp/tools/execute.d.ts +19 -0
  132. package/dist/mcp/tools/execute.d.ts.map +1 -0
  133. package/dist/mcp/tools/execute.js +38 -0
  134. package/dist/mcp/tools/execute.js.map +1 -0
  135. package/dist/mcp/tools/get_context.d.ts +17 -0
  136. package/dist/mcp/tools/get_context.d.ts.map +1 -0
  137. package/dist/mcp/tools/get_context.js +50 -0
  138. package/dist/mcp/tools/get_context.js.map +1 -0
  139. package/dist/mcp/tools/get_graph.d.ts +26 -0
  140. package/dist/mcp/tools/get_graph.d.ts.map +1 -0
  141. package/dist/mcp/tools/get_graph.js +68 -0
  142. package/dist/mcp/tools/get_graph.js.map +1 -0
  143. package/dist/mcp/tools/observations.d.ts +23 -0
  144. package/dist/mcp/tools/observations.d.ts.map +1 -0
  145. package/dist/mcp/tools/observations.js +72 -0
  146. package/dist/mcp/tools/observations.js.map +1 -0
  147. package/dist/mcp/tools/search_code.d.ts +14 -0
  148. package/dist/mcp/tools/search_code.d.ts.map +1 -0
  149. package/dist/mcp/tools/search_code.js +38 -0
  150. package/dist/mcp/tools/search_code.js.map +1 -0
  151. package/dist/mcp/tools/smart_outline.d.ts +14 -0
  152. package/dist/mcp/tools/smart_outline.d.ts.map +1 -0
  153. package/dist/mcp/tools/smart_outline.js +99 -0
  154. package/dist/mcp/tools/smart_outline.js.map +1 -0
  155. package/dist/mcp/tools/smart_search.d.ts +20 -0
  156. package/dist/mcp/tools/smart_search.d.ts.map +1 -0
  157. package/dist/mcp/tools/smart_search.js +131 -0
  158. package/dist/mcp/tools/smart_search.js.map +1 -0
  159. package/dist/memory/FallbackMemory.d.ts +9 -0
  160. package/dist/memory/FallbackMemory.d.ts.map +1 -0
  161. package/dist/memory/FallbackMemory.js +70 -0
  162. package/dist/memory/FallbackMemory.js.map +1 -0
  163. package/dist/memory/HybridMemory.d.ts +20 -0
  164. package/dist/memory/HybridMemory.d.ts.map +1 -0
  165. package/dist/memory/HybridMemory.js +74 -0
  166. package/dist/memory/HybridMemory.js.map +1 -0
  167. package/dist/providers/AgentSDKProvider.d.ts +13 -0
  168. package/dist/providers/AgentSDKProvider.d.ts.map +1 -0
  169. package/dist/providers/AgentSDKProvider.js +64 -0
  170. package/dist/providers/AgentSDKProvider.js.map +1 -0
  171. package/dist/providers/AnthropicProvider.d.ts +11 -0
  172. package/dist/providers/AnthropicProvider.d.ts.map +1 -0
  173. package/dist/providers/AnthropicProvider.js +61 -0
  174. package/dist/providers/AnthropicProvider.js.map +1 -0
  175. package/dist/providers/LLMProvider.d.ts +12 -0
  176. package/dist/providers/LLMProvider.d.ts.map +1 -0
  177. package/dist/providers/LLMProvider.js +3 -0
  178. package/dist/providers/LLMProvider.js.map +1 -0
  179. package/dist/providers/OllamaProvider.d.ts +11 -0
  180. package/dist/providers/OllamaProvider.d.ts.map +1 -0
  181. package/dist/providers/OllamaProvider.js +71 -0
  182. package/dist/providers/OllamaProvider.js.map +1 -0
  183. package/dist/providers/OpenAIProvider.d.ts +11 -0
  184. package/dist/providers/OpenAIProvider.d.ts.map +1 -0
  185. package/dist/providers/OpenAIProvider.js +63 -0
  186. package/dist/providers/OpenAIProvider.js.map +1 -0
  187. package/dist/providers/OpenRouterProvider.d.ts +12 -0
  188. package/dist/providers/OpenRouterProvider.d.ts.map +1 -0
  189. package/dist/providers/OpenRouterProvider.js +89 -0
  190. package/dist/providers/OpenRouterProvider.js.map +1 -0
  191. package/dist/providers/ProviderFactory.d.ts +4 -0
  192. package/dist/providers/ProviderFactory.d.ts.map +1 -0
  193. package/dist/providers/ProviderFactory.js +27 -0
  194. package/dist/providers/ProviderFactory.js.map +1 -0
  195. package/dist/services/CorpusService.d.ts +27 -0
  196. package/dist/services/CorpusService.d.ts.map +1 -0
  197. package/dist/services/CorpusService.js +142 -0
  198. package/dist/services/CorpusService.js.map +1 -0
  199. package/dist/services/ObservationService.d.ts +17 -0
  200. package/dist/services/ObservationService.d.ts.map +1 -0
  201. package/dist/services/ObservationService.js +101 -0
  202. package/dist/services/ObservationService.js.map +1 -0
  203. package/dist/services/SessionService.d.ts +10 -0
  204. package/dist/services/SessionService.d.ts.map +1 -0
  205. package/dist/services/SessionService.js +38 -0
  206. package/dist/services/SessionService.js.map +1 -0
  207. package/dist/services/SummarizationService.d.ts +8 -0
  208. package/dist/services/SummarizationService.d.ts.map +1 -0
  209. package/dist/services/SummarizationService.js +65 -0
  210. package/dist/services/SummarizationService.js.map +1 -0
  211. package/dist/utils/errors.d.ts +26 -0
  212. package/dist/utils/errors.d.ts.map +1 -0
  213. package/dist/utils/errors.js +72 -0
  214. package/dist/utils/errors.js.map +1 -0
  215. package/dist/utils/logger.d.ts +4 -0
  216. package/dist/utils/logger.d.ts.map +1 -0
  217. package/dist/utils/logger.js +16 -0
  218. package/dist/utils/logger.js.map +1 -0
  219. package/dist/utils/paths.d.ts +10 -0
  220. package/dist/utils/paths.d.ts.map +1 -0
  221. package/dist/utils/paths.js +43 -0
  222. package/dist/utils/paths.js.map +1 -0
  223. package/dist/utils/privacy.d.ts +5 -0
  224. package/dist/utils/privacy.d.ts.map +1 -0
  225. package/dist/utils/privacy.js +39 -0
  226. package/dist/utils/privacy.js.map +1 -0
  227. package/dist/utils/zodToJsonSchema.d.ts +23 -0
  228. package/dist/utils/zodToJsonSchema.d.ts.map +1 -0
  229. package/dist/utils/zodToJsonSchema.js +52 -0
  230. package/dist/utils/zodToJsonSchema.js.map +1 -0
  231. package/dist/vector/MemoryVectorStore.d.ts +16 -0
  232. package/dist/vector/MemoryVectorStore.d.ts.map +1 -0
  233. package/dist/vector/MemoryVectorStore.js +97 -0
  234. package/dist/vector/MemoryVectorStore.js.map +1 -0
  235. package/dist/vector/VectorStore.d.ts +19 -0
  236. package/dist/vector/VectorStore.d.ts.map +1 -0
  237. package/dist/vector/VectorStore.js +3 -0
  238. package/dist/vector/VectorStore.js.map +1 -0
  239. package/dist/vector/VectraVectorStore.d.ts +23 -0
  240. package/dist/vector/VectraVectorStore.d.ts.map +1 -0
  241. package/dist/vector/VectraVectorStore.js +93 -0
  242. package/dist/vector/VectraVectorStore.js.map +1 -0
  243. package/examples/firecode.config.example.ts +87 -0
  244. package/package.json +111 -0
  245. package/plugin/.claude-plugin/plugin.json +17 -0
  246. package/plugin/hooks/hooks.json +86 -0
  247. package/plugin/scripts/context-inject.js +208 -0
  248. package/plugin/scripts/smart-install.js +33 -0
@@ -0,0 +1,212 @@
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.DatabaseManager = void 0;
7
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
8
+ const fs_1 = require("fs");
9
+ const path_1 = require("path");
10
+ const schema_js_1 = require("./schema.js");
11
+ const SQLiteGraphStore_js_1 = require("../graph/SQLiteGraphStore.js");
12
+ let instance = null;
13
+ class DatabaseManager {
14
+ // exposed for reset() only — do not use externally
15
+ db;
16
+ constructor(dbPath) {
17
+ this.db = new better_sqlite3_1.default(dbPath);
18
+ this.db.exec(schema_js_1.SCHEMA_SQL);
19
+ }
20
+ static getInstance(firecdoDir) {
21
+ if (!instance) {
22
+ if (!(0, fs_1.existsSync)(firecdoDir))
23
+ (0, fs_1.mkdirSync)(firecdoDir, { recursive: true });
24
+ const dbPath = (0, path_1.join)(firecdoDir, 'firecode.db');
25
+ instance = new DatabaseManager(dbPath);
26
+ }
27
+ return instance;
28
+ }
29
+ static reset() {
30
+ if (instance) {
31
+ try {
32
+ instance.db.close();
33
+ }
34
+ catch { /* ignore */ }
35
+ instance = null;
36
+ }
37
+ }
38
+ // ── Sessions ──────────────────────────────────────────────────────────────
39
+ createSession(id, project, cwd) {
40
+ const stmt = this.db.prepare(`INSERT OR IGNORE INTO sessions (id, project, cwd, started_at) VALUES (?, ?, ?, ?)`);
41
+ stmt.run(id, project, cwd, Date.now());
42
+ return this.getSession(id);
43
+ }
44
+ getSession(id) {
45
+ return this.db.prepare(`SELECT * FROM sessions WHERE id = ?`).get(id);
46
+ }
47
+ endSession(id, status = 'completed') {
48
+ this.db.prepare(`UPDATE sessions SET ended_at = ?, status = ? WHERE id = ?`)
49
+ .run(Date.now(), status, id);
50
+ }
51
+ getActiveSession(project) {
52
+ return this.db.prepare(`SELECT * FROM sessions WHERE project = ? AND status = 'active' ORDER BY started_at DESC LIMIT 1`).get(project);
53
+ }
54
+ // ── Observations ──────────────────────────────────────────────────────────
55
+ addObservation(obs) {
56
+ const result = this.db.prepare(`
57
+ INSERT INTO observations (session_id, project, type, tool, file_path, summary, detail)
58
+ VALUES (?, ?, ?, ?, ?, ?, ?)
59
+ `).run(obs.session_id, obs.project, obs.type, obs.tool, obs.file_path, obs.summary, obs.detail);
60
+ return result.lastInsertRowid;
61
+ }
62
+ getObservations(filter = {}) {
63
+ const { project, type, file_path, query, limit = 20, offset = 0, dateStart, dateEnd } = filter;
64
+ if (query) {
65
+ // FTS5 search
66
+ const ftsResults = this.db.prepare(`
67
+ SELECT o.* FROM observations o
68
+ JOIN observations_fts f ON f.rowid = o.id
69
+ WHERE observations_fts MATCH ?
70
+ ${project ? 'AND o.project = ?' : ''}
71
+ ${type ? 'AND o.type = ?' : ''}
72
+ ORDER BY o.created_at DESC
73
+ LIMIT ? OFFSET ?
74
+ `).all(...[query, project, type].filter(Boolean), limit, offset);
75
+ return ftsResults;
76
+ }
77
+ const conditions = [];
78
+ const params = [];
79
+ if (project) {
80
+ conditions.push('project = ?');
81
+ params.push(project);
82
+ }
83
+ if (type) {
84
+ conditions.push('type = ?');
85
+ params.push(type);
86
+ }
87
+ if (file_path) {
88
+ conditions.push('file_path LIKE ?');
89
+ params.push(`%${file_path}%`);
90
+ }
91
+ if (dateStart) {
92
+ conditions.push('created_at >= ?');
93
+ params.push(dateStart);
94
+ }
95
+ if (dateEnd) {
96
+ conditions.push('created_at <= ?');
97
+ params.push(dateEnd);
98
+ }
99
+ const where = conditions.length ? `WHERE ${conditions.join(' AND ')}` : '';
100
+ params.push(limit, offset);
101
+ return this.db.prepare(`
102
+ SELECT * FROM observations ${where}
103
+ ORDER BY created_at DESC LIMIT ? OFFSET ?
104
+ `).all(...params);
105
+ }
106
+ getObservationsByIds(ids) {
107
+ if (ids.length === 0)
108
+ return [];
109
+ const placeholders = ids.map(() => '?').join(',');
110
+ return this.db.prepare(`SELECT * FROM observations WHERE id IN (${placeholders}) ORDER BY created_at DESC`).all(...ids);
111
+ }
112
+ getRecentContext(project, limit = 10) {
113
+ const obs = this.getObservations({ project, limit });
114
+ if (obs.length === 0)
115
+ return '';
116
+ const summaries = this.db.prepare(`SELECT * FROM summaries WHERE project = ? ORDER BY created_at DESC LIMIT 3`).all(project);
117
+ const lines = ['## Recent Project Memory\n'];
118
+ if (summaries.length > 0) {
119
+ lines.push('### Session Summaries');
120
+ summaries.forEach(s => {
121
+ const date = new Date(s.created_at).toLocaleDateString();
122
+ lines.push(`**[${date}]** ${s.content}`);
123
+ });
124
+ lines.push('');
125
+ }
126
+ if (obs.length > 0) {
127
+ lines.push('### Recent Observations');
128
+ obs.forEach(o => {
129
+ const icon = { change: '✏️', bugfix: '🐛', feature: '✨', refactor: '♻️', decision: '🧭', discovery: '🔍' }[o.type] ?? '•';
130
+ const file = o.file_path ? ` \`${o.file_path}\`` : '';
131
+ lines.push(`${icon} **[${o.type}]**${file} — ${o.summary}`);
132
+ });
133
+ }
134
+ return lines.join('\n');
135
+ }
136
+ // ── Summaries ─────────────────────────────────────────────────────────────
137
+ addSummary(session_id, project, content) {
138
+ const result = this.db.prepare(`INSERT INTO summaries (session_id, project, content) VALUES (?, ?, ?)`).run(session_id, project, content);
139
+ return result.lastInsertRowid;
140
+ }
141
+ // ── File index ────────────────────────────────────────────────────────────
142
+ upsertFileIndex(project, filePath, functions, classes, imports) {
143
+ this.db.prepare(`
144
+ INSERT INTO file_index (project, file_path, functions, classes, imports, indexed_at)
145
+ VALUES (?, ?, ?, ?, ?, ?)
146
+ ON CONFLICT(project, file_path) DO UPDATE SET
147
+ functions = excluded.functions,
148
+ classes = excluded.classes,
149
+ imports = excluded.imports,
150
+ indexed_at = excluded.indexed_at
151
+ `).run(project, filePath, JSON.stringify(functions), JSON.stringify(classes), JSON.stringify(imports), Date.now());
152
+ }
153
+ // ── Sessions list ─────────────────────────────────────────────────────────
154
+ getSessions(project, limit = 10) {
155
+ return this.db.prepare(`SELECT * FROM sessions WHERE project = ? ORDER BY started_at DESC LIMIT ?`).all(project, limit);
156
+ }
157
+ // ── Corpus ────────────────────────────────────────────────────────────────
158
+ upsertCorpus(project, title, content, source, tags, isPrivate = false) {
159
+ const tagsJson = JSON.stringify(tags ?? []);
160
+ const now = Date.now();
161
+ const result = this.db.prepare(`
162
+ INSERT INTO corpus (project, title, content, source, tags, private, created_at, updated_at)
163
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
164
+ ON CONFLICT(project, title) DO UPDATE SET
165
+ content = excluded.content,
166
+ source = excluded.source,
167
+ tags = excluded.tags,
168
+ private = excluded.private,
169
+ updated_at = excluded.updated_at
170
+ `).run(project, title, content, source ?? null, tagsJson, isPrivate ? 1 : 0, now, now);
171
+ return result.lastInsertRowid;
172
+ }
173
+ getCorpus(filter) {
174
+ const { project, query, limit = 10, includePrivate = false } = filter;
175
+ const privateFilter = includePrivate ? '' : 'AND c.private = 0';
176
+ if (query) {
177
+ return this.db.prepare(`
178
+ SELECT c.* FROM corpus c
179
+ JOIN corpus_fts f ON f.rowid = c.id
180
+ WHERE corpus_fts MATCH ?
181
+ ${project ? 'AND c.project = ?' : ''}
182
+ ${privateFilter}
183
+ ORDER BY c.updated_at DESC
184
+ LIMIT ?
185
+ `).all(...[query, project].filter(Boolean), limit);
186
+ }
187
+ const conditions = [];
188
+ const params = [];
189
+ if (project) {
190
+ conditions.push('project = ?');
191
+ params.push(project);
192
+ }
193
+ if (!includePrivate) {
194
+ conditions.push('private = 0');
195
+ }
196
+ const where = conditions.length ? `WHERE ${conditions.join(' AND ')}` : '';
197
+ return this.db.prepare(`SELECT * FROM corpus ${where} ORDER BY updated_at DESC LIMIT ?`).all(...params, limit);
198
+ }
199
+ deleteCorpus(project, title) {
200
+ this.db.prepare(`DELETE FROM corpus WHERE project = ? AND title = ?`).run(project, title);
201
+ }
202
+ // ── Graph ─────────────────────────────────────────────────────────────────
203
+ getGraphStore(project) {
204
+ return new SQLiteGraphStore_js_1.SQLiteGraphStore(this.db, project);
205
+ }
206
+ close() {
207
+ this.db.close();
208
+ instance = null;
209
+ }
210
+ }
211
+ exports.DatabaseManager = DatabaseManager;
212
+ //# sourceMappingURL=DatabaseManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatabaseManager.js","sourceRoot":"","sources":["../../src/db/DatabaseManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const SCHEMA_SQL = "\nPRAGMA journal_mode=WAL;\nPRAGMA foreign_keys=ON;\n\nCREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n project TEXT NOT NULL,\n cwd TEXT NOT NULL,\n started_at INTEGER NOT NULL,\n ended_at INTEGER,\n status TEXT NOT NULL DEFAULT 'active' -- active | completed | abandoned\n);\n\nCREATE TABLE IF NOT EXISTS observations (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n project TEXT NOT NULL,\n type TEXT NOT NULL DEFAULT 'change', -- change | bugfix | feature | refactor | decision | discovery\n tool TEXT,\n file_path TEXT,\n summary TEXT NOT NULL,\n detail TEXT,\n created_at INTEGER NOT NULL DEFAULT (unixepoch())\n);\n\nCREATE TABLE IF NOT EXISTS summaries (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n project TEXT NOT NULL,\n content TEXT NOT NULL,\n created_at INTEGER NOT NULL DEFAULT (unixepoch())\n);\n\nCREATE TABLE IF NOT EXISTS file_index (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n project TEXT NOT NULL,\n file_path TEXT NOT NULL,\n functions TEXT, -- JSON array of function names\n classes TEXT, -- JSON array of class names\n imports TEXT, -- JSON array of import paths\n indexed_at INTEGER NOT NULL DEFAULT (unixepoch()),\n UNIQUE(project, file_path)\n);\n\n-- Full-text search on observations\nCREATE VIRTUAL TABLE IF NOT EXISTS observations_fts USING fts5(\n summary, detail, file_path, type,\n content=observations,\n content_rowid=id\n);\n\nCREATE TRIGGER IF NOT EXISTS obs_fts_insert AFTER INSERT ON observations BEGIN\n INSERT INTO observations_fts(rowid, summary, detail, file_path, type)\n VALUES (new.id, new.summary, new.detail, new.file_path, new.type);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS obs_fts_delete AFTER DELETE ON observations BEGIN\n INSERT INTO observations_fts(observations_fts, rowid, summary, detail, file_path, type)\n VALUES ('delete', old.id, old.summary, old.detail, old.file_path, old.type);\nEND;\n\nCREATE INDEX IF NOT EXISTS idx_obs_project ON observations(project);\nCREATE INDEX IF NOT EXISTS idx_obs_type ON observations(type);\nCREATE INDEX IF NOT EXISTS idx_obs_session ON observations(session_id);\nCREATE INDEX IF NOT EXISTS idx_obs_created ON observations(created_at DESC);\nCREATE INDEX IF NOT EXISTS idx_obs_file ON observations(file_path);\nCREATE INDEX IF NOT EXISTS idx_sessions_proj ON sessions(project);\nCREATE INDEX IF NOT EXISTS idx_file_index ON file_index(project, file_path);\n\n-- Knowledge Corpus\nCREATE TABLE IF NOT EXISTS corpus (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n project TEXT NOT NULL,\n title TEXT NOT NULL,\n content TEXT NOT NULL,\n source TEXT, -- file path or URL\n tags TEXT, -- JSON array\n private INTEGER NOT NULL DEFAULT 0, -- 1 = never send to LLM\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n updated_at INTEGER NOT NULL DEFAULT (unixepoch()),\n UNIQUE(project, title)\n);\n\nCREATE VIRTUAL TABLE IF NOT EXISTS corpus_fts USING fts5(\n title, content, tags,\n content=corpus,\n content_rowid=id\n);\n\nCREATE TRIGGER IF NOT EXISTS corpus_fts_insert AFTER INSERT ON corpus BEGIN\n INSERT INTO corpus_fts(rowid, title, content, tags) VALUES (new.id, new.title, new.content, new.tags);\nEND;\nCREATE TRIGGER IF NOT EXISTS corpus_fts_delete AFTER DELETE ON corpus BEGIN\n INSERT INTO corpus_fts(corpus_fts, rowid, title, content, tags) VALUES ('delete', old.id, old.title, old.content, old.tags);\nEND;\n\nCREATE INDEX IF NOT EXISTS idx_corpus_project ON corpus(project);\nCREATE INDEX IF NOT EXISTS idx_corpus_private ON corpus(project, private);\n\n-- Dependency Graph\nCREATE TABLE IF NOT EXISTS graph_nodes (\n id TEXT NOT NULL,\n project TEXT NOT NULL,\n type TEXT NOT NULL, -- file | function | commit\n label TEXT NOT NULL,\n data TEXT NOT NULL, -- JSON blob of the full node\n PRIMARY KEY (project, id)\n);\n\nCREATE TABLE IF NOT EXISTS graph_edges (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n project TEXT NOT NULL,\n from_id TEXT NOT NULL,\n to_id TEXT NOT NULL,\n type TEXT NOT NULL, -- imports | calls | extends | implements\n label TEXT,\n UNIQUE(project, from_id, to_id, type)\n);\n\nCREATE INDEX IF NOT EXISTS idx_gnodes_project ON graph_nodes(project, type);\nCREATE INDEX IF NOT EXISTS idx_gedges_from ON graph_edges(project, from_id);\nCREATE INDEX IF NOT EXISTS idx_gedges_to ON graph_edges(project, to_id);\n";
2
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,moJA0HtB,CAAC"}
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SCHEMA_SQL = void 0;
4
+ exports.SCHEMA_SQL = `
5
+ PRAGMA journal_mode=WAL;
6
+ PRAGMA foreign_keys=ON;
7
+
8
+ CREATE TABLE IF NOT EXISTS sessions (
9
+ id TEXT PRIMARY KEY,
10
+ project TEXT NOT NULL,
11
+ cwd TEXT NOT NULL,
12
+ started_at INTEGER NOT NULL,
13
+ ended_at INTEGER,
14
+ status TEXT NOT NULL DEFAULT 'active' -- active | completed | abandoned
15
+ );
16
+
17
+ CREATE TABLE IF NOT EXISTS observations (
18
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
19
+ session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
20
+ project TEXT NOT NULL,
21
+ type TEXT NOT NULL DEFAULT 'change', -- change | bugfix | feature | refactor | decision | discovery
22
+ tool TEXT,
23
+ file_path TEXT,
24
+ summary TEXT NOT NULL,
25
+ detail TEXT,
26
+ created_at INTEGER NOT NULL DEFAULT (unixepoch())
27
+ );
28
+
29
+ CREATE TABLE IF NOT EXISTS summaries (
30
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
31
+ session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
32
+ project TEXT NOT NULL,
33
+ content TEXT NOT NULL,
34
+ created_at INTEGER NOT NULL DEFAULT (unixepoch())
35
+ );
36
+
37
+ CREATE TABLE IF NOT EXISTS file_index (
38
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
39
+ project TEXT NOT NULL,
40
+ file_path TEXT NOT NULL,
41
+ functions TEXT, -- JSON array of function names
42
+ classes TEXT, -- JSON array of class names
43
+ imports TEXT, -- JSON array of import paths
44
+ indexed_at INTEGER NOT NULL DEFAULT (unixepoch()),
45
+ UNIQUE(project, file_path)
46
+ );
47
+
48
+ -- Full-text search on observations
49
+ CREATE VIRTUAL TABLE IF NOT EXISTS observations_fts USING fts5(
50
+ summary, detail, file_path, type,
51
+ content=observations,
52
+ content_rowid=id
53
+ );
54
+
55
+ CREATE TRIGGER IF NOT EXISTS obs_fts_insert AFTER INSERT ON observations BEGIN
56
+ INSERT INTO observations_fts(rowid, summary, detail, file_path, type)
57
+ VALUES (new.id, new.summary, new.detail, new.file_path, new.type);
58
+ END;
59
+
60
+ CREATE TRIGGER IF NOT EXISTS obs_fts_delete AFTER DELETE ON observations BEGIN
61
+ INSERT INTO observations_fts(observations_fts, rowid, summary, detail, file_path, type)
62
+ VALUES ('delete', old.id, old.summary, old.detail, old.file_path, old.type);
63
+ END;
64
+
65
+ CREATE INDEX IF NOT EXISTS idx_obs_project ON observations(project);
66
+ CREATE INDEX IF NOT EXISTS idx_obs_type ON observations(type);
67
+ CREATE INDEX IF NOT EXISTS idx_obs_session ON observations(session_id);
68
+ CREATE INDEX IF NOT EXISTS idx_obs_created ON observations(created_at DESC);
69
+ CREATE INDEX IF NOT EXISTS idx_obs_file ON observations(file_path);
70
+ CREATE INDEX IF NOT EXISTS idx_sessions_proj ON sessions(project);
71
+ CREATE INDEX IF NOT EXISTS idx_file_index ON file_index(project, file_path);
72
+
73
+ -- Knowledge Corpus
74
+ CREATE TABLE IF NOT EXISTS corpus (
75
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
76
+ project TEXT NOT NULL,
77
+ title TEXT NOT NULL,
78
+ content TEXT NOT NULL,
79
+ source TEXT, -- file path or URL
80
+ tags TEXT, -- JSON array
81
+ private INTEGER NOT NULL DEFAULT 0, -- 1 = never send to LLM
82
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
83
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch()),
84
+ UNIQUE(project, title)
85
+ );
86
+
87
+ CREATE VIRTUAL TABLE IF NOT EXISTS corpus_fts USING fts5(
88
+ title, content, tags,
89
+ content=corpus,
90
+ content_rowid=id
91
+ );
92
+
93
+ CREATE TRIGGER IF NOT EXISTS corpus_fts_insert AFTER INSERT ON corpus BEGIN
94
+ INSERT INTO corpus_fts(rowid, title, content, tags) VALUES (new.id, new.title, new.content, new.tags);
95
+ END;
96
+ CREATE TRIGGER IF NOT EXISTS corpus_fts_delete AFTER DELETE ON corpus BEGIN
97
+ INSERT INTO corpus_fts(corpus_fts, rowid, title, content, tags) VALUES ('delete', old.id, old.title, old.content, old.tags);
98
+ END;
99
+
100
+ CREATE INDEX IF NOT EXISTS idx_corpus_project ON corpus(project);
101
+ CREATE INDEX IF NOT EXISTS idx_corpus_private ON corpus(project, private);
102
+
103
+ -- Dependency Graph
104
+ CREATE TABLE IF NOT EXISTS graph_nodes (
105
+ id TEXT NOT NULL,
106
+ project TEXT NOT NULL,
107
+ type TEXT NOT NULL, -- file | function | commit
108
+ label TEXT NOT NULL,
109
+ data TEXT NOT NULL, -- JSON blob of the full node
110
+ PRIMARY KEY (project, id)
111
+ );
112
+
113
+ CREATE TABLE IF NOT EXISTS graph_edges (
114
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
115
+ project TEXT NOT NULL,
116
+ from_id TEXT NOT NULL,
117
+ to_id TEXT NOT NULL,
118
+ type TEXT NOT NULL, -- imports | calls | extends | implements
119
+ label TEXT,
120
+ UNIQUE(project, from_id, to_id, type)
121
+ );
122
+
123
+ CREATE INDEX IF NOT EXISTS idx_gnodes_project ON graph_nodes(project, type);
124
+ CREATE INDEX IF NOT EXISTS idx_gedges_from ON graph_edges(project, from_id);
125
+ CREATE INDEX IF NOT EXISTS idx_gedges_to ON graph_edges(project, to_id);
126
+ `;
127
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":";;;AAAa,QAAA,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0HzB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { GitConfig } from '../config/types.js';
2
+ export type CommitType = 'feat' | 'fix' | 'refactor' | 'docs' | 'chore' | 'test' | 'style';
3
+ export interface CommitMetadata {
4
+ taskId?: string;
5
+ agent?: string;
6
+ durationMs?: number;
7
+ filesChanged?: string[];
8
+ }
9
+ export interface CommitOptions {
10
+ type: CommitType;
11
+ scope?: string;
12
+ description: string;
13
+ body?: string;
14
+ metadata?: CommitMetadata;
15
+ }
16
+ export declare function formatCommitMessage(opts: CommitOptions, config: GitConfig): string;
17
+ export declare function slugify(text: string): string;
18
+ export declare function buildBranchName(prefix: string, type: string, description: string): string;
19
+ //# sourceMappingURL=CommitFormatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommitFormatter.d.ts","sourceRoot":"","sources":["../../src/git/CommitFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3F,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,GAAG,MAAM,CA+BlF;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ5C;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAGzF"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatCommitMessage = formatCommitMessage;
4
+ exports.slugify = slugify;
5
+ exports.buildBranchName = buildBranchName;
6
+ function formatCommitMessage(opts, config) {
7
+ if (config.commitFormat === 'simple') {
8
+ return opts.description;
9
+ }
10
+ const scope = opts.scope ? `(${opts.scope})` : '';
11
+ const header = `${opts.type}${scope}: ${opts.description}`;
12
+ const parts = [header];
13
+ if (opts.body) {
14
+ parts.push('', opts.body);
15
+ }
16
+ if (config.includeMetadata && opts.metadata) {
17
+ const meta = opts.metadata;
18
+ const lines = [];
19
+ if (meta.taskId)
20
+ lines.push(`firecode-task-id: ${meta.taskId}`);
21
+ if (meta.agent)
22
+ lines.push(`firecode-agent: ${meta.agent}`);
23
+ if (meta.durationMs !== undefined)
24
+ lines.push(`firecode-duration: ${meta.durationMs}ms`);
25
+ if (meta.filesChanged?.length) {
26
+ lines.push(`firecode-files: ${meta.filesChanged.join(', ')}`);
27
+ }
28
+ if (lines.length > 0) {
29
+ parts.push('', lines.join('\n'));
30
+ }
31
+ }
32
+ return parts.join('\n');
33
+ }
34
+ function slugify(text) {
35
+ return text
36
+ .toLowerCase()
37
+ .replace(/[^a-z0-9\s-]/g, '')
38
+ .replace(/\s+/g, '-')
39
+ .replace(/-+/g, '-')
40
+ .slice(0, 50)
41
+ .replace(/^-|-$/g, '');
42
+ }
43
+ function buildBranchName(prefix, type, description) {
44
+ const slug = slugify(description);
45
+ return `${prefix}${type}/${slug}`;
46
+ }
47
+ //# sourceMappingURL=CommitFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommitFormatter.js","sourceRoot":"","sources":["../../src/git/CommitFormatter.ts"],"names":[],"mappings":";;AAmBA,kDA+BC;AAED,0BAQC;AAED,0CAGC;AA9CD,SAAgB,mBAAmB,CAAC,IAAmB,EAAE,MAAiB;IACxE,IAAI,MAAM,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,KAAK,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;IAE3D,MAAM,KAAK,GAAa,CAAC,MAAM,CAAC,CAAC;IAEjC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,MAAM,CAAC,eAAe,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC3B,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,IAAI,IAAI,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAChE,IAAI,IAAI,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5D,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;QACzF,IAAI,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAgB,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED,SAAgB,eAAe,CAAC,MAAc,EAAE,IAAY,EAAE,WAAmB;IAC/E,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAClC,OAAO,GAAG,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { GitConfig } from '../config/types.js';
2
+ import { type CommitOptions, type CommitType } from './CommitFormatter.js';
3
+ export interface GitStatus {
4
+ isClean: boolean;
5
+ current: string | null;
6
+ modified: string[];
7
+ created: string[];
8
+ deleted: string[];
9
+ }
10
+ export declare class GitManager {
11
+ private git;
12
+ private config;
13
+ private cwd;
14
+ constructor(cwd: string, config: GitConfig);
15
+ isRepo(): Promise<boolean>;
16
+ getStatus(): Promise<GitStatus>;
17
+ getCurrentBranch(): Promise<string | null>;
18
+ listBranches(): Promise<string[]>;
19
+ branchExists(name: string): Promise<boolean>;
20
+ getBranchName(type: CommitType, description: string): string;
21
+ validateWorkingTree(): Promise<void>;
22
+ createBranch(type: CommitType, description: string): Promise<string>;
23
+ commit(opts: Omit<CommitOptions, 'type'> & {
24
+ type: CommitType;
25
+ }, files?: string[]): Promise<string>;
26
+ unstash(): Promise<void>;
27
+ }
28
+ //# sourceMappingURL=GitManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitManager.d.ts","sourceRoot":"","sources":["../../src/git/GitManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGpD,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,GAAG,CAAS;gBAER,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS;IAMpC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAS1B,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC;IAW/B,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAK1C,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKjC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlD,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAItD,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAyCpC,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsCpE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG;QAAE,IAAI,EAAE,UAAU,CAAA;KAAE,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBnG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAO/B"}
@@ -0,0 +1,147 @@
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.GitManager = void 0;
7
+ const simple_git_1 = __importDefault(require("simple-git"));
8
+ const errors_js_1 = require("../utils/errors.js");
9
+ const logger_js_1 = require("../utils/logger.js");
10
+ const CommitFormatter_js_1 = require("./CommitFormatter.js");
11
+ class GitManager {
12
+ git;
13
+ config;
14
+ cwd;
15
+ constructor(cwd, config) {
16
+ this.cwd = cwd;
17
+ this.config = config;
18
+ this.git = (0, simple_git_1.default)(cwd);
19
+ }
20
+ async isRepo() {
21
+ try {
22
+ await this.git.status();
23
+ return true;
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ }
29
+ async getStatus() {
30
+ const status = await this.git.status();
31
+ return {
32
+ isClean: status.isClean(),
33
+ current: status.current,
34
+ modified: status.modified,
35
+ created: status.created,
36
+ deleted: status.deleted,
37
+ };
38
+ }
39
+ async getCurrentBranch() {
40
+ const status = await this.git.status();
41
+ return status.current;
42
+ }
43
+ async listBranches() {
44
+ const result = await this.git.branchLocal();
45
+ return result.all;
46
+ }
47
+ async branchExists(name) {
48
+ const branches = await this.listBranches();
49
+ return branches.includes(name);
50
+ }
51
+ getBranchName(type, description) {
52
+ return (0, CommitFormatter_js_1.buildBranchName)(this.config.branchPrefix, type, description);
53
+ }
54
+ async validateWorkingTree() {
55
+ const strategy = this.config.workingTree;
56
+ const status = await this.getStatus();
57
+ if (status.isClean)
58
+ return;
59
+ logger_js_1.logger.debug({ strategy, modified: status.modified.length }, 'Working tree dirty, applying strategy');
60
+ switch (strategy) {
61
+ case 'ignore':
62
+ return;
63
+ case 'stash':
64
+ try {
65
+ await this.git.stash(['push', '-m', 'firecode: auto-stash before execution']);
66
+ logger_js_1.logger.info('Working tree stashed');
67
+ }
68
+ catch (err) {
69
+ throw new errors_js_1.GitError('Failed to stash working tree', { cause: String(err) });
70
+ }
71
+ return;
72
+ case 'commit': {
73
+ const files = [...status.modified, ...status.created, ...status.deleted];
74
+ try {
75
+ await this.git.add(files);
76
+ await this.git.commit('chore: auto-commit before firecode execution [firecode]');
77
+ logger_js_1.logger.info('Working tree auto-committed');
78
+ }
79
+ catch (err) {
80
+ throw new errors_js_1.GitError('Failed to auto-commit working tree', { cause: String(err) });
81
+ }
82
+ return;
83
+ }
84
+ case 'fail':
85
+ throw new errors_js_1.GitError(`Working tree is dirty (${status.modified.length} modified files). Clean up before running.`, { modified: status.modified });
86
+ }
87
+ }
88
+ async createBranch(type, description) {
89
+ if (!this.config.autoBranch) {
90
+ const current = await this.getCurrentBranch();
91
+ return current ?? 'HEAD';
92
+ }
93
+ const baseName = this.getBranchName(type, description);
94
+ const strategy = this.config.branchStrategy;
95
+ if (!(await this.branchExists(baseName))) {
96
+ await this.git.checkoutLocalBranch(baseName);
97
+ logger_js_1.logger.info({ branch: baseName }, 'Created new branch');
98
+ return baseName;
99
+ }
100
+ switch (strategy) {
101
+ case 'reuse':
102
+ await this.git.checkout(baseName);
103
+ logger_js_1.logger.info({ branch: baseName }, 'Checked out existing branch');
104
+ return baseName;
105
+ case 'increment': {
106
+ let counter = 2;
107
+ let name = `${baseName}-${counter}`;
108
+ while (await this.branchExists(name)) {
109
+ counter++;
110
+ name = `${baseName}-${counter}`;
111
+ }
112
+ await this.git.checkoutLocalBranch(name);
113
+ logger_js_1.logger.info({ branch: name }, 'Created incremented branch');
114
+ return name;
115
+ }
116
+ case 'fail':
117
+ throw new errors_js_1.GitError(`Branch already exists: ${baseName}`, { branch: baseName });
118
+ }
119
+ }
120
+ async commit(opts, files) {
121
+ const message = (0, CommitFormatter_js_1.formatCommitMessage)(opts, this.config);
122
+ try {
123
+ if (files && files.length > 0) {
124
+ await this.git.add(files);
125
+ }
126
+ else {
127
+ await this.git.add('.');
128
+ }
129
+ const result = await this.git.commit(message);
130
+ logger_js_1.logger.info({ commit: result.commit, summary: result.summary }, 'Committed changes');
131
+ return result.commit;
132
+ }
133
+ catch (err) {
134
+ throw new errors_js_1.GitError('Failed to commit changes', { cause: String(err) });
135
+ }
136
+ }
137
+ async unstash() {
138
+ try {
139
+ await this.git.stash(['pop']);
140
+ }
141
+ catch (err) {
142
+ logger_js_1.logger.warn({ err: String(err) }, 'Failed to pop stash');
143
+ }
144
+ }
145
+ }
146
+ exports.GitManager = GitManager;
147
+ //# sourceMappingURL=GitManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitManager.js","sourceRoot":"","sources":["../../src/git/GitManager.ts"],"names":[],"mappings":"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"}