smith-todo

star 40

Manage daily todo lists stored in the vault. Supports listing, adding, completing, deferring, editing, removing items, reviewing past days, weekly overview, and completion stats.

ATTCKDigital By ATTCKDigital schedule Updated 4/20/2026

name: smith-todo description: Manage daily todo lists stored in the vault. Supports listing, adding, completing, deferring, editing, removing items, reviewing past days, weekly overview, and completion stats. argument-hint: "[list|add|done|defer|remove|edit|review|week|stats] [] [--date YYYY-MM-DD] [--to YYYY-MM-DD]"

Smith Todo

Manage daily todo lists stored in .smith/vault/todo/. Each day has one file (todo-YYYY-MM-DD.md) containing that day's items. Items are simple: title, status, and created date. The daily briefing N8N workflow auto-generates today's file each weekday morning at 7am EST; this skill lets you manage items manually at any time.

Arguments: $ARGUMENTS

Vault Logging

Log significant events to the vault session log. Read the session log path from .smith/vault/.current-session. If missing, skip logging silently.

Append entries using this format:

### [HH:MM:SS] /smith-todo <event>

**User Request:**
> <verbatim user message that triggered this action>

**Action:** <list|add|done|defer|remove|edit|review|week|stats>
**Date:** <YYYY-MM-DD>
**Outcome:** <what happened>

Todo File Format

Each daily file lives at .smith/vault/todo/todo-YYYY-MM-DD.md:

---
date: "YYYY-MM-DD"
generated: "YYYY-MM-DDTHH:MM:SS"
source: auto|manual
---

# Daily Todo — YYYY-MM-DD

## Summary

<Brief overview of the day: calendar highlights, email activity, key priorities>

## Items

- [ ] `TODO-001` Item title here
- [ ] `TODO-002` Another item
- [x] `TODO-003` Completed item
- [~] `TODO-004` Deferred item → YYYY-MM-DD

## Email Activity (Last 24h)

| Sender | Subject | Status | Intent |
|--------|---------|--------|--------|
| jane@example.com | Re: Project update | replied | question |
| bob@example.com | Contract review | pending | request |
| noreply@service.com | Newsletter | skipped | spam |

## Calendar — Remainder of Week

| Date | Time | Event |
|------|------|-------|
| Mon 04/07 | 10:00 AM | Team standup |
| Tue 04/08 | 2:00 PM | Client review |

## Completion Review (Previous Day)

| Item | Status | Confidence | Evidence |
|------|--------|------------|----------|
| Review PR #168 | done | high | Merged commit da17f19 |
| Reply to Jane | unverified | medium | No email exchange found |

Item ID Convention

Item IDs are sequential within each day's file: TODO-001, TODO-002, etc. When adding items, scan existing items to find the next available number.

Subcommands

No Arguments / list — Show Today's Items

Display today's todo items. If no file exists for today, say "No todo list for today. Use /smith-todo add <title> to create one, or wait for the morning briefing."

Format:

Daily Todo — 2026-04-07 (Mon)

  [ ] TODO-001  Reply to Jane about contract review
  [ ] TODO-002  Review PR #171
  [x] TODO-003  Team standup at 10am
  [~] TODO-004  Update spec for System 12 → deferred to 04/08

  3 pending · 1 done · 1 deferred

Optional flag: list --date YYYY-MM-DD — show a different day's list.

add <title> — Add a Todo Item

  1. Determine target date — defaults to today. Use --date YYYY-MM-DD to target a different day.
  2. Find or create the day's file:
    • If the file exists, read it and determine the next item ID.
    • If no file exists, create one with source: manual in frontmatter, an empty Summary, and no Email Activity / Calendar / Completion Review sections.
  3. Append the new item to the ## Items section: - [ ] \TODO-NNN` `</li> <li><strong>Confirm:</strong> "Added TODO-NNN: <title> to <date>."</li> <li><strong>Show full list</strong> — immediately display the full todo list for the target date using the same format as the <code>list</code> subcommand (all items with pending/done/deferred counts).</li> </ol> <h3><code>done <id></code> — Mark Item Complete</h3> <ol> <li><strong>Find</strong> the item by ID in today's file (or use <code>--date</code> to target another day).</li> <li><strong>Update</strong> the checkbox from <code>- [ ]</code> to <code>- [x]</code>.</li> <li><strong>Confirm:</strong> "TODO-NNN marked done."</li> </ol> <p>If the item is already done: "TODO-NNN is already complete." If the item doesn't exist: "TODO-NNN not found in <date>'s list."</p> <h3><code>defer <id></code> — Defer Item to Another Day</h3> <ol> <li><strong>Find</strong> the item by ID in today's file.</li> <li><strong>Update</strong> the checkbox from <code>- [ ]</code> to <code>- [~]</code> and append <code> → <target-date></code>.<ul> <li>Default target: next business day (skip weekends).</li> <li>Use <code>--to YYYY-MM-DD</code> to specify a different date.</li> </ul> </li> <li><strong>Copy</strong> the item (as <code>- [ ]</code> with a new ID) into the target date's file. Create the target file if needed.</li> <li><strong>Confirm:</strong> "TODO-NNN deferred to <target-date> as TODO-MMM."</li> </ol> <h3><code>remove <id></code> — Remove an Item</h3> <ol> <li><strong>Find</strong> the item by ID in today's file.</li> <li><strong>Remove</strong> the line entirely.</li> <li><strong>Confirm:</strong> "TODO-NNN removed."</li> </ol> <p>Do NOT ask for confirmation — this is a lightweight action on a daily list.</p> <h3><code>edit <id></code> — Edit an Item</h3> <ol> <li><strong>Find</strong> the item by ID in today's file.</li> <li><strong>Display</strong> the current text and ask the user what they'd like to change (title only, since metadata is minimal).</li> <li><strong>Update</strong> the line in place.</li> <li><strong>Confirm:</strong> "TODO-NNN updated."</li> </ol> <h3><code>review [YYYY-MM-DD]</code> — Review a Past Day's Briefing</h3> <ol> <li><strong>Read</strong> the specified day's file (defaults to yesterday if no date given).</li> <li><strong>Display</strong> the full file contents including Summary, Items, Email Activity, Calendar, and Completion Review sections.</li> <li>If no file exists: "No todo file found for <date>."</li> </ol> <h3><code>week</code> — Weekly Overview</h3> <ol> <li><strong>Scan</strong> <code>.smith/vault/todo/</code> for all files in the current week (Monday through Friday).</li> <li><strong>For each day</strong>, extract the item counts (pending, done, deferred).</li> <li><strong>Display:</strong></li> </ol> <pre><code>Weekly Overview — Week of 2026-04-07 Mon 04/07 3 pending · 2 done · 1 deferred Tue 04/08 5 pending · 0 done · 0 deferred Wed 04/09 (no file) Thu 04/10 (no file) Fri 04/11 (no file) Week total: 8 pending · 2 done · 1 deferred </code></pre> <h3><code>stats</code> — Completion Statistics</h3> <ol> <li><strong>Scan</strong> all files in <code>.smith/vault/todo/</code>.</li> <li><strong>Calculate:</strong><ul> <li>Total items across all days</li> <li>Completion rate (done / total)</li> <li>Average items per day</li> <li>Most common deferred-to pattern (same day? next day? end of week?)</li> <li>Longest streak of 100% completion days</li> <li>Items carried forward most often (if any pattern emerges from deferred items with similar titles)</li> </ul> </li> <li><strong>Display</strong> as a compact summary.</li> </ol> <h2>Implementation Notes</h2> <ul> <li>Todo files live in <code>.smith/vault/todo/</code>. Create the directory if it doesn't exist on first use.</li> <li>File naming: <code>todo-YYYY-MM-DD.md</code> — always use this exact format.</li> <li>Checkbox states: <code>[ ]</code> = pending, <code>[x]</code> = done, <code>[~]</code> = deferred.</li> <li>"Next business day" means skip Saturday and Sunday.</li> <li>This skill should be handled directly in the main session — never delegate to a sub-agent.</li> <li>When creating a file manually (no auto-briefing), omit the auto-generated sections (Email Activity, Calendar, Completion Review) and set <code>source: manual</code>.</li> <li>When the morning briefing creates the file, it sets <code>source: auto</code> and populates all sections.</li> </ul> </article> </div> <!-- Right: Metadata & Command Sidebar --> <div class="w-full lg:w-80 shrink-0 flex flex-col gap-6" data-astro-cid-7zzsworf> <!-- Install Card --> <div class="p-6 rounded-xl bg-surface-container border border-border/80 flex flex-col gap-4 shadow-sm" data-astro-cid-7zzsworf> <span class="text-xs font-bold uppercase tracking-widest text-on-surface-variant/60 font-mono" data-astro-cid-7zzsworf>Install via CLI</span> <div class="flex flex-col gap-2" data-astro-cid-7zzsworf> <div id="detail-install-cmd" class="font-mono text-[11px] p-3 rounded-lg bg-black/40 border border-border select-all break-all text-primary font-bold leading-relaxed" data-astro-cid-7zzsworf> npx skills add https://github.com/ATTCKDigital/smith --skill smith-todo </div> <button id="detail-copy-btn" class="w-full py-2.5 rounded-lg bg-primary hover:bg-primary-hover text-on-primary font-sans font-bold text-sm shadow transition-all active:scale-95 flex items-center justify-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px]" data-astro-cid-7zzsworf>content_copy</span> <span data-astro-cid-7zzsworf>Copy Command</span> </button> </div> </div> <!-- Details & Stats Card --> <div class="p-6 rounded-xl bg-surface-container border border-border/80 flex flex-col gap-4 shadow-sm text-on-surface" data-astro-cid-7zzsworf> <span class="text-xs font-bold uppercase tracking-widest text-on-surface-variant/60 font-sans" data-astro-cid-7zzsworf>Repository Details</span> <div class="flex flex-col gap-3.5" data-astro-cid-7zzsworf> <div class="flex justify-between items-center text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>star</span> Stars </span> <span class="font-mono font-bold text-on-surface" data-astro-cid-7zzsworf>40</span> </div> <div class="flex justify-between items-center text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>call_split</span> Forks </span> <span class="font-mono font-bold text-on-surface" data-astro-cid-7zzsworf>6</span> </div> <div class="flex justify-between items-center text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>navigation</span> Branch </span> <span class="font-mono bg-surface border border-border px-2 py-0.5 rounded text-[11px] text-on-surface-variant" data-astro-cid-7zzsworf>main</span> </div> <div class="flex justify-between items-start text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5 mt-0.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>article</span> Path </span> <span class="font-mono bg-surface border border-border px-2 py-0.5 rounded text-[11px] text-on-surface-variant truncate max-w-[150px]" title="SKILL.md" data-astro-cid-7zzsworf>SKILL.md</span> </div> </div> </div> <!-- Occupations Tag Card --> <div class="p-6 rounded-xl bg-surface-container border border-border/80 flex flex-col gap-3 shadow-sm" data-astro-cid-7zzsworf> <span class="text-xs font-bold uppercase tracking-widest text-on-surface-variant/60 font-sans" data-astro-cid-7zzsworf>Occupations</span> <div class="flex flex-wrap gap-1.5" data-astro-cid-7zzsworf> <a href="/?occupation=first-line-supervisors-of-entertainment-and-recreation-workers-except-gambling-services" class="px-3 py-1 rounded-full bg-primary/10 border border-primary/20 text-primary hover:bg-primary/20 text-[11px] font-semibold transition-all hover:scale-102" data-astro-cid-7zzsworf> First Line Supervisors Of Entertainment And Recreation Workers Except Gambling Services </a> </div> </div> <!-- Related Creators Card --> <div class="p-6 rounded-xl bg-surface-container border border-border/80 flex flex-col gap-3 shadow-sm" data-astro-cid-7zzsworf> <span class="text-xs font-bold uppercase tracking-widest text-on-surface-variant/60 font-sans" data-astro-cid-7zzsworf>More from Creator</span> <div class="flex items-center gap-2" data-astro-cid-7zzsworf> <img class="w-8 h-8 rounded-full border border-border" src="https://avatars.githubusercontent.com/u/8374317?v=4" alt="ATTCKDigital" onerror="this.src='https://avatars.githubusercontent.com/u/9919?v=4'" data-astro-cid-7zzsworf> <div class="flex flex-col min-w-0" data-astro-cid-7zzsworf> <span class="font-bold text-sm truncate text-on-surface" data-astro-cid-7zzsworf>ATTCKDigital</span> <a href="/?creator=ATTCKDigital" class="text-xs text-primary hover:underline font-semibold transition-all" data-astro-cid-7zzsworf>Explore all skills →</a> </div> </div> </div> </div> </div> </div> </div> <script> const copyBtn = document.getElementById("detail-copy-btn"); const installCmd = document.getElementById("detail-install-cmd"); if (copyBtn && installCmd) { copyBtn.addEventListener("click", () => { const cmd = installCmd.textContent.trim(); navigator.clipboard.writeText(cmd).then(() => { const originalText = copyBtn.innerHTML; copyBtn.innerHTML = ` <span class="material-symbols-outlined text-[16px]">check</span> <span>Copied!</span> `; copyBtn.style.background = "#10b981"; copyBtn.style.borderColor = "#10b981"; setTimeout(() => { copyBtn.innerHTML = originalText; copyBtn.style.background = ""; copyBtn.style.borderColor = ""; }, 1500); }); }); } </script> </div> <!-- Footer --> <footer class="border-t border-border bg-surface-container-low text-on-surface-variant py-8 px-gutter mt-16 rounded-xl"> <div class="max-w-container-max mx-auto flex flex-col md:flex-row justify-between items-center gap-6"> <div class="flex items-center gap-2"> <div class="w-6 h-6 rounded bg-primary bg-opacity-20 flex items-center justify-center"> <span class="material-symbols-outlined text-primary text-sm">code_blocks</span> </div> <span class="font-bold text-on-surface text-sm">SkillMD</span> </div> <div class="flex flex-wrap justify-center gap-6 text-sm"> <a href="/about" class="hover:text-primary transition-colors">About Us</a> <a href="/contact" class="hover:text-primary transition-colors">Contact Us</a> <a href="/privacy" class="hover:text-primary transition-colors">Privacy Policy</a> <a href="/terms" class="hover:text-primary transition-colors">Terms of Service</a> <a href="/support" class="hover:text-primary transition-colors">Support</a> </div> <div class="text-xs text-on-surface-variant/80"> © 2026 SkillMD. All rights reserved. </div> </div> </footer> </main> <!-- Script for Theme Toggle, Mobile Menu, and Sidebar Filter Redirection --> <script> // Theme setup const savedTheme = localStorage.getItem("theme") || "dark"; function applyTheme(theme) { document.documentElement.classList.remove("dark", "green", "dracula", "nord"); if (theme === "dark") { document.documentElement.classList.add("dark"); } else if (theme === "green") { document.documentElement.classList.add("dark", "green"); } else if (theme === "dracula") { document.documentElement.classList.add("dark", "dracula"); } else if (theme === "nord") { document.documentElement.classList.add("dark", "nord"); } document.documentElement.setAttribute("data-theme", theme); const themeMoon = document.getElementById("theme-moon"); const themeSun = document.getElementById("theme-sun"); const themeLeaf = document.getElementById("theme-leaf"); const themeDracula = document.getElementById("theme-dracula"); const themeNord = document.getElementById("theme-nord"); if (themeMoon && themeSun && themeLeaf && themeDracula && themeNord) { themeMoon.style.display = theme === "dark" ? "inline" : "none"; themeSun.style.display = theme === "light" ? "inline" : "none"; themeLeaf.style.display = theme === "green" ? "inline" : "none"; themeDracula.style.display = theme === "dracula" ? "inline" : "none"; themeNord.style.display = theme === "nord" ? "inline" : "none"; } } applyTheme(savedTheme); const themeToggleBtn = document.getElementById("theme-toggle-btn"); if (themeToggleBtn) { themeToggleBtn.addEventListener("click", () => { const currentTheme = document.documentElement.getAttribute("data-theme") || "dark"; let newTheme = "dark"; if (currentTheme === "dark") { newTheme = "light"; } else if (currentTheme === "light") { newTheme = "green"; } else if (currentTheme === "green") { newTheme = "dracula"; } else if (currentTheme === "dracula") { newTheme = "nord"; } else { newTheme = "dark"; } applyTheme(newTheme); localStorage.setItem("theme", newTheme); }); } // Mobile menu toggle and sidebar logic const mobileMenuToggle = document.getElementById("mobile-menu-toggle"); const sidebarMenu = document.getElementById("sidebar-menu"); const sidebarOverlay = document.getElementById("sidebar-overlay"); function isMobile() { return window.innerWidth < 768; // 768px is the 'md' breakpoint in Tailwind } function openSidebar() { if (sidebarMenu) { sidebarMenu.classList.remove("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.remove("hidden"); } } function closeSidebar() { if (sidebarMenu && isMobile()) { sidebarMenu.classList.add("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.add("hidden"); } } if (mobileMenuToggle && sidebarMenu) { mobileMenuToggle.addEventListener("click", (e) => { e.stopPropagation(); if (isMobile()) { const isClosed = sidebarMenu.classList.contains("-translate-x-full"); if (isClosed) { openSidebar(); } else { closeSidebar(); } } }); document.addEventListener("click", (e) => { if (isMobile()) { if (!sidebarMenu.contains(e.target) && !mobileMenuToggle.contains(e.target)) { closeSidebar(); } } }); if (sidebarOverlay) { sidebarOverlay.addEventListener("click", () => { if (isMobile()) { closeSidebar(); } }); } // Collapse sidebar when clicking a filter button, creator button, or nav item inside it sidebarMenu.addEventListener("click", (e) => { if (isMobile()) { const clickTarget = e.target.closest("button, a"); if (clickTarget) { closeSidebar(); } } }); // Sync sidebar state on window resize window.addEventListener("resize", () => { if (!isMobile()) { // Desktop: sidebar should be visible, no overlay if (sidebarMenu) { sidebarMenu.classList.remove("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.add("hidden"); } } else { // Mobile: start collapsed if (sidebarMenu) { sidebarMenu.classList.add("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.add("hidden"); } } }); } // If not on homepage, redirect on sidebar filter click const isHomepage = window.location.pathname === "/"; document.querySelectorAll("#occupation-filters .filter-btn").forEach(btn => { btn.addEventListener("click", (e) => { const occ = e.currentTarget.getAttribute("data-occupation"); if (!isHomepage) { window.location.href = occ ? `/?occupation=${encodeURIComponent(occ)}` : "/"; } }); }); document.querySelectorAll("#creator-filters .creator-btn").forEach(btn => { btn.addEventListener("click", (e) => { const creator = e.currentTarget.getAttribute("data-creator"); if (!isHomepage) { window.location.href = `/?creator=${encodeURIComponent(creator)}`; } }); }); </script> </body> </html>