@diff-review-system/drs 1.1.2 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.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 +222 -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 +16 -0
- package/dist/cli/post-comments.d.ts.map +1 -0
- package/dist/cli/post-comments.js +222 -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 +65 -7
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +122 -22
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/config.test.js +31 -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 +57 -0
- package/dist/lib/repository-validator.d.ts.map +1 -0
- package/dist/lib/repository-validator.js +225 -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 +84 -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 +350 -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
|
@@ -1,64 +1,65 @@
|
|
|
1
1
|
import { readFileSync, readdirSync, existsSync, statSync } from 'fs';
|
|
2
2
|
import { join, relative } from 'path';
|
|
3
3
|
import * as yaml from 'yaml';
|
|
4
|
+
import { builtInAgentPath } from './opencode-paths.js';
|
|
4
5
|
/**
|
|
5
6
|
* Load review agents from a project directory
|
|
6
7
|
*
|
|
7
8
|
* Priority order:
|
|
8
|
-
* 1. Project .drs/agents
|
|
9
|
-
* 2.
|
|
10
|
-
* 3. Global DRS agents (fallback)
|
|
9
|
+
* 1. Project .drs/agents/<name>/agent.md (DRS-specific overrides/custom)
|
|
10
|
+
* 2. Built-in agents shipped with DRS (.opencode/agent)
|
|
11
11
|
*/
|
|
12
12
|
export function loadReviewAgents(projectPath) {
|
|
13
13
|
const agents = [];
|
|
14
|
-
// Define search paths in priority order
|
|
15
|
-
const agentPaths = [join(projectPath, '.drs/agents'), join(projectPath, '.opencode/agent')];
|
|
16
14
|
const discovered = new Set();
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
const overridePath = join(projectPath, '.drs', 'agents');
|
|
16
|
+
const overrideAgents = discoverOverrideAgents(overridePath, overridePath);
|
|
17
|
+
for (const agent of overrideAgents) {
|
|
18
|
+
if (!discovered.has(agent.name)) {
|
|
19
|
+
agents.push(agent);
|
|
20
|
+
discovered.add(agent.name);
|
|
20
21
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
22
|
+
}
|
|
23
|
+
const builtInAgents = discoverAgents(builtInAgentPath, builtInAgentPath);
|
|
24
|
+
for (const agent of builtInAgents) {
|
|
25
|
+
if (!discovered.has(agent.name)) {
|
|
26
|
+
agents.push(agent);
|
|
27
|
+
discovered.add(agent.name);
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
return agents;
|
|
31
31
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
*/
|
|
35
|
-
function discoverAgents(basePath, currentPath) {
|
|
36
|
-
const agents = [];
|
|
32
|
+
function traverseDirectory(basePath, currentPath, fileFilter) {
|
|
33
|
+
const files = [];
|
|
37
34
|
if (!existsSync(currentPath)) {
|
|
38
|
-
return
|
|
35
|
+
return files;
|
|
39
36
|
}
|
|
40
37
|
const entries = readdirSync(currentPath);
|
|
41
38
|
for (const entry of entries) {
|
|
42
39
|
const fullPath = join(currentPath, entry);
|
|
43
40
|
const stat = statSync(fullPath);
|
|
44
41
|
if (stat.isDirectory()) {
|
|
45
|
-
|
|
46
|
-
agents.push(...discoverAgents(basePath, fullPath));
|
|
42
|
+
files.push(...traverseDirectory(basePath, fullPath, fileFilter));
|
|
47
43
|
}
|
|
48
|
-
else if (stat.isFile() && entry
|
|
49
|
-
|
|
50
|
-
const agent = parseAgentFile(fullPath, basePath);
|
|
51
|
-
if (agent) {
|
|
52
|
-
agents.push(agent);
|
|
53
|
-
}
|
|
44
|
+
else if (stat.isFile() && fileFilter(entry, fullPath)) {
|
|
45
|
+
files.push(fullPath);
|
|
54
46
|
}
|
|
55
47
|
}
|
|
56
|
-
return
|
|
48
|
+
return files;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Recursively discover agent markdown files in a directory
|
|
52
|
+
*/
|
|
53
|
+
function discoverAgents(basePath, currentPath) {
|
|
54
|
+
const files = traverseDirectory(basePath, currentPath, (entry) => entry.endsWith('.md'));
|
|
55
|
+
return files
|
|
56
|
+
.map((filePath) => parseAgentFile(filePath, basePath))
|
|
57
|
+
.filter((agent) => Boolean(agent));
|
|
57
58
|
}
|
|
58
59
|
/**
|
|
59
60
|
* Parse an agent markdown file and extract frontmatter
|
|
60
61
|
*/
|
|
61
|
-
function parseAgentFile(filePath, basePath) {
|
|
62
|
+
function parseAgentFile(filePath, basePath, nameOverride) {
|
|
62
63
|
try {
|
|
63
64
|
const content = readFileSync(filePath, 'utf-8');
|
|
64
65
|
// Extract YAML frontmatter
|
|
@@ -69,8 +70,7 @@ function parseAgentFile(filePath, basePath) {
|
|
|
69
70
|
}
|
|
70
71
|
const frontmatter = yaml.parse(frontmatterMatch[1]);
|
|
71
72
|
// Generate agent name from relative path
|
|
72
|
-
const
|
|
73
|
-
const agentName = relativePath.replace(/\.md$/, '').replace(/\\/g, '/');
|
|
73
|
+
const agentName = nameOverride ?? relative(basePath, filePath).replace(/\.md$/, '').replace(/\\/g, '/');
|
|
74
74
|
return {
|
|
75
75
|
name: agentName,
|
|
76
76
|
path: filePath,
|
|
@@ -86,6 +86,20 @@ function parseAgentFile(filePath, basePath) {
|
|
|
86
86
|
return null;
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* Discover override agents from .drs/agents/<name>/agent.md
|
|
91
|
+
*/
|
|
92
|
+
function discoverOverrideAgents(basePath, currentPath) {
|
|
93
|
+
const files = traverseDirectory(basePath, currentPath, (entry) => entry === 'agent.md');
|
|
94
|
+
return files
|
|
95
|
+
.map((fullPath) => {
|
|
96
|
+
const relativePath = relative(basePath, fullPath).replace(/\\/g, '/');
|
|
97
|
+
const stripped = relativePath.replace(/\/agent\.md$/, '');
|
|
98
|
+
const agentName = stripped.startsWith('review/') ? stripped : `review/${stripped}`;
|
|
99
|
+
return parseAgentFile(fullPath, basePath, agentName);
|
|
100
|
+
})
|
|
101
|
+
.filter((agent) => Boolean(agent));
|
|
102
|
+
}
|
|
89
103
|
/**
|
|
90
104
|
* Get a specific agent by name
|
|
91
105
|
*/
|
|
@@ -94,7 +108,7 @@ export function getAgent(projectPath, agentName) {
|
|
|
94
108
|
return agents.find((a) => a.name === agentName) || null;
|
|
95
109
|
}
|
|
96
110
|
/**
|
|
97
|
-
* Get all review agents (security, quality, style, performance)
|
|
111
|
+
* Get all review agents (security, quality, style, performance, documentation)
|
|
98
112
|
*/
|
|
99
113
|
export function getReviewAgents(projectPath) {
|
|
100
114
|
const agents = loadReviewAgents(projectPath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-loader.js","sourceRoot":"","sources":["../../src/opencode/agent-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-loader.js","sourceRoot":"","sources":["../../src/opencode/agent-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAYvD;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAErC,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzD,MAAM,cAAc,GAAG,sBAAsB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAC1E,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,cAAc,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IACzE,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CACxB,QAAgB,EAChB,WAAmB,EACnB,UAAwD;IAExD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAEzC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEhC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;QACnE,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,QAAgB,EAAE,WAAmB;IAC3D,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAEzF,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;SACrD,MAAM,CAAC,CAAC,KAAK,EAA4B,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CACrB,QAAgB,EAChB,QAAgB,EAChB,YAAqB;IAErB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEhD,2BAA2B;QAC3B,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAEhE,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;QAEpD,yCAAyC;QACzC,MAAM,SAAS,GACb,YAAY,IAAI,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAExF,OAAO;YACL,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,WAAW,CAAC,WAAW,IAAI,EAAE;YAC1C,KAAK,EAAE,WAAW,CAAC,KAAK;YACxB,KAAK,EAAE,WAAW,CAAC,KAAK;YACxB,KAAK,EAAE,WAAW,CAAC,KAAK;YACxB,MAAM,EAAE,WAAW,CAAC,MAAM,IAAI,KAAK;SACpC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,QAAgB,EAAE,WAAmB;IACnE,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC;IAExF,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QAChB,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,QAAQ,EAAE,CAAC;QACnF,OAAO,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACvD,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,KAAK,EAA4B,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,WAAmB,EAAE,SAAiB;IAC7D,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,IAAI,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AgentConfig, DRSConfig } from '../lib/config.js';
|
|
2
|
+
export interface AgentSkillOverlay {
|
|
3
|
+
root: string;
|
|
4
|
+
cleanup: () => Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
export type SkillConfig = {
|
|
7
|
+
defaultSkills: string[];
|
|
8
|
+
agents: AgentConfig[];
|
|
9
|
+
};
|
|
10
|
+
export declare function createAgentSkillOverlay(projectPath: string, config: DRSConfig): Promise<AgentSkillOverlay | null>;
|
|
11
|
+
//# sourceMappingURL=agent-skill-overlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-skill-overlay.d.ts","sourceRoot":"","sources":["../../src/opencode/agent-skill-overlay.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAK/D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAAC;AAgLF,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAuCnC"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { mkdir, mkdtemp, readFile, readdir, rm, writeFile } from 'fs/promises';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import { dirname, join, relative } from 'path';
|
|
4
|
+
import { tmpdir } from 'os';
|
|
5
|
+
import * as yaml from 'yaml';
|
|
6
|
+
import { getDefaultSkills, normalizeAgentConfig } from '../lib/config.js';
|
|
7
|
+
import { builtInAgentPath } from './opencode-paths.js';
|
|
8
|
+
import { loadProjectSkills } from './skill-loader.js';
|
|
9
|
+
const SKILL_FILE_NAME = 'SKILL.md';
|
|
10
|
+
function normalizeSkillList(skills) {
|
|
11
|
+
if (!Array.isArray(skills)) {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
return skills.map(String).filter((skill) => skill.length > 0);
|
|
15
|
+
}
|
|
16
|
+
function resolveConfiguredSkills(skillConfig, agentName) {
|
|
17
|
+
if (!skillConfig || skillConfig.agents.length === 0) {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
const normalizedName = agentName.startsWith('review/') ? agentName.slice(7) : agentName;
|
|
21
|
+
const entry = skillConfig.agents.find((agent) => agent.name === normalizedName) ??
|
|
22
|
+
skillConfig.agents.find((agent) => agent.name === agentName);
|
|
23
|
+
const defaultSkills = normalizeSkillList(skillConfig.defaultSkills);
|
|
24
|
+
const agentSkills = entry ? normalizeSkillList(entry.skills) : [];
|
|
25
|
+
const mergedSkills = new Set([...defaultSkills, ...agentSkills]);
|
|
26
|
+
if (mergedSkills.size === 0) {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
return Array.from(mergedSkills);
|
|
30
|
+
}
|
|
31
|
+
function upsertAgentSkills(content, skills) {
|
|
32
|
+
if (skills.length === 0) {
|
|
33
|
+
return content;
|
|
34
|
+
}
|
|
35
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n?/);
|
|
36
|
+
const parsed = frontmatterMatch ? yaml.parse(frontmatterMatch[1]) : {};
|
|
37
|
+
const frontmatter = parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {};
|
|
38
|
+
// Enable the skill tool and set permissions for configured skills
|
|
39
|
+
// OpenCode uses on-demand skill loading via the 'skill' tool, not preloaded skills
|
|
40
|
+
const updatedFrontmatter = {
|
|
41
|
+
...frontmatter,
|
|
42
|
+
tools: {
|
|
43
|
+
...(frontmatter.tools || {}),
|
|
44
|
+
skill: true, // Enable the skill tool
|
|
45
|
+
},
|
|
46
|
+
permission: {
|
|
47
|
+
...(frontmatter.permission || {}),
|
|
48
|
+
skill: {
|
|
49
|
+
// Allow all skills by default - could be made more granular if needed
|
|
50
|
+
'*': 'allow',
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
const frontmatterText = yaml.stringify(updatedFrontmatter).trimEnd();
|
|
55
|
+
const newFrontmatter = `---\n${frontmatterText}\n---\n`;
|
|
56
|
+
if (frontmatterMatch) {
|
|
57
|
+
return `${newFrontmatter}${content.slice(frontmatterMatch[0].length)}`;
|
|
58
|
+
}
|
|
59
|
+
return `${newFrontmatter}\n${content}`;
|
|
60
|
+
}
|
|
61
|
+
async function writeFileWithSkills(sourcePath, targetPath, agentName, skillConfig) {
|
|
62
|
+
const content = await readFile(sourcePath, 'utf-8');
|
|
63
|
+
const skills = resolveConfiguredSkills(skillConfig, agentName);
|
|
64
|
+
const updatedContent = upsertAgentSkills(content, skills);
|
|
65
|
+
await mkdir(dirname(targetPath), { recursive: true });
|
|
66
|
+
await writeFile(targetPath, updatedContent);
|
|
67
|
+
}
|
|
68
|
+
async function traverseDirectory(currentPath, fileFilter) {
|
|
69
|
+
const files = [];
|
|
70
|
+
if (!existsSync(currentPath)) {
|
|
71
|
+
return files;
|
|
72
|
+
}
|
|
73
|
+
const entries = await readdir(currentPath, { withFileTypes: true });
|
|
74
|
+
for (const entry of entries) {
|
|
75
|
+
const fullPath = join(currentPath, entry.name);
|
|
76
|
+
if (entry.isDirectory()) {
|
|
77
|
+
files.push(...(await traverseDirectory(fullPath, fileFilter)));
|
|
78
|
+
}
|
|
79
|
+
else if (entry.isFile() && fileFilter(entry.name, fullPath)) {
|
|
80
|
+
files.push(fullPath);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return files;
|
|
84
|
+
}
|
|
85
|
+
function resolveOverrideAgentName(overrideRoot, filePath) {
|
|
86
|
+
const relativePath = relative(overrideRoot, filePath).replace(/\\/g, '/');
|
|
87
|
+
const stripped = relativePath.replace(/\/agent\.md$/, '');
|
|
88
|
+
return stripped.startsWith('review/') ? stripped : `review/${stripped}`;
|
|
89
|
+
}
|
|
90
|
+
async function copyBuiltInAgents(destinationRoot, skillConfig) {
|
|
91
|
+
const files = await traverseDirectory(builtInAgentPath, (entry) => entry.endsWith('.md'));
|
|
92
|
+
const results = await Promise.allSettled(files.map(async (filePath) => {
|
|
93
|
+
const relativePath = relative(builtInAgentPath, filePath).replace(/\\/g, '/');
|
|
94
|
+
const agentName = relativePath.replace(/\.md$/, '').replace(/\\/g, '/');
|
|
95
|
+
const targetPath = join(destinationRoot, relativePath);
|
|
96
|
+
await writeFileWithSkills(filePath, targetPath, agentName, skillConfig);
|
|
97
|
+
}));
|
|
98
|
+
const failures = results.filter((result) => result.status === 'rejected');
|
|
99
|
+
if (failures.length > 0) {
|
|
100
|
+
throw new Error(`Failed to prepare ${failures.length} built-in agent(s)`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async function copyOverrideAgents(projectPath, destinationRoot, skillConfig) {
|
|
104
|
+
const overrideRoot = join(projectPath, '.drs', 'agents');
|
|
105
|
+
const files = await traverseDirectory(overrideRoot, (entry) => entry === 'agent.md');
|
|
106
|
+
const results = await Promise.allSettled(files.map(async (filePath) => {
|
|
107
|
+
const agentName = resolveOverrideAgentName(overrideRoot, filePath);
|
|
108
|
+
const targetPath = join(destinationRoot, `${agentName}.md`);
|
|
109
|
+
await writeFileWithSkills(filePath, targetPath, agentName, skillConfig);
|
|
110
|
+
}));
|
|
111
|
+
const failures = results.filter((result) => result.status === 'rejected');
|
|
112
|
+
if (failures.length > 0) {
|
|
113
|
+
throw new Error(`Failed to prepare ${failures.length} override agent(s)`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async function copyProjectSkills(projectPath, destinationRoot) {
|
|
117
|
+
const skills = loadProjectSkills(projectPath);
|
|
118
|
+
const results = await Promise.allSettled(skills.map(async (skill) => {
|
|
119
|
+
const targetPath = join(destinationRoot, skill.name, SKILL_FILE_NAME);
|
|
120
|
+
const content = await readFile(skill.path, 'utf-8');
|
|
121
|
+
await mkdir(dirname(targetPath), { recursive: true });
|
|
122
|
+
await writeFile(targetPath, content);
|
|
123
|
+
}));
|
|
124
|
+
const failures = results.filter((result) => result.status === 'rejected');
|
|
125
|
+
if (failures.length > 0) {
|
|
126
|
+
throw new Error(`Failed to prepare ${failures.length} skill file(s)`);
|
|
127
|
+
}
|
|
128
|
+
return skills;
|
|
129
|
+
}
|
|
130
|
+
export async function createAgentSkillOverlay(projectPath, config) {
|
|
131
|
+
const normalizedAgents = normalizeAgentConfig(config.review.agents);
|
|
132
|
+
const defaultSkills = getDefaultSkills(config);
|
|
133
|
+
const hasSkillConfig = defaultSkills.length > 0 || normalizedAgents.some((agent) => (agent.skills ?? []).length > 0);
|
|
134
|
+
const skills = loadProjectSkills(projectPath);
|
|
135
|
+
if (!hasSkillConfig && skills.length === 0) {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
const overlayRoot = await mkdtemp(join(tmpdir(), 'drs-opencode-'));
|
|
139
|
+
const opencodeRoot = join(overlayRoot, '.opencode');
|
|
140
|
+
const agentRoot = join(opencodeRoot, 'agent');
|
|
141
|
+
const skillRoot = join(opencodeRoot, 'skills');
|
|
142
|
+
try {
|
|
143
|
+
await mkdir(agentRoot, { recursive: true });
|
|
144
|
+
await mkdir(skillRoot, { recursive: true });
|
|
145
|
+
const skillConfig = {
|
|
146
|
+
defaultSkills,
|
|
147
|
+
agents: normalizedAgents,
|
|
148
|
+
};
|
|
149
|
+
await copyBuiltInAgents(agentRoot, skillConfig);
|
|
150
|
+
await copyOverrideAgents(projectPath, agentRoot, skillConfig);
|
|
151
|
+
await copyProjectSkills(projectPath, skillRoot);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
await rm(overlayRoot, { recursive: true, force: true });
|
|
155
|
+
throw error;
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
root: overlayRoot,
|
|
159
|
+
cleanup: async () => {
|
|
160
|
+
await rm(overlayRoot, { recursive: true, force: true });
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=agent-skill-overlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-skill-overlay.js","sourceRoot":"","sources":["../../src/opencode/agent-skill-overlay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAwB,MAAM,mBAAmB,CAAC;AAY5E,MAAM,eAAe,GAAG,UAAU,CAAC;AAEnC,SAAS,kBAAkB,CAAC,MAAe;IACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,uBAAuB,CAAC,WAAwB,EAAE,SAAiB;IAC1E,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,cAAc,GAAG,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxF,MAAM,KAAK,GACT,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC;QACjE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAE/D,MAAM,aAAa,GAAG,kBAAkB,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IACpE,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,aAAa,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC;IAEjE,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,MAAgB;IAC1D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,MAAM,WAAW,GAAG,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjG,kEAAkE;IAClE,mFAAmF;IACnF,MAAM,kBAAkB,GAAG;QACzB,GAAG,WAAW;QACd,KAAK,EAAE;YACL,GAAG,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5B,KAAK,EAAE,IAAI,EAAE,wBAAwB;SACtC;QACD,UAAU,EAAE;YACV,GAAG,CAAC,WAAW,CAAC,UAAU,IAAI,EAAE,CAAC;YACjC,KAAK,EAAE;gBACL,sEAAsE;gBACtE,GAAG,EAAE,OAAO;aACb;SACF;KACF,CAAC;IAEF,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,CAAC;IACrE,MAAM,cAAc,GAAG,QAAQ,eAAe,SAAS,CAAC;IAExD,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,GAAG,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACzE,CAAC;IAED,OAAO,GAAG,cAAc,KAAK,OAAO,EAAE,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,UAAkB,EAClB,UAAkB,EAClB,SAAiB,EACjB,WAAwB;IAExB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,uBAAuB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC/D,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAE1D,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,SAAS,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;AAC9C,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,WAAmB,EACnB,UAAwD;IAExD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAE/C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,iBAAiB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,wBAAwB,CAAC,YAAoB,EAAE,QAAgB;IACtE,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC1E,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAC1D,OAAO,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,QAAQ,EAAE,CAAC;AAC1E,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,eAAuB,EAAE,WAAwB;IAChF,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAE1F,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QAC3B,MAAM,YAAY,GAAG,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9E,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACxE,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,mBAAmB,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAC1E,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;IAC1E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,oBAAoB,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,WAAmB,EACnB,eAAuB,EACvB,WAAwB;IAExB,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC;IAErF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QAC3B,MAAM,SAAS,GAAG,wBAAwB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACnE,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,SAAS,KAAK,CAAC,CAAC;QAC5D,MAAM,mBAAmB,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAC1E,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;IAC1E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,oBAAoB,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,WAAmB,EACnB,eAAuB;IAEvB,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAE9C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;IAC1E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,gBAAgB,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,WAAmB,EACnB,MAAiB;IAEjB,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpE,MAAM,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,cAAc,GAClB,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChG,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAE9C,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAEnE,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5C,MAAM,WAAW,GAAgB;YAC/B,aAAa;YACb,MAAM,EAAE,gBAAgB;SACzB,CAAC;QACF,MAAM,iBAAiB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAChD,MAAM,kBAAkB,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9D,MAAM,iBAAiB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -5,17 +5,19 @@
|
|
|
5
5
|
* 1. Connect to an existing remote OpenCode server (when baseUrl is provided)
|
|
6
6
|
* 2. Start an OpenCode server in-process (when baseUrl is not provided)
|
|
7
7
|
*/
|
|
8
|
+
import type { CustomProvider, DRSConfig } from '../lib/config.js';
|
|
8
9
|
export interface OpencodeConfig {
|
|
9
10
|
baseUrl?: string;
|
|
10
11
|
directory?: string;
|
|
11
|
-
serverPort?: number;
|
|
12
|
-
serverHostname?: string;
|
|
13
12
|
modelOverrides?: Record<string, string>;
|
|
13
|
+
provider?: Record<string, CustomProvider>;
|
|
14
|
+
debug?: boolean;
|
|
15
|
+
config?: DRSConfig;
|
|
14
16
|
}
|
|
15
17
|
export interface SessionCreateOptions {
|
|
16
18
|
agent: string;
|
|
17
19
|
message: string;
|
|
18
|
-
context?: Record<string,
|
|
20
|
+
context?: Record<string, unknown>;
|
|
19
21
|
}
|
|
20
22
|
export interface SessionMessage {
|
|
21
23
|
id: string;
|
|
@@ -37,6 +39,8 @@ export declare class OpencodeClient {
|
|
|
37
39
|
private inProcessServer?;
|
|
38
40
|
private client?;
|
|
39
41
|
private config;
|
|
42
|
+
private overlay?;
|
|
43
|
+
private projectRootEnv?;
|
|
40
44
|
constructor(config: OpencodeConfig);
|
|
41
45
|
/**
|
|
42
46
|
* Initialize - either connect to remote server or start in-process
|
|
@@ -70,6 +74,10 @@ export declare class OpencodeClient {
|
|
|
70
74
|
* Get server URL
|
|
71
75
|
*/
|
|
72
76
|
getServerUrl(): string;
|
|
77
|
+
/**
|
|
78
|
+
* Resolve {env:VAR_NAME} references to actual environment variable values
|
|
79
|
+
*/
|
|
80
|
+
private resolveEnvReferences;
|
|
73
81
|
}
|
|
74
82
|
/**
|
|
75
83
|
* Create an OpenCode client with the given configuration
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/opencode/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/opencode/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIlE,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAID,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,eAAe,CAAC,CAA6C;IACrE,OAAO,CAAC,MAAM,CAAC,CAAqC;IACpD,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAAC,CAAsD;IACtE,OAAO,CAAC,cAAc,CAAC,CAAS;gBAEpB,MAAM,EAAE,cAAc;IAMlC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA8LjC;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAmDpE;;OAEG;IACI,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC,cAAc,CAAC;IAyExE;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAQrE;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBpE;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBpD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB/B;;OAEG;IACH,YAAY,IAAI,MAAM;IAOtB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CA8B7B;AAgDD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAE3E;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,cAAc,CAAC,CAIzB"}
|