@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StructureVisitor.d.ts","sourceRoot":"","sources":["../../../../src/core/analyzer/visitors/StructureVisitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"StructureVisitor.d.ts","sourceRoot":"","sources":["../../../../src/core/analyzer/visitors/StructureVisitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAShE,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,KAAK,CAAiB;gBAG5B,SAAS,GAAE,MAAM,EAAO,EACxB,eAAe,CAAC,EAAE,eAAe;IAoBnC,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,EAAE;CAmB1C"}
|
|
@@ -1,8 +1,42 @@
|
|
|
1
|
+
import { DEFAULT_STRUCTURE } from '../../../config/defaults.js';
|
|
1
2
|
export class StructureVisitor {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
rules = [];
|
|
4
|
+
constructor(filePaths = [], structureConfig) {
|
|
5
|
+
const allDirs = new Set();
|
|
6
|
+
for (const p of filePaths) {
|
|
7
|
+
for (const seg of p.split('/').slice(0, -1)) {
|
|
8
|
+
allDirs.add(seg);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const placement = structureConfig?.directoryPlacement ?? DEFAULT_STRUCTURE.directoryPlacement ?? [];
|
|
12
|
+
for (const r of placement) {
|
|
13
|
+
if (![...allDirs].some((d) => d === r.dir))
|
|
14
|
+
continue;
|
|
15
|
+
this.rules.push({
|
|
16
|
+
pattern: new RegExp(r.filePattern),
|
|
17
|
+
dir: r.dir,
|
|
18
|
+
patternName: r.patternName,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
visit(file) {
|
|
23
|
+
const findings = [];
|
|
24
|
+
const base = file.filePath.split('/').pop() ?? '';
|
|
25
|
+
const stem = base.replace(/\.[^.]+$/, '');
|
|
26
|
+
const dirsInPath = file.filePath.split('/').slice(0, -1);
|
|
27
|
+
for (const { pattern, dir, patternName } of this.rules) {
|
|
28
|
+
if (!pattern.test(stem))
|
|
29
|
+
continue;
|
|
30
|
+
const inRightDir = dirsInPath.includes(dir);
|
|
31
|
+
findings.push({
|
|
32
|
+
dimension: 'structure',
|
|
33
|
+
pattern: patternName,
|
|
34
|
+
count: inRightDir ? 1 : 0,
|
|
35
|
+
total: 1,
|
|
36
|
+
example: file.filePath,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return findings;
|
|
6
40
|
}
|
|
7
41
|
}
|
|
8
42
|
//# sourceMappingURL=StructureVisitor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StructureVisitor.js","sourceRoot":"","sources":["../../../../src/core/analyzer/visitors/StructureVisitor.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,gBAAgB;
|
|
1
|
+
{"version":3,"file":"StructureVisitor.js","sourceRoot":"","sources":["../../../../src/core/analyzer/visitors/StructureVisitor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAQhE,MAAM,OAAO,gBAAgB;IACnB,KAAK,GAAc,EAAE,CAAC;IAE9B,YACE,YAAsB,EAAE,EACxB,eAAiC;QAEjC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,eAAe,EAAE,kBAAkB,IAAI,iBAAiB,CAAC,kBAAkB,IAAI,EAAE,CAAC;QACpG,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC;gBAAE,SAAS;YACrD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBACd,OAAO,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;gBAClC,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,WAAW,EAAE,CAAC,CAAC,WAAW;aAC3B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAgB;QACpB,MAAM,QAAQ,GAAqB,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEzD,KAAK,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACvD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,SAAS;YAClC,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC;gBACZ,SAAS,EAAE,WAAW;gBACtB,OAAO,EAAE,WAAW;gBACpB,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzB,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,IAAI,CAAC,QAAQ;aACvB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import type { ParsedFile } from '../AstAnalyzer.js';
|
|
2
2
|
import type { Dimension } from '../../../config/types.js';
|
|
3
|
+
export type ExportedKind = 'class' | 'instance' | 'component' | 'function' | 'hook';
|
|
3
4
|
export interface VisitorFinding {
|
|
4
5
|
dimension: Dimension;
|
|
5
6
|
pattern: string;
|
|
6
7
|
count: number;
|
|
7
8
|
total: number;
|
|
8
9
|
example?: string;
|
|
10
|
+
exportedName?: string;
|
|
11
|
+
exportedKind?: ExportedKind;
|
|
12
|
+
foundValue?: string;
|
|
9
13
|
}
|
|
10
14
|
export interface AstVisitor {
|
|
11
15
|
visit(file: ParsedFile): VisitorFinding[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/analyzer/visitors/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/analyzer/visitors/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,CAAC;AAEpF,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,EAAE,CAAC;CAC3C"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ModelManager } from '../../models/ModelManager.js';
|
|
2
|
+
export declare class CodeBertEmbedder {
|
|
3
|
+
private modelManager;
|
|
4
|
+
constructor(modelManager: ModelManager);
|
|
5
|
+
getEmbedding(text: string): Promise<number[]>;
|
|
6
|
+
similarity(a: string, b: string): Promise<number>;
|
|
7
|
+
dispose(): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=CodeBertEmbedder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeBertEmbedder.d.ts","sourceRoot":"","sources":["../../../src/core/classifier/CodeBertEmbedder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAgBjE,qBAAa,gBAAgB;IACf,OAAO,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;IAExC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAU7C,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKjD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
function cosineSimilarity(a, b) {
|
|
2
|
+
if (a.length !== b.length)
|
|
3
|
+
return 0;
|
|
4
|
+
let dot = 0;
|
|
5
|
+
let na = 0;
|
|
6
|
+
let nb = 0;
|
|
7
|
+
for (let i = 0; i < a.length; i++) {
|
|
8
|
+
dot += a[i] * b[i];
|
|
9
|
+
na += a[i] * a[i];
|
|
10
|
+
nb += b[i] * b[i];
|
|
11
|
+
}
|
|
12
|
+
const denom = Math.sqrt(na) * Math.sqrt(nb);
|
|
13
|
+
return denom === 0 ? 0 : dot / denom;
|
|
14
|
+
}
|
|
15
|
+
export class CodeBertEmbedder {
|
|
16
|
+
modelManager;
|
|
17
|
+
constructor(modelManager) {
|
|
18
|
+
this.modelManager = modelManager;
|
|
19
|
+
}
|
|
20
|
+
async getEmbedding(text) {
|
|
21
|
+
const pipe = (await this.modelManager.loadModel('classifier'));
|
|
22
|
+
const result = await pipe(text.slice(0, 512), { pooling: 'mean', normalize: true });
|
|
23
|
+
return Array.from(result?.data ?? []);
|
|
24
|
+
}
|
|
25
|
+
async similarity(a, b) {
|
|
26
|
+
const [embA, embB] = await Promise.all([this.getEmbedding(a), this.getEmbedding(b)]);
|
|
27
|
+
return cosineSimilarity(embA, embB);
|
|
28
|
+
}
|
|
29
|
+
async dispose() {
|
|
30
|
+
await this.modelManager.disposeModel();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=CodeBertEmbedder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeBertEmbedder.js","sourceRoot":"","sources":["../../../src/core/classifier/CodeBertEmbedder.ts"],"names":[],"mappings":"AAEA,SAAS,gBAAgB,CAAC,CAAW,EAAE,CAAW;IAChD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC;AACvC,CAAC;AAED,MAAM,OAAO,gBAAgB;IACP;IAApB,YAAoB,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAElD,KAAK,CAAC,YAAY,CAAC,IAAY;QAC7B,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,CAGzB,CAAC;QAErC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpF,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,CAAS,EAAE,CAAS;QACnC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrF,OAAO,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;IACzC,CAAC;CACF"}
|
|
@@ -4,6 +4,8 @@ export interface GatedResult {
|
|
|
4
4
|
needsReview: boolean;
|
|
5
5
|
}
|
|
6
6
|
export declare class ConfidenceGate {
|
|
7
|
+
private threshold;
|
|
8
|
+
constructor(threshold?: number);
|
|
7
9
|
gate(classification: string, confidence: number): GatedResult;
|
|
8
10
|
}
|
|
9
11
|
//# sourceMappingURL=ConfidenceGate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfidenceGate.d.ts","sourceRoot":"","sources":["../../../src/core/classifier/ConfidenceGate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ConfidenceGate.d.ts","sourceRoot":"","sources":["../../../src/core/classifier/ConfidenceGate.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,WAAW,GAAG,WAAW,GAAG,UAAU,CAAC;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,CAAC,EAAE,MAAM;IAI9B,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW;CAO9D"}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
import { DEFAULT_DRIFT } from '../../config/defaults.js';
|
|
2
2
|
export class ConfidenceGate {
|
|
3
|
+
threshold;
|
|
4
|
+
constructor(threshold) {
|
|
5
|
+
this.threshold = threshold ?? DEFAULT_DRIFT.confidenceThreshold ?? 0.7;
|
|
6
|
+
}
|
|
3
7
|
gate(classification, confidence) {
|
|
4
8
|
return {
|
|
5
9
|
classification: classification,
|
|
6
10
|
confidence,
|
|
7
|
-
needsReview: confidence <
|
|
11
|
+
needsReview: confidence < this.threshold,
|
|
8
12
|
};
|
|
9
13
|
}
|
|
10
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfidenceGate.js","sourceRoot":"","sources":["../../../src/core/classifier/ConfidenceGate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ConfidenceGate.js","sourceRoot":"","sources":["../../../src/core/classifier/ConfidenceGate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAQzD,MAAM,OAAO,cAAc;IACjB,SAAS,CAAS;IAE1B,YAAY,SAAkB;QAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,aAAa,CAAC,mBAAmB,IAAI,GAAG,CAAC;IACzE,CAAC;IAED,IAAI,CAAC,cAAsB,EAAE,UAAkB;QAC7C,OAAO;YACL,cAAc,EAAE,cAA+C;YAC/D,UAAU;YACV,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC,SAAS;SACzC,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
import type { DocsConfig } from '../../config/types.js';
|
|
1
2
|
export declare class FreshnessChecker {
|
|
2
3
|
private projectRoot;
|
|
3
4
|
private conventionsPath;
|
|
4
|
-
|
|
5
|
+
private exportTargets;
|
|
6
|
+
constructor(projectRoot: string, options?: {
|
|
7
|
+
docsConfig?: DocsConfig;
|
|
8
|
+
});
|
|
5
9
|
check(): Promise<boolean>;
|
|
6
10
|
private getMtime;
|
|
7
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FreshnessChecker.d.ts","sourceRoot":"","sources":["../../../src/core/exporter/FreshnessChecker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FreshnessChecker.d.ts","sourceRoot":"","sources":["../../../src/core/exporter/FreshnessChecker.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,WAAW;IAJrB,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,aAAa,CAA8B;gBAGzC,WAAW,EAAE,MAAM,EAC3B,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,UAAU,CAAA;KAAE;IAMjC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;YAwBjB,QAAQ;CAQvB"}
|
|
@@ -1,20 +1,15 @@
|
|
|
1
1
|
import { stat } from 'node:fs/promises';
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
|
-
import { CODEPLUG_DIR, CONVENTIONS_FILE } from '../../config/defaults.js';
|
|
5
|
-
const EXPORT_TARGETS = [
|
|
6
|
-
{ file: 'CLAUDE.md', dir: '.' },
|
|
7
|
-
{ file: 'conventions.mdc', dir: '.cursor/rules' },
|
|
8
|
-
{ file: 'copilot-instructions.md', dir: '.github' },
|
|
9
|
-
{ file: 'codeplug-export.json', dir: '.codeplug/exports' },
|
|
10
|
-
{ file: 'ci-report.json', dir: CODEPLUG_DIR },
|
|
11
|
-
];
|
|
4
|
+
import { CODEPLUG_DIR, CONVENTIONS_FILE, DEFAULT_DOCS } from '../../config/defaults.js';
|
|
12
5
|
export class FreshnessChecker {
|
|
13
6
|
projectRoot;
|
|
14
7
|
conventionsPath;
|
|
15
|
-
|
|
8
|
+
exportTargets;
|
|
9
|
+
constructor(projectRoot, options) {
|
|
16
10
|
this.projectRoot = projectRoot;
|
|
17
11
|
this.conventionsPath = join(projectRoot, CODEPLUG_DIR, CONVENTIONS_FILE);
|
|
12
|
+
this.exportTargets = options?.docsConfig?.exportTargets ?? DEFAULT_DOCS.exportTargets ?? [];
|
|
18
13
|
}
|
|
19
14
|
async check() {
|
|
20
15
|
if (!existsSync(this.conventionsPath)) {
|
|
@@ -24,7 +19,7 @@ export class FreshnessChecker {
|
|
|
24
19
|
if (convMtime === null)
|
|
25
20
|
return true;
|
|
26
21
|
let anyExportExists = false;
|
|
27
|
-
for (const target of
|
|
22
|
+
for (const target of this.exportTargets ?? []) {
|
|
28
23
|
const exportPath = join(this.projectRoot, target.dir, target.file);
|
|
29
24
|
if (!existsSync(exportPath))
|
|
30
25
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FreshnessChecker.js","sourceRoot":"","sources":["../../../src/core/exporter/FreshnessChecker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"FreshnessChecker.js","sourceRoot":"","sources":["../../../src/core/exporter/FreshnessChecker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExF,MAAM,OAAO,gBAAgB;IAKjB;IAJF,eAAe,CAAS;IACxB,aAAa,CAA8B;IAEnD,YACU,WAAmB,EAC3B,OAAqC;QAD7B,gBAAW,GAAX,WAAW,CAAQ;QAG3B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,gBAAgB,CAAC,CAAC;QACzE,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,UAAU,EAAE,aAAa,IAAI,YAAY,CAAC,aAAa,IAAI,EAAE,CAAC;IAC9F,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5D,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAEpC,IAAI,eAAe,GAAG,KAAK,CAAC;QAE5B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC;YAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACnE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;gBAAE,SAAS;YAEtC,eAAe,GAAG,IAAI,CAAC;YACvB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACpD,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,GAAG,SAAS,EAAE,CAAC;gBACpD,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO,eAAe,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,QAAgB;QACrC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/B,OAAO,CAAC,CAAC,OAAO,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import type { DocsGenerateOptions, DocGenerationResult, DocUpdateResult } from '../../config/types.js';
|
|
2
|
+
import { ConfigManager } from '../../config/ConfigManager.js';
|
|
2
3
|
export declare class DocGenerator {
|
|
3
4
|
private projectRoot;
|
|
4
5
|
private stalenessTracker;
|
|
5
|
-
|
|
6
|
+
private configManager;
|
|
7
|
+
constructor(projectRoot: string, options?: {
|
|
8
|
+
configManager?: ConfigManager;
|
|
9
|
+
});
|
|
10
|
+
private ensureReady;
|
|
6
11
|
generate(options: DocsGenerateOptions): Promise<DocGenerationResult>;
|
|
7
12
|
update(): Promise<DocUpdateResult>;
|
|
8
13
|
private resolveTargetDocs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocGenerator.d.ts","sourceRoot":"","sources":["../../../src/core/generator/DocGenerator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EAGhB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"DocGenerator.d.ts","sourceRoot":"","sources":["../../../src/core/generator/DocGenerator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EAGhB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAuB9D,qBAAa,YAAY;IAKrB,OAAO,CAAC,WAAW;IAJrB,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,aAAa,CAAgB;gBAG3B,WAAW,EAAE,MAAM,EAC3B,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,aAAa,CAAA;KAAE;YAK/B,WAAW;IAUnB,QAAQ,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAqEpE,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC;IAuBxC,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,aAAa;YAWP,WAAW;YAUX,eAAe;YAQf,eAAe;YASf,mBAAmB;YAkBnB,UAAU;CAgBzB"}
|
|
@@ -10,6 +10,7 @@ import { ArchitectureGenerator } from './documents/ArchitectureGenerator.js';
|
|
|
10
10
|
import { ConventionsGenerator } from './documents/ConventionsGenerator.js';
|
|
11
11
|
import { ContributingGenerator } from './documents/ContributingGenerator.js';
|
|
12
12
|
import { OnboardingGenerator } from './documents/OnboardingGenerator.js';
|
|
13
|
+
import { extractFacts } from './facts/FactExtractor.js';
|
|
13
14
|
const DOC_GENERATORS = {
|
|
14
15
|
'README.md': new ReadmeGenerator(),
|
|
15
16
|
'ARCHITECTURE.md': new ArchitectureGenerator(),
|
|
@@ -20,14 +21,25 @@ const DOC_GENERATORS = {
|
|
|
20
21
|
const ALL_DOC_NAMES = Object.keys(DOC_GENERATORS);
|
|
21
22
|
export class DocGenerator {
|
|
22
23
|
projectRoot;
|
|
23
|
-
stalenessTracker;
|
|
24
|
-
|
|
24
|
+
stalenessTracker = null;
|
|
25
|
+
configManager;
|
|
26
|
+
constructor(projectRoot, options) {
|
|
25
27
|
this.projectRoot = projectRoot;
|
|
26
|
-
this.
|
|
28
|
+
this.configManager = options?.configManager ?? new ConfigManager(projectRoot);
|
|
29
|
+
}
|
|
30
|
+
async ensureReady() {
|
|
31
|
+
await this.configManager.load();
|
|
32
|
+
if (this.stalenessTracker === null) {
|
|
33
|
+
this.stalenessTracker = new StalenessTracker(this.projectRoot, {
|
|
34
|
+
analysisConfig: this.configManager.getAnalysisConfig(),
|
|
35
|
+
docsConfig: this.configManager.getDocsConfig(),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
27
38
|
}
|
|
28
39
|
async generate(options) {
|
|
29
40
|
const start = Date.now();
|
|
30
41
|
const chalk = (await import('chalk')).default;
|
|
42
|
+
await this.ensureReady();
|
|
31
43
|
const targetDocs = this.resolveTargetDocs(options.doc);
|
|
32
44
|
const audience = options.audience ?? 'developers';
|
|
33
45
|
const style = options.style ?? 'professional';
|
|
@@ -39,8 +51,13 @@ export class DocGenerator {
|
|
|
39
51
|
console.log(chalk.yellow('LLM unavailable — using template-only generation.'));
|
|
40
52
|
}
|
|
41
53
|
const packageMetadata = await this.loadPackageMetadata();
|
|
54
|
+
const docsConfig = this.configManager.getDocsConfig();
|
|
55
|
+
const facts = extractFacts(analysis, conventions, packageMetadata, this.projectRoot);
|
|
42
56
|
const written = [];
|
|
43
|
-
const
|
|
57
|
+
const tracker = this.stalenessTracker;
|
|
58
|
+
if (!tracker)
|
|
59
|
+
throw new Error('StalenessTracker not initialized');
|
|
60
|
+
const sourceHash = await tracker.computeSourceHash();
|
|
44
61
|
for (const docName of targetDocs) {
|
|
45
62
|
const generator = DOC_GENERATORS[docName];
|
|
46
63
|
if (!generator)
|
|
@@ -56,12 +73,14 @@ export class DocGenerator {
|
|
|
56
73
|
llmClient,
|
|
57
74
|
existingDoc,
|
|
58
75
|
packageMetadata,
|
|
76
|
+
docsConfig,
|
|
77
|
+
facts,
|
|
59
78
|
};
|
|
60
79
|
try {
|
|
61
80
|
const content = await generator.generate(ctx);
|
|
62
81
|
const outPath = join(this.projectRoot, docName);
|
|
63
82
|
await writeFile(outPath, content, 'utf-8');
|
|
64
|
-
await
|
|
83
|
+
await tracker.update(docName, sourceHash);
|
|
65
84
|
written.push(docName);
|
|
66
85
|
console.log(chalk.green(` ✓ ${docName}`));
|
|
67
86
|
}
|
|
@@ -78,7 +97,11 @@ export class DocGenerator {
|
|
|
78
97
|
}
|
|
79
98
|
async update() {
|
|
80
99
|
const chalk = (await import('chalk')).default;
|
|
81
|
-
|
|
100
|
+
await this.ensureReady();
|
|
101
|
+
const tracker = this.stalenessTracker;
|
|
102
|
+
if (!tracker)
|
|
103
|
+
throw new Error('StalenessTracker not initialized');
|
|
104
|
+
const statuses = await tracker.check();
|
|
82
105
|
const staleDocs = statuses.filter((s) => s.stale).map((s) => s.name);
|
|
83
106
|
if (staleDocs.length === 0) {
|
|
84
107
|
console.log(chalk.green('All documents are up to date.'));
|
|
@@ -111,7 +134,11 @@ export class DocGenerator {
|
|
|
111
134
|
}
|
|
112
135
|
async runAnalysis() {
|
|
113
136
|
const { AstAnalyzer } = await import('../analyzer/AstAnalyzer.js');
|
|
114
|
-
const analyzer = new AstAnalyzer(this.projectRoot
|
|
137
|
+
const analyzer = new AstAnalyzer(this.projectRoot, {
|
|
138
|
+
analysisConfig: this.configManager.getAnalysisConfig(),
|
|
139
|
+
structureConfig: this.configManager.getStructureConfig(),
|
|
140
|
+
namingConfig: this.configManager.getNamingConfig(),
|
|
141
|
+
});
|
|
115
142
|
return analyzer.analyze();
|
|
116
143
|
}
|
|
117
144
|
async loadConventions() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocGenerator.js","sourceRoot":"","sources":["../../../src/core/generator/DocGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASjC,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"DocGenerator.js","sourceRoot":"","sources":["../../../src/core/generator/DocGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
|
+
import type { AnalysisConfig, DocsConfig } from '../../config/types.js';
|
|
1
2
|
import type { DocStatus } from '../../config/types.js';
|
|
2
3
|
export declare class StalenessTracker {
|
|
3
4
|
private projectRoot;
|
|
4
5
|
private hashFilePath;
|
|
5
6
|
private dirPath;
|
|
6
|
-
|
|
7
|
+
private analysisConfig;
|
|
8
|
+
private docsConfig;
|
|
9
|
+
constructor(projectRoot: string, options?: {
|
|
10
|
+
analysisConfig?: AnalysisConfig;
|
|
11
|
+
docsConfig?: DocsConfig;
|
|
12
|
+
});
|
|
7
13
|
check(): Promise<DocStatus[]>;
|
|
8
14
|
update(docName: string, hash: string): Promise<void>;
|
|
9
15
|
computeSourceHash(): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StalenessTracker.d.ts","sourceRoot":"","sources":["../../../src/core/generator/StalenessTracker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"StalenessTracker.d.ts","sourceRoot":"","sources":["../../../src/core/generator/StalenessTracker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAMvD,qBAAa,gBAAgB;IAOzB,OAAO,CAAC,WAAW;IANrB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,UAAU,CAAa;gBAGrB,WAAW,EAAE,MAAM,EAC3B,OAAO,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,cAAc,CAAC;QAAC,UAAU,CAAC,EAAE,UAAU,CAAA;KAAE;IAQlE,KAAK,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAqB7B,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpD,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;YAsB5B,UAAU;YAQV,UAAU;CAMzB"}
|
|
@@ -2,27 +2,25 @@ import { createHash } from 'node:crypto';
|
|
|
2
2
|
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
3
3
|
import { existsSync } from 'node:fs';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
|
-
import { CODEPLUG_DIR, DOC_HASHES_FILE } from '../../config/defaults.js';
|
|
6
|
-
const TRACKED_DOCS = [
|
|
7
|
-
'README.md',
|
|
8
|
-
'ARCHITECTURE.md',
|
|
9
|
-
'CONVENTIONS.md',
|
|
10
|
-
'CONTRIBUTING.md',
|
|
11
|
-
'ONBOARDING.md',
|
|
12
|
-
];
|
|
5
|
+
import { CODEPLUG_DIR, DOC_HASHES_FILE, DEFAULT_ANALYSIS, DEFAULT_DOCS } from '../../config/defaults.js';
|
|
13
6
|
export class StalenessTracker {
|
|
14
7
|
projectRoot;
|
|
15
8
|
hashFilePath;
|
|
16
9
|
dirPath;
|
|
17
|
-
|
|
10
|
+
analysisConfig;
|
|
11
|
+
docsConfig;
|
|
12
|
+
constructor(projectRoot, options) {
|
|
18
13
|
this.projectRoot = projectRoot;
|
|
19
14
|
this.dirPath = join(projectRoot, CODEPLUG_DIR);
|
|
20
15
|
this.hashFilePath = join(this.dirPath, DOC_HASHES_FILE);
|
|
16
|
+
this.analysisConfig = options?.analysisConfig ?? DEFAULT_ANALYSIS;
|
|
17
|
+
this.docsConfig = options?.docsConfig ?? DEFAULT_DOCS;
|
|
21
18
|
}
|
|
22
19
|
async check() {
|
|
23
20
|
const saved = await this.loadHashes();
|
|
24
21
|
const currentHash = await this.computeSourceHash();
|
|
25
|
-
|
|
22
|
+
const tracked = this.docsConfig.tracked ?? DEFAULT_DOCS.tracked ?? [];
|
|
23
|
+
return tracked.map((name) => {
|
|
26
24
|
const docPath = join(this.projectRoot, name);
|
|
27
25
|
if (!existsSync(docPath)) {
|
|
28
26
|
return { name, stale: true, reason: 'Document does not exist' };
|
|
@@ -44,10 +42,12 @@ export class StalenessTracker {
|
|
|
44
42
|
}
|
|
45
43
|
async computeSourceHash() {
|
|
46
44
|
const { globby } = await import('globby');
|
|
47
|
-
const
|
|
45
|
+
const include = this.analysisConfig.include ?? DEFAULT_ANALYSIS.include;
|
|
46
|
+
const ignore = this.analysisConfig.ignore ?? DEFAULT_ANALYSIS.ignore;
|
|
47
|
+
const files = await globby(include ?? ['**/*.{ts,tsx,js,jsx,mjs,cjs}'], {
|
|
48
48
|
cwd: this.projectRoot,
|
|
49
49
|
gitignore: true,
|
|
50
|
-
ignore
|
|
50
|
+
ignore,
|
|
51
51
|
absolute: false,
|
|
52
52
|
});
|
|
53
53
|
files.sort();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StalenessTracker.js","sourceRoot":"","sources":["../../../src/core/generator/StalenessTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"StalenessTracker.js","sourceRoot":"","sources":["../../../src/core/generator/StalenessTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ export declare class ArchitectureGenerator implements DocumentGenerator {
|
|
|
5
5
|
private countDirs;
|
|
6
6
|
private buildDirectoryMap;
|
|
7
7
|
private renderTree;
|
|
8
|
+
private buildTechnologies;
|
|
8
9
|
private buildComponentRelationships;
|
|
9
10
|
private buildDataFlow;
|
|
10
11
|
private buildDesignDecisions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArchitectureGenerator.d.ts","sourceRoot":"","sources":["../../../../src/core/generator/documents/ArchitectureGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAsB,MAAM,YAAY,CAAC;AAO3F,qBAAa,qBAAsB,YAAW,iBAAiB;IACvD,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ArchitectureGenerator.d.ts","sourceRoot":"","sources":["../../../../src/core/generator/documents/ArchitectureGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAsB,MAAM,YAAY,CAAC;AAO3F,qBAAa,qBAAsB,YAAW,iBAAiB;IACvD,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBvD,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,2BAA2B;IAYnC,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,oBAAoB;YAWd,cAAc;CAoB7B"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { basename } from 'node:path';
|
|
2
|
-
import {
|
|
2
|
+
import { OVERVIEW_INSTRUCTION, EXISTING_CONTENT_INSTRUCTION, STRUCTURE_INSTRUCTION, } from './promptHelpers.js';
|
|
3
3
|
export class ArchitectureGenerator {
|
|
4
4
|
async generate(ctx) {
|
|
5
5
|
const projectName = basename(ctx.projectRoot);
|
|
@@ -8,6 +8,7 @@ export class ArchitectureGenerator {
|
|
|
8
8
|
sections.push(this.buildOverview(ctx));
|
|
9
9
|
sections.push(this.buildDirectoryMap(ctx.analysis.folderStructure));
|
|
10
10
|
sections.push(this.buildComponentRelationships(ctx));
|
|
11
|
+
sections.push(this.buildTechnologies(ctx));
|
|
11
12
|
sections.push(this.buildDataFlow(ctx));
|
|
12
13
|
sections.push(this.buildDesignDecisions(ctx));
|
|
13
14
|
const template = sections.join('\n');
|
|
@@ -18,9 +19,12 @@ export class ArchitectureGenerator {
|
|
|
18
19
|
}
|
|
19
20
|
buildOverview(ctx) {
|
|
20
21
|
const { analysis } = ctx;
|
|
22
|
+
const description = ctx.facts.description;
|
|
21
23
|
const tagline = ctx.packageMetadata?.description;
|
|
22
|
-
const lines = ['##
|
|
23
|
-
if (
|
|
24
|
+
const lines = ['## Overview\n'];
|
|
25
|
+
if (description)
|
|
26
|
+
lines.push(description, '');
|
|
27
|
+
else if (tagline)
|
|
24
28
|
lines.push(tagline, '');
|
|
25
29
|
lines.push(`The project contains ${analysis.fileCount} source files organized across ${this.countDirs(analysis.folderStructure)} directories.`, '');
|
|
26
30
|
return lines.join('\n');
|
|
@@ -48,6 +52,18 @@ export class ArchitectureGenerator {
|
|
|
48
52
|
}
|
|
49
53
|
return lines;
|
|
50
54
|
}
|
|
55
|
+
buildTechnologies(ctx) {
|
|
56
|
+
const techStack = ctx.facts.techStack;
|
|
57
|
+
if (!techStack || techStack.length === 0)
|
|
58
|
+
return '';
|
|
59
|
+
const lines = ['## Technologies\n'];
|
|
60
|
+
for (const tech of techStack.slice(0, 15)) {
|
|
61
|
+
if (tech?.trim())
|
|
62
|
+
lines.push(`- ${tech.trim()}`);
|
|
63
|
+
}
|
|
64
|
+
lines.push('');
|
|
65
|
+
return lines.join('\n');
|
|
66
|
+
}
|
|
51
67
|
buildComponentRelationships(ctx) {
|
|
52
68
|
const structural = ctx.analysis.patterns.filter((p) => p.dimension === 'structure' || p.dimension === 'component');
|
|
53
69
|
if (structural.length === 0)
|
|
@@ -60,36 +76,38 @@ export class ArchitectureGenerator {
|
|
|
60
76
|
return lines.join('\n');
|
|
61
77
|
}
|
|
62
78
|
buildDataFlow(ctx) {
|
|
79
|
+
const entryPoints = ctx.facts.entryPoints;
|
|
80
|
+
const entryPoint = entryPoints.length > 0 ? entryPoints[0] : undefined;
|
|
63
81
|
const apiPatterns = ctx.analysis.patterns.filter((p) => p.dimension === 'api' || p.dimension === 'state');
|
|
64
|
-
if (apiPatterns.length === 0) {
|
|
65
|
-
return [
|
|
66
|
-
'## Data Flow\n',
|
|
67
|
-
'No API or state management patterns detected. Refer to source code for data flow details.',
|
|
68
|
-
'',
|
|
69
|
-
].join('\n');
|
|
70
|
-
}
|
|
71
82
|
const lines = ['## Data Flow\n'];
|
|
72
|
-
|
|
73
|
-
lines.push(
|
|
83
|
+
if (entryPoint)
|
|
84
|
+
lines.push(`**Entry point:** ${entryPoint}`, '');
|
|
85
|
+
if (apiPatterns.length > 0) {
|
|
86
|
+
for (const p of apiPatterns) {
|
|
87
|
+
lines.push(`- **${p.pattern}**: ${p.examples.slice(0, 2).join(', ') || 'N/A'}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
lines.push('No API or state management patterns detected. Refer to source code for data flow details.');
|
|
74
92
|
}
|
|
75
93
|
lines.push('');
|
|
76
94
|
return lines.join('\n');
|
|
77
95
|
}
|
|
78
96
|
buildDesignDecisions(ctx) {
|
|
79
97
|
const highConf = ctx.analysis.patterns.filter((p) => p.confidence >= 0.8);
|
|
80
|
-
if (highConf.length === 0)
|
|
81
|
-
return '';
|
|
82
98
|
const lines = ['## Design Decisions\n'];
|
|
83
99
|
for (const p of highConf.slice(0, 5)) {
|
|
84
100
|
lines.push(`- **${p.dimension}**: ${p.pattern}`);
|
|
85
101
|
}
|
|
102
|
+
if (highConf.length === 0)
|
|
103
|
+
return '';
|
|
86
104
|
lines.push('');
|
|
87
105
|
return lines.join('\n');
|
|
88
106
|
}
|
|
89
107
|
async enhanceWithLlm(ctx, template) {
|
|
90
108
|
const parts = [
|
|
91
109
|
`Improve this ARCHITECTURE.md for a ${ctx.audience} audience in a ${ctx.style} style.`,
|
|
92
|
-
|
|
110
|
+
OVERVIEW_INSTRUCTION,
|
|
93
111
|
STRUCTURE_INSTRUCTION,
|
|
94
112
|
'Add mermaid diagrams where appropriate to illustrate component relationships and data flow.',
|
|
95
113
|
'Include a Key Descriptions section for important components.',
|
|
@@ -100,7 +118,7 @@ export class ArchitectureGenerator {
|
|
|
100
118
|
}
|
|
101
119
|
parts.push('Return only the final markdown.\n', template);
|
|
102
120
|
return ctx.llmClient.generate(parts.join('\n'), {
|
|
103
|
-
systemPrompt: 'You are a software architect writing clear documentation. Always include an
|
|
121
|
+
systemPrompt: 'You are a software architect writing clear documentation. Always include an Overview and key descriptions.',
|
|
104
122
|
temperature: 0.3,
|
|
105
123
|
maxTokens: 4000,
|
|
106
124
|
});
|