driftdetect-mcp 0.3.0 → 0.4.2

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 (140) hide show
  1. package/dist/bin/server.d.ts +12 -2
  2. package/dist/bin/server.d.ts.map +1 -1
  3. package/dist/bin/server.js +25 -5
  4. package/dist/bin/server.js.map +1 -1
  5. package/dist/enterprise-server.d.ts +78 -0
  6. package/dist/enterprise-server.d.ts.map +1 -0
  7. package/dist/enterprise-server.js +201 -0
  8. package/dist/enterprise-server.js.map +1 -0
  9. package/dist/index.d.ts +15 -2
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +17 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/infrastructure/cache.d.ts +86 -0
  14. package/dist/infrastructure/cache.d.ts.map +1 -0
  15. package/dist/infrastructure/cache.js +271 -0
  16. package/dist/infrastructure/cache.js.map +1 -0
  17. package/dist/infrastructure/cursor-manager.d.ts +86 -0
  18. package/dist/infrastructure/cursor-manager.d.ts.map +1 -0
  19. package/dist/infrastructure/cursor-manager.js +175 -0
  20. package/dist/infrastructure/cursor-manager.js.map +1 -0
  21. package/dist/infrastructure/error-handler.d.ts +82 -0
  22. package/dist/infrastructure/error-handler.d.ts.map +1 -0
  23. package/dist/infrastructure/error-handler.js +226 -0
  24. package/dist/infrastructure/error-handler.js.map +1 -0
  25. package/dist/infrastructure/index.d.ts +19 -0
  26. package/dist/infrastructure/index.d.ts.map +1 -0
  27. package/dist/infrastructure/index.js +26 -0
  28. package/dist/infrastructure/index.js.map +1 -0
  29. package/dist/infrastructure/metrics.d.ts +104 -0
  30. package/dist/infrastructure/metrics.d.ts.map +1 -0
  31. package/dist/infrastructure/metrics.js +291 -0
  32. package/dist/infrastructure/metrics.js.map +1 -0
  33. package/dist/infrastructure/rate-limiter.d.ts +59 -0
  34. package/dist/infrastructure/rate-limiter.d.ts.map +1 -0
  35. package/dist/infrastructure/rate-limiter.js +132 -0
  36. package/dist/infrastructure/rate-limiter.js.map +1 -0
  37. package/dist/infrastructure/response-builder.d.ts +104 -0
  38. package/dist/infrastructure/response-builder.d.ts.map +1 -0
  39. package/dist/infrastructure/response-builder.js +207 -0
  40. package/dist/infrastructure/response-builder.js.map +1 -0
  41. package/dist/infrastructure/token-estimator.d.ts +48 -0
  42. package/dist/infrastructure/token-estimator.d.ts.map +1 -0
  43. package/dist/infrastructure/token-estimator.js +131 -0
  44. package/dist/infrastructure/token-estimator.js.map +1 -0
  45. package/dist/server.d.ts.map +1 -1
  46. package/dist/server.js +1136 -18
  47. package/dist/server.js.map +1 -1
  48. package/dist/tools/detail/code-examples.d.ts +33 -0
  49. package/dist/tools/detail/code-examples.d.ts.map +1 -0
  50. package/dist/tools/detail/code-examples.js +126 -0
  51. package/dist/tools/detail/code-examples.js.map +1 -0
  52. package/dist/tools/detail/dna-check.d.ts +32 -0
  53. package/dist/tools/detail/dna-check.d.ts.map +1 -0
  54. package/dist/tools/detail/dna-check.js +231 -0
  55. package/dist/tools/detail/dna-check.js.map +1 -0
  56. package/dist/tools/detail/dna-profile.d.ts +37 -0
  57. package/dist/tools/detail/dna-profile.d.ts.map +1 -0
  58. package/dist/tools/detail/dna-profile.js +101 -0
  59. package/dist/tools/detail/dna-profile.js.map +1 -0
  60. package/dist/tools/detail/file-patterns.d.ts +39 -0
  61. package/dist/tools/detail/file-patterns.d.ts.map +1 -0
  62. package/dist/tools/detail/file-patterns.js +103 -0
  63. package/dist/tools/detail/file-patterns.js.map +1 -0
  64. package/dist/tools/detail/files-list.d.ts +30 -0
  65. package/dist/tools/detail/files-list.d.ts.map +1 -0
  66. package/dist/tools/detail/files-list.js +99 -0
  67. package/dist/tools/detail/files-list.js.map +1 -0
  68. package/dist/tools/detail/impact-analysis.d.ts +53 -0
  69. package/dist/tools/detail/impact-analysis.d.ts.map +1 -0
  70. package/dist/tools/detail/impact-analysis.js +130 -0
  71. package/dist/tools/detail/impact-analysis.js.map +1 -0
  72. package/dist/tools/detail/index.d.ts +23 -0
  73. package/dist/tools/detail/index.d.ts.map +1 -0
  74. package/dist/tools/detail/index.js +200 -0
  75. package/dist/tools/detail/index.js.map +1 -0
  76. package/dist/tools/detail/pattern-get.d.ts +45 -0
  77. package/dist/tools/detail/pattern-get.d.ts.map +1 -0
  78. package/dist/tools/detail/pattern-get.js +87 -0
  79. package/dist/tools/detail/pattern-get.js.map +1 -0
  80. package/dist/tools/detail/reachability.d.ts +60 -0
  81. package/dist/tools/detail/reachability.d.ts.map +1 -0
  82. package/dist/tools/detail/reachability.js +168 -0
  83. package/dist/tools/detail/reachability.js.map +1 -0
  84. package/dist/tools/discovery/capabilities.d.ts +28 -0
  85. package/dist/tools/discovery/capabilities.d.ts.map +1 -0
  86. package/dist/tools/discovery/capabilities.js +112 -0
  87. package/dist/tools/discovery/capabilities.js.map +1 -0
  88. package/dist/tools/discovery/index.d.ts +13 -0
  89. package/dist/tools/discovery/index.d.ts.map +1 -0
  90. package/dist/tools/discovery/index.js +30 -0
  91. package/dist/tools/discovery/index.js.map +1 -0
  92. package/dist/tools/discovery/projects.d.ts +26 -0
  93. package/dist/tools/discovery/projects.d.ts.map +1 -0
  94. package/dist/tools/discovery/projects.js +210 -0
  95. package/dist/tools/discovery/projects.js.map +1 -0
  96. package/dist/tools/discovery/status.d.ts +42 -0
  97. package/dist/tools/discovery/status.d.ts.map +1 -0
  98. package/dist/tools/discovery/status.js +157 -0
  99. package/dist/tools/discovery/status.js.map +1 -0
  100. package/dist/tools/exploration/contracts-list.d.ts +35 -0
  101. package/dist/tools/exploration/contracts-list.d.ts.map +1 -0
  102. package/dist/tools/exploration/contracts-list.js +106 -0
  103. package/dist/tools/exploration/contracts-list.js.map +1 -0
  104. package/dist/tools/exploration/files-list.d.ts +29 -0
  105. package/dist/tools/exploration/files-list.d.ts.map +1 -0
  106. package/dist/tools/exploration/files-list.js +94 -0
  107. package/dist/tools/exploration/files-list.js.map +1 -0
  108. package/dist/tools/exploration/index.d.ts +17 -0
  109. package/dist/tools/exploration/index.d.ts.map +1 -0
  110. package/dist/tools/exploration/index.js +126 -0
  111. package/dist/tools/exploration/index.js.map +1 -0
  112. package/dist/tools/exploration/patterns-list.d.ts +40 -0
  113. package/dist/tools/exploration/patterns-list.d.ts.map +1 -0
  114. package/dist/tools/exploration/patterns-list.js +172 -0
  115. package/dist/tools/exploration/patterns-list.js.map +1 -0
  116. package/dist/tools/exploration/security-summary.d.ts +49 -0
  117. package/dist/tools/exploration/security-summary.d.ts.map +1 -0
  118. package/dist/tools/exploration/security-summary.js +111 -0
  119. package/dist/tools/exploration/security-summary.js.map +1 -0
  120. package/dist/tools/exploration/trends.d.ts +49 -0
  121. package/dist/tools/exploration/trends.d.ts.map +1 -0
  122. package/dist/tools/exploration/trends.js +147 -0
  123. package/dist/tools/exploration/trends.js.map +1 -0
  124. package/dist/tools/index.d.ts +13 -0
  125. package/dist/tools/index.d.ts.map +1 -0
  126. package/dist/tools/index.js +13 -0
  127. package/dist/tools/index.js.map +1 -0
  128. package/dist/tools/orchestration/context.d.ts +72 -0
  129. package/dist/tools/orchestration/context.d.ts.map +1 -0
  130. package/dist/tools/orchestration/context.js +499 -0
  131. package/dist/tools/orchestration/context.js.map +1 -0
  132. package/dist/tools/orchestration/index.d.ts +11 -0
  133. package/dist/tools/orchestration/index.d.ts.map +1 -0
  134. package/dist/tools/orchestration/index.js +56 -0
  135. package/dist/tools/orchestration/index.js.map +1 -0
  136. package/dist/tools/registry.d.ts +41 -0
  137. package/dist/tools/registry.d.ts.map +1 -0
  138. package/dist/tools/registry.js +64 -0
  139. package/dist/tools/registry.js.map +1 -0
  140. package/package.json +3 -3
@@ -0,0 +1,94 @@
1
+ /**
2
+ * drift_files_list - File Listing
3
+ *
4
+ * Exploration tool that lists files with pattern counts.
5
+ * Helps find files relevant to a task.
6
+ */
7
+ import { createResponseBuilder, cursorManager, Errors, } from '../../infrastructure/index.js';
8
+ import { minimatch } from 'minimatch';
9
+ const DEFAULT_LIMIT = 30;
10
+ const MAX_LIMIT = 100;
11
+ export async function handleFilesList(store, args) {
12
+ const builder = createResponseBuilder();
13
+ await store.load();
14
+ // Parse cursor if provided
15
+ let startOffset = 0;
16
+ if (args.cursor) {
17
+ const cursorData = cursorManager.decode(args.cursor);
18
+ if (!cursorData) {
19
+ throw Errors.invalidCursor();
20
+ }
21
+ startOffset = cursorData.offset ?? 0;
22
+ }
23
+ // Get all files from manifest
24
+ const allFiles = store.getAllFiles();
25
+ // Build file summaries
26
+ let fileSummaries = [];
27
+ for (const file of allFiles) {
28
+ const fileData = store.queryFile({ path: file });
29
+ if (!fileData || !('patterns' in fileData))
30
+ continue;
31
+ const patterns = fileData.patterns;
32
+ // Filter by path glob
33
+ if (args.path && !minimatch(file, args.path)) {
34
+ continue;
35
+ }
36
+ // Filter by category
37
+ let filteredPatterns = patterns;
38
+ if (args.category) {
39
+ filteredPatterns = patterns.filter(p => p.category === args.category);
40
+ }
41
+ // Filter by minimum patterns
42
+ const minPatterns = args.minPatterns ?? 1;
43
+ if (filteredPatterns.length < minPatterns) {
44
+ continue;
45
+ }
46
+ const categories = [...new Set(filteredPatterns.map(p => p.category))];
47
+ const hasOutliers = filteredPatterns.some(p => (p.outliers?.length ?? 0) > 0);
48
+ fileSummaries.push({
49
+ file,
50
+ patternCount: filteredPatterns.length,
51
+ categories,
52
+ hasOutliers,
53
+ });
54
+ }
55
+ // Sort by pattern count (most patterns first)
56
+ fileSummaries.sort((a, b) => b.patternCount - a.patternCount);
57
+ const totalCount = fileSummaries.length;
58
+ const limit = Math.min(args.limit ?? DEFAULT_LIMIT, MAX_LIMIT);
59
+ // Apply pagination
60
+ fileSummaries = fileSummaries.slice(startOffset, startOffset + limit);
61
+ // Build pagination info
62
+ const hasMore = startOffset + limit < totalCount;
63
+ const pagination = {
64
+ hasMore,
65
+ totalCount,
66
+ pageSize: limit,
67
+ cursor: hasMore
68
+ ? cursorManager.createOffsetCursor(startOffset + limit, args)
69
+ : undefined,
70
+ };
71
+ // Build summary
72
+ let summary = `Found ${totalCount} files with patterns`;
73
+ if (args.path) {
74
+ summary += ` matching "${args.path}"`;
75
+ }
76
+ if (args.category) {
77
+ summary += ` in ${args.category}`;
78
+ }
79
+ summary += `. Showing ${fileSummaries.length}.`;
80
+ return builder
81
+ .withSummary(summary)
82
+ .withData({ files: fileSummaries })
83
+ .withPagination(pagination)
84
+ .withHints({
85
+ nextActions: fileSummaries.length > 0
86
+ ? [
87
+ `Use drift_file_patterns with path="${fileSummaries[0]?.file}" for full details`,
88
+ ]
89
+ : ['Try a different path pattern or category filter'],
90
+ relatedTools: ['drift_file_patterns', 'drift_patterns_list'],
91
+ })
92
+ .buildContent();
93
+ }
94
+ //# sourceMappingURL=files-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files-list.js","sourceRoot":"","sources":["../../../src/tools/exploration/files-list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Exploration Tools
3
+ *
4
+ * Layer 2: Paginated listing tools for exploring patterns, files, and analysis.
5
+ * These return summaries with IDs for use with detail tools.
6
+ */
7
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
8
+ export declare const EXPLORATION_TOOLS: Tool[];
9
+ export { handlePatternsList } from './patterns-list.js';
10
+ export { handleSecuritySummary } from './security-summary.js';
11
+ export { handleContractsList } from './contracts-list.js';
12
+ export { handleTrends } from './trends.js';
13
+ export type { PatternSummary, PatternsListData } from './patterns-list.js';
14
+ export type { SecuritySummaryData } from './security-summary.js';
15
+ export type { ContractSummary, ContractsListData } from './contracts-list.js';
16
+ export type { TrendItem, TrendsData } from './trends.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/exploration/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAS/D,eAAO,MAAM,iBAAiB,EAAE,IAAI,EA2GnC,CAAC;AAGF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Exploration Tools
3
+ *
4
+ * Layer 2: Paginated listing tools for exploring patterns, files, and analysis.
5
+ * These return summaries with IDs for use with detail tools.
6
+ */
7
+ const PATTERN_CATEGORIES = [
8
+ 'api', 'auth', 'security', 'errors', 'logging',
9
+ 'data-access', 'config', 'testing', 'performance',
10
+ 'components', 'styling', 'structural', 'types',
11
+ 'accessibility', 'documentation',
12
+ ];
13
+ export const EXPLORATION_TOOLS = [
14
+ {
15
+ name: 'drift_patterns_list',
16
+ description: 'List patterns with summaries. Returns pattern IDs for use with drift_pattern_get. Supports filtering by category, status, and confidence.',
17
+ inputSchema: {
18
+ type: 'object',
19
+ properties: {
20
+ categories: {
21
+ type: 'array',
22
+ items: { type: 'string' },
23
+ description: `Filter by categories: ${PATTERN_CATEGORIES.join(', ')}`,
24
+ },
25
+ status: {
26
+ type: 'string',
27
+ enum: ['all', 'approved', 'discovered', 'ignored'],
28
+ description: 'Filter by approval status (default: all)',
29
+ },
30
+ minConfidence: {
31
+ type: 'number',
32
+ description: 'Minimum confidence 0.0-1.0 (default: 0)',
33
+ },
34
+ search: {
35
+ type: 'string',
36
+ description: 'Search pattern names and descriptions',
37
+ },
38
+ limit: {
39
+ type: 'number',
40
+ description: 'Max patterns to return (default: 20, max: 50)',
41
+ },
42
+ cursor: {
43
+ type: 'string',
44
+ description: 'Pagination cursor from previous response',
45
+ },
46
+ },
47
+ required: [],
48
+ },
49
+ },
50
+ {
51
+ name: 'drift_security_summary',
52
+ description: 'Get security posture overview. Shows sensitive data access patterns, security issues, and data flow summary. Use before working on security-sensitive code.',
53
+ inputSchema: {
54
+ type: 'object',
55
+ properties: {
56
+ focus: {
57
+ type: 'string',
58
+ enum: ['all', 'critical', 'data-access', 'auth'],
59
+ description: 'Focus area (default: all)',
60
+ },
61
+ limit: {
62
+ type: 'number',
63
+ description: 'Max items per section (default: 10)',
64
+ },
65
+ },
66
+ required: [],
67
+ },
68
+ },
69
+ {
70
+ name: 'drift_contracts_list',
71
+ description: 'List API contracts between frontend and backend. Shows verified contracts, mismatches, and discovered endpoints.',
72
+ inputSchema: {
73
+ type: 'object',
74
+ properties: {
75
+ status: {
76
+ type: 'string',
77
+ enum: ['all', 'verified', 'mismatch', 'discovered'],
78
+ description: 'Filter by contract status (default: all)',
79
+ },
80
+ limit: {
81
+ type: 'number',
82
+ description: 'Max contracts to return (default: 20)',
83
+ },
84
+ cursor: {
85
+ type: 'string',
86
+ description: 'Pagination cursor',
87
+ },
88
+ },
89
+ required: [],
90
+ },
91
+ },
92
+ {
93
+ name: 'drift_trends',
94
+ description: 'Get pattern trend analysis. Shows how patterns have changed over time, regressions, and improvements.',
95
+ inputSchema: {
96
+ type: 'object',
97
+ properties: {
98
+ period: {
99
+ type: 'string',
100
+ enum: ['7d', '30d', '90d'],
101
+ description: 'Time period to analyze (default: 7d)',
102
+ },
103
+ category: {
104
+ type: 'string',
105
+ description: 'Filter trends by category',
106
+ },
107
+ severity: {
108
+ type: 'string',
109
+ enum: ['all', 'critical', 'warning'],
110
+ description: 'Filter by severity (default: all)',
111
+ },
112
+ limit: {
113
+ type: 'number',
114
+ description: 'Max trends to return (default: 20)',
115
+ },
116
+ },
117
+ required: [],
118
+ },
119
+ },
120
+ ];
121
+ // Handler exports
122
+ export { handlePatternsList } from './patterns-list.js';
123
+ export { handleSecuritySummary } from './security-summary.js';
124
+ export { handleContractsList } from './contracts-list.js';
125
+ export { handleTrends } from './trends.js';
126
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/exploration/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * drift_patterns_list - Pattern Listing
3
+ *
4
+ * Exploration tool that lists patterns with summaries.
5
+ * Returns pattern IDs for use with drift_pattern_get.
6
+ *
7
+ * OPTIMIZED: Uses data lake pattern shards for category-specific queries,
8
+ * and pattern index view for full listings.
9
+ */
10
+ import type { PatternStore, DataLake } from 'driftdetect-core';
11
+ export interface PatternSummary {
12
+ id: string;
13
+ name: string;
14
+ category: string;
15
+ subcategory: string;
16
+ confidence: number;
17
+ confidenceLevel: string;
18
+ status: string;
19
+ locationCount: number;
20
+ outlierCount: number;
21
+ }
22
+ export interface PatternsListData {
23
+ patterns: PatternSummary[];
24
+ /** Response source for debugging */
25
+ _source?: 'lake' | 'store';
26
+ }
27
+ export declare function handlePatternsList(store: PatternStore, args: {
28
+ categories?: string[];
29
+ status?: string;
30
+ minConfidence?: number;
31
+ search?: string;
32
+ limit?: number;
33
+ cursor?: string;
34
+ }, dataLake?: DataLake): Promise<{
35
+ content: Array<{
36
+ type: string;
37
+ text: string;
38
+ }>;
39
+ }>;
40
+ //# sourceMappingURL=patterns-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns-list.d.ts","sourceRoot":"","sources":["../../../src/tools/exploration/patterns-list.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAmB,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAQhF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5B;AAYD,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE;IACJ,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,EACD,QAAQ,CAAC,EAAE,QAAQ,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAoF7D"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * drift_patterns_list - Pattern Listing
3
+ *
4
+ * Exploration tool that lists patterns with summaries.
5
+ * Returns pattern IDs for use with drift_pattern_get.
6
+ *
7
+ * OPTIMIZED: Uses data lake pattern shards for category-specific queries,
8
+ * and pattern index view for full listings.
9
+ */
10
+ import { createResponseBuilder, cursorManager, Errors, } from '../../infrastructure/index.js';
11
+ const VALID_CATEGORIES = [
12
+ 'api', 'auth', 'security', 'errors', 'logging',
13
+ 'data-access', 'config', 'testing', 'performance',
14
+ 'components', 'styling', 'structural', 'types',
15
+ 'accessibility', 'documentation',
16
+ ];
17
+ const DEFAULT_LIMIT = 20;
18
+ const MAX_LIMIT = 50;
19
+ export async function handlePatternsList(store, args, dataLake) {
20
+ const builder = createResponseBuilder();
21
+ // Validate categories
22
+ if (args.categories) {
23
+ for (const cat of args.categories) {
24
+ if (!VALID_CATEGORIES.includes(cat)) {
25
+ throw Errors.invalidCategory(cat, VALID_CATEGORIES);
26
+ }
27
+ }
28
+ }
29
+ // Parse cursor if provided
30
+ let startOffset = 0;
31
+ if (args.cursor) {
32
+ const cursorData = cursorManager.decode(args.cursor);
33
+ if (!cursorData) {
34
+ throw Errors.invalidCursor();
35
+ }
36
+ startOffset = cursorData.offset ?? 0;
37
+ }
38
+ const limit = Math.min(args.limit ?? DEFAULT_LIMIT, MAX_LIMIT);
39
+ // OPTIMIZATION: Try data lake first
40
+ if (dataLake) {
41
+ const lakeResult = await tryGetPatternsFromLake(dataLake, args, startOffset, limit);
42
+ if (lakeResult) {
43
+ return buildResponse(builder, lakeResult, args, startOffset, limit, 'lake');
44
+ }
45
+ }
46
+ // Fallback: Use pattern store directly
47
+ await store.initialize();
48
+ let patterns = store.getAll();
49
+ // Filter by categories
50
+ if (args.categories && args.categories.length > 0) {
51
+ const cats = new Set(args.categories);
52
+ patterns = patterns.filter(p => cats.has(p.category));
53
+ }
54
+ // Filter by status
55
+ if (args.status && args.status !== 'all') {
56
+ patterns = patterns.filter(p => p.status === args.status);
57
+ }
58
+ // Filter by confidence
59
+ if (args.minConfidence !== undefined) {
60
+ patterns = patterns.filter(p => p.confidence.score >= args.minConfidence);
61
+ }
62
+ // Filter by search
63
+ if (args.search) {
64
+ const searchLower = args.search.toLowerCase();
65
+ patterns = patterns.filter(p => p.name.toLowerCase().includes(searchLower) ||
66
+ p.description.toLowerCase().includes(searchLower) ||
67
+ p.subcategory.toLowerCase().includes(searchLower));
68
+ }
69
+ // Sort by confidence (highest first)
70
+ patterns.sort((a, b) => b.confidence.score - a.confidence.score);
71
+ const totalCount = patterns.length;
72
+ // Apply pagination
73
+ const paginatedPatterns = patterns.slice(startOffset, startOffset + limit);
74
+ // Map to summaries
75
+ const summaries = paginatedPatterns.map(p => ({
76
+ id: p.id,
77
+ name: p.name,
78
+ category: p.category,
79
+ subcategory: p.subcategory,
80
+ confidence: Math.round(p.confidence.score * 100) / 100,
81
+ confidenceLevel: p.confidence.level,
82
+ status: p.status,
83
+ locationCount: p.locations.length,
84
+ outlierCount: p.outliers.length,
85
+ }));
86
+ return buildResponse(builder, { summaries, totalCount }, args, startOffset, limit, 'store');
87
+ }
88
+ /**
89
+ * Try to get patterns from data lake (optimized path)
90
+ */
91
+ async function tryGetPatternsFromLake(dataLake, args, offset, limit) {
92
+ try {
93
+ await dataLake.initialize();
94
+ // Build query options, only including defined properties
95
+ // (exactOptionalPropertyTypes requires this approach)
96
+ const queryOptions = {
97
+ offset,
98
+ limit,
99
+ };
100
+ if (args.categories?.length) {
101
+ queryOptions.categories = args.categories;
102
+ }
103
+ if (args.status && args.status !== 'all') {
104
+ queryOptions.status = args.status;
105
+ }
106
+ if (args.minConfidence !== undefined) {
107
+ queryOptions.minConfidence = args.minConfidence;
108
+ }
109
+ if (args.search) {
110
+ queryOptions.search = args.search;
111
+ }
112
+ const result = await dataLake.query.getPatterns(queryOptions);
113
+ if (result.items.length === 0 && result.total === 0) {
114
+ return null; // No data in lake, fall back to store
115
+ }
116
+ const summaries = result.items.map(p => ({
117
+ id: p.id,
118
+ name: p.name,
119
+ category: p.category,
120
+ subcategory: p.subcategory,
121
+ confidence: Math.round(p.confidence * 100) / 100,
122
+ confidenceLevel: p.confidenceLevel,
123
+ status: p.status,
124
+ locationCount: p.locationCount,
125
+ outlierCount: p.outlierCount,
126
+ }));
127
+ return { summaries, totalCount: result.total };
128
+ }
129
+ catch {
130
+ return null;
131
+ }
132
+ }
133
+ /**
134
+ * Build the response
135
+ */
136
+ function buildResponse(builder, data, args, startOffset, limit, source) {
137
+ const { summaries, totalCount } = data;
138
+ // Build pagination info
139
+ const hasMore = startOffset + limit < totalCount;
140
+ const pagination = {
141
+ hasMore,
142
+ totalCount,
143
+ pageSize: limit,
144
+ cursor: hasMore
145
+ ? cursorManager.createOffsetCursor(startOffset + limit, args)
146
+ : undefined,
147
+ };
148
+ // Build summary
149
+ let summary = `Found ${totalCount} patterns`;
150
+ if (args.categories?.length) {
151
+ summary += ` in ${args.categories.join(', ')}`;
152
+ }
153
+ if (args.status && args.status !== 'all') {
154
+ summary += ` (${args.status})`;
155
+ }
156
+ summary += `. Showing ${summaries.length}.`;
157
+ return builder
158
+ .withSummary(summary)
159
+ .withData({ patterns: summaries, _source: source })
160
+ .withPagination(pagination)
161
+ .withHints({
162
+ nextActions: summaries.length > 0
163
+ ? [
164
+ `Use drift_pattern_get with id="${summaries[0]?.id}" for full details`,
165
+ 'Use drift_code_examples with categories to see implementations',
166
+ ]
167
+ : ['Try different filters or run drift scan to discover patterns'],
168
+ relatedTools: ['drift_pattern_get', 'drift_code_examples', 'drift_file_patterns'],
169
+ })
170
+ .buildContent();
171
+ }
172
+ //# sourceMappingURL=patterns-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns-list.js","sourceRoot":"","sources":["../../../src/tools/exploration/patterns-list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * drift_security_summary - Security Posture Overview
3
+ *
4
+ * Exploration tool that provides security-focused analysis:
5
+ * - Sensitive data access patterns
6
+ * - Security issues
7
+ * - Data flow summary
8
+ */
9
+ import type { BoundaryStore } from 'driftdetect-core';
10
+ export interface SecuritySummaryData {
11
+ overview: {
12
+ totalTables: number;
13
+ totalAccessPoints: number;
14
+ sensitiveFields: number;
15
+ violations: number;
16
+ };
17
+ sensitiveData: {
18
+ credentials: number;
19
+ financial: number;
20
+ health: number;
21
+ pii: number;
22
+ };
23
+ topTables: Array<{
24
+ name: string;
25
+ accessCount: number;
26
+ hasSensitive: boolean;
27
+ }>;
28
+ topSensitiveFields: Array<{
29
+ field: string;
30
+ type: string;
31
+ accessCount: number;
32
+ }>;
33
+ recentViolations: Array<{
34
+ file: string;
35
+ line: number;
36
+ message: string;
37
+ severity: string;
38
+ }>;
39
+ }
40
+ export declare function handleSecuritySummary(store: BoundaryStore, args: {
41
+ focus?: string;
42
+ limit?: number;
43
+ }): Promise<{
44
+ content: Array<{
45
+ type: string;
46
+ text: string;
47
+ }>;
48
+ }>;
49
+ //# sourceMappingURL=security-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-summary.d.ts","sourceRoot":"","sources":["../../../src/tools/exploration/security-summary.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,eAAe,EAAE,MAAM,CAAC;QACxB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,aAAa,EAAE;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,SAAS,EAAE,KAAK,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,OAAO,CAAC;KACvB,CAAC,CAAC;IACH,kBAAkB,EAAE,KAAK,CAAC;QACxB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,gBAAgB,EAAE,KAAK,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ;AAID,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA6G7D"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * drift_security_summary - Security Posture Overview
3
+ *
4
+ * Exploration tool that provides security-focused analysis:
5
+ * - Sensitive data access patterns
6
+ * - Security issues
7
+ * - Data flow summary
8
+ */
9
+ import { createResponseBuilder } from '../../infrastructure/index.js';
10
+ const DEFAULT_LIMIT = 10;
11
+ export async function handleSecuritySummary(store, args) {
12
+ const builder = createResponseBuilder();
13
+ const limit = args.limit ?? DEFAULT_LIMIT;
14
+ await store.initialize();
15
+ const accessMap = store.getAccessMap();
16
+ const sensitiveFields = store.getSensitiveAccess();
17
+ const rules = store.getRules();
18
+ const violations = rules ? store.checkAllViolations() : [];
19
+ // Count sensitive data by type
20
+ const sensitiveByType = {
21
+ credentials: 0,
22
+ financial: 0,
23
+ health: 0,
24
+ pii: 0,
25
+ };
26
+ for (const field of sensitiveFields) {
27
+ const type = field.sensitivityType;
28
+ if (type in sensitiveByType) {
29
+ sensitiveByType[type]++;
30
+ }
31
+ }
32
+ // Get top tables by access count
33
+ const tableEntries = Object.entries(accessMap.tables)
34
+ .map(([name, info]) => ({
35
+ name,
36
+ accessCount: info.accessedBy.length,
37
+ hasSensitive: info.sensitiveFields.length > 0,
38
+ }))
39
+ .sort((a, b) => b.accessCount - a.accessCount)
40
+ .slice(0, limit);
41
+ // Get top sensitive fields
42
+ const fieldCounts = new Map();
43
+ for (const field of sensitiveFields) {
44
+ const key = field.table ? `${field.table}.${field.field}` : field.field;
45
+ const existing = fieldCounts.get(key);
46
+ if (existing) {
47
+ existing.count++;
48
+ }
49
+ else {
50
+ fieldCounts.set(key, { type: field.sensitivityType, count: 1 });
51
+ }
52
+ }
53
+ const topSensitiveFields = Array.from(fieldCounts.entries())
54
+ .map(([field, { type, count }]) => ({ field, type, accessCount: count }))
55
+ .sort((a, b) => b.accessCount - a.accessCount)
56
+ .slice(0, limit);
57
+ // Get recent violations
58
+ const recentViolations = violations
59
+ .slice(0, limit)
60
+ .map(v => ({
61
+ file: v.file,
62
+ line: v.line,
63
+ message: v.message,
64
+ severity: v.severity,
65
+ }));
66
+ const data = {
67
+ overview: {
68
+ totalTables: accessMap.stats.totalTables,
69
+ totalAccessPoints: accessMap.stats.totalAccessPoints,
70
+ sensitiveFields: accessMap.stats.totalSensitiveFields,
71
+ violations: violations.length,
72
+ },
73
+ sensitiveData: sensitiveByType,
74
+ topTables: tableEntries,
75
+ topSensitiveFields,
76
+ recentViolations,
77
+ };
78
+ // Build summary
79
+ let summary = `${accessMap.stats.totalTables} tables, ${accessMap.stats.totalAccessPoints} access points. `;
80
+ summary += `${accessMap.stats.totalSensitiveFields} sensitive fields. `;
81
+ if (violations.length > 0) {
82
+ summary += `⚠️ ${violations.length} boundary violations.`;
83
+ }
84
+ else if (rules) {
85
+ summary += '✓ No violations.';
86
+ }
87
+ else {
88
+ summary += 'No boundary rules configured.';
89
+ }
90
+ const hints = {
91
+ nextActions: [
92
+ violations.length > 0
93
+ ? 'Review violations and update boundary rules'
94
+ : 'Use drift_patterns_list to explore security patterns',
95
+ ],
96
+ relatedTools: ['drift_patterns_list'],
97
+ };
98
+ if (sensitiveByType.credentials > 0) {
99
+ hints.warnings = [`${sensitiveByType.credentials} credential access points detected`];
100
+ }
101
+ if (violations.length > 0) {
102
+ hints.warnings = hints.warnings ?? [];
103
+ hints.warnings.push(`${violations.length} boundary violations need attention`);
104
+ }
105
+ return builder
106
+ .withSummary(summary)
107
+ .withData(data)
108
+ .withHints(hints)
109
+ .buildContent();
110
+ }
111
+ //# sourceMappingURL=security-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-summary.js","sourceRoot":"","sources":["../../../src/tools/exploration/security-summary.ts"],"names":[],"mappings":"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"}