autodocs-engine 0.5.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 +185 -0
- package/dist/analysis-builder.d.ts +13 -0
- package/dist/analysis-builder.js +268 -0
- package/dist/analysis-builder.js.map +1 -0
- package/dist/anti-pattern-detector.d.ts +9 -0
- package/dist/anti-pattern-detector.js +58 -0
- package/dist/anti-pattern-detector.js.map +1 -0
- package/dist/architecture-detector.d.ts +7 -0
- package/dist/architecture-detector.js +212 -0
- package/dist/architecture-detector.js.map +1 -0
- package/dist/ast-parser.d.ts +5 -0
- package/dist/ast-parser.js +635 -0
- package/dist/ast-parser.js.map +1 -0
- package/dist/benchmark/code-generator.d.ts +20 -0
- package/dist/benchmark/code-generator.js +206 -0
- package/dist/benchmark/code-generator.js.map +1 -0
- package/dist/benchmark/pr-miner.d.ts +61 -0
- package/dist/benchmark/pr-miner.js +304 -0
- package/dist/benchmark/pr-miner.js.map +1 -0
- package/dist/benchmark/pr-runner.d.ts +58 -0
- package/dist/benchmark/pr-runner.js +346 -0
- package/dist/benchmark/pr-runner.js.map +1 -0
- package/dist/benchmark/pr-scorer.d.ts +48 -0
- package/dist/benchmark/pr-scorer.js +222 -0
- package/dist/benchmark/pr-scorer.js.map +1 -0
- package/dist/benchmark/pr-task-gen.d.ts +16 -0
- package/dist/benchmark/pr-task-gen.js +129 -0
- package/dist/benchmark/pr-task-gen.js.map +1 -0
- package/dist/benchmark/report.d.ts +9 -0
- package/dist/benchmark/report.js +131 -0
- package/dist/benchmark/report.js.map +1 -0
- package/dist/benchmark/runner.d.ts +6 -0
- package/dist/benchmark/runner.js +183 -0
- package/dist/benchmark/runner.js.map +1 -0
- package/dist/benchmark/scorer.d.ts +6 -0
- package/dist/benchmark/scorer.js +549 -0
- package/dist/benchmark/scorer.js.map +1 -0
- package/dist/benchmark/shuffler.d.ts +5 -0
- package/dist/benchmark/shuffler.js +70 -0
- package/dist/benchmark/shuffler.js.map +1 -0
- package/dist/benchmark/statistics.d.ts +36 -0
- package/dist/benchmark/statistics.js +159 -0
- package/dist/benchmark/statistics.js.map +1 -0
- package/dist/benchmark/task-generator.d.ts +20 -0
- package/dist/benchmark/task-generator.js +388 -0
- package/dist/benchmark/task-generator.js.map +1 -0
- package/dist/benchmark/types.d.ts +111 -0
- package/dist/benchmark/types.js +3 -0
- package/dist/benchmark/types.js.map +1 -0
- package/dist/bin/autodocs-engine.d.ts +2 -0
- package/dist/bin/autodocs-engine.js +296 -0
- package/dist/bin/autodocs-engine.js.map +1 -0
- package/dist/bin/benchmark.d.ts +14 -0
- package/dist/bin/benchmark.js +172 -0
- package/dist/bin/benchmark.js.map +1 -0
- package/dist/bin/check.d.ts +13 -0
- package/dist/bin/check.js +79 -0
- package/dist/bin/check.js.map +1 -0
- package/dist/bin/init.d.ts +11 -0
- package/dist/bin/init.js +268 -0
- package/dist/bin/init.js.map +1 -0
- package/dist/bin/serve.d.ts +4 -0
- package/dist/bin/serve.js +29 -0
- package/dist/bin/serve.js.map +1 -0
- package/dist/budget-validator.d.ts +22 -0
- package/dist/budget-validator.js +119 -0
- package/dist/budget-validator.js.map +1 -0
- package/dist/command-extractor.d.ts +10 -0
- package/dist/command-extractor.js +276 -0
- package/dist/command-extractor.js.map +1 -0
- package/dist/config-analyzer.d.ts +5 -0
- package/dist/config-analyzer.js +364 -0
- package/dist/config-analyzer.js.map +1 -0
- package/dist/config.d.ts +33 -0
- package/dist/config.js +172 -0
- package/dist/config.js.map +1 -0
- package/dist/contribution-patterns.d.ts +6 -0
- package/dist/contribution-patterns.js +263 -0
- package/dist/contribution-patterns.js.map +1 -0
- package/dist/convention-extractor.d.ts +17 -0
- package/dist/convention-extractor.js +90 -0
- package/dist/convention-extractor.js.map +1 -0
- package/dist/cross-package.d.ts +5 -0
- package/dist/cross-package.js +71 -0
- package/dist/cross-package.js.map +1 -0
- package/dist/dependency-analyzer.d.ts +5 -0
- package/dist/dependency-analyzer.js +233 -0
- package/dist/dependency-analyzer.js.map +1 -0
- package/dist/detectors/build-tool.d.ts +2 -0
- package/dist/detectors/build-tool.js +67 -0
- package/dist/detectors/build-tool.js.map +1 -0
- package/dist/detectors/component-patterns.d.ts +2 -0
- package/dist/detectors/component-patterns.js +49 -0
- package/dist/detectors/component-patterns.js.map +1 -0
- package/dist/detectors/data-fetching.d.ts +2 -0
- package/dist/detectors/data-fetching.js +127 -0
- package/dist/detectors/data-fetching.js.map +1 -0
- package/dist/detectors/database.d.ts +2 -0
- package/dist/detectors/database.js +54 -0
- package/dist/detectors/database.js.map +1 -0
- package/dist/detectors/error-handling.d.ts +2 -0
- package/dist/detectors/error-handling.js +47 -0
- package/dist/detectors/error-handling.js.map +1 -0
- package/dist/detectors/export-patterns.d.ts +2 -0
- package/dist/detectors/export-patterns.js +64 -0
- package/dist/detectors/export-patterns.js.map +1 -0
- package/dist/detectors/file-naming.d.ts +2 -0
- package/dist/detectors/file-naming.js +74 -0
- package/dist/detectors/file-naming.js.map +1 -0
- package/dist/detectors/graphql-patterns.d.ts +2 -0
- package/dist/detectors/graphql-patterns.js +47 -0
- package/dist/detectors/graphql-patterns.js.map +1 -0
- package/dist/detectors/hook-patterns.d.ts +2 -0
- package/dist/detectors/hook-patterns.js +105 -0
- package/dist/detectors/hook-patterns.js.map +1 -0
- package/dist/detectors/import-patterns.d.ts +2 -0
- package/dist/detectors/import-patterns.js +88 -0
- package/dist/detectors/import-patterns.js.map +1 -0
- package/dist/detectors/telemetry-patterns.d.ts +2 -0
- package/dist/detectors/telemetry-patterns.js +42 -0
- package/dist/detectors/telemetry-patterns.js.map +1 -0
- package/dist/detectors/test-framework-ecosystem.d.ts +2 -0
- package/dist/detectors/test-framework-ecosystem.js +95 -0
- package/dist/detectors/test-framework-ecosystem.js.map +1 -0
- package/dist/detectors/test-patterns.d.ts +2 -0
- package/dist/detectors/test-patterns.js +60 -0
- package/dist/detectors/test-patterns.js.map +1 -0
- package/dist/detectors/web-framework.d.ts +2 -0
- package/dist/detectors/web-framework.js +51 -0
- package/dist/detectors/web-framework.js.map +1 -0
- package/dist/deterministic-formatter.d.ts +54 -0
- package/dist/deterministic-formatter.js +922 -0
- package/dist/deterministic-formatter.js.map +1 -0
- package/dist/diff-analyzer.d.ts +7 -0
- package/dist/diff-analyzer.js +126 -0
- package/dist/diff-analyzer.js.map +1 -0
- package/dist/example-extractor.d.ts +6 -0
- package/dist/example-extractor.js +115 -0
- package/dist/example-extractor.js.map +1 -0
- package/dist/existing-docs.d.ts +36 -0
- package/dist/existing-docs.js +257 -0
- package/dist/existing-docs.js.map +1 -0
- package/dist/file-discovery.d.ts +6 -0
- package/dist/file-discovery.js +154 -0
- package/dist/file-discovery.js.map +1 -0
- package/dist/git-history.d.ts +41 -0
- package/dist/git-history.js +401 -0
- package/dist/git-history.js.map +1 -0
- package/dist/impact-classifier.d.ts +22 -0
- package/dist/impact-classifier.js +87 -0
- package/dist/impact-classifier.js.map +1 -0
- package/dist/impact-radius.d.ts +23 -0
- package/dist/impact-radius.js +130 -0
- package/dist/impact-radius.js.map +1 -0
- package/dist/import-chain.d.ts +12 -0
- package/dist/import-chain.js +93 -0
- package/dist/import-chain.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/inferability.d.ts +16 -0
- package/dist/inferability.js +142 -0
- package/dist/inferability.js.map +1 -0
- package/dist/llm/adapter.d.ts +33 -0
- package/dist/llm/adapter.js +202 -0
- package/dist/llm/adapter.js.map +1 -0
- package/dist/llm/client.d.ts +5 -0
- package/dist/llm/client.js +68 -0
- package/dist/llm/client.js.map +1 -0
- package/dist/llm/hierarchical.d.ts +23 -0
- package/dist/llm/hierarchical.js +126 -0
- package/dist/llm/hierarchical.js.map +1 -0
- package/dist/llm/serializer.d.ts +19 -0
- package/dist/llm/serializer.js +363 -0
- package/dist/llm/serializer.js.map +1 -0
- package/dist/llm/template-selector.d.ts +7 -0
- package/dist/llm/template-selector.js +21 -0
- package/dist/llm/template-selector.js.map +1 -0
- package/dist/llm-adapter.d.ts +2 -0
- package/dist/llm-adapter.js +5 -0
- package/dist/llm-adapter.js.map +1 -0
- package/dist/mcp/cache.d.ts +30 -0
- package/dist/mcp/cache.js +112 -0
- package/dist/mcp/cache.js.map +1 -0
- package/dist/mcp/errors.d.ts +21 -0
- package/dist/mcp/errors.js +27 -0
- package/dist/mcp/errors.js.map +1 -0
- package/dist/mcp/queries.d.ts +27 -0
- package/dist/mcp/queries.js +121 -0
- package/dist/mcp/queries.js.map +1 -0
- package/dist/mcp/server.d.ts +14 -0
- package/dist/mcp/server.js +131 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +39 -0
- package/dist/mcp/tools.js +249 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mermaid-generator.d.ts +6 -0
- package/dist/mermaid-generator.js +59 -0
- package/dist/mermaid-generator.js.map +1 -0
- package/dist/meta-tool-detector.d.ts +23 -0
- package/dist/meta-tool-detector.js +177 -0
- package/dist/meta-tool-detector.js.map +1 -0
- package/dist/output-validator.d.ts +6 -0
- package/dist/output-validator.js +471 -0
- package/dist/output-validator.js.map +1 -0
- package/dist/pattern-fingerprinter.d.ts +7 -0
- package/dist/pattern-fingerprinter.js +241 -0
- package/dist/pattern-fingerprinter.js.map +1 -0
- package/dist/pipeline.d.ts +5 -0
- package/dist/pipeline.js +374 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/plugin-loader.d.ts +19 -0
- package/dist/plugin-loader.js +124 -0
- package/dist/plugin-loader.js.map +1 -0
- package/dist/role-inferrer.d.ts +5 -0
- package/dist/role-inferrer.js +159 -0
- package/dist/role-inferrer.js.map +1 -0
- package/dist/symbol-graph.d.ts +11 -0
- package/dist/symbol-graph.js +613 -0
- package/dist/symbol-graph.js.map +1 -0
- package/dist/templates/agents-md.d.ts +20 -0
- package/dist/templates/agents-md.js +346 -0
- package/dist/templates/agents-md.js.map +1 -0
- package/dist/templates/claude-md.d.ts +4 -0
- package/dist/templates/claude-md.js +23 -0
- package/dist/templates/claude-md.js.map +1 -0
- package/dist/templates/cursorrules.d.ts +4 -0
- package/dist/templates/cursorrules.js +18 -0
- package/dist/templates/cursorrules.js.map +1 -0
- package/dist/tier-classifier.d.ts +7 -0
- package/dist/tier-classifier.js +32 -0
- package/dist/tier-classifier.js.map +1 -0
- package/dist/types.d.ts +428 -0
- package/dist/types.js +42 -0
- package/dist/types.js.map +1 -0
- package/dist/workflow-rules.d.ts +18 -0
- package/dist/workflow-rules.js +131 -0
- package/dist/workflow-rules.js.map +1 -0
- package/package.json +62 -0
package/dist/bin/init.js
ADDED
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
// src/bin/init.ts — Zero-config init command
|
|
2
|
+
// Auto-detects project structure and generates AGENTS.md on first try.
|
|
3
|
+
import { resolve, join, relative, dirname } from "node:path";
|
|
4
|
+
import { existsSync, readFileSync, readdirSync, writeFileSync, mkdirSync } from "node:fs";
|
|
5
|
+
import { analyze, formatDeterministic, formatHierarchicalDeterministic } from "../index.js";
|
|
6
|
+
// ─── Main ────────────────────────────────────────────────────────────────────
|
|
7
|
+
export async function runInit() {
|
|
8
|
+
const cwd = process.cwd();
|
|
9
|
+
// Step 1: Detect project structure
|
|
10
|
+
const project = detectProjectStructure(cwd);
|
|
11
|
+
stderr("");
|
|
12
|
+
stderr(` Detected: ${project.isMonorepo ? `monorepo (${project.workspaceSource})` : "single package"}`);
|
|
13
|
+
if (project.isMonorepo) {
|
|
14
|
+
const relPkgs = project.packages.map((p) => relative(cwd, p));
|
|
15
|
+
stderr(` Packages: ${relPkgs.join(", ")} (${project.packages.length} found)`);
|
|
16
|
+
}
|
|
17
|
+
stderr(` Package manager: ${project.packageManager}`);
|
|
18
|
+
// Step 2: Check API key
|
|
19
|
+
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
20
|
+
const format = apiKey ? "agents.md" : "json";
|
|
21
|
+
stderr(` API key: ${apiKey ? "set" : "not set (will generate JSON only)"}`);
|
|
22
|
+
stderr("");
|
|
23
|
+
// Step 3: Analyze
|
|
24
|
+
stderr(` Analyzing ${project.packages.length} package(s)...`);
|
|
25
|
+
const analysisStart = performance.now();
|
|
26
|
+
const analysis = await analyze({
|
|
27
|
+
packages: project.packages,
|
|
28
|
+
rootDir: project.root,
|
|
29
|
+
output: { format, dir: "." },
|
|
30
|
+
llm: {
|
|
31
|
+
provider: "anthropic",
|
|
32
|
+
model: process.env.AUTODOCS_LLM_MODEL ?? "claude-sonnet-4-20250514",
|
|
33
|
+
maxOutputTokens: 4096,
|
|
34
|
+
apiKey,
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
const analysisMs = Math.round(performance.now() - analysisStart);
|
|
38
|
+
stderr(` Analysis complete (${(analysisMs / 1000).toFixed(1)}s)`);
|
|
39
|
+
// Step 4: Generate and write output
|
|
40
|
+
if (!apiKey) {
|
|
41
|
+
const outPath = resolve(cwd, "autodocs-analysis.json");
|
|
42
|
+
writeFileSafe(outPath, JSON.stringify(analysis, mapReplacer, 2));
|
|
43
|
+
stderr(`\n Written: ${relative(cwd, outPath)}`);
|
|
44
|
+
stderr(`\n To generate AGENTS.md, set ANTHROPIC_API_KEY and run again.`);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const llmConfig = {
|
|
48
|
+
output: { format: "agents.md", dir: "." },
|
|
49
|
+
llm: {
|
|
50
|
+
provider: "anthropic",
|
|
51
|
+
model: process.env.AUTODOCS_LLM_MODEL ?? "claude-sonnet-4-20250514",
|
|
52
|
+
maxOutputTokens: 4096,
|
|
53
|
+
apiKey,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
if (project.isMonorepo && project.packages.length > 1) {
|
|
57
|
+
stderr(` Generating AGENTS.md (hierarchical)...`);
|
|
58
|
+
const genStart = performance.now();
|
|
59
|
+
const result = await formatHierarchicalDeterministic(analysis, llmConfig);
|
|
60
|
+
stderr(` Generation complete (${((performance.now() - genStart) / 1000).toFixed(1)}s)`);
|
|
61
|
+
const rootPath = resolve(cwd, "AGENTS.md");
|
|
62
|
+
writeFileSafe(rootPath, result.root);
|
|
63
|
+
stderr(`\n Written:`);
|
|
64
|
+
stderr(` ./AGENTS.md (root, ${result.root.split("\n").length} lines)`);
|
|
65
|
+
const pkgsDir = resolve(cwd, "packages");
|
|
66
|
+
for (const pkg of result.packages) {
|
|
67
|
+
const pkgPath = join(pkgsDir, pkg.filename);
|
|
68
|
+
writeFileSafe(pkgPath, pkg.content);
|
|
69
|
+
stderr(` ./packages/${pkg.filename} (${pkg.content.split("\n").length} lines)`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
stderr(` Generating AGENTS.md...`);
|
|
74
|
+
const genStart = performance.now();
|
|
75
|
+
const content = await formatDeterministic(analysis, llmConfig, project.root);
|
|
76
|
+
stderr(` Generation complete (${((performance.now() - genStart) / 1000).toFixed(1)}s)`);
|
|
77
|
+
const outPath = resolve(cwd, "AGENTS.md");
|
|
78
|
+
writeFileSafe(outPath, content);
|
|
79
|
+
stderr(`\n Written: ./AGENTS.md (${content.split("\n").length} lines)`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// ─── Project Detection ───────────────────────────────────────────────────────
|
|
83
|
+
/** Exported for testing. */
|
|
84
|
+
export function detectProjectStructure(cwd) {
|
|
85
|
+
const absCwd = resolve(cwd);
|
|
86
|
+
// Must have package.json
|
|
87
|
+
const pkgJsonPath = join(absCwd, "package.json");
|
|
88
|
+
if (!existsSync(pkgJsonPath)) {
|
|
89
|
+
throw new Error("No package.json found in current directory.\n" +
|
|
90
|
+
"Run this command from your project root (where package.json is).");
|
|
91
|
+
}
|
|
92
|
+
let pkgJson;
|
|
93
|
+
try {
|
|
94
|
+
pkgJson = JSON.parse(readFileSync(pkgJsonPath, "utf-8"));
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
throw new Error("Failed to parse package.json.");
|
|
98
|
+
}
|
|
99
|
+
// Detect package manager from lockfiles
|
|
100
|
+
const packageManager = detectPM(absCwd);
|
|
101
|
+
// Check for monorepo signals
|
|
102
|
+
// Signal 1: package.json workspaces field
|
|
103
|
+
if (Array.isArray(pkgJson.workspaces)) {
|
|
104
|
+
const packages = discoverWorkspacePackages(absCwd, pkgJson.workspaces);
|
|
105
|
+
if (packages.length > 0) {
|
|
106
|
+
return { isMonorepo: true, workspaceSource: "npm/yarn workspaces", root: absCwd, packages, packageManager };
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Signal 1b: yarn workspaces as object { packages: [...] }
|
|
110
|
+
if (pkgJson.workspaces && typeof pkgJson.workspaces === "object" && !Array.isArray(pkgJson.workspaces)) {
|
|
111
|
+
const ws = pkgJson.workspaces;
|
|
112
|
+
if (Array.isArray(ws.packages)) {
|
|
113
|
+
const packages = discoverWorkspacePackages(absCwd, ws.packages);
|
|
114
|
+
if (packages.length > 0) {
|
|
115
|
+
return { isMonorepo: true, workspaceSource: "yarn workspaces", root: absCwd, packages, packageManager };
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Signal 2: pnpm-workspace.yaml
|
|
120
|
+
const pnpmWsPath = join(absCwd, "pnpm-workspace.yaml");
|
|
121
|
+
if (existsSync(pnpmWsPath)) {
|
|
122
|
+
const globs = parsePnpmWorkspaceYaml(pnpmWsPath);
|
|
123
|
+
if (globs.length > 0) {
|
|
124
|
+
const packages = discoverWorkspacePackages(absCwd, globs);
|
|
125
|
+
if (packages.length > 0) {
|
|
126
|
+
return { isMonorepo: true, workspaceSource: "pnpm workspaces", root: absCwd, packages, packageManager };
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Single package
|
|
131
|
+
return { isMonorepo: false, root: absCwd, packages: [absCwd], packageManager };
|
|
132
|
+
}
|
|
133
|
+
// ─── Workspace Discovery ─────────────────────────────────────────────────────
|
|
134
|
+
/**
|
|
135
|
+
* Discover workspace package directories from glob patterns.
|
|
136
|
+
* Handles common patterns: "packages/*", "apps/*", "libs/**".
|
|
137
|
+
*/
|
|
138
|
+
function discoverWorkspacePackages(root, globs) {
|
|
139
|
+
const packages = [];
|
|
140
|
+
const seen = new Set();
|
|
141
|
+
for (const glob of globs) {
|
|
142
|
+
// Strip trailing / if present
|
|
143
|
+
const cleanGlob = glob.replace(/\/+$/, "");
|
|
144
|
+
// Common patterns: "packages/*", "apps/*", "libs/**"
|
|
145
|
+
// Split into base directory and wildcard
|
|
146
|
+
const starIdx = cleanGlob.indexOf("*");
|
|
147
|
+
if (starIdx === -1) {
|
|
148
|
+
// No wildcard — treat as literal directory
|
|
149
|
+
const dir = resolve(root, cleanGlob);
|
|
150
|
+
if (existsSync(join(dir, "package.json")) && !seen.has(dir)) {
|
|
151
|
+
seen.add(dir);
|
|
152
|
+
packages.push(dir);
|
|
153
|
+
}
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
const baseDir = resolve(root, cleanGlob.slice(0, starIdx).replace(/\/+$/, ""));
|
|
157
|
+
if (!existsSync(baseDir))
|
|
158
|
+
continue;
|
|
159
|
+
const isRecursive = cleanGlob.includes("**");
|
|
160
|
+
if (isRecursive) {
|
|
161
|
+
walkForPackages(baseDir, packages, seen);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
// Single-level wildcard: list immediate subdirectories
|
|
165
|
+
try {
|
|
166
|
+
const entries = readdirSync(baseDir, { withFileTypes: true });
|
|
167
|
+
for (const entry of entries) {
|
|
168
|
+
if (!entry.isDirectory())
|
|
169
|
+
continue;
|
|
170
|
+
if (entry.name === "node_modules" || entry.name.startsWith("."))
|
|
171
|
+
continue;
|
|
172
|
+
const dir = join(baseDir, entry.name);
|
|
173
|
+
if (existsSync(join(dir, "package.json")) && !seen.has(dir)) {
|
|
174
|
+
seen.add(dir);
|
|
175
|
+
packages.push(dir);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
// Can't read directory
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return packages.sort();
|
|
185
|
+
}
|
|
186
|
+
/** Recursively find directories containing package.json. */
|
|
187
|
+
function walkForPackages(dir, results, seen, depth = 0) {
|
|
188
|
+
if (depth > 4)
|
|
189
|
+
return;
|
|
190
|
+
try {
|
|
191
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
192
|
+
for (const entry of entries) {
|
|
193
|
+
if (!entry.isDirectory())
|
|
194
|
+
continue;
|
|
195
|
+
if (entry.name === "node_modules" || entry.name.startsWith("."))
|
|
196
|
+
continue;
|
|
197
|
+
const subdir = join(dir, entry.name);
|
|
198
|
+
if (existsSync(join(subdir, "package.json")) && !seen.has(subdir)) {
|
|
199
|
+
seen.add(subdir);
|
|
200
|
+
results.push(subdir);
|
|
201
|
+
}
|
|
202
|
+
walkForPackages(subdir, results, seen, depth + 1);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
// Can't read directory
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
210
|
+
/** Simple YAML parser for pnpm-workspace.yaml — only reads the `packages:` field. */
|
|
211
|
+
function parsePnpmWorkspaceYaml(filePath) {
|
|
212
|
+
try {
|
|
213
|
+
const content = readFileSync(filePath, "utf-8");
|
|
214
|
+
const globs = [];
|
|
215
|
+
let inPackages = false;
|
|
216
|
+
for (const line of content.split("\n")) {
|
|
217
|
+
const trimmed = line.trim();
|
|
218
|
+
if (trimmed === "packages:" || trimmed === "packages: ") {
|
|
219
|
+
inPackages = true;
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
if (inPackages) {
|
|
223
|
+
if (trimmed.startsWith("- ")) {
|
|
224
|
+
// Strip "- " prefix and optional quotes
|
|
225
|
+
const value = trimmed.slice(2).trim().replace(/^['"]|['"]$/g, "");
|
|
226
|
+
if (value && !value.startsWith("!")) {
|
|
227
|
+
globs.push(value);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
else if (trimmed && !trimmed.startsWith("#")) {
|
|
231
|
+
// Non-list line — end of packages section
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return globs;
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
return [];
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/** Detect package manager from lockfiles. */
|
|
243
|
+
function detectPM(dir) {
|
|
244
|
+
if (existsSync(join(dir, "bun.lockb")) || existsSync(join(dir, "bun.lock")))
|
|
245
|
+
return "bun";
|
|
246
|
+
if (existsSync(join(dir, "pnpm-lock.yaml")))
|
|
247
|
+
return "pnpm";
|
|
248
|
+
if (existsSync(join(dir, "yarn.lock")))
|
|
249
|
+
return "yarn";
|
|
250
|
+
if (existsSync(join(dir, "package-lock.json")))
|
|
251
|
+
return "npm";
|
|
252
|
+
return "npm";
|
|
253
|
+
}
|
|
254
|
+
function stderr(msg) {
|
|
255
|
+
process.stderr.write(msg + "\n");
|
|
256
|
+
}
|
|
257
|
+
function writeFileSafe(filePath, content) {
|
|
258
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
259
|
+
writeFileSync(filePath, content);
|
|
260
|
+
}
|
|
261
|
+
function mapReplacer(_key, value) {
|
|
262
|
+
if (value instanceof Map)
|
|
263
|
+
return Object.fromEntries(value);
|
|
264
|
+
if (value instanceof Set)
|
|
265
|
+
return [...value];
|
|
266
|
+
return value;
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/bin/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// src/bin/serve.ts — CLI entry point for MCP server
|
|
2
|
+
// Usage: autodocs-engine serve [path] [--verbose]
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
export async function runServe(args) {
|
|
5
|
+
const projectPath = resolve(args.path ?? ".");
|
|
6
|
+
// Lazy-load MCP dependencies — users who don't use serve don't pay the cost
|
|
7
|
+
const { StdioServerTransport } = await import("@modelcontextprotocol/sdk/server/stdio.js");
|
|
8
|
+
const { createAutodocsServer } = await import("../mcp/server.js");
|
|
9
|
+
const verbose = args.verbose ?? Boolean(process.env.AUTODOCS_DEBUG);
|
|
10
|
+
const { server, cache } = createAutodocsServer(projectPath, { verbose });
|
|
11
|
+
const transport = new StdioServerTransport();
|
|
12
|
+
// Connect first — handshake must complete before heavy analysis work
|
|
13
|
+
await server.connect(transport);
|
|
14
|
+
process.stderr.write(`[autodocs] MCP server ready (project: ${projectPath})\n`);
|
|
15
|
+
// Defer warmup to next tick — ensures the MCP handshake response is fully
|
|
16
|
+
// flushed before synchronous AST parsing blocks the event loop.
|
|
17
|
+
// Without this, large repos block the transport and Claude Code times out.
|
|
18
|
+
setTimeout(() => cache.warm(), 100);
|
|
19
|
+
// Signal handlers for clean shutdown
|
|
20
|
+
process.on("SIGTERM", () => {
|
|
21
|
+
process.stderr.write("[autodocs] Shutting down\n");
|
|
22
|
+
process.exit(0);
|
|
23
|
+
});
|
|
24
|
+
process.on("SIGINT", () => {
|
|
25
|
+
process.stderr.write("[autodocs] Interrupted\n");
|
|
26
|
+
process.exit(0);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/bin/serve.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,kDAAkD;AAElD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAA0C;IACvE,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;IAE9C,4EAA4E;IAC5E,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,2CAA2C,CAAC,CAAC;IAC3F,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAElE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACpE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,oBAAoB,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACzE,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,qEAAqE;IACrE,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,WAAW,KAAK,CAAC,CAAC;IAEhF,0EAA0E;IAC1E,gEAAgE;IAChE,2EAA2E;IAC3E,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;IAEpC,qCAAqC;IACrC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface BudgetReport {
|
|
2
|
+
lineCount: number;
|
|
3
|
+
ruleCount: number;
|
|
4
|
+
budgetPercentage: number;
|
|
5
|
+
styleRules: StyleRuleWarning[];
|
|
6
|
+
overBudget: boolean;
|
|
7
|
+
summary: string;
|
|
8
|
+
}
|
|
9
|
+
export interface StyleRuleWarning {
|
|
10
|
+
line: number;
|
|
11
|
+
text: string;
|
|
12
|
+
suggestion: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Validate the instruction budget of generated content.
|
|
16
|
+
* Returns a report with rule count, budget usage, and style rule warnings.
|
|
17
|
+
*/
|
|
18
|
+
export declare function validateBudget(content: string): BudgetReport;
|
|
19
|
+
/**
|
|
20
|
+
* Format budget report for verbose console output.
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatBudgetReport(report: BudgetReport): string;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// src/budget-validator.ts — Instruction Budget Validator
|
|
2
|
+
// After generation, counts rules and warns if the output exceeds the AI instruction budget.
|
|
3
|
+
// Research: AI tools follow ~150-200 instructions max. Claude system prompt uses ~50.
|
|
4
|
+
// Budget for AGENTS.md: ~100 actionable rules.
|
|
5
|
+
// W5-B2: Increased from 100 — modern LLMs handle 150+ instructions reliably
|
|
6
|
+
const MAX_RULES = 120;
|
|
7
|
+
// Patterns that indicate an actionable rule/instruction line
|
|
8
|
+
const RULE_PATTERNS = [
|
|
9
|
+
/^[-*]\s+\*?\*?(?:Do|Use|After|When|Always|Never|Run|Create|Add|Set|Include|Ensure|Check|Avoid)/i,
|
|
10
|
+
/^[-*]\s+`[a-z]/i, // Bullet with a command
|
|
11
|
+
/^\|\s*[^|]+\s*\|/, // Table row (non-header)
|
|
12
|
+
/^#{1,4}\s+(?:DO|DO NOT|Rules)/i, // Section headers that are directive
|
|
13
|
+
];
|
|
14
|
+
// Patterns that indicate a style rule (should be handled by linter)
|
|
15
|
+
const STYLE_PATTERNS = [
|
|
16
|
+
{ pattern: /kebab[- ]?case/i, suggestion: "Enforce via ESLint naming convention rule" },
|
|
17
|
+
{ pattern: /camel[- ]?case/i, suggestion: "Enforce via ESLint naming convention rule" },
|
|
18
|
+
{ pattern: /pascal[- ]?case/i, suggestion: "Enforce via ESLint naming convention rule" },
|
|
19
|
+
{ pattern: /named exports?/i, suggestion: "Enforce via eslint-plugin-import no-default-export rule" },
|
|
20
|
+
{ pattern: /default exports?/i, suggestion: "Enforce via eslint-plugin-import no-default-export rule" },
|
|
21
|
+
{ pattern: /barrel exports?/i, suggestion: "Enforce via eslint-plugin-import no-internal-modules rule" },
|
|
22
|
+
{ pattern: /semicolons?\b/i, suggestion: "Enforce via Prettier or ESLint semi rule" },
|
|
23
|
+
{ pattern: /trailing comma/i, suggestion: "Enforce via Prettier trailingComma option" },
|
|
24
|
+
{ pattern: /single quotes?/i, suggestion: "Enforce via Prettier singleQuote option" },
|
|
25
|
+
{ pattern: /double quotes?/i, suggestion: "Enforce via Prettier singleQuote option" },
|
|
26
|
+
{ pattern: /import order/i, suggestion: "Enforce via eslint-plugin-import order rule" },
|
|
27
|
+
{ pattern: /import style/i, suggestion: "Enforce via eslint-plugin-import rules" },
|
|
28
|
+
{ pattern: /sort.?imports/i, suggestion: "Enforce via eslint-plugin-import order rule" },
|
|
29
|
+
{ pattern: /file.?naming/i, suggestion: "Enforce via eslint-plugin-unicorn filename-case rule" },
|
|
30
|
+
{ pattern: /indentation|indent with/i, suggestion: "Enforce via Prettier or ESLint indent rule" },
|
|
31
|
+
{ pattern: /line length|max.?len/i, suggestion: "Enforce via Prettier printWidth option" },
|
|
32
|
+
];
|
|
33
|
+
/**
|
|
34
|
+
* Validate the instruction budget of generated content.
|
|
35
|
+
* Returns a report with rule count, budget usage, and style rule warnings.
|
|
36
|
+
*/
|
|
37
|
+
export function validateBudget(content) {
|
|
38
|
+
const lines = content.split("\n");
|
|
39
|
+
const lineCount = lines.length;
|
|
40
|
+
let ruleCount = 0;
|
|
41
|
+
const styleRules = [];
|
|
42
|
+
for (let i = 0; i < lines.length; i++) {
|
|
43
|
+
const line = lines[i].trim();
|
|
44
|
+
if (!line)
|
|
45
|
+
continue;
|
|
46
|
+
// Count actionable rules
|
|
47
|
+
if (isActionableLine(line)) {
|
|
48
|
+
ruleCount++;
|
|
49
|
+
}
|
|
50
|
+
// Detect style rules
|
|
51
|
+
for (const { pattern, suggestion } of STYLE_PATTERNS) {
|
|
52
|
+
if (pattern.test(line)) {
|
|
53
|
+
styleRules.push({
|
|
54
|
+
line: i + 1,
|
|
55
|
+
text: line.slice(0, 120),
|
|
56
|
+
suggestion,
|
|
57
|
+
});
|
|
58
|
+
break; // One warning per line
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const budgetPercentage = Math.round((ruleCount / MAX_RULES) * 100);
|
|
63
|
+
const overBudget = ruleCount > MAX_RULES;
|
|
64
|
+
const parts = [
|
|
65
|
+
`${lineCount} lines, ${ruleCount} actionable rules (${budgetPercentage}% of ${MAX_RULES} budget)`,
|
|
66
|
+
];
|
|
67
|
+
if (overBudget) {
|
|
68
|
+
parts.push(`WARNING: Exceeds instruction budget by ${ruleCount - MAX_RULES} rules. AI performance may degrade.`);
|
|
69
|
+
}
|
|
70
|
+
if (styleRules.length > 0) {
|
|
71
|
+
parts.push(`${styleRules.length} style rule(s) detected — consider moving to linter config.`);
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
lineCount,
|
|
75
|
+
ruleCount,
|
|
76
|
+
budgetPercentage,
|
|
77
|
+
styleRules,
|
|
78
|
+
overBudget,
|
|
79
|
+
summary: parts.join(" | "),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Check if a line represents an actionable instruction for AI.
|
|
84
|
+
*/
|
|
85
|
+
function isActionableLine(line) {
|
|
86
|
+
// Skip markdown headers, blank lines, horizontal rules, and pure-header table rows
|
|
87
|
+
if (line.startsWith("#") && !/^#{1,4}\s+(?:DO|DO NOT)/i.test(line))
|
|
88
|
+
return false;
|
|
89
|
+
if (line.startsWith("---") || line.startsWith("==="))
|
|
90
|
+
return false;
|
|
91
|
+
if (/^\|[\s:-]+(\|[\s:-]+)*\|$/.test(line))
|
|
92
|
+
return false; // Table separator row (multi-column)
|
|
93
|
+
if (line.startsWith("_") && line.endsWith("_"))
|
|
94
|
+
return false; // Italicized placeholder text
|
|
95
|
+
if (line.startsWith(">"))
|
|
96
|
+
return false; // Blockquotes (explanatory)
|
|
97
|
+
return RULE_PATTERNS.some((p) => p.test(line));
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Format budget report for verbose console output.
|
|
101
|
+
*/
|
|
102
|
+
export function formatBudgetReport(report) {
|
|
103
|
+
const lines = [];
|
|
104
|
+
lines.push(`[BUDGET] ${report.summary}`);
|
|
105
|
+
if (report.overBudget) {
|
|
106
|
+
lines.push(`[BUDGET] ⚠ Over budget: ${report.ruleCount} rules exceeds max ${MAX_RULES}`);
|
|
107
|
+
}
|
|
108
|
+
if (report.styleRules.length > 0) {
|
|
109
|
+
lines.push(`[BUDGET] Style rules that should be in linter config:`);
|
|
110
|
+
for (const sr of report.styleRules.slice(0, 5)) {
|
|
111
|
+
lines.push(`[BUDGET] Line ${sr.line}: "${sr.text}" → ${sr.suggestion}`);
|
|
112
|
+
}
|
|
113
|
+
if (report.styleRules.length > 5) {
|
|
114
|
+
lines.push(`[BUDGET] ... and ${report.styleRules.length - 5} more`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return lines.join("\n");
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=budget-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget-validator.js","sourceRoot":"","sources":["../src/budget-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CommandSet, Warning, WorkspaceCommand } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Extract build/test/lint/start commands from package.json scripts.
|
|
4
|
+
*/
|
|
5
|
+
export declare function extractCommands(packageDir: string, rootDir?: string, warnings?: Warning[]): CommandSet;
|
|
6
|
+
/**
|
|
7
|
+
* W3-1: Scan ALL package.json files in the workspace for operational commands.
|
|
8
|
+
* Finds commands matching operational patterns (db:*, sync:*, worker*, deploy*, generate*).
|
|
9
|
+
*/
|
|
10
|
+
export declare function scanWorkspaceCommands(rootDir: string, warnings?: Warning[], analyzedPackageNames?: Set<string>): WorkspaceCommand[];
|