@ngocsangairvds/vsaf 4.1.4 → 4.1.6

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ngocsangairvds/vsaf",
3
- "version": "4.1.4",
3
+ "version": "4.1.6",
4
4
  "description": "logging step",
5
5
  "main": "packages/core/dist/index.js",
6
6
  "types": "packages/core/dist/index.d.ts",
@@ -193,7 +193,10 @@ if (!vdsCliFound && vdsScriptsDir) {
193
193
  // Check vds-scripts has valid structure (pyproject.toml = uv project)
194
194
  if (existsSync(join(vdsScriptsDir, 'pyproject.toml'))) {
195
195
  mkdirSync(wrapperDir, { recursive: true });
196
- const wrapperContent = `#!/usr/bin/env node
196
+
197
+ if (process.platform === 'win32') {
198
+ // Windows: Node.js wrapper + .cmd shim
199
+ const wrapperContent = `#!/usr/bin/env node
197
200
  // Project-local vds-cli wrapper — created by vsaf install vds-skill
198
201
  const { execFileSync } = require('child_process');
199
202
  try {
@@ -202,20 +205,53 @@ try {
202
205
  process.exit(e.status || 1);
203
206
  }
204
207
  `;
205
- writeFileSync(wrapperPath, wrapperContent);
206
- if (process.platform !== 'win32') {
207
- chmodSync(wrapperPath, 0o755);
208
- } else {
208
+ writeFileSync(wrapperPath, wrapperContent);
209
209
  writeFileSync(wrapperPath + '.cmd', `@node "%~dp0\\vds-cli" %*\r\n`);
210
+ } else {
211
+ // Unix: pure bash wrapper — no node/nvm dependency
212
+ const wrapperContent = `#!/usr/bin/env bash
213
+ # Project-local vds-cli wrapper — created by vsaf install vds-skill
214
+ # Uses bash instead of node to avoid nvm/node PATH issues
215
+ exec uv run --directory ${JSON.stringify(vdsScriptsDir)} --package vds-cli vds-cli "$@"
216
+ `;
217
+ writeFileSync(wrapperPath, wrapperContent);
218
+ chmodSync(wrapperPath, 0o755);
210
219
  }
211
220
  log('✅', `vds-cli wrapper created: ${wrapperPath}`);
212
221
  log(' ', `Points to: ${vdsScriptsDir}`);
213
- if (process.platform === 'win32') {
214
- log('💡', 'Add to PATH: set "PATH=.claude\\bin;%PATH%"');
215
- log(' ', 'PowerShell: $env:PATH = ".claude\\bin;$env:PATH"');
216
- } else {
217
- log('💡', 'Add to PATH: export PATH=".claude/bin:$PATH"');
222
+
223
+ // Auto-register .claude/bin in CLAUDE.md so Claude Code always finds vds-cli
224
+ const claudeMdPath = join(projectPath, 'CLAUDE.md');
225
+ try {
226
+ const content = existsSync(claudeMdPath) ? readFileSync(claudeMdPath, 'utf-8') : '';
227
+ const pathExport = 'export PATH=".claude/bin:$PATH"';
228
+ if (!content.includes('.claude/bin')) {
229
+ const block = `\n\n## vds-cli PATH\n\nBefore running any \`vds-cli\` command, prepend the local bin directory:\n\`\`\`bash\n${pathExport}\n\`\`\`\nOr use the full path: \`.claude/bin/vds-cli\`\n`;
230
+ writeFileSync(claudeMdPath, content + block);
231
+ log('✅', 'PATH hint added to CLAUDE.md');
232
+ }
233
+ } catch {
234
+ // CLAUDE.md update is best-effort
235
+ }
236
+
237
+ // Also add Bash permission for .claude/bin/vds-cli in settings.local.json
238
+ const settingsPath = join(projectPath, '.claude', 'settings.local.json');
239
+ try {
240
+ const settings = existsSync(settingsPath)
241
+ ? JSON.parse(readFileSync(settingsPath, 'utf-8'))
242
+ : {};
243
+ if (!settings.permissions) settings.permissions = {};
244
+ if (!settings.permissions.allow) settings.permissions.allow = [];
245
+ const vdsRule = 'Bash(.claude/bin/vds-cli *)';
246
+ if (!settings.permissions.allow.some(r => r.includes('.claude/bin/vds-cli'))) {
247
+ settings.permissions.allow.push(vdsRule);
248
+ writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
249
+ log('✅', 'vds-cli permission added to settings.local.json');
250
+ }
251
+ } catch {
252
+ // settings update is best-effort
218
253
  }
254
+
219
255
  vdsCliFound = true;
220
256
  }
221
257
  }
@@ -255,8 +291,9 @@ if (vdsScriptsDir) {
255
291
  execSync('uv sync --all-packages', {
256
292
  stdio: 'pipe',
257
293
  encoding: 'utf-8',
258
- timeout: 120000,
294
+ timeout: 600000,
259
295
  cwd: vdsScriptsDir,
296
+ env: { ...process.env, UV_HTTP_TIMEOUT: '300' },
260
297
  });
261
298
  log('✅', 'All vds-scripts packages synced');
262
299
  } catch (e) {
@@ -279,7 +316,7 @@ let verified = false;
279
316
 
280
317
  // First pass: try vds-cli on PATH
281
318
  try {
282
- const ver = execSync('vds-cli version', { stdio: 'pipe', encoding: 'utf-8', timeout: 15000 }).trim();
319
+ const ver = execSync('vds-cli version', { stdio: 'pipe', encoding: 'utf-8', timeout: 60000 }).trim();
283
320
  log('✅', `vds-cli ${ver} — working`);
284
321
  verified = true;
285
322
  } catch {
@@ -312,7 +349,7 @@ if (!verified) {
312
349
  try {
313
350
  const wrapperPath = join(projectPath, '.claude', 'bin');
314
351
  const ver = execSync('vds-cli version', {
315
- stdio: 'pipe', encoding: 'utf-8', timeout: 15000,
352
+ stdio: 'pipe', encoding: 'utf-8', timeout: 60000,
316
353
  env: { ...process.env, PATH: `${wrapperPath}${delimiter}${process.env.PATH}` },
317
354
  }).trim();
318
355
  log('✅', `vds-cli ${ver} — working (via .claude/bin/vds-cli)`);
@@ -326,7 +363,7 @@ if (!verified) {
326
363
  if (vdsScriptsDir) {
327
364
  try {
328
365
  const uvVer = execSync(`uv run --directory ${JSON.stringify(vdsScriptsDir)} --package vds-cli vds-cli version`, {
329
- stdio: 'pipe', encoding: 'utf-8', timeout: 15000,
366
+ stdio: 'pipe', encoding: 'utf-8', timeout: 60000,
330
367
  }).trim();
331
368
  log(' ', `Direct uv run works: ${uvVer}`);
332
369
  log(' ', 'Issue is with the wrapper script, not uv/vds-cli');
@@ -48,19 +48,22 @@ Do **not** use this skill as the authoritative deep runbook for:
48
48
 
49
49
  ## Primary Command Entry Points
50
50
 
51
+ **Resolution order** — try each in sequence, use the first that works:
52
+
51
53
  ```bash
52
- # Via vds-cli on PATH (recommended — MCP-registered)
54
+ # 1. Project-local wrapper (recommended — works with nvm, no PATH setup needed)
55
+ .claude/bin/vds-cli --help
56
+ .claude/bin/vds-cli confluence --help
57
+ .claude/bin/vds-cli jira --help
58
+ .claude/bin/vds-cli bitbucket --help
59
+
60
+ # 2. On PATH (if user added .claude/bin to PATH or installed globally)
53
61
  vds-cli --help
54
- vds-cli confluence --help
55
- vds-cli jira --help
56
- vds-cli bitbucket --help
57
- vds-cli git --help
58
62
 
59
- # Direct uv invocation — project-local
63
+ # 3. Direct uv invocation — project-local fallback
60
64
  uv run --directory .claude/vds-scripts --package vds-cli vds-cli --help
61
- uv run --directory .claude/vds-scripts --package audit_orchestrator vds-audit --help
62
65
 
63
- # Direct uv invocation — global fallback
66
+ # 4. Direct uv invocation — global fallback
64
67
  uv run --directory ~/.claude/vds-scripts --package vds-cli vds-cli --help
65
68
  ```
66
69