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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +174 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +189 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config.d.ts +11 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +45 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/format.d.ts +2 -0
  12. package/dist/format.d.ts.map +1 -0
  13. package/dist/format.js +43 -0
  14. package/dist/format.js.map +1 -0
  15. package/dist/git.d.ts +9 -0
  16. package/dist/git.d.ts.map +1 -0
  17. package/dist/git.js +39 -0
  18. package/dist/git.js.map +1 -0
  19. package/dist/prompt.d.ts +3 -0
  20. package/dist/prompt.d.ts.map +1 -0
  21. package/dist/prompt.js +14 -0
  22. package/dist/prompt.js.map +1 -0
  23. package/dist/providers/claude.d.ts +7 -0
  24. package/dist/providers/claude.d.ts.map +1 -0
  25. package/dist/providers/claude.js +62 -0
  26. package/dist/providers/claude.js.map +1 -0
  27. package/dist/providers/codex.d.ts +7 -0
  28. package/dist/providers/codex.d.ts.map +1 -0
  29. package/dist/providers/codex.js +61 -0
  30. package/dist/providers/codex.js.map +1 -0
  31. package/dist/providers/index.d.ts +6 -0
  32. package/dist/providers/index.d.ts.map +1 -0
  33. package/dist/providers/index.js +13 -0
  34. package/dist/providers/index.js.map +1 -0
  35. package/dist/providers/types.d.ts +12 -0
  36. package/dist/providers/types.d.ts.map +1 -0
  37. package/dist/providers/types.js +2 -0
  38. package/dist/providers/types.js.map +1 -0
  39. package/dist/spinner.d.ts +9 -0
  40. package/dist/spinner.d.ts.map +1 -0
  41. package/dist/spinner.js +31 -0
  42. package/dist/spinner.js.map +1 -0
  43. 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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -0,0 +1,2 @@
1
+ export declare function formatCommitMessage(raw: string): string;
2
+ //# sourceMappingURL=format.d.ts.map
@@ -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
@@ -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"}
@@ -0,0 +1,3 @@
1
+ import type { GitDiff } from "./git.js";
2
+ export declare function buildCommitPrompt(diff: GitDiff): string;
3
+ //# sourceMappingURL=prompt.d.ts.map
@@ -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,7 @@
1
+ import type { Provider, ProviderResult } from "./types.js";
2
+ export declare class ClaudeProvider implements Provider {
3
+ name: string;
4
+ isAvailable(): boolean;
5
+ generate(prompt: string): Promise<ProviderResult>;
6
+ }
7
+ //# sourceMappingURL=claude.d.ts.map
@@ -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,7 @@
1
+ import type { Provider, ProviderResult } from "./types.js";
2
+ export declare class CodexProvider implements Provider {
3
+ name: string;
4
+ isAvailable(): boolean;
5
+ generate(prompt: string): Promise<ProviderResult>;
6
+ }
7
+ //# sourceMappingURL=codex.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ export declare class Spinner {
2
+ private intervalId;
3
+ private frameIndex;
4
+ private message;
5
+ constructor(message?: string);
6
+ start(): void;
7
+ stop(finalMessage?: string): void;
8
+ }
9
+ //# sourceMappingURL=spinner.d.ts.map
@@ -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"}
@@ -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
+ }