@cortexkit/aft-opencode 0.2.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.
Files changed (69) hide show
  1. package/dist/bridge.d.ts +43 -0
  2. package/dist/bridge.d.ts.map +1 -0
  3. package/dist/bridge.js +194 -0
  4. package/dist/bridge.js.map +1 -0
  5. package/dist/config.d.ts +42 -0
  6. package/dist/config.d.ts.map +1 -0
  7. package/dist/config.js +180 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/downloader.d.ts +32 -0
  10. package/dist/downloader.d.ts.map +1 -0
  11. package/dist/downloader.js +140 -0
  12. package/dist/downloader.js.map +1 -0
  13. package/dist/index.d.ts +21 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +62 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/lsp.d.ts +32 -0
  18. package/dist/lsp.d.ts.map +1 -0
  19. package/dist/lsp.js +71 -0
  20. package/dist/lsp.js.map +1 -0
  21. package/dist/pool.d.ts +33 -0
  22. package/dist/pool.d.ts.map +1 -0
  23. package/dist/pool.js +86 -0
  24. package/dist/pool.js.map +1 -0
  25. package/dist/resolver.d.ts +36 -0
  26. package/dist/resolver.d.ts.map +1 -0
  27. package/dist/resolver.js +122 -0
  28. package/dist/resolver.js.map +1 -0
  29. package/dist/tools/ast.d.ts +9 -0
  30. package/dist/tools/ast.d.ts.map +1 -0
  31. package/dist/tools/ast.js +102 -0
  32. package/dist/tools/ast.js.map +1 -0
  33. package/dist/tools/editing.d.ts +7 -0
  34. package/dist/tools/editing.d.ts.map +1 -0
  35. package/dist/tools/editing.js +150 -0
  36. package/dist/tools/editing.js.map +1 -0
  37. package/dist/tools/imports.d.ts +7 -0
  38. package/dist/tools/imports.d.ts.map +1 -0
  39. package/dist/tools/imports.js +67 -0
  40. package/dist/tools/imports.js.map +1 -0
  41. package/dist/tools/lsp.d.ts +8 -0
  42. package/dist/tools/lsp.d.ts.map +1 -0
  43. package/dist/tools/lsp.js +120 -0
  44. package/dist/tools/lsp.js.map +1 -0
  45. package/dist/tools/navigation.d.ts +7 -0
  46. package/dist/tools/navigation.d.ts.map +1 -0
  47. package/dist/tools/navigation.js +46 -0
  48. package/dist/tools/navigation.js.map +1 -0
  49. package/dist/tools/reading.d.ts +7 -0
  50. package/dist/tools/reading.d.ts.map +1 -0
  51. package/dist/tools/reading.js +103 -0
  52. package/dist/tools/reading.js.map +1 -0
  53. package/dist/tools/refactoring.d.ts +7 -0
  54. package/dist/tools/refactoring.d.ts.map +1 -0
  55. package/dist/tools/refactoring.js +80 -0
  56. package/dist/tools/refactoring.js.map +1 -0
  57. package/dist/tools/safety.d.ts +8 -0
  58. package/dist/tools/safety.d.ts.map +1 -0
  59. package/dist/tools/safety.js +53 -0
  60. package/dist/tools/safety.js.map +1 -0
  61. package/dist/tools/structure.d.ts +8 -0
  62. package/dist/tools/structure.d.ts.map +1 -0
  63. package/dist/tools/structure.js +107 -0
  64. package/dist/tools/structure.js.map +1 -0
  65. package/dist/types.d.ts +13 -0
  66. package/dist/types.d.ts.map +1 -0
  67. package/dist/types.js +2 -0
  68. package/dist/types.js.map +1 -0
  69. package/package.json +40 -0
@@ -0,0 +1,7 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,150 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editing.js","sourceRoot":"","sources":["../../src/tools/editing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ToolDefinition } from "@opencode-ai/plugin";
2
+ import type { PluginContext } from "../types.js";
3
+ /**
4
+ * Tool definitions for import management commands: add_import, remove_import, organize_imports.
5
+ */
6
+ export declare function importTools(ctx: PluginContext): Record<string, ToolDefinition>;
7
+ //# sourceMappingURL=imports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imports.d.ts","sourceRoot":"","sources":["../../src/tools/imports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAwD9E"}
@@ -0,0 +1,67 @@
1
+ import { tool } from "@opencode-ai/plugin";
2
+ const z = tool.schema;
3
+ /**
4
+ * Tool definitions for import management commands: add_import, remove_import, organize_imports.
5
+ */
6
+ export function importTools(ctx) {
7
+ return {
8
+ aft_import: {
9
+ description: "Language-aware import management. Supports TS, JS, TSX, Python, Rust, and Go.\n" +
10
+ "Ops:\n" +
11
+ "- 'add': Add an import. Auto-detects group (stdlib/external/internal), deduplicates. Needs 'module', optional 'names', 'default_import', 'type_only'.\n" +
12
+ "- 'remove': Remove an import or a specific name from one. Needs 'module', optional 'name' to remove a single named import.\n" +
13
+ "- 'organize': Re-sort and re-group all imports by language convention, deduplicate.\n" +
14
+ "All ops need 'file'. Returns formatted, validation_errors.",
15
+ args: {
16
+ op: z.enum(["add", "remove", "organize"]).describe("Import operation"),
17
+ file: z.string().describe("Path to the file"),
18
+ module: z
19
+ .string()
20
+ .optional()
21
+ .describe("Module path (required for add, remove — e.g. 'react', './utils', 'std::fmt')"),
22
+ names: z
23
+ .array(z.string())
24
+ .optional()
25
+ .describe("Named imports to add (e.g. ['useState', 'useEffect'])"),
26
+ default_import: z.string().optional().describe("Default import name (e.g. 'React')"),
27
+ type_only: z.boolean().optional().describe("Type-only import (TS only, default: false)"),
28
+ name: z
29
+ .string()
30
+ .optional()
31
+ .describe("Specific named import to remove (for remove op; omit to remove entire import)"),
32
+ validate: z
33
+ .enum(["syntax", "full"])
34
+ .optional()
35
+ .describe("Validation level: 'syntax' (default) or 'full'"),
36
+ dry_run: z.boolean().optional().describe("Preview without modifying the file"),
37
+ },
38
+ execute: async (args, context) => {
39
+ const bridge = ctx.pool.getBridge(context.directory);
40
+ const op = args.op;
41
+ const commandMap = {
42
+ add: "add_import",
43
+ remove: "remove_import",
44
+ organize: "organize_imports",
45
+ };
46
+ const params = { file: args.file };
47
+ if (args.module !== undefined)
48
+ params.module = args.module;
49
+ if (args.names !== undefined)
50
+ params.names = args.names;
51
+ if (args.default_import !== undefined)
52
+ params.default_import = args.default_import;
53
+ if (args.type_only !== undefined)
54
+ params.type_only = args.type_only;
55
+ if (args.name !== undefined)
56
+ params.name = args.name;
57
+ if (args.validate !== undefined)
58
+ params.validate = args.validate;
59
+ if (args.dry_run !== undefined)
60
+ params.dry_run = args.dry_run;
61
+ const response = await bridge.send(commandMap[op], params);
62
+ return JSON.stringify(response);
63
+ },
64
+ },
65
+ };
66
+ }
67
+ //# sourceMappingURL=imports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imports.js","sourceRoot":"","sources":["../../src/tools/imports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ToolDefinition } from "@opencode-ai/plugin";
2
+ import type { PluginContext } from "../types.js";
3
+ /**
4
+ * Tool definitions for LSP commands: diagnostics, hover, goto_definition,
5
+ * find_references, prepare_rename, rename.
6
+ */
7
+ export declare function lspTools(ctx: PluginContext): Record<string, ToolDefinition>;
8
+ //# sourceMappingURL=lsp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lsp.d.ts","sourceRoot":"","sources":["../../src/tools/lsp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CA6H3E"}
@@ -0,0 +1,120 @@
1
+ import { tool } from "@opencode-ai/plugin";
2
+ const z = tool.schema;
3
+ /**
4
+ * Tool definitions for LSP commands: diagnostics, hover, goto_definition,
5
+ * find_references, prepare_rename, rename.
6
+ */
7
+ export function lspTools(ctx) {
8
+ return {
9
+ aft_lsp_diagnostics: {
10
+ description: "Get errors, warnings, hints from language server. " +
11
+ "Returns diagnostics from LSP servers (typescript-language-server, pyright, rust-analyzer, gopls). " +
12
+ "Lazily spawns the appropriate server on first use. " +
13
+ "For files, provide 'file' path. For directories, provide 'directory' path. " +
14
+ "Use 'severity' to filter (error/warning/information/hint/all). " +
15
+ "Use 'wait_ms' (default 0, max 10000) to wait for fresh diagnostics after an edit.",
16
+ args: {
17
+ file: z.string().optional().describe("Absolute path to file to get diagnostics for"),
18
+ directory: z
19
+ .string()
20
+ .optional()
21
+ .describe("Absolute path to directory to get diagnostics for all files under it"),
22
+ severity: z
23
+ .enum(["error", "warning", "information", "hint", "all"])
24
+ .optional()
25
+ .describe("Filter by severity level (default: all)"),
26
+ wait_ms: z
27
+ .number()
28
+ .optional()
29
+ .describe("Wait N milliseconds for fresh diagnostics before returning (max 10000, default 0)"),
30
+ },
31
+ execute: async (args, context) => {
32
+ const bridge = ctx.pool.getBridge(context.directory);
33
+ const result = await bridge.send("lsp_diagnostics", args);
34
+ return JSON.stringify(result);
35
+ },
36
+ },
37
+ aft_lsp_hover: {
38
+ description: "Get type information and documentation for a symbol at a position. " +
39
+ "Returns hover content (type signatures, JSDoc, docstrings) from the language server. " +
40
+ "Line and character are 1-based.",
41
+ args: {
42
+ file: z.string().describe("Absolute path to the file"),
43
+ line: z.number().describe("1-based line number"),
44
+ character: z.number().describe("1-based column number"),
45
+ },
46
+ execute: async (args, context) => {
47
+ const bridge = ctx.pool.getBridge(context.directory);
48
+ const result = await bridge.send("lsp_hover", args);
49
+ return JSON.stringify(result);
50
+ },
51
+ },
52
+ aft_lsp_goto_definition: {
53
+ description: "Jump to symbol definition. Find WHERE something is defined. " +
54
+ "Returns definition location(s) with file path and 1-based line/column. " +
55
+ "Works across files — follows imports, type references, function calls.",
56
+ args: {
57
+ file: z.string().describe("Absolute path to the file"),
58
+ line: z.number().describe("1-based line number"),
59
+ character: z.number().describe("1-based column number"),
60
+ },
61
+ execute: async (args, context) => {
62
+ const bridge = ctx.pool.getBridge(context.directory);
63
+ const result = await bridge.send("lsp_goto_definition", args);
64
+ return JSON.stringify(result);
65
+ },
66
+ },
67
+ aft_lsp_find_references: {
68
+ description: "Find ALL usages/references of a symbol across the entire workspace. " +
69
+ "Returns all locations where the symbol is used, with 1-based line/column. " +
70
+ "Use before renaming or changing a function's signature to understand impact.",
71
+ args: {
72
+ file: z.string().describe("Absolute path to the file"),
73
+ line: z.number().describe("1-based line number"),
74
+ character: z.number().describe("1-based column number"),
75
+ include_declaration: z
76
+ .boolean()
77
+ .optional()
78
+ .describe("Include the declaration itself (default: true)"),
79
+ },
80
+ execute: async (args, context) => {
81
+ const bridge = ctx.pool.getBridge(context.directory);
82
+ const result = await bridge.send("lsp_find_references", args);
83
+ return JSON.stringify(result);
84
+ },
85
+ },
86
+ aft_lsp_prepare_rename: {
87
+ description: "Check if rename is valid at a position. Use BEFORE aft_lsp_rename. " +
88
+ "Returns whether the symbol can be renamed, the current name (placeholder), " +
89
+ "and the range of the symbol. Line and character are 1-based.",
90
+ args: {
91
+ file: z.string().describe("Absolute path to the file"),
92
+ line: z.number().describe("1-based line number"),
93
+ character: z.number().describe("1-based column number"),
94
+ },
95
+ execute: async (args, context) => {
96
+ const bridge = ctx.pool.getBridge(context.directory);
97
+ const result = await bridge.send("lsp_prepare_rename", args);
98
+ return JSON.stringify(result);
99
+ },
100
+ },
101
+ aft_lsp_rename: {
102
+ description: "Rename symbol across entire workspace via LSP. " +
103
+ "APPLIES changes to all files atomically with backup and rollback on failure. " +
104
+ "Always call aft_lsp_prepare_rename first to verify the rename is valid. " +
105
+ "Line and character are 1-based.",
106
+ args: {
107
+ file: z.string().describe("Absolute path to the file"),
108
+ line: z.number().describe("1-based line number"),
109
+ character: z.number().describe("1-based column number"),
110
+ new_name: z.string().describe("New name for the symbol"),
111
+ },
112
+ execute: async (args, context) => {
113
+ const bridge = ctx.pool.getBridge(context.directory);
114
+ const result = await bridge.send("lsp_rename", args);
115
+ return JSON.stringify(result);
116
+ },
117
+ },
118
+ };
119
+ }
120
+ //# sourceMappingURL=lsp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lsp.js","sourceRoot":"","sources":["../../src/tools/lsp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ToolDefinition } from "@opencode-ai/plugin";
2
+ import type { PluginContext } from "../types.js";
3
+ /**
4
+ * Tool definitions for navigation commands: configure, call_tree, callers, trace_to, impact, and trace_data.
5
+ */
6
+ export declare function navigationTools(ctx: PluginContext): Record<string, ToolDefinition>;
7
+ //# sourceMappingURL=navigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/tools/navigation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAwClF"}
@@ -0,0 +1,46 @@
1
+ import { tool } from "@opencode-ai/plugin";
2
+ const z = tool.schema;
3
+ /**
4
+ * Tool definitions for navigation commands: configure, call_tree, callers, trace_to, impact, and trace_data.
5
+ */
6
+ export function navigationTools(ctx) {
7
+ return {
8
+ aft_navigate: {
9
+ description: "Navigate code structure across files using call graph analysis.\n" +
10
+ "Modes:\n" +
11
+ "- 'call_tree': See what a function calls (forward). Use to understand dependencies before modifying a function.\n" +
12
+ "- 'callers': Find all call sites of a symbol. Use before renaming or changing a function's signature.\n" +
13
+ "- 'trace_to': Trace how execution reaches a function from entry points (routes, exports, main). Use to understand context around deeply-nested code.\n" +
14
+ "- 'impact': Analyze what breaks if a symbol changes. Returns affected callers with signatures and entry point status.\n" +
15
+ "- 'trace_data': Follow a value through variable assignments and function parameters across files. Needs 'expression' arg.",
16
+ args: {
17
+ mode: z
18
+ .enum(["call_tree", "callers", "trace_to", "impact", "trace_data"])
19
+ .describe("Navigation mode"),
20
+ file: z.string().describe("Path to the source file containing the symbol"),
21
+ symbol: z.string().describe("Name of the symbol to analyze"),
22
+ depth: z
23
+ .number()
24
+ .describe("Max traversal depth (default: call_tree=5, callers=1, trace_to=10, impact=5, trace_data=5)"),
25
+ expression: z
26
+ .string()
27
+ .optional()
28
+ .describe("Expression to track through data flow (required for trace_data mode)"),
29
+ },
30
+ execute: async (args, context) => {
31
+ const bridge = ctx.pool.getBridge(context.directory);
32
+ const params = {
33
+ file: args.file,
34
+ symbol: args.symbol,
35
+ };
36
+ if (args.depth !== undefined)
37
+ params.depth = Number(args.depth);
38
+ if (args.expression !== undefined)
39
+ params.expression = args.expression;
40
+ const response = await bridge.send(args.mode, params);
41
+ return JSON.stringify(response);
42
+ },
43
+ },
44
+ };
45
+ }
46
+ //# sourceMappingURL=navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../src/tools/navigation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAG3C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;AAEtB;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAkB;IAChD,OAAO;QACL,YAAY,EAAE;YACZ,WAAW,EACT,mEAAmE;gBACnE,UAAU;gBACV,mHAAmH;gBACnH,yGAAyG;gBACzG,wJAAwJ;gBACxJ,yHAAyH;gBACzH,2HAA2H;YAC7H,IAAI,EAAE;gBACJ,IAAI,EAAE,CAAC;qBACJ,IAAI,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;qBAClE,QAAQ,CAAC,iBAAiB,CAAC;gBAC9B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;gBAC1E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;gBAC5D,KAAK,EAAE,CAAC;qBACL,MAAM,EAAE;qBACR,QAAQ,CACP,4FAA4F,CAC7F;gBACH,UAAU,EAAE,CAAC;qBACV,MAAM,EAAE;qBACR,QAAQ,EAAE;qBACV,QAAQ,CAAC,sEAAsE,CAAC;aACpF;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAmB,EAAE;gBAChD,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACrD,MAAM,MAAM,GAA4B;oBACtC,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,MAAM,EAAE,IAAI,CAAC,MAAM;iBACpB,CAAC;gBACF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;oBAAE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAChE,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;oBAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;gBACvE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAc,EAAE,MAAM,CAAC,CAAC;gBAChE,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAClC,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ToolDefinition } from "@opencode-ai/plugin";
2
+ import type { PluginContext } from "../types.js";
3
+ /**
4
+ * Tool definitions for code reading commands: outline and zoom.
5
+ */
6
+ export declare function readingTools(ctx: PluginContext): Record<string, ToolDefinition>;
7
+ //# sourceMappingURL=reading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reading.d.ts","sourceRoot":"","sources":["../../src/tools/reading.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAsG/E"}
@@ -0,0 +1,103 @@
1
+ import { tool } from "@opencode-ai/plugin";
2
+ import { queryLspHints } from "../lsp.js";
3
+ const z = tool.schema;
4
+ /**
5
+ * Tool definitions for code reading commands: outline and zoom.
6
+ */
7
+ export function readingTools(ctx) {
8
+ return {
9
+ aft_outline: {
10
+ description: "Get a structural outline of a source file — lists all top-level symbols with their kind, name, line range, and visibility. Use this to understand file structure before editing. " +
11
+ "Supports single file (via 'file') or multiple files in one call (via 'files' array).\n" +
12
+ "Each entry includes 'name', 'kind' (function/class/struct/heading/etc), 'range', 'signature', and 'members' (nested children like methods in classes or sub-headings in markdown).\n" +
13
+ "For Markdown files (.md, .mdx): returns heading hierarchy — h1/h2/h3 as nested symbols with section ranges covering all content until the next same-level heading.",
14
+ args: {
15
+ file: z
16
+ .string()
17
+ .optional()
18
+ .describe("Path to a single source file to outline (relative to project root or absolute)"),
19
+ files: z
20
+ .array(z.string())
21
+ .optional()
22
+ .describe("Array of file paths to outline in one call — returns per-file results"),
23
+ },
24
+ execute: async (args, context) => {
25
+ const bridge = ctx.pool.getBridge(context.directory);
26
+ if (Array.isArray(args.files) && args.files.length > 0) {
27
+ const response = await bridge.send("outline", { files: args.files });
28
+ return JSON.stringify(response);
29
+ }
30
+ const response = await bridge.send("outline", { file: args.file });
31
+ return JSON.stringify(response);
32
+ },
33
+ },
34
+ aft_zoom: {
35
+ description: "Deep-inspect symbols or read arbitrary line ranges from a source file.\n" +
36
+ "Returns full source, surrounding context lines, and call-graph annotations (calls_out, called_by) for code symbols.\n" +
37
+ "Supports three access patterns:\n" +
38
+ "- 'symbol': Inspect a named symbol (function, class, type, or markdown heading)\n" +
39
+ "- 'symbols': Inspect multiple symbols in one call — returns an array of results\n" +
40
+ "- 'start_line' + 'end_line': Read arbitrary line range (1-based) without needing a symbol name\n" +
41
+ "For Markdown: use heading text as symbol name (e.g. symbol='Architecture') to read entire section.",
42
+ args: {
43
+ file: z.string().describe("Path to the source file containing the symbol"),
44
+ symbol: z.string().optional().describe("Name of a single symbol to inspect"),
45
+ symbols: z
46
+ .array(z.string())
47
+ .optional()
48
+ .describe("Array of symbol names to inspect in one call — returns results for each"),
49
+ context_lines: z
50
+ .number()
51
+ .optional()
52
+ .describe("Number of lines of context to include above and below the symbol (default: 3)"),
53
+ scope: z
54
+ .string()
55
+ .optional()
56
+ .describe("Qualified scope to disambiguate symbols with the same name (e.g. 'ClassName.method')"),
57
+ start_line: z.number().optional().describe("Start line (1-based) for line-range read mode"),
58
+ end_line: z
59
+ .number()
60
+ .optional()
61
+ .describe("End line (1-based, inclusive) for line-range read mode"),
62
+ },
63
+ execute: async (args, context) => {
64
+ const bridge = ctx.pool.getBridge(context.directory);
65
+ // Batch symbols mode: zoom into multiple symbols in one call
66
+ if (Array.isArray(args.symbols) && args.symbols.length > 0) {
67
+ const results = await Promise.all(args.symbols.map(async (sym) => {
68
+ const params = { file: args.file, symbol: sym };
69
+ if (args.context_lines !== undefined)
70
+ params.context_lines = Number(args.context_lines);
71
+ if (args.scope !== undefined)
72
+ params.scope = args.scope;
73
+ const hints = await queryLspHints(ctx.client, sym);
74
+ if (hints)
75
+ params.lsp_hints = hints;
76
+ return bridge.send("zoom", params);
77
+ }));
78
+ return JSON.stringify(results);
79
+ }
80
+ // Single symbol or line-range mode
81
+ const params = { file: args.file };
82
+ if (args.symbol !== undefined)
83
+ params.symbol = args.symbol;
84
+ if (args.context_lines !== undefined)
85
+ params.context_lines = Number(args.context_lines);
86
+ if (args.scope !== undefined)
87
+ params.scope = args.scope;
88
+ if (args.start_line !== undefined)
89
+ params.start_line = Number(args.start_line);
90
+ if (args.end_line !== undefined)
91
+ params.end_line = Number(args.end_line);
92
+ if (args.symbol) {
93
+ const hints = await queryLspHints(ctx.client, args.symbol);
94
+ if (hints)
95
+ params.lsp_hints = hints;
96
+ }
97
+ const response = await bridge.send("zoom", params);
98
+ return JSON.stringify(response);
99
+ },
100
+ },
101
+ };
102
+ }
103
+ //# sourceMappingURL=reading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reading.js","sourceRoot":"","sources":["../../src/tools/reading.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ToolDefinition } from "@opencode-ai/plugin";
2
+ import type { PluginContext } from "../types.js";
3
+ /**
4
+ * Tool definitions for refactoring commands: move_symbol, extract_function, inline_symbol.
5
+ */
6
+ export declare function refactoringTools(ctx: PluginContext): Record<string, ToolDefinition>;
7
+ //# sourceMappingURL=refactoring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refactoring.d.ts","sourceRoot":"","sources":["../../src/tools/refactoring.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAyEnF"}