@wtdlee/repomap 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/LICENSE +21 -0
- package/README.md +527 -0
- package/dist/analyzers/base-analyzer.d.ts +46 -0
- package/dist/analyzers/base-analyzer.d.ts.map +1 -0
- package/dist/analyzers/base-analyzer.js +48 -0
- package/dist/analyzers/base-analyzer.js.map +1 -0
- package/dist/analyzers/dataflow-analyzer.d.ts +30 -0
- package/dist/analyzers/dataflow-analyzer.d.ts.map +1 -0
- package/dist/analyzers/dataflow-analyzer.js +426 -0
- package/dist/analyzers/dataflow-analyzer.js.map +1 -0
- package/dist/analyzers/graphql-analyzer.d.ts +23 -0
- package/dist/analyzers/graphql-analyzer.d.ts.map +1 -0
- package/dist/analyzers/graphql-analyzer.js +387 -0
- package/dist/analyzers/graphql-analyzer.js.map +1 -0
- package/dist/analyzers/index.d.ts +6 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +6 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/pages-analyzer.d.ts +85 -0
- package/dist/analyzers/pages-analyzer.d.ts.map +1 -0
- package/dist/analyzers/pages-analyzer.js +1696 -0
- package/dist/analyzers/pages-analyzer.js.map +1 -0
- package/dist/analyzers/rails/index.d.ts +47 -0
- package/dist/analyzers/rails/index.d.ts.map +1 -0
- package/dist/analyzers/rails/index.js +146 -0
- package/dist/analyzers/rails/index.js.map +1 -0
- package/dist/analyzers/rails/rails-controller-analyzer.d.ts +83 -0
- package/dist/analyzers/rails/rails-controller-analyzer.d.ts.map +1 -0
- package/dist/analyzers/rails/rails-controller-analyzer.js +479 -0
- package/dist/analyzers/rails/rails-controller-analyzer.js.map +1 -0
- package/dist/analyzers/rails/rails-grpc-analyzer.d.ts +45 -0
- package/dist/analyzers/rails/rails-grpc-analyzer.d.ts.map +1 -0
- package/dist/analyzers/rails/rails-grpc-analyzer.js +263 -0
- package/dist/analyzers/rails/rails-grpc-analyzer.js.map +1 -0
- package/dist/analyzers/rails/rails-model-analyzer.d.ts +89 -0
- package/dist/analyzers/rails/rails-model-analyzer.d.ts.map +1 -0
- package/dist/analyzers/rails/rails-model-analyzer.js +494 -0
- package/dist/analyzers/rails/rails-model-analyzer.js.map +1 -0
- package/dist/analyzers/rails/rails-react-analyzer.d.ts +42 -0
- package/dist/analyzers/rails/rails-react-analyzer.d.ts.map +1 -0
- package/dist/analyzers/rails/rails-react-analyzer.js +530 -0
- package/dist/analyzers/rails/rails-react-analyzer.js.map +1 -0
- package/dist/analyzers/rails/rails-routes-analyzer.d.ts +63 -0
- package/dist/analyzers/rails/rails-routes-analyzer.d.ts.map +1 -0
- package/dist/analyzers/rails/rails-routes-analyzer.js +541 -0
- package/dist/analyzers/rails/rails-routes-analyzer.js.map +1 -0
- package/dist/analyzers/rails/rails-view-analyzer.d.ts +50 -0
- package/dist/analyzers/rails/rails-view-analyzer.d.ts.map +1 -0
- package/dist/analyzers/rails/rails-view-analyzer.js +387 -0
- package/dist/analyzers/rails/rails-view-analyzer.js.map +1 -0
- package/dist/analyzers/rails/ruby-parser.d.ts +64 -0
- package/dist/analyzers/rails/ruby-parser.d.ts.map +1 -0
- package/dist/analyzers/rails/ruby-parser.js +213 -0
- package/dist/analyzers/rails/ruby-parser.js.map +1 -0
- package/dist/analyzers/rest-api-analyzer.d.ts +66 -0
- package/dist/analyzers/rest-api-analyzer.d.ts.map +1 -0
- package/dist/analyzers/rest-api-analyzer.js +480 -0
- package/dist/analyzers/rest-api-analyzer.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +550 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/cache.d.ts +48 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +152 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/engine.d.ts +47 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +320 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/generators/assets/common.css +187 -0
- package/dist/generators/assets/docs.css +363 -0
- package/dist/generators/assets/page-map.css +305 -0
- package/dist/generators/assets/rails-map.css +473 -0
- package/dist/generators/index.d.ts +4 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +4 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/markdown-generator.d.ts +26 -0
- package/dist/generators/markdown-generator.d.ts.map +1 -0
- package/dist/generators/markdown-generator.js +783 -0
- package/dist/generators/markdown-generator.js.map +1 -0
- package/dist/generators/mermaid-generator.d.ts +36 -0
- package/dist/generators/mermaid-generator.d.ts.map +1 -0
- package/dist/generators/mermaid-generator.js +365 -0
- package/dist/generators/mermaid-generator.js.map +1 -0
- package/dist/generators/page-map-generator.d.ts +23 -0
- package/dist/generators/page-map-generator.d.ts.map +1 -0
- package/dist/generators/page-map-generator.js +3563 -0
- package/dist/generators/page-map-generator.js.map +1 -0
- package/dist/generators/rails-map-generator.d.ts +22 -0
- package/dist/generators/rails-map-generator.d.ts.map +1 -0
- package/dist/generators/rails-map-generator.js +909 -0
- package/dist/generators/rails-map-generator.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/server/doc-server.d.ts +31 -0
- package/dist/server/doc-server.d.ts.map +1 -0
- package/dist/server/doc-server.js +1233 -0
- package/dist/server/doc-server.js.map +1 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -0
- package/dist/types.d.ts +294 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/env-detector.d.ts +32 -0
- package/dist/utils/env-detector.d.ts.map +1 -0
- package/dist/utils/env-detector.js +189 -0
- package/dist/utils/env-detector.js.map +1 -0
- package/dist/utils/parallel.d.ts +24 -0
- package/dist/utils/parallel.d.ts.map +1 -0
- package/dist/utils/parallel.js +71 -0
- package/dist/utils/parallel.js.map +1 -0
- package/package.json +131 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,550 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import * as fs from 'fs/promises';
|
|
6
|
+
import { DocGeneratorEngine } from './core/engine.js';
|
|
7
|
+
import { DocServer } from './server/doc-server.js';
|
|
8
|
+
const program = new Command();
|
|
9
|
+
program
|
|
10
|
+
.name('repomap')
|
|
11
|
+
.description('Interactive documentation generator for code repositories')
|
|
12
|
+
.version('0.1.0');
|
|
13
|
+
/**
|
|
14
|
+
* Auto-detect project type and settings
|
|
15
|
+
*/
|
|
16
|
+
async function detectProject(dir) {
|
|
17
|
+
const dirName = path.basename(dir);
|
|
18
|
+
let isRails = false;
|
|
19
|
+
// Check for Rails project first
|
|
20
|
+
const gemfilePath = path.join(dir, 'Gemfile');
|
|
21
|
+
const routesPath = path.join(dir, 'config', 'routes.rb');
|
|
22
|
+
try {
|
|
23
|
+
await fs.access(gemfilePath);
|
|
24
|
+
await fs.access(routesPath);
|
|
25
|
+
// This is a Rails project
|
|
26
|
+
const gemfile = await fs.readFile(gemfilePath, 'utf-8');
|
|
27
|
+
isRails = gemfile.includes("gem 'rails'") || gemfile.includes('gem "rails"');
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Not a Rails project, continue checking
|
|
31
|
+
}
|
|
32
|
+
const packageJsonPath = path.join(dir, 'package.json');
|
|
33
|
+
let hasReact = false;
|
|
34
|
+
let hasNextjs = false;
|
|
35
|
+
const settings = {};
|
|
36
|
+
try {
|
|
37
|
+
const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf-8'));
|
|
38
|
+
// Detect project type
|
|
39
|
+
const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };
|
|
40
|
+
hasReact = !!deps['react'];
|
|
41
|
+
hasNextjs = !!deps['next'];
|
|
42
|
+
// Check common Next.js structures
|
|
43
|
+
const possiblePagesDirs = ['src/pages', 'pages', 'app', 'src/app', 'frontend/src'];
|
|
44
|
+
for (const pagesDir of possiblePagesDirs) {
|
|
45
|
+
try {
|
|
46
|
+
await fs.access(path.join(dir, pagesDir));
|
|
47
|
+
settings.pagesDir = pagesDir;
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
catch { }
|
|
51
|
+
}
|
|
52
|
+
// Check for features directory
|
|
53
|
+
const possibleFeaturesDirs = [
|
|
54
|
+
'src/features',
|
|
55
|
+
'features',
|
|
56
|
+
'src/modules',
|
|
57
|
+
'modules',
|
|
58
|
+
'frontend/src',
|
|
59
|
+
];
|
|
60
|
+
for (const featuresDir of possibleFeaturesDirs) {
|
|
61
|
+
try {
|
|
62
|
+
await fs.access(path.join(dir, featuresDir));
|
|
63
|
+
settings.featuresDir = featuresDir;
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
catch { }
|
|
67
|
+
}
|
|
68
|
+
// Check for components directory
|
|
69
|
+
const possibleComponentsDirs = [
|
|
70
|
+
'src/components',
|
|
71
|
+
'components',
|
|
72
|
+
'src/common/components',
|
|
73
|
+
'frontend/src',
|
|
74
|
+
];
|
|
75
|
+
for (const componentsDir of possibleComponentsDirs) {
|
|
76
|
+
try {
|
|
77
|
+
await fs.access(path.join(dir, componentsDir));
|
|
78
|
+
settings.componentsDir = componentsDir;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
catch { }
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// No package.json
|
|
86
|
+
}
|
|
87
|
+
// Build analyzers list based on detected environments
|
|
88
|
+
const analyzers = [];
|
|
89
|
+
// Add frontend analyzers if React/Next.js detected
|
|
90
|
+
if (hasReact || hasNextjs) {
|
|
91
|
+
analyzers.push('pages', 'graphql', 'dataflow', 'rest-api');
|
|
92
|
+
}
|
|
93
|
+
// Rails analyzers are handled separately via Rails analysis
|
|
94
|
+
// Determine project type
|
|
95
|
+
let type = 'generic';
|
|
96
|
+
if (hasNextjs) {
|
|
97
|
+
type = 'nextjs';
|
|
98
|
+
}
|
|
99
|
+
else if (isRails) {
|
|
100
|
+
type = 'rails';
|
|
101
|
+
}
|
|
102
|
+
// If nothing detected, return null
|
|
103
|
+
if (!isRails && !hasReact && !hasNextjs) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
name: dirName,
|
|
108
|
+
displayName: dirName,
|
|
109
|
+
description: isRails && hasReact ? 'Rails + React application' : isRails ? 'Rails application' : '',
|
|
110
|
+
path: dir,
|
|
111
|
+
branch: 'main',
|
|
112
|
+
type,
|
|
113
|
+
analyzers,
|
|
114
|
+
settings,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Create default config for current directory
|
|
119
|
+
*/
|
|
120
|
+
async function createDefaultConfig(cwd) {
|
|
121
|
+
const project = await detectProject(cwd);
|
|
122
|
+
if (!project) {
|
|
123
|
+
throw new Error("Could not detect project. Please create a repomap.config.ts file or run 'repomap init'.");
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
outputDir: './.repomap',
|
|
127
|
+
site: {
|
|
128
|
+
title: `${project.displayName} Documentation`,
|
|
129
|
+
description: 'Auto-generated documentation',
|
|
130
|
+
baseUrl: '/docs',
|
|
131
|
+
},
|
|
132
|
+
repositories: [project],
|
|
133
|
+
analysis: {
|
|
134
|
+
include: ['**/*.tsx', '**/*.ts'],
|
|
135
|
+
exclude: [
|
|
136
|
+
'**/node_modules/**',
|
|
137
|
+
'**/__tests__/**',
|
|
138
|
+
'**/*.test.*',
|
|
139
|
+
'**/*.spec.*',
|
|
140
|
+
'**/dist/**',
|
|
141
|
+
'**/.next/**',
|
|
142
|
+
],
|
|
143
|
+
maxDepth: 5,
|
|
144
|
+
},
|
|
145
|
+
diagrams: {
|
|
146
|
+
enabled: true,
|
|
147
|
+
types: ['flowchart', 'sequence'],
|
|
148
|
+
theme: 'default',
|
|
149
|
+
},
|
|
150
|
+
watch: {
|
|
151
|
+
enabled: false,
|
|
152
|
+
debounce: 1000,
|
|
153
|
+
},
|
|
154
|
+
integrations: {
|
|
155
|
+
github: { enabled: false, organization: '' },
|
|
156
|
+
slack: { enabled: false },
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Load config from file or auto-detect
|
|
162
|
+
*/
|
|
163
|
+
async function loadConfig(configPath, cwd) {
|
|
164
|
+
// Try to load config file
|
|
165
|
+
const configFiles = configPath
|
|
166
|
+
? [configPath]
|
|
167
|
+
: ['repomap.config.ts', 'repomap.config.js', 'repomap.config.mjs'];
|
|
168
|
+
for (const file of configFiles) {
|
|
169
|
+
const fullPath = path.resolve(cwd, file);
|
|
170
|
+
try {
|
|
171
|
+
await fs.access(fullPath);
|
|
172
|
+
console.log(chalk.gray(`Loading config from: ${fullPath}`));
|
|
173
|
+
const module = await import(fullPath);
|
|
174
|
+
return module.config || module.default;
|
|
175
|
+
}
|
|
176
|
+
catch { }
|
|
177
|
+
}
|
|
178
|
+
// No config file, auto-detect
|
|
179
|
+
console.log(chalk.gray('No config file found, auto-detecting project...'));
|
|
180
|
+
return createDefaultConfig(cwd);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Generate command - generates documentation
|
|
184
|
+
*/
|
|
185
|
+
program
|
|
186
|
+
.command('generate')
|
|
187
|
+
.description('Generate documentation from source code')
|
|
188
|
+
.option('-c, --config <path>', 'Path to config file')
|
|
189
|
+
.option('-o, --output <path>', 'Output directory')
|
|
190
|
+
.option('--repo <name>', 'Analyze specific repository only')
|
|
191
|
+
.option('--watch', 'Watch for changes and regenerate')
|
|
192
|
+
.option('--no-cache', 'Disable caching (always analyze from scratch)')
|
|
193
|
+
.option('--format <type>', 'Output format: json, html, markdown (default: all)', 'all')
|
|
194
|
+
.option('--ci', 'CI mode: minimal output, exit codes for errors')
|
|
195
|
+
.option('--static', 'Generate standalone HTML files (for GitHub Pages)')
|
|
196
|
+
.action(async (options) => {
|
|
197
|
+
const isCI = options.ci || process.env.CI === 'true';
|
|
198
|
+
if (!isCI) {
|
|
199
|
+
console.log(chalk.blue.bold('\nš Repomap - Documentation Generator\n'));
|
|
200
|
+
}
|
|
201
|
+
try {
|
|
202
|
+
const cwd = process.cwd();
|
|
203
|
+
const config = await loadConfig(options.config, cwd);
|
|
204
|
+
// Override output if specified
|
|
205
|
+
if (options.output) {
|
|
206
|
+
config.outputDir = options.output;
|
|
207
|
+
}
|
|
208
|
+
// Filter repositories if specified
|
|
209
|
+
if (options.repo) {
|
|
210
|
+
config.repositories = config.repositories.filter((r) => r.name === options.repo);
|
|
211
|
+
if (config.repositories.length === 0) {
|
|
212
|
+
console.error(chalk.red(`Repository "${options.repo}" not found in config`));
|
|
213
|
+
process.exit(1);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// Create engine and generate
|
|
217
|
+
const engine = new DocGeneratorEngine(config, { noCache: !options.cache });
|
|
218
|
+
if (options.watch) {
|
|
219
|
+
console.log(chalk.yellow('\nš Watch mode enabled. Press Ctrl+C to stop.\n'));
|
|
220
|
+
await watchAndGenerate(engine, config);
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
const report = await engine.generate();
|
|
224
|
+
// Handle different output formats
|
|
225
|
+
if (options.format === 'json' || options.static) {
|
|
226
|
+
const jsonPath = path.join(config.outputDir, 'report.json');
|
|
227
|
+
await fs.mkdir(config.outputDir, { recursive: true });
|
|
228
|
+
await fs.writeFile(jsonPath, JSON.stringify(report, null, 2));
|
|
229
|
+
if (!isCI)
|
|
230
|
+
console.log(chalk.green(`š JSON report: ${jsonPath}`));
|
|
231
|
+
}
|
|
232
|
+
// Generate static HTML files for GitHub Pages
|
|
233
|
+
if (options.static) {
|
|
234
|
+
await generateStaticSite(config, report, isCI);
|
|
235
|
+
}
|
|
236
|
+
if (!isCI) {
|
|
237
|
+
printSummary(report);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
// CI mode: minimal output
|
|
241
|
+
const totalPages = report.repositories.reduce((sum, r) => sum + r.summary.totalPages, 0);
|
|
242
|
+
console.log(`ā
Generated: ${totalPages} pages, ${report.repositories.length} repos`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
console.error(isCI ? `Error: ${error.message}` : chalk.red('\nā Error:'), error.message);
|
|
248
|
+
process.exit(1);
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
/**
|
|
252
|
+
* Generate static HTML site for GitHub Pages deployment
|
|
253
|
+
*/
|
|
254
|
+
async function generateStaticSite(config, report, isCI) {
|
|
255
|
+
const { PageMapGenerator } = await import('./generators/page-map-generator.js');
|
|
256
|
+
const { detectEnvironments } = await import('./utils/env-detector.js');
|
|
257
|
+
const outputDir = config.outputDir;
|
|
258
|
+
await fs.mkdir(outputDir, { recursive: true });
|
|
259
|
+
// Detect environment for Rails support
|
|
260
|
+
const rootPath = config.repositories[0]?.path || process.cwd();
|
|
261
|
+
const envResult = await detectEnvironments(rootPath);
|
|
262
|
+
let railsAnalysis = null;
|
|
263
|
+
if (envResult.hasRails) {
|
|
264
|
+
const { analyzeRailsApp } = await import('./analyzers/rails/index.js');
|
|
265
|
+
railsAnalysis = await analyzeRailsApp(rootPath);
|
|
266
|
+
}
|
|
267
|
+
// Generate page-map.html
|
|
268
|
+
const pageMapGenerator = new PageMapGenerator();
|
|
269
|
+
const pageMapHtml = pageMapGenerator.generatePageMapHtml(report, {
|
|
270
|
+
envResult,
|
|
271
|
+
railsAnalysis,
|
|
272
|
+
staticMode: true,
|
|
273
|
+
});
|
|
274
|
+
await fs.writeFile(path.join(outputDir, 'index.html'), pageMapHtml);
|
|
275
|
+
if (!isCI)
|
|
276
|
+
console.log(chalk.green(`š Static page map: ${path.join(outputDir, 'index.html')}`));
|
|
277
|
+
// Generate rails-map.html if Rails detected
|
|
278
|
+
if (railsAnalysis) {
|
|
279
|
+
const { RailsMapGenerator } = await import('./generators/rails-map-generator.js');
|
|
280
|
+
const railsGenerator = new RailsMapGenerator();
|
|
281
|
+
const railsHtml = railsGenerator.generateFromResult(railsAnalysis);
|
|
282
|
+
await fs.writeFile(path.join(outputDir, 'rails-map.html'), railsHtml);
|
|
283
|
+
if (!isCI)
|
|
284
|
+
console.log(chalk.green(`š Static Rails map: ${path.join(outputDir, 'rails-map.html')}`));
|
|
285
|
+
}
|
|
286
|
+
// Copy CSS assets
|
|
287
|
+
const cssFiles = ['common.css', 'page-map.css', 'docs.css', 'rails-map.css'];
|
|
288
|
+
const assetsDir = path.join(outputDir, 'assets');
|
|
289
|
+
await fs.mkdir(assetsDir, { recursive: true });
|
|
290
|
+
for (const cssFile of cssFiles) {
|
|
291
|
+
try {
|
|
292
|
+
const cssPath = new URL(`./generators/assets/${cssFile}`, import.meta.url);
|
|
293
|
+
const css = await fs.readFile(cssPath, 'utf-8');
|
|
294
|
+
await fs.writeFile(path.join(assetsDir, cssFile), css);
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
// CSS file not found, skip
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
if (!isCI) {
|
|
301
|
+
console.log(chalk.green(`\nā
Static site generated in: ${outputDir}`));
|
|
302
|
+
console.log(chalk.gray(' Deploy to GitHub Pages or any static hosting'));
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Serve command - starts documentation server
|
|
307
|
+
*/
|
|
308
|
+
program
|
|
309
|
+
.command('serve')
|
|
310
|
+
.description('Start local documentation server with live reload')
|
|
311
|
+
.option('-c, --config <path>', 'Path to config file')
|
|
312
|
+
.option('--path <path>', 'Path to repository to analyze (auto-detect if no config)')
|
|
313
|
+
.option('-p, --port <number>', 'Server port', '3030')
|
|
314
|
+
.option('--no-open', "Don't open browser automatically")
|
|
315
|
+
.option('--no-cache', 'Disable caching (always analyze from scratch)')
|
|
316
|
+
.action(async (options) => {
|
|
317
|
+
console.log(chalk.blue.bold('\nš Repomap - Documentation Server\n'));
|
|
318
|
+
try {
|
|
319
|
+
const targetPath = options.path || process.cwd();
|
|
320
|
+
const config = await loadConfig(options.config, targetPath);
|
|
321
|
+
const server = new DocServer(config, parseInt(options.port), { noCache: !options.cache });
|
|
322
|
+
await server.start(!options.open);
|
|
323
|
+
}
|
|
324
|
+
catch (error) {
|
|
325
|
+
console.error(chalk.red('\nā Error:'), error.message);
|
|
326
|
+
process.exit(1);
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
/**
|
|
330
|
+
* Init command - creates config file
|
|
331
|
+
*/
|
|
332
|
+
program
|
|
333
|
+
.command('init')
|
|
334
|
+
.description('Initialize repomap configuration')
|
|
335
|
+
.option('-f, --force', 'Overwrite existing config')
|
|
336
|
+
.action(async (options) => {
|
|
337
|
+
const configPath = './repomap.config.ts';
|
|
338
|
+
try {
|
|
339
|
+
const exists = await fs
|
|
340
|
+
.access(configPath)
|
|
341
|
+
.then(() => true)
|
|
342
|
+
.catch(() => false);
|
|
343
|
+
if (exists && !options.force) {
|
|
344
|
+
console.log(chalk.yellow('Config file already exists. Use --force to overwrite.'));
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
// Detect current project
|
|
348
|
+
const project = await detectProject(process.cwd());
|
|
349
|
+
const projectName = project?.name || 'my-project';
|
|
350
|
+
const projectType = project?.type || 'nextjs';
|
|
351
|
+
const pagesDir = project?.settings.pagesDir || 'src/pages';
|
|
352
|
+
const featuresDir = project?.settings.featuresDir || 'src/features';
|
|
353
|
+
const componentsDir = project?.settings.componentsDir || 'src/components';
|
|
354
|
+
const templateConfig = `import type { DocGeneratorConfig } from "repomap";
|
|
355
|
+
|
|
356
|
+
export const config: DocGeneratorConfig = {
|
|
357
|
+
outputDir: "./.repomap",
|
|
358
|
+
site: {
|
|
359
|
+
title: "${projectName} Documentation",
|
|
360
|
+
description: "Auto-generated documentation",
|
|
361
|
+
baseUrl: "/docs",
|
|
362
|
+
},
|
|
363
|
+
repositories: [
|
|
364
|
+
{
|
|
365
|
+
name: "${projectName}",
|
|
366
|
+
displayName: "${projectName}",
|
|
367
|
+
description: "Main repository",
|
|
368
|
+
path: ".",
|
|
369
|
+
branch: "main",
|
|
370
|
+
type: "${projectType}",
|
|
371
|
+
analyzers: ["pages", "graphql", "components", "dataflow"],
|
|
372
|
+
settings: {
|
|
373
|
+
pagesDir: "${pagesDir}",
|
|
374
|
+
featuresDir: "${featuresDir}",
|
|
375
|
+
componentsDir: "${componentsDir}",
|
|
376
|
+
},
|
|
377
|
+
},
|
|
378
|
+
// Add more repositories for cross-repo analysis:
|
|
379
|
+
// {
|
|
380
|
+
// name: "other-repo",
|
|
381
|
+
// displayName: "Other Repository",
|
|
382
|
+
// description: "Another repository",
|
|
383
|
+
// path: "../other-repo",
|
|
384
|
+
// branch: "main",
|
|
385
|
+
// type: "nextjs",
|
|
386
|
+
// analyzers: ["pages", "graphql", "components", "dataflow"],
|
|
387
|
+
// settings: {},
|
|
388
|
+
// },
|
|
389
|
+
],
|
|
390
|
+
analysis: {
|
|
391
|
+
include: ["**/*.tsx", "**/*.ts"],
|
|
392
|
+
exclude: ["**/node_modules/**", "**/__tests__/**", "**/*.test.*", "**/*.spec.*"],
|
|
393
|
+
maxDepth: 5,
|
|
394
|
+
},
|
|
395
|
+
diagrams: {
|
|
396
|
+
enabled: true,
|
|
397
|
+
types: ["flowchart", "sequence"],
|
|
398
|
+
theme: "default",
|
|
399
|
+
},
|
|
400
|
+
watch: {
|
|
401
|
+
enabled: false,
|
|
402
|
+
debounce: 1000,
|
|
403
|
+
},
|
|
404
|
+
integrations: {
|
|
405
|
+
github: { enabled: false, organization: "" },
|
|
406
|
+
slack: { enabled: false },
|
|
407
|
+
},
|
|
408
|
+
};
|
|
409
|
+
|
|
410
|
+
export default config;
|
|
411
|
+
`;
|
|
412
|
+
await fs.writeFile(configPath, templateConfig, 'utf-8');
|
|
413
|
+
console.log(chalk.green(`ā
Created ${configPath}`));
|
|
414
|
+
console.log(chalk.gray("\nRun 'npx repomap serve' to start the documentation server."));
|
|
415
|
+
}
|
|
416
|
+
catch (error) {
|
|
417
|
+
console.error(chalk.red('Failed to create config:'), error.message);
|
|
418
|
+
}
|
|
419
|
+
});
|
|
420
|
+
/**
|
|
421
|
+
* Rails command - analyze Rails application
|
|
422
|
+
*/
|
|
423
|
+
program
|
|
424
|
+
.command('rails')
|
|
425
|
+
.description('Analyze a Rails application and generate interactive map')
|
|
426
|
+
.option('--path <path>', 'Path to Rails application')
|
|
427
|
+
.option('-o, --output <path>', 'Output HTML file path')
|
|
428
|
+
.action(async (options) => {
|
|
429
|
+
console.log(chalk.blue.bold('\nš¤ļø Repomap - Rails Analyzer\n'));
|
|
430
|
+
try {
|
|
431
|
+
const targetPath = options.path || process.cwd();
|
|
432
|
+
// Verify it's a Rails project
|
|
433
|
+
try {
|
|
434
|
+
await fs.access(path.join(targetPath, 'config', 'routes.rb'));
|
|
435
|
+
}
|
|
436
|
+
catch {
|
|
437
|
+
console.error(chalk.red('Not a Rails project (config/routes.rb not found)'));
|
|
438
|
+
process.exit(1);
|
|
439
|
+
}
|
|
440
|
+
// Dynamically import Rails analyzer
|
|
441
|
+
const { RailsMapGenerator } = await import('./generators/rails-map-generator.js');
|
|
442
|
+
// Generate map
|
|
443
|
+
const outputPath = options.output || path.join(targetPath, 'rails-map.html');
|
|
444
|
+
const generator = new RailsMapGenerator(targetPath);
|
|
445
|
+
await generator.generate({
|
|
446
|
+
title: `${path.basename(targetPath)} - Rails Map`,
|
|
447
|
+
outputPath,
|
|
448
|
+
});
|
|
449
|
+
console.log(chalk.green(`\nā
Rails map generated: ${outputPath}`));
|
|
450
|
+
// Open in browser
|
|
451
|
+
const { exec } = await import('child_process');
|
|
452
|
+
exec(`open "${outputPath}"`);
|
|
453
|
+
}
|
|
454
|
+
catch (error) {
|
|
455
|
+
console.error(chalk.red('\nā Error:'), error.message);
|
|
456
|
+
process.exit(1);
|
|
457
|
+
}
|
|
458
|
+
});
|
|
459
|
+
/**
|
|
460
|
+
* Diff command - shows changes since last generation
|
|
461
|
+
*/
|
|
462
|
+
program
|
|
463
|
+
.command('diff')
|
|
464
|
+
.description('Show documentation changes since last generation')
|
|
465
|
+
.option('-c, --config <path>', 'Path to config file')
|
|
466
|
+
.action(async (options) => {
|
|
467
|
+
console.log(chalk.blue.bold('\nš Documentation Diff\n'));
|
|
468
|
+
try {
|
|
469
|
+
const cwd = process.cwd();
|
|
470
|
+
const config = await loadConfig(options.config, cwd);
|
|
471
|
+
const reportPath = path.join(config.outputDir, 'report.json');
|
|
472
|
+
const reportExists = await fs
|
|
473
|
+
.access(reportPath)
|
|
474
|
+
.then(() => true)
|
|
475
|
+
.catch(() => false);
|
|
476
|
+
if (!reportExists) {
|
|
477
|
+
console.log(chalk.yellow("No previous report found. Run 'generate' first."));
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
const previousReport = JSON.parse(await fs.readFile(reportPath, 'utf-8'));
|
|
481
|
+
// Generate new report without writing
|
|
482
|
+
const engine = new DocGeneratorEngine(config);
|
|
483
|
+
const currentReport = await engine.generate();
|
|
484
|
+
// Compare
|
|
485
|
+
showDiff(previousReport, currentReport);
|
|
486
|
+
}
|
|
487
|
+
catch (error) {
|
|
488
|
+
console.error(chalk.red('Failed to generate diff:'), error.message);
|
|
489
|
+
}
|
|
490
|
+
});
|
|
491
|
+
// Helper functions
|
|
492
|
+
async function watchAndGenerate(engine, config) {
|
|
493
|
+
// Initial generation
|
|
494
|
+
await engine.generate();
|
|
495
|
+
// Watch for changes using fs.watch
|
|
496
|
+
const watchDirs = config.repositories.map((r) => r.path);
|
|
497
|
+
for (const dir of watchDirs) {
|
|
498
|
+
const watcher = fs.watch(dir, { recursive: true });
|
|
499
|
+
let timeout = null;
|
|
500
|
+
for await (const event of watcher) {
|
|
501
|
+
if (event.filename && (event.filename.endsWith('.ts') || event.filename.endsWith('.tsx'))) {
|
|
502
|
+
if (timeout)
|
|
503
|
+
clearTimeout(timeout);
|
|
504
|
+
timeout = setTimeout(async () => {
|
|
505
|
+
console.log(chalk.yellow(`\nš Change detected: ${event.filename}`));
|
|
506
|
+
await engine.generate();
|
|
507
|
+
}, config.watch.debounce);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
function printSummary(report) {
|
|
513
|
+
console.log(chalk.green.bold('\nš Generation Summary\n'));
|
|
514
|
+
for (const repo of report.repositories) {
|
|
515
|
+
console.log(chalk.cyan(` ${repo.displayName}:`));
|
|
516
|
+
console.log(` Pages: ${repo.summary.totalPages}`);
|
|
517
|
+
console.log(` Components: ${repo.summary.totalComponents}`);
|
|
518
|
+
console.log(` GraphQL Operations: ${repo.summary.totalGraphQLOperations}`);
|
|
519
|
+
console.log(` Data Flows: ${repo.summary.totalDataFlows}`);
|
|
520
|
+
console.log();
|
|
521
|
+
}
|
|
522
|
+
console.log(chalk.gray(` Generated at: ${report.generatedAt}`));
|
|
523
|
+
}
|
|
524
|
+
function showDiff(previous, current) {
|
|
525
|
+
console.log(chalk.cyan('Changes detected:\n'));
|
|
526
|
+
for (const repo of current.repositories) {
|
|
527
|
+
const prevRepo = previous.repositories.find((r) => r.name === repo.name);
|
|
528
|
+
if (!prevRepo) {
|
|
529
|
+
console.log(chalk.green(` + New repository: ${repo.displayName}`));
|
|
530
|
+
continue;
|
|
531
|
+
}
|
|
532
|
+
const pagesDiff = repo.summary.totalPages - prevRepo.summary.totalPages;
|
|
533
|
+
const compDiff = repo.summary.totalComponents - prevRepo.summary.totalComponents;
|
|
534
|
+
const gqlDiff = repo.summary.totalGraphQLOperations - prevRepo.summary.totalGraphQLOperations;
|
|
535
|
+
if (pagesDiff !== 0 || compDiff !== 0 || gqlDiff !== 0) {
|
|
536
|
+
console.log(chalk.yellow(` ~ ${repo.displayName}:`));
|
|
537
|
+
if (pagesDiff !== 0) {
|
|
538
|
+
console.log(` Pages: ${pagesDiff > 0 ? '+' : ''}${pagesDiff}`);
|
|
539
|
+
}
|
|
540
|
+
if (compDiff !== 0) {
|
|
541
|
+
console.log(` Components: ${compDiff > 0 ? '+' : ''}${compDiff}`);
|
|
542
|
+
}
|
|
543
|
+
if (gqlDiff !== 0) {
|
|
544
|
+
console.log(` GraphQL Ops: ${gqlDiff > 0 ? '+' : ''}${gqlDiff}`);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
program.parse();
|
|
550
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File-based cache for analysis results
|
|
3
|
+
* ćć”ć¤ć«ćć¼ć¹ć®ćć£ćć·ć„ć·ć¹ćć
|
|
4
|
+
*/
|
|
5
|
+
export declare class AnalysisCache {
|
|
6
|
+
private cacheDir;
|
|
7
|
+
private manifest;
|
|
8
|
+
private manifestPath;
|
|
9
|
+
private dirty;
|
|
10
|
+
constructor(repoPath: string);
|
|
11
|
+
/**
|
|
12
|
+
* Initialize cache directory and load manifest
|
|
13
|
+
*/
|
|
14
|
+
init(): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Compute hash for a file
|
|
17
|
+
*/
|
|
18
|
+
computeFileHash(filePath: string): Promise<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Compute hash for multiple files
|
|
21
|
+
* Sort files first for consistent ordering, then use a sample of files
|
|
22
|
+
*/
|
|
23
|
+
computeFilesHash(filePaths: string[]): Promise<string>;
|
|
24
|
+
/**
|
|
25
|
+
* Get cached data if valid
|
|
26
|
+
*/
|
|
27
|
+
get<T>(key: string, currentHash: string): T | null;
|
|
28
|
+
/**
|
|
29
|
+
* Store data in cache
|
|
30
|
+
*/
|
|
31
|
+
set(key: string, hash: string, data: unknown): void;
|
|
32
|
+
/**
|
|
33
|
+
* Save manifest to disk
|
|
34
|
+
*/
|
|
35
|
+
save(): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Clear all cache
|
|
38
|
+
*/
|
|
39
|
+
clear(): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Get cache statistics
|
|
42
|
+
*/
|
|
43
|
+
getStats(): {
|
|
44
|
+
entries: number;
|
|
45
|
+
size: string;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"AAmBA;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,KAAK,CAAS;gBAEV,QAAQ,EAAE,MAAM;IAM5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B3B;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASxD;;;OAGG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IA0B5D;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAQlD;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IASnD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B;;OAEG;IACH,QAAQ,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;CAW9C"}
|