gitcoach-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/bin/run.js +80 -0
  2. package/dist/analytics/index.d.ts +3 -0
  3. package/dist/analytics/index.d.ts.map +1 -0
  4. package/dist/analytics/index.js +3 -0
  5. package/dist/analytics/index.js.map +1 -0
  6. package/dist/analytics/stats-calculator.d.ts +24 -0
  7. package/dist/analytics/stats-calculator.d.ts.map +1 -0
  8. package/dist/analytics/stats-calculator.js +135 -0
  9. package/dist/analytics/stats-calculator.js.map +1 -0
  10. package/dist/analytics/tracker.d.ts +36 -0
  11. package/dist/analytics/tracker.d.ts.map +1 -0
  12. package/dist/analytics/tracker.js +103 -0
  13. package/dist/analytics/tracker.js.map +1 -0
  14. package/dist/commands/config.d.ts +7 -0
  15. package/dist/commands/config.d.ts.map +1 -0
  16. package/dist/commands/config.js +12 -0
  17. package/dist/commands/config.js.map +1 -0
  18. package/dist/commands/index.d.ts +9 -0
  19. package/dist/commands/index.d.ts.map +1 -0
  20. package/dist/commands/index.js +154 -0
  21. package/dist/commands/index.js.map +1 -0
  22. package/dist/commands/init.d.ts +7 -0
  23. package/dist/commands/init.d.ts.map +1 -0
  24. package/dist/commands/init.js +45 -0
  25. package/dist/commands/init.js.map +1 -0
  26. package/dist/commands/quick.d.ts +12 -0
  27. package/dist/commands/quick.d.ts.map +1 -0
  28. package/dist/commands/quick.js +112 -0
  29. package/dist/commands/quick.js.map +1 -0
  30. package/dist/commands/stats.d.ts +7 -0
  31. package/dist/commands/stats.d.ts.map +1 -0
  32. package/dist/commands/stats.js +42 -0
  33. package/dist/commands/stats.js.map +1 -0
  34. package/dist/config/defaults.d.ts +37 -0
  35. package/dist/config/defaults.d.ts.map +1 -0
  36. package/dist/config/defaults.js +33 -0
  37. package/dist/config/defaults.js.map +1 -0
  38. package/dist/config/index.d.ts +3 -0
  39. package/dist/config/index.d.ts.map +1 -0
  40. package/dist/config/index.js +3 -0
  41. package/dist/config/index.js.map +1 -0
  42. package/dist/config/user-config.d.ts +33 -0
  43. package/dist/config/user-config.d.ts.map +1 -0
  44. package/dist/config/user-config.js +106 -0
  45. package/dist/config/user-config.js.map +1 -0
  46. package/dist/i18n/index.d.ts +8 -0
  47. package/dist/i18n/index.d.ts.map +1 -0
  48. package/dist/i18n/index.js +45 -0
  49. package/dist/i18n/index.js.map +1 -0
  50. package/dist/i18n/locales/en.json +353 -0
  51. package/dist/i18n/locales/es.json +353 -0
  52. package/dist/i18n/locales/fr.json +353 -0
  53. package/dist/index.d.ts +9 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +11 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/services/analysis-service.d.ts +24 -0
  58. package/dist/services/analysis-service.d.ts.map +1 -0
  59. package/dist/services/analysis-service.js +158 -0
  60. package/dist/services/analysis-service.js.map +1 -0
  61. package/dist/services/copilot-service.d.ts +30 -0
  62. package/dist/services/copilot-service.d.ts.map +1 -0
  63. package/dist/services/copilot-service.js +385 -0
  64. package/dist/services/copilot-service.js.map +1 -0
  65. package/dist/services/git-service.d.ts +75 -0
  66. package/dist/services/git-service.d.ts.map +1 -0
  67. package/dist/services/git-service.js +230 -0
  68. package/dist/services/git-service.js.map +1 -0
  69. package/dist/services/index.d.ts +5 -0
  70. package/dist/services/index.d.ts.map +1 -0
  71. package/dist/services/index.js +5 -0
  72. package/dist/services/index.js.map +1 -0
  73. package/dist/services/prevention-service.d.ts +29 -0
  74. package/dist/services/prevention-service.d.ts.map +1 -0
  75. package/dist/services/prevention-service.js +213 -0
  76. package/dist/services/prevention-service.js.map +1 -0
  77. package/dist/ui/components/box.d.ts +16 -0
  78. package/dist/ui/components/box.d.ts.map +1 -0
  79. package/dist/ui/components/box.js +100 -0
  80. package/dist/ui/components/box.js.map +1 -0
  81. package/dist/ui/components/index.d.ts +5 -0
  82. package/dist/ui/components/index.d.ts.map +1 -0
  83. package/dist/ui/components/index.js +5 -0
  84. package/dist/ui/components/index.js.map +1 -0
  85. package/dist/ui/components/prompt.d.ts +19 -0
  86. package/dist/ui/components/prompt.d.ts.map +1 -0
  87. package/dist/ui/components/prompt.js +62 -0
  88. package/dist/ui/components/prompt.js.map +1 -0
  89. package/dist/ui/components/spinner.d.ts +8 -0
  90. package/dist/ui/components/spinner.d.ts.map +1 -0
  91. package/dist/ui/components/spinner.js +24 -0
  92. package/dist/ui/components/spinner.js.map +1 -0
  93. package/dist/ui/components/table.d.ts +25 -0
  94. package/dist/ui/components/table.d.ts.map +1 -0
  95. package/dist/ui/components/table.js +72 -0
  96. package/dist/ui/components/table.js.map +1 -0
  97. package/dist/ui/index.d.ts +3 -0
  98. package/dist/ui/index.d.ts.map +1 -0
  99. package/dist/ui/index.js +3 -0
  100. package/dist/ui/index.js.map +1 -0
  101. package/dist/ui/menus/add-menu.d.ts +6 -0
  102. package/dist/ui/menus/add-menu.d.ts.map +1 -0
  103. package/dist/ui/menus/add-menu.js +60 -0
  104. package/dist/ui/menus/add-menu.js.map +1 -0
  105. package/dist/ui/menus/branch-menu.d.ts +8 -0
  106. package/dist/ui/menus/branch-menu.d.ts.map +1 -0
  107. package/dist/ui/menus/branch-menu.js +141 -0
  108. package/dist/ui/menus/branch-menu.js.map +1 -0
  109. package/dist/ui/menus/commit-menu.d.ts +7 -0
  110. package/dist/ui/menus/commit-menu.d.ts.map +1 -0
  111. package/dist/ui/menus/commit-menu.js +129 -0
  112. package/dist/ui/menus/commit-menu.js.map +1 -0
  113. package/dist/ui/menus/config-menu.d.ts +3 -0
  114. package/dist/ui/menus/config-menu.d.ts.map +1 -0
  115. package/dist/ui/menus/config-menu.js +97 -0
  116. package/dist/ui/menus/config-menu.js.map +1 -0
  117. package/dist/ui/menus/help-menu.d.ts +3 -0
  118. package/dist/ui/menus/help-menu.d.ts.map +1 -0
  119. package/dist/ui/menus/help-menu.js +133 -0
  120. package/dist/ui/menus/help-menu.js.map +1 -0
  121. package/dist/ui/menus/history-menu.d.ts +3 -0
  122. package/dist/ui/menus/history-menu.d.ts.map +1 -0
  123. package/dist/ui/menus/history-menu.js +129 -0
  124. package/dist/ui/menus/history-menu.js.map +1 -0
  125. package/dist/ui/menus/index.d.ts +8 -0
  126. package/dist/ui/menus/index.d.ts.map +1 -0
  127. package/dist/ui/menus/index.js +8 -0
  128. package/dist/ui/menus/index.js.map +1 -0
  129. package/dist/ui/menus/main-menu.d.ts +4 -0
  130. package/dist/ui/menus/main-menu.d.ts.map +1 -0
  131. package/dist/ui/menus/main-menu.js +134 -0
  132. package/dist/ui/menus/main-menu.js.map +1 -0
  133. package/dist/ui/menus/pull-menu.d.ts +7 -0
  134. package/dist/ui/menus/pull-menu.d.ts.map +1 -0
  135. package/dist/ui/menus/pull-menu.js +69 -0
  136. package/dist/ui/menus/pull-menu.js.map +1 -0
  137. package/dist/ui/menus/push-menu.d.ts +8 -0
  138. package/dist/ui/menus/push-menu.d.ts.map +1 -0
  139. package/dist/ui/menus/push-menu.js +160 -0
  140. package/dist/ui/menus/push-menu.js.map +1 -0
  141. package/dist/ui/menus/setup-menu.d.ts +5 -0
  142. package/dist/ui/menus/setup-menu.d.ts.map +1 -0
  143. package/dist/ui/menus/setup-menu.js +234 -0
  144. package/dist/ui/menus/setup-menu.js.map +1 -0
  145. package/dist/ui/menus/stash-menu.d.ts +3 -0
  146. package/dist/ui/menus/stash-menu.d.ts.map +1 -0
  147. package/dist/ui/menus/stash-menu.js +205 -0
  148. package/dist/ui/menus/stash-menu.js.map +1 -0
  149. package/dist/ui/menus/undo-menu.d.ts +3 -0
  150. package/dist/ui/menus/undo-menu.d.ts.map +1 -0
  151. package/dist/ui/menus/undo-menu.js +197 -0
  152. package/dist/ui/menus/undo-menu.js.map +1 -0
  153. package/dist/ui/themes/colored.d.ts +35 -0
  154. package/dist/ui/themes/colored.d.ts.map +1 -0
  155. package/dist/ui/themes/colored.js +85 -0
  156. package/dist/ui/themes/colored.js.map +1 -0
  157. package/dist/ui/themes/index.d.ts +39 -0
  158. package/dist/ui/themes/index.d.ts.map +1 -0
  159. package/dist/ui/themes/index.js +9 -0
  160. package/dist/ui/themes/index.js.map +1 -0
  161. package/dist/ui/themes/monochrome.d.ts +35 -0
  162. package/dist/ui/themes/monochrome.d.ts.map +1 -0
  163. package/dist/ui/themes/monochrome.js +80 -0
  164. package/dist/ui/themes/monochrome.js.map +1 -0
  165. package/dist/utils/error-helper.d.ts +10 -0
  166. package/dist/utils/error-helper.d.ts.map +1 -0
  167. package/dist/utils/error-helper.js +55 -0
  168. package/dist/utils/error-helper.js.map +1 -0
  169. package/dist/utils/helpers.d.ts +16 -0
  170. package/dist/utils/helpers.d.ts.map +1 -0
  171. package/dist/utils/helpers.js +95 -0
  172. package/dist/utils/helpers.js.map +1 -0
  173. package/dist/utils/index.d.ts +4 -0
  174. package/dist/utils/index.d.ts.map +1 -0
  175. package/dist/utils/index.js +4 -0
  176. package/dist/utils/index.js.map +1 -0
  177. package/dist/utils/logger.d.ts +24 -0
  178. package/dist/utils/logger.d.ts.map +1 -0
  179. package/dist/utils/logger.js +71 -0
  180. package/dist/utils/logger.js.map +1 -0
  181. package/dist/utils/validators.d.ts +10 -0
  182. package/dist/utils/validators.d.ts.map +1 -0
  183. package/dist/utils/validators.js +78 -0
  184. package/dist/utils/validators.js.map +1 -0
  185. package/package.json +71 -0
@@ -0,0 +1,385 @@
1
+ import { executeCommand } from '../utils/helpers.js';
2
+ import { logger } from '../utils/logger.js';
3
+ class CopilotService {
4
+ available = null;
5
+ async isAvailable() {
6
+ if (this.available !== null) {
7
+ return this.available;
8
+ }
9
+ try {
10
+ // Use the new GitHub Copilot CLI (not gh copilot extension)
11
+ const { stdout, stderr } = await executeCommand('copilot --version');
12
+ // Check for version number in output (e.g., "0.0.393")
13
+ const hasVersion = /\d+\.\d+/.test(stdout);
14
+ const hasError = stderr.includes('not found') || stderr.includes('not recognized');
15
+ this.available = hasVersion && !hasError;
16
+ logger.debug('Copilot CLI availability check:', { stdout, stderr, available: this.available });
17
+ return this.available;
18
+ }
19
+ catch (error) {
20
+ logger.debug('Copilot CLI availability check failed:', error);
21
+ this.available = false;
22
+ return false;
23
+ }
24
+ }
25
+ // Reset cached availability (useful for testing)
26
+ resetAvailability() {
27
+ this.available = null;
28
+ }
29
+ async generateCommitMessage(diff) {
30
+ if (!(await this.isAvailable())) {
31
+ return {
32
+ success: false,
33
+ message: 'GitHub Copilot CLI is not available'
34
+ };
35
+ }
36
+ if (!diff || diff.trim().length === 0) {
37
+ return {
38
+ success: false,
39
+ message: 'No changes to analyze'
40
+ };
41
+ }
42
+ try {
43
+ // Summarize the diff for the prompt (extract file names only for safety)
44
+ const diffSummary = this.summarizeDiff(diff);
45
+ // Build a simple prompt - keep it clean with only alphanumeric chars
46
+ const prompt = `Generate a conventional commit message for these file changes: ${diffSummary}. Use format type: description where type is feat fix docs refactor test or chore. Reply with only the commit message.`;
47
+ logger.debug('Copilot prompt:', prompt);
48
+ // Use copilot CLI in non-interactive mode with silent output
49
+ const { stdout, stderr } = await executeCommand(`copilot -p "${this.escapeForShell(prompt)}" -s`, 60000 // 60 second timeout for AI response
50
+ );
51
+ logger.debug('Copilot CLI response:', { stdout: stdout.substring(0, 500), stderr });
52
+ // Parse the response to extract the suggested commit message
53
+ const message = this.parseCommitMessage(stdout, stderr);
54
+ if (message) {
55
+ return {
56
+ success: true,
57
+ message
58
+ };
59
+ }
60
+ return {
61
+ success: false,
62
+ message: 'Could not generate a commit message'
63
+ };
64
+ }
65
+ catch (error) {
66
+ logger.debug('Copilot CLI suggestion failed:', error);
67
+ return {
68
+ success: false,
69
+ message: error instanceof Error ? error.message : 'Unknown error'
70
+ };
71
+ }
72
+ }
73
+ summarizeDiff(diff) {
74
+ const lines = diff.split('\n');
75
+ const files = [];
76
+ let additions = 0;
77
+ let deletions = 0;
78
+ for (const line of lines) {
79
+ // Extract file names
80
+ if (line.startsWith('diff --git')) {
81
+ const match = line.match(/b\/(.+)$/);
82
+ if (match) {
83
+ files.push(match[1]);
84
+ }
85
+ }
86
+ // Count additions and deletions (safer than including code content)
87
+ else if (line.startsWith('+') && !line.startsWith('+++')) {
88
+ additions++;
89
+ }
90
+ else if (line.startsWith('-') && !line.startsWith('---')) {
91
+ deletions++;
92
+ }
93
+ }
94
+ // Build a safe single-line summary (no code content, just metadata)
95
+ const parts = [];
96
+ if (files.length > 0) {
97
+ // Clean file names (remove special chars)
98
+ const cleanFiles = files.slice(0, 5).map(f => f.replace(/[^a-zA-Z0-9._/-]/g, ''));
99
+ parts.push(`Files: ${cleanFiles.join(', ')}`);
100
+ }
101
+ if (additions > 0 || deletions > 0) {
102
+ parts.push(`${additions} additions, ${deletions} deletions`);
103
+ }
104
+ return parts.join('. ');
105
+ }
106
+ escapeForShell(str) {
107
+ return str
108
+ .replace(/\\/g, '\\\\')
109
+ .replace(/"/g, '\\"')
110
+ .replace(/`/g, '\\`')
111
+ .replace(/\$/g, '\\$')
112
+ .replace(/\n/g, '\\n')
113
+ .replace(/\r/g, '');
114
+ }
115
+ async analyzeContext(branch, stagedFiles, modifiedFiles) {
116
+ if (!(await this.isAvailable())) {
117
+ return {
118
+ success: false,
119
+ message: 'GitHub Copilot CLI is not available'
120
+ };
121
+ }
122
+ try {
123
+ const context = `Branch: ${branch}. Staged files: ${stagedFiles.join(', ') || 'none'}. Modified files: ${modifiedFiles.join(', ') || 'none'}.`;
124
+ const prompt = `Given this git state: ${context} What should the user do next? Reply with a single brief suggestion in one sentence.`;
125
+ const { stdout, stderr } = await executeCommand(`copilot -p "${this.escapeForShell(prompt)}" -s`, 30000);
126
+ const suggestion = this.parseSuggestion(stdout, stderr);
127
+ return {
128
+ success: !!suggestion,
129
+ message: suggestion || 'No suggestion available'
130
+ };
131
+ }
132
+ catch (error) {
133
+ return {
134
+ success: false,
135
+ message: error instanceof Error ? error.message : 'Unknown error'
136
+ };
137
+ }
138
+ }
139
+ async predictProblems(action, currentBranch, hasUncommitted) {
140
+ if (!(await this.isAvailable())) {
141
+ return {
142
+ success: false,
143
+ message: 'GitHub Copilot CLI is not available'
144
+ };
145
+ }
146
+ try {
147
+ const context = `Action: ${action}. Branch: ${currentBranch}. Uncommitted changes: ${hasUncommitted}.`;
148
+ const prompt = `Will this git action cause problems? ${context} Reply briefly in one sentence.`;
149
+ const { stdout, stderr } = await executeCommand(`copilot -p "${this.escapeForShell(prompt)}" -s`, 30000);
150
+ const prediction = this.parseSuggestion(stdout, stderr);
151
+ return {
152
+ success: true,
153
+ message: prediction || 'No issues predicted'
154
+ };
155
+ }
156
+ catch (error) {
157
+ return {
158
+ success: false,
159
+ message: error instanceof Error ? error.message : 'Unknown error'
160
+ };
161
+ }
162
+ }
163
+ async explainConcept(concept) {
164
+ if (!(await this.isAvailable())) {
165
+ return {
166
+ success: false,
167
+ message: 'GitHub Copilot CLI is not available'
168
+ };
169
+ }
170
+ try {
171
+ const prompt = `Explain this Git concept briefly for a beginner in 2-3 sentences: ${concept}`;
172
+ const { stdout, stderr } = await executeCommand(`copilot -p "${this.escapeForShell(prompt)}" -s`, 30000);
173
+ const explanation = this.parseSuggestion(stdout, stderr);
174
+ return {
175
+ success: !!explanation,
176
+ message: explanation || 'No explanation available'
177
+ };
178
+ }
179
+ catch (error) {
180
+ return {
181
+ success: false,
182
+ message: error instanceof Error ? error.message : 'Unknown error'
183
+ };
184
+ }
185
+ }
186
+ /**
187
+ * Ask a Git question in natural language
188
+ */
189
+ async askGitQuestion(question) {
190
+ if (!(await this.isAvailable())) {
191
+ return {
192
+ success: false,
193
+ message: 'GitHub Copilot CLI is not available'
194
+ };
195
+ }
196
+ if (!question || question.trim().length === 0) {
197
+ return {
198
+ success: false,
199
+ message: 'Please provide a question'
200
+ };
201
+ }
202
+ try {
203
+ const prompt = `You are a Git expert assistant. Answer this Git question clearly and concisely. If it involves commands, show the exact command to use.
204
+
205
+ Question: ${question}
206
+
207
+ Provide a helpful answer in 2-4 sentences. If relevant, include the Git command.`;
208
+ const { stdout, stderr } = await executeCommand(`copilot -p "${this.escapeForShell(prompt)}" -s`, 45000);
209
+ const answer = this.parseAnswer(stdout, stderr);
210
+ return {
211
+ success: !!answer,
212
+ message: answer || 'Could not get an answer'
213
+ };
214
+ }
215
+ catch (error) {
216
+ logger.debug('askGitQuestion failed:', error);
217
+ return {
218
+ success: false,
219
+ message: error instanceof Error ? error.message : 'Unknown error'
220
+ };
221
+ }
222
+ }
223
+ /**
224
+ * Explain a Git error and suggest solutions
225
+ */
226
+ async explainGitError(errorMessage, command) {
227
+ if (!(await this.isAvailable())) {
228
+ return {
229
+ success: false,
230
+ message: 'GitHub Copilot CLI is not available'
231
+ };
232
+ }
233
+ if (!errorMessage || errorMessage.trim().length === 0) {
234
+ return {
235
+ success: false,
236
+ message: 'No error message provided'
237
+ };
238
+ }
239
+ try {
240
+ const commandContext = command ? `Command executed: ${command}\n` : '';
241
+ const prompt = `You are a Git expert. Explain this Git error simply and provide a solution.
242
+
243
+ ${commandContext}Error message: ${errorMessage}
244
+
245
+ 1. Explain what this error means in simple terms (1 sentence)
246
+ 2. Provide the solution or command to fix it (1-2 sentences)
247
+
248
+ Be concise and practical.`;
249
+ const { stdout, stderr } = await executeCommand(`copilot -p "${this.escapeForShell(prompt)}" -s`, 45000);
250
+ const explanation = this.parseAnswer(stdout, stderr);
251
+ return {
252
+ success: !!explanation,
253
+ message: explanation || 'Could not explain the error'
254
+ };
255
+ }
256
+ catch (error) {
257
+ logger.debug('explainGitError failed:', error);
258
+ return {
259
+ success: false,
260
+ message: error instanceof Error ? error.message : 'Unknown error'
261
+ };
262
+ }
263
+ }
264
+ parseAnswer(output, stderr) {
265
+ const combined = `${output}\n${stderr || ''}`.trim();
266
+ const lines = combined.split('\n');
267
+ // Patterns to filter out (CLI stats)
268
+ const filterPatterns = [
269
+ /^\s*$/,
270
+ /tokens?/i,
271
+ /model/i,
272
+ /session/i,
273
+ /^\d+\s*(tokens?|ms|s)\b/i,
274
+ /^Time:/i,
275
+ /^Cost:/i,
276
+ /^Input:/i,
277
+ /^Output:/i
278
+ ];
279
+ // Collect all meaningful lines
280
+ const meaningfulLines = [];
281
+ for (const line of lines) {
282
+ const trimmed = line.trim();
283
+ if (filterPatterns.some(pattern => pattern.test(trimmed))) {
284
+ continue;
285
+ }
286
+ if (trimmed.length >= 5) {
287
+ meaningfulLines.push(trimmed);
288
+ }
289
+ }
290
+ if (meaningfulLines.length > 0) {
291
+ return meaningfulLines.join('\n');
292
+ }
293
+ return null;
294
+ }
295
+ parseCommitMessage(output, stderr) {
296
+ // Combine stdout and stderr
297
+ const combined = `${output}\n${stderr || ''}`.trim();
298
+ const lines = combined.split('\n');
299
+ // Patterns to filter out (CLI noise, stats, etc.)
300
+ const filterPatterns = [
301
+ /^\s*$/,
302
+ /^#/,
303
+ /^\$/,
304
+ /^>/,
305
+ /tokens?/i,
306
+ /model/i,
307
+ /session/i,
308
+ /^\d+\s*(tokens?|ms|s)\b/i,
309
+ /^Time:/i,
310
+ /^Cost:/i,
311
+ /^Input:/i,
312
+ /^Output:/i
313
+ ];
314
+ // First pass: look for conventional commit pattern
315
+ for (const line of lines) {
316
+ const trimmed = line.trim();
317
+ // Skip filtered patterns
318
+ if (filterPatterns.some(pattern => pattern.test(trimmed))) {
319
+ continue;
320
+ }
321
+ // Match conventional commit format
322
+ if (/^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\(.+\))?!?:\s*.+/i.test(trimmed)) {
323
+ // Clean up the message (remove quotes, backticks)
324
+ return trimmed.replace(/^["'`]|["'`]$/g, '').substring(0, 100);
325
+ }
326
+ }
327
+ // Second pass: look for any meaningful commit-like message
328
+ for (const line of lines) {
329
+ const trimmed = line.trim();
330
+ // Skip filtered patterns
331
+ if (filterPatterns.some(pattern => pattern.test(trimmed))) {
332
+ continue;
333
+ }
334
+ // Accept lines that look like commit messages (start with verb, reasonable length)
335
+ if (trimmed.length >= 10 && trimmed.length <= 100) {
336
+ // Check if it starts with a common commit verb
337
+ if (/^(add|update|fix|remove|refactor|implement|create|delete|change|improve|move|rename)/i.test(trimmed)) {
338
+ return trimmed.replace(/^["'`]|["'`]$/g, '');
339
+ }
340
+ }
341
+ }
342
+ // Third pass: return first clean line as fallback
343
+ for (const line of lines) {
344
+ const trimmed = line.trim();
345
+ if (filterPatterns.some(pattern => pattern.test(trimmed))) {
346
+ continue;
347
+ }
348
+ if (trimmed.length >= 5 && trimmed.length <= 100) {
349
+ return trimmed.replace(/^["'`]|["'`]$/g, '');
350
+ }
351
+ }
352
+ return null;
353
+ }
354
+ parseSuggestion(output, stderr) {
355
+ const combined = `${output}\n${stderr || ''}`.trim();
356
+ const lines = combined.split('\n');
357
+ // Patterns to filter out
358
+ const filterPatterns = [
359
+ /^\s*$/,
360
+ /^#/,
361
+ /^\$/,
362
+ /^>/,
363
+ /tokens?/i,
364
+ /model/i,
365
+ /session/i,
366
+ /^\d+\s*(tokens?|ms|s)\b/i,
367
+ /^Time:/i,
368
+ /^Cost:/i
369
+ ];
370
+ // Return meaningful content, filtering out CLI stats
371
+ for (const line of lines) {
372
+ const trimmed = line.trim();
373
+ if (filterPatterns.some(pattern => pattern.test(trimmed))) {
374
+ continue;
375
+ }
376
+ if (trimmed.length >= 10 && trimmed.length <= 500) {
377
+ return trimmed;
378
+ }
379
+ }
380
+ return null;
381
+ }
382
+ }
383
+ export const copilotService = new CopilotService();
384
+ export default copilotService;
385
+ //# sourceMappingURL=copilot-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-service.js","sourceRoot":"","sources":["../../src/services/copilot-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { StatusResult, DiffResult } from 'simple-git';
2
+ export interface GitStatus {
3
+ isClean: boolean;
4
+ current: string | null;
5
+ tracking: string | null;
6
+ staged: string[];
7
+ modified: string[];
8
+ deleted: string[];
9
+ untracked: string[];
10
+ ahead: number;
11
+ behind: number;
12
+ }
13
+ export interface BranchInfo {
14
+ name: string;
15
+ current: boolean;
16
+ commit: string;
17
+ label: string;
18
+ }
19
+ export interface CommitInfo {
20
+ hash: string;
21
+ date: string;
22
+ message: string;
23
+ author: string;
24
+ }
25
+ declare class GitService {
26
+ private git;
27
+ constructor(basePath?: string);
28
+ setWorkingDirectory(path: string): void;
29
+ isGitRepo(): Promise<boolean>;
30
+ getStatus(): Promise<GitStatus>;
31
+ getRawStatus(): Promise<StatusResult>;
32
+ getCurrentBranch(): Promise<string | null>;
33
+ isDetachedHead(): Promise<boolean>;
34
+ getBranches(): Promise<BranchInfo[]>;
35
+ getStagedFiles(): Promise<string[]>;
36
+ getUnstagedFiles(): Promise<string[]>;
37
+ hasUncommittedChanges(): Promise<boolean>;
38
+ getDiff(staged?: boolean): Promise<string>;
39
+ getDiffSummary(staged?: boolean): Promise<DiffResult>;
40
+ add(files: string | string[]): Promise<void>;
41
+ addAll(): Promise<void>;
42
+ commit(message: string): Promise<string>;
43
+ push(remote?: string, branch?: string, force?: boolean, setUpstream?: boolean): Promise<void>;
44
+ /**
45
+ * Check if there are local commits that haven't been pushed
46
+ * Works even when there's no upstream branch set
47
+ */
48
+ hasUnpushedCommits(): Promise<boolean>;
49
+ /**
50
+ * Get the number of unpushed commits
51
+ * Returns -1 if no upstream is set (meaning all commits are unpushed)
52
+ */
53
+ getUnpushedCommitCount(): Promise<number>;
54
+ pull(remote?: string, branch?: string): Promise<void>;
55
+ checkout(branch: string): Promise<void>;
56
+ createBranch(name: string, checkout?: boolean): Promise<void>;
57
+ deleteBranch(name: string, force?: boolean): Promise<void>;
58
+ getLog(maxCount?: number): Promise<CommitInfo[]>;
59
+ getRemotes(): Promise<string[]>;
60
+ hasRemote(): Promise<boolean>;
61
+ fetch(remote?: string): Promise<void>;
62
+ reset(mode?: 'soft' | 'mixed' | 'hard', ref?: string): Promise<void>;
63
+ stash(message?: string): Promise<void>;
64
+ stashPop(): Promise<void>;
65
+ stashApply(index?: number): Promise<void>;
66
+ stashDrop(index?: number): Promise<void>;
67
+ getStashList(): Promise<string[]>;
68
+ getFileContent(file: string, ref?: string): Promise<string>;
69
+ init(): Promise<void>;
70
+ addRemote(name: string, url: string): Promise<void>;
71
+ clone(repoUrl: string, directory?: string): Promise<void>;
72
+ }
73
+ export declare const gitService: GitService;
74
+ export default gitService;
75
+ //# sourceMappingURL=git-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-service.d.ts","sourceRoot":"","sources":["../../src/services/git-service.ts"],"names":[],"mappings":"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"}