Skip to content
Development
Command

/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
4031 skills27 agents31 commands7 hooks1 MCP
shell
$ npx -y skills add drobins25/craft --agent claude-code

Ships 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.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."
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.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`.

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
Read it on GitHub ↗

Showing the first part of this file.

Ships withcraft

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

Get the whole plugin, auto-invoked
Stats
40
Stars
0
Views
5
Forks
Active
Maintenance
Shell
Language
MIT
License
2d ago
Last commit
3mo ago
Created

Repo: drobins25/craft