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,91 @@
---
name: app-navigation
description: >-
Navigate the app UI - open notes, switch views, filter and search the knowledge base, and manage saved views. Use when the user wants to open notes or change the UI view.
license: MIT
compatibility: Designed for Rowboat desktop app
metadata:
version: "1.0.0"
title: "App Navigation"
author: rowboatlabs
tags: "navigation, ui, knowledge-base"
---
# App Navigation Skill
You have access to the **app-navigation** tool which lets you control the Rowboat UI directly — opening notes, switching views, filtering the knowledge base, and creating saved views.
## Actions
### open-note
Open a specific knowledge file in the editor pane.
**When to use:** When the user asks to see, open, or view a specific note (e.g., "open John's note", "show me the Acme project page").
**Parameters:**
- `path`: Full workspace-relative path (e.g., `knowledge/People/John Smith.md`)
**Tips:**
- Use `workspace-grep` first to find the exact path if you're unsure of the filename.
- Always pass the full `knowledge/...` path, not just the filename.
### open-view
Switch the UI to the graph or bases view.
**When to use:** When the user asks to see the knowledge graph, view all notes, or open the bases/table view.
**Parameters:**
- `view`: `\"graph\"` or `\"bases\"`
### update-base-view
Change filters, columns, sort order, or search in the bases (table) view.
**When to use:** When the user asks to find, filter, sort, or search notes. Examples: "show me all active customers", "filter by topic=hiring", "sort by name", "search for pricing".
**Parameters:**
- `filters`: Object with `set`, `add`, `remove`, or `clear` — each takes an array of `{ category, value }` pairs.
- `set`: Replace ALL current filters with these.
- `add`: Append filters without removing existing ones.
- `remove`: Remove specific filters.
- `clear: true`: Remove all filters.
- `columns`: Object with `set`, `add`, or `remove` — each takes an array of column names (frontmatter keys).
- `sort`: `{ field, dir }` where dir is `\"asc\"` or `\"desc\"`.
- `search`: Free-text search string.
**Tips:**
- If unsure what categories/values are available, call `get-base-state` first.
- For "show me X", prefer `filters.set` to start fresh rather than `filters.add`.
- Categories come from frontmatter keys (e.g., relationship, status, topic, type).
- **CRITICAL: Do NOT pass `columns` unless the user explicitly asks to show/hide specific columns.** Omit the `columns` parameter entirely when only filtering, sorting, or searching. Passing `columns` will override the user's current column layout and can make the view appear empty.
### get-base-state
Retrieve information about what's in the knowledge base — available filter categories, values, and note count.
**When to use:** When you need to know what properties exist before filtering, or when the user asks "what can I filter by?", "how many notes are there?", etc.
**Parameters:**
- `base_name` (optional): Name of a saved base to inspect.
### create-base
Save the current view configuration as a named base.
**When to use:** When the user asks to save a filtered view, create a saved search, or says "save this as [name]".
**Parameters:**
- `name`: Human-readable name for the base.
## Workflow Example
1. User: "Show me all people who are customers"
2. First, check what properties are available:
`app-navigation({ action: \"get-base-state\" })`
3. Apply filters based on the available properties:
`app-navigation({ action: \"update-base-view\", filters: { set: [{ category: \"relationship\", value: \"customer\" }] } })`
4. If the user wants to save it:
`app-navigation({ action: \"create-base\", name: \"Customers\" })`
## Important Notes
- The `update-base-view` action will automatically navigate to the bases view if the user isn't already there.
- `open-note` validates that the file exists before navigating.
- Filter categories and values come from frontmatter in knowledge files.
- **Never send `columns` or `sort` with `update-base-view` unless the user specifically asks to change them.** Only pass the parameters you intend to change — omitted parameters are left untouched.