tbd

SkillAI & models

Git-native issue tracking (beads), coding guidelines, knowledge injection, and spec-driven planning for AI agents. Drop-in replacement for bd/Beads with simpler architecture.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the tbd skill

What this skill tells your AI

The instructions your AI receives, as published by jlevy/tbd in skills/tbd/SKILL.md and read by ahel’s review.

tbd helps humans and agents ship code with greater speed, quality, and discipline.

  1. Beads: Git-native issue tracking (tasks, bugs, features). Never lose work across sessions. Drop-in replacement for bd.
  2. Spec-Driven Workflows: Plan features → break into beads → implement systematically.
  3. Knowledge Injection: 40+ engineering guidelines (TypeScript, Python, Rust, TDD, testing, Convex, monorepos) available on demand.
  4. Shortcuts: Reusable instruction templates for common workflows (code review, commits, PRs, cleanup, handoffs).

Installation

npm install -g get-tbd@latest      # Install or upgrade the CLI (same command for both)
tbd setup --auto --prefix=<name>   # Fresh project (--prefix is REQUIRED: 2-8 alphabetic chars recommended. ALWAYS ASK THE USER FOR THE PREFIX; do not guess it)
tbd setup --auto                   # Existing tbd project — also the upgrade step (applies any format migration; commit the diff it reports)
tbd setup --from-beads             # Migration from .beads/ if `bd` has been used

If tbd refuses with “This repository requires a newer version of tbd”, run the two install/upgrade commands above.

Routine Commands

tbd --help    # Command reference
tbd status    # Status
tbd doctor    # If there are problems

tbd setup --auto   # Run any time to refresh setup
tbd prime      # Restore full context on tbd after compaction
tbd web --open # Open the live, read-only bead viewer

CRITICAL: You Operate tbd, the User Doesn’t

You are the tbd operator: Users talk naturally; you translate their requests to tbd actions. DO NOT tell users to run tbd commands. That’s your job.

  • WRONG: “Run tbd create to track this bug”

  • RIGHT: (you run tbd create yourself and tell the user it’s tracked)

Live browser requests: When the user asks to see, show, open, or view beads in a browser, start tbd web --open yourself with the agent platform’s long-running process facility. Do not merely print the command. If the requested project is outside your current working directory, start tbd web <path> --open; the path may be its repository root or any subdirectory. Wait for the startup descriptor, give the user its loopback URL, and leave the process running until they ask you to stop it or the session environment requires cleanup.

The page is a live, read-only viewer, not an editor. You remain the tbd operator: make every requested bead change with ordinary tbd commands, and the running page observes the resulting local state automatically. Browser filters change only the presentation. Starting the viewer never justifies an implicit fetch, merge, or push; run tbd sync only when the user asks to exchange remote bead state, after which its local result also appears automatically.

Welcoming a user: When users ask “what is tbd?” or want help → run tbd shortcut welcome-user

User Request → Agent Action

User SaysYou (the Agent) Run
Issues/Beads
“There’s a bug where …”tbd create "..." --type=bug
“Create a task/feature for …”tbd create "..." --type=task or --type=feature
“Let’s work on issues/beads”tbd ready
“Show my beads in a browser”Start tbd web --open yourself, wait for its URL, and keep it running
“Show me issue X” (or several)tbd show <id1> [<id2> …] (one call, never a loop; --max-lines <n> caps output per issue)
“Where do things stand on spec X?”tbd list --spec <path-or-filename> (all specs at once: tbd list --specs)
“Close this issue”tbd close <id> (several: tbd close <id1> <id2> … — one call, never a loop)
“Search issues for X”tbd search "X" (matches content and issue IDs, so partial IDs work)
“Add label X to issue”tbd label add <id> <label> (several beads: tbd update <id1> <id2> … --add-label <label>)
“What issues are stale?”tbd stale
Planning & Specs
“Plan a new feature” / “Create a spec”tbd shortcut new-plan-spec
“Break spec into beads”tbd shortcut plan-implementation-with-beads
“Implement these beads”tbd shortcut implement-beads
Code Review & Commits
“Review this code” / “Code review”tbd shortcut review-code
“Review this PR”tbd shortcut review-github-pr
“Commit this” / “Use the commit shortcut”tbd shortcut code-review-and-commit
“Create a PR” / “File a PR”tbd shortcut create-or-update-pr-simple
“Merge main into my branch”tbd shortcut merge-upstream
Guidelines & Knowledge
(any engineering work)Load the General engineering group first (see below)
“Use TypeScript best practices”tbd guidelines typescript-rules typescript-lint-format-rules
“Use Python best practices”tbd guidelines python-rules
“Use Rust best practices”tbd guidelines rust-rules rust-lint-format-rules
“Set up TS/JS lint, format, or hooks”tbd guidelines typescript-lint-format-rules
“Set up Rust lint, clippy, or the quality floor”tbd guidelines rust-lint-format-rules
“Build a Rust CLI”tbd guidelines rust-cli-rules
“Build a TypeScript CLI”tbd guidelines typescript-cli-tool-rules
“Improve monorepo setup”tbd guidelines pnpm-monorepo-patterns or bun-monorepo-patterns
“Add golden/e2e testing”tbd guidelines golden-testing-guidelines
“Use TDD” / “Test-driven development”tbd guidelines general-tdd-guidelines
“Convex best practices”tbd guidelines convex-rules
Documentation
“Research this topic”tbd shortcut new-research-brief
“Document architecture”tbd shortcut new-architecture-doc
“What guidelines/docs are there?”tbd docs list
“Make the guidelines visible / customize doc X”tbd docs fork --category=general --category=<lang> (recommended: general + the repo’s languages), or tbd docs fork <name> / --all; then edit in docs/tbd/
“Update the guidelines to the latest”tbd docs update; on conflicts ask the user, then --merge or --keep-ours
“I deleted a forked doc file”tbd docs status shows it missing; restore with tbd docs fork <name> --force or finalize with tbd docs unfork <name>
External Trackers
“Set up Linear” / “Connect this repo to Linear”tbd shortcut setup-linear
“My Linear sync isn’t working” / “Add my Linear key”tbd shortcut setup-linear
Cleanup & Maintenance
“Clean up this code” / “Remove dead code”tbd shortcut code-cleanup-all
“Fix repository problems”tbd doctor --fix
Sessions & Handoffs
“Hand off to another agent”tbd shortcut agent-handoff
“Check out this library’s source”tbd shortcut checkout-third-party-repo
(your choice whenever appropriate)tbd list, tbd dep add, tbd close, tbd sync, etc.

Loading guidelines for engineering work: three layers, in this order.

  1. Always, before writing or reviewing code, load the engineering core:

    tbd guidelines general-eng-agent-principles
    
  2. The language documents that match the changed surface. Do not load an entire language group by default.

  3. Cross-cutting topics, by what the change actually touches—errors, tests and goldens, code and comment policy, dependencies, published interfaces, commits, review, CI and gates, filesystem work, and releases. These are not always-load: read the group’s note in tbd guidelines --list and pull the ones that apply.

Load several selected documents in one call; guidelines, shortcut, template, and docs show all take several names.

Run tbd guidelines --list to see all available guidelines.

Where beads live: on the dedicated tbd-sync branch, not your working branch. Bead changes never appear in your feature branch’s commits or its PR diff. That is the design, not lost work: don’t hunt for them there, and don’t claim “everything is on this PR” about bead state.

Let tbd own that branch. tbd sync maintains it and tbd doctor --fix repairs it. Use tbd commands rather than raw git for anything touching tbd-sync; hand checkouts, merges, and pushes are how bead state gets tangled.

Note: .tbd/workspaces/ is the exception: never gitignore it; the outbox must be committed to your working branch. See tbd guidelines tbd-sync-troubleshooting for details.

CRITICAL: Session Closing Protocol

Before saying “done”, you MUST complete this checklist:

[ ] 1. git add + git commit
[ ] 2. git push
[ ] 3. gh pr checks <PR> --watch 2>&1 (IMPORTANT: WAIT for final summary, do NOT tell user it is done until you confirm it passes CI!)
[ ] 4. tbd close <id1> <id2> ... --reason "..." — one bulk call per group of beads sharing a reason (never a per-ID loop)
[ ] 5. tbd sync
[ ] 6. CONFIRM CI passed (if failed: fix, run tests, re-push, restart from step 3)

Work is not done until pushed, CI passes, and tbd is synced.

Remote/proxied session where GitHub seems blocked? If the environment has egress, gh works through a scoped NO_PROXY bypass. Three facts decide most of these:

  • The git remote may sit behind a ref-scoped credential broker: pushes to refs/heads/* succeed, pushes to refs/tags/* fail with HTTP 403. Create the tag on the direct channel instead: gh api repos/OWNER/REPO/git/refs -f ref=refs/tags/vX.Y.Z -f sha=SHA.
  • git push --dry-run passes for tags the broker then refuses at receive-pack, so a clean dry run proves nothing.
  • A GitHub-host 403 carrying no x-github-request-id header is proxy-manufactured, not an organization egress denial.

Run tbd shortcut setup-github-cli and follow “Proxied Remote Sessions” before concluding gh is unavailable.

Bead Tracking Rules

  • Track all task work not done immediately as beads (discovered work, TODOs, multi-session work)
  • When in doubt, create a bead
  • Check tbd ready when not given specific directions
  • Always close/update beads and run tbd sync at session end

Commands

Finding Work

CommandPurpose
tbd readyBeads ready to work (no blockers)
tbd list --status openAll open beads
tbd list --status in_progressYour active work
tbd list --spec <path>Beads tracking a spec (filename or suffix is enough)
tbd list --sort updated --limit 10Recent activity; --count for totals
tbd show <id1> [<id2> …]Bead details with dependencies (bulk: delimited per issue; --max-lines <n> caps each)

Creating & Updating

CommandPurpose
tbd create "title" --type=bug --priority=1New bead; run tbd create --help for all types and priorities (P0-P4, not “high/medium/low”)
tbd create "title" --parent <epic> --depends-on <id>Create fully wired: parent and blockers in one call (--depends-on is repeatable)
tbd update <id> --status in_progressClaim work
tbd close <id> [--reason "..."]Mark complete
tbd close <id1> <id2> <id3> --reason "..."Close several at once (always preferred over one-at-a-time)
tbd update <id1> <id2> <id3> --priority 1Bulk-update shared fields on several beads

IMPORTANT: if you are about to shell-loop or pipe around tbd, stop; the bulk or filter form exists. show, close, reopen, and update take multiple IDs; guidelines/shortcut/template/docs show take multiple names; dep add takes multiple blockers; list/search/show have --limit/--count/--max-lines. NEVER for id in …; do tbd close $id; done (one call gives one lock, one summary, --json, and --ignore-missing), NEVER tbd show X | head (use --max-lines), NEVER tbd list | grep <id> (use tbd search <partial-id>). A bulk call shares one reason (and, for update, one set of field changes), so group the beads that share the same mutation and make one call per group.

Dependencies & Sync

CommandPurpose
tbd dep add <bead> <blocker1> [<blocker2> …]Add blocker dependencies (one call per bead)
tbd blockedShow blocked beads
tbd syncSync with git remote (run at session end)
tbd statsProject statistics
tbd doctorCheck for problems
tbd doctor --fixAuto-fix repository problems

Labels & Search

CommandPurpose
tbd search <query>Search issues by text or (partial) issue ID
tbd label add <id> <label>Add label to issue (several beads: tbd update <ids…> --add-label)
tbd label remove <id> <label>Remove label from issue
tbd label listList all labels in use
tbd staleList issues not updated recently

External Trackers (Linear)

CommandPurpose
tbd integration status --offlineDistinguish shared config from a missing personal key without a network call
tbd integration statusVerify the configured key and Linear team are reachable
tbd --dry-run integration sync --pushPreview which beads would go outward
tbd integration sync --pushOutbound only: create/update tracker issues (idempotent)
tbd integration sync --pullInbound only: tracker changes into beads, no external writes
tbd integration sync --pull --external <ref...>Create beads from exactly named tracker items, independent of policy
tbd integration syncBoth directions; converges to nothing to do
tbd integration link/unlink <bead> [ref]Bind or sever a bead and an existing tracker item; unlink safely cancels pending writes for that pair before clearing the link
tbd integration comment <bead> "text"Author a comment offline; posted on next sync

Setting Linear up at all — including “add my key” — is tbd shortcut setup-linear. Run it rather than improvising; it detects which case applies and walks the user through only that case.

The mental model it encodes: config is shared, credentials are personal. The integrations block in .tbd/config.yml (team, project, policy) is committed, so a teammate who clones already has it; LINEAR_API_KEY lives in the environment or a gitignored .env and is never committed. So a user joining a repo whose team already syncs needs only a key—never a config edit, and never integration sync --push (their links arrived with the clone; after a dry-run preview, plain tbd sync first pulls the team’s current bead state and then reconciles Linear). Run tbd integration status --offline first in every case. Full details: the External Tracker Integrations section of tbd docs. Bulk runs over 20 creates / 40 updates refuse without --yes. Never echo credentials into output or commits. --pull never replays or performs provider writes; deferred claims and conflict notices remain journaled until the next full sync. Link/inbound creation refuse a remote tbd://bead/… claim unless --force is explicit and the old claim was verified stale. Configured project scopes both creates and automatic inbound scans; an explicit --external import bypasses that scan scope. Assignees sync only through user_map: beads retain aliases (including on initial import), runtime email/UUID targets never persist, unmapped local aliases are reported, and an unmapped provider identity leaves the local field and prior bridge base unchanged with a safe warning, preserving local divergence until mapping recovers. Linear sub-issues import parent-first and never flatten; max_nesting limits only new outbound creation. Comments are append-only and paginated; edits, deletions, reactions, and thread shape are not synchronized. Linear descriptions carry a tbd-owned ⟦tbd⟧⟦/tbd⟧ region. Human prose outside it is preserved; legacy HTML-comment delimiters are upgraded on the next outbound sync. Never hand-edit the managed region—change the bead and sync instead.

Direction flags mean the same thing everywhere in tbd: bare = both directions, --push = outbound only, --pull = inbound only, --status = report only. Plain tbd sync at session end covers docs, issues, AND enabled trackers; surfaces run independently, so one failing (an expired key, a down remote) never stops the others, and every failure is reported at the end. Narrow with --docs, --issues, or --integrations for a single surface.

Documentation

CommandPurpose
tbd shortcut <name>Run a shortcut
tbd shortcut --listList shortcuts
tbd guidelines <name> [<name> …]Load coding guidelines (several names in one call)
tbd guidelines --listList guidelines
tbd template <name>Output a template
tbd docs / tbd docs listManaged-docs overview / cross-kind list with state markers
tbd docs fork/unfork/update <name>Fork docs into docs/tbd/, return to upstream, pull upstream updates

Quick Reference

  • Priority: P0=critical, P1=high, P2=medium (default), P3=low, P4=backlog
  • Types: issues default to task; run tbd create --help for the valid types
  • Status: open, in_progress, closed
  • JSON output: Add --json to any command

Signals

GitHub stars
78
Forks
8
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
tbd-8
Source
github.com/jlevy/tbd