@llm4ts/flow 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.
- package/LICENSE +21 -0
- package/README.md +41 -0
- package/dist/AzureDevOpsTool.d.ts +60 -0
- package/dist/AzureDevOpsTool.d.ts.map +1 -0
- package/dist/AzureDevOpsTool.js +163 -0
- package/dist/AzureDevOpsTool.js.map +1 -0
- package/dist/Bench.d.ts +133 -0
- package/dist/Bench.d.ts.map +1 -0
- package/dist/Bench.js +272 -0
- package/dist/Bench.js.map +1 -0
- package/dist/BenchReport.d.ts +9 -0
- package/dist/BenchReport.d.ts.map +1 -0
- package/dist/BenchReport.js +360 -0
- package/dist/BenchReport.js.map +1 -0
- package/dist/CapabilityGuard.d.ts +6 -0
- package/dist/CapabilityGuard.d.ts.map +1 -0
- package/dist/CapabilityGuard.js +25 -0
- package/dist/CapabilityGuard.js.map +1 -0
- package/dist/Chat.d.ts +15 -0
- package/dist/Chat.d.ts.map +1 -0
- package/dist/Chat.js +36 -0
- package/dist/Chat.js.map +1 -0
- package/dist/Classified.d.ts +14 -0
- package/dist/Classified.d.ts.map +1 -0
- package/dist/Classified.js +48 -0
- package/dist/Classified.js.map +1 -0
- package/dist/CostLedger.d.ts +55 -0
- package/dist/CostLedger.d.ts.map +1 -0
- package/dist/CostLedger.js +126 -0
- package/dist/CostLedger.js.map +1 -0
- package/dist/CostTracker.d.ts +13 -0
- package/dist/CostTracker.d.ts.map +1 -0
- package/dist/CostTracker.js +116 -0
- package/dist/CostTracker.js.map +1 -0
- package/dist/Equiv.d.ts +163 -0
- package/dist/Equiv.d.ts.map +1 -0
- package/dist/Equiv.js +256 -0
- package/dist/Equiv.js.map +1 -0
- package/dist/EquivReport.d.ts +16 -0
- package/dist/EquivReport.d.ts.map +1 -0
- package/dist/EquivReport.js +77 -0
- package/dist/EquivReport.js.map +1 -0
- package/dist/Flow.d.ts +25 -0
- package/dist/Flow.d.ts.map +1 -0
- package/dist/Flow.js +39 -0
- package/dist/Flow.js.map +1 -0
- package/dist/FlowContext.d.ts +23 -0
- package/dist/FlowContext.d.ts.map +1 -0
- package/dist/FlowContext.js +4 -0
- package/dist/FlowContext.js.map +1 -0
- package/dist/FlowError.d.ts +80 -0
- package/dist/FlowError.d.ts.map +1 -0
- package/dist/FlowError.js +92 -0
- package/dist/FlowError.js.map +1 -0
- package/dist/FlowEvents.d.ts +101 -0
- package/dist/FlowEvents.d.ts.map +1 -0
- package/dist/FlowEvents.js +103 -0
- package/dist/FlowEvents.js.map +1 -0
- package/dist/FlowRecorder.d.ts +26 -0
- package/dist/FlowRecorder.d.ts.map +1 -0
- package/dist/FlowRecorder.js +74 -0
- package/dist/FlowRecorder.js.map +1 -0
- package/dist/GitHubTool.d.ts +53 -0
- package/dist/GitHubTool.d.ts.map +1 -0
- package/dist/GitHubTool.js +191 -0
- package/dist/GitHubTool.js.map +1 -0
- package/dist/GitTool.d.ts +46 -0
- package/dist/GitTool.d.ts.map +1 -0
- package/dist/GitTool.js +97 -0
- package/dist/GitTool.js.map +1 -0
- package/dist/Interaction.d.ts +21 -0
- package/dist/Interaction.d.ts.map +1 -0
- package/dist/Interaction.js +9 -0
- package/dist/Interaction.js.map +1 -0
- package/dist/McpServer.d.ts +18 -0
- package/dist/McpServer.d.ts.map +1 -0
- package/dist/McpServer.js +122 -0
- package/dist/McpServer.js.map +1 -0
- package/dist/Mermaid.d.ts +7 -0
- package/dist/Mermaid.d.ts.map +1 -0
- package/dist/Mermaid.js +98 -0
- package/dist/Mermaid.js.map +1 -0
- package/dist/Pack.d.ts +40 -0
- package/dist/Pack.d.ts.map +1 -0
- package/dist/Pack.js +141 -0
- package/dist/Pack.js.map +1 -0
- package/dist/Package.d.ts +2 -0
- package/dist/Package.d.ts.map +1 -0
- package/dist/Package.js +2 -0
- package/dist/Package.js.map +1 -0
- package/dist/Persistence.d.ts +32 -0
- package/dist/Persistence.d.ts.map +1 -0
- package/dist/Persistence.js +85 -0
- package/dist/Persistence.js.map +1 -0
- package/dist/Plan.d.ts +26 -0
- package/dist/Plan.d.ts.map +1 -0
- package/dist/Plan.js +101 -0
- package/dist/Plan.js.map +1 -0
- package/dist/PlanExecution.d.ts +7 -0
- package/dist/PlanExecution.d.ts.map +1 -0
- package/dist/PlanExecution.js +19 -0
- package/dist/PlanExecution.js.map +1 -0
- package/dist/Planner.d.ts +32 -0
- package/dist/Planner.d.ts.map +1 -0
- package/dist/Planner.js +97 -0
- package/dist/Planner.js.map +1 -0
- package/dist/PrSummary.d.ts +15 -0
- package/dist/PrSummary.d.ts.map +1 -0
- package/dist/PrSummary.js +29 -0
- package/dist/PrSummary.js.map +1 -0
- package/dist/PriceList.d.ts +11 -0
- package/dist/PriceList.d.ts.map +1 -0
- package/dist/PriceList.js +79 -0
- package/dist/PriceList.js.map +1 -0
- package/dist/Provenance.d.ts +27 -0
- package/dist/Provenance.d.ts.map +1 -0
- package/dist/Provenance.js +38 -0
- package/dist/Provenance.js.map +1 -0
- package/dist/Replay.d.ts +29 -0
- package/dist/Replay.d.ts.map +1 -0
- package/dist/Replay.js +181 -0
- package/dist/Replay.js.map +1 -0
- package/dist/Review.d.ts +71 -0
- package/dist/Review.d.ts.map +1 -0
- package/dist/Review.js +204 -0
- package/dist/Review.js.map +1 -0
- package/dist/ReviewCache.d.ts +6 -0
- package/dist/ReviewCache.d.ts.map +1 -0
- package/dist/ReviewCache.js +28 -0
- package/dist/ReviewCache.js.map +1 -0
- package/dist/Reviewer.d.ts +12 -0
- package/dist/Reviewer.d.ts.map +1 -0
- package/dist/Reviewer.js +30 -0
- package/dist/Reviewer.js.map +1 -0
- package/dist/SpecChecks.d.ts +17 -0
- package/dist/SpecChecks.d.ts.map +1 -0
- package/dist/SpecChecks.js +107 -0
- package/dist/SpecChecks.js.map +1 -0
- package/dist/Survey.d.ts +32 -0
- package/dist/Survey.d.ts.map +1 -0
- package/dist/Survey.js +119 -0
- package/dist/Survey.js.map +1 -0
- package/dist/TransientRetry.d.ts +16 -0
- package/dist/TransientRetry.d.ts.map +1 -0
- package/dist/TransientRetry.js +102 -0
- package/dist/TransientRetry.js.map +1 -0
- package/dist/Workspace.d.ts +39 -0
- package/dist/Workspace.d.ts.map +1 -0
- package/dist/Workspace.js +192 -0
- package/dist/Workspace.js.map +1 -0
- package/dist/WorkspaceLayout.d.ts +3 -0
- package/dist/WorkspaceLayout.d.ts.map +1 -0
- package/dist/WorkspaceLayout.js +19 -0
- package/dist/WorkspaceLayout.js.map +1 -0
- package/dist/WorkspaceTools.d.ts +4 -0
- package/dist/WorkspaceTools.d.ts.map +1 -0
- package/dist/WorkspaceTools.js +130 -0
- package/dist/WorkspaceTools.js.map +1 -0
- package/package.json +91 -0
- package/src/AzureDevOpsTool.ts +291 -0
- package/src/Bench.ts +340 -0
- package/src/BenchReport.ts +447 -0
- package/src/CapabilityGuard.ts +43 -0
- package/src/Chat.ts +60 -0
- package/src/Classified.ts +67 -0
- package/src/CostLedger.ts +171 -0
- package/src/CostTracker.ts +170 -0
- package/src/Equiv.ts +378 -0
- package/src/EquivReport.ts +92 -0
- package/src/Flow.ts +72 -0
- package/src/FlowContext.ts +23 -0
- package/src/FlowError.ts +112 -0
- package/src/FlowEvents.ts +147 -0
- package/src/FlowRecorder.ts +116 -0
- package/src/GitHubTool.ts +315 -0
- package/src/GitTool.ts +214 -0
- package/src/Interaction.ts +23 -0
- package/src/McpServer.ts +168 -0
- package/src/Mermaid.ts +112 -0
- package/src/Pack.ts +213 -0
- package/src/Package.ts +1 -0
- package/src/Persistence.ts +198 -0
- package/src/Plan.ts +119 -0
- package/src/PlanExecution.ts +46 -0
- package/src/Planner.ts +134 -0
- package/src/PrSummary.ts +37 -0
- package/src/PriceList.ts +91 -0
- package/src/Provenance.ts +85 -0
- package/src/Replay.ts +265 -0
- package/src/Review.ts +337 -0
- package/src/ReviewCache.ts +45 -0
- package/src/Reviewer.ts +31 -0
- package/src/SpecChecks.ts +143 -0
- package/src/Survey.ts +144 -0
- package/src/TransientRetry.ts +238 -0
- package/src/Workspace.ts +255 -0
- package/src/WorkspaceLayout.ts +22 -0
- package/src/WorkspaceTools.ts +188 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Replay.js","sourceRoot":"","sources":["../src/Replay.ts"],"names":[],"mappings":"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"}
|
package/dist/Review.d.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
import type { LlmServiceShape } from "@llm4ts/core/LlmService";
|
|
4
|
+
import type { JsonSchema } from "@llm4ts/core/Models";
|
|
5
|
+
import type { ProcessExecutorShape } from "@llm4ts/core/ProcessExecutor";
|
|
6
|
+
import type { Chat } from "./Chat.ts";
|
|
7
|
+
import { FlowLlmError, ProcessError, type FlowError } from "./FlowError.ts";
|
|
8
|
+
import { type FlowEventsShape } from "./FlowEvents.ts";
|
|
9
|
+
import { Reviewer } from "./Reviewer.ts";
|
|
10
|
+
export declare const Severity: Schema.Literals<readonly ["Critical", "Warning", "Info"]>;
|
|
11
|
+
export type Severity = typeof Severity.Type;
|
|
12
|
+
declare const ReviewIssue_base: Schema.Class<ReviewIssue, Schema.Struct<{
|
|
13
|
+
readonly severity: Schema.Literals<readonly ["Critical", "Warning", "Info"]>;
|
|
14
|
+
readonly title: Schema.String;
|
|
15
|
+
readonly description: Schema.withConstructorDefault<Schema.String>;
|
|
16
|
+
readonly file: Schema.optionalKey<Schema.String>;
|
|
17
|
+
readonly line: Schema.optionalKey<Schema.Int>;
|
|
18
|
+
readonly suggestion: Schema.optionalKey<Schema.String>;
|
|
19
|
+
readonly confidence: Schema.withConstructorDefault<Schema.Number>;
|
|
20
|
+
}>, {}>;
|
|
21
|
+
export declare class ReviewIssue extends ReviewIssue_base {
|
|
22
|
+
}
|
|
23
|
+
declare const ReviewResult_base: Schema.Class<ReviewResult, Schema.Struct<{
|
|
24
|
+
readonly issues: Schema.$Array<typeof ReviewIssue>;
|
|
25
|
+
readonly summary: Schema.withConstructorDefault<Schema.String>;
|
|
26
|
+
}>, {}>;
|
|
27
|
+
export declare class ReviewResult extends ReviewResult_base {
|
|
28
|
+
get isClean(): boolean;
|
|
29
|
+
}
|
|
30
|
+
export declare const reviewJsonSchema: JsonSchema;
|
|
31
|
+
export declare const correctnessReviewer: Reviewer;
|
|
32
|
+
export declare const readabilityReviewer: Reviewer;
|
|
33
|
+
export declare const testReviewer: Reviewer;
|
|
34
|
+
export declare const structureReviewer: Reviewer;
|
|
35
|
+
export declare const performanceReviewer: Reviewer;
|
|
36
|
+
export declare const securityReviewer: Reviewer;
|
|
37
|
+
export declare const effectReviewer: Reviewer;
|
|
38
|
+
export declare const minimalReviewers: ReadonlyArray<Reviewer>;
|
|
39
|
+
export declare const allReviewers: ReadonlyArray<Reviewer>;
|
|
40
|
+
export interface ReviewerSelector {
|
|
41
|
+
readonly select: (reviewers: ReadonlyArray<Reviewer>, changedFiles: ReadonlyArray<string>, round: number, previous: ReviewResult | undefined) => Effect.Effect<ReadonlyArray<Reviewer>, FlowError>;
|
|
42
|
+
}
|
|
43
|
+
export declare const allEveryRound: ReviewerSelector;
|
|
44
|
+
export declare const whileDirty: ReviewerSelector;
|
|
45
|
+
declare const ReviewerPick_base: Schema.Class<ReviewerPick, Schema.Struct<{
|
|
46
|
+
readonly reviewers: Schema.$Array<Schema.String>;
|
|
47
|
+
}>, {}>;
|
|
48
|
+
export declare class ReviewerPick extends ReviewerPick_base {
|
|
49
|
+
}
|
|
50
|
+
export declare const llmDriven: (picker: LlmServiceShape) => ReviewerSelector;
|
|
51
|
+
export declare const reviewPrompt: (task: string, diff: string) => string;
|
|
52
|
+
export declare const fixPrompt: (result: ReviewResult) => string;
|
|
53
|
+
export declare const mergeReviewResults: (results: ReadonlyArray<ReviewResult>) => ReviewResult;
|
|
54
|
+
export declare const lintCommand: (process: ProcessExecutorShape, events: FlowEventsShape, command: readonly string[], workDir: string) => Effect.Effect<ReviewResult, import("./FlowError.ts").PersistenceError | import("./FlowError.ts").PlanParseError | import("./FlowError.ts").UnsupportedSchemaVersion | import("./FlowError.ts").WorkspacePathError | import("./FlowError.ts").WorkspaceLimitError | import("./FlowError.ts").WorkspaceIoError | import("./FlowError.ts").FlowAborted | ProcessError | FlowLlmError | import("./FlowError.ts").FlowCapabilityDenied | import("./FlowError.ts").BudgetExceeded, never>;
|
|
55
|
+
export interface ReviewAndFixOptions {
|
|
56
|
+
readonly reviewers: ReadonlyArray<Reviewer>;
|
|
57
|
+
readonly reviewerService: LlmServiceShape;
|
|
58
|
+
readonly coder: Chat;
|
|
59
|
+
readonly taskTitle: string;
|
|
60
|
+
readonly currentDiff: Effect.Effect<string, FlowError>;
|
|
61
|
+
readonly events: FlowEventsShape;
|
|
62
|
+
readonly changedFiles?: Effect.Effect<ReadonlyArray<string>, FlowError>;
|
|
63
|
+
readonly maxRounds?: number;
|
|
64
|
+
readonly selector?: ReviewerSelector;
|
|
65
|
+
readonly lint?: Effect.Effect<ReviewResult, FlowError>;
|
|
66
|
+
readonly parallelism?: number;
|
|
67
|
+
readonly format?: Effect.Effect<void, FlowError>;
|
|
68
|
+
}
|
|
69
|
+
export declare const reviewAndFixLoop: (options: ReviewAndFixOptions) => Effect.Effect<ReviewResult, import("./FlowError.ts").PersistenceError | import("./FlowError.ts").PlanParseError | import("./FlowError.ts").UnsupportedSchemaVersion | import("./FlowError.ts").WorkspacePathError | import("./FlowError.ts").WorkspaceLimitError | import("./FlowError.ts").WorkspaceIoError | import("./FlowError.ts").FlowAborted | ProcessError | FlowLlmError | import("./FlowError.ts").FlowCapabilityDenied | import("./FlowError.ts").BudgetExceeded, never>;
|
|
70
|
+
export {};
|
|
71
|
+
//# sourceMappingURL=Review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Review.d.ts","sourceRoot":"","sources":["../src/Review.ts"],"names":[],"mappings":"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"}
|
package/dist/Review.js
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
import { Capabilities } from "@llm4ts/core/Capability";
|
|
4
|
+
import { guarded } from "./CapabilityGuard.js";
|
|
5
|
+
import { FlowLlmError, ProcessError } from "./FlowError.js";
|
|
6
|
+
import { Info } from "./FlowEvents.js";
|
|
7
|
+
import { Reviewer } from "./Reviewer.js";
|
|
8
|
+
export const Severity = Schema.Literals(["Critical", "Warning", "Info"]);
|
|
9
|
+
export class ReviewIssue extends Schema.Class("ReviewIssue")({
|
|
10
|
+
severity: Severity,
|
|
11
|
+
title: Schema.String,
|
|
12
|
+
description: Schema.String.pipe(Schema.withConstructorDefault(Effect.succeed(""))),
|
|
13
|
+
file: Schema.optionalKey(Schema.String),
|
|
14
|
+
line: Schema.optionalKey(Schema.Int),
|
|
15
|
+
suggestion: Schema.optionalKey(Schema.String),
|
|
16
|
+
confidence: Schema.Number.pipe(Schema.withConstructorDefault(Effect.succeed(1)))
|
|
17
|
+
}) {
|
|
18
|
+
}
|
|
19
|
+
export class ReviewResult extends Schema.Class("ReviewResult")({
|
|
20
|
+
issues: Schema.Array(ReviewIssue),
|
|
21
|
+
summary: Schema.String.pipe(Schema.withConstructorDefault(Effect.succeed("")))
|
|
22
|
+
}) {
|
|
23
|
+
get isClean() {
|
|
24
|
+
return this.issues.length === 0;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export const reviewJsonSchema = {
|
|
28
|
+
type: "object",
|
|
29
|
+
properties: {
|
|
30
|
+
issues: {
|
|
31
|
+
type: "array",
|
|
32
|
+
items: {
|
|
33
|
+
type: "object",
|
|
34
|
+
properties: {
|
|
35
|
+
severity: { type: "string", enum: ["Critical", "Warning", "Info"] },
|
|
36
|
+
title: { type: "string" },
|
|
37
|
+
description: { type: "string" },
|
|
38
|
+
file: { type: "string" },
|
|
39
|
+
line: { type: "integer" },
|
|
40
|
+
suggestion: { type: "string" },
|
|
41
|
+
confidence: { type: "number" }
|
|
42
|
+
},
|
|
43
|
+
required: ["severity", "title", "description"]
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
summary: { type: "string" }
|
|
47
|
+
},
|
|
48
|
+
required: ["issues", "summary"]
|
|
49
|
+
};
|
|
50
|
+
const reviewer = (name, systemPrompt, files = ".*") => Reviewer.make({ name, systemPrompt, files });
|
|
51
|
+
export const correctnessReviewer = reviewer("code-functionality", [
|
|
52
|
+
"Review for functional correctness. Check that the change implements the task's intent,",
|
|
53
|
+
"handles obvious edge cases, and does not regress existing behavior. Report only concrete",
|
|
54
|
+
"logic errors, wrong conditions, mishandled error paths, and missing cases. Ignore style."
|
|
55
|
+
].join("\n"));
|
|
56
|
+
export const readabilityReviewer = reviewer("readability", [
|
|
57
|
+
"Review for readability and clarity. Check names, focused functions, understandable control",
|
|
58
|
+
"flow, and useful comments. Report only concrete, actionable readability problems."
|
|
59
|
+
].join("\n"));
|
|
60
|
+
export const testReviewer = reviewer("test", [
|
|
61
|
+
"Review test coverage and quality. Check that new behavior and important error paths are",
|
|
62
|
+
"covered by tests that assert real outcomes and would fail on regression. Report concrete gaps."
|
|
63
|
+
].join("\n"));
|
|
64
|
+
export const structureReviewer = reviewer("code-structure", "Review module boundaries, dependency direction, cohesion, and unnecessary coupling. Report concrete structural problems.");
|
|
65
|
+
export const performanceReviewer = reviewer("performance", "Review for material performance regressions, unbounded work, avoidable repeated I/O, and resource leaks.");
|
|
66
|
+
export const securityReviewer = reviewer("security", "Review trust boundaries, input handling, secrets, authorization, injection risks, and unsafe defaults.");
|
|
67
|
+
export const effectReviewer = reviewer("effect-ts", "Review Effect usage: typed errors, scoped resources, service boundaries, interruption, concurrency, and runtime ownership.", ".*\\.(ts|tsx|mts|cts)$");
|
|
68
|
+
export const minimalReviewers = Object.freeze([
|
|
69
|
+
correctnessReviewer,
|
|
70
|
+
readabilityReviewer,
|
|
71
|
+
testReviewer
|
|
72
|
+
]);
|
|
73
|
+
export const allReviewers = Object.freeze([
|
|
74
|
+
correctnessReviewer,
|
|
75
|
+
testReviewer,
|
|
76
|
+
readabilityReviewer,
|
|
77
|
+
structureReviewer,
|
|
78
|
+
performanceReviewer,
|
|
79
|
+
securityReviewer,
|
|
80
|
+
effectReviewer
|
|
81
|
+
]);
|
|
82
|
+
export const allEveryRound = {
|
|
83
|
+
select: (reviewers, changedFiles, _round, _previous) => Effect.succeed(reviewers.filter((candidate) => candidate.matches(changedFiles)))
|
|
84
|
+
};
|
|
85
|
+
export const whileDirty = {
|
|
86
|
+
select: (reviewers, changedFiles, round, previous) => Effect.succeed(round === 1 || previous === undefined || !previous.isClean
|
|
87
|
+
? reviewers.filter((candidate) => candidate.matches(changedFiles))
|
|
88
|
+
: [])
|
|
89
|
+
};
|
|
90
|
+
export class ReviewerPick extends Schema.Class("ReviewerPick")({
|
|
91
|
+
reviewers: Schema.Array(Schema.String)
|
|
92
|
+
}) {
|
|
93
|
+
}
|
|
94
|
+
const reviewerPickJsonSchema = {
|
|
95
|
+
type: "object",
|
|
96
|
+
properties: {
|
|
97
|
+
reviewers: {
|
|
98
|
+
type: "array",
|
|
99
|
+
items: { type: "string" }
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
required: ["reviewers"]
|
|
103
|
+
};
|
|
104
|
+
export const llmDriven = (picker) => ({
|
|
105
|
+
select: (reviewers, changedFiles, _round, _previous) => {
|
|
106
|
+
const scoped = reviewers.filter((candidate) => candidate.matches(changedFiles));
|
|
107
|
+
if (scoped.length <= 1 || changedFiles.length === 0) {
|
|
108
|
+
return Effect.succeed(scoped);
|
|
109
|
+
}
|
|
110
|
+
const names = scoped.map((candidate) => candidate.name);
|
|
111
|
+
const prompt = [
|
|
112
|
+
`Pick the reviewers relevant to these files. Available reviewers: ${names.join(", ")}.`,
|
|
113
|
+
"Changed files:",
|
|
114
|
+
...changedFiles,
|
|
115
|
+
'Respond only with JSON: {"reviewers":["name", ...]}.'
|
|
116
|
+
].join("\n");
|
|
117
|
+
return picker.executeStructured(prompt, ReviewerPick, reviewerPickJsonSchema).pipe(Effect.map((pick) => scoped.filter((candidate) => pick.reviewers.includes(candidate.name))), Effect.catch(() => Effect.succeed(scoped)), Effect.map((chosen) => (chosen.length === 0 ? scoped : chosen)));
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
export const reviewPrompt = (task, diff) => [
|
|
121
|
+
`Review the change below for task "${task}". Report problems as JSON:`,
|
|
122
|
+
'{"issues":[{"severity":"Critical|Warning|Info","title":"...",',
|
|
123
|
+
'"description":"..."}],"summary":"..."}.',
|
|
124
|
+
'An empty "issues" array means the change is acceptable. Respond with JSON only.',
|
|
125
|
+
"",
|
|
126
|
+
"Diff:",
|
|
127
|
+
diff
|
|
128
|
+
].join("\n");
|
|
129
|
+
export const fixPrompt = (result) => [
|
|
130
|
+
"Address these review findings, then stop:",
|
|
131
|
+
...result.issues.map((issue) => `- [${issue.severity}] ${issue.title}: ${issue.description}`)
|
|
132
|
+
].join("\n");
|
|
133
|
+
export const mergeReviewResults = (results) => ReviewResult.make({
|
|
134
|
+
issues: results.flatMap((result) => result.issues),
|
|
135
|
+
summary: results
|
|
136
|
+
.map((result) => result.summary)
|
|
137
|
+
.filter((summary) => summary.length > 0)
|
|
138
|
+
.join("; ")
|
|
139
|
+
});
|
|
140
|
+
const processProblem = (stdout, stderr, exitCode) => {
|
|
141
|
+
const detail = [...stdout, ...stderr].join("\n").trim();
|
|
142
|
+
return detail.length === 0 ? `process exited with code ${exitCode}` : detail;
|
|
143
|
+
};
|
|
144
|
+
export const lintCommand = Effect.fn("@llm4ts/flow/Review.lintCommand")(function* (process, events, command, workDir) {
|
|
145
|
+
const executable = command[0];
|
|
146
|
+
if (executable === undefined) {
|
|
147
|
+
return ReviewResult.make({ issues: [], summary: "" });
|
|
148
|
+
}
|
|
149
|
+
const result = yield* guarded(Capabilities.Exec(executable), `lint: ${command.join(" ")}`, events, process.run(command, workDir, {}).pipe(Effect.mapError((cause) => ProcessError.make({
|
|
150
|
+
message: command.join(" "),
|
|
151
|
+
detail: cause.message
|
|
152
|
+
}))));
|
|
153
|
+
if (result.exitCode === 0) {
|
|
154
|
+
return ReviewResult.make({ issues: [], summary: "lint passed" });
|
|
155
|
+
}
|
|
156
|
+
return ReviewResult.make({
|
|
157
|
+
issues: [
|
|
158
|
+
ReviewIssue.make({
|
|
159
|
+
severity: "Critical",
|
|
160
|
+
title: `lint failed: ${command.join(" ")}`,
|
|
161
|
+
description: processProblem(result.stdout, result.stderr, result.exitCode)
|
|
162
|
+
})
|
|
163
|
+
],
|
|
164
|
+
summary: "lint failed"
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
const reviewWith = (service, lens, taskTitle, diff) => service
|
|
168
|
+
.executeStructured(`${lens.systemPrompt}\n\n${reviewPrompt(taskTitle, diff)}`, ReviewResult, reviewJsonSchema)
|
|
169
|
+
.pipe(Effect.mapError(FlowLlmError.from));
|
|
170
|
+
export const reviewAndFixLoop = Effect.fn("@llm4ts/flow/Review.reviewAndFixLoop")(function* (options) {
|
|
171
|
+
const maxRounds = Math.max(1, options.maxRounds ?? 3);
|
|
172
|
+
const selector = options.selector ?? allEveryRound;
|
|
173
|
+
const changedFiles = options.changedFiles ?? Effect.succeed([]);
|
|
174
|
+
const format = options.format ?? Effect.void;
|
|
175
|
+
const reviewOnce = (round, previous) => Effect.gen(function* () {
|
|
176
|
+
const lint = yield* options.lint ?? Effect.succeed(ReviewResult.make({ issues: [] }));
|
|
177
|
+
if (!lint.isClean) {
|
|
178
|
+
return lint;
|
|
179
|
+
}
|
|
180
|
+
const diff = yield* options.currentDiff;
|
|
181
|
+
const files = yield* changedFiles;
|
|
182
|
+
const chosen = yield* selector.select(options.reviewers, files, round, previous);
|
|
183
|
+
const run = (lens) => reviewWith(options.reviewerService, lens, options.taskTitle, diff);
|
|
184
|
+
const parallelism = options.parallelism ?? 0;
|
|
185
|
+
const results = parallelism > 0
|
|
186
|
+
? yield* Effect.forEach(chosen, run, { concurrency: parallelism })
|
|
187
|
+
: yield* Effect.forEach(chosen, run, { concurrency: "unbounded" });
|
|
188
|
+
return mergeReviewResults(results);
|
|
189
|
+
});
|
|
190
|
+
const loop = (round, previous) => Effect.gen(function* () {
|
|
191
|
+
yield* format;
|
|
192
|
+
const result = yield* reviewOnce(round, previous);
|
|
193
|
+
const verdict = result.isClean ? "clean" : `${result.issues.length} issue(s)`;
|
|
194
|
+
if (result.isClean || round >= maxRounds) {
|
|
195
|
+
yield* options.events.publish(Info.make({ message: `review settled after round ${round}: ${verdict}` }));
|
|
196
|
+
return result;
|
|
197
|
+
}
|
|
198
|
+
yield* options.events.publish(Info.make({ message: `review round ${round}: ${verdict}, fixing` }));
|
|
199
|
+
yield* options.coder.ask(fixPrompt(result));
|
|
200
|
+
return yield* loop(round + 1, result);
|
|
201
|
+
});
|
|
202
|
+
return yield* loop(1, undefined);
|
|
203
|
+
});
|
|
204
|
+
//# sourceMappingURL=Review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Review.js","sourceRoot":"","sources":["../src/Review.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { PersistenceError } from "./FlowError.ts";
|
|
3
|
+
import type { PlainFileStoreShape } from "./Persistence.ts";
|
|
4
|
+
import { ReviewResult } from "./Review.ts";
|
|
5
|
+
export declare const cachedReview: <R>(files: PlainFileStoreShape, path: string, fingerprint: string, evaluate: Effect.Effect<ReviewResult, PersistenceError | import("./FlowError.ts").PlanParseError | import("./FlowError.ts").UnsupportedSchemaVersion | import("./FlowError.ts").WorkspacePathError | import("./FlowError.ts").WorkspaceLimitError | import("./FlowError.ts").WorkspaceIoError | import("./FlowError.ts").FlowAborted | import("./FlowError.ts").ProcessError | import("./FlowError.ts").FlowLlmError | import("./FlowError.ts").FlowCapabilityDenied | import("./FlowError.ts").BudgetExceeded, R>) => Effect.Effect<ReviewResult, PersistenceError | import("./FlowError.ts").PlanParseError | import("./FlowError.ts").UnsupportedSchemaVersion | import("./FlowError.ts").WorkspacePathError | import("./FlowError.ts").WorkspaceLimitError | import("./FlowError.ts").WorkspaceIoError | import("./FlowError.ts").FlowAborted | import("./FlowError.ts").ProcessError | import("./FlowError.ts").FlowLlmError | import("./FlowError.ts").FlowCapabilityDenied | import("./FlowError.ts").BudgetExceeded, R>;
|
|
6
|
+
//# sourceMappingURL=ReviewCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReviewCache.d.ts","sourceRoot":"","sources":["../src/ReviewCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,gBAAgB,EAAkB,MAAM,gBAAgB,CAAA;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAa1C,eAAO,MAAM,YAAY,GAA2D,CAAC,giCA2BnF,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
import { PersistenceError } from "./FlowError.js";
|
|
4
|
+
import { ReviewResult } from "./Review.js";
|
|
5
|
+
class ReviewCacheEntry extends Schema.Class("ReviewCacheEntry")({
|
|
6
|
+
fingerprint: Schema.String,
|
|
7
|
+
result: ReviewResult
|
|
8
|
+
}) {
|
|
9
|
+
}
|
|
10
|
+
const decodeEntry = (contents) => Schema.decodeUnknownEffect(Schema.fromJsonString(ReviewCacheEntry))(contents).pipe(Effect.option, Effect.map((option) => (option._tag === "Some" ? option.value : undefined)));
|
|
11
|
+
export const cachedReview = Effect.fn("@llm4ts/flow/ReviewCache.cached")(function* (files, path, fingerprint, evaluate) {
|
|
12
|
+
const contents = yield* files.read(path).pipe(Effect.catch(() => Effect.succeed(undefined)));
|
|
13
|
+
const entry = contents === undefined ? undefined : yield* decodeEntry(contents);
|
|
14
|
+
if (entry?.fingerprint === fingerprint) {
|
|
15
|
+
return entry.result;
|
|
16
|
+
}
|
|
17
|
+
const result = yield* evaluate;
|
|
18
|
+
const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(ReviewCacheEntry))(ReviewCacheEntry.make({
|
|
19
|
+
fingerprint,
|
|
20
|
+
result
|
|
21
|
+
})).pipe(Effect.mapError((error) => PersistenceError.make({
|
|
22
|
+
message: `failed to encode review cache: ${String(error)}`,
|
|
23
|
+
cause: error
|
|
24
|
+
})));
|
|
25
|
+
yield* files.writeAtomic(path, encoded);
|
|
26
|
+
return result;
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=ReviewCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReviewCache.js","sourceRoot":"","sources":["../src/ReviewCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,gBAAgB,EAAkB,MAAM,gBAAgB,CAAA;AAEjE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,gBAAiB,SAAQ,MAAM,CAAC,KAAK,CAAmB,kBAAkB,CAAC,CAAC;IAChF,WAAW,EAAE,MAAM,CAAC,MAAM;IAC1B,MAAM,EAAE,YAAY;CACrB,CAAC;CAAG;AAEL,MAAM,WAAW,GAAG,CAAC,QAAgB,EAA+C,EAAE,CACpF,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAChF,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAC5E,CAAA;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,iCAAiC,CAAC,CAAC,QAAQ,CAAC,EAChF,KAA0B,EAC1B,IAAY,EACZ,WAAmB,EACnB,QAAmD;IAEnD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAC5F,MAAM,KAAK,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;IAC/E,IAAI,KAAK,EAAE,WAAW,KAAK,WAAW,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC,MAAM,CAAA;IACrB,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAA;IAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CACjF,gBAAgB,CAAC,IAAI,CAAC;QACpB,WAAW;QACX,MAAM;KACP,CAAC,CACH,CAAC,IAAI,CACJ,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CACxB,gBAAgB,CAAC,IAAI,CAAC;QACpB,OAAO,EAAE,kCAAkC,MAAM,CAAC,KAAK,CAAC,EAAE;QAC1D,KAAK,EAAE,KAAK;KACb,CAAC,CACH,CACF,CAAA;IACD,KAAK,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACvC,OAAO,MAAM,CAAA;AACf,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as Schema from "effect/Schema";
|
|
2
|
+
declare const Reviewer_base: Schema.Class<Reviewer, Schema.Struct<{
|
|
3
|
+
readonly name: Schema.String;
|
|
4
|
+
readonly systemPrompt: Schema.String;
|
|
5
|
+
readonly files: Schema.optionalKey<Schema.String>;
|
|
6
|
+
}>, {}>;
|
|
7
|
+
export declare class Reviewer extends Reviewer_base {
|
|
8
|
+
matches(changedFiles: ReadonlyArray<string>): boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare const parseReviewer: (name: string, text: string) => Reviewer;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=Reviewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Reviewer.d.ts","sourceRoot":"","sources":["../src/Reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;;;;;;AAEvC,qBAAa,QAAS,SAAQ,aAI5B;IACA,OAAO,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO;CAOtD;AAED,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,EAAE,MAAM,MAAM,KAAG,QAc1D,CAAA"}
|
package/dist/Reviewer.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as Schema from "effect/Schema";
|
|
2
|
+
export class Reviewer extends Schema.Class("Reviewer")({
|
|
3
|
+
name: Schema.String,
|
|
4
|
+
systemPrompt: Schema.String,
|
|
5
|
+
files: Schema.optionalKey(Schema.String)
|
|
6
|
+
}) {
|
|
7
|
+
matches(changedFiles) {
|
|
8
|
+
if (this.files === undefined || changedFiles.length === 0) {
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
const pattern = new RegExp(this.files);
|
|
12
|
+
return changedFiles.some((path) => pattern.test(path));
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export const parseReviewer = (name, text) => {
|
|
16
|
+
const parts = text.split("---\n", 3);
|
|
17
|
+
const frontmatter = parts.length === 3 ? (parts[1] ?? "") : "";
|
|
18
|
+
const body = parts.length === 3 ? (parts[2] ?? "").trim() : text.trim();
|
|
19
|
+
const files = frontmatter
|
|
20
|
+
.split(/\r?\n/)
|
|
21
|
+
.find((line) => line.trim().startsWith("files:"))
|
|
22
|
+
?.split("files:", 2)[1]
|
|
23
|
+
?.trim();
|
|
24
|
+
return Reviewer.make({
|
|
25
|
+
name,
|
|
26
|
+
systemPrompt: body,
|
|
27
|
+
...(files === undefined || files.length === 0 ? {} : { files })
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=Reviewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Reviewer.js","sourceRoot":"","sources":["../src/Reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,MAAM,OAAO,QAAS,SAAQ,MAAM,CAAC,KAAK,CAAW,UAAU,CAAC,CAAC;IAC/D,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,YAAY,EAAE,MAAM,CAAC,MAAM;IAC3B,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;CACzC,CAAC;IACA,OAAO,CAAC,YAAmC;QACzC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACtC,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IACxD,CAAC;CACF;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,IAAY,EAAY,EAAE;IACpE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IACpC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9D,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;IACvE,MAAM,KAAK,GAAG,WAAW;SACtB,KAAK,CAAC,OAAO,CAAC;SACd,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACjD,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,EAAE,IAAI,EAAE,CAAA;IACV,OAAO,QAAQ,CAAC,IAAI,CAAC;QACnB,IAAI;QACJ,YAAY,EAAE,IAAI;QAClB,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;KAChE,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
import { ReviewResult } from "./Review.ts";
|
|
4
|
+
import type { WorkspaceError, WorkspaceShape } from "./Workspace.ts";
|
|
5
|
+
declare const CoverageRule_base: Schema.Class<CoverageRule, Schema.Struct<{
|
|
6
|
+
readonly name: Schema.String;
|
|
7
|
+
readonly files: Schema.String;
|
|
8
|
+
readonly unit: Schema.String;
|
|
9
|
+
}>, {}>;
|
|
10
|
+
export declare class CoverageRule extends CoverageRule_base {
|
|
11
|
+
}
|
|
12
|
+
export declare const matchingFiles: (workspace: WorkspaceShape, regex: string) => Effect.Effect<ReadonlyArray<string>, WorkspaceError>;
|
|
13
|
+
export declare const coverageUnits: (workspace: WorkspaceShape, rules: readonly CoverageRule[]) => Effect.Effect<Readonly<Record<string, readonly string[]>>, WorkspaceError, never>;
|
|
14
|
+
export declare const coverage: (workspace: WorkspaceShape, rules: readonly CoverageRule[], traceability: string) => Effect.Effect<ReviewResult, WorkspaceError, never>;
|
|
15
|
+
export declare const features: (workspace: WorkspaceShape, directory: string) => Effect.Effect<ReviewResult, WorkspaceError, never>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=SpecChecks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpecChecks.d.ts","sourceRoot":"","sources":["../src/SpecChecks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAe,YAAY,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;;;;;;AAEpE,qBAAa,YAAa,SAAQ,iBAIhC;CAAG;AAcL,eAAO,MAAM,aAAa,GACxB,WAAW,cAAc,EACzB,OAAO,MAAM,KACZ,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,cAAc,CAMnD,CAAA;AAEH,eAAO,MAAM,aAAa,kJAuBxB,CAAA;AAEF,eAAO,MAAM,QAAQ,yIAyBnB,CAAA;AA2BF,eAAO,MAAM,QAAQ,sGA+BnB,CAAA"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
import { ReviewIssue, ReviewResult } from "./Review.js";
|
|
4
|
+
export class CoverageRule extends Schema.Class("CoverageRule")({
|
|
5
|
+
name: Schema.String,
|
|
6
|
+
files: Schema.String,
|
|
7
|
+
unit: Schema.String
|
|
8
|
+
}) {
|
|
9
|
+
}
|
|
10
|
+
const capture = (regex, text) => {
|
|
11
|
+
const expression = new RegExp(regex.source, regex.flags.includes("g") ? regex.flags : `${regex.flags}g`);
|
|
12
|
+
const values = [];
|
|
13
|
+
for (const match of text.matchAll(expression)) {
|
|
14
|
+
values.push(match[1] ?? match[0]);
|
|
15
|
+
}
|
|
16
|
+
return values;
|
|
17
|
+
};
|
|
18
|
+
export const matchingFiles = (workspace, regex) => workspace.discover().pipe(Effect.map((paths) => {
|
|
19
|
+
const expression = new RegExp(regex);
|
|
20
|
+
return paths.filter((path) => expression.test(path)).sort();
|
|
21
|
+
}));
|
|
22
|
+
export const coverageUnits = Effect.fn("@llm4ts/flow/SpecChecks.coverageUnits")(function* (workspace, rules) {
|
|
23
|
+
const paths = yield* workspace.discover();
|
|
24
|
+
const result = {};
|
|
25
|
+
for (const rule of rules) {
|
|
26
|
+
const filePattern = new RegExp(rule.files);
|
|
27
|
+
const unitPattern = new RegExp(rule.unit);
|
|
28
|
+
const units = [];
|
|
29
|
+
for (const path of paths.filter((path) => filePattern.test(path))) {
|
|
30
|
+
const contents = yield* workspace.read(path);
|
|
31
|
+
for (const line of contents.split(/\r?\n/)) {
|
|
32
|
+
for (const unit of capture(unitPattern, line)) {
|
|
33
|
+
if (!units.includes(unit)) {
|
|
34
|
+
units.push(unit);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
result[rule.name] = units;
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
});
|
|
43
|
+
export const coverage = Effect.fn("@llm4ts/flow/SpecChecks.coverage")(function* (workspace, rules, traceability) {
|
|
44
|
+
const units = yield* coverageUnits(workspace, rules);
|
|
45
|
+
const issues = rules.flatMap((rule) => (units[rule.name] ?? []).flatMap((unit) => traceability.includes(unit)
|
|
46
|
+
? []
|
|
47
|
+
: [
|
|
48
|
+
ReviewIssue.make({
|
|
49
|
+
severity: "Critical",
|
|
50
|
+
title: `uncovered ${rule.name}: ${unit}`,
|
|
51
|
+
description: `'${unit}' exists in the legacy source but does not ` +
|
|
52
|
+
"appear in the traceability matrix."
|
|
53
|
+
})
|
|
54
|
+
]));
|
|
55
|
+
return ReviewResult.make({
|
|
56
|
+
issues,
|
|
57
|
+
summary: issues.length === 0 ? "coverage complete" : `${issues.length} unit(s) uncovered`
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
const featureIssue = (path, contents) => {
|
|
61
|
+
const lines = contents.split(/\r?\n/).map((line) => line.trim());
|
|
62
|
+
const scenarios = lines.filter((line) => line.startsWith("Scenario:") || line.startsWith("Scenario Outline:")).length;
|
|
63
|
+
const steps = lines.filter((line) => ["Given ", "When ", "Then ", "And ", "But "].some((prefix) => line.startsWith(prefix))).length;
|
|
64
|
+
const problem = !lines.some((line) => line.startsWith("Feature:"))
|
|
65
|
+
? "missing a 'Feature:' header"
|
|
66
|
+
: scenarios === 0
|
|
67
|
+
? "contains no scenarios"
|
|
68
|
+
: steps === 0
|
|
69
|
+
? "has scenarios but no Given/When/Then steps"
|
|
70
|
+
: undefined;
|
|
71
|
+
return problem === undefined
|
|
72
|
+
? undefined
|
|
73
|
+
: ReviewIssue.make({
|
|
74
|
+
severity: "Critical",
|
|
75
|
+
title: `malformed feature: ${path}`,
|
|
76
|
+
description: problem,
|
|
77
|
+
file: path
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
export const features = Effect.fn("@llm4ts/flow/SpecChecks.features")(function* (workspace, directory) {
|
|
81
|
+
const prefix = directory.replace(/[\\/]+$/, "");
|
|
82
|
+
const paths = (yield* workspace.discover("**/*.feature")).filter((path) => path === prefix || path.startsWith(`${prefix}/`));
|
|
83
|
+
if (paths.length === 0) {
|
|
84
|
+
return ReviewResult.make({
|
|
85
|
+
issues: [
|
|
86
|
+
ReviewIssue.make({
|
|
87
|
+
severity: "Critical",
|
|
88
|
+
title: "no feature files",
|
|
89
|
+
description: `no .feature files found under ${directory}`
|
|
90
|
+
})
|
|
91
|
+
],
|
|
92
|
+
summary: "no features"
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
const issues = [];
|
|
96
|
+
for (const path of paths) {
|
|
97
|
+
const issue = featureIssue(path, yield* workspace.read(path));
|
|
98
|
+
if (issue !== undefined) {
|
|
99
|
+
issues.push(issue);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return ReviewResult.make({
|
|
103
|
+
issues,
|
|
104
|
+
summary: issues.length === 0 ? "features well-formed" : `${issues.length} malformed`
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=SpecChecks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpecChecks.js","sourceRoot":"","sources":["../src/SpecChecks.ts"],"names":[],"mappings":"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"}
|
package/dist/Survey.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
import type { CoverageRule } from "./SpecChecks.ts";
|
|
4
|
+
import type { WorkspaceError, WorkspaceShape } from "./Workspace.ts";
|
|
5
|
+
declare const SurveyNode_base: Schema.Class<SurveyNode, Schema.Struct<{
|
|
6
|
+
readonly path: Schema.String;
|
|
7
|
+
readonly name: Schema.String;
|
|
8
|
+
readonly lines: Schema.Int;
|
|
9
|
+
readonly units: Schema.Int;
|
|
10
|
+
}>, {}>;
|
|
11
|
+
export declare class SurveyNode extends SurveyNode_base {
|
|
12
|
+
}
|
|
13
|
+
declare const SurveyEdge_base: Schema.Class<SurveyEdge, Schema.Struct<{
|
|
14
|
+
readonly from: Schema.String;
|
|
15
|
+
readonly to: Schema.String;
|
|
16
|
+
readonly kind: Schema.String;
|
|
17
|
+
}>, {}>;
|
|
18
|
+
export declare class SurveyEdge extends SurveyEdge_base {
|
|
19
|
+
}
|
|
20
|
+
declare const SurveyGraph_base: Schema.Class<SurveyGraph, Schema.Struct<{
|
|
21
|
+
readonly nodes: Schema.$Array<typeof SurveyNode>;
|
|
22
|
+
readonly edges: Schema.$Array<typeof SurveyEdge>;
|
|
23
|
+
}>, {}>;
|
|
24
|
+
export declare class SurveyGraph extends SurveyGraph_base {
|
|
25
|
+
incoming(name: string): ReadonlyArray<SurveyEdge>;
|
|
26
|
+
outgoing(name: string): ReadonlyArray<SurveyEdge>;
|
|
27
|
+
}
|
|
28
|
+
export declare const surveyGraph: (workspace: WorkspaceShape, sources: string, units: readonly CoverageRule[], edgeRules: readonly CoverageRule[]) => Effect.Effect<SurveyGraph, WorkspaceError, never>;
|
|
29
|
+
export declare const mergeSurveyEdges: (graph: SurveyGraph, refined: ReadonlyArray<SurveyEdge>) => SurveyGraph;
|
|
30
|
+
export declare const renderSurveyInventory: (graph: SurveyGraph) => string;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=Survey.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Survey.d.ts","sourceRoot":"","sources":["../src/Survey.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;;;;;;;AAEpE,qBAAa,UAAW,SAAQ,eAK9B;CAAG;;;;;;AAEL,qBAAa,UAAW,SAAQ,eAI9B;CAAG;;;;;AAEL,qBAAa,WAAY,SAAQ,gBAG/B;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC;IAIjD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC;CAGlD;AAaD,eAAO,MAAM,WAAW,uKA8CtB,CAAA;AAEF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,WAAW,EAClB,SAAS,aAAa,CAAC,UAAU,CAAC,KACjC,WA2BF,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,OAAO,WAAW,KAAG,MAqB1D,CAAA"}
|