skills/use-gdansk/SKILL.md
Adoption and implementation guide for using gdansk in any repository. Use when bootstrapping a new gdansk-backed MCP app, adding a `Ship` widget UI, wiring `ship.mcp(app=...)` with `MCPServer`, configuring the frontend package with `@gdansk/vite`, adding metadata or structured output, registering extra `@mcp.tool` tools on the same server, or mounting the MCP app inside FastAPI.
npx skillsauth add mplemay/gdansk use-gdanskInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this workflow when the job is to adopt gdansk in a repository or extend an existing gdansk integration with new widgets or server capabilities. Keep the implementation on gdansk's public API surface. Do not send the user into gdansk internals to figure out how to wire the feature.
Choose one primary path before making edits:
@ship.widget(...) tool and widget entry.widgets/<name>/widget.tsx or widget.jsx.@ship.widget(path=Path(".../widget.tsx"), name=...).structured_output=True.@mcp.tool(...) tools on the same MCPServer.If the request is primarily about a broken existing integration, switch to $debug-gdansk.
Fail early on missing package structure before writing feature code.
gdansk and targets a supported Python version.package.jsonvite.config.tswidgets/"type": "module".package.json includes:
@gdansk/vitevite@vitejs/plugin-reactreactreact-dom@modelcontextprotocol/ext-appsuv run deno install from that package directory and update deno.lock
when the repo tracks it.Use quickstart.md for the canonical baseline layout and minimum files. Use adoption-checklist.md for compatibility and dependency expectations.
Use the public integration points directly:
ship = Ship(vite=Vite(Path(...))) with the frontend package root, not the widget directory.@ship.widget(path=Path("hello/widget.tsx"), name="hello").path= relative to widgets/ inside the frontend package root.MCPServer lifespan that enters async with ship.mcp(app=app, watch=...).@gdansk/vite in vite.config.ts and compose it with the framework plugins you
need.@ alias to the frontend package root; only add a manual @ alias when you
need a different target.gdansk({ refresh: true }) in real app repos so nearby Python or Jinja edits trigger a full browser reload.Vite(Path(...), host=..., port=...) to Ship and use the same
values in gdansk(...).Vite(Path(...), build_directory=...) aligned with
gdansk({ buildDirectory: ... }). Widget sources always use widgets/ under the frontend package root.Do not use filesystem-absolute paths for widget registration. Do not assume the frontend package directory must be
named views; any directory passed to Vite(...) is valid.
Choose the smallest integration needed:
Ship(..., metadata=...).@ship.widget(..., metadata=...).structured_output=True on widget tools when the UI needs typed tool data instead of plain text parsing.mcp = MCPServer(...), use @mcp.tool(...) or mcp.add_tool(...).mcp_app = mcp.streamable_http_app(streamable_http_path="/"), run its lifespan from FastAPI, mount it at
/mcp (or your chosen prefix), and mount ship.assets at /<assets_dir> on the same public app.Use integration-options.md for exact implementation shapes.
After implementation:
ship.mcp(..., watch=True) (or watch=False to build on startup,
watch=None when assets are prebuilt).<frontend-package>/dist/.callServerTool(...) calls use the registered MCP tool names.If startup, bundling, or rendering fails, switch to $debug-gdansk.
app.tsx; gdansk expects widget.tsx or widget.jsx.widgets/... as the path prefix in @ship.widget(...).tools
Debugging guide for broken gdansk integrations. Use when a gdansk widget fails to register, the frontend bundle or render runtime does not start, a `Vite` root path is wrong, widget output or CSS is missing, host and port configuration disagree, or an existing gdansk MCP app needs error-driven diagnosis.
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------