geeto 0.1.0-beta.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/LICENSE +21 -0
- package/README.md +152 -0
- package/lib/api/copilot-adapter.d.ts +11 -0
- package/lib/api/copilot-adapter.d.ts.map +1 -0
- package/lib/api/copilot-adapter.js +41 -0
- package/lib/api/copilot-adapter.js.map +1 -0
- package/lib/api/copilot-sdk.d.ts +48 -0
- package/lib/api/copilot-sdk.d.ts.map +1 -0
- package/lib/api/copilot-sdk.js +451 -0
- package/lib/api/copilot-sdk.js.map +1 -0
- package/lib/api/copilot.d.ts +21 -0
- package/lib/api/copilot.d.ts.map +1 -0
- package/lib/api/copilot.js +87 -0
- package/lib/api/copilot.js.map +1 -0
- package/lib/api/gemini-sdk.d.ts +24 -0
- package/lib/api/gemini-sdk.d.ts.map +1 -0
- package/lib/api/gemini-sdk.js +245 -0
- package/lib/api/gemini-sdk.js.map +1 -0
- package/lib/api/gemini.d.ts +21 -0
- package/lib/api/gemini.d.ts.map +1 -0
- package/lib/api/gemini.js +87 -0
- package/lib/api/gemini.js.map +1 -0
- package/lib/api/openrouter-sdk.d.ts +58 -0
- package/lib/api/openrouter-sdk.d.ts.map +1 -0
- package/lib/api/openrouter-sdk.js +341 -0
- package/lib/api/openrouter-sdk.js.map +1 -0
- package/lib/api/openrouter.d.ts +17 -0
- package/lib/api/openrouter.d.ts.map +1 -0
- package/lib/api/openrouter.js +111 -0
- package/lib/api/openrouter.js.map +1 -0
- package/lib/api/trello.d.ts +17 -0
- package/lib/api/trello.d.ts.map +1 -0
- package/lib/api/trello.js +72 -0
- package/lib/api/trello.js.map +1 -0
- package/lib/cli/input.d.ts +39 -0
- package/lib/cli/input.d.ts.map +1 -0
- package/lib/cli/input.js +119 -0
- package/lib/cli/input.js.map +1 -0
- package/lib/cli/menu.d.ts +9 -0
- package/lib/cli/menu.d.ts.map +1 -0
- package/lib/cli/menu.js +201 -0
- package/lib/cli/menu.js.map +1 -0
- package/lib/core/constants.d.ts +22 -0
- package/lib/core/constants.d.ts.map +1 -0
- package/lib/core/constants.js +24 -0
- package/lib/core/constants.js.map +1 -0
- package/lib/core/copilot-setup.d.ts +13 -0
- package/lib/core/copilot-setup.d.ts.map +1 -0
- package/lib/core/copilot-setup.js +447 -0
- package/lib/core/copilot-setup.js.map +1 -0
- package/lib/core/gemini-setup.d.ts +8 -0
- package/lib/core/gemini-setup.d.ts.map +1 -0
- package/lib/core/gemini-setup.js +84 -0
- package/lib/core/gemini-setup.js.map +1 -0
- package/lib/core/menu-constants.d.ts +24 -0
- package/lib/core/menu-constants.d.ts.map +1 -0
- package/lib/core/menu-constants.js +22 -0
- package/lib/core/menu-constants.js.map +1 -0
- package/lib/core/openrouter-setup.d.ts +8 -0
- package/lib/core/openrouter-setup.d.ts.map +1 -0
- package/lib/core/openrouter-setup.js +73 -0
- package/lib/core/openrouter-setup.js.map +1 -0
- package/lib/core/setup.d.ts +21 -0
- package/lib/core/setup.d.ts.map +1 -0
- package/lib/core/setup.js +88 -0
- package/lib/core/setup.js.map +1 -0
- package/lib/core/trello-setup.d.ts +8 -0
- package/lib/core/trello-setup.d.ts.map +1 -0
- package/lib/core/trello-setup.js +107 -0
- package/lib/core/trello-setup.js.map +1 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +250 -0
- package/lib/index.js.map +1 -0
- package/lib/types/index.d.ts +78 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +2 -0
- package/lib/types/index.js.map +1 -0
- package/lib/utils/branch-naming.d.ts +11 -0
- package/lib/utils/branch-naming.d.ts.map +1 -0
- package/lib/utils/branch-naming.js +396 -0
- package/lib/utils/branch-naming.js.map +1 -0
- package/lib/utils/colors.d.ts +14 -0
- package/lib/utils/colors.d.ts.map +1 -0
- package/lib/utils/colors.js +14 -0
- package/lib/utils/colors.js.map +1 -0
- package/lib/utils/commit-helpers.d.ts +53 -0
- package/lib/utils/commit-helpers.d.ts.map +1 -0
- package/lib/utils/commit-helpers.js +177 -0
- package/lib/utils/commit-helpers.js.map +1 -0
- package/lib/utils/config.d.ts +87 -0
- package/lib/utils/config.d.ts.map +1 -0
- package/lib/utils/config.js +326 -0
- package/lib/utils/config.js.map +1 -0
- package/lib/utils/display.d.ts +27 -0
- package/lib/utils/display.d.ts.map +1 -0
- package/lib/utils/display.js +116 -0
- package/lib/utils/display.js.map +1 -0
- package/lib/utils/error-helpers.d.ts +27 -0
- package/lib/utils/error-helpers.d.ts.map +1 -0
- package/lib/utils/error-helpers.js +102 -0
- package/lib/utils/error-helpers.js.map +1 -0
- package/lib/utils/exec.d.ts +18 -0
- package/lib/utils/exec.d.ts.map +1 -0
- package/lib/utils/exec.js +96 -0
- package/lib/utils/exec.js.map +1 -0
- package/lib/utils/git-ai-errors.d.ts +10 -0
- package/lib/utils/git-ai-errors.d.ts.map +1 -0
- package/lib/utils/git-ai-errors.js +71 -0
- package/lib/utils/git-ai-errors.js.map +1 -0
- package/lib/utils/git-ai.d.ts +26 -0
- package/lib/utils/git-ai.d.ts.map +1 -0
- package/lib/utils/git-ai.js +603 -0
- package/lib/utils/git-ai.js.map +1 -0
- package/lib/utils/git-commands.d.ts +21 -0
- package/lib/utils/git-commands.d.ts.map +1 -0
- package/lib/utils/git-commands.js +58 -0
- package/lib/utils/git-commands.js.map +1 -0
- package/lib/utils/git-errors.d.ts +76 -0
- package/lib/utils/git-errors.d.ts.map +1 -0
- package/lib/utils/git-errors.js +565 -0
- package/lib/utils/git-errors.js.map +1 -0
- package/lib/utils/git.d.ts +61 -0
- package/lib/utils/git.d.ts.map +1 -0
- package/lib/utils/git.js +245 -0
- package/lib/utils/git.js.map +1 -0
- package/lib/utils/logging.d.ts +25 -0
- package/lib/utils/logging.d.ts.map +1 -0
- package/lib/utils/logging.js +71 -0
- package/lib/utils/logging.js.map +1 -0
- package/lib/utils/menu-builders.d.ts +47 -0
- package/lib/utils/menu-builders.d.ts.map +1 -0
- package/lib/utils/menu-builders.js +34 -0
- package/lib/utils/menu-builders.js.map +1 -0
- package/lib/utils/platform.d.ts +13 -0
- package/lib/utils/platform.d.ts.map +1 -0
- package/lib/utils/platform.js +32 -0
- package/lib/utils/platform.js.map +1 -0
- package/lib/utils/spinner-wrapper.d.ts +16 -0
- package/lib/utils/spinner-wrapper.d.ts.map +1 -0
- package/lib/utils/spinner-wrapper.js +56 -0
- package/lib/utils/spinner-wrapper.js.map +1 -0
- package/lib/utils/state.d.ts +22 -0
- package/lib/utils/state.d.ts.map +1 -0
- package/lib/utils/state.js +75 -0
- package/lib/utils/state.js.map +1 -0
- package/lib/utils/time.d.ts +4 -0
- package/lib/utils/time.d.ts.map +1 -0
- package/lib/utils/time.js +29 -0
- package/lib/utils/time.js.map +1 -0
- package/lib/utils/type-guards.d.ts +10 -0
- package/lib/utils/type-guards.d.ts.map +1 -0
- package/lib/utils/type-guards.js +29 -0
- package/lib/utils/type-guards.js.map +1 -0
- package/lib/workflows/ai-provider.d.ts +13 -0
- package/lib/workflows/ai-provider.d.ts.map +1 -0
- package/lib/workflows/ai-provider.js +55 -0
- package/lib/workflows/ai-provider.js.map +1 -0
- package/lib/workflows/author.d.ts +4 -0
- package/lib/workflows/author.d.ts.map +1 -0
- package/lib/workflows/author.js +80 -0
- package/lib/workflows/author.js.map +1 -0
- package/lib/workflows/branch-helpers.d.ts +9 -0
- package/lib/workflows/branch-helpers.d.ts.map +1 -0
- package/lib/workflows/branch-helpers.js +406 -0
- package/lib/workflows/branch-helpers.js.map +1 -0
- package/lib/workflows/branch-utils.d.ts +9 -0
- package/lib/workflows/branch-utils.d.ts.map +1 -0
- package/lib/workflows/branch-utils.js +61 -0
- package/lib/workflows/branch-utils.js.map +1 -0
- package/lib/workflows/branch.d.ts +12 -0
- package/lib/workflows/branch.d.ts.map +1 -0
- package/lib/workflows/branch.js +555 -0
- package/lib/workflows/branch.js.map +1 -0
- package/lib/workflows/cleanup.d.ts +10 -0
- package/lib/workflows/cleanup.d.ts.map +1 -0
- package/lib/workflows/cleanup.js +287 -0
- package/lib/workflows/cleanup.js.map +1 -0
- package/lib/workflows/commit.d.ts +10 -0
- package/lib/workflows/commit.d.ts.map +1 -0
- package/lib/workflows/commit.js +771 -0
- package/lib/workflows/commit.js.map +1 -0
- package/lib/workflows/main-steps.d.ts +12 -0
- package/lib/workflows/main-steps.d.ts.map +1 -0
- package/lib/workflows/main-steps.js +407 -0
- package/lib/workflows/main-steps.js.map +1 -0
- package/lib/workflows/main.d.ts +8 -0
- package/lib/workflows/main.d.ts.map +1 -0
- package/lib/workflows/main.js +720 -0
- package/lib/workflows/main.js.map +1 -0
- package/lib/workflows/security-gate.d.ts +8 -0
- package/lib/workflows/security-gate.d.ts.map +1 -0
- package/lib/workflows/security-gate.js +447 -0
- package/lib/workflows/security-gate.js.map +1 -0
- package/lib/workflows/settings.d.ts +15 -0
- package/lib/workflows/settings.d.ts.map +1 -0
- package/lib/workflows/settings.js +438 -0
- package/lib/workflows/settings.js.map +1 -0
- package/lib/workflows/trello-menu.d.ts +16 -0
- package/lib/workflows/trello-menu.d.ts.map +1 -0
- package/lib/workflows/trello-menu.js +361 -0
- package/lib/workflows/trello-menu.js.map +1 -0
- package/package.json +112 -0
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
import { createBranch, promptManualBranch } from './branch-utils.js';
|
|
2
|
+
import { fetchTrelloCards, fetchTrelloLists, generateBranchNameFromTrelloTitle, } from '../api/trello.js';
|
|
3
|
+
import { askQuestion } from '../cli/input.js';
|
|
4
|
+
import { select } from '../cli/menu.js';
|
|
5
|
+
import { STEP } from '../core/constants.js';
|
|
6
|
+
import { colors } from '../utils/colors.js';
|
|
7
|
+
import { DEFAULT_GEMINI_MODEL, getBranchStrategyConfig, hasTrelloConfig, saveBranchStrategyConfig, } from '../utils/config.js';
|
|
8
|
+
import { chooseModelForProvider } from '../utils/git-ai.js';
|
|
9
|
+
import { generateBranchNameWithProvider, getAIProviderShortName, getModelDisplayName, interactiveAIFallback, isContextLimitFailure, isTransientAIFailure, } from '../utils/git.js';
|
|
10
|
+
import { log } from '../utils/logging.js';
|
|
11
|
+
import { saveState } from '../utils/state.js';
|
|
12
|
+
export async function handleTrelloCase(state, branchConfig, separator, defaultPrefix) {
|
|
13
|
+
// Returns result explaining what to do next for the branch workflow
|
|
14
|
+
if (!hasTrelloConfig()) {
|
|
15
|
+
const spinner = log.spinner();
|
|
16
|
+
spinner.start('Setting up Trello integration...');
|
|
17
|
+
const { setupTrelloConfigInteractive } = await import('../core/trello-setup.js');
|
|
18
|
+
const setupSuccess = setupTrelloConfigInteractive();
|
|
19
|
+
spinner.stop();
|
|
20
|
+
if (!setupSuccess) {
|
|
21
|
+
log.warn('Trello setup failed or cancelled.');
|
|
22
|
+
return { branchFlowComplete: false, branchMenuShown: false };
|
|
23
|
+
}
|
|
24
|
+
log.success('Trello integration configured!');
|
|
25
|
+
}
|
|
26
|
+
const spinner = log.spinner();
|
|
27
|
+
spinner.start('Checking Trello for tasks...');
|
|
28
|
+
const trelloLists = await fetchTrelloLists();
|
|
29
|
+
spinner.stop();
|
|
30
|
+
if (trelloLists.length === 0) {
|
|
31
|
+
log.warn('No Trello lists found on board');
|
|
32
|
+
return { branchFlowComplete: false, branchMenuShown: false };
|
|
33
|
+
}
|
|
34
|
+
// List selection
|
|
35
|
+
const lastUsedListId = branchConfig?.lastTrelloList;
|
|
36
|
+
const listOptions = [
|
|
37
|
+
...trelloLists.map((list) => ({
|
|
38
|
+
label: list.id === lastUsedListId ? `${list.name} ⭐ Last used` : `${list.name}`,
|
|
39
|
+
value: list.id,
|
|
40
|
+
})),
|
|
41
|
+
{ label: 'All lists (no filter)', value: 'all' },
|
|
42
|
+
{ label: 'Back to branch menu', value: 'back-menu' },
|
|
43
|
+
];
|
|
44
|
+
const selectedListId = await select('Select Trello list:', listOptions);
|
|
45
|
+
if (selectedListId === 'back-menu') {
|
|
46
|
+
return { branchFlowComplete: false, branchMenuShown: false };
|
|
47
|
+
}
|
|
48
|
+
if (selectedListId !== 'all') {
|
|
49
|
+
const currentStrategy = getBranchStrategyConfig();
|
|
50
|
+
saveBranchStrategyConfig({
|
|
51
|
+
separator,
|
|
52
|
+
lastNamingStrategy: currentStrategy?.lastNamingStrategy,
|
|
53
|
+
lastTrelloList: selectedListId,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
const filterListId = selectedListId === 'all' ? undefined : selectedListId;
|
|
57
|
+
const cardSpinner = log.spinner();
|
|
58
|
+
cardSpinner.start('Loading Trello cards...');
|
|
59
|
+
const trelloCards = await fetchTrelloCards(filterListId);
|
|
60
|
+
cardSpinner.stop();
|
|
61
|
+
if (trelloCards.length === 0) {
|
|
62
|
+
log.warn('No cards found in selected list');
|
|
63
|
+
return { branchFlowComplete: false, branchMenuShown: false };
|
|
64
|
+
}
|
|
65
|
+
// Card selection and naming
|
|
66
|
+
const trelloOptions = [
|
|
67
|
+
...trelloCards.slice(0, 15).map((card) => {
|
|
68
|
+
const branchPreview = generateBranchNameFromTrelloTitle(card.name, card.shortLink, separator);
|
|
69
|
+
return {
|
|
70
|
+
label: `${defaultPrefix}${branchPreview}`,
|
|
71
|
+
value: JSON.stringify({ id: card.shortLink, title: card.name }),
|
|
72
|
+
};
|
|
73
|
+
}),
|
|
74
|
+
{ label: 'Back to branch menu', value: 'back-menu' },
|
|
75
|
+
];
|
|
76
|
+
const selectedCard = await select('Select Trello card:', trelloOptions);
|
|
77
|
+
if (selectedCard === 'back-menu') {
|
|
78
|
+
return { branchFlowComplete: false, branchMenuShown: false };
|
|
79
|
+
}
|
|
80
|
+
const cardData = JSON.parse(selectedCard);
|
|
81
|
+
const trelloCardId = cardData.id;
|
|
82
|
+
log.success(`Linked to Trello card ${trelloCardId}`);
|
|
83
|
+
// Naming strategy selection for the card
|
|
84
|
+
const namingChoice = await select('Branch naming strategy:', [
|
|
85
|
+
{ label: 'Use Trello title (full)', value: 'title-full' },
|
|
86
|
+
{ label: 'Use Trello title (AI shortened)', value: 'title-ai' },
|
|
87
|
+
{ label: 'Use Trello title (AI shortened + English)', value: 'title-ai-en' },
|
|
88
|
+
{ label: 'Back to card selection', value: 'back' },
|
|
89
|
+
]);
|
|
90
|
+
if (namingChoice === 'back') {
|
|
91
|
+
return { branchFlowComplete: false, branchMenuShown: false };
|
|
92
|
+
}
|
|
93
|
+
if (namingChoice === 'title-full') {
|
|
94
|
+
const branchSuffix = generateBranchNameFromTrelloTitle(cardData.title, cardData.id, separator);
|
|
95
|
+
const workingBranch = `${defaultPrefix}${branchSuffix}`;
|
|
96
|
+
log.success(`Branch name: ${colors.cyan}${workingBranch}${colors.reset}`);
|
|
97
|
+
if (await createBranch(workingBranch, state.currentBranch)) {
|
|
98
|
+
state.workingBranch = workingBranch;
|
|
99
|
+
state.step = STEP.BRANCH_CREATED;
|
|
100
|
+
saveState(state);
|
|
101
|
+
return {
|
|
102
|
+
workingBranch,
|
|
103
|
+
selectedNamingStrategy: 'title-full',
|
|
104
|
+
branchFlowComplete: true,
|
|
105
|
+
branchMenuShown: true,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return { branchFlowComplete: false, branchMenuShown: false };
|
|
109
|
+
}
|
|
110
|
+
// title-ai or title-ai-en: use AI to shorten Trello title (optionally translate to English first)
|
|
111
|
+
const shouldTranslateToEnglish = namingChoice === 'title-ai-en';
|
|
112
|
+
// First, ensure AI provider is configured
|
|
113
|
+
if (!state.aiProvider) {
|
|
114
|
+
log.warn('No AI provider configured yet.');
|
|
115
|
+
const providerChoice = await select('Choose AI provider:', [
|
|
116
|
+
{ label: 'Gemini', value: 'gemini' },
|
|
117
|
+
{ label: 'GitHub Copilot (Recommended)', value: 'copilot' },
|
|
118
|
+
{ label: 'OpenRouter', value: 'openrouter' },
|
|
119
|
+
{ label: 'Back to naming strategy', value: 'back' },
|
|
120
|
+
]);
|
|
121
|
+
if (providerChoice === 'back') {
|
|
122
|
+
return { branchFlowComplete: false, branchMenuShown: false };
|
|
123
|
+
}
|
|
124
|
+
const chosenProvider = providerChoice;
|
|
125
|
+
// Let user choose model for the selected provider
|
|
126
|
+
const chosenModel = await chooseModelForProvider(chosenProvider, 'Choose model:', 'Back to provider selection');
|
|
127
|
+
if (!chosenModel || chosenModel === 'back') {
|
|
128
|
+
return { branchFlowComplete: false, branchMenuShown: false };
|
|
129
|
+
}
|
|
130
|
+
// Save selected provider and model to state
|
|
131
|
+
state.aiProvider = chosenProvider;
|
|
132
|
+
if (chosenProvider === 'copilot') {
|
|
133
|
+
state.copilotModel = chosenModel;
|
|
134
|
+
}
|
|
135
|
+
else if (chosenProvider === 'openrouter') {
|
|
136
|
+
state.openrouterModel = chosenModel;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
state.geminiModel = chosenModel;
|
|
140
|
+
}
|
|
141
|
+
saveState(state);
|
|
142
|
+
log.success(`AI provider set to ${getAIProviderShortName(chosenProvider)}`);
|
|
143
|
+
}
|
|
144
|
+
let correction = '';
|
|
145
|
+
let aiSuffix = null;
|
|
146
|
+
let skipRegenerate = false;
|
|
147
|
+
while (true) {
|
|
148
|
+
const aiProvider = state.aiProvider;
|
|
149
|
+
let modelParam;
|
|
150
|
+
if (aiProvider === 'copilot') {
|
|
151
|
+
modelParam = state.copilotModel;
|
|
152
|
+
}
|
|
153
|
+
else if (aiProvider === 'openrouter') {
|
|
154
|
+
modelParam = state.openrouterModel;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
modelParam = (state.geminiModel ?? DEFAULT_GEMINI_MODEL);
|
|
158
|
+
}
|
|
159
|
+
let model;
|
|
160
|
+
if (aiProvider === 'copilot') {
|
|
161
|
+
model = state.copilotModel;
|
|
162
|
+
}
|
|
163
|
+
else if (aiProvider === 'openrouter') {
|
|
164
|
+
model = state.openrouterModel;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
model = state.geminiModel ?? DEFAULT_GEMINI_MODEL;
|
|
168
|
+
}
|
|
169
|
+
const modelDisplay = getModelDisplayName(aiProvider, model);
|
|
170
|
+
const spinner = log.spinner();
|
|
171
|
+
let titleToProcess = cardData.title;
|
|
172
|
+
// Step 1: Translate to English if requested
|
|
173
|
+
if (shouldTranslateToEnglish && !skipRegenerate) {
|
|
174
|
+
spinner.start(`Translating to English using ${getAIProviderShortName(aiProvider)}${modelDisplay ? ` (${modelDisplay})` : ''}...`);
|
|
175
|
+
const translatedTitle = await generateBranchNameWithProvider(aiProvider, `Translate this to English (keep it concise): "${cardData.title}"`, '', state.copilotModel, state.openrouterModel, state.geminiModel);
|
|
176
|
+
// Stop spinner first to ensure error messages appear on new line
|
|
177
|
+
spinner.stop();
|
|
178
|
+
if (translatedTitle &&
|
|
179
|
+
!isTransientAIFailure(translatedTitle) &&
|
|
180
|
+
!isContextLimitFailure(translatedTitle)) {
|
|
181
|
+
titleToProcess = translatedTitle;
|
|
182
|
+
log.info(`Translated: ${colors.cyan}${titleToProcess}${colors.reset}`);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
if (!translatedTitle || translatedTitle.includes('Execution failed')) {
|
|
186
|
+
log.warn('Translation unavailable, using original title');
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
log.warn('Translation failed, using original title');
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Step 2: Generate short branch name
|
|
194
|
+
spinner.start(`Generating short branch name using ${getAIProviderShortName(aiProvider)}${modelDisplay ? ` (${modelDisplay})` : ''}...`);
|
|
195
|
+
if (skipRegenerate) {
|
|
196
|
+
// consume skip once and reuse previous aiSuffix
|
|
197
|
+
skipRegenerate = false;
|
|
198
|
+
spinner.stop();
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
aiSuffix = await generateBranchNameWithProvider(aiProvider, titleToProcess, correction, state.copilotModel, state.openrouterModel, state.geminiModel);
|
|
202
|
+
spinner.stop();
|
|
203
|
+
}
|
|
204
|
+
if (!aiSuffix || isTransientAIFailure(aiSuffix) || isContextLimitFailure(aiSuffix)) {
|
|
205
|
+
aiSuffix = await interactiveAIFallback(aiSuffix, aiProvider, modelParam, cardData.title, correction, state.currentBranch, (provider, selectedModel) => {
|
|
206
|
+
state.aiProvider = provider;
|
|
207
|
+
if (provider === 'copilot') {
|
|
208
|
+
state.copilotModel = selectedModel;
|
|
209
|
+
}
|
|
210
|
+
else if (provider === 'openrouter') {
|
|
211
|
+
state.openrouterModel = selectedModel;
|
|
212
|
+
}
|
|
213
|
+
saveState(state);
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
let workingBranch = '';
|
|
217
|
+
if (aiSuffix === null) {
|
|
218
|
+
workingBranch = promptManualBranch(state.currentBranch);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
const tmp = aiSuffix
|
|
222
|
+
.replaceAll(/[^A-Za-z0-9]+/g, separator)
|
|
223
|
+
.replaceAll(/[-_]+/g, separator)
|
|
224
|
+
.toLowerCase();
|
|
225
|
+
let cleanSuffix = tmp;
|
|
226
|
+
while (cleanSuffix.startsWith(separator))
|
|
227
|
+
cleanSuffix = cleanSuffix.slice(separator.length);
|
|
228
|
+
while (cleanSuffix.endsWith(separator))
|
|
229
|
+
cleanSuffix = cleanSuffix.slice(0, -separator.length);
|
|
230
|
+
workingBranch = `${defaultPrefix}${trelloCardId}${separator}${cleanSuffix}`;
|
|
231
|
+
const contextLimitDetected = isContextLimitFailure(aiSuffix);
|
|
232
|
+
if (!contextLimitDetected) {
|
|
233
|
+
log.ai(`Suggested: ${colors.cyan}${colors.bright}${workingBranch}${colors.reset}`);
|
|
234
|
+
log.info('Incorrect Suggestion? check .geeto/last-ai-suggestion.json (possible AI/context limit).\n');
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
const contextLimitDetected = isContextLimitFailure(aiSuffix);
|
|
238
|
+
let acceptChoice;
|
|
239
|
+
if (contextLimitDetected) {
|
|
240
|
+
acceptChoice = await select('This model cannot process the input due to token/context limits. Please choose a different model or provider:', [
|
|
241
|
+
{
|
|
242
|
+
label: `Try again with ${getAIProviderShortName(aiProvider)}${model ? ` (${model})` : ''} model`,
|
|
243
|
+
value: 'try-same',
|
|
244
|
+
},
|
|
245
|
+
{ label: 'Change model', value: 'change-model' },
|
|
246
|
+
{ label: 'Change AI provider', value: 'change-provider' },
|
|
247
|
+
{ label: 'Edit manually', value: 'edit' },
|
|
248
|
+
{ label: 'Back to card selection', value: 'back' },
|
|
249
|
+
]);
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
acceptChoice = await select('Accept this branch name?', [
|
|
253
|
+
{ label: 'Yes, use it', value: 'accept' },
|
|
254
|
+
{ label: 'Regenerate', value: 'regenerate' },
|
|
255
|
+
{ label: 'Correct AI (give feedback)', value: 'correct' },
|
|
256
|
+
{ label: 'Change model', value: 'change-model' },
|
|
257
|
+
{ label: 'Change AI provider', value: 'change-provider' },
|
|
258
|
+
{ label: 'Edit manually', value: 'edit' },
|
|
259
|
+
{ label: 'Back to card selection', value: 'back' },
|
|
260
|
+
]);
|
|
261
|
+
}
|
|
262
|
+
switch (acceptChoice) {
|
|
263
|
+
case 'accept': {
|
|
264
|
+
// create branch and return
|
|
265
|
+
if (await createBranch(workingBranch, state.currentBranch)) {
|
|
266
|
+
state.workingBranch = workingBranch;
|
|
267
|
+
state.step = STEP.BRANCH_CREATED;
|
|
268
|
+
saveState(state);
|
|
269
|
+
return {
|
|
270
|
+
workingBranch,
|
|
271
|
+
selectedNamingStrategy: 'title-ai',
|
|
272
|
+
branchFlowComplete: true,
|
|
273
|
+
branchMenuShown: true,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
// creation failed, return to menus
|
|
277
|
+
return { branchFlowComplete: false, branchMenuShown: false };
|
|
278
|
+
}
|
|
279
|
+
case 'try-same': {
|
|
280
|
+
// User requested re-trying with the same provider/model
|
|
281
|
+
correction = '';
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
case 'regenerate': {
|
|
285
|
+
correction = '';
|
|
286
|
+
break;
|
|
287
|
+
}
|
|
288
|
+
case 'change-provider': {
|
|
289
|
+
// let user pick another provider and optionally pick a model
|
|
290
|
+
const prov = await select('Choose AI provider:', [
|
|
291
|
+
{ label: 'Gemini', value: 'gemini' },
|
|
292
|
+
{ label: 'GitHub Copilot (Recommended)', value: 'copilot' },
|
|
293
|
+
{ label: 'OpenRouter', value: 'openrouter' },
|
|
294
|
+
{ label: 'Back to suggested branch selection', value: 'cancel-prov' },
|
|
295
|
+
]);
|
|
296
|
+
if (prov === 'cancel-prov') {
|
|
297
|
+
// User chose contextual back — don't regenerate AI suggestion
|
|
298
|
+
skipRegenerate = true;
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
state.aiProvider = prov;
|
|
302
|
+
log.info(`Selected AI Provider: ${getAIProviderShortName(state.aiProvider ?? 'gemini')}`);
|
|
303
|
+
const chosen = await chooseModelForProvider(state.aiProvider, 'Choose model:', 'Back to suggested branch selection');
|
|
304
|
+
if (!chosen) {
|
|
305
|
+
skipRegenerate = true;
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
if (chosen === 'back') {
|
|
309
|
+
skipRegenerate = true;
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
switch (prov) {
|
|
313
|
+
case 'copilot': {
|
|
314
|
+
state.copilotModel = chosen;
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
case 'openrouter': {
|
|
318
|
+
state.openrouterModel = chosen;
|
|
319
|
+
break;
|
|
320
|
+
}
|
|
321
|
+
case 'gemini': {
|
|
322
|
+
state.geminiModel = chosen;
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
325
|
+
default: {
|
|
326
|
+
break;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
saveState(state);
|
|
330
|
+
correction = '';
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
case 'change-model': {
|
|
334
|
+
// change only the current provider's model
|
|
335
|
+
const currentProv = state.aiProvider ?? 'gemini';
|
|
336
|
+
if (currentProv === 'copilot') {
|
|
337
|
+
const cop = await import('../api/copilot.js');
|
|
338
|
+
const models = await cop.getCopilotModels();
|
|
339
|
+
const copOptions = models.some((m) => m.value === 'back')
|
|
340
|
+
? models
|
|
341
|
+
: [...models, { label: 'Back to suggested branch selection', value: 'back' }];
|
|
342
|
+
const chosen = await select('Choose Copilot model:', copOptions);
|
|
343
|
+
if (chosen === 'back') {
|
|
344
|
+
skipRegenerate = true;
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
347
|
+
state.copilotModel = chosen;
|
|
348
|
+
}
|
|
349
|
+
else if (currentProv === 'openrouter') {
|
|
350
|
+
const or = await import('../api/openrouter.js');
|
|
351
|
+
const models = await or.getOpenRouterModels();
|
|
352
|
+
const orOptions = models.some((m) => m.value === 'back')
|
|
353
|
+
? models
|
|
354
|
+
: [...models, { label: 'Back to suggested branch selection', value: 'back' }];
|
|
355
|
+
const chosen = await select('Choose OpenRouter model:', orOptions);
|
|
356
|
+
if (chosen === 'back') {
|
|
357
|
+
skipRegenerate = true;
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
state.openrouterModel = chosen;
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
const gm = await import('../api/gemini.js');
|
|
364
|
+
const models = await gm.getGeminiModels();
|
|
365
|
+
const gmOptions = models.some((m) => m.value === 'back')
|
|
366
|
+
? models
|
|
367
|
+
: [...models, { label: 'Back to suggested branch selection', value: 'back' }];
|
|
368
|
+
const chosen = await select('Choose Gemini model:', gmOptions);
|
|
369
|
+
if (chosen === 'back') {
|
|
370
|
+
skipRegenerate = true;
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
373
|
+
state.geminiModel = chosen;
|
|
374
|
+
}
|
|
375
|
+
saveState(state);
|
|
376
|
+
correction = '';
|
|
377
|
+
break;
|
|
378
|
+
}
|
|
379
|
+
case 'correct': {
|
|
380
|
+
correction = askQuestion('Provide corrections for the AI (e.g., shorten, prefer verb tense): ');
|
|
381
|
+
console.log('');
|
|
382
|
+
break;
|
|
383
|
+
}
|
|
384
|
+
case 'edit': {
|
|
385
|
+
const edited = askQuestion(`Edit branch (${workingBranch}): `);
|
|
386
|
+
workingBranch = edited || workingBranch;
|
|
387
|
+
if (await createBranch(workingBranch, state.currentBranch)) {
|
|
388
|
+
state.workingBranch = workingBranch;
|
|
389
|
+
state.step = STEP.BRANCH_CREATED;
|
|
390
|
+
saveState(state);
|
|
391
|
+
return {
|
|
392
|
+
workingBranch,
|
|
393
|
+
selectedNamingStrategy: 'title-ai',
|
|
394
|
+
branchFlowComplete: true,
|
|
395
|
+
branchMenuShown: true,
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
return { branchFlowComplete: false, branchMenuShown: false };
|
|
399
|
+
}
|
|
400
|
+
case 'back': {
|
|
401
|
+
return { branchFlowComplete: false, branchMenuShown: false };
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
//# sourceMappingURL=branch-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-helpers.js","sourceRoot":"","sources":["../../src/workflows/branch-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt the user for a manual branch name until valid.
|
|
3
|
+
*/
|
|
4
|
+
export declare function promptManualBranch(curBranch: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Create a branch if valid and not existing. Returns true when created.
|
|
7
|
+
*/
|
|
8
|
+
export declare const createBranch: (name: string, currentBranch: string) => Promise<boolean>;
|
|
9
|
+
//# sourceMappingURL=branch-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-utils.d.ts","sourceRoot":"","sources":["../../src/workflows/branch-utils.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAc5D;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,GAAU,MAAM,MAAM,EAAE,eAAe,MAAM,KAAG,OAAO,CAAC,OAAO,CAwCvF,CAAA"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { askQuestion } from '../cli/input.js';
|
|
2
|
+
import { colors } from '../utils/colors.js';
|
|
3
|
+
import { safeCheckout } from '../utils/git-errors.js';
|
|
4
|
+
import { branchExists, getBranchPrefix, isContextLimitFailure, validateBranchName, } from '../utils/git.js';
|
|
5
|
+
import { log } from '../utils/logging.js';
|
|
6
|
+
/**
|
|
7
|
+
* Prompt the user for a manual branch name until valid.
|
|
8
|
+
*/
|
|
9
|
+
export function promptManualBranch(curBranch) {
|
|
10
|
+
const customPrefix = getBranchPrefix(curBranch);
|
|
11
|
+
let valid = false;
|
|
12
|
+
let name = '';
|
|
13
|
+
while (!valid) {
|
|
14
|
+
name = askQuestion('Enter branch name:', `${customPrefix}new-feature`);
|
|
15
|
+
const validation = validateBranchName(name);
|
|
16
|
+
if (validation.valid) {
|
|
17
|
+
valid = true;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
log.error(`Invalid branch name: ${validation.reason}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return name;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create a branch if valid and not existing. Returns true when created.
|
|
27
|
+
*/
|
|
28
|
+
export const createBranch = async (name, currentBranch) => {
|
|
29
|
+
if (!name || name === currentBranch) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
const validation = validateBranchName(name);
|
|
33
|
+
if (!validation.valid) {
|
|
34
|
+
log.error(`Invalid branch name: ${validation.reason}`);
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
if (branchExists(name)) {
|
|
38
|
+
log.error(`Branch '${name}' already exists locally`);
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
// Reject branch names that look like AI context/token-limit error messages
|
|
42
|
+
const low = String(name).toLowerCase();
|
|
43
|
+
if (isContextLimitFailure(low) ||
|
|
44
|
+
low.includes('token') ||
|
|
45
|
+
low.includes('context') ||
|
|
46
|
+
low.includes('requested') ||
|
|
47
|
+
low.includes('maximum') ||
|
|
48
|
+
low.includes('middle-out')) {
|
|
49
|
+
log.error('Proposed branch name looks like an AI error message; please regenerate or choose a different model/provider');
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
log.info(`Creating branch: ${name}`);
|
|
53
|
+
const result = await safeCheckout(name, { create: true });
|
|
54
|
+
if (!result.success) {
|
|
55
|
+
log.error(`Failed to create branch: ${result.error}`);
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
log.success(`Branch created: ${colors.cyan}${colors.bright}${name}${colors.reset}`);
|
|
59
|
+
return true;
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=branch-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-utils.js","sourceRoot":"","sources":["../../src/workflows/branch-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EACL,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAA;AAEzC;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,CAAA;IAC/C,IAAI,KAAK,GAAG,KAAK,CAAA;IACjB,IAAI,IAAI,GAAG,EAAE,CAAA;IACb,OAAO,CAAC,KAAK,EAAE,CAAC;QACd,IAAI,GAAG,WAAW,CAAC,oBAAoB,EAAE,GAAG,YAAY,aAAa,CAAC,CAAA;QACtE,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAA;QAC3C,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,KAAK,GAAG,IAAI,CAAA;QACd,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,CAAC,wBAAwB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;QACxD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,IAAY,EAAE,aAAqB,EAAoB,EAAE;IAC1F,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QACpC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAA;IAC3C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,GAAG,CAAC,KAAK,CAAC,wBAAwB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;QACtD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,0BAA0B,CAAC,CAAA;QACpD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,2EAA2E;IAC3E,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;IACtC,IACE,qBAAqB,CAAC,GAAG,CAAC;QAC1B,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;QACrB,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;QACvB,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC;QACzB,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;QACvB,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC1B,CAAC;QACD,GAAG,CAAC,KAAK,CACP,6GAA6G,CAC9G,CAAA;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAA;IACpC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IACzD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,GAAG,CAAC,KAAK,CAAC,4BAA4B,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QACrD,OAAO,KAAK,CAAA;IACd,CAAC;IACD,GAAG,CAAC,OAAO,CAAC,mBAAmB,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;IACnF,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branch creation workflow - handles AI-powered branch naming
|
|
3
|
+
*/
|
|
4
|
+
import type { GeetoState } from '../types/index.js';
|
|
5
|
+
export declare const handleBranchCreationWorkflow: (state: GeetoState, opts?: {
|
|
6
|
+
suppressStep?: boolean;
|
|
7
|
+
suppressConfirm?: boolean;
|
|
8
|
+
}) => Promise<{
|
|
9
|
+
branchName: string;
|
|
10
|
+
created: boolean;
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=branch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch.d.ts","sourceRoot":"","sources":["../../src/workflows/branch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAuBnD,eAAO,MAAM,4BAA4B,GACvC,OAAO,UAAU,EACjB,OAAO;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,KAC3D,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAwmBlD,CAAA"}
|