Skip to main content

note

Zero-friction idea capture. Append, list, or promote notes to todos.

Stars
17
Source
SienkLogic/plan-build-run
Updated
2026-04-03
Slug
SienkLogic--plan-build-run--note
View on GitHubRaw SKILL.md

// install — copy + paste into any project

mkdir -p .claude/skills && curl -fsSL https://raw.githubusercontent.com/SienkLogic/plan-build-run/HEAD/plugins/pbr/skills/note/SKILL.md -o .claude/skills/note.md

Drops the SKILL.md into .claude/skills/note.md. Works with Claude Code, Cursor, and any agent that loads SKILL.md files from .claude/skills/.

STOP — DO NOT READ THIS FILE. You are already reading it. This prompt was injected into your context by Claude Code's plugin system. Using the Read tool on this SKILL.md file wastes ~7,600 tokens. Begin executing Step 1 immediately.

Step 0 — Immediate Output

Before ANY tool calls, display this banner:

╔══════════════════════════════════════════════════════════════╗
║  PLAN-BUILD-RUN ► NOTE                                       ║
╚══════════════════════════════════════════════════════════════╝

Then proceed to Step 1.

/pbr:note — Quick Note Capture

You are running the note skill. Your job is zero-friction idea capture. One Write call, one confirmation line. No questions, no prompts.

This skill runs inline — no Task, no AskUserQuestion, no Bash.

References

  • references/ui-brand.md — Status symbols, banners, formatting for note display output

Storage Format

Notes are stored as individual markdown files in a notes directory:

  • Project scope: .planning/notes/{YYYY-MM-DD}-{slug}.md — used when .planning/ directory exists in cwd
  • Global scope: ~/.claude/notes/{YYYY-MM-DD}-{slug}.md — used as fallback when no .planning/, or when --global flag is present

Each note file has this format:

---
date: "YYYY-MM-DD HH:mm"
promoted: false
---

{note text verbatim}

--global flag: Strip --global from anywhere in $ARGUMENTS before parsing. When present, force global scope regardless of whether .planning/ exists.

Important: Do NOT create .planning/ if it doesn't exist. If there's no .planning/ directory, fall back to global scope silently.


Subcommand Parsing

Parse $ARGUMENTS after stripping --global:

Condition Subcommand
Arguments are exactly list (case-insensitive) list
Arguments are exactly promote <N> where N is a number promote
Arguments are empty (no text at all) list
Anything else append (the text IS the note)

Critical: list is only a subcommand when it's the ENTIRE argument. /pbr:note list of groceries saves a note with text "list of groceries". Same for promote — only a subcommand when followed by exactly one number.


Subcommand: append

Create a timestamped note file in the target directory.

Steps

  1. Determine scope (project or global) per Storage Format above
  2. Ensure the notes directory exists (.planning/notes/ or ~/.claude/notes/)
  3. Generate slug via CLI:
    pbr-tools slug-generate "{note text}"
    
    Parse the JSON output to get the slug field.
  4. Generate filename: {YYYY-MM-DD}-{slug}.md
    • If a file with that name already exists, append -2, -3, etc.
  5. Write the file with frontmatter and note text (see Storage Format)
  6. Confirm with exactly one line: Noted ({scope}): {note text}
    • Where {scope} is "project" or "global"

Constraints

  • Never modify the note text — capture verbatim, including typos
  • Never ask questions — just write and confirm
  • Timestamp format: Use local time, YYYY-MM-DD HH:mm (24-hour, no seconds)

Subcommand: list

Show notes from both project and global scopes.

Steps

  1. Glob .planning/notes/*.md (if directory exists) — these are "project" notes
  2. Glob ~/.claude/notes/*.md (if directory exists) — these are "global" notes
  3. For each file, read frontmatter to get date and promoted status
  4. Exclude files where promoted: true from active counts (but still show them, dimmed)
  5. Sort by date, number all active entries sequentially starting at 1
  6. If total active entries > 20, show only the last 10 with a note about how many were omitted

Display Format

Notes:

Project (.planning/notes/):
  1. [2026-02-08 14:32] refactor the hook system to support async validators
  2. [promoted] [2026-02-08 14:40] add rate limiting to the API endpoints
  3. [2026-02-08 15:10] consider adding a --dry-run flag to build

Global (~/.claude/notes/):
  4. [2026-02-08 10:00] cross-project idea about shared config

{count} active note(s). Use `/pbr:note promote <N>` to convert to a todo.

If a scope has no directory or no entries, show: (no notes)


Subcommand: promote

Convert a note into a todo file.

Steps

  1. Run the list logic to build the numbered index (both scopes)
  2. Find entry N from the numbered list
  3. If N is invalid or refers to an already-promoted note, tell the user and stop
  4. Requires .planning/ directory — if it doesn't exist, warn: "Todos require a Plan-Build-Run project. Run /pbr:new-project to initialize one, or use /pbr:add-todo in an existing project."
  5. Ensure .planning/todos/pending/ directory exists
  6. Generate todo ID: {NNN}-{slug} where NNN is the next sequential number (scan both .planning/todos/pending/ and .planning/todos/done/ for the highest existing number, increment by 1, zero-pad to 3 digits) and slug is generated via CLI:
    pbr-tools slug-generate "{note text}"
    
    Parse the JSON output to get the slug field.
  7. Extract the note text from the source file (body after frontmatter)
  8. Create .planning/todos/pending/{id}.md:
---
title: "{note text}"
status: pending
priority: P2
source: "promoted from /pbr:note"
created: {YYYY-MM-DD}
theme: general
---

## Goal

{note text}

## Context

Promoted from quick note captured on {original date}.

## Acceptance Criteria

- [ ] {primary criterion derived from note text}
  1. Mark the source note file as promoted: update its frontmatter to promoted: true
  2. Confirm: Promoted note {N} to todo {id}: {note text}

Edge Cases

  1. "list" as note text: /pbr:note list of things → saves note "list of things" (subcommand only when list is the entire arg)
  2. No .planning/: Falls back to global ~/.claude/notes/ — works in any directory
  3. Promote without project: Warns that todos require .planning/, suggests /pbr:new-project
  4. Large files: list shows last 10 when >20 active entries
  5. Duplicate slugs: Append -2, -3 etc. to filename if slug already used on same date
  6. --global position: Stripped from anywhere — --global my idea and my idea --global both save "my idea" globally
  7. Promote already-promoted: Tell user "Note {N} is already promoted" and stop
  8. Empty note text after stripping flags: Treat as list subcommand

Error Handling

Reference: skills/shared/error-reporting.md for branded error output patterns.

Write failure

If the Write tool fails (permissions, disk full, etc.), display:

╔══════════════════════════════════════════════════════════════╗
║  ERROR                                                       ║
╚══════════════════════════════════════════════════════════════╝

Failed to write note to {target_file}.

**To fix:** Check file permissions or disk space.

Promote target not found

If the specified note index is invalid, display:

╔══════════════════════════════════════════════════════════════╗
║  ERROR                                                       ║
╚══════════════════════════════════════════════════════════════╝

Note {N} not found. Valid range: 1-{max}.

**To fix:** Run `/pbr:note list` to see available notes.

Reference: skills/shared/commit-planning-docs.md -- if planning.commit_docs is true, commit the note file.

Anti-Patterns

  1. DO NOT ask questions on append — just write and confirm
  2. DO NOT modify note text — capture verbatim
  3. DO NOT use Task, AskUserQuestion, or Bash
  4. DO NOT create .planning/ if it doesn't exist — fall back to global
  5. DO NOT number promoted notes in the active count (but still display them)
  6. DO NOT over-format the confirmation — one line is enough
  7. DO NOT use a flat NOTES.md file — always use individual files in notes directory