commitria 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/LICENSE +21 -0
- package/README.md +174 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +189 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +45 -0
- package/dist/config.js.map +1 -0
- package/dist/format.d.ts +2 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +43 -0
- package/dist/format.js.map +1 -0
- package/dist/git.d.ts +9 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +39 -0
- package/dist/git.js.map +1 -0
- package/dist/prompt.d.ts +3 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +14 -0
- package/dist/prompt.js.map +1 -0
- package/dist/providers/claude.d.ts +7 -0
- package/dist/providers/claude.d.ts.map +1 -0
- package/dist/providers/claude.js +62 -0
- package/dist/providers/claude.js.map +1 -0
- package/dist/providers/codex.d.ts +7 -0
- package/dist/providers/codex.d.ts.map +1 -0
- package/dist/providers/codex.js +61 -0
- package/dist/providers/codex.js.map +1 -0
- package/dist/providers/index.d.ts +6 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +13 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/types.d.ts +12 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/spinner.d.ts +9 -0
- package/dist/spinner.d.ts.map +1 -0
- package/dist/spinner.js +31 -0
- package/dist/spinner.js.map +1 -0
- package/package.json +39 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://img.shields.io/npm/v/commitria?color=blue&label=npm" alt="npm version" />
|
|
3
|
+
<img src="https://img.shields.io/node/v/commitria?color=green" alt="node version" />
|
|
4
|
+
<img src="https://img.shields.io/npm/l/commitria" alt="license" />
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
<h1 align="center">commitria</h1>
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
<b>Hey commitria, craft me a commit!</b>
|
|
11
|
+
</p>
|
|
12
|
+
|
|
13
|
+
<p align="center">
|
|
14
|
+
<i>Let AI write your commit messages while you focus on code.</i>
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
$ commitria
|
|
19
|
+
|
|
20
|
+
⠹ Generating commit message...
|
|
21
|
+
|
|
22
|
+
Title:
|
|
23
|
+
feat(auth): add user authentication system
|
|
24
|
+
|
|
25
|
+
Description:
|
|
26
|
+
Implement JWT-based authentication with login and logout endpoints.
|
|
27
|
+
|
|
28
|
+
- Add AuthService with JWT token generation
|
|
29
|
+
- Create login/logout API endpoints
|
|
30
|
+
- Add authentication middleware
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Why commitria?
|
|
36
|
+
|
|
37
|
+
**Already have a Claude or ChatGPT subscription?** Use what you have!
|
|
38
|
+
|
|
39
|
+
Most commit message generators require separate API keys and charge per request. With commitria, if you already have:
|
|
40
|
+
|
|
41
|
+
- **Claude** (Pro, Max) → Use Claude Code CLI
|
|
42
|
+
- **ChatGPT** (Plus, Pro) → Use Codex CLI (coming soon)
|
|
43
|
+
|
|
44
|
+
You get commit message generation at **no additional cost**.
|
|
45
|
+
|
|
46
|
+
### Features
|
|
47
|
+
|
|
48
|
+
- **Zero config** - Just run `commitria` in your repo
|
|
49
|
+
- **No API keys** - Uses your existing CLI authentication
|
|
50
|
+
- **No extra costs** - Leverage your existing subscription
|
|
51
|
+
- **Multi-provider** - Switch between Claude, Codex, and more
|
|
52
|
+
- **Conventional Commits** - Always follows the standard
|
|
53
|
+
- **Smart detection** - Prefers staged changes, falls back to unstaged
|
|
54
|
+
- **Beautiful output** - Colored, formatted, ready to use
|
|
55
|
+
- **Cross-platform** - Works on Windows, macOS, and Linux
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Prerequisites
|
|
60
|
+
|
|
61
|
+
- [Node.js](https://nodejs.org/) >= 20.0.0
|
|
62
|
+
- [Git](https://git-scm.com/)
|
|
63
|
+
- One of the supported AI providers:
|
|
64
|
+
- [Claude Code CLI](https://claude.ai/code) (default)
|
|
65
|
+
- [OpenAI Codex CLI](https://openai.com/codex)
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Installation
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
npm install -g commitria
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Or run directly without installing:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
npx commitria
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Usage
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
cd your-project
|
|
87
|
+
commitria
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
That's it. No flags, no options, no complexity.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Commands
|
|
95
|
+
|
|
96
|
+
| Command | Description |
|
|
97
|
+
|---------|-------------|
|
|
98
|
+
| `commitria` | Generate commit message |
|
|
99
|
+
| `commitria --provider <name>` | Use specific provider |
|
|
100
|
+
| `commitria -p <name>` | Short form of --provider |
|
|
101
|
+
| `commitria config` | Show current configuration |
|
|
102
|
+
| `commitria config set <key> <value>` | Set configuration value |
|
|
103
|
+
| `commitria config get <key>` | Get configuration value |
|
|
104
|
+
| `commitria --help` | Show help message |
|
|
105
|
+
| `commitria --version` | Show version |
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Providers
|
|
110
|
+
|
|
111
|
+
| Provider | CLI Required | Status |
|
|
112
|
+
|----------|--------------|--------|
|
|
113
|
+
| `claude` | [Claude Code](https://claude.ai/code) | Default |
|
|
114
|
+
| `codex` | [OpenAI Codex](https://openai.com/codex) | Coming Soon |
|
|
115
|
+
|
|
116
|
+
### Switch Provider
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
# Use for single run
|
|
120
|
+
commitria -p codex
|
|
121
|
+
|
|
122
|
+
# Set as default
|
|
123
|
+
commitria config set provider codex
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Configuration
|
|
129
|
+
|
|
130
|
+
Config file location: `~/.commitria/config.json`
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
# View current config
|
|
134
|
+
commitria config
|
|
135
|
+
|
|
136
|
+
# Output:
|
|
137
|
+
# Configuration:
|
|
138
|
+
# Path: ~/.commitria/config.json
|
|
139
|
+
# Provider: claude
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Available Options
|
|
143
|
+
|
|
144
|
+
| Key | Values | Default |
|
|
145
|
+
|-----|--------|---------|
|
|
146
|
+
| `provider` | `claude`, `codex` | `claude` |
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Commit Format
|
|
151
|
+
|
|
152
|
+
Uses [Conventional Commits](https://www.conventionalcommits.org/) standard:
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
type(scope): subject
|
|
156
|
+
|
|
157
|
+
body (optional)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
| Type | Description |
|
|
161
|
+
|------|-------------|
|
|
162
|
+
| `feat` | New feature |
|
|
163
|
+
| `fix` | Bug fix |
|
|
164
|
+
| `docs` | Documentation changes |
|
|
165
|
+
| `style` | Code style changes |
|
|
166
|
+
| `refactor` | Code refactoring |
|
|
167
|
+
| `test` | Adding or updating tests |
|
|
168
|
+
| `chore` | Maintenance tasks |
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## License
|
|
173
|
+
|
|
174
|
+
MIT
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { isGitInstalled, isInsideGitRepo, getGitDiff } from "./git.js";
|
|
3
|
+
import { getProvider } from "./providers/index.js";
|
|
4
|
+
import { buildCommitPrompt } from "./prompt.js";
|
|
5
|
+
import { Spinner } from "./spinner.js";
|
|
6
|
+
import { formatCommitMessage } from "./format.js";
|
|
7
|
+
import { loadConfig, setConfigValue, getConfigValue, isValidProvider, getConfigPath, } from "./config.js";
|
|
8
|
+
// ANSI colors
|
|
9
|
+
const colors = {
|
|
10
|
+
reset: "\x1b[0m",
|
|
11
|
+
bold: "\x1b[1m",
|
|
12
|
+
dim: "\x1b[2m",
|
|
13
|
+
green: "\x1b[32m",
|
|
14
|
+
yellow: "\x1b[33m",
|
|
15
|
+
cyan: "\x1b[36m",
|
|
16
|
+
red: "\x1b[31m",
|
|
17
|
+
};
|
|
18
|
+
function printHelp() {
|
|
19
|
+
console.log(`
|
|
20
|
+
${colors.cyan}${colors.bold}commitria${colors.reset} - AI-powered commit message generator
|
|
21
|
+
|
|
22
|
+
${colors.yellow}Usage:${colors.reset}
|
|
23
|
+
commitria Generate commit message
|
|
24
|
+
commitria --provider <name> Use specific provider (claude, codex)
|
|
25
|
+
commitria config Show current configuration
|
|
26
|
+
commitria config set <k> <v> Set configuration value
|
|
27
|
+
commitria config get <key> Get configuration value
|
|
28
|
+
commitria --help Show this help message
|
|
29
|
+
commitria --version Show version
|
|
30
|
+
|
|
31
|
+
${colors.yellow}Providers:${colors.reset}
|
|
32
|
+
claude Claude Code CLI (default)
|
|
33
|
+
codex OpenAI Codex CLI
|
|
34
|
+
|
|
35
|
+
${colors.yellow}Examples:${colors.reset}
|
|
36
|
+
commitria # Use default provider
|
|
37
|
+
commitria -p codex # Use Codex for this run
|
|
38
|
+
commitria config set provider codex # Set default to Codex
|
|
39
|
+
`);
|
|
40
|
+
}
|
|
41
|
+
function printVersion() {
|
|
42
|
+
console.log("commitria v1.0.0");
|
|
43
|
+
}
|
|
44
|
+
function printConfig() {
|
|
45
|
+
const config = loadConfig();
|
|
46
|
+
console.log(`
|
|
47
|
+
${colors.cyan}${colors.bold}Configuration:${colors.reset}
|
|
48
|
+
${colors.dim}Path:${colors.reset} ${getConfigPath()}
|
|
49
|
+
${colors.dim}Provider:${colors.reset} ${colors.green}${config.provider}${colors.reset}
|
|
50
|
+
`);
|
|
51
|
+
}
|
|
52
|
+
function handleConfigCommand(args) {
|
|
53
|
+
const subCommand = args[0];
|
|
54
|
+
if (!subCommand) {
|
|
55
|
+
printConfig();
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (subCommand === "set") {
|
|
59
|
+
const key = args[1];
|
|
60
|
+
const value = args[2];
|
|
61
|
+
if (!key || !value) {
|
|
62
|
+
console.error(`${colors.red}Usage: commitria config set <key> <value>${colors.reset}`);
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
if (key === "provider") {
|
|
66
|
+
if (!isValidProvider(value)) {
|
|
67
|
+
console.error(`${colors.red}Invalid provider: ${value}${colors.reset}`);
|
|
68
|
+
console.error(`Available providers: claude, codex`);
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
setConfigValue("provider", value);
|
|
72
|
+
console.log(`${colors.green}Provider set to: ${value}${colors.reset}`);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
console.error(`${colors.red}Unknown config key: ${key}${colors.reset}`);
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (subCommand === "get") {
|
|
81
|
+
const key = args[1];
|
|
82
|
+
if (!key) {
|
|
83
|
+
console.error(`${colors.red}Usage: commitria config get <key>${colors.reset}`);
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
if (key === "provider") {
|
|
87
|
+
console.log(getConfigValue("provider"));
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
console.error(`${colors.red}Unknown config key: ${key}${colors.reset}`);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
console.error(`${colors.red}Unknown config command: ${subCommand}${colors.reset}`);
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
function parseArgs(args) {
|
|
99
|
+
let provider;
|
|
100
|
+
let command;
|
|
101
|
+
const commandArgs = [];
|
|
102
|
+
for (let i = 0; i < args.length; i++) {
|
|
103
|
+
const arg = args[i];
|
|
104
|
+
if (arg === "--help" || arg === "-h") {
|
|
105
|
+
printHelp();
|
|
106
|
+
process.exit(0);
|
|
107
|
+
}
|
|
108
|
+
if (arg === "--version" || arg === "-v") {
|
|
109
|
+
printVersion();
|
|
110
|
+
process.exit(0);
|
|
111
|
+
}
|
|
112
|
+
if (arg === "--provider" || arg === "-p") {
|
|
113
|
+
const value = args[++i];
|
|
114
|
+
if (!value || !isValidProvider(value)) {
|
|
115
|
+
console.error(`${colors.red}Invalid provider. Available: claude, codex${colors.reset}`);
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
provider = value;
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
if (arg === "config") {
|
|
122
|
+
command = "config";
|
|
123
|
+
commandArgs.push(...args.slice(i + 1));
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return { provider, command, commandArgs };
|
|
128
|
+
}
|
|
129
|
+
async function generateCommit(providerName) {
|
|
130
|
+
// Check prerequisites
|
|
131
|
+
if (!isGitInstalled()) {
|
|
132
|
+
console.error(`${colors.red}Error: git not found. Please install git first.${colors.reset}`);
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
const provider = getProvider(providerName);
|
|
136
|
+
if (!provider.isAvailable()) {
|
|
137
|
+
console.error(`${colors.red}Error: ${providerName} CLI not found.${colors.reset}`);
|
|
138
|
+
if (providerName === "claude") {
|
|
139
|
+
console.error(`Install Claude Code: https://claude.ai/code`);
|
|
140
|
+
}
|
|
141
|
+
else if (providerName === "codex") {
|
|
142
|
+
console.error(`Install Codex CLI: https://openai.com/codex`);
|
|
143
|
+
}
|
|
144
|
+
process.exit(1);
|
|
145
|
+
}
|
|
146
|
+
if (!isInsideGitRepo()) {
|
|
147
|
+
console.error(`${colors.red}Error: Not inside a git repository.${colors.reset}`);
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}
|
|
150
|
+
// Get diff
|
|
151
|
+
const diff = getGitDiff();
|
|
152
|
+
if (!diff) {
|
|
153
|
+
console.error(`${colors.yellow}No changes found (staged or unstaged).${colors.reset}`);
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
// Build prompt and run provider
|
|
157
|
+
const prompt = buildCommitPrompt(diff);
|
|
158
|
+
const spinner = new Spinner("Generating commit message...");
|
|
159
|
+
spinner.start();
|
|
160
|
+
const result = await provider.generate(prompt);
|
|
161
|
+
if (!result.success) {
|
|
162
|
+
spinner.stop();
|
|
163
|
+
console.error(`${colors.red}Failed to generate commit message:${colors.reset}`);
|
|
164
|
+
console.error(result.error);
|
|
165
|
+
if (result.exitCode !== undefined) {
|
|
166
|
+
console.error(`Exit code: ${result.exitCode}`);
|
|
167
|
+
}
|
|
168
|
+
process.exit(1);
|
|
169
|
+
}
|
|
170
|
+
spinner.stop();
|
|
171
|
+
console.log(formatCommitMessage(result.output));
|
|
172
|
+
}
|
|
173
|
+
async function main() {
|
|
174
|
+
const args = process.argv.slice(2);
|
|
175
|
+
const { provider, command, commandArgs } = parseArgs(args);
|
|
176
|
+
// Handle config command
|
|
177
|
+
if (command === "config") {
|
|
178
|
+
handleConfigCommand(commandArgs);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
// Generate commit
|
|
182
|
+
const selectedProvider = provider ?? getConfigValue("provider");
|
|
183
|
+
await generateCommit(selectedProvider);
|
|
184
|
+
}
|
|
185
|
+
main().catch((err) => {
|
|
186
|
+
console.error(`${colors.red}Unexpected error: ${err.message}${colors.reset}`);
|
|
187
|
+
process.exit(1);
|
|
188
|
+
});
|
|
189
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type Provider = "claude" | "codex";
|
|
2
|
+
export interface Config {
|
|
3
|
+
provider: Provider;
|
|
4
|
+
}
|
|
5
|
+
export declare function loadConfig(): Config;
|
|
6
|
+
export declare function saveConfig(config: Config): void;
|
|
7
|
+
export declare function getConfigValue<K extends keyof Config>(key: K): Config[K];
|
|
8
|
+
export declare function setConfigValue<K extends keyof Config>(key: K, value: Config[K]): void;
|
|
9
|
+
export declare function isValidProvider(value: string): value is Provider;
|
|
10
|
+
export declare function getConfigPath(): string;
|
|
11
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE1C,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAeD,wBAAgB,UAAU,IAAI,MAAM,CAUnC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAG/C;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAGxE;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAIrF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,QAAQ,CAEhE;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
const DEFAULT_CONFIG = {
|
|
5
|
+
provider: "claude",
|
|
6
|
+
};
|
|
7
|
+
const CONFIG_DIR = join(homedir(), ".commitria");
|
|
8
|
+
const CONFIG_FILE = join(CONFIG_DIR, "config.json");
|
|
9
|
+
function ensureConfigDir() {
|
|
10
|
+
if (!existsSync(CONFIG_DIR)) {
|
|
11
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function loadConfig() {
|
|
15
|
+
try {
|
|
16
|
+
if (existsSync(CONFIG_FILE)) {
|
|
17
|
+
const data = readFileSync(CONFIG_FILE, "utf8");
|
|
18
|
+
return { ...DEFAULT_CONFIG, ...JSON.parse(data) };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// Ignore errors, return default
|
|
23
|
+
}
|
|
24
|
+
return { ...DEFAULT_CONFIG };
|
|
25
|
+
}
|
|
26
|
+
export function saveConfig(config) {
|
|
27
|
+
ensureConfigDir();
|
|
28
|
+
writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), "utf8");
|
|
29
|
+
}
|
|
30
|
+
export function getConfigValue(key) {
|
|
31
|
+
const config = loadConfig();
|
|
32
|
+
return config[key];
|
|
33
|
+
}
|
|
34
|
+
export function setConfigValue(key, value) {
|
|
35
|
+
const config = loadConfig();
|
|
36
|
+
config[key] = value;
|
|
37
|
+
saveConfig(config);
|
|
38
|
+
}
|
|
39
|
+
export function isValidProvider(value) {
|
|
40
|
+
return ["claude", "codex"].includes(value);
|
|
41
|
+
}
|
|
42
|
+
export function getConfigPath() {
|
|
43
|
+
return CONFIG_FILE;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,MAAM,cAAc,GAAW;IAC7B,QAAQ,EAAE,QAAQ;CACnB,CAAC;AAEF,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACjD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,SAAS,eAAe;IACtB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAC/C,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;IAClC,CAAC;IACD,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,eAAe,EAAE,CAAC;IAClB,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,cAAc,CAAyB,GAAM;IAC3D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,cAAc,CAAyB,GAAM,EAAE,KAAgB;IAC7E,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACpB,UAAU,CAAC,MAAM,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
package/dist/format.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAYA,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiCvD"}
|
package/dist/format.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// ANSI color codes
|
|
2
|
+
const colors = {
|
|
3
|
+
reset: "\x1b[0m",
|
|
4
|
+
bold: "\x1b[1m",
|
|
5
|
+
dim: "\x1b[2m",
|
|
6
|
+
green: "\x1b[32m",
|
|
7
|
+
yellow: "\x1b[33m",
|
|
8
|
+
blue: "\x1b[34m",
|
|
9
|
+
cyan: "\x1b[36m",
|
|
10
|
+
white: "\x1b[37m",
|
|
11
|
+
};
|
|
12
|
+
export function formatCommitMessage(raw) {
|
|
13
|
+
const lines = raw.trim().split("\n");
|
|
14
|
+
const output = [];
|
|
15
|
+
// First line is always the title
|
|
16
|
+
const title = lines[0] || "";
|
|
17
|
+
output.push("");
|
|
18
|
+
output.push(`${colors.cyan}${colors.bold}Title:${colors.reset}`);
|
|
19
|
+
output.push(` ${colors.green}${title}${colors.reset}`);
|
|
20
|
+
// Rest is description (if exists)
|
|
21
|
+
if (lines.length > 1) {
|
|
22
|
+
const descriptionLines = lines.slice(1).filter((line) => line.trim() !== "" || lines.indexOf(line) > 1);
|
|
23
|
+
if (descriptionLines.length > 0) {
|
|
24
|
+
output.push("");
|
|
25
|
+
output.push(`${colors.cyan}${colors.bold}Description:${colors.reset}`);
|
|
26
|
+
for (const line of descriptionLines) {
|
|
27
|
+
if (line.trim() === "") {
|
|
28
|
+
output.push("");
|
|
29
|
+
}
|
|
30
|
+
else if (line.trim().startsWith("-")) {
|
|
31
|
+
// Bullet points
|
|
32
|
+
output.push(` ${colors.yellow}${line.trim()}${colors.reset}`);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
output.push(` ${colors.white}${line.trim()}${colors.reset}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
output.push("");
|
|
41
|
+
return output.join("\n");
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,MAAM,MAAM,GAAG;IACb,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;CAClB,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,iCAAiC;IACjC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACjE,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAExD,kCAAkC;IAClC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAExG,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,eAAe,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAEvE,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;gBACpC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;oBACvB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClB,CAAC;qBAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvC,gBAAgB;oBAChB,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBACjE,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC"}
|
package/dist/git.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function execGit(args: string): string;
|
|
2
|
+
export declare function isGitInstalled(): boolean;
|
|
3
|
+
export declare function isInsideGitRepo(): boolean;
|
|
4
|
+
export interface GitDiff {
|
|
5
|
+
content: string;
|
|
6
|
+
mode: "staged" | "unstaged";
|
|
7
|
+
}
|
|
8
|
+
export declare function getGitDiff(): GitDiff | null;
|
|
9
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAEA,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK5C;AAED,wBAAgB,cAAc,IAAI,OAAO,CAOxC;AAED,wBAAgB,eAAe,IAAI,OAAO,CAOzC;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAC;CAC7B;AAED,wBAAgB,UAAU,IAAI,OAAO,GAAG,IAAI,CAc3C"}
|
package/dist/git.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
export function execGit(args) {
|
|
3
|
+
return execSync(`git ${args}`, {
|
|
4
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
5
|
+
encoding: "utf8"
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
export function isGitInstalled() {
|
|
9
|
+
try {
|
|
10
|
+
execSync("git --version", { stdio: "ignore" });
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function isInsideGitRepo() {
|
|
18
|
+
try {
|
|
19
|
+
execGit("rev-parse --is-inside-work-tree");
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function getGitDiff() {
|
|
27
|
+
// Prefer staged changes
|
|
28
|
+
let content = execGit("diff --staged").trim();
|
|
29
|
+
if (content) {
|
|
30
|
+
return { content, mode: "staged" };
|
|
31
|
+
}
|
|
32
|
+
// Fall back to unstaged changes
|
|
33
|
+
content = execGit("diff").trim();
|
|
34
|
+
if (content) {
|
|
35
|
+
return { content, mode: "unstaged" };
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=git.js.map
|
package/dist/git.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,QAAQ,CAAC,OAAO,IAAI,EAAE,EAAE;QAC7B,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;QACjC,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC;QACH,QAAQ,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC;QACH,OAAO,CAAC,iCAAiC,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAOD,MAAM,UAAU,UAAU;IACxB,wBAAwB;IACxB,IAAI,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACrC,CAAC;IAED,gCAAgC;IAChC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACvC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/prompt.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAYvD"}
|
package/dist/prompt.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function buildCommitPrompt(diff) {
|
|
2
|
+
return `
|
|
3
|
+
Write ONE Conventional Commit message for the following ${diff.mode} git diff.
|
|
4
|
+
|
|
5
|
+
Rules:
|
|
6
|
+
- Output ONLY the commit message (no code fences, no extra commentary).
|
|
7
|
+
- Use format: type(scope): summary
|
|
8
|
+
- Add an optional body if it helps, wrapped at ~72 chars.
|
|
9
|
+
|
|
10
|
+
Diff:
|
|
11
|
+
${diff.content}
|
|
12
|
+
`.trim();
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC7C,OAAO;0DACiD,IAAI,CAAC,IAAI;;;;;;;;EAQjE,IAAI,CAAC,OAAO;CACb,CAAC,IAAI,EAAE,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/providers/claude.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE3D,qBAAa,cAAe,YAAW,QAAQ;IAC7C,IAAI,SAAY;IAEhB,WAAW,IAAI,OAAO;IAStB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CAuDlD"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { execSync } from "node:child_process";
|
|
3
|
+
export class ClaudeProvider {
|
|
4
|
+
name = "claude";
|
|
5
|
+
isAvailable() {
|
|
6
|
+
try {
|
|
7
|
+
execSync("claude --version", { stdio: "ignore" });
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
generate(prompt) {
|
|
15
|
+
return new Promise((resolve) => {
|
|
16
|
+
const child = spawn("claude", ["-p"], {
|
|
17
|
+
shell: true,
|
|
18
|
+
windowsHide: true,
|
|
19
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
20
|
+
});
|
|
21
|
+
let stdout = "";
|
|
22
|
+
let stderr = "";
|
|
23
|
+
child.stdout.on("data", (data) => {
|
|
24
|
+
stdout += data.toString();
|
|
25
|
+
});
|
|
26
|
+
child.stderr.on("data", (data) => {
|
|
27
|
+
stderr += data.toString();
|
|
28
|
+
});
|
|
29
|
+
child.stdin.write(prompt);
|
|
30
|
+
child.stdin.end();
|
|
31
|
+
child.on("error", (err) => {
|
|
32
|
+
resolve({
|
|
33
|
+
success: false,
|
|
34
|
+
error: `Spawn error: ${err.message}`,
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
child.on("close", (code) => {
|
|
38
|
+
if (code !== 0) {
|
|
39
|
+
resolve({
|
|
40
|
+
success: false,
|
|
41
|
+
error: stderr || stdout || "Unknown error",
|
|
42
|
+
exitCode: code ?? 1,
|
|
43
|
+
});
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const output = stdout.trim();
|
|
47
|
+
if (!output) {
|
|
48
|
+
resolve({
|
|
49
|
+
success: false,
|
|
50
|
+
error: "No output from Claude",
|
|
51
|
+
});
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
resolve({
|
|
55
|
+
success: true,
|
|
56
|
+
output,
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/providers/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,MAAM,OAAO,cAAc;IACzB,IAAI,GAAG,QAAQ,CAAC;IAEhB,WAAW;QACT,IAAI,CAAC;YACH,QAAQ,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,MAAc;QACrB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE;gBACpC,KAAK,EAAE,IAAI;gBACX,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;YAEH,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAEhB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACvC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACvC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1B,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAElB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;gBAC/B,OAAO,CAAC;oBACN,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,gBAAgB,GAAG,CAAC,OAAO,EAAE;iBACrC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAmB,EAAE,EAAE;gBACxC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,CAAC;wBACN,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,MAAM,IAAI,MAAM,IAAI,eAAe;wBAC1C,QAAQ,EAAE,IAAI,IAAI,CAAC;qBACpB,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,CAAC;wBACN,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,uBAAuB;qBAC/B,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,OAAO,CAAC;oBACN,OAAO,EAAE,IAAI;oBACb,MAAM;iBACP,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/providers/codex.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE3D,qBAAa,aAAc,YAAW,QAAQ;IAC5C,IAAI,SAAW;IAEf,WAAW,IAAI,OAAO;IAUtB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CAoDlD"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { execSync } from "node:child_process";
|
|
3
|
+
export class CodexProvider {
|
|
4
|
+
name = "codex";
|
|
5
|
+
isAvailable() {
|
|
6
|
+
try {
|
|
7
|
+
// Check if OpenAI Codex CLI is installed
|
|
8
|
+
execSync("codex --version", { stdio: "ignore" });
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
generate(prompt) {
|
|
16
|
+
return new Promise((resolve) => {
|
|
17
|
+
const child = spawn("codex", ["-q", prompt], {
|
|
18
|
+
shell: true,
|
|
19
|
+
windowsHide: true,
|
|
20
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
21
|
+
});
|
|
22
|
+
let stdout = "";
|
|
23
|
+
let stderr = "";
|
|
24
|
+
child.stdout.on("data", (data) => {
|
|
25
|
+
stdout += data.toString();
|
|
26
|
+
});
|
|
27
|
+
child.stderr.on("data", (data) => {
|
|
28
|
+
stderr += data.toString();
|
|
29
|
+
});
|
|
30
|
+
child.on("error", (err) => {
|
|
31
|
+
resolve({
|
|
32
|
+
success: false,
|
|
33
|
+
error: `Spawn error: ${err.message}`,
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
child.on("close", (code) => {
|
|
37
|
+
if (code !== 0) {
|
|
38
|
+
resolve({
|
|
39
|
+
success: false,
|
|
40
|
+
error: stderr || stdout || "Unknown error",
|
|
41
|
+
exitCode: code ?? 1,
|
|
42
|
+
});
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const output = stdout.trim();
|
|
46
|
+
if (!output) {
|
|
47
|
+
resolve({
|
|
48
|
+
success: false,
|
|
49
|
+
error: "No output from Codex",
|
|
50
|
+
});
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
resolve({
|
|
54
|
+
success: true,
|
|
55
|
+
output,
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/providers/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,MAAM,OAAO,aAAa;IACxB,IAAI,GAAG,OAAO,CAAC;IAEf,WAAW;QACT,IAAI,CAAC;YACH,yCAAyC;YACzC,QAAQ,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,MAAc;QACrB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;gBAC3C,KAAK,EAAE,IAAI;gBACX,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;YAEH,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAEhB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACvC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACvC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;gBAC/B,OAAO,CAAC;oBACN,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,gBAAgB,GAAG,CAAC,OAAO,EAAE;iBACrC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAmB,EAAE,EAAE;gBACxC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,CAAC;wBACN,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,MAAM,IAAI,MAAM,IAAI,eAAe;wBAC1C,QAAQ,EAAE,IAAI,IAAI,CAAC;qBACpB,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,CAAC;wBACN,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,sBAAsB;qBAC9B,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,OAAO,CAAC;oBACN,OAAO,EAAE,IAAI;oBACb,MAAM;iBACP,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Provider as ProviderType } from "../config.js";
|
|
2
|
+
import type { Provider } from "./types.js";
|
|
3
|
+
export type { Provider, ProviderResult } from "./types.js";
|
|
4
|
+
export declare function getProvider(name: ProviderType): Provider;
|
|
5
|
+
export declare function getAvailableProviders(): ProviderType[];
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAO3D,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,QAAQ,CAExD;AAED,wBAAgB,qBAAqB,IAAI,YAAY,EAAE,CAItD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ClaudeProvider } from "./claude.js";
|
|
2
|
+
import { CodexProvider } from "./codex.js";
|
|
3
|
+
const providers = {
|
|
4
|
+
claude: new ClaudeProvider(),
|
|
5
|
+
codex: new CodexProvider(),
|
|
6
|
+
};
|
|
7
|
+
export function getProvider(name) {
|
|
8
|
+
return providers[name];
|
|
9
|
+
}
|
|
10
|
+
export function getAvailableProviders() {
|
|
11
|
+
return Object.keys(providers).filter((name) => providers[name].isAvailable());
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI3C,MAAM,SAAS,GAAmC;IAChD,MAAM,EAAE,IAAI,cAAc,EAAE;IAC5B,KAAK,EAAE,IAAI,aAAa,EAAE;CAC3B,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAAkB;IAC5C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAQ,MAAM,CAAC,IAAI,CAAC,SAAS,CAAoB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAChE,SAAS,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAC9B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ProviderResult {
|
|
2
|
+
success: boolean;
|
|
3
|
+
output?: string;
|
|
4
|
+
error?: string;
|
|
5
|
+
exitCode?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface Provider {
|
|
8
|
+
name: string;
|
|
9
|
+
isAvailable(): boolean;
|
|
10
|
+
generate(prompt: string): Promise<ProviderResult>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,IAAI,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACnD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../src/spinner.ts"],"names":[],"mappings":"AAEA,qBAAa,OAAO;IAClB,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAkB;IAIvC,KAAK,IAAI,IAAI;IAYb,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;CAalC"}
|
package/dist/spinner.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const frames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
2
|
+
export class Spinner {
|
|
3
|
+
intervalId = null;
|
|
4
|
+
frameIndex = 0;
|
|
5
|
+
message;
|
|
6
|
+
constructor(message = "Loading") {
|
|
7
|
+
this.message = message;
|
|
8
|
+
}
|
|
9
|
+
start() {
|
|
10
|
+
if (this.intervalId)
|
|
11
|
+
return;
|
|
12
|
+
process.stdout.write("\x1B[?25l"); // Hide cursor
|
|
13
|
+
this.intervalId = setInterval(() => {
|
|
14
|
+
const frame = frames[this.frameIndex];
|
|
15
|
+
process.stdout.write(`\r${frame} ${this.message}`);
|
|
16
|
+
this.frameIndex = (this.frameIndex + 1) % frames.length;
|
|
17
|
+
}, 80);
|
|
18
|
+
}
|
|
19
|
+
stop(finalMessage) {
|
|
20
|
+
if (this.intervalId) {
|
|
21
|
+
clearInterval(this.intervalId);
|
|
22
|
+
this.intervalId = null;
|
|
23
|
+
}
|
|
24
|
+
process.stdout.write("\r\x1B[K"); // Clear line
|
|
25
|
+
process.stdout.write("\x1B[?25h"); // Show cursor
|
|
26
|
+
if (finalMessage) {
|
|
27
|
+
console.log(finalMessage);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../src/spinner.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAElE,MAAM,OAAO,OAAO;IACV,UAAU,GAA0B,IAAI,CAAC;IACzC,UAAU,GAAG,CAAC,CAAC;IACf,OAAO,CAAS;IAExB,YAAY,UAAkB,SAAS;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAE5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;QAEjD,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACnD,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QAC1D,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;IAED,IAAI,CAAC,YAAqB;QACxB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa;QAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;QAEjD,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;CACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "commitria",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Generate conventional commit messages using Claude AI",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/cli.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"commitria": "dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"prepublishOnly": "npm run build"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"git",
|
|
16
|
+
"commit",
|
|
17
|
+
"conventional-commits",
|
|
18
|
+
"claude",
|
|
19
|
+
"ai",
|
|
20
|
+
"cli",
|
|
21
|
+
"commitria"
|
|
22
|
+
],
|
|
23
|
+
"author": "",
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=20.0.0"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist"
|
|
30
|
+
],
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": ""
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"typescript": "^5.0.0",
|
|
37
|
+
"@types/node": "^20.0.0"
|
|
38
|
+
}
|
|
39
|
+
}
|