@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.
- package/README.md +229 -0
- package/dist/ai/index.d.ts +3 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +15 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/prompt.d.ts +4 -0
- package/dist/ai/prompt.d.ts.map +1 -0
- package/dist/ai/prompt.js +47 -0
- package/dist/ai/prompt.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +43 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/commit.d.ts +2 -0
- package/dist/commands/commit.d.ts.map +1 -0
- package/dist/commands/commit.js +65 -0
- package/dist/commands/commit.js.map +1 -0
- package/dist/commands/prechecks.d.ts +6 -0
- package/dist/commands/prechecks.d.ts.map +1 -0
- package/dist/commands/prechecks.js +75 -0
- package/dist/commands/prechecks.js.map +1 -0
- package/dist/commands/push.d.ts +2 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +27 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/summary.d.ts +2 -0
- package/dist/commands/summary.d.ts.map +1 -0
- package/dist/commands/summary.js +34 -0
- package/dist/commands/summary.js.map +1 -0
- package/dist/commands/workflow.d.ts +7 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +83 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/core/config.d.ts +4 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +46 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/git.d.ts +16 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +107 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/types.d.ts +37 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +13 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +12 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +143 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/providers/anthropic.d.ts +6 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +24 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/gemini.d.ts +6 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +17 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +4 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +18 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai.d.ts +6 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +19 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/openrouter.d.ts +6 -0
- package/dist/providers/openrouter.d.ts.map +1 -0
- package/dist/providers/openrouter.js +22 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/providers/types.d.ts +5 -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/utils/classification.d.ts +3 -0
- package/dist/utils/classification.d.ts.map +1 -0
- package/dist/utils/classification.js +28 -0
- package/dist/utils/classification.js.map +1 -0
- package/dist/utils/display.d.ts +5 -0
- package/dist/utils/display.d.ts.map +1 -0
- package/dist/utils/display.js +32 -0
- package/dist/utils/display.js.map +1 -0
- package/dist/utils/templates/go.gitignore +9 -0
- package/dist/utils/templates/java.gitignore +13 -0
- package/dist/utils/templates/node.gitignore +11 -0
- package/dist/utils/templates/php.gitignore +6 -0
- package/dist/utils/templates/python.gitignore +13 -0
- package/dist/utils/templates/ruby.gitignore +6 -0
- package/dist/utils/templates/rust.gitignore +3 -0
- package/dist/utils/templates.d.ts +3 -0
- package/dist/utils/templates.d.ts.map +1 -0
- package/dist/utils/templates.js +79 -0
- package/dist/utils/templates.js.map +1 -0
- package/package.json +48 -0
- package/src/utils/templates/go.gitignore +9 -0
- package/src/utils/templates/java.gitignore +13 -0
- package/src/utils/templates/node.gitignore +11 -0
- package/src/utils/templates/php.gitignore +6 -0
- package/src/utils/templates/python.gitignore +13 -0
- package/src/utils/templates/ruby.gitignore +6 -0
- 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 @@
|
|
|
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"}
|
package/dist/ai/index.js
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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
|
package/dist/cli.js.map
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|