Skip to content

Commit 80cd642

Browse files
authored
docs: document system skills, models recommended, deploy list/show, worker token (#5350)
Fill six documentation gaps: system skills concept in docs/AGENTS.md, nodetool models recommended flags in docs/cli.md, deploy list/show and worker token in docs/cli.md, and NODETOOL_SYSTEM_SKILLS_DIR env var in docs/configuration.md.
1 parent 0ecdb2f commit 80cd642

3 files changed

Lines changed: 106 additions & 0 deletions

File tree

docs/AGENTS.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,41 @@ injects selected content into the system prompt under an `# Agent Skills`
391391
header. Trusted sandbox-pack skills are merged into the same available-skill
392392
set for the session.
393393

394+
### System Skills
395+
396+
A **system skill** ships with the build instead of living in a row. It is a
397+
`SKILL.md` — YAML frontmatter naming it, Markdown body — under a directory that
398+
carries its name, in `packages/system-skills/` in a checkout and staged to
399+
`_skills/` beside the bundled `server.mjs` in the desktop app and the Docker
400+
image. `NODETOOL_SYSTEM_SKILLS_DIR` overrides both roots
401+
([Configuration](configuration.md#environment-variables-index)).
402+
403+
```markdown
404+
---
405+
name: launch-commercial
406+
description: Turn a product page URL into a finished launch commercial — ... Use when someone asks for an ad, a launch spot, a promo or a commercial from a product page or website.
407+
---
408+
409+
# Product Page → Launch Commercial Agent
410+
411+
You are a single agent. Your job: …
412+
```
413+
414+
The `description` is what auto-select matches an objective against, so it says
415+
*when* the skill applies, not what it contains.
416+
417+
`list_skills` and `load_skill` serve both tiers, so a system skill reaches the
418+
model exactly the way a user skill does. The difference is that it is read-only:
419+
`create_skill`, `update_skill`, and `delete_skill` refuse a shipped name, naming
420+
the verb they refused — `"<name>" is a system skill that ships with NodeTool and
421+
cannot be overwritten. Pick another name; load_skill still reads it.`, and
422+
likewise `edited`, `renamed over`, and `deleted`. A user row that already held
423+
the name predates the reservation and wins — reserving names only stops new ones.
424+
425+
Nothing imports these files, so `packages/system-skills` is not a workspace and
426+
npm links nothing. A file whose frontmatter is missing or malformed, or whose
427+
`name` disagrees with its directory, is skipped rather than failing the catalog.
428+
394429
### Skill Resolution
395430

396431
- **Explicit** — pass `skills: ["skill-a"]` in the agent constructor.

docs/cli.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1192,6 +1192,42 @@ nodetool models ollama
11921192
nodetool models by-provider openai --kind image
11931193
```
11941194

1195+
#### `nodetool models recommended`
1196+
1197+
The curated shortlist — what to reach for when you want a model id that is known
1198+
to work, rather than everything a provider will sell you. It reads the shipped
1199+
`RECOMMENDED_MODELS` table in-process, so it needs no server, no API key, and no
1200+
network.
1201+
1202+
- `--category <category>` — one of `all` (default), `image`,
1203+
`image-text-to-image`, `image-image-to-image`, `language`,
1204+
`language-text-generation`, `language-embedding`, `asr`, `tts`,
1205+
`video-text-to-video`, `video-image-to-video`. An unknown value exits `1`
1206+
listing the valid ones.
1207+
- `--system <darwin|linux|windows>` — keep only models that run on that
1208+
platform. A model that declares no platforms is kept for all of them.
1209+
- `--limit <n>` — cap the results. Applied after both filters; a value that is
1210+
not a positive integer exits `1`.
1211+
- `--check-servers` — fetch the list from a running server instead, which also
1212+
probes whether the local Ollama and llama.cpp servers can serve each entry.
1213+
This is the only mode that uses `--api-url` (default `http://localhost:7777`,
1214+
or `NODETOOL_API_URL`).
1215+
- `--json` — the full model records rather than the five-column table.
1216+
1217+
```bash
1218+
# The top of the curated list, no network
1219+
nodetool models recommended --limit 3
1220+
1221+
# What to embed with
1222+
nodetool models recommended --category language-embedding
1223+
1224+
# What a Mac can actually run, machine-readable
1225+
nodetool models recommended --system darwin --json
1226+
1227+
# Which of them a local Ollama has pulled
1228+
nodetool models recommended --check-servers
1229+
```
1230+
11951231
### `nodetool models` — HuggingFace Hub and cache
11961232

11971233
Five subcommands search the Hub and manage the local HuggingFace cache. They
@@ -1425,6 +1461,27 @@ nodetool deploy logs my-server --follow --tail 200
14251461
nodetool deploy edit
14261462
```
14271463

1464+
`list` and `show` answer the two questions you have before naming a target in
1465+
any of the other verbs, and they are the pair to reach for when you have
1466+
inherited a `deployment.yaml` you did not write.
1467+
1468+
`list` queries each configured target for its live state and prints one row per
1469+
deployment — `name`, `type`, `status`, `last_deployed`, `host`, `container`,
1470+
`pod_id`, `project`, `region`, `service`. With none configured it prints
1471+
`(no deployments configured)`; `--json` gives the same rows for a script.
1472+
`show <name>` reads the file only, printing that one target's config as YAML —
1473+
no remote call, so it works while the host is down.
1474+
1475+
```bash
1476+
nodetool deploy list
1477+
nodetool deploy list --json
1478+
nodetool deploy show my-server
1479+
```
1480+
1481+
Both need the file to exist. Without it they exit non-zero with
1482+
`Deployment configuration not found at <path>. Run 'nodetool deploy init' to
1483+
create it.`
1484+
14281485
The full server walkthrough is [Deployment](deployment.md) and
14291486
[Self-Hosted Deployment](self-hosted-deployment.md).
14301487

@@ -1506,6 +1563,19 @@ nodetool worker status <instance-id>
15061563
nodetool worker stop --all
15071564
```
15081565

1566+
`token <id>` prints one worker's bearer token and nothing else — no table, no
1567+
label — so it pipes into the variable the bridge reads:
1568+
1569+
```bash
1570+
export NODETOOL_WORKER_TOKEN=$(nodetool worker token <instance-id>)
1571+
```
1572+
1573+
`list` withholds tokens on purpose; this is the one command that decrypts one,
1574+
and only for the worker you name. Reach for it when a second shell, a CI step,
1575+
or a `--api-url` client has to talk to a worker `--attach` did not configure. A
1576+
worker that carries no token is an error rather than empty output:
1577+
`Worker instance '<id>' has no token (open worker).`
1578+
15091579
The full walkthrough, including what `--attach` changes locally, is
15101580
[Worker Deployment](worker-deployment.md).
15111581

docs/configuration.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,7 @@ missing binary.
560560
| `NODETOOL_VIDEO_FRAME_MAX_FPS` | Ceiling on the frame sample rate | no | Default `1`. A clip too long for the frame budget to reach this rate is sampled more sparsely, so the frames still span it |
561561
| `NODETOOL_VIDEO_FRAME_MAX_DIMENSION` | Longest edge of a sampled frame, in pixels | no | Default `768`. Frames are never upscaled |
562562
| `NODETOOL_SHIPPED_PACKS_DIR` | Roots the sandbox packs that ship with NodeTool are read from | no | Comma-, semicolon-, or `PATH`-separator-delimited, same as `NODETOOL_PACK_SEARCH_PATHS`. Candidates that do not exist are dropped, so a bad path yields no packs rather than an error. Unset, the loader looks for `_sandbox/` beside the bundled `server.mjs` (packaged desktop app, Docker image), then walks up to `packages/sandbox-packs` (a checkout). Set it only for a host that stages the packs somewhere else. See [Sandbox package design](sandbox-package-design.md) |
563+
| `NODETOOL_SYSTEM_SKILLS_DIR` | Root the system skills that ship with NodeTool are read from | no | One path, not a list. Unset, the loader looks for `_skills/` beside the bundled `server.mjs` (packaged desktop app, Docker image), then walks up to `packages/system-skills` (a checkout). A path that does not exist means no system skills rather than an error, and so does an unset variable in a build that ships none. Each skill is a `SKILL.md` under a directory that names it — a frontmatter `name` disagreeing with the directory is skipped, as is a file that cannot be parsed. Read once per process. Set it only for a host that stages the skills somewhere else. See [Agent Architecture › Skills](AGENTS.md#skills) |
563564
| `NODETOOL_SANDBOX_INPROC` | Run every QuickJS guest on the calling thread instead of a worker | no | `1` only. A chosen fallback, so it warns about nothing. A CPU-bound guest then blocks the thread — on the server's main thread that freezes the event loop, including the frame that would have cancelled the run. See [JavaScript sandbox threading](#javascript-sandbox-threading) |
564565
| `NODETOOL_SANDBOX_WORKER` | Require the sandbox worker path | no | `require` only. A run that cannot reach a worker fails with `the sandbox worker path is required (NODETOOL_SANDBOX_WORKER=require) but unavailable: <reason>` rather than falling back in-process. Runs that stream their inputs never reach a worker, so this fails them |
565566
| `NODETOOL_GPU_VALIDATE` | Escape hatch for the WGSL linearity validator | no | `off` disables it. The validator rejects a shader module whose WGSL contradicts its declared premultiplied-alpha contract, at module load. Use it to ship a hotfix while the shader is corrected, not as a standing setting; read once per process |

0 commit comments

Comments
 (0)