Move skills into apps/skills/, drop override + sync layers

Skills now ship with the app under /apps/skills/ (sibling of /apps/x).
Forge bundles the directory into Resources/skills/; main resolves it via
process.resourcesPath in production and a workspace-relative path in dev,
then registers it in the DI container. The runtime reads SKILL.md files
directly from the bundle — no copy to ~/.rowboat/skills/, no GitHub
tarball sync.

Drop the override layer (FSSkillsRepo, SkillOverride, edit/diff UI,
skill-update notification) since skills are now read-only and only ship
with app updates. Resolver simplifies to a single source.

Add a placeholder substitution layer so skills that need live data
(currently `tracks`, with {{TRACK_BLOCK_SCHEMA}}) keep dynamic content
without depending on TS-module evaluation.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
tusharmagar 2026-04-30 08:35:09 +05:30
parent 66c0bc5fa7
commit e23f4ad6d2
32 changed files with 5999 additions and 1446 deletions

View file

@ -0,0 +1,113 @@
---
name: browser-control
description: >-
Control Rowboat's embedded browser pane — open sites, inspect the live page, switch tabs, and interact with indexed page elements. Use when the user wants to open a website in-app, search the web in the browser pane, click something on a page, fill a form, or interact with a live webpage inside Rowboat.
license: MIT
compatibility: Designed for Rowboat desktop app
metadata:
version: "1.0.0"
title: Browser Control
---
# Browser Control Skill
You have access to the **browser-control** tool, which controls Rowboat's embedded browser pane directly.
Use this skill when the user asks you to open a website, browse in-app, search the web in the browser pane, click something on a page, fill a form, or otherwise interact with a live webpage inside Rowboat.
## Core Workflow
1. Start with `browser-control({ action: "open" })` if the browser pane may not already be open.
2. Use `browser-control({ action: "read-page" })` to inspect the current page.
3. The tool returns:
- `snapshotId`
- page `url` and `title`
- visible page text
- interactable elements with numbered `index` values
4. Prefer acting on those numbered indices with `click` / `type` / `press`.
5. After each action, read the returned page snapshot before deciding the next step.
## Actions
### open
Open the browser pane and ensure an active tab exists.
### get-state
Return the current browser tabs and active tab id.
### new-tab
Open a new browser tab.
Parameters:
- `target` (optional): URL or plain-language search query
### switch-tab
Switch to a tab by `tabId`.
### close-tab
Close a tab by `tabId`.
### navigate
Navigate the active tab.
Parameters:
- `target`: URL or plain-language search query
Plain-language targets are converted into a search automatically.
### back / forward / reload
Standard browser navigation controls.
### read-page
Read the current page and return a compact snapshot.
Parameters:
- `maxElements` (optional)
- `maxTextLength` (optional)
### click
Click an element.
Prefer:
- `index`: element index from `read-page`
Optional:
- `snapshotId`: include it when acting on a recent snapshot
- `selector`: fallback only when no usable index exists
### type
Type into an input, textarea, or contenteditable element.
Parameters:
- `text`: text to enter
- plus the same target fields as `click`
### press
Send a key press such as `Enter`, `Tab`, `Escape`, or arrow keys.
Parameters:
- `key`
- optional target fields if you need to focus a specific element first
### scroll
Scroll the current page.
Parameters:
- `direction`: `"up"` or `"down"` (optional; defaults down)
- `amount`: pixel distance (optional)
### wait
Wait for the page to settle, useful after async UI changes.
Parameters:
- `ms`: milliseconds to wait (optional)
## Important Rules
- Prefer `read-page` before interacting.
- Prefer element `index` over CSS selectors.
- If the tool says the snapshot is stale, call `read-page` again.
- After navigation, clicking, typing, pressing, or scrolling, use the returned page snapshot instead of assuming the page state.
- Use Rowboat's browser for live interaction. Use web search tools for research where a live session is unnecessary.
- Do not wrap browser URLs or browser pages in ```filepath blocks. Filepath cards are only for real files on disk, not web pages or browser tabs.
- If you mention a page the browser opened, use plain text for the URL/title instead of trying to create a clickable file card.