47 lines
1.4 KiB
TypeScript
47 lines
1.4 KiB
TypeScript
import type { Plugin } from "@opencode-ai/plugin";
|
|
|
|
const { checkScoutBlock } = require("./lib/scout-checker.cjs");
|
|
|
|
/**
|
|
* Scout Block Plugin - Prevent access to heavy directories
|
|
*
|
|
* Blocks node_modules, dist, .git, etc. to prevent context overflow.
|
|
* Equivalent to Claude's scout-block.cjs hook.
|
|
*/
|
|
export const ScoutBlockPlugin: Plugin = async ({ directory }) => {
|
|
const ckignorePath = `${directory}/.opencode/.ckignore`;
|
|
const claudeDir = `${directory}/.opencode`;
|
|
|
|
return {
|
|
"tool.execute.before": async (input: any, output: any) => {
|
|
const result = checkScoutBlock({
|
|
toolName: input.tool,
|
|
toolInput: output.args,
|
|
options: {
|
|
ckignorePath,
|
|
claudeDir,
|
|
cwd: directory,
|
|
projectConfigDirName: `.opencode`
|
|
}
|
|
});
|
|
|
|
if (result.blocked) {
|
|
const configPath = result.configPath || `.opencode/.ckignore`;
|
|
let errorMsg = `[Scout Block] Access to '${result.path}' blocked.\n`;
|
|
errorMsg += `Pattern: ${result.pattern}\n`;
|
|
|
|
if (result.isBroadPattern && result.suggestions?.length) {
|
|
errorMsg += `\nSuggested alternatives:\n`;
|
|
result.suggestions.forEach((s: string) => errorMsg += ` - ${s}\n`);
|
|
}
|
|
|
|
errorMsg += `\nTo allow, add '!${result.pattern}' to ${configPath}`;
|
|
|
|
throw new Error(errorMsg);
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
export default ScoutBlockPlugin;
|