@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
package/dist/tools/ast.js CHANGED
@@ -5,98 +5,188 @@
5
5
  */
6
6
  import { tool } from "@opencode-ai/plugin";
7
7
  const z = tool.schema;
8
- const SUPPORTED_LANGS = [
9
- "bash",
10
- "c",
11
- "cpp",
12
- "csharp",
13
- "css",
14
- "elixir",
15
- "go",
16
- "haskell",
17
- "html",
18
- "java",
19
- "javascript",
20
- "json",
21
- "kotlin",
22
- "lua",
23
- "nix",
24
- "php",
25
- "python",
26
- "ruby",
27
- "rust",
28
- "scala",
29
- "solidity",
30
- "swift",
31
- "typescript",
32
- "tsx",
33
- "yaml",
34
- ];
8
+ import { askEditPermission, resolveAbsolutePath, resolveRelativePatterns, workspacePattern, } from "./permissions.js";
9
+ /** Show output in opencode UI via metadata callback. */
10
+ function showOutputToUser(context, output) {
11
+ const ctx = context;
12
+ ctx.metadata?.({ metadata: { output } });
13
+ }
14
+ /** Provide helpful hints when a pattern returns 0 matches. */
15
+ function getEmptyResultHint(pattern, lang) {
16
+ const src = pattern.trim();
17
+ if (lang === "python") {
18
+ if (src.startsWith("class ") && src.endsWith(":")) {
19
+ return `Hint: Python class patterns need a body. Try: "${src.slice(0, -1)}" or "${src}\n $$$"`;
20
+ }
21
+ if ((src.startsWith("def ") || src.startsWith("async def ")) && src.endsWith(":")) {
22
+ return `Hint: Python function patterns need a body. Try adding "\\n $$$" after the colon.`;
23
+ }
24
+ }
25
+ if (["javascript", "typescript", "tsx"].includes(lang)) {
26
+ if (/^(export\s+)?(async\s+)?function\s+\$[A-Z_]+\s*$/i.test(src)) {
27
+ return `Hint: Function patterns need params and body. Try: "function $NAME($$$) { $$$ }"`;
28
+ }
29
+ }
30
+ return null;
31
+ }
32
+ const SUPPORTED_LANGS = ["typescript", "tsx", "javascript", "python", "rust", "go"];
35
33
  export function astTools(ctx) {
36
- return {
37
- aft_ast_search: {
38
- description: "Search code patterns across filesystem using AST-aware matching. Supports 25 languages. " +
39
- "Use meta-variables: $VAR (single node), $$$ (multiple nodes). " +
40
- "IMPORTANT: Patterns must be complete AST nodes (valid code). " +
41
- "For functions, include params and body: 'export async function $NAME($$$) { $$$ }' not 'export async function $NAME'. " +
42
- "Examples: 'console.log($MSG)', 'def $FUNC($$$):', 'async function $NAME($$$)'",
43
- args: {
44
- pattern: z
45
- .string()
46
- .describe("AST pattern with meta-variables ($VAR, $$$). Must be complete AST node."),
47
- lang: z.enum(SUPPORTED_LANGS).describe("Target language"),
48
- paths: z.array(z.string()).optional().describe("Paths to search (default: ['.'])"),
49
- globs: z
50
- .array(z.string())
51
- .optional()
52
- .describe("Include/exclude globs (prefix ! to exclude)"),
53
- context: z.number().optional().describe("Context lines around match"),
54
- },
55
- execute: async (args, context) => {
56
- const bridge = ctx.pool.getBridge(context.directory);
57
- const params = {
58
- pattern: args.pattern,
59
- lang: args.lang,
60
- };
61
- if (args.paths)
62
- params.paths = args.paths;
63
- if (args.globs)
64
- params.globs = args.globs;
65
- if (args.context !== undefined)
66
- params.context = Number(args.context);
67
- const response = await bridge.send("ast_search", params);
68
- return JSON.stringify(response);
69
- },
34
+ const searchTool = {
35
+ description: "Search code patterns across filesystem using AST-aware matching. Supports 6 languages.\n\n" +
36
+ "Use meta-variables: $VAR matches a single AST node, $$$ matches multiple nodes (variadic).\n" +
37
+ "IMPORTANT: Patterns must be complete AST nodes (valid code fragments).\n" +
38
+ "For functions, include params and body: 'export async function $NAME($$$) { $$$ }' not just 'export async function $NAME'.\n\n" +
39
+ "Examples: pattern='console.log($MSG)' lang='typescript', pattern='async function $NAME($$$) { $$$ }' lang='javascript', pattern='def $FUNC($$$): $$$' lang='python'\n\n" +
40
+ "Returns: Text summary — 'Found N match(es) across M file(s)' followed by file:line blocks with matched text and captured meta-variables.",
41
+ args: {
42
+ pattern: z
43
+ .string()
44
+ .describe("AST pattern with meta-variables ($VAR, $$$). Must be complete AST node."),
45
+ lang: z.enum(SUPPORTED_LANGS).describe("Target language"),
46
+ paths: z.array(z.string()).optional().describe("Paths to search (default: ['.'])"),
47
+ globs: z.array(z.string()).optional().describe("Include/exclude globs (prefix ! to exclude)"),
48
+ contextLines: z
49
+ .number()
50
+ .optional()
51
+ .describe("Number of context lines to show around each match"),
52
+ },
53
+ execute: async (args, context) => {
54
+ const bridge = ctx.pool.getBridge(context.directory);
55
+ const params = {
56
+ pattern: args.pattern,
57
+ lang: args.lang,
58
+ };
59
+ if (args.paths)
60
+ params.paths = args.paths;
61
+ if (args.globs)
62
+ params.globs = args.globs;
63
+ if (args.contextLines !== undefined)
64
+ params.context = Number(args.contextLines);
65
+ const response = await bridge.send("ast_search", params);
66
+ // Format output for readability
67
+ const data = response;
68
+ const matchCount = data.total_matches ?? data.matches?.length ?? 0;
69
+ const filesSearched = data.files_searched ?? 0;
70
+ const filesWithMatches = data.files_with_matches ?? filesSearched;
71
+ let output;
72
+ if (matchCount === 0) {
73
+ // Zero-match format is intentionally not documented in the description — it's
74
+ // self-explanatory text and documenting it would bloat the Returns section.
75
+ output = `No matches found (searched ${filesSearched} files)`;
76
+ // Add hints for common pattern mistakes
77
+ const hint = getEmptyResultHint(args.pattern, args.lang);
78
+ if (hint) {
79
+ output += `\n\n${hint}`;
80
+ }
81
+ }
82
+ else {
83
+ output = `Found ${matchCount} match(es) in ${filesWithMatches} file(s) (${filesSearched} searched)\n\n`;
84
+ if (data.matches) {
85
+ for (const m of data.matches) {
86
+ const relFile = m.file ?? "unknown";
87
+ const line = m.line ?? 0;
88
+ output += `${relFile}:${line}\n`;
89
+ if (m.text) {
90
+ output += ` ${m.text.trim()}\n`;
91
+ }
92
+ if (m.meta_variables && Object.keys(m.meta_variables).length > 0) {
93
+ for (const [k, v] of Object.entries(m.meta_variables)) {
94
+ output += ` ${k}: ${v}\n`;
95
+ }
96
+ }
97
+ output += "\n";
98
+ }
99
+ }
100
+ }
101
+ // Show output in UI
102
+ showOutputToUser(context, output);
103
+ return output;
70
104
  },
71
- aft_ast_replace: {
72
- description: "Replace code patterns across filesystem with AST-aware rewriting. Dry-run by default. " +
73
- "Use meta-variables in rewrite to preserve matched content. " +
74
- "Example: pattern='console.log($MSG)' rewrite='logger.info($MSG)'",
75
- args: {
76
- pattern: z.string().describe("AST pattern to match"),
77
- rewrite: z.string().describe("Replacement pattern (can use $VAR from pattern)"),
78
- lang: z.enum(SUPPORTED_LANGS).describe("Target language"),
79
- paths: z.array(z.string()).optional().describe("Paths to search"),
80
- globs: z.array(z.string()).optional().describe("Include/exclude globs"),
81
- dryRun: z.boolean().optional().describe("Preview changes without applying (default: true)"),
82
- },
83
- execute: async (args, context) => {
84
- const bridge = ctx.pool.getBridge(context.directory);
85
- const params = {
86
- pattern: args.pattern,
87
- rewrite: args.rewrite,
88
- lang: args.lang,
89
- };
90
- if (args.paths)
91
- params.paths = args.paths;
92
- if (args.globs)
93
- params.globs = args.globs;
94
- // Default to dry_run=true for safety
95
- params.dry_run = args.dryRun !== false;
96
- const response = await bridge.send("ast_replace", params);
97
- return JSON.stringify(response);
98
- },
105
+ };
106
+ const replaceTool = {
107
+ description: "Replace code patterns across filesystem with AST-aware rewriting. Applies changes by default — set dryRun=true to preview.\n\n" +
108
+ "Use meta-variables in the rewrite pattern to preserve matched content from the pattern.\n" +
109
+ "IMPORTANT: Patterns must be complete AST nodes (valid code fragments).\n\n" +
110
+ "Example: pattern='console.log($MSG)' rewrite='logger.info($MSG)' lang='typescript' replaces all console.log calls with logger.info across TypeScript files.\n\n" +
111
+ "**Warning: This tool modifies files directly.** Use dryRun=true to preview. Consider creating an aft_safety checkpoint before bulk replacements.\n\n" +
112
+ "Returns: Text summary — 'Replaced N match(es) across M file(s)' (or '[DRY RUN] Would replace...') followed by file:line blocks with before/after text.",
113
+ args: {
114
+ pattern: z
115
+ .string()
116
+ .describe("AST pattern with meta-variables ($VAR, $$$). Must be complete AST node."),
117
+ rewrite: z.string().describe("Replacement pattern (can use $VAR from pattern)"),
118
+ lang: z.enum(SUPPORTED_LANGS).describe("Target language"),
119
+ paths: z.array(z.string()).optional().describe("Paths to search (default: ['.'])"),
120
+ globs: z.array(z.string()).optional().describe("Include/exclude globs (prefix ! to exclude)"),
121
+ dryRun: z.boolean().optional().describe("Preview changes without applying (default: false)"),
122
+ },
123
+ execute: async (args, context) => {
124
+ const bridge = ctx.pool.getBridge(context.directory);
125
+ const isDryRun = args.dryRun === true;
126
+ if (!isDryRun) {
127
+ const explicitPaths = Array.isArray(args.paths)
128
+ ? resolveRelativePatterns(context, args.paths)
129
+ : [];
130
+ const positiveGlobs = Array.isArray(args.globs)
131
+ ? args.globs.filter((glob) => !glob.startsWith("!"))
132
+ : [];
133
+ const patterns = [...explicitPaths, ...positiveGlobs];
134
+ const metadata = explicitPaths.length === 1 && positiveGlobs.length === 0 && Array.isArray(args.paths)
135
+ ? { filepath: resolveAbsolutePath(context, args.paths[0]) }
136
+ : {};
137
+ const permissionError = await askEditPermission(context, patterns.length > 0 ? patterns : [workspacePattern(context)], metadata);
138
+ if (permissionError) {
139
+ const output = `Permission denied: ${permissionError}`;
140
+ showOutputToUser(context, output);
141
+ return output;
142
+ }
143
+ }
144
+ const params = {
145
+ pattern: args.pattern,
146
+ rewrite: args.rewrite,
147
+ lang: args.lang,
148
+ };
149
+ if (args.paths)
150
+ params.paths = args.paths;
151
+ if (args.globs)
152
+ params.globs = args.globs;
153
+ params.dry_run = args.dryRun === true;
154
+ const response = await bridge.send("ast_replace", params);
155
+ const data = response;
156
+ const matchCount = data.total_replacements ?? data.total_matches ?? data.matches?.length ?? 0;
157
+ const filesSearched = data.files_searched ?? data.total_files ?? 0;
158
+ const filesWithMatches = data.files_with_matches ?? data.total_files ?? filesSearched;
159
+ let output;
160
+ if (matchCount === 0) {
161
+ output = `No matches found (searched ${filesSearched} files)`;
162
+ }
163
+ else {
164
+ output = isDryRun
165
+ ? `[DRY RUN] Would replace ${matchCount} match(es) in ${filesWithMatches} file(s) (${filesSearched} searched)\n\n`
166
+ : `Replaced ${matchCount} match(es) in ${filesWithMatches} file(s) (${filesSearched} searched)\n\n`;
167
+ if (data.matches) {
168
+ for (const m of data.matches) {
169
+ const relFile = m.file ?? "unknown";
170
+ const line = m.line ?? 0;
171
+ output += `${relFile}:${line}\n`;
172
+ if (m.text && m.replacement) {
173
+ output += ` - ${m.text.trim()}\n`;
174
+ output += ` + ${m.replacement.trim()}\n`;
175
+ }
176
+ output += "\n";
177
+ }
178
+ }
179
+ }
180
+ showOutputToUser(context, output);
181
+ return output;
99
182
  },
100
183
  };
184
+ // When hoisting: register as ast_grep_search/ast_grep_replace (override oh-my-opencode's)
185
+ // When not hoisting: register as aft_ast_search/aft_ast_replace
186
+ const hoisting = ctx.config.hoist_builtin_tools !== false;
187
+ return {
188
+ [hoisting ? "ast_grep_search" : "aft_ast_search"]: searchTool,
189
+ [hoisting ? "ast_grep_replace" : "aft_ast_replace"]: replaceTool,
190
+ };
101
191
  }
102
192
  //# sourceMappingURL=ast.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/tools/ast.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/tools/ast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Hoisted tools that replace opencode's built-in tools (read, write, edit, apply_patch).
3
+ *
4
+ * When hoist_builtin_tools is enabled (default), these tools are registered with
5
+ * the SAME names as opencode's built-in tools, effectively overriding them.
6
+ * When disabled, they're registered with aft_ prefix (e.g., aft_read).
7
+ *
8
+ * All file operations go through AFT's Rust binary for better performance,
9
+ * backup tracking, formatting, and inline diagnostics.
10
+ */
11
+ import type { ToolDefinition } from "@opencode-ai/plugin";
12
+ import type { PluginContext } from "../types.js";
13
+ /**
14
+ * Creates the simple read tool. Registers as "read" when hoisted, "aft_read" when not.
15
+ */
16
+ export declare function createReadTool(ctx: PluginContext): ToolDefinition;
17
+ /**
18
+ * Returns hoisted tools keyed by opencode's built-in names.
19
+ * Overrides: read, write, edit, apply_patch.
20
+ */
21
+ export declare function hoistedTools(ctx: PluginContext): Record<string, ToolDefinition>;
22
+ /**
23
+ * Returns the same tools with aft_ prefix (for when hoisting is disabled).
24
+ */
25
+ export declare function aftPrefixedTools(ctx: PluginContext): Record<string, ToolDefinition>;
26
+ //# sourceMappingURL=hoisted.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hoisted.d.ts","sourceRoot":"","sources":["../../src/tools/hoisted.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAI1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAuEjD;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,cAAc,CAwIjE;AAgqBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAS/E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAuBnF"}