@radkode/neo 0.16.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +55 -236
  3. package/dist/cli.d.ts +1 -1
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/cli.js +113 -24
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/git/push/index.d.ts.map +1 -1
  8. package/dist/commands/git/push/index.js +24 -11
  9. package/dist/commands/git/push/index.js.map +1 -1
  10. package/dist/core/plugins/command-registry.d.ts +16 -0
  11. package/dist/core/plugins/command-registry.d.ts.map +1 -0
  12. package/dist/core/plugins/command-registry.js +40 -0
  13. package/dist/core/plugins/command-registry.js.map +1 -0
  14. package/dist/core/plugins/event-bus.d.ts +12 -0
  15. package/dist/core/plugins/event-bus.d.ts.map +1 -0
  16. package/dist/core/plugins/event-bus.js +56 -0
  17. package/dist/core/plugins/event-bus.js.map +1 -0
  18. package/dist/core/plugins/index.d.ts +6 -0
  19. package/dist/core/plugins/index.d.ts.map +1 -0
  20. package/dist/core/plugins/index.js +6 -0
  21. package/dist/core/plugins/index.js.map +1 -0
  22. package/dist/core/plugins/plugin-context.d.ts +3 -0
  23. package/dist/core/plugins/plugin-context.d.ts.map +1 -0
  24. package/dist/core/plugins/plugin-context.js +116 -0
  25. package/dist/core/plugins/plugin-context.js.map +1 -0
  26. package/dist/core/plugins/plugin-loader.d.ts +30 -0
  27. package/dist/core/plugins/plugin-loader.d.ts.map +1 -0
  28. package/dist/core/plugins/plugin-loader.js +149 -0
  29. package/dist/core/plugins/plugin-loader.js.map +1 -0
  30. package/dist/core/plugins/plugin-registry.d.ts +21 -0
  31. package/dist/core/plugins/plugin-registry.d.ts.map +1 -0
  32. package/dist/core/plugins/plugin-registry.js +150 -0
  33. package/dist/core/plugins/plugin-registry.js.map +1 -0
  34. package/dist/types/schemas.d.ts +3 -1
  35. package/dist/types/schemas.d.ts.map +1 -1
  36. package/dist/types/schemas.js +3 -5
  37. package/dist/types/schemas.js.map +1 -1
  38. package/dist/utils/config.d.ts +6 -0
  39. package/dist/utils/config.d.ts.map +1 -1
  40. package/dist/utils/config.js +8 -0
  41. package/dist/utils/config.js.map +1 -1
  42. package/package.json +28 -21
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Jacek Radko
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,306 +1,125 @@
1
- ```
2
- ███╗ ██╗███████╗ ██████╗ ██████╗██╗ ██╗
3
- ████╗ ██║██╔════╝██╔═══██╗ ██╔════╝██║ ██║
4
- ██╔██╗ ██║█████╗ ██║ ██║ ██║ ██║ ██║
5
- ██║╚██╗██║██╔══╝ ██║ ██║ ██║ ██║ ██║
6
- ██║ ╚████║███████╗╚██████╔╝ ╚██████╗███████╗██║
7
- ╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚═════╝╚══════╝╚═╝
8
- ```
9
-
10
1
  <div align="center">
11
2
 
12
- ### Modern CLI toolkit with intelligent git workflows and configuration management
3
+ # Neo CLI
4
+
5
+ **An opinionated CLI that wraps common commands to smooth out paper cuts and speed up your workflow.**
13
6
 
14
7
  [![npm version](https://img.shields.io/npm/v/@radkode/neo.svg)](https://www.npmjs.com/package/@radkode/neo)
15
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
16
9
  [![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue.svg)](https://www.typescriptlang.org/)
17
10
  [![CI](https://github.com/radkode/neo/workflows/CI/badge.svg)](https://github.com/radkode/neo/actions)
18
11
 
19
- Intelligent git operations • Configuration management • Self-updating
20
-
21
12
  </div>
22
13
 
23
14
  ---
24
15
 
25
- ## Features
16
+ ## Why Neo?
17
+
18
+ Daily CLI workflows have friction. Neo wraps familiar commands with sensible defaults and guardrails:
26
19
 
27
- **Smart Git Operations** - Enhanced git commands with safety confirmations
28
- ⚙️ **Configuration Management** - Simple key-value configuration storage
29
- 🛡️ **Branch Protection** - Interactive confirmation for main branch pushes
30
- 🔄 **Self-Updating** - Built-in update command with smart package manager detection
31
- 🎨 **Beautiful UI** - Colorful output with progress indicators and banners
32
- 📦 **Semantic Versioning** - Automated releases with changesets
33
- 🚀 **TypeScript First** - Built with full TypeScript support and type safety
20
+ | Friction | Neo's Solution |
21
+ |----------|----------------|
22
+ | Accidentally pushing to `main` | Interactive confirmation before main branch pushes |
23
+ | Forgetting to pull before pushing | `neo git push` pulls first, then pushes |
24
+ | Typing `git stash && git pull && git stash pop` | `neo git pull` handles it automatically |
25
+ | Managing scattered config files | Unified `neo config` with secure secrets storage |
34
26
 
35
- ## Installation
27
+ Neo doesn't replace your tools—it wraps them with opinions that prevent mistakes and save keystrokes.
28
+
29
+ ## Install
36
30
 
37
31
  ```bash
38
- # Install globally
39
32
  npm install -g @radkode/neo
40
- # or with pnpm
33
+ # or
41
34
  pnpm add -g @radkode/neo
42
35
  ```
43
36
 
44
37
  ## Quick Start
45
38
 
46
39
  ```bash
47
- # Display help and available commands
48
- neo --help
49
-
50
- # Initialize Neo CLI configuration
51
- neo init
52
-
53
- # Check for updates
54
- neo update --check-only
55
-
56
- # Configure a setting
57
- neo config set editor.default "code"
58
-
59
- # Smart git push with main branch protection
60
- neo git push
61
-
62
- # View current configuration
63
- neo config list
40
+ neo --help # See all commands
41
+ neo git push # Smart push with main branch protection
42
+ neo git pull # Auto-stash, pull, pop
43
+ neo config list # View your configuration
64
44
  ```
65
45
 
66
- ## Demo
46
+ ## Commands
67
47
 
68
- ### Smart Git Push Protection
48
+ ### `neo git push`
69
49
 
70
- When attempting to push to the main branch, Neo intelligently prompts for confirmation:
50
+ Pulls before pushing. Prompts for confirmation on `main`.
71
51
 
72
52
  ```bash
73
- $ neo git push
74
-
75
- NEO CLI
76
- Radkode's Lightning-Fast CLI Framework
77
-
78
- ⚠️ You are about to push directly to the main branch.
79
- This is generally not recommended as it bypasses code review processes.
80
- ✔ Are you sure you want to continue? » No
81
-
82
- ✅ Push cancelled. Here's how to push your changes safely:
83
- 1. Create a feature branch: git checkout -b feature/your-feature-name
84
- 2. Push to your branch: git push -u origin feature/your-feature-name
85
- 3. Create a pull request to merge into main
86
-
87
- This protects the main branch from accidental changes.
53
+ neo git push # Safe push (confirms on main)
54
+ neo git push --force # Force push
55
+ neo git push --tags # Include tags
88
56
  ```
89
57
 
90
- ### Beautiful Configuration Management
91
-
92
- ```bash
93
- $ neo config set theme.primary "#00ff88"
94
- ✨ Configuration saved: theme.primary = "#00ff88"
58
+ ### `neo git pull`
95
59
 
96
- $ neo config list
97
- 📝 Your Configuration:
98
-
99
- 🎨 theme.primary "#00ff88"
100
- 💻 editor.default "code"
101
- 🚀 workflow.auto true
102
- ```
103
-
104
- ## Commands
105
-
106
- ### `init`
107
-
108
- Install and configure Neo CLI globally.
60
+ Stashes uncommitted changes, pulls, and restores your work.
109
61
 
110
62
  ```bash
111
- neo init
63
+ neo git pull # Auto-stash and pull
64
+ neo git pull --rebase # Pull with rebase
112
65
  ```
113
66
 
114
- Options:
115
-
116
- - `--force` - Force reconfiguration if already initialized
117
- - `--skip-install` - Skip global installation (configuration only)
118
-
119
- ### `config`
67
+ ### `neo git stash`
120
68
 
121
- Manage configuration values with simple key-value storage.
69
+ Simplified stash management.
122
70
 
123
71
  ```bash
124
- # Set a configuration value
125
- neo config set api.key "your-api-key"
126
-
127
- # Get a configuration value
128
- neo config get api.key
129
-
130
- # List all configuration values
131
- neo config list
72
+ neo git stash # Stash changes
73
+ neo git stash pop # Pop latest stash
74
+ neo git stash list # List stashes
132
75
  ```
133
76
 
134
- Subcommands:
135
-
136
- - `config get <key>` - Get a configuration value
137
- - `config set <key> <value>` - Set a configuration value
138
- - `config list` - List all configuration values
139
-
140
- ### `git`
141
-
142
- Enhanced git operations with safety features.
77
+ ### `neo config`
143
78
 
144
- #### `git push`
145
-
146
- Smart git push with main branch protection.
79
+ Key-value configuration with secure secrets storage.
147
80
 
148
81
  ```bash
149
- # Regular push (prompts for confirmation on main branch)
150
- neo git push
151
-
152
- # Force push (use with caution)
153
- neo git push --force
154
-
155
- # Dry run to see what would be pushed
156
- neo git push --dry-run
157
-
158
- # Push and set upstream branch
159
- neo git push --set-upstream origin feature-branch
160
-
161
- # Push with tags
162
- neo git push --tags
82
+ neo config set key value # Set a value
83
+ neo config get key # Get a value
84
+ neo config list # List all values
163
85
  ```
164
86
 
165
- Options:
87
+ ### `neo update`
166
88
 
167
- - `-f, --force` - Force push (overwrites remote)
168
- - `-u, --set-upstream <branch>` - Set upstream branch
169
- - `--dry-run` - Show what would be pushed without actually pushing
170
- - `--tags` - Push tags along with commits
171
-
172
- **Safety Features:**
173
-
174
- - ⚠️ Interactive confirmation when pushing to main branch
175
- - 📝 Helpful guidance for safer alternatives
176
- - ✅ Graceful cancellation (exits with success code)
177
- - 🎯 Encourages best practices while allowing flexibility
178
-
179
- ### `update`
180
-
181
- Update Neo CLI to the latest version from npm.
89
+ Self-update with your detected package manager.
182
90
 
183
91
  ```bash
184
- # Update to the latest version (with confirmation)
185
- neo update
186
-
187
- # Check for updates without installing
188
- neo update --check-only
189
-
190
- # Force update/reinstall even if on latest version
191
- neo update --force
92
+ neo update # Update to latest
93
+ neo update --check-only # Check for updates
192
94
  ```
193
95
 
194
- Options:
195
-
196
- - `--check-only` - Only check for updates without installing
197
- - `--force` - Force update even if already on latest version
198
-
199
- **Features:**
200
-
201
- - 🔍 Automatic version checking against npm registry
202
- - 📦 Smart package manager detection (npm, pnpm, yarn)
203
- - ✨ Interactive confirmation before updating
204
- - 🎯 Helpful error messages for permission issues
205
- - ⚡ Progress indicators with real-time status
206
-
207
96
  ## Global Options
208
97
 
209
- - `-v, --verbose` - Enable verbose logging
210
- - `-c, --config <path>` - Path to config file
211
- - `--no-color` - Disable colored output
212
- - `--no-banner` - Hide banner
213
- - `-h, --help` - Display help
214
- - `-V, --version` - Display version
98
+ ```
99
+ -v, --verbose Verbose output
100
+ --no-color Disable colors
101
+ --no-banner Hide banner
102
+ -h, --help Show help
103
+ -V, --version Show version
104
+ ```
215
105
 
216
106
  ## Development
217
107
 
218
- ### Setup
219
-
220
108
  ```bash
221
109
  git clone https://github.com/radkode/neo.git
222
110
  cd neo
223
111
  pnpm install
224
- ```
225
-
226
- ### Build
227
-
228
- ```bash
229
112
  pnpm run build
230
- ```
231
-
232
- ### Test
233
-
234
- ```bash
235
113
  pnpm test
236
- pnpm run test:watch
237
- pnpm run test:coverage
238
- ```
239
114
 
240
- ### Local Development
241
-
242
- ```bash
243
- # Link for local testing
115
+ # Local testing
244
116
  pnpm run link-local
245
-
246
- # Test the CLI
247
117
  neo --help
248
-
249
- # Unlink when done
250
118
  pnpm run unlink-local
251
119
  ```
252
120
 
253
- ### Versioning & Releases
254
-
255
- This project uses [Changesets](https://github.com/changesets/changesets) for version management and publishing.
256
-
257
- #### Creating a Changeset
258
-
259
- When you make changes that should be released, create a changeset:
260
-
261
- ```bash
262
- # Create a new changeset
263
- pnpm changeset
264
- ```
265
-
266
- This will:
267
-
268
- 1. Prompt you to select which packages to version (this project has one)
269
- 2. Ask for the type of change (patch, minor, major)
270
- 3. Request a description of the changes
271
- 4. Generate a changeset file in `.changeset/`
272
-
273
- #### Release Workflow
274
-
275
- ```bash
276
- # Check current changeset status
277
- pnpm changeset:status
278
-
279
- # Consume changesets and update version
280
- pnpm version-packages
281
-
282
- # Publish to npm (after tests pass)
283
- pnpm release
284
- ```
285
-
286
- #### Change Types
287
-
288
- - **patch**: Bug fixes, small improvements (0.1.0 → 0.1.1)
289
- - **minor**: New features, enhancements (0.1.0 → 0.2.0)
290
- - **major**: Breaking changes (0.1.0 → 1.0.0)
291
-
292
- #### CI Integration
293
-
294
- The changeset workflow integrates with:
295
-
296
- - GitHub releases and changelogs
297
- - Automated version bumping
298
- - NPM publishing pipeline
121
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for more details.
299
122
 
300
123
  ## License
301
124
 
302
- MIT © Jacek Radko
303
-
304
- ---
305
-
306
- Built with ⚡ by [Radkode](https://github.com/jacekradko)
125
+ [MIT](LICENSE) © Jacek Radko
package/dist/cli.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import { Command } from '@commander-js/extra-typings';
2
- export declare function createCLI(): Command;
2
+ export declare function createCLI(): Promise<Command>;
3
3
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAWtD,wBAAgB,SAAS,IAAI,OAAO,CAkEnC"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAgBtD,wBAAsB,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAkJlD"}
package/dist/cli.js CHANGED
@@ -6,8 +6,11 @@ import { registerCommands } from './commands/index.js';
6
6
  import { configManager } from './utils/config.js';
7
7
  import { notifyIfCliUpdateAvailable } from './utils/update-check.js';
8
8
  import { Colors } from './utils/ui-types.js';
9
+ import { pluginRegistry, commandRegistry } from './core/plugins/index.js';
10
+ import { success } from './core/errors/index.js';
9
11
  import packageJson from '../package.json' with { type: 'json' };
10
- export function createCLI() {
12
+ let pluginsLoaded = false;
13
+ export async function createCLI() {
11
14
  const program = new Command();
12
15
  program
13
16
  .name('neo')
@@ -47,36 +50,122 @@ export function createCLI() {
47
50
  if (!isHelpOrVersion) {
48
51
  await notifyIfCliUpdateAvailable();
49
52
  }
53
+ if (pluginsLoaded) {
54
+ await pluginRegistry.executeBeforeCommand(commandName, opts);
55
+ }
56
+ })
57
+ .hook('postAction', async (_thisCommand, actionCommand) => {
58
+ const commandName = actionCommand.name();
59
+ if (pluginsLoaded) {
60
+ await pluginRegistry.executeAfterCommand(commandName, success(undefined));
61
+ }
50
62
  });
51
63
  registerCommands(program);
52
- return program;
53
- }
54
- if (import.meta.url === `file://${process.argv[1]}` || process.argv[1]?.endsWith('cli.js')) {
55
- const program = createCLI();
56
- if (process.argv.length <= 2) {
57
- program.help();
58
- }
59
- program.exitOverride();
60
64
  try {
61
- program.parse();
62
- }
63
- catch (err) {
64
- if (err && typeof err === 'object' && 'code' in err) {
65
- if (err.code === 'commander.helpDisplayed' || err.code === 'commander.help') {
66
- process.exit(0);
65
+ const config = await configManager.read();
66
+ const pluginsEnabled = config.plugins?.enabled !== false;
67
+ if (pluginsEnabled) {
68
+ const disabledPlugins = config.plugins?.disabled ?? [];
69
+ await pluginRegistry.loadPlugins(disabledPlugins);
70
+ pluginsLoaded = true;
71
+ for (const command of commandRegistry.getAll()) {
72
+ const cmd = new Command(command.name);
73
+ cmd.description(command.description);
74
+ if (command.options) {
75
+ for (const opt of command.options) {
76
+ if (opt.required) {
77
+ cmd.requiredOption(opt.flags, opt.description, opt.defaultValue);
78
+ }
79
+ else {
80
+ cmd.option(opt.flags, opt.description, opt.defaultValue);
81
+ }
82
+ }
83
+ }
84
+ if (command.arguments) {
85
+ for (const arg of command.arguments) {
86
+ if (arg.required) {
87
+ cmd.argument(`<${arg.name}>`, arg.description);
88
+ }
89
+ else {
90
+ cmd.argument(`[${arg.name}]`, arg.description);
91
+ }
92
+ }
93
+ }
94
+ cmd.action(async (...args) => {
95
+ const opts = args[args.length - 2];
96
+ const cmdArgs = args.slice(0, -2);
97
+ if (command.validate && !command.validate(opts)) {
98
+ logger.error(`Invalid options for command "${command.name}"`);
99
+ process.exit(1);
100
+ }
101
+ const result = await command.execute(opts, cmdArgs);
102
+ if (!result.success) {
103
+ logger.error(result.error.message);
104
+ process.exit(1);
105
+ }
106
+ });
107
+ program.addCommand(cmd);
108
+ logger.debug(`Registered plugin command: ${command.name}`);
67
109
  }
68
- if (err.code === 'commander.version') {
69
- process.exit(0);
110
+ if (pluginRegistry.size > 0) {
111
+ logger.debug(`Loaded ${pluginRegistry.size} plugin(s)`);
70
112
  }
71
- if (err.code === 'commander.missingArgument' || err.code === 'commander.unknownCommand') {
72
- console.error(`\n${chalk.hex(Colors.error)('Error:')} ${err instanceof Error ? err.message : String(err)}`);
73
- console.log(`\nRun ${chalk.hex(Colors.primary)('neo --help')} for usage information.`);
74
- process.exit(1);
113
+ }
114
+ }
115
+ catch (error) {
116
+ logger.debug(`Plugin loading failed: ${error}`);
117
+ }
118
+ return program;
119
+ }
120
+ async function cleanup(code) {
121
+ if (pluginsLoaded) {
122
+ await pluginRegistry.executeOnExit(code);
123
+ await pluginRegistry.disposeAll();
124
+ }
125
+ }
126
+ if (import.meta.url === `file://${process.argv[1]}` || process.argv[1]?.endsWith('cli.js')) {
127
+ process.on('beforeExit', async (code) => {
128
+ await cleanup(code);
129
+ });
130
+ process.on('SIGINT', async () => {
131
+ await cleanup(130);
132
+ process.exit(130);
133
+ });
134
+ process.on('SIGTERM', async () => {
135
+ await cleanup(143);
136
+ process.exit(143);
137
+ });
138
+ createCLI()
139
+ .then((program) => {
140
+ if (process.argv.length <= 2) {
141
+ program.help();
142
+ }
143
+ program.exitOverride();
144
+ try {
145
+ program.parse();
146
+ }
147
+ catch (err) {
148
+ if (err && typeof err === 'object' && 'code' in err) {
149
+ if (err.code === 'commander.helpDisplayed' || err.code === 'commander.help') {
150
+ process.exit(0);
151
+ }
152
+ if (err.code === 'commander.version') {
153
+ process.exit(0);
154
+ }
155
+ if (err.code === 'commander.missingArgument' || err.code === 'commander.unknownCommand') {
156
+ console.error(`\n${chalk.hex(Colors.error)('Error:')} ${err instanceof Error ? err.message : String(err)}`);
157
+ console.log(`\nRun ${chalk.hex(Colors.primary)('neo --help')} for usage information.`);
158
+ process.exit(1);
159
+ }
75
160
  }
161
+ const errorMessage = err instanceof Error ? err.message : String(err);
162
+ logger.error(errorMessage);
163
+ process.exit(1);
76
164
  }
77
- const errorMessage = err instanceof Error ? err.message : String(err);
78
- logger.error(errorMessage);
165
+ })
166
+ .catch((err) => {
167
+ logger.error(`CLI initialization failed: ${err}`);
79
168
  process.exit(1);
80
- }
169
+ });
81
170
  }
82
171
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAGhE,IAAI,aAAa,GAAG,KAAK,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,KAAK,CAAC;SACX,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC;SACpC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;SAC5B,MAAM,CAAC,eAAe,EAAE,wBAAwB,CAAC;SACjD,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;SACpD,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC;SAC9C,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC;SACpC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,EAAE;QACtD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;QAQzC,MAAM,eAAe,GACnB,WAAW,KAAK,SAAS;YACzB,WAAW,KAAK,MAAM;YACtB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAG9B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,sBAAsB,WAAW,EAAE,CAAC,CAAC;QACpD,CAAC;QAGD,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACzB,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;QAClB,CAAC;QAGD,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAE9C,IAAI,UAAU,GAAe,MAAM,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;gBAC1C,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC;YACzC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAEf,MAAM,CAAC,KAAK,CAAC,gDAAgD,KAAK,EAAE,CAAC,CAAC;YACxE,CAAC;YAGD,aAAa,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;QAGD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,0BAA0B,EAAE,CAAC;QACrC,CAAC;QAGD,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,cAAc,CAAC,oBAAoB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,CAAC;SACD,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE;QACxD,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;QAGzC,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,cAAc,CAAC,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC,CAAC,CAAC;IAGL,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAG1B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;QAC1C,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,KAAK,KAAK,CAAC;QAEzD,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC;YACvD,MAAM,cAAc,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;YAClD,aAAa,GAAG,IAAI,CAAC;YAGrB,KAAK,MAAM,OAAO,IAAI,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC/C,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACtC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBAGrC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBACpB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;wBAClC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;4BACjB,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,YAAsB,CAAC,CAAC;wBAC7E,CAAC;6BAAM,CAAC;4BACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,YAAsB,CAAC,CAAC;wBACrE,CAAC;oBACH,CAAC;gBACH,CAAC;gBAGD,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;oBACtB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;wBACpC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;4BACjB,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;wBACjD,CAAC;6BAAM,CAAC;4BACN,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;wBACjD,CAAC;oBACH,CAAC;gBACH,CAAC;gBAGD,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;oBACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAY,CAAC;oBAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAa,CAAC;oBAE9C,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;wBAChD,MAAM,CAAC,KAAK,CAAC,gCAAgC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;wBAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;oBAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBACpD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;wBACpB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACxB,MAAM,CAAC,KAAK,CAAC,8BAA8B,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7D,CAAC;YAED,IAAI,cAAc,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,CAAC,KAAK,CAAC,UAAU,cAAc,CAAC,IAAI,YAAY,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;IAElD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAGD,KAAK,UAAU,OAAO,CAAC,IAAY;IACjC,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,cAAc,CAAC,UAAU,EAAE,CAAC;IACpC,CAAC;AACH,CAAC;AAGD,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IAE3F,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAGH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAGH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,SAAS,EAAE;SACR,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QAEhB,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,CAAC;QAED,OAAO,CAAC,YAAY,EAAE,CAAC;QAEvB,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;gBAEpD,IAAI,GAAG,CAAC,IAAI,KAAK,yBAAyB,IAAI,GAAG,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;oBAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAGD,IAAI,GAAG,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;oBACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAGD,IAAI,GAAG,CAAC,IAAI,KAAK,2BAA2B,IAAI,GAAG,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;oBACxF,OAAO,CAAC,KAAK,CACX,KAAK,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC7F,CAAC;oBACF,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC;oBACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACb,MAAM,CAAC,KAAK,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/git/push/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAQtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,KAAK,MAAM,EAA+B,MAAM,wBAAwB,CAAC;AAclF,wBAAsB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CA4JhF;AA4ED,wBAAgB,iBAAiB,IAAI,OAAO,CAqC3C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/git/push/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAQtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,KAAK,MAAM,EAA+B,MAAM,wBAAwB,CAAC;AAclF,wBAAsB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAiKhF;AAkFD,wBAAgB,iBAAiB,IAAI,OAAO,CA8C3C"}
@@ -40,8 +40,12 @@ export async function executePush(options) {
40
40
  ui.step('Proceeding with push to main branch');
41
41
  }
42
42
  spinner.start();
43
+ const remoteName = options.remote || 'origin';
44
+ const targetBranch = options.branch || branchName;
43
45
  logger.debug(`Force push: ${options.force || false}`);
44
- logger.debug(`Set upstream: ${options.setUpstream || 'none'}`);
46
+ logger.debug(`Set upstream: ${options.setUpstream || false}`);
47
+ logger.debug(`Remote: ${remoteName}`);
48
+ logger.debug(`Target branch: ${targetBranch}`);
45
49
  logger.debug(`Dry run: ${options.dryRun || false}`);
46
50
  logger.debug(`Push tags: ${options.tags || false}`);
47
51
  if (options.dryRun) {
@@ -75,11 +79,9 @@ export async function executePush(options) {
75
79
  pushArgs.push('--tags');
76
80
  }
77
81
  if (options.setUpstream) {
78
- pushArgs.push('-u', 'origin', options.setUpstream);
79
- }
80
- else {
81
- pushArgs.push('origin', branchName);
82
+ pushArgs.push('-u');
82
83
  }
84
+ pushArgs.push(remoteName, targetBranch);
83
85
  logger.debug(`Executing: git ${pushArgs.join(' ')}`);
84
86
  const pushResult = await execa('git', pushArgs, {
85
87
  stdio: 'pipe',
@@ -90,7 +92,7 @@ export async function executePush(options) {
90
92
  ui.muted(pushResult.stdout);
91
93
  }
92
94
  if (options.setUpstream) {
93
- ui.info(`Set upstream branch: ${options.setUpstream}`);
95
+ ui.info(`Set upstream branch: ${remoteName}/${targetBranch}`);
94
96
  }
95
97
  return success(undefined);
96
98
  }
@@ -155,7 +157,9 @@ async function handlePullRebase(branchName, pushArgs, options) {
155
157
  ui.muted(retryResult.stdout);
156
158
  }
157
159
  if (options.setUpstream) {
158
- ui.info(`Set upstream branch: ${options.setUpstream}`);
160
+ const remoteName = pushArgs[pushArgs.length - 2];
161
+ const targetBranch = pushArgs[pushArgs.length - 1];
162
+ ui.info(`Set upstream branch: ${remoteName}/${targetBranch}`);
159
163
  }
160
164
  return success(undefined);
161
165
  }
@@ -183,7 +187,9 @@ async function handleForcePush(pushArgs, options) {
183
187
  ui.muted(forceResult.stdout);
184
188
  }
185
189
  if (options.setUpstream) {
186
- ui.info(`Set upstream branch: ${options.setUpstream}`);
190
+ const remoteName = pushArgs[pushArgs.length - 2];
191
+ const targetBranch = pushArgs[pushArgs.length - 1];
192
+ ui.info(`Set upstream branch: ${remoteName}/${targetBranch}`);
187
193
  }
188
194
  return success(undefined);
189
195
  }
@@ -196,14 +202,21 @@ export function createPushCommand() {
196
202
  const command = new Command('push');
197
203
  command
198
204
  .description('Push changes to remote repository')
205
+ .argument('[remote]', 'remote name (default: origin)')
206
+ .argument('[branch]', 'branch name (default: current branch)')
199
207
  .option('-f, --force', 'force push (overwrites remote)')
200
- .option('-u, --set-upstream <branch>', 'set upstream branch')
208
+ .option('-u, --set-upstream', 'set upstream tracking reference')
201
209
  .option('--dry-run', 'show what would be pushed without actually pushing')
202
210
  .option('--tags', 'push tags along with commits')
203
- .action(async (options) => {
211
+ .action(async (remote, branch, options) => {
212
+ const mergedOptions = {
213
+ ...options,
214
+ remote,
215
+ branch,
216
+ };
204
217
  let validatedOptions;
205
218
  try {
206
- validatedOptions = validate(gitPushOptionsSchema, options, 'git push options');
219
+ validatedOptions = validate(gitPushOptionsSchema, mergedOptions, 'git push options');
207
220
  }
208
221
  catch (error) {
209
222
  if (isValidationError(error)) {