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

3.5 KiB

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 toolscook.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_files 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)