note-loop
Skill1 starsChanged 9 months agoMITView on GitHub
Task execution loop — run, schedule, pause, skip, stop, and manage automated task loops
In this repository10 other files it gives its agents.
- note-bugSkill
- note-contextSkill
- note-decideSkill
- note-findSkill
- note-meetingSkill
- noteSkill
- note-snippetSkill
- note-standupSkill
- note-todoSkill
- note-wrapupSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
46 rules. About 0 are common, 28 are distinctive, and 18 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈28
Distinctive · estimate
This author's own choices. Worth a look.
18
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 29
Run, schedule, pause, and manage automated task execution loops with SlashNote as the visual dashboard.
- Distinctive: line 72
Start a loop immediately in the current Claude Code session.
- Distinctive: line 77
Search for existing note-loop note, update or create:
- Distinctive: line 103
Use an existing SlashNote as the task list:
- Very specific: line 105
Read the note via mcp__slashnote__read_note with the provided UUID
- Distinctive: line 108
If note has no unchecked checkboxes -> inform user, do not start loop
- Very specific: line 110
Call mcp__slashnote__start_note_loop with note_id, directory, and current_session: true
- Distinctive: line 113
Note: When using an existing note, do NOT change its color or content.
- Distinctive: line 122
Verify working directory (see Directory Detection below).
- Distinctive: line 123
Read the note to verify it exists and has tasks
- Very specific: line 135
When --new-session is used without a specific time, present a menu using AskUserQuestion:
- Distinctive: line 161
After user selects, continue with step 2 (read the note).
- Distinctive: line 181
If the time is in the past today, assume tomorrow
- Very specific: line 202
Search for existing note: mcp__slashnote__search_notes with query "note-loop"
- Distinctive: line 203
Read the note, extract unchecked checkboxes
- Distinctive: line 204
If no unchecked checkboxes -> "No pending tasks"
- Distinctive: line 213
If no active loops, inform user
- Very specific: line 217
Call mcp__slashnote__cancel_note_loop with note_id
- Very specific: line 224
Read state file .claude/slashnote-loop.local.md
- Distinctive: line 225
If no state file or loop not active -> "No active loop"
- Distinctive: line 237
If no active loop -> inform user
- Very specific: line 249
Add current task to blocked_tasks array:
- Distinctive: line 255
If no more tasks -> deactivate loop, show final summary
- Very specific: line 256
If tasks remain -> toggle next task to inProgress, continue loop
- Distinctive: line 264
If no state file -> "No active loop"
- Very specific: line 280
Write JSON to .claude/slashnote-loop.local.md:
- Distinctive: line 317
When a task cannot be completed:
- Very specific: line 320
Add the task index to blocked_tasks array in state file with a reason
- Very specific: line 321
Update state file: "blocked_tasks": [{"index": 2, "reason": "API not available"}]
- Distinctive: line 328
When all tasks are done (or loop stops due to max iterations), the stop hook automatically:
- Distinctive: line 332
If the stop hook fails to report completion, call it manually:
- Distinctive: line 349
If state file is corrupted -> start fresh, don't crash
- Distinctive: line 355
Always show when pausing or stopping:
- Distinctive: line 381
Keep it compact -- task names only, no extra decoration
- Very specific: line 387
Before calling start_note_loop, verify the working directory is a real macOS path:
- Very specific: line 396
Use mcp__slashnote__configure_note_loop instead (omit directory).
- Very specific: line 402
When a note already has a schedule (check read_note response schedule field):
- Very specific: line 411
Key rule: When starting from existing config, call start_note_loop(note_id) with NO other params to preserve the user's settings.
- Distinctive: line 415
Always search for existing note-loop note first -- never create duplicates
- Distinctive: line 417
No arguments -> resume from existing note-loop note's checkboxes
- Distinctive: line 419
Never modify the state file format -- hooks depend on it
- Very specific: line 420
Default permission mode for new sessions: bypassPermissions
- Very specific: line 421
Default model for new sessions: opus
- Distinctive: line 422
Only one schedule per note -- setting a new one replaces the old
- Very specific: line 423
Use $PWD as default directory (verify it's a real macOS path first — see Directory Detection)
- Distinctive: line 424
When starting from an existing config, don't pass parameters you don't need to override
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
/note-loop — Task Execution Loop
Run, schedule, pause, and manage automated task execution loops with SlashNote as the visual dashboard.
Usage
/note-loop Task1, Task2, Task3 # Loop in current session (new tasks)
/note-loop <uuid> # Loop from existing note
/note-loop # Resume from existing note
/note-loop <uuid> --new-session # New session (shows scheduling menu if no time)
/note-loop <uuid> --new-session 2h # Schedule in new session in 2 hours
/note-loop <uuid> --new-session --sonnet # Schedule with Sonnet model
/note-loop <uuid> --new-session --haiku # New session with Haiku model
/note-loop list # List active loops
/note-loop cancel <uuid> # Cancel a scheduled loop
/note-loop pause # Immediate pause
/note-loop pause after # Pause after current task
/note-loop skip # Skip current task
/note-loop skip <reason> # Skip with reason
/note-loop stop # Full stop
/note-loop stop <reason> # Stop with reasonInput Detection
| Input | Action |
| Text with tasks | Create note + loop in current session |
| UUID pattern (8-4-4-4-12 hex) | Loop from existing note |
UUID + --new-session | New session — shows scheduling menu |
UUID + --new-session <time> | New session with specified delay (no menu) |
UUID + --new-session + --opus/--sonnet/--haiku | Schedule with specific model |
list | list_note_loops() |
cancel <uuid> | cancel_note_loop(note_id) |
pause | Immediate pause (state file: active=false) |
pause after | Graceful pause (pause_after_current: true) |
skip / skip <reason> | Skip current task, continue with next |
stop / stop <reason> | Full stop + complete_note_loop() |
| No arguments | Resume from existing note |
Mode: Current Session (New Tasks)
Start a loop immediately in the current Claude Code session.
Step 1: Create/update note
- Parse tasks from input (comma-separated, numbered, or
-list) - Search for existing note-loop note, update or create:
# /*n*ote-loop
- [ ] Task 1
- [ ] Task 2
- [ ] Task 3- Color: green, Pinned: true
Step 2: Start loop
- Call
mcp__slashnote__start_note_loopwith:note_id: the note UUIDdirectory: current working directorycurrent_session: true (shows Running block immediately, no Terminal)
- This creates a Running block on the note
Step 3: State file + execute
(See "Loop Setup" section below)
Mode: From Existing Note (UUID)
Use an existing SlashNote as the task list:
- Read the note via
mcp__slashnote__read_notewith the provided UUID - Extract all unchecked checkboxes (
- [ ]) as tasks - Skip already completed (
- [x]) and in-progress (- [/]) items - If note has no unchecked checkboxes -> inform user, do not start loop
- Show the note via
mcp__slashnote__show_note - Call
mcp__slashnote__start_note_loopwithnote_id,directory, andcurrent_session: true - Proceed to "Loop Setup"
Note: When using an existing note, do NOT change its color or content. Use it as-is.
Mode: New Session (--new-session)
Schedule the loop to run in a new Terminal session:
- Parse delay from input (e.g.,
2h,30m,at 18:00).- If time IS specified (e.g.,
--new-session 2h): use parsed delay, skip to step 2. - If NO time specified (just
--new-session): show the Scheduling Menu (see below).
- If time IS specified (e.g.,
- Verify working directory (see Directory Detection below).
- Read the note to verify it exists and has tasks
- Call
mcp__slashnote__start_note_loopwith:note_id: the note UUIDdirectory: current working directory (if real path verified)delay_minutesorfire_at: parsed timepermission_mode:bypassPermissions(default), orplan/acceptEditsif specifiedmodel:opus(default),sonnet, orhaikuif specified
- This creates a Scheduled block on the note
- Confirm with fire time, countdown, permission mode, and model
Scheduling Menu
When --new-session is used without a specific time, present a menu using AskUserQuestion:
- question: "When should the loop start in the new Terminal session?"
- header: "Schedule"
- multiSelect: false
- options:
| # | label | description |
| 1 | Run now (Recommended) | Opens a new Terminal and starts the loop immediately |
| 2 | In 1 minute | Short delay to verify the setup before it runs |
| 3 | In 30 minutes | Finish current work first |
| 4 | In 2 hours | Schedule for later |
The user can also select Other (built-in) to type a custom delay (e.g., 1h, 45m, at 18:00).
Mapping to parameters:
| Selection | Parameter |
| Run now | omit delay_minutes and fire_at |
| In 1 minute | delay_minutes: 1 |
| In 30 minutes | delay_minutes: 30 |
| In 2 hours | delay_minutes: 120 |
| Other (custom) | Parse using Duration Parsing / Time Parsing rules below |
After user selects, continue with step 2 (read the note).
Duration Parsing
| Format | Example | Minutes |
Xm | 30m | 30 |
Xh | 2h | 120 |
Xh Ym | 1h 30m | 90 |
X minutes | 45 minutes | 45 |
X hours | 2 hours | 120 |
Time Parsing
| Format | Example |
HH:MM | 18:00 |
H:MM AM/PM | 6:00 PM |
When parsing at <time>:
- If the time is in the past today, assume tomorrow
- Convert to ISO 8601 for the
fire_atparameter
Permission Modes
| Flag | Mode | Description |
--plan | plan | Safe: only analysis, no file changes |
--edits | acceptEdits | Auto-accept file edits only |
| (default) | bypassPermissions | Full autopilot, all actions permitted |
Model Selection
| Flag | Model | Description |
--opus | opus | Most capable (default) |
--sonnet | sonnet | Balanced |
--haiku | haiku | Fast, lightweight |
Mode: Resume (No Arguments)
- Search for existing note:
mcp__slashnote__search_noteswith query "note-loop" - Read the note, extract unchecked checkboxes
- If no unchecked checkboxes -> "No pending tasks"
- Otherwise -> start loop (same as "From Existing Note" mode)
Command: list
- Call
mcp__slashnote__list_note_loops - Display table: note ID, status, fire time, permission mode, time remaining
- If no active loops, inform user
Command: cancel <uuid>
- Call
mcp__slashnote__cancel_note_loopwithnote_id - Confirm cancellation
Command: pause
Immediately pause the active loop.
- Read state file
.claude/slashnote-loop.local.md - If no state file or loop not active -> "No active loop"
- Set
"active": falsein state file - Record:
"paused_at": "<ISO timestamp>","paused_reason": "user_paused" - Toggle current task checkbox back to
uncheckedin SlashNote - Show progress summary (see format below)
- Inform: "Loop paused. Use
/note-loopto resume."
Command: pause after
Graceful pause -- finish current task, then stop.
- Read state file
- If no active loop -> inform user
- Set
"pause_after_current": truein state file - Inform: "Will pause after current task completes."
- Do NOT stop the current task -- let it finish naturally
- The stop hook will read
pause_after_currentand pause instead of continuing
Command: skip / skip <reason>
Skip the current task and move to the next one.
- Read state file
- If no active loop -> inform user
- Add current task to
blocked_tasksarray:{"index": 2, "reason": "<user reason or 'skipped by user'>"} - Toggle current task checkbox to
uncheckedin SlashNote - Find next unblocked, uncompleted task
- If no more tasks -> deactivate loop, show final summary
- If tasks remain -> toggle next task to
inProgress, continue loop - Inform: "Skipped:
<task>. Next:<next task>"
Command: stop / stop <reason>
Completely stop the loop.
- Read state file
- If no state file -> "No active loop"
- Set
"active": falsein state file - Record:
"stopped_at": "<ISO timestamp>","paused_reason": "<user reason or 'user_stopped'>" - Toggle current task checkbox back to
uncheckedin SlashNote - Cancel any in-progress internal tasks via TaskUpdate
- Call
mcp__slashnote__complete_note_loopwith:note_id,tasks_completed,tasks_blocked,total_tasksmessage: reason or "Stopped by user"
- Show final summary (see format below)
Loop Setup (shared by current session modes)
1. Create state file
Write JSON to .claude/slashnote-loop.local.md:
{
"active": true,
"note_id": "<uuid>",
"tasks": ["Task 1", "Task 2", "Task 3"],
"current_task": 0,
"completed_tasks": [],
"blocked_tasks": [],
"iteration": 0,
"max_iterations": 30,
"created_at": "<ISO timestamp>"
}tasksarray contains only unchecked items (skip done/in-progress)current_taskis index intotasksarraymax_iterationsscales with task count:max(30, tasks.length * 3)-- more tasks get more iterations
2. Create internal tasks + start
- For each task, call
TaskCreatewith descriptiveactiveForm(present continuous) - Mark first task as
in_progresswithTaskUpdate - Toggle first checkbox to
inProgressin SlashNote - Start working on the first task immediately
Loop Mechanics
The Stop hook (hooks/stop-loop.sh) handles continuation:
- Claude finishes task -> tries to stop -> hook checks state file
- Tasks remain -> hook blocks exit, returns next task instruction
- Claude picks up next task automatically
- Progress updated by hook via HTTP bridge
Blocked Task Handling
When a task cannot be completed:
- Mark the checkbox as unchecked (leave it, don't mark done)
- Add the task index to
blocked_tasksarray in state file with a reason - Update state file:
"blocked_tasks": [{"index": 2, "reason": "API not available"}] - Mark internal task as blocked (don't complete it)
- Move to the next task -- don't stop the loop
- At loop end, blocked tasks remain unchecked in the note for manual follow-up
Loop Completion
When all tasks are done (or loop stops due to max iterations), the stop hook automatically:
- Deactivates the state file
- Calls
complete_note_loopMCP endpoint to update the note's loop block with a summary
If the stop hook fails to report completion, call it manually:
mcp__slashnote__complete_note_loop(
note_id: "<uuid>",
tasks_completed: <count>,
tasks_blocked: <count>,
total_tasks: <count>,
message: "All tasks complete"
)Safety
- Max iterations scale:
max(30, tasks.length * 3) - Each task gets max 3 attempts before marked as blocked
/note-loop pauseor/note-loop stopstops the loop at any time- If state file is corrupted -> start fresh, don't crash
Progress Summary Format
Always show when pausing or stopping:
Loop: N/M tasks (XX%)
Done:
✓ Task A
✓ Task B
Skipped:
⊘ Task C — <reason>
Remaining:
→ Task D ← current
Task E
Resume: /note-loopFormat Rules
- Percentage:
round(completed / total * 100) - Done section: only show if there are completed tasks
- Skipped section: only show if there are blocked/skipped tasks -- include reason if recorded
- Remaining section: mark current task with
← currentand→prefix - Resume line: only show on pause (not on stop)
- Keep it compact -- task names only, no extra decoration
Directory Detection
Before calling start_note_loop, verify the working directory is a real macOS path:
- Real paths:
/Users/...,/Volumes/...,/tmp/...,/var/... - Virtual/invalid:
/sessions/...,/workspace/..., container paths, paths that don't start with/
If you can determine the real directory (e.g., from $PWD in Claude Code CLI):
- Pass
directorytostart_note_loopas normal.
If you can't determine the real directory (e.g., Claude Desktop, virtual FS):
- Use
mcp__slashnote__configure_note_loopinstead (omitdirectory). - Inform the user: "I've configured the loop on the note. Please select your project directory and click Start."
- The note will show an editable setup panel where the user can Browse for the directory and adjust settings.
Start Existing Config
When a note already has a schedule (check read_note response schedule field):
schedule.status | schedule.directory | Action |
configured | Set (non-null) | start_note_loop(note_id) — launches with existing settings |
configured | Not set (null) | Inform user to select directory in the note UI |
scheduled | — | Note is already scheduled. Inform user of fire time |
running | — | Loop is already running |
Key rule: When starting from existing config, call start_note_loop(note_id) with NO other params to preserve the user's settings. Only pass parameters you explicitly want to override.
Rules
- Always search for existing note-loop note first -- never create duplicates
- UUID input always starts a loop from that note
- No arguments -> resume from existing note-loop note's checkboxes
- State file path:
.claude/slashnote-loop.local.mdrelative to cwd - Never modify the state file format -- hooks depend on it
- Default permission mode for new sessions:
bypassPermissions - Default model for new sessions:
opus - Only one schedule per note -- setting a new one replaces the old
- Use
$PWDas default directory (verify it's a real macOS path first — see Directory Detection) - When starting from an existing config, don't pass parameters you don't need to override
Examples
New task loop:
/note-loop Write tests, Implement feature, Update docs-> Green pinned note, Running block, loop starts immediately
Loop from existing note:
/note-loop A550DE30-9B73-4CE5-A138-38F848471329-> Reads note, extracts unchecked checkboxes, Running block, starts loop
Schedule for later:
/note-loop A550DE30-9B73-4CE5-A138-38F848471329 --new-session 2h-> Scheduled block on note, fires in 2 hours with bypassPermissions
Schedule with specific model:
/note-loop A550DE30-9B73-4CE5-A138-38F848471329 --new-session 2h --sonnet-> Scheduled block with Sonnet model, fires in 2 hours
New session (immediate, with model):
/note-loop A550DE30-9B73-4CE5-A138-38F848471329 --new-session --haiku --edits-> Launches immediately in new Terminal with Haiku + acceptEdits
New session (no time — scheduling menu):
/note-loop A550DE30-9B73-4CE5-A138-38F848471329 --new-session --sonnet-> Shows scheduling menu: "Run now (Recommended)", "In 1 minute", "In 30 minutes", "In 2 hours" -> User picks "Run now" -> launches immediately in new Terminal with Sonnet + bypassPermissions
Resume:
/note-loop-> Finds existing note-loop note, resumes from unchecked items
List active loops:
/note-loop list-> Shows all active/scheduled loops
Cancel scheduled loop:
/note-loop cancel A550DE30-9B73-4CE5-A138-38F848471329-> Cancels the scheduled loop
Pause immediately:
/note-loop pause-> Pauses loop, shows progress summary
Pause after current task:
/note-loop pause after-> Finishes current task, then pauses
Skip a task:
/note-loop skip API is down-> Skips current task with reason, moves to next
Stop loop:
/note-loop stop finished for today-> Stops loop, calls complete_note_loop, shows final summary
Configure without starting (unknown directory):
mcp__slashnote__configure_note_loop(note_id: "<uuid>", model: "sonnet", permission_mode: "acceptEdits")-> Note shows setup panel with Sonnet + Accept Edits pre-filled, user selects directory and clicks Start
Start from existing configuration:
mcp__slashnote__start_note_loop(note_id: "<uuid>")-> Uses directory, model, and permissions from existing config on the note
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

