@amrishkhan05/frankly 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/.claude-plugin/marketplace.json +27 -0
  2. package/.claude-plugin/plugin.json +11 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +20 -0
  4. package/.github/ISSUE_TEMPLATE/documentation.md +15 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.md +15 -0
  6. package/.github/PULL_REQUEST_TEMPLATE.md +20 -0
  7. package/.github/copilot-instructions.md +12 -0
  8. package/.github/plugin/marketplace.json +20 -0
  9. package/.github/plugin/plugin.json +16 -0
  10. package/.mcp.json +10 -0
  11. package/LICENSE +21 -0
  12. package/README.md +394 -0
  13. package/commands/frankly-help.toml +2 -0
  14. package/commands/frankly-plan.toml +2 -0
  15. package/commands/frankly-review.toml +2 -0
  16. package/commands/frankly-verify.toml +2 -0
  17. package/commands/frankly.toml +2 -0
  18. package/dist/analysis/change-classifier.d.ts +65 -0
  19. package/dist/analysis/change-classifier.d.ts.map +1 -0
  20. package/dist/analysis/change-classifier.js +241 -0
  21. package/dist/analysis/change-classifier.js.map +1 -0
  22. package/dist/analysis/repository-intelligence.d.ts +15 -0
  23. package/dist/analysis/repository-intelligence.d.ts.map +1 -0
  24. package/dist/analysis/repository-intelligence.js +179 -0
  25. package/dist/analysis/repository-intelligence.js.map +1 -0
  26. package/dist/core/config.d.ts +393 -0
  27. package/dist/core/config.d.ts.map +1 -0
  28. package/dist/core/config.js +130 -0
  29. package/dist/core/config.js.map +1 -0
  30. package/dist/core/engine.d.ts +20 -0
  31. package/dist/core/engine.d.ts.map +1 -0
  32. package/dist/core/engine.js +117 -0
  33. package/dist/core/engine.js.map +1 -0
  34. package/dist/core/errors.d.ts +27 -0
  35. package/dist/core/errors.d.ts.map +1 -0
  36. package/dist/core/errors.js +48 -0
  37. package/dist/core/errors.js.map +1 -0
  38. package/dist/core/index.d.ts +8 -0
  39. package/dist/core/index.d.ts.map +1 -0
  40. package/dist/core/index.js +8 -0
  41. package/dist/core/index.js.map +1 -0
  42. package/dist/core/models.d.ts +155 -0
  43. package/dist/core/models.d.ts.map +1 -0
  44. package/dist/core/models.js +6 -0
  45. package/dist/core/models.js.map +1 -0
  46. package/dist/git/index.d.ts +7 -0
  47. package/dist/git/index.d.ts.map +1 -0
  48. package/dist/git/index.js +6 -0
  49. package/dist/git/index.js.map +1 -0
  50. package/dist/git/repository.d.ts +44 -0
  51. package/dist/git/repository.d.ts.map +1 -0
  52. package/dist/git/repository.js +198 -0
  53. package/dist/git/repository.js.map +1 -0
  54. package/dist/graph/symbols.d.ts +45 -0
  55. package/dist/graph/symbols.d.ts.map +1 -0
  56. package/dist/graph/symbols.js +204 -0
  57. package/dist/graph/symbols.js.map +1 -0
  58. package/dist/integrations/claude/checkpoint.d.ts +2 -0
  59. package/dist/integrations/claude/checkpoint.d.ts.map +1 -0
  60. package/dist/integrations/claude/checkpoint.js +33 -0
  61. package/dist/integrations/claude/checkpoint.js.map +1 -0
  62. package/dist/integrations/cli/demo.d.ts +3 -0
  63. package/dist/integrations/cli/demo.d.ts.map +1 -0
  64. package/dist/integrations/cli/demo.js +31 -0
  65. package/dist/integrations/cli/demo.js.map +1 -0
  66. package/dist/integrations/cli/index.d.ts +7 -0
  67. package/dist/integrations/cli/index.d.ts.map +1 -0
  68. package/dist/integrations/cli/index.js +181 -0
  69. package/dist/integrations/cli/index.js.map +1 -0
  70. package/dist/integrations/mcp/index.d.ts +3 -0
  71. package/dist/integrations/mcp/index.d.ts.map +1 -0
  72. package/dist/integrations/mcp/index.js +7 -0
  73. package/dist/integrations/mcp/index.js.map +1 -0
  74. package/dist/integrations/mcp/server.d.ts +14 -0
  75. package/dist/integrations/mcp/server.d.ts.map +1 -0
  76. package/dist/integrations/mcp/server.js +232 -0
  77. package/dist/integrations/mcp/server.js.map +1 -0
  78. package/dist/project/detector.d.ts +70 -0
  79. package/dist/project/detector.d.ts.map +1 -0
  80. package/dist/project/detector.js +214 -0
  81. package/dist/project/detector.js.map +1 -0
  82. package/dist/report/json.d.ts +26 -0
  83. package/dist/report/json.d.ts.map +1 -0
  84. package/dist/report/json.js +148 -0
  85. package/dist/report/json.js.map +1 -0
  86. package/dist/review/red-ink-review.d.ts +26 -0
  87. package/dist/review/red-ink-review.d.ts.map +1 -0
  88. package/dist/review/red-ink-review.js +103 -0
  89. package/dist/review/red-ink-review.js.map +1 -0
  90. package/fixtures/retry-429/README.md +8 -0
  91. package/fixtures/retry-429/baseline/package.json +4 -0
  92. package/fixtures/retry-429/baseline/src/client.test.ts +8 -0
  93. package/fixtures/retry-429/baseline/src/client.ts +3 -0
  94. package/fixtures/retry-429/baseline/src/retry-policy.ts +1 -0
  95. package/fixtures/retry-429/baseline/tsconfig.json +7 -0
  96. package/fixtures/retry-429/candidate/src/client.ts +5 -0
  97. package/fixtures/retry-429/candidate/src/retry-strategy.ts +9 -0
  98. package/fixtures/retry-429/candidate/src/unrelated-format.ts +1 -0
  99. package/hooks/copilot-activate.js +9 -0
  100. package/hooks/copilot-hooks.json +13 -0
  101. package/hooks/hooks.json +13 -0
  102. package/package.json +70 -0
  103. package/scripts/run.cjs +32 -0
  104. package/skills/frankly/SKILL.md +12 -0
  105. package/src/analysis/change-classifier.ts +285 -0
  106. package/src/analysis/repository-intelligence.ts +236 -0
  107. package/src/core/config.ts +149 -0
  108. package/src/core/engine.ts +143 -0
  109. package/src/core/errors.ts +56 -0
  110. package/src/core/index.ts +8 -0
  111. package/src/core/models.ts +280 -0
  112. package/src/git/index.ts +7 -0
  113. package/src/git/repository.ts +207 -0
  114. package/src/graph/symbols.ts +254 -0
  115. package/src/integrations/claude/checkpoint.ts +40 -0
  116. package/src/integrations/cli/demo.ts +34 -0
  117. package/src/integrations/cli/index.ts +211 -0
  118. package/src/integrations/mcp/index.ts +7 -0
  119. package/src/integrations/mcp/server.ts +257 -0
  120. package/src/project/detector.ts +242 -0
  121. package/src/report/json.ts +175 -0
  122. package/src/review/red-ink-review.ts +125 -0
  123. package/src/tests/phase1.test.ts +57 -0
@@ -0,0 +1,117 @@
1
+ import * as path from "node:path";
2
+ import { loadConfig, loadRepositoryConfig } from "./config.js";
3
+ import { countDiffLines, Repository } from "../git/repository.js";
4
+ import { ProjectDetector } from "../project/detector.js";
5
+ import { SymbolExtractor } from "../graph/symbols.js";
6
+ import { ChangeAnalyzer } from "../analysis/change-classifier.js";
7
+ import { inspectRepository } from "../analysis/repository-intelligence.js";
8
+ import { RedInkReviewBuilder } from "../review/red-ink-review.js";
9
+ export class FranklyAnalysisEngine {
10
+ constructor(repository, projectDetector, symbolExtractor, config) {
11
+ this.repository = repository;
12
+ this.projectDetector = projectDetector;
13
+ this.symbolExtractor = symbolExtractor;
14
+ this.config = config;
15
+ }
16
+ async plan(task) {
17
+ const analyzer = new ChangeAnalyzer();
18
+ const keywords = analyzer.extractTaskKeywords(task);
19
+ const diff = await this.repository.getWorkingTreeDiff();
20
+ const intelligence = inspectRepository(this.repository.getRootPath(), keywords, [], []);
21
+ const project = await this.projectDetector.detectProject();
22
+ const expected = Math.max(1, Math.min(6, Math.ceil(Math.max(1, keywords.length) / 2)));
23
+ return {
24
+ task,
25
+ normalizedIntent: analyzer.normalizeTaskIntent(task),
26
+ keywords,
27
+ estimatedFiles: expected,
28
+ expectedSymbols: [1, Math.max(2, expected * 2)],
29
+ expectedTests: /fix|bug|retry|behavior|feature/i.test(task) ? 1 : 0,
30
+ expectsDependency: /dependency|package|library|sdk/i.test(task),
31
+ expectsPublicContract: /api|public|export|contract|interface/i.test(task),
32
+ likelyTouchedAreas: intelligence.reuseCandidates.slice(0, 5),
33
+ reuseCandidates: intelligence.reuseCandidates,
34
+ confidence: keywords.length > 1 ? "medium" : "low",
35
+ concerns: [
36
+ ...(project.isWorkspace ? ["Confirm the change stays inside the affected workspace package."] : []),
37
+ ...(keywords.length === 0 ? ["Task text is too vague for reliable intent matching."] : []),
38
+ ],
39
+ };
40
+ }
41
+ async analyze(task, configOverrides, executedTests = []) {
42
+ const startTime = Date.now();
43
+ const config = loadConfig({ ...this.config, ...configOverrides });
44
+ const fileDiffs = await this.repository.getWorkingTreeDiff();
45
+ const analyzer = new ChangeAnalyzer();
46
+ const symbolMap = new Map();
47
+ const degradedFindings = [];
48
+ for (const file of fileDiffs) {
49
+ if (file.status === "deleted" || !/\.[cm]?[jt]sx?$/.test(file.path))
50
+ continue;
51
+ try {
52
+ symbolMap.set(file.path, this.symbolExtractor.extractSymbols(path.join(this.repository.getRootPath(), file.path)));
53
+ }
54
+ catch (error) {
55
+ symbolMap.set(file.path, []);
56
+ degradedFindings.push({
57
+ id: `semantic-fallback-${file.path}`,
58
+ severity: "warning",
59
+ confidence: "high",
60
+ title: "Semantic analysis unavailable",
61
+ description: `Semantic analysis unavailable for ${file.path}; using reduced-confidence diff evidence.`,
62
+ affectedSymbols: [file.path],
63
+ evidence: [],
64
+ });
65
+ }
66
+ }
67
+ const classifications = analyzer.classifyChanges({ task, files: fileDiffs, symbols: symbolMap });
68
+ const symbols = classifications
69
+ .map((item) => item.symbol)
70
+ .filter((item) => "filePath" in item);
71
+ const files = fileDiffs.map((file) => ({
72
+ path: file.path,
73
+ changeType: file.status,
74
+ ...countDiffLines(file),
75
+ changes: file.hunks.length,
76
+ symbols: symbols.filter((symbol) => symbol.filePath === file.path),
77
+ }));
78
+ const intelligence = inspectRepository(this.repository.getRootPath(), analyzer.extractTaskKeywords(task), fileDiffs, symbols, executedTests);
79
+ for (const symbol of symbols) {
80
+ symbol.callers = intelligence.directCallers.filter((file) => file !== symbol.filePath);
81
+ symbol.relatedTests = intelligence.predictedTests.filter((test) => test.path.includes(path.basename(symbol.filePath).replace(/\.[^.]+$/, ""))).map((test) => test.path);
82
+ }
83
+ const review = new RedInkReviewBuilder().build({
84
+ task,
85
+ files,
86
+ classifications,
87
+ scopeDrift: analyzer.detectScopeDrift(classifications.filter((item) => !("filePath" in item.symbol)), files.length),
88
+ fileCount: files.length,
89
+ symbolCount: symbols.length,
90
+ intelligence,
91
+ executedTests,
92
+ personality: config.personality,
93
+ action: config.action,
94
+ intensity: config.intensity,
95
+ disabled: config.trigger === "off" || config.intensity === "off",
96
+ maxCorrectionPasses: config.maxCorrectionPasses,
97
+ });
98
+ if (config.trigger !== "off" && config.intensity !== "off")
99
+ review.findings.push(...degradedFindings);
100
+ return {
101
+ schemaVersion: "1",
102
+ repository: this.repository.getRootPath(),
103
+ task,
104
+ files,
105
+ symbols,
106
+ classifications,
107
+ findings: review.findings,
108
+ review,
109
+ timestamp: Date.now(),
110
+ duration: Date.now() - startTime,
111
+ };
112
+ }
113
+ }
114
+ export async function createAnalysisEngine(repositoryPath) {
115
+ return new FranklyAnalysisEngine(new Repository(repositoryPath), new ProjectDetector(repositoryPath), new SymbolExtractor(repositoryPath), loadRepositoryConfig(repositoryPath));
116
+ }
117
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/core/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Core error types and utilities
3
+ */
4
+ export declare class FranklyError extends Error {
5
+ code: string;
6
+ details?: Record<string, unknown> | undefined;
7
+ constructor(message: string, code: string, details?: Record<string, unknown> | undefined);
8
+ }
9
+ export declare class RepositoryError extends FranklyError {
10
+ constructor(message: string, details?: Record<string, unknown>);
11
+ }
12
+ export declare class GitError extends FranklyError {
13
+ constructor(message: string, details?: Record<string, unknown>);
14
+ }
15
+ export declare class ProjectError extends FranklyError {
16
+ constructor(message: string, details?: Record<string, unknown>);
17
+ }
18
+ export declare class SemanticError extends FranklyError {
19
+ constructor(message: string, details?: Record<string, unknown>);
20
+ }
21
+ export declare class ConfigError extends FranklyError {
22
+ constructor(message: string, details?: Record<string, unknown>);
23
+ }
24
+ export declare class AnalysisError extends FranklyError {
25
+ constructor(message: string, details?: Record<string, unknown>);
26
+ }
27
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,YAAa,SAAQ,KAAK;IAGxB,IAAI,EAAE,MAAM;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFxC,OAAO,EAAE,MAAM,EACR,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAK/C;AAED,qBAAa,eAAgB,SAAQ,YAAY;gBACjC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAIjE;AAED,qBAAa,QAAS,SAAQ,YAAY;gBAC1B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAIjE;AAED,qBAAa,YAAa,SAAQ,YAAY;gBAC9B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAIjE;AAED,qBAAa,aAAc,SAAQ,YAAY;gBAC/B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAIjE;AAED,qBAAa,WAAY,SAAQ,YAAY;gBAC7B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAIjE;AAED,qBAAa,aAAc,SAAQ,YAAY;gBAC/B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAIjE"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Core error types and utilities
3
+ */
4
+ export class FranklyError extends Error {
5
+ constructor(message, code, details) {
6
+ super(message);
7
+ this.code = code;
8
+ this.details = details;
9
+ this.name = "FranklyError";
10
+ }
11
+ }
12
+ export class RepositoryError extends FranklyError {
13
+ constructor(message, details) {
14
+ super(message, "REPOSITORY_ERROR", details);
15
+ this.name = "RepositoryError";
16
+ }
17
+ }
18
+ export class GitError extends FranklyError {
19
+ constructor(message, details) {
20
+ super(message, "GIT_ERROR", details);
21
+ this.name = "GitError";
22
+ }
23
+ }
24
+ export class ProjectError extends FranklyError {
25
+ constructor(message, details) {
26
+ super(message, "PROJECT_ERROR", details);
27
+ this.name = "ProjectError";
28
+ }
29
+ }
30
+ export class SemanticError extends FranklyError {
31
+ constructor(message, details) {
32
+ super(message, "SEMANTIC_ERROR", details);
33
+ this.name = "SemanticError";
34
+ }
35
+ }
36
+ export class ConfigError extends FranklyError {
37
+ constructor(message, details) {
38
+ super(message, "CONFIG_ERROR", details);
39
+ this.name = "ConfigError";
40
+ }
41
+ }
42
+ export class AnalysisError extends FranklyError {
43
+ constructor(message, details) {
44
+ super(message, "ANALYSIS_ERROR", details);
45
+ this.name = "AnalysisError";
46
+ }
47
+ }
48
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,YAAa,SAAQ,KAAK;IACnC,YACI,OAAe,EACR,IAAY,EACZ,OAAiC;QAExC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAA0B;QAGxC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC/B,CAAC;CACJ;AAED,MAAM,OAAO,eAAgB,SAAQ,YAAY;IAC7C,YAAY,OAAe,EAAE,OAAiC;QAC1D,KAAK,CAAC,OAAO,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAClC,CAAC;CACJ;AAED,MAAM,OAAO,QAAS,SAAQ,YAAY;IACtC,YAAY,OAAe,EAAE,OAAiC;QAC1D,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IAC3B,CAAC;CACJ;AAED,MAAM,OAAO,YAAa,SAAQ,YAAY;IAC1C,YAAY,OAAe,EAAE,OAAiC;QAC1D,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC/B,CAAC;CACJ;AAED,MAAM,OAAO,aAAc,SAAQ,YAAY;IAC3C,YAAY,OAAe,EAAE,OAAiC;QAC1D,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAChC,CAAC;CACJ;AAED,MAAM,OAAO,WAAY,SAAQ,YAAY;IACzC,YAAY,OAAe,EAAE,OAAiC;QAC1D,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC9B,CAAC;CACJ;AAED,MAAM,OAAO,aAAc,SAAQ,YAAY;IAC3C,YAAY,OAAe,EAAE,OAAiC;QAC1D,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAChC,CAAC;CACJ"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Core module exports
3
+ */
4
+ export * from "./models.js";
5
+ export * from "./config.js";
6
+ export * from "./errors.js";
7
+ export * from "./engine.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Core module exports
3
+ */
4
+ export * from "./models.js";
5
+ export * from "./config.js";
6
+ export * from "./errors.js";
7
+ export * from "./engine.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Core data models for Frankly
3
+ * Foundation types for all analysis
4
+ */
5
+ export type SymbolType = "function" | "method" | "class" | "interface" | "type" | "enum" | "variable" | "constant" | "export" | "route" | "controller" | "service" | "hook" | "component" | "schema" | "configuration";
6
+ export type ChangeType = "added" | "modified" | "deleted" | "renamed";
7
+ export type Visibility = "public" | "private" | "protected" | "internal";
8
+ export interface ChangedSymbol {
9
+ id: string;
10
+ name: string;
11
+ type: SymbolType;
12
+ filePath: string;
13
+ lineRange: [number, number];
14
+ changeType: ChangeType;
15
+ visibility: Visibility;
16
+ isExported: boolean;
17
+ callers: string[];
18
+ callees: string[];
19
+ implementations: string[];
20
+ interfaces: string[];
21
+ referencedContracts: string[];
22
+ relatedTests: string[];
23
+ packageName?: string;
24
+ runtimeBoundary?: string;
25
+ evidence: Evidence[];
26
+ }
27
+ export interface ChangedFile {
28
+ path: string;
29
+ changeType: ChangeType;
30
+ additions: number;
31
+ deletions: number;
32
+ changes: number;
33
+ symbols: ChangedSymbol[];
34
+ }
35
+ export type EvidenceType = "TASK_MATCH" | "SYMBOL_REFERENCE" | "CALLER_RELATION" | "CALLEE_RELATION" | "INTERFACE_IMPLEMENTATION" | "IMPORT_DEPENDENCY" | "EXPORT_CONTRACT" | "TEST_REFERENCE" | "CONFIG_REFERENCE" | "RUNTIME_BOUNDARY" | "GIT_COCHANGE" | "SIMILAR_IMPLEMENTATION" | "EXISTING_UTILITY" | "DEPENDENCY_USAGE" | "TYPE_REQUIREMENT" | "COMPILE_REQUIREMENT" | "DIFF_DEPENDENT" | "HISTORICAL_PATTERN";
36
+ export type Confidence = "high" | "medium" | "low";
37
+ export interface Evidence {
38
+ type: EvidenceType;
39
+ confidence: Confidence;
40
+ explanation: string;
41
+ reference?: string;
42
+ }
43
+ export type ChangeClassification = "REQUIRED" | "SUPPORTING" | "TEST" | "REFACTOR" | "INCIDENTAL" | "GENERATED" | "SUSPICIOUS" | "UNEXPLAINED";
44
+ export interface ClassifiedChange {
45
+ symbol: ChangedSymbol | ChangedFile;
46
+ classification: ChangeClassification;
47
+ confidence: Confidence;
48
+ justification: string;
49
+ evidence: Evidence[];
50
+ }
51
+ export type BehavioralChangeType = "API_BEHAVIOR" | "CONTROL_FLOW" | "ERROR_HANDLING" | "STATE_MUTATION" | "PERSISTENCE" | "SECURITY" | "AUTHORIZATION" | "AUTHENTICATION" | "CONCURRENCY" | "RETRY" | "CACHE" | "CONFIGURATION" | "DEPENDENCY" | "DATABASE_SCHEMA" | "PUBLIC_CONTRACT" | "EVENT" | "MESSAGE_SCHEMA" | "TEST_ONLY" | "REFACTOR_ONLY";
52
+ export type ContractChangeType = "ADDED" | "REMOVED" | "WIDENED" | "NARROWED" | "CHANGED";
53
+ export interface ContractChange {
54
+ type: ContractChangeType;
55
+ location: string;
56
+ oldSignature?: string;
57
+ newSignature?: string;
58
+ severity: "breaking" | "potentially-breaking" | "compatible";
59
+ confidence: Confidence;
60
+ affectedCallers?: string[];
61
+ }
62
+ export type FindingSeverity = "error" | "warning" | "info";
63
+ export interface Finding {
64
+ id: string;
65
+ severity: FindingSeverity;
66
+ confidence: Confidence;
67
+ title: string;
68
+ description: string;
69
+ affectedSymbols: string[];
70
+ evidence: Evidence[];
71
+ recommendation?: string;
72
+ autoCorrectible?: boolean;
73
+ }
74
+ export type Verdict = "CLEAN" | "REVIEW" | "SIMPLIFY" | "SPLIT" | "VERIFY" | "BLOCK";
75
+ export interface RedInkReview {
76
+ task: string;
77
+ verdict: Verdict;
78
+ taskAlignment: "high" | "medium" | "low";
79
+ changeNecessity: number;
80
+ changeSurface: "LOW" | "MEDIUM" | "HIGH";
81
+ scopeDrift: number;
82
+ findings: Finding[];
83
+ blastRadius: {
84
+ directCallers: number;
85
+ transitiveCallers: number;
86
+ affectedPackages: number;
87
+ callers: string[];
88
+ packages: string[];
89
+ };
90
+ testImpact: {
91
+ likelyAffected: number;
92
+ possiblyAffected: number;
93
+ executed: number;
94
+ passed: number;
95
+ predicted: PredictedTest[];
96
+ executedResults: ExecutedTest[];
97
+ };
98
+ contractChanges: ContractChange[];
99
+ behavioralChanges: BehavioralChangeType[];
100
+ reuseCandidates: string[];
101
+ correction?: CorrectionPlan;
102
+ recommendation: string;
103
+ personality?: string;
104
+ }
105
+ export interface AnalysisResult {
106
+ schemaVersion: "1";
107
+ repository: string;
108
+ task: string;
109
+ files: ChangedFile[];
110
+ symbols: ChangedSymbol[];
111
+ classifications: ClassifiedChange[];
112
+ findings: Finding[];
113
+ review: RedInkReview;
114
+ timestamp: number;
115
+ duration: number;
116
+ }
117
+ export interface TaskPlan {
118
+ task: string;
119
+ normalizedIntent: string;
120
+ keywords: string[];
121
+ estimatedFiles: number;
122
+ expectedSymbols: [number, number];
123
+ expectedTests: number;
124
+ expectsDependency: boolean;
125
+ expectsPublicContract: boolean;
126
+ likelyTouchedAreas: string[];
127
+ reuseCandidates: string[];
128
+ confidence: "high" | "medium" | "low";
129
+ concerns: string[];
130
+ }
131
+ export type PredictedTestStatus = "LIKELY_AFFECTED" | "POSSIBLY_AFFECTED" | "UNLIKELY_AFFECTED";
132
+ export type ExecutedTestStatus = "PASSED" | "FAILED" | "SKIPPED" | "NOT_RUN";
133
+ export interface PredictedTest {
134
+ path: string;
135
+ name: string;
136
+ status: PredictedTestStatus;
137
+ evidence: Evidence[];
138
+ }
139
+ export interface ExecutedTest {
140
+ path: string;
141
+ name: string;
142
+ status: ExecutedTestStatus;
143
+ duration?: number;
144
+ }
145
+ export interface CorrectionPlan {
146
+ pass: number;
147
+ removals: string[];
148
+ simplifications: {
149
+ symbol: string;
150
+ suggestion: string;
151
+ }[];
152
+ evidence: Evidence[];
153
+ instruction: string;
154
+ }
155
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/core/models.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Core data models for Frankly
3
+ * Foundation types for all analysis
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/core/models.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Core module exports
3
+ */
4
+ export { Repository, createRepository } from "./repository.js";
5
+ export type { FileDiff, DiffHunk } from "./repository.js";
6
+ export { countDiffLines } from "./repository.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/git/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Core module exports
3
+ */
4
+ export { Repository, createRepository } from "./repository.js";
5
+ export { countDiffLines } from "./repository.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/git/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { ChangeType } from "../core/models.js";
2
+ export interface DiffHunk {
3
+ oldStart: number;
4
+ oldLines: number;
5
+ newStart: number;
6
+ newLines: number;
7
+ content: string;
8
+ }
9
+ export interface FileDiff {
10
+ path: string;
11
+ status: ChangeType;
12
+ hunks: DiffHunk[];
13
+ oldPath?: string;
14
+ }
15
+ export declare class Repository {
16
+ private readonly rootPath;
17
+ constructor(rootPath: string);
18
+ private git;
19
+ getRootPath(): string;
20
+ getWorkingTreeDiff(): Promise<FileDiff[]>;
21
+ getDiffBetween(base: string, head: string): Promise<FileDiff[]>;
22
+ getStagedDiff(): Promise<FileDiff[]>;
23
+ fileExists(filePath: string): boolean;
24
+ getFileContent(filePath: string, revision?: string): Promise<string>;
25
+ getCurrentBranch(): string;
26
+ getStatus(): {
27
+ modified: string[];
28
+ staged: string[];
29
+ untracked: string[];
30
+ };
31
+ getBlame(filePath: string, line: number): Promise<{
32
+ commit: string;
33
+ author: string;
34
+ } | null>;
35
+ private hasHead;
36
+ private getInitialTreeDiff;
37
+ private parseDiff;
38
+ }
39
+ export declare function countDiffLines(file: FileDiff): {
40
+ additions: number;
41
+ deletions: number;
42
+ };
43
+ export declare function createRepository(rootPath: string): Promise<Repository>;
44
+ //# sourceMappingURL=repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/git/repository.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,QAAQ;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,UAAU;IACP,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAQ7C,OAAO,CAAC,GAAG;IAaX,WAAW,IAAI,MAAM;IAIjB,kBAAkB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAsBvC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAI/D,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAI1C,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI/B,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAM1E,gBAAgB,IAAI,MAAM;IAI1B,SAAS,IAAI;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE;IAiBpE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAUpG,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,kBAAkB;IAcxB,OAAO,CAAC,SAAS;CAgDpB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAMvF;AAYD,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAE5E"}