@dinyangetoh/codeplug-cli 0.1.3 → 0.1.5
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/README.md +149 -187
- package/dist/cli/commands/convention.d.ts +1 -1
- package/dist/cli/commands/convention.d.ts.map +1 -1
- package/dist/cli/commands/convention.js +174 -31
- package/dist/cli/commands/convention.js.map +1 -1
- package/dist/cli/commands/docs.d.ts.map +1 -1
- package/dist/cli/commands/docs.js +9 -2
- package/dist/cli/commands/docs.js.map +1 -1
- package/dist/cli/commands/export.d.ts.map +1 -1
- package/dist/cli/commands/export.js +6 -1
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/start.d.ts +2 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +172 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/index.js +9 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/config/ConfigManager.d.ts +18 -0
- package/dist/config/ConfigManager.d.ts.map +1 -1
- package/dist/config/ConfigManager.js +55 -2
- package/dist/config/ConfigManager.js.map +1 -1
- package/dist/config/ConventionSchema.d.ts +59 -0
- package/dist/config/ConventionSchema.d.ts.map +1 -1
- package/dist/config/ConventionSchema.js +11 -0
- package/dist/config/ConventionSchema.js.map +1 -1
- package/dist/config/defaults.d.ts +60 -2
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +136 -20
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/types.d.ts +71 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/core/analyzer/AstAnalyzer.d.ts +11 -2
- package/dist/core/analyzer/AstAnalyzer.d.ts.map +1 -1
- package/dist/core/analyzer/AstAnalyzer.js +21 -5
- package/dist/core/analyzer/AstAnalyzer.js.map +1 -1
- package/dist/core/analyzer/ConventionDetector.d.ts +12 -1
- package/dist/core/analyzer/ConventionDetector.d.ts.map +1 -1
- package/dist/core/analyzer/ConventionDetector.js +120 -20
- package/dist/core/analyzer/ConventionDetector.js.map +1 -1
- package/dist/core/analyzer/ConventionMlResolver.d.ts +4 -0
- package/dist/core/analyzer/ConventionMlResolver.d.ts.map +1 -0
- package/dist/core/analyzer/ConventionMlResolver.js +17 -0
- package/dist/core/analyzer/ConventionMlResolver.js.map +1 -0
- package/dist/core/analyzer/PatternAggregator.d.ts +11 -2
- package/dist/core/analyzer/PatternAggregator.d.ts.map +1 -1
- package/dist/core/analyzer/PatternAggregator.js +87 -15
- package/dist/core/analyzer/PatternAggregator.js.map +1 -1
- package/dist/core/analyzer/SemanticCoherencePhase.d.ts +10 -0
- package/dist/core/analyzer/SemanticCoherencePhase.d.ts.map +1 -0
- package/dist/core/analyzer/SemanticCoherencePhase.js +191 -0
- package/dist/core/analyzer/SemanticCoherencePhase.js.map +1 -0
- package/dist/core/analyzer/SemanticCoherenceService.d.ts +11 -0
- package/dist/core/analyzer/SemanticCoherenceService.d.ts.map +1 -0
- package/dist/core/analyzer/SemanticCoherenceService.js +56 -0
- package/dist/core/analyzer/SemanticCoherenceService.js.map +1 -0
- package/dist/core/analyzer/visitors/ComponentVisitor.d.ts.map +1 -1
- package/dist/core/analyzer/visitors/ComponentVisitor.js +2 -2
- package/dist/core/analyzer/visitors/ComponentVisitor.js.map +1 -1
- package/dist/core/analyzer/visitors/ErrorHandlingVisitor.d.ts.map +1 -1
- package/dist/core/analyzer/visitors/ErrorHandlingVisitor.js +2 -2
- package/dist/core/analyzer/visitors/ErrorHandlingVisitor.js.map +1 -1
- package/dist/core/analyzer/visitors/ImportVisitor.d.ts +5 -0
- package/dist/core/analyzer/visitors/ImportVisitor.d.ts.map +1 -1
- package/dist/core/analyzer/visitors/ImportVisitor.js +8 -3
- package/dist/core/analyzer/visitors/ImportVisitor.js.map +1 -1
- package/dist/core/analyzer/visitors/NamingVisitor.d.ts +20 -2
- package/dist/core/analyzer/visitors/NamingVisitor.d.ts.map +1 -1
- package/dist/core/analyzer/visitors/NamingVisitor.js +464 -25
- package/dist/core/analyzer/visitors/NamingVisitor.js.map +1 -1
- package/dist/core/analyzer/visitors/SchemaVisitor.d.ts +7 -0
- package/dist/core/analyzer/visitors/SchemaVisitor.d.ts.map +1 -0
- package/dist/core/analyzer/visitors/SchemaVisitor.js +50 -0
- package/dist/core/analyzer/visitors/SchemaVisitor.js.map +1 -0
- package/dist/core/analyzer/visitors/StructureVisitor.d.ts +4 -1
- package/dist/core/analyzer/visitors/StructureVisitor.d.ts.map +1 -1
- package/dist/core/analyzer/visitors/StructureVisitor.js +38 -4
- package/dist/core/analyzer/visitors/StructureVisitor.js.map +1 -1
- package/dist/core/analyzer/visitors/types.d.ts +4 -0
- package/dist/core/analyzer/visitors/types.d.ts.map +1 -1
- package/dist/core/classifier/CodeBertEmbedder.d.ts +9 -0
- package/dist/core/classifier/CodeBertEmbedder.d.ts.map +1 -0
- package/dist/core/classifier/CodeBertEmbedder.js +33 -0
- package/dist/core/classifier/CodeBertEmbedder.js.map +1 -0
- package/dist/core/classifier/ConfidenceGate.d.ts +2 -0
- package/dist/core/classifier/ConfidenceGate.d.ts.map +1 -1
- package/dist/core/classifier/ConfidenceGate.js +6 -2
- package/dist/core/classifier/ConfidenceGate.js.map +1 -1
- package/dist/core/exporter/FreshnessChecker.d.ts +5 -1
- package/dist/core/exporter/FreshnessChecker.d.ts.map +1 -1
- package/dist/core/exporter/FreshnessChecker.js +5 -10
- package/dist/core/exporter/FreshnessChecker.js.map +1 -1
- package/dist/core/generator/DocGenerator.d.ts +6 -1
- package/dist/core/generator/DocGenerator.d.ts.map +1 -1
- package/dist/core/generator/DocGenerator.js +34 -7
- package/dist/core/generator/DocGenerator.js.map +1 -1
- package/dist/core/generator/StalenessTracker.d.ts +7 -1
- package/dist/core/generator/StalenessTracker.d.ts.map +1 -1
- package/dist/core/generator/StalenessTracker.js +12 -12
- package/dist/core/generator/StalenessTracker.js.map +1 -1
- package/dist/core/generator/documents/ArchitectureGenerator.d.ts +1 -0
- package/dist/core/generator/documents/ArchitectureGenerator.d.ts.map +1 -1
- package/dist/core/generator/documents/ArchitectureGenerator.js +34 -16
- package/dist/core/generator/documents/ArchitectureGenerator.js.map +1 -1
- package/dist/core/generator/documents/ContributingGenerator.d.ts.map +1 -1
- package/dist/core/generator/documents/ContributingGenerator.js +10 -9
- package/dist/core/generator/documents/ContributingGenerator.js.map +1 -1
- package/dist/core/generator/documents/ConventionsGenerator.d.ts.map +1 -1
- package/dist/core/generator/documents/ConventionsGenerator.js +22 -8
- package/dist/core/generator/documents/ConventionsGenerator.js.map +1 -1
- package/dist/core/generator/documents/OnboardingGenerator.d.ts.map +1 -1
- package/dist/core/generator/documents/OnboardingGenerator.js +25 -27
- package/dist/core/generator/documents/OnboardingGenerator.js.map +1 -1
- package/dist/core/generator/documents/ReadmeGenerator.d.ts +4 -3
- package/dist/core/generator/documents/ReadmeGenerator.d.ts.map +1 -1
- package/dist/core/generator/documents/ReadmeGenerator.js +149 -140
- package/dist/core/generator/documents/ReadmeGenerator.js.map +1 -1
- package/dist/core/generator/documents/promptHelpers.d.ts +1 -1
- package/dist/core/generator/documents/promptHelpers.d.ts.map +1 -1
- package/dist/core/generator/documents/promptHelpers.js +1 -1
- package/dist/core/generator/documents/promptHelpers.js.map +1 -1
- package/dist/core/generator/documents/types.d.ts +4 -1
- package/dist/core/generator/documents/types.d.ts.map +1 -1
- package/dist/core/generator/facts/FactExtractor.d.ts +5 -0
- package/dist/core/generator/facts/FactExtractor.d.ts.map +1 -0
- package/dist/core/generator/facts/FactExtractor.js +90 -0
- package/dist/core/generator/facts/FactExtractor.js.map +1 -0
- package/dist/core/generator/facts/types.d.ts +18 -0
- package/dist/core/generator/facts/types.d.ts.map +1 -0
- package/dist/core/generator/facts/types.js +2 -0
- package/dist/core/generator/facts/types.js.map +1 -0
- package/dist/core/generator/mlPipelineBuilder.d.ts +8 -0
- package/dist/core/generator/mlPipelineBuilder.d.ts.map +1 -0
- package/dist/core/generator/mlPipelineBuilder.js +117 -0
- package/dist/core/generator/mlPipelineBuilder.js.map +1 -0
- package/dist/core/scorer/ComplianceScorer.d.ts +5 -1
- package/dist/core/scorer/ComplianceScorer.d.ts.map +1 -1
- package/dist/core/scorer/ComplianceScorer.js +47 -23
- package/dist/core/scorer/ComplianceScorer.js.map +1 -1
- package/dist/core/scorer/ViolationDetector.d.ts +19 -2
- package/dist/core/scorer/ViolationDetector.d.ts.map +1 -1
- package/dist/core/scorer/ViolationDetector.js +169 -53
- package/dist/core/scorer/ViolationDetector.js.map +1 -1
- package/dist/models/ModelManager.d.ts +5 -1
- package/dist/models/ModelManager.d.ts.map +1 -1
- package/dist/models/ModelManager.js +19 -5
- package/dist/models/ModelManager.js.map +1 -1
- package/dist/models/ModelRegistry.d.ts +1 -1
- package/dist/models/ModelRegistry.d.ts.map +1 -1
- package/dist/models/ModelRegistry.js +28 -0
- package/dist/models/ModelRegistry.js.map +1 -1
- package/dist/storage/CustomRuleStore.d.ts +9 -0
- package/dist/storage/CustomRuleStore.d.ts.map +1 -0
- package/dist/storage/CustomRuleStore.js +22 -0
- package/dist/storage/CustomRuleStore.js.map +1 -0
- package/dist/storage/ScoreStore.d.ts +2 -5
- package/dist/storage/ScoreStore.d.ts.map +1 -1
- package/dist/storage/ScoreStore.js +23 -71
- package/dist/storage/ScoreStore.js.map +1 -1
- package/package.json +4 -3
- package/dist/core/classifier/DriftClassifier.d.ts +0 -17
- package/dist/core/classifier/DriftClassifier.d.ts.map +0 -1
- package/dist/core/classifier/DriftClassifier.js +0 -293
- package/dist/core/classifier/DriftClassifier.js.map +0 -1
|
@@ -1,228 +1,237 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { DEFAULT_DOCS } from "../../../config/defaults.js";
|
|
2
|
+
import { EXISTING_CONTENT_INSTRUCTION, OVERVIEW_INSTRUCTION, STRUCTURE_INSTRUCTION, } from "./promptHelpers.js";
|
|
3
3
|
export class ReadmeGenerator {
|
|
4
4
|
async generate(ctx) {
|
|
5
|
-
const projectName = ctx.
|
|
5
|
+
const projectName = ctx.facts.projectName;
|
|
6
6
|
const sections = [];
|
|
7
7
|
sections.push(`# ${projectName}\n`);
|
|
8
|
-
sections.push(this.
|
|
9
|
-
sections.push(this.
|
|
10
|
-
sections.push(this.buildQuickStart(projectName, ctx));
|
|
8
|
+
sections.push(this.buildOverview(ctx));
|
|
9
|
+
sections.push(this.buildKeyFeatures(ctx));
|
|
11
10
|
sections.push(this.buildPrerequisites(ctx));
|
|
12
11
|
sections.push(this.buildInstallation(projectName, ctx));
|
|
12
|
+
sections.push(this.buildQuickStart(projectName, ctx));
|
|
13
13
|
sections.push(this.buildUsage(ctx));
|
|
14
|
-
sections.push(this.
|
|
14
|
+
sections.push(this.buildProjectStructure(ctx));
|
|
15
15
|
sections.push(this.buildTechStack(ctx));
|
|
16
16
|
sections.push(this.buildConfiguration(ctx));
|
|
17
|
-
sections.push(this.buildDevelopment(ctx));
|
|
18
17
|
sections.push(this.buildConventionsSummary(ctx));
|
|
19
|
-
|
|
18
|
+
sections.push(this.buildDevelopment(ctx));
|
|
19
|
+
const template = sections.filter(Boolean).join("\n");
|
|
20
20
|
if (ctx.llmAvailable && ctx.llmClient) {
|
|
21
21
|
return this.enhanceWithLlm(ctx, template);
|
|
22
22
|
}
|
|
23
23
|
return template;
|
|
24
24
|
}
|
|
25
|
-
|
|
26
|
-
const
|
|
25
|
+
buildOverview(ctx) {
|
|
26
|
+
const description = ctx.facts.description;
|
|
27
27
|
const { analysis } = ctx;
|
|
28
28
|
const topPatterns = analysis.patterns
|
|
29
29
|
.slice(0, 3)
|
|
30
30
|
.map((p) => p.pattern)
|
|
31
|
-
.join(
|
|
32
|
-
if (
|
|
33
|
-
return [
|
|
31
|
+
.join(", ");
|
|
32
|
+
if (description) {
|
|
33
|
+
return [
|
|
34
|
+
`## Overview\n`,
|
|
35
|
+
description,
|
|
36
|
+
"",
|
|
37
|
+
topPatterns ? `Key patterns: ${topPatterns}.` : "",
|
|
38
|
+
"",
|
|
39
|
+
]
|
|
40
|
+
.filter(Boolean)
|
|
41
|
+
.join("\n");
|
|
34
42
|
}
|
|
35
43
|
return [
|
|
36
|
-
|
|
44
|
+
"## Overview\n",
|
|
37
45
|
`A project with ${analysis.fileCount} source files.`,
|
|
38
|
-
topPatterns ? `Key patterns: ${topPatterns}.` :
|
|
39
|
-
|
|
40
|
-
]
|
|
46
|
+
topPatterns ? `Key patterns: ${topPatterns}.` : "",
|
|
47
|
+
"",
|
|
48
|
+
]
|
|
49
|
+
.filter(Boolean)
|
|
50
|
+
.join("\n");
|
|
41
51
|
}
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
const dimensions = new Set(ctx.analysis.patterns.map((p) => p.dimension));
|
|
45
|
-
const features = [];
|
|
46
|
-
if (keywords.length > 0) {
|
|
47
|
-
features.push(...keywords.slice(0, 6));
|
|
48
|
-
}
|
|
49
|
-
if (dimensions.has('component'))
|
|
50
|
-
features.push('Component-based architecture');
|
|
51
|
-
if (dimensions.has('testing'))
|
|
52
|
-
features.push('Automated testing');
|
|
53
|
-
if (ctx.conventions.length > 0)
|
|
54
|
-
features.push('Convention detection');
|
|
52
|
+
buildKeyFeatures(ctx) {
|
|
53
|
+
const features = ctx.facts.features;
|
|
55
54
|
if (features.length === 0)
|
|
56
|
-
return
|
|
57
|
-
return [
|
|
55
|
+
return "";
|
|
56
|
+
return ["## Key Features\n", ...features.map((f) => `- ${f}`), "", ""].join("\n");
|
|
58
57
|
}
|
|
59
58
|
buildQuickStart(projectName, ctx) {
|
|
60
|
-
|
|
61
|
-
const isCli = !!bin;
|
|
62
|
-
const pkgName = ctx.packageMetadata?.name ?? 'package-name';
|
|
63
|
-
if (isCli) {
|
|
64
|
-
const cmd = typeof bin === 'string' ? bin.split('/').pop() ?? pkgName.replace(/^@[\w-]+\//, '') : Object.keys(bin)[0] ?? 'cli';
|
|
59
|
+
if (!ctx.facts.hasCLI) {
|
|
65
60
|
return [
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
61
|
+
"## Quick Start\n",
|
|
62
|
+
"```bash",
|
|
63
|
+
"git clone <repository-url>",
|
|
69
64
|
`cd ${projectName}`,
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
65
|
+
"npm install",
|
|
66
|
+
"npm run build",
|
|
67
|
+
"npm start",
|
|
68
|
+
"```",
|
|
69
|
+
"",
|
|
70
|
+
].join("\n");
|
|
75
71
|
}
|
|
72
|
+
const pkgName = ctx.packageMetadata?.name ?? "package-name";
|
|
73
|
+
const bin = ctx.packageMetadata?.bin;
|
|
74
|
+
const cmd = typeof bin === "string"
|
|
75
|
+
? (bin.split("/").pop() ?? pkgName.replace(/^@[\w-]+\//, ""))
|
|
76
|
+
: (Object.keys(bin ?? {})[0] ?? "cli");
|
|
76
77
|
return [
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
"## Quick Start\n",
|
|
79
|
+
"```bash",
|
|
80
|
+
`npm install -g ${pkgName}`,
|
|
80
81
|
`cd ${projectName}`,
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
'',
|
|
86
|
-
].join('\n');
|
|
82
|
+
`${cmd} --help`,
|
|
83
|
+
"```",
|
|
84
|
+
"",
|
|
85
|
+
].join("\n");
|
|
87
86
|
}
|
|
88
87
|
buildPrerequisites(ctx) {
|
|
89
88
|
const engines = ctx.packageMetadata?.engines;
|
|
90
89
|
const nodeReq = engines?.node;
|
|
91
90
|
if (!nodeReq)
|
|
92
|
-
return
|
|
91
|
+
return "";
|
|
93
92
|
return [
|
|
94
|
-
|
|
93
|
+
"## Prerequisites\n",
|
|
95
94
|
`- Node.js ${nodeReq}`,
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
].join(
|
|
95
|
+
"- Git (for drift detection and history analysis)",
|
|
96
|
+
"",
|
|
97
|
+
].join("\n");
|
|
99
98
|
}
|
|
100
99
|
buildInstallation(projectName, ctx) {
|
|
101
100
|
const bin = ctx.packageMetadata?.bin;
|
|
102
101
|
const isCli = !!bin;
|
|
103
|
-
const pkgName = ctx.packageMetadata?.name ??
|
|
102
|
+
const pkgName = ctx.packageMetadata?.name ?? "package-name";
|
|
104
103
|
if (isCli) {
|
|
105
104
|
return [
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
105
|
+
"## Installation\n",
|
|
106
|
+
"### Global install\n",
|
|
107
|
+
"```bash",
|
|
109
108
|
`npm install -g ${pkgName}`,
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
109
|
+
"```",
|
|
110
|
+
"",
|
|
111
|
+
"### Local development\n",
|
|
112
|
+
"```bash",
|
|
113
|
+
"git clone <repository-url>",
|
|
115
114
|
`cd ${projectName}`,
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
].join(
|
|
115
|
+
"npm install",
|
|
116
|
+
"npm run build",
|
|
117
|
+
"node dist/cli/index.js --help",
|
|
118
|
+
"```",
|
|
119
|
+
"",
|
|
120
|
+
].join("\n");
|
|
122
121
|
}
|
|
123
122
|
return [
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
123
|
+
"## Installation\n",
|
|
124
|
+
"```bash",
|
|
125
|
+
"git clone <repository-url>",
|
|
127
126
|
`cd ${projectName}`,
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
].join(
|
|
127
|
+
"npm install",
|
|
128
|
+
"npm run build",
|
|
129
|
+
"```",
|
|
130
|
+
"",
|
|
131
|
+
].join("\n");
|
|
133
132
|
}
|
|
134
133
|
buildUsage(ctx) {
|
|
135
134
|
const bin = ctx.packageMetadata?.bin;
|
|
136
135
|
if (!bin)
|
|
137
|
-
return
|
|
138
|
-
const cmd = typeof bin ===
|
|
136
|
+
return "";
|
|
137
|
+
const cmd = typeof bin === "string"
|
|
138
|
+
? (bin.split("/").pop() ?? "codeplug")
|
|
139
|
+
: (Object.keys(bin)[0] ?? "codeplug");
|
|
139
140
|
return [
|
|
140
|
-
|
|
141
|
+
"## Usage\n",
|
|
141
142
|
`Use \`${cmd}\` to run commands. See \`${cmd} --help\` for options.`,
|
|
142
|
-
|
|
143
|
-
].join(
|
|
143
|
+
"",
|
|
144
|
+
].join("\n");
|
|
145
|
+
}
|
|
146
|
+
buildProjectStructure(ctx) {
|
|
147
|
+
const root = ctx.facts.folderStructure;
|
|
148
|
+
return this.buildFolderStructure(root, 0, 3);
|
|
144
149
|
}
|
|
145
150
|
buildFolderStructure(root, depth = 0, maxDepth = 3) {
|
|
146
151
|
if (depth === 0) {
|
|
147
|
-
const lines = [
|
|
152
|
+
const lines = ["## Project Structure\n", "```"];
|
|
148
153
|
lines.push(...this.renderTree(root, 0, maxDepth));
|
|
149
|
-
lines.push(
|
|
150
|
-
return lines.join(
|
|
154
|
+
lines.push("```", "");
|
|
155
|
+
return lines.join("\n");
|
|
151
156
|
}
|
|
152
|
-
return
|
|
157
|
+
return "";
|
|
153
158
|
}
|
|
154
159
|
renderTree(node, depth, maxDepth) {
|
|
155
160
|
if (depth > maxDepth)
|
|
156
161
|
return [];
|
|
157
|
-
const indent =
|
|
158
|
-
const lines = [
|
|
162
|
+
const indent = " ".repeat(depth);
|
|
163
|
+
const lines = [
|
|
164
|
+
`${indent}${node.name}/ (${node.fileCount} files)`,
|
|
165
|
+
];
|
|
159
166
|
for (const child of node.children) {
|
|
160
167
|
lines.push(...this.renderTree(child, depth + 1, maxDepth));
|
|
161
168
|
}
|
|
162
169
|
return lines;
|
|
163
170
|
}
|
|
164
171
|
buildTechStack(ctx) {
|
|
165
|
-
const
|
|
166
|
-
const techs = [];
|
|
167
|
-
if (dimensions.has('imports'))
|
|
168
|
-
techs.push('ES Modules');
|
|
169
|
-
if (dimensions.has('component'))
|
|
170
|
-
techs.push('Component-based architecture');
|
|
171
|
-
if (dimensions.has('testing'))
|
|
172
|
-
techs.push('Automated testing');
|
|
173
|
-
if (dimensions.has('api'))
|
|
174
|
-
techs.push('API layer');
|
|
175
|
-
if (dimensions.has('state'))
|
|
176
|
-
techs.push('State management');
|
|
172
|
+
const techs = ctx.facts.techStack;
|
|
177
173
|
if (techs.length === 0)
|
|
178
|
-
return
|
|
179
|
-
return [
|
|
174
|
+
return "";
|
|
175
|
+
return [
|
|
176
|
+
"## Tech Stack\n",
|
|
177
|
+
...techs.slice(0, 12).map((t) => `- ${t}`),
|
|
178
|
+
"",
|
|
179
|
+
"",
|
|
180
|
+
].join("\n");
|
|
180
181
|
}
|
|
181
182
|
buildConfiguration(ctx) {
|
|
182
|
-
const hasConfig = ctx.analysis.patterns.some((p) => p.dimension ===
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
183
|
+
const hasConfig = ctx.analysis.patterns.some((p) => p.dimension === "structure" &&
|
|
184
|
+
p.pattern.toLowerCase().includes("config"));
|
|
185
|
+
const hasConventions = ctx.facts.conventions.some((c) => c.dimension === "structure");
|
|
186
|
+
if (!hasConfig && !hasConventions)
|
|
187
|
+
return "";
|
|
186
188
|
return [
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
].join(
|
|
189
|
+
"## Configuration\n",
|
|
190
|
+
"Project-level configuration can be adjusted in config files. See project docs for options.",
|
|
191
|
+
"",
|
|
192
|
+
].join("\n");
|
|
191
193
|
}
|
|
192
194
|
buildDevelopment(ctx) {
|
|
193
|
-
const scripts = ctx.
|
|
195
|
+
const scripts = ctx.facts.scripts;
|
|
194
196
|
if (!scripts || Object.keys(scripts).length === 0)
|
|
195
|
-
return
|
|
196
|
-
const
|
|
197
|
+
return "";
|
|
198
|
+
const candidates = ctx.docsConfig?.devScripts ?? DEFAULT_DOCS.devScripts ?? [];
|
|
199
|
+
const devScripts = candidates.filter((s) => scripts[s]);
|
|
197
200
|
if (devScripts.length === 0)
|
|
198
|
-
return
|
|
199
|
-
const lines = [
|
|
200
|
-
|
|
201
|
+
return "";
|
|
202
|
+
const lines = [
|
|
203
|
+
"## Development\n",
|
|
204
|
+
"```bash",
|
|
205
|
+
...devScripts.map((s) => `npm run ${s}`),
|
|
206
|
+
"```",
|
|
207
|
+
"",
|
|
208
|
+
];
|
|
209
|
+
return lines.join("\n");
|
|
201
210
|
}
|
|
202
211
|
buildConventionsSummary(ctx) {
|
|
203
|
-
if (ctx.conventions.length === 0)
|
|
204
|
-
return
|
|
205
|
-
const confirmed = ctx.conventions.filter((c) => c.confirmed);
|
|
212
|
+
if (ctx.facts.conventions.length === 0)
|
|
213
|
+
return "";
|
|
214
|
+
const confirmed = ctx.facts.conventions.filter((c) => c.confirmed);
|
|
206
215
|
const grouped = new Map();
|
|
207
216
|
for (const c of confirmed.slice(0, 10)) {
|
|
208
217
|
const list = grouped.get(c.dimension) ?? [];
|
|
209
218
|
list.push(c.rule);
|
|
210
219
|
grouped.set(c.dimension, list);
|
|
211
220
|
}
|
|
212
|
-
const lines = [
|
|
221
|
+
const lines = ["## Conventions\n"];
|
|
213
222
|
for (const [dim, rules] of grouped) {
|
|
214
223
|
lines.push(`### ${dim}\n`);
|
|
215
224
|
for (const rule of rules) {
|
|
216
225
|
lines.push(`- ${rule}`);
|
|
217
226
|
}
|
|
218
|
-
lines.push(
|
|
227
|
+
lines.push("");
|
|
219
228
|
}
|
|
220
|
-
return lines.join(
|
|
229
|
+
return lines.join("\n");
|
|
221
230
|
}
|
|
222
231
|
async enhanceWithLlm(ctx, template) {
|
|
223
232
|
const baseInstructions = [
|
|
224
233
|
`Improve the following README for a ${ctx.audience} audience in a ${ctx.style} style.`,
|
|
225
|
-
|
|
234
|
+
OVERVIEW_INSTRUCTION,
|
|
226
235
|
STRUCTURE_INSTRUCTION,
|
|
227
236
|
];
|
|
228
237
|
let prompt;
|
|
@@ -230,26 +239,26 @@ export class ReadmeGenerator {
|
|
|
230
239
|
prompt = [
|
|
231
240
|
...baseInstructions,
|
|
232
241
|
EXISTING_CONTENT_INSTRUCTION,
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
242
|
+
"Below is the EXISTING README. Preserve valuable content: tagline, features list, usage commands, configuration, installation, development. Incorporate the generated analysis (folder structure, conventions). Return only the final markdown.",
|
|
243
|
+
"",
|
|
244
|
+
"--- EXISTING README ---",
|
|
236
245
|
ctx.existingDoc,
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
246
|
+
"--- END EXISTING README ---",
|
|
247
|
+
"",
|
|
248
|
+
"--- GENERATED TEMPLATE (incorporate into merged output) ---",
|
|
240
249
|
template,
|
|
241
|
-
].join(
|
|
250
|
+
].join("\n");
|
|
242
251
|
}
|
|
243
252
|
else {
|
|
244
253
|
prompt = [
|
|
245
254
|
...baseInstructions,
|
|
246
|
-
|
|
247
|
-
|
|
255
|
+
"Include: Overview, Key Features, Prerequisites, Installation, Quick Start, Usage, Configuration (if applicable), Development, Project Structure, Conventions. Use package metadata when provided.",
|
|
256
|
+
"Return only the final markdown.\n",
|
|
248
257
|
template,
|
|
249
|
-
].join(
|
|
258
|
+
].join("\n");
|
|
250
259
|
}
|
|
251
260
|
return ctx.llmClient.generate(prompt, {
|
|
252
|
-
systemPrompt:
|
|
261
|
+
systemPrompt: "You are a technical documentation writer. Preserve existing high-value content when instructed. Always include a clear Overview and section titles.",
|
|
253
262
|
temperature: 0.3,
|
|
254
263
|
maxTokens: 4000,
|
|
255
264
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReadmeGenerator.js","sourceRoot":"","sources":["../../../../src/core/generator/documents/ReadmeGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"ReadmeGenerator.js","sourceRoot":"","sources":["../../../../src/core/generator/documents/ReadmeGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const
|
|
1
|
+
export declare const OVERVIEW_INSTRUCTION = "Start with an Overview (2-4 sentences) that explains what this document covers and its purpose.";
|
|
2
2
|
export declare const STRUCTURE_INSTRUCTION = "Use clear H2/H3 titles. Include Overview, Key Descriptions, and logical sections.";
|
|
3
3
|
export declare const EXISTING_CONTENT_INSTRUCTION = "When existing content is provided, preserve sections that add value; merge or improve rather than replace wholesale.";
|
|
4
4
|
//# sourceMappingURL=promptHelpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promptHelpers.d.ts","sourceRoot":"","sources":["../../../../src/core/generator/documents/promptHelpers.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"promptHelpers.d.ts","sourceRoot":"","sources":["../../../../src/core/generator/documents/promptHelpers.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,oGACkE,CAAC;AAEpG,eAAO,MAAM,qBAAqB,sFACmD,CAAC;AAEtF,eAAO,MAAM,4BAA4B,yHAC+E,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const
|
|
1
|
+
export const OVERVIEW_INSTRUCTION = 'Start with an Overview (2-4 sentences) that explains what this document covers and its purpose.';
|
|
2
2
|
export const STRUCTURE_INSTRUCTION = 'Use clear H2/H3 titles. Include Overview, Key Descriptions, and logical sections.';
|
|
3
3
|
export const EXISTING_CONTENT_INSTRUCTION = 'When existing content is provided, preserve sections that add value; merge or improve rather than replace wholesale.';
|
|
4
4
|
//# sourceMappingURL=promptHelpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promptHelpers.js","sourceRoot":"","sources":["../../../../src/core/generator/documents/promptHelpers.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"promptHelpers.js","sourceRoot":"","sources":["../../../../src/core/generator/documents/promptHelpers.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAC/B,iGAAiG,CAAC;AAEpG,MAAM,CAAC,MAAM,qBAAqB,GAChC,mFAAmF,CAAC;AAEtF,MAAM,CAAC,MAAM,4BAA4B,GACvC,sHAAsH,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { AnalysisResult, Convention } from '../../../config/types.js';
|
|
1
|
+
import type { AnalysisResult, Convention, DocsConfig } from '../../../config/types.js';
|
|
2
2
|
import type { LlmClient } from '../llm/LlmClient.js';
|
|
3
|
+
import type { DocFacts } from '../facts/types.js';
|
|
3
4
|
export interface PackageMetadata {
|
|
4
5
|
description?: string;
|
|
5
6
|
name?: string;
|
|
@@ -18,6 +19,8 @@ export interface GenerationContext {
|
|
|
18
19
|
llmClient?: LlmClient;
|
|
19
20
|
existingDoc?: string;
|
|
20
21
|
packageMetadata?: PackageMetadata;
|
|
22
|
+
docsConfig?: DocsConfig;
|
|
23
|
+
facts: DocFacts;
|
|
21
24
|
}
|
|
22
25
|
export type LlmRequiredContext = GenerationContext & {
|
|
23
26
|
llmClient: LlmClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/generator/documents/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/generator/documents/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,cAAc,CAAC;IACzB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,CAAC;AAE9E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACvD"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AnalysisResult, Convention } from '../../../config/types.js';
|
|
2
|
+
import type { PackageMetadata } from '../documents/types.js';
|
|
3
|
+
import type { DocFacts } from './types.js';
|
|
4
|
+
export declare function extractFacts(analysis: AnalysisResult, conventions: Convention[], packageMetadata?: PackageMetadata, projectRoot?: string): DocFacts;
|
|
5
|
+
//# sourceMappingURL=FactExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FactExtractor.d.ts","sourceRoot":"","sources":["../../../../src/core/generator/facts/FactExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAmB,MAAM,0BAA0B,CAAC;AAC5F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,YAAY,CAAC;AA+ErD,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,UAAU,EAAE,EACzB,eAAe,CAAC,EAAE,eAAe,EACjC,WAAW,CAAC,EAAE,MAAM,GACnB,QAAQ,CA8BV"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
const DIMENSION_TO_TECH = {
|
|
2
|
+
imports: 'ES Modules',
|
|
3
|
+
component: 'Component-based architecture',
|
|
4
|
+
testing: 'Automated testing',
|
|
5
|
+
api: 'API layer',
|
|
6
|
+
state: 'State management',
|
|
7
|
+
'error-handling': 'Error handling patterns',
|
|
8
|
+
naming: 'Consistent naming conventions',
|
|
9
|
+
structure: 'Structured directory layout',
|
|
10
|
+
};
|
|
11
|
+
function deriveRepoType(packageMetadata, patterns) {
|
|
12
|
+
const bin = packageMetadata?.bin;
|
|
13
|
+
const keywords = new Set((packageMetadata?.keywords ?? []).map((k) => k.toLowerCase()));
|
|
14
|
+
const dimensions = new Set(patterns?.map((p) => p.dimension) ?? []);
|
|
15
|
+
if (bin && (typeof bin === 'string' || Object.keys(bin).length > 0)) {
|
|
16
|
+
return 'cli';
|
|
17
|
+
}
|
|
18
|
+
if (keywords.has('nestjs') || dimensions.has('api')) {
|
|
19
|
+
return 'express-api';
|
|
20
|
+
}
|
|
21
|
+
if (keywords.has('react') || dimensions.has('component')) {
|
|
22
|
+
return 'react-app';
|
|
23
|
+
}
|
|
24
|
+
if (keywords.has('library') || keywords.has('sdk')) {
|
|
25
|
+
return 'library';
|
|
26
|
+
}
|
|
27
|
+
return 'unknown';
|
|
28
|
+
}
|
|
29
|
+
function deriveFeatures(keywords, patterns, conventions) {
|
|
30
|
+
const features = [];
|
|
31
|
+
if (keywords.length > 0) {
|
|
32
|
+
features.push(...keywords.slice(0, 6));
|
|
33
|
+
}
|
|
34
|
+
const dimensions = new Set(patterns.map((p) => p.dimension));
|
|
35
|
+
if (dimensions.has('component'))
|
|
36
|
+
features.push('Component-based architecture');
|
|
37
|
+
if (dimensions.has('testing'))
|
|
38
|
+
features.push('Automated testing');
|
|
39
|
+
if (conventions.length > 0)
|
|
40
|
+
features.push('Convention detection');
|
|
41
|
+
return features;
|
|
42
|
+
}
|
|
43
|
+
function deriveTechStack(patterns) {
|
|
44
|
+
const dimensions = new Set(patterns.map((p) => p.dimension));
|
|
45
|
+
const techs = [];
|
|
46
|
+
for (const dim of dimensions) {
|
|
47
|
+
const tech = DIMENSION_TO_TECH[dim];
|
|
48
|
+
if (tech && !techs.includes(tech))
|
|
49
|
+
techs.push(tech);
|
|
50
|
+
}
|
|
51
|
+
return techs;
|
|
52
|
+
}
|
|
53
|
+
function deriveEntryPoints(packageMetadata) {
|
|
54
|
+
const entryPoints = [];
|
|
55
|
+
if (packageMetadata?.bin) {
|
|
56
|
+
const bin = packageMetadata.bin;
|
|
57
|
+
if (typeof bin === 'string') {
|
|
58
|
+
entryPoints.push(bin.split('/').pop() ?? 'cli');
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
entryPoints.push(...Object.keys(bin));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return entryPoints;
|
|
65
|
+
}
|
|
66
|
+
export function extractFacts(analysis, conventions, packageMetadata, projectRoot) {
|
|
67
|
+
const patterns = analysis.patterns;
|
|
68
|
+
const dimensions = new Set(patterns.map((p) => p.dimension));
|
|
69
|
+
const projectName = packageMetadata?.name ??
|
|
70
|
+
(projectRoot ? projectRoot.split('/').pop() : undefined) ??
|
|
71
|
+
'project';
|
|
72
|
+
return {
|
|
73
|
+
projectName,
|
|
74
|
+
description: packageMetadata?.description,
|
|
75
|
+
repoType: deriveRepoType(packageMetadata, patterns),
|
|
76
|
+
features: deriveFeatures(packageMetadata?.keywords ?? [], patterns, conventions),
|
|
77
|
+
techStack: deriveTechStack(patterns),
|
|
78
|
+
entryPoints: deriveEntryPoints(packageMetadata),
|
|
79
|
+
scripts: packageMetadata?.scripts ?? {},
|
|
80
|
+
folderStructure: analysis.folderStructure,
|
|
81
|
+
conventions,
|
|
82
|
+
hasCLI: !!(packageMetadata?.bin &&
|
|
83
|
+
(typeof packageMetadata.bin === 'string' ||
|
|
84
|
+
Object.keys(packageMetadata.bin).length > 0)),
|
|
85
|
+
hasRoutes: dimensions.has('api'),
|
|
86
|
+
hasComponents: dimensions.has('component'),
|
|
87
|
+
hasTests: dimensions.has('testing'),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=FactExtractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FactExtractor.js","sourceRoot":"","sources":["../../../../src/core/generator/facts/FactExtractor.ts"],"names":[],"mappings":"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"}
|