Skip to main content

Light-touch, pragmatic, artifact-driven framework for AI-assisted software delivery

Project description

BEACON

Light-touch, pragmatic, artifact-driven framework for AI-assisted software delivery.

"Would I proudly sign my name to this?"

BEACON owns the Product side of delivery — strategy, epics, ADRs, lifecycle discipline. It composes with SpecKit for the Engineering side — per-feature specs, plans, tasks. Each is independently installable; neither writes into the other's files. Active work is discovered from git, not stored — so parallel agents in worktrees never merge-conflict on a central state file.

quarter scope    Roadmap/README.md             ← strategy (BEACON)
weeks scope      Roadmap/epics/<slug>.md       ← initiative (BEACON)
days scope       specs/<NNN-slug>/             ← feature (SpecKit)
hours scope      specs/<NNN-slug>/tasks.md     ← tasks (SpecKit)
seconds scope    git branch + tasks.md state   ← active work (discovered)

Install

For humans

Install globally with uv tool (once per machine):

uv tool install beacon-framework

Then from any project:

beacon init --here

Idempotent — re-running is safe. User-seeded files are preserved. beacon init offers to install SpecKit interactively (highly recommended for the /beacon.{specify,plan,tasks,implement} wrappers; everything else works without it). Pass --speckit or --no-speckit to bypass the prompt in non-interactive contexts.

To upgrade later: uv tool upgrade beacon-framework.

For the full installation walkthrough (including brownfield install), see AGENTS.md. It works equally well as a human read.

Alternative install paths:

# Ephemeral, no global install
uvx --from beacon-framework beacon init --here

# Track main from git (pre-release builds)
uvx --from git+https://github.com/darth-veitcher/beacon beacon init --here

For LLM agents

Fetch the agent guide and follow it:

curl -s https://raw.githubusercontent.com/darth-veitcher/beacon/main/AGENTS.md

AGENTS.md is self-contained: vocabulary, install order (SpecKit then BEACON), workflow end-to-end, command reference, and what to do next on a fresh project.


Concepts

Five terms cover everything:

  • Epic — a weeks-scope initiative at project-management/Roadmap/epics/<slug>.md. Groups one or more specs. Creating or editing an epic is a BEACON DESIGN-phase activity — produces cross-spec ADRs that no single feature spec.md can capture.
  • Spec — a SpecKit feature folder at specs/<NNN-slug>/. SpecKit owns it. BEACON writes one file inside: .beacon.toml, the epic backlink.
  • Bullet — the active piece of work in the current git worktree. Discovered live by resolving the current branch.
  • ADR — a Markdown decision record at project-management/ADRs/ADR-NNN-<slug>.md (MADR format).
  • Phase — SEED → DESIGN → BUILD → SHIP. Lifecycle gates surfaced as Claude Code skills.

Commands

Project lifecycle

beacon init [--here] [--language python|node] [--ai claude]   # install (idempotent)
beacon upgrade [--here]                                       # refresh framework files
beacon check [--here]                                         # files-present validation
beacon doctor [--here] [--strict]                             # semantic health check (15 checks)
beacon --version  /  beacon -V                                # show installed version

SEED phase (project bootstrap)

beacon seed                                  # status of the four SEED deliverables
beacon seed --strict                         # CI mode — WARN becomes FAIL
beacon seed scaffold                         # conversational fill-in from the terminal

Inside Claude Code, /beacon.seed runs an inferential scaffold — one or two broad questions, then Claude infers values for every template slot, presents them back plan-mode style, and writes the files on confirmation.

Epics (Product)

beacon epic new <slug> --title "<title>"          # create from template
beacon epic list [--detailed]                     # active epics + owned-spec rollup
beacon epic refresh <slug>                        # recompute spec rollup (read-only)
beacon epic finish <slug>                         # archive; refuses while specs in flight

Bullets (Engineering, per worktree)

beacon bullet start [<title>] [--epic <slug>]     # start current worktree's bullet
beacon bullet finish                              # mark done
beacon bullet status                              # show current bullet
beacon bullet list                                # all bullets across local branches, grouped by epic
beacon bullet sweep                               # delete orphan sidecars

Spec ↔ epic link

beacon link-spec <NNN-slug> --epic <slug>         # backlink an existing spec to an epic

Integrations

beacon integration list
beacon integration add <name>          # claude (default), release
beacon integration remove <name>

Languages

Quality-gate placeholders render per-language at install time:

beacon init --language node       # → bun run lint; bunx tsc --noEmit; …
beacon init --language python     # → uv run ruff; uv run ty check; …  (default)

Add a language by dropping a TOML at src/beacon/resources/languages/<name>.toml.


Integrations

beacon integration list shows what's available.

claude (installed by default)

Slash commands (/init, /git:*, /design:*) and the marker-delimited block in .claude/CLAUDE.md that briefs the agent on the lifecycle. If SpecKit is detected at install time, four additional wrappers ship at .claude/commands/beacon/:

Wrapper Inlines (via @) Adds before Adds after
/beacon.specify <epic-slug> <feature> SpecKit's specify Epic Success criteria, Non-goals, ADRs beacon link-spec <NNN-slug> --epic <slug>
/beacon.plan SpecKit's plan (none) Placeholder + ADR-reference sweep
/beacon.tasks SpecKit's tasks (none) (hook in place; no-op today)
/beacon.implement SpecKit's implement (none) beacon epic refresh <slug>; prompt to epic finish if all specs done

Wrappers compose with SpecKit's commands via Claude Code's @<path> inclusion — no prompt duplication, no maintenance burden when SpecKit updates. If SpecKit isn't installed, the wrappers are skipped (with a notice); installing SpecKit later and running beacon upgrade retro-wires them.

release (opt-in)

beacon integration add release

Drops three things into the project:

File What it is
.github/workflows/release.yml Branch-based release: push to main → PyPI, push to develop → TestPyPI (pre-release). Framework-owned.
PUBLISHING.md One-time PyPI/TestPyPI Trusted Publisher registration steps. User-seeded — never overwritten.
[tool.semantic_release] block in pyproject.toml python-semantic-release config wrapped in # ──── BEACON release integration ──── sentinels. Refuses to clobber an existing hand-authored block.

beacon integration remove release cleanly reverses — deletes the workflow + the fenced PSR block; leaves PUBLISHING.md alone.


Health checks

beacon check     # files-present validation against the manifest
beacon doctor    # semantic — 15 checks across content health, active-work integrity, Product↔Engineering drift
beacon doctor --strict   # CI mode — every WARN becomes FAIL

Doctor's 15 checks group into three concerns:

  • Content health — placeholder text in 00-problem-statement.md, stale Work/sessions/, ADR coverage, framework files modified on disk.
  • Active-work integrity — current worktree has a discoverable bullet, no orphan sidecars, spec branches have an active task in tasks.md.
  • Product ↔ Engineering drift — every spec has an epic backlink, every backlink is reciprocated in the epic's ## Specs, active branches are tied to active epics, no ghost epics, no lifecycle mismatches, Roadmap reviewed in the last quarter.

Sample output on a project with one epic, one spec, and the problem statement still unfilled:

✗ problem-statement: Placeholder text still in problem statement: [Replace with
   your problem statement] …. Fill in 00-problem-statement.md before opening a
   feature branch.
✓ active-bullet: 001-oauth-login → T001 scaffold OAuth callback (owner: agent-A,
   source: spec)
✓ spec-task-alignment: Active task in 001-oauth-login: T001 — scaffold OAuth
   callback
✓ spec-backlink-integrity: All 1 spec folder(s) backlink an epic.
✓ epic-spec-listed: All spec→epic backlinks are reciprocated in epic files.
✓ epic-coverage: 001-oauth-login → epic user-auth
✓ ghost-epic: All 1 Active epic(s) have current work.
✓ epic-spec-lifecycle: Epic statuses match their owned-spec state.
! epic-adr-coverage: Active epic(s) with no ADRs listed: user-auth. …
! roadmap-staleness: Roadmap/README.md has no `Last reviewed: YYYY-MM-DD` header.
✓ sessions: No stale session files.
✓ adr-coverage: 0 ADR(s) on file across 5 commits.
✓ drift: Framework files match shipped resources.

ok=10  warn=2  fail=1

A FAIL exits non-zero (--strict does the same for WARN), so it wires cleanly into a pre-commit hook or CI gate.


What gets installed

project-management/
├── .beacon/init-options.json              # manifest — pins version, lists framework vs seeded files
├── Background/
│   ├── 00-problem-statement.md            # seeded
│   └── 01-final-architecture-document.md  # seeded
├── ADRs/
│   ├── README.md                          # framework
│   └── ADR-000-template.md                # framework (MADR)
├── Roadmap/
│   ├── README.md                          # seeded — STRATEGY only (quarter scope)
│   └── epics/
│       ├── EPIC-TEMPLATE.md               # framework
│       └── archive/.gitkeep
└── Work/
    ├── README.md                          # framework
    ├── branches/.gitkeep                  # per-branch sidecars live here
    └── sessions/                          # transient — delete after merge
beacon.md                                  # generated dashboard
.claude/
├── CLAUDE.md                              # BEACON-managed block between <!-- BEACON START/END -->
├── commands/
│   ├── init.md                            # /init (SEED phase)
│   ├── git/{feature,pr,release}.md
│   ├── design/{wardley,evaluate,diagram}.md
│   └── beacon/                            # only if SpecKit detected
│       ├── specify.md  plan.md  tasks.md  implement.md
└── skills/
    ├── beacon-seed/SKILL.md
    ├── beacon-design/SKILL.md
    ├── beacon-build/SKILL.md
    └── beacon-ship/SKILL.md

Framework files are overwritten on beacon upgrade. Seeded files are written only when absent. The manifest is the contract.


Adding BEACON to an existing project (brownfield)

BEACON is designed to drop into an existing repo without clobbering anything. From the project root:

beacon init --here

What you can rely on:

You already have BEACON's behaviour
.claude/CLAUDE.md Your content stays. A <!-- BEACON START --> … <!-- BEACON END --> block is appended at the bottom; only that block is refreshed on re-runs.
project-management/ directory with your own notes/ADRs Sibling files preserved. BEACON adds its own subtree alongside. Files at BEACON paths are left alone if user-seeded; framework files overwrite.
src/, tests/, pyproject.toml, README.md Untouched. BEACON writes only inside .claude/, project-management/, and beacon.md.
Existing git history + branches Untouched. BEACON reads git state; it never commits or branches on your behalf.
Pre-existing SpecKit (.claude/commands/speckit.*.md) Detected; the four /beacon.{specify,plan,tasks,implement} wrappers install on top via @-includes.
Legacy Prompts/ from BEACON ≤ 0.3 Auto-deleted; the v0.4+ phase guidance lives in .claude/skills/beacon-*/.
Legacy Roadmap/README.md with ## Active Bullet (≤ 0.5) A Roadmap/MIGRATION_v0.6.md breadcrumb is dropped non-destructively; your content stays.

Verify before you commit:

git status                            # see exactly what BEACON added/modified
git diff .claude/CLAUDE.md            # confirm only the marker block changed

Try it ephemerally without the global install:

uvx --from beacon-framework beacon init --here
git status                            # decide whether to keep

Atomicity

  • BEACON imports nothing from SpecKit. No build-time dependency.
  • beacon init succeeds on projects with no SpecKit installed; the four /beacon.* wrappers are skipped with a notice. beacon upgrade retro-wires them once SpecKit appears.
  • beacon bullet *, beacon epic *, beacon link-spec, beacon doctor all work without SpecKit anywhere on the system. Doctor's spec-aware checks no-op when no spec folders exist.
  • BEACON writes nothing into .specify/. SpecKit writes nothing into project-management/. The only file inside specs/<slug>/ BEACON owns is .beacon.toml — SpecKit ignores it.
  • Install, upgrade, and remove either framework independently.

Migration from BEACON ≤ 0.5

The previous "single Roadmap god-file" model (one Roadmap/README.md with ## Active Bullet lines) doesn't scale to parallel agents. v0.6 replaces it with:

  • Roadmap/README.md — strategy only (quarter scope)
  • Roadmap/epics/<slug>.md — per-initiative files (weeks scope)
  • Per-worktree branches — active state discovered live, not stored

beacon upgrade detects the legacy shape and drops a Roadmap/MIGRATION_v0.6.md breadcrumb non-destructively. Your previous content stays in place; the new template is installed alongside. Follow the migration note to slot in-flight work into the new model.

Phase guides also migrated: project-management/Prompts/0N-PHASE.md (≤ 0.3) → .claude/skills/beacon-*/SKILL.md. beacon upgrade removes the legacy directory automatically.


Documentation

License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

beacon_framework-0.12.1.tar.gz (109.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

beacon_framework-0.12.1-py3-none-any.whl (126.6 kB view details)

Uploaded Python 3

File details

Details for the file beacon_framework-0.12.1.tar.gz.

File metadata

  • Download URL: beacon_framework-0.12.1.tar.gz
  • Upload date:
  • Size: 109.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for beacon_framework-0.12.1.tar.gz
Algorithm Hash digest
SHA256 b8a6004f03fa01415df053eaab47e658f1d2eebdd7912ab8f93f638cc437de18
MD5 0454d85a9e51b986dd3be7810fb4215b
BLAKE2b-256 6ad72d595e930a331dacf1637340a027273f4defde9dc5220b6681b9ee176e21

See more details on using hashes here.

Provenance

The following attestation bundles were made for beacon_framework-0.12.1.tar.gz:

Publisher: release.yml on darth-veitcher/beacon

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file beacon_framework-0.12.1-py3-none-any.whl.

File metadata

File hashes

Hashes for beacon_framework-0.12.1-py3-none-any.whl
Algorithm Hash digest
SHA256 d73c2f7ed14a617e8772efb999ed422f6f428d4e0990ed7295f8e7e45bdec1fb
MD5 2407b596dbbb8aa2fdd07699b21f497f
BLAKE2b-256 399c406d89ffcbeeb717dc37b07e6aeb5b5d36a07e30ca4cae724c7b35c45bc0

See more details on using hashes here.

Provenance

The following attestation bundles were made for beacon_framework-0.12.1-py3-none-any.whl:

Publisher: release.yml on darth-veitcher/beacon

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page