vibecodingmachine-cli 2026.3.10-1807 → 2026.3.14-1528
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 +85 -85
- package/bin/vibecodingmachine.js +3 -0
- package/package.json +4 -3
- package/scripts/postinstall.js +161 -161
- package/src/commands/auth.js +100 -100
- package/src/commands/auto-direct.js +16 -5
- package/src/commands/auto-execution.js +25 -0
- package/src/commands/auto-requirement-management.js +8 -8
- package/src/commands/auto-status-helpers.js +5 -3
- package/src/commands/computers.js +318 -318
- package/src/commands/feature.js +123 -123
- package/src/commands/locale.js +72 -72
- package/src/commands/repo.js +163 -163
- package/src/commands/setup.js +93 -93
- package/src/commands/sync.js +287 -287
- package/src/index.js +5 -5
- package/src/utils/agent-selector.js +50 -50
- package/src/utils/asset-cleanup.js +60 -60
- package/src/utils/auto-mode-ansi-ui.js +237 -237
- package/src/utils/auto-mode-simple-ui.js +141 -141
- package/src/utils/copy-with-progress.js +167 -167
- package/src/utils/download-with-progress.js +84 -84
- package/src/utils/keyboard-handler.js +153 -153
- package/src/utils/kiro-installer.js +178 -178
- package/src/utils/logger.js +4 -4
- package/src/utils/persistent-header.js +114 -114
- package/src/utils/prompt-helper.js +63 -63
- package/src/utils/provider-checker/agent-checker.js +25 -1
- package/src/utils/provider-checker/agent-runner.js +115 -37
- package/src/utils/provider-checker/agents-manager.js +210 -0
- package/src/utils/provider-checker/provider-validator.js +5 -49
- package/src/utils/provider-checker/requirements-manager.js +86 -65
- package/src/utils/provider-checker/test-requirements.js +25 -17
- package/src/utils/status-card.js +121 -121
- package/src/utils/stdout-interceptor.js +127 -127
- package/src/utils/user-tracking.js +299 -299
package/README.md
CHANGED
|
@@ -1,85 +1,85 @@
|
|
|
1
|
-
# Vibe Coding Machine CLI
|
|
2
|
-
|
|
3
|
-
Vibe Coding Machine command-line interface for managing repositories, auto mode, requirements, IDE actions, and status.
|
|
4
|
-
|
|
5
|
-
## Install
|
|
6
|
-
|
|
7
|
-
From the monorepo root:
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
npm install
|
|
11
|
-
# optional: link locally for global access
|
|
12
|
-
npm run --workspaces --if-present build
|
|
13
|
-
npm link ./packages/cli
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
Then run `vibecodingmachine` or `vcm` (short version).
|
|
17
|
-
|
|
18
|
-
**Note**: The `vcm` shortcut will only be installed if you don't already have another `vcm` command on your system. If a conflict is detected, you can still use the full `vibecodingmachine` command.
|
|
19
|
-
|
|
20
|
-
## Usage
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
vibecodingmachine --help # or: vcm --help (if installed)
|
|
24
|
-
vibecodingmachine -v # or: vcm -v (if installed)
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
**Note**: You can use either `vibecodingmachine` or `vcm` - they're the same command!
|
|
28
|
-
|
|
29
|
-
### Repository
|
|
30
|
-
```bash
|
|
31
|
-
vcm repo:init # initialize .vibecodingmachine in CWD and set repo
|
|
32
|
-
vcm repo:set /path/to/repo # set active repository
|
|
33
|
-
vcm repo:get # print current repo path
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
### Auto Mode
|
|
37
|
-
```bash
|
|
38
|
-
vcm auto:start --ide cursor --max-chats 10
|
|
39
|
-
vcm auto:status
|
|
40
|
-
vcm auto:config --max-chats 25 --never-stop
|
|
41
|
-
vcm auto:stop
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
### Requirements
|
|
45
|
-
```bash
|
|
46
|
-
vcm req:list
|
|
47
|
-
vcm req:add "Build initial CLI MVP"
|
|
48
|
-
vcm req:current
|
|
49
|
-
vcm req:next
|
|
50
|
-
vcm req:edit
|
|
51
|
-
vcm req:watch
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### IDE
|
|
55
|
-
```bash
|
|
56
|
-
vcm ide:list
|
|
57
|
-
vcm ide:open cursor # or vscode, windsurf
|
|
58
|
-
vcm ide:send "Summarize failures" -i cursor
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
### Status
|
|
62
|
-
```bash
|
|
63
|
-
vcm status
|
|
64
|
-
vcm progress
|
|
65
|
-
vcm logs -n 100
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### Interactive
|
|
69
|
-
```bash
|
|
70
|
-
vcm interactive
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
## Configuration
|
|
74
|
-
- Stored at `~/.config/vibecodingmachine/config.json` by default
|
|
75
|
-
- Override for testing with env var `VIBECODINGMACHINE_CONFIG_PATH=/tmp/your-test-config.json`
|
|
76
|
-
|
|
77
|
-
## Development
|
|
78
|
-
```bash
|
|
79
|
-
# format and lint
|
|
80
|
-
npm run -w @vibecodingmachine/cli format
|
|
81
|
-
npm run -w @vibecodingmachine/cli lint
|
|
82
|
-
|
|
83
|
-
# tests
|
|
84
|
-
npm run -w @vibecodingmachine/cli test
|
|
85
|
-
```
|
|
1
|
+
# Vibe Coding Machine CLI
|
|
2
|
+
|
|
3
|
+
Vibe Coding Machine command-line interface for managing repositories, auto mode, requirements, IDE actions, and status.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
From the monorepo root:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install
|
|
11
|
+
# optional: link locally for global access
|
|
12
|
+
npm run --workspaces --if-present build
|
|
13
|
+
npm link ./packages/cli
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Then run `vibecodingmachine` or `vcm` (short version).
|
|
17
|
+
|
|
18
|
+
**Note**: The `vcm` shortcut will only be installed if you don't already have another `vcm` command on your system. If a conflict is detected, you can still use the full `vibecodingmachine` command.
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
vibecodingmachine --help # or: vcm --help (if installed)
|
|
24
|
+
vibecodingmachine -v # or: vcm -v (if installed)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Note**: You can use either `vibecodingmachine` or `vcm` - they're the same command!
|
|
28
|
+
|
|
29
|
+
### Repository
|
|
30
|
+
```bash
|
|
31
|
+
vcm repo:init # initialize .vibecodingmachine in CWD and set repo
|
|
32
|
+
vcm repo:set /path/to/repo # set active repository
|
|
33
|
+
vcm repo:get # print current repo path
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Auto Mode
|
|
37
|
+
```bash
|
|
38
|
+
vcm auto:start --ide cursor --max-chats 10
|
|
39
|
+
vcm auto:status
|
|
40
|
+
vcm auto:config --max-chats 25 --never-stop
|
|
41
|
+
vcm auto:stop
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Requirements
|
|
45
|
+
```bash
|
|
46
|
+
vcm req:list
|
|
47
|
+
vcm req:add "Build initial CLI MVP"
|
|
48
|
+
vcm req:current
|
|
49
|
+
vcm req:next
|
|
50
|
+
vcm req:edit
|
|
51
|
+
vcm req:watch
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### IDE
|
|
55
|
+
```bash
|
|
56
|
+
vcm ide:list
|
|
57
|
+
vcm ide:open cursor # or vscode, windsurf
|
|
58
|
+
vcm ide:send "Summarize failures" -i cursor
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Status
|
|
62
|
+
```bash
|
|
63
|
+
vcm status
|
|
64
|
+
vcm progress
|
|
65
|
+
vcm logs -n 100
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Interactive
|
|
69
|
+
```bash
|
|
70
|
+
vcm interactive
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Configuration
|
|
74
|
+
- Stored at `~/.config/vibecodingmachine/config.json` by default
|
|
75
|
+
- Override for testing with env var `VIBECODINGMACHINE_CONFIG_PATH=/tmp/your-test-config.json`
|
|
76
|
+
|
|
77
|
+
## Development
|
|
78
|
+
```bash
|
|
79
|
+
# format and lint
|
|
80
|
+
npm run -w @vibecodingmachine/cli format
|
|
81
|
+
npm run -w @vibecodingmachine/cli lint
|
|
82
|
+
|
|
83
|
+
# tests
|
|
84
|
+
npm run -w @vibecodingmachine/cli test
|
|
85
|
+
```
|
package/bin/vibecodingmachine.js
CHANGED
|
@@ -23,6 +23,8 @@ const { initializeEnvironment } = require('./init/environment-setup');
|
|
|
23
23
|
const { configureCli, setupBasicCommands, setupRequirementsCommands, setupFeatureAndIdeCommands, setupStatusCommands, setupAuthCommands, setupComputerCommands, setupSyncCommands } = require('./config/cli-config');
|
|
24
24
|
const { setupAgentCommands } = require('./commands/agent-commands');
|
|
25
25
|
const { setupRuiCommands } = require('./commands/rui-commands');
|
|
26
|
+
const { setupAutoCommands } = require('./commands/auto-commands');
|
|
27
|
+
const autoCommands = require('../src/commands/auto');
|
|
26
28
|
const { checkForUpdates } = require('./update/update-checker');
|
|
27
29
|
const { setupInteractiveAuth, setupCommandAuth } = require('./auth/auth-compliance');
|
|
28
30
|
|
|
@@ -37,6 +39,7 @@ setupComputerCommands({ t });
|
|
|
37
39
|
setupSyncCommands({ t });
|
|
38
40
|
setupAgentCommands({ t });
|
|
39
41
|
setupRuiCommands({ t });
|
|
42
|
+
setupAutoCommands(autoCommands);
|
|
40
43
|
|
|
41
44
|
// Start interactive mode if no command provided (check BEFORE parsing)
|
|
42
45
|
if (!process.argv.slice(2).length) {
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vibecodingmachine-cli",
|
|
3
|
-
"version": "2026.03.
|
|
3
|
+
"version": "2026.03.14-1528",
|
|
4
4
|
"description": "Command-line interface for Vibe Coding Machine - Autonomous development",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"bin": {
|
|
7
|
-
"vibecodingmachine": "./bin/vibecodingmachine.js"
|
|
7
|
+
"vibecodingmachine": "./bin/vibecodingmachine.js",
|
|
8
|
+
"vcm": "./bin/vibecodingmachine.js"
|
|
8
9
|
},
|
|
9
10
|
"files": [
|
|
10
11
|
"bin/**/*.js",
|
|
@@ -59,7 +60,7 @@
|
|
|
59
60
|
"react": "^19.2.0",
|
|
60
61
|
"screenshot-desktop": "^1.15.3",
|
|
61
62
|
"table": "^6.8.1",
|
|
62
|
-
"vibecodingmachine-core": "^2026.03.
|
|
63
|
+
"vibecodingmachine-core": "^2026.03.14-1528"
|
|
63
64
|
},
|
|
64
65
|
"devDependencies": {
|
|
65
66
|
"eslint": "^8.57.0",
|
package/scripts/postinstall.js
CHANGED
|
@@ -1,161 +1,161 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Post-install script to check if 'vcm' command exists
|
|
5
|
-
* and warn users if there's a conflict
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
const { execSync } = require('child_process');
|
|
9
|
-
const chalk = require('chalk');
|
|
10
|
-
const path = require('path');
|
|
11
|
-
const fs = require('fs');
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Detect if user is using asdf for Node.js version management
|
|
15
|
-
*/
|
|
16
|
-
function detectAsdf() {
|
|
17
|
-
try {
|
|
18
|
-
const nodePath = execSync('which node 2>/dev/null || true', { encoding: 'utf8' }).trim();
|
|
19
|
-
return nodePath.includes('/.asdf/');
|
|
20
|
-
} catch (error) {
|
|
21
|
-
return false;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Attempt to reshim asdf to make vcm command immediately available
|
|
27
|
-
*/
|
|
28
|
-
function reshimAsdf() {
|
|
29
|
-
try {
|
|
30
|
-
execSync('asdf reshim nodejs 2>/dev/null', { encoding: 'utf8' });
|
|
31
|
-
return true;
|
|
32
|
-
} catch (error) {
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function checkForExistingAna() {
|
|
38
|
-
try {
|
|
39
|
-
// Check if 'vcm' command exists in PATH before installation
|
|
40
|
-
// We need to check the actual binary, not symlinks
|
|
41
|
-
const result = execSync('which vcm 2>/dev/null || true', { encoding: 'utf8' });
|
|
42
|
-
const vcmPath = result.trim();
|
|
43
|
-
|
|
44
|
-
if (!vcmPath) {
|
|
45
|
-
// No vcm found - safe to install
|
|
46
|
-
console.log(chalk.green('\n✓ Vibe Coding Machine CLI installed successfully!'));
|
|
47
|
-
console.log(chalk.gray(' You can use either:'));
|
|
48
|
-
console.log(chalk.cyan(' vibecodingmachine') + chalk.gray(' or ') + chalk.cyan('vcm'));
|
|
49
|
-
|
|
50
|
-
// Check if user is using asdf and attempt to reshim
|
|
51
|
-
const isAsdf = detectAsdf();
|
|
52
|
-
if (isAsdf) {
|
|
53
|
-
const reshimSuccess = reshimAsdf();
|
|
54
|
-
if (reshimSuccess) {
|
|
55
|
-
console.log(chalk.gray(' ✓ asdf reshimmed successfully'));
|
|
56
|
-
} else {
|
|
57
|
-
console.log(chalk.yellow('\n ⚠️ Note: You appear to be using asdf.'));
|
|
58
|
-
console.log(chalk.yellow(' If "vcm" command is not found, run:'));
|
|
59
|
-
console.log(chalk.cyan(' asdf reshim nodejs'));
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
console.log();
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Check if it's a real file (not a broken symlink from previous install)
|
|
68
|
-
try {
|
|
69
|
-
fs.accessSync(vcmPath, fs.constants.X_OK);
|
|
70
|
-
|
|
71
|
-
// Read the file to see if it's ours
|
|
72
|
-
const content = fs.readFileSync(vcmPath, 'utf8');
|
|
73
|
-
|
|
74
|
-
// Check if this is our VibeCodingMachine binary
|
|
75
|
-
if (content.includes('VibeCodingMachine CLI') || content.includes('vibecodingmachine')) {
|
|
76
|
-
// It's ours, all good
|
|
77
|
-
console.log(chalk.green('\n✓ Vibe Coding Machine CLI installed successfully!'));
|
|
78
|
-
console.log(chalk.gray(' You can use either:'));
|
|
79
|
-
console.log(chalk.cyan(' vibecodingmachine') + chalk.gray(' or ') + chalk.cyan('vcm'));
|
|
80
|
-
|
|
81
|
-
// Check if user is using asdf and attempt to reshim
|
|
82
|
-
const isAsdf = detectAsdf();
|
|
83
|
-
if (isAsdf) {
|
|
84
|
-
const reshimSuccess = reshimAsdf();
|
|
85
|
-
if (reshimSuccess) {
|
|
86
|
-
console.log(chalk.gray(' ✓ asdf reshimmed successfully'));
|
|
87
|
-
} else {
|
|
88
|
-
console.log(chalk.yellow('\n ⚠️ Note: You appear to be using asdf.'));
|
|
89
|
-
console.log(chalk.yellow(' If "vcm" command is not found, run:'));
|
|
90
|
-
console.log(chalk.cyan(' asdf reshim nodejs'));
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
console.log();
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// It's NOT ours - there's a conflict
|
|
99
|
-
console.log(chalk.yellow('\n⚠️ Warning: An existing "vcm" command was detected at:'));
|
|
100
|
-
console.log(chalk.yellow(` ${vcmPath}`));
|
|
101
|
-
console.log(chalk.yellow('\n The "vcm" shortcut will NOT be installed to avoid conflicts.'));
|
|
102
|
-
console.log(chalk.cyan(' You can still use the full command: ') + chalk.bold('vibecodingmachine'));
|
|
103
|
-
console.log();
|
|
104
|
-
|
|
105
|
-
// Remove vcm from bin to prevent conflict
|
|
106
|
-
const packageJsonPath = path.join(__dirname, '..', 'package.json');
|
|
107
|
-
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
108
|
-
|
|
109
|
-
if (packageJson.bin && packageJson.bin.vcm) {
|
|
110
|
-
delete packageJson.bin.vcm;
|
|
111
|
-
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n');
|
|
112
|
-
console.log(chalk.gray(' ✓ Removed "vcm" from bin configuration to prevent conflict\n'));
|
|
113
|
-
}
|
|
114
|
-
} catch (err) {
|
|
115
|
-
// File doesn't exist or can't be read - probably safe to install
|
|
116
|
-
console.log(chalk.green('\n✓ Vibe Coding Machine CLI installed successfully!'));
|
|
117
|
-
console.log(chalk.gray(' You can use either:'));
|
|
118
|
-
console.log(chalk.cyan(' vibecodingmachine') + chalk.gray(' or ') + chalk.cyan('vcm'));
|
|
119
|
-
|
|
120
|
-
// Check if user is using asdf and attempt to reshim
|
|
121
|
-
const isAsdf = detectAsdf();
|
|
122
|
-
if (isAsdf) {
|
|
123
|
-
const reshimSuccess = reshimAsdf();
|
|
124
|
-
if (reshimSuccess) {
|
|
125
|
-
console.log(chalk.gray(' ✓ asdf reshimmed successfully'));
|
|
126
|
-
} else {
|
|
127
|
-
console.log(chalk.yellow('\n ⚠️ Note: You appear to be using asdf.'));
|
|
128
|
-
console.log(chalk.yellow(' If "vcm" command is not found, run:'));
|
|
129
|
-
console.log(chalk.cyan(' asdf reshim nodejs'));
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
console.log();
|
|
134
|
-
}
|
|
135
|
-
} catch (error) {
|
|
136
|
-
// Error running which - assume no vcm exists
|
|
137
|
-
console.log(chalk.green('\n✓ Vibe Coding Machine CLI installed successfully!'));
|
|
138
|
-
console.log(chalk.gray(' You can use either:'));
|
|
139
|
-
console.log(chalk.cyan(' vibecodingmachine') + chalk.gray(' or ') + chalk.cyan('vcm'));
|
|
140
|
-
|
|
141
|
-
// Check if user is using asdf and attempt to reshim
|
|
142
|
-
const isAsdf = detectAsdf();
|
|
143
|
-
if (isAsdf) {
|
|
144
|
-
const reshimSuccess = reshimAsdf();
|
|
145
|
-
if (reshimSuccess) {
|
|
146
|
-
console.log(chalk.gray(' ✓ asdf reshimmed successfully'));
|
|
147
|
-
} else {
|
|
148
|
-
console.log(chalk.yellow('\n ⚠️ Note: You appear to be using asdf.'));
|
|
149
|
-
console.log(chalk.yellow(' If "vcm" command is not found, run:'));
|
|
150
|
-
console.log(chalk.cyan(' asdf reshim nodejs'));
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
console.log();
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// Only run if not being installed as a dependency
|
|
159
|
-
if (process.env.npm_config_global || process.env.npm_config_prefix) {
|
|
160
|
-
checkForExistingAna();
|
|
161
|
-
}
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Post-install script to check if 'vcm' command exists
|
|
5
|
+
* and warn users if there's a conflict
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const { execSync } = require('child_process');
|
|
9
|
+
const chalk = require('chalk');
|
|
10
|
+
const path = require('path');
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Detect if user is using asdf for Node.js version management
|
|
15
|
+
*/
|
|
16
|
+
function detectAsdf() {
|
|
17
|
+
try {
|
|
18
|
+
const nodePath = execSync('which node 2>/dev/null || true', { encoding: 'utf8' }).trim();
|
|
19
|
+
return nodePath.includes('/.asdf/');
|
|
20
|
+
} catch (error) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Attempt to reshim asdf to make vcm command immediately available
|
|
27
|
+
*/
|
|
28
|
+
function reshimAsdf() {
|
|
29
|
+
try {
|
|
30
|
+
execSync('asdf reshim nodejs 2>/dev/null', { encoding: 'utf8' });
|
|
31
|
+
return true;
|
|
32
|
+
} catch (error) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function checkForExistingAna() {
|
|
38
|
+
try {
|
|
39
|
+
// Check if 'vcm' command exists in PATH before installation
|
|
40
|
+
// We need to check the actual binary, not symlinks
|
|
41
|
+
const result = execSync('which vcm 2>/dev/null || true', { encoding: 'utf8' });
|
|
42
|
+
const vcmPath = result.trim();
|
|
43
|
+
|
|
44
|
+
if (!vcmPath) {
|
|
45
|
+
// No vcm found - safe to install
|
|
46
|
+
console.log(chalk.green('\n✓ Vibe Coding Machine CLI installed successfully!'));
|
|
47
|
+
console.log(chalk.gray(' You can use either:'));
|
|
48
|
+
console.log(chalk.cyan(' vibecodingmachine') + chalk.gray(' or ') + chalk.cyan('vcm'));
|
|
49
|
+
|
|
50
|
+
// Check if user is using asdf and attempt to reshim
|
|
51
|
+
const isAsdf = detectAsdf();
|
|
52
|
+
if (isAsdf) {
|
|
53
|
+
const reshimSuccess = reshimAsdf();
|
|
54
|
+
if (reshimSuccess) {
|
|
55
|
+
console.log(chalk.gray(' ✓ asdf reshimmed successfully'));
|
|
56
|
+
} else {
|
|
57
|
+
console.log(chalk.yellow('\n ⚠️ Note: You appear to be using asdf.'));
|
|
58
|
+
console.log(chalk.yellow(' If "vcm" command is not found, run:'));
|
|
59
|
+
console.log(chalk.cyan(' asdf reshim nodejs'));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
console.log();
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Check if it's a real file (not a broken symlink from previous install)
|
|
68
|
+
try {
|
|
69
|
+
fs.accessSync(vcmPath, fs.constants.X_OK);
|
|
70
|
+
|
|
71
|
+
// Read the file to see if it's ours
|
|
72
|
+
const content = fs.readFileSync(vcmPath, 'utf8');
|
|
73
|
+
|
|
74
|
+
// Check if this is our VibeCodingMachine binary
|
|
75
|
+
if (content.includes('VibeCodingMachine CLI') || content.includes('vibecodingmachine')) {
|
|
76
|
+
// It's ours, all good
|
|
77
|
+
console.log(chalk.green('\n✓ Vibe Coding Machine CLI installed successfully!'));
|
|
78
|
+
console.log(chalk.gray(' You can use either:'));
|
|
79
|
+
console.log(chalk.cyan(' vibecodingmachine') + chalk.gray(' or ') + chalk.cyan('vcm'));
|
|
80
|
+
|
|
81
|
+
// Check if user is using asdf and attempt to reshim
|
|
82
|
+
const isAsdf = detectAsdf();
|
|
83
|
+
if (isAsdf) {
|
|
84
|
+
const reshimSuccess = reshimAsdf();
|
|
85
|
+
if (reshimSuccess) {
|
|
86
|
+
console.log(chalk.gray(' ✓ asdf reshimmed successfully'));
|
|
87
|
+
} else {
|
|
88
|
+
console.log(chalk.yellow('\n ⚠️ Note: You appear to be using asdf.'));
|
|
89
|
+
console.log(chalk.yellow(' If "vcm" command is not found, run:'));
|
|
90
|
+
console.log(chalk.cyan(' asdf reshim nodejs'));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
console.log();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// It's NOT ours - there's a conflict
|
|
99
|
+
console.log(chalk.yellow('\n⚠️ Warning: An existing "vcm" command was detected at:'));
|
|
100
|
+
console.log(chalk.yellow(` ${vcmPath}`));
|
|
101
|
+
console.log(chalk.yellow('\n The "vcm" shortcut will NOT be installed to avoid conflicts.'));
|
|
102
|
+
console.log(chalk.cyan(' You can still use the full command: ') + chalk.bold('vibecodingmachine'));
|
|
103
|
+
console.log();
|
|
104
|
+
|
|
105
|
+
// Remove vcm from bin to prevent conflict
|
|
106
|
+
const packageJsonPath = path.join(__dirname, '..', 'package.json');
|
|
107
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
108
|
+
|
|
109
|
+
if (packageJson.bin && packageJson.bin.vcm) {
|
|
110
|
+
delete packageJson.bin.vcm;
|
|
111
|
+
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n');
|
|
112
|
+
console.log(chalk.gray(' ✓ Removed "vcm" from bin configuration to prevent conflict\n'));
|
|
113
|
+
}
|
|
114
|
+
} catch (err) {
|
|
115
|
+
// File doesn't exist or can't be read - probably safe to install
|
|
116
|
+
console.log(chalk.green('\n✓ Vibe Coding Machine CLI installed successfully!'));
|
|
117
|
+
console.log(chalk.gray(' You can use either:'));
|
|
118
|
+
console.log(chalk.cyan(' vibecodingmachine') + chalk.gray(' or ') + chalk.cyan('vcm'));
|
|
119
|
+
|
|
120
|
+
// Check if user is using asdf and attempt to reshim
|
|
121
|
+
const isAsdf = detectAsdf();
|
|
122
|
+
if (isAsdf) {
|
|
123
|
+
const reshimSuccess = reshimAsdf();
|
|
124
|
+
if (reshimSuccess) {
|
|
125
|
+
console.log(chalk.gray(' ✓ asdf reshimmed successfully'));
|
|
126
|
+
} else {
|
|
127
|
+
console.log(chalk.yellow('\n ⚠️ Note: You appear to be using asdf.'));
|
|
128
|
+
console.log(chalk.yellow(' If "vcm" command is not found, run:'));
|
|
129
|
+
console.log(chalk.cyan(' asdf reshim nodejs'));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
console.log();
|
|
134
|
+
}
|
|
135
|
+
} catch (error) {
|
|
136
|
+
// Error running which - assume no vcm exists
|
|
137
|
+
console.log(chalk.green('\n✓ Vibe Coding Machine CLI installed successfully!'));
|
|
138
|
+
console.log(chalk.gray(' You can use either:'));
|
|
139
|
+
console.log(chalk.cyan(' vibecodingmachine') + chalk.gray(' or ') + chalk.cyan('vcm'));
|
|
140
|
+
|
|
141
|
+
// Check if user is using asdf and attempt to reshim
|
|
142
|
+
const isAsdf = detectAsdf();
|
|
143
|
+
if (isAsdf) {
|
|
144
|
+
const reshimSuccess = reshimAsdf();
|
|
145
|
+
if (reshimSuccess) {
|
|
146
|
+
console.log(chalk.gray(' ✓ asdf reshimmed successfully'));
|
|
147
|
+
} else {
|
|
148
|
+
console.log(chalk.yellow('\n ⚠️ Note: You appear to be using asdf.'));
|
|
149
|
+
console.log(chalk.yellow(' If "vcm" command is not found, run:'));
|
|
150
|
+
console.log(chalk.cyan(' asdf reshim nodejs'));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
console.log();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Only run if not being installed as a dependency
|
|
159
|
+
if (process.env.npm_config_global || process.env.npm_config_prefix) {
|
|
160
|
+
checkForExistingAna();
|
|
161
|
+
}
|