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.
- package/README.md +89 -2
- package/dist/cli/commands/init.d.ts +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +120 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +2 -1
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/commands/watch.d.ts.map +1 -1
- package/dist/cli/commands/watch.js +77 -20
- package/dist/cli/commands/watch.js.map +1 -1
- package/dist/core/reporter/violation-reporter.d.ts +15 -1
- package/dist/core/reporter/violation-reporter.d.ts.map +1 -1
- package/dist/core/reporter/violation-reporter.js +56 -0
- package/dist/core/reporter/violation-reporter.js.map +1 -1
- package/dist/core/rules/builtin/hardcoded-secrets.rule.d.ts +5 -0
- package/dist/core/rules/builtin/hardcoded-secrets.rule.d.ts.map +1 -1
- package/dist/core/rules/builtin/hardcoded-secrets.rule.js +108 -18
- package/dist/core/rules/builtin/hardcoded-secrets.rule.js.map +1 -1
- package/dist/core/rules/rule-engine.d.ts +2 -2
- package/dist/core/rules/rule-engine.d.ts.map +1 -1
- package/dist/core/rules/rule-engine.js +6 -5
- package/dist/core/rules/rule-engine.js.map +1 -1
- package/dist/core/scanner/project-detector.d.ts +1 -1
- package/dist/core/scanner/project-detector.d.ts.map +1 -1
- package/dist/core/scanner/project-detector.js +159 -20
- package/dist/core/scanner/project-detector.js.map +1 -1
- package/dist/core/scanner/project-scanner.d.ts +5 -0
- package/dist/core/scanner/project-scanner.d.ts.map +1 -1
- package/dist/core/scanner/project-scanner.js +14 -2
- package/dist/core/scanner/project-scanner.js.map +1 -1
- package/dist/core/watcher/file-watcher.d.ts.map +1 -1
- package/dist/core/watcher/file-watcher.js +41 -28
- package/dist/core/watcher/file-watcher.js.map +1 -1
- 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
|
-
- **
|
|
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
|
|
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.
|
|
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":"AAAA
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,
|
|
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
|
|
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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,qBAAqB,EAAE,4BAA4B,CAAC;KAC3D,MAAM,CAAC,iBAAiB,EAAE,sCAAsC,CAAC;KACjE,MAAM,CAAC,OAAO,EAAE,+CAA+C,CAAC;KAChE,MAAM,CAAC,mBAAmB,EAAE,mCAAmC,EAAE,MAAM,CAAC;KACxE,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;KACjD,MAAM,CAAC,sBAAsB,EAAE,+CAA+C,EAAE,OAAO,CAAC;KACxF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;IAExD,IAAI,CAAC;QACH,qBAAqB;QACrB,MAAM,aAAa,GAAG,IAAI,oBAAoB,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE9D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,wBAAwB;QACxB,OAAO,CAAC,IAAI,GAAG,qBAAqB,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAE/C,4BAA4B;QAC5B,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9C,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;QAED,eAAe;QACf,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,CAAC,OAAO,CAAC,WAAW,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEtD,WAAW;QACX,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,qBAAqB,EAAE,4BAA4B,CAAC;KAC3D,MAAM,CAAC,iBAAiB,EAAE,sCAAsC,CAAC;KACjE,MAAM,CAAC,OAAO,EAAE,+CAA+C,CAAC;KAChE,MAAM,CAAC,mBAAmB,EAAE,mCAAmC,EAAE,MAAM,CAAC;KACxE,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;KACjD,MAAM,CAAC,sBAAsB,EAAE,+CAA+C,EAAE,OAAO,CAAC;KACxF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;IAExD,IAAI,CAAC;QACH,qBAAqB;QACrB,MAAM,aAAa,GAAG,IAAI,oBAAoB,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE9D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,wBAAwB;QACxB,OAAO,CAAC,IAAI,GAAG,qBAAqB,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAE/C,4BAA4B;QAC5B,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9C,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;QAED,eAAe;QACf,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,CAAC,OAAO,CAAC,WAAW,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEtD,WAAW;QACX,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACvC,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QAC/C,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAElE,wBAAwB;QACxB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,GAAG,wBAAwB,CAAC;YACxC,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACnD,OAAO,CAAC,OAAO,CAAC,WAAW,KAAK,aAAa,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,iBAAiB;QACjB,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE;YACjD,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,UAAU,EAAE,OAAO,CAAC,MAAM;SAC3B,CAAC,CAAC;QAEH,gBAAgB;QAChB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,OAAO,CAAC,qBAAqB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;QAED,sBAAsB;QACtB,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;QAEjC,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,SAAS,KAAK,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,UAAU,GAAG,IAAI,CAAC;QACnE,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YAAE,UAAU,GAAG,IAAI,CAAC;QAC/F,IAAI,SAAS,KAAK,MAAM,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC;YAAE,UAAU,GAAG,IAAI,CAAC;QAEjE,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAE7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,sBAAuB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
54
|
+
if (spinner)
|
|
55
|
+
spinner.text = 'Performing initial scan...';
|
|
49
56
|
const graph = await scanner.scan();
|
|
50
|
-
spinner
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
|
71
|
+
if (spinner)
|
|
72
|
+
spinner.stop();
|
|
57
73
|
}
|
|
58
74
|
// Setup file watcher
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
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
|
|
67
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
125
|
+
if (!isVSCodeFormat) {
|
|
126
|
+
Logger.info('\n\nStopping file watcher...');
|
|
127
|
+
}
|
|
81
128
|
await watcher.stop();
|
|
82
129
|
const summary = reporter.getSummary();
|
|
83
|
-
|
|
84
|
-
|
|
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
|
|
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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,qBAAqB,EAAE,4BAA4B,CAAC;KAC3D,MAAM,CAAC,cAAc,EAAE,yBAAyB,CAAC;KACjD,MAAM,CAAC,iBAAiB,EAAE,+CAA+C,EAAE,KAAK,CAAC;KACjF,MAAM,CAAC,iBAAiB,EAAE,sCAAsC,CAAC;KACjE,MAAM,CAAC,qBAAqB,EAAE,+BAA+B,CAAC;KAC9D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;
|
|
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;
|
|
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
|