@mehmetsagir/git-ai 0.0.18 → 0.0.20
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 +137 -71
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js +18 -16
- package/dist/git.js.map +1 -1
- package/dist/stash.d.ts.map +1 -1
- package/dist/stash.js +83 -25
- package/dist/stash.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
#
|
|
1
|
+
# git-ai
|
|
2
2
|
|
|
3
|
-
AI-powered git commit tool
|
|
3
|
+
AI-powered git commit tool that analyzes your changes, groups them logically, and creates meaningful commits following the Conventional Commits standard.
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
|
-
- **Smart Grouping
|
|
8
|
-
- **Conventional Commits
|
|
9
|
-
- **
|
|
10
|
-
- **Safe
|
|
11
|
-
- **Stash Viewer**: Browse git stashes in a web UI with syntax highlighting
|
|
7
|
+
- **Smart Commit Grouping** - AI analyzes your changes and groups related files together by feature or purpose
|
|
8
|
+
- **Conventional Commits** - Automatically generates commit messages in standard format (`feat`, `fix`, `refactor`, `chore`, etc.)
|
|
9
|
+
- **Stash Viewer** - Browse and manage git stashes in a beautiful web UI with diff viewer
|
|
10
|
+
- **Safe Workflow** - Always shows a commit plan for your approval before making any changes
|
|
12
11
|
|
|
13
12
|
## Installation
|
|
14
13
|
|
|
@@ -18,26 +17,33 @@ npm install -g @mehmetsagir/git-ai
|
|
|
18
17
|
|
|
19
18
|
## Setup
|
|
20
19
|
|
|
20
|
+
Before using git-ai, you need to configure your OpenAI API key:
|
|
21
|
+
|
|
21
22
|
```bash
|
|
22
23
|
git-ai setup
|
|
23
24
|
```
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
You'll be prompted to enter your OpenAI API key. Get one from [OpenAI Platform](https://platform.openai.com/api-keys).
|
|
27
|
+
|
|
28
|
+
## Commands
|
|
26
29
|
|
|
27
|
-
|
|
30
|
+
### `git-ai commit`
|
|
31
|
+
|
|
32
|
+
Analyze all changes in your repository and create intelligent commits.
|
|
28
33
|
|
|
29
34
|
```bash
|
|
30
35
|
git-ai commit
|
|
31
36
|
```
|
|
32
37
|
|
|
33
|
-
|
|
34
|
-
1.
|
|
35
|
-
2.
|
|
36
|
-
3.
|
|
37
|
-
4.
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
**What it does:**
|
|
39
|
+
1. Scans all changes (staged, unstaged, and untracked files)
|
|
40
|
+
2. Sends diff to AI for analysis
|
|
41
|
+
3. Groups related files together
|
|
42
|
+
4. Generates commit messages for each group
|
|
43
|
+
5. Shows you the commit plan for approval
|
|
44
|
+
6. Creates commits after your confirmation
|
|
40
45
|
|
|
46
|
+
**Example output:**
|
|
41
47
|
```
|
|
42
48
|
🤖 Git AI
|
|
43
49
|
|
|
@@ -73,29 +79,41 @@ Changes:
|
|
|
73
79
|
⚠ Don't forget to push: git push
|
|
74
80
|
```
|
|
75
81
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
| Command | Description |
|
|
79
|
-
|---------|-------------|
|
|
80
|
-
| `git-ai setup` | Configure OpenAI API key |
|
|
81
|
-
| `git-ai commit` | Analyze and create commits |
|
|
82
|
-
| `git-ai stash` | View git stashes in browser |
|
|
83
|
-
| `git-ai reset` | Reset configuration |
|
|
82
|
+
### `git-ai stash`
|
|
84
83
|
|
|
85
|
-
|
|
84
|
+
Open a web-based UI to browse and manage your git stashes.
|
|
86
85
|
|
|
87
86
|
```bash
|
|
88
87
|
git-ai stash
|
|
89
88
|
```
|
|
90
89
|
|
|
91
|
-
|
|
92
|
-
-
|
|
93
|
-
- Click to
|
|
90
|
+
**Features:**
|
|
91
|
+
- View all stashes in a clean list
|
|
92
|
+
- Click to see changed files and full diff
|
|
93
|
+
- VS Code-style split diff view (Original | Modified)
|
|
94
|
+
- Apply stash to your working directory
|
|
95
|
+
- Delete stashes you no longer need
|
|
94
96
|
- Syntax highlighting for code changes
|
|
95
97
|
|
|
98
|
+
### `git-ai setup`
|
|
99
|
+
|
|
100
|
+
Configure or update your OpenAI API key.
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
git-ai setup
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### `git-ai reset`
|
|
107
|
+
|
|
108
|
+
Reset all configuration (removes stored API key).
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
git-ai reset
|
|
112
|
+
```
|
|
113
|
+
|
|
96
114
|
## Configuration
|
|
97
115
|
|
|
98
|
-
|
|
116
|
+
Configuration is stored in `~/.git-ai/config.json`:
|
|
99
117
|
|
|
100
118
|
```json
|
|
101
119
|
{
|
|
@@ -106,63 +124,111 @@ Config file: `~/.git-ai/config.json`
|
|
|
106
124
|
## Requirements
|
|
107
125
|
|
|
108
126
|
- Node.js >= 14.0.0
|
|
109
|
-
- OpenAI API key
|
|
110
127
|
- Git repository
|
|
128
|
+
- OpenAI API key
|
|
111
129
|
|
|
112
|
-
##
|
|
130
|
+
## Contributing
|
|
113
131
|
|
|
114
|
-
|
|
115
|
-
**Stash Viewer Improvements**
|
|
132
|
+
Contributions are welcome! Here's how you can help:
|
|
116
133
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
134
|
+
### Development Setup
|
|
135
|
+
|
|
136
|
+
1. **Clone the repository**
|
|
137
|
+
```bash
|
|
138
|
+
git clone https://github.com/mehmetsagir/git-ai.git
|
|
139
|
+
cd git-ai
|
|
140
|
+
```
|
|
122
141
|
|
|
123
|
-
|
|
124
|
-
|
|
142
|
+
2. **Install dependencies**
|
|
143
|
+
```bash
|
|
144
|
+
npm install
|
|
145
|
+
```
|
|
125
146
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
147
|
+
3. **Build the project**
|
|
148
|
+
```bash
|
|
149
|
+
npm run build
|
|
150
|
+
```
|
|
130
151
|
|
|
131
|
-
|
|
132
|
-
|
|
152
|
+
4. **Test locally**
|
|
153
|
+
```bash
|
|
154
|
+
# Run directly
|
|
155
|
+
node bin/git-ai [command]
|
|
133
156
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
-
|
|
137
|
-
|
|
157
|
+
# Or link globally
|
|
158
|
+
npm link
|
|
159
|
+
git-ai [command]
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Project Structure
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
src/
|
|
166
|
+
├── index.ts # CLI entry point and command routing
|
|
167
|
+
├── git.ts # Git operations (using simple-git)
|
|
168
|
+
├── openai.ts # OpenAI API integration
|
|
169
|
+
├── commit.ts # Commit workflow logic
|
|
170
|
+
├── stash.ts # Stash viewer web UI
|
|
171
|
+
├── config.ts # Configuration management
|
|
172
|
+
├── setup.ts # Setup wizard
|
|
173
|
+
├── reset.ts # Reset configuration
|
|
174
|
+
├── prompts.ts # AI prompts for commit analysis
|
|
175
|
+
├── types.ts # TypeScript type definitions
|
|
176
|
+
└── utils/
|
|
177
|
+
├── errors.ts # Error handling utilities
|
|
178
|
+
└── hunk-parser.ts # Diff parsing utilities
|
|
179
|
+
```
|
|
138
180
|
|
|
139
|
-
###
|
|
140
|
-
**Major Refactor - Stability Release**
|
|
181
|
+
### Making Changes
|
|
141
182
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
183
|
+
1. Create a new branch for your feature
|
|
184
|
+
```bash
|
|
185
|
+
git checkout -b feature/your-feature-name
|
|
186
|
+
```
|
|
146
187
|
|
|
147
|
-
|
|
148
|
-
- Simplified to file-based grouping (more reliable than hunk-based)
|
|
149
|
-
- Improved error handling throughout
|
|
188
|
+
2. Make your changes and test them locally
|
|
150
189
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
- Hunk-level commit splitting (caused file corruption issues)
|
|
156
|
-
- Summary command
|
|
190
|
+
3. Build and verify there are no TypeScript errors
|
|
191
|
+
```bash
|
|
192
|
+
npm run build
|
|
193
|
+
```
|
|
157
194
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
195
|
+
4. Commit your changes using conventional commits format
|
|
196
|
+
```bash
|
|
197
|
+
git commit -m "feat: add new feature"
|
|
198
|
+
```
|
|
162
199
|
|
|
163
|
-
|
|
164
|
-
|
|
200
|
+
5. Push and create a pull request
|
|
201
|
+
```bash
|
|
202
|
+
git push origin feature/your-feature-name
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Commit Message Guidelines
|
|
206
|
+
|
|
207
|
+
We follow [Conventional Commits](https://www.conventionalcommits.org/):
|
|
208
|
+
|
|
209
|
+
- `feat:` - New features
|
|
210
|
+
- `fix:` - Bug fixes
|
|
211
|
+
- `refactor:` - Code changes that neither fix bugs nor add features
|
|
212
|
+
- `chore:` - Maintenance tasks
|
|
213
|
+
- `docs:` - Documentation changes
|
|
214
|
+
- `style:` - Code style changes (formatting, etc.)
|
|
215
|
+
- `test:` - Adding or updating tests
|
|
216
|
+
|
|
217
|
+
### Reporting Issues
|
|
218
|
+
|
|
219
|
+
Found a bug or have a suggestion? [Open an issue](https://github.com/mehmetsagir/git-ai/issues) with:
|
|
220
|
+
|
|
221
|
+
- Clear description of the problem or suggestion
|
|
222
|
+
- Steps to reproduce (for bugs)
|
|
223
|
+
- Expected vs actual behavior
|
|
224
|
+
- Your environment (Node.js version, OS, etc.)
|
|
165
225
|
|
|
166
226
|
## License
|
|
167
227
|
|
|
168
228
|
MIT
|
|
229
|
+
|
|
230
|
+
## Links
|
|
231
|
+
|
|
232
|
+
- [GitHub Repository](https://github.com/mehmetsagir/git-ai)
|
|
233
|
+
- [npm Package](https://www.npmjs.com/package/@mehmetsagir/git-ai)
|
|
234
|
+
- [Report Issues](https://github.com/mehmetsagir/git-ai/issues)
|
package/dist/git.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAMnC,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAOxD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAGnD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CA2B3D;AAeD,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/D;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAMhD;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjE;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAGxD;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAoBnD;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CA8C1D;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOjE;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQpE;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7D;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D"}
|
package/dist/git.js
CHANGED
|
@@ -51,10 +51,12 @@ exports.applyStash = applyStash;
|
|
|
51
51
|
exports.dropStash = dropStash;
|
|
52
52
|
const simple_git_1 = __importDefault(require("simple-git"));
|
|
53
53
|
const path = __importStar(require("path"));
|
|
54
|
-
|
|
54
|
+
function getGit() {
|
|
55
|
+
return (0, simple_git_1.default)(process.cwd());
|
|
56
|
+
}
|
|
55
57
|
async function isGitRepository() {
|
|
56
58
|
try {
|
|
57
|
-
await
|
|
59
|
+
await getGit().status();
|
|
58
60
|
return true;
|
|
59
61
|
}
|
|
60
62
|
catch {
|
|
@@ -62,11 +64,11 @@ async function isGitRepository() {
|
|
|
62
64
|
}
|
|
63
65
|
}
|
|
64
66
|
async function hasChanges() {
|
|
65
|
-
const status = await
|
|
67
|
+
const status = await getGit().status();
|
|
66
68
|
return status.files.length > 0;
|
|
67
69
|
}
|
|
68
70
|
async function getChangedFiles() {
|
|
69
|
-
const status = await
|
|
71
|
+
const status = await getGit().status();
|
|
70
72
|
const files = [];
|
|
71
73
|
const seen = new Set();
|
|
72
74
|
for (const f of status.files) {
|
|
@@ -106,27 +108,27 @@ function isBinaryFile(filePath) {
|
|
|
106
108
|
async function stageFiles(files) {
|
|
107
109
|
if (files.length === 0)
|
|
108
110
|
return;
|
|
109
|
-
await
|
|
111
|
+
await getGit().add(files);
|
|
110
112
|
}
|
|
111
113
|
async function unstageAll() {
|
|
112
114
|
try {
|
|
113
|
-
await
|
|
115
|
+
await getGit().reset(["HEAD"]);
|
|
114
116
|
}
|
|
115
117
|
catch {
|
|
116
118
|
// Ignore if nothing staged
|
|
117
119
|
}
|
|
118
120
|
}
|
|
119
121
|
async function createCommit(message) {
|
|
120
|
-
await
|
|
122
|
+
await getGit().commit(message);
|
|
121
123
|
}
|
|
122
124
|
async function getStagedFiles() {
|
|
123
|
-
const status = await
|
|
125
|
+
const status = await getGit().status();
|
|
124
126
|
return status.staged;
|
|
125
127
|
}
|
|
126
128
|
async function getFullDiff() {
|
|
127
129
|
let diff = "";
|
|
128
130
|
try {
|
|
129
|
-
const unstaged = await
|
|
131
|
+
const unstaged = await getGit().diff();
|
|
130
132
|
if (unstaged)
|
|
131
133
|
diff = unstaged;
|
|
132
134
|
}
|
|
@@ -134,7 +136,7 @@ async function getFullDiff() {
|
|
|
134
136
|
// Ignore
|
|
135
137
|
}
|
|
136
138
|
try {
|
|
137
|
-
const staged = await
|
|
139
|
+
const staged = await getGit().diff(["--cached"]);
|
|
138
140
|
if (staged) {
|
|
139
141
|
diff = diff ? diff + "\n" + staged : staged;
|
|
140
142
|
}
|
|
@@ -147,7 +149,7 @@ async function getFullDiff() {
|
|
|
147
149
|
async function getStashList() {
|
|
148
150
|
try {
|
|
149
151
|
// Use git.raw for better compatibility
|
|
150
|
-
const result = await
|
|
152
|
+
const result = await getGit().raw(["stash", "list", "--format=%H|%s|%ci"]);
|
|
151
153
|
if (!result || !result.trim())
|
|
152
154
|
return [];
|
|
153
155
|
const lines = result.trim().split("\n");
|
|
@@ -167,7 +169,7 @@ async function getStashList() {
|
|
|
167
169
|
catch (err) {
|
|
168
170
|
// Fallback: try without format
|
|
169
171
|
try {
|
|
170
|
-
const result = await
|
|
172
|
+
const result = await getGit().raw(["stash", "list"]);
|
|
171
173
|
if (!result || !result.trim())
|
|
172
174
|
return [];
|
|
173
175
|
const lines = result.trim().split("\n");
|
|
@@ -193,7 +195,7 @@ async function getStashList() {
|
|
|
193
195
|
}
|
|
194
196
|
async function getStashDiff(index) {
|
|
195
197
|
try {
|
|
196
|
-
const result = await
|
|
198
|
+
const result = await getGit().raw(["stash", "show", "-p", `stash@{${index}}`]);
|
|
197
199
|
return result || "";
|
|
198
200
|
}
|
|
199
201
|
catch {
|
|
@@ -202,7 +204,7 @@ async function getStashDiff(index) {
|
|
|
202
204
|
}
|
|
203
205
|
async function getStashFiles(index) {
|
|
204
206
|
try {
|
|
205
|
-
const result = await
|
|
207
|
+
const result = await getGit().raw(["stash", "show", "--name-only", `stash@{${index}}`]);
|
|
206
208
|
if (!result)
|
|
207
209
|
return [];
|
|
208
210
|
return result.trim().split("\n").filter(f => f.trim());
|
|
@@ -212,9 +214,9 @@ async function getStashFiles(index) {
|
|
|
212
214
|
}
|
|
213
215
|
}
|
|
214
216
|
async function applyStash(index) {
|
|
215
|
-
await
|
|
217
|
+
await getGit().raw(["stash", "apply", `stash@{${index}}`]);
|
|
216
218
|
}
|
|
217
219
|
async function dropStash(index) {
|
|
218
|
-
await
|
|
220
|
+
await getGit().raw(["stash", "drop", `stash@{${index}}`]);
|
|
219
221
|
}
|
|
220
222
|
//# sourceMappingURL=git.js.map
|
package/dist/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
|
package/dist/stash.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stash.d.ts","sourceRoot":"","sources":["../src/stash.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stash.d.ts","sourceRoot":"","sources":["../src/stash.ts"],"names":[],"mappings":"AAkvBA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA+GpD"}
|
package/dist/stash.js
CHANGED
|
@@ -42,12 +42,20 @@ const child_process_1 = require("child_process");
|
|
|
42
42
|
const chalk_1 = __importDefault(require("chalk"));
|
|
43
43
|
const git = __importStar(require("./git"));
|
|
44
44
|
const PORT = 3847;
|
|
45
|
+
function safeJsonEmbed(obj) {
|
|
46
|
+
return JSON.stringify(obj)
|
|
47
|
+
.replace(/</g, '\\u003c')
|
|
48
|
+
.replace(/>/g, '\\u003e')
|
|
49
|
+
.replace(/&/g, '\\u0026');
|
|
50
|
+
}
|
|
45
51
|
function getHtml(data) {
|
|
46
|
-
const stashesJson = JSON.stringify(data.stashes);
|
|
47
52
|
const diffsJson = {};
|
|
48
53
|
const filesJson = {};
|
|
49
54
|
data.diffs.forEach((v, k) => { diffsJson[k] = v; });
|
|
50
55
|
data.files.forEach((v, k) => { filesJson[k] = v; });
|
|
56
|
+
const stashesJsonSafe = safeJsonEmbed(data.stashes);
|
|
57
|
+
const diffsJsonSafe = safeJsonEmbed(diffsJson);
|
|
58
|
+
const filesJsonSafe = safeJsonEmbed(filesJson);
|
|
51
59
|
return `<!DOCTYPE html>
|
|
52
60
|
<html>
|
|
53
61
|
<head>
|
|
@@ -85,30 +93,33 @@ function getHtml(data) {
|
|
|
85
93
|
align-items: center;
|
|
86
94
|
gap: 8px;
|
|
87
95
|
}
|
|
88
|
-
.
|
|
96
|
+
.header-nav {
|
|
89
97
|
display: flex;
|
|
90
98
|
align-items: center;
|
|
91
|
-
gap:
|
|
99
|
+
gap: 12px;
|
|
100
|
+
width: 100%;
|
|
101
|
+
}
|
|
102
|
+
.back-btn {
|
|
103
|
+
display: inline-flex;
|
|
104
|
+
align-items: center;
|
|
105
|
+
gap: 4px;
|
|
92
106
|
background: none;
|
|
93
107
|
border: none;
|
|
94
108
|
color: #58a6ff;
|
|
95
109
|
cursor: pointer;
|
|
96
|
-
font-size:
|
|
97
|
-
padding:
|
|
98
|
-
|
|
99
|
-
transition: background 0.1s;
|
|
110
|
+
font-size: 13px;
|
|
111
|
+
padding: 0;
|
|
112
|
+
transition: opacity 0.15s;
|
|
100
113
|
}
|
|
101
|
-
.back-btn:hover {
|
|
114
|
+
.back-btn:hover { opacity: 0.8; }
|
|
102
115
|
.back-btn svg {
|
|
103
|
-
width:
|
|
104
|
-
height:
|
|
116
|
+
width: 16px;
|
|
117
|
+
height: 16px;
|
|
105
118
|
}
|
|
106
119
|
.stash-title {
|
|
107
120
|
color: #4ec9b0;
|
|
108
|
-
font-size:
|
|
121
|
+
font-size: 13px;
|
|
109
122
|
font-weight: 500;
|
|
110
|
-
text-transform: none;
|
|
111
|
-
letter-spacing: normal;
|
|
112
123
|
}
|
|
113
124
|
.sidebar-footer {
|
|
114
125
|
padding: 14px 16px;
|
|
@@ -184,14 +195,14 @@ function getHtml(data) {
|
|
|
184
195
|
}
|
|
185
196
|
.toast {
|
|
186
197
|
position: fixed;
|
|
187
|
-
|
|
198
|
+
top: 20px;
|
|
188
199
|
right: 20px;
|
|
189
200
|
padding: 12px 20px;
|
|
190
201
|
border-radius: 6px;
|
|
191
202
|
font-size: 13px;
|
|
192
203
|
color: #fff;
|
|
193
204
|
opacity: 0;
|
|
194
|
-
transform: translateY(10px);
|
|
205
|
+
transform: translateY(-10px);
|
|
195
206
|
transition: opacity 0.2s, transform 0.2s;
|
|
196
207
|
z-index: 1000;
|
|
197
208
|
}
|
|
@@ -201,6 +212,36 @@ function getHtml(data) {
|
|
|
201
212
|
}
|
|
202
213
|
.toast.success { background: #238636; }
|
|
203
214
|
.toast.error { background: #da3633; }
|
|
215
|
+
.loader-overlay {
|
|
216
|
+
position: fixed;
|
|
217
|
+
top: 0;
|
|
218
|
+
left: 0;
|
|
219
|
+
right: 0;
|
|
220
|
+
bottom: 0;
|
|
221
|
+
background: rgba(0, 0, 0, 0.5);
|
|
222
|
+
display: flex;
|
|
223
|
+
align-items: center;
|
|
224
|
+
justify-content: center;
|
|
225
|
+
z-index: 999;
|
|
226
|
+
opacity: 0;
|
|
227
|
+
visibility: hidden;
|
|
228
|
+
transition: opacity 0.2s, visibility 0.2s;
|
|
229
|
+
}
|
|
230
|
+
.loader-overlay.show {
|
|
231
|
+
opacity: 1;
|
|
232
|
+
visibility: visible;
|
|
233
|
+
}
|
|
234
|
+
.loader {
|
|
235
|
+
width: 40px;
|
|
236
|
+
height: 40px;
|
|
237
|
+
border: 3px solid #3c3c3c;
|
|
238
|
+
border-top-color: #58a6ff;
|
|
239
|
+
border-radius: 50%;
|
|
240
|
+
animation: spin 0.8s linear infinite;
|
|
241
|
+
}
|
|
242
|
+
@keyframes spin {
|
|
243
|
+
to { transform: rotate(360deg); }
|
|
244
|
+
}
|
|
204
245
|
.sidebar-content {
|
|
205
246
|
flex: 1;
|
|
206
247
|
overflow-y: auto;
|
|
@@ -410,11 +451,14 @@ function getHtml(data) {
|
|
|
410
451
|
</div>
|
|
411
452
|
</div>
|
|
412
453
|
<div class="toast" id="toast"></div>
|
|
454
|
+
<div class="loader-overlay" id="loader">
|
|
455
|
+
<div class="loader"></div>
|
|
456
|
+
</div>
|
|
413
457
|
|
|
414
458
|
<script>
|
|
415
|
-
let stashes = ${
|
|
416
|
-
let diffs = ${
|
|
417
|
-
let files = ${
|
|
459
|
+
let stashes = ${stashesJsonSafe};
|
|
460
|
+
let diffs = ${diffsJsonSafe};
|
|
461
|
+
let files = ${filesJsonSafe};
|
|
418
462
|
let isLoading = false;
|
|
419
463
|
|
|
420
464
|
let currentView = 'list'; // 'list' or 'detail'
|
|
@@ -474,13 +518,15 @@ function getHtml(data) {
|
|
|
474
518
|
|
|
475
519
|
// Update header with back button
|
|
476
520
|
document.getElementById('sidebarHeader').innerHTML = \`
|
|
477
|
-
<
|
|
478
|
-
<
|
|
479
|
-
<
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
521
|
+
<div class="header-nav">
|
|
522
|
+
<button class="back-btn" onclick="renderStashList()">
|
|
523
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
524
|
+
<path d="M15 18l-6-6 6-6"/>
|
|
525
|
+
</svg>
|
|
526
|
+
Back
|
|
527
|
+
</button>
|
|
528
|
+
<span class="stash-title">stash@{\${index}}</span>
|
|
529
|
+
</div>
|
|
484
530
|
\`;
|
|
485
531
|
|
|
486
532
|
// Render file list with action buttons
|
|
@@ -645,6 +691,14 @@ function getHtml(data) {
|
|
|
645
691
|
setTimeout(() => { toast.classList.remove('show'); }, 3000);
|
|
646
692
|
}
|
|
647
693
|
|
|
694
|
+
function showLoader() {
|
|
695
|
+
document.getElementById('loader').classList.add('show');
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
function hideLoader() {
|
|
699
|
+
document.getElementById('loader').classList.remove('show');
|
|
700
|
+
}
|
|
701
|
+
|
|
648
702
|
async function refreshData() {
|
|
649
703
|
const res = await fetch('/api/data');
|
|
650
704
|
const data = await res.json();
|
|
@@ -656,6 +710,7 @@ function getHtml(data) {
|
|
|
656
710
|
async function applyStash(index) {
|
|
657
711
|
if (isLoading) return;
|
|
658
712
|
isLoading = true;
|
|
713
|
+
showLoader();
|
|
659
714
|
|
|
660
715
|
try {
|
|
661
716
|
const res = await fetch('/api/apply/' + index, { method: 'POST' });
|
|
@@ -672,6 +727,7 @@ function getHtml(data) {
|
|
|
672
727
|
showToast('Failed to apply stash', 'error');
|
|
673
728
|
}
|
|
674
729
|
|
|
730
|
+
hideLoader();
|
|
675
731
|
isLoading = false;
|
|
676
732
|
}
|
|
677
733
|
|
|
@@ -680,6 +736,7 @@ function getHtml(data) {
|
|
|
680
736
|
if (!confirm('Are you sure you want to delete this stash? This cannot be undone.')) return;
|
|
681
737
|
|
|
682
738
|
isLoading = true;
|
|
739
|
+
showLoader();
|
|
683
740
|
|
|
684
741
|
try {
|
|
685
742
|
const res = await fetch('/api/drop/' + index, { method: 'POST' });
|
|
@@ -696,6 +753,7 @@ function getHtml(data) {
|
|
|
696
753
|
showToast('Failed to delete stash', 'error');
|
|
697
754
|
}
|
|
698
755
|
|
|
756
|
+
hideLoader();
|
|
699
757
|
isLoading = false;
|
|
700
758
|
}
|
|
701
759
|
|
package/dist/stash.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stash.js","sourceRoot":"","sources":["../src/stash.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"stash.js","sourceRoot":"","sources":["../src/stash.ts"],"names":[],"mappings":"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"}
|