opencodekit 0.6.1 → 0.6.3
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/dist/index.js +1 -1
- package/dist/template/.opencode/AGENTS.md +28 -4
- package/dist/template/.opencode/agent/build.md +11 -3
- package/dist/template/.opencode/agent/rush.md +11 -3
- package/dist/template/.opencode/dcp.jsonc +63 -41
- package/dist/template/.opencode/lib/lsp/client.ts +614 -0
- package/dist/template/.opencode/lib/lsp/config.ts +98 -0
- package/dist/template/.opencode/lib/lsp/constants.ts +138 -0
- package/dist/template/.opencode/lib/lsp/types.ts +138 -0
- package/dist/template/.opencode/lib/lsp/utils.ts +190 -0
- package/dist/template/.opencode/opencode.json +3 -3
- package/dist/template/.opencode/package.json +2 -2
- package/dist/template/.opencode/tool/lsp.ts +325 -0
- package/package.json +1 -1
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import type { LSPServerConfig } from "./types";
|
|
2
|
+
|
|
3
|
+
export const SYMBOL_KIND_MAP: Record<number, string> = {
|
|
4
|
+
1: "File",
|
|
5
|
+
2: "Module",
|
|
6
|
+
3: "Namespace",
|
|
7
|
+
4: "Package",
|
|
8
|
+
5: "Class",
|
|
9
|
+
6: "Method",
|
|
10
|
+
7: "Property",
|
|
11
|
+
8: "Field",
|
|
12
|
+
9: "Constructor",
|
|
13
|
+
10: "Enum",
|
|
14
|
+
11: "Interface",
|
|
15
|
+
12: "Function",
|
|
16
|
+
13: "Variable",
|
|
17
|
+
14: "Constant",
|
|
18
|
+
15: "String",
|
|
19
|
+
16: "Number",
|
|
20
|
+
17: "Boolean",
|
|
21
|
+
18: "Array",
|
|
22
|
+
19: "Object",
|
|
23
|
+
20: "Key",
|
|
24
|
+
21: "Null",
|
|
25
|
+
22: "EnumMember",
|
|
26
|
+
23: "Struct",
|
|
27
|
+
24: "Event",
|
|
28
|
+
25: "Operator",
|
|
29
|
+
26: "TypeParameter",
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export const SEVERITY_MAP: Record<number, string> = {
|
|
33
|
+
1: "error",
|
|
34
|
+
2: "warning",
|
|
35
|
+
3: "information",
|
|
36
|
+
4: "hint",
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const DEFAULT_MAX_REFERENCES = 200;
|
|
40
|
+
export const DEFAULT_MAX_SYMBOLS = 200;
|
|
41
|
+
export const DEFAULT_MAX_DIAGNOSTICS = 200;
|
|
42
|
+
|
|
43
|
+
// Synced with OpenCode's server.ts
|
|
44
|
+
export const BUILTIN_SERVERS: Record<string, Omit<LSPServerConfig, "id">> = {
|
|
45
|
+
typescript: {
|
|
46
|
+
command: ["typescript-language-server", "--stdio"],
|
|
47
|
+
extensions: [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".mts", ".cts"],
|
|
48
|
+
},
|
|
49
|
+
vue: {
|
|
50
|
+
command: ["vue-language-server", "--stdio"],
|
|
51
|
+
extensions: [".vue"],
|
|
52
|
+
},
|
|
53
|
+
gopls: {
|
|
54
|
+
command: ["gopls"],
|
|
55
|
+
extensions: [".go"],
|
|
56
|
+
},
|
|
57
|
+
basedpyright: {
|
|
58
|
+
command: ["basedpyright-langserver", "--stdio"],
|
|
59
|
+
extensions: [".py", ".pyi"],
|
|
60
|
+
},
|
|
61
|
+
pyright: {
|
|
62
|
+
command: ["pyright-langserver", "--stdio"],
|
|
63
|
+
extensions: [".py", ".pyi"],
|
|
64
|
+
},
|
|
65
|
+
rust: {
|
|
66
|
+
command: ["rust-analyzer"],
|
|
67
|
+
extensions: [".rs"],
|
|
68
|
+
},
|
|
69
|
+
clangd: {
|
|
70
|
+
command: ["clangd", "--background-index", "--clang-tidy"],
|
|
71
|
+
extensions: [
|
|
72
|
+
".c",
|
|
73
|
+
".cpp",
|
|
74
|
+
".cc",
|
|
75
|
+
".cxx",
|
|
76
|
+
".c++",
|
|
77
|
+
".h",
|
|
78
|
+
".hpp",
|
|
79
|
+
".hh",
|
|
80
|
+
".hxx",
|
|
81
|
+
".h++",
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
svelte: {
|
|
85
|
+
command: ["svelteserver", "--stdio"],
|
|
86
|
+
extensions: [".svelte"],
|
|
87
|
+
},
|
|
88
|
+
astro: {
|
|
89
|
+
command: ["astro-ls", "--stdio"],
|
|
90
|
+
extensions: [".astro"],
|
|
91
|
+
},
|
|
92
|
+
jdtls: {
|
|
93
|
+
command: ["jdtls"],
|
|
94
|
+
extensions: [".java"],
|
|
95
|
+
},
|
|
96
|
+
lua: {
|
|
97
|
+
command: ["lua-language-server"],
|
|
98
|
+
extensions: [".lua"],
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// Extension to language ID mapping
|
|
103
|
+
export const EXT_TO_LANG: Record<string, string> = {
|
|
104
|
+
".ts": "typescript",
|
|
105
|
+
".tsx": "typescriptreact",
|
|
106
|
+
".mts": "typescript",
|
|
107
|
+
".cts": "typescript",
|
|
108
|
+
".js": "javascript",
|
|
109
|
+
".jsx": "javascriptreact",
|
|
110
|
+
".mjs": "javascript",
|
|
111
|
+
".cjs": "javascript",
|
|
112
|
+
".json": "json",
|
|
113
|
+
".jsonc": "jsonc",
|
|
114
|
+
".py": "python",
|
|
115
|
+
".pyi": "python",
|
|
116
|
+
".go": "go",
|
|
117
|
+
".rs": "rust",
|
|
118
|
+
".c": "c",
|
|
119
|
+
".cpp": "cpp",
|
|
120
|
+
".cc": "cpp",
|
|
121
|
+
".cxx": "cpp",
|
|
122
|
+
".h": "c",
|
|
123
|
+
".hpp": "cpp",
|
|
124
|
+
".java": "java",
|
|
125
|
+
".lua": "lua",
|
|
126
|
+
".vue": "vue",
|
|
127
|
+
".svelte": "svelte",
|
|
128
|
+
".astro": "astro",
|
|
129
|
+
".html": "html",
|
|
130
|
+
".css": "css",
|
|
131
|
+
".scss": "scss",
|
|
132
|
+
".md": "markdown",
|
|
133
|
+
".yaml": "yaml",
|
|
134
|
+
".yml": "yaml",
|
|
135
|
+
".sh": "shellscript",
|
|
136
|
+
".bash": "shellscript",
|
|
137
|
+
".zsh": "shellscript",
|
|
138
|
+
};
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
export interface LSPServerConfig {
|
|
2
|
+
id: string;
|
|
3
|
+
command: string[];
|
|
4
|
+
extensions: string[];
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
env?: Record<string, string>;
|
|
7
|
+
initialization?: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface Position {
|
|
11
|
+
line: number;
|
|
12
|
+
character: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface Range {
|
|
16
|
+
start: Position;
|
|
17
|
+
end: Position;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface Location {
|
|
21
|
+
uri: string;
|
|
22
|
+
range: Range;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface LocationLink {
|
|
26
|
+
targetUri: string;
|
|
27
|
+
targetRange: Range;
|
|
28
|
+
targetSelectionRange: Range;
|
|
29
|
+
originSelectionRange?: Range;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface SymbolInfo {
|
|
33
|
+
name: string;
|
|
34
|
+
kind: number;
|
|
35
|
+
location: Location;
|
|
36
|
+
containerName?: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface DocumentSymbol {
|
|
40
|
+
name: string;
|
|
41
|
+
kind: number;
|
|
42
|
+
range: Range;
|
|
43
|
+
selectionRange: Range;
|
|
44
|
+
children?: DocumentSymbol[];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface Diagnostic {
|
|
48
|
+
range: Range;
|
|
49
|
+
severity?: number;
|
|
50
|
+
code?: string | number;
|
|
51
|
+
source?: string;
|
|
52
|
+
message: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface HoverResult {
|
|
56
|
+
contents:
|
|
57
|
+
| { kind?: string; value: string }
|
|
58
|
+
| string
|
|
59
|
+
| Array<{ kind?: string; value: string } | string>;
|
|
60
|
+
range?: Range;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface TextDocumentIdentifier {
|
|
64
|
+
uri: string;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface VersionedTextDocumentIdentifier
|
|
68
|
+
extends TextDocumentIdentifier {
|
|
69
|
+
version: number | null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface TextEdit {
|
|
73
|
+
range: Range;
|
|
74
|
+
newText: string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface TextDocumentEdit {
|
|
78
|
+
textDocument: VersionedTextDocumentIdentifier;
|
|
79
|
+
edits: TextEdit[];
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export interface CreateFile {
|
|
83
|
+
kind: "create";
|
|
84
|
+
uri: string;
|
|
85
|
+
options?: { overwrite?: boolean; ignoreIfExists?: boolean };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface RenameFile {
|
|
89
|
+
kind: "rename";
|
|
90
|
+
oldUri: string;
|
|
91
|
+
newUri: string;
|
|
92
|
+
options?: { overwrite?: boolean; ignoreIfExists?: boolean };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export interface DeleteFile {
|
|
96
|
+
kind: "delete";
|
|
97
|
+
uri: string;
|
|
98
|
+
options?: { recursive?: boolean; ignoreIfNotExists?: boolean };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface WorkspaceEdit {
|
|
102
|
+
changes?: { [uri: string]: TextEdit[] };
|
|
103
|
+
documentChanges?: (TextDocumentEdit | CreateFile | RenameFile | DeleteFile)[];
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface PrepareRenameResult {
|
|
107
|
+
range: Range;
|
|
108
|
+
placeholder?: string;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export interface PrepareRenameDefaultBehavior {
|
|
112
|
+
defaultBehavior: boolean;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export interface Command {
|
|
116
|
+
title: string;
|
|
117
|
+
command: string;
|
|
118
|
+
arguments?: unknown[];
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export interface CodeActionContext {
|
|
122
|
+
diagnostics: Diagnostic[];
|
|
123
|
+
only?: string[];
|
|
124
|
+
triggerKind?: CodeActionTriggerKind;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export type CodeActionTriggerKind = 1 | 2;
|
|
128
|
+
|
|
129
|
+
export interface CodeAction {
|
|
130
|
+
title: string;
|
|
131
|
+
kind?: string;
|
|
132
|
+
diagnostics?: Diagnostic[];
|
|
133
|
+
isPreferred?: boolean;
|
|
134
|
+
disabled?: { reason: string };
|
|
135
|
+
edit?: WorkspaceEdit;
|
|
136
|
+
command?: Command;
|
|
137
|
+
data?: unknown;
|
|
138
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import {
|
|
2
|
+
existsSync,
|
|
3
|
+
mkdirSync,
|
|
4
|
+
readFileSync,
|
|
5
|
+
renameSync,
|
|
6
|
+
rmSync,
|
|
7
|
+
writeFileSync,
|
|
8
|
+
} from "node:fs";
|
|
9
|
+
import { dirname } from "node:path";
|
|
10
|
+
import { fileURLToPath } from "node:url";
|
|
11
|
+
import type {
|
|
12
|
+
CreateFile,
|
|
13
|
+
DeleteFile,
|
|
14
|
+
RenameFile,
|
|
15
|
+
TextDocumentEdit,
|
|
16
|
+
TextEdit,
|
|
17
|
+
WorkspaceEdit,
|
|
18
|
+
} from "./types";
|
|
19
|
+
|
|
20
|
+
export interface ApplyEditResult {
|
|
21
|
+
success: boolean;
|
|
22
|
+
filesModified: string[];
|
|
23
|
+
error?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function isTextDocumentEdit(
|
|
27
|
+
change: TextDocumentEdit | CreateFile | RenameFile | DeleteFile,
|
|
28
|
+
): change is TextDocumentEdit {
|
|
29
|
+
return "textDocument" in change && "edits" in change;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function isCreateFile(
|
|
33
|
+
change: TextDocumentEdit | CreateFile | RenameFile | DeleteFile,
|
|
34
|
+
): change is CreateFile {
|
|
35
|
+
return "kind" in change && change.kind === "create";
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function isRenameFile(
|
|
39
|
+
change: TextDocumentEdit | CreateFile | RenameFile | DeleteFile,
|
|
40
|
+
): change is RenameFile {
|
|
41
|
+
return "kind" in change && change.kind === "rename";
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function isDeleteFile(
|
|
45
|
+
change: TextDocumentEdit | CreateFile | RenameFile | DeleteFile,
|
|
46
|
+
): change is DeleteFile {
|
|
47
|
+
return "kind" in change && change.kind === "delete";
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function applyTextEdits(filePath: string, edits: TextEdit[]): void {
|
|
51
|
+
const content = readFileSync(filePath, "utf-8");
|
|
52
|
+
const lines = content.split("\n");
|
|
53
|
+
|
|
54
|
+
// Sort edits in reverse order to apply from bottom to top
|
|
55
|
+
const sortedEdits = [...edits].sort((a, b) => {
|
|
56
|
+
if (b.range.start.line !== a.range.start.line) {
|
|
57
|
+
return b.range.start.line - a.range.start.line;
|
|
58
|
+
}
|
|
59
|
+
return b.range.start.character - a.range.start.character;
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
for (const edit of sortedEdits) {
|
|
63
|
+
const { start, end } = edit.range;
|
|
64
|
+
|
|
65
|
+
// Get the text before and after the edit range
|
|
66
|
+
const startLine = lines[start.line] ?? "";
|
|
67
|
+
const endLine = lines[end.line] ?? "";
|
|
68
|
+
|
|
69
|
+
const beforeEdit = startLine.slice(0, start.character);
|
|
70
|
+
const afterEdit = endLine.slice(end.character);
|
|
71
|
+
|
|
72
|
+
// Create new content for the affected lines
|
|
73
|
+
const newLines = edit.newText.split("\n");
|
|
74
|
+
|
|
75
|
+
if (newLines.length === 1) {
|
|
76
|
+
// Single line replacement
|
|
77
|
+
lines[start.line] = beforeEdit + newLines[0] + afterEdit;
|
|
78
|
+
// Remove any lines between start and end
|
|
79
|
+
if (end.line > start.line) {
|
|
80
|
+
lines.splice(start.line + 1, end.line - start.line);
|
|
81
|
+
}
|
|
82
|
+
} else {
|
|
83
|
+
// Multi-line replacement
|
|
84
|
+
newLines[0] = beforeEdit + newLines[0];
|
|
85
|
+
newLines[newLines.length - 1] = newLines[newLines.length - 1] + afterEdit;
|
|
86
|
+
|
|
87
|
+
// Replace the affected lines
|
|
88
|
+
lines.splice(start.line, end.line - start.line + 1, ...newLines);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
writeFileSync(filePath, lines.join("\n"));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function applyWorkspaceEdit(edit: WorkspaceEdit): ApplyEditResult {
|
|
96
|
+
const filesModified: string[] = [];
|
|
97
|
+
|
|
98
|
+
try {
|
|
99
|
+
// Handle documentChanges (newer format)
|
|
100
|
+
if (edit.documentChanges) {
|
|
101
|
+
for (const change of edit.documentChanges) {
|
|
102
|
+
if (isTextDocumentEdit(change)) {
|
|
103
|
+
const filePath = fileURLToPath(change.textDocument.uri);
|
|
104
|
+
applyTextEdits(filePath, change.edits);
|
|
105
|
+
if (!filesModified.includes(filePath)) {
|
|
106
|
+
filesModified.push(filePath);
|
|
107
|
+
}
|
|
108
|
+
} else if (isCreateFile(change)) {
|
|
109
|
+
const filePath = fileURLToPath(change.uri);
|
|
110
|
+
const dir = dirname(filePath);
|
|
111
|
+
if (!existsSync(dir)) {
|
|
112
|
+
mkdirSync(dir, { recursive: true });
|
|
113
|
+
}
|
|
114
|
+
if (!existsSync(filePath) || change.options?.overwrite) {
|
|
115
|
+
writeFileSync(filePath, "");
|
|
116
|
+
filesModified.push(filePath);
|
|
117
|
+
}
|
|
118
|
+
} else if (isRenameFile(change)) {
|
|
119
|
+
const oldPath = fileURLToPath(change.oldUri);
|
|
120
|
+
const newPath = fileURLToPath(change.newUri);
|
|
121
|
+
const newDir = dirname(newPath);
|
|
122
|
+
if (!existsSync(newDir)) {
|
|
123
|
+
mkdirSync(newDir, { recursive: true });
|
|
124
|
+
}
|
|
125
|
+
if (existsSync(oldPath)) {
|
|
126
|
+
if (!existsSync(newPath) || change.options?.overwrite) {
|
|
127
|
+
renameSync(oldPath, newPath);
|
|
128
|
+
filesModified.push(oldPath, newPath);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
} else if (isDeleteFile(change)) {
|
|
132
|
+
const filePath = fileURLToPath(change.uri);
|
|
133
|
+
if (existsSync(filePath)) {
|
|
134
|
+
rmSync(filePath, { recursive: change.options?.recursive });
|
|
135
|
+
filesModified.push(filePath);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Handle changes (older format)
|
|
142
|
+
if (edit.changes) {
|
|
143
|
+
for (const [uri, edits] of Object.entries(edit.changes)) {
|
|
144
|
+
const filePath = fileURLToPath(uri);
|
|
145
|
+
applyTextEdits(filePath, edits);
|
|
146
|
+
if (!filesModified.includes(filePath)) {
|
|
147
|
+
filesModified.push(filePath);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return { success: true, filesModified };
|
|
153
|
+
} catch (error) {
|
|
154
|
+
return {
|
|
155
|
+
success: false,
|
|
156
|
+
filesModified,
|
|
157
|
+
error: error instanceof Error ? error.message : String(error),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export function formatWorkspaceEditPreview(edit: WorkspaceEdit): string {
|
|
163
|
+
const changes: string[] = [];
|
|
164
|
+
|
|
165
|
+
if (edit.documentChanges) {
|
|
166
|
+
for (const change of edit.documentChanges) {
|
|
167
|
+
if (isTextDocumentEdit(change)) {
|
|
168
|
+
const filePath = fileURLToPath(change.textDocument.uri);
|
|
169
|
+
changes.push(`Modify: ${filePath} (${change.edits.length} edit(s))`);
|
|
170
|
+
} else if (isCreateFile(change)) {
|
|
171
|
+
changes.push(`Create: ${fileURLToPath(change.uri)}`);
|
|
172
|
+
} else if (isRenameFile(change)) {
|
|
173
|
+
changes.push(
|
|
174
|
+
`Rename: ${fileURLToPath(change.oldUri)} → ${fileURLToPath(change.newUri)}`,
|
|
175
|
+
);
|
|
176
|
+
} else if (isDeleteFile(change)) {
|
|
177
|
+
changes.push(`Delete: ${fileURLToPath(change.uri)}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (edit.changes) {
|
|
183
|
+
for (const [uri, edits] of Object.entries(edit.changes)) {
|
|
184
|
+
const filePath = fileURLToPath(uri);
|
|
185
|
+
changes.push(`Modify: ${filePath} (${edits.length} edit(s))`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return changes.join("\n");
|
|
190
|
+
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
},
|
|
8
8
|
"build": {
|
|
9
9
|
"description": "Primary development agent with full codebase access",
|
|
10
|
-
"model": "
|
|
10
|
+
"model": "github-copilot/claude-opus-4.5"
|
|
11
11
|
},
|
|
12
12
|
"explore": {
|
|
13
13
|
"description": "Fast codebase search specialist",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
},
|
|
30
30
|
"rush": {
|
|
31
31
|
"description": "Fast primary agent for small, well-defined tasks",
|
|
32
|
-
"model": "
|
|
32
|
+
"model": "proxypal/gemini-claude-opus-4-5-thinking"
|
|
33
33
|
},
|
|
34
34
|
"scout": {
|
|
35
35
|
"description": "External research specialist for library docs and patterns",
|
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
"type": "local"
|
|
111
111
|
}
|
|
112
112
|
},
|
|
113
|
-
"model": "
|
|
113
|
+
"model": "github-copilot/claude-haiku-4.5",
|
|
114
114
|
"permission": {
|
|
115
115
|
"bash": {
|
|
116
116
|
"git commit *": "ask",
|
|
@@ -11,10 +11,10 @@
|
|
|
11
11
|
"author": "",
|
|
12
12
|
"license": "ISC",
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@opencode-ai/plugin": "1.0.
|
|
14
|
+
"@opencode-ai/plugin": "1.0.199"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
|
-
"@types/node": "^
|
|
17
|
+
"@types/node": "^25.0.3",
|
|
18
18
|
"fs": "^0.0.1-security",
|
|
19
19
|
"path": "^0.12.7",
|
|
20
20
|
"typescript": "^5.9.3"
|