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.
Files changed (60) hide show
  1. package/dist/capabilities.d.ts.map +1 -0
  2. package/dist/capabilities.js +183 -0
  3. package/dist/capabilities.js.map +1 -0
  4. package/dist/commands/show-patterns.d.ts +30 -0
  5. package/dist/commands/show-patterns.d.ts.map +1 -1
  6. package/dist/commands/show-patterns.js +175 -0
  7. package/dist/commands/show-patterns.js.map +1 -0
  8. package/dist/handlers/code-actions.d.ts +32 -0
  9. package/dist/handlers/code-actions.d.ts.map +1 -1
  10. package/dist/handlers/code-actions.js +184 -0
  11. package/dist/handlers/code-actions.js.map +1 -0
  12. package/dist/handlers/code-lens.d.ts +32 -0
  13. package/dist/handlers/code-lens.d.ts.map +1 -1
  14. package/dist/handlers/code-lens.js +162 -0
  15. package/dist/handlers/code-lens.js.map +1 -0
  16. package/dist/handlers/commands.d.ts +48 -0
  17. package/dist/handlers/commands.d.ts.map +1 -1
  18. package/dist/handlers/commands.js +360 -0
  19. package/dist/handlers/commands.js.map +1 -0
  20. package/dist/handlers/diagnostics.d.ts +73 -0
  21. package/dist/handlers/diagnostics.d.ts.map +1 -1
  22. package/dist/handlers/diagnostics.js +259 -0
  23. package/dist/handlers/diagnostics.js.map +1 -0
  24. package/dist/handlers/document-sync.d.ts +37 -0
  25. package/dist/handlers/document-sync.d.ts.map +1 -1
  26. package/dist/handlers/document-sync.js +49 -0
  27. package/dist/handlers/document-sync.js.map +1 -0
  28. package/dist/handlers/hover.d.ts +30 -0
  29. package/dist/handlers/hover.d.ts.map +1 -1
  30. package/dist/handlers/hover.js +119 -0
  31. package/dist/handlers/hover.js.map +1 -0
  32. package/dist/integration/core-scanner.d.ts.map +1 -1
  33. package/dist/integration/core-scanner.js +309 -0
  34. package/dist/integration/core-scanner.js.map +1 -0
  35. package/dist/integration/pattern-store-adapter.d.ts +117 -0
  36. package/dist/integration/pattern-store-adapter.d.ts.map +1 -1
  37. package/dist/integration/pattern-store-adapter.js +349 -0
  38. package/dist/integration/pattern-store-adapter.js.map +1 -0
  39. package/dist/integration/types.d.ts +134 -0
  40. package/dist/integration/types.d.ts.map +1 -1
  41. package/dist/integration/types.js +39 -0
  42. package/dist/integration/types.js.map +1 -0
  43. package/dist/server/types.d.ts +139 -0
  44. package/dist/server/types.d.ts.map +1 -1
  45. package/dist/server/types.js +8 -0
  46. package/dist/server/types.js.map +1 -0
  47. package/dist/server.d.ts.map +1 -1
  48. package/dist/server.js +208 -0
  49. package/dist/server.js.map +1 -0
  50. package/dist/utils/diagnostic.js +263 -0
  51. package/dist/utils/diagnostic.js.map +1 -0
  52. package/dist/utils/document.d.ts +40 -0
  53. package/dist/utils/document.d.ts.map +1 -0
  54. package/dist/utils/document.js +138 -0
  55. package/dist/utils/document.js.map +1 -0
  56. package/dist/utils/index.d.ts.map +1 -0
  57. package/dist/utils/workspace.d.ts.map +1 -1
  58. package/dist/utils/workspace.js +241 -0
  59. package/dist/utils/workspace.js.map +1 -0
  60. 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":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,oBAAoB,EACpB,cAAc,GACf,MAAM,uBAAuB,CAAC;AAI/B,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,OAAO;CACR,CAAC;AAEX,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,wCAAwC;IACxC,eAAe,EAAE,sBAAsB;IACvC,uCAAuC;IACvC,cAAc,EAAE,qBAAqB;IACrC,gDAAgD;IAChD,WAAW,EAAE,kBAAkB;IAC/B,+CAA+C;IAC/C,cAAc,EAAE,qBAAqB;IACrC,6CAA6C;IAC7C,UAAU,EAAE,qBAAqB;IACjC,+CAA+C;IAC/C,MAAM,EAAE,iBAAiB;IACzB,mDAAmD;IACnD,MAAM,EAAE,cAAc;IACtB,mCAAmC;IACnC,aAAa,EAAE,oBAAoB;IACnC,kCAAkC;IAClC,eAAe,EAAE,sBAAsB;CAC/B,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAsB,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AAE7E,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,cAAc,CAAC,QAAQ;IACvB,cAAc,CAAC,QAAQ;IACvB,cAAc,CAAC,MAAM;CACb,CAAC;AAEX,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,2BAA2B;QAC3B,oFAAoF;QACpF,gBAAgB,EAAE;YAChB,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,oBAAoB,CAAC,WAAW;YACxC,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;SAC5B;QAED,+BAA+B;QAC/B,0DAA0D;QAC1D,kBAAkB,EAAE;YAClB,qBAAqB,EAAE,IAAI;YAC3B,oBAAoB,EAAE,IAAI;SAC3B;QAED,6BAA6B;QAC7B,4DAA4D;QAC5D,kBAAkB,EAAE;YAClB,eAAe,EAAE,CAAC,GAAG,2BAA2B,CAAC;YACjD,eAAe,EAAE,IAAI;SACtB;QAED,oBAAoB;QACpB,gEAAgE;QAChE,aAAa,EAAE,IAAI;QAEnB,6BAA6B;QAC7B,iEAAiE;QACjE,gBAAgB,EAAE;YAChB,eAAe,EAAE,IAAI;SACtB;QAED,WAAW;QACX,iDAAiD;QACjD,sBAAsB,EAAE;YACtB,QAAQ,EAAE,CAAC,GAAG,YAAY,CAAC;SAC5B;QAED,qBAAqB;QACrB,SAAS,EAAE;YACT,gBAAgB,EAAE;gBAChB,SAAS,EAAE,IAAI;gBACf,mBAAmB,EAAE,IAAI;aAC1B;YACD,cAAc,EAAE;gBACd,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE;gBACvD,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE;gBACvD,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE;aACxD;SACF;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,YAAY,EAAE,uBAAuB,EAAE;QACvC,UAAU,EAAE,EAAE,GAAG,WAAW,EAAE;KAC/B,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,4BAA4B;AAC5B,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,kBAAuD,EACvD,IAAY;IAEZ,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,OAAO,GAAY,kBAAkB,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC7E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,GAAI,OAAmC,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,OAAO,KAAK,IAAI,IAAI,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC;AAC/E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CACzC,kBAAuD;IAEvD,OAAO,wBAAwB,CAAC,kBAAkB,EAAE,yBAAyB,CAAC,CAAC;AACjF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAC5C,kBAAuD;IAEvD,OAAO,wBAAwB,CAAC,kBAAkB,EAAE,4BAA4B,CAAC,CAAC;AACpF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAC5C,kBAAuD;IAEvD,OAAO,wBAAwB,CAAC,kBAAkB,EAAE,yBAAyB,CAAC,CAAC;AACjF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mCAAmC,CACjD,kBAAuD;IAEvD,OAAO,wBAAwB,CAC7B,kBAAkB,EAClB,oDAAoD,CACrD,CAAC;AACJ,CAAC"}
@@ -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,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D;;;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"}
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;AAEH,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,UAAU,EACV,gBAAgB,EAEjB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAuB,MAAM,kBAAkB,CAAC;AAOhF,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"}
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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"}