camouf 0.2.2 → 0.2.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 (35) hide show
  1. package/README.md +89 -2
  2. package/dist/cli/commands/init.d.ts +1 -0
  3. package/dist/cli/commands/init.d.ts.map +1 -1
  4. package/dist/cli/commands/init.js +120 -1
  5. package/dist/cli/commands/init.js.map +1 -1
  6. package/dist/cli/commands/validate.d.ts.map +1 -1
  7. package/dist/cli/commands/validate.js +2 -1
  8. package/dist/cli/commands/validate.js.map +1 -1
  9. package/dist/cli/commands/watch.d.ts.map +1 -1
  10. package/dist/cli/commands/watch.js +77 -20
  11. package/dist/cli/commands/watch.js.map +1 -1
  12. package/dist/core/reporter/violation-reporter.d.ts +15 -1
  13. package/dist/core/reporter/violation-reporter.d.ts.map +1 -1
  14. package/dist/core/reporter/violation-reporter.js +56 -0
  15. package/dist/core/reporter/violation-reporter.js.map +1 -1
  16. package/dist/core/rules/builtin/hardcoded-secrets.rule.d.ts +5 -0
  17. package/dist/core/rules/builtin/hardcoded-secrets.rule.d.ts.map +1 -1
  18. package/dist/core/rules/builtin/hardcoded-secrets.rule.js +108 -18
  19. package/dist/core/rules/builtin/hardcoded-secrets.rule.js.map +1 -1
  20. package/dist/core/rules/rule-engine.d.ts +2 -2
  21. package/dist/core/rules/rule-engine.d.ts.map +1 -1
  22. package/dist/core/rules/rule-engine.js +6 -5
  23. package/dist/core/rules/rule-engine.js.map +1 -1
  24. package/dist/core/scanner/project-detector.d.ts +1 -1
  25. package/dist/core/scanner/project-detector.d.ts.map +1 -1
  26. package/dist/core/scanner/project-detector.js +159 -20
  27. package/dist/core/scanner/project-detector.js.map +1 -1
  28. package/dist/core/scanner/project-scanner.d.ts +5 -0
  29. package/dist/core/scanner/project-scanner.d.ts.map +1 -1
  30. package/dist/core/scanner/project-scanner.js +14 -2
  31. package/dist/core/scanner/project-scanner.js.map +1 -1
  32. package/dist/core/watcher/file-watcher.d.ts.map +1 -1
  33. package/dist/core/watcher/file-watcher.js +41 -28
  34. package/dist/core/watcher/file-watcher.js.map +1 -1
  35. package/package.json +1 -1
package/README.md CHANGED
@@ -17,7 +17,7 @@ Camouf is a powerful, multi-language CLI tool for monitoring and enforcing softw
17
17
  - **12 Built-in Rules**: Comprehensive rule set for modern architectures
18
18
  - **Security Scanning**: Detects hardcoded secrets, API keys, and credentials
19
19
  - **Multiple Report Formats**: HTML, JSON, Markdown, SARIF
20
- - **IDE Integration**: SARIF export for VS Code and other editors
20
+ - **VS Code Integration**: Real-time Problems panel integration with custom tasks
21
21
  - **Highly Configurable**: JSON, YAML, or JavaScript configuration
22
22
 
23
23
  ## Documentation
@@ -55,7 +55,7 @@ npx camouf analyze
55
55
  camouf init
56
56
  ```
57
57
 
58
- This creates a `camouf.config.json` file with sensible defaults.
58
+ This creates a `camouf.config.json` file with sensible defaults and sets up VS Code integration.
59
59
 
60
60
  ### 2. Run Analysis
61
61
 
@@ -69,6 +69,17 @@ camouf analyze
69
69
  camouf watch
70
70
  ```
71
71
 
72
+ ### 4. VS Code Integration (Recommended)
73
+
74
+ After running `camouf init`, you get automatic VS Code integration:
75
+
76
+ 1. Press `Ctrl+Shift+B` (or `Cmd+Shift+B` on Mac)
77
+ 2. Select **"camouf: Validate"** for one-time scan
78
+ 3. Select **"camouf: Watch"** for continuous monitoring
79
+ 4. Open the **Problems panel** (`Ctrl+Shift+M`) to see violations
80
+
81
+ Violations will appear directly in VS Code with clickable file links!
82
+
72
83
  ## Commands
73
84
 
74
85
  ### `camouf init`
@@ -108,6 +119,7 @@ camouf watch [options]
108
119
  Options:
109
120
  -c, --config <path> Path to configuration file
110
121
  --debounce <ms> Debounce time in milliseconds (default: 300)
122
+ --format <format> Output format: text (default), vscode
111
123
  ```
112
124
 
113
125
  ### `camouf validate`
@@ -119,6 +131,7 @@ camouf validate [options]
119
131
 
120
132
  Options:
121
133
  -c, --config <path> Path to configuration file
134
+ --format <format> Output format: text (default), json, sarif, vscode
122
135
  --strict Fail on warnings
123
136
  --bail Exit on first error
124
137
  ```
@@ -248,6 +261,80 @@ Static Analysis Results Interchange Format for IDE integration.
248
261
  ### Markdown
249
262
  Documentation-friendly format for pull requests.
250
263
 
264
+ ## VS Code Integration
265
+
266
+ Camouf integrates seamlessly with VS Code's Problems panel for real-time violation feedback.
267
+
268
+ ### Setup
269
+
270
+ When you run `camouf init`, it automatically creates:
271
+ - `.vscode/tasks.json` - Build tasks with problem matchers
272
+ - `.vscode/settings.json` - Optimal settings for Camouf
273
+
274
+ ### Using Camouf in VS Code
275
+
276
+ #### Option 1: Run Tasks (Recommended)
277
+
278
+ 1. Press `Ctrl+Shift+B` (Windows/Linux) or `Cmd+Shift+B` (Mac)
279
+ 2. Select one of the tasks:
280
+ - **camouf: Validate** - One-time scan, results in Problems panel
281
+ - **camouf: Watch** - Continuous monitoring (background task)
282
+
283
+ 3. Open the Problems panel: `Ctrl+Shift+M`
284
+
285
+ #### Option 2: Terminal Commands
286
+
287
+ ```bash
288
+ # One-time validation with VS Code output format
289
+ npx camouf validate --format vscode
290
+
291
+ # Watch mode with VS Code output format
292
+ npx camouf watch --format vscode
293
+ ```
294
+
295
+ ### Output Example
296
+
297
+ Violations appear in the Problems panel with:
298
+ - Severity icon (error/warning/info)
299
+ - File location (clickable link)
300
+ - Rule ID and message
301
+ - Suggestion for fix
302
+
303
+ ```
304
+ test.ts(10,1): error hardcoded-secrets: AWS Access Key ID detected
305
+ src/api.ts(45,1): warning performance-antipatterns: N+1 query pattern detected
306
+ ```
307
+
308
+ ### Manual Tasks Setup
309
+
310
+ If you didn't run `camouf init` or need to add tasks manually, create `.vscode/tasks.json`:
311
+
312
+ ```json
313
+ {
314
+ "version": "2.0.0",
315
+ "tasks": [
316
+ {
317
+ "label": "camouf: Validate",
318
+ "type": "shell",
319
+ "command": "npx camouf validate --format vscode",
320
+ "problemMatcher": {
321
+ "owner": "camouf",
322
+ "fileLocation": ["relative", "${workspaceFolder}"],
323
+ "pattern": {
324
+ "regexp": "^(.+)\\((\\d+),(\\d+)\\):\\s+(error|warning|info)\\s+([^:]+):\\s+(.*)$",
325
+ "file": 1,
326
+ "line": 2,
327
+ "column": 3,
328
+ "severity": 4,
329
+ "code": 5,
330
+ "message": 6
331
+ }
332
+ }
333
+ }
334
+ ]
335
+ }
336
+ ```
337
+
251
338
  ## CI/CD Integration
252
339
 
253
340
  ### GitHub Actions
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * Initializes a new Camouf configuration in the current project.
5
5
  * Creates camouf.config.json with default settings.
6
+ * Creates .vscode/tasks.json for real-time Problems integration.
6
7
  */
7
8
  import { Command } from 'commander';
8
9
  export declare const initCommand: Command;
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,WAAW,SAiGpB,CAAC"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,WAAW,SAyGpB,CAAC"}
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * Initializes a new Camouf configuration in the current project.
5
5
  * Creates camouf.config.json with default settings.
6
+ * Creates .vscode/tasks.json for real-time Problems integration.
6
7
  */
7
8
  import { Command } from 'commander';
8
9
  import { ConfigurationManager } from '../../core/config/configuration-manager.js';
@@ -10,6 +11,8 @@ import { Logger } from '../../core/logger.js';
10
11
  import { ProjectDetector } from '../../core/scanner/project-detector.js';
11
12
  import inquirer from 'inquirer';
12
13
  import ora from 'ora';
14
+ import * as fs from 'fs';
15
+ import * as path from 'path';
13
16
  export const initCommand = new Command('init')
14
17
  .description('Initialize Camouf configuration in the current project')
15
18
  .option('-y, --yes', 'Skip interactive prompts and use defaults')
@@ -90,15 +93,131 @@ export const initCommand = new Command('init')
90
93
  spinner.start('Writing configuration...');
91
94
  await configManager.writeConfig(config);
92
95
  spinner.succeed('Configuration written to camouf.config.json');
96
+ // Create VS Code integration for real-time Problems
97
+ spinner.start('Setting up VS Code integration...');
98
+ await createVSCodeIntegration(process.cwd());
99
+ spinner.succeed('VS Code integration configured');
93
100
  Logger.success('\n✨ Camouf initialized successfully!');
94
101
  Logger.info('\nNext steps:');
95
102
  Logger.info(' 1. Review and customize camouf.config.json');
96
103
  Logger.info(' 2. Run "camouf validate" to check your architecture');
97
- Logger.info(' 3. Run "camouf watch" to start real-time monitoring\n');
104
+ Logger.info(' 3. For real-time Problems in VS Code:');
105
+ Logger.info(' - Press Ctrl+Shift+B and select "camouf: Watch"');
106
+ Logger.info(' - Or run Terminal > Run Task > camouf: Watch');
107
+ Logger.info(' 4. Violations will appear in the Problems panel (Ctrl+Shift+M)\n');
98
108
  }
99
109
  catch (error) {
100
110
  spinner.fail(`Initialization failed: ${error.message}`);
101
111
  process.exit(1);
102
112
  }
103
113
  });
114
+ /**
115
+ * Create VS Code integration files for real-time Problems panel
116
+ */
117
+ async function createVSCodeIntegration(projectRoot) {
118
+ const vscodeDir = path.join(projectRoot, '.vscode');
119
+ // Create .vscode directory if it doesn't exist
120
+ if (!fs.existsSync(vscodeDir)) {
121
+ fs.mkdirSync(vscodeDir, { recursive: true });
122
+ }
123
+ // Tasks configuration with problem matcher
124
+ const tasksConfig = {
125
+ version: '2.0.0',
126
+ tasks: [
127
+ {
128
+ label: 'camouf: Validate',
129
+ type: 'shell',
130
+ command: 'npx camouf validate --format vscode',
131
+ group: 'build',
132
+ presentation: {
133
+ reveal: 'silent',
134
+ panel: 'dedicated',
135
+ clear: true
136
+ },
137
+ problemMatcher: {
138
+ owner: 'camouf',
139
+ fileLocation: ['relative', '${workspaceFolder}'],
140
+ pattern: {
141
+ regexp: '^(.+)\\((\\d+),(\\d+)\\):\\s+(error|warning|info)\\s+([^:]+):\\s+(.*)$',
142
+ file: 1,
143
+ line: 2,
144
+ column: 3,
145
+ severity: 4,
146
+ code: 5,
147
+ message: 6
148
+ }
149
+ }
150
+ },
151
+ {
152
+ label: 'camouf: Watch',
153
+ type: 'shell',
154
+ command: 'npx camouf watch --format vscode',
155
+ group: 'build',
156
+ isBackground: true,
157
+ presentation: {
158
+ reveal: 'always',
159
+ panel: 'dedicated'
160
+ },
161
+ problemMatcher: {
162
+ owner: 'camouf',
163
+ fileLocation: ['relative', '${workspaceFolder}'],
164
+ background: {
165
+ activeOnStart: true,
166
+ beginsPattern: '>>> CAMOUF WATCH STARTED <<<',
167
+ endsPattern: '>>> CAMOUF WATCH STOPPED'
168
+ },
169
+ pattern: {
170
+ regexp: '^(.+)\\((\\d+),(\\d+)\\):\\s+(error|warning|info)\\s+([^:]+):\\s+(.*)$',
171
+ file: 1,
172
+ line: 2,
173
+ column: 3,
174
+ severity: 4,
175
+ code: 5,
176
+ message: 6
177
+ }
178
+ }
179
+ }
180
+ ]
181
+ };
182
+ const tasksPath = path.join(vscodeDir, 'tasks.json');
183
+ // Merge with existing tasks.json if it exists
184
+ let existingTasks = { version: '2.0.0', tasks: [] };
185
+ if (fs.existsSync(tasksPath)) {
186
+ try {
187
+ existingTasks = JSON.parse(fs.readFileSync(tasksPath, 'utf-8'));
188
+ }
189
+ catch {
190
+ // If parsing fails, start fresh
191
+ }
192
+ }
193
+ // Remove existing camouf tasks
194
+ const otherTasks = (existingTasks.tasks || []).filter((task) => !task.label?.startsWith('camouf:'));
195
+ // Merge tasks
196
+ const mergedTasks = {
197
+ version: '2.0.0',
198
+ tasks: [...otherTasks, ...tasksConfig.tasks]
199
+ };
200
+ fs.writeFileSync(tasksPath, JSON.stringify(mergedTasks, null, 2));
201
+ // Create settings.json for better integration
202
+ const settingsPath = path.join(vscodeDir, 'settings.json');
203
+ let existingSettings = {};
204
+ if (fs.existsSync(settingsPath)) {
205
+ try {
206
+ existingSettings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
207
+ }
208
+ catch {
209
+ // If parsing fails, start fresh
210
+ }
211
+ }
212
+ // Add camouf-related settings
213
+ const camoufSettings = {
214
+ ...existingSettings,
215
+ 'task.autoDetect': 'on',
216
+ 'task.problemMatchers.neverPrompt': {
217
+ ...(existingSettings['task.problemMatchers.neverPrompt'] || {}),
218
+ 'camouf': true
219
+ }
220
+ };
221
+ fs.writeFileSync(settingsPath, JSON.stringify(camoufSettings, null, 2));
222
+ }
104
223
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,wDAAwD,CAAC;KACrE,MAAM,CAAC,WAAW,EAAE,2CAA2C,CAAC;KAChE,MAAM,CAAC,aAAa,EAAE,kCAAkC,CAAC;KACzD,MAAM,CAAC,uBAAuB,EAAE,gEAAgE,CAAC;KACjG,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,GAAG,CAAC,gCAAgC,CAAC,CAAC,KAAK,EAAE,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,IAAI,oBAAoB,EAAE,CAAC;QACjD,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAE9C,iCAAiC;QACjC,IAAI,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;YACxE,OAAO;QACT,CAAC;QAED,2BAA2B;QAC3B,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAE9C,IAAI,MAAM,CAAC;QAEX,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,wBAAwB;YACxB,MAAM,GAAG,aAAa,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,sBAAsB;YACtB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;gBACpC;oBACE,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,aAAa;oBACnB,OAAO,EAAE,aAAa,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B;oBAC9E,OAAO,EAAE,IAAI;iBACd;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,8BAA8B;oBACvC,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;oBACrE,OAAO,EAAE,SAAS,CAAC,SAAS;oBAC5B,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW;iBAChC;gBACD;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,0DAA0D;oBACnE,OAAO,EAAE,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;iBACjD;gBACD;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,yDAAyD;oBAClE,OAAO,EAAE,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;iBACjD;gBACD;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,wDAAwD;oBACjE,OAAO,EAAE,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;iBACjD;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,yBAAyB;oBAClC,OAAO,EAAE;wBACP,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,IAAI,EAAE;wBAC1E,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE,IAAI,EAAE;wBAChF,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,qBAAqB,EAAE,OAAO,EAAE,KAAK,EAAE;wBAC7E,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE;wBACnE,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE;wBACvE,EAAE,IAAI,EAAE,2BAA2B,EAAE,KAAK,EAAE,0BAA0B,EAAE,OAAO,EAAE,IAAI,EAAE;wBACvF,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE;wBACnE,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE;qBAC7D;iBACF;aACF,CAAC,CAAC;YAEH,MAAM,GAAG,aAAa,CAAC,sBAAsB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACpE,CAAC;QAED,sBAAsB;QACtB,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC1C,MAAM,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC;QAE/D,oDAAoD;QACpD,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACnD,MAAM,uBAAuB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;QAElD,MAAM,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;IAEpF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,0BAA2B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL;;GAEG;AACH,KAAK,UAAU,uBAAuB,CAAC,WAAmB;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAEpD,+CAA+C;IAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,2CAA2C;IAC3C,MAAM,WAAW,GAAG;QAClB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE;YACL;gBACE,KAAK,EAAE,kBAAkB;gBACzB,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,qCAAqC;gBAC9C,KAAK,EAAE,OAAO;gBACd,YAAY,EAAE;oBACZ,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,WAAW;oBAClB,KAAK,EAAE,IAAI;iBACZ;gBACD,cAAc,EAAE;oBACd,KAAK,EAAE,QAAQ;oBACf,YAAY,EAAE,CAAC,UAAU,EAAE,oBAAoB,CAAC;oBAChD,OAAO,EAAE;wBACP,MAAM,EAAE,wEAAwE;wBAChF,IAAI,EAAE,CAAC;wBACP,IAAI,EAAE,CAAC;wBACP,MAAM,EAAE,CAAC;wBACT,QAAQ,EAAE,CAAC;wBACX,IAAI,EAAE,CAAC;wBACP,OAAO,EAAE,CAAC;qBACX;iBACF;aACF;YACD;gBACE,KAAK,EAAE,eAAe;gBACtB,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,kCAAkC;gBAC3C,KAAK,EAAE,OAAO;gBACd,YAAY,EAAE,IAAI;gBAClB,YAAY,EAAE;oBACZ,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,WAAW;iBACnB;gBACD,cAAc,EAAE;oBACd,KAAK,EAAE,QAAQ;oBACf,YAAY,EAAE,CAAC,UAAU,EAAE,oBAAoB,CAAC;oBAChD,UAAU,EAAE;wBACV,aAAa,EAAE,IAAI;wBACnB,aAAa,EAAE,8BAA8B;wBAC7C,WAAW,EAAE,0BAA0B;qBACxC;oBACD,OAAO,EAAE;wBACP,MAAM,EAAE,wEAAwE;wBAChF,IAAI,EAAE,CAAC;wBACP,IAAI,EAAE,CAAC;wBACP,MAAM,EAAE,CAAC;wBACT,QAAQ,EAAE,CAAC;wBACX,IAAI,EAAE,CAAC;wBACP,OAAO,EAAE,CAAC;qBACX;iBACF;aACF;SACF;KACF,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAErD,8CAA8C;IAC9C,IAAI,aAAa,GAA4C,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC7F,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,MAAM,UAAU,GAAG,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CACnD,CAAC,IAAa,EAAE,EAAE,CAAC,CAAE,IAA2B,CAAC,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,CAC9E,CAAC;IAEF,cAAc;IACd,MAAM,WAAW,GAAG;QAClB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,CAAC,GAAG,UAAU,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC;KAC7C,CAAC;IAEF,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAElE,8CAA8C;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAC3D,IAAI,gBAAgB,GAA4B,EAAE,CAAC;IACnD,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;QACxE,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,MAAM,cAAc,GAAG;QACrB,GAAG,gBAAgB;QACnB,iBAAiB,EAAE,IAAI;QACvB,kCAAkC,EAAE;YAClC,GAAG,CAAC,gBAAgB,CAAC,kCAAkC,CAA4B,IAAI,EAAE,CAAC;YAC1F,QAAQ,EAAE,IAAI;SACf;KACF,CAAC;IAEF,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,eAAe,SAkFxB,CAAC"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,eAAe,SAmFxB,CAAC"}
@@ -44,7 +44,8 @@ export const validateCommand = new Command('validate')
44
44
  spinner.succeed(`Scanned ${graph.nodeCount()} files`);
45
45
  // Validate
46
46
  spinner.start('Running validation...');
47
- const violations = await ruleEngine.validate(graph);
47
+ const fileContents = scanner.getFileContents();
48
+ const violations = await ruleEngine.validate(graph, fileContents);
48
49
  // Auto-fix if requested
49
50
  if (options.fix) {
50
51
  spinner.text = 'Applying auto-fixes...';
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,YAAY,SA4FrB,CAAC"}
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,YAAY,SAuIrB,CAAC"}
@@ -19,17 +19,23 @@ export const watchCommand = new Command('watch')
19
19
  .option('--debounce <ms>', 'Debounce time for file changes (default: 300)', '300')
20
20
  .option('--rules <rules>', 'Comma-separated list of rules to run')
21
21
  .option('--ignore <patterns>', 'Additional patterns to ignore')
22
+ .option('--format <format>', 'Output format (text, vscode)', 'text')
22
23
  .action(async (options) => {
23
- const spinner = ora('Loading configuration...').start();
24
+ const isVSCodeFormat = options.format === 'vscode';
25
+ const spinner = isVSCodeFormat ? null : ora('Loading configuration...').start();
24
26
  try {
25
27
  // Load configuration
26
28
  const configManager = new ConfigurationManager();
27
29
  const config = await configManager.loadConfig(options.config);
28
30
  if (!config) {
29
- spinner.fail('No configuration found. Run "camouf init" first.');
31
+ if (spinner)
32
+ spinner.fail('No configuration found. Run "camouf init" first.');
33
+ else
34
+ console.error('ERROR: No configuration found. Run "camouf init" first.');
30
35
  process.exit(1);
31
36
  }
32
- spinner.text = 'Initializing components...';
37
+ if (spinner)
38
+ spinner.text = 'Initializing components...';
33
39
  // Initialize components
34
40
  const scanner = new ProjectScanner(config);
35
41
  const ruleEngine = new RuleEngine(config);
@@ -45,48 +51,99 @@ export const watchCommand = new Command('watch')
45
51
  }
46
52
  // Initial scan
47
53
  if (options.initial !== false) {
48
- spinner.text = 'Performing initial scan...';
54
+ if (spinner)
55
+ spinner.text = 'Performing initial scan...';
49
56
  const graph = await scanner.scan();
50
- spinner.text = 'Running initial validation...';
51
- const violations = await ruleEngine.validate(graph);
52
- spinner.stop();
53
- reporter.reportInitial(violations);
57
+ if (spinner)
58
+ spinner.text = 'Running initial validation...';
59
+ const fileContents = scanner.getFileContents();
60
+ const violations = await ruleEngine.validate(graph, fileContents);
61
+ if (spinner)
62
+ spinner.stop();
63
+ if (isVSCodeFormat) {
64
+ reporter.reportVSCode(violations);
65
+ }
66
+ else {
67
+ reporter.reportInitial(violations);
68
+ }
54
69
  }
55
70
  else {
56
- spinner.stop();
71
+ if (spinner)
72
+ spinner.stop();
57
73
  }
58
74
  // Setup file watcher
59
- Logger.info('\n👁️ Watching for changes...\n');
60
- Logger.info('Press Ctrl+C to stop\n');
75
+ if (!isVSCodeFormat) {
76
+ Logger.info('\n👁️ Watching for changes...\n');
77
+ Logger.info('Press Ctrl+C to stop\n');
78
+ }
79
+ else {
80
+ console.log('>>> CAMOUF WATCH STARTED <<<');
81
+ }
61
82
  watcher.on('change', async (filePath, changeType) => {
62
- Logger.debug(`File ${changeType}: ${filePath}`);
83
+ if (!isVSCodeFormat) {
84
+ Logger.info(`\n📝 File ${changeType}: ${filePath}`);
85
+ }
63
86
  try {
64
87
  // Incremental analysis
65
88
  const updatedGraph = await scanner.updateFile(filePath, changeType);
66
- const violations = await ruleEngine.validateFile(filePath, updatedGraph);
67
- reporter.reportIncremental(filePath, violations);
89
+ const fileContents = scanner.getFileContents();
90
+ const violations = await ruleEngine.validateFile(filePath, updatedGraph, fileContents);
91
+ if (isVSCodeFormat) {
92
+ reporter.reportIncrementalVSCode(filePath, violations);
93
+ }
94
+ else {
95
+ if (violations.length > 0) {
96
+ Logger.info(` Found ${violations.length} violation(s):`);
97
+ }
98
+ else {
99
+ Logger.info(` ✅ No violations found`);
100
+ }
101
+ reporter.reportIncremental(filePath, violations);
102
+ }
68
103
  }
69
104
  catch (error) {
70
- Logger.error(`Error analyzing ${filePath}: ${error.message}`);
105
+ if (isVSCodeFormat) {
106
+ console.error(`camouf: Error analyzing ${filePath}: ${error.message}`);
107
+ }
108
+ else {
109
+ Logger.error(`Error analyzing ${filePath}: ${error.message}`);
110
+ }
71
111
  }
72
112
  });
73
113
  watcher.on('error', (error) => {
74
- Logger.error(`Watcher error: ${error.message}`);
114
+ if (isVSCodeFormat) {
115
+ console.error(`camouf: Watcher error: ${error.message}`);
116
+ }
117
+ else {
118
+ Logger.error(`Watcher error: ${error.message}`);
119
+ }
75
120
  });
76
121
  // Start watching
77
122
  await watcher.start();
78
123
  // Handle graceful shutdown
79
124
  process.on('SIGINT', async () => {
80
- Logger.info('\n\nStopping file watcher...');
125
+ if (!isVSCodeFormat) {
126
+ Logger.info('\n\nStopping file watcher...');
127
+ }
81
128
  await watcher.stop();
82
129
  const summary = reporter.getSummary();
83
- Logger.info(`\nSession summary: ${summary.total} violations found`);
84
- Logger.info(` Errors: ${summary.errors}, Warnings: ${summary.warnings}, Info: ${summary.info}\n`);
130
+ if (!isVSCodeFormat) {
131
+ Logger.info(`\nSession summary: ${summary.total} violations found`);
132
+ Logger.info(` Errors: ${summary.errors}, Warnings: ${summary.warnings}, Info: ${summary.info}\n`);
133
+ }
134
+ else {
135
+ console.log(`>>> CAMOUF WATCH STOPPED: ${summary.total} total violations <<<`);
136
+ }
85
137
  process.exit(0);
86
138
  });
87
139
  }
88
140
  catch (error) {
89
- spinner.fail(`Watch failed: ${error.message}`);
141
+ if (spinner) {
142
+ spinner.fail(`Watch failed: ${error.message}`);
143
+ }
144
+ else {
145
+ console.error(`camouf: Watch failed: ${error.message}`);
146
+ }
90
147
  process.exit(1);
91
148
  }
92
149
  });
@@ -1 +1 @@
1
- {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@
6
6
  import { CamoufConfig } from '../../types/config.types.js';
7
7
  import { Violation } from '../../types/core.types.js';
8
8
  interface ReporterOptions {
9
- format?: 'text' | 'json' | 'sarif';
9
+ format?: 'text' | 'json' | 'sarif' | 'vscode';
10
10
  outputPath?: string;
11
11
  }
12
12
  interface ViolationSummary {
@@ -57,6 +57,20 @@ export declare class ViolationReporter {
57
57
  private generateSarifReport;
58
58
  private getUniqueRules;
59
59
  private sarifLevel;
60
+ /**
61
+ * Generate VS Code compatible single-line output for problem matcher
62
+ * Format: file(line,column): severity: message [ruleId]
63
+ * This matches the standard GCC/MSBuild pattern that VS Code understands
64
+ */
65
+ private generateVSCodeReport;
66
+ /**
67
+ * Report violations in VS Code format to stdout (for watch mode)
68
+ */
69
+ reportVSCode(violations: Violation[]): void;
70
+ /**
71
+ * Report incremental violations in VS Code format
72
+ */
73
+ reportIncrementalVSCode(filePath: string, violations: Violation[]): void;
60
74
  }
61
75
  export {};
62
76
  //# sourceMappingURL=violation-reporter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"violation-reporter.d.ts","sourceRoot":"","sources":["../../../src/core/reporter/violation-reporter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAqB,MAAM,2BAA2B,CAAC;AAGzE,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,OAAO,CAAmE;gBAEtE,MAAM,EAAE,YAAY;IAIhC;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI;IA2B5C;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI;IAsBlE;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM;IAWzE;;OAEG;IACH,UAAU,IAAI,gBAAgB;IAI9B;;OAEG;IACH,aAAa,IAAI,SAAS,EAAE;IAI5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,kBAAkB;IA8B1B,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,mBAAmB;IAwC3B,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,UAAU;CAUnB"}
1
+ {"version":3,"file":"violation-reporter.d.ts","sourceRoot":"","sources":["../../../src/core/reporter/violation-reporter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAqB,MAAM,2BAA2B,CAAC;AAGzE,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,OAAO,CAAmE;gBAEtE,MAAM,EAAE,YAAY;IAIhC;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI;IA2B5C;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI;IAsBlE;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM;IAazE;;OAEG;IACH,UAAU,IAAI,gBAAgB;IAI9B;;OAEG;IACH,aAAa,IAAI,SAAS,EAAE;IAI5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,kBAAkB;IA8B1B,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,mBAAmB;IAwC3B,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,UAAU;IAWlB;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAuB5B;;OAEG;IACH,YAAY,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI;IAM3C;;OAEG;IACH,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI;CAwBzE"}
@@ -62,6 +62,8 @@ export class ViolationReporter {
62
62
  return this.generateJsonReport(violations);
63
63
  case 'sarif':
64
64
  return this.generateSarifReport(violations);
65
+ case 'vscode':
66
+ return this.generateVSCodeReport(violations);
65
67
  default:
66
68
  return this.generateTextReport(violations);
67
69
  }
@@ -261,5 +263,59 @@ export class ViolationReporter {
261
263
  return 'note';
262
264
  }
263
265
  }
266
+ /**
267
+ * Generate VS Code compatible single-line output for problem matcher
268
+ * Format: file(line,column): severity: message [ruleId]
269
+ * This matches the standard GCC/MSBuild pattern that VS Code understands
270
+ */
271
+ generateVSCodeReport(violations) {
272
+ const lines = [];
273
+ for (const violation of violations) {
274
+ const file = this.getRelativePath(violation.file);
275
+ const line = violation.line || 1;
276
+ const column = violation.column || 1;
277
+ const severity = violation.severity;
278
+ const message = violation.message.replace(/\n/g, ' ');
279
+ const ruleId = violation.ruleId;
280
+ // Format: file(line,column): severity ruleId: message
281
+ lines.push(`${file}(${line},${column}): ${severity} ${ruleId}: ${message}`);
282
+ }
283
+ // Add summary at the end
284
+ const { total, errors, warnings, info } = this.summary;
285
+ lines.push('');
286
+ lines.push(`=== Camouf: ${total} problem(s) found (${errors} errors, ${warnings} warnings, ${info} info) ===`);
287
+ return lines.join('\n');
288
+ }
289
+ /**
290
+ * Report violations in VS Code format to stdout (for watch mode)
291
+ */
292
+ reportVSCode(violations) {
293
+ this.violations = violations;
294
+ this.updateSummary(violations);
295
+ console.log(this.generateVSCodeReport(violations));
296
+ }
297
+ /**
298
+ * Report incremental violations in VS Code format
299
+ */
300
+ reportIncrementalVSCode(filePath, violations) {
301
+ // Remove old violations for this file
302
+ this.violations = this.violations.filter(v => v.file !== filePath);
303
+ // Add new violations
304
+ this.violations.push(...violations);
305
+ this.updateSummary(this.violations);
306
+ // Output only violations for the changed file
307
+ for (const violation of violations) {
308
+ const file = this.getRelativePath(violation.file);
309
+ const line = violation.line || 1;
310
+ const column = violation.column || 1;
311
+ const severity = violation.severity;
312
+ const message = violation.message.replace(/\n/g, ' ');
313
+ const ruleId = violation.ruleId;
314
+ console.log(`${file}(${line},${column}): ${severity} ${ruleId}: ${message}`);
315
+ }
316
+ if (violations.length === 0) {
317
+ console.log(`${this.getRelativePath(filePath)}: ✓ No violations`);
318
+ }
319
+ }
264
320
  }
265
321
  //# sourceMappingURL=violation-reporter.js.map