@reck98/git-smart 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 (104) hide show
  1. package/README.md +229 -0
  2. package/dist/ai/index.d.ts +3 -0
  3. package/dist/ai/index.d.ts.map +1 -0
  4. package/dist/ai/index.js +15 -0
  5. package/dist/ai/index.js.map +1 -0
  6. package/dist/ai/prompt.d.ts +4 -0
  7. package/dist/ai/prompt.d.ts.map +1 -0
  8. package/dist/ai/prompt.js +47 -0
  9. package/dist/ai/prompt.js.map +1 -0
  10. package/dist/cli.d.ts +3 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +43 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/commands/commit.d.ts +2 -0
  15. package/dist/commands/commit.d.ts.map +1 -0
  16. package/dist/commands/commit.js +65 -0
  17. package/dist/commands/commit.js.map +1 -0
  18. package/dist/commands/prechecks.d.ts +6 -0
  19. package/dist/commands/prechecks.d.ts.map +1 -0
  20. package/dist/commands/prechecks.js +75 -0
  21. package/dist/commands/prechecks.js.map +1 -0
  22. package/dist/commands/push.d.ts +2 -0
  23. package/dist/commands/push.d.ts.map +1 -0
  24. package/dist/commands/push.js +27 -0
  25. package/dist/commands/push.js.map +1 -0
  26. package/dist/commands/summary.d.ts +2 -0
  27. package/dist/commands/summary.d.ts.map +1 -0
  28. package/dist/commands/summary.js +34 -0
  29. package/dist/commands/summary.js.map +1 -0
  30. package/dist/commands/workflow.d.ts +7 -0
  31. package/dist/commands/workflow.d.ts.map +1 -0
  32. package/dist/commands/workflow.js +83 -0
  33. package/dist/commands/workflow.js.map +1 -0
  34. package/dist/core/config.d.ts +4 -0
  35. package/dist/core/config.d.ts.map +1 -0
  36. package/dist/core/config.js +46 -0
  37. package/dist/core/config.js.map +1 -0
  38. package/dist/core/git.d.ts +16 -0
  39. package/dist/core/git.d.ts.map +1 -0
  40. package/dist/core/git.js +107 -0
  41. package/dist/core/git.js.map +1 -0
  42. package/dist/core/types.d.ts +37 -0
  43. package/dist/core/types.d.ts.map +1 -0
  44. package/dist/core/types.js +13 -0
  45. package/dist/core/types.js.map +1 -0
  46. package/dist/index.d.ts +3 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +5 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/prompts/index.d.ts +12 -0
  51. package/dist/prompts/index.d.ts.map +1 -0
  52. package/dist/prompts/index.js +143 -0
  53. package/dist/prompts/index.js.map +1 -0
  54. package/dist/providers/anthropic.d.ts +6 -0
  55. package/dist/providers/anthropic.d.ts.map +1 -0
  56. package/dist/providers/anthropic.js +24 -0
  57. package/dist/providers/anthropic.js.map +1 -0
  58. package/dist/providers/gemini.d.ts +6 -0
  59. package/dist/providers/gemini.d.ts.map +1 -0
  60. package/dist/providers/gemini.js +17 -0
  61. package/dist/providers/gemini.js.map +1 -0
  62. package/dist/providers/index.d.ts +4 -0
  63. package/dist/providers/index.d.ts.map +1 -0
  64. package/dist/providers/index.js +18 -0
  65. package/dist/providers/index.js.map +1 -0
  66. package/dist/providers/openai.d.ts +6 -0
  67. package/dist/providers/openai.d.ts.map +1 -0
  68. package/dist/providers/openai.js +19 -0
  69. package/dist/providers/openai.js.map +1 -0
  70. package/dist/providers/openrouter.d.ts +6 -0
  71. package/dist/providers/openrouter.d.ts.map +1 -0
  72. package/dist/providers/openrouter.js +22 -0
  73. package/dist/providers/openrouter.js.map +1 -0
  74. package/dist/providers/types.d.ts +5 -0
  75. package/dist/providers/types.d.ts.map +1 -0
  76. package/dist/providers/types.js +2 -0
  77. package/dist/providers/types.js.map +1 -0
  78. package/dist/utils/classification.d.ts +3 -0
  79. package/dist/utils/classification.d.ts.map +1 -0
  80. package/dist/utils/classification.js +28 -0
  81. package/dist/utils/classification.js.map +1 -0
  82. package/dist/utils/display.d.ts +5 -0
  83. package/dist/utils/display.d.ts.map +1 -0
  84. package/dist/utils/display.js +32 -0
  85. package/dist/utils/display.js.map +1 -0
  86. package/dist/utils/templates/go.gitignore +9 -0
  87. package/dist/utils/templates/java.gitignore +13 -0
  88. package/dist/utils/templates/node.gitignore +11 -0
  89. package/dist/utils/templates/php.gitignore +6 -0
  90. package/dist/utils/templates/python.gitignore +13 -0
  91. package/dist/utils/templates/ruby.gitignore +6 -0
  92. package/dist/utils/templates/rust.gitignore +3 -0
  93. package/dist/utils/templates.d.ts +3 -0
  94. package/dist/utils/templates.d.ts.map +1 -0
  95. package/dist/utils/templates.js +79 -0
  96. package/dist/utils/templates.js.map +1 -0
  97. package/package.json +48 -0
  98. package/src/utils/templates/go.gitignore +9 -0
  99. package/src/utils/templates/java.gitignore +13 -0
  100. package/src/utils/templates/node.gitignore +11 -0
  101. package/src/utils/templates/php.gitignore +6 -0
  102. package/src/utils/templates/python.gitignore +13 -0
  103. package/src/utils/templates/ruby.gitignore +6 -0
  104. package/src/utils/templates/rust.gitignore +3 -0
package/README.md ADDED
@@ -0,0 +1,229 @@
1
+ # git-smart
2
+
3
+ AI-powered Git workflow assistant that generates production-quality commit messages, summarizes code changes, and streamlines Git operations.
4
+
5
+ ```bash
6
+ npx git-smart
7
+ ```
8
+
9
+ ---
10
+
11
+ ## Features
12
+
13
+ - **Repository Validation** — Detects if the current directory is a Git repo; offers to initialize one.
14
+ - **.gitignore Generator** — Detects missing `.gitignore` and offers templates for Node, Python, Go, PHP, Ruby, Rust, Java.
15
+ - **Remote Validation** — Detects missing remotes; prompts to add one interactively.
16
+ - **First Commit Detection** — Adapts behavior for repositories without a commit history.
17
+ - **Smart Staging** — Stage all, none, or select files interactively.
18
+ - **AI Change Summary** — Generates a concise bullet-point summary of what changed.
19
+ - **Commit Message Generation** — Produces three production-grade commit message options via LLM.
20
+ - **Conventional Commits** — Supports `feat:`, `fix:`, `refactor:`, etc.
21
+ - **Custom Editing** — Pick a generated message or write your own.
22
+ - **Push Workflow** — Optionally push to remote after committing.
23
+ - **Multi-Provider LLM** — OpenAI, OpenRouter, Anthropic, and Gemini.
24
+
25
+ ---
26
+
27
+ ## Commands
28
+
29
+ | Command | Description |
30
+ |---|---|
31
+ | `git-smart` | Full workflow: prechecks → stage → AI summary → commit → push |
32
+ | `git-smart --dry-run` | Generate summary and messages; no commit or push |
33
+ | `git-smart summary` | Generate change summary only |
34
+ | `git-smart commit` | Generate commit messages and commit (no push) |
35
+ | `git-smart push` | Push current branch to remote |
36
+
37
+ ---
38
+
39
+ ## Workflow
40
+
41
+ ```
42
+ START
43
+
44
+ Validate Repository
45
+
46
+ Validate .gitignore
47
+
48
+ Validate Remote
49
+
50
+ Detect First Commit
51
+
52
+ Analyze Repository State
53
+
54
+ Stage Files
55
+
56
+ Collect Diff
57
+
58
+ Generate AI Summary
59
+
60
+ Generate Commit Messages
61
+
62
+ Select / Edit Message
63
+
64
+ Commit
65
+
66
+ Push (optional)
67
+
68
+ END
69
+ ```
70
+
71
+ ---
72
+
73
+ ## Installation
74
+
75
+ ### Global (recommended)
76
+
77
+ ```bash
78
+ npm install -g git-smart
79
+ ```
80
+
81
+ ### npx (no install)
82
+
83
+ ```bash
84
+ npx git-smart
85
+ ```
86
+
87
+ ### From source
88
+
89
+ ```bash
90
+ git clone <repo>
91
+ cd git-smart
92
+ npm install
93
+ npm run build
94
+ npm link
95
+ ```
96
+
97
+ ---
98
+
99
+ ## Configuration
100
+
101
+ Create `.git-smart.json` in your project root:
102
+
103
+ ```json
104
+ {
105
+ "provider": "openrouter",
106
+ "model": "google/gemma-2-9b-it:free",
107
+ "conventionalCommits": true,
108
+ "autoPush": false,
109
+ "showSummary": true
110
+ }
111
+ ```
112
+
113
+ | Option | Default | Description |
114
+ |---|---|---|
115
+ | `provider` | `openrouter` | LLM provider: `openai`, `openrouter`, `anthropic`, `gemini` |
116
+ | `model` | `google/gemma-2-9b-it:free` | Model name for the chosen provider |
117
+ | `conventionalCommits` | `true` | Generate Conventional Commit messages (`feat:`, `fix:`, etc.) |
118
+ | `autoPush` | `false` | Automatically push after commit (no prompt) |
119
+ | `showSummary` | `true` | Display AI-generated summary before committing |
120
+ | `apiKey` | — | Override the built-in API key (optional) |
121
+
122
+ ---
123
+
124
+ ## Environment Variables
125
+
126
+ Set the API key for your chosen provider:
127
+
128
+ | Provider | Variable |
129
+ |---|---|
130
+ | OpenAI | `OPENAI_API_KEY` |
131
+ | OpenRouter | `OPENROUTER_API_KEY` |
132
+ | Anthropic | `ANTHROPIC_API_KEY` |
133
+ | Gemini | `GEMINI_API_KEY` |
134
+
135
+ ---
136
+
137
+ ## Usage Examples
138
+
139
+ ```bash
140
+ # Full interactive workflow
141
+ git-smart
142
+
143
+ # Preview without committing
144
+ git-smart --dry-run
145
+
146
+ # Only generate a summary of staged changes
147
+ git-smart summary
148
+
149
+ # Generate messages and commit (skip push prompt)
150
+ git-smart commit
151
+
152
+ # Push current branch to origin
153
+ git-smart push
154
+ ```
155
+
156
+ ---
157
+
158
+ ## Output Example
159
+
160
+ ```
161
+ Impact: MEDIUM
162
+
163
+ Summary
164
+ ✓ Added ApiError utility
165
+ ✓ Added ApiResponse utility
166
+ ✓ Added asyncHandler wrapper
167
+ ✓ Refactored environment configuration
168
+
169
+ Suggested Commits
170
+ 1. feat(core): add reusable API utility classes
171
+ 2. refactor(config): centralize environment setup
172
+ 3. chore(project): improve backend initialization flow
173
+ ```
174
+
175
+ ---
176
+
177
+ ## Supported Languages
178
+
179
+ The `.gitignore` generator includes templates for:
180
+
181
+ - Node
182
+ - Python
183
+ - Go
184
+ - PHP
185
+ - Ruby
186
+ - Rust
187
+ - Java
188
+
189
+ ---
190
+
191
+ ## File Classification
192
+
193
+ Files are classified by importance to focus the AI on business logic:
194
+
195
+ | Priority | Patterns |
196
+ |---|---|
197
+ | High | `controllers`, `routes`, `services`, `models`, `middlewares` |
198
+ | Medium | `utils`, `configs` (and unclassified files) |
199
+ | Low | `package-lock`, `yarn.lock`, `pnpm-lock` |
200
+ | Ignored | `dist`, `build`, `coverage`, `node_modules` |
201
+
202
+ ---
203
+
204
+ ## Tech Stack
205
+
206
+ | Library | Purpose |
207
+ |---|---|
208
+ | [Commander.js](https://github.com/tj/commander.js) | CLI framework |
209
+ | [Inquirer.js](https://github.com/SBoudrias/Inquirer.js) | Interactive prompts |
210
+ | [Chalk](https://github.com/chalk/chalk) | Terminal styling |
211
+ | [Ora](https://github.com/sindresorhus/ora) | Loading spinners |
212
+ | [simple-git](https://github.com/steveukx/git-js) | Git operations |
213
+ | [OpenAI SDK](https://github.com/openai/openai-node) | OpenAI & OpenRouter provider |
214
+ | [Anthropic SDK](https://github.com/anthropics/anthropic-sdk-typescript) | Anthropic provider |
215
+ | [Google Generative AI](https://github.com/google-gemini/generative-ai-js) | Gemini provider |
216
+
217
+ ---
218
+
219
+ ## Requirements
220
+
221
+ - **Node.js** >= 20
222
+ - A **Git** repository (or let git-smart initialize one)
223
+ - No API key needed — a built-in key ships with the package. Set your own via `OPENROUTER_API_KEY` or `apiKey` in `.git-smart.json` to override.
224
+
225
+ ---
226
+
227
+ ## License
228
+
229
+ MIT
@@ -0,0 +1,3 @@
1
+ import { DiffStats, RepoState, AIResponse } from '../core/types.js';
2
+ export declare function generateAIContent(repoState: RepoState, files: string[], stats: DiffStats, diff: string): Promise<AIResponse>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAIpE,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,CAAC,CAerB"}
@@ -0,0 +1,15 @@
1
+ import { loadConfig, getApiKey } from '../core/config.js';
2
+ import { getProvider } from '../providers/index.js';
3
+ import { buildSystemPrompt, buildUserPrompt } from './prompt.js';
4
+ export async function generateAIContent(repoState, files, stats, diff) {
5
+ const config = loadConfig();
6
+ const apiKey = getApiKey(config.provider, config);
7
+ if (!apiKey) {
8
+ throw new Error(`No API key found for provider "${config.provider}". Set the ${config.provider.toUpperCase()}_API_KEY environment variable, or add "apiKey" to your .git-smart.json file.`);
9
+ }
10
+ const provider = getProvider(config.provider);
11
+ const systemPrompt = buildSystemPrompt();
12
+ const userPrompt = buildUserPrompt(repoState, files, stats, diff);
13
+ return provider.generateResponse(systemPrompt, userPrompt, apiKey, config.model);
14
+ }
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEjE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAoB,EACpB,KAAe,EACf,KAAgB,EAChB,IAAY;IAEZ,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAElD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,kCAAkC,MAAM,CAAC,QAAQ,cAAc,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,8EAA8E,CAC3K,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,iBAAiB,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,eAAe,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAElE,OAAO,QAAQ,CAAC,gBAAgB,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AACnF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { DiffStats, RepoState } from '../core/types.js';
2
+ export declare function buildSystemPrompt(): string;
3
+ export declare function buildUserPrompt(repoState: RepoState, files: string[], stats: DiffStats, diff: string): string;
4
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/ai/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAExD,wBAAgB,iBAAiB,IAAI,MAAM,CAqB1C;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,MAAM,GACX,MAAM,CAuBR"}
@@ -0,0 +1,47 @@
1
+ export function buildSystemPrompt() {
2
+ return `You are a senior software engineer reviewing code before commit.
3
+
4
+ Analyze the provided git diff.
5
+
6
+ Requirements:
7
+ - Understand intent
8
+ - Ignore formatting-only changes
9
+ - Ignore lock file noise
10
+ - Focus on business logic
11
+ - Follow Conventional Commits when requested
12
+ - Generate concise production-grade commit messages
13
+
14
+ Return JSON only.
15
+
16
+ Schema:
17
+ {
18
+ "summary": ["item1", "item2"],
19
+ "impact": "low|medium|high",
20
+ "messages": ["message1", "message2", "message3"]
21
+ }`;
22
+ }
23
+ export function buildUserPrompt(repoState, files, stats, diff) {
24
+ return `Repository Context:
25
+
26
+ Modified files: ${repoState.modified.join(', ') || 'none'}
27
+ Added files: ${repoState.added.join(', ') || 'none'}
28
+ Deleted files: ${repoState.deleted.join(', ') || 'none'}
29
+ Untracked files: ${repoState.untracked.join(', ') || 'none'}
30
+
31
+ Files Changed:
32
+ ${files.join('\n')}
33
+
34
+ Diff Statistics:
35
+ - Files changed: ${stats.files}
36
+ - Insertions: ${stats.insertions}
37
+ - Deletions: ${stats.deletions}
38
+
39
+ Git Diff:
40
+ ${diff.substring(0, 15000)}
41
+
42
+ Generate:
43
+ 1. Summary
44
+ 2. Impact Score
45
+ 3. Three commit messages`;
46
+ }
47
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/ai/prompt.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB;IAC/B,OAAO;;;;;;;;;;;;;;;;;;;EAmBP,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,SAAoB,EACpB,KAAe,EACf,KAAgB,EAChB,IAAY;IAEZ,OAAO;;kBAES,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;eAC1C,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;iBAClC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;mBACpC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;;;EAGzD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;;;mBAGC,KAAK,CAAC,KAAK;gBACd,KAAK,CAAC,UAAU;eACjB,KAAK,CAAC,SAAS;;;EAG5B,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC;;;;;yBAKD,CAAC;AAC1B,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createCLI(): Command;
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,SAAS,IAAI,OAAO,CAyCnC"}
package/dist/cli.js ADDED
@@ -0,0 +1,43 @@
1
+ import { Command } from 'commander';
2
+ import { runPreChecks } from './commands/prechecks.js';
3
+ import { runWorkflow } from './commands/workflow.js';
4
+ import { runSummary } from './commands/summary.js';
5
+ import { runCommit } from './commands/commit.js';
6
+ import { runPush } from './commands/push.js';
7
+ import { loadConfig } from './core/config.js';
8
+ export function createCLI() {
9
+ const config = loadConfig();
10
+ const program = new Command();
11
+ program
12
+ .name('git-smart')
13
+ .description('AI-powered Git workflow assistant')
14
+ .version('1.0.0');
15
+ program
16
+ .option('--dry-run', 'Generate summary and messages without committing or pushing')
17
+ .action(async (options) => {
18
+ await runPreChecks();
19
+ await runWorkflow({ dryRun: options.dryRun });
20
+ });
21
+ program
22
+ .command('summary')
23
+ .description('Generate change summary only')
24
+ .action(async () => {
25
+ await runPreChecks();
26
+ await runSummary();
27
+ });
28
+ program
29
+ .command('commit')
30
+ .description('Generate commit messages and commit')
31
+ .action(async () => {
32
+ await runPreChecks();
33
+ await runCommit();
34
+ });
35
+ program
36
+ .command('push')
37
+ .description('Push current branch to remote')
38
+ .action(async () => {
39
+ await runPush();
40
+ });
41
+ return program;
42
+ }
43
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,UAAU,SAAS;IACvB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,WAAW,CAAC;SACjB,WAAW,CAAC,mCAAmC,CAAC;SAChD,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,OAAO;SACJ,MAAM,CAAC,WAAW,EAAE,6DAA6D,CAAC;SAClF,MAAM,CAAC,KAAK,EAAE,OAA6B,EAAE,EAAE;QAC9C,MAAM,YAAY,EAAE,CAAC;QACrB,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,YAAY,EAAE,CAAC;QACrB,MAAM,UAAU,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,YAAY,EAAE,CAAC;QACrB,MAAM,SAAS,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runCommit(): Promise<void>;
2
+ //# sourceMappingURL=commit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AASA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAmE/C"}
@@ -0,0 +1,65 @@
1
+ import ora from 'ora';
2
+ import chalk from 'chalk';
3
+ import { getRepoState, getStagedDiff, getDiffStats, stageAll, commit } from '../core/git.js';
4
+ import { classifyFiles } from '../utils/classification.js';
5
+ import { printDiffStats, printAIResponse } from '../utils/display.js';
6
+ import { promptUseConventionalCommits, promptSelectCommitMessage } from '../prompts/index.js';
7
+ import { generateAIContent } from '../ai/index.js';
8
+ export async function runCommit() {
9
+ const spinner = ora();
10
+ spinner.start('Analyzing staged changes...');
11
+ const repoState = await getRepoState();
12
+ const diff = await getStagedDiff();
13
+ const stats = await getDiffStats();
14
+ spinner.stop();
15
+ if (!diff || diff.trim().length === 0) {
16
+ console.log(chalk.yellow('No staged changes. Staging all...'));
17
+ await stageAll();
18
+ const refetchSpinner = ora('Re-collecting diff...').start();
19
+ const newDiff = await getStagedDiff();
20
+ const newStats = await getDiffStats();
21
+ refetchSpinner.stop();
22
+ if (!newDiff || newDiff.trim().length === 0) {
23
+ console.log(chalk.yellow('No changes to commit.'));
24
+ return;
25
+ }
26
+ printDiffStats(newStats);
27
+ const allFiles = [...repoState.modified, ...repoState.added, ...repoState.deleted];
28
+ const classification = classifyFiles(allFiles);
29
+ spinner.start('Generating AI commit messages...');
30
+ try {
31
+ const aiResponse = await generateAIContent(repoState, classification.high.concat(classification.medium), newStats, newDiff);
32
+ spinner.stop();
33
+ printAIResponse(aiResponse);
34
+ await promptUseConventionalCommits();
35
+ const selectedMessage = await promptSelectCommitMessage(aiResponse.messages);
36
+ const commitSpinner = ora('Committing...').start();
37
+ await commit(selectedMessage);
38
+ commitSpinner.succeed(`Committed: ${selectedMessage}`);
39
+ }
40
+ catch (error) {
41
+ spinner.fail('AI generation failed.');
42
+ throw error;
43
+ }
44
+ return;
45
+ }
46
+ printDiffStats(stats);
47
+ const allFiles = [...repoState.modified, ...repoState.added, ...repoState.deleted];
48
+ const classification = classifyFiles(allFiles);
49
+ spinner.start('Generating AI commit messages...');
50
+ try {
51
+ const aiResponse = await generateAIContent(repoState, classification.high.concat(classification.medium), stats, diff);
52
+ spinner.stop();
53
+ printAIResponse(aiResponse);
54
+ await promptUseConventionalCommits();
55
+ const selectedMessage = await promptSelectCommitMessage(aiResponse.messages);
56
+ const commitSpinner = ora('Committing...').start();
57
+ await commit(selectedMessage);
58
+ commitSpinner.succeed(`Committed: ${selectedMessage}`);
59
+ }
60
+ catch (error) {
61
+ spinner.fail('AI generation failed.');
62
+ throw error;
63
+ }
64
+ }
65
+ //# sourceMappingURL=commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface PreCheckResult {
2
+ hasRemote: boolean;
3
+ isFirstCommit: boolean;
4
+ }
5
+ export declare function runPreChecks(): Promise<PreCheckResult>;
6
+ //# sourceMappingURL=prechecks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prechecks.d.ts","sourceRoot":"","sources":["../../src/commands/prechecks.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,cAAc,CAAC,CAuE5D"}
@@ -0,0 +1,75 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { isGitRepo, gitInit, hasGitIgnore, getRemoteUrl, addRemote } from '../core/git.js';
4
+ import { promptInitOrExit, promptGitignore, promptAddRemote, promptRemoteUrl } from '../prompts/index.js';
5
+ import { getGitignoreTemplate } from '../utils/templates.js';
6
+ import { writeFileSync } from 'node:fs';
7
+ import { join } from 'node:path';
8
+ export async function runPreChecks() {
9
+ const spinner = ora();
10
+ spinner.start('Validating repository...');
11
+ const repoOk = await isGitRepo();
12
+ spinner.stop();
13
+ if (!repoOk) {
14
+ console.log(chalk.red('This directory is not a Git repository.'));
15
+ const action = await promptInitOrExit();
16
+ if (action === 'exit')
17
+ process.exit(0);
18
+ const initSpinner = ora('Initializing repository...').start();
19
+ await gitInit();
20
+ initSpinner.succeed('Repository initialized.');
21
+ }
22
+ else {
23
+ console.log(chalk.green('✓ Git repository detected.'));
24
+ }
25
+ spinner.start('Checking .gitignore...');
26
+ const ignoreExists = await hasGitIgnore();
27
+ spinner.stop();
28
+ if (!ignoreExists) {
29
+ console.log(chalk.yellow('No .gitignore file found.'));
30
+ const option = await promptGitignore();
31
+ if (option !== 'skip') {
32
+ const template = getGitignoreTemplate(option);
33
+ if (template) {
34
+ writeFileSync(join(process.cwd(), '.gitignore'), template, 'utf-8');
35
+ console.log(chalk.green(`✓ .gitignore generated for ${option}.`));
36
+ }
37
+ }
38
+ }
39
+ else {
40
+ console.log(chalk.green('✓ .gitignore exists.'));
41
+ }
42
+ spinner.start('Checking remote...');
43
+ const remoteUrl = await getRemoteUrl();
44
+ spinner.stop();
45
+ let hasRemote = remoteUrl !== null;
46
+ if (!hasRemote) {
47
+ console.log(chalk.yellow('No remote repository configured.'));
48
+ const shouldAdd = await promptAddRemote();
49
+ if (shouldAdd === 'yes') {
50
+ const url = await promptRemoteUrl();
51
+ const addSpinner = ora('Adding remote...').start();
52
+ await addRemote(url);
53
+ addSpinner.succeed('Remote added.');
54
+ hasRemote = true;
55
+ }
56
+ }
57
+ else {
58
+ console.log(chalk.green(`✓ Remote configured: ${remoteUrl}`));
59
+ }
60
+ spinner.start('Checking first commit...');
61
+ let isFirstCommit = false;
62
+ try {
63
+ const { isFirstCommit: check } = await import('../core/git.js');
64
+ isFirstCommit = await check();
65
+ }
66
+ catch {
67
+ isFirstCommit = true;
68
+ }
69
+ spinner.stop();
70
+ if (isFirstCommit) {
71
+ console.log(chalk.cyan('ℹ First commit detected.'));
72
+ }
73
+ return { hasRemote, isFirstCommit };
74
+ }
75
+ //# sourceMappingURL=prechecks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prechecks.js","sourceRoot":"","sources":["../../src/commands/prechecks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runPush(): Promise<void>;
2
+ //# sourceMappingURL=push.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAIA,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CA0B7C"}
@@ -0,0 +1,27 @@
1
+ import ora from 'ora';
2
+ import chalk from 'chalk';
3
+ import { getCurrentBranch, push, getRemoteUrl } from '../core/git.js';
4
+ export async function runPush() {
5
+ const spinner = ora();
6
+ spinner.start('Checking remote...');
7
+ const remoteUrl = await getRemoteUrl();
8
+ spinner.stop();
9
+ if (!remoteUrl) {
10
+ console.log(chalk.red('No remote repository configured.'));
11
+ return;
12
+ }
13
+ spinner.start('Checking current branch...');
14
+ const branch = await getCurrentBranch();
15
+ spinner.stop();
16
+ console.log(chalk.cyan(`Pushing to origin/${branch}...`));
17
+ const pushSpinner = ora('Pushing...').start();
18
+ try {
19
+ await push(branch);
20
+ pushSpinner.succeed(`Successfully pushed to origin/${branch}.`);
21
+ }
22
+ catch (error) {
23
+ pushSpinner.fail('Push failed.');
24
+ throw error;
25
+ }
26
+ }
27
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEtE,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;IAEtB,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE,CAAC;IACvC,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACxC,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,MAAM,KAAK,CAAC,CAAC,CAAC;IAE1D,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,WAAW,CAAC,OAAO,CAAC,iCAAiC,MAAM,GAAG,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACjC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runSummary(): Promise<void>;
2
+ //# sourceMappingURL=summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/commands/summary.ts"],"names":[],"mappings":"AAOA,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAsChD"}
@@ -0,0 +1,34 @@
1
+ import ora from 'ora';
2
+ import { getRepoState, getStagedDiff, getDiffStats } from '../core/git.js';
3
+ import { classifyFiles } from '../utils/classification.js';
4
+ import { printRepoState, printDiffStats, printAIResponse } from '../utils/display.js';
5
+ import { generateAIContent } from '../ai/index.js';
6
+ export async function runSummary() {
7
+ const spinner = ora();
8
+ spinner.start('Analyzing repository state...');
9
+ const repoState = await getRepoState();
10
+ spinner.stop();
11
+ printRepoState(repoState);
12
+ if (repoState.modified.length === 0 && repoState.added.length === 0 && repoState.deleted.length === 0) {
13
+ console.log('No staged changes found.');
14
+ return;
15
+ }
16
+ spinner.start('Collecting diff...');
17
+ const diff = await getStagedDiff();
18
+ const stats = await getDiffStats();
19
+ spinner.stop();
20
+ printDiffStats(stats);
21
+ const allFiles = [...repoState.modified, ...repoState.added, ...repoState.deleted];
22
+ const classification = classifyFiles(allFiles);
23
+ spinner.start('Generating AI summary...');
24
+ try {
25
+ const aiResponse = await generateAIContent(repoState, classification.high.concat(classification.medium), stats, diff);
26
+ spinner.stop();
27
+ printAIResponse(aiResponse);
28
+ }
29
+ catch (error) {
30
+ spinner.fail('AI generation failed.');
31
+ throw error;
32
+ }
33
+ }
34
+ //# sourceMappingURL=summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/commands/summary.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGnD,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;IAEtB,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAc,MAAM,YAAY,EAAE,CAAC;IAClD,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,cAAc,CAAC,SAAS,CAAC,CAAC;IAE1B,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,aAAa,EAAE,CAAC;IACnC,MAAM,KAAK,GAAc,MAAM,YAAY,EAAE,CAAC;IAC9C,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,cAAc,CAAC,KAAK,CAAC,CAAC;IAEtB,MAAM,QAAQ,GAAG,CAAC,GAAG,SAAS,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACnF,MAAM,cAAc,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAE/C,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,iBAAiB,CACxC,SAAS,EACT,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,EACjD,KAAK,EACL,IAAI,CACL,CAAC;QACF,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,eAAe,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACtC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface WorkflowOptions {
2
+ dryRun?: boolean;
3
+ skipPush?: boolean;
4
+ skipCommit?: boolean;
5
+ }
6
+ export declare function runWorkflow(options?: WorkflowOptions): Promise<void>;
7
+ //# sourceMappingURL=workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/commands/workflow.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,WAAW,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4F9E"}