driftdetect-lsp 0.9.31 → 0.9.33
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/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +183 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/commands/show-patterns.d.ts +30 -0
- package/dist/commands/show-patterns.d.ts.map +1 -1
- package/dist/commands/show-patterns.js +175 -0
- package/dist/commands/show-patterns.js.map +1 -0
- package/dist/handlers/code-actions.d.ts +32 -0
- package/dist/handlers/code-actions.d.ts.map +1 -1
- package/dist/handlers/code-actions.js +184 -0
- package/dist/handlers/code-actions.js.map +1 -0
- package/dist/handlers/code-lens.d.ts +32 -0
- package/dist/handlers/code-lens.d.ts.map +1 -1
- package/dist/handlers/code-lens.js +162 -0
- package/dist/handlers/code-lens.js.map +1 -0
- package/dist/handlers/commands.d.ts +48 -0
- package/dist/handlers/commands.d.ts.map +1 -1
- package/dist/handlers/commands.js +360 -0
- package/dist/handlers/commands.js.map +1 -0
- package/dist/handlers/diagnostics.d.ts +73 -0
- package/dist/handlers/diagnostics.d.ts.map +1 -1
- package/dist/handlers/diagnostics.js +259 -0
- package/dist/handlers/diagnostics.js.map +1 -0
- package/dist/handlers/document-sync.d.ts +37 -0
- package/dist/handlers/document-sync.d.ts.map +1 -1
- package/dist/handlers/document-sync.js +49 -0
- package/dist/handlers/document-sync.js.map +1 -0
- package/dist/handlers/hover.d.ts +30 -0
- package/dist/handlers/hover.d.ts.map +1 -1
- package/dist/handlers/hover.js +119 -0
- package/dist/handlers/hover.js.map +1 -0
- package/dist/integration/core-scanner.d.ts.map +1 -1
- package/dist/integration/core-scanner.js +309 -0
- package/dist/integration/core-scanner.js.map +1 -0
- package/dist/integration/pattern-store-adapter.d.ts +117 -0
- package/dist/integration/pattern-store-adapter.d.ts.map +1 -1
- package/dist/integration/pattern-store-adapter.js +349 -0
- package/dist/integration/pattern-store-adapter.js.map +1 -0
- package/dist/integration/types.d.ts +134 -0
- package/dist/integration/types.d.ts.map +1 -1
- package/dist/integration/types.js +39 -0
- package/dist/integration/types.js.map +1 -0
- package/dist/server/types.d.ts +139 -0
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +8 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +208 -0
- package/dist/server.js.map +1 -0
- package/dist/utils/diagnostic.js +263 -0
- package/dist/utils/diagnostic.js.map +1 -0
- package/dist/utils/document.d.ts +40 -0
- package/dist/utils/document.d.ts.map +1 -0
- package/dist/utils/document.js +138 -0
- package/dist/utils/document.js.map +1 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/workspace.d.ts.map +1 -1
- package/dist/utils/workspace.js +241 -0
- package/dist/utils/workspace.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAMlF;;GAEG;AACH,eAAO,MAAM,WAAW;;;CAGd,CAAC;AAMX;;;GAGG;AACH,eAAO,MAAM,cAAc;IACzB,wCAAwC;;IAExC,uCAAuC;;IAEvC,gDAAgD;;IAEhD,+CAA+C;;IAE/C,6CAA6C;;IAE7C,+CAA+C;;IAE/C,mDAAmD;;IAEnD,mCAAmC;;IAEnC,kCAAkC;;CAE1B,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAAkC,CAAC;AAM7E;;GAEG;AACH,eAAO,MAAM,2BAA2B,6CAI9B,CAAC;AAMX;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,IAAI,kBAAkB,CAqD5D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,gBAAgB,CAKxD;AAMD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACvD,IAAI,EAAE,MAAM,GACX,OAAO,CAgBT;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACtD,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACtD,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACtD,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,mCAAmC,CACjD,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACtD,OAAO,CAKT"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP Server Capabilities
|
|
3
|
+
*
|
|
4
|
+
* Defines the capabilities that the Drift LSP server advertises to clients.
|
|
5
|
+
* Based on the Language Server Protocol specification.
|
|
6
|
+
*
|
|
7
|
+
* @requirements 27.1 - THE LSP_Server SHALL implement the Language Server Protocol specification
|
|
8
|
+
* @requirements 27.2 - THE LSP_Server SHALL support document synchronization
|
|
9
|
+
* @requirements 27.3 - THE LSP_Server SHALL publish diagnostics for violations
|
|
10
|
+
* @requirements 27.4 - THE LSP_Server SHALL provide code actions for quick fixes
|
|
11
|
+
* @requirements 27.5 - THE LSP_Server SHALL provide hover information for violations
|
|
12
|
+
* @requirements 27.6 - THE LSP_Server SHALL provide code lens for pattern information
|
|
13
|
+
*/
|
|
14
|
+
import { TextDocumentSyncKind, CodeActionKind, } from 'vscode-languageserver';
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Server Information
|
|
17
|
+
// ============================================================================
|
|
18
|
+
/**
|
|
19
|
+
* Server identification information
|
|
20
|
+
*/
|
|
21
|
+
export const SERVER_INFO = {
|
|
22
|
+
name: 'drift-lsp',
|
|
23
|
+
version: '0.0.1',
|
|
24
|
+
};
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Command Definitions
|
|
27
|
+
// ============================================================================
|
|
28
|
+
/**
|
|
29
|
+
* All Drift LSP commands
|
|
30
|
+
* @requirements 28.1-28.9 - LSP Server Commands
|
|
31
|
+
*/
|
|
32
|
+
export const DRIFT_COMMANDS = {
|
|
33
|
+
/** Approve a pattern for enforcement */
|
|
34
|
+
APPROVE_PATTERN: 'drift.approvePattern',
|
|
35
|
+
/** Ignore a pattern (don't enforce) */
|
|
36
|
+
IGNORE_PATTERN: 'drift.ignorePattern',
|
|
37
|
+
/** Ignore a single occurrence of a violation */
|
|
38
|
+
IGNORE_ONCE: 'drift.ignoreOnce',
|
|
39
|
+
/** Create a variant (intentional deviation) */
|
|
40
|
+
CREATE_VARIANT: 'drift.createVariant',
|
|
41
|
+
/** Request AI explanation for a violation */
|
|
42
|
+
EXPLAIN_AI: 'drift.explainWithAI',
|
|
43
|
+
/** Request AI-generated fix for a violation */
|
|
44
|
+
FIX_AI: 'drift.fixWithAI',
|
|
45
|
+
/** Rescan workspace for patterns and violations */
|
|
46
|
+
RESCAN: 'drift.rescan',
|
|
47
|
+
/** Show all discovered patterns */
|
|
48
|
+
SHOW_PATTERNS: 'drift.showPatterns',
|
|
49
|
+
/** Show all current violations */
|
|
50
|
+
SHOW_VIOLATIONS: 'drift.showViolations',
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Array of all command IDs for registration
|
|
54
|
+
*/
|
|
55
|
+
export const ALL_COMMANDS = Object.values(DRIFT_COMMANDS);
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// Code Action Kinds
|
|
58
|
+
// ============================================================================
|
|
59
|
+
/**
|
|
60
|
+
* Supported code action kinds
|
|
61
|
+
*/
|
|
62
|
+
export const SUPPORTED_CODE_ACTION_KINDS = [
|
|
63
|
+
CodeActionKind.QuickFix,
|
|
64
|
+
CodeActionKind.Refactor,
|
|
65
|
+
CodeActionKind.Source,
|
|
66
|
+
];
|
|
67
|
+
// ============================================================================
|
|
68
|
+
// Server Capabilities Builder
|
|
69
|
+
// ============================================================================
|
|
70
|
+
/**
|
|
71
|
+
* Build the full server capabilities object
|
|
72
|
+
*
|
|
73
|
+
* This defines what the Drift LSP server can do, following the spec:
|
|
74
|
+
* - textDocumentSync: Document synchronization with incremental changes
|
|
75
|
+
* - diagnosticProvider: Publish diagnostics for violations
|
|
76
|
+
* - codeActionProvider: Quick fixes and refactoring actions
|
|
77
|
+
* - hoverProvider: Show violation details on hover
|
|
78
|
+
* - codeLensProvider: Inline pattern information
|
|
79
|
+
* - executeCommandProvider: All drift.* commands
|
|
80
|
+
* - workspace: Workspace folder support and file operations
|
|
81
|
+
*/
|
|
82
|
+
export function buildServerCapabilities() {
|
|
83
|
+
return {
|
|
84
|
+
// Document synchronization
|
|
85
|
+
// @requirements 27.2 - Support document synchronization (open, change, save, close)
|
|
86
|
+
textDocumentSync: {
|
|
87
|
+
openClose: true,
|
|
88
|
+
change: TextDocumentSyncKind.Incremental,
|
|
89
|
+
save: { includeText: true },
|
|
90
|
+
},
|
|
91
|
+
// Diagnostics (squiggly lines)
|
|
92
|
+
// @requirements 27.3 - Publish diagnostics for violations
|
|
93
|
+
diagnosticProvider: {
|
|
94
|
+
interFileDependencies: true,
|
|
95
|
+
workspaceDiagnostics: true,
|
|
96
|
+
},
|
|
97
|
+
// Code actions (quick fixes)
|
|
98
|
+
// @requirements 27.4 - Provide code actions for quick fixes
|
|
99
|
+
codeActionProvider: {
|
|
100
|
+
codeActionKinds: [...SUPPORTED_CODE_ACTION_KINDS],
|
|
101
|
+
resolveProvider: true,
|
|
102
|
+
},
|
|
103
|
+
// Hover information
|
|
104
|
+
// @requirements 27.5 - Provide hover information for violations
|
|
105
|
+
hoverProvider: true,
|
|
106
|
+
// Code lens (inline actions)
|
|
107
|
+
// @requirements 27.6 - Provide code lens for pattern information
|
|
108
|
+
codeLensProvider: {
|
|
109
|
+
resolveProvider: true,
|
|
110
|
+
},
|
|
111
|
+
// Commands
|
|
112
|
+
// @requirements 28.1-28.9 - All drift.* commands
|
|
113
|
+
executeCommandProvider: {
|
|
114
|
+
commands: [...ALL_COMMANDS],
|
|
115
|
+
},
|
|
116
|
+
// Workspace features
|
|
117
|
+
workspace: {
|
|
118
|
+
workspaceFolders: {
|
|
119
|
+
supported: true,
|
|
120
|
+
changeNotifications: true,
|
|
121
|
+
},
|
|
122
|
+
fileOperations: {
|
|
123
|
+
didCreate: { filters: [{ pattern: { glob: '**/*' } }] },
|
|
124
|
+
didRename: { filters: [{ pattern: { glob: '**/*' } }] },
|
|
125
|
+
didDelete: { filters: [{ pattern: { glob: '**/*' } }] },
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Build the initialize result to send to the client
|
|
132
|
+
*/
|
|
133
|
+
export function buildInitializeResult() {
|
|
134
|
+
return {
|
|
135
|
+
capabilities: buildServerCapabilities(),
|
|
136
|
+
serverInfo: { ...SERVER_INFO },
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
// ============================================================================
|
|
140
|
+
// Client Capability Helpers
|
|
141
|
+
// ============================================================================
|
|
142
|
+
/**
|
|
143
|
+
* Check if client supports a specific capability path
|
|
144
|
+
*/
|
|
145
|
+
export function clientSupportsCapability(clientCapabilities, path) {
|
|
146
|
+
if (!clientCapabilities) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
const parts = path.split('.');
|
|
150
|
+
let current = clientCapabilities;
|
|
151
|
+
for (const part of parts) {
|
|
152
|
+
if (current === null || current === undefined || typeof current !== 'object') {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
current = current[part];
|
|
156
|
+
}
|
|
157
|
+
return current === true || (typeof current === 'object' && current !== null);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Check if client supports workspace configuration
|
|
161
|
+
*/
|
|
162
|
+
export function clientSupportsConfiguration(clientCapabilities) {
|
|
163
|
+
return clientSupportsCapability(clientCapabilities, 'workspace.configuration');
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Check if client supports workspace folders
|
|
167
|
+
*/
|
|
168
|
+
export function clientSupportsWorkspaceFolders(clientCapabilities) {
|
|
169
|
+
return clientSupportsCapability(clientCapabilities, 'workspace.workspaceFolders');
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Check if client supports work done progress
|
|
173
|
+
*/
|
|
174
|
+
export function clientSupportsWorkDoneProgress(clientCapabilities) {
|
|
175
|
+
return clientSupportsCapability(clientCapabilities, 'window.workDoneProgress');
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Check if client supports diagnostic related information
|
|
179
|
+
*/
|
|
180
|
+
export function clientSupportsDiagnosticRelatedInfo(clientCapabilities) {
|
|
181
|
+
return clientSupportsCapability(clientCapabilities, 'textDocument.publishDiagnostics.relatedInformation');
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Show Patterns Command - drift.showPatterns
|
|
3
|
+
* @requirements 28.8
|
|
4
|
+
*/
|
|
5
|
+
import type { CommandResult } from '../handlers/commands.js';
|
|
6
|
+
import type { ServerContext } from '../server/types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Execute show patterns command
|
|
9
|
+
* Shows detected patterns in the workspace
|
|
10
|
+
*/
|
|
11
|
+
export declare function executeShowPatterns(context: ServerContext, patternId?: string): Promise<CommandResult>;
|
|
12
|
+
/**
|
|
13
|
+
* Get pattern statistics
|
|
14
|
+
*/
|
|
15
|
+
export declare function getPatternStatistics(patterns: Map<string, {
|
|
16
|
+
id: string;
|
|
17
|
+
category?: string;
|
|
18
|
+
}>, violations: Map<string, Array<{
|
|
19
|
+
patternId: string;
|
|
20
|
+
severity: string;
|
|
21
|
+
}>>): {
|
|
22
|
+
totalPatterns: number;
|
|
23
|
+
totalViolations: number;
|
|
24
|
+
byCategory: Record<string, {
|
|
25
|
+
patterns: number;
|
|
26
|
+
violations: number;
|
|
27
|
+
}>;
|
|
28
|
+
bySeverity: Record<string, number>;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=show-patterns.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"show-patterns.d.ts","sourceRoot":"","sources":["../../src/commands/show-patterns.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"show-patterns.d.ts","sourceRoot":"","sources":["../../src/commands/show-patterns.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,aAAa,EACtB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC,CA0ExB;AAyGD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EACxD,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,GACtE;IACD,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC,CAsCA"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Show Patterns Command - drift.showPatterns
|
|
3
|
+
* @requirements 28.8
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Execute show patterns command
|
|
7
|
+
* Shows detected patterns in the workspace
|
|
8
|
+
*/
|
|
9
|
+
export async function executeShowPatterns(context, patternId) {
|
|
10
|
+
const { state, logger, connection } = context;
|
|
11
|
+
logger.info(`Show patterns requested${patternId ? ` for: ${patternId}` : ''}`);
|
|
12
|
+
if (patternId) {
|
|
13
|
+
// Show specific pattern
|
|
14
|
+
const pattern = state.patterns.get(patternId);
|
|
15
|
+
if (!pattern) {
|
|
16
|
+
return {
|
|
17
|
+
success: false,
|
|
18
|
+
error: `Pattern not found: ${patternId}`,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
// Count violations for this pattern
|
|
22
|
+
let violationCount = 0;
|
|
23
|
+
const affectedFiles = [];
|
|
24
|
+
for (const [uri, violations] of state.violations) {
|
|
25
|
+
const patternViolations = violations.filter((v) => v.patternId === patternId);
|
|
26
|
+
if (patternViolations.length > 0) {
|
|
27
|
+
violationCount += patternViolations.length;
|
|
28
|
+
affectedFiles.push(uri);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Format pattern details
|
|
32
|
+
const details = formatPatternDetails(pattern, violationCount, affectedFiles);
|
|
33
|
+
// Show in message
|
|
34
|
+
connection.window.showInformationMessage(details);
|
|
35
|
+
return {
|
|
36
|
+
success: true,
|
|
37
|
+
message: `Pattern details for: ${patternId}`,
|
|
38
|
+
data: {
|
|
39
|
+
pattern,
|
|
40
|
+
violationCount,
|
|
41
|
+
affectedFiles,
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// Show all patterns
|
|
47
|
+
const patterns = Array.from(state.patterns.values());
|
|
48
|
+
if (patterns.length === 0) {
|
|
49
|
+
connection.window.showInformationMessage('No patterns detected in the workspace.');
|
|
50
|
+
return {
|
|
51
|
+
success: true,
|
|
52
|
+
message: 'No patterns detected',
|
|
53
|
+
data: { patterns: [] },
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
// Group patterns by category
|
|
57
|
+
const patternsByCategory = groupPatternsByCategory(patterns);
|
|
58
|
+
// Format summary
|
|
59
|
+
const summary = formatPatternsSummary(patternsByCategory, state.violations);
|
|
60
|
+
// Show summary
|
|
61
|
+
connection.window.showInformationMessage(summary);
|
|
62
|
+
return {
|
|
63
|
+
success: true,
|
|
64
|
+
message: `Found ${patterns.length} patterns`,
|
|
65
|
+
data: {
|
|
66
|
+
patterns,
|
|
67
|
+
patternsByCategory: Object.fromEntries(patternsByCategory),
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Format pattern details for display
|
|
74
|
+
*/
|
|
75
|
+
function formatPatternDetails(pattern, violationCount, affectedFiles) {
|
|
76
|
+
const lines = [];
|
|
77
|
+
lines.push(`📋 Pattern: ${pattern.name ?? pattern.id ?? 'Unknown'}`);
|
|
78
|
+
lines.push('');
|
|
79
|
+
if (pattern.category) {
|
|
80
|
+
lines.push(`Category: ${pattern.category}${pattern.subcategory ? ` > ${pattern.subcategory}` : ''}`);
|
|
81
|
+
}
|
|
82
|
+
if (pattern.description) {
|
|
83
|
+
lines.push(`Description: ${pattern.description}`);
|
|
84
|
+
}
|
|
85
|
+
if (pattern.confidence !== undefined) {
|
|
86
|
+
lines.push(`Confidence: ${Math.round(pattern.confidence * 100)}%`);
|
|
87
|
+
}
|
|
88
|
+
lines.push('');
|
|
89
|
+
lines.push(`Violations: ${violationCount}`);
|
|
90
|
+
lines.push(`Affected files: ${affectedFiles.length}`);
|
|
91
|
+
if (affectedFiles.length > 0 && affectedFiles.length <= 5) {
|
|
92
|
+
lines.push('');
|
|
93
|
+
lines.push('Files:');
|
|
94
|
+
for (const file of affectedFiles) {
|
|
95
|
+
const fileName = file.split('/').pop() ?? file;
|
|
96
|
+
lines.push(` - ${fileName}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return lines.join('\n');
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Group patterns by category
|
|
103
|
+
*/
|
|
104
|
+
function groupPatternsByCategory(patterns) {
|
|
105
|
+
const groups = new Map();
|
|
106
|
+
for (const pattern of patterns) {
|
|
107
|
+
const category = pattern.category ?? 'Uncategorized';
|
|
108
|
+
const group = groups.get(category) ?? [];
|
|
109
|
+
group.push(pattern);
|
|
110
|
+
groups.set(category, group);
|
|
111
|
+
}
|
|
112
|
+
return groups;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Format patterns summary for display
|
|
116
|
+
*/
|
|
117
|
+
function formatPatternsSummary(patternsByCategory, violations) {
|
|
118
|
+
const lines = [];
|
|
119
|
+
lines.push(`📊 Detected Patterns Summary`);
|
|
120
|
+
lines.push('');
|
|
121
|
+
let totalPatterns = 0;
|
|
122
|
+
let totalViolations = 0;
|
|
123
|
+
for (const [category, patterns] of patternsByCategory) {
|
|
124
|
+
totalPatterns += patterns.length;
|
|
125
|
+
// Count violations for this category
|
|
126
|
+
let categoryViolations = 0;
|
|
127
|
+
for (const pattern of patterns) {
|
|
128
|
+
for (const docViolations of violations.values()) {
|
|
129
|
+
categoryViolations += docViolations.filter((v) => v.patternId === pattern.id).length;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
totalViolations += categoryViolations;
|
|
133
|
+
lines.push(`${category}: ${patterns.length} pattern${patterns.length === 1 ? '' : 's'}, ${categoryViolations} violation${categoryViolations === 1 ? '' : 's'}`);
|
|
134
|
+
}
|
|
135
|
+
lines.push('');
|
|
136
|
+
lines.push(`Total: ${totalPatterns} patterns, ${totalViolations} violations`);
|
|
137
|
+
return lines.join('\n');
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get pattern statistics
|
|
141
|
+
*/
|
|
142
|
+
export function getPatternStatistics(patterns, violations) {
|
|
143
|
+
const byCategory = {};
|
|
144
|
+
const bySeverity = { error: 0, warning: 0, info: 0, hint: 0 };
|
|
145
|
+
let totalViolations = 0;
|
|
146
|
+
// Count patterns by category
|
|
147
|
+
for (const pattern of patterns.values()) {
|
|
148
|
+
const category = pattern.category ?? 'Uncategorized';
|
|
149
|
+
if (!byCategory[category]) {
|
|
150
|
+
byCategory[category] = { patterns: 0, violations: 0 };
|
|
151
|
+
}
|
|
152
|
+
byCategory[category].patterns++;
|
|
153
|
+
}
|
|
154
|
+
// Count violations
|
|
155
|
+
for (const docViolations of violations.values()) {
|
|
156
|
+
for (const violation of docViolations) {
|
|
157
|
+
totalViolations++;
|
|
158
|
+
// By severity
|
|
159
|
+
bySeverity[violation.severity] = (bySeverity[violation.severity] ?? 0) + 1;
|
|
160
|
+
// By category
|
|
161
|
+
const pattern = patterns.get(violation.patternId);
|
|
162
|
+
const category = pattern?.category ?? 'Uncategorized';
|
|
163
|
+
if (byCategory[category]) {
|
|
164
|
+
byCategory[category].violations++;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
totalPatterns: patterns.size,
|
|
170
|
+
totalViolations,
|
|
171
|
+
byCategory,
|
|
172
|
+
bySeverity,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=show-patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show-patterns.js","sourceRoot":"","sources":["../../src/commands/show-patterns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Actions Handler
|
|
3
|
+
*
|
|
4
|
+
* Provides code actions (quick fixes) for pattern violations.
|
|
5
|
+
* Supports quick fixes, refactoring actions, and source actions.
|
|
6
|
+
*
|
|
7
|
+
* @requirements 27.4 - THE LSP_Server SHALL provide code actions for quick fixes
|
|
8
|
+
*/
|
|
9
|
+
import type { DiagnosticsHandler } from './diagnostics.js';
|
|
10
|
+
import type { Connection, TextDocuments, CodeAction, CodeActionParams } from 'vscode-languageserver';
|
|
11
|
+
import type { TextDocument } from 'vscode-languageserver-textdocument';
|
|
12
|
+
interface Logger {
|
|
13
|
+
error(message: string): void;
|
|
14
|
+
warn(message: string): void;
|
|
15
|
+
info(message: string): void;
|
|
16
|
+
debug(message: string): void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Code actions handler interface
|
|
20
|
+
*/
|
|
21
|
+
export interface CodeActionsHandler {
|
|
22
|
+
/** Handle code action request */
|
|
23
|
+
onCodeAction(params: CodeActionParams): CodeAction[] | null;
|
|
24
|
+
/** Handle code action resolve request */
|
|
25
|
+
onCodeActionResolve(codeAction: CodeAction): CodeAction;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create the code actions handler
|
|
29
|
+
*/
|
|
30
|
+
export declare function createCodeActionsHandler(_connection: Connection, _documents: TextDocuments<TextDocument>, diagnosticsHandler: DiagnosticsHandler, logger: Logger): CodeActionsHandler;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=code-actions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-actions.d.ts","sourceRoot":"","sources":["../../src/handlers/code-actions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"code-actions.d.ts","sourceRoot":"","sources":["../../src/handlers/code-actions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,kBAAkB,EAAuB,MAAM,kBAAkB,CAAC;AAChF,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,UAAU,EACV,gBAAgB,EAEjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAOvE,UAAU,MAAM;IACd,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,iCAAiC;IACjC,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,EAAE,GAAG,IAAI,CAAC;IAC5D,yCAAyC;IACzC,mBAAmB,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,CAAC;CACzD;AAiCD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,UAAU,EACvB,UAAU,EAAE,aAAa,CAAC,YAAY,CAAC,EACvC,kBAAkB,EAAE,kBAAkB,EACtC,MAAM,EAAE,MAAM,GACb,kBAAkB,CAkLpB"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Actions Handler
|
|
3
|
+
*
|
|
4
|
+
* Provides code actions (quick fixes) for pattern violations.
|
|
5
|
+
* Supports quick fixes, refactoring actions, and source actions.
|
|
6
|
+
*
|
|
7
|
+
* @requirements 27.4 - THE LSP_Server SHALL provide code actions for quick fixes
|
|
8
|
+
*/
|
|
9
|
+
import { CodeActionKind } from 'vscode-languageserver';
|
|
10
|
+
import { DRIFT_COMMANDS } from '../capabilities.js';
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Helpers
|
|
13
|
+
// ============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Check if two ranges overlap
|
|
16
|
+
*/
|
|
17
|
+
function rangesOverlap(a, b) {
|
|
18
|
+
// a ends before b starts
|
|
19
|
+
if (a.end.line < b.start.line) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
if (a.end.line === b.start.line && a.end.character < b.start.character) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
// b ends before a starts
|
|
26
|
+
if (b.end.line < a.start.line) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
if (b.end.line === a.start.line && b.end.character < a.start.character) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
// ============================================================================
|
|
35
|
+
// Handler Factory
|
|
36
|
+
// ============================================================================
|
|
37
|
+
/**
|
|
38
|
+
* Create the code actions handler
|
|
39
|
+
*/
|
|
40
|
+
export function createCodeActionsHandler(_connection, _documents, diagnosticsHandler, logger) {
|
|
41
|
+
/**
|
|
42
|
+
* Create code actions for a diagnostic
|
|
43
|
+
*/
|
|
44
|
+
function createActionsForDiagnostic(diagnostic, uri) {
|
|
45
|
+
const actions = [];
|
|
46
|
+
const data = diagnostic.data;
|
|
47
|
+
if (!data) {
|
|
48
|
+
return actions;
|
|
49
|
+
}
|
|
50
|
+
const { violationId, patternId, hasQuickFix, aiExplainAvailable, aiFixAvailable } = data;
|
|
51
|
+
// Quick fix action (if available)
|
|
52
|
+
if (hasQuickFix) {
|
|
53
|
+
actions.push({
|
|
54
|
+
title: 'Fix this violation',
|
|
55
|
+
kind: CodeActionKind.QuickFix,
|
|
56
|
+
diagnostics: [diagnostic],
|
|
57
|
+
isPreferred: true,
|
|
58
|
+
// Edit will be resolved in onCodeActionResolve
|
|
59
|
+
data: {
|
|
60
|
+
type: 'quickfix',
|
|
61
|
+
violationId,
|
|
62
|
+
patternId,
|
|
63
|
+
uri,
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
// Approve pattern action
|
|
68
|
+
actions.push({
|
|
69
|
+
title: `Approve pattern: ${patternId}`,
|
|
70
|
+
kind: CodeActionKind.QuickFix,
|
|
71
|
+
diagnostics: [diagnostic],
|
|
72
|
+
command: {
|
|
73
|
+
title: 'Approve Pattern',
|
|
74
|
+
command: DRIFT_COMMANDS.APPROVE_PATTERN,
|
|
75
|
+
arguments: [patternId],
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
// Ignore pattern action
|
|
79
|
+
actions.push({
|
|
80
|
+
title: `Ignore pattern: ${patternId}`,
|
|
81
|
+
kind: CodeActionKind.QuickFix,
|
|
82
|
+
diagnostics: [diagnostic],
|
|
83
|
+
command: {
|
|
84
|
+
title: 'Ignore Pattern',
|
|
85
|
+
command: DRIFT_COMMANDS.IGNORE_PATTERN,
|
|
86
|
+
arguments: [patternId],
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
// Ignore this occurrence
|
|
90
|
+
actions.push({
|
|
91
|
+
title: 'Ignore this occurrence',
|
|
92
|
+
kind: CodeActionKind.QuickFix,
|
|
93
|
+
diagnostics: [diagnostic],
|
|
94
|
+
command: {
|
|
95
|
+
title: 'Ignore Once',
|
|
96
|
+
command: DRIFT_COMMANDS.IGNORE_ONCE,
|
|
97
|
+
arguments: [violationId, uri, diagnostic.range.start.line],
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
// Create variant action
|
|
101
|
+
actions.push({
|
|
102
|
+
title: `Create variant for: ${patternId}`,
|
|
103
|
+
kind: CodeActionKind.Refactor,
|
|
104
|
+
diagnostics: [diagnostic],
|
|
105
|
+
command: {
|
|
106
|
+
title: 'Create Variant',
|
|
107
|
+
command: DRIFT_COMMANDS.CREATE_VARIANT,
|
|
108
|
+
arguments: [patternId, violationId],
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
// AI explain action (if available)
|
|
112
|
+
if (aiExplainAvailable) {
|
|
113
|
+
actions.push({
|
|
114
|
+
title: 'Explain with AI',
|
|
115
|
+
kind: CodeActionKind.QuickFix,
|
|
116
|
+
diagnostics: [diagnostic],
|
|
117
|
+
command: {
|
|
118
|
+
title: 'Explain with AI',
|
|
119
|
+
command: DRIFT_COMMANDS.EXPLAIN_AI,
|
|
120
|
+
arguments: [violationId, patternId],
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
// AI fix action (if available)
|
|
125
|
+
if (aiFixAvailable) {
|
|
126
|
+
actions.push({
|
|
127
|
+
title: 'Fix with AI',
|
|
128
|
+
kind: CodeActionKind.QuickFix,
|
|
129
|
+
diagnostics: [diagnostic],
|
|
130
|
+
command: {
|
|
131
|
+
title: 'Fix with AI',
|
|
132
|
+
command: DRIFT_COMMANDS.FIX_AI,
|
|
133
|
+
arguments: [violationId, uri],
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
return actions;
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
onCodeAction(params) {
|
|
141
|
+
const uri = params.textDocument.uri;
|
|
142
|
+
const requestRange = params.range;
|
|
143
|
+
logger.debug(`Code action request for ${uri} at ${requestRange.start.line}:${requestRange.start.character}`);
|
|
144
|
+
// Get diagnostics for this document
|
|
145
|
+
const diagnostics = diagnosticsHandler.getDiagnostics(uri);
|
|
146
|
+
if (diagnostics.length === 0) {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
// Find diagnostics that overlap with the request range
|
|
150
|
+
const relevantDiagnostics = diagnostics.filter((d) => rangesOverlap(d.range, requestRange));
|
|
151
|
+
if (relevantDiagnostics.length === 0) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
// Generate code actions for each relevant diagnostic
|
|
155
|
+
const actions = [];
|
|
156
|
+
for (const diagnostic of relevantDiagnostics) {
|
|
157
|
+
const diagnosticActions = createActionsForDiagnostic(diagnostic, uri);
|
|
158
|
+
actions.push(...diagnosticActions);
|
|
159
|
+
}
|
|
160
|
+
logger.debug(`Generated ${actions.length} code actions`);
|
|
161
|
+
return actions;
|
|
162
|
+
},
|
|
163
|
+
onCodeActionResolve(codeAction) {
|
|
164
|
+
logger.debug(`Resolving code action: ${codeAction.title}`);
|
|
165
|
+
// If the code action has data, resolve the edit
|
|
166
|
+
if (codeAction.data) {
|
|
167
|
+
const data = codeAction.data;
|
|
168
|
+
if (data.type === 'quickfix') {
|
|
169
|
+
// TODO: Get the actual quick fix from the violation
|
|
170
|
+
// and populate the edit field
|
|
171
|
+
const violations = diagnosticsHandler.getViolations(data.uri);
|
|
172
|
+
const violation = violations.find((v) => v.id === data.violationId);
|
|
173
|
+
if (violation?.quickFix) {
|
|
174
|
+
codeAction.edit = {
|
|
175
|
+
changes: violation.quickFix.edit.changes,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return codeAction;
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=code-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-actions.js","sourceRoot":"","sources":["../../src/handlers/code-actions.ts"],"names":[],"mappings":"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"}
|