@diff-review-system/drs 1.1.2 → 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 -139
- package/.opencode/agent/review/quality.md +36 -113
- package/.opencode/agent/review/security.md +32 -97
- package/.opencode/agent/review/style.md +4 -0
- package/.opencode/agent/review/unified-reviewer.md +74 -0
- package/.opencode/opencode.jsonc +4 -29
- package/.opencode/tool/write_json_output.ts +24 -0
- package/README.md +48 -21
- package/dist/ci/runner.d.ts.map +1 -1
- package/dist/ci/runner.js +2 -0
- 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 +220 -16
- 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 +273 -145
- 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 +44 -18
- package/dist/cli/review-local.js.map +1 -1
- package/dist/cli/review-mr.d.ts +6 -0
- package/dist/cli/review-mr.d.ts.map +1 -1
- package/dist/cli/review-mr.js +63 -7
- 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 +8 -1
- 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/platform-adapter.d.ts.map +1 -1
- package/dist/github/platform-adapter.js +4 -2
- package/dist/github/platform-adapter.js.map +1 -1
- package/dist/gitlab/client.d.ts.map +1 -1
- package/dist/gitlab/client.js +1 -1
- package/dist/gitlab/client.js.map +1 -1
- package/dist/gitlab/platform-adapter.d.ts.map +1 -1
- package/dist/gitlab/platform-adapter.js +6 -5
- package/dist/gitlab/platform-adapter.js.map +1 -1
- 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/comment-formatter.d.ts +3 -2
- package/dist/lib/comment-formatter.d.ts.map +1 -1
- package/dist/lib/comment-formatter.js +16 -2
- package/dist/lib/comment-formatter.js.map +1 -1
- 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.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.js +71 -41
- package/dist/lib/config-model-overrides.test.js.map +1 -1
- package/dist/lib/config.d.ts +63 -7
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +116 -22
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/config.test.js +10 -2
- package/dist/lib/config.test.js.map +1 -1
- 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.map +1 -1
- package/dist/lib/context-loader.js +8 -1
- package/dist/lib/context-loader.js.map +1 -1
- 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/lib/diff-parser.d.ts +11 -0
- package/dist/lib/diff-parser.d.ts.map +1 -1
- package/dist/lib/diff-parser.js +37 -0
- package/dist/lib/diff-parser.js.map +1 -1
- package/dist/lib/issue-parser.d.ts +1 -1
- package/dist/lib/issue-parser.d.ts.map +1 -1
- package/dist/lib/issue-parser.js +16 -14
- package/dist/lib/issue-parser.js.map +1 -1
- 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 +1 -1
- package/dist/lib/platform-client.d.ts.map +1 -1
- 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 +27 -10
- package/dist/lib/review-orchestrator.d.ts.map +1 -1
- package/dist/lib/review-orchestrator.js +51 -110
- package/dist/lib/review-orchestrator.js.map +1 -1
- 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 +21 -4
- package/dist/lib/unified-review-executor.d.ts.map +1 -1
- package/dist/lib/unified-review-executor.js +81 -151
- package/dist/lib/unified-review-executor.js.map +1 -1
- 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 +48 -34
- 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 +11 -3
- package/dist/opencode/client.d.ts.map +1 -1
- package/dist/opencode/client.js +237 -71
- 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 +7 -7
- package/.opencode/agent/github-reviewer.md +0 -77
- package/.opencode/agent/gitlab-reviewer.md +0 -77
- package/.opencode/agent/local-reviewer.md +0 -63
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe-output-path.test.d.ts","sourceRoot":"","sources":["../../src/lib/describe-output-path.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
2
|
+
import { mkdir, mkdtemp, readFile, rm, writeFile } from 'fs/promises';
|
|
3
|
+
import { dirname, join } from 'path';
|
|
4
|
+
import { tmpdir } from 'os';
|
|
5
|
+
import { writeJsonOutput } from './write-json-output.js';
|
|
6
|
+
import { parseDescribeOutput } from './describe-parser.js';
|
|
7
|
+
import { OUTPUT_PATHS } from './output-paths.js';
|
|
8
|
+
describe('describe output path integration', () => {
|
|
9
|
+
let workingDir;
|
|
10
|
+
beforeEach(async () => {
|
|
11
|
+
workingDir = await mkdtemp(join(tmpdir(), 'drs-describe-'));
|
|
12
|
+
});
|
|
13
|
+
afterEach(async () => {
|
|
14
|
+
await rm(workingDir, { recursive: true, force: true });
|
|
15
|
+
});
|
|
16
|
+
it('writes describe output to deterministic path and reads it', async () => {
|
|
17
|
+
const payload = {
|
|
18
|
+
type: 'feature',
|
|
19
|
+
title: 'Add deterministic output path usage',
|
|
20
|
+
summary: ['Ensures describe output writes to known location'],
|
|
21
|
+
};
|
|
22
|
+
const pointer = await writeJsonOutput({
|
|
23
|
+
outputType: 'describe_output',
|
|
24
|
+
payload,
|
|
25
|
+
pretty: false,
|
|
26
|
+
workingDir,
|
|
27
|
+
});
|
|
28
|
+
const expectedPath = join(workingDir, OUTPUT_PATHS.describe_output);
|
|
29
|
+
const fileContents = JSON.parse(await readFile(expectedPath, 'utf-8'));
|
|
30
|
+
expect(fileContents).toEqual(payload);
|
|
31
|
+
expect(pointer).toEqual({
|
|
32
|
+
outputType: 'describe_output',
|
|
33
|
+
outputPath: OUTPUT_PATHS.describe_output,
|
|
34
|
+
});
|
|
35
|
+
const parsed = await parseDescribeOutput(workingDir, false, JSON.stringify(pointer));
|
|
36
|
+
expect(parsed).toEqual(payload);
|
|
37
|
+
});
|
|
38
|
+
it('reads describe output from default path without pointer', async () => {
|
|
39
|
+
const payload = {
|
|
40
|
+
type: 'bugfix',
|
|
41
|
+
title: 'Read describe output from default path',
|
|
42
|
+
summary: ['Loads describe output without pointer metadata'],
|
|
43
|
+
};
|
|
44
|
+
const expectedPath = join(workingDir, OUTPUT_PATHS.describe_output);
|
|
45
|
+
await mkdir(dirname(expectedPath), { recursive: true });
|
|
46
|
+
await writeFile(expectedPath, JSON.stringify(payload), 'utf-8');
|
|
47
|
+
const parsed = await parseDescribeOutput(workingDir);
|
|
48
|
+
expect(parsed).toEqual(payload);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=describe-output-path.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe-output-path.test.js","sourceRoot":"","sources":["../../src/lib/describe-output-path.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,IAAI,UAAkB,CAAC;IAEvB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,qCAAqC;YAC5C,OAAO,EAAE,CAAC,kDAAkD,CAAC;SAC9D,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;YACpC,UAAU,EAAE,iBAAiB;YAC7B,OAAO;YACP,MAAM,EAAE,KAAK;YACb,UAAU;SACX,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC;QACpE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEtC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YACtB,UAAU,EAAE,iBAAiB;YAC7B,UAAU,EAAE,YAAY,CAAC,eAAe;SACzC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACrF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,wCAAwC;YAC/C,OAAO,EAAE,CAAC,gDAAgD,CAAC;SAC5D,CAAC;QAEF,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC;QACpE,MAAM,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QAEhE,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe-parser.d.ts","sourceRoot":"","sources":["../../src/lib/describe-parser.ts"],"names":[],"mappings":"AA4IA,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAiC7D;AAED,wBAAsB,mBAAmB,CACvC,UAAU,GAAE,MAAsB,EAClC,KAAK,UAAQ,EACb,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CA0BlB"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { readFile } from 'fs/promises';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
import { OUTPUT_PATHS } from './output-paths.js';
|
|
4
|
+
const JSON_FENCE_REGEX = /```json\s*([\s\S]*?)\s*```/i;
|
|
5
|
+
function isOutputPointer(value) {
|
|
6
|
+
return !!value && typeof value === 'object' && ('outputType' in value || 'outputPath' in value);
|
|
7
|
+
}
|
|
8
|
+
const DESCRIBE_OUTPUT_PATH = OUTPUT_PATHS.describe_output;
|
|
9
|
+
function resolveWithinWorkingDir(workingDir, targetPath) {
|
|
10
|
+
const root = resolve(workingDir);
|
|
11
|
+
const fullPath = resolve(workingDir, targetPath);
|
|
12
|
+
const rootWithSlash = root.endsWith('/') ? root : `${root}/`;
|
|
13
|
+
if (fullPath !== root && !fullPath.startsWith(rootWithSlash)) {
|
|
14
|
+
throw new Error(`Refusing to read outside working directory: ${targetPath}`);
|
|
15
|
+
}
|
|
16
|
+
return fullPath;
|
|
17
|
+
}
|
|
18
|
+
async function readJsonIfExists(workingDir, targetPath) {
|
|
19
|
+
const resolvedPath = resolveWithinWorkingDir(workingDir, targetPath);
|
|
20
|
+
try {
|
|
21
|
+
const fileContents = await readFile(resolvedPath, 'utf-8');
|
|
22
|
+
return JSON.parse(fileContents);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function resolveDescribeOutputPath(pointer) {
|
|
32
|
+
if (!pointer) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
if (pointer.outputType && pointer.outputType !== 'describe_output') {
|
|
36
|
+
throw new Error(`Unexpected output type for describe output: ${pointer.outputType}`);
|
|
37
|
+
}
|
|
38
|
+
if (pointer.outputPath) {
|
|
39
|
+
return pointer.outputPath;
|
|
40
|
+
}
|
|
41
|
+
if (pointer.outputType) {
|
|
42
|
+
return OUTPUT_PATHS[pointer.outputType];
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
function parseDescribeOutputPointer(raw, debug) {
|
|
47
|
+
try {
|
|
48
|
+
const parsed = parseJsonFromAgentOutput(raw);
|
|
49
|
+
if (isOutputPointer(parsed)) {
|
|
50
|
+
return parsed;
|
|
51
|
+
}
|
|
52
|
+
if (debug) {
|
|
53
|
+
console.log('Describe output pointer not found in agent output.');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (debug) {
|
|
58
|
+
console.log(`Describe output pointer parse failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
function findJsonCandidates(text) {
|
|
64
|
+
const candidates = [];
|
|
65
|
+
for (let start = 0; start < text.length; start += 1) {
|
|
66
|
+
if (text[start] !== '{') {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
let depth = 0;
|
|
70
|
+
let inString = false;
|
|
71
|
+
let escapeNext = false;
|
|
72
|
+
for (let index = start; index < text.length; index += 1) {
|
|
73
|
+
const char = text[index];
|
|
74
|
+
if (inString) {
|
|
75
|
+
if (escapeNext) {
|
|
76
|
+
escapeNext = false;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (char === '\\') {
|
|
80
|
+
escapeNext = true;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (char === '"') {
|
|
84
|
+
inString = false;
|
|
85
|
+
}
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (char === '"') {
|
|
89
|
+
inString = true;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (char === '{') {
|
|
93
|
+
depth += 1;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (char === '}') {
|
|
97
|
+
depth -= 1;
|
|
98
|
+
if (depth === 0) {
|
|
99
|
+
candidates.push(text.slice(start, index + 1));
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return candidates;
|
|
106
|
+
}
|
|
107
|
+
export function parseJsonFromAgentOutput(raw) {
|
|
108
|
+
const errors = [];
|
|
109
|
+
const fencedMatch = raw.match(JSON_FENCE_REGEX);
|
|
110
|
+
if (fencedMatch?.[1]) {
|
|
111
|
+
try {
|
|
112
|
+
return JSON.parse(fencedMatch[1]);
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
errors.push(error);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const candidates = findJsonCandidates(raw);
|
|
119
|
+
for (let index = candidates.length - 1; index >= 0; index -= 1) {
|
|
120
|
+
try {
|
|
121
|
+
return JSON.parse(candidates[index]);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
errors.push(error);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
return JSON.parse(raw);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
errors.push(error);
|
|
132
|
+
}
|
|
133
|
+
const lastError = errors[errors.length - 1];
|
|
134
|
+
if (lastError instanceof Error) {
|
|
135
|
+
throw lastError;
|
|
136
|
+
}
|
|
137
|
+
throw new Error('Failed to parse JSON output');
|
|
138
|
+
}
|
|
139
|
+
export async function parseDescribeOutput(workingDir = process.cwd(), debug = false, rawOutput) {
|
|
140
|
+
const pointer = rawOutput ? parseDescribeOutputPointer(rawOutput, debug) : null;
|
|
141
|
+
const pointerPath = resolveDescribeOutputPath(pointer);
|
|
142
|
+
if (pointerPath) {
|
|
143
|
+
const pointerOutput = await readJsonIfExists(workingDir, pointerPath);
|
|
144
|
+
if (pointerOutput) {
|
|
145
|
+
if (debug) {
|
|
146
|
+
console.log(`Describe output loaded from ${pointerPath}`);
|
|
147
|
+
}
|
|
148
|
+
return pointerOutput;
|
|
149
|
+
}
|
|
150
|
+
if (debug) {
|
|
151
|
+
console.log(`Describe output not found at ${pointerPath}, falling back to default path.`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const defaultOutput = await readJsonIfExists(workingDir, DESCRIBE_OUTPUT_PATH);
|
|
155
|
+
if (defaultOutput) {
|
|
156
|
+
if (debug) {
|
|
157
|
+
console.log(`Describe output loaded from ${DESCRIBE_OUTPUT_PATH}`);
|
|
158
|
+
}
|
|
159
|
+
return defaultOutput;
|
|
160
|
+
}
|
|
161
|
+
throw new Error(`Describe output file not found at ${DESCRIBE_OUTPUT_PATH}`);
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=describe-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe-parser.js","sourceRoot":"","sources":["../../src/lib/describe-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe-parser.test.d.ts","sourceRoot":"","sources":["../../src/lib/describe-parser.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
+
import { parseJsonFromAgentOutput, parseDescribeOutput } from './describe-parser.js';
|
|
3
|
+
import { mkdir, writeFile, rm } from 'fs/promises';
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
import { tmpdir } from 'os';
|
|
6
|
+
describe('describe-parser', () => {
|
|
7
|
+
describe('parseJsonFromAgentOutput', () => {
|
|
8
|
+
it('should parse JSON from code fence', () => {
|
|
9
|
+
const raw = '```json\n{"type": "feature", "title": "Test"}\n```';
|
|
10
|
+
const result = parseJsonFromAgentOutput(raw);
|
|
11
|
+
expect(result).toEqual({ type: 'feature', title: 'Test' });
|
|
12
|
+
});
|
|
13
|
+
it('should parse JSON from code fence with extra whitespace', () => {
|
|
14
|
+
const raw = '```json\n\n {"type": "feature", "title": "Test"} \n\n```';
|
|
15
|
+
const result = parseJsonFromAgentOutput(raw);
|
|
16
|
+
expect(result).toEqual({ type: 'feature', title: 'Test' });
|
|
17
|
+
});
|
|
18
|
+
it('should parse JSON from code fence with case-insensitive marker', () => {
|
|
19
|
+
const raw = '```JSON\n{"type": "feature", "title": "Test"}\n```';
|
|
20
|
+
const result = parseJsonFromAgentOutput(raw);
|
|
21
|
+
expect(result).toEqual({ type: 'feature', title: 'Test' });
|
|
22
|
+
});
|
|
23
|
+
it('should parse embedded JSON from mixed text', () => {
|
|
24
|
+
const raw = 'Here is the output: {"outputType":"describe_output","outputPath":".drs/describe-output.json"} Done!';
|
|
25
|
+
const result = parseJsonFromAgentOutput(raw);
|
|
26
|
+
expect(result).toEqual({
|
|
27
|
+
outputType: 'describe_output',
|
|
28
|
+
outputPath: '.drs/describe-output.json',
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
it('should parse pure JSON string', () => {
|
|
32
|
+
const raw = '{"type": "feature", "title": "Test"}';
|
|
33
|
+
const result = parseJsonFromAgentOutput(raw);
|
|
34
|
+
expect(result).toEqual({ type: 'feature', title: 'Test' });
|
|
35
|
+
});
|
|
36
|
+
it('should handle nested JSON objects', () => {
|
|
37
|
+
const raw = `{"type": "feature", "title": "Test"}`;
|
|
38
|
+
const result = parseJsonFromAgentOutput(raw);
|
|
39
|
+
expect(result).toEqual({
|
|
40
|
+
type: 'feature',
|
|
41
|
+
title: 'Test',
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
it('should handle JSON with arrays', () => {
|
|
45
|
+
const raw = '{"items": [1, 2, 3]}';
|
|
46
|
+
const result = parseJsonFromAgentOutput(raw);
|
|
47
|
+
expect(result).toEqual({
|
|
48
|
+
items: [1, 2, 3],
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
it('should handle JSON with escaped quotes', () => {
|
|
52
|
+
const raw = '{"message": "This is a \\"quoted\\" string"}';
|
|
53
|
+
const result = parseJsonFromAgentOutput(raw);
|
|
54
|
+
expect(result).toEqual({
|
|
55
|
+
message: 'This is a "quoted" string',
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
it('should prefer last JSON candidate when multiple exist', () => {
|
|
59
|
+
const raw = 'First: {"id": 1} Second: {"id": 2}';
|
|
60
|
+
const result = parseJsonFromAgentOutput(raw);
|
|
61
|
+
// Should return the last valid JSON found
|
|
62
|
+
expect(result).toEqual({ id: 2 });
|
|
63
|
+
});
|
|
64
|
+
it('should prefer code fence over embedded JSON', () => {
|
|
65
|
+
const raw = `
|
|
66
|
+
{"id": 1}
|
|
67
|
+
\`\`\`json
|
|
68
|
+
{"id": 2}
|
|
69
|
+
\`\`\`
|
|
70
|
+
`;
|
|
71
|
+
const result = parseJsonFromAgentOutput(raw);
|
|
72
|
+
expect(result).toEqual({ id: 2 });
|
|
73
|
+
});
|
|
74
|
+
it('should throw error for invalid JSON', () => {
|
|
75
|
+
const raw = 'This is not JSON at all';
|
|
76
|
+
expect(() => parseJsonFromAgentOutput(raw)).toThrow();
|
|
77
|
+
});
|
|
78
|
+
it('should throw error for incomplete JSON', () => {
|
|
79
|
+
const raw = '{"type": "feature", "title":';
|
|
80
|
+
expect(() => parseJsonFromAgentOutput(raw)).toThrow();
|
|
81
|
+
});
|
|
82
|
+
it('should handle empty string', () => {
|
|
83
|
+
const raw = '';
|
|
84
|
+
expect(() => parseJsonFromAgentOutput(raw)).toThrow();
|
|
85
|
+
});
|
|
86
|
+
it('should handle JSON with null values', () => {
|
|
87
|
+
const raw = '{"value": null, "name": "test"}';
|
|
88
|
+
const result = parseJsonFromAgentOutput(raw);
|
|
89
|
+
expect(result).toEqual({ value: null, name: 'test' });
|
|
90
|
+
});
|
|
91
|
+
it('should handle JSON with boolean values', () => {
|
|
92
|
+
const raw = '{"enabled": true, "disabled": false}';
|
|
93
|
+
const result = parseJsonFromAgentOutput(raw);
|
|
94
|
+
expect(result).toEqual({ enabled: true, disabled: false });
|
|
95
|
+
});
|
|
96
|
+
it('should handle JSON with numbers', () => {
|
|
97
|
+
const raw = '{"integer": 42, "float": 3.14, "negative": -10}';
|
|
98
|
+
const result = parseJsonFromAgentOutput(raw);
|
|
99
|
+
expect(result).toEqual({ integer: 42, float: 3.14, negative: -10 });
|
|
100
|
+
});
|
|
101
|
+
it('should handle markdown text with embedded JSON', () => {
|
|
102
|
+
const raw = `
|
|
103
|
+
# Title
|
|
104
|
+
|
|
105
|
+
Here is some explanation text.
|
|
106
|
+
|
|
107
|
+
{"outputType":"describe_output","outputPath":".drs/output.json"}
|
|
108
|
+
|
|
109
|
+
More text after.
|
|
110
|
+
`;
|
|
111
|
+
const result = parseJsonFromAgentOutput(raw);
|
|
112
|
+
expect(result).toEqual({
|
|
113
|
+
outputType: 'describe_output',
|
|
114
|
+
outputPath: '.drs/output.json',
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
it('should handle JSON with escaped characters', () => {
|
|
118
|
+
const raw = '{"pattern": "function() with \\"quotes\\""}';
|
|
119
|
+
const result = parseJsonFromAgentOutput(raw);
|
|
120
|
+
expect(result).toEqual({
|
|
121
|
+
pattern: 'function() with "quotes"',
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
describe('parseDescribeOutput', () => {
|
|
126
|
+
let testDir;
|
|
127
|
+
beforeEach(async () => {
|
|
128
|
+
// Create a unique temporary directory for each test
|
|
129
|
+
testDir = join(tmpdir(), `drs-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
130
|
+
await mkdir(testDir, { recursive: true });
|
|
131
|
+
await mkdir(join(testDir, '.drs'), { recursive: true });
|
|
132
|
+
});
|
|
133
|
+
afterEach(async () => {
|
|
134
|
+
// Clean up test directory
|
|
135
|
+
try {
|
|
136
|
+
await rm(testDir, { recursive: true, force: true });
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Ignore cleanup errors
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
it('should read describe output from default path', async () => {
|
|
143
|
+
const describeData = {
|
|
144
|
+
type: 'feature',
|
|
145
|
+
title: 'Add new feature',
|
|
146
|
+
summary: ['Added authentication', 'Updated database schema'],
|
|
147
|
+
};
|
|
148
|
+
await writeFile(join(testDir, '.drs/describe-output.json'), JSON.stringify(describeData));
|
|
149
|
+
const result = await parseDescribeOutput(testDir, false);
|
|
150
|
+
expect(result).toEqual(describeData);
|
|
151
|
+
});
|
|
152
|
+
it('should read describe output from pointer path', async () => {
|
|
153
|
+
const describeData = {
|
|
154
|
+
type: 'bugfix',
|
|
155
|
+
title: 'Fix authentication bug',
|
|
156
|
+
summary: ['Fixed login issue'],
|
|
157
|
+
};
|
|
158
|
+
await writeFile(join(testDir, '.drs/custom-output.json'), JSON.stringify(describeData));
|
|
159
|
+
const rawOutput = JSON.stringify({
|
|
160
|
+
outputType: 'describe_output',
|
|
161
|
+
outputPath: '.drs/custom-output.json',
|
|
162
|
+
});
|
|
163
|
+
const result = await parseDescribeOutput(testDir, false, rawOutput);
|
|
164
|
+
expect(result).toEqual(describeData);
|
|
165
|
+
});
|
|
166
|
+
it('should fall back to default path if pointer path not found', async () => {
|
|
167
|
+
const describeData = {
|
|
168
|
+
type: 'refactor',
|
|
169
|
+
title: 'Refactor code',
|
|
170
|
+
summary: ['Improved code quality'],
|
|
171
|
+
};
|
|
172
|
+
await writeFile(join(testDir, '.drs/describe-output.json'), JSON.stringify(describeData));
|
|
173
|
+
const rawOutput = JSON.stringify({
|
|
174
|
+
outputType: 'describe_output',
|
|
175
|
+
outputPath: '.drs/nonexistent.json',
|
|
176
|
+
});
|
|
177
|
+
const result = await parseDescribeOutput(testDir, false, rawOutput);
|
|
178
|
+
expect(result).toEqual(describeData);
|
|
179
|
+
});
|
|
180
|
+
it('should throw error if no describe output found', async () => {
|
|
181
|
+
await expect(parseDescribeOutput(testDir, false)).rejects.toThrow('Describe output file not found');
|
|
182
|
+
});
|
|
183
|
+
it('should throw error for invalid output type in pointer', async () => {
|
|
184
|
+
const rawOutput = JSON.stringify({
|
|
185
|
+
outputType: 'invalid_type',
|
|
186
|
+
outputPath: '.drs/output.json',
|
|
187
|
+
});
|
|
188
|
+
await expect(parseDescribeOutput(testDir, false, rawOutput)).rejects.toThrow('Unexpected output type for describe output: invalid_type');
|
|
189
|
+
});
|
|
190
|
+
it('should handle pointer with only outputType field', async () => {
|
|
191
|
+
const describeData = {
|
|
192
|
+
type: 'docs',
|
|
193
|
+
title: 'Update documentation',
|
|
194
|
+
};
|
|
195
|
+
await writeFile(join(testDir, '.drs/describe-output.json'), JSON.stringify(describeData));
|
|
196
|
+
const rawOutput = JSON.stringify({
|
|
197
|
+
outputType: 'describe_output',
|
|
198
|
+
});
|
|
199
|
+
const result = await parseDescribeOutput(testDir, false, rawOutput);
|
|
200
|
+
expect(result).toEqual(describeData);
|
|
201
|
+
});
|
|
202
|
+
it('should log debug messages when debug=true', async () => {
|
|
203
|
+
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
204
|
+
const describeData = { type: 'test' };
|
|
205
|
+
await writeFile(join(testDir, '.drs/describe-output.json'), JSON.stringify(describeData));
|
|
206
|
+
await parseDescribeOutput(testDir, true);
|
|
207
|
+
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('Describe output loaded from'));
|
|
208
|
+
logSpy.mockRestore();
|
|
209
|
+
});
|
|
210
|
+
it('should not log debug messages when debug=false', async () => {
|
|
211
|
+
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
212
|
+
const describeData = { type: 'test' };
|
|
213
|
+
await writeFile(join(testDir, '.drs/describe-output.json'), JSON.stringify(describeData));
|
|
214
|
+
await parseDescribeOutput(testDir, false);
|
|
215
|
+
expect(logSpy).not.toHaveBeenCalled();
|
|
216
|
+
logSpy.mockRestore();
|
|
217
|
+
});
|
|
218
|
+
it('should refuse to read outside working directory', async () => {
|
|
219
|
+
const rawOutput = JSON.stringify({
|
|
220
|
+
outputType: 'describe_output',
|
|
221
|
+
outputPath: '../../../etc/passwd',
|
|
222
|
+
});
|
|
223
|
+
await expect(parseDescribeOutput(testDir, false, rawOutput)).rejects.toThrow('Refusing to read outside working directory');
|
|
224
|
+
});
|
|
225
|
+
it('should handle absolute paths within working directory', async () => {
|
|
226
|
+
const describeData = { type: 'feature' };
|
|
227
|
+
const outputPath = join(testDir, '.drs/describe-output.json');
|
|
228
|
+
await writeFile(outputPath, JSON.stringify(describeData));
|
|
229
|
+
const rawOutput = JSON.stringify({
|
|
230
|
+
outputType: 'describe_output',
|
|
231
|
+
outputPath: outputPath,
|
|
232
|
+
});
|
|
233
|
+
const result = await parseDescribeOutput(testDir, false, rawOutput);
|
|
234
|
+
expect(result).toEqual(describeData);
|
|
235
|
+
});
|
|
236
|
+
it('should handle invalid JSON in describe output file', async () => {
|
|
237
|
+
await writeFile(join(testDir, '.drs/describe-output.json'), 'not valid json');
|
|
238
|
+
await expect(parseDescribeOutput(testDir, false)).rejects.toThrow();
|
|
239
|
+
});
|
|
240
|
+
it('should use process.cwd() as default working directory', async () => {
|
|
241
|
+
// This test verifies the default parameter works
|
|
242
|
+
// We can't easily test the actual cwd behavior in isolation
|
|
243
|
+
const rawOutput = 'invalid pointer';
|
|
244
|
+
// Should attempt to use cwd and likely fail (unless file exists there)
|
|
245
|
+
await expect(parseDescribeOutput(undefined, false, rawOutput)).rejects.toThrow();
|
|
246
|
+
});
|
|
247
|
+
it('should handle pointer with invalid JSON format', async () => {
|
|
248
|
+
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
249
|
+
const describeData = { type: 'test' };
|
|
250
|
+
await writeFile(join(testDir, '.drs/describe-output.json'), JSON.stringify(describeData));
|
|
251
|
+
const rawOutput = 'not valid json at all';
|
|
252
|
+
// Should fall back to default path since pointer parsing fails
|
|
253
|
+
const result = await parseDescribeOutput(testDir, true, rawOutput);
|
|
254
|
+
expect(result).toEqual(describeData);
|
|
255
|
+
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('Describe output pointer parse failed'));
|
|
256
|
+
logSpy.mockRestore();
|
|
257
|
+
});
|
|
258
|
+
it('should handle complex describe output structure', async () => {
|
|
259
|
+
const describeData = {
|
|
260
|
+
type: 'feature',
|
|
261
|
+
title: 'Complex feature',
|
|
262
|
+
summary: ['Point 1', 'Point 2', 'Point 3'],
|
|
263
|
+
walkthrough: [
|
|
264
|
+
{
|
|
265
|
+
file: 'src/app.ts',
|
|
266
|
+
changeType: 'modified',
|
|
267
|
+
semanticLabel: 'feature',
|
|
268
|
+
title: 'Added new function',
|
|
269
|
+
changes: ['Added authentication', 'Updated routes'],
|
|
270
|
+
significance: 'major',
|
|
271
|
+
},
|
|
272
|
+
],
|
|
273
|
+
labels: ['enhancement', 'security'],
|
|
274
|
+
recommendations: ['Add tests', 'Update docs'],
|
|
275
|
+
};
|
|
276
|
+
await writeFile(join(testDir, '.drs/describe-output.json'), JSON.stringify(describeData));
|
|
277
|
+
const result = await parseDescribeOutput(testDir, false);
|
|
278
|
+
expect(result).toEqual(describeData);
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
//# sourceMappingURL=describe-parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe-parser.test.js","sourceRoot":"","sources":["../../src/lib/describe-parser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR/MR description generation executor
|
|
3
|
+
*
|
|
4
|
+
* This module handles generating descriptions for pull requests and merge requests
|
|
5
|
+
* using the describe agent.
|
|
6
|
+
*/
|
|
7
|
+
import type { DRSConfig } from './config.js';
|
|
8
|
+
import type { FileWithDiff } from './review-core.js';
|
|
9
|
+
import type { PlatformClient, PullRequest } from './platform-client.js';
|
|
10
|
+
import { type Description, type Platform } from './description-formatter.js';
|
|
11
|
+
import type { OpencodeClient } from '../opencode/client.js';
|
|
12
|
+
/**
|
|
13
|
+
* Detect platform type from PR/MR platform data
|
|
14
|
+
*/
|
|
15
|
+
export declare function detectPlatform(pr: PullRequest): Platform;
|
|
16
|
+
/**
|
|
17
|
+
* Generate and optionally post a PR/MR description
|
|
18
|
+
*
|
|
19
|
+
* @returns The generated description, or null if description generation is disabled
|
|
20
|
+
*/
|
|
21
|
+
export declare function runDescribeIfEnabled(opencode: OpencodeClient, config: DRSConfig, platformClient: PlatformClient, projectId: string, pr: PullRequest, files: FileWithDiff[], shouldPostDescription: boolean, workingDir: string, debug?: boolean): Promise<Description | null>;
|
|
22
|
+
//# sourceMappingURL=description-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"description-executor.d.ts","sourceRoot":"","sources":["../../src/lib/description-executor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,QAAQ,EACd,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,WAAW,GAAG,QAAQ,CAMxD;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,SAAS,EACjB,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,WAAW,EACf,KAAK,EAAE,YAAY,EAAE,EACrB,qBAAqB,EAAE,OAAO,EAC9B,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,OAAO,GACd,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAyD7B"}
|