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,134 @@
1
+ import { t } from '../../i18n/index.js';
2
+ import { getTheme } from '../themes/index.js';
3
+ import { banner, infoBox } from '../components/box.js';
4
+ import { promptSelect } from '../components/prompt.js';
5
+ import { analysisService } from '../../services/analysis-service.js';
6
+ import { logger } from '../../utils/logger.js';
7
+ export async function showMainMenu() {
8
+ const theme = getTheme();
9
+ // Show ASCII art banner
10
+ logger.raw(banner('1.0.0', t('app.tagline')));
11
+ // Show quick status if available
12
+ try {
13
+ const quickStatus = await analysisService.getQuickStatus();
14
+ logger.raw(theme.textMuted(` ${quickStatus}\n`));
15
+ }
16
+ catch {
17
+ // Ignore status errors
18
+ }
19
+ const choices = [
20
+ {
21
+ name: theme.menuItem('S', `${t('menu.status')} - ${t('menu.statusDesc')}`),
22
+ value: 'status'
23
+ },
24
+ {
25
+ name: theme.menuItem('A', `${t('menu.add')} - ${t('menu.addDesc')}`),
26
+ value: 'add'
27
+ },
28
+ {
29
+ name: theme.menuItem('C', `${t('menu.commit')} - ${t('menu.commitDesc')}`),
30
+ value: 'commit'
31
+ },
32
+ {
33
+ name: theme.menuItem('P', `${t('menu.push')} - ${t('menu.pushDesc')}`),
34
+ value: 'push'
35
+ },
36
+ {
37
+ name: theme.menuItem('L', `${t('menu.pull')} - ${t('menu.pullDesc')}`),
38
+ value: 'pull'
39
+ },
40
+ {
41
+ name: theme.menuItem('B', `${t('menu.branch')} - ${t('menu.branchDesc')}`),
42
+ value: 'branch'
43
+ },
44
+ {
45
+ name: theme.menuItem('U', `${t('menu.undo')} - ${t('menu.undoDesc')}`),
46
+ value: 'undo'
47
+ },
48
+ {
49
+ name: theme.menuItem('H', `${t('menu.history')} - ${t('menu.historyDesc')}`),
50
+ value: 'history'
51
+ },
52
+ {
53
+ name: theme.menuItem('W', `${t('menu.stash')} - ${t('menu.stashDesc')}`),
54
+ value: 'stash'
55
+ },
56
+ {
57
+ name: theme.menuItem('G', `${t('menu.config')} - ${t('menu.configDesc')}`),
58
+ value: 'config'
59
+ },
60
+ {
61
+ name: theme.menuItem('T', `${t('menu.stats')} - ${t('menu.statsDesc')}`),
62
+ value: 'stats'
63
+ },
64
+ {
65
+ name: theme.menuItem('?', `${t('menu.help')} - ${t('menu.helpDesc')}`),
66
+ value: 'help'
67
+ },
68
+ {
69
+ name: theme.menuItem('Q', `${t('menu.quit')} - ${t('menu.quitDesc')}`),
70
+ value: 'quit'
71
+ }
72
+ ];
73
+ return promptSelect(t('menu.title'), choices);
74
+ }
75
+ export async function showStatusScreen() {
76
+ const theme = getTheme();
77
+ try {
78
+ logger.command('git status');
79
+ const analysis = await analysisService.analyzeWorkingState();
80
+ const { status } = analysis;
81
+ logger.raw('\n' + theme.title(t('commands.status.title')) + '\n');
82
+ logger.raw(theme.branch(t('commands.status.branch', { branch: status.current || 'unknown' })) + '\n');
83
+ if (status.isClean) {
84
+ logger.raw(theme.success(t('commands.status.clean')) + '\n');
85
+ }
86
+ else {
87
+ if (status.staged.length > 0) {
88
+ logger.raw('\n' + theme.success(t('commands.status.staged')));
89
+ status.staged.forEach(file => {
90
+ logger.raw(theme.file(file, 'staged'));
91
+ });
92
+ }
93
+ if (status.modified.length > 0) {
94
+ logger.raw('\n' + theme.warning(t('commands.status.unstaged')));
95
+ status.modified.forEach(file => {
96
+ logger.raw(theme.file(file, 'modified'));
97
+ });
98
+ }
99
+ if (status.deleted.length > 0) {
100
+ status.deleted.forEach(file => {
101
+ logger.raw(theme.file(file, 'deleted'));
102
+ });
103
+ }
104
+ if (status.untracked.length > 0) {
105
+ logger.raw('\n' + theme.info(t('commands.status.untracked')));
106
+ status.untracked.forEach(file => {
107
+ logger.raw(theme.file(file, 'untracked'));
108
+ });
109
+ }
110
+ }
111
+ // Show ahead/behind info
112
+ if (status.ahead > 0) {
113
+ logger.raw('\n' + theme.info(t('commands.status.ahead', {
114
+ remote: status.tracking || 'origin',
115
+ count: status.ahead
116
+ })));
117
+ }
118
+ if (status.behind > 0) {
119
+ logger.raw('\n' + theme.warning(t('commands.status.behind', {
120
+ remote: status.tracking || 'origin',
121
+ count: status.behind
122
+ })));
123
+ }
124
+ // Show tip if available
125
+ if (analysis.tip) {
126
+ logger.raw('\n' + infoBox(analysis.tip, 'Tip'));
127
+ }
128
+ logger.raw('');
129
+ }
130
+ catch (error) {
131
+ logger.error(t('errors.generic', { message: error instanceof Error ? error.message : 'Unknown error' }));
132
+ }
133
+ }
134
+ //# sourceMappingURL=main-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-menu.js","sourceRoot":"","sources":["../../../src/ui/menus/main-menu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface PullResult {
2
+ pulled: boolean;
3
+ remote?: string;
4
+ branch?: string;
5
+ }
6
+ export declare function showPullMenu(): Promise<PullResult>;
7
+ //# sourceMappingURL=pull-menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull-menu.d.ts","sourceRoot":"","sources":["../../../src/ui/menus/pull-menu.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC,CA0ExD"}
@@ -0,0 +1,69 @@
1
+ import { t } from '../../i18n/index.js';
2
+ import { getTheme } from '../themes/index.js';
3
+ import { promptConfirm } from '../components/prompt.js';
4
+ import { successBox, warningBox, errorBox, infoBox } from '../components/box.js';
5
+ import { withSpinner } from '../components/spinner.js';
6
+ import { gitService } from '../../services/git-service.js';
7
+ import { preventionService } from '../../services/prevention-service.js';
8
+ import { logger } from '../../utils/logger.js';
9
+ export async function showPullMenu() {
10
+ const theme = getTheme();
11
+ logger.raw('\n' + theme.title(t('commands.pull.title')) + '\n');
12
+ try {
13
+ const status = await gitService.getStatus();
14
+ const currentBranch = status.current;
15
+ const remote = 'origin';
16
+ // Validate pull
17
+ const validation = await preventionService.validatePull();
18
+ if (validation.warnings.length > 0) {
19
+ for (const warning of validation.warnings) {
20
+ if (warning.level === 'critical') {
21
+ logger.raw(errorBox(warning.message, warning.title));
22
+ return { pulled: false };
23
+ }
24
+ else if (warning.level === 'warning') {
25
+ logger.raw(warningBox(warning.message, warning.title));
26
+ }
27
+ else {
28
+ logger.raw(infoBox(warning.message));
29
+ }
30
+ }
31
+ // Ask to continue if there are uncommitted changes
32
+ if (validation.warnings.some(w => w.message.includes('uncommitted'))) {
33
+ const proceed = await promptConfirm(t('prompts.continue'), false);
34
+ if (!proceed) {
35
+ return { pulled: false };
36
+ }
37
+ }
38
+ }
39
+ // Check if there's anything to pull
40
+ if (status.behind === 0) {
41
+ logger.raw(infoBox(t('commands.pull.upToDate')));
42
+ return { pulled: false };
43
+ }
44
+ logger.raw(theme.info(`${status.behind} commit(s) to download from ${remote}/${currentBranch}`) + '\n');
45
+ // Perform pull
46
+ logger.command(`git pull ${remote} ${currentBranch || ''}`);
47
+ await withSpinner(t('commands.pull.pulling', { remote }), async () => {
48
+ await gitService.pull(remote, currentBranch || undefined);
49
+ }, t('commands.pull.success', { count: status.behind }));
50
+ logger.raw('\n' + successBox(t('commands.pull.success', { count: status.behind }), t('success.title')));
51
+ return {
52
+ pulled: true,
53
+ remote,
54
+ branch: currentBranch || undefined
55
+ };
56
+ }
57
+ catch (error) {
58
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
59
+ // Check for merge conflicts
60
+ if (errorMessage.toLowerCase().includes('conflict')) {
61
+ logger.raw(errorBox(t('commands.pull.conflicts')));
62
+ }
63
+ else {
64
+ logger.raw(errorBox(t('commands.pull.failed', { error: errorMessage })));
65
+ }
66
+ return { pulled: false };
67
+ }
68
+ }
69
+ //# sourceMappingURL=pull-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull-menu.js","sourceRoot":"","sources":["../../../src/ui/menus/pull-menu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface PushResult {
2
+ pushed: boolean;
3
+ remote?: string;
4
+ branch?: string;
5
+ }
6
+ export declare function showPushMenu(): Promise<PushResult>;
7
+ export declare function showForcePushMenu(): Promise<PushResult>;
8
+ //# sourceMappingURL=push-menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-menu.d.ts","sourceRoot":"","sources":["../../../src/ui/menus/push-menu.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID,wBAAsB,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC,CAqJxD;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,UAAU,CAAC,CAsD7D"}
@@ -0,0 +1,160 @@
1
+ import { t } from '../../i18n/index.js';
2
+ import { getTheme } from '../themes/index.js';
3
+ import { promptConfirm, promptSelect } from '../components/prompt.js';
4
+ import { successBox, warningBox, errorBox, infoBox } from '../components/box.js';
5
+ import { withSpinner } from '../components/spinner.js';
6
+ import { gitService } from '../../services/git-service.js';
7
+ import { preventionService } from '../../services/prevention-service.js';
8
+ import { logger } from '../../utils/logger.js';
9
+ export async function showPushMenu() {
10
+ const theme = getTheme();
11
+ logger.raw('\n' + theme.title(t('commands.push.title')) + '\n');
12
+ try {
13
+ const status = await gitService.getStatus();
14
+ const currentBranch = status.current;
15
+ const remote = 'origin';
16
+ const hasTracking = !!status.tracking;
17
+ // Check if there's anything to push
18
+ // When no upstream is set, status.ahead is 0, so we need to check differently
19
+ const hasUnpushedCommits = await gitService.hasUnpushedCommits();
20
+ if (!hasUnpushedCommits && status.behind === 0) {
21
+ logger.raw(infoBox(t('commands.push.nothingToPush')));
22
+ return { pushed: false };
23
+ }
24
+ // Show info about first push if no tracking
25
+ if (!hasTracking && hasUnpushedCommits) {
26
+ const commitCount = await gitService.getUnpushedCommitCount();
27
+ logger.raw(infoBox(t('commands.push.noUpstream', { branch: currentBranch, count: commitCount }), t('commands.push.firstPush')));
28
+ }
29
+ // PREVENTION: Check if remote is ahead (need to pull first)
30
+ if (status.behind > 0) {
31
+ logger.raw(warningBox(t('commands.push.remoteBehind', { count: status.behind }), t('warnings.title')));
32
+ const choices = [
33
+ {
34
+ name: theme.menuItem('P', t('commands.push.pullThenPush')),
35
+ value: 'pull_then_push'
36
+ },
37
+ {
38
+ name: theme.menuItem('F', t('commands.push.forcePush') + ' (' + t('warnings.dangerous') + ')'),
39
+ value: 'force'
40
+ },
41
+ {
42
+ name: theme.menuItem('C', t('prompts.cancel')),
43
+ value: 'cancel'
44
+ }
45
+ ];
46
+ const action = await promptSelect(t('commands.push.behindAction'), choices);
47
+ if (action === 'cancel') {
48
+ return { pushed: false };
49
+ }
50
+ if (action === 'pull_then_push') {
51
+ // Pull first
52
+ logger.command(`git pull ${remote} ${currentBranch || ''}`);
53
+ await withSpinner(t('commands.pull.pulling', { remote }), async () => {
54
+ await gitService.pull(remote, currentBranch || undefined);
55
+ }, t('commands.pull.success', { count: status.behind }));
56
+ logger.raw(theme.success(t('commands.pull.success', { count: status.behind })) + '\n');
57
+ }
58
+ if (action === 'force') {
59
+ return showForcePushMenu();
60
+ }
61
+ }
62
+ // Check if there's anything to push after potential pull
63
+ const updatedStatus = await gitService.getStatus();
64
+ const updatedHasUnpushed = await gitService.hasUnpushedCommits();
65
+ const needsSetUpstream = !updatedStatus.tracking;
66
+ if (!updatedHasUnpushed) {
67
+ logger.raw(infoBox(t('commands.push.nothingToPush')));
68
+ return { pushed: false };
69
+ }
70
+ // Validate push
71
+ const validation = await preventionService.validatePush(false);
72
+ if (validation.warnings.length > 0) {
73
+ for (const warning of validation.warnings) {
74
+ if (warning.level === 'critical') {
75
+ logger.raw(errorBox(warning.message, warning.title));
76
+ }
77
+ else {
78
+ logger.raw(warningBox(warning.message, warning.title));
79
+ }
80
+ }
81
+ if (!validation.canProceed) {
82
+ return { pushed: false };
83
+ }
84
+ }
85
+ // Get commit count for display
86
+ const commitCount = await gitService.getUnpushedCommitCount();
87
+ // Show what will be pushed
88
+ logger.raw(theme.info(t('commands.push.confirm', {
89
+ count: commitCount,
90
+ remote,
91
+ branch: currentBranch
92
+ })) + '\n');
93
+ // Confirm push
94
+ const confirmPush = await promptConfirm(t('prompts.confirm'), true);
95
+ if (!confirmPush) {
96
+ return { pushed: false };
97
+ }
98
+ // Perform push (with -u flag if no upstream is set)
99
+ if (needsSetUpstream) {
100
+ logger.command(`git push -u ${remote} ${currentBranch || ''}`);
101
+ }
102
+ else {
103
+ logger.command(`git push ${remote} ${currentBranch || ''}`);
104
+ }
105
+ await withSpinner(t('commands.push.pushing', { remote }), async () => {
106
+ await gitService.push(remote, currentBranch || undefined, false, needsSetUpstream);
107
+ }, t('commands.push.success', { remote, branch: currentBranch }));
108
+ logger.raw('\n' + successBox(t('commands.push.success', { remote, branch: currentBranch }), t('success.title')));
109
+ return {
110
+ pushed: true,
111
+ remote,
112
+ branch: currentBranch || undefined
113
+ };
114
+ }
115
+ catch (error) {
116
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
117
+ logger.raw(errorBox(t('commands.push.failed', { error: errorMessage })));
118
+ return { pushed: false };
119
+ }
120
+ }
121
+ export async function showForcePushMenu() {
122
+ const theme = getTheme();
123
+ logger.raw('\n' + theme.title(t('commands.push.forcePush')) + '\n');
124
+ // Show critical warning
125
+ const forcePushWarning = await preventionService.checkForcePush();
126
+ if (forcePushWarning) {
127
+ logger.raw(errorBox(forcePushWarning.message, forcePushWarning.title));
128
+ logger.raw(warningBox(forcePushWarning.action));
129
+ }
130
+ // Double confirmation for force push
131
+ const confirmFirst = await promptConfirm(t('commands.push.forcePushWarning'), false);
132
+ if (!confirmFirst) {
133
+ return { pushed: false };
134
+ }
135
+ const confirmSecond = await promptConfirm('Are you absolutely sure? This cannot be undone.', false);
136
+ if (!confirmSecond) {
137
+ return { pushed: false };
138
+ }
139
+ const status = await gitService.getStatus();
140
+ const currentBranch = status.current;
141
+ const remote = 'origin';
142
+ try {
143
+ logger.command(`git push --force ${remote} ${currentBranch || ''}`);
144
+ await withSpinner(`Force pushing to ${remote}...`, async () => {
145
+ await gitService.push(remote, currentBranch || undefined, true);
146
+ }, t('commands.push.success', { remote, branch: currentBranch }));
147
+ logger.raw('\n' + successBox(t('commands.push.success', { remote, branch: currentBranch }), t('success.title')));
148
+ return {
149
+ pushed: true,
150
+ remote,
151
+ branch: currentBranch || undefined
152
+ };
153
+ }
154
+ catch (error) {
155
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
156
+ logger.raw(errorBox(t('commands.push.failed', { error: errorMessage })));
157
+ return { pushed: false };
158
+ }
159
+ }
160
+ //# sourceMappingURL=push-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-menu.js","sourceRoot":"","sources":["../../../src/ui/menus/push-menu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type SetupMenuAction = 'init' | 'clone' | 'quit';
2
+ export declare function showSetupMenu(): Promise<SetupMenuAction>;
3
+ export declare function handleGitInit(): Promise<boolean>;
4
+ export declare function handleGitClone(): Promise<boolean>;
5
+ //# sourceMappingURL=setup-menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-menu.d.ts","sourceRoot":"","sources":["../../../src/ui/menus/setup-menu.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAkHxD,wBAAsB,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC,CAyB9D;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAqDtD;AA6BD,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAoCvD"}
@@ -0,0 +1,234 @@
1
+ import { writeFileSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { t } from '../../i18n/index.js';
4
+ import { getTheme } from '../themes/index.js';
5
+ import { banner } from '../components/box.js';
6
+ import { promptSelect, promptConfirm, promptInput } from '../components/prompt.js';
7
+ import { gitService } from '../../services/git-service.js';
8
+ import { logger } from '../../utils/logger.js';
9
+ const GITIGNORE_TEMPLATES = {
10
+ node: `# Dependencies
11
+ node_modules/
12
+ package-lock.json
13
+ yarn.lock
14
+
15
+ # Build
16
+ dist/
17
+ build/
18
+ .next/
19
+
20
+ # Environment
21
+ .env
22
+ .env.local
23
+ .env*.local
24
+
25
+ # Logs
26
+ *.log
27
+ npm-debug.log*
28
+
29
+ # IDE
30
+ .idea/
31
+ .vscode/
32
+ *.swp
33
+ *.swo
34
+
35
+ # OS
36
+ .DS_Store
37
+ Thumbs.db
38
+ `,
39
+ python: `# Byte-compiled / optimized / DLL files
40
+ __pycache__/
41
+ *.py[cod]
42
+ *$py.class
43
+
44
+ # Virtual environments
45
+ venv/
46
+ env/
47
+ .venv/
48
+
49
+ # Distribution / packaging
50
+ dist/
51
+ build/
52
+ *.egg-info/
53
+
54
+ # Environment
55
+ .env
56
+
57
+ # IDE
58
+ .idea/
59
+ .vscode/
60
+ *.swp
61
+
62
+ # Jupyter
63
+ .ipynb_checkpoints/
64
+
65
+ # OS
66
+ .DS_Store
67
+ Thumbs.db
68
+ `,
69
+ java: `# Compiled class files
70
+ *.class
71
+
72
+ # Package files
73
+ *.jar
74
+ *.war
75
+ *.ear
76
+
77
+ # Build
78
+ target/
79
+ build/
80
+ out/
81
+
82
+ # IDE
83
+ .idea/
84
+ *.iml
85
+ .eclipse/
86
+ .settings/
87
+ .project
88
+ .classpath
89
+
90
+ # Logs
91
+ *.log
92
+
93
+ # OS
94
+ .DS_Store
95
+ Thumbs.db
96
+ `,
97
+ generic: `# IDE
98
+ .idea/
99
+ .vscode/
100
+ *.swp
101
+ *.swo
102
+
103
+ # Environment
104
+ .env
105
+ .env.local
106
+
107
+ # Logs
108
+ *.log
109
+
110
+ # OS
111
+ .DS_Store
112
+ Thumbs.db
113
+
114
+ # Build
115
+ dist/
116
+ build/
117
+ out/
118
+ `
119
+ };
120
+ export async function showSetupMenu() {
121
+ const theme = getTheme();
122
+ // Show banner
123
+ logger.raw(banner('1.0.0', t('app.tagline')));
124
+ // Show message that this is not a git repo
125
+ logger.raw(theme.warning(` ${t('setup.notGitRepo')}\n`));
126
+ const choices = [
127
+ {
128
+ name: theme.menuItem('I', `${t('setup.init')} - ${t('setup.initDesc')}`),
129
+ value: 'init'
130
+ },
131
+ {
132
+ name: theme.menuItem('C', `${t('setup.clone')} - ${t('setup.cloneDesc')}`),
133
+ value: 'clone'
134
+ },
135
+ {
136
+ name: theme.menuItem('Q', `${t('menu.quit')} - ${t('setup.quitDesc')}`),
137
+ value: 'quit'
138
+ }
139
+ ];
140
+ return promptSelect(t('setup.menuTitle'), choices);
141
+ }
142
+ export async function handleGitInit() {
143
+ const theme = getTheme();
144
+ logger.raw('\n' + theme.info(t('setup.initInProgress')));
145
+ logger.command('git init');
146
+ logger.raw('');
147
+ try {
148
+ // Execute git init
149
+ await gitService.init();
150
+ logger.raw(theme.success(t('setup.initSuccess')) + '\n');
151
+ // Ask if user wants to add a remote
152
+ const addRemote = await promptConfirm(t('setup.addRemoteQuestion'));
153
+ if (addRemote) {
154
+ const remoteUrl = await promptInput(t('setup.remoteUrlPrompt'), undefined, (input) => {
155
+ if (!input.trim()) {
156
+ return t('setup.remoteUrlRequired');
157
+ }
158
+ // Basic URL validation
159
+ if (!input.includes('github.com') && !input.includes('gitlab.com') &&
160
+ !input.includes('bitbucket.org') && !input.startsWith('git@') &&
161
+ !input.startsWith('https://')) {
162
+ return t('setup.remoteUrlInvalid');
163
+ }
164
+ return true;
165
+ });
166
+ logger.command(`git remote add origin ${remoteUrl}`);
167
+ await gitService.addRemote('origin', remoteUrl);
168
+ logger.raw(theme.success(t('setup.remoteAdded', { url: remoteUrl })) + '\n');
169
+ }
170
+ // Ask if user wants to create .gitignore
171
+ const createGitignore = await promptConfirm(t('setup.gitignoreQuestion'));
172
+ if (createGitignore) {
173
+ await createGitignoreFile();
174
+ }
175
+ logger.raw('\n' + theme.success(t('setup.repoReady')) + '\n');
176
+ return true;
177
+ }
178
+ catch (error) {
179
+ logger.raw(theme.error(t('errors.generic', {
180
+ message: error instanceof Error ? error.message : 'Unknown error'
181
+ })) + '\n');
182
+ return false;
183
+ }
184
+ }
185
+ async function createGitignoreFile() {
186
+ const theme = getTheme();
187
+ const choices = [
188
+ { name: t('setup.gitignoreNode'), value: 'node' },
189
+ { name: t('setup.gitignorePython'), value: 'python' },
190
+ { name: t('setup.gitignoreJava'), value: 'java' },
191
+ { name: t('setup.gitignoreGeneric'), value: 'generic' }
192
+ ];
193
+ const projectType = await promptSelect(t('setup.gitignoreType'), choices);
194
+ const template = GITIGNORE_TEMPLATES[projectType] || GITIGNORE_TEMPLATES.generic;
195
+ const gitignorePath = join(process.cwd(), '.gitignore');
196
+ // Check if .gitignore already exists
197
+ if (existsSync(gitignorePath)) {
198
+ const overwrite = await promptConfirm('.gitignore exists. Overwrite?');
199
+ if (!overwrite) {
200
+ return;
201
+ }
202
+ }
203
+ writeFileSync(gitignorePath, template, 'utf-8');
204
+ logger.raw(theme.success(t('setup.gitignoreCreated')) + '\n');
205
+ }
206
+ export async function handleGitClone() {
207
+ const theme = getTheme();
208
+ try {
209
+ const repoUrl = await promptInput(t('setup.cloneUrlPrompt'), undefined, (input) => {
210
+ if (!input.trim()) {
211
+ return t('setup.cloneUrlRequired');
212
+ }
213
+ return true;
214
+ });
215
+ // Ask for directory name (optional)
216
+ const dirName = await promptInput(t('setup.cloneDirPrompt'), '');
217
+ logger.raw('\n' + theme.info(t('setup.cloneInProgress')));
218
+ const cloneCmd = dirName ? `git clone ${repoUrl} ${dirName}` : `git clone ${repoUrl}`;
219
+ logger.command(cloneCmd);
220
+ logger.raw('');
221
+ await gitService.clone(repoUrl, dirName || undefined);
222
+ const targetDir = dirName || repoUrl.split('/').pop()?.replace('.git', '') || 'repository';
223
+ logger.raw(theme.success(t('setup.cloneSuccess', { dir: targetDir })) + '\n');
224
+ logger.raw(theme.info(t('setup.cloneNextStep', { dir: targetDir })) + '\n');
225
+ return true;
226
+ }
227
+ catch (error) {
228
+ logger.raw(theme.error(t('errors.generic', {
229
+ message: error instanceof Error ? error.message : 'Unknown error'
230
+ })) + '\n');
231
+ return false;
232
+ }
233
+ }
234
+ //# sourceMappingURL=setup-menu.js.map