Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 65 additions & 39 deletions out/cli.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -57238,7 +57238,9 @@ var PROVIDER_BILLING_URLS = {
};
var InsufficientCreditsError = class extends Error {
constructor(provider, message) {
super(message || `Insufficient credits or quota for provider '${provider}'`);
super(
message || `Insufficient credits or quota for provider '${provider}'`
);
this.name = "InsufficientCreditsError";
this.provider = provider;
}
Expand Down Expand Up @@ -57490,7 +57492,9 @@ ${source_default.red("\u2716")} ${source_default.bold.red(formatted.title)}
`;
if (formatted.helpUrl) {
output += `
${source_default.cyan("Help:")} ${source_default.underline(formatted.helpUrl)}
${source_default.cyan("Help:")} ${source_default.underline(
formatted.helpUrl
)}
`;
}
if (formatted.suggestion) {
Expand Down Expand Up @@ -67277,8 +67281,8 @@ var MLXEngine = class {
var DeepseekEngine = class extends OpenAiEngine {
constructor(config7) {
super({
...config7,
baseURL: "https://api.deepseek.com/v1"
baseURL: "https://api.deepseek.com/v1",
...config7
});
// Identical method from OpenAiEngine, re-implemented here
this.generateCommitMessage = async (messages) => {
Expand Down Expand Up @@ -67949,11 +67953,9 @@ var GenerateCommitMessageErrorEnum = ((GenerateCommitMessageErrorEnum2) => {
return GenerateCommitMessageErrorEnum2;
})(GenerateCommitMessageErrorEnum || {});
async function handleModelNotFoundError(error, provider, currentModel) {
console.log(
source_default.red(`
console.log(source_default.red(`
\u2716 Model '${currentModel}' not found
`)
);
`));
const suggestedModels = getSuggestedModels(provider, currentModel);
const recommended = RECOMMENDED_MODELS[provider];
if (suggestedModels.length === 0) {
Expand Down Expand Up @@ -68925,6 +68927,11 @@ var OTHER_PROVIDERS = [
"mlx" /* MLX */
];
var NO_API_KEY_PROVIDERS = [
"ollama" /* OLLAMA */,
"mlx" /* MLX */,
"test" /* TEST */
];
var MODEL_REQUIRED_PROVIDERS = [
"ollama" /* OLLAMA */,
"mlx" /* MLX */
];
Expand Down Expand Up @@ -69202,21 +69209,25 @@ async function runSetup() {
};
setGlobalConfig(newConfig);
ce(
`${source_default.green("\u2714")} Configuration saved to ~/.opencommit
`${source_default.green(
"\u2714"
)} Configuration saved to ~/.opencommit

Run ${source_default.cyan("oco")} to generate commit messages!`
Run ${source_default.cyan(
"oco"
)} to generate commit messages!`
);
return true;
}
function isFirstRun() {
if (!getIsGlobalConfigFileExist()) {
return true;
}
const config7 = getConfig();
const provider = config7.OCO_AI_PROVIDER || "openai" /* OPENAI */;
if (NO_API_KEY_PROVIDERS.includes(provider)) {
if (MODEL_REQUIRED_PROVIDERS.includes(provider)) {
return !config7.OCO_MODEL;
}
if (provider === "test" /* TEST */) {
return false;
}
return !config7.OCO_API_KEY;
}
async function promptForMissingApiKey() {
Expand All @@ -69229,11 +69240,9 @@ async function promptForMissingApiKey() {
return true;
}
console.log(
source_default.yellow(
`
source_default.yellow(`
API key missing for ${provider}. Let's set it up.
`
)
`)
);
const apiKey = await getApiKey(provider);
if (hD2(apiKey)) {
Expand Down Expand Up @@ -69291,9 +69300,11 @@ async function listModels(provider, useCache = true) {
const providerKey = provider.toLowerCase();
models = MODEL_LIST[providerKey] || [];
}
console.log(`
console.log(
`
${source_default.bold("Available models for")} ${source_default.cyan(provider)}:
`);
`
);
if (models.length === 0) {
console.log(source_default.dim(" No models found"));
} else {
Expand All @@ -69313,12 +69324,21 @@ async function refreshModels(provider) {
loadingSpinner.start(`Fetching models from ${provider}...`);
clearModelCache();
try {
const models = await fetchModelsForProvider(provider, apiKey, void 0, true);
const models = await fetchModelsForProvider(
provider,
apiKey,
void 0,
true
);
loadingSpinner.stop(`${source_default.green("+")} Fetched ${models.length} models`);
await listModels(provider, true);
} catch (error) {
loadingSpinner.stop(source_default.red("Failed to fetch models"));
console.error(source_default.red(`Error: ${error instanceof Error ? error.message : "Unknown error"}`));
console.error(
source_default.red(
`Error: ${error instanceof Error ? error.message : "Unknown error"}`
)
);
}
}
var modelsCommand = G3(
Expand Down Expand Up @@ -69348,7 +69368,9 @@ var modelsCommand = G3(
const cacheInfo = getCacheInfo();
if (cacheInfo.timestamp) {
console.log(
source_default.dim(` Cache last updated: ${formatCacheAge2(cacheInfo.timestamp)}`)
source_default.dim(
` Cache last updated: ${formatCacheAge2(cacheInfo.timestamp)}`
)
);
if (cacheInfo.providers.length > 0) {
console.log(
Expand All @@ -69363,9 +69385,7 @@ var modelsCommand = G3(
} else {
await listModels(provider);
}
ce(
`Run ${source_default.cyan("oco models --refresh")} to update the model list`
);
ce(`Run ${source_default.cyan("oco models --refresh")} to update the model list`);
}
);

Expand Down Expand Up @@ -69561,7 +69581,13 @@ Z2(
{
version: package_default.version,
name: "opencommit",
commands: [configCommand, hookCommand, commitlintConfigCommand, setupCommand, modelsCommand],
commands: [
configCommand,
hookCommand,
commitlintConfigCommand,
setupCommand,
modelsCommand
],
flags: {
fgm: {
type: Boolean,
Expand All @@ -69585,23 +69611,23 @@ Z2(
help: { description: package_default.description }
},
async ({ flags }) => {
if (await isHookCalled()) {
await prepareCommitMessageHook();
return;
}
await runMigrations();
await checkIsLatestVersion();
if (await isHookCalled()) {
prepareCommitMessageHook();
} else {
if (isFirstRun()) {
const setupComplete = await runSetup();
if (!setupComplete) {
process.exit(1);
}
}
const hasApiKey = await promptForMissingApiKey();
if (!hasApiKey) {
if (isFirstRun()) {
const setupComplete = await runSetup();
if (!setupComplete) {
process.exit(1);
}
commit(extraArgs, flags.context, false, flags.fgm, flags.yes);
}
const hasApiKey = await promptForMissingApiKey();
if (!hasApiKey) {
process.exit(1);
}
commit(extraArgs, flags.context, false, flags.fgm, flags.yes);
},
extraArgs
);
Expand Down
14 changes: 7 additions & 7 deletions out/github-action.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -78216,7 +78216,9 @@ var PROVIDER_BILLING_URLS = {
};
var InsufficientCreditsError = class extends Error {
constructor(provider, message) {
super(message || `Insufficient credits or quota for provider '${provider}'`);
super(
message || `Insufficient credits or quota for provider '${provider}'`
);
this.name = "InsufficientCreditsError";
this.provider = provider;
}
Expand Down Expand Up @@ -88062,8 +88064,8 @@ var MLXEngine = class {
var DeepseekEngine = class extends OpenAiEngine {
constructor(config6) {
super({
...config6,
baseURL: "https://api.deepseek.com/v1"
baseURL: "https://api.deepseek.com/v1",
...config6
});
// Identical method from OpenAiEngine, re-implemented here
this.generateCommitMessage = async (messages) => {
Expand Down Expand Up @@ -88734,11 +88736,9 @@ var GenerateCommitMessageErrorEnum = ((GenerateCommitMessageErrorEnum2) => {
return GenerateCommitMessageErrorEnum2;
})(GenerateCommitMessageErrorEnum || {});
async function handleModelNotFoundError(error, provider, currentModel) {
console.log(
source_default.red(`
console.log(source_default.red(`
\u2716 Model '${currentModel}' not found
`)
);
`));
const suggestedModels = getSuggestedModels(provider, currentModel);
const recommended = RECOMMENDED_MODELS[provider];
if (suggestedModels.length === 0) {
Expand Down
39 changes: 23 additions & 16 deletions src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,13 @@ cli(
{
version: packageJSON.version,
name: 'opencommit',
commands: [configCommand, hookCommand, commitlintConfigCommand, setupCommand, modelsCommand],
commands: [
configCommand,
hookCommand,
commitlintConfigCommand,
setupCommand,
modelsCommand
],
flags: {
fgm: {
type: Boolean,
Expand All @@ -48,28 +54,29 @@ cli(
help: { description: packageJSON.description }
},
async ({ flags }) => {
if (await isHookCalled()) {
await prepareCommitMessageHook();
return;
}

await runMigrations();
await checkIsLatestVersion();

if (await isHookCalled()) {
prepareCommitMessageHook();
} else {
// Check for first run and trigger setup wizard
if (isFirstRun()) {
const setupComplete = await runSetup();
if (!setupComplete) {
process.exit(1);
}
}

// Check for missing API key and prompt if needed
const hasApiKey = await promptForMissingApiKey();
if (!hasApiKey) {
// Check for first run and trigger setup wizard
if (isFirstRun()) {
const setupComplete = await runSetup();
if (!setupComplete) {
process.exit(1);
}
}

commit(extraArgs, flags.context, false, flags.fgm, flags.yes);
// Check for missing API key and prompt if needed
const hasApiKey = await promptForMissingApiKey();
if (!hasApiKey) {
process.exit(1);
}

commit(extraArgs, flags.context, false, flags.fgm, flags.yes);
},
extraArgs
);
5 changes: 1 addition & 4 deletions src/commands/commit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,7 @@ import {
import chalk from 'chalk';
import { execa } from 'execa';
import { generateCommitMessageByDiff } from '../generateCommitMessageFromGitDiff';
import {
formatUserFriendlyError,
printFormattedError
} from '../utils/errors';
import { formatUserFriendlyError, printFormattedError } from '../utils/errors';
import {
assertGitRepo,
getChangedFiles,
Expand Down
5 changes: 3 additions & 2 deletions src/commands/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -849,7 +849,8 @@ export enum OCO_AI_PROVIDER_ENUM {

export const PROVIDER_API_KEY_URLS: Record<string, string | null> = {
[OCO_AI_PROVIDER_ENUM.OPENAI]: 'https://platform.openai.com/api-keys',
[OCO_AI_PROVIDER_ENUM.ANTHROPIC]: 'https://console.anthropic.com/settings/keys',
[OCO_AI_PROVIDER_ENUM.ANTHROPIC]:
'https://console.anthropic.com/settings/keys',
[OCO_AI_PROVIDER_ENUM.GEMINI]: 'https://aistudio.google.com/app/apikey',
[OCO_AI_PROVIDER_ENUM.GROQ]: 'https://console.groq.com/keys',
[OCO_AI_PROVIDER_ENUM.MISTRAL]: 'https://console.mistral.ai/api-keys/',
Expand All @@ -872,7 +873,7 @@ export const RECOMMENDED_MODELS: Record<string, string> = {
[OCO_AI_PROVIDER_ENUM.DEEPSEEK]: 'deepseek-chat',
[OCO_AI_PROVIDER_ENUM.OPENROUTER]: 'openai/gpt-4o-mini',
[OCO_AI_PROVIDER_ENUM.AIMLAPI]: 'gpt-4o-mini'
}
};

export type ConfigType = {
[CONFIG_KEYS.OCO_API_KEY]?: string;
Expand Down
Loading
Loading