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.
- package/bin/run.js +80 -0
- package/dist/analytics/index.d.ts +3 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/index.js +3 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/stats-calculator.d.ts +24 -0
- package/dist/analytics/stats-calculator.d.ts.map +1 -0
- package/dist/analytics/stats-calculator.js +135 -0
- package/dist/analytics/stats-calculator.js.map +1 -0
- package/dist/analytics/tracker.d.ts +36 -0
- package/dist/analytics/tracker.d.ts.map +1 -0
- package/dist/analytics/tracker.js +103 -0
- package/dist/analytics/tracker.js.map +1 -0
- package/dist/commands/config.d.ts +7 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +12 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/index.d.ts +9 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +154 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +45 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/quick.d.ts +12 -0
- package/dist/commands/quick.d.ts.map +1 -0
- package/dist/commands/quick.js +112 -0
- package/dist/commands/quick.js.map +1 -0
- package/dist/commands/stats.d.ts +7 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +42 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/config/defaults.d.ts +37 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +33 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/user-config.d.ts +33 -0
- package/dist/config/user-config.d.ts.map +1 -0
- package/dist/config/user-config.js +106 -0
- package/dist/config/user-config.js.map +1 -0
- package/dist/i18n/index.d.ts +8 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +45 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/locales/en.json +353 -0
- package/dist/i18n/locales/es.json +353 -0
- package/dist/i18n/locales/fr.json +353 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/services/analysis-service.d.ts +24 -0
- package/dist/services/analysis-service.d.ts.map +1 -0
- package/dist/services/analysis-service.js +158 -0
- package/dist/services/analysis-service.js.map +1 -0
- package/dist/services/copilot-service.d.ts +30 -0
- package/dist/services/copilot-service.d.ts.map +1 -0
- package/dist/services/copilot-service.js +385 -0
- package/dist/services/copilot-service.js.map +1 -0
- package/dist/services/git-service.d.ts +75 -0
- package/dist/services/git-service.d.ts.map +1 -0
- package/dist/services/git-service.js +230 -0
- package/dist/services/git-service.js.map +1 -0
- package/dist/services/index.d.ts +5 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +5 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/prevention-service.d.ts +29 -0
- package/dist/services/prevention-service.d.ts.map +1 -0
- package/dist/services/prevention-service.js +213 -0
- package/dist/services/prevention-service.js.map +1 -0
- package/dist/ui/components/box.d.ts +16 -0
- package/dist/ui/components/box.d.ts.map +1 -0
- package/dist/ui/components/box.js +100 -0
- package/dist/ui/components/box.js.map +1 -0
- package/dist/ui/components/index.d.ts +5 -0
- package/dist/ui/components/index.d.ts.map +1 -0
- package/dist/ui/components/index.js +5 -0
- package/dist/ui/components/index.js.map +1 -0
- package/dist/ui/components/prompt.d.ts +19 -0
- package/dist/ui/components/prompt.d.ts.map +1 -0
- package/dist/ui/components/prompt.js +62 -0
- package/dist/ui/components/prompt.js.map +1 -0
- package/dist/ui/components/spinner.d.ts +8 -0
- package/dist/ui/components/spinner.d.ts.map +1 -0
- package/dist/ui/components/spinner.js +24 -0
- package/dist/ui/components/spinner.js.map +1 -0
- package/dist/ui/components/table.d.ts +25 -0
- package/dist/ui/components/table.d.ts.map +1 -0
- package/dist/ui/components/table.js +72 -0
- package/dist/ui/components/table.js.map +1 -0
- package/dist/ui/index.d.ts +3 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +3 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/menus/add-menu.d.ts +6 -0
- package/dist/ui/menus/add-menu.d.ts.map +1 -0
- package/dist/ui/menus/add-menu.js +60 -0
- package/dist/ui/menus/add-menu.js.map +1 -0
- package/dist/ui/menus/branch-menu.d.ts +8 -0
- package/dist/ui/menus/branch-menu.d.ts.map +1 -0
- package/dist/ui/menus/branch-menu.js +141 -0
- package/dist/ui/menus/branch-menu.js.map +1 -0
- package/dist/ui/menus/commit-menu.d.ts +7 -0
- package/dist/ui/menus/commit-menu.d.ts.map +1 -0
- package/dist/ui/menus/commit-menu.js +129 -0
- package/dist/ui/menus/commit-menu.js.map +1 -0
- package/dist/ui/menus/config-menu.d.ts +3 -0
- package/dist/ui/menus/config-menu.d.ts.map +1 -0
- package/dist/ui/menus/config-menu.js +97 -0
- package/dist/ui/menus/config-menu.js.map +1 -0
- package/dist/ui/menus/help-menu.d.ts +3 -0
- package/dist/ui/menus/help-menu.d.ts.map +1 -0
- package/dist/ui/menus/help-menu.js +133 -0
- package/dist/ui/menus/help-menu.js.map +1 -0
- package/dist/ui/menus/history-menu.d.ts +3 -0
- package/dist/ui/menus/history-menu.d.ts.map +1 -0
- package/dist/ui/menus/history-menu.js +129 -0
- package/dist/ui/menus/history-menu.js.map +1 -0
- package/dist/ui/menus/index.d.ts +8 -0
- package/dist/ui/menus/index.d.ts.map +1 -0
- package/dist/ui/menus/index.js +8 -0
- package/dist/ui/menus/index.js.map +1 -0
- package/dist/ui/menus/main-menu.d.ts +4 -0
- package/dist/ui/menus/main-menu.d.ts.map +1 -0
- package/dist/ui/menus/main-menu.js +134 -0
- package/dist/ui/menus/main-menu.js.map +1 -0
- package/dist/ui/menus/pull-menu.d.ts +7 -0
- package/dist/ui/menus/pull-menu.d.ts.map +1 -0
- package/dist/ui/menus/pull-menu.js +69 -0
- package/dist/ui/menus/pull-menu.js.map +1 -0
- package/dist/ui/menus/push-menu.d.ts +8 -0
- package/dist/ui/menus/push-menu.d.ts.map +1 -0
- package/dist/ui/menus/push-menu.js +160 -0
- package/dist/ui/menus/push-menu.js.map +1 -0
- package/dist/ui/menus/setup-menu.d.ts +5 -0
- package/dist/ui/menus/setup-menu.d.ts.map +1 -0
- package/dist/ui/menus/setup-menu.js +234 -0
- package/dist/ui/menus/setup-menu.js.map +1 -0
- package/dist/ui/menus/stash-menu.d.ts +3 -0
- package/dist/ui/menus/stash-menu.d.ts.map +1 -0
- package/dist/ui/menus/stash-menu.js +205 -0
- package/dist/ui/menus/stash-menu.js.map +1 -0
- package/dist/ui/menus/undo-menu.d.ts +3 -0
- package/dist/ui/menus/undo-menu.d.ts.map +1 -0
- package/dist/ui/menus/undo-menu.js +197 -0
- package/dist/ui/menus/undo-menu.js.map +1 -0
- package/dist/ui/themes/colored.d.ts +35 -0
- package/dist/ui/themes/colored.d.ts.map +1 -0
- package/dist/ui/themes/colored.js +85 -0
- package/dist/ui/themes/colored.js.map +1 -0
- package/dist/ui/themes/index.d.ts +39 -0
- package/dist/ui/themes/index.d.ts.map +1 -0
- package/dist/ui/themes/index.js +9 -0
- package/dist/ui/themes/index.js.map +1 -0
- package/dist/ui/themes/monochrome.d.ts +35 -0
- package/dist/ui/themes/monochrome.d.ts.map +1 -0
- package/dist/ui/themes/monochrome.js +80 -0
- package/dist/ui/themes/monochrome.js.map +1 -0
- package/dist/utils/error-helper.d.ts +10 -0
- package/dist/utils/error-helper.d.ts.map +1 -0
- package/dist/utils/error-helper.js +55 -0
- package/dist/utils/error-helper.js.map +1 -0
- package/dist/utils/helpers.d.ts +16 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +95 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +24 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +71 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validators.d.ts +10 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +78 -0
- package/dist/utils/validators.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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
|