driftdetect-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +122 -0
- package/dist/bin/server.d.ts +20 -0
- package/dist/bin/server.d.ts.map +1 -0
- package/dist/bin/server.js +40 -0
- package/dist/bin/server.js.map +1 -0
- package/dist/feedback.d.ts +80 -0
- package/dist/feedback.d.ts.map +1 -0
- package/dist/feedback.js +197 -0
- package/dist/feedback.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/packs.d.ts +86 -0
- package/dist/packs.d.ts.map +1 -0
- package/dist/packs.js +654 -0
- package/dist/packs.js.map +1 -0
- package/dist/server.d.ts +11 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +976 -0
- package/dist/server.js.map +1 -0
- package/package.json +50 -0
package/README.md
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# Drift MCP Server
|
|
2
|
+
|
|
3
|
+
MCP (Model Context Protocol) server that exposes drift functionality to AI agents like Claude, Kiro, and other MCP-compatible tools.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g driftdetect-mcp
|
|
9
|
+
# or
|
|
10
|
+
pnpm add -g driftdetect-mcp
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Configuration
|
|
14
|
+
|
|
15
|
+
Add to your MCP config (`.kiro/settings/mcp.json` for Kiro, or `~/.config/claude/mcp.json` for Claude Desktop):
|
|
16
|
+
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"mcpServers": {
|
|
20
|
+
"drift": {
|
|
21
|
+
"command": "npx",
|
|
22
|
+
"args": ["driftdetect-mcp", "/path/to/your/project"]
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Or if installed globally:
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"mcpServers": {
|
|
33
|
+
"drift": {
|
|
34
|
+
"command": "drift-mcp",
|
|
35
|
+
"args": ["/path/to/your/project"]
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Available Tools
|
|
42
|
+
|
|
43
|
+
### `drift_status`
|
|
44
|
+
Get overall codebase pattern health and statistics.
|
|
45
|
+
|
|
46
|
+
### `drift_patterns`
|
|
47
|
+
Query patterns by category with optional confidence filtering.
|
|
48
|
+
|
|
49
|
+
**Parameters:**
|
|
50
|
+
- `categories` (optional): Array of categories to query
|
|
51
|
+
- `minConfidence` (optional): Minimum confidence score (0.0-1.0)
|
|
52
|
+
|
|
53
|
+
### `drift_files`
|
|
54
|
+
Get patterns found in a specific file or glob pattern.
|
|
55
|
+
|
|
56
|
+
**Parameters:**
|
|
57
|
+
- `path` (required): File path or glob pattern
|
|
58
|
+
- `category` (optional): Filter by category
|
|
59
|
+
|
|
60
|
+
### `drift_where`
|
|
61
|
+
Find where a pattern is used across the codebase.
|
|
62
|
+
|
|
63
|
+
**Parameters:**
|
|
64
|
+
- `pattern` (required): Pattern name or ID to search
|
|
65
|
+
- `category` (optional): Filter by category
|
|
66
|
+
|
|
67
|
+
### `drift_export`
|
|
68
|
+
Export patterns in AI-optimized format for code generation context.
|
|
69
|
+
|
|
70
|
+
**Parameters:**
|
|
71
|
+
- `categories` (optional): Categories to export
|
|
72
|
+
- `format` (optional): `ai-context`, `json`, or `summary`
|
|
73
|
+
- `compact` (optional): Reduce output verbosity
|
|
74
|
+
|
|
75
|
+
### `drift_contracts`
|
|
76
|
+
Get frontend/backend API contract status and mismatches.
|
|
77
|
+
|
|
78
|
+
**Parameters:**
|
|
79
|
+
- `status` (optional): `all`, `verified`, `mismatch`, or `discovered`
|
|
80
|
+
|
|
81
|
+
## Categories
|
|
82
|
+
|
|
83
|
+
Drift tracks 15 pattern categories:
|
|
84
|
+
- `api` - API route patterns, response formats
|
|
85
|
+
- `auth` - Authentication and authorization
|
|
86
|
+
- `security` - Security patterns and practices
|
|
87
|
+
- `errors` - Error handling patterns
|
|
88
|
+
- `logging` - Logging conventions
|
|
89
|
+
- `testing` - Test structure and mocking
|
|
90
|
+
- `data-access` - Database and data layer patterns
|
|
91
|
+
- `config` - Configuration management
|
|
92
|
+
- `types` - TypeScript type patterns
|
|
93
|
+
- `structural` - File/folder organization
|
|
94
|
+
- `components` - UI component patterns
|
|
95
|
+
- `styling` - CSS/styling conventions
|
|
96
|
+
- `accessibility` - A11y patterns
|
|
97
|
+
- `documentation` - Doc patterns
|
|
98
|
+
- `performance` - Performance optimizations
|
|
99
|
+
|
|
100
|
+
## Example Usage
|
|
101
|
+
|
|
102
|
+
Once configured, AI agents can query your codebase patterns:
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
Agent: "How does this codebase handle authentication?"
|
|
106
|
+
→ Uses drift_patterns with categories: ["auth", "security"]
|
|
107
|
+
|
|
108
|
+
Agent: "Show me the API patterns before I add a new endpoint"
|
|
109
|
+
→ Uses drift_export with categories: ["api"] and format: "ai-context"
|
|
110
|
+
|
|
111
|
+
Agent: "Are there any API contract mismatches?"
|
|
112
|
+
→ Uses drift_contracts with status: "mismatch"
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Prerequisites
|
|
116
|
+
|
|
117
|
+
Run `drift scan` in your project first to build the pattern database:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
cd /path/to/your/project
|
|
121
|
+
npx driftdetect scan
|
|
122
|
+
```
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Drift MCP Server Entry Point
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* drift-mcp # Run in current directory
|
|
7
|
+
* drift-mcp /path/to/project # Run for specific project
|
|
8
|
+
*
|
|
9
|
+
* MCP Config (add to mcp.json):
|
|
10
|
+
* {
|
|
11
|
+
* "mcpServers": {
|
|
12
|
+
* "drift": {
|
|
13
|
+
* "command": "npx",
|
|
14
|
+
* "args": ["driftdetect-mcp", "/path/to/your/project"]
|
|
15
|
+
* }
|
|
16
|
+
* }
|
|
17
|
+
* }
|
|
18
|
+
*/
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/bin/server.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Drift MCP Server Entry Point
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* drift-mcp # Run in current directory
|
|
7
|
+
* drift-mcp /path/to/project # Run for specific project
|
|
8
|
+
*
|
|
9
|
+
* MCP Config (add to mcp.json):
|
|
10
|
+
* {
|
|
11
|
+
* "mcpServers": {
|
|
12
|
+
* "drift": {
|
|
13
|
+
* "command": "npx",
|
|
14
|
+
* "args": ["driftdetect-mcp", "/path/to/your/project"]
|
|
15
|
+
* }
|
|
16
|
+
* }
|
|
17
|
+
* }
|
|
18
|
+
*/
|
|
19
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
20
|
+
import { createDriftMCPServer } from '../server.js';
|
|
21
|
+
async function main() {
|
|
22
|
+
const projectRoot = process.argv[2] ?? process.cwd();
|
|
23
|
+
const server = createDriftMCPServer({ projectRoot });
|
|
24
|
+
const transport = new StdioServerTransport();
|
|
25
|
+
await server.connect(transport);
|
|
26
|
+
// Handle graceful shutdown
|
|
27
|
+
process.on('SIGINT', async () => {
|
|
28
|
+
await server.close();
|
|
29
|
+
process.exit(0);
|
|
30
|
+
});
|
|
31
|
+
process.on('SIGTERM', async () => {
|
|
32
|
+
await server.close();
|
|
33
|
+
process.exit(0);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
main().catch((error) => {
|
|
37
|
+
console.error('Failed to start Drift MCP server:', error);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/bin/server.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,KAAK,UAAU,IAAI;IACjB,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAErD,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,2BAA2B;IAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;IAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example Quality Feedback System
|
|
3
|
+
*
|
|
4
|
+
* Tracks user feedback on pattern examples to improve future suggestions.
|
|
5
|
+
* Feedback is stored per-project and used to boost/penalize pattern locations.
|
|
6
|
+
*/
|
|
7
|
+
export interface ExampleFeedback {
|
|
8
|
+
patternId: string;
|
|
9
|
+
patternName: string;
|
|
10
|
+
category: string;
|
|
11
|
+
file: string;
|
|
12
|
+
line: number;
|
|
13
|
+
rating: 'good' | 'bad' | 'irrelevant';
|
|
14
|
+
reason?: string | undefined;
|
|
15
|
+
timestamp: string;
|
|
16
|
+
}
|
|
17
|
+
export interface FeedbackStats {
|
|
18
|
+
totalFeedback: number;
|
|
19
|
+
goodExamples: number;
|
|
20
|
+
badExamples: number;
|
|
21
|
+
irrelevantExamples: number;
|
|
22
|
+
topGoodPatterns: Array<{
|
|
23
|
+
pattern: string;
|
|
24
|
+
count: number;
|
|
25
|
+
}>;
|
|
26
|
+
topBadPatterns: Array<{
|
|
27
|
+
pattern: string;
|
|
28
|
+
count: number;
|
|
29
|
+
}>;
|
|
30
|
+
topBadFiles: Array<{
|
|
31
|
+
file: string;
|
|
32
|
+
count: number;
|
|
33
|
+
}>;
|
|
34
|
+
}
|
|
35
|
+
export interface LocationScore {
|
|
36
|
+
file: string;
|
|
37
|
+
boost: number;
|
|
38
|
+
confidence: number;
|
|
39
|
+
}
|
|
40
|
+
export declare class FeedbackManager {
|
|
41
|
+
private feedbackDir;
|
|
42
|
+
private feedbackFile;
|
|
43
|
+
private scoresFile;
|
|
44
|
+
private feedback;
|
|
45
|
+
private locationScores;
|
|
46
|
+
private initialized;
|
|
47
|
+
constructor(projectRoot: string);
|
|
48
|
+
initialize(): Promise<void>;
|
|
49
|
+
private loadFeedback;
|
|
50
|
+
private loadScores;
|
|
51
|
+
private saveFeedback;
|
|
52
|
+
private saveScores;
|
|
53
|
+
/**
|
|
54
|
+
* Record feedback on an example
|
|
55
|
+
*/
|
|
56
|
+
recordFeedback(feedback: Omit<ExampleFeedback, 'timestamp'>): Promise<void>;
|
|
57
|
+
private updateLocationScore;
|
|
58
|
+
/**
|
|
59
|
+
* Get the quality score for a file (used to rank examples)
|
|
60
|
+
* Returns a multiplier: 1.0 = neutral, >1 = boosted, <1 = penalized
|
|
61
|
+
*/
|
|
62
|
+
getFileScore(file: string): number;
|
|
63
|
+
/**
|
|
64
|
+
* Check if a file should be excluded based on consistent bad feedback
|
|
65
|
+
*/
|
|
66
|
+
shouldExcludeFile(file: string): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Get feedback statistics
|
|
69
|
+
*/
|
|
70
|
+
getStats(): Promise<FeedbackStats>;
|
|
71
|
+
/**
|
|
72
|
+
* Get all feedback for export/analysis
|
|
73
|
+
*/
|
|
74
|
+
getAllFeedback(): Promise<ExampleFeedback[]>;
|
|
75
|
+
/**
|
|
76
|
+
* Clear all feedback (for testing or reset)
|
|
77
|
+
*/
|
|
78
|
+
clearFeedback(): Promise<void>;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=feedback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../src/feedback.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,YAAY,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,cAAc,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM;IAMzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YASnB,YAAY;YASZ,UAAU;YAUV,YAAY;YAIZ,UAAU;IAKxB;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAsBnE,mBAAmB;IA4BjC;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAqBlC;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAQxC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC;IAqDxC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAKlD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAMrC"}
|
package/dist/feedback.js
ADDED
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example Quality Feedback System
|
|
3
|
+
*
|
|
4
|
+
* Tracks user feedback on pattern examples to improve future suggestions.
|
|
5
|
+
* Feedback is stored per-project and used to boost/penalize pattern locations.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'node:fs/promises';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Feedback Manager
|
|
11
|
+
// ============================================================================
|
|
12
|
+
export class FeedbackManager {
|
|
13
|
+
feedbackDir;
|
|
14
|
+
feedbackFile;
|
|
15
|
+
scoresFile;
|
|
16
|
+
feedback = [];
|
|
17
|
+
locationScores = new Map();
|
|
18
|
+
initialized = false;
|
|
19
|
+
constructor(projectRoot) {
|
|
20
|
+
this.feedbackDir = path.join(projectRoot, '.drift', 'feedback');
|
|
21
|
+
this.feedbackFile = path.join(this.feedbackDir, 'examples.json');
|
|
22
|
+
this.scoresFile = path.join(this.feedbackDir, 'scores.json');
|
|
23
|
+
}
|
|
24
|
+
async initialize() {
|
|
25
|
+
if (this.initialized)
|
|
26
|
+
return;
|
|
27
|
+
await fs.mkdir(this.feedbackDir, { recursive: true });
|
|
28
|
+
await this.loadFeedback();
|
|
29
|
+
await this.loadScores();
|
|
30
|
+
this.initialized = true;
|
|
31
|
+
}
|
|
32
|
+
async loadFeedback() {
|
|
33
|
+
try {
|
|
34
|
+
const content = await fs.readFile(this.feedbackFile, 'utf-8');
|
|
35
|
+
this.feedback = JSON.parse(content);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
this.feedback = [];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async loadScores() {
|
|
42
|
+
try {
|
|
43
|
+
const content = await fs.readFile(this.scoresFile, 'utf-8');
|
|
44
|
+
const scores = JSON.parse(content);
|
|
45
|
+
this.locationScores = new Map(scores.map(s => [s.file, s]));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
this.locationScores = new Map();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async saveFeedback() {
|
|
52
|
+
await fs.writeFile(this.feedbackFile, JSON.stringify(this.feedback, null, 2), 'utf-8');
|
|
53
|
+
}
|
|
54
|
+
async saveScores() {
|
|
55
|
+
const scores = Array.from(this.locationScores.values());
|
|
56
|
+
await fs.writeFile(this.scoresFile, JSON.stringify(scores, null, 2), 'utf-8');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Record feedback on an example
|
|
60
|
+
*/
|
|
61
|
+
async recordFeedback(feedback) {
|
|
62
|
+
await this.initialize();
|
|
63
|
+
const entry = {
|
|
64
|
+
...feedback,
|
|
65
|
+
timestamp: new Date().toISOString(),
|
|
66
|
+
};
|
|
67
|
+
this.feedback.push(entry);
|
|
68
|
+
// Update location scores
|
|
69
|
+
await this.updateLocationScore(feedback.file, feedback.rating);
|
|
70
|
+
// Keep last 5000 feedback entries
|
|
71
|
+
if (this.feedback.length > 5000) {
|
|
72
|
+
this.feedback = this.feedback.slice(-5000);
|
|
73
|
+
}
|
|
74
|
+
await this.saveFeedback();
|
|
75
|
+
await this.saveScores();
|
|
76
|
+
}
|
|
77
|
+
async updateLocationScore(file, rating) {
|
|
78
|
+
const existing = this.locationScores.get(file) || {
|
|
79
|
+
file,
|
|
80
|
+
boost: 0,
|
|
81
|
+
confidence: 0,
|
|
82
|
+
};
|
|
83
|
+
// Update boost based on rating
|
|
84
|
+
const delta = rating === 'good' ? 0.1 : rating === 'bad' ? -0.15 : -0.05;
|
|
85
|
+
existing.boost = Math.max(-1, Math.min(1, existing.boost + delta));
|
|
86
|
+
// Increase confidence with each feedback
|
|
87
|
+
existing.confidence = Math.min(1, existing.confidence + 0.1);
|
|
88
|
+
this.locationScores.set(file, existing);
|
|
89
|
+
// Also update directory-level scores for pattern propagation
|
|
90
|
+
const dir = path.dirname(file);
|
|
91
|
+
const dirScore = this.locationScores.get(dir) || {
|
|
92
|
+
file: dir,
|
|
93
|
+
boost: 0,
|
|
94
|
+
confidence: 0,
|
|
95
|
+
};
|
|
96
|
+
dirScore.boost = Math.max(-1, Math.min(1, dirScore.boost + delta * 0.3));
|
|
97
|
+
dirScore.confidence = Math.min(1, dirScore.confidence + 0.03);
|
|
98
|
+
this.locationScores.set(dir, dirScore);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get the quality score for a file (used to rank examples)
|
|
102
|
+
* Returns a multiplier: 1.0 = neutral, >1 = boosted, <1 = penalized
|
|
103
|
+
*/
|
|
104
|
+
getFileScore(file) {
|
|
105
|
+
const fileScore = this.locationScores.get(file);
|
|
106
|
+
const dirScore = this.locationScores.get(path.dirname(file));
|
|
107
|
+
let boost = 0;
|
|
108
|
+
let confidence = 0;
|
|
109
|
+
if (fileScore) {
|
|
110
|
+
boost += fileScore.boost * fileScore.confidence;
|
|
111
|
+
confidence = Math.max(confidence, fileScore.confidence);
|
|
112
|
+
}
|
|
113
|
+
if (dirScore) {
|
|
114
|
+
boost += dirScore.boost * dirScore.confidence * 0.5;
|
|
115
|
+
confidence = Math.max(confidence, dirScore.confidence * 0.5);
|
|
116
|
+
}
|
|
117
|
+
// Convert boost to multiplier: -1 -> 0.3, 0 -> 1.0, 1 -> 1.7
|
|
118
|
+
return 1 + (boost * 0.7);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Check if a file should be excluded based on consistent bad feedback
|
|
122
|
+
*/
|
|
123
|
+
shouldExcludeFile(file) {
|
|
124
|
+
const score = this.locationScores.get(file);
|
|
125
|
+
if (!score)
|
|
126
|
+
return false;
|
|
127
|
+
// Exclude if we have high confidence that this file produces bad examples
|
|
128
|
+
return score.boost < -0.5 && score.confidence > 0.5;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get feedback statistics
|
|
132
|
+
*/
|
|
133
|
+
async getStats() {
|
|
134
|
+
await this.initialize();
|
|
135
|
+
const goodExamples = this.feedback.filter(f => f.rating === 'good').length;
|
|
136
|
+
const badExamples = this.feedback.filter(f => f.rating === 'bad').length;
|
|
137
|
+
const irrelevantExamples = this.feedback.filter(f => f.rating === 'irrelevant').length;
|
|
138
|
+
// Count patterns
|
|
139
|
+
const patternCounts = new Map();
|
|
140
|
+
for (const f of this.feedback) {
|
|
141
|
+
const key = `${f.category}/${f.patternName}`;
|
|
142
|
+
const counts = patternCounts.get(key) || { good: 0, bad: 0 };
|
|
143
|
+
if (f.rating === 'good')
|
|
144
|
+
counts.good++;
|
|
145
|
+
else if (f.rating === 'bad')
|
|
146
|
+
counts.bad++;
|
|
147
|
+
patternCounts.set(key, counts);
|
|
148
|
+
}
|
|
149
|
+
// Count bad files
|
|
150
|
+
const fileCounts = new Map();
|
|
151
|
+
for (const f of this.feedback) {
|
|
152
|
+
if (f.rating === 'bad' || f.rating === 'irrelevant') {
|
|
153
|
+
fileCounts.set(f.file, (fileCounts.get(f.file) || 0) + 1);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const topGoodPatterns = Array.from(patternCounts.entries())
|
|
157
|
+
.filter(([, c]) => c.good > 0)
|
|
158
|
+
.sort((a, b) => b[1].good - a[1].good)
|
|
159
|
+
.slice(0, 5)
|
|
160
|
+
.map(([pattern, counts]) => ({ pattern, count: counts.good }));
|
|
161
|
+
const topBadPatterns = Array.from(patternCounts.entries())
|
|
162
|
+
.filter(([, c]) => c.bad > 0)
|
|
163
|
+
.sort((a, b) => b[1].bad - a[1].bad)
|
|
164
|
+
.slice(0, 5)
|
|
165
|
+
.map(([pattern, counts]) => ({ pattern, count: counts.bad }));
|
|
166
|
+
const topBadFiles = Array.from(fileCounts.entries())
|
|
167
|
+
.sort((a, b) => b[1] - a[1])
|
|
168
|
+
.slice(0, 10)
|
|
169
|
+
.map(([file, count]) => ({ file, count }));
|
|
170
|
+
return {
|
|
171
|
+
totalFeedback: this.feedback.length,
|
|
172
|
+
goodExamples,
|
|
173
|
+
badExamples,
|
|
174
|
+
irrelevantExamples,
|
|
175
|
+
topGoodPatterns,
|
|
176
|
+
topBadPatterns,
|
|
177
|
+
topBadFiles,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Get all feedback for export/analysis
|
|
182
|
+
*/
|
|
183
|
+
async getAllFeedback() {
|
|
184
|
+
await this.initialize();
|
|
185
|
+
return [...this.feedback];
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Clear all feedback (for testing or reset)
|
|
189
|
+
*/
|
|
190
|
+
async clearFeedback() {
|
|
191
|
+
this.feedback = [];
|
|
192
|
+
this.locationScores = new Map();
|
|
193
|
+
await this.saveFeedback();
|
|
194
|
+
await this.saveScores();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../src/feedback.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drift MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Exposes drift functionality as MCP tools for AI agents.
|
|
5
|
+
* This enables structured, type-safe access to codebase patterns.
|
|
6
|
+
*/
|
|
7
|
+
export { createDriftMCPServer } from './server.js';
|
|
8
|
+
export type { DriftMCPConfig } from './server.js';
|
|
9
|
+
export { PackManager, DEFAULT_PACKS } from './packs.js';
|
|
10
|
+
export type { PackDefinition, PackMeta, PackResult, PackUsage, SuggestedPack, } from './packs.js';
|
|
11
|
+
export { FeedbackManager } from './feedback.js';
|
|
12
|
+
export type { ExampleFeedback, FeedbackStats, LocationScore, } from './feedback.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACxD,YAAY,EACV,cAAc,EACd,QAAQ,EACR,UAAU,EACV,SAAS,EACT,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,YAAY,EACV,eAAe,EACf,aAAa,EACb,aAAa,GACd,MAAM,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drift MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Exposes drift functionality as MCP tools for AI agents.
|
|
5
|
+
* This enables structured, type-safe access to codebase patterns.
|
|
6
|
+
*/
|
|
7
|
+
export { createDriftMCPServer } from './server.js';
|
|
8
|
+
export { PackManager, DEFAULT_PACKS } from './packs.js';
|
|
9
|
+
export { FeedbackManager } from './feedback.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AASxD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/packs.d.ts
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern Packs - Pre-defined bundles of patterns for common tasks
|
|
3
|
+
*
|
|
4
|
+
* Provides cached, task-oriented pattern context for AI agents.
|
|
5
|
+
*/
|
|
6
|
+
import { PatternStore } from 'driftdetect-core';
|
|
7
|
+
export interface PackDefinition {
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
categories: string[];
|
|
11
|
+
patterns?: string[] | undefined;
|
|
12
|
+
maxExamples?: number;
|
|
13
|
+
contextLines?: number;
|
|
14
|
+
minConfidence?: number;
|
|
15
|
+
includeDeprecated?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface PackMeta {
|
|
18
|
+
name: string;
|
|
19
|
+
generatedAt: string;
|
|
20
|
+
patternHash: string;
|
|
21
|
+
sourceFiles: string[];
|
|
22
|
+
packDefHash: string;
|
|
23
|
+
}
|
|
24
|
+
export interface PackResult {
|
|
25
|
+
content: string;
|
|
26
|
+
fromCache: boolean;
|
|
27
|
+
generatedAt: string;
|
|
28
|
+
staleReason?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface PackUsage {
|
|
31
|
+
categories: string[];
|
|
32
|
+
patterns?: string[] | undefined;
|
|
33
|
+
timestamp: string;
|
|
34
|
+
context?: 'code_generation' | 'review' | 'onboarding' | 'unknown';
|
|
35
|
+
}
|
|
36
|
+
export interface SuggestedPack {
|
|
37
|
+
name: string;
|
|
38
|
+
description: string;
|
|
39
|
+
categories: string[];
|
|
40
|
+
patterns?: string[] | undefined;
|
|
41
|
+
usageCount: number;
|
|
42
|
+
lastUsed: string;
|
|
43
|
+
}
|
|
44
|
+
export declare const DEFAULT_PACKS: PackDefinition[];
|
|
45
|
+
export declare class PackManager {
|
|
46
|
+
private projectRoot;
|
|
47
|
+
private store;
|
|
48
|
+
private packsDir;
|
|
49
|
+
private cacheDir;
|
|
50
|
+
private customPacks;
|
|
51
|
+
constructor(projectRoot: string, store: PatternStore);
|
|
52
|
+
initialize(): Promise<void>;
|
|
53
|
+
private ensureDirectories;
|
|
54
|
+
private loadCustomPacks;
|
|
55
|
+
getAllPacks(): PackDefinition[];
|
|
56
|
+
getPack(name: string): PackDefinition | undefined;
|
|
57
|
+
getPackContent(name: string, options?: {
|
|
58
|
+
refresh?: boolean;
|
|
59
|
+
}): Promise<PackResult>;
|
|
60
|
+
private checkStaleness;
|
|
61
|
+
private generatePack;
|
|
62
|
+
private hashPackDef;
|
|
63
|
+
private computePatternHash;
|
|
64
|
+
refreshAllPacks(): Promise<Map<string, PackResult>>;
|
|
65
|
+
/**
|
|
66
|
+
* Track pack/category usage for learning
|
|
67
|
+
*/
|
|
68
|
+
trackUsage(usage: PackUsage): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Suggest packs based on usage patterns
|
|
71
|
+
*/
|
|
72
|
+
suggestPacks(): Promise<SuggestedPack[]>;
|
|
73
|
+
/**
|
|
74
|
+
* Create a custom pack from suggestion or manual definition
|
|
75
|
+
*/
|
|
76
|
+
createCustomPack(pack: PackDefinition): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Delete a custom pack
|
|
79
|
+
*/
|
|
80
|
+
deleteCustomPack(name: string): Promise<boolean>;
|
|
81
|
+
/**
|
|
82
|
+
* Infer packs from codebase structure (co-occurring patterns)
|
|
83
|
+
*/
|
|
84
|
+
inferPacksFromStructure(): Promise<SuggestedPack[]>;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=packs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packs.d.ts","sourceRoot":"","sources":["../src/packs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,YAAY,EAA+B,MAAM,kBAAkB,CAAC;AA8G7E,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,iBAAiB,GAAG,QAAQ,GAAG,YAAY,GAAG,SAAS,CAAC;CACnE;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD,eAAO,MAAM,aAAa,EAAE,cAAc,EAwCzC,CAAC;AAMF,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAwB;gBAE/B,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY;IAO9C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAMnB,iBAAiB;YAKjB,eAAe;IAW7B,WAAW,IAAI,cAAc,EAAE;IAY/B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI3C,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,UAAU,CAAC;YA0C9E,cAAc;YA0Cd,YAAY;IAgL1B,OAAO,CAAC,WAAW;YAUL,kBAAkB;IAU1B,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAazD;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBjD;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IA4E9C;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B3D;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgCtD;;OAEG;IACG,uBAAuB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;CA+D1D"}
|