mirror of
https://github.com/rowboatlabs/rowboat.git
synced 2026-07-03 20:41:07 +02:00
feat(skills): single-source skill system with markdown SKILL.md + include directive
Skills move out of packages/core/src/application/assistant/skills/*/skill.ts
(TS string constants) into apps/skills/<id>/SKILL.md (Agent Skills spec format
— YAML frontmatter + markdown body). One directory, one loader, one place to
look at every skill the agent can load.
Key change vs the old dev system: a `{{include:<skill-id>}}` directive lets one
skill transclude another. This removes the parallel TS constant for the
knowledge-note style guide — it now lives at apps/skills/knowledge-note-style/
(hidden from catalog) and is pulled into doc-collab + the live-note and
background-task agents via the resolver instead of via a TS import.
Infrastructure:
- packages/core/src/skills/ — types, skill-md-parser, FS-backed official repo,
SkillResolver with recursive {{include:<id>}} expansion + cycle detection
- packages/shared/src/skill.ts — SkillFrontmatter, SkillCatalogEntry,
ResolvedSkill schemas
- DI: officialSkillsRepo + skillResolver registered; registerSkillsDir helper
wires the path before any consumer resolves
- IPC: skills:list / skills:get (read-only) for the Settings UI
- Main: resolveSkillsDir picks Resources/skills (packaged) or repo apps/skills
(dev). forge.config.cjs ships apps/skills/ as extraResource.
Consumer refactor:
- buildCopilotInstructions: catalog markdown built from resolver.getCatalog()
- builtin-tools: loadSkill uses resolver, new listSkills tool
- background-tasks/agent + live-note/agent: now async builders that load
the knowledge-note-style skill content via resolver
- runtime.loadAgent: awaits the now-async builders
- Deleted: assistant/skills/ directory, knowledge-note-style.ts
UI:
- New SkillsSettings component (read-only list + detail view) wired into
Settings dialog as the "Skills" tab.
This commit is contained in:
parent
b01af12148
commit
9a308cb7a9
38 changed files with 1217 additions and 1204 deletions
74
apps/skills/notify-user/SKILL.md
Normal file
74
apps/skills/notify-user/SKILL.md
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
---
|
||||
name: notify-user
|
||||
description: >-
|
||||
Send native desktop notifications with optional clickable links — including rowboat:// deep links that open a specific note, chat, or view inside the app.
|
||||
metadata:
|
||||
title: "Notify User"
|
||||
---
|
||||
|
||||
# Notify User
|
||||
|
||||
Load this skill when you need to send a desktop notification to the user — e.g. after a long-running task completes, when a track detects something noteworthy, or when an agent wants to ping the user with a clickable result.
|
||||
|
||||
## When to use
|
||||
- **Use it for**: completion alerts, threshold breaches, status changes, new items the user asked you to watch for, anything time-sensitive.
|
||||
- **Don't use it for**: routine progress updates, anything the user can already see in the chat, or repeated pings inside a loop (there is no built-in rate limit — restraint is on you).
|
||||
|
||||
## The tool: `notify-user`
|
||||
|
||||
Triggers a native macOS notification. The call returns immediately; it does not block waiting for the user to click.
|
||||
|
||||
### Parameters
|
||||
- **`title`** (optional, defaults to `"Rowboat"`) — bold headline at the top.
|
||||
- **`message`** (required) — body text. Keep it short — macOS truncates after a couple of lines.
|
||||
- **`link`** (optional) — URL to open when the user clicks the notification. Two kinds accepted:
|
||||
- **`https://...` / `http://...`** — opens in the default browser
|
||||
- **`rowboat://...`** — opens a view inside Rowboat (see deep links below)
|
||||
- If omitted, clicking the notification focuses the Rowboat app.
|
||||
|
||||
### Examples
|
||||
|
||||
Plain alert (no link — clicking focuses the app):
|
||||
```json
|
||||
{
|
||||
"title": "Backup complete",
|
||||
"message": "All 142 files synced to iCloud."
|
||||
}
|
||||
```
|
||||
|
||||
External link:
|
||||
```json
|
||||
{
|
||||
"title": "New email from Monica",
|
||||
"message": "Re: Q4 planning — needs your input by Friday",
|
||||
"link": "https://mail.google.com/mail/u/0/#inbox/abc123"
|
||||
}
|
||||
```
|
||||
|
||||
Deep link into a Rowboat note:
|
||||
```json
|
||||
{
|
||||
"message": "Daily brief is ready",
|
||||
"link": "rowboat://open?type=file&path=knowledge/Daily/2026-04-25.md"
|
||||
}
|
||||
```
|
||||
|
||||
## Deep links: `rowboat://`
|
||||
|
||||
Use these as the `link` parameter to land the user on a specific view in Rowboat instead of an external site. URL-encode paths/names that contain spaces or special characters.
|
||||
|
||||
| Target | Format | Example |
|
||||
|---|---|---|
|
||||
| Open a file | `rowboat://open?type=file&path=<workspace-relative path>` | `rowboat://open?type=file&path=knowledge/People/Acme.md` |
|
||||
| Open chat | `rowboat://open?type=chat` (optional `&runId=<id>`) | `rowboat://open?type=chat&runId=abc123` |
|
||||
| Knowledge graph | `rowboat://open?type=graph` | — |
|
||||
| Background task view | `rowboat://open?type=task&name=<task-name>` | `rowboat://open?type=task&name=daily-brief` |
|
||||
| Suggested topics | `rowboat://open?type=suggested-topics` | — |
|
||||
|
||||
The `type=file` path is workspace-relative (the same path you'd pass to `workspace-readFile`).
|
||||
|
||||
## Anti-patterns
|
||||
- **Don't notify per step** of a multi-step task. Notify on completion, not on progress.
|
||||
- **Don't repeat what's already on screen.** If the result is already in the chat or in a note the user is viewing, skip the notification.
|
||||
- **Don't dump the result into `message`.** Surface the headline; put the detail behind a deep link or external link.
|
||||
- **Don't notify silently-failing things either.** If something failed, say so in the message — don't swallow the failure into a generic "done".
|
||||
Loading…
Add table
Add a link
Reference in a new issue