spec
Manage specs for spec-driven development. Specs live in the user's notes_folder under Specs/ with three lifecycle subfolders — Drafts, Active, Done.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Manage specs for spec-driven development. Specs live in the user's notes_folder under Specs/ with three lifecycle subfolders — Drafts, Active, Done.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Calendar operations with CalDAV
Git repository management, GitLab merge requests, and GitHub pull requests
Location tracking, place recognition, visit history, and calendar attendance
Persistent memory writes — USER.md (behavioral) and the knowledge graph (facts).
Accounting operations (ledger, invoicing, transactions, work log, investment portfolio) — runs in-process via the vendored money package
Send a push notification to the user's configured ntfy device(s). One-way (bot to phone), no reply channel.
| name | spec |
| triggers | ["spec","specs","draft spec","design doc","design document","write a spec","new spec","start spec","finish spec"] |
| description | Manage specs for spec-driven development. Specs live in the user's notes_folder under Specs/ with three lifecycle subfolders — Drafts, Active, Done. |
| companion_skills | ["files","notes"] |
Specs are markdown files that capture the plan for a feature or change before it is implemented. They live in the user's notes_folder, separate from regular notes, so the same process applies to every project.
A spec is a detailed, thorough implementation document — written so a coding agent can pick it up cold and ship the work without further supervision. Treat the reader as a competent engineer who has not been part of the discussion: every decision they would otherwise have to ask about should already be answered in the document.
Concretely, a good spec:
If a draft is too thin to hand off blind, it isn't ready to leave Drafts/. When drafting, push back on under-specified requests rather than producing a stub.
Default location is {notes_folder}/Specs/:
{notes_folder}/Specs/
├── Drafts/ # written but not yet being implemented
├── Active/ # implementation in progress, or partially complete
└── Done/ # every stage/phase fully implemented
A spec moves through these folders left-to-right. It never skips a state and rarely moves backwards (only if work is abandoned mid-flight, in which case it goes back to Drafts/).
{notes_folder}/Specs/ is for cross-project / personal specs only. When a request explicitly names a project — e.g., "draft a spec for the Acme retry logic" or "list Acme specs" — the spec lives in that project's own folder, not under {notes_folder}/Specs/.
Where each project lives is deployment-specific — the skill does not assume a layout. Resolve the project folder for the named project in this order, stopping at the first hit:
~/work/acme").CHANNEL.md) — channel-scoped projects often record their working directory there.folder resource whose display_name matches, etc.).USER.md) — long-running projects usually have their root path noted there, sometimes alongside a convention like "all my projects live under <some-root>/Projects/<name>/". Honour whatever convention USER.md states.If none of those resolve, ask the user where the project's folder is. Do not invent a path or fall back to {notes_folder}/Specs/<Project>/ — that path is reserved for the bot's own notes.
Once the project folder is resolved, the layout is:
<project-folder>/Specs/{Drafts,Active,Done}/
Create the Specs/{Drafts,Active,Done} subfolders inside the project folder on first use without asking — the convention is fixed.
If a request is ambiguous about whether a project is meant, default to {notes_folder}/Specs/ and ask only if the user pushes back.
The skill is invoked through natural language, not as a CLI. Recognise these intents and use the files skill for filesystem operations.
Ask the user for a title if not given.
Slugify to lowercase-with-dashes.md.
Refuse to overwrite if a file with the same slug exists in Drafts/, Active/, or Done/ (within the resolved project scope). Suggest a numeric suffix.
Write Drafts/<slug>.md with this skeleton (soft-wrapped, no hard line breaks within paragraphs):
---
created: <YYYY-MM-DD>
---
# <Title>
## Context
<why this exists, what problem it solves, links to related specs or issues>
## Goals
<what success looks like, in concrete terms>
## Non-goals
<what is explicitly out of scope>
## Design
<approach, data model, interfaces, key decisions, alternatives considered>
## Stages
- [ ] Stage 1 — <name>
- [ ] Stage 2 — <name>
## Open questions
<things to resolve before or during implementation>
Confirm with the spec's path.
Drafts/ for the slug or fragment the user gave (case-insensitive substring on the filename).Drafts/<file> → Active/<file>.Active/.## Stages (or equivalent) checklist:
- [ ]) remain, refuse the move and list the open items. The user must either complete them, edit the spec, or explicitly override (e.g., "force it" / "move it anyway").Active/<file> → Done/<file>.Print three sections (Drafts, Active, Done) with the filenames under each, scoped to the resolved project (or the flat tree by default). If a section is empty, write _none_. Sort filenames alphabetically. Do not read file contents.
Resolve a unique match across all three folders (search Active first, then Drafts, then Done). Print the path and the file contents.
When the user asks to edit, extend, or revise a spec, edit it in place — do not move it between folders as a side effect of editing. State transitions are explicit.
lowercase-with-dashes.md. No dates in filenames (the filesystem mtime is enough).- [ ] / - [x]) so the "done" gate can verify completion.created date. Add an agents: field only if the spec has non-obvious read/write quirks (per the notes skill convention).Be terse. After any state-changing operation, print one line: <verb> <slug>: <old-path> → <new-path>. After listing, print the section summary and nothing else. After drafting, print the absolute path of the created file.