@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.
Files changed (106) hide show
  1. package/dist/commands/install.d.ts.map +1 -1
  2. package/dist/commands/install.js +113 -24
  3. package/dist/commands/install.js.map +1 -1
  4. package/dist/commands/login.d.ts +7 -0
  5. package/dist/commands/login.d.ts.map +1 -0
  6. package/dist/commands/login.js +108 -0
  7. package/dist/commands/login.js.map +1 -0
  8. package/dist/commands/scan.d.ts +2 -0
  9. package/dist/commands/scan.d.ts.map +1 -0
  10. package/dist/commands/scan.js +405 -0
  11. package/dist/commands/scan.js.map +1 -0
  12. package/dist/commands/sync.d.ts +2 -0
  13. package/dist/commands/sync.d.ts.map +1 -1
  14. package/dist/commands/sync.js +68 -120
  15. package/dist/commands/sync.js.map +1 -1
  16. package/dist/generator/builtin-templates.d.ts +2 -1
  17. package/dist/generator/builtin-templates.d.ts.map +1 -1
  18. package/dist/generator/builtin-templates.js +161 -2
  19. package/dist/generator/builtin-templates.js.map +1 -1
  20. package/dist/generator/package-renderer.d.ts +37 -0
  21. package/dist/generator/package-renderer.d.ts.map +1 -0
  22. package/dist/generator/package-renderer.js +143 -0
  23. package/dist/generator/package-renderer.js.map +1 -0
  24. package/dist/generator/render.d.ts +11 -54
  25. package/dist/generator/render.d.ts.map +1 -1
  26. package/dist/generator/render.js +18 -174
  27. package/dist/generator/render.js.map +1 -1
  28. package/dist/index.js +32 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/licensing/fingerprint.test.d.ts +2 -0
  31. package/dist/licensing/fingerprint.test.d.ts.map +1 -0
  32. package/dist/licensing/fingerprint.test.js +41 -0
  33. package/dist/licensing/fingerprint.test.js.map +1 -0
  34. package/dist/licensing/installer.d.ts +43 -0
  35. package/dist/licensing/installer.d.ts.map +1 -0
  36. package/dist/licensing/installer.js +98 -0
  37. package/dist/licensing/installer.js.map +1 -0
  38. package/dist/scan/__tests__/context-gatherer.test.d.ts +2 -0
  39. package/dist/scan/__tests__/context-gatherer.test.d.ts.map +1 -0
  40. package/dist/scan/__tests__/context-gatherer.test.js +111 -0
  41. package/dist/scan/__tests__/context-gatherer.test.js.map +1 -0
  42. package/dist/scan/__tests__/merge.test.d.ts +2 -0
  43. package/dist/scan/__tests__/merge.test.d.ts.map +1 -0
  44. package/dist/scan/__tests__/merge.test.js +163 -0
  45. package/dist/scan/__tests__/merge.test.js.map +1 -0
  46. package/dist/scan/config.d.ts +24 -0
  47. package/dist/scan/config.d.ts.map +1 -0
  48. package/dist/scan/config.js +77 -0
  49. package/dist/scan/config.js.map +1 -0
  50. package/dist/scan/context/gatherer.d.ts +13 -0
  51. package/dist/scan/context/gatherer.d.ts.map +1 -0
  52. package/dist/scan/context/gatherer.js +97 -0
  53. package/dist/scan/context/gatherer.js.map +1 -0
  54. package/dist/scan/context/gitignore.d.ts +9 -0
  55. package/dist/scan/context/gitignore.d.ts.map +1 -0
  56. package/dist/scan/context/gitignore.js +50 -0
  57. package/dist/scan/context/gitignore.js.map +1 -0
  58. package/dist/scan/context/patterns.d.ts +14 -0
  59. package/dist/scan/context/patterns.d.ts.map +1 -0
  60. package/dist/scan/context/patterns.js +159 -0
  61. package/dist/scan/context/patterns.js.map +1 -0
  62. package/dist/scan/customs/writer.d.ts +6 -0
  63. package/dist/scan/customs/writer.d.ts.map +1 -0
  64. package/dist/scan/customs/writer.js +149 -0
  65. package/dist/scan/customs/writer.js.map +1 -0
  66. package/dist/scan/llm/anthropic.d.ts +11 -0
  67. package/dist/scan/llm/anthropic.d.ts.map +1 -0
  68. package/dist/scan/llm/anthropic.js +98 -0
  69. package/dist/scan/llm/anthropic.js.map +1 -0
  70. package/dist/scan/llm/factory.d.ts +4 -0
  71. package/dist/scan/llm/factory.d.ts.map +1 -0
  72. package/dist/scan/llm/factory.js +20 -0
  73. package/dist/scan/llm/factory.js.map +1 -0
  74. package/dist/scan/llm/ollama.d.ts +11 -0
  75. package/dist/scan/llm/ollama.d.ts.map +1 -0
  76. package/dist/scan/llm/ollama.js +73 -0
  77. package/dist/scan/llm/ollama.js.map +1 -0
  78. package/dist/scan/llm/openai.d.ts +12 -0
  79. package/dist/scan/llm/openai.d.ts.map +1 -0
  80. package/dist/scan/llm/openai.js +87 -0
  81. package/dist/scan/llm/openai.js.map +1 -0
  82. package/dist/scan/llm/types.d.ts +23 -0
  83. package/dist/scan/llm/types.d.ts.map +1 -0
  84. package/dist/scan/llm/types.js +3 -0
  85. package/dist/scan/llm/types.js.map +1 -0
  86. package/dist/scan/merge/diff-display.d.ts +11 -0
  87. package/dist/scan/merge/diff-display.d.ts.map +1 -0
  88. package/dist/scan/merge/diff-display.js +72 -0
  89. package/dist/scan/merge/diff-display.js.map +1 -0
  90. package/dist/scan/prompt/agent.d.ts +23 -0
  91. package/dist/scan/prompt/agent.d.ts.map +1 -0
  92. package/dist/scan/prompt/agent.js +95 -0
  93. package/dist/scan/prompt/agent.js.map +1 -0
  94. package/dist/scan/prompt/builder.d.ts +16 -0
  95. package/dist/scan/prompt/builder.d.ts.map +1 -0
  96. package/dist/scan/prompt/builder.js +64 -0
  97. package/dist/scan/prompt/builder.js.map +1 -0
  98. package/dist/scan/prompt/schema.d.ts +7 -0
  99. package/dist/scan/prompt/schema.d.ts.map +1 -0
  100. package/dist/scan/prompt/schema.js +52 -0
  101. package/dist/scan/prompt/schema.js.map +1 -0
  102. package/dist/security/scanner.d.ts +3 -40
  103. package/dist/security/scanner.d.ts.map +1 -1
  104. package/dist/security/scanner.js +3 -169
  105. package/dist/security/scanner.js.map +1 -1
  106. 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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"}
@@ -1,5 +1,7 @@
1
1
  interface SyncOptions {
2
2
  config: string;
3
+ remote?: boolean;
4
+ workspace?: string;
3
5
  dryRun?: boolean;
4
6
  dev?: boolean;
5
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAYA,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiLrE"}
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"}