devcache-hub 0.1.3 → 0.3.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/dist/analyzers/ArchitectureAnalyzer.d.ts +17 -0
- package/dist/analyzers/ArchitectureAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/ArchitectureAnalyzer.js +217 -0
- package/dist/analyzers/ArchitectureAnalyzer.js.map +1 -0
- package/dist/analyzers/FeaturesAnalyzer.d.ts +18 -0
- package/dist/analyzers/FeaturesAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/FeaturesAnalyzer.js +258 -0
- package/dist/analyzers/FeaturesAnalyzer.js.map +1 -0
- package/dist/analyzers/ImpactAnalyzer.d.ts +16 -0
- package/dist/analyzers/ImpactAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/ImpactAnalyzer.js +165 -0
- package/dist/analyzers/ImpactAnalyzer.js.map +1 -0
- package/dist/analyzers/ProjectAnalyzer.d.ts +14 -0
- package/dist/analyzers/ProjectAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/ProjectAnalyzer.js +142 -0
- package/dist/analyzers/ProjectAnalyzer.js.map +1 -0
- package/dist/analyzers/StackAnalyzer.d.ts +28 -0
- package/dist/analyzers/StackAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/StackAnalyzer.js +320 -0
- package/dist/analyzers/StackAnalyzer.js.map +1 -0
- package/dist/analyzers/base/BaseAnalyzer.d.ts +39 -0
- package/dist/analyzers/base/BaseAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/base/BaseAnalyzer.js +64 -0
- package/dist/analyzers/base/BaseAnalyzer.js.map +1 -0
- package/dist/analyzers/index.d.ts +7 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +23 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +32 -19
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/login.d.ts.map +1 -1
- package/dist/cli/commands/login.js +89 -19
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/push.d.ts.map +1 -1
- package/dist/cli/commands/push.js +81 -10
- package/dist/cli/commands/push.js.map +1 -1
- package/dist/orchestrator/FileSystemHandler.d.ts +35 -0
- package/dist/orchestrator/FileSystemHandler.d.ts.map +1 -0
- package/dist/orchestrator/FileSystemHandler.js +138 -0
- package/dist/orchestrator/FileSystemHandler.js.map +1 -0
- package/dist/orchestrator/Orchestrator.d.ts +31 -0
- package/dist/orchestrator/Orchestrator.d.ts.map +1 -0
- package/dist/orchestrator/Orchestrator.js +141 -0
- package/dist/orchestrator/Orchestrator.js.map +1 -0
- package/dist/orchestrator/TemplateManager.d.ts +35 -0
- package/dist/orchestrator/TemplateManager.d.ts.map +1 -0
- package/dist/orchestrator/TemplateManager.js +116 -0
- package/dist/orchestrator/TemplateManager.js.map +1 -0
- package/dist/orchestrator/index.d.ts +4 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +20 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/supabase/client.d.ts +54 -0
- package/dist/supabase/client.d.ts.map +1 -0
- package/dist/supabase/client.js +181 -0
- package/dist/supabase/client.js.map +1 -0
- package/dist/supabase/index.d.ts +3 -0
- package/dist/supabase/index.d.ts.map +1 -0
- package/dist/supabase/index.js +19 -0
- package/dist/supabase/index.js.map +1 -0
- package/dist/supabase/oauth.d.ts +25 -0
- package/dist/supabase/oauth.d.ts.map +1 -0
- package/dist/supabase/oauth.js +218 -0
- package/dist/supabase/oauth.js.map +1 -0
- package/dist/supabase/storage.d.ts +46 -0
- package/dist/supabase/storage.d.ts.map +1 -0
- package/dist/supabase/storage.js +179 -0
- package/dist/supabase/storage.js.map +1 -0
- package/dist/types/analyzers.d.ts +51 -0
- package/dist/types/analyzers.d.ts.map +1 -0
- package/dist/types/analyzers.js +3 -0
- package/dist/types/analyzers.js.map +1 -0
- package/dist/types/config.d.ts +27 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +3 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +20 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/templates.d.ts +18 -0
- package/dist/types/templates.d.ts.map +1 -0
- package/dist/types/templates.js +3 -0
- package/dist/types/templates.js.map +1 -0
- package/dist/utils/config.d.ts +17 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +46 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/fileParser.d.ts +28 -0
- package/dist/utils/fileParser.d.ts.map +1 -0
- package/dist/utils/fileParser.js +111 -0
- package/dist/utils/fileParser.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +20 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +31 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +13 -12
- package/templates/general/project-impact.yaml +34 -0
- package/templates/general/project-overview.yaml +34 -0
- package/templates/tech/architecture-project.yaml +42 -0
- package/templates/tech/features.yaml +38 -0
- package/templates/tech/stack-project.yaml +42 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BaseAnalyzer } from './base/BaseAnalyzer';
|
|
2
|
+
import { ProjectContext, AnalysisOutput } from '../types';
|
|
3
|
+
export declare class ArchitectureAnalyzer extends BaseAnalyzer {
|
|
4
|
+
name: string;
|
|
5
|
+
outputPath: string;
|
|
6
|
+
category: 'general' | 'tech';
|
|
7
|
+
analyze(context: ProjectContext): Promise<AnalysisOutput>;
|
|
8
|
+
private identifyFramework;
|
|
9
|
+
private identifyArchitecturePattern;
|
|
10
|
+
private analyzeProjectStructure;
|
|
11
|
+
private analyzeComponentHierarchy;
|
|
12
|
+
private analyzeDataFlow;
|
|
13
|
+
private analyzeRouting;
|
|
14
|
+
private identifyStateManagement;
|
|
15
|
+
private identifyDesignDecisions;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=ArchitectureAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArchitectureAnalyzer.d.ts","sourceRoot":"","sources":["../../src/analyzers/ArchitectureAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1D,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,IAAI,SAA0B;IAC9B,UAAU,SAAkC;IAC5C,QAAQ,EAAE,SAAS,GAAG,MAAM,CAAU;IAEhC,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAmB/D,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,2BAA2B;IAuCnC,OAAO,CAAC,uBAAuB;IA0B/B,OAAO,CAAC,yBAAyB;IA2BjC,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,uBAAuB;IA+B/B,OAAO,CAAC,uBAAuB;CAmChC"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ArchitectureAnalyzer = void 0;
|
|
4
|
+
const BaseAnalyzer_1 = require("./base/BaseAnalyzer");
|
|
5
|
+
class ArchitectureAnalyzer extends BaseAnalyzer_1.BaseAnalyzer {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(...arguments);
|
|
8
|
+
this.name = 'architecture-project';
|
|
9
|
+
this.outputPath = 'tech/architecture-project.md';
|
|
10
|
+
this.category = 'tech';
|
|
11
|
+
}
|
|
12
|
+
async analyze(context) {
|
|
13
|
+
const metadata = this.extractMetadata(context);
|
|
14
|
+
return {
|
|
15
|
+
title: 'Architecture Overview',
|
|
16
|
+
sections: [
|
|
17
|
+
this.createSection('Framework', this.identifyFramework(context)),
|
|
18
|
+
this.createSection('Architecture Pattern', this.identifyArchitecturePattern(context)),
|
|
19
|
+
this.createSection('Project Structure', this.analyzeProjectStructure(context)),
|
|
20
|
+
this.createSection('Component Hierarchy', this.analyzeComponentHierarchy(context)),
|
|
21
|
+
this.createSection('Data Flow', this.analyzeDataFlow(context)),
|
|
22
|
+
this.createSection('Routing Structure', this.analyzeRouting(context)),
|
|
23
|
+
this.createSection('State Management', this.identifyStateManagement(context)),
|
|
24
|
+
this.createSection('Key Design Decisions', this.identifyDesignDecisions(context)),
|
|
25
|
+
],
|
|
26
|
+
metadata,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
identifyFramework(context) {
|
|
30
|
+
if (context.framework) {
|
|
31
|
+
const version = context.packageJson?.dependencies?.[context.framework.toLowerCase()] ||
|
|
32
|
+
context.packageJson?.dependencies?.['next'] ||
|
|
33
|
+
context.packageJson?.dependencies?.['react'];
|
|
34
|
+
return `**${context.framework}** ${version ? `(${version})` : ''}\n\nThis project is built using ${context.framework}, a modern framework for building web applications.`;
|
|
35
|
+
}
|
|
36
|
+
return 'Framework not detected. This may be a vanilla JavaScript/TypeScript project or use a framework not in the detection list.';
|
|
37
|
+
}
|
|
38
|
+
identifyArchitecturePattern(context) {
|
|
39
|
+
const hasComponents = this.getFilesMatching(context, /components/).length > 0;
|
|
40
|
+
const hasControllers = this.getFilesMatching(context, /controllers/).length > 0;
|
|
41
|
+
const hasModels = this.getFilesMatching(context, /models/).length > 0;
|
|
42
|
+
const hasViews = this.getFilesMatching(context, /views/).length > 0;
|
|
43
|
+
const hasServices = this.getFilesMatching(context, /services/).length > 0;
|
|
44
|
+
const hasHooks = this.getFilesMatching(context, /hooks|use[A-Z]/).length > 0;
|
|
45
|
+
let pattern = '';
|
|
46
|
+
if (hasModels && hasViews && hasControllers) {
|
|
47
|
+
pattern = '**MVC (Model-View-Controller)**\n\n';
|
|
48
|
+
pattern += 'The project follows the MVC pattern with clear separation between:\n';
|
|
49
|
+
pattern += '- Models: Data structures and business logic\n';
|
|
50
|
+
pattern += '- Views: User interface components\n';
|
|
51
|
+
pattern += '- Controllers: Request handling and coordination\n';
|
|
52
|
+
}
|
|
53
|
+
else if (hasComponents && hasServices) {
|
|
54
|
+
pattern = '**Component-Based Architecture with Services**\n\n';
|
|
55
|
+
pattern += 'The project uses a component-based architecture with:\n';
|
|
56
|
+
pattern += '- Components: Reusable UI building blocks\n';
|
|
57
|
+
pattern += '- Services: Business logic and data management\n';
|
|
58
|
+
pattern += '- Clear separation of concerns\n';
|
|
59
|
+
}
|
|
60
|
+
else if (hasComponents && hasHooks) {
|
|
61
|
+
pattern = '**Component-Based with Hooks Pattern**\n\n';
|
|
62
|
+
pattern += 'Modern React/Next.js architecture using:\n';
|
|
63
|
+
pattern += '- Functional components\n';
|
|
64
|
+
pattern += '- Custom hooks for logic reuse\n';
|
|
65
|
+
pattern += '- Composition over inheritance\n';
|
|
66
|
+
}
|
|
67
|
+
else if (hasComponents) {
|
|
68
|
+
pattern = '**Component-Based Architecture**\n\n';
|
|
69
|
+
pattern += 'The project follows a component-based approach with modular, reusable components.\n';
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
pattern = '**Modular Architecture**\n\n';
|
|
73
|
+
pattern += 'The project uses a modular structure with organized code separation.\n';
|
|
74
|
+
}
|
|
75
|
+
return pattern;
|
|
76
|
+
}
|
|
77
|
+
analyzeProjectStructure(context) {
|
|
78
|
+
const directories = new Set();
|
|
79
|
+
for (const file of context.files) {
|
|
80
|
+
const parts = file.relativePath.split('/');
|
|
81
|
+
if (parts.length > 1) {
|
|
82
|
+
directories.add(parts[0]);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const mainDirs = Array.from(directories).sort();
|
|
86
|
+
let structure = 'The project is organized into the following main directories:\n\n';
|
|
87
|
+
for (const dir of mainDirs.slice(0, 10)) {
|
|
88
|
+
const filesInDir = context.files.filter(f => f.relativePath.startsWith(dir + '/')).length;
|
|
89
|
+
structure += `- **${dir}/** (${filesInDir} files)\n`;
|
|
90
|
+
}
|
|
91
|
+
if (mainDirs.length > 10) {
|
|
92
|
+
structure += `\n...and ${mainDirs.length - 10} more directories`;
|
|
93
|
+
}
|
|
94
|
+
return structure;
|
|
95
|
+
}
|
|
96
|
+
analyzeComponentHierarchy(context) {
|
|
97
|
+
const componentFiles = this.getFilesMatching(context, /components/);
|
|
98
|
+
if (componentFiles.length === 0) {
|
|
99
|
+
return 'No component directory detected in the project structure.';
|
|
100
|
+
}
|
|
101
|
+
const componentDirs = new Set();
|
|
102
|
+
for (const file of componentFiles) {
|
|
103
|
+
const match = file.relativePath.match(/components\/([^\/]+)/);
|
|
104
|
+
if (match) {
|
|
105
|
+
componentDirs.add(match[1]);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
let hierarchy = `The project contains ${componentFiles.length} component files organized as:\n\n`;
|
|
109
|
+
const dirs = Array.from(componentDirs).sort();
|
|
110
|
+
for (const dir of dirs.slice(0, 8)) {
|
|
111
|
+
const count = componentFiles.filter(f => f.relativePath.includes(`components/${dir}`)).length;
|
|
112
|
+
hierarchy += `- **${dir}**: ${count} component(s)\n`;
|
|
113
|
+
}
|
|
114
|
+
return hierarchy;
|
|
115
|
+
}
|
|
116
|
+
analyzeDataFlow(context) {
|
|
117
|
+
const hasApi = this.getFilesMatching(context, /api|routes/).length > 0;
|
|
118
|
+
const hasDatabase = this.getFilesMatching(context, /models|schema|database|prisma|supabase/).length > 0;
|
|
119
|
+
const hasState = this.getFilesMatching(context, /store|state|context/).length > 0;
|
|
120
|
+
let flow = 'Data flows through the application as follows:\n\n';
|
|
121
|
+
if (hasApi && hasDatabase) {
|
|
122
|
+
flow += '1. **Client** → Makes requests to API endpoints\n';
|
|
123
|
+
flow += '2. **API Layer** → Processes requests and validates data\n';
|
|
124
|
+
flow += '3. **Database** → Stores and retrieves persistent data\n';
|
|
125
|
+
flow += '4. **API Response** → Returns data to client\n';
|
|
126
|
+
if (hasState) {
|
|
127
|
+
flow += '5. **State Management** → Updates application state\n';
|
|
128
|
+
}
|
|
129
|
+
flow += '\nThis follows a typical client-server architecture with clear data boundaries.';
|
|
130
|
+
}
|
|
131
|
+
else if (hasApi) {
|
|
132
|
+
flow += '1. **Client** → Sends requests to API\n';
|
|
133
|
+
flow += '2. **API Layer** → Processes and responds\n';
|
|
134
|
+
flow += '3. **Client** → Updates UI based on response\n';
|
|
135
|
+
}
|
|
136
|
+
else if (hasState) {
|
|
137
|
+
flow += '1. **User Interaction** → Triggers state changes\n';
|
|
138
|
+
flow += '2. **State Management** → Updates application state\n';
|
|
139
|
+
flow += '3. **Components** → Re-render based on state\n';
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
flow += 'Data flow follows standard component prop passing and event handling patterns.';
|
|
143
|
+
}
|
|
144
|
+
return flow;
|
|
145
|
+
}
|
|
146
|
+
analyzeRouting(context) {
|
|
147
|
+
const framework = context.framework;
|
|
148
|
+
if (framework === 'Next.js') {
|
|
149
|
+
const appDir = this.getFilesMatching(context, /^app\/.*\/page\.(tsx?|jsx?)$/);
|
|
150
|
+
const pagesDir = this.getFilesMatching(context, /^pages\/.*\.(tsx?|jsx?)$/);
|
|
151
|
+
if (appDir.length > 0) {
|
|
152
|
+
return `**App Router** (Next.js 13+)\n\nThe project uses Next.js App Router with ${appDir.length} route(s). Routes are defined using the file-system based routing in the \`app/\` directory.`;
|
|
153
|
+
}
|
|
154
|
+
else if (pagesDir.length > 0) {
|
|
155
|
+
return `**Pages Router** (Next.js)\n\nThe project uses Next.js Pages Router with ${pagesDir.length} page(s). Routes are defined in the \`pages/\` directory.`;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const routeFiles = this.getFilesMatching(context, /routes|router/);
|
|
159
|
+
if (routeFiles.length > 0) {
|
|
160
|
+
return `The project uses explicit routing configuration with ${routeFiles.length} route file(s).`;
|
|
161
|
+
}
|
|
162
|
+
return 'Routing structure not clearly identified. May use default framework routing or custom implementation.';
|
|
163
|
+
}
|
|
164
|
+
identifyStateManagement(context) {
|
|
165
|
+
const deps = {
|
|
166
|
+
...context.packageJson?.dependencies,
|
|
167
|
+
...context.packageJson?.devDependencies,
|
|
168
|
+
};
|
|
169
|
+
if (deps?.['redux'] || deps?.['@reduxjs/toolkit']) {
|
|
170
|
+
return '**Redux** - Centralized state management with predictable state updates';
|
|
171
|
+
}
|
|
172
|
+
if (deps?.['zustand']) {
|
|
173
|
+
return '**Zustand** - Lightweight state management with hooks-based API';
|
|
174
|
+
}
|
|
175
|
+
if (deps?.['mobx']) {
|
|
176
|
+
return '**MobX** - Reactive state management with observable state';
|
|
177
|
+
}
|
|
178
|
+
if (deps?.['recoil']) {
|
|
179
|
+
return '**Recoil** - Atomic state management for React';
|
|
180
|
+
}
|
|
181
|
+
const hasContext = this.getFilesMatching(context, /context|provider/).length > 0;
|
|
182
|
+
if (hasContext) {
|
|
183
|
+
return '**React Context API** - Built-in state management using Context and Providers';
|
|
184
|
+
}
|
|
185
|
+
return 'State management appears to use local component state or is not clearly identified.';
|
|
186
|
+
}
|
|
187
|
+
identifyDesignDecisions(context) {
|
|
188
|
+
const decisions = [];
|
|
189
|
+
// TypeScript usage
|
|
190
|
+
const tsFiles = this.filterFilesByExtension(context, ['.ts', '.tsx']).length;
|
|
191
|
+
const jsFiles = this.filterFilesByExtension(context, ['.js', '.jsx']).length;
|
|
192
|
+
if (tsFiles > jsFiles) {
|
|
193
|
+
decisions.push('**TypeScript** - Chosen for type safety and better developer experience');
|
|
194
|
+
}
|
|
195
|
+
// Monorepo detection
|
|
196
|
+
const hasWorkspaces = context.packageJson?.workspaces;
|
|
197
|
+
if (hasWorkspaces) {
|
|
198
|
+
decisions.push('**Monorepo Structure** - Multiple packages managed in a single repository');
|
|
199
|
+
}
|
|
200
|
+
// API architecture
|
|
201
|
+
const hasApi = this.getFilesMatching(context, /api/).length > 0;
|
|
202
|
+
if (hasApi) {
|
|
203
|
+
decisions.push('**API-First Design** - Clear separation between frontend and backend logic');
|
|
204
|
+
}
|
|
205
|
+
// Testing
|
|
206
|
+
const hasTests = this.getFilesMatching(context, /test|spec/).length > 0;
|
|
207
|
+
if (hasTests) {
|
|
208
|
+
decisions.push('**Test-Driven Approach** - Includes automated testing infrastructure');
|
|
209
|
+
}
|
|
210
|
+
if (decisions.length === 0) {
|
|
211
|
+
decisions.push('Design decisions follow standard practices for the chosen framework');
|
|
212
|
+
}
|
|
213
|
+
return this.formatList(decisions);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
exports.ArchitectureAnalyzer = ArchitectureAnalyzer;
|
|
217
|
+
//# sourceMappingURL=ArchitectureAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArchitectureAnalyzer.js","sourceRoot":"","sources":["../../src/analyzers/ArchitectureAnalyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BaseAnalyzer } from './base/BaseAnalyzer';
|
|
2
|
+
import { ProjectContext, AnalysisOutput } from '../types';
|
|
3
|
+
export declare class FeaturesAnalyzer extends BaseAnalyzer {
|
|
4
|
+
name: string;
|
|
5
|
+
outputPath: string;
|
|
6
|
+
category: 'general' | 'tech';
|
|
7
|
+
analyze(context: ProjectContext): Promise<AnalysisOutput>;
|
|
8
|
+
private identifyCoreFeatures;
|
|
9
|
+
private inferFeaturesFromStructure;
|
|
10
|
+
private documentApiEndpoints;
|
|
11
|
+
private extractEndpoints;
|
|
12
|
+
private analyzeAuthentication;
|
|
13
|
+
private analyzeUserInterface;
|
|
14
|
+
private analyzeDataManagement;
|
|
15
|
+
private identifyIntegrations;
|
|
16
|
+
private describeUserFlows;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=FeaturesAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeaturesAnalyzer.d.ts","sourceRoot":"","sources":["../../src/analyzers/FeaturesAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAY,MAAM,UAAU,CAAC;AAEpE,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,IAAI,SAAc;IAClB,UAAU,SAAsB;IAChC,QAAQ,EAAE,SAAS,GAAG,MAAM,CAAU;IAEhC,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAkB/D,OAAO,CAAC,oBAAoB;IA6B5B,OAAO,CAAC,0BAA0B;IAyClC,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,qBAAqB;IA+B7B,OAAO,CAAC,oBAAoB;IAqC5B,OAAO,CAAC,qBAAqB;IAmC7B,OAAO,CAAC,oBAAoB;IA2C5B,OAAO,CAAC,iBAAiB;CA+B1B"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FeaturesAnalyzer = void 0;
|
|
4
|
+
const BaseAnalyzer_1 = require("./base/BaseAnalyzer");
|
|
5
|
+
class FeaturesAnalyzer extends BaseAnalyzer_1.BaseAnalyzer {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(...arguments);
|
|
8
|
+
this.name = 'features';
|
|
9
|
+
this.outputPath = 'tech/features.md';
|
|
10
|
+
this.category = 'tech';
|
|
11
|
+
}
|
|
12
|
+
async analyze(context) {
|
|
13
|
+
const metadata = this.extractMetadata(context);
|
|
14
|
+
return {
|
|
15
|
+
title: 'Features',
|
|
16
|
+
sections: [
|
|
17
|
+
this.createSection('Core Features', this.identifyCoreFeatures(context)),
|
|
18
|
+
this.createSection('API Endpoints', this.documentApiEndpoints(context)),
|
|
19
|
+
this.createSection('Authentication', this.analyzeAuthentication(context)),
|
|
20
|
+
this.createSection('User Interface', this.analyzeUserInterface(context)),
|
|
21
|
+
this.createSection('Data Management', this.analyzeDataManagement(context)),
|
|
22
|
+
this.createSection('Integration Points', this.identifyIntegrations(context)),
|
|
23
|
+
this.createSection('User Flows', this.describeUserFlows(context)),
|
|
24
|
+
],
|
|
25
|
+
metadata,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
identifyCoreFeatures(context) {
|
|
29
|
+
const features = [];
|
|
30
|
+
// Try to extract from README
|
|
31
|
+
if (context.readme) {
|
|
32
|
+
const featuresMatch = context.readme.match(/##\s*Features?\s*\n([\s\S]*?)(?=\n##|$)/i);
|
|
33
|
+
if (featuresMatch) {
|
|
34
|
+
const extractedFeatures = featuresMatch[1]
|
|
35
|
+
.split('\n')
|
|
36
|
+
.filter((line) => line.trim().startsWith('-') || line.trim().startsWith('*'))
|
|
37
|
+
.map((line) => line.replace(/^[-*]\s*/, '').trim())
|
|
38
|
+
.filter((line) => line.length > 0);
|
|
39
|
+
features.push(...extractedFeatures);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// If no features found in README, analyze project structure
|
|
43
|
+
if (features.length === 0) {
|
|
44
|
+
features.push(...this.inferFeaturesFromStructure(context));
|
|
45
|
+
}
|
|
46
|
+
if (features.length === 0) {
|
|
47
|
+
return 'Core features should be documented in the README.md file.';
|
|
48
|
+
}
|
|
49
|
+
return this.formatList(features);
|
|
50
|
+
}
|
|
51
|
+
inferFeaturesFromStructure(context) {
|
|
52
|
+
const features = [];
|
|
53
|
+
const hasAuth = this.getFilesMatching(context, /auth|login|signup/).length > 0;
|
|
54
|
+
if (hasAuth) {
|
|
55
|
+
features.push('User authentication and authorization');
|
|
56
|
+
}
|
|
57
|
+
const hasApi = this.getFilesMatching(context, /api/).length > 0;
|
|
58
|
+
if (hasApi) {
|
|
59
|
+
features.push('RESTful API endpoints');
|
|
60
|
+
}
|
|
61
|
+
const hasDashboard = this.getFilesMatching(context, /dashboard/).length > 0;
|
|
62
|
+
if (hasDashboard) {
|
|
63
|
+
features.push('User dashboard interface');
|
|
64
|
+
}
|
|
65
|
+
const hasAdmin = this.getFilesMatching(context, /admin/).length > 0;
|
|
66
|
+
if (hasAdmin) {
|
|
67
|
+
features.push('Administrative panel');
|
|
68
|
+
}
|
|
69
|
+
const hasChat = this.getFilesMatching(context, /chat|message/).length > 0;
|
|
70
|
+
if (hasChat) {
|
|
71
|
+
features.push('Real-time messaging or chat functionality');
|
|
72
|
+
}
|
|
73
|
+
const hasUpload = this.getFilesMatching(context, /upload|file/).length > 0;
|
|
74
|
+
if (hasUpload) {
|
|
75
|
+
features.push('File upload and management');
|
|
76
|
+
}
|
|
77
|
+
const hasSearch = this.getFilesMatching(context, /search/).length > 0;
|
|
78
|
+
if (hasSearch) {
|
|
79
|
+
features.push('Search functionality');
|
|
80
|
+
}
|
|
81
|
+
return features;
|
|
82
|
+
}
|
|
83
|
+
documentApiEndpoints(context) {
|
|
84
|
+
const apiFiles = this.getFilesMatching(context, /api.*route\.(ts|js)|api.*\[.*\]/);
|
|
85
|
+
if (apiFiles.length === 0) {
|
|
86
|
+
return 'No API endpoints detected in the project structure.';
|
|
87
|
+
}
|
|
88
|
+
let documentation = `The project includes ${apiFiles.length} API endpoint(s):\n\n`;
|
|
89
|
+
const endpoints = this.extractEndpoints(apiFiles);
|
|
90
|
+
for (const endpoint of endpoints.slice(0, 15)) {
|
|
91
|
+
documentation += `- **${endpoint.method}** \`${endpoint.path}\` - ${endpoint.description}\n`;
|
|
92
|
+
}
|
|
93
|
+
if (endpoints.length > 15) {
|
|
94
|
+
documentation += `\n...and ${endpoints.length - 15} more endpoints`;
|
|
95
|
+
}
|
|
96
|
+
return documentation;
|
|
97
|
+
}
|
|
98
|
+
extractEndpoints(files) {
|
|
99
|
+
const endpoints = [];
|
|
100
|
+
for (const file of files) {
|
|
101
|
+
// Extract path from file structure
|
|
102
|
+
const pathMatch = file.relativePath.match(/api\/(.*?)\/route\.(ts|js)/);
|
|
103
|
+
if (pathMatch) {
|
|
104
|
+
const path = `/api/${pathMatch[1]}`;
|
|
105
|
+
// Infer methods based on common patterns
|
|
106
|
+
if (path.includes('[id]')) {
|
|
107
|
+
endpoints.push({ method: 'GET', path: path.replace('[id]', ':id'), description: 'Retrieve specific resource' });
|
|
108
|
+
endpoints.push({ method: 'PUT', path: path.replace('[id]', ':id'), description: 'Update specific resource' });
|
|
109
|
+
endpoints.push({ method: 'DELETE', path: path.replace('[id]', ':id'), description: 'Delete specific resource' });
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
endpoints.push({ method: 'GET', path, description: 'List resources' });
|
|
113
|
+
endpoints.push({ method: 'POST', path, description: 'Create new resource' });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return endpoints;
|
|
118
|
+
}
|
|
119
|
+
analyzeAuthentication(context) {
|
|
120
|
+
const deps = {
|
|
121
|
+
...context.packageJson?.dependencies,
|
|
122
|
+
...context.packageJson?.devDependencies,
|
|
123
|
+
};
|
|
124
|
+
const authFiles = this.getFilesMatching(context, /auth|login|signup/).length;
|
|
125
|
+
if (deps?.['next-auth'] || deps?.['@auth/core']) {
|
|
126
|
+
return '**NextAuth.js** - Authentication is implemented using NextAuth.js, providing support for multiple authentication providers and session management.';
|
|
127
|
+
}
|
|
128
|
+
if (deps?.['@supabase/supabase-js']) {
|
|
129
|
+
return '**Supabase Auth** - Authentication is handled by Supabase, providing email/password authentication, OAuth providers, and session management.';
|
|
130
|
+
}
|
|
131
|
+
if (deps?.['passport']) {
|
|
132
|
+
return '**Passport.js** - Authentication middleware for Node.js supporting various strategies.';
|
|
133
|
+
}
|
|
134
|
+
if (deps?.['jsonwebtoken']) {
|
|
135
|
+
return '**JWT (JSON Web Tokens)** - Custom authentication implementation using JWT for stateless authentication.';
|
|
136
|
+
}
|
|
137
|
+
if (authFiles > 0) {
|
|
138
|
+
return `Authentication functionality detected (${authFiles} related files). Implementation details should be reviewed in the codebase.`;
|
|
139
|
+
}
|
|
140
|
+
return 'No authentication system detected in the project.';
|
|
141
|
+
}
|
|
142
|
+
analyzeUserInterface(context) {
|
|
143
|
+
const componentFiles = this.getFilesMatching(context, /components/);
|
|
144
|
+
const pageFiles = this.getFilesMatching(context, /pages|app.*page/);
|
|
145
|
+
if (componentFiles.length === 0 && pageFiles.length === 0) {
|
|
146
|
+
return 'No UI components detected. This may be a backend-only project.';
|
|
147
|
+
}
|
|
148
|
+
let ui = `The user interface consists of:\n\n`;
|
|
149
|
+
if (pageFiles.length > 0) {
|
|
150
|
+
ui += `- **${pageFiles.length} page(s)** defining main application routes\n`;
|
|
151
|
+
}
|
|
152
|
+
if (componentFiles.length > 0) {
|
|
153
|
+
ui += `- **${componentFiles.length} component(s)** for reusable UI elements\n`;
|
|
154
|
+
}
|
|
155
|
+
// Identify UI library
|
|
156
|
+
const deps = {
|
|
157
|
+
...context.packageJson?.dependencies,
|
|
158
|
+
...context.packageJson?.devDependencies,
|
|
159
|
+
};
|
|
160
|
+
if (deps?.['@heroui/react']) {
|
|
161
|
+
ui += '\n**UI Library**: HeroUI - Pre-styled, accessible React components';
|
|
162
|
+
}
|
|
163
|
+
else if (deps?.['@mui/material']) {
|
|
164
|
+
ui += '\n**UI Library**: Material-UI - React components implementing Material Design';
|
|
165
|
+
}
|
|
166
|
+
else if (deps?.['@radix-ui/react']) {
|
|
167
|
+
ui += '\n**UI Library**: Radix UI - Unstyled, accessible component primitives';
|
|
168
|
+
}
|
|
169
|
+
else if (deps?.['tailwindcss']) {
|
|
170
|
+
ui += '\n**Styling**: Tailwind CSS - Utility-first CSS framework';
|
|
171
|
+
}
|
|
172
|
+
return ui;
|
|
173
|
+
}
|
|
174
|
+
analyzeDataManagement(context) {
|
|
175
|
+
const deps = {
|
|
176
|
+
...context.packageJson?.dependencies,
|
|
177
|
+
...context.packageJson?.devDependencies,
|
|
178
|
+
};
|
|
179
|
+
const dataStrategies = [];
|
|
180
|
+
if (deps?.['@supabase/supabase-js']) {
|
|
181
|
+
dataStrategies.push('**Supabase** - Real-time database with PostgreSQL');
|
|
182
|
+
}
|
|
183
|
+
if (deps?.['@prisma/client']) {
|
|
184
|
+
dataStrategies.push('**Prisma ORM** - Type-safe database access');
|
|
185
|
+
}
|
|
186
|
+
if (deps?.['mongoose']) {
|
|
187
|
+
dataStrategies.push('**Mongoose** - MongoDB object modeling');
|
|
188
|
+
}
|
|
189
|
+
if (deps?.['swr'] || deps?.['@tanstack/react-query']) {
|
|
190
|
+
dataStrategies.push('**Data Fetching** - Optimized data fetching with caching');
|
|
191
|
+
}
|
|
192
|
+
if (deps?.['axios']) {
|
|
193
|
+
dataStrategies.push('**HTTP Client** - Axios for API requests');
|
|
194
|
+
}
|
|
195
|
+
if (dataStrategies.length === 0) {
|
|
196
|
+
return 'Data management strategy not clearly identified from dependencies.';
|
|
197
|
+
}
|
|
198
|
+
return this.formatList(dataStrategies);
|
|
199
|
+
}
|
|
200
|
+
identifyIntegrations(context) {
|
|
201
|
+
const deps = {
|
|
202
|
+
...context.packageJson?.dependencies,
|
|
203
|
+
...context.packageJson?.devDependencies,
|
|
204
|
+
};
|
|
205
|
+
const integrations = [];
|
|
206
|
+
if (deps?.['@supabase/supabase-js']) {
|
|
207
|
+
integrations.push('**Supabase** - Backend-as-a-Service platform');
|
|
208
|
+
}
|
|
209
|
+
if (deps?.['stripe']) {
|
|
210
|
+
integrations.push('**Stripe** - Payment processing');
|
|
211
|
+
}
|
|
212
|
+
if (deps?.['@sendgrid/mail'] || deps?.['nodemailer']) {
|
|
213
|
+
integrations.push('**Email Service** - Transactional email sending');
|
|
214
|
+
}
|
|
215
|
+
if (deps?.['aws-sdk'] || deps?.['@aws-sdk/client-s3']) {
|
|
216
|
+
integrations.push('**AWS** - Cloud services integration');
|
|
217
|
+
}
|
|
218
|
+
if (deps?.['openai']) {
|
|
219
|
+
integrations.push('**OpenAI** - AI/ML capabilities');
|
|
220
|
+
}
|
|
221
|
+
if (deps?.['@vercel/analytics']) {
|
|
222
|
+
integrations.push('**Vercel Analytics** - Web analytics');
|
|
223
|
+
}
|
|
224
|
+
if (deps?.['socket.io'] || deps?.['socket.io-client']) {
|
|
225
|
+
integrations.push('**Socket.IO** - Real-time bidirectional communication');
|
|
226
|
+
}
|
|
227
|
+
if (integrations.length === 0) {
|
|
228
|
+
return 'No external integrations detected from dependencies.';
|
|
229
|
+
}
|
|
230
|
+
return this.formatList(integrations);
|
|
231
|
+
}
|
|
232
|
+
describeUserFlows(context) {
|
|
233
|
+
const hasAuth = this.getFilesMatching(context, /auth|login/).length > 0;
|
|
234
|
+
const hasDashboard = this.getFilesMatching(context, /dashboard/).length > 0;
|
|
235
|
+
const hasProfile = this.getFilesMatching(context, /profile|settings/).length > 0;
|
|
236
|
+
const flows = [];
|
|
237
|
+
if (hasAuth) {
|
|
238
|
+
flows.push('**Authentication Flow**: User registration → Email verification → Login → Access protected routes');
|
|
239
|
+
}
|
|
240
|
+
if (hasDashboard) {
|
|
241
|
+
flows.push('**Dashboard Flow**: Login → View dashboard → Access features → Manage data');
|
|
242
|
+
}
|
|
243
|
+
if (hasProfile) {
|
|
244
|
+
flows.push('**Profile Management**: Access settings → Update profile → Save changes → Confirmation');
|
|
245
|
+
}
|
|
246
|
+
// Generic flow based on project type
|
|
247
|
+
const hasApi = this.getFilesMatching(context, /api/).length > 0;
|
|
248
|
+
if (hasApi && flows.length === 0) {
|
|
249
|
+
flows.push('**Data Flow**: User action → API request → Data processing → Response → UI update');
|
|
250
|
+
}
|
|
251
|
+
if (flows.length === 0) {
|
|
252
|
+
return 'User flows should be documented based on specific application features.';
|
|
253
|
+
}
|
|
254
|
+
return this.formatList(flows);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
exports.FeaturesAnalyzer = FeaturesAnalyzer;
|
|
258
|
+
//# sourceMappingURL=FeaturesAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeaturesAnalyzer.js","sourceRoot":"","sources":["../../src/analyzers/FeaturesAnalyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BaseAnalyzer } from './base/BaseAnalyzer';
|
|
2
|
+
import { ProjectContext, AnalysisOutput } from '../types';
|
|
3
|
+
export declare class ImpactAnalyzer extends BaseAnalyzer {
|
|
4
|
+
name: string;
|
|
5
|
+
outputPath: string;
|
|
6
|
+
category: 'general' | 'tech';
|
|
7
|
+
analyze(context: ProjectContext): Promise<AnalysisOutput>;
|
|
8
|
+
private extractProblemStatement;
|
|
9
|
+
private analyzeRootCause;
|
|
10
|
+
private describeSolution;
|
|
11
|
+
private describeImpact;
|
|
12
|
+
private defineSuccessMetrics;
|
|
13
|
+
private identifyTargetUsers;
|
|
14
|
+
private determineProjectType;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=ImpactAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImpactAnalyzer.d.ts","sourceRoot":"","sources":["../../src/analyzers/ImpactAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1D,qBAAa,cAAe,SAAQ,YAAY;IAC9C,IAAI,SAAoB;IACxB,UAAU,SAA+B;IACzC,QAAQ,EAAE,SAAS,GAAG,MAAM,CAAa;IAEnC,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAiB/D,OAAO,CAAC,uBAAuB;IA0B/B,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,gBAAgB;IAkCxB,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,oBAAoB;IAyB5B,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,oBAAoB;CAkB7B"}
|