Skip to content

/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.

From plugin
craft
7377 skills27 agents77 commands7 hooks
+1
> /plugin marketplace add drobins25/craft
> /plugin install craft@craft

Command definition

craft-notebook.md
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."
  Not for: product rulings (decisions) - those belong to /craft:decisions.
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.

From a monorepo's top level with no project picked, `notebook-capture.sh` captures nothing: it exits non-zero with one line naming the projects it found, because an entry there would sit where no project's session lists it. Relay that line and stop. The user picks a project with `/craft:project`; a script or agent sets `CRAFT_PROJECT_ROOT` to the project's folder and captures again.

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.sh

The 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`.

A review's c

Read more
@drobins25
Ships withcraft

Stop Vibing. Start Crafting.

7311 skills27 agents1 MCP
Get the whole plugin, auto-invoked

Stars on GitHub

Momentum

stars in total
73
Star history of drobins25/craft on GitHub, a chart by star-history.com

Other commands on craft.

craft-analyze
Auto-invoked

craft-analyze

Command

Post-cycle analysis — QA, UX, Creative, and Style audits using MCP browser tools.

@drobins25@drobins25Install Command
craft-annotate
Auto-invoked

craft-annotate

Command

Point at anything in a live browser tab - every pin gets a live attempt on the page the moment you SEND it, and the session keeps…

@drobins25@drobins25Install Command
craft-ask
Auto-invoked

craft-ask

Command

Consult a craft agent. Routes your question to the best mind in the workshop - not a menu, a recommendation.

@drobins25@drobins25Install Command
craft-become
Auto-invoked

craft-become

Command

Agent crystallization command. Studies a tool, role, or person and produces a portable 9-section agent that inhabits the domain -…

@drobins25@drobins25Install Command
craft-bugs
Auto-invoked

craft-bugs

Command

File a bug without fixing it, from a person mid-conversation or an agent mid-run. One door, a complete record on disk, nobody…

@drobins25@drobins25Install Command

More commands from other plugins.

build
Auto-invoked

build

Command

Implement tasks incrementally — build, test, verify, commit. Add "auto" to run the whole plan in one approved pass.

@addyosmani@addyosmaniInstall Command