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.
Files changed (84) hide show
  1. package/CHANGELOG.md +123 -0
  2. package/README.es.md +14 -1
  3. package/README.md +14 -1
  4. package/ai/graph/knowledge-graph.json +1 -1
  5. package/ai-context/index-state.json +86 -2
  6. package/dist/analyzers/techStack.d.ts.map +1 -1
  7. package/dist/analyzers/techStack.js +43 -0
  8. package/dist/analyzers/techStack.js.map +1 -1
  9. package/dist/commands/ai-first.d.ts.map +1 -1
  10. package/dist/commands/ai-first.js +78 -4
  11. package/dist/commands/ai-first.js.map +1 -1
  12. package/dist/config/configLoader.d.ts +6 -0
  13. package/dist/config/configLoader.d.ts.map +1 -0
  14. package/dist/config/configLoader.js +232 -0
  15. package/dist/config/configLoader.js.map +1 -0
  16. package/dist/config/index.d.ts +3 -0
  17. package/dist/config/index.d.ts.map +1 -0
  18. package/dist/config/index.js +2 -0
  19. package/dist/config/index.js.map +1 -0
  20. package/dist/config/types.d.ts +101 -0
  21. package/dist/config/types.d.ts.map +1 -0
  22. package/dist/config/types.js +2 -0
  23. package/dist/config/types.js.map +1 -0
  24. package/dist/core/content/contentProcessor.d.ts +4 -0
  25. package/dist/core/content/contentProcessor.d.ts.map +1 -0
  26. package/dist/core/content/contentProcessor.js +235 -0
  27. package/dist/core/content/contentProcessor.js.map +1 -0
  28. package/dist/core/content/index.d.ts +3 -0
  29. package/dist/core/content/index.d.ts.map +1 -0
  30. package/dist/core/content/index.js +2 -0
  31. package/dist/core/content/index.js.map +1 -0
  32. package/dist/core/content/types.d.ts +32 -0
  33. package/dist/core/content/types.d.ts.map +1 -0
  34. package/dist/core/content/types.js +2 -0
  35. package/dist/core/content/types.js.map +1 -0
  36. package/dist/core/gitAnalyzer.d.ts +14 -0
  37. package/dist/core/gitAnalyzer.d.ts.map +1 -1
  38. package/dist/core/gitAnalyzer.js +98 -0
  39. package/dist/core/gitAnalyzer.js.map +1 -1
  40. package/dist/core/multiRepo/index.d.ts +3 -0
  41. package/dist/core/multiRepo/index.d.ts.map +1 -0
  42. package/dist/core/multiRepo/index.js +2 -0
  43. package/dist/core/multiRepo/index.js.map +1 -0
  44. package/dist/core/multiRepo/multiRepoScanner.d.ts +18 -0
  45. package/dist/core/multiRepo/multiRepoScanner.d.ts.map +1 -0
  46. package/dist/core/multiRepo/multiRepoScanner.js +131 -0
  47. package/dist/core/multiRepo/multiRepoScanner.js.map +1 -0
  48. package/dist/core/rag/index.d.ts +3 -0
  49. package/dist/core/rag/index.d.ts.map +1 -0
  50. package/dist/core/rag/index.js +2 -0
  51. package/dist/core/rag/index.js.map +1 -0
  52. package/dist/core/rag/vectorIndex.d.ts +28 -0
  53. package/dist/core/rag/vectorIndex.d.ts.map +1 -0
  54. package/dist/core/rag/vectorIndex.js +71 -0
  55. package/dist/core/rag/vectorIndex.js.map +1 -0
  56. package/dist/mcp/index.d.ts +2 -0
  57. package/dist/mcp/index.d.ts.map +1 -0
  58. package/dist/mcp/index.js +2 -0
  59. package/dist/mcp/index.js.map +1 -0
  60. package/dist/mcp/server.d.ts +7 -0
  61. package/dist/mcp/server.d.ts.map +1 -0
  62. package/dist/mcp/server.js +154 -0
  63. package/dist/mcp/server.js.map +1 -0
  64. package/docs/planning/evaluator-v1.0.0/README.md +112 -0
  65. package/docs/planning/evaluator-v1.0.0/improvements_plan_2026-03-28.md +237 -0
  66. package/package.json +13 -3
  67. package/src/analyzers/techStack.ts +47 -1
  68. package/src/commands/ai-first.ts +83 -4
  69. package/src/config/configLoader.ts +274 -0
  70. package/src/config/index.ts +27 -0
  71. package/src/config/types.ts +117 -0
  72. package/src/core/content/contentProcessor.ts +292 -0
  73. package/src/core/content/index.ts +9 -0
  74. package/src/core/content/types.ts +35 -0
  75. package/src/core/gitAnalyzer.ts +130 -0
  76. package/src/core/multiRepo/index.ts +2 -0
  77. package/src/core/multiRepo/multiRepoScanner.ts +177 -0
  78. package/src/core/rag/index.ts +2 -0
  79. package/src/core/rag/vectorIndex.ts +105 -0
  80. package/src/mcp/index.ts +1 -0
  81. package/src/mcp/server.ts +179 -0
  82. package/tests/v1.3.8-integration.test.ts +361 -0
  83. package/ai-context-evaluation-report-1774223059505.md +0 -206
  84. 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,3 @@
1
+ export { VectorIndex, createVectorIndex, semanticSearch } from './vectorIndex.js';
2
+ export type { VectorDocument, SearchResult } from './vectorIndex.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export { VectorIndex, createVectorIndex, semanticSearch } from './vectorIndex.js';
2
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ export { startMCPServer, startMCP } from './server.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export { startMCPServer, startMCP } from './server.js';
2
+ //# sourceMappingURL=index.js.map
@@ -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,7 @@
1
+ interface MCPServerOptions {
2
+ rootDir?: string;
3
+ aiDir?: string;
4
+ }
5
+ export declare function startMCPServer(options?: MCPServerOptions): void;
6
+ export { startMCPServer as startMCP };
7
+ //# sourceMappingURL=server.d.ts.map
@@ -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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AASnD,MAAM,UAAU,cAAc,CAAC,UAA4B,EAAE;IAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,aAAa,CAAC;IAEvD,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;SACV;KACF,CACF,CAAC;IAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QAC1D,OAAO;YACL,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,kBAAkB;oBACxB,WAAW,EAAE,6DAA6D;oBAC1E,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,MAAM,EAAE;gCACN,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,iEAAiE;6BAC/E;4BACD,MAAM,EAAE;gCACN,IAAI,EAAE,QAAQ;gCACd,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC;gCACtC,WAAW,EAAE,sCAAsC;6BACpD;yBACF;qBACF;iBACF;gBACD;oBACE,IAAI,EAAE,eAAe;oBACrB,WAAW,EAAE,0EAA0E;oBACvF,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,0BAA0B;6BACxC;4BACD,IAAI,EAAE;gCACJ,IAAI,EAAE,QAAQ;gCACd,IAAI,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC;gCAC3D,WAAW,EAAE,8BAA8B;6BAC5C;yBACF;wBACD,QAAQ,EAAE,CAAC,OAAO,CAAC;qBACpB;iBACF;gBACD;oBACE,IAAI,EAAE,kBAAkB;oBACxB,WAAW,EAAE,8CAA8C;oBAC3D,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,MAAM,EAAE;gCACN,IAAI,EAAE,QAAQ;gCACd,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;gCAC7B,WAAW,EAAE,6CAA6C;6BAC3D;yBACF;qBACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAEjD,IAAI,CAAC;YACH,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,kBAAkB,CAAC,CAAC,CAAC;oBACxB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;wBAC9B,OAAO;wBACP,SAAS,EAAE,KAAK;qBACjB,CAAC,CAAC;oBACH,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oCACnB,OAAO,EAAE,MAAM,CAAC,OAAO;oCACvB,YAAY,EAAE,MAAM,CAAC,YAAY;oCACjC,OAAO,EAAE,MAAM,CAAC,OAAO;wCACrB,CAAC,CAAC,wBAAwB,KAAK,EAAE;wCACjC,CAAC,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE;iCAC7B,EAAE,IAAI,EAAE,CAAC,CAAC;6BACZ;yBACF;qBACF,CAAC;gBACJ,CAAC;gBAED,KAAK,eAAe,CAAC,CAAC,CAAC;oBACrB,MAAM,KAAK,GAAG,IAAI,EAAE,KAAe,CAAC;oBACpC,MAAM,UAAU,GAAI,IAAI,EAAE,IAAe,IAAI,KAAK,CAAC;oBAEnD,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;oBAE5C,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oCACnB,KAAK;oCACL,IAAI,EAAE,UAAU;oCAChB,OAAO,EAAE,EAAE;oCACX,OAAO,EAAE,8BAA8B,KAAK,GAAG;iCAChD,EAAE,IAAI,EAAE,CAAC,CAAC;6BACZ;yBACF;qBACF,CAAC;gBACJ,CAAC;gBAED,KAAK,kBAAkB,CAAC,CAAC,CAAC;oBACxB,MAAM,MAAM,GAAI,IAAI,EAAE,MAAiB,IAAI,SAAS,CAAC;oBAErD,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oCACnB,MAAM;oCACN,OAAO;oCACP,OAAO,EAAE,iCAAiC;iCAC3C,EAAE,IAAI,EAAE,CAAC,CAAC;6BACZ;yBACF;qBACF,CAAC;gBACJ,CAAC;gBAED;oBACE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;yBAC9D,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE1B,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;AACxD,CAAC;AAED,OAAO,EAAE,cAAc,IAAI,QAAQ,EAAE,CAAC"}
@@ -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.