@nepopsx/cli 0.0.2 ā 0.0.4
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/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +113 -24
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/login.d.ts +7 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +108 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/scan.d.ts +2 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +405 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/sync.d.ts +2 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +68 -120
- package/dist/commands/sync.js.map +1 -1
- package/dist/generator/builtin-templates.d.ts +2 -1
- package/dist/generator/builtin-templates.d.ts.map +1 -1
- package/dist/generator/builtin-templates.js +161 -2
- package/dist/generator/builtin-templates.js.map +1 -1
- package/dist/generator/package-renderer.d.ts +37 -0
- package/dist/generator/package-renderer.d.ts.map +1 -0
- package/dist/generator/package-renderer.js +143 -0
- package/dist/generator/package-renderer.js.map +1 -0
- package/dist/generator/render.d.ts +11 -54
- package/dist/generator/render.d.ts.map +1 -1
- package/dist/generator/render.js +18 -174
- package/dist/generator/render.js.map +1 -1
- package/dist/index.js +32 -1
- package/dist/index.js.map +1 -1
- package/dist/licensing/fingerprint.test.d.ts +2 -0
- package/dist/licensing/fingerprint.test.d.ts.map +1 -0
- package/dist/licensing/fingerprint.test.js +41 -0
- package/dist/licensing/fingerprint.test.js.map +1 -0
- package/dist/licensing/installer.d.ts +43 -0
- package/dist/licensing/installer.d.ts.map +1 -0
- package/dist/licensing/installer.js +98 -0
- package/dist/licensing/installer.js.map +1 -0
- package/dist/scan/__tests__/context-gatherer.test.d.ts +2 -0
- package/dist/scan/__tests__/context-gatherer.test.d.ts.map +1 -0
- package/dist/scan/__tests__/context-gatherer.test.js +111 -0
- package/dist/scan/__tests__/context-gatherer.test.js.map +1 -0
- package/dist/scan/__tests__/merge.test.d.ts +2 -0
- package/dist/scan/__tests__/merge.test.d.ts.map +1 -0
- package/dist/scan/__tests__/merge.test.js +163 -0
- package/dist/scan/__tests__/merge.test.js.map +1 -0
- package/dist/scan/config.d.ts +24 -0
- package/dist/scan/config.d.ts.map +1 -0
- package/dist/scan/config.js +77 -0
- package/dist/scan/config.js.map +1 -0
- package/dist/scan/context/gatherer.d.ts +13 -0
- package/dist/scan/context/gatherer.d.ts.map +1 -0
- package/dist/scan/context/gatherer.js +97 -0
- package/dist/scan/context/gatherer.js.map +1 -0
- package/dist/scan/context/gitignore.d.ts +9 -0
- package/dist/scan/context/gitignore.d.ts.map +1 -0
- package/dist/scan/context/gitignore.js +50 -0
- package/dist/scan/context/gitignore.js.map +1 -0
- package/dist/scan/context/patterns.d.ts +14 -0
- package/dist/scan/context/patterns.d.ts.map +1 -0
- package/dist/scan/context/patterns.js +159 -0
- package/dist/scan/context/patterns.js.map +1 -0
- package/dist/scan/customs/writer.d.ts +6 -0
- package/dist/scan/customs/writer.d.ts.map +1 -0
- package/dist/scan/customs/writer.js +149 -0
- package/dist/scan/customs/writer.js.map +1 -0
- package/dist/scan/llm/anthropic.d.ts +11 -0
- package/dist/scan/llm/anthropic.d.ts.map +1 -0
- package/dist/scan/llm/anthropic.js +98 -0
- package/dist/scan/llm/anthropic.js.map +1 -0
- package/dist/scan/llm/factory.d.ts +4 -0
- package/dist/scan/llm/factory.d.ts.map +1 -0
- package/dist/scan/llm/factory.js +20 -0
- package/dist/scan/llm/factory.js.map +1 -0
- package/dist/scan/llm/ollama.d.ts +11 -0
- package/dist/scan/llm/ollama.d.ts.map +1 -0
- package/dist/scan/llm/ollama.js +73 -0
- package/dist/scan/llm/ollama.js.map +1 -0
- package/dist/scan/llm/openai.d.ts +12 -0
- package/dist/scan/llm/openai.d.ts.map +1 -0
- package/dist/scan/llm/openai.js +87 -0
- package/dist/scan/llm/openai.js.map +1 -0
- package/dist/scan/llm/types.d.ts +23 -0
- package/dist/scan/llm/types.d.ts.map +1 -0
- package/dist/scan/llm/types.js +3 -0
- package/dist/scan/llm/types.js.map +1 -0
- package/dist/scan/merge/diff-display.d.ts +11 -0
- package/dist/scan/merge/diff-display.d.ts.map +1 -0
- package/dist/scan/merge/diff-display.js +72 -0
- package/dist/scan/merge/diff-display.js.map +1 -0
- package/dist/scan/prompt/agent.d.ts +23 -0
- package/dist/scan/prompt/agent.d.ts.map +1 -0
- package/dist/scan/prompt/agent.js +95 -0
- package/dist/scan/prompt/agent.js.map +1 -0
- package/dist/scan/prompt/builder.d.ts +16 -0
- package/dist/scan/prompt/builder.d.ts.map +1 -0
- package/dist/scan/prompt/builder.js +64 -0
- package/dist/scan/prompt/builder.js.map +1 -0
- package/dist/scan/prompt/schema.d.ts +7 -0
- package/dist/scan/prompt/schema.d.ts.map +1 -0
- package/dist/scan/prompt/schema.js +52 -0
- package/dist/scan/prompt/schema.js.map +1 -0
- package/dist/security/scanner.d.ts +3 -40
- package/dist/security/scanner.d.ts.map +1 -1
- package/dist/security/scanner.js +3 -169
- package/dist/security/scanner.js.map +1 -1
- package/package.json +15 -12
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
// @nepopsx/cli ā Scan command orchestrator
|
|
2
|
+
import { closeSync, existsSync, fsyncSync, openSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
3
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { join, resolve } from 'node:path';
|
|
5
|
+
import { stringify as yamlStringify, parse as yamlParse } from 'yaml';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import { confirm } from '@inquirer/prompts';
|
|
8
|
+
import { mergeWorkspaceConfig, readScanState, validateScanResponse, writeScanState, } from '@nepopsx/core';
|
|
9
|
+
import { resolveScanConfig } from '../scan/config.js';
|
|
10
|
+
import { createProvider } from '../scan/llm/factory.js';
|
|
11
|
+
import { gatherContext } from '../scan/context/gatherer.js';
|
|
12
|
+
import { loadIgnoreFilter } from '../scan/context/gitignore.js';
|
|
13
|
+
import { buildServicePrompt, buildCrossServicePrompt } from '../scan/prompt/builder.js';
|
|
14
|
+
import { writeAgentPromptFiles } from '../scan/prompt/agent.js';
|
|
15
|
+
import { getScanResponseSchema, getServiceScanSchema, getCrossServiceScanSchema } from '../scan/prompt/schema.js';
|
|
16
|
+
import { displayDiff } from '../scan/merge/diff-display.js';
|
|
17
|
+
import { writeCustomsFiles } from '../scan/customs/writer.js';
|
|
18
|
+
const WORKSPACE_CONFIG_PATH = '.nepopsx/workspace.yaml';
|
|
19
|
+
const SCAN_CACHE_DIR = '.nepopsx/scan-cache';
|
|
20
|
+
/** Strip markdown code fences from an LLM response before JSON.parse */
|
|
21
|
+
function stripCodeFences(raw) {
|
|
22
|
+
return raw
|
|
23
|
+
.replace(/^```(?:json)?\s*\n?/m, '')
|
|
24
|
+
.replace(/\n?```\s*$/m, '')
|
|
25
|
+
.trim();
|
|
26
|
+
}
|
|
27
|
+
/** Redact sensitive values in verbose logs */
|
|
28
|
+
function redactApiKey(key) {
|
|
29
|
+
if (!key)
|
|
30
|
+
return '(not set)';
|
|
31
|
+
if (key.length <= 8)
|
|
32
|
+
return '***REDACTED***';
|
|
33
|
+
return `${key.slice(0, 4)}...***REDACTED***`;
|
|
34
|
+
}
|
|
35
|
+
/** Atomic write: tmp ā fsync ā rename */
|
|
36
|
+
async function atomicWrite(filePath, content) {
|
|
37
|
+
const tmpPath = `${filePath}.tmp`;
|
|
38
|
+
await writeFile(tmpPath, content, 'utf-8');
|
|
39
|
+
const fd = openSync(tmpPath, 'r+');
|
|
40
|
+
try {
|
|
41
|
+
fsyncSync(fd);
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
closeSync(fd);
|
|
45
|
+
}
|
|
46
|
+
renameSync(tmpPath, filePath);
|
|
47
|
+
}
|
|
48
|
+
/** Parse and validate an LLM response string, retrying with a repair hint on first failure */
|
|
49
|
+
async function parseAndValidate(raw, serviceName, retryFn) {
|
|
50
|
+
const attempt = (str) => {
|
|
51
|
+
try {
|
|
52
|
+
const parsed = JSON.parse(stripCodeFences(str));
|
|
53
|
+
// Wrap per-service result in a ScanResponse envelope if needed
|
|
54
|
+
const envelope = parsed && typeof parsed === 'object' && 'services' in parsed
|
|
55
|
+
? parsed
|
|
56
|
+
: { services: [parsed] };
|
|
57
|
+
const result = validateScanResponse(envelope);
|
|
58
|
+
if (result.valid)
|
|
59
|
+
return envelope;
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
const first = attempt(raw);
|
|
67
|
+
if (first)
|
|
68
|
+
return first;
|
|
69
|
+
if (retryFn) {
|
|
70
|
+
console.log(chalk.dim(` Retrying ${serviceName} with repair prompt...`));
|
|
71
|
+
try {
|
|
72
|
+
const repaired = await retryFn();
|
|
73
|
+
return attempt(repaired);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
export async function scanCommand(options) {
|
|
82
|
+
const cwd = process.cwd();
|
|
83
|
+
const configPath = resolve(cwd, WORKSPACE_CONFIG_PATH);
|
|
84
|
+
let tmpPath = null;
|
|
85
|
+
// SIGINT handler ā clean up tmp file on interrupt (C4)
|
|
86
|
+
process.on('SIGINT', () => {
|
|
87
|
+
if (tmpPath && existsSync(tmpPath)) {
|
|
88
|
+
try {
|
|
89
|
+
unlinkSync(tmpPath);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// ignore
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
console.log(chalk.yellow('\nScan interrupted. No changes written.'));
|
|
96
|
+
process.exit(1);
|
|
97
|
+
});
|
|
98
|
+
// āā C1: Validate workspace.yaml exists āāāāāāāāāāāāāāāāāāāāā
|
|
99
|
+
if (!existsSync(configPath)) {
|
|
100
|
+
console.error(chalk.red("Error: workspace.yaml not found. Run 'nepopsx init' first."));
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
// āā Load workspace config āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
104
|
+
let current;
|
|
105
|
+
try {
|
|
106
|
+
current = yamlParse(readFileSync(configPath, 'utf-8'));
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
console.error(chalk.red(`Error reading workspace.yaml: ${String(e)}`));
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
112
|
+
// āā C2: Services non-empty āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
113
|
+
if (!current.services || current.services.length === 0) {
|
|
114
|
+
console.error(chalk.red('Error: No services defined in workspace.yaml.'));
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
// āā Resolve scan config āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
118
|
+
const config = await resolveScanConfig(options, cwd);
|
|
119
|
+
if (config.verbose) {
|
|
120
|
+
console.log(chalk.dim(`Provider: ${config.provider} / Model: ${config.model}`));
|
|
121
|
+
console.log(chalk.dim(`API key: ${redactApiKey(config.apiKey)}`));
|
|
122
|
+
}
|
|
123
|
+
// āā Load scan state āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
124
|
+
const scanState = readScanState(cwd);
|
|
125
|
+
const existingConfig = yamlStringify(current);
|
|
126
|
+
const schema = getScanResponseSchema();
|
|
127
|
+
const serviceSchema = getServiceScanSchema();
|
|
128
|
+
const crossSchema = getCrossServiceScanSchema();
|
|
129
|
+
// āā --apply path āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
130
|
+
if (options.apply) {
|
|
131
|
+
const applyPath = resolve(cwd, options.apply);
|
|
132
|
+
if (!existsSync(applyPath)) {
|
|
133
|
+
console.error(chalk.red(`Error: Apply file not found: ${applyPath}`));
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
let applyRaw;
|
|
137
|
+
try {
|
|
138
|
+
applyRaw = JSON.parse(readFileSync(applyPath, 'utf-8'));
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
console.error(chalk.red('Error: Apply file is not valid JSON.'));
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
const validation = validateScanResponse(applyRaw);
|
|
145
|
+
if (!validation.valid) {
|
|
146
|
+
console.error(chalk.red('Error: Apply file does not match ScanResponse schema:'));
|
|
147
|
+
for (const e of validation.errors)
|
|
148
|
+
console.error(` ${e}`);
|
|
149
|
+
process.exit(1);
|
|
150
|
+
}
|
|
151
|
+
const scanResult = applyRaw;
|
|
152
|
+
await applyAndWrite(cwd, configPath, current, scanResult, scanState, config, 'agent');
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// āā --agent path āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
156
|
+
if (options.agent) {
|
|
157
|
+
const services = config.services
|
|
158
|
+
? current.services.filter((s) => config.services.includes(s.name))
|
|
159
|
+
: current.services;
|
|
160
|
+
console.log(chalk.bold.cyan('\nš NEPOPSX Scan ā Agent Mode\n'));
|
|
161
|
+
console.log(chalk.dim(`Gathering context for ${services.length} service(s)...`));
|
|
162
|
+
const serviceContexts = [];
|
|
163
|
+
for (const svc of services) {
|
|
164
|
+
const svcPath = resolve(cwd, svc.path);
|
|
165
|
+
if (!existsSync(svcPath)) {
|
|
166
|
+
console.log(chalk.yellow(` Skipping ${svc.name} ā directory not found`));
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
process.stdout.write(` ${svc.name}...`);
|
|
170
|
+
const ignoreFilter = loadIgnoreFilter(svcPath);
|
|
171
|
+
const context = await gatherContext(svcPath, svc.framework, config.agentBudget, ignoreFilter);
|
|
172
|
+
serviceContexts.push({ service: svc, context });
|
|
173
|
+
console.log(chalk.dim(` ${context.files.size} files, ~${context.totalTokens.toLocaleString()} tokens`));
|
|
174
|
+
}
|
|
175
|
+
const { contextPath, promptPath } = await writeAgentPromptFiles(serviceContexts, existingConfig, schema, config.agentBudget, cwd);
|
|
176
|
+
console.log(chalk.bold.green('\nā Agent prompt files generated:\n'));
|
|
177
|
+
console.log(` ${chalk.cyan(contextPath)}`);
|
|
178
|
+
console.log(` ${chalk.cyan(promptPath)}`);
|
|
179
|
+
console.log('');
|
|
180
|
+
console.log(chalk.bold('Next steps:'));
|
|
181
|
+
console.log(' 1. Open .nepopsx/scan-context.md in your VS Code AI agent');
|
|
182
|
+
console.log(' (or use the Copilot prompt at .github/prompts/nepopsx-scan.prompt.md)');
|
|
183
|
+
console.log(' 2. Save the agent\'s JSON response to .nepopsx/scan-response.json');
|
|
184
|
+
console.log(' 3. Run: ' + chalk.cyan('nepopsx scan --apply .nepopsx/scan-response.json'));
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
// āā AC-12: Ollama reachability check (always, not just when provider is implicit) āā
|
|
188
|
+
if (config.provider === 'ollama') {
|
|
189
|
+
const ollamaReachable = await checkOllamaReachable(config.endpoint ?? 'http://localhost:11434');
|
|
190
|
+
if (!ollamaReachable) {
|
|
191
|
+
const explicit = Boolean(options.provider);
|
|
192
|
+
if (explicit) {
|
|
193
|
+
console.log(chalk.red('\nOllama is not reachable at ' + (config.endpoint ?? 'http://localhost:11434') + '\n'));
|
|
194
|
+
console.log('Start Ollama first: ' + chalk.cyan('ollama serve'));
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
console.log(chalk.yellow('\nNo LLM provider configured and Ollama is not reachable.\n'));
|
|
198
|
+
}
|
|
199
|
+
console.log('\nAlternatives:');
|
|
200
|
+
console.log(' (1) Start Ollama: ' + chalk.cyan('ollama serve'));
|
|
201
|
+
console.log(' (2) Use OpenAI: ' + chalk.cyan('nepopsx scan --provider openai'));
|
|
202
|
+
console.log(' (3) Use Anthropic:' + chalk.cyan('nepopsx scan --provider anthropic'));
|
|
203
|
+
console.log(' (4) Agent mode: ' + chalk.cyan('nepopsx scan --agent'));
|
|
204
|
+
if (existsSync(join(cwd, '.github', 'prompts'))) {
|
|
205
|
+
console.log(' ā .github/prompts/ exists ā run ' +
|
|
206
|
+
chalk.cyan('nepopsx scan --agent') +
|
|
207
|
+
' to generate a Copilot prompt.');
|
|
208
|
+
}
|
|
209
|
+
process.exit(1);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// āā CLI-direct mode āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
213
|
+
console.log(chalk.bold.cyan('\nš NEPOPSX Scan\n'));
|
|
214
|
+
const services = config.services
|
|
215
|
+
? current.services.filter((s) => config.services.includes(s.name))
|
|
216
|
+
: current.services;
|
|
217
|
+
// Cost awareness for paid providers (AC-6)
|
|
218
|
+
if (config.provider === 'openai' || config.provider === 'anthropic') {
|
|
219
|
+
let totalEstimate = 0;
|
|
220
|
+
for (const svc of services) {
|
|
221
|
+
const svcPath = resolve(cwd, svc.path);
|
|
222
|
+
if (!existsSync(svcPath))
|
|
223
|
+
continue;
|
|
224
|
+
const ignoreFilter = loadIgnoreFilter(svcPath);
|
|
225
|
+
const ctx = await gatherContext(svcPath, svc.framework, config.budget, ignoreFilter);
|
|
226
|
+
totalEstimate += ctx.totalTokens;
|
|
227
|
+
console.log(chalk.dim(` ${svc.name}: ~${ctx.totalTokens.toLocaleString()} tokens`));
|
|
228
|
+
}
|
|
229
|
+
console.log(chalk.bold(`\nEstimated total: ~${totalEstimate.toLocaleString()} tokens (${services.length} service(s) + cross-service pass)`));
|
|
230
|
+
const providerPricingUrl = config.provider === 'openai'
|
|
231
|
+
? 'https://openai.com/pricing'
|
|
232
|
+
: 'https://www.anthropic.com/pricing';
|
|
233
|
+
console.log(chalk.dim(`Pricing: ${providerPricingUrl}`));
|
|
234
|
+
if (!config.yes) {
|
|
235
|
+
const proceed = await confirm({ message: 'Proceed with LLM calls?', default: true });
|
|
236
|
+
if (!proceed) {
|
|
237
|
+
console.log(chalk.yellow('Aborted.'));
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
const provider = createProvider(config);
|
|
243
|
+
const serviceResults = [];
|
|
244
|
+
// Create cache dir
|
|
245
|
+
await mkdir(join(cwd, SCAN_CACHE_DIR), { recursive: true });
|
|
246
|
+
// āā Per-service analysis āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
247
|
+
for (let i = 0; i < services.length; i++) {
|
|
248
|
+
const svc = services[i];
|
|
249
|
+
const svcPath = resolve(cwd, svc.path);
|
|
250
|
+
process.stdout.write(`[${i + 1}/${services.length}] Analyzing ${chalk.bold(svc.name)}...`);
|
|
251
|
+
if (!existsSync(svcPath)) {
|
|
252
|
+
console.log(chalk.yellow(' SKIPPED (directory not found)'));
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
// Check resume cache
|
|
256
|
+
const cacheFile = join(cwd, SCAN_CACHE_DIR, `${svc.name}.json`);
|
|
257
|
+
if (config.resume && existsSync(cacheFile)) {
|
|
258
|
+
try {
|
|
259
|
+
const cached = JSON.parse(readFileSync(cacheFile, 'utf-8'));
|
|
260
|
+
serviceResults.push(cached);
|
|
261
|
+
console.log(chalk.dim(' (cached)'));
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
// Cache corrupted ā re-run
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
const ignoreFilter = loadIgnoreFilter(svcPath);
|
|
269
|
+
const context = await gatherContext(svcPath, svc.framework, config.budget, ignoreFilter);
|
|
270
|
+
if (config.verbose && context.skippedFiles.length > 0) {
|
|
271
|
+
console.log(chalk.dim(`\n Skipped ${context.skippedFiles.length} file(s) over budget`));
|
|
272
|
+
}
|
|
273
|
+
const { systemPrompt, userPrompt } = buildServicePrompt(svc, context, existingConfig, serviceSchema);
|
|
274
|
+
try {
|
|
275
|
+
const response = await provider.chat({
|
|
276
|
+
systemPrompt,
|
|
277
|
+
userPrompt,
|
|
278
|
+
jsonSchema: provider.supportsJsonMode ? serviceSchema : undefined,
|
|
279
|
+
maxTokens: 4096,
|
|
280
|
+
temperature: 0.1,
|
|
281
|
+
});
|
|
282
|
+
if (config.verbose) {
|
|
283
|
+
console.log(chalk.dim(`\n Response: ${response.content.slice(0, 200)}...`));
|
|
284
|
+
}
|
|
285
|
+
const parsed = await parseAndValidate(response.content, svc.name, async () => {
|
|
286
|
+
const repair = await provider.chat({
|
|
287
|
+
systemPrompt,
|
|
288
|
+
userPrompt: `${userPrompt}\n\nYour previous response was not valid JSON. Return ONLY a JSON object.`,
|
|
289
|
+
maxTokens: 4096,
|
|
290
|
+
temperature: 0,
|
|
291
|
+
});
|
|
292
|
+
return repair.content;
|
|
293
|
+
});
|
|
294
|
+
if (parsed && parsed.services[0]) {
|
|
295
|
+
const svcResult = parsed.services[0];
|
|
296
|
+
serviceResults.push(svcResult);
|
|
297
|
+
// Cache result
|
|
298
|
+
writeFileSync(cacheFile, JSON.stringify(svcResult, null, 2), 'utf-8');
|
|
299
|
+
console.log(chalk.green(' ā') +
|
|
300
|
+
chalk.dim(` (${response.inputTokens + response.outputTokens} tokens)`));
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
console.log(chalk.yellow(' ā Invalid response ā skipping service'));
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
catch (err) {
|
|
307
|
+
console.log(chalk.red(` ā ${String(err)}`));
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
if (serviceResults.length === 0) {
|
|
311
|
+
console.log(chalk.yellow('\nNo services were successfully analyzed.'));
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
// āā Cross-service analysis āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
315
|
+
let crossService;
|
|
316
|
+
console.log(chalk.dim('\nRunning cross-service analysis...'));
|
|
317
|
+
try {
|
|
318
|
+
const { systemPrompt, userPrompt } = buildCrossServicePrompt(serviceResults, existingConfig, crossSchema);
|
|
319
|
+
const crossResponse = await provider.chat({
|
|
320
|
+
systemPrompt,
|
|
321
|
+
userPrompt,
|
|
322
|
+
jsonSchema: provider.supportsJsonMode ? crossSchema : undefined,
|
|
323
|
+
maxTokens: 2048,
|
|
324
|
+
temperature: 0.1,
|
|
325
|
+
});
|
|
326
|
+
try {
|
|
327
|
+
crossService = JSON.parse(stripCodeFences(crossResponse.content));
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
// Cross-service parse failure is non-fatal
|
|
331
|
+
console.log(chalk.dim(' Cross-service analysis skipped (invalid response)'));
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
console.log(chalk.dim(' Cross-service analysis skipped (provider error)'));
|
|
336
|
+
}
|
|
337
|
+
const scanResult = {
|
|
338
|
+
services: serviceResults,
|
|
339
|
+
...(crossService ? { cross_service: crossService } : {}),
|
|
340
|
+
};
|
|
341
|
+
await applyAndWrite(cwd, configPath, current, scanResult, scanState, config, config.provider);
|
|
342
|
+
}
|
|
343
|
+
async function applyAndWrite(cwd, configPath, current, scanResult, scanState, config, providerName) {
|
|
344
|
+
// āā Three-way merge āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
345
|
+
const mergeResult = mergeWorkspaceConfig(current, scanResult, scanState);
|
|
346
|
+
// āā Diff preview (AC-9) āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
347
|
+
console.log(chalk.bold('\nDiff preview:'));
|
|
348
|
+
displayDiff(current, mergeResult);
|
|
349
|
+
if (config.dryRun) {
|
|
350
|
+
console.log(chalk.yellow('\nDry run ā no files written.'));
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
// āā Confirmation (skip with --yes) āāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
354
|
+
if (!config.yes && mergeResult.changedFields.length > 0) {
|
|
355
|
+
const ok = await confirm({
|
|
356
|
+
message: 'Write changes to workspace.yaml?',
|
|
357
|
+
default: true,
|
|
358
|
+
});
|
|
359
|
+
if (!ok) {
|
|
360
|
+
console.log(chalk.yellow('Aborted.'));
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
if (mergeResult.changedFields.length === 0) {
|
|
365
|
+
console.log(chalk.dim('\nNo changes to write.'));
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
// Atomic write: tmp ā fsync ā rename
|
|
369
|
+
await atomicWrite(configPath, yamlStringify(mergeResult.updated, { lineWidth: 0 }));
|
|
370
|
+
console.log(chalk.green(`\nā workspace.yaml updated (${mergeResult.changedFields.length} field(s) changed)`));
|
|
371
|
+
// Write updated scan state
|
|
372
|
+
writeScanState(cwd, {
|
|
373
|
+
...mergeResult.newScanState,
|
|
374
|
+
provider: providerName,
|
|
375
|
+
model: config.model,
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
// āā Customs files āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
379
|
+
if (config.customs) {
|
|
380
|
+
const customsDir = resolve(cwd, current.customs_dir ?? 'customs');
|
|
381
|
+
console.log(chalk.bold('\nGenerating customs files:'));
|
|
382
|
+
writeCustomsFiles(customsDir, scanResult, config.dryRun);
|
|
383
|
+
}
|
|
384
|
+
// āā Summary āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
385
|
+
if (mergeResult.suggestions.length > 0) {
|
|
386
|
+
console.log(chalk.cyan(`\n${mergeResult.suggestions.length} suggestion(s) preserved (your values kept). Run with --verbose to see details.`));
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
async function checkOllamaReachable(baseUrl) {
|
|
390
|
+
try {
|
|
391
|
+
const controller = new AbortController();
|
|
392
|
+
const timer = setTimeout(() => controller.abort(), 2000);
|
|
393
|
+
try {
|
|
394
|
+
const res = await fetch(`${baseUrl}/api/tags`, { signal: controller.signal });
|
|
395
|
+
return res.ok;
|
|
396
|
+
}
|
|
397
|
+
finally {
|
|
398
|
+
clearTimeout(timer);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
catch {
|
|
402
|
+
return false;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/sync.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAcA,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA8LrE"}
|