@nerviq/cli 1.17.3 → 1.19.0
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/LICENSE +23 -23
- package/README.md +4 -4
- package/bin/cli.js +61 -274
- package/package.json +60 -60
- package/src/activity.js +1039 -1039
- package/src/adoption-advisor.js +299 -299
- package/src/aider/config-parser.js +166 -166
- package/src/aider/context.js +158 -158
- package/src/aider/deep-review.js +316 -316
- package/src/aider/domain-packs.js +303 -303
- package/src/aider/freshness.js +93 -93
- package/src/aider/governance.js +253 -253
- package/src/aider/interactive.js +334 -334
- package/src/aider/mcp-packs.js +329 -329
- package/src/aider/patch.js +214 -214
- package/src/aider/plans.js +186 -186
- package/src/aider/premium.js +360 -360
- package/src/aider/setup.js +404 -404
- package/src/aider/techniques.js +16 -16
- package/src/analyze.js +951 -951
- package/src/anti-patterns.js +485 -485
- package/src/audit/instruction-files.js +180 -180
- package/src/audit/recommendations.js +577 -577
- package/src/auto-suggest.js +154 -154
- package/src/badge.js +13 -13
- package/src/behavioral-drift.js +801 -801
- package/src/benchmark.js +67 -67
- package/src/catalog.js +103 -103
- package/src/certification.js +128 -128
- package/src/codex/config-parser.js +183 -183
- package/src/codex/context.js +223 -223
- package/src/codex/deep-review.js +493 -493
- package/src/codex/domain-packs.js +394 -394
- package/src/codex/freshness.js +84 -84
- package/src/codex/governance.js +192 -192
- package/src/codex/interactive.js +618 -618
- package/src/codex/mcp-packs.js +914 -914
- package/src/codex/patch.js +209 -209
- package/src/codex/plans.js +251 -251
- package/src/codex/premium.js +614 -614
- package/src/codex/setup.js +591 -591
- package/src/context.js +320 -320
- package/src/continuous-ops.js +681 -681
- package/src/copilot/activity.js +309 -309
- package/src/copilot/config-parser.js +280 -226
- package/src/copilot/context.js +218 -197
- package/src/copilot/deep-review.js +346 -346
- package/src/copilot/domain-packs.js +372 -372
- package/src/copilot/freshness.js +57 -57
- package/src/copilot/governance.js +222 -222
- package/src/copilot/interactive.js +406 -406
- package/src/copilot/mcp-packs.js +826 -826
- package/src/copilot/plans.js +253 -253
- package/src/copilot/premium.js +451 -451
- package/src/copilot/setup.js +488 -488
- package/src/copilot/techniques.js +219 -78
- package/src/cost-tracking.js +61 -61
- package/src/cursor/activity.js +301 -301
- package/src/cursor/config-parser.js +265 -265
- package/src/cursor/context.js +256 -256
- package/src/cursor/deep-review.js +334 -334
- package/src/cursor/domain-packs.js +368 -368
- package/src/cursor/freshness.js +65 -65
- package/src/cursor/governance.js +229 -229
- package/src/cursor/interactive.js +391 -391
- package/src/cursor/mcp-packs.js +828 -828
- package/src/cursor/plans.js +254 -254
- package/src/cursor/premium.js +469 -469
- package/src/cursor/setup.js +488 -488
- package/src/dashboard.js +493 -493
- package/src/deep-review.js +428 -428
- package/src/deprecation.js +98 -98
- package/src/diff-only.js +280 -280
- package/src/doctor.js +119 -119
- package/src/domain-pack-expansion.js +1033 -1033
- package/src/domain-packs.js +387 -387
- package/src/feedback.js +178 -178
- package/src/fix-engine.js +783 -0
- package/src/fix-prompts.js +122 -122
- package/src/formatters/sarif.js +115 -115
- package/src/freshness.js +74 -74
- package/src/gemini/config-parser.js +275 -275
- package/src/gemini/context.js +221 -221
- package/src/gemini/deep-review.js +559 -559
- package/src/gemini/domain-packs.js +393 -393
- package/src/gemini/freshness.js +66 -66
- package/src/gemini/governance.js +201 -201
- package/src/gemini/interactive.js +860 -860
- package/src/gemini/mcp-packs.js +915 -915
- package/src/gemini/plans.js +269 -269
- package/src/gemini/premium.js +760 -760
- package/src/gemini/setup.js +692 -692
- package/src/gemini/techniques.js +14 -14
- package/src/governance.js +72 -72
- package/src/harmony/add.js +68 -68
- package/src/harmony/advisor.js +333 -333
- package/src/harmony/canon.js +565 -565
- package/src/harmony/cli.js +591 -591
- package/src/harmony/drift.js +401 -401
- package/src/harmony/governance.js +313 -313
- package/src/harmony/memory.js +239 -239
- package/src/harmony/sync.js +475 -475
- package/src/harmony/watch.js +370 -370
- package/src/hook-validation.js +342 -342
- package/src/index.js +271 -271
- package/src/init.js +184 -184
- package/src/instruction-surfaces.js +185 -185
- package/src/integrations.js +144 -144
- package/src/interactive.js +118 -118
- package/src/locales/en.json +1 -1
- package/src/locales/es.json +1 -1
- package/src/mcp-packs.js +830 -830
- package/src/mcp-server.js +726 -726
- package/src/mcp-validation.js +337 -337
- package/src/nerviq-sync.json +7 -7
- package/src/opencode/config-parser.js +109 -109
- package/src/opencode/context.js +247 -247
- package/src/opencode/deep-review.js +313 -313
- package/src/opencode/domain-packs.js +262 -262
- package/src/opencode/freshness.js +66 -66
- package/src/opencode/governance.js +159 -159
- package/src/opencode/interactive.js +392 -392
- package/src/opencode/mcp-packs.js +705 -705
- package/src/opencode/patch.js +184 -184
- package/src/opencode/plans.js +231 -231
- package/src/opencode/premium.js +413 -413
- package/src/opencode/setup.js +449 -449
- package/src/opencode/techniques.js +27 -27
- package/src/operating-profile.js +574 -574
- package/src/org.js +152 -152
- package/src/permission-rules.js +218 -218
- package/src/plans.js +839 -839
- package/src/platform-change-manifest.js +86 -86
- package/src/plugins.js +110 -110
- package/src/policy-layers.js +210 -210
- package/src/profiles.js +124 -124
- package/src/prompt-injection.js +74 -74
- package/src/public-api.js +173 -173
- package/src/recommendation-rules.js +84 -84
- package/src/repo-archetype.js +386 -386
- package/src/secret-patterns.js +39 -39
- package/src/server.js +527 -527
- package/src/setup/analysis.js +607 -607
- package/src/setup/runtime.js +172 -172
- package/src/setup.js +677 -677
- package/src/shared/capabilities.js +194 -194
- package/src/source-urls.js +132 -132
- package/src/stack-checks.js +565 -565
- package/src/supplemental-checks.js +13 -13
- package/src/synergy/adaptive.js +261 -261
- package/src/synergy/compensation.js +137 -137
- package/src/synergy/evidence.js +193 -193
- package/src/synergy/learning.js +199 -199
- package/src/synergy/patterns.js +227 -227
- package/src/synergy/ranking.js +83 -83
- package/src/synergy/report.js +165 -165
- package/src/synergy/routing.js +146 -146
- package/src/techniques/api.js +407 -407
- package/src/techniques/automation.js +316 -316
- package/src/techniques/compliance.js +257 -257
- package/src/techniques/hygiene.js +294 -294
- package/src/techniques/instructions.js +243 -243
- package/src/techniques/observability.js +226 -226
- package/src/techniques/optimization.js +142 -142
- package/src/techniques/quality.js +318 -318
- package/src/techniques/security.js +237 -237
- package/src/techniques/shared.js +443 -443
- package/src/techniques/stacks.js +2294 -2294
- package/src/techniques/tools.js +106 -106
- package/src/techniques/workflow.js +413 -413
- package/src/techniques.js +81 -81
- package/src/terminology.js +73 -73
- package/src/token-estimate.js +35 -35
- package/src/usage-patterns.js +99 -99
- package/src/verification-metadata.js +145 -145
- package/src/watch.js +247 -247
- package/src/windsurf/activity.js +302 -302
- package/src/windsurf/config-parser.js +267 -267
- package/src/windsurf/context.js +249 -249
- package/src/windsurf/deep-review.js +337 -337
- package/src/windsurf/domain-packs.js +370 -370
- package/src/windsurf/freshness.js +36 -36
- package/src/windsurf/governance.js +231 -231
- package/src/windsurf/interactive.js +388 -388
- package/src/windsurf/mcp-packs.js +792 -792
- package/src/windsurf/plans.js +247 -247
- package/src/windsurf/premium.js +468 -468
- package/src/windsurf/setup.js +471 -471
- package/src/windsurf/techniques.js +17 -17
- package/src/workspace.js +375 -375
package/src/aider/plans.js
CHANGED
|
@@ -1,186 +1,186 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Aider Proposal Families — proposal bundles for Aider setup improvements
|
|
3
|
-
*
|
|
4
|
-
* Simpler than IDE-based platforms since Aider has:
|
|
5
|
-
* - No hooks, MCP, skills, or agents to configure
|
|
6
|
-
* - Config: .aider.conf.yml, .env, conventions, .gitignore, .aiderignore
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
const path = require('path');
|
|
10
|
-
const { version } = require('../../package.json');
|
|
11
|
-
const { audit } = require('../audit');
|
|
12
|
-
const { analyzeProject } = require('../analyze');
|
|
13
|
-
const { buildAiderSetupFiles } = require('./setup');
|
|
14
|
-
const { getAiderMcpPreflight } = require('./mcp-packs');
|
|
15
|
-
|
|
16
|
-
function maturityFromScore(score) {
|
|
17
|
-
if (score >= 81) return 'mature';
|
|
18
|
-
if (score >= 61) return 'solid';
|
|
19
|
-
if (score >= 41) return 'developing';
|
|
20
|
-
if (score >= 21) return 'weak';
|
|
21
|
-
return 'raw';
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function triggerMatchesFile(result, filePath) {
|
|
25
|
-
if (filePath === '.aider.conf.yml') {
|
|
26
|
-
return result.file === '.aider.conf.yml' || ['config', 'model-config', 'git-safety', 'advanced-config'].includes(result.category);
|
|
27
|
-
}
|
|
28
|
-
if (filePath === 'CONVENTIONS.md') {
|
|
29
|
-
return result.file === 'CONVENTIONS.md' || result.category === 'conventions' || result.category === 'quality';
|
|
30
|
-
}
|
|
31
|
-
if (filePath === '.env') {
|
|
32
|
-
return result.file === '.env' || result.category === 'model-config';
|
|
33
|
-
}
|
|
34
|
-
if (filePath === '.gitignore') {
|
|
35
|
-
return result.file === '.gitignore' || result.category === 'security';
|
|
36
|
-
}
|
|
37
|
-
if (filePath === '.aiderignore') {
|
|
38
|
-
return result.file === '.aiderignore' || result.category === 'architecture';
|
|
39
|
-
}
|
|
40
|
-
return result.file === filePath;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function uniqueValues(items = []) {
|
|
44
|
-
return [...new Set(items.filter(Boolean))];
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function buildDomainPackGuidance(report) {
|
|
48
|
-
return (report.recommendedDomainPacks || []).map((pack) => ({
|
|
49
|
-
key: pack.key,
|
|
50
|
-
label: pack.label,
|
|
51
|
-
useWhen: pack.useWhen,
|
|
52
|
-
matchReasons: pack.matchReasons || [],
|
|
53
|
-
recommendedModules: pack.recommendedModules || [],
|
|
54
|
-
recommendedProposalFamilies: pack.recommendedProposalFamilies || [],
|
|
55
|
-
recommendedSurfaces: pack.recommendedSurfaces || [],
|
|
56
|
-
benchmarkFocus: pack.benchmarkFocus || [],
|
|
57
|
-
}));
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const PROPOSAL_FAMILIES = {
|
|
61
|
-
'.aider.conf.yml': {
|
|
62
|
-
id: 'aider-conf-yml',
|
|
63
|
-
label: 'Aider Configuration',
|
|
64
|
-
surface: '.aider.conf.yml',
|
|
65
|
-
reason: 'Core Aider config — model selection, git safety, verification loop.',
|
|
66
|
-
overwriteDefault: false,
|
|
67
|
-
},
|
|
68
|
-
'CONVENTIONS.md': {
|
|
69
|
-
id: 'aider-conventions',
|
|
70
|
-
label: 'Aider Conventions',
|
|
71
|
-
surface: 'CONVENTIONS.md',
|
|
72
|
-
reason: 'Project conventions that Aider reads via --read (no auto-discovery).',
|
|
73
|
-
overwriteDefault: false,
|
|
74
|
-
},
|
|
75
|
-
'.env': {
|
|
76
|
-
id: 'aider-env',
|
|
77
|
-
label: 'Environment Config',
|
|
78
|
-
surface: '.env',
|
|
79
|
-
reason: 'API keys and model configuration via environment variables.',
|
|
80
|
-
overwriteDefault: false,
|
|
81
|
-
},
|
|
82
|
-
'.aiderignore': {
|
|
83
|
-
id: 'aider-aiderignore',
|
|
84
|
-
label: 'Aider Ignore',
|
|
85
|
-
surface: '.aiderignore',
|
|
86
|
-
reason: 'File exclusion to keep Aider focused on relevant code.',
|
|
87
|
-
overwriteDefault: false,
|
|
88
|
-
},
|
|
89
|
-
'.gitignore': {
|
|
90
|
-
id: 'aider-gitignore',
|
|
91
|
-
label: 'Git Ignore Additions',
|
|
92
|
-
surface: '.gitignore',
|
|
93
|
-
reason: 'Exclude .aider* artifacts and .env from git.',
|
|
94
|
-
overwriteDefault: false,
|
|
95
|
-
},
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
function buildProposalsFromAudit(auditResult, setupFiles, domainPackGuidance) {
|
|
99
|
-
const proposals = [];
|
|
100
|
-
|
|
101
|
-
for (const file of setupFiles) {
|
|
102
|
-
const family = PROPOSAL_FAMILIES[file.path];
|
|
103
|
-
if (!family) continue;
|
|
104
|
-
|
|
105
|
-
const triggers = auditResult.results
|
|
106
|
-
.filter(r => !r.passed && triggerMatchesFile(r, file.path))
|
|
107
|
-
.map(r => ({ id: r.id, name: r.name, impact: r.impact }));
|
|
108
|
-
|
|
109
|
-
if (triggers.length === 0) continue;
|
|
110
|
-
|
|
111
|
-
const packContext = domainPackGuidance
|
|
112
|
-
.filter(pack => {
|
|
113
|
-
if (!pack.recommendedSurfaces || pack.recommendedSurfaces.length === 0) return true;
|
|
114
|
-
return pack.recommendedSurfaces.some(s => file.path === s || file.path.startsWith(s));
|
|
115
|
-
})
|
|
116
|
-
.map(pack => ({
|
|
117
|
-
key: pack.key,
|
|
118
|
-
label: pack.label,
|
|
119
|
-
why: pack.matchReasons[0] || pack.useWhen,
|
|
120
|
-
}));
|
|
121
|
-
|
|
122
|
-
proposals.push({
|
|
123
|
-
id: family.id,
|
|
124
|
-
label: family.label,
|
|
125
|
-
surface: family.surface,
|
|
126
|
-
reason: family.reason,
|
|
127
|
-
triggers,
|
|
128
|
-
packContext,
|
|
129
|
-
content: file.content,
|
|
130
|
-
overwriteDefault: family.overwriteDefault,
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
return proposals;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Build a full Aider proposal bundle.
|
|
139
|
-
*/
|
|
140
|
-
function buildAiderProposalBundle(options = {}) {
|
|
141
|
-
const dir = options.dir || process.cwd();
|
|
142
|
-
const auditResult = options.auditResult;
|
|
143
|
-
const analysisReport = options.analysisReport;
|
|
144
|
-
|
|
145
|
-
if (!auditResult || !analysisReport) {
|
|
146
|
-
throw new Error('buildAiderProposalBundle requires auditResult and analysisReport');
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
const domainPackGuidance = buildDomainPackGuidance(analysisReport);
|
|
150
|
-
const setupFiles = options.setupFiles || [];
|
|
151
|
-
const mcpPreflight = getAiderMcpPreflight();
|
|
152
|
-
const proposals = buildProposalsFromAudit(auditResult, setupFiles, domainPackGuidance);
|
|
153
|
-
|
|
154
|
-
return {
|
|
155
|
-
nerviqVersion: version,
|
|
156
|
-
createdAt: new Date().toISOString(),
|
|
157
|
-
platform: 'aider',
|
|
158
|
-
directory: dir,
|
|
159
|
-
projectSummary: {
|
|
160
|
-
name: path.basename(dir),
|
|
161
|
-
score: auditResult.score,
|
|
162
|
-
organicScore: auditResult.organicScore,
|
|
163
|
-
maturity: maturityFromScore(auditResult.score),
|
|
164
|
-
domains: analysisReport.projectSummary.domains || [],
|
|
165
|
-
},
|
|
166
|
-
strengthsPreserved: auditResult.results
|
|
167
|
-
.filter((item) => item.passed === true)
|
|
168
|
-
.slice(0, 5)
|
|
169
|
-
.map((item) => item.name),
|
|
170
|
-
topNextActions: auditResult.topNextActions,
|
|
171
|
-
recommendedDomainPacks: domainPackGuidance,
|
|
172
|
-
proposalFamilies: [...new Set(proposals.map(p => p.id))],
|
|
173
|
-
optionalModules: analysisReport.optionalModules || [],
|
|
174
|
-
riskNotes: uniqueValues([
|
|
175
|
-
...(analysisReport.riskNotes || []),
|
|
176
|
-
'Aider has no native MCP — use /web and editor extensions.',
|
|
177
|
-
'Git is the ONLY undo mechanism — ensure auto-commits is true.',
|
|
178
|
-
]),
|
|
179
|
-
mcpPreflightWarnings: mcpPreflight.warnings,
|
|
180
|
-
proposals,
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
module.exports = {
|
|
185
|
-
buildAiderProposalBundle,
|
|
186
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Aider Proposal Families — proposal bundles for Aider setup improvements
|
|
3
|
+
*
|
|
4
|
+
* Simpler than IDE-based platforms since Aider has:
|
|
5
|
+
* - No hooks, MCP, skills, or agents to configure
|
|
6
|
+
* - Config: .aider.conf.yml, .env, conventions, .gitignore, .aiderignore
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const path = require('path');
|
|
10
|
+
const { version } = require('../../package.json');
|
|
11
|
+
const { audit } = require('../audit');
|
|
12
|
+
const { analyzeProject } = require('../analyze');
|
|
13
|
+
const { buildAiderSetupFiles } = require('./setup');
|
|
14
|
+
const { getAiderMcpPreflight } = require('./mcp-packs');
|
|
15
|
+
|
|
16
|
+
function maturityFromScore(score) {
|
|
17
|
+
if (score >= 81) return 'mature';
|
|
18
|
+
if (score >= 61) return 'solid';
|
|
19
|
+
if (score >= 41) return 'developing';
|
|
20
|
+
if (score >= 21) return 'weak';
|
|
21
|
+
return 'raw';
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function triggerMatchesFile(result, filePath) {
|
|
25
|
+
if (filePath === '.aider.conf.yml') {
|
|
26
|
+
return result.file === '.aider.conf.yml' || ['config', 'model-config', 'git-safety', 'advanced-config'].includes(result.category);
|
|
27
|
+
}
|
|
28
|
+
if (filePath === 'CONVENTIONS.md') {
|
|
29
|
+
return result.file === 'CONVENTIONS.md' || result.category === 'conventions' || result.category === 'quality';
|
|
30
|
+
}
|
|
31
|
+
if (filePath === '.env') {
|
|
32
|
+
return result.file === '.env' || result.category === 'model-config';
|
|
33
|
+
}
|
|
34
|
+
if (filePath === '.gitignore') {
|
|
35
|
+
return result.file === '.gitignore' || result.category === 'security';
|
|
36
|
+
}
|
|
37
|
+
if (filePath === '.aiderignore') {
|
|
38
|
+
return result.file === '.aiderignore' || result.category === 'architecture';
|
|
39
|
+
}
|
|
40
|
+
return result.file === filePath;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function uniqueValues(items = []) {
|
|
44
|
+
return [...new Set(items.filter(Boolean))];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function buildDomainPackGuidance(report) {
|
|
48
|
+
return (report.recommendedDomainPacks || []).map((pack) => ({
|
|
49
|
+
key: pack.key,
|
|
50
|
+
label: pack.label,
|
|
51
|
+
useWhen: pack.useWhen,
|
|
52
|
+
matchReasons: pack.matchReasons || [],
|
|
53
|
+
recommendedModules: pack.recommendedModules || [],
|
|
54
|
+
recommendedProposalFamilies: pack.recommendedProposalFamilies || [],
|
|
55
|
+
recommendedSurfaces: pack.recommendedSurfaces || [],
|
|
56
|
+
benchmarkFocus: pack.benchmarkFocus || [],
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const PROPOSAL_FAMILIES = {
|
|
61
|
+
'.aider.conf.yml': {
|
|
62
|
+
id: 'aider-conf-yml',
|
|
63
|
+
label: 'Aider Configuration',
|
|
64
|
+
surface: '.aider.conf.yml',
|
|
65
|
+
reason: 'Core Aider config — model selection, git safety, verification loop.',
|
|
66
|
+
overwriteDefault: false,
|
|
67
|
+
},
|
|
68
|
+
'CONVENTIONS.md': {
|
|
69
|
+
id: 'aider-conventions',
|
|
70
|
+
label: 'Aider Conventions',
|
|
71
|
+
surface: 'CONVENTIONS.md',
|
|
72
|
+
reason: 'Project conventions that Aider reads via --read (no auto-discovery).',
|
|
73
|
+
overwriteDefault: false,
|
|
74
|
+
},
|
|
75
|
+
'.env': {
|
|
76
|
+
id: 'aider-env',
|
|
77
|
+
label: 'Environment Config',
|
|
78
|
+
surface: '.env',
|
|
79
|
+
reason: 'API keys and model configuration via environment variables.',
|
|
80
|
+
overwriteDefault: false,
|
|
81
|
+
},
|
|
82
|
+
'.aiderignore': {
|
|
83
|
+
id: 'aider-aiderignore',
|
|
84
|
+
label: 'Aider Ignore',
|
|
85
|
+
surface: '.aiderignore',
|
|
86
|
+
reason: 'File exclusion to keep Aider focused on relevant code.',
|
|
87
|
+
overwriteDefault: false,
|
|
88
|
+
},
|
|
89
|
+
'.gitignore': {
|
|
90
|
+
id: 'aider-gitignore',
|
|
91
|
+
label: 'Git Ignore Additions',
|
|
92
|
+
surface: '.gitignore',
|
|
93
|
+
reason: 'Exclude .aider* artifacts and .env from git.',
|
|
94
|
+
overwriteDefault: false,
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
function buildProposalsFromAudit(auditResult, setupFiles, domainPackGuidance) {
|
|
99
|
+
const proposals = [];
|
|
100
|
+
|
|
101
|
+
for (const file of setupFiles) {
|
|
102
|
+
const family = PROPOSAL_FAMILIES[file.path];
|
|
103
|
+
if (!family) continue;
|
|
104
|
+
|
|
105
|
+
const triggers = auditResult.results
|
|
106
|
+
.filter(r => !r.passed && triggerMatchesFile(r, file.path))
|
|
107
|
+
.map(r => ({ id: r.id, name: r.name, impact: r.impact }));
|
|
108
|
+
|
|
109
|
+
if (triggers.length === 0) continue;
|
|
110
|
+
|
|
111
|
+
const packContext = domainPackGuidance
|
|
112
|
+
.filter(pack => {
|
|
113
|
+
if (!pack.recommendedSurfaces || pack.recommendedSurfaces.length === 0) return true;
|
|
114
|
+
return pack.recommendedSurfaces.some(s => file.path === s || file.path.startsWith(s));
|
|
115
|
+
})
|
|
116
|
+
.map(pack => ({
|
|
117
|
+
key: pack.key,
|
|
118
|
+
label: pack.label,
|
|
119
|
+
why: pack.matchReasons[0] || pack.useWhen,
|
|
120
|
+
}));
|
|
121
|
+
|
|
122
|
+
proposals.push({
|
|
123
|
+
id: family.id,
|
|
124
|
+
label: family.label,
|
|
125
|
+
surface: family.surface,
|
|
126
|
+
reason: family.reason,
|
|
127
|
+
triggers,
|
|
128
|
+
packContext,
|
|
129
|
+
content: file.content,
|
|
130
|
+
overwriteDefault: family.overwriteDefault,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return proposals;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Build a full Aider proposal bundle.
|
|
139
|
+
*/
|
|
140
|
+
function buildAiderProposalBundle(options = {}) {
|
|
141
|
+
const dir = options.dir || process.cwd();
|
|
142
|
+
const auditResult = options.auditResult;
|
|
143
|
+
const analysisReport = options.analysisReport;
|
|
144
|
+
|
|
145
|
+
if (!auditResult || !analysisReport) {
|
|
146
|
+
throw new Error('buildAiderProposalBundle requires auditResult and analysisReport');
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const domainPackGuidance = buildDomainPackGuidance(analysisReport);
|
|
150
|
+
const setupFiles = options.setupFiles || [];
|
|
151
|
+
const mcpPreflight = getAiderMcpPreflight();
|
|
152
|
+
const proposals = buildProposalsFromAudit(auditResult, setupFiles, domainPackGuidance);
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
nerviqVersion: version,
|
|
156
|
+
createdAt: new Date().toISOString(),
|
|
157
|
+
platform: 'aider',
|
|
158
|
+
directory: dir,
|
|
159
|
+
projectSummary: {
|
|
160
|
+
name: path.basename(dir),
|
|
161
|
+
score: auditResult.score,
|
|
162
|
+
organicScore: auditResult.organicScore,
|
|
163
|
+
maturity: maturityFromScore(auditResult.score),
|
|
164
|
+
domains: analysisReport.projectSummary.domains || [],
|
|
165
|
+
},
|
|
166
|
+
strengthsPreserved: auditResult.results
|
|
167
|
+
.filter((item) => item.passed === true)
|
|
168
|
+
.slice(0, 5)
|
|
169
|
+
.map((item) => item.name),
|
|
170
|
+
topNextActions: auditResult.topNextActions,
|
|
171
|
+
recommendedDomainPacks: domainPackGuidance,
|
|
172
|
+
proposalFamilies: [...new Set(proposals.map(p => p.id))],
|
|
173
|
+
optionalModules: analysisReport.optionalModules || [],
|
|
174
|
+
riskNotes: uniqueValues([
|
|
175
|
+
...(analysisReport.riskNotes || []),
|
|
176
|
+
'Aider has no native MCP — use /web and editor extensions.',
|
|
177
|
+
'Git is the ONLY undo mechanism — ensure auto-commits is true.',
|
|
178
|
+
]),
|
|
179
|
+
mcpPreflightWarnings: mcpPreflight.warnings,
|
|
180
|
+
proposals,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
module.exports = {
|
|
185
|
+
buildAiderProposalBundle,
|
|
186
|
+
};
|