@nerviq/cli 1.18.0 → 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 +2 -2
- package/bin/cli.js +130 -130
- package/package.json +1 -1
- 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/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/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 -783
- 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/init.js
CHANGED
|
@@ -1,184 +1,184 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const readline = require('readline');
|
|
4
|
-
const { detectPlatforms } = require('./public-api');
|
|
5
|
-
const { audit } = require('./audit');
|
|
6
|
-
const { setup } = require('./setup');
|
|
7
|
-
const { ProjectContext } = require('./context');
|
|
8
|
-
const { STACKS } = require('./techniques');
|
|
9
|
-
|
|
10
|
-
const PLATFORM_LABELS = {
|
|
11
|
-
claude: 'Claude Code',
|
|
12
|
-
codex: 'Codex',
|
|
13
|
-
gemini: 'Gemini CLI',
|
|
14
|
-
copilot: 'GitHub Copilot',
|
|
15
|
-
cursor: 'Cursor',
|
|
16
|
-
windsurf: 'Windsurf',
|
|
17
|
-
aider: 'Aider',
|
|
18
|
-
opencode: 'OpenCode',
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
const ALL_PLATFORMS = Object.keys(PLATFORM_LABELS);
|
|
22
|
-
|
|
23
|
-
const TEAM_SIZES = ['solo', 'small', 'team', 'enterprise'];
|
|
24
|
-
const TEAM_LABELS = {
|
|
25
|
-
solo: 'Solo developer',
|
|
26
|
-
small: 'Small team (2-5)',
|
|
27
|
-
team: 'Team (6-20)',
|
|
28
|
-
enterprise: 'Enterprise (20+)',
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
function prompt(rl, question) {
|
|
32
|
-
return new Promise((resolve) => {
|
|
33
|
-
rl.question(question, (answer) => resolve(answer.trim()));
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function detectStacks(dir) {
|
|
38
|
-
const ctx = new ProjectContext(dir);
|
|
39
|
-
return ctx.detectStacks(STACKS);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function labelPlatforms(platforms) {
|
|
43
|
-
return platforms.map((p) => PLATFORM_LABELS[p] || p).join(', ');
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function parsePlatforms(input) {
|
|
47
|
-
return input
|
|
48
|
-
.split(/[,\s]+/)
|
|
49
|
-
.map((s) => s.trim().toLowerCase())
|
|
50
|
-
.filter((s) => ALL_PLATFORMS.includes(s));
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
async function runInit(dir, flags) {
|
|
54
|
-
const rl = readline.createInterface({
|
|
55
|
-
input: process.stdin,
|
|
56
|
-
output: process.stdout,
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
const dim = '\x1b[2m';
|
|
60
|
-
const bold = '\x1b[1m';
|
|
61
|
-
const cyan = '\x1b[36m';
|
|
62
|
-
const green = '\x1b[32m';
|
|
63
|
-
const reset = '\x1b[0m';
|
|
64
|
-
|
|
65
|
-
console.log('');
|
|
66
|
-
console.log(`${bold} Welcome to Nerviq${reset} — let's set up your AI coding agent governance.`);
|
|
67
|
-
console.log('');
|
|
68
|
-
|
|
69
|
-
// --- Question 1: Platforms ---
|
|
70
|
-
const detected = detectPlatforms(dir);
|
|
71
|
-
const detectedLabel = detected.length > 0
|
|
72
|
-
? `${dim}[auto-detected: ${labelPlatforms(detected)}]${reset}`
|
|
73
|
-
: `${dim}[no platforms detected]${reset}`;
|
|
74
|
-
console.log(` ${bold}1.${reset} Which platform(s) do you use?`);
|
|
75
|
-
console.log(` ${detectedLabel}`);
|
|
76
|
-
const platformInput = await prompt(
|
|
77
|
-
rl,
|
|
78
|
-
` ${dim}> Press Enter to confirm, or type: ${ALL_PLATFORMS.join(',')}${reset}\n > `,
|
|
79
|
-
);
|
|
80
|
-
const platforms = platformInput === ''
|
|
81
|
-
? (detected.length > 0 ? detected : ['claude'])
|
|
82
|
-
: parsePlatforms(platformInput);
|
|
83
|
-
if (platforms.length === 0) platforms.push('claude');
|
|
84
|
-
|
|
85
|
-
console.log('');
|
|
86
|
-
|
|
87
|
-
// --- Question 2: Stack ---
|
|
88
|
-
const stacks = detectStacks(dir);
|
|
89
|
-
const stackLabels = stacks.map((s) => s.label);
|
|
90
|
-
const stackDetectedLabel = stackLabels.length > 0
|
|
91
|
-
? `${dim}[auto-detected: ${stackLabels.join(', ')}]${reset}`
|
|
92
|
-
: `${dim}[no stack detected]${reset}`;
|
|
93
|
-
console.log(` ${bold}2.${reset} What's your primary stack?`);
|
|
94
|
-
console.log(` ${stackDetectedLabel}`);
|
|
95
|
-
const stackInput = await prompt(
|
|
96
|
-
rl,
|
|
97
|
-
` ${dim}> Press Enter to confirm, or type your stack${reset}\n > `,
|
|
98
|
-
);
|
|
99
|
-
const stackDisplay = stackInput === ''
|
|
100
|
-
? (stackLabels.length > 0 ? stackLabels.join(', ') : 'General')
|
|
101
|
-
: stackInput;
|
|
102
|
-
|
|
103
|
-
console.log('');
|
|
104
|
-
|
|
105
|
-
// --- Question 3: Team size ---
|
|
106
|
-
console.log(` ${bold}3.${reset} What's your team size?`);
|
|
107
|
-
const teamInput = await prompt(
|
|
108
|
-
rl,
|
|
109
|
-
` ${dim}> solo / small (2-5) / team (6-20) / enterprise (20+)${reset}\n > `,
|
|
110
|
-
);
|
|
111
|
-
const teamKey = TEAM_SIZES.find((t) => teamInput.toLowerCase().startsWith(t)) || 'solo';
|
|
112
|
-
const teamLabel = TEAM_LABELS[teamKey];
|
|
113
|
-
|
|
114
|
-
rl.close();
|
|
115
|
-
|
|
116
|
-
console.log('');
|
|
117
|
-
console.log(` ${cyan}Setting up for: ${labelPlatforms(platforms)} | ${stackDisplay} | ${teamLabel}${reset}`);
|
|
118
|
-
console.log('');
|
|
119
|
-
|
|
120
|
-
// --- Run audit (before) ---
|
|
121
|
-
const primaryPlatform = platforms[0];
|
|
122
|
-
console.log(` ${dim}Running audit...${reset}`);
|
|
123
|
-
const preResult = await audit({ dir, silent: true, platform: primaryPlatform });
|
|
124
|
-
const preScore = preResult.score;
|
|
125
|
-
console.log(` Score: ${bold}${preScore}/100${reset}`);
|
|
126
|
-
console.log('');
|
|
127
|
-
|
|
128
|
-
// --- Run setup ---
|
|
129
|
-
console.log(` ${dim}Running setup...${reset}`);
|
|
130
|
-
const setupResult = await setup({
|
|
131
|
-
dir,
|
|
132
|
-
platform: primaryPlatform,
|
|
133
|
-
silent: true,
|
|
134
|
-
profile: 'safe-write',
|
|
135
|
-
mcpPacks: [],
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
for (const f of setupResult.writtenFiles) {
|
|
139
|
-
console.log(` ${green}✅${reset} Created ${f}`);
|
|
140
|
-
}
|
|
141
|
-
for (const f of setupResult.preservedFiles) {
|
|
142
|
-
console.log(` ${dim}⏭️ Kept ${f} (already exists)${reset}`);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// --- Run additional platform setups ---
|
|
146
|
-
for (const plat of platforms.slice(1)) {
|
|
147
|
-
try {
|
|
148
|
-
const extraResult = await setup({
|
|
149
|
-
dir,
|
|
150
|
-
platform: plat,
|
|
151
|
-
silent: true,
|
|
152
|
-
profile: 'safe-write',
|
|
153
|
-
mcpPacks: [],
|
|
154
|
-
});
|
|
155
|
-
for (const f of extraResult.writtenFiles) {
|
|
156
|
-
console.log(` ${green}✅${reset} Created ${f}`);
|
|
157
|
-
}
|
|
158
|
-
} catch {
|
|
159
|
-
// Platform setup not available, skip
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// --- Run audit (after) ---
|
|
164
|
-
const postResult = await audit({ dir, silent: true, platform: primaryPlatform });
|
|
165
|
-
const postScore = postResult.score;
|
|
166
|
-
const delta = postScore - preScore;
|
|
167
|
-
|
|
168
|
-
if (delta > 0) {
|
|
169
|
-
console.log(` Score: ${bold}${postScore}/100${reset} (${green}+${delta}${reset})`);
|
|
170
|
-
} else {
|
|
171
|
-
console.log(` Score: ${bold}${postScore}/100${reset}`);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
console.log('');
|
|
175
|
-
console.log(` ${bold}Next steps:${reset}`);
|
|
176
|
-
console.log(` - Review: ${cyan}nerviq audit --full${reset}`);
|
|
177
|
-
if (platforms.length > 1) {
|
|
178
|
-
console.log(` - Cross-platform: ${cyan}nerviq harmony-audit${reset}`);
|
|
179
|
-
}
|
|
180
|
-
console.log(` - Customize: ${cyan}nerviq augment${reset}`);
|
|
181
|
-
console.log('');
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
module.exports = { runInit };
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const readline = require('readline');
|
|
4
|
+
const { detectPlatforms } = require('./public-api');
|
|
5
|
+
const { audit } = require('./audit');
|
|
6
|
+
const { setup } = require('./setup');
|
|
7
|
+
const { ProjectContext } = require('./context');
|
|
8
|
+
const { STACKS } = require('./techniques');
|
|
9
|
+
|
|
10
|
+
const PLATFORM_LABELS = {
|
|
11
|
+
claude: 'Claude Code',
|
|
12
|
+
codex: 'Codex',
|
|
13
|
+
gemini: 'Gemini CLI',
|
|
14
|
+
copilot: 'GitHub Copilot',
|
|
15
|
+
cursor: 'Cursor',
|
|
16
|
+
windsurf: 'Windsurf',
|
|
17
|
+
aider: 'Aider',
|
|
18
|
+
opencode: 'OpenCode',
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const ALL_PLATFORMS = Object.keys(PLATFORM_LABELS);
|
|
22
|
+
|
|
23
|
+
const TEAM_SIZES = ['solo', 'small', 'team', 'enterprise'];
|
|
24
|
+
const TEAM_LABELS = {
|
|
25
|
+
solo: 'Solo developer',
|
|
26
|
+
small: 'Small team (2-5)',
|
|
27
|
+
team: 'Team (6-20)',
|
|
28
|
+
enterprise: 'Enterprise (20+)',
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
function prompt(rl, question) {
|
|
32
|
+
return new Promise((resolve) => {
|
|
33
|
+
rl.question(question, (answer) => resolve(answer.trim()));
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function detectStacks(dir) {
|
|
38
|
+
const ctx = new ProjectContext(dir);
|
|
39
|
+
return ctx.detectStacks(STACKS);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function labelPlatforms(platforms) {
|
|
43
|
+
return platforms.map((p) => PLATFORM_LABELS[p] || p).join(', ');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function parsePlatforms(input) {
|
|
47
|
+
return input
|
|
48
|
+
.split(/[,\s]+/)
|
|
49
|
+
.map((s) => s.trim().toLowerCase())
|
|
50
|
+
.filter((s) => ALL_PLATFORMS.includes(s));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function runInit(dir, flags) {
|
|
54
|
+
const rl = readline.createInterface({
|
|
55
|
+
input: process.stdin,
|
|
56
|
+
output: process.stdout,
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const dim = '\x1b[2m';
|
|
60
|
+
const bold = '\x1b[1m';
|
|
61
|
+
const cyan = '\x1b[36m';
|
|
62
|
+
const green = '\x1b[32m';
|
|
63
|
+
const reset = '\x1b[0m';
|
|
64
|
+
|
|
65
|
+
console.log('');
|
|
66
|
+
console.log(`${bold} Welcome to Nerviq${reset} — let's set up your AI coding agent governance.`);
|
|
67
|
+
console.log('');
|
|
68
|
+
|
|
69
|
+
// --- Question 1: Platforms ---
|
|
70
|
+
const detected = detectPlatforms(dir);
|
|
71
|
+
const detectedLabel = detected.length > 0
|
|
72
|
+
? `${dim}[auto-detected: ${labelPlatforms(detected)}]${reset}`
|
|
73
|
+
: `${dim}[no platforms detected]${reset}`;
|
|
74
|
+
console.log(` ${bold}1.${reset} Which platform(s) do you use?`);
|
|
75
|
+
console.log(` ${detectedLabel}`);
|
|
76
|
+
const platformInput = await prompt(
|
|
77
|
+
rl,
|
|
78
|
+
` ${dim}> Press Enter to confirm, or type: ${ALL_PLATFORMS.join(',')}${reset}\n > `,
|
|
79
|
+
);
|
|
80
|
+
const platforms = platformInput === ''
|
|
81
|
+
? (detected.length > 0 ? detected : ['claude'])
|
|
82
|
+
: parsePlatforms(platformInput);
|
|
83
|
+
if (platforms.length === 0) platforms.push('claude');
|
|
84
|
+
|
|
85
|
+
console.log('');
|
|
86
|
+
|
|
87
|
+
// --- Question 2: Stack ---
|
|
88
|
+
const stacks = detectStacks(dir);
|
|
89
|
+
const stackLabels = stacks.map((s) => s.label);
|
|
90
|
+
const stackDetectedLabel = stackLabels.length > 0
|
|
91
|
+
? `${dim}[auto-detected: ${stackLabels.join(', ')}]${reset}`
|
|
92
|
+
: `${dim}[no stack detected]${reset}`;
|
|
93
|
+
console.log(` ${bold}2.${reset} What's your primary stack?`);
|
|
94
|
+
console.log(` ${stackDetectedLabel}`);
|
|
95
|
+
const stackInput = await prompt(
|
|
96
|
+
rl,
|
|
97
|
+
` ${dim}> Press Enter to confirm, or type your stack${reset}\n > `,
|
|
98
|
+
);
|
|
99
|
+
const stackDisplay = stackInput === ''
|
|
100
|
+
? (stackLabels.length > 0 ? stackLabels.join(', ') : 'General')
|
|
101
|
+
: stackInput;
|
|
102
|
+
|
|
103
|
+
console.log('');
|
|
104
|
+
|
|
105
|
+
// --- Question 3: Team size ---
|
|
106
|
+
console.log(` ${bold}3.${reset} What's your team size?`);
|
|
107
|
+
const teamInput = await prompt(
|
|
108
|
+
rl,
|
|
109
|
+
` ${dim}> solo / small (2-5) / team (6-20) / enterprise (20+)${reset}\n > `,
|
|
110
|
+
);
|
|
111
|
+
const teamKey = TEAM_SIZES.find((t) => teamInput.toLowerCase().startsWith(t)) || 'solo';
|
|
112
|
+
const teamLabel = TEAM_LABELS[teamKey];
|
|
113
|
+
|
|
114
|
+
rl.close();
|
|
115
|
+
|
|
116
|
+
console.log('');
|
|
117
|
+
console.log(` ${cyan}Setting up for: ${labelPlatforms(platforms)} | ${stackDisplay} | ${teamLabel}${reset}`);
|
|
118
|
+
console.log('');
|
|
119
|
+
|
|
120
|
+
// --- Run audit (before) ---
|
|
121
|
+
const primaryPlatform = platforms[0];
|
|
122
|
+
console.log(` ${dim}Running audit...${reset}`);
|
|
123
|
+
const preResult = await audit({ dir, silent: true, platform: primaryPlatform });
|
|
124
|
+
const preScore = preResult.score;
|
|
125
|
+
console.log(` Score: ${bold}${preScore}/100${reset}`);
|
|
126
|
+
console.log('');
|
|
127
|
+
|
|
128
|
+
// --- Run setup ---
|
|
129
|
+
console.log(` ${dim}Running setup...${reset}`);
|
|
130
|
+
const setupResult = await setup({
|
|
131
|
+
dir,
|
|
132
|
+
platform: primaryPlatform,
|
|
133
|
+
silent: true,
|
|
134
|
+
profile: 'safe-write',
|
|
135
|
+
mcpPacks: [],
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
for (const f of setupResult.writtenFiles) {
|
|
139
|
+
console.log(` ${green}✅${reset} Created ${f}`);
|
|
140
|
+
}
|
|
141
|
+
for (const f of setupResult.preservedFiles) {
|
|
142
|
+
console.log(` ${dim}⏭️ Kept ${f} (already exists)${reset}`);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// --- Run additional platform setups ---
|
|
146
|
+
for (const plat of platforms.slice(1)) {
|
|
147
|
+
try {
|
|
148
|
+
const extraResult = await setup({
|
|
149
|
+
dir,
|
|
150
|
+
platform: plat,
|
|
151
|
+
silent: true,
|
|
152
|
+
profile: 'safe-write',
|
|
153
|
+
mcpPacks: [],
|
|
154
|
+
});
|
|
155
|
+
for (const f of extraResult.writtenFiles) {
|
|
156
|
+
console.log(` ${green}✅${reset} Created ${f}`);
|
|
157
|
+
}
|
|
158
|
+
} catch {
|
|
159
|
+
// Platform setup not available, skip
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// --- Run audit (after) ---
|
|
164
|
+
const postResult = await audit({ dir, silent: true, platform: primaryPlatform });
|
|
165
|
+
const postScore = postResult.score;
|
|
166
|
+
const delta = postScore - preScore;
|
|
167
|
+
|
|
168
|
+
if (delta > 0) {
|
|
169
|
+
console.log(` Score: ${bold}${postScore}/100${reset} (${green}+${delta}${reset})`);
|
|
170
|
+
} else {
|
|
171
|
+
console.log(` Score: ${bold}${postScore}/100${reset}`);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
console.log('');
|
|
175
|
+
console.log(` ${bold}Next steps:${reset}`);
|
|
176
|
+
console.log(` - Review: ${cyan}nerviq audit --full${reset}`);
|
|
177
|
+
if (platforms.length > 1) {
|
|
178
|
+
console.log(` - Cross-platform: ${cyan}nerviq harmony-audit${reset}`);
|
|
179
|
+
}
|
|
180
|
+
console.log(` - Customize: ${cyan}nerviq augment${reset}`);
|
|
181
|
+
console.log('');
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
module.exports = { runInit };
|