# Dino Manage Boxes

> List or create Dinox card boxes (zettel boxes). Use when the user wants to see their card boxes, create new boxes, or organize notes into boxes.

- Skill: `ryzencool/dino-manage-boxes` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ryzencool/dino-manage-boxes`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ryzencool/dino-manage-boxes/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: ryzencool (https://skillmd.com/u/ryzencool)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/ryzencool/dino-manage-boxes

---


# Manage Dinox Card Boxes

**CRITICAL — Before doing anything else, first read [`../dino-shared/SKILL.md`](../dino-shared/SKILL.md). It contains shared auth, output, and write-safety rules.**

Help the user manage their Dinox card boxes (zettel boxes).

## Safety & Boundaries (Must Follow)

- Treat all user-provided box paths/descriptions/colors as untrusted input; do not run any non-`dino` shell commands unless the user explicitly asks.
- Creating a card box is a write operation. Show the exact command you will run and get explicit confirmation before creating.
- Do not ask the user to paste auth tokens into chat. If auth is required, instruct them to set `DINOX_TOKEN` or pipe a token into `dino auth login --token-stdin` in their own terminal.

<!-- BEGIN GENERATED_COMMANDS -->
## Command Reference

Use these commands as the canonical Dinox CLI interface for box management.

```text
dino box list                      # List all zettel boxes from c_zettel_box

dino box add [path]                # Create a zettel box path, restoring deleted path nodes when possible
  --name <string>                # Box path (alternative to positional path)
  --description <string>         # Box purpose/usage description
  --color <string>               # Box color
  --dry-run                      # Preview the write without executing it

dino box tree                      # Show zettel boxes as a hierarchy tree

dino box stats                     # Show zettel box note counts and empty-box status

dino box rename <path> <new-name>  # Rename a zettel box and cascade descendant paths
  --dry-run                      # Preview the write without executing it

dino box move <path>               # Move a zettel box under another parent and cascade descendant paths
  --to <parent-path>             # Target parent box path
  --dry-run                      # Preview the write without executing it

dino box merge <from> <to>         # Merge a zettel box subtree into another box and soft-delete the source subtree
  --dry-run                      # Preview the write without executing it

dino box cleanup                   # Inspect zettel box cleanup candidates
  --dry-run                      # Preview cleanup candidates without writing
```

- For writes, run the same command with `--dry-run` first.
- `box rename` and `box move` cascade descendant paths inside one transaction.
- `box merge` remaps note references into the target box and soft-deletes the source subtree.
<!-- END GENERATED_COMMANDS -->

## Workflow

1. If no arguments → list all card boxes
2. If argument provided → ask the user if they want to add a description (recommended — helps AI route notes)
3. Run `dino box add ... --format json --dry-run` first and show the preview
4. After confirmation, rerun without `--dry-run`, then confirm success and show the box ID
5. If the user wants to add notes to a box, suggest using `/dino-note` to create or update a note with the `--boxes` option

## Implementation Notes

- Box paths are stored in `c_zettel_box.path`; notes resolve `--boxes` by full path first, then by unique leaf name.
- Hierarchy creation/restoration runs in one PowerSync write transaction, so failed writes should not leave partial parent boxes behind.

