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
package/bin/run.js ADDED
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { fileURLToPath } from 'node:url';
4
+ import { dirname, join } from 'node:path';
5
+ import { Config } from '@oclif/core';
6
+
7
+ // Buffer to collect warnings during config load
8
+ let suppressWarnings = true;
9
+ let warningBuffer = [];
10
+
11
+ // Override stderr to suppress SINGLE_COMMAND_CLI warnings
12
+ const originalStderrWrite = process.stderr.write.bind(process.stderr);
13
+ process.stderr.write = (chunk, ...args) => {
14
+ const str = chunk.toString();
15
+ if (suppressWarnings && (str.includes('Symbol(SINGLE_COMMAND_CLI)') || str.includes('ModuleLoadError'))) {
16
+ warningBuffer.push(str);
17
+ return true;
18
+ }
19
+ return originalStderrWrite(chunk, ...args);
20
+ };
21
+
22
+ // Override stdout to suppress warnings printed there too
23
+ const originalStdoutWrite = process.stdout.write.bind(process.stdout);
24
+ process.stdout.write = (chunk, ...args) => {
25
+ const str = chunk.toString();
26
+ if (suppressWarnings && (str.includes('Symbol(SINGLE_COMMAND_CLI)') || str.includes('ModuleLoadError'))) {
27
+ warningBuffer.push(str);
28
+ return true;
29
+ }
30
+ return originalStdoutWrite(chunk, ...args);
31
+ };
32
+
33
+ // Also suppress Node.js warnings
34
+ process.removeAllListeners('warning');
35
+ process.on('warning', () => {});
36
+
37
+ const __filename = fileURLToPath(import.meta.url);
38
+ const __dirname = dirname(__filename);
39
+
40
+ async function main() {
41
+ const config = await Config.load({ root: join(__dirname, '..') });
42
+
43
+ // Re-enable output after config is loaded
44
+ suppressWarnings = false;
45
+
46
+ // Get args without node and script path
47
+ const args = process.argv.slice(2);
48
+
49
+ // Handle global flags
50
+ if (args.includes('--help') || args.includes('-h')) {
51
+ const { Help } = await import('@oclif/core');
52
+ const help = new Help(config);
53
+ await help.showHelp(args.filter(a => a !== '--help' && a !== '-h'));
54
+ return;
55
+ }
56
+
57
+ if (args.includes('--version') || args.includes('-v')) {
58
+ console.log(`gitsense/${config.version} ${process.platform}-${process.arch} node-${process.version}`);
59
+ return;
60
+ }
61
+
62
+ // If no arguments provided, run the main menu (index command)
63
+ if (args.length === 0) {
64
+ // Dynamically import and run the Index command
65
+ const { default: IndexCommand } = await import('../dist/commands/index.js');
66
+ const cmd = new IndexCommand(args, config);
67
+ await cmd.run();
68
+ } else {
69
+ // Otherwise, let oclif handle the command
70
+ await config.runCommand(args[0], args.slice(1));
71
+ }
72
+ }
73
+
74
+ main().catch((error) => {
75
+ suppressWarnings = false;
76
+ // Only show error if it's not the SINGLE_COMMAND_CLI warning
77
+ if (!error.message?.includes('Symbol(SINGLE_COMMAND_CLI)')) {
78
+ console.error(error);
79
+ }
80
+ });
@@ -0,0 +1,3 @@
1
+ export * from './tracker.js';
2
+ export * from './stats-calculator.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './tracker.js';
2
+ export * from './stats-calculator.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,24 @@
1
+ export interface UsageStats {
2
+ totalOperations: number;
3
+ mostUsedOperation: string;
4
+ averageOperationsPerDay: number;
5
+ daysActive: number;
6
+ streakDays: number;
7
+ peakHour: number;
8
+ errorPreventionRate: number;
9
+ aiAssistanceRate: number;
10
+ }
11
+ export interface TimeStats {
12
+ estimatedTimeSaved: number;
13
+ timeByOperation: Record<string, number>;
14
+ }
15
+ declare class StatsCalculator {
16
+ calculateUsageStats(): UsageStats;
17
+ calculateTimeStats(): TimeStats;
18
+ private calculateStreak;
19
+ private calculatePeakHour;
20
+ formatTimeSaved(minutes: number): string;
21
+ }
22
+ export declare const statsCalculator: StatsCalculator;
23
+ export default statsCalculator;
24
+ //# sourceMappingURL=stats-calculator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats-calculator.d.ts","sourceRoot":"","sources":["../../src/analytics/stats-calculator.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uBAAuB,EAAE,MAAM,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED,cAAM,eAAe;IACnB,mBAAmB,IAAI,UAAU;IA0DjC,kBAAkB,IAAI,SAAS;IAwB/B,OAAO,CAAC,eAAe;IAwCvB,OAAO,CAAC,iBAAiB;IAuBzB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAczC;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAC;AACrD,eAAe,eAAe,CAAC"}
@@ -0,0 +1,135 @@
1
+ import { tracker } from './tracker.js';
2
+ class StatsCalculator {
3
+ calculateUsageStats() {
4
+ const summary = tracker.getSummary();
5
+ const events = tracker.getRecentEvents(1000);
6
+ const totalOperations = summary.totalCommits +
7
+ summary.totalPushes +
8
+ summary.totalPulls +
9
+ summary.branchesCreated +
10
+ summary.branchesSwitched;
11
+ // Calculate most used operation
12
+ const operationCounts = {
13
+ commits: summary.totalCommits,
14
+ pushes: summary.totalPushes,
15
+ pulls: summary.totalPulls,
16
+ branches: summary.branchesCreated + summary.branchesSwitched
17
+ };
18
+ const mostUsedOperation = Object.entries(operationCounts)
19
+ .sort(([, a], [, b]) => b - a)[0]?.[0] || 'none';
20
+ // Calculate days active
21
+ const firstUsed = new Date(summary.firstUsed);
22
+ const lastUsed = new Date(summary.lastUsed);
23
+ const daysActive = Math.max(1, Math.ceil((lastUsed.getTime() - firstUsed.getTime()) / (1000 * 60 * 60 * 24)));
24
+ // Average operations per day
25
+ const averageOperationsPerDay = totalOperations / daysActive;
26
+ // Calculate streak (consecutive days)
27
+ const streakDays = this.calculateStreak(events);
28
+ // Peak hour analysis
29
+ const peakHour = this.calculatePeakHour(events);
30
+ // Error prevention rate (errors prevented vs total operations)
31
+ const errorPreventionRate = totalOperations > 0
32
+ ? (summary.errorsPrevented / totalOperations) * 100
33
+ : 0;
34
+ // AI assistance rate
35
+ const aiAssistanceRate = summary.totalCommits > 0
36
+ ? (summary.aiCommitsGenerated / summary.totalCommits) * 100
37
+ : 0;
38
+ return {
39
+ totalOperations,
40
+ mostUsedOperation,
41
+ averageOperationsPerDay: Math.round(averageOperationsPerDay * 10) / 10,
42
+ daysActive,
43
+ streakDays,
44
+ peakHour,
45
+ errorPreventionRate: Math.round(errorPreventionRate),
46
+ aiAssistanceRate: Math.round(aiAssistanceRate)
47
+ };
48
+ }
49
+ calculateTimeStats() {
50
+ const summary = tracker.getSummary();
51
+ // Estimated time saved calculations (in minutes):
52
+ // - Each error prevented: ~5 minutes (debugging time saved)
53
+ // - Each AI commit message: ~1 minute (thinking time saved)
54
+ // - Each branch operation: ~0.5 minutes (navigation time saved)
55
+ const timeSavedFromErrors = summary.errorsPrevented * 5;
56
+ const timeSavedFromAI = summary.aiCommitsGenerated * 1;
57
+ const timeSavedFromBranches = (summary.branchesCreated + summary.branchesSwitched) * 0.5;
58
+ const estimatedTimeSaved = timeSavedFromErrors + timeSavedFromAI + timeSavedFromBranches;
59
+ return {
60
+ estimatedTimeSaved: Math.round(estimatedTimeSaved),
61
+ timeByOperation: {
62
+ errorPrevention: timeSavedFromErrors,
63
+ aiAssistance: timeSavedFromAI,
64
+ branchManagement: timeSavedFromBranches
65
+ }
66
+ };
67
+ }
68
+ calculateStreak(events) {
69
+ if (events.length === 0)
70
+ return 0;
71
+ // Group events by day
72
+ const daySet = new Set();
73
+ for (const event of events) {
74
+ const day = event.timestamp.substring(0, 10); // YYYY-MM-DD
75
+ daySet.add(day);
76
+ }
77
+ const days = Array.from(daySet).sort().reverse();
78
+ if (days.length === 0)
79
+ return 0;
80
+ let streak = 1;
81
+ const today = new Date().toISOString().substring(0, 10);
82
+ // Check if used today or yesterday
83
+ if (days[0] !== today) {
84
+ const yesterday = new Date(Date.now() - 86400000).toISOString().substring(0, 10);
85
+ if (days[0] !== yesterday) {
86
+ return 0; // Streak broken
87
+ }
88
+ }
89
+ // Count consecutive days
90
+ for (let i = 1; i < days.length; i++) {
91
+ const prevDate = new Date(days[i - 1]);
92
+ const currDate = new Date(days[i]);
93
+ const diffDays = (prevDate.getTime() - currDate.getTime()) / (1000 * 60 * 60 * 24);
94
+ if (diffDays === 1) {
95
+ streak++;
96
+ }
97
+ else {
98
+ break;
99
+ }
100
+ }
101
+ return streak;
102
+ }
103
+ calculatePeakHour(events) {
104
+ if (events.length === 0)
105
+ return 12; // Default to noon
106
+ const hourCounts = new Array(24).fill(0);
107
+ for (const event of events) {
108
+ const hour = new Date(event.timestamp).getHours();
109
+ hourCounts[hour]++;
110
+ }
111
+ let maxCount = 0;
112
+ let peakHour = 12;
113
+ for (let i = 0; i < 24; i++) {
114
+ if (hourCounts[i] > maxCount) {
115
+ maxCount = hourCounts[i];
116
+ peakHour = i;
117
+ }
118
+ }
119
+ return peakHour;
120
+ }
121
+ formatTimeSaved(minutes) {
122
+ if (minutes < 60) {
123
+ return `${minutes} minute${minutes !== 1 ? 's' : ''}`;
124
+ }
125
+ const hours = Math.floor(minutes / 60);
126
+ const remainingMinutes = minutes % 60;
127
+ if (remainingMinutes === 0) {
128
+ return `${hours} hour${hours !== 1 ? 's' : ''}`;
129
+ }
130
+ return `${hours}h ${remainingMinutes}m`;
131
+ }
132
+ }
133
+ export const statsCalculator = new StatsCalculator();
134
+ export default statsCalculator;
135
+ //# sourceMappingURL=stats-calculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats-calculator.js","sourceRoot":"","sources":["../../src/analytics/stats-calculator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export type EventType = 'commit' | 'push' | 'pull' | 'branch_create' | 'branch_switch' | 'branch_delete' | 'error_prevented' | 'ai_commit_generated' | 'config_changed';
2
+ export interface AnalyticsEvent {
3
+ type: EventType;
4
+ timestamp: string;
5
+ details?: Record<string, unknown>;
6
+ }
7
+ export interface AnalyticsData {
8
+ events: AnalyticsEvent[];
9
+ summary: {
10
+ totalCommits: number;
11
+ totalPushes: number;
12
+ totalPulls: number;
13
+ branchesCreated: number;
14
+ branchesSwitched: number;
15
+ branchesDeleted: number;
16
+ errorsPrevented: number;
17
+ aiCommitsGenerated: number;
18
+ firstUsed: string;
19
+ lastUsed: string;
20
+ };
21
+ }
22
+ declare class AnalyticsTracker {
23
+ private maxEvents;
24
+ trackEvent(type: EventType, details?: Record<string, unknown>): void;
25
+ private updateSummary;
26
+ getSummary(): AnalyticsData['summary'];
27
+ getRecentEvents(limit?: number): AnalyticsEvent[];
28
+ getEventsByType(type: EventType, limit?: number): AnalyticsEvent[];
29
+ getEventCountByType(): Record<EventType, number>;
30
+ clearHistory(): void;
31
+ reset(): void;
32
+ getDataPath(): string;
33
+ }
34
+ export declare const tracker: AnalyticsTracker;
35
+ export default tracker;
36
+ //# sourceMappingURL=tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../src/analytics/tracker.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,MAAM,GACN,MAAM,GACN,eAAe,GACf,eAAe,GACf,eAAe,GACf,iBAAiB,GACjB,qBAAqB,GACrB,gBAAgB,CAAC;AAErB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB,EAAE,MAAM,CAAC;QACzB,eAAe,EAAE,MAAM,CAAC;QACxB,eAAe,EAAE,MAAM,CAAC;QACxB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAwBD,cAAM,gBAAgB;IACpB,OAAO,CAAC,SAAS,CAAQ;IAEzB,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAsBpE,OAAO,CAAC,aAAa;IAkCrB,UAAU,IAAI,aAAa,CAAC,SAAS,CAAC;IAItC,eAAe,CAAC,KAAK,GAAE,MAAW,GAAG,cAAc,EAAE;IAKrD,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,GAAE,MAAW,GAAG,cAAc,EAAE;IAKtE,mBAAmB,IAAI,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC;IAWhD,YAAY,IAAI,IAAI;IAIpB,KAAK,IAAI,IAAI;IAIb,WAAW,IAAI,MAAM;CAGtB;AAED,eAAO,MAAM,OAAO,kBAAyB,CAAC;AAC9C,eAAe,OAAO,CAAC"}
@@ -0,0 +1,103 @@
1
+ import Conf from 'conf';
2
+ const DEFAULT_ANALYTICS = {
3
+ events: [],
4
+ summary: {
5
+ totalCommits: 0,
6
+ totalPushes: 0,
7
+ totalPulls: 0,
8
+ branchesCreated: 0,
9
+ branchesSwitched: 0,
10
+ branchesDeleted: 0,
11
+ errorsPrevented: 0,
12
+ aiCommitsGenerated: 0,
13
+ firstUsed: new Date().toISOString(),
14
+ lastUsed: new Date().toISOString()
15
+ }
16
+ };
17
+ const analyticsStore = new Conf({
18
+ projectName: 'gitsense',
19
+ configName: 'analytics',
20
+ defaults: DEFAULT_ANALYTICS
21
+ });
22
+ class AnalyticsTracker {
23
+ maxEvents = 1000; // Keep last 1000 events to prevent file from growing too large
24
+ trackEvent(type, details) {
25
+ const event = {
26
+ type,
27
+ timestamp: new Date().toISOString(),
28
+ details
29
+ };
30
+ // Add event to history
31
+ const events = analyticsStore.get('events', []);
32
+ events.push(event);
33
+ // Trim events if exceeds max
34
+ if (events.length > this.maxEvents) {
35
+ events.splice(0, events.length - this.maxEvents);
36
+ }
37
+ analyticsStore.set('events', events);
38
+ // Update summary
39
+ this.updateSummary(type);
40
+ }
41
+ updateSummary(type) {
42
+ const summary = analyticsStore.get('summary', DEFAULT_ANALYTICS.summary);
43
+ switch (type) {
44
+ case 'commit':
45
+ summary.totalCommits++;
46
+ break;
47
+ case 'push':
48
+ summary.totalPushes++;
49
+ break;
50
+ case 'pull':
51
+ summary.totalPulls++;
52
+ break;
53
+ case 'branch_create':
54
+ summary.branchesCreated++;
55
+ break;
56
+ case 'branch_switch':
57
+ summary.branchesSwitched++;
58
+ break;
59
+ case 'branch_delete':
60
+ summary.branchesDeleted++;
61
+ break;
62
+ case 'error_prevented':
63
+ summary.errorsPrevented++;
64
+ break;
65
+ case 'ai_commit_generated':
66
+ summary.aiCommitsGenerated++;
67
+ break;
68
+ }
69
+ summary.lastUsed = new Date().toISOString();
70
+ analyticsStore.set('summary', summary);
71
+ }
72
+ getSummary() {
73
+ return analyticsStore.get('summary', DEFAULT_ANALYTICS.summary);
74
+ }
75
+ getRecentEvents(limit = 50) {
76
+ const events = analyticsStore.get('events', []);
77
+ return events.slice(-limit);
78
+ }
79
+ getEventsByType(type, limit = 50) {
80
+ const events = analyticsStore.get('events', []);
81
+ return events.filter(e => e.type === type).slice(-limit);
82
+ }
83
+ getEventCountByType() {
84
+ const events = analyticsStore.get('events', []);
85
+ const counts = {};
86
+ for (const event of events) {
87
+ counts[event.type] = (counts[event.type] || 0) + 1;
88
+ }
89
+ return counts;
90
+ }
91
+ clearHistory() {
92
+ analyticsStore.set('events', []);
93
+ }
94
+ reset() {
95
+ analyticsStore.clear();
96
+ }
97
+ getDataPath() {
98
+ return analyticsStore.path;
99
+ }
100
+ }
101
+ export const tracker = new AnalyticsTracker();
102
+ export default tracker;
103
+ //# sourceMappingURL=tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../src/analytics/tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Config extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAItC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,OAAgB,WAAW,SAAiC;IAE5D,OAAgB,QAAQ,WAAgC;IAElD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAI3B"}
@@ -0,0 +1,12 @@
1
+ import { Command } from '@oclif/core';
2
+ import { initI18n } from '../i18n/index.js';
3
+ import { showConfigMenu } from '../ui/menus/config-menu.js';
4
+ export default class Config extends Command {
5
+ static description = 'Configure GitSense settings';
6
+ static examples = ['<%= config.bin %> config'];
7
+ async run() {
8
+ await initI18n();
9
+ await showConfigMenu();
10
+ }
11
+ }
12
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,MAAM,CAAU,WAAW,GAAG,6BAA6B,CAAC;IAE5D,MAAM,CAAU,QAAQ,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAExD,KAAK,CAAC,GAAG;QACP,MAAM,QAAQ,EAAE,CAAC;QACjB,MAAM,cAAc,EAAE,CAAC;IACzB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Index extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ private handleSetupMenu;
7
+ private handleAction;
8
+ }
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AA4BtC,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,OAAgB,WAAW,SAA0C;IAErE,OAAgB,QAAQ,WAKtB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YAkDZ,eAAe;YA0Cf,YAAY;CA0D3B"}
@@ -0,0 +1,154 @@
1
+ import { Command } from '@oclif/core';
2
+ import { initI18n, t } from '../i18n/index.js';
3
+ import { userConfig } from '../config/user-config.js';
4
+ import { gitService } from '../services/git-service.js';
5
+ import { logger } from '../utils/logger.js';
6
+ import { getTheme } from '../ui/themes/index.js';
7
+ import { showMainMenu, showStatusScreen } from '../ui/menus/main-menu.js';
8
+ import { showAddMenu } from '../ui/menus/add-menu.js';
9
+ import { showCommitMenu } from '../ui/menus/commit-menu.js';
10
+ import { showBranchMenu } from '../ui/menus/branch-menu.js';
11
+ import { showConfigMenu } from '../ui/menus/config-menu.js';
12
+ import { showPushMenu } from '../ui/menus/push-menu.js';
13
+ import { showPullMenu } from '../ui/menus/pull-menu.js';
14
+ import { showUndoMenu } from '../ui/menus/undo-menu.js';
15
+ import { showHistoryMenu } from '../ui/menus/history-menu.js';
16
+ import { showStashMenu } from '../ui/menus/stash-menu.js';
17
+ import { showSetupMenu, handleGitInit, handleGitClone } from '../ui/menus/setup-menu.js';
18
+ import { showHelpMenu } from '../ui/menus/help-menu.js';
19
+ export default class Index extends Command {
20
+ static description = 'GitSense - Your AI-Powered Git Coach';
21
+ static examples = [
22
+ '<%= config.bin %>',
23
+ '<%= config.bin %> init',
24
+ '<%= config.bin %> config',
25
+ '<%= config.bin %> quick'
26
+ ];
27
+ async run() {
28
+ // Initialize i18n
29
+ await initI18n();
30
+ // Check if we're in a git repository
31
+ const isRepo = await gitService.isGitRepo();
32
+ if (!isRepo) {
33
+ // Show setup menu for non-git directories
34
+ const setupResult = await this.handleSetupMenu();
35
+ if (!setupResult) {
36
+ // User chose to quit or setup failed
37
+ return;
38
+ }
39
+ // After init, continue to main menu
40
+ }
41
+ // Update last used timestamp
42
+ userConfig.updateLastUsed();
43
+ // Check if first run and needs setup
44
+ if (userConfig.isFirstRun()) {
45
+ // Run init command for first-time setup
46
+ await this.config.runCommand('init');
47
+ }
48
+ // Main menu loop
49
+ let running = true;
50
+ while (running) {
51
+ try {
52
+ const action = await showMainMenu();
53
+ running = await this.handleAction(action);
54
+ }
55
+ catch (error) {
56
+ // Handle Ctrl+C gracefully
57
+ if (error instanceof Error && error.message.includes('User force closed')) {
58
+ running = false;
59
+ }
60
+ else {
61
+ logger.error(t('errors.generic', {
62
+ message: error instanceof Error ? error.message : 'Unknown error'
63
+ }));
64
+ }
65
+ }
66
+ }
67
+ // Goodbye message
68
+ const theme = getTheme();
69
+ logger.raw('\n' + theme.textMuted(t('app.goodbye')) + '\n');
70
+ }
71
+ async handleSetupMenu() {
72
+ const theme = getTheme();
73
+ let running = true;
74
+ while (running) {
75
+ try {
76
+ const action = await showSetupMenu();
77
+ switch (action) {
78
+ case 'init': {
79
+ const initSuccess = await handleGitInit();
80
+ if (initSuccess) {
81
+ // Repo created, can continue to main menu
82
+ return true;
83
+ }
84
+ // Stay in setup menu
85
+ break;
86
+ }
87
+ case 'clone':
88
+ await handleGitClone();
89
+ // After clone, user needs to cd into directory, so exit
90
+ return false;
91
+ case 'quit':
92
+ logger.raw('\n' + theme.textMuted(t('app.goodbye')) + '\n');
93
+ return false;
94
+ }
95
+ }
96
+ catch (error) {
97
+ if (error instanceof Error && error.message.includes('User force closed')) {
98
+ running = false;
99
+ }
100
+ else {
101
+ logger.error(t('errors.generic', {
102
+ message: error instanceof Error ? error.message : 'Unknown error'
103
+ }));
104
+ }
105
+ }
106
+ }
107
+ return false;
108
+ }
109
+ async handleAction(action) {
110
+ switch (action) {
111
+ case 'status':
112
+ await showStatusScreen();
113
+ return true;
114
+ case 'add':
115
+ await showAddMenu();
116
+ return true;
117
+ case 'commit':
118
+ await showCommitMenu();
119
+ return true;
120
+ case 'push':
121
+ await showPushMenu();
122
+ return true;
123
+ case 'pull':
124
+ await showPullMenu();
125
+ return true;
126
+ case 'branch':
127
+ await showBranchMenu();
128
+ return true;
129
+ case 'undo':
130
+ await showUndoMenu();
131
+ return true;
132
+ case 'history':
133
+ await showHistoryMenu();
134
+ return true;
135
+ case 'stash':
136
+ await showStashMenu();
137
+ return true;
138
+ case 'config':
139
+ await showConfigMenu();
140
+ return true;
141
+ case 'stats':
142
+ await this.config.runCommand('stats');
143
+ return true;
144
+ case 'help':
145
+ await showHelpMenu();
146
+ return true;
147
+ case 'quit':
148
+ return false;
149
+ default:
150
+ return true;
151
+ }
152
+ }
153
+ }
154
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EACL,YAAY,EACZ,gBAAgB,EAEjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EAEf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,MAAM,CAAU,WAAW,GAAG,sCAAsC,CAAC;IAErE,MAAM,CAAU,QAAQ,GAAG;QACzB,mBAAmB;QACnB,wBAAwB;QACxB,0BAA0B;QAC1B,yBAAyB;KAC1B,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,kBAAkB;QAClB,MAAM,QAAQ,EAAE,CAAC;QAEjB,qCAAqC;QACrC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC;QAE5C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,0CAA0C;YAC1C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YACjD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,qCAAqC;gBACrC,OAAO;YACT,CAAC;YACD,oCAAoC;QACtC,CAAC;QAED,6BAA6B;QAC7B,UAAU,CAAC,cAAc,EAAE,CAAC;QAE5B,qCAAqC;QACrC,IAAI,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC;YAC5B,wCAAwC;YACxC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;QAED,iBAAiB;QACjB,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,OAAO,OAAO,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;gBACpC,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,2BAA2B;gBAC3B,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;oBAC1E,OAAO,GAAG,KAAK,CAAC;gBAClB,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,EAAE;wBAC/B,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;qBAClE,CAAC,CAAC,CAAC;gBACN,CAAC;YACH,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9D,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QAEzB,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,OAAO,OAAO,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,MAAM,MAAM,GAAoB,MAAM,aAAa,EAAE,CAAC;gBAEtD,QAAQ,MAAM,EAAE,CAAC;oBACf,KAAK,MAAM,CAAC,CAAC,CAAC;wBACZ,MAAM,WAAW,GAAG,MAAM,aAAa,EAAE,CAAC;wBAC1C,IAAI,WAAW,EAAE,CAAC;4BAChB,0CAA0C;4BAC1C,OAAO,IAAI,CAAC;wBACd,CAAC;wBACD,qBAAqB;wBACrB,MAAM;oBACR,CAAC;oBAED,KAAK,OAAO;wBACV,MAAM,cAAc,EAAE,CAAC;wBACvB,wDAAwD;wBACxD,OAAO,KAAK,CAAC;oBAEf,KAAK,MAAM;wBACT,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;wBAC5D,OAAO,KAAK,CAAC;gBACjB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;oBAC1E,OAAO,GAAG,KAAK,CAAC;gBAClB,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,EAAE;wBAC/B,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;qBAClE,CAAC,CAAC,CAAC;gBACN,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,MAAsB;QAC/C,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,QAAQ;gBACX,MAAM,gBAAgB,EAAE,CAAC;gBACzB,OAAO,IAAI,CAAC;YAEd,KAAK,KAAK;gBACR,MAAM,WAAW,EAAE,CAAC;gBACpB,OAAO,IAAI,CAAC;YAEd,KAAK,QAAQ;gBACX,MAAM,cAAc,EAAE,CAAC;gBACvB,OAAO,IAAI,CAAC;YAEd,KAAK,MAAM;gBACT,MAAM,YAAY,EAAE,CAAC;gBACrB,OAAO,IAAI,CAAC;YAEd,KAAK,MAAM;gBACT,MAAM,YAAY,EAAE,CAAC;gBACrB,OAAO,IAAI,CAAC;YAEd,KAAK,QAAQ;gBACX,MAAM,cAAc,EAAE,CAAC;gBACvB,OAAO,IAAI,CAAC;YAEd,KAAK,MAAM;gBACT,MAAM,YAAY,EAAE,CAAC;gBACrB,OAAO,IAAI,CAAC;YAEd,KAAK,SAAS;gBACZ,MAAM,eAAe,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC;YAEd,KAAK,OAAO;gBACV,MAAM,aAAa,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAC;YAEd,KAAK,QAAQ;gBACX,MAAM,cAAc,EAAE,CAAC;gBACvB,OAAO,IAAI,CAAC;YAEd,KAAK,OAAO;gBACV,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBACtC,OAAO,IAAI,CAAC;YAEd,KAAK,MAAM;gBACT,MAAM,YAAY,EAAE,CAAC;gBACrB,OAAO,IAAI,CAAC;YAEd,KAAK,MAAM;gBACT,OAAO,KAAK,CAAC;YAEf;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Init extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAetC,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IACvC,OAAgB,WAAW,SAA0C;IAErE,OAAgB,QAAQ,WAA8B;IAEhD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAuD3B"}