| name | cowart-open-canvas |
| description | Open the Cowart local web service, a tldraw-powered infinite canvas. Use when the user asks to open, launch, view, or work in the Cowart canvas or wants an infinite canvas inside Codex. |
Cowart Open Canvas
Workflow
- Start the local Cowart web service from the Cowart plugin directory, passing the user's current Codex project directory, and keep the process running.
Use the start script in the Cowart plugin's scripts/ folder that matches the operating system. Replace <cowart-plugin-dir> with the actual Cowart plugin install directory (the directory this skill lives in), and <user-codex-project-dir> with the active project directory:
pwsh -File "<cowart-plugin-dir>/scripts/start-canvas.ps1" "<user-codex-project-dir>"
"<cowart-plugin-dir>/scripts/start-canvas.sh" "<user-codex-project-dir>"
Use the active workspace or project directory from the current Codex session for <user-codex-project-dir>. Do not pass the Cowart plugin directory as the project directory.
- Open the resulting local URL in the Codex in-app browser when the Browser tool chain is available.
The default URL is http://127.0.0.1:43217/. If the service output prints a different Local: URL, open that actual URL instead.
Use the Browser plugin's control-in-app-browser skill as the source of truth for opening the in-app browser. The correct model-side flow is:
- Use tool discovery for the Node REPL JavaScript execution tool if it is not already visible. The required callable tool is the
js execution tool, commonly exposed as mcp__node_repl__js; js_reset and js_add_node_module_dir are not sufficient for browser control.
- In a fresh Node REPL session, bootstrap the Browser runtime with the Browser plugin's packaged client. Import
browser-client.mjs from the OpenAI bundled Browser plugin's install directory — resolve its actual path on this machine instead of hardcoding a user name or version. It lives under the Codex plugins cache, for example <codex-plugins-cache>/openai-bundled/browser/<version>/scripts/browser-client.mjs:
const { setupBrowserRuntime } = await import("<browser-client.mjs path>");
await setupBrowserRuntime({ globals: globalThis });
globalThis.browser = await agent.browsers.get("iab");
nodeRepl.write(await browser.documentation());
- Select or create a tab, make the browser visible because this skill is meant to open the canvas for the user, and navigate with
tab.goto(url):
await (await browser.capabilities.get("visibility")).set(true);
globalThis.tab = (await browser.tabs.selected()) ?? await browser.tabs.new();
if ((await tab.url()) !== url) {
await tab.goto(url);
}
Do not call tab.goto(url) if the selected tab is already on the Cowart URL; that reloads the page and can disturb work in progress. If browser control is unavailable, or browser bootstrap fails before navigation with a tool-layer/session-metadata error such as codex/sandbox-state-meta: missing field sandboxPolicy, treat the Cowart service start as successful and give the user the local URL instead of retrying browser control.
Constraints
Do not inspect canvas files, call canvas APIs, run builds, check storage layout, take screenshots, or perform other validation steps unless opening the canvas fails or the user explicitly asks for those checks.