@nerviq/cli 1.17.0 → 1.17.2

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 CHANGED
@@ -223,7 +223,7 @@ All successful operational responses are wrapped in a JSON envelope:
223
223
  {
224
224
  "data": {},
225
225
  "meta": {
226
- "version": "1.17.0",
226
+ "version": "1.17.2",
227
227
  "timestamp": "2026-04-12T12:00:00.000Z"
228
228
  }
229
229
  }
package/package.json CHANGED
@@ -1,60 +1,60 @@
1
- {
2
- "name": "@nerviq/cli",
3
- "version": "1.17.0",
4
- "description": "The intelligent nervous system for AI coding agents — 2,441 checks (8 platforms × ~300 governance rules), 10 languages, 62 domain packs. Audit, align, and amplify.",
5
- "main": "src/index.js",
6
- "bin": {
7
- "nerviq": "bin/cli.js",
8
- "@nerviq/cli": "bin/cli.js",
9
- "nerviq-mcp": "src/mcp-server.js"
10
- },
11
- "files": [
12
- "bin",
13
- "src",
14
- "README.md"
15
- ],
16
- "scripts": {
17
- "start": "node bin/cli.js",
18
- "build": "npm pack --dry-run",
19
- "test": "node test/run.js",
20
- "verify:release-metadata": "node tools/validate-release-metadata.js",
21
- "test:jest": "jest",
22
- "test:coverage": "jest --coverage",
23
- "test:all": "npm test && npx jest && node test/check-matrix.js && node test/codex-check-matrix.js && node test/gemini-check-matrix.js && node test/copilot-check-matrix.js && node test/cursor-check-matrix.js && node test/windsurf-check-matrix.js && node test/aider-check-matrix.js && node test/opencode-check-matrix.js && node test/golden-matrix.js && node test/codex-golden-matrix.js && node test/gemini-golden-matrix.js && node test/copilot-golden-matrix.js && node test/cursor-golden-matrix.js && node test/windsurf-golden-matrix.js && node test/aider-golden-matrix.js && node test/opencode-golden-matrix.js",
24
- "benchmark:perf": "node tools/benchmark.js",
25
- "catalog": "node -e \"const {generateCatalog}=require('./src/catalog');console.log(JSON.stringify(generateCatalog(),null,2))\""
26
- },
27
- "keywords": [
28
- "nerviq",
29
- "ai-agents",
30
- "agent-governance",
31
- "agent-config",
32
- "harmony",
33
- "synergy",
34
- "audit",
35
- "claude",
36
- "codex",
37
- "gemini",
38
- "copilot",
39
- "cursor",
40
- "windsurf",
41
- "aider",
42
- "developer-tools",
43
- "cli",
44
- "mcp",
45
- "multi-agent"
46
- ],
47
- "author": "Nerviq <hello@nerviq.net>",
48
- "license": "AGPL-3.0",
49
- "repository": {
50
- "type": "git",
51
- "url": "git+https://github.com/nerviq/nerviq.git"
52
- },
53
- "homepage": "https://nerviq.net",
54
- "engines": {
55
- "node": ">=18.0.0"
56
- },
57
- "devDependencies": {
58
- "jest": "^30.3.0"
59
- }
60
- }
1
+ {
2
+ "name": "@nerviq/cli",
3
+ "version": "1.17.2",
4
+ "description": "The intelligent nervous system for AI coding agents — 2,441 checks (8 platforms × ~300 governance rules), 10 languages, 62 domain packs. Audit, align, and amplify.",
5
+ "main": "src/index.js",
6
+ "bin": {
7
+ "nerviq": "bin/cli.js",
8
+ "@nerviq/cli": "bin/cli.js",
9
+ "nerviq-mcp": "src/mcp-server.js"
10
+ },
11
+ "files": [
12
+ "bin",
13
+ "src",
14
+ "README.md"
15
+ ],
16
+ "scripts": {
17
+ "start": "node bin/cli.js",
18
+ "build": "npm pack --dry-run",
19
+ "test": "node test/run.js",
20
+ "verify:release-metadata": "node tools/validate-release-metadata.js",
21
+ "test:jest": "jest",
22
+ "test:coverage": "jest --coverage",
23
+ "test:all": "npm test && npx jest && node test/check-matrix.js && node test/codex-check-matrix.js && node test/gemini-check-matrix.js && node test/copilot-check-matrix.js && node test/cursor-check-matrix.js && node test/windsurf-check-matrix.js && node test/aider-check-matrix.js && node test/opencode-check-matrix.js && node test/golden-matrix.js && node test/codex-golden-matrix.js && node test/gemini-golden-matrix.js && node test/copilot-golden-matrix.js && node test/cursor-golden-matrix.js && node test/windsurf-golden-matrix.js && node test/aider-golden-matrix.js && node test/opencode-golden-matrix.js",
24
+ "benchmark:perf": "node tools/benchmark.js",
25
+ "catalog": "node -e \"const {generateCatalog}=require('./src/catalog');console.log(JSON.stringify(generateCatalog(),null,2))\""
26
+ },
27
+ "keywords": [
28
+ "nerviq",
29
+ "ai-agents",
30
+ "agent-governance",
31
+ "agent-config",
32
+ "harmony",
33
+ "synergy",
34
+ "audit",
35
+ "claude",
36
+ "codex",
37
+ "gemini",
38
+ "copilot",
39
+ "cursor",
40
+ "windsurf",
41
+ "aider",
42
+ "developer-tools",
43
+ "cli",
44
+ "mcp",
45
+ "multi-agent"
46
+ ],
47
+ "author": "Nerviq <hello@nerviq.net>",
48
+ "license": "AGPL-3.0",
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "git+https://github.com/nerviq/nerviq.git"
52
+ },
53
+ "homepage": "https://nerviq.net",
54
+ "engines": {
55
+ "node": ">=18.0.0"
56
+ },
57
+ "devDependencies": {
58
+ "jest": "^30.3.0"
59
+ }
60
+ }
@@ -62,6 +62,8 @@ class CodexProjectContext extends ProjectContext {
62
62
 
63
63
  agentsMdPath() {
64
64
  if (this.fileContent('AGENTS.md')) return 'AGENTS.md';
65
+ // .codex/AGENTS.md is an emerging pattern (e.g., jessfraz/dotfiles)
66
+ if (this.fileContent('.codex/AGENTS.md')) return '.codex/AGENTS.md';
65
67
  const fallbackNames = this.projectDocFallbackFilenames();
66
68
  for (const fileName of fallbackNames) {
67
69
  if (this.fileContent(fileName)) return fileName;
@@ -3113,6 +3113,11 @@ const CODEX_TECHNIQUES = {
3113
3113
  'Makefile', 'CMakeLists.txt', 'Package.swift', 'pubspec.yaml',
3114
3114
  ];
3115
3115
  const hasManifest = manifestFiles.some(f => ctx.files.includes(f));
3116
+ // Dotfiles/config-only repos: they don't ship code, so pack recommendations
3117
+ // aren't meaningful — N/A is the correct answer.
3118
+ const dotfilesSignals = ['.zshrc', '.bashrc', '.vimrc', '.tmux.conf', '.gitconfig', 'install.sh', 'bootstrap.sh'];
3119
+ const looksLikeDotfiles = dotfilesSignals.filter(f => ctx.files.includes(f)).length >= 2;
3120
+ if (looksLikeDotfiles) return null;
3116
3121
  // If no signals at all, N/A rather than fail
3117
3122
  if (!agents && !config && !hasManifest) return null;
3118
3123
  // At least 2 signal sources for grounded recommendation
@@ -3574,8 +3579,27 @@ const CODEX_TECHNIQUES = {
3574
3579
  check: (ctx) => {
3575
3580
  const hasPy = ctx.files.some(f => /pyproject\.toml$|requirements\.txt$|setup\.py$|manage\.py$/.test(f));
3576
3581
  if (!hasPy) return null;
3577
- // Path-separator agnostic: match both forward and back slashes (Windows compat)
3578
- return ctx.files.some(f => /(^|[/\\])src[/\\].*[/\\]__init__\.py$|^[^/\\]+[/\\]__init__\.py$/.test(f));
3582
+ const fs = require('fs');
3583
+ const path = require('path');
3584
+ // ctx.files only lists root — probe common package layouts directly
3585
+ try {
3586
+ // src/ layout: look for any src/*/__init__.py
3587
+ const srcDir = path.join(ctx.dir, 'src');
3588
+ if (fs.existsSync(srcDir) && fs.statSync(srcDir).isDirectory()) {
3589
+ const entries = fs.readdirSync(srcDir, { withFileTypes: true });
3590
+ for (const e of entries) {
3591
+ if (e.isDirectory() && fs.existsSync(path.join(srcDir, e.name, '__init__.py'))) return true;
3592
+ }
3593
+ }
3594
+ // Flat layout: <package>/__init__.py at root
3595
+ const rootEntries = fs.readdirSync(ctx.dir, { withFileTypes: true });
3596
+ for (const e of rootEntries) {
3597
+ if (e.isDirectory() && !e.name.startsWith('.') && e.name !== 'tests' && e.name !== 'docs') {
3598
+ if (fs.existsSync(path.join(ctx.dir, e.name, '__init__.py'))) return true;
3599
+ }
3600
+ }
3601
+ } catch { /* fall through */ }
3602
+ return false;
3579
3603
  },
3580
3604
  impact: 'medium',
3581
3605
  category: 'python',
@@ -1331,12 +1331,32 @@ const CURSOR_TECHNIQUES = {
1331
1331
  check: (ctx) => {
1332
1332
  const docs = docsBundle(ctx);
1333
1333
  if (!docs.trim()) return null;
1334
- return /bugbot|bug.?bot|automated.*pr.*review/i.test(docs);
1334
+ // BugBot is an optional Cursor enterprise feature requiring separate installation.
1335
+ // Return N/A unless there is actual evidence the repo uses or intends to use BugBot.
1336
+ const files = new Set(ctx.files || []);
1337
+ const hasBugbotConfigFile = ['bugbot.yml', 'bugbot.yaml', '.bugbot.yml', '.bugbot.yaml'].some(f => files.has(f));
1338
+ let hasBugbotWorkflow = false;
1339
+ try {
1340
+ const fs = require('fs');
1341
+ const path = require('path');
1342
+ const wfDir = path.join(ctx.dir, '.github', 'workflows');
1343
+ if (fs.existsSync(wfDir)) {
1344
+ const wfFiles = fs.readdirSync(wfDir).filter(f => /\.ya?ml$/i.test(f));
1345
+ for (const f of wfFiles) {
1346
+ const content = fs.readFileSync(path.join(wfDir, f), 'utf8');
1347
+ if (/bugbot|bug.?bot/i.test(content)) { hasBugbotWorkflow = true; break; }
1348
+ }
1349
+ }
1350
+ } catch { /* no workflows dir */ }
1351
+ const mentionedInDocs = /bugbot|bug.?bot|automated.*pr.*review/i.test(docs);
1352
+ // N/A when no signal at all that this repo uses/wants BugBot
1353
+ if (!hasBugbotConfigFile && !hasBugbotWorkflow && !mentionedInDocs) return null;
1354
+ return hasBugbotConfigFile || hasBugbotWorkflow || mentionedInDocs;
1335
1355
  },
1336
- impact: 'medium',
1356
+ impact: 'low',
1337
1357
  rating: 3,
1338
1358
  category: 'bugbot',
1339
- fix: 'Enable BugBot for automated PR code review on critical repos.',
1359
+ fix: 'If you use BugBot for automated PR code review, document it in your rules or add the BugBot workflow. Otherwise ignore this check.',
1340
1360
  template: null,
1341
1361
  file: () => '.cursor/rules/',
1342
1362
  line: () => null,