@diff-review-system/drs 1.0.0 → 2.0.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/.opencode/agent/describe/pr-describer.md +221 -0
- package/.opencode/agent/review/documentation.md +56 -0
- package/.opencode/agent/review/performance.md +32 -130
- package/.opencode/agent/review/quality.md +36 -104
- package/.opencode/agent/review/security.md +32 -94
- package/.opencode/agent/review/style.md +26 -10
- package/.opencode/agent/review/unified-reviewer.md +74 -0
- package/.opencode/opencode.jsonc +4 -41
- package/.opencode/tool/write_json_output.ts +24 -0
- package/README.md +215 -82
- package/dist/ci/runner.d.ts.map +1 -1
- package/dist/ci/runner.js +4 -4
- package/dist/ci/runner.js.map +1 -1
- package/dist/cli/describe-mr.d.ts +11 -0
- package/dist/cli/describe-mr.d.ts.map +1 -0
- package/dist/cli/describe-mr.js +104 -0
- package/dist/cli/describe-mr.js.map +1 -0
- package/dist/cli/describe-pr.d.ts +12 -0
- package/dist/cli/describe-pr.d.ts.map +1 -0
- package/dist/cli/describe-pr.js +105 -0
- package/dist/cli/describe-pr.js.map +1 -0
- package/dist/cli/index.js +234 -20
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +337 -120
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/post-comments.d.ts +15 -0
- package/dist/cli/post-comments.d.ts.map +1 -0
- package/dist/cli/post-comments.js +216 -0
- package/dist/cli/post-comments.js.map +1 -0
- package/dist/cli/review-local.d.ts +3 -0
- package/dist/cli/review-local.d.ts.map +1 -1
- package/dist/cli/review-local.js +46 -63
- package/dist/cli/review-local.js.map +1 -1
- package/dist/cli/review-mr.d.ts +7 -0
- package/dist/cli/review-mr.d.ts.map +1 -1
- package/dist/cli/review-mr.js +88 -117
- package/dist/cli/review-mr.js.map +1 -1
- package/dist/cli/review-pr.d.ts +6 -0
- package/dist/cli/review-pr.d.ts.map +1 -1
- package/dist/cli/review-pr.js +81 -114
- package/dist/cli/review-pr.js.map +1 -1
- package/dist/cli/show-changes.d.ts +15 -0
- package/dist/cli/show-changes.d.ts.map +1 -0
- package/dist/cli/show-changes.js +184 -0
- package/dist/cli/show-changes.js.map +1 -0
- package/dist/github/client.d.ts +199 -4
- package/dist/github/client.d.ts.map +1 -1
- package/dist/github/client.js +37 -2
- package/dist/github/client.js.map +1 -1
- package/dist/github/client.test.d.ts +2 -0
- package/dist/github/client.test.d.ts.map +1 -0
- package/dist/github/client.test.js +206 -0
- package/dist/github/client.test.js.map +1 -0
- package/dist/github/platform-adapter.d.ts +31 -0
- package/dist/github/platform-adapter.d.ts.map +1 -0
- package/dist/github/platform-adapter.js +129 -0
- package/dist/github/platform-adapter.js.map +1 -0
- package/dist/github/platform-adapter.test.d.ts +2 -0
- package/dist/github/platform-adapter.test.d.ts.map +1 -0
- package/dist/github/platform-adapter.test.js +40 -0
- package/dist/github/platform-adapter.test.js.map +1 -0
- package/dist/gitlab/client.d.ts +12 -0
- package/dist/gitlab/client.d.ts.map +1 -1
- package/dist/gitlab/client.js +19 -1
- package/dist/gitlab/client.js.map +1 -1
- package/dist/gitlab/diff-parser.test.d.ts +2 -0
- package/dist/gitlab/diff-parser.test.d.ts.map +1 -0
- package/dist/gitlab/diff-parser.test.js +315 -0
- package/dist/gitlab/diff-parser.test.js.map +1 -0
- package/dist/gitlab/platform-adapter.d.ts +27 -0
- package/dist/gitlab/platform-adapter.d.ts.map +1 -0
- package/dist/gitlab/platform-adapter.js +121 -0
- package/dist/gitlab/platform-adapter.js.map +1 -0
- package/dist/gitlab/platform-adapter.test.d.ts +2 -0
- package/dist/gitlab/platform-adapter.test.d.ts.map +1 -0
- package/dist/gitlab/platform-adapter.test.js +21 -0
- package/dist/gitlab/platform-adapter.test.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +7 -0
- package/dist/index.test.js.map +1 -0
- package/dist/lib/change-summary.d.ts +8 -0
- package/dist/lib/change-summary.d.ts.map +1 -0
- package/dist/lib/change-summary.js +2 -0
- package/dist/lib/change-summary.js.map +1 -0
- package/dist/lib/code-quality-report.d.ts +44 -0
- package/dist/lib/code-quality-report.d.ts.map +1 -0
- package/dist/lib/code-quality-report.js +62 -0
- package/dist/lib/code-quality-report.js.map +1 -0
- package/dist/lib/code-quality-report.test.d.ts +2 -0
- package/dist/lib/code-quality-report.test.d.ts.map +1 -0
- package/dist/lib/code-quality-report.test.js +327 -0
- package/dist/lib/code-quality-report.test.js.map +1 -0
- package/dist/{gitlab → lib}/comment-formatter.d.ts +6 -3
- package/dist/lib/comment-formatter.d.ts.map +1 -0
- package/dist/{gitlab → lib}/comment-formatter.js +63 -16
- package/dist/lib/comment-formatter.js.map +1 -0
- package/dist/lib/comment-formatter.test.d.ts +2 -0
- package/dist/lib/comment-formatter.test.d.ts.map +1 -0
- package/dist/lib/comment-formatter.test.js +607 -0
- package/dist/lib/comment-formatter.test.js.map +1 -0
- package/dist/lib/comment-manager.d.ts +61 -0
- package/dist/lib/comment-manager.d.ts.map +1 -0
- package/dist/lib/comment-manager.js +91 -0
- package/dist/lib/comment-manager.js.map +1 -0
- package/dist/lib/comment-manager.test.d.ts +2 -0
- package/dist/lib/comment-manager.test.d.ts.map +1 -0
- package/dist/lib/comment-manager.test.js +618 -0
- package/dist/lib/comment-manager.test.js.map +1 -0
- package/dist/lib/comment-poster.d.ts +21 -0
- package/dist/lib/comment-poster.d.ts.map +1 -0
- package/dist/lib/comment-poster.js +96 -0
- package/dist/lib/comment-poster.js.map +1 -0
- package/dist/lib/comment-poster.test.d.ts +5 -0
- package/dist/lib/comment-poster.test.d.ts.map +1 -0
- package/dist/lib/comment-poster.test.js +215 -0
- package/dist/lib/comment-poster.test.js.map +1 -0
- package/dist/lib/config-model-overrides.test.d.ts +12 -0
- package/dist/lib/config-model-overrides.test.d.ts.map +1 -0
- package/dist/lib/config-model-overrides.test.js +254 -0
- package/dist/lib/config-model-overrides.test.js.map +1 -0
- package/dist/lib/config.d.ts +93 -8
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +178 -25
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/config.test.d.ts +2 -0
- package/dist/lib/config.test.d.ts.map +1 -0
- package/dist/lib/config.test.js +36 -0
- package/dist/lib/config.test.js.map +1 -0
- package/dist/lib/context-compression.d.ts +19 -0
- package/dist/lib/context-compression.d.ts.map +1 -0
- package/dist/lib/context-compression.js +170 -0
- package/dist/lib/context-compression.js.map +1 -0
- package/dist/lib/context-compression.test.d.ts +2 -0
- package/dist/lib/context-compression.test.d.ts.map +1 -0
- package/dist/lib/context-compression.test.js +33 -0
- package/dist/lib/context-compression.test.js.map +1 -0
- package/dist/lib/context-loader.d.ts +29 -0
- package/dist/lib/context-loader.d.ts.map +1 -0
- package/dist/lib/context-loader.js +75 -0
- package/dist/lib/context-loader.js.map +1 -0
- package/dist/lib/context-loader.test.d.ts +2 -0
- package/dist/lib/context-loader.test.d.ts.map +1 -0
- package/dist/lib/context-loader.test.js +207 -0
- package/dist/lib/context-loader.test.js.map +1 -0
- package/dist/lib/describe-core.d.ts +9 -0
- package/dist/lib/describe-core.d.ts.map +1 -0
- package/dist/lib/describe-core.js +71 -0
- package/dist/lib/describe-core.js.map +1 -0
- package/dist/lib/describe-core.test.d.ts +2 -0
- package/dist/lib/describe-core.test.d.ts.map +1 -0
- package/dist/lib/describe-core.test.js +208 -0
- package/dist/lib/describe-core.test.js.map +1 -0
- package/dist/lib/describe-output-path.test.d.ts +2 -0
- package/dist/lib/describe-output-path.test.d.ts.map +1 -0
- package/dist/lib/describe-output-path.test.js +51 -0
- package/dist/lib/describe-output-path.test.js.map +1 -0
- package/dist/lib/describe-parser.d.ts +3 -0
- package/dist/lib/describe-parser.d.ts.map +1 -0
- package/dist/lib/describe-parser.js +163 -0
- package/dist/lib/describe-parser.js.map +1 -0
- package/dist/lib/describe-parser.test.d.ts +2 -0
- package/dist/lib/describe-parser.test.d.ts.map +1 -0
- package/dist/lib/describe-parser.test.js +282 -0
- package/dist/lib/describe-parser.test.js.map +1 -0
- package/dist/lib/description-executor.d.ts +22 -0
- package/dist/lib/description-executor.d.ts.map +1 -0
- package/dist/lib/description-executor.js +72 -0
- package/dist/lib/description-executor.js.map +1 -0
- package/dist/lib/description-formatter.d.ts +37 -0
- package/dist/lib/description-formatter.d.ts.map +1 -0
- package/dist/lib/description-formatter.js +219 -0
- package/dist/lib/description-formatter.js.map +1 -0
- package/dist/{gitlab → lib}/diff-parser.d.ts +11 -0
- package/dist/lib/diff-parser.d.ts.map +1 -0
- package/dist/{gitlab → lib}/diff-parser.js +40 -3
- package/dist/lib/diff-parser.js.map +1 -0
- package/dist/lib/issue-parser.d.ts +29 -0
- package/dist/lib/issue-parser.d.ts.map +1 -0
- package/dist/lib/issue-parser.js +153 -0
- package/dist/lib/issue-parser.js.map +1 -0
- package/dist/lib/issue-parser.test.d.ts +2 -0
- package/dist/lib/issue-parser.test.d.ts.map +1 -0
- package/dist/lib/issue-parser.test.js +281 -0
- package/dist/lib/issue-parser.test.js.map +1 -0
- package/dist/lib/json-output-schema.d.ts +207 -0
- package/dist/lib/json-output-schema.d.ts.map +1 -0
- package/dist/lib/json-output-schema.js +124 -0
- package/dist/lib/json-output-schema.js.map +1 -0
- package/dist/lib/json-output-schema.test.d.ts +2 -0
- package/dist/lib/json-output-schema.test.d.ts.map +1 -0
- package/dist/lib/json-output-schema.test.js +92 -0
- package/dist/lib/json-output-schema.test.js.map +1 -0
- package/dist/lib/json-output.d.ts +43 -0
- package/dist/lib/json-output.d.ts.map +1 -0
- package/dist/lib/json-output.js +34 -0
- package/dist/lib/json-output.js.map +1 -0
- package/dist/lib/output-paths.d.ts +6 -0
- package/dist/lib/output-paths.d.ts.map +1 -0
- package/dist/lib/output-paths.js +5 -0
- package/dist/lib/output-paths.js.map +1 -0
- package/dist/lib/platform-client.d.ts +130 -0
- package/dist/lib/platform-client.d.ts.map +1 -0
- package/dist/lib/platform-client.js +8 -0
- package/dist/lib/platform-client.js.map +1 -0
- package/dist/lib/position-validator.d.ts +36 -0
- package/dist/lib/position-validator.d.ts.map +1 -0
- package/dist/lib/position-validator.js +43 -0
- package/dist/lib/position-validator.js.map +1 -0
- package/dist/lib/repository-validator.d.ts +52 -0
- package/dist/lib/repository-validator.d.ts.map +1 -0
- package/dist/lib/repository-validator.js +219 -0
- package/dist/lib/repository-validator.js.map +1 -0
- package/dist/lib/repository-validator.test.d.ts +5 -0
- package/dist/lib/repository-validator.test.d.ts.map +1 -0
- package/dist/lib/repository-validator.test.js +341 -0
- package/dist/lib/repository-validator.test.js.map +1 -0
- package/dist/lib/review-core.d.ts +66 -0
- package/dist/lib/review-core.d.ts.map +1 -0
- package/dist/lib/review-core.js +449 -0
- package/dist/lib/review-core.js.map +1 -0
- package/dist/lib/review-core.test.d.ts +2 -0
- package/dist/lib/review-core.test.d.ts.map +1 -0
- package/dist/lib/review-core.test.js +552 -0
- package/dist/lib/review-core.test.js.map +1 -0
- package/dist/lib/review-orchestrator.d.ts +77 -0
- package/dist/lib/review-orchestrator.d.ts.map +1 -0
- package/dist/lib/review-orchestrator.js +124 -0
- package/dist/lib/review-orchestrator.js.map +1 -0
- package/dist/lib/review-orchestrator.test.d.ts +2 -0
- package/dist/lib/review-orchestrator.test.d.ts.map +1 -0
- package/dist/lib/review-orchestrator.test.js +413 -0
- package/dist/lib/review-orchestrator.test.js.map +1 -0
- package/dist/lib/review-output-path.test.d.ts +2 -0
- package/dist/lib/review-output-path.test.d.ts.map +1 -0
- package/dist/lib/review-output-path.test.js +83 -0
- package/dist/lib/review-output-path.test.js.map +1 -0
- package/dist/lib/review-parser.d.ts +2 -0
- package/dist/lib/review-parser.d.ts.map +1 -0
- package/dist/lib/review-parser.js +100 -0
- package/dist/lib/review-parser.js.map +1 -0
- package/dist/lib/unified-review-executor.d.ts +49 -0
- package/dist/lib/unified-review-executor.d.ts.map +1 -0
- package/dist/lib/unified-review-executor.js +158 -0
- package/dist/lib/unified-review-executor.js.map +1 -0
- package/dist/lib/unified-review-executor.test.d.ts +5 -0
- package/dist/lib/unified-review-executor.test.d.ts.map +1 -0
- package/dist/lib/unified-review-executor.test.js +344 -0
- package/dist/lib/unified-review-executor.test.js.map +1 -0
- package/dist/lib/write-json-output.d.ts +13 -0
- package/dist/lib/write-json-output.d.ts.map +1 -0
- package/dist/lib/write-json-output.js +37 -0
- package/dist/lib/write-json-output.js.map +1 -0
- package/dist/opencode/agent-loader.d.ts +3 -4
- package/dist/opencode/agent-loader.d.ts.map +1 -1
- package/dist/opencode/agent-loader.js +51 -42
- package/dist/opencode/agent-loader.js.map +1 -1
- package/dist/opencode/agent-skill-overlay.d.ts +11 -0
- package/dist/opencode/agent-skill-overlay.d.ts.map +1 -0
- package/dist/opencode/agent-skill-overlay.js +164 -0
- package/dist/opencode/agent-skill-overlay.js.map +1 -0
- package/dist/opencode/client.d.ts +14 -5
- package/dist/opencode/client.d.ts.map +1 -1
- package/dist/opencode/client.js +311 -32
- package/dist/opencode/client.js.map +1 -1
- package/dist/opencode/client.test.d.ts +2 -0
- package/dist/opencode/client.test.d.ts.map +1 -0
- package/dist/opencode/client.test.js +317 -0
- package/dist/opencode/client.test.js.map +1 -0
- package/dist/opencode/opencode-paths.d.ts +2 -0
- package/dist/opencode/opencode-paths.d.ts.map +1 -0
- package/dist/opencode/opencode-paths.js +7 -0
- package/dist/opencode/opencode-paths.js.map +1 -0
- package/dist/opencode/skill-loader.d.ts +6 -0
- package/dist/opencode/skill-loader.d.ts.map +1 -0
- package/dist/opencode/skill-loader.js +36 -0
- package/dist/opencode/skill-loader.js.map +1 -0
- package/package.json +29 -20
- package/.opencode/agent/github-reviewer.md +0 -62
- package/.opencode/agent/gitlab-reviewer.md +0 -62
- package/.opencode/agent/local-reviewer.md +0 -71
- package/dist/gitlab/comment-formatter.d.ts.map +0 -1
- package/dist/gitlab/comment-formatter.js.map +0 -1
- package/dist/gitlab/diff-parser.d.ts.map +0 -1
- package/dist/gitlab/diff-parser.js.map +0 -1
package/dist/lib/config.d.ts
CHANGED
|
@@ -1,6 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent configuration - supports both simple string and detailed object format
|
|
3
|
+
*/
|
|
4
|
+
export interface AgentConfig {
|
|
5
|
+
name: string;
|
|
6
|
+
model?: string;
|
|
7
|
+
skills?: string[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Model override mapping from agent name to model identifier
|
|
11
|
+
*/
|
|
12
|
+
export type ModelOverrides = Record<string, string>;
|
|
13
|
+
/**
|
|
14
|
+
* Custom OpenAI-compatible provider configuration
|
|
15
|
+
*/
|
|
16
|
+
export interface CustomProvider {
|
|
17
|
+
npm: string;
|
|
18
|
+
name: string;
|
|
19
|
+
options: {
|
|
20
|
+
baseURL: string;
|
|
21
|
+
apiKey: string;
|
|
22
|
+
};
|
|
23
|
+
models: Record<string, {
|
|
24
|
+
name: string;
|
|
25
|
+
}>;
|
|
26
|
+
}
|
|
1
27
|
export interface DRSConfig {
|
|
2
28
|
opencode: {
|
|
3
|
-
serverUrl
|
|
29
|
+
serverUrl?: string;
|
|
30
|
+
provider?: Record<string, CustomProvider>;
|
|
4
31
|
};
|
|
5
32
|
gitlab: {
|
|
6
33
|
url: string;
|
|
@@ -10,18 +37,38 @@ export interface DRSConfig {
|
|
|
10
37
|
token: string;
|
|
11
38
|
};
|
|
12
39
|
review: {
|
|
13
|
-
agents: string[];
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
40
|
+
agents: (string | AgentConfig)[];
|
|
41
|
+
default?: {
|
|
42
|
+
model?: string;
|
|
43
|
+
skills?: string[];
|
|
44
|
+
};
|
|
45
|
+
defaultModel?: string;
|
|
17
46
|
ignorePatterns: string[];
|
|
18
47
|
includePatterns?: string[];
|
|
48
|
+
mode?: ReviewMode;
|
|
49
|
+
unified?: {
|
|
50
|
+
model?: string;
|
|
51
|
+
severityThreshold?: ReviewSeverity;
|
|
52
|
+
};
|
|
53
|
+
describe?: {
|
|
54
|
+
enabled?: boolean;
|
|
55
|
+
postDescription?: boolean;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
describe?: {
|
|
59
|
+
model?: string;
|
|
60
|
+
includeProjectContext?: boolean;
|
|
19
61
|
};
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
62
|
+
contextCompression?: {
|
|
63
|
+
enabled?: boolean;
|
|
64
|
+
maxTokens?: number;
|
|
65
|
+
softBufferTokens?: number;
|
|
66
|
+
hardBufferTokens?: number;
|
|
67
|
+
tokenEstimateDivisor?: number;
|
|
23
68
|
};
|
|
24
69
|
}
|
|
70
|
+
export type ReviewMode = 'multi-agent' | 'unified' | 'hybrid';
|
|
71
|
+
export type ReviewSeverity = 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';
|
|
25
72
|
/**
|
|
26
73
|
* Load configuration from various sources with precedence:
|
|
27
74
|
* 1. CLI arguments (passed as overrides)
|
|
@@ -39,4 +86,42 @@ export declare function validateConfig(config: DRSConfig, platform?: 'gitlab' |
|
|
|
39
86
|
* Check if a file should be ignored based on patterns
|
|
40
87
|
*/
|
|
41
88
|
export declare function shouldIgnoreFile(filePath: string, config: DRSConfig): boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Normalize agent configuration from mixed format to AgentConfig array
|
|
91
|
+
*/
|
|
92
|
+
export declare function normalizeAgentConfig(agents: (string | AgentConfig)[]): AgentConfig[];
|
|
93
|
+
export declare function getDefaultModel(config: DRSConfig): string | undefined;
|
|
94
|
+
export declare function getDefaultSkills(config: DRSConfig): string[];
|
|
95
|
+
/**
|
|
96
|
+
* Extract agent names from configuration
|
|
97
|
+
*/
|
|
98
|
+
export declare function getAgentNames(config: DRSConfig): string[];
|
|
99
|
+
/**
|
|
100
|
+
* Build model overrides from config and environment variables
|
|
101
|
+
* Precedence:
|
|
102
|
+
* 1. Per-agent model in config
|
|
103
|
+
* 2. Environment variable REVIEW_AGENT_<NAME>_MODEL (e.g., REVIEW_AGENT_SECURITY_MODEL)
|
|
104
|
+
* 3. defaultModel in config
|
|
105
|
+
* 4. Environment variable REVIEW_DEFAULT_MODEL
|
|
106
|
+
*
|
|
107
|
+
*/
|
|
108
|
+
export declare function getModelOverrides(config: DRSConfig): ModelOverrides;
|
|
109
|
+
/**
|
|
110
|
+
* Get model override for the unified reviewer agent
|
|
111
|
+
* Precedence:
|
|
112
|
+
* 1. review.unified.model in config
|
|
113
|
+
* 2. Environment variable REVIEW_UNIFIED_MODEL
|
|
114
|
+
* 3. review.defaultModel in config (fallback)
|
|
115
|
+
* 4. Environment variable REVIEW_DEFAULT_MODEL (fallback)
|
|
116
|
+
*/
|
|
117
|
+
export declare function getUnifiedModelOverride(config: DRSConfig): ModelOverrides;
|
|
118
|
+
/**
|
|
119
|
+
* Get model override for the describer agent
|
|
120
|
+
* Precedence:
|
|
121
|
+
* 1. describe.model in config
|
|
122
|
+
* 2. Environment variable DESCRIBE_MODEL
|
|
123
|
+
* 3. review.defaultModel in config (fallback)
|
|
124
|
+
* 4. Environment variable REVIEW_DEFAULT_MODEL (fallback)
|
|
125
|
+
*/
|
|
126
|
+
export declare function getDescriberModelOverride(config: DRSConfig): ModelOverrides;
|
|
42
127
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IAExB,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,SAAS;IAExB,QAAQ,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;KAC3C,CAAC;IAGF,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IAGF,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IAGF,MAAM,EAAE;QACN,MAAM,EAAE,CAAC,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,EAAE;YACR,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;SACnB,CAAC;QACF,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,EAAE,UAAU,CAAC;QAClB,OAAO,CAAC,EAAE;YACR,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,iBAAiB,CAAC,EAAE,cAAc,CAAC;SACpC,CAAC;QACF,QAAQ,CAAC,EAAE;YACT,OAAO,CAAC,EAAE,OAAO,CAAC;YAClB,eAAe,CAAC,EAAE,OAAO,CAAC;SAC3B,CAAC;KACH,CAAC;IAGF,QAAQ,CAAC,EAAE;QACT,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,qBAAqB,CAAC,EAAE,OAAO,CAAC;KACjC,CAAC;IAGF,kBAAkB,CAAC,EAAE;QACnB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,SAAS,GAAG,QAAQ,CAAC;AAC9D,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAiDpE;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAkF1F;AAqCD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAyBtF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAqB7E;AAUD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,WAAW,CAAC,EAAE,GAAG,WAAW,EAAE,CAOpF;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAOrE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,EAAE,CAK5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,EAAE,CAEzD;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,cAAc,CAsBnE;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,cAAc,CAWzE;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,cAAc,CAY3E"}
|
package/dist/lib/config.js
CHANGED
|
@@ -3,7 +3,7 @@ import { resolve } from 'path';
|
|
|
3
3
|
import * as yaml from 'yaml';
|
|
4
4
|
const DEFAULT_CONFIG = {
|
|
5
5
|
opencode: {
|
|
6
|
-
serverUrl: process.env.OPENCODE_SERVER ||
|
|
6
|
+
serverUrl: process.env.OPENCODE_SERVER || undefined,
|
|
7
7
|
},
|
|
8
8
|
gitlab: {
|
|
9
9
|
url: process.env.GITLAB_URL || 'https://gitlab.com',
|
|
@@ -13,24 +13,38 @@ const DEFAULT_CONFIG = {
|
|
|
13
13
|
token: process.env.GITHUB_TOKEN || '',
|
|
14
14
|
},
|
|
15
15
|
review: {
|
|
16
|
-
agents: ['security', 'quality', 'style', 'performance'],
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
agents: ['security', 'quality', 'style', 'performance', 'documentation'],
|
|
17
|
+
default: {
|
|
18
|
+
model: process.env.REVIEW_DEFAULT_MODEL || 'anthropic/claude-sonnet-4-5-20250929',
|
|
19
|
+
skills: [],
|
|
20
|
+
},
|
|
20
21
|
ignorePatterns: [
|
|
21
22
|
'*.test.ts',
|
|
22
23
|
'*.spec.ts',
|
|
23
24
|
'**/__tests__/**',
|
|
24
25
|
'**/__mocks__/**',
|
|
25
|
-
'*.md',
|
|
26
26
|
'package-lock.json',
|
|
27
27
|
'yarn.lock',
|
|
28
28
|
'pnpm-lock.yaml',
|
|
29
29
|
],
|
|
30
|
+
mode: 'multi-agent',
|
|
31
|
+
unified: {
|
|
32
|
+
severityThreshold: 'HIGH',
|
|
33
|
+
},
|
|
34
|
+
describe: {
|
|
35
|
+
enabled: false,
|
|
36
|
+
postDescription: false,
|
|
37
|
+
},
|
|
30
38
|
},
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
39
|
+
contextCompression: {
|
|
40
|
+
enabled: true,
|
|
41
|
+
maxTokens: 32000,
|
|
42
|
+
softBufferTokens: 1500,
|
|
43
|
+
hardBufferTokens: 1000,
|
|
44
|
+
tokenEstimateDivisor: 4,
|
|
45
|
+
},
|
|
46
|
+
describe: {
|
|
47
|
+
includeProjectContext: true,
|
|
34
48
|
},
|
|
35
49
|
};
|
|
36
50
|
/**
|
|
@@ -70,26 +84,78 @@ export function loadConfig(projectPath, overrides) {
|
|
|
70
84
|
config.github.token = process.env.GITHUB_TOKEN;
|
|
71
85
|
}
|
|
72
86
|
if (process.env.REVIEW_AGENTS) {
|
|
73
|
-
|
|
87
|
+
// Environment variable is always simple string format (comma-separated)
|
|
88
|
+
config.review.agents = process.env.REVIEW_AGENTS.split(',').map((a) => a.trim());
|
|
89
|
+
}
|
|
90
|
+
if (process.env.REVIEW_DEFAULT_MODEL) {
|
|
91
|
+
config.review.defaultModel = process.env.REVIEW_DEFAULT_MODEL;
|
|
92
|
+
config.review.default = mergeSection(config.review.default, {
|
|
93
|
+
model: process.env.REVIEW_DEFAULT_MODEL,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
if (process.env.REVIEW_MODE) {
|
|
97
|
+
config.review.mode = process.env.REVIEW_MODE;
|
|
98
|
+
}
|
|
99
|
+
if (process.env.REVIEW_UNIFIED_MODEL) {
|
|
100
|
+
config.review.unified = {
|
|
101
|
+
...config.review.unified,
|
|
102
|
+
model: process.env.REVIEW_UNIFIED_MODEL,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
if (process.env.REVIEW_UNIFIED_THRESHOLD) {
|
|
106
|
+
config.review.unified = {
|
|
107
|
+
...config.review.unified,
|
|
108
|
+
severityThreshold: process.env.REVIEW_UNIFIED_THRESHOLD,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// Validate required fields
|
|
112
|
+
if (!getDefaultModel(config)) {
|
|
113
|
+
throw new Error('Default model is required. Set review.default.model or defaultModel in .drs/drs.config.yaml or REVIEW_DEFAULT_MODEL environment variable.\n' +
|
|
114
|
+
'Run "drs init" to configure your project.');
|
|
74
115
|
}
|
|
75
116
|
// Apply CLI overrides
|
|
76
117
|
if (overrides) {
|
|
77
118
|
config = mergeConfig(config, overrides);
|
|
78
119
|
}
|
|
120
|
+
if (!config.review.mode) {
|
|
121
|
+
config.review.mode = 'multi-agent';
|
|
122
|
+
}
|
|
123
|
+
const validModes = ['multi-agent', 'unified', 'hybrid'];
|
|
124
|
+
if (!validModes.includes(config.review.mode)) {
|
|
125
|
+
throw new Error(`Invalid review mode "${config.review.mode}". Valid options: ${validModes.join(', ')}`);
|
|
126
|
+
}
|
|
79
127
|
return config;
|
|
80
128
|
}
|
|
81
129
|
/**
|
|
82
|
-
* Deep merge two config objects
|
|
130
|
+
* Deep merge two config objects, skipping undefined values
|
|
83
131
|
*/
|
|
84
132
|
function mergeConfig(base, override) {
|
|
85
133
|
return {
|
|
86
|
-
opencode:
|
|
87
|
-
gitlab:
|
|
88
|
-
github:
|
|
89
|
-
review:
|
|
90
|
-
|
|
134
|
+
opencode: mergeSection(base.opencode, override.opencode),
|
|
135
|
+
gitlab: mergeSection(base.gitlab, override.gitlab),
|
|
136
|
+
github: mergeSection(base.github, override.github),
|
|
137
|
+
review: mergeSection(base.review, override.review),
|
|
138
|
+
describe: mergeSection(base.describe, override.describe),
|
|
139
|
+
contextCompression: mergeSection(base.contextCompression, override.contextCompression),
|
|
91
140
|
};
|
|
92
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Merge a config section, skipping undefined values
|
|
144
|
+
*/
|
|
145
|
+
function mergeSection(base, override) {
|
|
146
|
+
const safeBase = (base ?? {});
|
|
147
|
+
if (!override)
|
|
148
|
+
return safeBase;
|
|
149
|
+
const result = { ...safeBase };
|
|
150
|
+
for (const key in override) {
|
|
151
|
+
const value = override[key];
|
|
152
|
+
if (value !== undefined) {
|
|
153
|
+
// TypeScript knows that value is T[Extract<keyof T, string>] which is assignable to T[keyof T]
|
|
154
|
+
result[key] = value;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
93
159
|
/**
|
|
94
160
|
* Validate that required configuration is present
|
|
95
161
|
*/
|
|
@@ -101,12 +167,13 @@ export function validateConfig(config, platform) {
|
|
|
101
167
|
if (platform === 'github' && !config.github.token) {
|
|
102
168
|
throw new Error('GitHub token is required. Set GITHUB_TOKEN environment variable or configure in config file');
|
|
103
169
|
}
|
|
104
|
-
// OPENCODE_SERVER is now optional - we'll start in-process if not provided
|
|
105
|
-
if (!config.opencode.serverUrl) {
|
|
106
|
-
console.log('ℹ️ OPENCODE_SERVER not set. Will start OpenCode server in-process.');
|
|
107
|
-
}
|
|
108
170
|
if (config.review.agents.length === 0) {
|
|
109
|
-
|
|
171
|
+
if (config.review.mode !== 'unified') {
|
|
172
|
+
throw new Error('At least one review agent must be configured');
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (!getDefaultModel(config)) {
|
|
176
|
+
throw new Error('Default model is required. Run "drs init" to configure or set REVIEW_DEFAULT_MODEL environment variable.');
|
|
110
177
|
}
|
|
111
178
|
}
|
|
112
179
|
/**
|
|
@@ -134,11 +201,97 @@ export function shouldIgnoreFile(filePath, config) {
|
|
|
134
201
|
}
|
|
135
202
|
// Simple minimatch implementation for pattern matching
|
|
136
203
|
function minimatch(path, pattern) {
|
|
137
|
-
const regexPattern = pattern
|
|
138
|
-
.replace(/\./g, '\\.')
|
|
139
|
-
.replace(/\*/g, '.*')
|
|
140
|
-
.replace(/\?/g, '.');
|
|
204
|
+
const regexPattern = pattern.replace(/\./g, '\\.').replace(/\*/g, '.*').replace(/\?/g, '.');
|
|
141
205
|
const regex = new RegExp(`^${regexPattern}$`);
|
|
142
206
|
return regex.test(path);
|
|
143
207
|
}
|
|
208
|
+
/**
|
|
209
|
+
* Normalize agent configuration from mixed format to AgentConfig array
|
|
210
|
+
*/
|
|
211
|
+
export function normalizeAgentConfig(agents) {
|
|
212
|
+
return agents.map((agent) => {
|
|
213
|
+
if (typeof agent === 'string') {
|
|
214
|
+
return { name: agent };
|
|
215
|
+
}
|
|
216
|
+
return agent;
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
export function getDefaultModel(config) {
|
|
220
|
+
return (config.review.default?.model ??
|
|
221
|
+
config.review.defaultModel ??
|
|
222
|
+
process.env.REVIEW_DEFAULT_MODEL ??
|
|
223
|
+
undefined);
|
|
224
|
+
}
|
|
225
|
+
export function getDefaultSkills(config) {
|
|
226
|
+
if (!Array.isArray(config.review.default?.skills)) {
|
|
227
|
+
return [];
|
|
228
|
+
}
|
|
229
|
+
return config.review.default.skills.map(String).filter((skill) => skill.length > 0);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Extract agent names from configuration
|
|
233
|
+
*/
|
|
234
|
+
export function getAgentNames(config) {
|
|
235
|
+
return normalizeAgentConfig(config.review.agents).map((agent) => agent.name);
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Build model overrides from config and environment variables
|
|
239
|
+
* Precedence:
|
|
240
|
+
* 1. Per-agent model in config
|
|
241
|
+
* 2. Environment variable REVIEW_AGENT_<NAME>_MODEL (e.g., REVIEW_AGENT_SECURITY_MODEL)
|
|
242
|
+
* 3. defaultModel in config
|
|
243
|
+
* 4. Environment variable REVIEW_DEFAULT_MODEL
|
|
244
|
+
*
|
|
245
|
+
*/
|
|
246
|
+
export function getModelOverrides(config) {
|
|
247
|
+
const overrides = {};
|
|
248
|
+
const normalizedAgents = normalizeAgentConfig(config.review.agents);
|
|
249
|
+
// Get default model from config or environment
|
|
250
|
+
const defaultModel = getDefaultModel(config);
|
|
251
|
+
for (const agent of normalizedAgents) {
|
|
252
|
+
// Check per-agent environment variable (e.g., REVIEW_AGENT_SECURITY_MODEL)
|
|
253
|
+
const envVarName = `REVIEW_AGENT_${agent.name.toUpperCase().replace(/[^A-Z0-9]/g, '_')}_MODEL`;
|
|
254
|
+
const envModel = process.env[envVarName];
|
|
255
|
+
// Precedence: agent.model > env var > defaultModel
|
|
256
|
+
const model = agent.model || envModel || defaultModel;
|
|
257
|
+
if (model) {
|
|
258
|
+
// Use review/<agent> format which matches how agents are invoked
|
|
259
|
+
overrides[`review/${agent.name}`] = model;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return overrides;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Get model override for the unified reviewer agent
|
|
266
|
+
* Precedence:
|
|
267
|
+
* 1. review.unified.model in config
|
|
268
|
+
* 2. Environment variable REVIEW_UNIFIED_MODEL
|
|
269
|
+
* 3. review.defaultModel in config (fallback)
|
|
270
|
+
* 4. Environment variable REVIEW_DEFAULT_MODEL (fallback)
|
|
271
|
+
*/
|
|
272
|
+
export function getUnifiedModelOverride(config) {
|
|
273
|
+
const overrides = {};
|
|
274
|
+
const unifiedModel = config.review.unified?.model ?? process.env.REVIEW_UNIFIED_MODEL ?? getDefaultModel(config);
|
|
275
|
+
if (unifiedModel) {
|
|
276
|
+
overrides['review/unified-reviewer'] = unifiedModel;
|
|
277
|
+
}
|
|
278
|
+
return overrides;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Get model override for the describer agent
|
|
282
|
+
* Precedence:
|
|
283
|
+
* 1. describe.model in config
|
|
284
|
+
* 2. Environment variable DESCRIBE_MODEL
|
|
285
|
+
* 3. review.defaultModel in config (fallback)
|
|
286
|
+
* 4. Environment variable REVIEW_DEFAULT_MODEL (fallback)
|
|
287
|
+
*/
|
|
288
|
+
export function getDescriberModelOverride(config) {
|
|
289
|
+
const overrides = {};
|
|
290
|
+
// Check for describer-specific model
|
|
291
|
+
const describerModel = config.describe?.model ?? process.env.DESCRIBE_MODEL ?? getDefaultModel(config);
|
|
292
|
+
if (describerModel) {
|
|
293
|
+
overrides['describe/pr-describer'] = describerModel;
|
|
294
|
+
}
|
|
295
|
+
return overrides;
|
|
296
|
+
}
|
|
144
297
|
//# sourceMappingURL=config.js.map
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/lib/config.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { loadConfig } from './config.js';
|
|
3
|
+
describe('Config', () => {
|
|
4
|
+
it('should not overwrite default agents when undefined is passed', () => {
|
|
5
|
+
const config = loadConfig(process.cwd(), {
|
|
6
|
+
review: {
|
|
7
|
+
agents: undefined,
|
|
8
|
+
},
|
|
9
|
+
});
|
|
10
|
+
// Should keep default agents, not overwrite with undefined
|
|
11
|
+
expect(config.review.agents).toBeDefined();
|
|
12
|
+
expect(Array.isArray(config.review.agents)).toBe(true);
|
|
13
|
+
expect(config.review.agents.length).toBeGreaterThan(0);
|
|
14
|
+
});
|
|
15
|
+
it('should override agents when explicitly provided', () => {
|
|
16
|
+
const config = loadConfig(process.cwd(), {
|
|
17
|
+
review: {
|
|
18
|
+
agents: ['security'],
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
expect(config.review.agents).toEqual(['security']);
|
|
22
|
+
});
|
|
23
|
+
it('should load agents from config file when no override provided', () => {
|
|
24
|
+
const config = loadConfig(process.cwd());
|
|
25
|
+
// Should load whatever is configured in the project's .drs/drs.config.yaml
|
|
26
|
+
expect(config.review.agents).toBeDefined();
|
|
27
|
+
expect(Array.isArray(config.review.agents)).toBe(true);
|
|
28
|
+
expect(config.review.agents.length).toBeGreaterThan(0);
|
|
29
|
+
// Verify each agent is a string (simple format) or object (detailed format)
|
|
30
|
+
config.review.agents.forEach((agent) => {
|
|
31
|
+
const isValid = typeof agent === 'string' || (typeof agent === 'object' && 'name' in agent);
|
|
32
|
+
expect(isValid).toBe(true);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=config.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/lib/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE;YACvC,MAAM,EAAE;gBACN,MAAM,EAAE,SAAS;aAClB;SACK,CAAC,CAAC;QAEV,2DAA2D;QAC3D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE;YACvC,MAAM,EAAE;gBACN,MAAM,EAAE,CAAC,UAAU,CAAC;aACd;SACT,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAEzC,2EAA2E;QAC3E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAEvD,4EAA4E;QAC5E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,CAAC,CAAC;YAC5F,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { FileWithDiff } from './review-core.js';
|
|
2
|
+
export interface ContextCompressionOptions {
|
|
3
|
+
enabled?: boolean;
|
|
4
|
+
maxTokens?: number;
|
|
5
|
+
softBufferTokens?: number;
|
|
6
|
+
hardBufferTokens?: number;
|
|
7
|
+
tokenEstimateDivisor?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface ContextCompressionResult {
|
|
10
|
+
files: FileWithDiff[];
|
|
11
|
+
omitted: {
|
|
12
|
+
deletionsOnly: string[];
|
|
13
|
+
dueToBudget: string[];
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export declare function stripDeletionOnlyHunks(patch: string): string;
|
|
17
|
+
export declare function compressFilesWithDiffs(files: FileWithDiff[], options?: ContextCompressionOptions): ContextCompressionResult;
|
|
18
|
+
export declare function formatCompressionSummary(result: ContextCompressionResult): string;
|
|
19
|
+
//# sourceMappingURL=context-compression.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-compression.d.ts","sourceRoot":"","sources":["../../src/lib/context-compression.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,WAAW,yBAAyB;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,OAAO,EAAE;QACP,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;CACH;AA6BD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgD5D;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,YAAY,EAAE,EACrB,OAAO,CAAC,EAAE,yBAAyB,GAClC,wBAAwB,CAsG1B;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,CAwBjF"}
|