@cortexkit/aft-opencode 0.2.0 → 0.4.1

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.
Files changed (76) hide show
  1. package/dist/bridge.d.ts +8 -0
  2. package/dist/bridge.d.ts.map +1 -1
  3. package/dist/bridge.js +45 -2
  4. package/dist/bridge.js.map +1 -1
  5. package/dist/config.d.ts +2 -0
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +17 -0
  8. package/dist/config.js.map +1 -1
  9. package/dist/downloader.d.ts.map +1 -1
  10. package/dist/downloader.js +51 -15
  11. package/dist/downloader.js.map +1 -1
  12. package/dist/index.d.ts +4 -3
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +73 -15
  15. package/dist/index.js.map +1 -1
  16. package/dist/metadata-store.d.ts +29 -0
  17. package/dist/metadata-store.d.ts.map +1 -0
  18. package/dist/metadata-store.js +53 -0
  19. package/dist/metadata-store.js.map +1 -0
  20. package/dist/normalize-schemas.d.ts +16 -0
  21. package/dist/normalize-schemas.d.ts.map +1 -0
  22. package/dist/normalize-schemas.js +45 -0
  23. package/dist/normalize-schemas.js.map +1 -0
  24. package/dist/patch-parser.d.ts +33 -0
  25. package/dist/patch-parser.d.ts.map +1 -0
  26. package/dist/patch-parser.js +247 -0
  27. package/dist/patch-parser.js.map +1 -0
  28. package/dist/platform.d.ts +21 -0
  29. package/dist/platform.d.ts.map +1 -0
  30. package/dist/platform.js +31 -0
  31. package/dist/platform.js.map +1 -0
  32. package/dist/pool.d.ts.map +1 -1
  33. package/dist/pool.js +14 -5
  34. package/dist/pool.js.map +1 -1
  35. package/dist/resolver.d.ts.map +1 -1
  36. package/dist/resolver.js +6 -9
  37. package/dist/resolver.js.map +1 -1
  38. package/dist/tools/ast.d.ts.map +1 -1
  39. package/dist/tools/ast.js +179 -89
  40. package/dist/tools/ast.js.map +1 -1
  41. package/dist/tools/hoisted.d.ts +26 -0
  42. package/dist/tools/hoisted.d.ts.map +1 -0
  43. package/dist/tools/hoisted.js +852 -0
  44. package/dist/tools/hoisted.js.map +1 -0
  45. package/dist/tools/imports.d.ts.map +1 -1
  46. package/dist/tools/imports.js +41 -21
  47. package/dist/tools/imports.js.map +1 -1
  48. package/dist/tools/lsp.d.ts +1 -2
  49. package/dist/tools/lsp.d.ts.map +1 -1
  50. package/dist/tools/lsp.js +45 -110
  51. package/dist/tools/lsp.js.map +1 -1
  52. package/dist/tools/navigation.d.ts.map +1 -1
  53. package/dist/tools/navigation.js +25 -10
  54. package/dist/tools/navigation.js.map +1 -1
  55. package/dist/tools/permissions.d.ts +8 -0
  56. package/dist/tools/permissions.d.ts.map +1 -0
  57. package/dist/tools/permissions.js +50 -0
  58. package/dist/tools/permissions.js.map +1 -0
  59. package/dist/tools/reading.d.ts +1 -1
  60. package/dist/tools/reading.d.ts.map +1 -1
  61. package/dist/tools/reading.js +170 -54
  62. package/dist/tools/reading.js.map +1 -1
  63. package/dist/tools/refactoring.d.ts.map +1 -1
  64. package/dist/tools/refactoring.js +73 -24
  65. package/dist/tools/refactoring.js.map +1 -1
  66. package/dist/tools/safety.d.ts.map +1 -1
  67. package/dist/tools/safety.js +38 -11
  68. package/dist/tools/safety.js.map +1 -1
  69. package/dist/tools/structure.d.ts.map +1 -1
  70. package/dist/tools/structure.js +70 -20
  71. package/dist/tools/structure.js.map +1 -1
  72. package/package.json +7 -7
  73. package/dist/tools/editing.d.ts +0 -7
  74. package/dist/tools/editing.d.ts.map +0 -1
  75. package/dist/tools/editing.js +0 -150
  76. package/dist/tools/editing.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { tool } from "@opencode-ai/plugin";
2
+ import { askEditPermission, permissionDeniedResponse, resolveAbsolutePath, resolveRelativePattern, } from "./permissions.js";
2
3
  const z = tool.schema;
3
4
  /**
4
5
  * Tool definitions for scope-aware structure commands:
@@ -7,29 +8,41 @@ const z = tool.schema;
7
8
  export function structureTools(ctx) {
8
9
  return {
9
10
  aft_transform: {
10
- description: "Scope-aware structural code transformations with correct indentation.\n" +
11
+ description: "Scope-aware structural code transformations with correct indentation.\n\n" +
12
+ "Language-specific: add_derive (Rust), add_struct_tags (Go), add_decorator (Python), wrap_try_catch (TS/JS), add_member (any language).\n\n" +
11
13
  "Ops:\n" +
12
- "- 'add_member': Insert method/field into class, struct, or impl block. Needs 'scope' (target container) and 'code'. Optional 'position' (first/last/before:name/after:name).\n" +
13
- "- 'add_derive': Add Rust derive macros to struct/enum. Needs 'target' and 'derives' array. Deduplicates.\n" +
14
- "- 'wrap_try_catch': Wrap a TS/JS function body in try/catch. Needs 'target' (function name). Optional 'catch_body'.\n" +
15
- "- 'add_decorator': Add Python decorator to function/class. Needs 'target' and 'decorator' (without @). Optional 'position' (first/last).\n" +
16
- "- 'add_struct_tags': Add/update Go struct field tags. Needs 'target' (struct), 'field', 'tag', 'value'.\n" +
17
- "All ops need 'file'. Returns formatted, validation_errors.",
14
+ "- 'add_member': Insert method/field into class, struct, or impl block. Requires 'container' (container name) and 'code'. Optional 'position'.\n" +
15
+ "- 'add_derive': Add Rust derive macros to a struct/enum. Requires 'target' and 'derives' array. Deduplicates existing derives.\n" +
16
+ "- 'wrap_try_catch': Wrap a TS/JS function body in try/catch. Requires 'target' (function name). Optional 'catchBody'.\n" +
17
+ "- 'add_decorator': Add Python decorator to function/class. Requires 'target' and 'decorator' (without @). Optional 'position'.\n" +
18
+ "- 'add_struct_tags': Add/update Go struct field tags. Requires 'target' (struct name), 'field', 'tag', 'value'.\n\n" +
19
+ "Each op requires specific parameters see parameter descriptions for requirements.\n\n" +
20
+ "Returns:\n" +
21
+ "- Dry run (any op): { ok, dry_run, diff, syntax_valid? }\n" +
22
+ "- add_member: { file, scope, position, formatted, syntax_valid?, format_skipped_reason?, validation_errors?, validate_skipped_reason?, backup_id?, lsp_diagnostics? }\n" +
23
+ "- add_derive: { file, target, derives, formatted, syntax_valid?, format_skipped_reason?, validation_errors?, validate_skipped_reason?, backup_id?, lsp_diagnostics? }\n" +
24
+ "- wrap_try_catch: { file, target, formatted, syntax_valid?, format_skipped_reason?, validation_errors?, validate_skipped_reason?, backup_id?, lsp_diagnostics? }\n" +
25
+ "- add_decorator: { file, target, decorator, formatted, syntax_valid?, format_skipped_reason?, validation_errors?, validate_skipped_reason?, backup_id?, lsp_diagnostics? }\n" +
26
+ "- add_struct_tags: { file, target, field, tag_string, formatted, syntax_valid?, format_skipped_reason?, validation_errors?, validate_skipped_reason?, backup_id?, lsp_diagnostics? }",
27
+ // Parameters are Zod-optional because different ops need different subsets.
28
+ // Runtime guards below validate per-op requirements and give clear errors.
18
29
  args: {
19
30
  op: z
20
31
  .enum(["add_member", "add_derive", "wrap_try_catch", "add_decorator", "add_struct_tags"])
21
32
  .describe("Transformation operation"),
22
- file: z.string().describe("Path to the source file"),
33
+ filePath: z
34
+ .string()
35
+ .describe("Path to the source file (absolute or relative to project root)"),
23
36
  // add_member
24
- scope: z
37
+ container: z
25
38
  .string()
26
39
  .optional()
27
- .describe("Container name to insert into (add_member — class, struct, or impl block)"),
40
+ .describe("Container name for add_member — the class, struct, or impl block to insert into. Appears as 'scope' in the response."),
28
41
  code: z.string().optional().describe("Member code to insert (add_member)"),
29
42
  position: z
30
43
  .string()
31
44
  .optional()
32
- .describe("Insert position: 'first', 'last' (default), 'before:name', 'after:name' (add_member, add_decorator)"),
45
+ .describe("For add_member: 'first', 'last' (default), 'before:name', 'after:name'. For add_decorator: 'first' (default) or 'last' only."),
33
46
  // add_derive, wrap_try_catch, add_decorator, add_struct_tags
34
47
  target: z
35
48
  .string()
@@ -39,7 +52,7 @@ export function structureTools(ctx) {
39
52
  .array(z.string())
40
53
  .optional()
41
54
  .describe("Derive macro names (add_derive — e.g. ['Clone', 'Debug'])"),
42
- catch_body: z
55
+ catchBody: z
43
56
  .string()
44
57
  .optional()
45
58
  .describe("Catch block body (wrap_try_catch — default: 'throw error;')"),
@@ -58,20 +71,57 @@ export function structureTools(ctx) {
58
71
  validate: z
59
72
  .enum(["syntax", "full"])
60
73
  .optional()
61
- .describe("Validation level: 'syntax' (default) or 'full'"),
62
- dry_run: z.boolean().optional().describe("Preview without modifying the file"),
74
+ .describe("Validation level: 'syntax' (default) or 'full'. Syntax = tree-sitter parse check only. Full = also runs LSP type-checking (slower, catches more errors)"),
75
+ dryRun: z
76
+ .boolean()
77
+ .optional()
78
+ .describe("Preview without modifying the file (default: false)"),
63
79
  },
64
80
  execute: async (args, context) => {
65
81
  const bridge = ctx.pool.getBridge(context.directory);
66
82
  const op = args.op;
67
- const params = { file: args.file };
83
+ const isDryRun = args.dryRun === true;
84
+ if (op === "add_member") {
85
+ if (typeof args.container !== "string")
86
+ throw new Error("'container' is required for 'add_member' op");
87
+ if (typeof args.code !== "string")
88
+ throw new Error("'code' is required for 'add_member' op");
89
+ }
90
+ if (op === "add_derive" ||
91
+ op === "wrap_try_catch" ||
92
+ op === "add_decorator" ||
93
+ op === "add_struct_tags") {
94
+ if (typeof args.target !== "string")
95
+ throw new Error(`'target' is required for '${op}' op`);
96
+ }
97
+ if (op === "add_derive" && !Array.isArray(args.derives)) {
98
+ throw new Error("'derives' array is required for 'add_derive' op");
99
+ }
100
+ if (op === "add_decorator" && typeof args.decorator !== "string") {
101
+ throw new Error("'decorator' is required for 'add_decorator' op");
102
+ }
103
+ if (op === "add_struct_tags") {
104
+ if (typeof args.field !== "string")
105
+ throw new Error("'field' is required for 'add_struct_tags' op");
106
+ if (typeof args.tag !== "string")
107
+ throw new Error("'tag' is required for 'add_struct_tags' op");
108
+ if (typeof args.value !== "string")
109
+ throw new Error("'value' is required for 'add_struct_tags' op");
110
+ }
111
+ if (!isDryRun) {
112
+ const filePath = resolveAbsolutePath(context, args.filePath);
113
+ const permissionError = await askEditPermission(context, [resolveRelativePattern(context, args.filePath)], { filepath: filePath });
114
+ if (permissionError)
115
+ return permissionDeniedResponse(permissionError);
116
+ }
117
+ const params = { file: args.filePath };
68
118
  if (args.validate !== undefined)
69
119
  params.validate = args.validate;
70
- if (args.dry_run !== undefined)
71
- params.dry_run = args.dry_run;
120
+ if (args.dryRun !== undefined)
121
+ params.dry_run = args.dryRun;
72
122
  switch (op) {
73
123
  case "add_member":
74
- params.scope = args.scope;
124
+ params.scope = args.container;
75
125
  params.code = args.code;
76
126
  if (args.position !== undefined)
77
127
  params.position = args.position;
@@ -82,8 +132,8 @@ export function structureTools(ctx) {
82
132
  break;
83
133
  case "wrap_try_catch":
84
134
  params.target = args.target;
85
- if (args.catch_body !== undefined)
86
- params.catch_body = args.catch_body;
135
+ if (args.catchBody !== undefined)
136
+ params.catch_body = args.catchBody;
87
137
  break;
88
138
  case "add_decorator":
89
139
  params.target = args.target;
@@ -1 +1 @@
1
- {"version":3,"file":"structure.js","sourceRoot":"","sources":["../../src/tools/structure.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"structure.js","sourceRoot":"","sources":["../../src/tools/structure.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@cortexkit/aft-opencode",
3
- "version": "0.2.0",
3
+ "version": "0.4.1",
4
4
  "type": "module",
5
- "description": "OpenCode plugin for Agent File Tools (AFT) — tree-sitter powered code analysis",
5
+ "description": "OpenCode plugin for Agent File Tools (AFT) — tree-sitter and lsp powered code analysis",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "license": "MIT",
@@ -27,11 +27,11 @@
27
27
  "zod": "^4.1.8"
28
28
  },
29
29
  "optionalDependencies": {
30
- "@cortexkit/aft-darwin-arm64": "0.2.0",
31
- "@cortexkit/aft-darwin-x64": "0.2.0",
32
- "@cortexkit/aft-linux-arm64": "0.2.0",
33
- "@cortexkit/aft-linux-x64": "0.2.0",
34
- "@cortexkit/aft-win32-x64": "0.2.0"
30
+ "@cortexkit/aft-darwin-arm64": "0.4.1",
31
+ "@cortexkit/aft-darwin-x64": "0.4.1",
32
+ "@cortexkit/aft-linux-arm64": "0.4.1",
33
+ "@cortexkit/aft-linux-x64": "0.4.1",
34
+ "@cortexkit/aft-win32-x64": "0.4.1"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@types/node": "^22.0.0",
@@ -1,7 +0,0 @@
1
- import type { ToolDefinition } from "@opencode-ai/plugin";
2
- import type { PluginContext } from "../types.js";
3
- /**
4
- * Tool definitions for code editing commands: write, edit_symbol, edit_match, batch.
5
- */
6
- export declare function editingTools(ctx: PluginContext): Record<string, ToolDefinition>;
7
- //# sourceMappingURL=editing.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"editing.d.ts","sourceRoot":"","sources":["../../src/tools/editing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAsBjD;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAgI/E"}
@@ -1,150 +0,0 @@
1
- import { tool } from "@opencode-ai/plugin";
2
- import { queryLspHints } from "../lsp.js";
3
- const z = tool.schema;
4
- /** Valid operations for edit_symbol. */
5
- const editOperationEnum = z
6
- .enum(["replace", "delete", "insert_before", "insert_after"])
7
- .describe("The edit operation to perform on the symbol");
8
- /** Schema for a single batch edit item — either match-replace or line-range. */
9
- const batchEditItem = z.union([
10
- z.object({
11
- match: z.string().describe("Text pattern to find and replace"),
12
- replacement: z.string().describe("Replacement text"),
13
- }),
14
- z.object({
15
- line_start: z.number().describe("Start line number (1-indexed)"),
16
- line_end: z.number().describe("End line number (1-indexed, inclusive)"),
17
- content: z.string().describe("Content to replace the line range with"),
18
- }),
19
- ]);
20
- /**
21
- * Tool definitions for code editing commands: write, edit_symbol, edit_match, batch.
22
- */
23
- export function editingTools(ctx) {
24
- return {
25
- aft_edit: {
26
- description: "Edit files with tree-sitter precision. All modes auto-backup before changes and support dry_run.\n" +
27
- "Modes:\n" +
28
- "- 'symbol': Edit a named symbol (function, class, type) — preferred for code changes. Needs 'symbol', 'operation' (replace/delete/insert_before/insert_after), and 'content'. Response includes context_before/context_after (3 lines each) to detect duplication.\n" +
29
- "- 'match': Find and replace text by content match — use for config values, strings, unnamed code. Needs 'match', 'replacement'. Set replace_all=true to replace ALL occurrences at once. Returns ambiguous_match if multiple hits without occurrence or replace_all. For multi-line matching, use actual newlines in the JSON string value. Supports glob patterns in 'file' (e.g. '**/*.ts') to replace across multiple files at once — returns {files: [...], total_replacements, total_files}.\n" +
30
- "- 'write': Write full file content — for new files or complete rewrites. Needs 'content'.\n" +
31
- "- 'batch': Multiple edits in one file atomically — each edit is {match, replacement} or {line_start, line_end, content} (1-based, inclusive). Supports per-edit 'occurrence' for disambiguation. Set content to empty string to delete lines entirely. line_start == total_lines+1 appends at EOF. line_end is auto-clamped to last line (safe to overshoot).\n" +
32
- "- 'transaction': Atomic multi-file edits with rollback — if any file fails, all revert. Needs 'operations' array of {file, command, ...}.\n" +
33
- "Returns formatted, validation_errors, backup_id.",
34
- args: {
35
- mode: z.enum(["symbol", "match", "write", "batch", "transaction"]).describe("Editing mode"),
36
- file: z
37
- .string()
38
- .optional()
39
- .describe("Path to the file (required for all modes except transaction)"),
40
- // symbol mode
41
- symbol: z.string().optional().describe("Symbol name to edit (symbol mode)"),
42
- operation: editOperationEnum.optional().describe("Edit operation (symbol mode)"),
43
- scope: z
44
- .string()
45
- .optional()
46
- .describe("Qualified scope for disambiguation (e.g. 'ClassName.method')"),
47
- // match mode
48
- match: z.string().optional().describe("Text to find (match mode)"),
49
- replacement: z.string().optional().describe("Replacement text (match mode)"),
50
- occurrence: z
51
- .number()
52
- .describe("Zero-based index selecting which occurrence to replace when multiple matches exist (0 = first, 1 = second, etc). Use with ambiguous_match response. (match mode)"),
53
- replace_all: z
54
- .boolean()
55
- .optional()
56
- .describe("Replace ALL occurrences instead of disambiguating (match mode, default: false)"),
57
- // write + symbol content
58
- content: z
59
- .string()
60
- .optional()
61
- .describe("New content (write mode: full file, symbol mode: replacement body)"),
62
- create_dirs: z
63
- .boolean()
64
- .optional()
65
- .describe("Create parent directories (write mode, default: false)"),
66
- // batch mode
67
- edits: z
68
- .array(batchEditItem)
69
- .optional()
70
- .describe("Array of edits to apply atomically (batch mode)"),
71
- // transaction mode
72
- operations: z
73
- .array(z.object({
74
- file: z.string().describe("File path"),
75
- command: z.enum(["write", "edit_match"]).describe("Operation type"),
76
- content: z.string().optional().describe("Full content for write"),
77
- match: z.string().optional().describe("Text to find for edit_match"),
78
- replacement: z.string().optional().describe("Replacement for edit_match"),
79
- }))
80
- .optional()
81
- .describe("Array of file operations (transaction mode)"),
82
- // common
83
- validate: z
84
- .enum(["syntax", "full"])
85
- .optional()
86
- .describe("Validation level: 'syntax' (default) or 'full'"),
87
- dry_run: z.boolean().optional().describe("Preview as unified diff without modifying files"),
88
- },
89
- execute: async (args, context) => {
90
- const bridge = ctx.pool.getBridge(context.directory);
91
- const mode = args.mode;
92
- const params = {};
93
- if (args.file !== undefined)
94
- params.file = args.file;
95
- if (args.validate !== undefined)
96
- params.validate = args.validate;
97
- if (args.dry_run !== undefined)
98
- params.dry_run = args.dry_run;
99
- let command;
100
- switch (mode) {
101
- case "symbol": {
102
- command = "edit_symbol";
103
- params.symbol = args.symbol;
104
- params.operation = args.operation;
105
- if (args.content !== undefined)
106
- params.content = args.content;
107
- if (args.scope !== undefined)
108
- params.scope = args.scope;
109
- const hints = await queryLspHints(ctx.client, args.symbol);
110
- if (hints)
111
- params.lsp_hints = hints;
112
- break;
113
- }
114
- case "match": {
115
- command = "edit_match";
116
- params.match = args.match;
117
- params.replacement = args.replacement;
118
- if (args.occurrence !== undefined)
119
- params.occurrence = Number(args.occurrence);
120
- if (args.replace_all !== undefined)
121
- params.replace_all = args.replace_all;
122
- break;
123
- }
124
- case "write": {
125
- command = "write";
126
- params.content = args.content;
127
- if (args.create_dirs !== undefined)
128
- params.create_dirs = args.create_dirs;
129
- break;
130
- }
131
- case "batch": {
132
- command = "batch";
133
- params.edits = args.edits;
134
- break;
135
- }
136
- case "transaction": {
137
- command = "transaction";
138
- params.operations = args.operations;
139
- break;
140
- }
141
- default:
142
- command = mode;
143
- }
144
- const response = await bridge.send(command, params);
145
- return JSON.stringify(response);
146
- },
147
- },
148
- };
149
- }
150
- //# sourceMappingURL=editing.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"editing.js","sourceRoot":"","sources":["../../src/tools/editing.ts"],"names":[],"mappings":"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"}