/craft-notebook
Low-ceremony capture for ideas (half-formed, want to mature into stories), todos (concrete actions), and notes (durable project/team facts for future recall). One-line capture, conditional elaboration AUQ. Use BEFORE thoughts get forced into stories.
$ npx -y skills add drobins25/craft --agent claude-codeShips with craft. Installing the plugin gets this command.
How it fires
How this command gets triggered: by you, by Claude, or both.
- Fires itselfClaude auto-loads it when your prompt matches the work.
- You can call itInvoke it directly when you want it.
- Slash command
/craft-notebook
Context preview
What this command does when you run it.
Low-ceremony capture for ideas (half-formed, want to mature into stories), todos (concrete actions), and notes (durable project/team facts for future recall). One-line capture, conditional elaboration AUQ. Use BEFORE thoughts get forced into stories.
Command definition
craft-notebook.mdname: notebook
description: "Low-ceremony capture for ideas (half-formed, want to mature into stories), todos (concrete actions), and notes (durable project/team facts for future recall). One-line capture, conditional elaboration AUQ. Use BEFORE thoughts get forced into stories."
when_to_use: |
EXPLICIT REQUEST (check first): the user names "notebook" or asks to save/capture a note, idea, or todo. That IS the invocation - capture to the craft notebook now. Never divert to Claude Code's native memory or substitute your own dedup judgment for the request; if it overlaps an existing note, capture anyway or ask.
DEFERRAL MARKER (proactive): "later," "don't let me forget," "side note," "unrelated but," "before I forget," "for next time," "remember to." Absent a marker or explicit request, follow the conversation - do NOT mention notebook; silence is the default.
OFFER proactively via an ignorable closing line ("Worth dropping in /craft:notebook? Otherwise I'll continue") - NOT AskUserQuestion. On accept, invoke silently with session context.
NOTE TRIGGER (distinct): a durable, project/team-local FACT future-us would want recalled - settled, currently-true, local to THIS project, reusable; capture the distilled fact, not the event. NOT general knowledge you already hold or transient incidents. Offer only when solidly durable with no expiry.
Idea-vs-todo: todos are imperative + concrete ("rename X"); ideas speculative ("what if we"). Recall: "what's in notebook?" When ambiguous, ask.
List triggers: "notebook?", "what's open?", "show my todos."
argument-hint: "[idea|todo \"text\"] or empty for list"Notebook
Low-ceremony capture for ideas and todos. The upstream of craft's compounding system.
Project Root
Set `PROJECT` to `${CRAFT_PROJECT_ROOT:-.}`. All `.craft/` paths resolve under this root.
Step 0: Route on First Argument
Inspect the first token of `$ARGUMENTS`. Route as follows:
| First token | Action | |-------------|--------| | (empty) | Go to **Step 1: List View** | | `idea` | Go to **Step 2: Capture Flow** with TYPE=idea | | `todo` | Go to **Step 2: Capture Flow** with TYPE=todo | | `note` | Go to **Step 2: Capture Flow** with TYPE=note | | Anything else that looks like prose (no recognized subcommand) | Go to **Step 3: Disambiguate Idea-or-Todo** | | `graduate` / `done` / unknown single-token verbs | Output hint, return |
**Hint output for `graduate`, `done`, or unrecognized first-token verbs:**
Print exactly:
I handle that conversationally - try saying "turn the X idea into a story" or "mark X done" and I'll do it.
Return without taking any other action. **Do not** run any helper. **Do not** show an AskUserQuestion. AC21 prohibits lifecycle action from typed subcommands. The example phrasings are the discoverability surface for users who hit this path - terser hints lose the educational moment.
Step 1: List View
Run the list helper and read its structured output:
bash ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/notebook-list.shThe helper emits key=value records, one per entry, separated by blank lines, with fields `TYPE`, `N`, `FILE`, `DATE`, `SLUG`, `TAGS`, `PREVIEW`.
**If output is empty:** Print exactly:
Notebook empty.
Add an idea: /craft:notebook idea "your idea"
Add a todo: /craft:notebook todo "your todo"
Add a note: /craft:notebook note "a durable project fact"
Do NOT fire any AskUserQuestion (AC12). Return.
**If output has entries:** Parse the records and render three groups:
Ideas
[1] {DATE} {SLUG} {tags-section}
{PREVIEW}
[2] {DATE} {SLUG} {tags-section}
{PREVIEW}
Todos
[1] {DATE} {SLUG} {tags-section}
{PREVIEW}
Notes
[1] {DATE} {SLUG} {tags-section}
{PREVIEW}
Commands: idea "text" / todo "text" / note "text"`{tags-section}` rendering rule (AC19):
- If `TAGS` is non-empty, split on `;` and render as space-separated `#tag1 #tag2 #tag3` after one space.
- If `TAGS` is empty, render nothing (no trailing space, no `#`).
Render only sections where the corresponding group has entries. Suppress the "Ideas," "Todos," or "Notes" header if its group is empty.
Footer hint always shows `idea "text" / todo "text" / note "text"` even when only one group has entries. Footer does NOT mention `graduate` or `done` (those are conversational; teaching the typed-subcommand surface would mislead per AC21). Notes never show a `graduate` or `done` affordance at all - they have no lifecycle (see Lifecycle suppression below).
Step 2: Capture Flow
`TYPE` was determined in Step 0 (`idea` or `todo`). Everything after the subcommand is the candidate text.
2a: Resolve capture text
Extract the text from `$ARGUMENTS` AFTER the first token:
- If text is present and non-empty → CAPTURE_TEXT = the verbatim trailing text. Continue to 2b.
- If text is absent or whitespace-only → Use **AskUserQuestion** with exactly one question, no follow-ups:
question: "What's the {TYPE}?" # Substitute: "What's the idea?" or "What's the todo?"
header: "Capture"
options:
- label: "(type response)"
description: "Just type the text - I'll capture it."Take the user's free-text response as `CAPTURE_TEXT`. Continue to 2b. AC10 prohibits any further prompt before capture.
2b: Run capture helper
Call the helper with the captured text:
bash ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/notebook-capture.sh {TYPE} "{CAPTURE_TEXT}"The helper prints the written file path. Hold this as `CAPTURED_FILE`.
2c: Conditional elaboration AUQ (AC13)
The elaboration AUQ fires for user-driven captures (this Step 2 path). It does NOT fire for the Claude-driven inline-accept path (Step 4 below).
Inspect `CAPTURE_TEXT` and assess **self-sufficiency**:
- **Self-sufficient** (mark Skip Recommended): all referents are clear, no orphan pronouns ("that thing," "the bug"), the thought is complete on its face. Example: `"call mom Friday"` - Skip Recommended.
- **Not self-sufficient
Read more
name: notebook
description: "Low-ceremony capture for ideas (half-formed, want to mature into stories), todos (concrete actions), and notes (durable project/team facts for future recall). One-line capture, conditional elaboration AUQ. Use BEFORE thoughts get forced into stories."
when_to_use: |
EXPLICIT REQUEST (check first): the user names "notebook" or asks to save/capture a note, idea, or todo. That IS the invocation - capture to the craft notebook now. Never divert to Claude Code's native memory or substitute your own dedup judgment for the request; if it overlaps an existing note, capture anyway or ask.
DEFERRAL MARKER (proactive): "later," "don't let me forget," "side note," "unrelated but," "before I forget," "for next time," "remember to." Absent a marker or explicit request, follow the conversation - do NOT mention notebook; silence is the default.
OFFER proactively via an ignorable closing line ("Worth dropping in /craft:notebook? Otherwise I'll continue") - NOT AskUserQuestion. On accept, invoke silently with session context.
NOTE TRIGGER (distinct): a durable, project/team-local FACT future-us would want recalled - settled, currently-true, local to THIS project, reusable; capture the distilled fact, not the event. NOT general knowledge you already hold or transient incidents. Offer only when solidly durable with no expiry.
Idea-vs-todo: todos are imperative + concrete ("rename X"); ideas speculative ("what if we"). Recall: "what's in notebook?" When ambiguous, ask.
List triggers: "notebook?", "what's open?", "show my todos."
argument-hint: "[idea|todo \"text\"] or empty for list"Notebook
Low-ceremony capture for ideas and todos. The upstream of craft's compounding system.
Project Root
Set `PROJECT` to `${CRAFT_PROJECT_ROOT:-.}`. All `.craft/` paths resolve under this root.
Step 0: Route on First Argument
Inspect the first token of `$ARGUMENTS`. Route as follows:
| First token | Action | |-------------|--------| | (empty) | Go to **Step 1: List View** | | `idea` | Go to **Step 2: Capture Flow** with TYPE=idea | | `todo` | Go to **Step 2: Capture Flow** with TYPE=todo | | `note` | Go to **Step 2: Capture Flow** with TYPE=note | | Anything else that looks like prose (no recognized subcommand) | Go to **Step 3: Disambiguate Idea-or-Todo** | | `graduate` / `done` / unknown single-token verbs | Output hint, return |
**Hint output for `graduate`, `done`, or unrecognized first-token verbs:**
Print exactly:
I handle that conversationally - try saying "turn the X idea into a story" or "mark X done" and I'll do it.
Return without taking any other action. **Do not** run any helper. **Do not** show an AskUserQuestion. AC21 prohibits lifecycle action from typed subcommands. The example phrasings are the discoverability surface for users who hit this path - terser hints lose the educational moment.
Step 1: List View
Run the list helper and read its structured output:
bash ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/notebook-list.shThe helper emits key=value records, one per entry, separated by blank lines, with fields `TYPE`, `N`, `FILE`, `DATE`, `SLUG`, `TAGS`, `PREVIEW`.
**If output is empty:** Print exactly:
Notebook empty. Add an idea: /craft:notebook idea "your idea" Add a todo: /craft:notebook todo "your todo" Add a note: /craft:notebook note "a durable project fact"
Do NOT fire any AskUserQuestion (AC12). Return.
**If output has entries:** Parse the records and render three groups:
Ideas
[1] {DATE} {SLUG} {tags-section}
{PREVIEW}
[2] {DATE} {SLUG} {tags-section}
{PREVIEW}
Todos
[1] {DATE} {SLUG} {tags-section}
{PREVIEW}
Notes
[1] {DATE} {SLUG} {tags-section}
{PREVIEW}
Commands: idea "text" / todo "text" / note "text"`{tags-section}` rendering rule (AC19):
- If `TAGS` is non-empty, split on `;` and render as space-separated `#tag1 #tag2 #tag3` after one space.
- If `TAGS` is empty, render nothing (no trailing space, no `#`).
Render only sections where the corresponding group has entries. Suppress the "Ideas," "Todos," or "Notes" header if its group is empty.
Footer hint always shows `idea "text" / todo "text" / note "text"` even when only one group has entries. Footer does NOT mention `graduate` or `done` (those are conversational; teaching the typed-subcommand surface would mislead per AC21). Notes never show a `graduate` or `done` affordance at all - they have no lifecycle (see Lifecycle suppression below).
Step 2: Capture Flow
`TYPE` was determined in Step 0 (`idea` or `todo`). Everything after the subcommand is the candidate text.
2a: Resolve capture text
Extract the text from `$ARGUMENTS` AFTER the first token:
- If text is present and non-empty → CAPTURE_TEXT = the verbatim trailing text. Continue to 2b.
- If text is absent or whitespace-only → Use **AskUserQuestion** with exactly one question, no follow-ups:
question: "What's the {TYPE}?" # Substitute: "What's the idea?" or "What's the todo?"
header: "Capture"
options:
- label: "(type response)"
description: "Just type the text - I'll capture it."Take the user's free-text response as `CAPTURE_TEXT`. Continue to 2b. AC10 prohibits any further prompt before capture.
2b: Run capture helper
Call the helper with the captured text:
bash ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/notebook-capture.sh {TYPE} "{CAPTURE_TEXT}"The helper prints the written file path. Hold this as `CAPTURED_FILE`.
2c: Conditional elaboration AUQ (AC13)
The elaboration AUQ fires for user-driven captures (this Step 2 path). It does NOT fire for the Claude-driven inline-accept path (Step 4 below).
Inspect `CAPTURE_TEXT` and assess **self-sufficiency**:
- **Self-sufficient** (mark Skip Recommended): all referents are clear, no orphan pronouns ("that thing," "the bug"), the thought is complete on its face. Example: `"call mom Friday"` - Skip Recommended.
- **Not self-sufficient
Showing the first part of this file.
Stop Vibing. Start Crafting. Claude Code plugin: guided + controlled development orchestration harness with built-in workflow + state management, for designing + building durable, production-ready software through the entire product lifecycle - new projects
Repo: drobins25/craft
Other commands on craft.
- /craft-analyze
Post-cycle analysis — QA, UX, Creative, and Style audits using MCP browser tools.
Open command - /craft-ask
Consult a craft agent. Routes your question to the best mind in the workshop - not a menu, a recommendation.
Open command - /craft-become
Agent crystallization command. Studies a tool, role, or person and produces a portable 9-section agent that inhabits the domain - with beliefs, scar tissue, and instincts.
Open command - /craft-cycle-assign
Move a story from backlog to a cycle.
Open command - /craft-cycle-complete
Complete a cycle. Triggers reflection if pending learnings, then archives.
Open command - /craft-cycle-design
Design a cycle — create new cycles with planned stories, detail existing planning cycles, or quick-sketch a roadmap. Detects planning docs in .craft/planning/ and sources the cycle from them when relevant.
Open command

