Files
nanobot-runtime/plans/cook-skill-design.md
2026-09-08 20:37:38 +02:00

70 lines
3.5 KiB
Markdown

# Cook skill — final design
## Context
User wants a personal store for recipes and tea notes (origins, brewing
parameters, tasting). Wiki/note rejected as too heavy. Agreed design:
`cook/` data dir + thin `skills/cook/` skill manifest + a small safety
script. This plan finalizes the design agreed question-by-question in chat
(2026-09-08) and supersedes the quick-draft SKILL.md already written.
## Decisions (locked with user)
1. **Script, not raw file tools**`cook.py` guards against accidental
overwrite/delete; frontmatter always machine-generated (no drift).
Keep it **minimal — shortest working code, no speculative features**.
2. **Frontmatter** (free-form values, only `type` is fixed):
`type: recept|caj`, `category`, `cuisine` (recepts only),
`origin` (caj only), `tags` (user hashtags, no `#`), `added` (auto date).
Can be lightened later.
3. **Hashtags live in frontmatter `tags`**, not in body.
4. **Search via script**: frontmatter filtering + fulltext body grep.
Start simple; enrich later.
5. **Slug collision**: `add` on existing slug → error; agent shows the
existing item, user decides edit vs. new slug. No auto `-2` suffixes.
6. **Assets**: `cook/assets/<slug>/` when documents/photos ever arrive;
not created upfront.
## Steps
1. Rewrite `skills/cook/SKILL.md` to the final design:
- layout (`cook/recepty/`, `cook/caj/`, `cook/assets/` — created on demand)
- all file mutations via `cook.py` subcommands; agent never `write_file`s
into `cook/` directly except body edits via `edit_file`/`apply_patch`
after `add` creates the skeleton
- capture inline (same turn), commit after each change
(`git add cook/ && git commit -m "cook: ..."`; never `git add -A`)
- search/answer flow: `list`/`search` to narrow, then read files, answer
from files only, no confabulation
- edit/delete: two-turn confirm flow (show exact text → user confirms →
apply → commit)
- slug conventions: kebab-case; collision handling per decision 5
2. Write `skills/cook/scripts/cook.py` — minimal (~150 lines), stdlib only:
- `add <slug> --type recept|caj [--category C] [--cuisine C] [--origin O]
[--tags a,b] [--body-file F]` → creates file with frontmatter;
**exit 1 if slug exists**; reads body from stdin or `--body-file`
- `edit <slug>` → prints file path; **exit 1 if missing** (no silent
create); actual text edits done by agent with `edit_file` on the path
- `list [--type T] [--category C] [--tag X]` → one line per item:
`slug type category added title`
- `show <slug>` → full file content
- `search <text>` → fulltext grep across bodies, prints matching lines
with slug context
- `rename <old> <new>` → moves file (+ its assets dir if present);
exit 1 if target exists
- `delete <slug>` → removes file (and empty assets dir); only run
after user confirmation per SKILL.md flow
- `validate` → checks every file has parseable frontmatter and `type`
- Frontmatter: minimal hand-rolled parse (no external deps).
3. Test drive: `add` a sample recipe + sample tea, verify frontmatter,
`list`, `search`, collision error, `validate`, then delete samples and
commit the real state.
## Verification
- `cook.py add` twice on same slug → second exits 1
- `edit`/`show`/`rename`/`delete` on missing slug → exit 1
- `list --tag chata` filters on frontmatter tags
- `search <word>` finds body text
- `validate` passes on script-created files, fails on a hand-mangled one
- SKILL.md contains no leftover pipeline cruft (inbox/compile/lock)