@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,33 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { compressFilesWithDiffs, formatCompressionSummary, stripDeletionOnlyHunks, } from './context-compression.js';
|
|
3
|
+
describe('context compression', () => {
|
|
4
|
+
it('removes deletion-only hunks', () => {
|
|
5
|
+
const patch = ['@@ -1,3 +1,0 @@', '-const remove = true;', '-const gone = false;'].join('\n');
|
|
6
|
+
expect(stripDeletionOnlyHunks(patch)).toBe('');
|
|
7
|
+
});
|
|
8
|
+
it('keeps hunks with additions', () => {
|
|
9
|
+
const patch = [
|
|
10
|
+
'@@ -1,3 +1,4 @@',
|
|
11
|
+
' const keep = true;',
|
|
12
|
+
'+const added = true;',
|
|
13
|
+
'-const removed = false;',
|
|
14
|
+
].join('\n');
|
|
15
|
+
expect(stripDeletionOnlyHunks(patch)).toContain('+const added = true;');
|
|
16
|
+
});
|
|
17
|
+
it('omits patches that exceed token budget', () => {
|
|
18
|
+
const files = [
|
|
19
|
+
{ filename: 'src/large.ts', patch: '@@ -1,1 +1,3 @@\n+foo\n+bar\n+baz' },
|
|
20
|
+
{ filename: 'src/small.ts', patch: '@@ -1,1 +1,2 @@\n+ok' },
|
|
21
|
+
];
|
|
22
|
+
const result = compressFilesWithDiffs(files, {
|
|
23
|
+
maxTokens: 10,
|
|
24
|
+
softBufferTokens: 2,
|
|
25
|
+
hardBufferTokens: 1,
|
|
26
|
+
tokenEstimateDivisor: 1,
|
|
27
|
+
});
|
|
28
|
+
const summary = formatCompressionSummary(result);
|
|
29
|
+
expect(summary).toContain('Omitted due to token budget');
|
|
30
|
+
expect(result.files.find((file) => file.filename === 'src/large.ts')?.patch).toBeUndefined();
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=context-compression.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-compression.test.js","sourceRoot":"","sources":["../../src/lib/context-compression.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAElC,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,KAAK,GAAG,CAAC,iBAAiB,EAAE,uBAAuB,EAAE,sBAAsB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9F,MAAM,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,KAAK,GAAG;YACZ,iBAAiB;YACjB,qBAAqB;YACrB,sBAAsB;YACtB,yBAAyB;SAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,KAAK,GAAG;YACZ,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,mCAAmC,EAAE;YACxE,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,sBAAsB,EAAE;SAC5D,CAAC;QAEF,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,EAAE;YAC3C,SAAS,EAAE,EAAE;YACb,gBAAgB,EAAE,CAAC;YACnB,gBAAgB,EAAE,CAAC;YACnB,oBAAoB,EAAE,CAAC;SACxB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,cAAc,CAAC,EAAE,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;IAC/F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-loader.d.ts","sourceRoot":"","sources":["../../src/lib/context-loader.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IAE/B;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAQpF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,WAAW,GAAE,MAAsB,GAClC,YAAY,CAyBd;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EAAE,EACtB,WAAW,GAAE,MAAsB,GAClC,MAAM,
|
|
1
|
+
{"version":3,"file":"context-loader.d.ts","sourceRoot":"","sources":["../../src/lib/context-loader.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IAE/B;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAQpF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,WAAW,GAAE,MAAsB,GAClC,YAAY,CAyBd;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EAAE,EACtB,WAAW,GAAE,MAAsB,GAClC,MAAM,CAwCR"}
|
|
@@ -54,7 +54,14 @@ export function buildReviewPrompt(agentName, basePrompt, reviewLabel, changedFil
|
|
|
54
54
|
// Otherwise, build prompt with contexts + base prompt
|
|
55
55
|
// 1. Global project context (if available)
|
|
56
56
|
if (globalContext) {
|
|
57
|
-
|
|
57
|
+
const trimmedContext = globalContext.trim();
|
|
58
|
+
const firstLine = trimmedContext.split('\n').find((line) => line.trim().length > 0) || '';
|
|
59
|
+
if (/^#\s*project context/i.test(firstLine)) {
|
|
60
|
+
prompt += `${trimmedContext}\n\n`;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
prompt += `# Project Context\n\n${trimmedContext}\n\n`;
|
|
64
|
+
}
|
|
58
65
|
}
|
|
59
66
|
// 2. Agent-specific context (if available)
|
|
60
67
|
if (agentContext.agentContext) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-loader.js","sourceRoot":"","sources":["../../src/lib/context-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAqB5B;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IACnE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAE5D,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,OAAO,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,cAAsB,OAAO,CAAC,GAAG,EAAE;IAEnC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAEhE,gCAAgC;IAChC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAChD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,eAAe,EAAE,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC;SACrD,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACjD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,YAAY,EAAE,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC;SACjD,CAAC;IACJ,CAAC;IAED,gCAAgC;IAChC,OAAO;QACL,MAAM,EAAE,SAAS;KAClB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAiB,EACjB,UAAkB,EAClB,WAAmB,EACnB,YAAsB,EACtB,cAAsB,OAAO,CAAC,GAAG,EAAE;IAEnC,MAAM,aAAa,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAE9D,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,gEAAgE;IAChE,IAAI,YAAY,CAAC,MAAM,KAAK,UAAU,IAAI,YAAY,CAAC,eAAe,EAAE,CAAC;QACvE,MAAM,GAAG,YAAY,CAAC,eAAe,CAAC;QAEtC,mBAAmB;QACnB,MAAM,IAAI,uCAAuC,WAAW,OAAO,CAAC;QACpE,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEvD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,sDAAsD;IAEtD,2CAA2C;IAC3C,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,IAAI,wBAAwB,
|
|
1
|
+
{"version":3,"file":"context-loader.js","sourceRoot":"","sources":["../../src/lib/context-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-loader.test.d.ts","sourceRoot":"","sources":["../../src/lib/context-loader.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { loadGlobalContext, loadAgentContext, buildReviewPrompt } from './context-loader.js';
|
|
3
|
+
import { existsSync, readFileSync } from 'fs';
|
|
4
|
+
// Mock fs module
|
|
5
|
+
vi.mock('fs', () => ({
|
|
6
|
+
existsSync: vi.fn(),
|
|
7
|
+
readFileSync: vi.fn(),
|
|
8
|
+
}));
|
|
9
|
+
describe('context-loader', () => {
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
vi.clearAllMocks();
|
|
12
|
+
});
|
|
13
|
+
describe('loadGlobalContext', () => {
|
|
14
|
+
it('should load global context when file exists', () => {
|
|
15
|
+
vi.mocked(existsSync).mockReturnValue(true);
|
|
16
|
+
vi.mocked(readFileSync).mockReturnValue('# Project Context\n\nThis is project context');
|
|
17
|
+
const result = loadGlobalContext('/test/project');
|
|
18
|
+
expect(result).toBe('# Project Context\n\nThis is project context');
|
|
19
|
+
expect(existsSync).toHaveBeenCalledWith('/test/project/.drs/context.md');
|
|
20
|
+
expect(readFileSync).toHaveBeenCalledWith('/test/project/.drs/context.md', 'utf-8');
|
|
21
|
+
});
|
|
22
|
+
it('should return null when file does not exist', () => {
|
|
23
|
+
vi.mocked(existsSync).mockReturnValue(false);
|
|
24
|
+
const result = loadGlobalContext('/test/project');
|
|
25
|
+
expect(result).toBeNull();
|
|
26
|
+
expect(existsSync).toHaveBeenCalledWith('/test/project/.drs/context.md');
|
|
27
|
+
expect(readFileSync).not.toHaveBeenCalled();
|
|
28
|
+
});
|
|
29
|
+
it('should use process.cwd() as default project root', () => {
|
|
30
|
+
vi.mocked(existsSync).mockReturnValue(false);
|
|
31
|
+
const originalCwd = process.cwd();
|
|
32
|
+
loadGlobalContext();
|
|
33
|
+
expect(existsSync).toHaveBeenCalledWith(`${originalCwd}/.drs/context.md`);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('loadAgentContext', () => {
|
|
37
|
+
it('should load full agent override when agent.md exists', () => {
|
|
38
|
+
// Mock agent.md exists
|
|
39
|
+
vi.mocked(existsSync).mockImplementation((path) => {
|
|
40
|
+
return path.toString().includes('agent.md');
|
|
41
|
+
});
|
|
42
|
+
vi.mocked(readFileSync).mockReturnValue('# Custom Agent\n\nCustom agent definition');
|
|
43
|
+
const result = loadAgentContext('security', '/test/project');
|
|
44
|
+
expect(result).toEqual({
|
|
45
|
+
source: 'override',
|
|
46
|
+
agentDefinition: '# Custom Agent\n\nCustom agent definition',
|
|
47
|
+
});
|
|
48
|
+
expect(existsSync).toHaveBeenCalledWith('/test/project/.drs/agents/security/agent.md');
|
|
49
|
+
});
|
|
50
|
+
it('should load agent context when context.md exists but not agent.md', () => {
|
|
51
|
+
// Mock only context.md exists
|
|
52
|
+
vi.mocked(existsSync).mockImplementation((path) => {
|
|
53
|
+
return path.toString().includes('context.md') && !path.toString().includes('agent.md');
|
|
54
|
+
});
|
|
55
|
+
vi.mocked(readFileSync).mockReturnValue('Agent-specific context');
|
|
56
|
+
const result = loadAgentContext('quality', '/test/project');
|
|
57
|
+
expect(result).toEqual({
|
|
58
|
+
source: 'default',
|
|
59
|
+
agentContext: 'Agent-specific context',
|
|
60
|
+
});
|
|
61
|
+
expect(existsSync).toHaveBeenCalledWith('/test/project/.drs/agents/quality/agent.md');
|
|
62
|
+
expect(existsSync).toHaveBeenCalledWith('/test/project/.drs/agents/quality/context.md');
|
|
63
|
+
});
|
|
64
|
+
it('should return default when no customization exists', () => {
|
|
65
|
+
vi.mocked(existsSync).mockReturnValue(false);
|
|
66
|
+
const result = loadAgentContext('style', '/test/project');
|
|
67
|
+
expect(result).toEqual({
|
|
68
|
+
source: 'default',
|
|
69
|
+
});
|
|
70
|
+
expect(existsSync).toHaveBeenCalledWith('/test/project/.drs/agents/style/agent.md');
|
|
71
|
+
expect(existsSync).toHaveBeenCalledWith('/test/project/.drs/agents/style/context.md');
|
|
72
|
+
});
|
|
73
|
+
it('should use process.cwd() as default project root', () => {
|
|
74
|
+
vi.mocked(existsSync).mockReturnValue(false);
|
|
75
|
+
const originalCwd = process.cwd();
|
|
76
|
+
loadAgentContext('security');
|
|
77
|
+
expect(existsSync).toHaveBeenCalledWith(`${originalCwd}/.drs/agents/security/agent.md`);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe('buildReviewPrompt', () => {
|
|
81
|
+
it('should use full agent override when available', () => {
|
|
82
|
+
// Mock agent override
|
|
83
|
+
vi.mocked(existsSync).mockImplementation((path) => {
|
|
84
|
+
return path.toString().includes('agent.md');
|
|
85
|
+
});
|
|
86
|
+
vi.mocked(readFileSync).mockReturnValue('# Custom Security Agent\n\nCustom instructions');
|
|
87
|
+
const result = buildReviewPrompt('security', 'Default base prompt', 'PR #123', ['src/app.ts', 'src/utils.ts'], '/test/project');
|
|
88
|
+
expect(result).toContain('# Custom Security Agent');
|
|
89
|
+
expect(result).toContain('Custom instructions');
|
|
90
|
+
expect(result).toContain('Review the following files from PR #123');
|
|
91
|
+
expect(result).toContain('- src/app.ts');
|
|
92
|
+
expect(result).toContain('- src/utils.ts');
|
|
93
|
+
expect(result).not.toContain('Default base prompt');
|
|
94
|
+
});
|
|
95
|
+
it('should build prompt with global context and base prompt', () => {
|
|
96
|
+
// Mock global context exists, no agent override
|
|
97
|
+
vi.mocked(existsSync).mockImplementation((path) => {
|
|
98
|
+
const pathStr = path.toString();
|
|
99
|
+
return pathStr.includes('.drs/context.md');
|
|
100
|
+
});
|
|
101
|
+
vi.mocked(readFileSync).mockImplementation((path) => {
|
|
102
|
+
if (path.toString().includes('.drs/context.md')) {
|
|
103
|
+
return '# Project Context\n\nThis is our project';
|
|
104
|
+
}
|
|
105
|
+
return '';
|
|
106
|
+
});
|
|
107
|
+
const result = buildReviewPrompt('quality', 'Review code quality', 'MR !456', ['lib/index.ts'], '/test/project');
|
|
108
|
+
expect(result).toContain('# Project Context');
|
|
109
|
+
expect(result).toContain('This is our project');
|
|
110
|
+
expect(result).toContain('Review code quality');
|
|
111
|
+
});
|
|
112
|
+
it('should add Project Context header when not present in global context', () => {
|
|
113
|
+
vi.mocked(existsSync).mockImplementation((path) => {
|
|
114
|
+
return path.toString().includes('.drs/context.md');
|
|
115
|
+
});
|
|
116
|
+
vi.mocked(readFileSync).mockReturnValue('Just some context without header');
|
|
117
|
+
const result = buildReviewPrompt('security', 'Base instructions', 'PR #1', ['file.ts'], '/test/project');
|
|
118
|
+
expect(result).toContain('# Project Context\n\nJust some context without header');
|
|
119
|
+
});
|
|
120
|
+
it('should not duplicate Project Context header when already present', () => {
|
|
121
|
+
vi.mocked(existsSync).mockImplementation((path) => {
|
|
122
|
+
return path.toString().includes('.drs/context.md');
|
|
123
|
+
});
|
|
124
|
+
vi.mocked(readFileSync).mockReturnValue('# Project Context\n\nAlready has header');
|
|
125
|
+
const result = buildReviewPrompt('security', 'Base instructions', 'PR #1', ['file.ts'], '/test/project');
|
|
126
|
+
// Should not have double "# Project Context"
|
|
127
|
+
const matches = result.match(/# Project Context/g);
|
|
128
|
+
expect(matches).toHaveLength(1);
|
|
129
|
+
});
|
|
130
|
+
it('should build prompt with agent-specific context', () => {
|
|
131
|
+
// Mock agent context exists
|
|
132
|
+
vi.mocked(existsSync).mockImplementation((path) => {
|
|
133
|
+
const pathStr = path.toString();
|
|
134
|
+
return pathStr.includes('agents/security/context.md');
|
|
135
|
+
});
|
|
136
|
+
vi.mocked(readFileSync).mockReturnValue('Focus on authentication and authorization');
|
|
137
|
+
const result = buildReviewPrompt('security', 'Base security review', 'PR #2', ['auth.ts'], '/test/project');
|
|
138
|
+
expect(result).toContain('# Security Agent Context');
|
|
139
|
+
expect(result).toContain('Focus on authentication and authorization');
|
|
140
|
+
expect(result).toContain('Base security review');
|
|
141
|
+
});
|
|
142
|
+
it('should capitalize agent name in agent context header', () => {
|
|
143
|
+
vi.mocked(existsSync).mockImplementation((path) => {
|
|
144
|
+
return path.toString().includes('agents/quality/context.md');
|
|
145
|
+
});
|
|
146
|
+
vi.mocked(readFileSync).mockReturnValue('Quality context');
|
|
147
|
+
const result = buildReviewPrompt('quality', 'Base prompt', 'PR #3', ['file.ts'], '/test/project');
|
|
148
|
+
expect(result).toContain('# Quality Agent Context');
|
|
149
|
+
});
|
|
150
|
+
it('should build prompt with all contexts (global + agent + base)', () => {
|
|
151
|
+
// Mock both global and agent context
|
|
152
|
+
vi.mocked(existsSync).mockImplementation((path) => {
|
|
153
|
+
const pathStr = path.toString();
|
|
154
|
+
return (pathStr.includes('.drs/context.md') || pathStr.includes('agents/security/context.md'));
|
|
155
|
+
});
|
|
156
|
+
vi.mocked(readFileSync).mockImplementation((path) => {
|
|
157
|
+
if (path.toString().includes('.drs/context.md')) {
|
|
158
|
+
return 'Global project context';
|
|
159
|
+
}
|
|
160
|
+
if (path.toString().includes('agents/security/context.md')) {
|
|
161
|
+
return 'Security-specific context';
|
|
162
|
+
}
|
|
163
|
+
return '';
|
|
164
|
+
});
|
|
165
|
+
const result = buildReviewPrompt('security', 'Base security instructions', 'PR #4', ['auth.ts'], '/test/project');
|
|
166
|
+
expect(result).toContain('Global project context');
|
|
167
|
+
expect(result).toContain('Security-specific context');
|
|
168
|
+
expect(result).toContain('Base security instructions');
|
|
169
|
+
});
|
|
170
|
+
it('should handle empty file list', () => {
|
|
171
|
+
vi.mocked(existsSync).mockImplementation((path) => {
|
|
172
|
+
return path.toString().includes('agent.md');
|
|
173
|
+
});
|
|
174
|
+
vi.mocked(readFileSync).mockReturnValue('Custom agent');
|
|
175
|
+
const result = buildReviewPrompt('security', 'Base prompt', 'PR #5', [], '/test/project');
|
|
176
|
+
expect(result).toContain('Review the following files from PR #5');
|
|
177
|
+
// Should still work with no files listed
|
|
178
|
+
});
|
|
179
|
+
it('should use process.cwd() as default project root', () => {
|
|
180
|
+
vi.mocked(existsSync).mockReturnValue(false);
|
|
181
|
+
const originalCwd = process.cwd();
|
|
182
|
+
buildReviewPrompt('security', 'Base prompt', 'PR #1', ['file.ts']);
|
|
183
|
+
expect(existsSync).toHaveBeenCalledWith(`${originalCwd}/.drs/context.md`);
|
|
184
|
+
expect(existsSync).toHaveBeenCalledWith(`${originalCwd}/.drs/agents/security/agent.md`);
|
|
185
|
+
});
|
|
186
|
+
it('should handle whitespace-only global context', () => {
|
|
187
|
+
vi.mocked(existsSync).mockImplementation((path) => {
|
|
188
|
+
return path.toString().includes('.drs/context.md');
|
|
189
|
+
});
|
|
190
|
+
vi.mocked(readFileSync).mockReturnValue(' \n\n ');
|
|
191
|
+
const result = buildReviewPrompt('security', 'Base prompt', 'PR #1', ['file.ts'], '/test/project');
|
|
192
|
+
// Whitespace is preserved and wrapped with header
|
|
193
|
+
expect(result).toContain('# Project Context');
|
|
194
|
+
expect(result).toContain('Base prompt');
|
|
195
|
+
});
|
|
196
|
+
it('should handle context with multiple empty lines before content', () => {
|
|
197
|
+
vi.mocked(existsSync).mockImplementation((path) => {
|
|
198
|
+
return path.toString().includes('.drs/context.md');
|
|
199
|
+
});
|
|
200
|
+
vi.mocked(readFileSync).mockReturnValue('\n\n\n# Project Context\n\nContent here');
|
|
201
|
+
const result = buildReviewPrompt('security', 'Base prompt', 'PR #1', ['file.ts'], '/test/project');
|
|
202
|
+
expect(result).toContain('# Project Context\n\nContent here');
|
|
203
|
+
expect(result).not.toMatch(/^\n+/); // Should not start with newlines
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
//# sourceMappingURL=context-loader.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-loader.test.js","sourceRoot":"","sources":["../../src/lib/context-loader.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAE9C,iBAAiB;AACjB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACnB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;IACnB,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;CACtB,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC5C,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,8CAA8C,CAAC,CAAC;YAExF,MAAM,MAAM,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;YAElD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;YACpE,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,+BAA+B,CAAC,CAAC;YACzE,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,+BAA+B,EAAE,OAAO,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAE7C,MAAM,MAAM,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;YAElD,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC1B,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,+BAA+B,CAAC,CAAC;YACzE,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAElC,iBAAiB,EAAE,CAAC;YAEpB,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,GAAG,WAAW,kBAAkB,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,uBAAuB;YACvB,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;gBAChD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,2CAA2C,CAAC,CAAC;YAErF,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;YAE7D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,MAAM,EAAE,UAAU;gBAClB,eAAe,EAAE,2CAA2C;aAC7D,CAAC,CAAC;YACH,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,6CAA6C,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;YAC3E,8BAA8B;YAC9B,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;gBAChD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACzF,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAC;YAElE,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;YAE5D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,MAAM,EAAE,SAAS;gBACjB,YAAY,EAAE,wBAAwB;aACvC,CAAC,CAAC;YACH,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,4CAA4C,CAAC,CAAC;YACtF,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,8CAA8C,CAAC,CAAC;QAC1F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAE7C,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;YAE1D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC;YACH,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,0CAA0C,CAAC,CAAC;YACpF,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,4CAA4C,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAElC,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAE7B,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,GAAG,WAAW,gCAAgC,CAAC,CAAC;QAC1F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,sBAAsB;YACtB,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;gBAChD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,gDAAgD,CAAC,CAAC;YAE1F,MAAM,MAAM,GAAG,iBAAiB,CAC9B,UAAU,EACV,qBAAqB,EACrB,SAAS,EACT,CAAC,YAAY,EAAE,cAAc,CAAC,EAC9B,eAAe,CAChB,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,gDAAgD;YAChD,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;gBAChD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChC,OAAO,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;gBAClD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBAChD,OAAO,0CAA0C,CAAC;gBACpD,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,iBAAiB,CAC9B,SAAS,EACT,qBAAqB,EACrB,SAAS,EACT,CAAC,cAAc,CAAC,EAChB,eAAe,CAChB,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;YAC9E,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;gBAChD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,kCAAkC,CAAC,CAAC;YAE5E,MAAM,MAAM,GAAG,iBAAiB,CAC9B,UAAU,EACV,mBAAmB,EACnB,OAAO,EACP,CAAC,SAAS,CAAC,EACX,eAAe,CAChB,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uDAAuD,CAAC,CAAC;QACpF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;YAC1E,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;gBAChD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,yCAAyC,CAAC,CAAC;YAEnF,MAAM,MAAM,GAAG,iBAAiB,CAC9B,UAAU,EACV,mBAAmB,EACnB,OAAO,EACP,CAAC,SAAS,CAAC,EACX,eAAe,CAChB,CAAC;YAEF,6CAA6C;YAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACnD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,4BAA4B;YAC5B,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;gBAChD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChC,OAAO,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC;YACxD,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,2CAA2C,CAAC,CAAC;YAErF,MAAM,MAAM,GAAG,iBAAiB,CAC9B,UAAU,EACV,sBAAsB,EACtB,OAAO,EACP,CAAC,SAAS,CAAC,EACX,eAAe,CAChB,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2CAA2C,CAAC,CAAC;YACtE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;gBAChD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;YAE3D,MAAM,MAAM,GAAG,iBAAiB,CAC9B,SAAS,EACT,aAAa,EACb,OAAO,EACP,CAAC,SAAS,CAAC,EACX,eAAe,CAChB,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;YACvE,qCAAqC;YACrC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;gBAChD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChC,OAAO,CACL,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CACtF,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;gBAClD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBAChD,OAAO,wBAAwB,CAAC;gBAClC,CAAC;gBACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAAE,CAAC;oBAC3D,OAAO,2BAA2B,CAAC;gBACrC,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,iBAAiB,CAC9B,UAAU,EACV,4BAA4B,EAC5B,OAAO,EACP,CAAC,SAAS,CAAC,EACX,eAAe,CAChB,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;gBAChD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;YAExD,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC;YAE1F,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uCAAuC,CAAC,CAAC;YAClE,yCAAyC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAElC,iBAAiB,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;YAEnE,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,GAAG,WAAW,kBAAkB,CAAC,CAAC;YAC1E,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,GAAG,WAAW,gCAAgC,CAAC,CAAC;QAC1F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;gBAChD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;YAEtD,MAAM,MAAM,GAAG,iBAAiB,CAC9B,UAAU,EACV,aAAa,EACb,OAAO,EACP,CAAC,SAAS,CAAC,EACX,eAAe,CAChB,CAAC;YAEF,kDAAkD;YAClD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;YACxE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;gBAChD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,yCAAyC,CAAC,CAAC;YAEnF,MAAM,MAAM,GAAG,iBAAiB,CAC9B,UAAU,EACV,aAAa,EACb,OAAO,EACP,CAAC,SAAS,CAAC,EACX,eAAe,CAChB,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;YAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,iCAAiC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { FileWithDiff } from './review-core.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build base instructions for the describe agent.
|
|
4
|
+
*
|
|
5
|
+
* @param label - Human-readable label for the description (e.g., "PR #123", "MR !456")
|
|
6
|
+
* @param files - List of files with optional diff content
|
|
7
|
+
*/
|
|
8
|
+
export declare function buildDescribeInstructions(label: string, files: FileWithDiff[], compressionSummary?: string, projectContext?: string): string;
|
|
9
|
+
//# sourceMappingURL=describe-core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe-core.d.ts","sourceRoot":"","sources":["../../src/lib/describe-core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,EAAE,EACrB,kBAAkB,CAAC,EAAE,MAAM,EAC3B,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAkER"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build base instructions for the describe agent.
|
|
3
|
+
*
|
|
4
|
+
* @param label - Human-readable label for the description (e.g., "PR #123", "MR !456")
|
|
5
|
+
* @param files - List of files with optional diff content
|
|
6
|
+
*/
|
|
7
|
+
export function buildDescribeInstructions(label, files, compressionSummary, projectContext) {
|
|
8
|
+
const filesWithDiffs = files.filter((f) => f.patch);
|
|
9
|
+
const hasDiffs = filesWithDiffs.length > 0;
|
|
10
|
+
const fileList = files.map((f) => `- ${f.filename}`).join('\n');
|
|
11
|
+
const trimmedContext = projectContext?.trim();
|
|
12
|
+
const contextSection = trimmedContext
|
|
13
|
+
? /^#\s*project context/i.test(trimmedContext.split('\n')[0] ?? '')
|
|
14
|
+
? `${trimmedContext}\n\n`
|
|
15
|
+
: `# Project Context\n\n${trimmedContext}\n\n`
|
|
16
|
+
: '';
|
|
17
|
+
const diffContent = hasDiffs
|
|
18
|
+
? filesWithDiffs.map((f) => `### ${f.filename}\n\`\`\`diff\n${f.patch}\n\`\`\``).join('\n\n')
|
|
19
|
+
: '';
|
|
20
|
+
const outputSchema = `Output requirements:
|
|
21
|
+
- You MUST call the write_json_output tool with:
|
|
22
|
+
- outputType: "describe_output"
|
|
23
|
+
- payload: the JSON object
|
|
24
|
+
- After calling the tool, return only the JSON pointer returned by the tool
|
|
25
|
+
(e.g. {"outputType":"describe_output","outputPath":".drs/describe-output.json"})
|
|
26
|
+
- Do not return raw JSON directly.
|
|
27
|
+
- Do not include markdown, code fences, or extra text.
|
|
28
|
+
- Follow this exact schema:
|
|
29
|
+
{
|
|
30
|
+
"type": "feature" | "bugfix" | "refactor" | "docs" | "test" | "chore" | "perf",
|
|
31
|
+
"title": "Concise, theme-capturing title (50-70 chars)",
|
|
32
|
+
"summary": [
|
|
33
|
+
"Bullet point 1 (max 12 words)",
|
|
34
|
+
"Bullet point 2 (max 12 words)",
|
|
35
|
+
"Bullet point 3 (max 12 words)"
|
|
36
|
+
],
|
|
37
|
+
"walkthrough": [
|
|
38
|
+
{
|
|
39
|
+
"file": "path/to/file.ts",
|
|
40
|
+
"changeType": "added" | "modified" | "deleted" | "renamed",
|
|
41
|
+
"semanticLabel": "feature" | "bugfix" | "refactor" | "test" | "docs" | "infrastructure" | "configuration",
|
|
42
|
+
"title": "Brief change description (5-10 words)",
|
|
43
|
+
"changes": [
|
|
44
|
+
"Specific change 1 (max 12 words)",
|
|
45
|
+
"Specific change 2 (max 12 words)"
|
|
46
|
+
],
|
|
47
|
+
"significance": "major" | "minor"
|
|
48
|
+
}
|
|
49
|
+
],
|
|
50
|
+
"labels": ["suggested", "labels", "for", "categorization"],
|
|
51
|
+
"recommendations": [
|
|
52
|
+
"Optional suggestion 1",
|
|
53
|
+
"Optional suggestion 2"
|
|
54
|
+
]
|
|
55
|
+
}`;
|
|
56
|
+
return `${contextSection}Generate a comprehensive PR/MR description for ${label}.
|
|
57
|
+
|
|
58
|
+
Changed files:
|
|
59
|
+
${fileList}
|
|
60
|
+
|
|
61
|
+
${hasDiffs ? `## Diff Content\n\n${diffContent}\n` : ''}
|
|
62
|
+
|
|
63
|
+
${compressionSummary ? `${compressionSummary}\n\n` : ''}${outputSchema}
|
|
64
|
+
|
|
65
|
+
Instructions:
|
|
66
|
+
1. Focus on new or modified code (lines starting with + in diffs).
|
|
67
|
+
2. Summarize intent and impact. Avoid code review feedback.
|
|
68
|
+
3. Use the Read tool for additional context if needed.
|
|
69
|
+
4. Follow the output requirements and schema above exactly.`;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=describe-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe-core.js","sourceRoot":"","sources":["../../src/lib/describe-core.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAAa,EACb,KAAqB,EACrB,kBAA2B,EAC3B,cAAuB;IAEvB,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,MAAM,cAAc,GAAG,cAAc,EAAE,IAAI,EAAE,CAAC;IAC9C,MAAM,cAAc,GAAG,cAAc;QACnC,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjE,CAAC,CAAC,GAAG,cAAc,MAAM;YACzB,CAAC,CAAC,wBAAwB,cAAc,MAAM;QAChD,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,WAAW,GAAG,QAAQ;QAC1B,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,iBAAiB,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QAC7F,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmCrB,CAAC;IAED,OAAO,GAAG,cAAc,kDAAkD,KAAK;;;EAG/E,QAAQ;;EAER,QAAQ,CAAC,CAAC,CAAC,sBAAsB,WAAW,IAAI,CAAC,CAAC,CAAC,EAAE;;EAErD,kBAAkB,CAAC,CAAC,CAAC,GAAG,kBAAkB,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY;;;;;;4DAMV,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe-core.test.d.ts","sourceRoot":"","sources":["../../src/lib/describe-core.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { buildDescribeInstructions } from './describe-core.js';
|
|
3
|
+
describe('describe-core', () => {
|
|
4
|
+
describe('buildDescribeInstructions', () => {
|
|
5
|
+
it('should build instructions with diff content', () => {
|
|
6
|
+
const files = [
|
|
7
|
+
{
|
|
8
|
+
filename: 'src/app.ts',
|
|
9
|
+
patch: '+ const foo = "bar";',
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
filename: 'src/utils.ts',
|
|
13
|
+
patch: '- old code\n+ new code',
|
|
14
|
+
},
|
|
15
|
+
];
|
|
16
|
+
const instructions = buildDescribeInstructions('PR #123', files);
|
|
17
|
+
expect(instructions).toContain('PR #123');
|
|
18
|
+
expect(instructions).toContain('src/app.ts');
|
|
19
|
+
expect(instructions).toContain('src/utils.ts');
|
|
20
|
+
expect(instructions).toContain('Diff Content');
|
|
21
|
+
expect(instructions).toContain('+ const foo = "bar";');
|
|
22
|
+
expect(instructions).toContain('- old code\n+ new code');
|
|
23
|
+
expect(instructions).toContain('write_json_output');
|
|
24
|
+
expect(instructions).toContain('describe_output');
|
|
25
|
+
});
|
|
26
|
+
it('should build instructions without diff content', () => {
|
|
27
|
+
const files = [{ filename: 'src/app.ts' }, { filename: 'src/utils.ts' }];
|
|
28
|
+
const instructions = buildDescribeInstructions('MR !456', files);
|
|
29
|
+
expect(instructions).toContain('MR !456');
|
|
30
|
+
expect(instructions).toContain('src/app.ts');
|
|
31
|
+
expect(instructions).toContain('src/utils.ts');
|
|
32
|
+
expect(instructions).not.toContain('Diff Content');
|
|
33
|
+
expect(instructions).toContain('Changed files:');
|
|
34
|
+
});
|
|
35
|
+
it('should include compression summary when provided', () => {
|
|
36
|
+
const files = [
|
|
37
|
+
{
|
|
38
|
+
filename: 'src/app.ts',
|
|
39
|
+
patch: '+ new code',
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
const compressionSummary = '⚠️ Context was compressed due to size';
|
|
43
|
+
const instructions = buildDescribeInstructions('PR #123', files, compressionSummary);
|
|
44
|
+
expect(instructions).toContain(compressionSummary);
|
|
45
|
+
});
|
|
46
|
+
it('should include project context when provided', () => {
|
|
47
|
+
const files = [
|
|
48
|
+
{
|
|
49
|
+
filename: 'src/app.ts',
|
|
50
|
+
patch: '+ new code',
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
const projectContext = 'This is a TypeScript project using Express.';
|
|
54
|
+
const instructions = buildDescribeInstructions('PR #123', files, undefined, projectContext);
|
|
55
|
+
expect(instructions).toContain('Project Context');
|
|
56
|
+
expect(instructions).toContain('This is a TypeScript project using Express.');
|
|
57
|
+
});
|
|
58
|
+
it('should not add duplicate "Project Context" header if already present', () => {
|
|
59
|
+
const files = [
|
|
60
|
+
{
|
|
61
|
+
filename: 'src/app.ts',
|
|
62
|
+
patch: '+ new code',
|
|
63
|
+
},
|
|
64
|
+
];
|
|
65
|
+
const projectContext = '# Project Context\n\nExisting header content';
|
|
66
|
+
const instructions = buildDescribeInstructions('PR #123', files, undefined, projectContext);
|
|
67
|
+
// Should only appear once
|
|
68
|
+
const matches = instructions.match(/# Project Context/gi);
|
|
69
|
+
expect(matches).toHaveLength(1);
|
|
70
|
+
});
|
|
71
|
+
it('should handle case-insensitive "project context" header', () => {
|
|
72
|
+
const files = [
|
|
73
|
+
{
|
|
74
|
+
filename: 'src/app.ts',
|
|
75
|
+
patch: '+ new code',
|
|
76
|
+
},
|
|
77
|
+
];
|
|
78
|
+
const projectContext = '# project context\n\nLowercase header';
|
|
79
|
+
const instructions = buildDescribeInstructions('PR #123', files, undefined, projectContext);
|
|
80
|
+
// Should not add duplicate header
|
|
81
|
+
const matches = instructions.match(/# project context/gi);
|
|
82
|
+
expect(matches).toHaveLength(1);
|
|
83
|
+
});
|
|
84
|
+
it('should trim project context whitespace', () => {
|
|
85
|
+
const files = [
|
|
86
|
+
{
|
|
87
|
+
filename: 'src/app.ts',
|
|
88
|
+
patch: '+ new code',
|
|
89
|
+
},
|
|
90
|
+
];
|
|
91
|
+
const projectContext = '\n\n Context with whitespace \n\n';
|
|
92
|
+
const instructions = buildDescribeInstructions('PR #123', files, undefined, projectContext);
|
|
93
|
+
expect(instructions).toContain('Context with whitespace');
|
|
94
|
+
expect(instructions).not.toContain('\n\n Context with whitespace \n\n');
|
|
95
|
+
});
|
|
96
|
+
it('should handle empty project context', () => {
|
|
97
|
+
const files = [
|
|
98
|
+
{
|
|
99
|
+
filename: 'src/app.ts',
|
|
100
|
+
patch: '+ new code',
|
|
101
|
+
},
|
|
102
|
+
];
|
|
103
|
+
const instructions = buildDescribeInstructions('PR #123', files, undefined, '');
|
|
104
|
+
expect(instructions).not.toContain('Project Context');
|
|
105
|
+
});
|
|
106
|
+
it('should handle files with and without patches mixed', () => {
|
|
107
|
+
const files = [
|
|
108
|
+
{
|
|
109
|
+
filename: 'src/app.ts',
|
|
110
|
+
patch: '+ has patch',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
filename: 'src/utils.ts',
|
|
114
|
+
// no patch
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
filename: 'src/db.ts',
|
|
118
|
+
patch: '+ another patch',
|
|
119
|
+
},
|
|
120
|
+
];
|
|
121
|
+
const instructions = buildDescribeInstructions('PR #123', files);
|
|
122
|
+
// All files should be listed
|
|
123
|
+
expect(instructions).toContain('src/app.ts');
|
|
124
|
+
expect(instructions).toContain('src/utils.ts');
|
|
125
|
+
expect(instructions).toContain('src/db.ts');
|
|
126
|
+
// Only files with patches should be in diff content
|
|
127
|
+
expect(instructions).toContain('### src/app.ts');
|
|
128
|
+
expect(instructions).toContain('### src/db.ts');
|
|
129
|
+
expect(instructions).not.toContain('### src/utils.ts');
|
|
130
|
+
});
|
|
131
|
+
it('should include all required output schema fields', () => {
|
|
132
|
+
const files = [
|
|
133
|
+
{
|
|
134
|
+
filename: 'src/app.ts',
|
|
135
|
+
patch: '+ code',
|
|
136
|
+
},
|
|
137
|
+
];
|
|
138
|
+
const instructions = buildDescribeInstructions('PR #123', files);
|
|
139
|
+
// Check for required schema fields
|
|
140
|
+
expect(instructions).toContain('type');
|
|
141
|
+
expect(instructions).toContain('title');
|
|
142
|
+
expect(instructions).toContain('summary');
|
|
143
|
+
expect(instructions).toContain('walkthrough');
|
|
144
|
+
expect(instructions).toContain('labels');
|
|
145
|
+
expect(instructions).toContain('recommendations');
|
|
146
|
+
expect(instructions).toContain('changeType');
|
|
147
|
+
expect(instructions).toContain('semanticLabel');
|
|
148
|
+
expect(instructions).toContain('significance');
|
|
149
|
+
});
|
|
150
|
+
it('should include instructions about focusing on new/modified code', () => {
|
|
151
|
+
const files = [
|
|
152
|
+
{
|
|
153
|
+
filename: 'src/app.ts',
|
|
154
|
+
patch: '+ code',
|
|
155
|
+
},
|
|
156
|
+
];
|
|
157
|
+
const instructions = buildDescribeInstructions('PR #123', files);
|
|
158
|
+
expect(instructions).toContain('Focus on new or modified code');
|
|
159
|
+
expect(instructions).toContain('lines starting with +');
|
|
160
|
+
});
|
|
161
|
+
it('should handle empty files array', () => {
|
|
162
|
+
const files = [];
|
|
163
|
+
const instructions = buildDescribeInstructions('PR #123', files);
|
|
164
|
+
expect(instructions).toContain('PR #123');
|
|
165
|
+
expect(instructions).toContain('Changed files:');
|
|
166
|
+
expect(instructions).not.toContain('Diff Content');
|
|
167
|
+
});
|
|
168
|
+
it('should include compression summary and project context together', () => {
|
|
169
|
+
const files = [
|
|
170
|
+
{
|
|
171
|
+
filename: 'src/app.ts',
|
|
172
|
+
patch: '+ code',
|
|
173
|
+
},
|
|
174
|
+
];
|
|
175
|
+
const compressionSummary = '⚠️ Compressed';
|
|
176
|
+
const projectContext = 'Express project';
|
|
177
|
+
const instructions = buildDescribeInstructions('PR #123', files, compressionSummary, projectContext);
|
|
178
|
+
expect(instructions).toContain('Project Context');
|
|
179
|
+
expect(instructions).toContain('Express project');
|
|
180
|
+
expect(instructions).toContain('⚠️ Compressed');
|
|
181
|
+
});
|
|
182
|
+
it('should format diffs with code fences', () => {
|
|
183
|
+
const files = [
|
|
184
|
+
{
|
|
185
|
+
filename: 'src/app.ts',
|
|
186
|
+
patch: '+ const x = 1;',
|
|
187
|
+
},
|
|
188
|
+
];
|
|
189
|
+
const instructions = buildDescribeInstructions('PR #123', files);
|
|
190
|
+
expect(instructions).toContain('```diff');
|
|
191
|
+
expect(instructions).toContain('+ const x = 1;');
|
|
192
|
+
expect(instructions).toContain('```');
|
|
193
|
+
});
|
|
194
|
+
it('should include specific label for PR/MR', () => {
|
|
195
|
+
const files = [
|
|
196
|
+
{
|
|
197
|
+
filename: 'src/app.ts',
|
|
198
|
+
patch: '+ code',
|
|
199
|
+
},
|
|
200
|
+
];
|
|
201
|
+
const instructionsPR = buildDescribeInstructions('PR #123', files);
|
|
202
|
+
expect(instructionsPR).toContain('PR #123');
|
|
203
|
+
const instructionsMR = buildDescribeInstructions('MR !456', files);
|
|
204
|
+
expect(instructionsMR).toContain('MR !456');
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
//# sourceMappingURL=describe-core.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe-core.test.js","sourceRoot":"","sources":["../../src/lib/describe-core.test.ts"],"names":[],"mappings":"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"}
|