driftdetect 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/drift.d.ts +11 -0
- package/dist/bin/drift.d.ts.map +1 -0
- package/dist/bin/drift.js +83 -0
- package/dist/bin/drift.js.map +1 -0
- package/dist/commands/approve.d.ts +18 -0
- package/dist/commands/approve.d.ts.map +1 -0
- package/dist/commands/approve.js +271 -0
- package/dist/commands/approve.js.map +1 -0
- package/dist/commands/check.d.ts +39 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +268 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/export.d.ts +14 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +109 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/files.d.ts +13 -0
- package/dist/commands/files.d.ts.map +1 -0
- package/dist/commands/files.js +88 -0
- package/dist/commands/files.js.map +1 -0
- package/dist/commands/ignore.d.ts +18 -0
- package/dist/commands/ignore.d.ts.map +1 -0
- package/dist/commands/ignore.js +200 -0
- package/dist/commands/ignore.js.map +1 -0
- package/dist/commands/index.d.ts +16 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +16 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +19 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +320 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/report.d.ts +20 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +202 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/scan.d.ts +27 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +444 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/status.d.ts +18 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +199 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/where.d.ts +13 -0
- package/dist/commands/where.d.ts.map +1 -0
- package/dist/commands/where.js +80 -0
- package/dist/commands/where.js.map +1 -0
- package/dist/git/hooks.d.ts +108 -0
- package/dist/git/hooks.d.ts.map +1 -0
- package/dist/git/hooks.js +389 -0
- package/dist/git/hooks.js.map +1 -0
- package/dist/git/index.d.ts +6 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +6 -0
- package/dist/git/index.js.map +1 -0
- package/dist/git/staged-files.d.ts +41 -0
- package/dist/git/staged-files.d.ts.map +1 -0
- package/dist/git/staged-files.js +118 -0
- package/dist/git/staged-files.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/reporters/github-reporter.d.ts +13 -0
- package/dist/reporters/github-reporter.d.ts.map +1 -0
- package/dist/reporters/github-reporter.js +59 -0
- package/dist/reporters/github-reporter.js.map +1 -0
- package/dist/reporters/gitlab-reporter.d.ts +16 -0
- package/dist/reporters/gitlab-reporter.d.ts.map +1 -0
- package/dist/reporters/gitlab-reporter.js +62 -0
- package/dist/reporters/gitlab-reporter.js.map +1 -0
- package/dist/reporters/index.d.ts +9 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +9 -0
- package/dist/reporters/index.js.map +1 -0
- package/dist/reporters/json-reporter.d.ts +13 -0
- package/dist/reporters/json-reporter.d.ts.map +1 -0
- package/dist/reporters/json-reporter.js +44 -0
- package/dist/reporters/json-reporter.js.map +1 -0
- package/dist/reporters/text-reporter.d.ts +13 -0
- package/dist/reporters/text-reporter.d.ts.map +1 -0
- package/dist/reporters/text-reporter.js +96 -0
- package/dist/reporters/text-reporter.js.map +1 -0
- package/dist/reporters/types.d.ts +42 -0
- package/dist/reporters/types.d.ts.map +1 -0
- package/dist/reporters/types.js +5 -0
- package/dist/reporters/types.js.map +1 -0
- package/dist/services/scanner-service.d.ts +166 -0
- package/dist/services/scanner-service.d.ts.map +1 -0
- package/dist/services/scanner-service.js +453 -0
- package/dist/services/scanner-service.js.map +1 -0
- package/dist/types/index.d.ts +24 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/index.d.ts +11 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +15 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/progress.d.ts +115 -0
- package/dist/ui/progress.d.ts.map +1 -0
- package/dist/ui/progress.js +232 -0
- package/dist/ui/progress.js.map +1 -0
- package/dist/ui/prompts.d.ts +91 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/dist/ui/prompts.js +160 -0
- package/dist/ui/prompts.js.map +1 -0
- package/dist/ui/spinner.d.ts +109 -0
- package/dist/ui/spinner.d.ts.map +1 -0
- package/dist/ui/spinner.js +179 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/table.d.ts +118 -0
- package/dist/ui/table.d.ts.map +1 -0
- package/dist/ui/table.js +235 -0
- package/dist/ui/table.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ignore Command - drift ignore
|
|
3
|
+
*
|
|
4
|
+
* Ignore a pattern to stop tracking it.
|
|
5
|
+
*
|
|
6
|
+
* @requirements 29.6
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
import * as fs from 'node:fs/promises';
|
|
10
|
+
import * as path from 'node:path';
|
|
11
|
+
import chalk from 'chalk';
|
|
12
|
+
import { PatternStore, InvalidStateTransitionError, } from 'driftdetect-core';
|
|
13
|
+
import { createSpinner, status } from '../ui/spinner.js';
|
|
14
|
+
import { confirmPrompt, promptIgnoreReason } from '../ui/prompts.js';
|
|
15
|
+
import { createPatternsTable } from '../ui/table.js';
|
|
16
|
+
/** Directory name for drift configuration */
|
|
17
|
+
const DRIFT_DIR = '.drift';
|
|
18
|
+
/**
|
|
19
|
+
* Check if drift is initialized
|
|
20
|
+
*/
|
|
21
|
+
async function isDriftInitialized(rootDir) {
|
|
22
|
+
try {
|
|
23
|
+
await fs.access(path.join(rootDir, DRIFT_DIR));
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Ignore command implementation
|
|
32
|
+
*/
|
|
33
|
+
async function ignoreAction(patternId, options) {
|
|
34
|
+
const rootDir = process.cwd();
|
|
35
|
+
console.log();
|
|
36
|
+
console.log(chalk.bold('🔍 Drift - Ignore Pattern'));
|
|
37
|
+
console.log();
|
|
38
|
+
// Check if initialized
|
|
39
|
+
if (!(await isDriftInitialized(rootDir))) {
|
|
40
|
+
status.error('Drift is not initialized. Run `drift init` first.');
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
// Initialize pattern store
|
|
44
|
+
const spinner = createSpinner('Loading patterns...');
|
|
45
|
+
spinner.start();
|
|
46
|
+
const store = new PatternStore({ rootDir });
|
|
47
|
+
await store.initialize();
|
|
48
|
+
spinner.succeed('Patterns loaded');
|
|
49
|
+
// Find the pattern
|
|
50
|
+
const pattern = store.get(patternId);
|
|
51
|
+
if (!pattern) {
|
|
52
|
+
// Try to find by partial ID match
|
|
53
|
+
const allPatterns = store.getAll();
|
|
54
|
+
const matches = allPatterns.filter((p) => p.id.includes(patternId) ||
|
|
55
|
+
p.name.toLowerCase().includes(patternId.toLowerCase()));
|
|
56
|
+
if (matches.length === 0) {
|
|
57
|
+
status.error(`Pattern not found: ${patternId}`);
|
|
58
|
+
console.log();
|
|
59
|
+
console.log(chalk.gray('Use `drift status -d` to see available patterns'));
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
if (matches.length === 1) {
|
|
63
|
+
// Single match, use it
|
|
64
|
+
const match = matches[0];
|
|
65
|
+
console.log(chalk.gray(`Found pattern: ${match.id}`));
|
|
66
|
+
console.log();
|
|
67
|
+
// Get reason if not provided
|
|
68
|
+
let reason = options.reason;
|
|
69
|
+
if (!reason && !options.yes) {
|
|
70
|
+
reason = await promptIgnoreReason();
|
|
71
|
+
}
|
|
72
|
+
if (!options.yes) {
|
|
73
|
+
const confirm = await confirmPrompt(`Ignore pattern "${match.name}"?`, false);
|
|
74
|
+
if (!confirm) {
|
|
75
|
+
status.info('Ignore cancelled');
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
// Update pattern with reason in metadata
|
|
81
|
+
if (reason) {
|
|
82
|
+
store.update(match.id, {
|
|
83
|
+
metadata: {
|
|
84
|
+
...match.metadata,
|
|
85
|
+
custom: {
|
|
86
|
+
...match.metadata.custom,
|
|
87
|
+
ignoreReason: reason,
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
store.ignore(match.id);
|
|
93
|
+
await store.saveAll();
|
|
94
|
+
status.success(`Ignored pattern: ${match.name}`);
|
|
95
|
+
if (reason) {
|
|
96
|
+
console.log(chalk.gray(` Reason: ${reason}`));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
if (error instanceof InvalidStateTransitionError) {
|
|
101
|
+
status.warning(`Pattern is already ignored: ${match.name}`);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
console.log();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// Multiple matches, show them
|
|
111
|
+
console.log(chalk.yellow(`Multiple patterns match "${patternId}":`));
|
|
112
|
+
console.log();
|
|
113
|
+
const rows = matches.slice(0, 10).map((p) => ({
|
|
114
|
+
id: p.id.slice(0, 13),
|
|
115
|
+
name: p.name.slice(0, 28),
|
|
116
|
+
category: p.category,
|
|
117
|
+
confidence: p.confidence.score,
|
|
118
|
+
locations: p.locations.length,
|
|
119
|
+
outliers: p.outliers.length,
|
|
120
|
+
}));
|
|
121
|
+
console.log(createPatternsTable(rows));
|
|
122
|
+
if (matches.length > 10) {
|
|
123
|
+
console.log(chalk.gray(` ... and ${matches.length - 10} more`));
|
|
124
|
+
}
|
|
125
|
+
console.log();
|
|
126
|
+
console.log(chalk.gray('Please specify a more specific pattern ID'));
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
// Show pattern details
|
|
130
|
+
console.log(chalk.bold('Pattern Details'));
|
|
131
|
+
console.log(chalk.gray('─'.repeat(40)));
|
|
132
|
+
console.log(` ID: ${pattern.id}`);
|
|
133
|
+
console.log(` Name: ${pattern.name}`);
|
|
134
|
+
console.log(` Category: ${pattern.category}`);
|
|
135
|
+
console.log(` Status: ${pattern.status}`);
|
|
136
|
+
console.log(` Confidence: ${(pattern.confidence.score * 100).toFixed(0)}% (${pattern.confidence.level})`);
|
|
137
|
+
console.log(` Locations: ${pattern.locations.length}`);
|
|
138
|
+
console.log(` Outliers: ${pattern.outliers.length}`);
|
|
139
|
+
console.log();
|
|
140
|
+
// Check if already ignored
|
|
141
|
+
if (pattern.status === 'ignored') {
|
|
142
|
+
status.warning('Pattern is already ignored');
|
|
143
|
+
console.log();
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
// Get reason if not provided
|
|
147
|
+
let reason = options.reason;
|
|
148
|
+
if (!reason && !options.yes) {
|
|
149
|
+
reason = await promptIgnoreReason();
|
|
150
|
+
}
|
|
151
|
+
// Confirm ignore
|
|
152
|
+
if (!options.yes) {
|
|
153
|
+
const confirmMsg = pattern.status === 'approved'
|
|
154
|
+
? `This pattern is currently approved. Ignore "${pattern.name}"?`
|
|
155
|
+
: `Ignore pattern "${pattern.name}"?`;
|
|
156
|
+
const confirm = await confirmPrompt(confirmMsg, false);
|
|
157
|
+
if (!confirm) {
|
|
158
|
+
status.info('Ignore cancelled');
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Ignore the pattern
|
|
163
|
+
try {
|
|
164
|
+
// Update pattern with reason in metadata
|
|
165
|
+
if (reason) {
|
|
166
|
+
store.update(pattern.id, {
|
|
167
|
+
metadata: {
|
|
168
|
+
...pattern.metadata,
|
|
169
|
+
custom: {
|
|
170
|
+
...pattern.metadata.custom,
|
|
171
|
+
ignoreReason: reason,
|
|
172
|
+
},
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
store.ignore(patternId);
|
|
177
|
+
await store.saveAll();
|
|
178
|
+
status.success(`Ignored pattern: ${pattern.name}`);
|
|
179
|
+
if (reason) {
|
|
180
|
+
console.log(chalk.gray(` Reason: ${reason}`));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
if (error instanceof InvalidStateTransitionError) {
|
|
185
|
+
status.error(`Cannot ignore pattern from status: ${pattern.status}`);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
throw error;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
console.log();
|
|
192
|
+
}
|
|
193
|
+
export const ignoreCommand = new Command('ignore')
|
|
194
|
+
.description('Ignore a pattern by ID')
|
|
195
|
+
.argument('<pattern-id>', 'Pattern ID to ignore')
|
|
196
|
+
.option('-r, --reason <reason>', 'Reason for ignoring the pattern')
|
|
197
|
+
.option('-y, --yes', 'Skip confirmation prompt')
|
|
198
|
+
.option('--verbose', 'Enable verbose output')
|
|
199
|
+
.action(ignoreAction);
|
|
200
|
+
//# sourceMappingURL=ignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignore.js","sourceRoot":"","sources":["../../src/commands/ignore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commands module exports
|
|
3
|
+
*
|
|
4
|
+
* Exports all CLI commands for registration with Commander.js
|
|
5
|
+
*/
|
|
6
|
+
export { initCommand } from './init.js';
|
|
7
|
+
export { scanCommand } from './scan.js';
|
|
8
|
+
export { checkCommand } from './check.js';
|
|
9
|
+
export { statusCommand } from './status.js';
|
|
10
|
+
export { approveCommand } from './approve.js';
|
|
11
|
+
export { ignoreCommand } from './ignore.js';
|
|
12
|
+
export { reportCommand } from './report.js';
|
|
13
|
+
export { exportCommand } from './export.js';
|
|
14
|
+
export { whereCommand } from './where.js';
|
|
15
|
+
export { filesCommand } from './files.js';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commands module exports
|
|
3
|
+
*
|
|
4
|
+
* Exports all CLI commands for registration with Commander.js
|
|
5
|
+
*/
|
|
6
|
+
export { initCommand } from './init.js';
|
|
7
|
+
export { scanCommand } from './scan.js';
|
|
8
|
+
export { checkCommand } from './check.js';
|
|
9
|
+
export { statusCommand } from './status.js';
|
|
10
|
+
export { approveCommand } from './approve.js';
|
|
11
|
+
export { ignoreCommand } from './ignore.js';
|
|
12
|
+
export { reportCommand } from './report.js';
|
|
13
|
+
export { exportCommand } from './export.js';
|
|
14
|
+
export { whereCommand } from './where.js';
|
|
15
|
+
export { filesCommand } from './files.js';
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Init Command - drift init
|
|
3
|
+
*
|
|
4
|
+
* Initialize Drift in a project by creating the .drift/ directory
|
|
5
|
+
* and running an initial scan.
|
|
6
|
+
*
|
|
7
|
+
* @requirements 29.1, 38.1
|
|
8
|
+
*/
|
|
9
|
+
import { Command } from 'commander';
|
|
10
|
+
export interface InitOptions {
|
|
11
|
+
/** Initialize from Cheatcode2026 scaffold */
|
|
12
|
+
fromScaffold?: boolean;
|
|
13
|
+
/** Skip interactive prompts */
|
|
14
|
+
yes?: boolean;
|
|
15
|
+
/** Enable verbose output */
|
|
16
|
+
verbose?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare const initCommand: Command;
|
|
19
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,MAAM,WAAW,WAAW;IAC1B,6CAA6C;IAC7C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+BAA+B;IAC/B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,4BAA4B;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA4UD,eAAO,MAAM,WAAW,SAKH,CAAC"}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Init Command - drift init
|
|
3
|
+
*
|
|
4
|
+
* Initialize Drift in a project by creating the .drift/ directory
|
|
5
|
+
* and running an initial scan.
|
|
6
|
+
*
|
|
7
|
+
* @requirements 29.1, 38.1
|
|
8
|
+
*/
|
|
9
|
+
import { Command } from 'commander';
|
|
10
|
+
import * as fs from 'node:fs/promises';
|
|
11
|
+
import * as path from 'node:path';
|
|
12
|
+
import chalk from 'chalk';
|
|
13
|
+
import { PatternStore } from 'driftdetect-core';
|
|
14
|
+
import { createSpinner, status } from '../ui/spinner.js';
|
|
15
|
+
import { promptInitOptions, confirmPrompt } from '../ui/prompts.js';
|
|
16
|
+
/** Directory name for drift configuration */
|
|
17
|
+
const DRIFT_DIR = '.drift';
|
|
18
|
+
/** Subdirectories to create */
|
|
19
|
+
const DRIFT_SUBDIRS = [
|
|
20
|
+
'patterns/discovered',
|
|
21
|
+
'patterns/approved',
|
|
22
|
+
'patterns/ignored',
|
|
23
|
+
'patterns/variants',
|
|
24
|
+
'history',
|
|
25
|
+
'cache',
|
|
26
|
+
'reports',
|
|
27
|
+
];
|
|
28
|
+
/**
|
|
29
|
+
* Check if drift is already initialized
|
|
30
|
+
*/
|
|
31
|
+
async function isDriftInitialized(rootDir) {
|
|
32
|
+
try {
|
|
33
|
+
await fs.access(path.join(rootDir, DRIFT_DIR));
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create the .drift directory structure
|
|
42
|
+
*/
|
|
43
|
+
async function createDriftDirectory(rootDir, verbose) {
|
|
44
|
+
const driftDir = path.join(rootDir, DRIFT_DIR);
|
|
45
|
+
// Create main .drift directory
|
|
46
|
+
await fs.mkdir(driftDir, { recursive: true });
|
|
47
|
+
// Create subdirectories
|
|
48
|
+
for (const subdir of DRIFT_SUBDIRS) {
|
|
49
|
+
const subdirPath = path.join(driftDir, subdir);
|
|
50
|
+
await fs.mkdir(subdirPath, { recursive: true });
|
|
51
|
+
if (verbose) {
|
|
52
|
+
status.info(`Created ${path.relative(rootDir, subdirPath)}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Create default config file
|
|
56
|
+
const configPath = path.join(driftDir, 'config.json');
|
|
57
|
+
const defaultConfig = {
|
|
58
|
+
version: '1.0.0',
|
|
59
|
+
severity: {},
|
|
60
|
+
ignore: [
|
|
61
|
+
'node_modules/**',
|
|
62
|
+
'dist/**',
|
|
63
|
+
'build/**',
|
|
64
|
+
'.git/**',
|
|
65
|
+
'coverage/**',
|
|
66
|
+
'*.min.js',
|
|
67
|
+
'*.bundle.js',
|
|
68
|
+
],
|
|
69
|
+
ci: {
|
|
70
|
+
failOn: 'error',
|
|
71
|
+
reportFormat: 'text',
|
|
72
|
+
},
|
|
73
|
+
learning: {
|
|
74
|
+
autoApproveThreshold: 0.95,
|
|
75
|
+
minOccurrences: 3,
|
|
76
|
+
},
|
|
77
|
+
performance: {
|
|
78
|
+
maxWorkers: 4,
|
|
79
|
+
cacheEnabled: true,
|
|
80
|
+
incrementalAnalysis: true,
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
await fs.writeFile(configPath, JSON.stringify(defaultConfig, null, 2));
|
|
84
|
+
if (verbose) {
|
|
85
|
+
status.info(`Created ${path.relative(rootDir, configPath)}`);
|
|
86
|
+
}
|
|
87
|
+
// Create .driftignore file
|
|
88
|
+
const driftignorePath = path.join(rootDir, '.driftignore');
|
|
89
|
+
const driftignoreContent = `# Drift ignore patterns
|
|
90
|
+
# Add files and directories to ignore during scanning
|
|
91
|
+
|
|
92
|
+
# Dependencies
|
|
93
|
+
node_modules/
|
|
94
|
+
.pnpm-store/
|
|
95
|
+
|
|
96
|
+
# Build outputs
|
|
97
|
+
dist/
|
|
98
|
+
build/
|
|
99
|
+
out/
|
|
100
|
+
.next/
|
|
101
|
+
|
|
102
|
+
# Test coverage
|
|
103
|
+
coverage/
|
|
104
|
+
|
|
105
|
+
# IDE and editor files
|
|
106
|
+
.idea/
|
|
107
|
+
.vscode/
|
|
108
|
+
*.swp
|
|
109
|
+
*.swo
|
|
110
|
+
|
|
111
|
+
# OS files
|
|
112
|
+
.DS_Store
|
|
113
|
+
Thumbs.db
|
|
114
|
+
|
|
115
|
+
# Logs
|
|
116
|
+
*.log
|
|
117
|
+
logs/
|
|
118
|
+
|
|
119
|
+
# Temporary files
|
|
120
|
+
tmp/
|
|
121
|
+
temp/
|
|
122
|
+
`;
|
|
123
|
+
try {
|
|
124
|
+
await fs.access(driftignorePath);
|
|
125
|
+
// File exists, don't overwrite
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
await fs.writeFile(driftignorePath, driftignoreContent);
|
|
129
|
+
if (verbose) {
|
|
130
|
+
status.info(`Created .driftignore`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Detect Cheatcode2026 scaffold markers
|
|
136
|
+
*/
|
|
137
|
+
async function detectCheatcode2026(rootDir) {
|
|
138
|
+
// Check for common Cheatcode2026 markers
|
|
139
|
+
const markers = [
|
|
140
|
+
'2026cheatcode/scaffolding/00-MANIFEST.md',
|
|
141
|
+
'apps/web/lib/resilience',
|
|
142
|
+
'packages/backend/src',
|
|
143
|
+
];
|
|
144
|
+
for (const marker of markers) {
|
|
145
|
+
try {
|
|
146
|
+
await fs.access(path.join(rootDir, marker));
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// Continue checking other markers
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Load Cheatcode2026 presets
|
|
157
|
+
*/
|
|
158
|
+
async function loadCheatcode2026Presets(store, verbose) {
|
|
159
|
+
// Cheatcode2026 enterprise patterns to auto-approve
|
|
160
|
+
const cheatcodePatterns = [
|
|
161
|
+
{ id: 'cc2026-exception-taxonomy', name: 'Exception Taxonomy', category: 'errors' },
|
|
162
|
+
{ id: 'cc2026-circuit-breaker', name: 'Circuit Breaker Pattern', category: 'errors' },
|
|
163
|
+
{ id: 'cc2026-auth-middleware', name: 'Auth Middleware', category: 'auth' },
|
|
164
|
+
{ id: 'cc2026-structured-logging', name: 'Structured Logging', category: 'logging' },
|
|
165
|
+
{ id: 'cc2026-design-tokens', name: 'Design Tokens', category: 'styling' },
|
|
166
|
+
{ id: 'cc2026-job-state-machine', name: 'Job State Machine', category: 'data-access' },
|
|
167
|
+
{ id: 'cc2026-response-helpers', name: 'Response Helpers', category: 'api' },
|
|
168
|
+
{ id: 'cc2026-input-sanitization', name: 'Input Sanitization', category: 'security' },
|
|
169
|
+
{ id: 'cc2026-csp-headers', name: 'CSP Headers', category: 'security' },
|
|
170
|
+
{ id: 'cc2026-rate-limiting', name: 'Rate Limiting', category: 'security' },
|
|
171
|
+
{ id: 'cc2026-env-validation', name: 'Environment Validation', category: 'config' },
|
|
172
|
+
{ id: 'cc2026-feature-flags', name: 'Feature Flags', category: 'config' },
|
|
173
|
+
{ id: 'cc2026-test-structure', name: 'Test Structure (AAA)', category: 'testing' },
|
|
174
|
+
{ id: 'cc2026-api-routes', name: 'API Route Structure', category: 'api' },
|
|
175
|
+
{ id: 'cc2026-error-responses', name: 'Error Response Format', category: 'api' },
|
|
176
|
+
{ id: 'cc2026-rbac', name: 'Role-Based Access Control', category: 'auth' },
|
|
177
|
+
{ id: 'cc2026-correlation-ids', name: 'Correlation IDs', category: 'logging' },
|
|
178
|
+
{ id: 'cc2026-health-checks', name: 'Health Check Patterns', category: 'logging' },
|
|
179
|
+
];
|
|
180
|
+
let loadedCount = 0;
|
|
181
|
+
for (const preset of cheatcodePatterns) {
|
|
182
|
+
// Create a pattern entry for each preset
|
|
183
|
+
const now = new Date().toISOString();
|
|
184
|
+
const pattern = {
|
|
185
|
+
id: preset.id,
|
|
186
|
+
category: preset.category,
|
|
187
|
+
subcategory: 'cheatcode2026',
|
|
188
|
+
name: preset.name,
|
|
189
|
+
description: `Cheatcode2026 enterprise pattern: ${preset.name}`,
|
|
190
|
+
detector: {
|
|
191
|
+
type: 'custom',
|
|
192
|
+
config: { source: 'cheatcode2026' },
|
|
193
|
+
},
|
|
194
|
+
confidence: {
|
|
195
|
+
frequency: 1.0,
|
|
196
|
+
consistency: 1.0,
|
|
197
|
+
age: 0,
|
|
198
|
+
spread: 1,
|
|
199
|
+
score: 1.0,
|
|
200
|
+
level: 'high',
|
|
201
|
+
},
|
|
202
|
+
locations: [],
|
|
203
|
+
outliers: [],
|
|
204
|
+
metadata: {
|
|
205
|
+
firstSeen: now,
|
|
206
|
+
lastSeen: now,
|
|
207
|
+
approvedAt: now,
|
|
208
|
+
source: 'cheatcode2026',
|
|
209
|
+
tags: ['cheatcode2026', 'enterprise', 'preset'],
|
|
210
|
+
},
|
|
211
|
+
severity: 'warning',
|
|
212
|
+
autoFixable: false,
|
|
213
|
+
status: 'approved',
|
|
214
|
+
};
|
|
215
|
+
try {
|
|
216
|
+
store.add(pattern);
|
|
217
|
+
loadedCount++;
|
|
218
|
+
if (verbose) {
|
|
219
|
+
status.info(`Loaded preset: ${preset.name}`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
// Pattern might already exist
|
|
224
|
+
if (verbose) {
|
|
225
|
+
status.warning(`Skipped existing preset: ${preset.name}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return loadedCount;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Init command implementation
|
|
233
|
+
*/
|
|
234
|
+
async function initAction(options) {
|
|
235
|
+
const rootDir = process.cwd();
|
|
236
|
+
const verbose = options.verbose ?? false;
|
|
237
|
+
console.log();
|
|
238
|
+
console.log(chalk.bold('🔍 Drift - Architectural Drift Detection'));
|
|
239
|
+
console.log();
|
|
240
|
+
// Check if already initialized
|
|
241
|
+
if (await isDriftInitialized(rootDir)) {
|
|
242
|
+
if (!options.yes) {
|
|
243
|
+
const overwrite = await confirmPrompt('Drift is already initialized. Reinitialize?', false);
|
|
244
|
+
if (!overwrite) {
|
|
245
|
+
status.info('Initialization cancelled');
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// Create directory structure
|
|
251
|
+
const spinner = createSpinner('Creating .drift directory structure...');
|
|
252
|
+
spinner.start();
|
|
253
|
+
try {
|
|
254
|
+
await createDriftDirectory(rootDir, verbose);
|
|
255
|
+
spinner.succeed('Created .drift directory structure');
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
spinner.fail('Failed to create .drift directory');
|
|
259
|
+
console.error(chalk.red(error.message));
|
|
260
|
+
process.exit(1);
|
|
261
|
+
}
|
|
262
|
+
// Initialize pattern store
|
|
263
|
+
const store = new PatternStore({ rootDir });
|
|
264
|
+
await store.initialize();
|
|
265
|
+
// Handle Cheatcode2026 scaffold
|
|
266
|
+
let isCheatcode = false;
|
|
267
|
+
if (options.fromScaffold) {
|
|
268
|
+
isCheatcode = true;
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
// Auto-detect Cheatcode2026
|
|
272
|
+
isCheatcode = await detectCheatcode2026(rootDir);
|
|
273
|
+
if (isCheatcode && !options.yes) {
|
|
274
|
+
const usePresets = await confirmPrompt('Cheatcode2026 scaffold detected. Load enterprise presets?', true);
|
|
275
|
+
isCheatcode = usePresets;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
if (isCheatcode) {
|
|
279
|
+
const presetSpinner = createSpinner('Loading Cheatcode2026 presets...');
|
|
280
|
+
presetSpinner.start();
|
|
281
|
+
try {
|
|
282
|
+
const count = await loadCheatcode2026Presets(store, verbose);
|
|
283
|
+
await store.saveAll();
|
|
284
|
+
presetSpinner.succeed(`Loaded ${count} Cheatcode2026 enterprise patterns`);
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
presetSpinner.fail('Failed to load presets');
|
|
288
|
+
console.error(chalk.red(error.message));
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
// Get init options
|
|
292
|
+
let initOpts = { scanNow: true, autoApprove: false };
|
|
293
|
+
if (!options.yes) {
|
|
294
|
+
initOpts = await promptInitOptions();
|
|
295
|
+
}
|
|
296
|
+
// Run initial scan if requested
|
|
297
|
+
if (initOpts.scanNow) {
|
|
298
|
+
console.log();
|
|
299
|
+
console.log(chalk.gray('To run an initial scan, use:'));
|
|
300
|
+
console.log(chalk.cyan(' drift scan'));
|
|
301
|
+
console.log();
|
|
302
|
+
console.log(chalk.gray('To check for violations:'));
|
|
303
|
+
console.log(chalk.cyan(' drift check'));
|
|
304
|
+
}
|
|
305
|
+
// Summary
|
|
306
|
+
console.log();
|
|
307
|
+
status.success('Drift initialized successfully!');
|
|
308
|
+
console.log();
|
|
309
|
+
console.log(chalk.gray('Configuration: .drift/config.json'));
|
|
310
|
+
console.log(chalk.gray('Patterns: .drift/patterns/'));
|
|
311
|
+
console.log(chalk.gray('Ignore rules: .driftignore'));
|
|
312
|
+
console.log();
|
|
313
|
+
}
|
|
314
|
+
export const initCommand = new Command('init')
|
|
315
|
+
.description('Initialize Drift in the current directory')
|
|
316
|
+
.option('--from-scaffold', 'Initialize with Cheatcode2026 presets')
|
|
317
|
+
.option('-y, --yes', 'Skip interactive prompts and use defaults')
|
|
318
|
+
.option('--verbose', 'Enable verbose output')
|
|
319
|
+
.action(initAction);
|
|
320
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAWpE,6CAA6C;AAC7C,MAAM,SAAS,GAAG,QAAQ,CAAC;AAE3B,+BAA+B;AAC/B,MAAM,aAAa,GAAG;IACpB,qBAAqB;IACrB,mBAAmB;IACnB,kBAAkB;IAClB,mBAAmB;IACnB,SAAS;IACT,OAAO;IACP,SAAS;CACV,CAAC;AAEF;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAAC,OAAe;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,oBAAoB,CAAC,OAAe,EAAE,OAAgB;IACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAE/C,+BAA+B;IAC/B,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,wBAAwB;IACxB,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACtD,MAAM,aAAa,GAAG;QACpB,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE;YACN,iBAAiB;YACjB,SAAS;YACT,UAAU;YACV,SAAS;YACT,aAAa;YACb,UAAU;YACV,aAAa;SACd;QACD,EAAE,EAAE;YACF,MAAM,EAAE,OAAO;YACf,YAAY,EAAE,MAAM;SACrB;QACD,QAAQ,EAAE;YACR,oBAAoB,EAAE,IAAI;YAC1B,cAAc,EAAE,CAAC;SAClB;QACD,WAAW,EAAE;YACX,UAAU,EAAE,CAAC;YACb,YAAY,EAAE,IAAI;YAClB,mBAAmB,EAAE,IAAI;SAC1B;KACF,CAAC;IAEF,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,2BAA2B;IAC3B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAC3D,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiC5B,CAAC;IAEA,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACjC,+BAA+B;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;QACxD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAAC,OAAe;IAChD,yCAAyC;IACzC,MAAM,OAAO,GAAG;QACd,0CAA0C;QAC1C,yBAAyB;QACzB,sBAAsB;KACvB,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,wBAAwB,CACrC,KAAmB,EACnB,OAAgB;IAEhB,oDAAoD;IACpD,MAAM,iBAAiB,GAAG;QACxB,EAAE,EAAE,EAAE,2BAA2B,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,QAAQ,EAAE;QACnF,EAAE,EAAE,EAAE,wBAAwB,EAAE,IAAI,EAAE,yBAAyB,EAAE,QAAQ,EAAE,QAAQ,EAAE;QACrF,EAAE,EAAE,EAAE,wBAAwB,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE;QAC3E,EAAE,EAAE,EAAE,2BAA2B,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,SAAS,EAAE;QACpF,EAAE,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE;QAC1E,EAAE,EAAE,EAAE,0BAA0B,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,aAAa,EAAE;QACtF,EAAE,EAAE,EAAE,yBAAyB,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC5E,EAAE,EAAE,EAAE,2BAA2B,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,UAAU,EAAE;QACrF,EAAE,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE;QACvE,EAAE,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE;QAC3E,EAAE,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE,wBAAwB,EAAE,QAAQ,EAAE,QAAQ,EAAE;QACnF,EAAE,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE;QACzE,EAAE,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE,sBAAsB,EAAE,QAAQ,EAAE,SAAS,EAAE;QAClF,EAAE,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,qBAAqB,EAAE,QAAQ,EAAE,KAAK,EAAE;QACzE,EAAE,EAAE,EAAE,wBAAwB,EAAE,IAAI,EAAE,uBAAuB,EAAE,QAAQ,EAAE,KAAK,EAAE;QAChF,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,2BAA2B,EAAE,QAAQ,EAAE,MAAM,EAAE;QAC1E,EAAE,EAAE,EAAE,wBAAwB,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE;QAC9E,EAAE,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,uBAAuB,EAAE,QAAQ,EAAE,SAAS,EAAE;KACnF,CAAC;IAEF,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,CAAC;QACvC,yCAAyC;QACzC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG;YACd,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,QAAQ,EAAE,MAAM,CAAC,QAAsD;YACvE,WAAW,EAAE,eAAe;YAC5B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,qCAAqC,MAAM,CAAC,IAAI,EAAE;YAC/D,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAiB;gBACvB,MAAM,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE;aACpC;YACD,UAAU,EAAE;gBACV,SAAS,EAAE,GAAG;gBACd,WAAW,EAAE,GAAG;gBAChB,GAAG,EAAE,CAAC;gBACN,MAAM,EAAE,CAAC;gBACT,KAAK,EAAE,GAAG;gBACV,KAAK,EAAE,MAAe;aACvB;YACD,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE;gBACR,SAAS,EAAE,GAAG;gBACd,QAAQ,EAAE,GAAG;gBACb,UAAU,EAAE,GAAG;gBACf,MAAM,EAAE,eAAe;gBACvB,IAAI,EAAE,CAAC,eAAe,EAAE,YAAY,EAAE,QAAQ,CAAC;aAChD;YACD,QAAQ,EAAE,SAAkB;YAC5B,WAAW,EAAE,KAAK;YAClB,MAAM,EAAE,UAAmB;SAC5B,CAAC;QAEF,IAAI,CAAC;YACH,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACnB,WAAW,EAAE,CAAC;YACd,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;YAC9B,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,OAAO,CAAC,4BAA4B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,OAAoB;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;IAEzC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,+BAA+B;IAC/B,IAAI,MAAM,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,aAAa,CACnC,6CAA6C,EAC7C,KAAK,CACN,CAAC;YACF,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBACxC,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,MAAM,OAAO,GAAG,aAAa,CAAC,wCAAwC,CAAC,CAAC;IACxE,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,OAAO,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,2BAA2B;IAC3B,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5C,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;IAEzB,gCAAgC;IAChC,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,4BAA4B;QAC5B,WAAW,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,WAAW,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAChC,MAAM,UAAU,GAAG,MAAM,aAAa,CACpC,2DAA2D,EAC3D,IAAI,CACL,CAAC;YACF,WAAW,GAAG,UAAU,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,aAAa,GAAG,aAAa,CAAC,kCAAkC,CAAC,CAAC;QACxE,aAAa,CAAC,KAAK,EAAE,CAAC;QAEtB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC7D,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;YACtB,aAAa,CAAC,OAAO,CAAC,UAAU,KAAK,oCAAoC,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,IAAI,QAAQ,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IACrD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACvC,CAAC;IAED,gCAAgC;IAChC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,UAAU;IACV,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,MAAM,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,iBAAiB,EAAE,uCAAuC,CAAC;KAClE,MAAM,CAAC,WAAW,EAAE,2CAA2C,CAAC;KAChE,MAAM,CAAC,WAAW,EAAE,uBAAuB,CAAC;KAC5C,MAAM,CAAC,UAAU,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report Command - drift report
|
|
3
|
+
*
|
|
4
|
+
* Generate reports in various formats.
|
|
5
|
+
*
|
|
6
|
+
* @requirements 29.7
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
export interface ReportOptions {
|
|
10
|
+
/** Output format */
|
|
11
|
+
format?: 'text' | 'json' | 'github' | 'gitlab';
|
|
12
|
+
/** Output file path */
|
|
13
|
+
output?: string;
|
|
14
|
+
/** Include only specific categories */
|
|
15
|
+
categories?: string[];
|
|
16
|
+
/** Enable verbose output */
|
|
17
|
+
verbose?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare const reportCommand: Command;
|
|
20
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBpC,MAAM,WAAW,aAAa;IAC5B,oBAAoB;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC/C,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA8MD,eAAO,MAAM,aAAa,SAMH,CAAC"}
|