Search and summarize material from the Acme research service.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Create an OpenCode plugin for iPolloWork with custom tools and hooks, which run code at specific events. The skill builds the TypeScript file and adds it to the configuration so it can load after a session restart.
한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.
Create an OpenCode plugin for iPolloWork. Scaffolds the plugin file with the correct API shape, tool definitions, and hook registration. Use when the user asks to 'create a plugin', 'write a plugin', or 'make a plugin that does X'.
설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
Scaffold a working OpenCode plugin for use in iPolloWork.
An OpenCode plugin is an async factory function that returns a hooks object.
Plugins can live in:
.opencode/plugins/my-plugin.ts (auto-discovered)~/.config/opencode/plugins/my-plugin.tsopencode.json plugin arrayfile: or https: path in the plugin arrayimport { z } from "zod";
export default async () => ({
tool: {
my_tool_name: {
description: "What this tool does.",
args: z.object({
input: z.string().describe("The input parameter."),
}).shape, // NOTE: .shape, not the ZodObject itself
async execute(args: { input: string }) {
// Your logic here. Can use fetch(), fs, child_process, etc.
return `Result: ${args.input}`;
},
},
},
});
zodSchema.shape (a ZodRawShape), not the ZodObject.execute returns a string or { output: string; metadata?: Record<string, unknown> }.fetch() works — plugins run in-process inside the OpenCode runtime.process.env is accessible — use env vars for secrets/config.{
// Modify the system prompt
"experimental.chat.system.transform": async (input, output: { system: string[] }) => {
output.system.push("Extra instruction for the agent.");
},
// Define tools the agent can call
tool: {
tool_name: { description, args, execute },
},
// Run code before/after a tool executes
"tool.execute.before": async ({ tool, args }) => { /* ... */ },
"tool.execute.after": async ({ tool, args, result }) => { /* ... */ },
// React to lifecycle events
event: async ({ event }) => { /* ... */ },
}
Add to opencode.json:
{
"plugin": [
".opencode/plugins/my-plugin.ts"
]
}
Or install from npm:
{
"plugin": [
"my-published-plugin"
]
}
OpenCode plugins are NOT the same as Anthropic's plugin format. Key differences:
| Aspect | OpenCode Plugin | Anthropic Plugin |
|---|---|---|
| Entry point | Async factory function | Manifest JSON |
| Tool args | Zod schema .shape | JSON Schema |
| Runtime | In-process (Bun/Node) | Sandboxed container |
| Auth | process.env | OAuth/API key in manifest |
| Distribution | npm / file path / URL | Anthropic marketplace |
To adapt an Anthropic plugin for OpenCode:
opencode.json provider config.import { z } from "zod";
export default async () => ({
"experimental.chat.system.transform": async (_input: unknown, output: { system: string[] }) => {
output.system.push("You have access to a note-taking system. Use save_note and list_notes.");
},
tool: {
save_note: {
description: "Save a note with a title and body.",
args: z.object({
title: z.string().describe("Note title"),
body: z.string().describe("Note content"),
}).shape,
async execute(args: { title: string; body: string }) {
const fs = await import("node:fs/promises");
const path = `.opencode/notes/${args.title.replace(/[^a-zA-Z0-9-_]/g, "_")}.md`;
await fs.mkdir(".opencode/notes", { recursive: true });
await fs.writeFile(path, `# ${args.title}\n\n${args.body}\n`);
return `Saved note: ${path}`;
},
},
list_notes: {
description: "List all saved notes.",
args: {},
async execute() {
const fs = await import("node:fs/promises");
try {
const files = await fs.readdir(".opencode/notes");
return files.filter(f => f.endsWith(".md")).join("\n") || "No notes yet.";
} catch {
return "No notes yet.";
}
},
},
},
});
When the user describes what they want the plugin to do:
.opencode/plugins/<name>.ts with the plugin code.opencode.json plugin array if not already present.아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
Search and summarize material from the Acme research service.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Agent-first screenshots — an agent drives the real app via CDP and produces clean, defect-free product screenshots (newsletters, landing pages, social, decks, PR). Dual-channel verification (DOM + pixels + vision) in a capture loop. Use for any "take/redo screenshots of the app" task.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Find the right official documentation before answering technical questions. It identifies the library and version, retrieves focused references and examples, and explains relevant APIs while separating documented behavior from inference.
한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.
Use the current project dependency versions and Context7 documentation to implement or upgrade code without importing APIs from a different release line.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Launch a standalone Chrome browser in a Daytona sandbox and control it through CDP, a browser debugging connection. Use it to complete sign-in, OAuth authorization, and web administration flows, then verify the visible results.
한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.
Set up the iPolloWork server in Daytona, connect an Electron desktop client through public preview URLs, and check service health and logs. Supports cloud feature validation with separate server and desktop test environments.
한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.