Work through notes a person added from the Doska toolbar on a running Symfony or Kirby app. List them with the doska MCP tools, open the file and line on each pinned element, edit, and resolve. Use when the user says "check Doska", "fix the notes", "pending notes", or wants the agent to pick up a note from the page.
php artisan boost:add-skill doska/symfony-bundle
Save this content to: .claude/skills/fix-notes/SKILL.md
# Fix Doska notes
Doska is a dev-only toolbar. On Symfony the note names the Twig file. On Kirby it can also name the content file. Add stores a note. The MCP tools are how an agent reads it. Copy prompt is a separate clipboard path and is not this loop. Delete removes a note from the toolbar and does not resolve it.
The tools are `doska_get_pending`, `doska_get_note`, `doska_acknowledge`, `doska_resolve`, `doska_dismiss`, and `doska_reply`.
If those tools are not in this session, the app has to be running and the endpoint has to be registered on the machine that serves it. Use the app's own dev origin. There is no separate Doska server. Tools show up after a new session. Say so and stop.
Claude Code:
```bash
claude mcp add --transport http doska https://app.test/_doska/mcp
```
Codex, in `~/.codex/config.toml`:
```toml
[mcp_servers.doska]
url = "https://app.test/_doska/mcp"
```
Grok:
```bash
grok mcp add --transport http doska https://app.test/_doska/mcp
```
Kimi Code, in `~/.kimi-code/mcp.json`. A `url` with no `transport` is HTTP:
```json
{
"mcpServers": {
"doska": {
"url": "https://app.test/_doska/mcp"
}
}
}
```
The README section "Connect your agent" has the project-scoped files as well (`.grok/config.toml`, `.kimi-code/mcp.json`).
## Loop
1. Call `doska_get_pending`. It returns pending and acknowledged notes, oldest first. Resolved and dismissed notes are omitted.
2. If the list is empty, say so and stop. Do not poll forever.
3. Call `doska_acknowledge` with the note id before editing.
4. Open each element's `file` and `line`. `location` is the same `file:line` from `data-doska-loc`. The path is relative to the project when the frame scope is `app`. Do not search the project for the element when `file` and `line` are present.
5. Make the smallest change that matches the note. Follow the surrounding code.
6. Call `doska_resolve` with a one-line `summary` of what changed.
7. Take the next note.
A pending note cannot be resolved. A resolved or dismissed note cannot change again.
## When not to resolve
- Call `doska_reply` with `message` when the note is a question. Leave it pending or acknowledged.
- Call `doska_dismiss` with `reason` when it should not be implemented. Give a concrete reason.
- Call `doska_get_note` when the reply thread matters.
`doska_watch_notes` does not exist. Poll `doska_get_pending` only when the user asks to check again.
## Kirby
The toolbar toggle sets `mode` before Add. `content` means edit the content file and field named in the element stack (`content`, `field`, `block`, `type`). Leave the PHP alone. `dev` means edit the PHP snippet or template. Leave the content file alone. A note with no `mode` is a Symfony note. The endpoint is still `POST /_doska/mcp` on that site. PHP snippets have no tag line. `line` is the snippet start, and `caller` is the include.
Doska is a dev-only toolbar. On Symfony the note names the Twig file. On Kirby it can also name the content file. Add stores a note. The MCP tools are how an agent reads it. Copy prompt is a separate clipboard path and is not this loop. Delete removes a note from the toolbar and does not resolve it.
The tools are doska_get_pending, doska_get_note, doska_acknowledge, doska_resolve, doska_dismiss, and doska_reply.
If those tools are not in this session, the app has to be running and the endpoint has to be registered on the machine that serves it. Use the app's own dev origin. There is no separate Doska server. Tools show up after a new session. Say so and stop.
Claude Code:
claude mcp add --transport http doska https://app.test/_doska/mcp
Codex, in ~/.codex/config.toml:
[mcp_servers.doska]
url = "https://app.test/_doska/mcp"
Grok:
grok mcp add --transport http doska https://app.test/_doska/mcp
Kimi Code, in ~/.kimi-code/mcp.json. A url with no transport is HTTP:
{
"mcpServers": {
"doska": {
"url": "https://app.test/_doska/mcp"
}
}
}
The README section "Connect your agent" has the project-scoped files as well (.grok/config.toml, .kimi-code/mcp.json).
doska_get_pending. It returns pending and acknowledged notes, oldest first. Resolved and dismissed notes are omitted.doska_acknowledge with the note id before editing.file and line. location is the same file:line from data-doska-loc. The path is relative to the project when the frame scope is app. Do not search the project for the element when file and line are present.doska_resolve with a one-line summary of what changed.A pending note cannot be resolved. A resolved or dismissed note cannot change again.
doska_reply with message when the note is a question. Leave it pending or acknowledged.doska_dismiss with reason when it should not be implemented. Give a concrete reason.doska_get_note when the reply thread matters.doska_watch_notes does not exist. Poll doska_get_pending only when the user asks to check again.
The toolbar toggle sets mode before Add. content means edit the content file and field named in the element stack (content, field, block, type). Leave the PHP alone. dev means edit the PHP snippet or template. Leave the content file alone. A note with no mode is a Symfony note. The endpoint is still POST /_doska/mcp on that site. PHP snippets have no tag line. line is the snippet start, and caller is the include.
How can I help you explore Laravel packages today?