@ksw8954/git-ai-commit 1.0.11 → 1.1.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/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.1.0 - 2026-01-06
4
+
5
+ ### New Features
6
+ - Add `completion` command for bash/zsh shell auto-completion
7
+ - Add `make install-completion` and `make uninstall-completion` targets
8
+
9
+ ### Improvements
10
+ - Change tag message format to GitHub Release style (title + categorized notes)
11
+
3
12
  ## 1.0.11 - 2025-12-29
4
13
  - Default to `max_completion_tokens` and retry with `max_tokens` if unsupported.
5
14
  - Remove `temperature` from API requests to rely on model defaults.
package/Makefile CHANGED
@@ -1,4 +1,4 @@
1
- .PHONY: install build dev lint test typecheck clean uninstall link unlink version publish install-package
1
+ .PHONY: install build dev lint test typecheck clean uninstall link unlink version publish install-package install-completion uninstall-completion
2
2
 
3
3
  install: ## Install dependencies and build the project
4
4
  npm install
@@ -42,3 +42,52 @@ publish: build ## Publish the package to npm (ensure you're logged in)
42
42
 
43
43
  install-package: ## Install this package globally via npm
44
44
  npm i -g @ksw8954/git-ai-commit
45
+
46
+ install-completion: ## Install shell completion for current shell (bash/zsh)
47
+ @CURRENT_SHELL=$$(basename "$$SHELL"); \
48
+ if [ "$$CURRENT_SHELL" = "zsh" ]; then \
49
+ RCFILE="$$HOME/.zshrc"; \
50
+ COMPLETION_LINE='eval "$$(git-ai-commit completion zsh)"'; \
51
+ elif [ "$$CURRENT_SHELL" = "bash" ]; then \
52
+ if [ -f "$$HOME/.bash_profile" ]; then \
53
+ RCFILE="$$HOME/.bash_profile"; \
54
+ else \
55
+ RCFILE="$$HOME/.bashrc"; \
56
+ fi; \
57
+ COMPLETION_LINE='eval "$$(git-ai-commit completion bash)"'; \
58
+ else \
59
+ echo "Unsupported shell: $$CURRENT_SHELL (only bash and zsh are supported)"; \
60
+ exit 1; \
61
+ fi; \
62
+ if grep -q "git-ai-commit completion" "$$RCFILE" 2>/dev/null; then \
63
+ echo "Completion already installed in $$RCFILE"; \
64
+ else \
65
+ echo "" >> "$$RCFILE"; \
66
+ echo "# git-ai-commit shell completion" >> "$$RCFILE"; \
67
+ echo "$$COMPLETION_LINE" >> "$$RCFILE"; \
68
+ echo "Completion installed in $$RCFILE"; \
69
+ echo "Run 'source $$RCFILE' or restart your shell to enable"; \
70
+ fi
71
+
72
+ uninstall-completion: ## Remove shell completion from current shell config
73
+ @CURRENT_SHELL=$$(basename "$$SHELL"); \
74
+ if [ "$$CURRENT_SHELL" = "zsh" ]; then \
75
+ RCFILE="$$HOME/.zshrc"; \
76
+ elif [ "$$CURRENT_SHELL" = "bash" ]; then \
77
+ if [ -f "$$HOME/.bash_profile" ]; then \
78
+ RCFILE="$$HOME/.bash_profile"; \
79
+ else \
80
+ RCFILE="$$HOME/.bashrc"; \
81
+ fi; \
82
+ else \
83
+ echo "Unsupported shell: $$CURRENT_SHELL"; \
84
+ exit 1; \
85
+ fi; \
86
+ if grep -q "git-ai-commit completion" "$$RCFILE" 2>/dev/null; then \
87
+ sed -i.bak '/# git-ai-commit shell completion/d' "$$RCFILE"; \
88
+ sed -i.bak '/git-ai-commit completion/d' "$$RCFILE"; \
89
+ rm -f "$$RCFILE.bak"; \
90
+ echo "Completion removed from $$RCFILE"; \
91
+ else \
92
+ echo "No completion found in $$RCFILE"; \
93
+ fi
@@ -0,0 +1,10 @@
1
+ import { Command } from 'commander';
2
+ export declare class CompletionCommand {
3
+ private program;
4
+ constructor();
5
+ private handleCompletion;
6
+ private generateBashCompletion;
7
+ private generateZshCompletion;
8
+ getCommand(): Command;
9
+ }
10
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAU;;IASzB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,sBAAsB;IAsG9B,OAAO,CAAC,qBAAqB;IAuH7B,UAAU,IAAI,OAAO;CAGtB"}
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CompletionCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ class CompletionCommand {
6
+ constructor() {
7
+ this.program = new commander_1.Command('completion')
8
+ .description('Generate shell completion scripts')
9
+ .argument('<shell>', 'Shell type (bash or zsh)')
10
+ .action(this.handleCompletion.bind(this));
11
+ }
12
+ handleCompletion(shell) {
13
+ const normalized = shell.toLowerCase().trim();
14
+ if (normalized === 'bash') {
15
+ console.log(this.generateBashCompletion());
16
+ }
17
+ else if (normalized === 'zsh') {
18
+ console.log(this.generateZshCompletion());
19
+ }
20
+ else {
21
+ console.error(`Unsupported shell: ${shell}`);
22
+ console.error('Supported shells: bash, zsh');
23
+ process.exit(1);
24
+ }
25
+ }
26
+ generateBashCompletion() {
27
+ return `# git-ai-commit bash completion
28
+ # Add to ~/.bashrc or ~/.bash_profile:
29
+ # eval "$(git-ai-commit completion bash)"
30
+
31
+ _git_ai_commit() {
32
+ local cur prev words cword
33
+ _init_completion || return
34
+
35
+ local commands="commit config pr tag history completion"
36
+
37
+ # Global options
38
+ local global_opts="-v --version -h --help"
39
+
40
+ # Command-specific options
41
+ local commit_opts="-k --api-key -b --base-url --model -m --message-only -p --push --prompt --no-verify"
42
+ local config_opts="-s --show -l --language --auto-push --no-auto-push -k --api-key -b --base-url -m --model --mode"
43
+ local pr_opts="--base --compare -k --api-key -b --base-url --model"
44
+ local tag_opts="-k --api-key --base-url -m --model --message -t --base-tag --prompt"
45
+ local history_opts="-l --limit --json --clear"
46
+ local completion_opts=""
47
+
48
+ case "\${cword}" in
49
+ 1)
50
+ COMPREPLY=( \$(compgen -W "\${commands} \${global_opts}" -- "\${cur}") )
51
+ return
52
+ ;;
53
+ esac
54
+
55
+ local cmd="\${words[1]}"
56
+
57
+ case "\${cmd}" in
58
+ commit)
59
+ case "\${prev}" in
60
+ -k|--api-key|-b|--base-url|--model|--prompt)
61
+ return
62
+ ;;
63
+ esac
64
+ COMPREPLY=( \$(compgen -W "\${commit_opts}" -- "\${cur}") )
65
+ ;;
66
+ config)
67
+ case "\${prev}" in
68
+ -l|--language)
69
+ COMPREPLY=( \$(compgen -W "ko en" -- "\${cur}") )
70
+ return
71
+ ;;
72
+ --mode)
73
+ COMPREPLY=( \$(compgen -W "custom openai" -- "\${cur}") )
74
+ return
75
+ ;;
76
+ -k|--api-key|-b|--base-url|-m|--model)
77
+ return
78
+ ;;
79
+ esac
80
+ COMPREPLY=( \$(compgen -W "\${config_opts}" -- "\${cur}") )
81
+ ;;
82
+ pr)
83
+ case "\${prev}" in
84
+ --base|--compare)
85
+ # Complete with git branches
86
+ local branches=\$(git branch --format='%(refname:short)' 2>/dev/null)
87
+ COMPREPLY=( \$(compgen -W "\${branches}" -- "\${cur}") )
88
+ return
89
+ ;;
90
+ -k|--api-key|-b|--base-url|--model)
91
+ return
92
+ ;;
93
+ esac
94
+ COMPREPLY=( \$(compgen -W "\${pr_opts}" -- "\${cur}") )
95
+ ;;
96
+ tag)
97
+ case "\${prev}" in
98
+ -t|--base-tag)
99
+ # Complete with git tags
100
+ local tags=\$(git tag 2>/dev/null)
101
+ COMPREPLY=( \$(compgen -W "\${tags}" -- "\${cur}") )
102
+ return
103
+ ;;
104
+ -k|--api-key|--base-url|-m|--model|--message|--prompt)
105
+ return
106
+ ;;
107
+ esac
108
+ COMPREPLY=( \$(compgen -W "\${tag_opts}" -- "\${cur}") )
109
+ ;;
110
+ history)
111
+ case "\${prev}" in
112
+ -l|--limit)
113
+ return
114
+ ;;
115
+ esac
116
+ COMPREPLY=( \$(compgen -W "\${history_opts}" -- "\${cur}") )
117
+ ;;
118
+ completion)
119
+ COMPREPLY=( \$(compgen -W "bash zsh" -- "\${cur}") )
120
+ ;;
121
+ esac
122
+ }
123
+
124
+ complete -F _git_ai_commit git-ai-commit
125
+ `;
126
+ }
127
+ generateZshCompletion() {
128
+ return `#compdef git-ai-commit
129
+ # git-ai-commit zsh completion
130
+ # Add to ~/.zshrc:
131
+ # eval "$(git-ai-commit completion zsh)"
132
+ # Or save to a file in your $fpath (e.g., ~/.zsh/completions/_git-ai-commit)
133
+
134
+ _git-ai-commit() {
135
+ local -a commands
136
+ commands=(
137
+ 'commit:Generate AI-powered commit message'
138
+ 'config:Manage git-ai-commit configuration'
139
+ 'pr:Generate a pull request title and summary'
140
+ 'tag:Create an annotated git tag with AI-generated notes'
141
+ 'history:Manage git-ai-commit command history'
142
+ 'completion:Generate shell completion scripts'
143
+ )
144
+
145
+ _arguments -C \\
146
+ '-v[output the version number]' \\
147
+ '--version[output the version number]' \\
148
+ '-h[display help]' \\
149
+ '--help[display help]' \\
150
+ '1: :->command' \\
151
+ '*:: :->args'
152
+
153
+ case \$state in
154
+ command)
155
+ _describe -t commands 'git-ai-commit commands' commands
156
+ ;;
157
+ args)
158
+ case \$words[1] in
159
+ commit)
160
+ _arguments \\
161
+ '-k[OpenAI API key]:key:' \\
162
+ '--api-key[OpenAI API key]:key:' \\
163
+ '-b[Custom API base URL]:url:' \\
164
+ '--base-url[Custom API base URL]:url:' \\
165
+ '--model[Model to use]:model:' \\
166
+ '-m[Output only the generated commit message]' \\
167
+ '--message-only[Output only the generated commit message]' \\
168
+ '-p[Push after creating the commit]' \\
169
+ '--push[Push after creating the commit]' \\
170
+ '--prompt[Additional AI prompt instructions]:text:' \\
171
+ '--no-verify[Skip pre-commit hooks]'
172
+ ;;
173
+ config)
174
+ _arguments \\
175
+ '-s[Show current configuration]' \\
176
+ '--show[Show current configuration]' \\
177
+ '-l[Set default language]:language:(ko en)' \\
178
+ '--language[Set default language]:language:(ko en)' \\
179
+ '--auto-push[Enable automatic git push]' \\
180
+ '--no-auto-push[Disable automatic git push]' \\
181
+ '-k[Persist API key]:key:' \\
182
+ '--api-key[Persist API key]:key:' \\
183
+ '-b[Persist API base URL]:url:' \\
184
+ '--base-url[Persist API base URL]:url:' \\
185
+ '-m[Persist default AI model]:model:' \\
186
+ '--model[Persist default AI model]:model:' \\
187
+ '--mode[Persist AI mode]:mode:(custom openai)'
188
+ ;;
189
+ pr)
190
+ _arguments \\
191
+ '--base[Base branch to diff against]:branch:__git_branch_names' \\
192
+ '--compare[Compare branch to describe]:branch:__git_branch_names' \\
193
+ '-k[Override API key]:key:' \\
194
+ '--api-key[Override API key]:key:' \\
195
+ '-b[Override API base URL]:url:' \\
196
+ '--base-url[Override API base URL]:url:' \\
197
+ '--model[Override AI model]:model:'
198
+ ;;
199
+ tag)
200
+ _arguments \\
201
+ '1:tag name:' \\
202
+ '-k[OpenAI API key]:key:' \\
203
+ '--api-key[OpenAI API key]:key:' \\
204
+ '--base-url[Custom API base URL]:url:' \\
205
+ '-m[Model to use]:model:' \\
206
+ '--model[Model to use]:model:' \\
207
+ '--message[Tag message to use directly]:message:' \\
208
+ '-t[Existing tag to diff against]:tag:__git_tags' \\
209
+ '--base-tag[Existing tag to diff against]:tag:__git_tags' \\
210
+ '--prompt[Additional AI prompt instructions]:text:'
211
+ ;;
212
+ history)
213
+ _arguments \\
214
+ '-l[Limit number of entries]:number:' \\
215
+ '--limit[Limit number of entries]:number:' \\
216
+ '--json[Output in JSON format]' \\
217
+ '--clear[Clear all stored history]'
218
+ ;;
219
+ completion)
220
+ _arguments \\
221
+ '1:shell:(bash zsh)'
222
+ ;;
223
+ esac
224
+ ;;
225
+ esac
226
+ }
227
+
228
+ # Helper function to complete git branches
229
+ __git_branch_names() {
230
+ local -a branches
231
+ branches=(\${(f)"\$(git branch --format='%(refname:short)' 2>/dev/null)"})
232
+ _describe -t branches 'branches' branches
233
+ }
234
+
235
+ # Helper function to complete git tags
236
+ __git_tags() {
237
+ local -a tags
238
+ tags=(\${(f)"\$(git tag 2>/dev/null)"})
239
+ _describe -t tags 'tags' tags
240
+ }
241
+
242
+ _git-ai-commit "\$@"
243
+ `;
244
+ }
245
+ getCommand() {
246
+ return this.program;
247
+ }
248
+ }
249
+ exports.CompletionCommand = CompletionCommand;
250
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AAEpC,MAAa,iBAAiB;IAG5B;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,mBAAO,CAAC,YAAY,CAAC;aACrC,WAAW,CAAC,mCAAmC,CAAC;aAChD,QAAQ,CAAC,SAAS,EAAE,0BAA0B,CAAC;aAC/C,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC;IAEO,gBAAgB,CAAC,KAAa;QACpC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAE9C,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAEO,sBAAsB;QAC5B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkGV,CAAC;IACA,CAAC;IAEO,qBAAqB;QAC3B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmHV,CAAC;IACA,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AAxPD,8CAwPC"}
@@ -26,6 +26,10 @@ export declare class GitService {
26
26
  static remoteTagExists(tagName: string): Promise<boolean>;
27
27
  static deleteLocalTag(tagName: string): Promise<boolean>;
28
28
  static deleteRemoteTag(tagName: string): Promise<boolean>;
29
- static forcePushTag(tagName: string): Promise<boolean>;
29
+ static forcePushTag(tagName: string, remote?: string): Promise<boolean>;
30
+ static getRemotes(): Promise<string[]>;
31
+ static pushTagToRemote(tagName: string, remote: string): Promise<boolean>;
32
+ static deleteRemoteTagFrom(tagName: string, remote: string): Promise<boolean>;
33
+ static remoteTagExistsOn(tagName: string, remote: string): Promise<boolean>;
30
34
  }
31
35
  //# sourceMappingURL=git.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/commands/git.ts"],"names":[],"mappings":"AA+EA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,UAAU;WACR,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC;WA6BvC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;WA+BpE,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAU/C,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;WAUxB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAU1C,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC;WAwBrC,uBAAuB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;WAmC5D,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAUtE,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAS5C,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WASlD,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAUjD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAUlD,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAS7D"}
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/commands/git.ts"],"names":[],"mappings":"AA+EA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,UAAU;WACR,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC;WA6BvC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;WA+BpE,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAU/C,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;WAUxB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAU1C,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC;WAwBrC,uBAAuB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;WAmC5D,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAUtE,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAS5C,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WASlD,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAUjD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAUlD,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAW,GAAG,OAAO,CAAC,OAAO,CAAC;WAUlE,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;WAa/B,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAUlE,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAUtE,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQlF"}
@@ -253,13 +253,55 @@ class GitService {
253
253
  return false;
254
254
  }
255
255
  }
256
- static async forcePushTag(tagName) {
256
+ static async forcePushTag(tagName, remote = 'origin') {
257
257
  try {
258
- await execFileAsync('git', ['push', 'origin', tagName, '--force']);
258
+ await execFileAsync('git', ['push', remote, tagName, '--force']);
259
259
  return true;
260
260
  }
261
261
  catch (error) {
262
- console.error('Failed to force push tag to remote:', error instanceof Error ? error.message : error);
262
+ console.error(`Failed to force push tag to ${remote}:`, error instanceof Error ? error.message : error);
263
+ return false;
264
+ }
265
+ }
266
+ static async getRemotes() {
267
+ try {
268
+ const { stdout } = await execAsync('git remote');
269
+ const remotes = stdout
270
+ .split('\n')
271
+ .map(line => line.trim())
272
+ .filter(line => line.length > 0);
273
+ return remotes;
274
+ }
275
+ catch {
276
+ return [];
277
+ }
278
+ }
279
+ static async pushTagToRemote(tagName, remote) {
280
+ try {
281
+ await execFileAsync('git', ['push', remote, tagName]);
282
+ return true;
283
+ }
284
+ catch (error) {
285
+ console.error(`Failed to push tag to ${remote}:`, error instanceof Error ? error.message : error);
286
+ return false;
287
+ }
288
+ }
289
+ static async deleteRemoteTagFrom(tagName, remote) {
290
+ try {
291
+ await execFileAsync('git', ['push', remote, '--delete', tagName]);
292
+ return true;
293
+ }
294
+ catch (error) {
295
+ console.error(`Failed to delete tag from ${remote}:`, error instanceof Error ? error.message : error);
296
+ return false;
297
+ }
298
+ }
299
+ static async remoteTagExistsOn(tagName, remote) {
300
+ try {
301
+ const { stdout } = await execAsync(`git ls-remote --tags ${remote} refs/tags/${tagName}`);
302
+ return stdout.trim().length > 0;
303
+ }
304
+ catch {
263
305
  return false;
264
306
  }
265
307
  }
@@ -1 +1 @@
1
- {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/commands/git.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/commands/git.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;AAC/C,+BAAiC;AAEjC,MAAM,SAAS,GAAG,IAAA,gBAAS,EAAC,oBAAI,CAAC,CAAC;AAClC,MAAM,aAAa,GAAG,IAAA,gBAAS,EAAC,wBAAQ,CAAC,CAAC;AAC1C,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAC7C,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACjC,MAAM,cAAc,GAAG,eAAe,GAAG,sBAAsB,CAAC;AAChE,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAY,EAAE;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,OAAO,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACnC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACpC,CAAC;YACD,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;YACjB,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,OAAe,EAAU,EAAE;IAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IACzF,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,cAAc,CAAC;IAE9D,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;IACrC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxC,SAAS,CAAC,IAAI,CAAC,kBAAkB,OAAO,SAAS,CAAC,CAAC;IACnD,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAU,EAAE;IAClD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAU,EAAE;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACjC,IAAI,KAAK,GAAG,QAAQ,GAAG,cAAc,EAAE,CAAC;YACtC,MAAM;QACR,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,KAAK,IAAI,QAAQ,CAAC;IACpB,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,+CAA+C,eAAe,UAAU,CAAC,CAAC;IACpF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;AAoB7F,MAAa,UAAU;IACrB,MAAM,CAAC,KAAK,CAAC,aAAa;QACxB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE;gBAClE,SAAS,EAAE,mBAAmB;aAC/B,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAElC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBACjB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,2DAA2D;iBACnE,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI;aACL,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;YAClF,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;oBAClC,CAAC,CAAC,yEAAyE;oBAC3E,CAAC,CAAC,OAAO;aACZ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,OAAe;QACtD,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,GAAG,IAAI,MAAM,OAAO,EAAE,CAAC,EAAE;gBAC9E,SAAS,EAAE,mBAAmB;aAC/B,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAElC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBACjB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,gCAAgC,IAAI,QAAQ,OAAO,GAAG;iBAC9D,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI;aACL,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC;YACrF,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;oBAClC,CAAC,CAAC,gEAAgE;oBAClE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC;wBACpC,CAAC,CAAC,0CAA0C,IAAI,OAAO,OAAO,GAAG;wBACjE,CAAC,CAAC,OAAO;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,OAAe;QACvC,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC1F,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI;QACf,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC3F,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAe;QAClC,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC/F,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,YAAY;QACvB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,gCAAgC,CAAC,CAAC;YACrE,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YAE1B,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,kCAAkC;iBAC1C,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,GAAG;aACJ,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,qFAAqF;aAC7F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,GAAY;QAC/C,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,GAAG;gBACpB,CAAC,CAAC,WAAW,GAAG,2BAA2B;gBAC3C,CAAC,CAAC,4BAA4B,CAAC;YAEjC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,MAAM;iBACnB,KAAK,CAAC,IAAI,CAAC;iBACX,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBACxB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAEnC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,GAAG;wBACR,CAAC,CAAC,8BAA8B,GAAG,GAAG;wBACtC,CAAC,CAAC,qCAAqC;iBAC1C,CAAC;YACJ,CAAC;YAED,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEnE,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,GAAG,EAAE,YAAY;aAClB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,gCAAgC;aACjF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,OAAe,EAAE,OAAe;QAC9D,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACvF,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAe;QACpC,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,aAAa,OAAO,EAAE,CAAC,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,OAAe;QAC1C,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,yCAAyC,OAAO,EAAE,CAAC,CAAC;YACvF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,OAAe;QACzC,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC7F,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,OAAe;QAC1C,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;YACpE,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC9F,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,MAAM,GAAG,QAAQ;QAC1D,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,MAAM,GAAG,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACxG,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,UAAU;QACrB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,MAAM;iBACnB,KAAK,CAAC,IAAI,CAAC;iBACX,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBACxB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACnC,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,OAAe,EAAE,MAAc;QAC1D,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,MAAM,GAAG,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAClG,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,OAAe,EAAE,MAAc;QAC9D,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,MAAM,GAAG,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACtG,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAe,EAAE,MAAc;QAC5D,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,wBAAwB,MAAM,cAAc,OAAO,EAAE,CAAC,CAAC;YAC1F,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF;AAzPD,gCAyPC"}
@@ -12,7 +12,7 @@ export declare class TagCommand {
12
12
  constructor();
13
13
  private resolveAIConfig;
14
14
  private handleTag;
15
- private confirmTagPush;
15
+ private selectRemotesForPush;
16
16
  private confirmTagCreate;
17
17
  private confirmTagDelete;
18
18
  private confirmRemoteTagDelete;
@@ -1 +1 @@
1
- {"version":3,"file":"tag.d.ts","sourceRoot":"","sources":["../../src/commands/tag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAU;;IAiBzB,OAAO,CAAC,eAAe;YAoBT,SAAS;YA+OT,cAAc;YAgBd,gBAAgB;YAgBhB,gBAAgB;YAgBhB,sBAAsB;YAgBtB,gBAAgB;IAgB9B,UAAU,IAAI,OAAO;CAGtB"}
1
+ {"version":3,"file":"tag.d.ts","sourceRoot":"","sources":["../../src/commands/tag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAU;;IAiBzB,OAAO,CAAC,eAAe;YAoBT,SAAS;YAwPT,oBAAoB;YA+CpB,gBAAgB;YAgBhB,gBAAgB;YAgBhB,sBAAsB;YAgBtB,gBAAgB;IAgB9B,UAAU,IAAI,OAAO;CAGtB"}
@@ -196,54 +196,63 @@ class TagCommand {
196
196
  return;
197
197
  }
198
198
  console.log(`✅ Tag ${trimmedName} created successfully!`);
199
- const shouldPush = await this.confirmTagPush(trimmedName);
200
- if (shouldPush) {
201
- // If tag was replaced or remote tag still exists, use force push
202
- const needsForcePush = wasTagReplaced || remoteTagExists;
203
- if (needsForcePush) {
204
- console.log(`⚠️ Tag ${trimmedName} exists on remote. Force push is required.`);
205
- const shouldForcePush = await this.confirmForcePush(trimmedName);
206
- if (!shouldForcePush) {
207
- console.log('Tag push cancelled by user.');
208
- await log_1.LogService.append({
209
- command: 'tag',
210
- args: { name: trimmedName, ...options, apiKey: options.apiKey ? '***' : undefined },
211
- status: 'cancelled',
212
- details: 'user declined force push'
213
- });
214
- return;
215
- }
216
- console.log(`Force pushing tag ${trimmedName} to remote...`);
217
- const pushSuccess = await git_1.GitService.forcePushTag(trimmedName);
218
- if (pushSuccess) {
219
- console.log(`✅ Tag ${trimmedName} force pushed successfully!`);
220
- }
221
- else {
222
- console.error('❌ Failed to force push tag to remote');
223
- await log_1.LogService.append({
224
- command: 'tag',
225
- args: { name: trimmedName, ...options, apiKey: options.apiKey ? '***' : undefined },
226
- status: 'failure',
227
- details: 'tag force push failed'
228
- });
229
- process.exit(1);
230
- }
231
- }
232
- else {
233
- console.log(`Pushing tag ${trimmedName} to remote...`);
234
- const pushSuccess = await git_1.GitService.pushTag(trimmedName);
235
- if (pushSuccess) {
236
- console.log(`✅ Tag ${trimmedName} pushed successfully!`);
199
+ // Get available remotes
200
+ const remotes = await git_1.GitService.getRemotes();
201
+ if (remotes.length === 0) {
202
+ console.log('No remotes configured. Skipping push.');
203
+ }
204
+ else {
205
+ const selectedRemotes = await this.selectRemotesForPush(trimmedName, remotes);
206
+ if (selectedRemotes && selectedRemotes.length > 0) {
207
+ // If tag was replaced or remote tag still exists, use force push
208
+ const needsForcePush = wasTagReplaced || remoteTagExists;
209
+ if (needsForcePush) {
210
+ console.log(`\n⚠️ Tag ${trimmedName} may exist on remote. Force push is required.`);
211
+ const shouldForcePush = await this.confirmForcePush(trimmedName);
212
+ if (!shouldForcePush) {
213
+ console.log('Tag push cancelled by user.');
214
+ await log_1.LogService.append({
215
+ command: 'tag',
216
+ args: { name: trimmedName, ...options, apiKey: options.apiKey ? '***' : undefined },
217
+ status: 'cancelled',
218
+ details: 'user declined force push'
219
+ });
220
+ return;
221
+ }
222
+ for (const remote of selectedRemotes) {
223
+ console.log(`Force pushing tag ${trimmedName} to ${remote}...`);
224
+ const pushSuccess = await git_1.GitService.forcePushTag(trimmedName, remote);
225
+ if (pushSuccess) {
226
+ console.log(`✅ Tag ${trimmedName} force pushed to ${remote} successfully!`);
227
+ }
228
+ else {
229
+ console.error(`❌ Failed to force push tag to ${remote}`);
230
+ await log_1.LogService.append({
231
+ command: 'tag',
232
+ args: { name: trimmedName, ...options, apiKey: options.apiKey ? '***' : undefined },
233
+ status: 'failure',
234
+ details: `tag force push to ${remote} failed`
235
+ });
236
+ }
237
+ }
237
238
  }
238
239
  else {
239
- console.error('❌ Failed to push tag to remote');
240
- await log_1.LogService.append({
241
- command: 'tag',
242
- args: { name: trimmedName, ...options, apiKey: options.apiKey ? '***' : undefined },
243
- status: 'failure',
244
- details: 'tag push failed'
245
- });
246
- process.exit(1);
240
+ for (const remote of selectedRemotes) {
241
+ console.log(`Pushing tag ${trimmedName} to ${remote}...`);
242
+ const pushSuccess = await git_1.GitService.pushTagToRemote(trimmedName, remote);
243
+ if (pushSuccess) {
244
+ console.log(`✅ Tag ${trimmedName} pushed to ${remote} successfully!`);
245
+ }
246
+ else {
247
+ console.error(`❌ Failed to push tag to ${remote}`);
248
+ await log_1.LogService.append({
249
+ command: 'tag',
250
+ args: { name: trimmedName, ...options, apiKey: options.apiKey ? '***' : undefined },
251
+ status: 'failure',
252
+ details: `tag push to ${remote} failed`
253
+ });
254
+ }
255
+ }
247
256
  }
248
257
  }
249
258
  }
@@ -253,17 +262,42 @@ class TagCommand {
253
262
  status: 'success'
254
263
  });
255
264
  }
256
- async confirmTagPush(tagName) {
265
+ async selectRemotesForPush(tagName, remotes) {
257
266
  const rl = readline_1.default.createInterface({
258
267
  input: process.stdin,
259
268
  output: process.stdout
260
269
  });
270
+ console.log('\nAvailable remotes:');
271
+ remotes.forEach((remote, index) => {
272
+ console.log(` ${index + 1}. ${remote}`);
273
+ });
274
+ console.log(` all. Push to all remotes`);
275
+ console.log(` n. Skip push`);
261
276
  const answer = await new Promise(resolve => {
262
- rl.question(`Push tag ${tagName} to remote? (y/n): `, resolve);
277
+ rl.question(`\nSelect remote(s) to push tag ${tagName} (e.g., 1 or 1,2 or all or n): `, resolve);
263
278
  });
264
279
  rl.close();
265
280
  const normalized = answer.trim().toLowerCase();
266
- return normalized === 'y' || normalized === 'yes';
281
+ if (normalized === 'n' || normalized === 'no' || normalized === '') {
282
+ return null;
283
+ }
284
+ if (normalized === 'all') {
285
+ return remotes;
286
+ }
287
+ const selections = normalized.split(',').map(s => s.trim());
288
+ const selectedRemotes = [];
289
+ for (const sel of selections) {
290
+ const index = parseInt(sel, 10);
291
+ if (isNaN(index) || index < 1 || index > remotes.length) {
292
+ console.log(`Invalid selection: ${sel}`);
293
+ return null;
294
+ }
295
+ const remote = remotes[index - 1];
296
+ if (!selectedRemotes.includes(remote)) {
297
+ selectedRemotes.push(remote);
298
+ }
299
+ }
300
+ return selectedRemotes.length > 0 ? selectedRemotes : null;
267
301
  }
268
302
  async confirmTagCreate(tagName) {
269
303
  const rl = readline_1.default.createInterface({