@ophan/core 0.0.2 → 0.0.4
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/community-detectors/index.d.ts +20 -0
- package/dist/community-detectors/index.d.ts.map +1 -0
- package/dist/community-detectors/index.js +45 -0
- package/dist/community-detectors/label-prop.d.ts +20 -0
- package/dist/community-detectors/label-prop.d.ts.map +1 -0
- package/dist/community-detectors/label-prop.js +77 -0
- package/dist/community-detectors/leiden.d.ts +22 -0
- package/dist/community-detectors/leiden.d.ts.map +1 -0
- package/dist/community-detectors/leiden.js +312 -0
- package/dist/community-detectors/louvain.d.ts +13 -0
- package/dist/community-detectors/louvain.d.ts.map +1 -0
- package/dist/community-detectors/louvain.js +29 -0
- package/dist/community-detectors/types.d.ts +36 -0
- package/dist/community-detectors/types.d.ts.map +1 -0
- package/dist/{parsers/__fixtures__/no-functions.js → community-detectors/types.js} +0 -2
- package/dist/edge-resolvers/call.d.ts +13 -0
- package/dist/edge-resolvers/call.d.ts.map +1 -0
- package/dist/edge-resolvers/call.js +40 -0
- package/dist/edge-resolvers/co-location.d.ts +16 -0
- package/dist/edge-resolvers/co-location.d.ts.map +1 -0
- package/dist/edge-resolvers/co-location.js +129 -0
- package/dist/edge-resolvers/import.d.ts +16 -0
- package/dist/edge-resolvers/import.d.ts.map +1 -0
- package/dist/edge-resolvers/import.js +118 -0
- package/dist/edge-resolvers/index.d.ts +9 -0
- package/dist/edge-resolvers/index.d.ts.map +1 -0
- package/dist/edge-resolvers/index.js +29 -0
- package/dist/edge-resolvers/jsx-ref.d.ts +13 -0
- package/dist/edge-resolvers/jsx-ref.d.ts.map +1 -0
- package/dist/edge-resolvers/jsx-ref.js +40 -0
- package/dist/edge-resolvers/types.d.ts +40 -0
- package/dist/edge-resolvers/types.d.ts.map +1 -0
- package/dist/edge-resolvers/types.js +2 -0
- package/dist/graph.d.ts +293 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +1295 -0
- package/dist/index.d.ts +37 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +385 -183
- package/dist/migrations.d.ts +25 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +323 -0
- package/dist/module-resolvers/index.d.ts +11 -0
- package/dist/module-resolvers/index.d.ts.map +1 -0
- package/dist/module-resolvers/index.js +67 -0
- package/dist/module-resolvers/javascript.d.ts +18 -0
- package/dist/module-resolvers/javascript.d.ts.map +1 -0
- package/dist/module-resolvers/javascript.js +130 -0
- package/dist/module-resolvers/types.d.ts +18 -0
- package/dist/module-resolvers/types.d.ts.map +1 -0
- package/dist/module-resolvers/types.js +2 -0
- package/dist/parsers/python.d.ts.map +1 -1
- package/dist/parsers/python.js +38 -4
- package/dist/parsers/typescript.d.ts.map +1 -1
- package/dist/parsers/typescript.js +133 -0
- package/dist/practices.d.ts +28 -0
- package/dist/practices.d.ts.map +1 -0
- package/dist/practices.js +95 -0
- package/dist/schemas.d.ts +251 -3
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +121 -6
- package/dist/shared.d.ts +8 -0
- package/dist/shared.d.ts.map +1 -1
- package/dist/summarize.d.ts +165 -0
- package/dist/summarize.d.ts.map +1 -0
- package/dist/summarize.js +1067 -0
- package/ophan_logo.png +0 -0
- package/package.json +9 -2
- package/dist/parsers/__fixtures__/arrow-functions.d.ts +0 -5
- package/dist/parsers/__fixtures__/arrow-functions.d.ts.map +0 -1
- package/dist/parsers/__fixtures__/arrow-functions.js +0 -16
- package/dist/parsers/__fixtures__/class-methods.d.ts +0 -6
- package/dist/parsers/__fixtures__/class-methods.d.ts.map +0 -1
- package/dist/parsers/__fixtures__/class-methods.js +0 -12
- package/dist/parsers/__fixtures__/no-functions.d.ts +0 -9
- package/dist/parsers/__fixtures__/no-functions.d.ts.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,22 @@ import Database from "better-sqlite3";
|
|
|
2
2
|
export { FunctionInfo, computeHash } from "./shared";
|
|
3
3
|
export { getSupportedExtensions } from "./parsers";
|
|
4
4
|
export * from "./schemas";
|
|
5
|
+
export { loadPracticesFromDb, importPractices, validatePractices, buildPracticesPrompt, MAX_PRACTICES, MAX_RULE_LENGTH, type Practice } from "./practices";
|
|
6
|
+
export { analyzeGraph, detectHierarchicalCommunities, computePackage, computeDirectoryDistance, loadGraphConfig, saveGraphConfig, loadEdges, loadCommunities, buildGraph, detectCommunities, computeCentrality, computeCommunityEdges, storeCommunityEdges, loadCommunityEdges, type GraphConfig, type FunctionEdge, type CommunityEdge, type CommunityAssignment, type DetectionResult, type HierarchicalDetectionResult, type CentralityResult, type ModuleResolver, DEFAULT_GRAPH_CONFIG, DEFAULT_EDGE_WEIGHTS, resolveEdges, storeEdges, buildModuleResolver, addTransitiveEdges, rescueDissolvedNodes, computeComparisonMetrics, runComparison, DEFAULT_COMPARISONS, type ComparisonMetrics, type ComparisonConfig, } from "./graph";
|
|
7
|
+
export { type EdgeResolver, type EdgeResolverContext, registerEdgeResolver, getEdgeResolvers, CallEdgeResolver, JsxRefEdgeResolver, CoLocationEdgeResolver, ImportEdgeResolver, } from "./edge-resolvers";
|
|
8
|
+
export { type LanguageModuleResolver, registerModuleResolver, getModuleResolver, getModuleResolverForFile, JavaScriptModuleResolver, } from "./module-resolvers";
|
|
9
|
+
export { getDetector, registerDetector, listDetectors, LouvainDetector, LabelPropDetector, LeidenDetector, type CommunityDetector, type RawDetectionResult, type DetectorOptions, } from "./community-detectors";
|
|
10
|
+
export { summarizeCommunities, buildL1Context, buildL1RawContext, computePackageBreakdown, formatPackageBreakdown, summarizeL1, summarizeL2, summarizeL3, computeL1InputHash, computeL2InputHash, computeL3InputHash, storeSummary, loadSummary, loadAllSummaries, type SummarizeConfig, type SummarizeResult, type SummarizeOptions, type MemberContext, type L1CommunityContext, type L2CommunityContext, type StoredSummary, type CrossCuttingConcern, detectCrossCuttingConcerns, computeCCInputHash, summarizeCC, DEFAULT_SUMMARIZE_CONFIG, } from "./summarize";
|
|
5
11
|
import type { FunctionInfo } from "./shared";
|
|
12
|
+
import { type DetailedIssue } from "./schemas";
|
|
13
|
+
import { type Practice } from "./practices";
|
|
14
|
+
/**
|
|
15
|
+
* Pre-process source code with visible line numbers for the Claude prompt.
|
|
16
|
+
* Claude reads these labels to report issue locations accurately (instead of counting lines).
|
|
17
|
+
* The numbered output is ONLY used in the prompt — content hashes are computed from
|
|
18
|
+
* the original unnumbered source.
|
|
19
|
+
*/
|
|
20
|
+
export declare function numberLines(sourceCode: string): string;
|
|
6
21
|
/**
|
|
7
22
|
* Ensure .ophan/ is in .gitignore. Only acts in git repos.
|
|
8
23
|
* Creates .gitignore if the repo has .git/ but no .gitignore.
|
|
@@ -26,6 +41,8 @@ export interface AnalyzedFunction extends FunctionInfo {
|
|
|
26
41
|
};
|
|
27
42
|
dataTags: string[];
|
|
28
43
|
securityFlags: string[];
|
|
44
|
+
issues: DetailedIssue[];
|
|
45
|
+
practiceViolations: DetailedIssue[];
|
|
29
46
|
}
|
|
30
47
|
export interface FunctionAnalysis {
|
|
31
48
|
description: string;
|
|
@@ -40,6 +57,8 @@ export interface FunctionAnalysis {
|
|
|
40
57
|
};
|
|
41
58
|
dataTags: string[];
|
|
42
59
|
securityFlags: string[];
|
|
60
|
+
issues: DetailedIssue[];
|
|
61
|
+
practiceViolations: DetailedIssue[];
|
|
43
62
|
}
|
|
44
63
|
export interface FileAnalysisEntry {
|
|
45
64
|
functionName: string;
|
|
@@ -49,16 +68,12 @@ export interface FileAnalysisEntry {
|
|
|
49
68
|
entityType: string;
|
|
50
69
|
}
|
|
51
70
|
export declare function initDb(dbPath: string): Database.Database;
|
|
52
|
-
|
|
53
|
-
* Migrate from single-blob function_analysis to split analysis types.
|
|
54
|
-
* Creates v2 table, splits each existing row into 'documentation' + 'security' rows,
|
|
55
|
-
* drops old table, renames. Sets synced_at = NULL to force full re-sync.
|
|
56
|
-
*/
|
|
57
|
-
export declare function migrateToAnalysisTypes(db: Database.Database): void;
|
|
58
|
-
export declare function analyzeFunctions(functions: FunctionInfo[]): Promise<AnalyzedFunction[]>;
|
|
71
|
+
export declare function analyzeFunctions(functions: FunctionInfo[], practices?: Practice[]): Promise<AnalyzedFunction[]>;
|
|
59
72
|
export interface AnalyzeFilesOptions {
|
|
60
73
|
pullFn?: (hashes: string[]) => Promise<void>;
|
|
61
74
|
onProgress?: (current: number, total: number, file: string) => void;
|
|
75
|
+
onAnalysisProgress?: (analyzed: number, total: number) => void;
|
|
76
|
+
practices?: Practice[];
|
|
62
77
|
}
|
|
63
78
|
export interface AnalyzeFilesResult {
|
|
64
79
|
analyzed: number;
|
|
@@ -72,7 +87,7 @@ export interface AnalyzeFilesResult {
|
|
|
72
87
|
* The caller is responsible for DB lifecycle (open/close).
|
|
73
88
|
*/
|
|
74
89
|
export declare function analyzeFiles(db: Database.Database, rootPath: string, files: string[], options?: AnalyzeFilesOptions): Promise<AnalyzeFilesResult>;
|
|
75
|
-
export declare function analyzeRepository(rootPath: string, onProgress?: (current: number, total: number, file: string) => void, pullFn?: (hashes: string[]) => Promise<void
|
|
90
|
+
export declare function analyzeRepository(rootPath: string, onProgress?: (current: number, total: number, file: string) => void, pullFn?: (hashes: string[]) => Promise<void>, onAnalysisProgress?: (analyzed: number, total: number) => void): Promise<{
|
|
76
91
|
analyzed: number;
|
|
77
92
|
skipped: number;
|
|
78
93
|
pulled: number;
|
|
@@ -112,4 +127,18 @@ export declare function importAnalysis(dbPath: string, rows: {
|
|
|
112
127
|
language: string;
|
|
113
128
|
entity_type: string;
|
|
114
129
|
}[]): number;
|
|
130
|
+
/**
|
|
131
|
+
* Extract all functions from a repository, returning FunctionInfo arrays
|
|
132
|
+
* with relationship data (calls, imports, exported). Used by the graph
|
|
133
|
+
* analysis pipeline to build the relationship graph.
|
|
134
|
+
*
|
|
135
|
+
* Respects the same file size limits and parser selection as refreshFileIndex.
|
|
136
|
+
*/
|
|
137
|
+
export declare function extractAllFunctions(rootPath: string, onProgress?: (current: number, total: number, file: string) => void): Promise<FunctionInfo[]>;
|
|
138
|
+
/**
|
|
139
|
+
* Populate file_functions index from pre-extracted FunctionInfo array.
|
|
140
|
+
* Used by the graph pipeline to avoid scanning files twice — extractAllFunctions()
|
|
141
|
+
* already has all the data needed for the index.
|
|
142
|
+
*/
|
|
143
|
+
export declare function populateFileIndex(db: Database.Database, functions: FunctionInfo[]): void;
|
|
115
144
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAoCA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|