Tiny spec create
A tiny, opinionated take on spec-driven development.
npx -y skills add GrayMa77er/tiny-spec --skill tiny-spec-createAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 3 stars3 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Start or update a spec — capture intent and requirements into .spec/<slug>/SPEC.md, optionally bound to a ticket (or ad-hoc). On first run, scaffolds .spec/ and seeds the shared constitution (constitution.md) from a short interview. If a BREAKDOWN.md (from tiny-spec-breakdown) is present, seeds the spec from a chosen story instead of a full interview. Re-run to update an existing spec in place.
SKILL.md
6.8 KB, as published. Nobody here has run it
tiny-spec-create
Captures what the user wants and why, as testable REQ-N requirements.
This is the front door of the flow. A spec can be bound to a ticket or worked
ad-hoc — both are first-class (see below).
The suite works one spec at a time, namespaced per spec. Artifacts live
under .spec/ in the project root (the user's cwd) — never in this skill's
directory. Two are project-wide and shared at the .spec/ root
(constitution.md, memory.md); the per-spec ones (SPEC.md, PLAN.md,
tasks.md, decisions.md) live under .spec/<slug>/. Templates ship in this
skill's own templates/ folder (alongside this file); read them from there.
Seeded mode (BREAKDOWN.md present)
Before interviewing, check for BREAKDOWN.md at the project root (written by the
optional tiny-spec-breakdown skill). If it exists and the user is creating one of
its stories, seed from it instead of running the full interview — confirm, don't
re-ask:
- Pick the story. Ask which story (or infer from the user's request); match it
to its
## Feature:→Story:entry by slug or title. - Slug + binding. Use the story's slug for
.spec/<slug>/. Take the ticket provider from the Decisions Platform and the id from the story's tracker parent or the user (ask for the id if the placeholder is still blank; omit theticket:block entirely if the platform is ad-hoc). - Requirements. Promote the story's
AC:lines intoREQ-N— verbatim where already atomic; split any that hide two capabilities behind an "and". - Constitution (first run only). Seed
constitution.mdfrom the## Decisionsblock instead of interviewing stack/layout: Stack + Code-lives → Style and Layout; any verification hints → Verification commands; cross-cutting concerns → Guiding invariants. Ifconstitution.mdalready exists, reuse it. - Confirm the captured
REQ-Nwith the user, then writeSPEC.mdas below.
Only the project-wide questions collapse — still confirm this story's binding and
requirements. If there is no BREAKDOWN.md, or no entry matches, run the full
interview below unchanged.
Pick the slug (resolve the active dir)
Each spec lives in its own directory .spec/<slug>/. At the start of the interview,
establish the slug. There are two paths — both are first-class:
- Bound to a ticket. Ask for the provider (
jira | github | ado | monday), id, url, and optionally the current status. Derive the slug from the platform key: verbatim when filesystem-safe (PROJ-123); otherwise normalize — GitHub#42→gh-42, Monday item→monday-<id>, ADOAB#77→ado-77. - Ad-hoc (no ticket). Perfectly supported — just confirm there's no ticket and
use a short kebab-case slug of the feature name (e.g.
dark-mode,perf-pass). The SPEC omits theticket:frontmatter block, and commits drop theRefs:footer (everything else — namespacing, the constitution, the build loop — is identical). You can bind a ticket later by adding the block toSPEC.md.
Create .spec/<slug>/.
One branch per ticket — how the active ticket is resolved. Work for a ticket
lives on a branch named after the slug (e.g. PROJ-123 or
feature/PROJ-123-dark-mode); downstream skills resolve the active ticket from the
branch name, so several tickets can be in flight on separate branches at once. If the
user isn't already on such a branch, create one (e.g. git switch -c <slug>) so the
new spec resolves by branch match.
First run — scaffold
If .spec/ does not exist:
- Create
.spec/and the active ticket dir.spec/<slug>/(on the ticket branch — see above). - Short interview (keep it short — earned ceremony):
- the ticket binding (above);
- the intent in one paragraph;
- the language/stack and where code lives;
- the must-have requirements (the capabilities, not the design).
- Seed the shared constitution: copy this skill's
templates/constitution.template.mdto.spec/constitution.md(the root, not the ticket dir — it is project-wide) and fill in what the interview already told you (Style, Layout, Verification commands at minimum). Leave the rest fortiny-spec-planto harden — but never leave a section empty of intent. Ifconstitution.mdalready exists (a prior ticket created it), reuse it — do not overwrite the project's constitution.
Write SPEC.md
Copy this skill's templates/SPEC.template.md to .spec/<slug>/SPEC.md and fill
it in:
- the ticket binding frontmatter block (or omit it if there's no ticket);
- a one-paragraph intent;
- a
## Requirementslist — eachREQ-Na single user-observable, testable capability with no implementation detail ("the CLI accepts a--jsonflag and prints valid JSON", not "add a json module"); - the optional sections (
Context,Non-goals,Success criteria,Open questions,Links) where they add value — omit any that don't apply.
Number requirements REQ-1, REQ-2, …. Keep each atomic — if a line has an "and"
that hides two capabilities, split it.
Update mode (re-run on an existing spec)
When the active ticket's SPEC.md already exists and the user wants a change to
requirements (resolve the active dir by branch match — see the resolution order
downstream skills use):
-
Edit
.spec/<active>/SPEC.mdin place — add/alter/removeREQ-N, preserving existing ids where the requirement still exists. -
Flip downstream stale: set
PLAN.mdandtasks.mdfrontmatter tostatus: stale(if they exist). -
Log it: append a
decisions.mdentry to.spec/<active>/decisions.md, using the fixed skeleton (type: change, the affectedREQ-N). Create the file if absent:## D-NNN — <short title> - type: change - date: <ISO date> - affects: REQ-N - note: <what changed + why>
Tell the user which downstream docs went stale and to re-run tiny-spec-plan to
reconcile.
New spec? To start a different piece of work (a new ticket or an ad-hoc change), re-run this skill on a new branch — it creates a new
.spec/<slug>/that resolves by branch match. The sharedconstitution.mdandmemory.mdcarry over; the previous spec's artifacts stay untouched on disk.
When done
Report the requirements captured and point the user at tiny-spec-plan.