diff --git a/README.md b/README.md index 6ee5c53..304c38e 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,7 @@ # taskflow Home of **`tskflwctl`** — a local-first planning CLI over markdown+frontmatter -task/epic/audit files. It's the Go port of the Python `pm` prototype (now -retired — see below), and it dogfoods on its own planning under +task/epic/audit files. It dogfoods on its own planning under [`planning/`](./planning/). ## Demos @@ -19,6 +18,7 @@ status-grouped **finding tree**: | :-- | :-- | | `tskflwctl status` — counts, in-progress, epic bars, open audits | ![status](./assets/status.gif) | | `tskflwctl audit show ` — segmented finding bar + finding tree | ![audit show](./assets/audit-show.gif) | +| `tskflwctl task new` with no `--epic` — on a TTY it prompts: an epic picker, then tags | ![epic picker](./assets/picker.gif) | ▸ **[All demos, how they're recorded, and the demo fixture → `assets/README.md`](./assets/README.md)** — rendered with @@ -75,11 +75,11 @@ tskflwctl init # scaffold a planning tree here tskflwctl status # at-a-glance board: counts, in-progress, epic progress # create -tskflwctl task new "Add retry backoff" --epic 17-pm-go-cli --tags net -tskflwctl task new "Triage flake" --epic 17-pm-go-cli --tags ci --description "is CI red?" --start # straight to in-progress (--next/--start need --description) -echo "$BODY" | tskflwctl task new "Long writeup" --epic 17-pm-go-cli --tags x --body-file - # body from stdin/file +tskflwctl task new "Add retry backoff" --epic --tags net +tskflwctl task new "Triage flake" --epic --tags ci --description "is CI red?" --start # straight to in-progress (--next/--start need --description) +echo "$BODY" | tskflwctl task new "Long writeup" --epic --tags x --body-file - # body from stdin/file tskflwctl epic new "Billing overhaul" --description "Replace legacy pipeline" -tskflwctl audit new dispatcher # → audits/open/YYYY-MM-DD-dispatcher.md (--date to override) +tskflwctl audit new dispatcher # → audits/-YYYY-MM-DD-dispatcher.md (--date to override) tskflwctl audit new auth --template security # pick a body scaffold (default|security); --template is shell-completable # read @@ -114,15 +114,15 @@ tskflwctl audit close|reopen|defer ... # hygiene tskflwctl lint # validate active task frontmatter -tskflwctl lint --fix # auto-repair (normalize, relocate misfiled, backfill ids) +tskflwctl lint --fix # auto-repair frontmatter (quote ':' values, normalize lists, backfill ids) ``` -A task's `status:` is authoritative in frontmatter; `tasks//` is a -lock-step mirror of it. Lifecycle verbs change the status and relocate the file, -stamping dates atomically (`lint --fix` re-syncs a hand-edited drift). Errors -carry semantic exit codes — `10` -not-found, `11` validation, `13` ambiguous, `14` -conflict (e.g. a name already taken). +Tasks and audits are stored flat and id-led (`tasks/-.md`, +`audits/-.md`); `status:` / `bucket:` is authoritative in frontmatter, +with no mirror directory. Lifecycle verbs edit that field in place and stamp the +dates atomically — no file moves (`lint --fix` re-normalizes a hand-edited +drift). Errors carry semantic exit codes — `10` not-found, `11` validation, `13` +ambiguous, `14` conflict (e.g. a name already taken). **Body templates.** Each kind ships named body scaffolds; `task/epic/audit new --template ` picks one (omit it for `default`). Names are shell-completable @@ -196,13 +196,6 @@ output stays byte-identical. Program precedence: `TSKFLW_PAGER` → `[pager].com (in `.tskflwctl.toml`) → `$PAGER` → `less -FRX`. On/off: `--no-pager` → `--paginate` → `[pager].enabled` → default on. -### `pm` is retired - -The Python prototype (`bin/pm`) this tool was ported from is **gone** — -`tskflwctl` covers the full create → update → move → lint loop, and the Go -test suite is the executable spec now. The prototype and its tests live only -in git history (last at commit `39f1b83`) if archaeology is ever needed. - ## Shell completion `tskflwctl` ships cobra-generated completion for bash/zsh/fish. For zsh: @@ -236,8 +229,7 @@ a file's frontmatter is malformed). - `just fmt` — gofmt + lint formatting - `just tidy` — `go mod tidy` -Design rationale lives in [`docs/ARCHITECTURE.md`](./docs/ARCHITECTURE.md) and -[`planning/epics/17-pm-go-cli.md`](./planning/epics/17-pm-go-cli.md). +Design rationale lives in [`docs/ARCHITECTURE.md`](./docs/ARCHITECTURE.md). ### Interactive TUI (`tskflwctl ui`) diff --git a/assets/README.md b/assets/README.md index 2e0b157..555422b 100644 --- a/assets/README.md +++ b/assets/README.md @@ -26,6 +26,16 @@ open) above the status-grouped **finding tree**. ![tskflwctl audit show](./audit-show.gif) +## Interactive pickers (`task new` with no `--epic`) + +On a TTY, a missing required input **prompts** instead of erroring: `task new` +without `--epic` opens a type-to-filter epic picker, then a free-text tags +prompt. Off a TTY (a pipe, `--json`, `--no-input`) the same command fails with +the flag to pass — so nothing interactive can block a script. Prompts render to +stderr, so stdout stays a clean data stream. + +![task new epic picker](./picker.gif) + --- ## How they're made diff --git a/assets/audit-show.gif b/assets/audit-show.gif index 1372df2..ce719c7 100644 Binary files a/assets/audit-show.gif and b/assets/audit-show.gif differ diff --git a/assets/demo-planning/README.md b/assets/demo-planning/README.md index 304c7a0..22c6e56 100644 --- a/assets/demo-planning/README.md +++ b/assets/demo-planning/README.md @@ -1,9 +1,11 @@ # Demo planning fixture A small, **curated** planning tree the demo GIFs ([`../`](../)) record against — -authored to show `tskflwctl`'s symbology off in one screen, rather than recording -this repo's own [`planning/`](../../planning/) (whose audits are all closed, so the -open-audit section and the segmented bar wouldn't appear). +a **bike-workshop** project board (touring repairs, gravel upgrades, a BMX neon +paint job, a fixed-gear build) authored to show `tskflwctl`'s symbology off in +one screen, rather than recording this repo's own [`planning/`](../../planning/) +(whose audits are all closed, so the open-audit section and the segmented bar +wouldn't appear). It's a self-contained planning root (`taskflow_root = "."` in [`.tskflwctl.toml`](./.tskflwctl.toml)); the tapes `cd` into it. @@ -12,9 +14,9 @@ It's a self-contained planning root (`taskflow_root = "."` in | | Contents | Shows off | | :-- | :-- | :-- | -| **Epics** | `01-api-gateway` (50%), `02-observability` (33%), `03-data-pipeline` (100%) | the rollup bars at a spread of completion | -| **Tasks** | 8 across every active + archived status (in-progress, next-up, ready, completed, deferred) | the status glyphs and the dashboard's count line | -| **Audits** | one **open** (`2026-06-20-api-gateway`) + one **closed** (`2026-06-10-data-pipeline`) | the bucket glyphs and the Open-audits dashboard section | +| **Epics** | `01-touring-bike-repairs` (75%), `02-gravel-bike-upgrades` (50%), `03-bmx-neon-paint-job` (25%), `04-fixed-gear-build` (0%) | the rollup bars at a spread of completion | +| **Tasks** | 14 across every active + archived status (in-progress, next-up, ready, completed, deferred), each with a fleshed-out objective + acceptance criteria | the status glyphs, the dashboard's count line, and the `task ac` tally | +| **Audits** | one **open** (`2026-06-20-pre-tour-inspection`, 8 findings) + one **closed** (`2026-06-10-wheel-build-qc`) | the bucket glyphs and the Open-audits dashboard section | The open audit's eight findings deliberately span **fixed · landed · in-progress · open · deferred · wontfix**, so the **segmented finding bar** shows diff --git a/assets/demo-planning/audits/6fq9h1erg8ed-2026-06-20-pre-tour-inspection.md b/assets/demo-planning/audits/6fq9h1erg8ed-2026-06-20-pre-tour-inspection.md new file mode 100644 index 0000000..34e3fb6 --- /dev/null +++ b/assets/demo-planning/audits/6fq9h1erg8ed-2026-06-20-pre-tour-inspection.md @@ -0,0 +1,100 @@ +--- +schema: 1 +id: 6fq9h1erg8ed +bucket: open +area: pre-tour-inspection +date: "2026-06-20" +--- +# Audit: pre-tour-inspection — 2026-06-20 + +> Pre-departure safety sweep of the touring bike. Edit findings in place and flip +> each `**Status:**` as you work it. + +## Findings + +#### H1. Rear brake pads worn past the wear line · **Status:** fixed (2026-06-20) + +**Component:** brakes +**Effort:** S · **Urgency:** acute + +Both rear pads are down to the metal backing, glazed, and biting late — on a +loaded bike descending a pass that's a stopping-distance problem, not a comfort +one. + +**Recommendation:** fit fresh cartridge pads, bed them in, and re-check toe-in. + +#### H2. Chain stretched beyond 0.75% · **Status:** fixed (2026-06-20) + +**Component:** drivetrain +**Effort:** S · **Urgency:** soon + +The wear gauge drops fully in at 0.75%. Left on, it will start skating over the +cassette under climbing load and chew the chainrings. + +**Recommendation:** replace the chain; re-measure the cassette for hooking. + +#### H3. Headset has a notchy index at center · **Status:** landed (2026-06-19) + +**Component:** headset +**Effort:** M · **Urgency:** soon + +Bars settle to dead-center on their own — the bearing races are brinelled from +years of braking loads, so the steering catches straight ahead. + +**Recommendation:** replace both cartridge bearings; grease and re-preload. + +#### H4. Rear derailleur hanger is slightly bent inboard · **Status:** in-progress + +**Component:** drivetrain +**Effort:** S · **Urgency:** soon + +Indexing won't hold across the two largest cogs; a hanger-alignment gauge shows +~4mm of inboard lean at the rim. + +**Recommendation:** cold-set the hanger true with the gauge, then re-index. + +#### H5. Front tire sidewall is cracking · **Status:** open + +**Component:** tires +**Effort:** S · **Urgency:** soon + +Fine crazing runs the length of both sidewalls where the casing flexes. It holds +air today, but not a 60-mile day in the heat with a load. + +**Recommendation:** replace with a touring-rated tire; keep the old one as a boot. + +#### H6. Bottom bracket creaks under climbing load · **Status:** open + +**Component:** bottom-bracket +**Effort:** M · **Urgency:** soon + +A sharp creak tracks pedal pressure, loudest out of the saddle. Could be the BB +cups, the crank interface, or the pedals — needs isolating. + +**Recommendation:** pull the crank, degrease and re-torque the interfaces, then +retest before condemning the BB. + +#### H7. Bar tape is frayed at the hoods · **Status:** wontfix + +**Component:** cockpit +**Effort:** XS · **Urgency:** eventually + +Cosmetic wear where the hands rest. The rider likes the broken-in grip and wants +it left alone until after the trip. + +**Recommendation:** none for now; re-wrap post-tour. + +#### H8. Front fender rattles on washboard · **Status:** deferred + +**Component:** fenders +**Effort:** XS · **Urgency:** eventually + +The fender stay buzzes on rough gravel. Annoying, not a safety issue; deferred +behind the drivetrain and brake work. + +**Recommendation:** add a rubber grommet at the stay mount. + +## Candidate tasks + +- ✅ `tskflwctl task new "Replace chain and cassette" --epic 01-touring-bike-repairs --tags drivetrain` — chain past 0.75% +- ⏳ `tskflwctl task new "Overhaul bottom bracket" --epic 01-touring-bike-repairs --tags bearings` — isolate the climbing creak diff --git a/assets/demo-planning/audits/6fq9h1et173b-2026-06-10-wheel-build-qc.md b/assets/demo-planning/audits/6fq9h1et173b-2026-06-10-wheel-build-qc.md new file mode 100644 index 0000000..b292600 --- /dev/null +++ b/assets/demo-planning/audits/6fq9h1et173b-2026-06-10-wheel-build-qc.md @@ -0,0 +1,57 @@ +--- +schema: 1 +id: 6fq9h1et173b +bucket: closed +area: wheel-build-qc +date: "2026-06-10" +--- +# Audit: wheel-build-qc — 2026-06-10 + +> Quality check on the freshly built touring rear wheel before it goes on the +> bike. Edit findings in place and flip each `**Status:**` as you work it. + +## Findings + +#### H1. Drive-side spoke tension uneven · **Status:** fixed (2026-06-11) + +**Component:** wheels +**Effort:** M · **Urgency:** soon + +The tension meter shows a 25% spread across the drive side — a few loose spokes +that will detension and go pingy under a loaded rack. + +**Recommendation:** even the tension to within 10%, stress-relieve, re-check. + +#### H2. Rim not dished to center · **Status:** fixed (2026-06-11) + +**Component:** wheels +**Effort:** S · **Urgency:** soon + +The rim sits ~2mm to the non-drive side in the dishing gauge, so the wheel won't +center in the frame. + +**Recommendation:** add drive-side tension to pull the rim to true center. + +#### H3. Nipples creak under first load · **Status:** landed (2026-06-10) + +**Component:** wheels +**Effort:** XS · **Urgency:** eventually + +New nipples creak against the rim eyelets on the first hard pedal — dry seats, +not a build fault. + +**Recommendation:** a drop of oil at each nipple/rim interface; re-stress. + +#### H4. Slight radial hop at the valve hole · **Status:** wontfix + +**Component:** wheels +**Effort:** S · **Urgency:** eventually + +~0.3mm of radial runout at the seam. It's within touring tolerance and chasing it +would unbalance the lateral true. + +**Recommendation:** none; within spec. + +## Candidate tasks + +- ✅ `tskflwctl task new "True both wheels" --epic 01-touring-bike-repairs --tags wheels` — even tension + dish diff --git a/assets/demo-planning/audits/closed/2026-06-10-data-pipeline.md b/assets/demo-planning/audits/closed/2026-06-10-data-pipeline.md deleted file mode 100644 index db27c61..0000000 --- a/assets/demo-planning/audits/closed/2026-06-10-data-pipeline.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -schema: 1 -area: data-pipeline -date: "2026-06-10" ---- -# Audit: data-pipeline - -#### H1. Backfill lacks idempotency · **Status:** fixed -Guard the backfill with a checkpoint table. - -#### M1. Schema migration not transactional · **Status:** fixed -Wrap the DDL + data move in one transaction. diff --git a/assets/demo-planning/audits/open/2026-06-20-api-gateway.md b/assets/demo-planning/audits/open/2026-06-20-api-gateway.md deleted file mode 100644 index 9c9eb3c..0000000 --- a/assets/demo-planning/audits/open/2026-06-20-api-gateway.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -schema: 1 -area: api-gateway -date: "2026-06-20" ---- -# Audit: api-gateway - -Scope: the public gateway edge — routing, auth, limits, error handling. - -#### H1. Unbounded request body buffering · **Status:** fixed -Stream large uploads instead of buffering them whole. - -#### H2. Auth bypass on trailing-slash routes · **Status:** fixed -Normalize the path before the auth check. - -#### M1. Retry storm on upstream 5xx · **Status:** landed -Add jittered exponential backoff with a budget. - -#### M2. Per-IP limiter shares one bucket · **Status:** in-progress -Key the token bucket by client identity, not the edge node. - -#### M3. Inconsistent error envelope · **Status:** open -Settle one error schema across handlers. - -#### L1. Verbose access logs on the hot path · **Status:** deferred -Sample healthy-path logs once tracing lands. - -#### L2. Legacy /v0 routes still mounted · **Status:** wontfix -Kept intentionally for one deprecated client. - -#### L3. Header casing mismatch in CORS · **Status:** fixed -Canonicalize header names at the edge. diff --git a/assets/demo-planning/epics/01-api-gateway.md b/assets/demo-planning/epics/01-api-gateway.md deleted file mode 100644 index e9a946f..0000000 --- a/assets/demo-planning/epics/01-api-gateway.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -schema: 1 -status: active -description: Rate limiting, auth, and pagination for the public API gateway. -priority: medium -tags: [] -created: "2026-06-25" ---- - -# API gateway - -**Goal.** Rate limiting, auth, and pagination for the public API gateway. - -## Why this is its own epic - - - -## Out of scope - -- diff --git a/assets/demo-planning/epics/01-touring-bike-repairs.md b/assets/demo-planning/epics/01-touring-bike-repairs.md new file mode 100644 index 0000000..ceec54c --- /dev/null +++ b/assets/demo-planning/epics/01-touring-bike-repairs.md @@ -0,0 +1,23 @@ +--- +schema: 1 +status: active +description: Overhaul a steel touring bike end-to-end for a cross-country trip. +priority: high +tags: [touring, repair] +created: "2026-07-18" +--- +# Touring bike repairs + +## Goal + +Overhaul a steel touring bike end-to-end for a self-supported cross-country trip +— bearings, drivetrain, and wheels all trip-ready with margin to spare. + +## Why this is its own epic + +The tour has a hard departure date, so each subsystem gets its own tracked fix +instead of a vague "give it a once-over." + +## Out of scope + +- Frame respray — the paint is sound; this epic is mechanical. diff --git a/assets/demo-planning/epics/02-gravel-bike-upgrades.md b/assets/demo-planning/epics/02-gravel-bike-upgrades.md new file mode 100644 index 0000000..92bc7bd --- /dev/null +++ b/assets/demo-planning/epics/02-gravel-bike-upgrades.md @@ -0,0 +1,23 @@ +--- +schema: 1 +status: active +description: Upgrade a gravel bike for multi-day bikepacking races. +priority: medium +tags: [gravel, upgrade] +created: "2026-07-18" +--- +# Gravel bike upgrades + +## Goal + +Upgrade a gravel bike for multi-day bikepacking races: tubeless traction, a +simpler 1x drivetrain, and enough mounts to carry three days of kit. + +## Why this is its own epic + +These are discretionary upgrades on a working bike, sequenced so the race-day +setup can be tested on training rides before it counts. + +## Out of scope + +- A new frameset — this is about getting more out of the current one. diff --git a/assets/demo-planning/epics/02-observability.md b/assets/demo-planning/epics/02-observability.md deleted file mode 100644 index d5c7002..0000000 --- a/assets/demo-planning/epics/02-observability.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -schema: 1 -status: active -description: Traces, dashboards, and alerting across services. -priority: medium -tags: [] -created: "2026-06-25" ---- - -# Observability - -**Goal.** Traces, dashboards, and alerting across services. - -## Why this is its own epic - - - -## Out of scope - -- diff --git a/assets/demo-planning/epics/03-bmx-neon-paint-job.md b/assets/demo-planning/epics/03-bmx-neon-paint-job.md new file mode 100644 index 0000000..ba12d4f --- /dev/null +++ b/assets/demo-planning/epics/03-bmx-neon-paint-job.md @@ -0,0 +1,23 @@ +--- +schema: 1 +status: active +description: Strip and repaint a BMX frame in neon under a clear coat. +priority: medium +tags: [bmx, paint] +created: "2026-07-18" +--- +# BMX neon paint job + +## Goal + +Strip a scuffed BMX frame to bare metal and repaint it in a neon finish under a +durable clear coat — a look that pops at the skatepark and survives it. + +## Why this is its own epic + +Paint is a strict pipeline — strip, prime, base, clear — where each stage has to +cure before the next, so the steps are tracked in order. + +## Out of scope + +- New components — the build stays; only the frame gets refinished. diff --git a/assets/demo-planning/epics/03-data-pipeline.md b/assets/demo-planning/epics/03-data-pipeline.md deleted file mode 100644 index 3332643..0000000 --- a/assets/demo-planning/epics/03-data-pipeline.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -schema: 1 -status: active -description: Backfill + schema migration for the events pipeline. -priority: medium -tags: [] -created: "2026-06-25" ---- - -# Data pipeline - -**Goal.** Backfill + schema migration for the events pipeline. - -## Why this is its own epic - - - -## Out of scope - -- diff --git a/assets/demo-planning/epics/04-fixed-gear-build.md b/assets/demo-planning/epics/04-fixed-gear-build.md new file mode 100644 index 0000000..2a72c3a --- /dev/null +++ b/assets/demo-planning/epics/04-fixed-gear-build.md @@ -0,0 +1,23 @@ +--- +schema: 1 +status: active +description: Build a fixed-gear commuter up from a bare frame. +priority: low +tags: [fixed-gear, build] +created: "2026-07-18" +--- +# Fixed-gear build + +## Goal + +Build a fixed-gear commuter up from a bare frame — a clean, low-maintenance +single-speed for daily city miles. + +## Why this is its own epic + +A fresh build from parts, so the remaining work is small and self-contained: get +the contact points and the chainline dialed. + +## Out of scope + +- A geared freewheel conversion — this bike is fixed by design. diff --git a/assets/demo-planning/tasks/6fq9h1djhs07-rebuild-rear-hub.md b/assets/demo-planning/tasks/6fq9h1djhs07-rebuild-rear-hub.md new file mode 100644 index 0000000..4e7c7ff --- /dev/null +++ b/assets/demo-planning/tasks/6fq9h1djhs07-rebuild-rear-hub.md @@ -0,0 +1,38 @@ +--- +schema: 1 +id: 6fq9h1djhs07 +status: completed +epic: 01-touring-bike-repairs +description: 'Rebuild the rear hub: new bearings, pawls, and preload.' +effort: Unknown +tier: 3 +priority: medium +autonomy_level: 3 +tags: [bearings] +created: "2026-07-18" +started_at: "2026-07-18" +updated_at: "2026-07-18" +completed_at: "2026-07-18" +--- +# Rebuild rear hub + +## Objective + +The rear hub picked up play and a notchy feel after last season's wet miles. +Strip it, replace the cartridge bearings and freehub pawls, regrease, and reset +the preload so it spins free with zero lateral rock before the tour. + +## Acceptance criteria + +- [x] Old bearings and pawls pressed out and inspected +- [x] New cartridge bearings seated square +- [x] Freehub pawls and spring replaced and lightly greased +- [x] Preload set — spins freely, no lateral play + +## Out of scope + +- The front hub — tracked on its own if it needs it. + +## Related + +- Epic [01-touring-bike-repairs](../epics/01-touring-bike-repairs.md) diff --git a/assets/demo-planning/tasks/6fq9h1dkzfdf-replace-chain-and-cassette.md b/assets/demo-planning/tasks/6fq9h1dkzfdf-replace-chain-and-cassette.md new file mode 100644 index 0000000..57aee23 --- /dev/null +++ b/assets/demo-planning/tasks/6fq9h1dkzfdf-replace-chain-and-cassette.md @@ -0,0 +1,38 @@ +--- +schema: 1 +id: 6fq9h1dkzfdf +status: completed +epic: 01-touring-bike-repairs +description: Replace the stretched chain and hooked cassette. +effort: Unknown +tier: 3 +priority: medium +autonomy_level: 3 +tags: [drivetrain] +created: "2026-07-18" +started_at: "2026-07-18" +completed_at: "2026-07-18" +updated_at: "2026-07-18" +--- +# Replace chain and cassette + +## Objective + +The chain measured past 0.75% and the cassette had begun to hook, so shifts +skipped under climbing load. Replace both as a set and re-index so the drivetrain +runs quiet and holds every gear fully loaded. + +## Acceptance criteria + +- [x] Worn chain removed and drivetrain degreased +- [x] New cassette and chain fitted, sized to big-big plus two links +- [x] Indexing dialed across the full range +- [x] Test climb: no skip under load + +## Out of scope + +- Chainring replacement — still within wear. + +## Related + +- Epic [01-touring-bike-repairs](../epics/01-touring-bike-repairs.md) diff --git a/assets/demo-planning/tasks/6fq9h1dne7mt-true-both-wheels.md b/assets/demo-planning/tasks/6fq9h1dne7mt-true-both-wheels.md new file mode 100644 index 0000000..b9efffb --- /dev/null +++ b/assets/demo-planning/tasks/6fq9h1dne7mt-true-both-wheels.md @@ -0,0 +1,38 @@ +--- +schema: 1 +id: 6fq9h1dne7mt +status: completed +epic: 01-touring-bike-repairs +description: True both wheels and even out spoke tension. +effort: Unknown +tier: 3 +priority: medium +autonomy_level: 3 +tags: [wheels] +created: "2026-07-18" +started_at: "2026-07-18" +updated_at: "2026-07-18" +completed_at: "2026-07-18" +--- +# True both wheels + +## Objective + +Both wheels drifted out of true and the rear tension was uneven after the hub +rebuild. Even the spoke tension, re-dish, and true laterally and radially so they +stay round under a loaded rack. + +## Acceptance criteria + +- [x] Drive-side tension evened to within 10% +- [x] Rear wheel dished to center +- [x] Lateral true within 0.5mm +- [x] Stress-relieved and re-checked + +## Out of scope + +- Rebuilding either wheel — the rims and spokes are sound. + +## Related + +- Epic [01-touring-bike-repairs](../epics/01-touring-bike-repairs.md) diff --git a/assets/demo-planning/tasks/6fq9h1dq1qwp-overhaul-bottom-bracket.md b/assets/demo-planning/tasks/6fq9h1dq1qwp-overhaul-bottom-bracket.md new file mode 100644 index 0000000..215e4f9 --- /dev/null +++ b/assets/demo-planning/tasks/6fq9h1dq1qwp-overhaul-bottom-bracket.md @@ -0,0 +1,36 @@ +--- +schema: 1 +id: 6fq9h1dq1qwp +status: in-progress +epic: 01-touring-bike-repairs +description: Isolate and fix the bottom-bracket creak. +effort: Unknown +tier: 3 +priority: medium +autonomy_level: 3 +tags: [bearings] +created: "2026-07-18" +started_at: "2026-07-18" +--- +# Overhaul bottom bracket + +## Objective + +A creak tracks pedal pressure out of the saddle. Pull the crank, isolate whether +it's the BB cups, the crank interface, or the pedals, then clean, grease, and +re-torque — replacing the BB only if it's actually notchy. + +## Acceptance criteria + +- [x] Crank removed, interfaces degreased +- [ ] Creak isolated (BB vs crank vs pedals) +- [ ] Interfaces greased and torqued to spec +- [ ] Test climb: silent under load + +## Out of scope + +- Switching BB standards — staying with the current shell. + +## Related + +- Epic [01-touring-bike-repairs](../epics/01-touring-bike-repairs.md) diff --git a/assets/demo-planning/tasks/6fq9h1drfa8d-convert-to-tubeless.md b/assets/demo-planning/tasks/6fq9h1drfa8d-convert-to-tubeless.md new file mode 100644 index 0000000..f762f01 --- /dev/null +++ b/assets/demo-planning/tasks/6fq9h1drfa8d-convert-to-tubeless.md @@ -0,0 +1,38 @@ +--- +schema: 1 +id: 6fq9h1drfa8d +status: completed +epic: 02-gravel-bike-upgrades +description: Convert the gravel wheels to tubeless. +effort: Unknown +tier: 3 +priority: medium +autonomy_level: 3 +tags: [tires] +created: "2026-07-18" +started_at: "2026-07-18" +completed_at: "2026-07-18" +updated_at: "2026-07-18" +--- +# Convert to tubeless + +## Objective + +Drop the tubes to run lower pressures for grip and fewer pinch flats on chunky +gravel. Tape the rims, seat tubeless tires, add sealant, and confirm they hold +overnight. + +## Acceptance criteria + +- [x] Rims taped and valves fitted +- [x] Tires seated and beads popped +- [x] Sealant added and spun to coat +- [x] Held pressure overnight + +## Out of scope + +- New rims — the current ones are tubeless-ready. + +## Related + +- Epic [02-gravel-bike-upgrades](../epics/02-gravel-bike-upgrades.md) diff --git a/assets/demo-planning/tasks/6fq9h1dtgyza-fit-1x-drivetrain.md b/assets/demo-planning/tasks/6fq9h1dtgyza-fit-1x-drivetrain.md new file mode 100644 index 0000000..c57cbdd --- /dev/null +++ b/assets/demo-planning/tasks/6fq9h1dtgyza-fit-1x-drivetrain.md @@ -0,0 +1,38 @@ +--- +schema: 1 +id: 6fq9h1dtgyza +status: completed +epic: 02-gravel-bike-upgrades +description: Fit a 1x drivetrain with a clutch derailleur. +effort: Unknown +tier: 3 +priority: medium +autonomy_level: 3 +tags: [drivetrain] +created: "2026-07-18" +started_at: "2026-07-18" +completed_at: "2026-07-18" +updated_at: "2026-07-18" +--- +# Fit 1x drivetrain + +## Objective + +Simplify to a 1x setup for fewer things to go wrong mid-race. Remove the front +derailleur and shifter, fit a narrow-wide ring and a clutch rear derailleur, and +set the chain length for the new range. + +## Acceptance criteria + +- [x] Front derailleur and left shifter removed +- [x] Narrow-wide chainring installed +- [x] Clutch rear derailleur fitted and indexed +- [x] Chain sized and retention tested over rough ground + +## Out of scope + +- A wider-range cassette — the current spread is enough. + +## Related + +- Epic [02-gravel-bike-upgrades](../epics/02-gravel-bike-upgrades.md) diff --git a/assets/demo-planning/tasks/6fq9h1dw0hcz-install-dropper-post.md b/assets/demo-planning/tasks/6fq9h1dw0hcz-install-dropper-post.md new file mode 100644 index 0000000..949dd1d --- /dev/null +++ b/assets/demo-planning/tasks/6fq9h1dw0hcz-install-dropper-post.md @@ -0,0 +1,33 @@ +--- +schema: 1 +id: 6fq9h1dw0hcz +status: next-up +epic: 02-gravel-bike-upgrades +description: Install a dropper post and route the cable. +effort: Unknown +tier: 3 +priority: medium +autonomy_level: 3 +tags: [dropper] +created: "2026-07-18" +--- +# Install dropper post + +## Objective + +Add a dropper to get the saddle out of the way on loose descents. Route the cable +internally, set the lever at the bar, and dial the return speed. + +## Acceptance criteria + +- [ ] Post fitted and cable routed internally +- [ ] Lever mounted and throw set +- [ ] Return speed and travel dialed + +## Out of scope + +- Frame re-routing — using the existing ports. + +## Related + +- Epic [02-gravel-bike-upgrades](../epics/02-gravel-bike-upgrades.md) diff --git a/assets/demo-planning/tasks/6fq9h1dxpza0-mount-frame-bags.md b/assets/demo-planning/tasks/6fq9h1dxpza0-mount-frame-bags.md new file mode 100644 index 0000000..8fa4d74 --- /dev/null +++ b/assets/demo-planning/tasks/6fq9h1dxpza0-mount-frame-bags.md @@ -0,0 +1,34 @@ +--- +schema: 1 +id: 6fq9h1dxpza0 +status: ready-to-start +epic: 02-gravel-bike-upgrades +description: Mount frame-bag anchors and cargo-cage bosses. +effort: Unknown +tier: 3 +priority: medium +autonomy_level: 3 +tags: [bikepacking] +created: "2026-07-18" +--- +# Mount frame bags + +## Objective + +Add carrying capacity for multi-day kit without a rack: fit anchors for a +top-tube bag and cargo-cage bosses on the fork legs, checking heel and knee +clearance. + +## Acceptance criteria + +- [ ] Top-tube bag anchors fitted +- [ ] Fork cargo-cage bosses mounted +- [ ] Clearance checked (heel, knee, steering) + +## Out of scope + +- A full rack-and-pannier setup — staying bikepacking-light. + +## Related + +- Epic [02-gravel-bike-upgrades](../epics/02-gravel-bike-upgrades.md) diff --git a/assets/demo-planning/tasks/6fq9h1dz5qva-strip-old-paint.md b/assets/demo-planning/tasks/6fq9h1dz5qva-strip-old-paint.md new file mode 100644 index 0000000..2a6a529 --- /dev/null +++ b/assets/demo-planning/tasks/6fq9h1dz5qva-strip-old-paint.md @@ -0,0 +1,36 @@ +--- +schema: 1 +id: 6fq9h1dz5qva +status: completed +epic: 03-bmx-neon-paint-job +description: Strip the BMX frame to bare metal. +effort: Unknown +tier: 3 +priority: medium +autonomy_level: 3 +tags: [paint] +created: "2026-07-18" +started_at: "2026-07-18" +updated_at: "2026-07-18" +completed_at: "2026-07-18" +--- +# Strip old paint + +## Objective + +Take the scuffed BMX frame back to bare metal so the new finish has clean tooth +to grip. Strip the old paint, then de-grease and de-dust every tube. + +## Acceptance criteria + +- [x] Hardware and bearings removed, threads masked +- [x] Old paint stripped to bare metal +- [x] Frame de-greased and blown clean + +## Out of scope + +- Dent or braze repair — the frame is straight and sound. + +## Related + +- Epic [03-bmx-neon-paint-job](../epics/03-bmx-neon-paint-job.md) diff --git a/assets/demo-planning/tasks/6fq9h1e0vpv5-prime-and-sand-frame.md b/assets/demo-planning/tasks/6fq9h1e0vpv5-prime-and-sand-frame.md new file mode 100644 index 0000000..d6944a8 --- /dev/null +++ b/assets/demo-planning/tasks/6fq9h1e0vpv5-prime-and-sand-frame.md @@ -0,0 +1,34 @@ +--- +schema: 1 +id: 6fq9h1e0vpv5 +status: in-progress +epic: 03-bmx-neon-paint-job +description: Prime and wet-sand the BMX frame smooth. +effort: Unknown +tier: 3 +priority: medium +autonomy_level: 3 +tags: [paint] +created: "2026-07-18" +started_at: "2026-07-18" +--- +# Prime and sand frame + +## Objective + +Lay down an even etch primer and wet-sand it smooth so the neon base goes on +glass-flat with no bare spots at the welds. + +## Acceptance criteria + +- [x] Etch primer coats sprayed +- [ ] Primer wet-sanded to 600 grit +- [ ] Welds and dropouts checked for coverage + +## Out of scope + +- Filler primer for deep scratches — none deep enough to need it. + +## Related + +- Epic [03-bmx-neon-paint-job](../epics/03-bmx-neon-paint-job.md) diff --git a/assets/demo-planning/tasks/6fq9h1e24qqn-spray-neon-base-coats.md b/assets/demo-planning/tasks/6fq9h1e24qqn-spray-neon-base-coats.md new file mode 100644 index 0000000..279cdd0 --- /dev/null +++ b/assets/demo-planning/tasks/6fq9h1e24qqn-spray-neon-base-coats.md @@ -0,0 +1,33 @@ +--- +schema: 1 +id: 6fq9h1e24qqn +status: ready-to-start +epic: 03-bmx-neon-paint-job +description: Spray the neon base coats evenly. +effort: Unknown +tier: 3 +priority: medium +autonomy_level: 3 +tags: [paint] +created: "2026-07-18" +--- +# Spray neon base coats + +## Objective + +Lay the neon color in thin, even passes over a white base so it reads bright and +uniform, letting each coat flash off before the next. + +## Acceptance criteria + +- [ ] White base coat down for punch +- [ ] Neon sprayed in thin even passes +- [ ] Coverage even under shop light and daylight + +## Out of scope + +- Masked graphics or fades — a solid neon this round. + +## Related + +- Epic [03-bmx-neon-paint-job](../epics/03-bmx-neon-paint-job.md) diff --git a/assets/demo-planning/tasks/6fq9h1e3qmyw-clear-coat-and-reassemble.md b/assets/demo-planning/tasks/6fq9h1e3qmyw-clear-coat-and-reassemble.md new file mode 100644 index 0000000..4838ac2 --- /dev/null +++ b/assets/demo-planning/tasks/6fq9h1e3qmyw-clear-coat-and-reassemble.md @@ -0,0 +1,36 @@ +--- +schema: 1 +id: 6fq9h1e3qmyw +status: deferred +epic: 03-bmx-neon-paint-job +description: Clear-coat the frame and reassemble the BMX. +effort: Unknown +tier: 3 +priority: medium +autonomy_level: 3 +tags: [paint] +created: "2026-07-18" +updated_at: "2026-07-18" +deferred_at: "2026-07-18" +revisit_at: "2026-09-01" +--- +# Clear-coat and reassemble + +## Objective + +Seal the neon under a durable clear coat, let it fully cure, then rebuild the bike +with fresh bearings. Waiting on the base coats to go down and cure first. + +## Acceptance criteria + +- [ ] Clear coat sprayed and left to cure hard +- [ ] Frame wet-sanded and buffed +- [ ] Bike reassembled with fresh bearings + +## Out of scope + +- A polish and wax routine — that's ongoing care, not the build. + +## Related + +- Epic [03-bmx-neon-paint-job](../epics/03-bmx-neon-paint-job.md) diff --git a/assets/demo-planning/tasks/6fq9h1e58fcf-install-pedals-and-toe-clips.md b/assets/demo-planning/tasks/6fq9h1e58fcf-install-pedals-and-toe-clips.md new file mode 100644 index 0000000..2af0234 --- /dev/null +++ b/assets/demo-planning/tasks/6fq9h1e58fcf-install-pedals-and-toe-clips.md @@ -0,0 +1,33 @@ +--- +schema: 1 +id: 6fq9h1e58fcf +status: ready-to-start +epic: 04-fixed-gear-build +description: Install the pedals and toe clips. +effort: Unknown +tier: 3 +priority: medium +autonomy_level: 3 +tags: [contact-points] +created: "2026-07-18" +--- +# Install pedals and toe clips + +## Objective + +Set up the contact points on the fixed-gear: grease and torque the pedals to the +right cranks, then fit toe clips and straps sized for daily commuting shoes. + +## Acceptance criteria + +- [ ] Pedals greased and torqued (mind the left reverse thread) +- [ ] Toe clips and straps fitted +- [ ] Clip size and strap tension set for commute shoes + +## Out of scope + +- Clipless pedals — running clips and straps by choice. + +## Related + +- Epic [04-fixed-gear-build](../epics/04-fixed-gear-build.md) diff --git a/assets/demo-planning/tasks/6fq9h1e7a2zc-set-chain-tension.md b/assets/demo-planning/tasks/6fq9h1e7a2zc-set-chain-tension.md new file mode 100644 index 0000000..4441f08 --- /dev/null +++ b/assets/demo-planning/tasks/6fq9h1e7a2zc-set-chain-tension.md @@ -0,0 +1,33 @@ +--- +schema: 1 +id: 6fq9h1e7a2zc +status: next-up +epic: 04-fixed-gear-build +description: Set the fixed-gear chain tension and chainline. +effort: Unknown +tier: 3 +priority: medium +autonomy_level: 3 +tags: [drivetrain] +created: "2026-07-18" +--- +# Set chain tension + +## Objective + +Dial the chainline and tension on the fixed cog: set the wheel in the track ends +for a straight line and a little vertical play, then lock it so it can't creep. + +## Acceptance criteria + +- [ ] Chainline checked straight, cog to chainring +- [ ] Tension set — slight play, no tight spot through a full turn +- [ ] Track nuts torqued; wheel can't pull forward + +## Out of scope + +- A chain tensioner — a fixed drivetrain sets tension at the dropouts. + +## Related + +- Epic [04-fixed-gear-build](../epics/04-fixed-gear-build.md) diff --git a/assets/demo-planning/tasks/completed/add-rate-limiting.md b/assets/demo-planning/tasks/completed/add-rate-limiting.md deleted file mode 100644 index 156828d..0000000 --- a/assets/demo-planning/tasks/completed/add-rate-limiting.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -schema: 1 -status: completed -epic: 01-api-gateway -description: Token-bucket limiter on the gateway edge. -effort: Unknown -tier: 3 -priority: medium -autonomy_level: 3 -tags: [api] -created: "2026-06-25" -updated_at: "2026-06-25" -completed_at: "2026-06-25" ---- - -# Add rate limiting - -## Objective - - - -## Acceptance criteria - -- [ ] - -## Out of scope - -- - -## Related - -- Epic [[01-api-gateway]] diff --git a/assets/demo-planning/tasks/completed/backfill-events-table.md b/assets/demo-planning/tasks/completed/backfill-events-table.md deleted file mode 100644 index fcf282e..0000000 --- a/assets/demo-planning/tasks/completed/backfill-events-table.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -schema: 1 -status: completed -epic: 03-data-pipeline -description: One-off backfill of the new events schema. -effort: Unknown -tier: 3 -priority: medium -autonomy_level: 3 -tags: [data] -created: "2026-06-25" -updated_at: "2026-06-25" -completed_at: "2026-06-25" ---- - -# Backfill events table - -## Objective - - - -## Acceptance criteria - -- [ ] - -## Out of scope - -- - -## Related - -- Epic [[03-data-pipeline]] diff --git a/assets/demo-planning/tasks/completed/emit-request-traces.md b/assets/demo-planning/tasks/completed/emit-request-traces.md deleted file mode 100644 index 5f10d69..0000000 --- a/assets/demo-planning/tasks/completed/emit-request-traces.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -schema: 1 -status: completed -epic: 02-observability -description: OpenTelemetry spans on every handler. -effort: Unknown -tier: 3 -priority: medium -autonomy_level: 3 -tags: [obs] -created: "2026-06-25" -updated_at: "2026-06-25" -completed_at: "2026-06-25" ---- - -# Emit request traces - -## Objective - - - -## Acceptance criteria - -- [ ] - -## Out of scope - -- - -## Related - -- Epic [[02-observability]] diff --git a/assets/demo-planning/tasks/completed/wire-auth-middleware.md b/assets/demo-planning/tasks/completed/wire-auth-middleware.md deleted file mode 100644 index 7695255..0000000 --- a/assets/demo-planning/tasks/completed/wire-auth-middleware.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -schema: 1 -status: completed -epic: 01-api-gateway -description: JWT validation + scopes on protected routes. -effort: Unknown -tier: 3 -priority: medium -autonomy_level: 3 -tags: [api, auth] -created: "2026-06-25" -completed_at: "2026-06-25" -updated_at: "2026-06-25" ---- - -# Wire auth middleware - -## Objective - - - -## Acceptance criteria - -- [ ] - -## Out of scope - -- - -## Related - -- Epic [[01-api-gateway]] diff --git a/assets/demo-planning/tasks/deferred/sample-noisy-logs.md b/assets/demo-planning/tasks/deferred/sample-noisy-logs.md deleted file mode 100644 index fdcde21..0000000 --- a/assets/demo-planning/tasks/deferred/sample-noisy-logs.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -schema: 1 -status: deferred -epic: 02-observability -description: Drop 90% of healthy-path logs. -effort: Unknown -tier: 3 -priority: medium -autonomy_level: 3 -tags: [obs] -created: "2026-06-25" -updated_at: "2026-06-25" -deferred_at: "2026-06-25" ---- - -# Sample noisy logs - -## Objective - - - -## Acceptance criteria - -- [ ] - -## Out of scope - -- - -## Related - -- Epic [[02-observability]] diff --git a/assets/demo-planning/tasks/in-progress/add-retry-backoff.md b/assets/demo-planning/tasks/in-progress/add-retry-backoff.md deleted file mode 100644 index 8a5a3c7..0000000 --- a/assets/demo-planning/tasks/in-progress/add-retry-backoff.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -schema: 1 -status: in-progress -epic: 01-api-gateway -description: Exponential backoff for upstream 5xx. -effort: Unknown -tier: 3 -priority: medium -autonomy_level: 3 -tags: [api] -created: "2026-06-25" -started_at: "2026-06-25" ---- - -# Add retry backoff - -## Objective - - - -## Acceptance criteria - -- [ ] - -## Out of scope - -- - -## Related - -- Epic [[01-api-gateway]] diff --git a/assets/demo-planning/tasks/next-up/alert-on-error-rate.md b/assets/demo-planning/tasks/next-up/alert-on-error-rate.md deleted file mode 100644 index 017ab15..0000000 --- a/assets/demo-planning/tasks/next-up/alert-on-error-rate.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -schema: 1 -status: next-up -epic: 02-observability -description: Page when 5xx rate crosses 2% for 5m. -effort: Unknown -tier: 3 -priority: medium -autonomy_level: 3 -tags: [obs] -created: "2026-06-25" ---- - -# Alert on error rate - -## Objective - - - -## Acceptance criteria - -- [ ] - -## Out of scope - -- - -## Related - -- Epic [[02-observability]] diff --git a/assets/demo-planning/tasks/ready-to-start/paginate-list-endpoints.md b/assets/demo-planning/tasks/ready-to-start/paginate-list-endpoints.md deleted file mode 100644 index c971414..0000000 --- a/assets/demo-planning/tasks/ready-to-start/paginate-list-endpoints.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -schema: 1 -status: ready-to-start -epic: 01-api-gateway -description: Cursor pagination for the collection routes. -effort: Unknown -tier: 3 -priority: medium -autonomy_level: 3 -tags: [api] -created: "2026-06-25" ---- - -# Paginate list endpoints - -## Objective - - - -## Acceptance criteria - -- [ ] - -## Out of scope - -- - -## Related - -- Epic [[01-api-gateway]] diff --git a/assets/epic-show.gif b/assets/epic-show.gif index cb318ff..ad36402 100644 Binary files a/assets/epic-show.gif and b/assets/epic-show.gif differ diff --git a/assets/help.gif b/assets/help.gif deleted file mode 100644 index e64ee98..0000000 Binary files a/assets/help.gif and /dev/null differ diff --git a/assets/picker.gif b/assets/picker.gif new file mode 100644 index 0000000..f6e2ebd Binary files /dev/null and b/assets/picker.gif differ diff --git a/assets/status.gif b/assets/status.gif index b8b1b1b..cb33c45 100644 Binary files a/assets/status.gif and b/assets/status.gif differ diff --git a/assets/task-list.gif b/assets/task-list.gif index 5bb4a4e..1971e1e 100644 Binary files a/assets/task-list.gif and b/assets/task-list.gif differ diff --git a/assets/tui.gif b/assets/tui.gif index 1cd5c1e..216d546 100644 Binary files a/assets/tui.gif and b/assets/tui.gif differ diff --git a/assets/vhs/README.md b/assets/vhs/README.md index 558a13c..67455f5 100644 --- a/assets/vhs/README.md +++ b/assets/vhs/README.md @@ -14,14 +14,23 @@ runtime dependency, only needed to (re)record the demos. `just gifs` builds the binary first and runs each tape against `./bin/tskflwctl` (shown as `tskflwctl` via a `PATH` prepend), so the GIFs always reflect the current code. -The featured tapes — **`tui`** (hero), **`status`**, **`audit-show`** — each `cd` +The featured tapes — **`tui`** (hero), **`status`**, **`audit-show`**, and +**`picker`** — are the ones shown in the READMEs. The first three each `cd` (hidden) into the curated [`assets/demo-planning/`](../demo-planning/) fixture, a -small planning tree authored to show the symbology off: epics mid-progress, tasks -across every status, and an open audit whose findings span fixed / landed / -in-progress / open / deferred / wontfix (so the segmented bar shows all its -bands). Regenerate the fixture itself by re-running the `tskflwctl epic/task/audit -new` commands, or edit the markdown in place. +bike-workshop planning tree authored to show the symbology off: epics +mid-progress, tasks across every status, and an open audit whose findings span +fixed / landed / in-progress / open / deferred / wontfix (so the segmented bar +shows all its bands). `picker` works on a **throwaway copy** of the fixture (in +`/tmp`) because it actually creates a task through the interactive prompts, and +mustn't dirty the committed tree. Regenerate the fixture itself by re-running the +`tskflwctl epic/task/audit new` commands, or edit the markdown in place. -`help.tape`, `epic-show.tape`, and `task-list.tape` are earlier demos not -currently linked from the README — keep or prune as you like; `just gifs` still -renders them. +`epic-show.tape` and `task-list.tape` are extra tapes `just gifs` renders but no +README currently links — keep, link, or prune as you like. + +**Tab completion.** `epic-show`, `task-list`, and `audit-show` build their +commands from short prefixes + `Tab` (the epic/audit slug, the subcommands, and +`task list`'s `-o`/`-c` values) rather than typing them out. Those three run +under `zsh` and source `tskflwctl completion zsh` off-camera first, because macOS +ships bash 3.2 — too old for cobra's bash completion. VHS gives every shell the +same `> ` prompt, so they still match the `bash` demos. diff --git a/assets/vhs/audit-show.tape b/assets/vhs/audit-show.tape index 2651ecc..a609754 100644 --- a/assets/vhs/audit-show.tape +++ b/assets/vhs/audit-show.tape @@ -1,21 +1,37 @@ # Demo: `audit show` — the segmented finding bar (done / in-progress / dropped / # open, banded by distinct glyphs) above the status-grouped finding tree. # Regenerate with `just gifs`. Runs against the curated assets/demo-planning -# fixture (cd is hidden so the recorded command stays clean). +# fixture (cd is hidden so the recorded command stays clean). Uses zsh so the +# slug can be Tab-completed: completion needs a modern shell (macOS ships bash +# 3.2, too old for cobra's bash completion); VHS gives every shell the same `> ` +# prompt. Output assets/audit-show.gif -Set Shell bash +Set Shell zsh Set FontSize 16 Set Width 1100 Set Height 760 Set Theme "Dracula" Set Padding 16 +# cd into the fixture and load completion, off-camera. Hide -Type "cd assets/demo-planning && clear" +Type "cd assets/demo-planning && autoload -Uz compinit && compinit -u && source <(tskflwctl completion zsh) && clear" Enter +Sleep 1s Show -Type "tskflwctl audit show 2026-06-20-api-gateway" -Sleep 700ms +# Tab through command, subcommand, and the audit slug from its date prefix. +Type "tskflwctl au" +Sleep 250ms +Tab +Sleep 350ms +Type "sh" +Sleep 250ms +Tab +Sleep 350ms +Type "2026-06-2" +Sleep 300ms +Tab +Sleep 800ms Enter Sleep 4.5s diff --git a/assets/vhs/epic-show.tape b/assets/vhs/epic-show.tape index 06c401a..d8854a0 100644 --- a/assets/vhs/epic-show.tape +++ b/assets/vhs/epic-show.tape @@ -1,13 +1,26 @@ -# Demo: epic show — the status-grouped lipgloss/v2 tree. Regenerate with `just gifs`. +# Demo: epic show — Tab-complete the epic id, then the status-grouped lipgloss/v2 +# tree. Regenerate with `just gifs`. Uses zsh: the id completion needs a modern +# shell, and macOS ships bash 3.2 (too old for cobra's bash completion); VHS +# renders every shell with the same `> ` prompt, so it matches the other demos. Output assets/epic-show.gif -Set Shell bash +Set Shell zsh Set FontSize 15 Set Width 1200 Set Height 800 Set Theme "Dracula" Set Padding 16 -Type "tskflwctl epic show 18-tui-bubble-tea-interactive-planning-browser" -Sleep 700ms +# Load shell completion off-camera so the Tab below expands the epic id. +Hide +Type "autoload -Uz compinit && compinit -u && source <(tskflwctl completion zsh) && clear" +Enter +Sleep 1s +Show + +# Type a short prefix, Tab to complete the full id, then run it. +Type "tskflwctl epic show 18-tui" +Sleep 400ms +Tab +Sleep 1.2s Enter Sleep 4s diff --git a/assets/vhs/help.tape b/assets/vhs/help.tape deleted file mode 100644 index 4c3651a..0000000 --- a/assets/vhs/help.tape +++ /dev/null @@ -1,13 +0,0 @@ -# Demo: fang-styled help. Regenerate with `just gifs`. -Output assets/help.gif -Set Shell bash -Set FontSize 16 -Set Width 1100 -Set Height 720 -Set Theme "Dracula" -Set Padding 16 - -Type "tskflwctl --help" -Sleep 700ms -Enter -Sleep 4s diff --git a/assets/vhs/picker.tape b/assets/vhs/picker.tape new file mode 100644 index 0000000..4eca043 --- /dev/null +++ b/assets/vhs/picker.tape @@ -0,0 +1,37 @@ +# Demo: interactive pickers — on a TTY, a missing required input PROMPTS instead +# of erroring (off a TTY it fails with the flag to pass). `task new` with no +# --epic opens an epic picker (type to filter, `> ` caret), then a tags text +# prompt. Prompts render to stderr, so stdout stays byte-identical to the +# flag-driven run. Regenerate with `just gifs`. +# +# Runs against a throwaway COPY of the fixture (in /tmp) so the demo can actually +# create the task without dirtying the committed assets/demo-planning tree. +Output assets/picker.gif +Set Shell bash +Set FontSize 16 +Set Width 1100 +Set Height 520 +Set Theme "Dracula" +Set Padding 16 + +Hide +Type "rm -rf /tmp/tskflw-demo && cp -R assets/demo-planning /tmp/tskflw-demo && cd /tmp/tskflw-demo && clear" +Enter +Sleep 500ms +Show + +# No --epic on a TTY → the epic picker opens (all epics first)… +Type 'tskflwctl task new "Swap brake pads"' +Sleep 500ms +Enter +Sleep 2s +# …type to filter it down, then Enter to choose. +Type "tour" +Sleep 1s +Enter +Sleep 1.2s +# Then the required tags — a free-text prompt (its own flag twin, --tags). +Type "brakes,safety" +Sleep 800ms +Enter +Sleep 2.5s diff --git a/assets/vhs/task-list.tape b/assets/vhs/task-list.tape index 549793a..aa4ba7d 100644 --- a/assets/vhs/task-list.tape +++ b/assets/vhs/task-list.tape @@ -1,13 +1,47 @@ -# Demo: task list with column projection (-o table -c). Regenerate with `just gifs`. +# Demo: task list with column projection — built almost entirely from short +# prefixes + Tab (command, subcommand, -o value, and each -c column). Regenerate +# with `just gifs`. Uses zsh: completion needs a modern shell (macOS ships bash +# 3.2, too old for cobra's bash completion); VHS gives every shell the same `> ` +# prompt, so it matches the other demos. Output assets/task-list.gif -Set Shell bash +Set Shell zsh Set FontSize 16 Set Width 1100 Set Height 620 Set Theme "Dracula" Set Padding 16 -Type "tskflwctl task list -o table -c slug,status,epic" -Sleep 700ms +# Load completion off-camera. +Hide +Type "autoload -Uz compinit && compinit -u && source <(tskflwctl completion zsh) && clear" +Enter +Sleep 1s +Show + +# Build `task list -o table -c slug,status,epic` — Tab does the typing. +Type "tskflwctl ta" +Sleep 250ms +Tab +Sleep 350ms +Type "li" +Sleep 250ms +Tab +Sleep 350ms +Type "-o ta" +Sleep 250ms +Tab +Sleep 350ms +Type "-c sl" +Sleep 250ms +Tab +Sleep 250ms +Type ",st" +Sleep 250ms +Tab +Sleep 250ms +Type ",ep" +Sleep 250ms +Tab +Sleep 500ms Enter Sleep 3s diff --git a/assets/vhs/tui.tape b/assets/vhs/tui.tape index 413b6ff..f3257d3 100644 --- a/assets/vhs/tui.tape +++ b/assets/vhs/tui.tape @@ -16,19 +16,23 @@ Show Type "tskflwctl ui" Enter -Sleep 2.5s +Sleep 1.5s + +# Tasks tab — status glyphs across the roster +Type "]" +Sleep 1s # Epics tab — neon rollup bars per epic Type "]" -Sleep 2.5s +Sleep 1.5s # Audits tab — bucket glyph + the segmented finding bar Type "]" -Sleep 2s +Sleep 1s # open the selected audit — segmented bar + the status-grouped finding tree Enter -Sleep 3.5s +Sleep 1.5s Type "q" Sleep 750ms