ai-first-cli 1.3.6 → 1.3.8
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/CHANGELOG.md +123 -0
- package/README.es.md +14 -1
- package/README.md +14 -1
- package/ai/graph/knowledge-graph.json +1 -1
- package/ai-context/index-state.json +86 -2
- package/dist/analyzers/techStack.d.ts.map +1 -1
- package/dist/analyzers/techStack.js +43 -0
- package/dist/analyzers/techStack.js.map +1 -1
- package/dist/commands/ai-first.d.ts.map +1 -1
- package/dist/commands/ai-first.js +78 -4
- package/dist/commands/ai-first.js.map +1 -1
- package/dist/config/configLoader.d.ts +6 -0
- package/dist/config/configLoader.d.ts.map +1 -0
- package/dist/config/configLoader.js +232 -0
- package/dist/config/configLoader.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +101 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/core/content/contentProcessor.d.ts +4 -0
- package/dist/core/content/contentProcessor.d.ts.map +1 -0
- package/dist/core/content/contentProcessor.js +235 -0
- package/dist/core/content/contentProcessor.js.map +1 -0
- package/dist/core/content/index.d.ts +3 -0
- package/dist/core/content/index.d.ts.map +1 -0
- package/dist/core/content/index.js +2 -0
- package/dist/core/content/index.js.map +1 -0
- package/dist/core/content/types.d.ts +32 -0
- package/dist/core/content/types.d.ts.map +1 -0
- package/dist/core/content/types.js +2 -0
- package/dist/core/content/types.js.map +1 -0
- package/dist/core/gitAnalyzer.d.ts +14 -0
- package/dist/core/gitAnalyzer.d.ts.map +1 -1
- package/dist/core/gitAnalyzer.js +98 -0
- package/dist/core/gitAnalyzer.js.map +1 -1
- package/dist/core/multiRepo/index.d.ts +3 -0
- package/dist/core/multiRepo/index.d.ts.map +1 -0
- package/dist/core/multiRepo/index.js +2 -0
- package/dist/core/multiRepo/index.js.map +1 -0
- package/dist/core/multiRepo/multiRepoScanner.d.ts +18 -0
- package/dist/core/multiRepo/multiRepoScanner.d.ts.map +1 -0
- package/dist/core/multiRepo/multiRepoScanner.js +131 -0
- package/dist/core/multiRepo/multiRepoScanner.js.map +1 -0
- package/dist/core/rag/index.d.ts +3 -0
- package/dist/core/rag/index.d.ts.map +1 -0
- package/dist/core/rag/index.js +2 -0
- package/dist/core/rag/index.js.map +1 -0
- package/dist/core/rag/vectorIndex.d.ts +28 -0
- package/dist/core/rag/vectorIndex.d.ts.map +1 -0
- package/dist/core/rag/vectorIndex.js +71 -0
- package/dist/core/rag/vectorIndex.js.map +1 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +2 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +7 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +154 -0
- package/dist/mcp/server.js.map +1 -0
- package/docs/planning/evaluator-v1.0.0/README.md +112 -0
- package/docs/planning/evaluator-v1.0.0/improvements_plan_2026-03-28.md +237 -0
- package/package.json +13 -3
- package/src/analyzers/techStack.ts +47 -1
- package/src/commands/ai-first.ts +83 -4
- package/src/config/configLoader.ts +274 -0
- package/src/config/index.ts +27 -0
- package/src/config/types.ts +117 -0
- package/src/core/content/contentProcessor.ts +292 -0
- package/src/core/content/index.ts +9 -0
- package/src/core/content/types.ts +35 -0
- package/src/core/gitAnalyzer.ts +130 -0
- package/src/core/multiRepo/index.ts +2 -0
- package/src/core/multiRepo/multiRepoScanner.ts +177 -0
- package/src/core/rag/index.ts +2 -0
- package/src/core/rag/vectorIndex.ts +105 -0
- package/src/mcp/index.ts +1 -0
- package/src/mcp/server.ts +179 -0
- package/tests/v1.3.8-integration.test.ts +361 -0
- package/ai-context-evaluation-report-1774223059505.md +0 -206
- package/scripts/ai-context-evaluator.ts +0 -440
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import { scanRepo } from '../repoScanner.js';
|
|
4
|
+
export function scanMultiRepo(options) {
|
|
5
|
+
const repositories = [];
|
|
6
|
+
const crossRepoDependencies = new Map();
|
|
7
|
+
let totalFiles = 0;
|
|
8
|
+
for (const repoPath of options.repositories) {
|
|
9
|
+
const resolvedPath = path.resolve(repoPath);
|
|
10
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
11
|
+
console.warn(`Repository path does not exist: ${resolvedPath}`);
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
const repoName = path.basename(resolvedPath);
|
|
15
|
+
const scanResult = scanRepo(resolvedPath);
|
|
16
|
+
repositories.push({
|
|
17
|
+
name: repoName,
|
|
18
|
+
path: resolvedPath,
|
|
19
|
+
files: scanResult.files
|
|
20
|
+
});
|
|
21
|
+
totalFiles += scanResult.totalFiles;
|
|
22
|
+
}
|
|
23
|
+
if (options.includeSubmodules) {
|
|
24
|
+
for (const repo of repositories) {
|
|
25
|
+
const submodules = detectSubmodules(repo.path);
|
|
26
|
+
for (const submodule of submodules) {
|
|
27
|
+
const submoduleName = path.basename(submodule);
|
|
28
|
+
const scanResult = scanRepo(submodule);
|
|
29
|
+
repositories.push({
|
|
30
|
+
name: `${repo.name}/${submoduleName}`,
|
|
31
|
+
path: submodule,
|
|
32
|
+
files: scanResult.files
|
|
33
|
+
});
|
|
34
|
+
totalFiles += scanResult.totalFiles;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
detectCrossRepoDependencies(repositories, crossRepoDependencies);
|
|
39
|
+
return {
|
|
40
|
+
repositories,
|
|
41
|
+
totalFiles,
|
|
42
|
+
crossRepoDependencies
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function detectSubmodules(repoPath) {
|
|
46
|
+
const submodules = [];
|
|
47
|
+
const gitmodulesPath = path.join(repoPath, '.gitmodules');
|
|
48
|
+
if (!fs.existsSync(gitmodulesPath)) {
|
|
49
|
+
return submodules;
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
const content = fs.readFileSync(gitmodulesPath, 'utf-8');
|
|
53
|
+
const matches = content.match(/path\s*=\s*(.+)/g);
|
|
54
|
+
if (matches) {
|
|
55
|
+
for (const match of matches) {
|
|
56
|
+
const submodulePath = match.split('=')[1].trim();
|
|
57
|
+
const fullPath = path.join(repoPath, submodulePath);
|
|
58
|
+
if (fs.existsSync(fullPath)) {
|
|
59
|
+
submodules.push(fullPath);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Ignore errors reading .gitmodules
|
|
66
|
+
}
|
|
67
|
+
return submodules;
|
|
68
|
+
}
|
|
69
|
+
function detectCrossRepoDependencies(repositories, dependencies) {
|
|
70
|
+
for (const repo of repositories) {
|
|
71
|
+
const deps = [];
|
|
72
|
+
for (const otherRepo of repositories) {
|
|
73
|
+
if (repo.name === otherRepo.name)
|
|
74
|
+
continue;
|
|
75
|
+
const hasDependency = checkDependency(repo, otherRepo);
|
|
76
|
+
if (hasDependency) {
|
|
77
|
+
deps.push(otherRepo.name);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (deps.length > 0) {
|
|
81
|
+
dependencies.set(repo.name, deps);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function checkDependency(repoA, repoB) {
|
|
86
|
+
const packageJsonA = path.join(repoA.path, 'package.json');
|
|
87
|
+
if (fs.existsSync(packageJsonA)) {
|
|
88
|
+
try {
|
|
89
|
+
const pkg = JSON.parse(fs.readFileSync(packageJsonA, 'utf-8'));
|
|
90
|
+
const deps = {
|
|
91
|
+
...pkg.dependencies,
|
|
92
|
+
...pkg.devDependencies,
|
|
93
|
+
...pkg.peerDependencies
|
|
94
|
+
};
|
|
95
|
+
for (const dep of Object.keys(deps)) {
|
|
96
|
+
if (dep.includes(repoB.name.toLowerCase())) {
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Ignore errors reading package.json
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
export function generateMultiRepoReport(context) {
|
|
108
|
+
const lines = [];
|
|
109
|
+
lines.push('# Multi-Repository Context\n');
|
|
110
|
+
lines.push(`## Summary`);
|
|
111
|
+
lines.push(`- **Total Repositories:** ${context.repositories.length}`);
|
|
112
|
+
lines.push(`- **Total Files:** ${context.totalFiles}\n`);
|
|
113
|
+
lines.push(`## Repositories`);
|
|
114
|
+
for (const repo of context.repositories) {
|
|
115
|
+
lines.push(`\n### ${repo.name}`);
|
|
116
|
+
lines.push(`- **Path:** ${repo.path}`);
|
|
117
|
+
lines.push(`- **Files:** ${repo.files.length}`);
|
|
118
|
+
const deps = context.crossRepoDependencies.get(repo.name);
|
|
119
|
+
if (deps && deps.length > 0) {
|
|
120
|
+
lines.push(`- **Dependencies:** ${deps.join(', ')}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (context.crossRepoDependencies.size > 0) {
|
|
124
|
+
lines.push(`\n## Cross-Repository Dependencies`);
|
|
125
|
+
for (const [repo, deps] of context.crossRepoDependencies) {
|
|
126
|
+
lines.push(`- **${repo}** depends on: ${deps.join(', ')}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return lines.join('\n');
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=multiRepoScanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multiRepoScanner.js","sourceRoot":"","sources":["../../../src/core/multiRepo/multiRepoScanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/rag/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClF,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/rag/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface VectorDocument {
|
|
2
|
+
id: string;
|
|
3
|
+
content: string;
|
|
4
|
+
embedding: number[];
|
|
5
|
+
metadata: {
|
|
6
|
+
filePath: string;
|
|
7
|
+
language?: string;
|
|
8
|
+
type?: 'function' | 'class' | 'interface' | 'variable';
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export interface SearchResult {
|
|
12
|
+
document: VectorDocument;
|
|
13
|
+
score: number;
|
|
14
|
+
}
|
|
15
|
+
export declare class VectorIndex {
|
|
16
|
+
private documents;
|
|
17
|
+
private indexPath;
|
|
18
|
+
constructor(indexPath: string);
|
|
19
|
+
private load;
|
|
20
|
+
save(): void;
|
|
21
|
+
addDocument(doc: VectorDocument): void;
|
|
22
|
+
search(query: string, topK?: number): SearchResult[];
|
|
23
|
+
private simpleEmbedding;
|
|
24
|
+
private cosineSimilarity;
|
|
25
|
+
}
|
|
26
|
+
export declare function createVectorIndex(indexPath: string): VectorIndex;
|
|
27
|
+
export declare function semanticSearch(index: VectorIndex, query: string, topK?: number): SearchResult[];
|
|
28
|
+
//# sourceMappingURL=vectorIndex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vectorIndex.d.ts","sourceRoot":"","sources":["../../../src/core/rag/vectorIndex.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,CAAC;KACxD,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,EAAE,MAAM;IAK7B,OAAO,CAAC,IAAI;IAWZ,IAAI,IAAI,IAAI;IAKZ,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI;IAItC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAU,GAAG,YAAY,EAAE;IAcvD,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,gBAAgB;CAczB;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAEhE;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAAU,GACf,YAAY,EAAE,CAEhB"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
export class VectorIndex {
|
|
3
|
+
documents = new Map();
|
|
4
|
+
indexPath;
|
|
5
|
+
constructor(indexPath) {
|
|
6
|
+
this.indexPath = indexPath;
|
|
7
|
+
this.load();
|
|
8
|
+
}
|
|
9
|
+
load() {
|
|
10
|
+
if (fs.existsSync(this.indexPath)) {
|
|
11
|
+
try {
|
|
12
|
+
const data = JSON.parse(fs.readFileSync(this.indexPath, 'utf-8'));
|
|
13
|
+
this.documents = new Map(Object.entries(data));
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
this.documents = new Map();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
save() {
|
|
21
|
+
const data = Object.fromEntries(this.documents);
|
|
22
|
+
fs.writeFileSync(this.indexPath, JSON.stringify(data, null, 2));
|
|
23
|
+
}
|
|
24
|
+
addDocument(doc) {
|
|
25
|
+
this.documents.set(doc.id, doc);
|
|
26
|
+
}
|
|
27
|
+
search(query, topK = 5) {
|
|
28
|
+
const queryEmbedding = this.simpleEmbedding(query);
|
|
29
|
+
const results = [];
|
|
30
|
+
for (const doc of this.documents.values()) {
|
|
31
|
+
const score = this.cosineSimilarity(queryEmbedding, doc.embedding);
|
|
32
|
+
results.push({ document: doc, score });
|
|
33
|
+
}
|
|
34
|
+
return results
|
|
35
|
+
.sort((a, b) => b.score - a.score)
|
|
36
|
+
.slice(0, topK);
|
|
37
|
+
}
|
|
38
|
+
simpleEmbedding(text) {
|
|
39
|
+
const words = text.toLowerCase().split(/\s+/);
|
|
40
|
+
const embedding = new Array(100).fill(0);
|
|
41
|
+
for (let i = 0; i < words.length && i < 100; i++) {
|
|
42
|
+
let hash = 0;
|
|
43
|
+
for (const char of words[i]) {
|
|
44
|
+
hash = ((hash << 5) - hash) + char.charCodeAt(0);
|
|
45
|
+
hash = hash & hash;
|
|
46
|
+
}
|
|
47
|
+
embedding[i] = Math.sin(hash) * 0.5 + 0.5;
|
|
48
|
+
}
|
|
49
|
+
return embedding;
|
|
50
|
+
}
|
|
51
|
+
cosineSimilarity(a, b) {
|
|
52
|
+
let dotProduct = 0;
|
|
53
|
+
let normA = 0;
|
|
54
|
+
let normB = 0;
|
|
55
|
+
for (let i = 0; i < a.length; i++) {
|
|
56
|
+
dotProduct += a[i] * b[i];
|
|
57
|
+
normA += a[i] * a[i];
|
|
58
|
+
normB += b[i] * b[i];
|
|
59
|
+
}
|
|
60
|
+
if (normA === 0 || normB === 0)
|
|
61
|
+
return 0;
|
|
62
|
+
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export function createVectorIndex(indexPath) {
|
|
66
|
+
return new VectorIndex(indexPath);
|
|
67
|
+
}
|
|
68
|
+
export function semanticSearch(index, query, topK = 5) {
|
|
69
|
+
return index.search(query, topK);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=vectorIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vectorIndex.js","sourceRoot":"","sources":["../../../src/core/rag/vectorIndex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAWA,UAAU,gBAAgB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,gBAAqB,GAAG,IAAI,CAgKnE;AAED,OAAO,EAAE,cAAc,IAAI,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { runAIFirst } from '../commands/ai-first.js';
|
|
5
|
+
import { generateIndex } from '../core/indexer.js';
|
|
6
|
+
export function startMCPServer(options = {}) {
|
|
7
|
+
const rootDir = options.rootDir || process.cwd();
|
|
8
|
+
const aiDir = options.aiDir || `${rootDir}/ai-context`;
|
|
9
|
+
const server = new Server({
|
|
10
|
+
name: 'ai-first-cli',
|
|
11
|
+
version: '1.4.0',
|
|
12
|
+
}, {
|
|
13
|
+
capabilities: {
|
|
14
|
+
tools: {},
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
18
|
+
return {
|
|
19
|
+
tools: [
|
|
20
|
+
{
|
|
21
|
+
name: 'generate_context',
|
|
22
|
+
description: 'Generate AI context for the repository or a specific module',
|
|
23
|
+
inputSchema: {
|
|
24
|
+
type: 'object',
|
|
25
|
+
properties: {
|
|
26
|
+
module: {
|
|
27
|
+
type: 'string',
|
|
28
|
+
description: 'Optional module path to generate context for (e.g., "src/auth")',
|
|
29
|
+
},
|
|
30
|
+
preset: {
|
|
31
|
+
type: 'string',
|
|
32
|
+
enum: ['full', 'quick', 'api', 'docs'],
|
|
33
|
+
description: 'Preset to use for context generation',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'query_symbols',
|
|
40
|
+
description: 'Query symbols (functions, classes, interfaces) in the indexed repository',
|
|
41
|
+
inputSchema: {
|
|
42
|
+
type: 'object',
|
|
43
|
+
properties: {
|
|
44
|
+
query: {
|
|
45
|
+
type: 'string',
|
|
46
|
+
description: 'Search query for symbols',
|
|
47
|
+
},
|
|
48
|
+
type: {
|
|
49
|
+
type: 'string',
|
|
50
|
+
enum: ['function', 'class', 'interface', 'variable', 'all'],
|
|
51
|
+
description: 'Type of symbol to search for',
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
required: ['query'],
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: 'get_architecture',
|
|
59
|
+
description: 'Get the architecture analysis of the project',
|
|
60
|
+
inputSchema: {
|
|
61
|
+
type: 'object',
|
|
62
|
+
properties: {
|
|
63
|
+
format: {
|
|
64
|
+
type: 'string',
|
|
65
|
+
enum: ['summary', 'detailed'],
|
|
66
|
+
description: 'Level of detail for the architecture report',
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
};
|
|
73
|
+
});
|
|
74
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
75
|
+
const { name, arguments: args } = request.params;
|
|
76
|
+
try {
|
|
77
|
+
switch (name) {
|
|
78
|
+
case 'generate_context': {
|
|
79
|
+
const result = await runAIFirst({
|
|
80
|
+
rootDir,
|
|
81
|
+
outputDir: aiDir,
|
|
82
|
+
});
|
|
83
|
+
return {
|
|
84
|
+
content: [
|
|
85
|
+
{
|
|
86
|
+
type: 'text',
|
|
87
|
+
text: JSON.stringify({
|
|
88
|
+
success: result.success,
|
|
89
|
+
filesCreated: result.filesCreated,
|
|
90
|
+
message: result.success
|
|
91
|
+
? `Generated context in ${aiDir}`
|
|
92
|
+
: `Error: ${result.error}`,
|
|
93
|
+
}, null, 2),
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
case 'query_symbols': {
|
|
99
|
+
const query = args?.query;
|
|
100
|
+
const symbolType = args?.type || 'all';
|
|
101
|
+
const index = generateIndex(rootDir, aiDir);
|
|
102
|
+
return {
|
|
103
|
+
content: [
|
|
104
|
+
{
|
|
105
|
+
type: 'text',
|
|
106
|
+
text: JSON.stringify({
|
|
107
|
+
query,
|
|
108
|
+
type: symbolType,
|
|
109
|
+
results: [],
|
|
110
|
+
message: `Symbol query executed for "${query}"`,
|
|
111
|
+
}, null, 2),
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
case 'get_architecture': {
|
|
117
|
+
const format = args?.format || 'summary';
|
|
118
|
+
return {
|
|
119
|
+
content: [
|
|
120
|
+
{
|
|
121
|
+
type: 'text',
|
|
122
|
+
text: JSON.stringify({
|
|
123
|
+
format,
|
|
124
|
+
rootDir,
|
|
125
|
+
message: 'Architecture analysis available',
|
|
126
|
+
}, null, 2),
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
default:
|
|
132
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
return {
|
|
137
|
+
content: [
|
|
138
|
+
{
|
|
139
|
+
type: 'text',
|
|
140
|
+
text: JSON.stringify({
|
|
141
|
+
error: error instanceof Error ? error.message : String(error),
|
|
142
|
+
}, null, 2),
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
isError: true,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
const transport = new StdioServerTransport();
|
|
150
|
+
server.connect(transport);
|
|
151
|
+
console.error('AI-First MCP Server running on stdio');
|
|
152
|
+
}
|
|
153
|
+
export { startMCPServer as startMCP };
|
|
154
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Evaluator v1.0.0 - Planes de Mejora
|
|
2
|
+
|
|
3
|
+
Este directorio contiene los planes de mejora generados por el AI-First Evaluator v1.0.0.
|
|
4
|
+
|
|
5
|
+
## Estructura de Archivos
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
evaluator-v1.0.0/
|
|
9
|
+
├── README.md # Este archivo
|
|
10
|
+
├── improvements_plan_YYYY-MM-DD.md # Plan de mejoras específico
|
|
11
|
+
└── [futuros planes...]
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Convención de Nombres
|
|
15
|
+
|
|
16
|
+
Los archivos de plan de mejoras siguen el formato:
|
|
17
|
+
```
|
|
18
|
+
improvements_plan_<fecha>.md
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Ejemplos:
|
|
22
|
+
- `improvements_plan_2026-03-28.md`
|
|
23
|
+
- `improvements_plan_2026-04-15.md`
|
|
24
|
+
- `improvements_plan_2026-05-01.md`
|
|
25
|
+
|
|
26
|
+
## Template para Nuevas Evaluaciones
|
|
27
|
+
|
|
28
|
+
Para crear un nuevo plan de mejoras:
|
|
29
|
+
|
|
30
|
+
1. **Ejecutar el evaluator:**
|
|
31
|
+
```bash
|
|
32
|
+
npm run evaluate:quick
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
2. **Copiar el template:**
|
|
36
|
+
```bash
|
|
37
|
+
cp improvements_plan_2026-03-28.md improvements_plan_$(date +%Y-%m-%d).md
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
3. **Actualizar campos marcados:**
|
|
41
|
+
- Fecha de evaluación
|
|
42
|
+
- Proyecto evaluado
|
|
43
|
+
- Score obtenido
|
|
44
|
+
- Hallazgos específicos
|
|
45
|
+
- Owners y deadlines
|
|
46
|
+
|
|
47
|
+
## Contenido del Plan de Mejoras
|
|
48
|
+
|
|
49
|
+
Cada documento incluye:
|
|
50
|
+
|
|
51
|
+
1. **Resumen Ejecutivo**
|
|
52
|
+
- Score total y métricas
|
|
53
|
+
- Distribución de puntos por perspectiva
|
|
54
|
+
- Estado general (PASS/FAIL)
|
|
55
|
+
|
|
56
|
+
2. **Fortalezas**
|
|
57
|
+
- Qué se está haciendo bien
|
|
58
|
+
- Qué mantener
|
|
59
|
+
|
|
60
|
+
3. **Áreas de Mejora**
|
|
61
|
+
- Priorizadas por impacto
|
|
62
|
+
- Con categorías (IMPLEMENTED, USER_ACTION, etc.)
|
|
63
|
+
- Incluyen templates de solución
|
|
64
|
+
|
|
65
|
+
4. **Plan de Acción**
|
|
66
|
+
- Tablas con tareas, owners y deadlines
|
|
67
|
+
- Separadas por prioridad
|
|
68
|
+
|
|
69
|
+
5. **Proyección de Mejora**
|
|
70
|
+
- Score actual vs proyectado
|
|
71
|
+
- ROI estimado
|
|
72
|
+
|
|
73
|
+
6. **Checklist de Seguimiento**
|
|
74
|
+
- Implementación
|
|
75
|
+
- Verificación
|
|
76
|
+
- Documentación
|
|
77
|
+
|
|
78
|
+
## Versionado
|
|
79
|
+
|
|
80
|
+
Cuando se actualice el evaluator a una nueva versión (ej: v1.1.0, v2.0.0):
|
|
81
|
+
|
|
82
|
+
1. Crear nuevo directorio: `evaluator-v1.1.0/`
|
|
83
|
+
2. Copiar template actualizado
|
|
84
|
+
3. Documentar cambios en el nuevo formato
|
|
85
|
+
|
|
86
|
+
## Ejemplo de Uso
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# 1. Evaluar proyecto
|
|
90
|
+
npm run evaluate:quick
|
|
91
|
+
|
|
92
|
+
# 2. Crear plan de mejoras
|
|
93
|
+
cp docs/planning/evaluator-v1.0.0/improvements_plan_2026-03-28.md \
|
|
94
|
+
docs/planning/evaluator-v1.0.0/improvements_plan_$(date +%Y-%m-%d).md
|
|
95
|
+
|
|
96
|
+
# 3. Editar con resultados específicos
|
|
97
|
+
# [Abrir en editor y completar]
|
|
98
|
+
|
|
99
|
+
# 4. Commit
|
|
100
|
+
git add docs/planning/evaluator-v1.0.0/
|
|
101
|
+
git commit -m "docs: add improvements plan for $(date +%Y-%m-%d)"
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Historial
|
|
105
|
+
|
|
106
|
+
| Fecha | Proyecto | Score | Estado | Archivo |
|
|
107
|
+
|-------|----------|-------|--------|---------|
|
|
108
|
+
| 2026-03-28 | express-api | 3.88/5.0 | PASS | improvements_plan_2026-03-28.md |
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
**Nota:** Mantener este README actualizado con cada nueva versión del evaluator.
|