viepilot 1.6.1 → 1.8.1

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
@@ -7,6 +7,44 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Planned
11
+
12
+ - None.
13
+
14
+ ### Added
15
+
16
+ - None yet.
17
+
18
+ ## [1.8.1] - 2026-04-01
19
+
20
+ ### Fixed
21
+
22
+ - **M1.26 / Phase 30 (BUG-004) completed** — enforced vp-only namespace behavior across the framework: all `vp-*` skills include scope guard rules, core workflows default to `vp-*` routing only, and external skills are allowed only via explicit user opt-in.
23
+
24
+ ### Added
25
+
26
+ - `tests/unit/vp-scope-policy-contracts.test.js` — regression tests to ensure all bundled skills/workflows retain the BUG-004 scope policy contract.
27
+
28
+ ### Documentation
29
+
30
+ - `docs/skills-reference.md`, `docs/user/features/autonomous-mode.md`, `docs/user/features/debug-mode.md`, `docs/user/quick-start.md` — clarified default `vp-*` scope and added explicit opt-in examples for external skills.
31
+
32
+ ## [1.8.0] - 2026-04-01
33
+
34
+ ### Added
35
+
36
+ - **M1.25 / Phase 29 (ENH-018) completed** — complexity-gated Mermaid architecture contract shipped: brainstorm inputs + crystallize matrix (`required|optional|N/A`) for six diagram types, architecture template sections with N/A rationale policy, and skill/workflow alignment across `vp-crystallize`, `vp-audit`, `vp-debug`, and `autonomous`.
37
+
38
+ ## [1.7.0] - 2026-04-01
39
+
40
+ ### Added
41
+
42
+ - **M1.24 / Phase 28 (ENH-017) completed** — Node-native installer flow shipped: `lib/viepilot-install.cjs` (`buildInstallPlan`/`applyInstallPlan`), `bin/viepilot.cjs install` no longer spawns `bash`, `install.sh` now thin wrapper to Node, and Jest coverage for dry-run/apply/wrapper paths.
43
+
44
+ ### Documentation
45
+
46
+ - `docs/troubleshooting.md`, `docs/dev/deployment.md` — updated install engine behavior (`npx viepilot install` Node-native, `install.sh` wrapper), Windows guidance, and reinstall semantics with `dev-install.sh`.
47
+
10
48
  ## [1.6.1] - 2026-04-01
11
49
 
12
50
  ### Enhanced
@@ -252,7 +290,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
252
290
 
253
291
  ---
254
292
 
255
- [Unreleased]: https://github.com/0-CODE/viepilot/compare/v0.10.0...HEAD
293
+ [Unreleased]: https://github.com/0-CODE/viepilot/compare/v1.8.1...HEAD
294
+ [1.8.1]: https://github.com/0-CODE/viepilot/compare/v1.8.0...v1.8.1
295
+ [1.8.0]: https://github.com/0-CODE/viepilot/compare/v1.7.0...v1.8.0
256
296
  [0.10.0]: https://github.com/0-CODE/viepilot/compare/v0.9.0...v0.10.0
257
297
  [0.9.0]: https://github.com/0-CODE/viepilot/compare/v0.8.2...v0.9.0
258
298
  [0.8.2]: https://github.com/0-CODE/viepilot/compare/v0.8.1...v0.8.2
package/bin/viepilot.cjs CHANGED
@@ -5,9 +5,15 @@
5
5
  */
6
6
 
7
7
  const path = require('path');
8
- const { spawnSync } = require('child_process');
9
8
  const readline = require('readline');
10
9
  const fs = require('fs');
10
+ const os = require('os');
11
+ const { buildInstallPlan, applyInstallPlan, resolveViepilotPackageRoot } = require(path.join(
12
+ __dirname,
13
+ '..',
14
+ 'lib',
15
+ 'viepilot-install.cjs',
16
+ ));
11
17
 
12
18
  const TARGETS = [
13
19
  { id: 'claude-code', label: 'Claude Code' },
@@ -28,7 +34,7 @@ Usage:
28
34
  Install options:
29
35
  --target <id|id,id|all> Target profile(s): claude-code,cursor-agent,cursor-ide
30
36
  --yes Non-interactive mode (skip confirmations)
31
- --dry-run Print actions only, do not execute installers
37
+ --dry-run Print actions only (Node installer; no bash)
32
38
  --list-targets Print supported targets and exit
33
39
  --help Show help
34
40
 
@@ -239,28 +245,48 @@ async function interactiveTargetSelection() {
239
245
  return runKeyboardSelector(TARGETS, 'multi', 'Select install targets');
240
246
  }
241
247
 
242
- function handlerForTarget(target) {
243
- const root = path.join(__dirname, '..');
244
- return {
245
- script: path.join(root, 'install.sh'),
246
- env: { VIEPILOT_AUTO_YES: '1', VIEPILOT_INSTALL_PROFILE: target },
248
+ /**
249
+ * One install applies the same file bundle for every target id (profiles are informational).
250
+ * @param {string[]} selectedTargets
251
+ * @param {boolean} dryRun
252
+ * @returns {{ ok: boolean, code: number }}
253
+ */
254
+ function runInstallViaNode(selectedTargets, dryRun) {
255
+ const fallbackRoot = path.join(__dirname, '..');
256
+ const pkgRoot = resolveViepilotPackageRoot(fallbackRoot) || fallbackRoot;
257
+ const profile = selectedTargets[0] || 'cursor-ide';
258
+ const env = {
259
+ ...process.env,
260
+ VIEPILOT_AUTO_YES: '1',
261
+ VIEPILOT_INSTALL_PROFILE: profile,
247
262
  };
248
- }
263
+ const wantPathShim = env.VIEPILOT_ADD_PATH === '1';
249
264
 
250
- function runInstaller(target, dryRun) {
251
- const config = handlerForTarget(target);
252
- const commandLabel = `${config.script} [profile=${target}]`;
253
- if (dryRun) {
254
- console.log(`[dry-run] ${commandLabel}`);
255
- return { ok: true, target, dryRun: true };
265
+ let plan;
266
+ try {
267
+ plan = buildInstallPlan(pkgRoot, env, { wantPathShim });
268
+ } catch (err) {
269
+ console.error(err.message);
270
+ return { ok: false, code: 1 };
256
271
  }
257
272
 
258
- const result = spawnSync('bash', [config.script], {
259
- stdio: 'inherit',
260
- env: { ...process.env, ...config.env },
261
- cwd: path.join(__dirname, '..'),
262
- });
263
- return { ok: result.status === 0, target, code: result.status ?? 1 };
273
+ console.log('');
274
+ console.log('ViePilot install (Node — no bash required)');
275
+ console.log(` Package: ${pkgRoot}`);
276
+ console.log(` Targets (informational): ${selectedTargets.join(', ')}`);
277
+
278
+ const applied = applyInstallPlan(plan, { dryRun });
279
+ if (applied.logs.length > 0) {
280
+ console.log('');
281
+ console.log(applied.logs.join('\n'));
282
+ }
283
+ if (!applied.ok && applied.errors.length > 0) {
284
+ const first = applied.errors[0];
285
+ const msg = first.error && first.error.message ? first.error.message : String(first.error);
286
+ console.error(msg);
287
+ }
288
+
289
+ return { ok: applied.ok, code: applied.ok ? 0 : 1 };
264
290
  }
265
291
 
266
292
  async function installCommand(rawArgs) {
@@ -290,7 +316,13 @@ async function installCommand(rawArgs) {
290
316
  }
291
317
 
292
318
  console.log(`\nSelected targets: ${selectedTargets.join(', ')}`);
293
- const results = selectedTargets.map((target) => runInstaller(target, options.dryRun));
319
+ const run = runInstallViaNode(selectedTargets, options.dryRun);
320
+ const results = selectedTargets.map((target) => ({
321
+ ok: run.ok,
322
+ target,
323
+ dryRun: options.dryRun,
324
+ code: run.code,
325
+ }));
294
326
  const failed = results.filter((r) => !r.ok);
295
327
 
296
328
  console.log('\nInstall summary:');
@@ -307,7 +339,7 @@ async function installCommand(rawArgs) {
307
339
  }
308
340
 
309
341
  function computeUninstallPaths(targets) {
310
- const home = process.env.HOME || '';
342
+ const home = process.env.HOME || os.homedir() || '';
311
343
  const cursorSkills = path.join(home, '.cursor', 'skills');
312
344
  const vpRoot = path.join(home, '.cursor', 'viepilot');
313
345
  const paths = [];
@@ -24,11 +24,10 @@ cd viepilot
24
24
  ./install.sh
25
25
  ```
26
26
 
27
- `install.sh` copies:
27
+ `install.sh` is a thin **bash** wrapper: optional **cloc** / **PATH** prompts, then **`node bin/viepilot.cjs install`** (same **Node** engine as `npx viepilot install`). It installs to:
28
28
  - `skills/vp-*/` → `~/.cursor/skills/`
29
- - `workflows/` → `~/.cursor/viepilot/workflows/`
30
- - `templates/` `~/.cursor/viepilot/templates/`
31
- - `bin/vp-tools.cjs` → `~/.local/bin/vp-tools`
29
+ - `workflows/`, `templates/`, `bin/`, `lib/` → `~/.cursor/viepilot/…`
30
+ - Optional PATH symlinks (Unix) via `VIEPILOT_ADD_PATH=1`
32
31
 
33
32
  ### Method 3: Development Mode
34
33
 
@@ -2,6 +2,14 @@
2
2
 
3
3
  Complete reference for all ViePilot skills.
4
4
 
5
+ ## ViePilot Scope Policy
6
+
7
+ - **Default behavior**: ViePilot workflows and responses only use skills under `vp-*`.
8
+ - **Out-of-scope by default**: skills outside the ViePilot namespace are ignored, even if present in the runtime environment.
9
+ - **Explicit opt-in**: external skills are considered only when the user explicitly asks to expand beyond ViePilot scope.
10
+ - **Routing fallback**: if an external skill is mentioned accidentally, prefer the closest built-in `vp-*` command instead.
11
+ - **Opt-in example**: "Trong bước này, cho phép dùng thêm external skills ngoài ViePilot để tham khảo."
12
+
5
13
  ---
6
14
 
7
15
  ## /vp-brainstorm
@@ -68,6 +68,43 @@ chmod +x install.sh
68
68
 
69
69
  ---
70
70
 
71
+ ### `npx viepilot install` vs dev clone — upgrade / cài lại có “conflict” không?
72
+
73
+ **Không có** giao diện merge từng file. Hành vi phụ thuộc **script nào** chạy:
74
+
75
+ | Cách cài | Script | Trước khi ghi file mới |
76
+ |----------|--------|-------------------------|
77
+ | **`npx viepilot install`** (mọi `--target`) | **`bin/viepilot.cjs`** + `lib/viepilot-install.cjs` (Node, **không** bash) | **Không** xóa `~/.cursor/skills/vp-*` hay `~/.cursor/viepilot`; copy đè tương đương **`cp -r`**. File cùng tên bị ghi đè; file **chỉ còn ở bản cũ** có thể **vẫn nằm lại** (orphan). |
78
+ | **`./install.sh`** từ clone / tarball | Thin **bash** wrapper → gọi `node bin/viepilot.cjs install` | Cùng engine Node như NPX; bash chỉ còn prompt (cloc, PATH) khi không `VIEPILOT_AUTO_YES=1`. |
79
+ | **`./dev-install.sh`** từ clone repo | `dev-install.sh` | **Có** xóa sạch `vp-*` skills + **`rm -rf ~/.cursor/viepilot`** rồi cài lại → gần như cài mới hoàn toàn. |
80
+
81
+ `npx viepilot install` chạy **trực tiếp** Node installer — **không** spawn `bash install.sh`. `install.sh` dùng khi bạn chạy tay từ repo và muốn prompt cloc/PATH giống trước.
82
+
83
+ **Muốn cài sạch sau bản cũ** (tránh sót file):
84
+
85
+ ```bash
86
+ npx viepilot uninstall --yes
87
+ npx viepilot install --target cursor-agent --yes
88
+ ```
89
+
90
+ (Chọn lại `--target` đúng profile bạn dùng.)
91
+
92
+ ---
93
+
94
+ ### Windows / đa OS: `install.sh` và `npx viepilot install` chạy thế nào?
95
+
96
+ **`npx viepilot install`** dùng **Node** (`lib/viepilot-install.cjs`) — **không** cần Bash. **`./install.sh`** là wrapper Bash (prompt cloc/PATH) rồi gọi `node bin/viepilot.cjs install …`. **`dev-install.sh`** vẫn là Bash đầy đủ (xóa + copy).
97
+
98
+ | OS | `npx viepilot install` | `./install.sh` |
99
+ |----|------------------------|----------------|
100
+ | **macOS**, **Linux** | Chỉ cần Node trên PATH | Bash → Node (cùng engine với NPX) |
101
+ | **Windows (CMD/PowerShell)** | Chạy được với Node | Cần Git Bash / WSL cho file `.sh`, hoặc: `node bin\viepilot.cjs install --target cursor-agent --yes` |
102
+ | **PATH `/usr/local/bin`** | Tùy chọn trong installer (Unix); Windows bỏ qua / PATH thủ công | |
103
+
104
+ Với ViePilot **Node-native install**, lỗi **`bash: command not found`** khi chạy **`npx viepilot install`** không còn điển hình — nếu vẫn gặp trên bản cũ, hãy nâng ViePilot hoặc dùng `node bin/viepilot.cjs install …` từ source.
105
+
106
+ ---
107
+
71
108
  ### `vp-tools: command not found`
72
109
 
73
110
  **Cause**: ViePilot bin not in PATH.
@@ -30,6 +30,12 @@ Mỗi task:
30
30
  /vp-auto --dry-run # Preview, không execute
31
31
  ```
32
32
 
33
+ ## ViePilot Scope Policy (BUG-004)
34
+
35
+ - Mặc định, `/vp-auto` chỉ route/gợi ý các skill thuộc namespace `vp-*`.
36
+ - Nếu môi trường runtime có skills ngoài framework, workflow sẽ bỏ qua và ưu tiên skill ViePilot tương đương.
37
+ - Chỉ khi bạn ghi rõ yêu cầu mở rộng (explicit opt-in), agent mới được phép dùng external skills.
38
+
33
39
  ### Doc-first gate (v0.8.2 / BUG-001)
34
40
 
35
41
  Workflow `autonomous.md` yêu cầu **ghi nhận kế hoạch trong file task** và **`PHASE-STATE` → `in_progress`** trước khi chỉnh sửa deliverable. Xem `workflows/autonomous.md` — *Pre-execution documentation gate*.
@@ -75,3 +75,4 @@ Active debug sessions:
75
75
  - Mô tả problem cụ thể: "X happens when Y" thay vì "something is broken"
76
76
  - Một session per issue — không mix nhiều bugs
77
77
  - Dùng `/vp-debug continue` sau context reset để không mất progress
78
+ - Theo policy BUG-004, `/vp-debug` mặc định chỉ dùng hệ skill `vp-*`; external skills chỉ dùng khi bạn explicit opt-in.
@@ -182,6 +182,14 @@ Hiển thị:
182
182
 
183
183
  ---
184
184
 
185
+ ## Skill Scope (BUG-004)
186
+
187
+ - Theo mặc định, ViePilot chỉ dùng hệ lệnh/skill `vp-*` trong toàn bộ workflow.
188
+ - Nếu bạn thấy đề cập skill ngoài framework, hãy coi đó là out-of-scope trừ khi bạn đã explicit opt-in.
189
+ - Ví dụ opt-in hợp lệ: "Cho phép dùng thêm external skills ngoài ViePilot trong bước research này."
190
+
191
+ ---
192
+
185
193
  ## Next Steps
186
194
 
187
195
  - [Skills Reference](../skills-reference.md) — Chi tiết tất cả commands
package/install.sh CHANGED
@@ -1,23 +1,22 @@
1
1
  #!/bin/bash
2
2
 
3
- # ViePilot Installation Script
4
- # Installs ViePilot skills and tools to Cursor/Claude environment
3
+ # ViePilot installation — thin wrapper around the Node installer (bin/viepilot.cjs).
4
+ # Implements prompts + optional cloc install here; file copy/symlink/chmod/path is in lib/viepilot-install.cjs.
5
5
  #
6
- # Optional: VIEPILOT_SYMLINK_SKILLS=1 — symlink skills/* into ~/.cursor/skills/ (absolute paths)
6
+ # Optional: VIEPILOT_SYMLINK_SKILLS=1 — passed through to Node (symlink skills into ~/.cursor/skills/)
7
+ # Optional: VIEPILOT_INSTALL_DRY_RUN=1 — runs `viepilot install --dry-run` (for CI/tests)
7
8
 
8
9
  set -e
9
10
 
10
- # Colors for output
11
11
  RED='\033[0;31m'
12
12
  GREEN='\033[0;32m'
13
13
  YELLOW='\033[1;33m'
14
14
  BLUE='\033[0;34m'
15
- NC='\033[0m' # No Color
15
+ NC='\033[0m'
16
16
 
17
- # Get script directory
18
17
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
18
+ cd "$SCRIPT_DIR" || exit 1
19
19
 
20
- # Default installation paths
21
20
  CURSOR_SKILLS_DIR="$HOME/.cursor/skills"
22
21
  VIEPILOT_DIR="$HOME/.cursor/viepilot"
23
22
  AUTO_YES="${VIEPILOT_AUTO_YES:-0}"
@@ -30,7 +29,6 @@ echo " VIEPILOT INSTALLER"
30
29
  echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
31
30
  echo -e "${NC}"
32
31
 
33
- # Check if running from viepilot directory
34
32
  if [ ! -f "$SCRIPT_DIR/README.md" ] || [ ! -d "$SCRIPT_DIR/skills" ]; then
35
33
  echo -e "${RED}Error: Please run this script from the viepilot directory${NC}"
36
34
  exit 1
@@ -40,6 +38,7 @@ echo -e "${YELLOW}Installation paths:${NC}"
40
38
  echo " Skills: $CURSOR_SKILLS_DIR"
41
39
  echo " ViePilot: $VIEPILOT_DIR"
42
40
  echo " Profile: $INSTALL_PROFILE"
41
+ echo " Engine: Node (bin/viepilot.cjs) — no bash copy logic"
43
42
  echo ""
44
43
 
45
44
  install_cloc_best_effort() {
@@ -86,7 +85,6 @@ install_cloc_best_effort() {
86
85
  fi
87
86
  }
88
87
 
89
- # Confirm installation
90
88
  if [ "$AUTO_YES" != "1" ]; then
91
89
  read -p "Continue with installation? (y/n) " -n 1 -r
92
90
  echo
@@ -99,105 +97,29 @@ else
99
97
  fi
100
98
 
101
99
  echo ""
102
- echo -e "${BLUE}Installing...${NC}"
103
-
104
- # Create directories
105
- echo " Creating directories..."
106
- mkdir -p "$CURSOR_SKILLS_DIR"
107
- mkdir -p "$VIEPILOT_DIR/workflows"
108
- mkdir -p "$VIEPILOT_DIR/templates/project"
109
- mkdir -p "$VIEPILOT_DIR/templates/phase"
110
- mkdir -p "$VIEPILOT_DIR/bin"
111
- mkdir -p "$VIEPILOT_DIR/lib"
112
- mkdir -p "$VIEPILOT_DIR/ui-components"
113
-
114
- # Install skills (copy default; VIEPILOT_SYMLINK_SKILLS=1 for dev-style live links)
115
- echo " Installing skills..."
116
- for skill_dir in "$SCRIPT_DIR/skills"/*; do
117
- if [ -d "$skill_dir" ]; then
118
- skill_name=$(basename "$skill_dir")
119
- if [ "${VIEPILOT_SYMLINK_SKILLS:-0}" = "1" ]; then
120
- if command -v realpath >/dev/null 2>&1; then
121
- skill_abs=$(realpath "$skill_dir")
122
- else
123
- skill_abs=$(cd "$skill_dir" && pwd)
124
- fi
125
- ln -sfn "$skill_abs" "$CURSOR_SKILLS_DIR/$skill_name"
126
- echo " ✓ $skill_name (symlink)"
127
- else
128
- cp -r "$skill_dir" "$CURSOR_SKILLS_DIR/"
129
- echo " ✓ $skill_name"
130
- fi
131
- fi
132
- done
133
-
134
- # Install workflows
135
- echo " Installing workflows..."
136
- cp -r "$SCRIPT_DIR/workflows"/* "$VIEPILOT_DIR/workflows/"
137
- echo " ✓ workflows"
138
-
139
- # Install templates
140
- echo " Installing templates..."
141
- cp -r "$SCRIPT_DIR/templates/project"/* "$VIEPILOT_DIR/templates/project/"
142
- cp -r "$SCRIPT_DIR/templates/phase"/* "$VIEPILOT_DIR/templates/phase/"
143
- echo " ✓ templates"
144
-
145
- # Install stock UI components
146
- echo " Installing stock UI components..."
147
- if [ -d "$SCRIPT_DIR/ui-components" ]; then
148
- cp -r "$SCRIPT_DIR/ui-components"/* "$VIEPILOT_DIR/ui-components/"
149
- echo " ✓ ui-components"
150
- fi
151
-
152
- # Install CLI tools
153
- echo " Installing CLI tools..."
154
- cp "$SCRIPT_DIR/bin/vp-tools.cjs" "$VIEPILOT_DIR/bin/"
155
- cp "$SCRIPT_DIR/bin/viepilot.cjs" "$VIEPILOT_DIR/bin/"
156
- cp "$SCRIPT_DIR/lib/cli-shared.cjs" "$VIEPILOT_DIR/lib/"
157
- chmod +x "$VIEPILOT_DIR/bin/vp-tools.cjs"
158
- chmod +x "$VIEPILOT_DIR/bin/viepilot.cjs"
159
- echo " ✓ vp-tools.cjs + viepilot.cjs + lib/cli-shared.cjs"
160
-
161
- echo " Checking optional dependency for README metric sync..."
100
+ echo -e "${BLUE}Preparing Node installer...${NC}"
162
101
  install_cloc_best_effort
163
102
 
164
- # Create symlink in PATH (optional)
165
103
  echo ""
166
104
  if [ "$AUTO_YES" != "1" ]; then
167
- read -p "Add vp-tools + viepilot to PATH? (creates symlink in /usr/local/bin) (y/n) " -n 1 -r
105
+ read -p "Add vp-tools + viepilot to PATH? (symlinks via Node installer, often /usr/local/bin) (y/n) " -n 1 -r
168
106
  echo
107
+ if [[ $REPLY =~ ^[Yy]$ ]]; then
108
+ export VIEPILOT_ADD_PATH=1
109
+ fi
169
110
  else
170
- REPLY=$([ "$ADD_PATH_CHOICE" = "1" ] && echo "y" || echo "n")
171
- fi
172
- if [[ $REPLY =~ ^[Yy]$ ]]; then
173
- if [ -w "/usr/local/bin" ]; then
174
- ln -sf "$VIEPILOT_DIR/bin/vp-tools.cjs" "/usr/local/bin/vp-tools"
175
- ln -sf "$VIEPILOT_DIR/bin/viepilot.cjs" "/usr/local/bin/viepilot"
176
- echo " ✓ vp-tools + viepilot added to PATH"
177
- else
178
- echo -e "${YELLOW} Note: Need sudo to create symlink${NC}"
179
- sudo ln -sf "$VIEPILOT_DIR/bin/vp-tools.cjs" "/usr/local/bin/vp-tools"
180
- sudo ln -sf "$VIEPILOT_DIR/bin/viepilot.cjs" "/usr/local/bin/viepilot"
181
- echo " ✓ vp-tools + viepilot added to PATH"
111
+ if [ "$ADD_PATH_CHOICE" = "1" ]; then
112
+ export VIEPILOT_ADD_PATH=1
182
113
  fi
183
114
  fi
184
115
 
116
+ export VIEPILOT_AUTO_YES=1
117
+
118
+ NODE_ARGS=(install --target "$INSTALL_PROFILE" --yes)
119
+ if [ "${VIEPILOT_INSTALL_DRY_RUN:-0}" = "1" ]; then
120
+ NODE_ARGS+=(--dry-run)
121
+ fi
122
+
185
123
  echo ""
186
- echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
187
- echo -e "${GREEN} INSTALLATION COMPLETE ✓${NC}"
188
- echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
189
- echo ""
190
- echo "Installed:"
191
- echo " - Skills: $CURSOR_SKILLS_DIR/vp-*"
192
- echo " - Workflows: $VIEPILOT_DIR/workflows/"
193
- echo " - Templates: $VIEPILOT_DIR/templates/"
194
- echo " - CLI: $VIEPILOT_DIR/bin/vp-tools.cjs"
195
- echo ""
196
- echo "Quick Start:"
197
- echo " 1. Open your project in Cursor"
198
- echo " 2. Run: /vp-brainstorm"
199
- echo " 3. After brainstorm: /vp-crystallize"
200
- echo " 4. Start coding: /vp-auto"
201
- echo ""
202
- echo "Documentation: $SCRIPT_DIR/docs/getting-started.md"
203
- echo ""
124
+ echo -e "${BLUE}Running: node bin/viepilot.cjs ${NODE_ARGS[*]}${NC}"
125
+ exec node "$SCRIPT_DIR/bin/viepilot.cjs" "${NODE_ARGS[@]}"