autodocs-engine 0.9.0 → 0.9.1
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/analysis-builder.d.ts +2 -2
- package/dist/analysis-builder.js +8 -10
- package/dist/analysis-builder.js.map +1 -1
- package/dist/anti-pattern-detector.d.ts +1 -1
- package/dist/architecture-detector.d.ts +2 -2
- package/dist/architecture-detector.js +9 -18
- package/dist/architecture-detector.js.map +1 -1
- package/dist/ast-parser.js +22 -49
- package/dist/ast-parser.js.map +1 -1
- package/dist/benchmark/code-generator.d.ts +1 -1
- package/dist/benchmark/code-generator.js +14 -1
- package/dist/benchmark/code-generator.js.map +1 -1
- package/dist/benchmark/pr-miner.js +20 -15
- package/dist/benchmark/pr-miner.js.map +1 -1
- package/dist/benchmark/pr-runner.js +21 -17
- package/dist/benchmark/pr-runner.js.map +1 -1
- package/dist/benchmark/pr-scorer.d.ts +1 -1
- package/dist/benchmark/pr-scorer.js +6 -8
- package/dist/benchmark/pr-scorer.js.map +1 -1
- package/dist/benchmark/pr-task-gen.js +4 -4
- package/dist/benchmark/pr-task-gen.js.map +1 -1
- package/dist/benchmark/report.js +13 -10
- package/dist/benchmark/report.js.map +1 -1
- package/dist/benchmark/runner.js +18 -22
- package/dist/benchmark/runner.js.map +1 -1
- package/dist/benchmark/scorer.js +66 -52
- package/dist/benchmark/scorer.js.map +1 -1
- package/dist/benchmark/shuffler.js +1 -1
- package/dist/benchmark/shuffler.js.map +1 -1
- package/dist/benchmark/statistics.js +8 -7
- package/dist/benchmark/statistics.js.map +1 -1
- package/dist/benchmark/task-generator.d.ts +1 -1
- package/dist/benchmark/task-generator.js +87 -46
- package/dist/benchmark/task-generator.js.map +1 -1
- package/dist/benchmark/types.d.ts +1 -1
- package/dist/bin/autodocs-engine.js +10 -10
- package/dist/bin/autodocs-engine.js.map +1 -1
- package/dist/bin/benchmark.js +12 -13
- package/dist/bin/benchmark.js.map +1 -1
- package/dist/bin/check.js +4 -5
- package/dist/bin/check.js.map +1 -1
- package/dist/bin/init.js +7 -4
- package/dist/bin/init.js.map +1 -1
- package/dist/bin/serve.js +6 -4
- package/dist/bin/serve.js.map +1 -1
- package/dist/budget-validator.js.map +1 -1
- package/dist/command-extractor.d.ts +2 -2
- package/dist/command-extractor.js +25 -19
- package/dist/command-extractor.js.map +1 -1
- package/dist/config-analyzer.js +28 -22
- package/dist/config-analyzer.js.map +1 -1
- package/dist/config.js +20 -14
- package/dist/config.js.map +1 -1
- package/dist/contribution-patterns.d.ts +1 -1
- package/dist/contribution-patterns.js +17 -12
- package/dist/contribution-patterns.js.map +1 -1
- package/dist/convention-extractor.d.ts +1 -1
- package/dist/convention-extractor.js +5 -5
- package/dist/convention-extractor.js.map +1 -1
- package/dist/cross-package.d.ts +1 -1
- package/dist/cross-package.js.map +1 -1
- package/dist/dependency-analyzer.js +29 -10
- package/dist/dependency-analyzer.js.map +1 -1
- package/dist/detectors/build-tool.js +1 -1
- package/dist/detectors/build-tool.js.map +1 -1
- package/dist/detectors/data-fetching.js +9 -4
- package/dist/detectors/data-fetching.js.map +1 -1
- package/dist/detectors/database.js +8 -8
- package/dist/detectors/database.js.map +1 -1
- package/dist/detectors/file-naming.js +1 -1
- package/dist/detectors/file-naming.js.map +1 -1
- package/dist/detectors/hook-patterns.js +2 -4
- package/dist/detectors/hook-patterns.js.map +1 -1
- package/dist/detectors/import-ordering.js +41 -12
- package/dist/detectors/import-ordering.js.map +1 -1
- package/dist/detectors/test-framework-ecosystem.js.map +1 -1
- package/dist/detectors/test-patterns.js.map +1 -1
- package/dist/detectors/web-framework.js +11 -3
- package/dist/detectors/web-framework.js.map +1 -1
- package/dist/deterministic-formatter.d.ts +1 -1
- package/dist/deterministic-formatter.js +116 -64
- package/dist/deterministic-formatter.js.map +1 -1
- package/dist/diff-analyzer.d.ts +1 -1
- package/dist/diff-analyzer.js +1 -1
- package/dist/diff-analyzer.js.map +1 -1
- package/dist/example-extractor.js +1 -1
- package/dist/example-extractor.js.map +1 -1
- package/dist/existing-docs.js +8 -18
- package/dist/existing-docs.js.map +1 -1
- package/dist/file-discovery.d.ts +1 -1
- package/dist/file-discovery.js +6 -8
- package/dist/file-discovery.js.map +1 -1
- package/dist/git-history.d.ts +2 -2
- package/dist/git-history.js +15 -21
- package/dist/git-history.js.map +1 -1
- package/dist/impact-classifier.d.ts +1 -1
- package/dist/impact-classifier.js +2 -7
- package/dist/impact-classifier.js.map +1 -1
- package/dist/import-chain.d.ts +1 -1
- package/dist/import-chain.js +2 -4
- package/dist/import-chain.js.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/inferability.js +80 -30
- package/dist/inferability.js.map +1 -1
- package/dist/llm/adapter.d.ts +1 -1
- package/dist/llm/adapter.js +3 -3
- package/dist/llm/adapter.js.map +1 -1
- package/dist/llm/client.js +1 -1
- package/dist/llm/client.js.map +1 -1
- package/dist/llm/hierarchical.d.ts +1 -1
- package/dist/llm/hierarchical.js +8 -8
- package/dist/llm/hierarchical.js.map +1 -1
- package/dist/llm/serializer.d.ts +1 -1
- package/dist/llm/serializer.js +9 -3
- package/dist/llm/serializer.js.map +1 -1
- package/dist/llm/template-selector.js +1 -1
- package/dist/llm/template-selector.js.map +1 -1
- package/dist/llm-adapter.d.ts +1 -1
- package/dist/llm-adapter.js +1 -1
- package/dist/llm-adapter.js.map +1 -1
- package/dist/mcp/cache.js +5 -3
- package/dist/mcp/cache.js.map +1 -1
- package/dist/mcp/errors.js +1 -1
- package/dist/mcp/errors.js.map +1 -1
- package/dist/mcp/queries.d.ts +2 -2
- package/dist/mcp/queries.js +52 -57
- package/dist/mcp/queries.js.map +1 -1
- package/dist/mcp/server.js +32 -23
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.js +60 -23
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mermaid-generator.js +16 -8
- package/dist/mermaid-generator.js.map +1 -1
- package/dist/meta-tool-detector.js +2 -2
- package/dist/meta-tool-detector.js.map +1 -1
- package/dist/output-validator.d.ts +1 -1
- package/dist/output-validator.js +9 -5
- package/dist/output-validator.js.map +1 -1
- package/dist/pattern-fingerprinter.js +22 -20
- package/dist/pattern-fingerprinter.js.map +1 -1
- package/dist/pipeline.js +33 -27
- package/dist/pipeline.js.map +1 -1
- package/dist/plugin-loader.js +2 -2
- package/dist/plugin-loader.js.map +1 -1
- package/dist/role-inferrer.js +72 -34
- package/dist/role-inferrer.js.map +1 -1
- package/dist/symbol-graph.js +13 -17
- package/dist/symbol-graph.js.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/workflow-rules.d.ts +1 -1
- package/dist/workflow-rules.js +6 -6
- package/dist/workflow-rules.js.map +1 -1
- package/package.json +14 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-naming.js","sourceRoot":"","sources":["../../src/detectors/file-naming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"file-naming.js","sourceRoot":"","sources":["../../src/detectors/file-naming.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { basename } from "node:path";
|
|
2
|
-
import {
|
|
2
|
+
import { buildConfidence, sourceParsedFiles } from "../convention-extractor.js";
|
|
3
3
|
const REACT_MODULES = new Set(["react", "react-dom", "preact", "preact/hooks", "preact/compat"]);
|
|
4
4
|
export const hookPatternDetector = (files, tiers, _warnings) => {
|
|
5
5
|
const conventions = [];
|
|
@@ -58,9 +58,7 @@ export const hookPatternDetector = (files, tiers, _warnings) => {
|
|
|
58
58
|
let coLocated = 0;
|
|
59
59
|
for (const hf of hookFiles) {
|
|
60
60
|
const base = hf.relativePath.replace(/\.[^.]+$/, "");
|
|
61
|
-
const testExists = allFiles.has(`${base}.test.ts`) ||
|
|
62
|
-
allFiles.has(`${base}.test.tsx`) ||
|
|
63
|
-
allFiles.has(`${base}.spec.ts`);
|
|
61
|
+
const testExists = allFiles.has(`${base}.test.ts`) || allFiles.has(`${base}.test.tsx`) || allFiles.has(`${base}.spec.ts`);
|
|
64
62
|
if (testExists)
|
|
65
63
|
coLocated++;
|
|
66
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-patterns.js","sourceRoot":"","sources":["../../src/detectors/hook-patterns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"hook-patterns.js","sourceRoot":"","sources":["../../src/detectors/hook-patterns.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,42 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { buildConfidence, sourceParsedFiles } from "../convention-extractor.js";
|
|
2
2
|
// Node.js built-in modules (with and without node: prefix)
|
|
3
3
|
const NODE_BUILTINS = new Set([
|
|
4
|
-
"assert",
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
4
|
+
"assert",
|
|
5
|
+
"buffer",
|
|
6
|
+
"child_process",
|
|
7
|
+
"cluster",
|
|
8
|
+
"console",
|
|
9
|
+
"constants",
|
|
10
|
+
"crypto",
|
|
11
|
+
"dgram",
|
|
12
|
+
"dns",
|
|
13
|
+
"domain",
|
|
14
|
+
"events",
|
|
15
|
+
"fs",
|
|
16
|
+
"http",
|
|
17
|
+
"https",
|
|
18
|
+
"module",
|
|
19
|
+
"net",
|
|
20
|
+
"os",
|
|
21
|
+
"path",
|
|
22
|
+
"perf_hooks",
|
|
23
|
+
"process",
|
|
24
|
+
"punycode",
|
|
25
|
+
"querystring",
|
|
26
|
+
"readline",
|
|
27
|
+
"repl",
|
|
28
|
+
"stream",
|
|
29
|
+
"string_decoder",
|
|
30
|
+
"sys",
|
|
31
|
+
"timers",
|
|
32
|
+
"tls",
|
|
33
|
+
"tty",
|
|
34
|
+
"url",
|
|
35
|
+
"util",
|
|
36
|
+
"v8",
|
|
37
|
+
"vm",
|
|
38
|
+
"worker_threads",
|
|
39
|
+
"zlib",
|
|
9
40
|
]);
|
|
10
41
|
function classifyImport(specifier) {
|
|
11
42
|
if (specifier.startsWith("node:"))
|
|
@@ -24,16 +55,14 @@ export const importOrderingDetector = (files, tiers, _warnings) => {
|
|
|
24
55
|
const conventions = [];
|
|
25
56
|
const sourceFiles = sourceParsedFiles(files, tiers);
|
|
26
57
|
// Only analyze files with ≥3 imports (need enough to detect ordering)
|
|
27
|
-
const filesWithImports = sourceFiles.filter(f => f.imports.filter(i => !i.isDynamic).length >= 3);
|
|
58
|
+
const filesWithImports = sourceFiles.filter((f) => f.imports.filter((i) => !i.isDynamic).length >= 3);
|
|
28
59
|
if (filesWithImports.length < 5)
|
|
29
60
|
return conventions;
|
|
30
61
|
let builtinFirstCount = 0;
|
|
31
62
|
let externalBeforeLocalCount = 0;
|
|
32
63
|
let totalWithMixedGroups = 0;
|
|
33
64
|
for (const file of filesWithImports) {
|
|
34
|
-
const groups = file.imports
|
|
35
|
-
.filter(i => !i.isDynamic)
|
|
36
|
-
.map(i => classifyImport(i.moduleSpecifier));
|
|
65
|
+
const groups = file.imports.filter((i) => !i.isDynamic).map((i) => classifyImport(i.moduleSpecifier));
|
|
37
66
|
// Skip files with only one import group
|
|
38
67
|
const uniqueGroups = new Set(groups);
|
|
39
68
|
if (uniqueGroups.size < 2)
|
|
@@ -63,7 +92,7 @@ export const importOrderingDetector = (files, tiers, _warnings) => {
|
|
|
63
92
|
name: "Import ordering: external before local",
|
|
64
93
|
description: "External/package imports appear before local relative imports",
|
|
65
94
|
confidence: buildConfidence(externalBeforeLocalCount, totalWithMixedGroups),
|
|
66
|
-
examples: [
|
|
95
|
+
examples: ['import { x } from "pkg"; // before', 'import { y } from "./local"; // after'],
|
|
67
96
|
});
|
|
68
97
|
}
|
|
69
98
|
// Report: builtin-first pattern (subset of above)
|
|
@@ -74,7 +103,7 @@ export const importOrderingDetector = (files, tiers, _warnings) => {
|
|
|
74
103
|
name: "Import ordering: Node builtins first",
|
|
75
104
|
description: "Node.js built-in imports (node:fs, node:path) appear before all other imports",
|
|
76
105
|
confidence: buildConfidence(builtinFirstCount, totalWithMixedGroups),
|
|
77
|
-
examples: [
|
|
106
|
+
examples: ['import { resolve } from "node:path"; // first', 'import { z } from "zod"; // after'],
|
|
78
107
|
});
|
|
79
108
|
}
|
|
80
109
|
return conventions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-ordering.js","sourceRoot":"","sources":["../../src/detectors/import-ordering.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"import-ordering.js","sourceRoot":"","sources":["../../src/detectors/import-ordering.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-framework-ecosystem.js","sourceRoot":"","sources":["../../src/detectors/test-framework-ecosystem.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,qFAAqF;AACrF,wEAAwE;
|
|
1
|
+
{"version":3,"file":"test-framework-ecosystem.js","sourceRoot":"","sources":["../../src/detectors/test-framework-ecosystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-patterns.js","sourceRoot":"","sources":["../../src/detectors/test-patterns.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"test-patterns.js","sourceRoot":"","sources":["../../src/detectors/test-patterns.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,9 +4,17 @@ import { buildConfidence } from "../convention-extractor.js";
|
|
|
4
4
|
const FRAMEWORK_MAP = {
|
|
5
5
|
express: { name: "Express", middleware: "app.use() middleware chain", router: "express.Router()" },
|
|
6
6
|
fastify: { name: "Fastify", middleware: "plugin system with decorators", router: "route shorthand methods" },
|
|
7
|
-
hono: {
|
|
7
|
+
hono: {
|
|
8
|
+
name: "Hono",
|
|
9
|
+
middleware: "app.use() with Context",
|
|
10
|
+
router: "tree-based routing with multiple router implementations",
|
|
11
|
+
},
|
|
8
12
|
koa: { name: "Koa", middleware: "async middleware cascade", router: "@koa/router or koa-router" },
|
|
9
|
-
"@nestjs/core": {
|
|
13
|
+
"@nestjs/core": {
|
|
14
|
+
name: "NestJS",
|
|
15
|
+
middleware: "decorator-based modules",
|
|
16
|
+
router: "controller decorators (@Get, @Post)",
|
|
17
|
+
},
|
|
10
18
|
"@hapi/hapi": { name: "Hapi", middleware: "server.ext() extension points", router: "server.route() configuration" },
|
|
11
19
|
};
|
|
12
20
|
export const webFrameworkDetector = (files, _tiers, _warnings, context) => {
|
|
@@ -33,7 +41,7 @@ export const webFrameworkDetector = (files, _tiers, _warnings, context) => {
|
|
|
33
41
|
for (const [pkg, framework] of Object.entries(FRAMEWORK_MAP)) {
|
|
34
42
|
if (detected.has(framework.name))
|
|
35
43
|
continue;
|
|
36
|
-
const importCount = files.filter((f) => f.imports.some((i) => !i.isTypeOnly && (i.moduleSpecifier === pkg || i.moduleSpecifier.startsWith(pkg
|
|
44
|
+
const importCount = files.filter((f) => f.imports.some((i) => !i.isTypeOnly && (i.moduleSpecifier === pkg || i.moduleSpecifier.startsWith(`${pkg}/`)))).length;
|
|
37
45
|
if (importCount > 0) {
|
|
38
46
|
detected.add(framework.name);
|
|
39
47
|
conventions.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-framework.js","sourceRoot":"","sources":["../../src/detectors/web-framework.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,iEAAiE;
|
|
1
|
+
{"version":3,"file":"web-framework.js","sourceRoot":"","sources":["../../src/detectors/web-framework.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,36 +1,92 @@
|
|
|
1
1
|
// src/deterministic-formatter.ts — Generate 13 AGENTS.md sections deterministically from analysis data
|
|
2
2
|
// No LLM call — pure data formatting. The LLM is used only for architecture + domain synthesis.
|
|
3
|
-
import {
|
|
3
|
+
import { complexityLabel, computeImpactRadius, impactLabel } from "./impact-radius.js";
|
|
4
|
+
import { computeInferabilityScore } from "./inferability.js";
|
|
4
5
|
import { sanitize, stripConventionStats } from "./llm/serializer.js";
|
|
5
6
|
import { PACKAGE_TO_FAMILY } from "./meta-tool-detector.js";
|
|
6
|
-
import {
|
|
7
|
-
import { computeInferabilityScore } from "./inferability.js";
|
|
7
|
+
import { ENGINE_VERSION } from "./types.js";
|
|
8
8
|
// ─── Directory Inferability ──────────────────────────────────────────────────
|
|
9
9
|
// Directories with these names are "obvious" — AI can infer their purpose
|
|
10
10
|
// from the name alone. Non-obvious directories benefit from AGENTS.md listing.
|
|
11
11
|
const OBVIOUS_DIR_NAMES = new Set([
|
|
12
|
-
"src",
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
12
|
+
"src",
|
|
13
|
+
"lib",
|
|
14
|
+
"dist",
|
|
15
|
+
"build",
|
|
16
|
+
"out",
|
|
17
|
+
"coverage",
|
|
18
|
+
"components",
|
|
19
|
+
"component",
|
|
20
|
+
"utils",
|
|
21
|
+
"util",
|
|
22
|
+
"utilities",
|
|
23
|
+
"helpers",
|
|
24
|
+
"helper",
|
|
25
|
+
"types",
|
|
26
|
+
"typings",
|
|
27
|
+
"interfaces",
|
|
28
|
+
"models",
|
|
29
|
+
"model",
|
|
30
|
+
"hooks",
|
|
31
|
+
"hook",
|
|
32
|
+
"styles",
|
|
33
|
+
"css",
|
|
34
|
+
"assets",
|
|
35
|
+
"images",
|
|
36
|
+
"icons",
|
|
37
|
+
"fonts",
|
|
38
|
+
"public",
|
|
39
|
+
"static",
|
|
40
|
+
"pages",
|
|
41
|
+
"page",
|
|
42
|
+
"views",
|
|
43
|
+
"view",
|
|
44
|
+
"screens",
|
|
45
|
+
"app",
|
|
46
|
+
"apps",
|
|
47
|
+
"api",
|
|
48
|
+
"apis",
|
|
49
|
+
"routes",
|
|
50
|
+
"route",
|
|
51
|
+
"controllers",
|
|
52
|
+
"controller",
|
|
53
|
+
"config",
|
|
54
|
+
"configs",
|
|
55
|
+
"configuration",
|
|
56
|
+
"settings",
|
|
57
|
+
"constants",
|
|
58
|
+
"const",
|
|
59
|
+
"test",
|
|
60
|
+
"tests",
|
|
61
|
+
"__tests__",
|
|
62
|
+
"spec",
|
|
63
|
+
"specs",
|
|
64
|
+
"__test__",
|
|
65
|
+
"middleware",
|
|
66
|
+
"middlewares",
|
|
67
|
+
"services",
|
|
68
|
+
"service",
|
|
69
|
+
"store",
|
|
70
|
+
"stores",
|
|
71
|
+
"state",
|
|
72
|
+
"context",
|
|
73
|
+
"contexts",
|
|
74
|
+
"providers",
|
|
75
|
+
"actions",
|
|
76
|
+
"reducers",
|
|
77
|
+
"selectors",
|
|
78
|
+
"layouts",
|
|
79
|
+
"layout",
|
|
80
|
+
"features",
|
|
81
|
+
"modules",
|
|
82
|
+
"common",
|
|
83
|
+
"shared",
|
|
84
|
+
"core",
|
|
85
|
+
"server",
|
|
86
|
+
"client",
|
|
87
|
+
"bin",
|
|
88
|
+
"cli",
|
|
89
|
+
"cmd",
|
|
34
90
|
]);
|
|
35
91
|
/**
|
|
36
92
|
* Check if a directory name is "obvious" — the AI can infer its purpose
|
|
@@ -121,7 +177,7 @@ export function assembleFinalOutput(deterministic, architectureSection, domainSe
|
|
|
121
177
|
if (deterministic.supportedFrameworks)
|
|
122
178
|
sections.push("", deterministic.supportedFrameworks);
|
|
123
179
|
sections.push("", deterministic.teamKnowledge);
|
|
124
|
-
return sections.join("\n")
|
|
180
|
+
return `${sections.join("\n")}\n`;
|
|
125
181
|
}
|
|
126
182
|
// ─── Section Formatters ──────────────────────────────────────────────────────
|
|
127
183
|
function formatTitle(analysis) {
|
|
@@ -283,12 +339,7 @@ function formatCommands(analysis) {
|
|
|
283
339
|
function formatPackageGuide(analysis) {
|
|
284
340
|
if (analysis.packages.length <= 1)
|
|
285
341
|
return "";
|
|
286
|
-
const lines = [
|
|
287
|
-
"## Package Guide",
|
|
288
|
-
"",
|
|
289
|
-
"| Package | Purpose | When to Use |",
|
|
290
|
-
"|---------|---------|-------------|",
|
|
291
|
-
];
|
|
342
|
+
const lines = ["## Package Guide", "", "| Package | Purpose | When to Use |", "|---------|---------|-------------|"];
|
|
292
343
|
for (const pkg of analysis.packages) {
|
|
293
344
|
const purpose = sanitize(pkg.role?.summary ?? pkg.description ?? pkg.architecture.packageType, 100);
|
|
294
345
|
const whenToUse = sanitize(pkg.role?.whenToUse ?? "", 100);
|
|
@@ -351,14 +402,25 @@ function formatPublicAPI(analysis) {
|
|
|
351
402
|
byKind.set(kind, list);
|
|
352
403
|
}
|
|
353
404
|
// Order: hooks, functions, components, types, interfaces, classes, enums, consts
|
|
354
|
-
const kindOrder = [
|
|
405
|
+
const kindOrder = [
|
|
406
|
+
"hook",
|
|
407
|
+
"function",
|
|
408
|
+
"component",
|
|
409
|
+
"type",
|
|
410
|
+
"interface",
|
|
411
|
+
"class",
|
|
412
|
+
"enum",
|
|
413
|
+
"const",
|
|
414
|
+
"namespace",
|
|
415
|
+
"unknown",
|
|
416
|
+
];
|
|
355
417
|
const lines = ["## Public API"];
|
|
356
418
|
const isMulti = analysis.packages.length > 1;
|
|
357
419
|
for (const kind of kindOrder) {
|
|
358
420
|
const group = byKind.get(kind);
|
|
359
421
|
if (!group || group.length === 0)
|
|
360
422
|
continue;
|
|
361
|
-
const label = kind.charAt(0).toUpperCase() + kind.slice(1)
|
|
423
|
+
const label = `${kind.charAt(0).toUpperCase() + kind.slice(1)}s`;
|
|
362
424
|
lines.push("");
|
|
363
425
|
lines.push(`### ${label}`);
|
|
364
426
|
lines.push("");
|
|
@@ -403,7 +465,7 @@ function formatDependencies(analysis) {
|
|
|
403
465
|
}
|
|
404
466
|
}
|
|
405
467
|
const testFw = pkg.dependencyInsights?.testFramework?.name;
|
|
406
|
-
const coreDeps = pkg.dependencies.external.filter(d => !supportedPkgs.has(d.name) && d.name !== testFw);
|
|
468
|
+
const coreDeps = pkg.dependencies.external.filter((d) => !supportedPkgs.has(d.name) && d.name !== testFw);
|
|
407
469
|
if (coreDeps.length > 0) {
|
|
408
470
|
if (!hasContent && prefix)
|
|
409
471
|
lines.push("", prefix.trim());
|
|
@@ -417,7 +479,7 @@ function formatDependencies(analysis) {
|
|
|
417
479
|
}
|
|
418
480
|
else {
|
|
419
481
|
const testFw = pkg.dependencyInsights?.testFramework?.name;
|
|
420
|
-
const topExternal = pkg.dependencies.external.filter(d => d.name !== testFw).slice(0, 10);
|
|
482
|
+
const topExternal = pkg.dependencies.external.filter((d) => d.name !== testFw).slice(0, 10);
|
|
421
483
|
if (topExternal.length > 0) {
|
|
422
484
|
if (!hasContent && prefix)
|
|
423
485
|
lines.push("", prefix.trim());
|
|
@@ -445,15 +507,13 @@ function formatConventions(analysis) {
|
|
|
445
507
|
for (const conv of pkg.conventions) {
|
|
446
508
|
// For meta-tools, reclassify ecosystem conventions (except core family)
|
|
447
509
|
if (pkg.isMetaTool && conv.source && ECOSYSTEM_DETECTORS.has(conv.source)) {
|
|
448
|
-
const isCore = coreFamilySet.size > 0 && [...coreFamilySet].some(family => conv.name.toLowerCase().includes(family));
|
|
510
|
+
const isCore = coreFamilySet.size > 0 && [...coreFamilySet].some((family) => conv.name.toLowerCase().includes(family));
|
|
449
511
|
if (!isCore)
|
|
450
512
|
continue; // Listed in "Supported Frameworks" section instead
|
|
451
513
|
}
|
|
452
514
|
const desc = stripConventionStats(conv.description);
|
|
453
515
|
if (desc) {
|
|
454
|
-
const examples = conv.examples.length > 0
|
|
455
|
-
? ` (e.g., \`${sanitize(conv.examples[0], 60)}\`)`
|
|
456
|
-
: "";
|
|
516
|
+
const examples = conv.examples.length > 0 ? ` (e.g., \`${sanitize(conv.examples[0], 60)}\`)` : "";
|
|
457
517
|
doRules.push(`- **DO**: ${desc}${examples}`);
|
|
458
518
|
}
|
|
459
519
|
}
|
|
@@ -526,7 +586,7 @@ function formatSupportedFrameworks(analysis) {
|
|
|
526
586
|
const { supportedFamilies, coreFamilies } = pkg.metaToolInfo;
|
|
527
587
|
// Exclude core families from the "supported" list (they're already in conventions)
|
|
528
588
|
const coreSet = new Set(coreFamilies);
|
|
529
|
-
const supported = supportedFamilies.filter(f => !coreSet.has(f));
|
|
589
|
+
const supported = supportedFamilies.filter((f) => !coreSet.has(f));
|
|
530
590
|
if (supported.length === 0)
|
|
531
591
|
return "";
|
|
532
592
|
const lines = [
|
|
@@ -604,8 +664,7 @@ function formatTeamKnowledge(analysis) {
|
|
|
604
664
|
// Multiple commands suggest ordering concerns
|
|
605
665
|
const pkg = analysis.packages[0];
|
|
606
666
|
if (pkg) {
|
|
607
|
-
const cmdCount = [pkg.commands.build, pkg.commands.test, pkg.commands.lint, pkg.commands.start]
|
|
608
|
-
.filter(Boolean).length;
|
|
667
|
+
const cmdCount = [pkg.commands.build, pkg.commands.test, pkg.commands.lint, pkg.commands.start].filter(Boolean).length;
|
|
609
668
|
if (cmdCount >= 3) {
|
|
610
669
|
questions.push("Are there ordering requirements between commands? (e.g., build before test, lint before commit)");
|
|
611
670
|
}
|
|
@@ -643,7 +702,7 @@ export function formatArchitectureFallback(pkg) {
|
|
|
643
702
|
// Filter to non-obvious directories only — obvious dirs (src/, lib/, utils/)
|
|
644
703
|
// are inferable by AI from source code. Listing them creates an anchoring effect
|
|
645
704
|
// that can HURT performance by blocking exploration of unlisted directories.
|
|
646
|
-
const nonObviousDirs = pkg.architecture.directories.filter(dir => !isObviousDirectory(dir.path));
|
|
705
|
+
const nonObviousDirs = pkg.architecture.directories.filter((dir) => !isObviousDirectory(dir.path));
|
|
647
706
|
const obviousCount = pkg.architecture.directories.length - nonObviousDirs.length;
|
|
648
707
|
if (nonObviousDirs.length > 0) {
|
|
649
708
|
lines.push("Key directories (non-exhaustive — explore the source tree for additional directories):");
|
|
@@ -740,22 +799,17 @@ export function generateMinimalAgentsMd(analysis) {
|
|
|
740
799
|
// 3. Workflow rules (conditional)
|
|
741
800
|
const workflow = formatMinimalWorkflowRules(analysis);
|
|
742
801
|
// 4. Conventions (conditional: boolean signal gate + high confidence)
|
|
743
|
-
const conventions = shouldIncludeMinimalConventions(pkg)
|
|
744
|
-
? formatMinimalConventions(pkg)
|
|
745
|
-
: "";
|
|
802
|
+
const conventions = shouldIncludeMinimalConventions(pkg) ? formatMinimalConventions(pkg) : "";
|
|
746
803
|
// 5. Architecture (conditional: non-obvious dirs)
|
|
747
|
-
const architecture = shouldIncludeMinimalArchitecture(pkg)
|
|
748
|
-
? formatMinimalArchitecture(pkg)
|
|
749
|
-
: "";
|
|
804
|
+
const architecture = shouldIncludeMinimalArchitecture(pkg) ? formatMinimalArchitecture(pkg) : "";
|
|
750
805
|
// 6. Package guide (conditional: monorepo 3+ packages)
|
|
751
806
|
const packages = formatMinimalPackageGuide(analysis);
|
|
752
807
|
// 7. Example pointer (conditional: has registration pattern)
|
|
753
808
|
const example = formatExamplePointer(pkg);
|
|
754
809
|
// Assemble non-empty sections
|
|
755
|
-
const optionalSections = [commands, workflow, conventions, architecture, packages, example]
|
|
756
|
-
.filter(s => s.length > 0);
|
|
810
|
+
const optionalSections = [commands, workflow, conventions, architecture, packages, example].filter((s) => s.length > 0);
|
|
757
811
|
// Kill switch: if we have very little non-title content, add standard note
|
|
758
|
-
const hasSubstantiveContent = optionalSections.some(s => s.includes("## Workflow") || s.includes("## Conventions") || s.includes("## Key Directories"));
|
|
812
|
+
const hasSubstantiveContent = optionalSections.some((s) => s.includes("## Workflow") || s.includes("## Conventions") || s.includes("## Key Directories"));
|
|
759
813
|
if (!hasSubstantiveContent) {
|
|
760
814
|
sections.push("Standard project structure — conventions are inferrable from source code.");
|
|
761
815
|
}
|
|
@@ -765,12 +819,12 @@ export function generateMinimalAgentsMd(analysis) {
|
|
|
765
819
|
// ─── Minimal: Boolean Signal Gates ──────────────────────────────────────────
|
|
766
820
|
function shouldIncludeMinimalConventions(pkg) {
|
|
767
821
|
const patterns = pkg.contributionPatterns ?? [];
|
|
768
|
-
const hasRegistration = patterns.some(p => p.registrationFile);
|
|
769
|
-
const hasNonStandardImports = patterns.some(p => (p.commonImports?.length ?? 0) > 0);
|
|
822
|
+
const hasRegistration = patterns.some((p) => p.registrationFile);
|
|
823
|
+
const hasNonStandardImports = patterns.some((p) => (p.commonImports?.length ?? 0) > 0);
|
|
770
824
|
return hasRegistration || hasNonStandardImports;
|
|
771
825
|
}
|
|
772
826
|
function shouldIncludeMinimalArchitecture(pkg) {
|
|
773
|
-
return pkg.architecture.directories.some(d => !isObviousDirectory(d.path));
|
|
827
|
+
return pkg.architecture.directories.some((d) => !isObviousDirectory(d.path));
|
|
774
828
|
}
|
|
775
829
|
// ─── Minimal: Section Formatters ────────────────────────────────────────────
|
|
776
830
|
function formatMinimalCommands(analysis) {
|
|
@@ -800,7 +854,7 @@ function formatMinimalCommands(analysis) {
|
|
|
800
854
|
if (cs.start)
|
|
801
855
|
cmds.push({ label: "Dev", run: cs.start.run });
|
|
802
856
|
// Fill remaining slots with non-duplicate "other" commands
|
|
803
|
-
const addedRuns = new Set(cmds.map(c => c.run));
|
|
857
|
+
const addedRuns = new Set(cmds.map((c) => c.run));
|
|
804
858
|
for (const cmd of cs.other) {
|
|
805
859
|
if (cmds.length >= MAX_MINIMAL_COMMANDS)
|
|
806
860
|
break;
|
|
@@ -813,7 +867,7 @@ function formatMinimalCommands(analysis) {
|
|
|
813
867
|
if (capped.length === 0)
|
|
814
868
|
return "";
|
|
815
869
|
// Triviality check: if ALL commands are trivial, just note it
|
|
816
|
-
const allTrivial = capped.every(c => isCommandTrivial(c.run, pm));
|
|
870
|
+
const allTrivial = capped.every((c) => isCommandTrivial(c.run, pm));
|
|
817
871
|
if (allTrivial) {
|
|
818
872
|
return `## Commands\n\nStandard \`${pm}\` scripts — see \`package.json\` for details.`;
|
|
819
873
|
}
|
|
@@ -856,7 +910,7 @@ function formatMinimalConventions(pkg) {
|
|
|
856
910
|
const dontRules = [];
|
|
857
911
|
// Filter to ≥95% confidence, sorted by confidence descending
|
|
858
912
|
const highConf = pkg.conventions
|
|
859
|
-
.filter(c => c.confidence.percentage >= MIN_CONVENTION_CONFIDENCE)
|
|
913
|
+
.filter((c) => c.confidence.percentage >= MIN_CONVENTION_CONFIDENCE)
|
|
860
914
|
.sort((a, b) => b.confidence.percentage - a.confidence.percentage);
|
|
861
915
|
for (const conv of highConf) {
|
|
862
916
|
if (doRules.length >= MAX_MINIMAL_CONVENTIONS)
|
|
@@ -864,9 +918,7 @@ function formatMinimalConventions(pkg) {
|
|
|
864
918
|
const desc = stripConventionStats(conv.description);
|
|
865
919
|
if (!desc)
|
|
866
920
|
continue;
|
|
867
|
-
const ex = conv.examples.length > 0
|
|
868
|
-
? ` (e.g., \`${sanitize(conv.examples[0], 40)}\`)`
|
|
869
|
-
: "";
|
|
921
|
+
const ex = conv.examples.length > 0 ? ` (e.g., \`${sanitize(conv.examples[0], 40)}\`)` : "";
|
|
870
922
|
doRules.push(`- **DO**: ${desc}${ex}`);
|
|
871
923
|
}
|
|
872
924
|
for (const ap of pkg.antiPatterns) {
|
|
@@ -880,7 +932,7 @@ function formatMinimalConventions(pkg) {
|
|
|
880
932
|
}
|
|
881
933
|
function formatMinimalArchitecture(pkg) {
|
|
882
934
|
const nonObvious = pkg.architecture.directories
|
|
883
|
-
.filter(d => !isObviousDirectory(d.path))
|
|
935
|
+
.filter((d) => !isObviousDirectory(d.path))
|
|
884
936
|
.slice(0, MAX_MINIMAL_DIRECTORIES);
|
|
885
937
|
if (nonObvious.length === 0)
|
|
886
938
|
return "";
|
|
@@ -906,7 +958,7 @@ function formatMinimalPackageGuide(analysis) {
|
|
|
906
958
|
return lines.join("\n");
|
|
907
959
|
}
|
|
908
960
|
function formatExamplePointer(pkg) {
|
|
909
|
-
const pattern = (pkg.contributionPatterns ?? []).find(p => p.registrationFile);
|
|
961
|
+
const pattern = (pkg.contributionPatterns ?? []).find((p) => p.registrationFile);
|
|
910
962
|
if (!pattern)
|
|
911
963
|
return "";
|
|
912
964
|
return `> **Example**: See \`${pattern.exampleFile}\` for the canonical pattern (register in \`${pattern.registrationFile}\`).`;
|