Skip to content
Back to skills

Note

ASecurity

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

  • 17 stars
  • 0 votes
  • 0 copies
  • 4 views
  • Added May 27, 2026
developmentgobashgitapi

Works with

  • claude code
  • cli
  • api

Security analysis

A100/100

Scanned May 27, 2026

npx -y skills add SienkLogic/plan-build-run --skill note --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Note?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Note
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/sienklogic-note/badge)](https://www.skillsdirectory.com/skills/sienklogic-note)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: note
description: "Zero-friction idea capture. Append, list, or promote notes to todos."
allowed-tools: Read, Write, Glob, Grep
argument-hint: "<text> | list | promote <index> [--global]"
---

**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:

```markdown
---
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:
   ```bash
   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:
   ```bash
   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`:

```yaml
---
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}
```

9. Mark the source note file as promoted: update its frontmatter to `promoted: true`
10. 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

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.