@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 +1 -1
- package/package.json +60 -60
- package/src/codex/context.js +2 -0
- package/src/codex/techniques.js +26 -2
- package/src/cursor/techniques.js +23 -3
package/README.md
CHANGED
package/package.json
CHANGED
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@nerviq/cli",
|
|
3
|
-
"version": "1.17.
|
|
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
|
+
}
|
package/src/codex/context.js
CHANGED
|
@@ -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;
|
package/src/codex/techniques.js
CHANGED
|
@@ -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
|
-
|
|
3578
|
-
|
|
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',
|
package/src/cursor/techniques.js
CHANGED
|
@@ -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
|
-
|
|
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: '
|
|
1356
|
+
impact: 'low',
|
|
1337
1357
|
rating: 3,
|
|
1338
1358
|
category: 'bugbot',
|
|
1339
|
-
fix: '
|
|
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,
|