beacon-framework 1.2.1__tar.gz → 1.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/PKG-INFO +1 -1
  2. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/pyproject.toml +3 -1
  3. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/__init__.py +1 -1
  4. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/cli.py +10 -12
  5. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/roadmap.py +34 -32
  6. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/.gitignore +0 -0
  7. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/BEACON.md +0 -0
  8. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/LICENSE +0 -0
  9. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/README.md +0 -0
  10. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/pragmatic-principles.md +0 -0
  11. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/__main__.py +0 -0
  12. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/bullet.py +0 -0
  13. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/docs.py +0 -0
  14. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/doctor.py +0 -0
  15. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/epic.py +0 -0
  16. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/installer.py +0 -0
  17. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/integrations/__init__.py +0 -0
  18. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/integrations/claude_code.py +0 -0
  19. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/integrations/release.py +0 -0
  20. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/language.py +0 -0
  21. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/manifest.py +0 -0
  22. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/beacon.md +0 -0
  23. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/help/commands.md +0 -0
  24. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/help/doctor.md +0 -0
  25. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/help/git-flow.md +0 -0
  26. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/help/phases.md +0 -0
  27. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/help/quickstart.md +0 -0
  28. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/CLAUDE.md.fragment +0 -0
  29. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/agents/beacon-reviewer.md +0 -0
  30. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/commands/beacon/constitution.md +0 -0
  31. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/commands/beacon/continue.md +0 -0
  32. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/commands/beacon/implement.md +0 -0
  33. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/commands/beacon/plan.md +0 -0
  34. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/commands/beacon/prd.md +0 -0
  35. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/commands/beacon/review.md +0 -0
  36. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/commands/beacon/roadmap.md +0 -0
  37. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/commands/beacon/seed.md +0 -0
  38. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/commands/beacon/specify.md +0 -0
  39. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/commands/beacon/status.md +0 -0
  40. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/commands/beacon/tasks.md +0 -0
  41. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/commands/design/diagram.md +0 -0
  42. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/commands/design/evaluate.md +0 -0
  43. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/commands/design/wardley.md +0 -0
  44. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/commands/git/feature.md +0 -0
  45. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/commands/git/pr.md +0 -0
  46. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/commands/git/release.gitflow.md +0 -0
  47. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/commands/git/release.trunk.md +0 -0
  48. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/commands/init.md +0 -0
  49. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/settings.json +0 -0
  50. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/skills/beacon-build/SKILL.md +0 -0
  51. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/skills/beacon-design/SKILL.md +0 -0
  52. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/skills/beacon-seed/SKILL.md +0 -0
  53. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/claude_code/skills/beacon-ship/SKILL.md +0 -0
  54. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/release/PUBLISHING.gitflow.md +0 -0
  55. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/release/PUBLISHING.trunk.md +0 -0
  56. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/release/psr_config.gitflow.toml +0 -0
  57. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/release/psr_config.trunk.toml +0 -0
  58. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/release/workflows/release.gitflow.yml +0 -0
  59. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/integrations/release/workflows/release.trunk.yml +0 -0
  60. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/languages/node.toml +0 -0
  61. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/languages/python.toml +0 -0
  62. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/project-management/.beacon/doctor.toml.example +0 -0
  63. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/project-management/ADRs/ADR-000-template.md +0 -0
  64. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/project-management/ADRs/README.md +0 -0
  65. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/project-management/Background/00-problem-statement.md +0 -0
  66. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/project-management/Background/01-final-architecture-document.md +0 -0
  67. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/project-management/Roadmap/README.md +0 -0
  68. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/project-management/Roadmap/archive/.gitkeep +0 -0
  69. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/project-management/Roadmap/epics/.gitkeep +0 -0
  70. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/project-management/Roadmap/epics/EPIC-TEMPLATE.md +0 -0
  71. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/project-management/Roadmap/epics/archive/.gitkeep +0 -0
  72. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/project-management/Work/README.md +0 -0
  73. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/project-management/Work/analysis/.gitkeep +0 -0
  74. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/project-management/Work/branches/.gitkeep +0 -0
  75. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/project-management/Work/planning/.gitkeep +0 -0
  76. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/project-management/Work/sessions/.gitkeep +0 -0
  77. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/roadmap_template.html +0 -0
  78. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/user-facing-docs/README.md +0 -0
  79. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/user-facing-docs/explanation/index.md +0 -0
  80. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/user-facing-docs/how-to/index.md +0 -0
  81. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/user-facing-docs/reference/index.md +0 -0
  82. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/resources/user-facing-docs/tutorials/getting-started.md +0 -0
  83. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/seed.py +0 -0
  84. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/upgrader.py +0 -0
  85. {beacon_framework-1.2.1 → beacon_framework-1.2.2}/src/beacon/validate.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beacon-framework
3
- Version: 1.2.1
3
+ Version: 1.2.2
4
4
  Summary: Light-touch, pragmatic, artifact-driven framework for AI-assisted software delivery
5
5
  Project-URL: Repository, https://github.com/darth-veitcher/beacon
6
6
  Author: darth-veitcher
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "beacon-framework"
7
- version = "1.2.1"
7
+ version = "1.2.2"
8
8
  description = "Light-touch, pragmatic, artifact-driven framework for AI-assisted software delivery"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -76,6 +76,7 @@ Repository = "https://github.com/darth-veitcher/beacon"
76
76
 
77
77
 
78
78
 
79
+
79
80
 
80
81
 
81
82
  [tool.hatch.build.targets.wheel]
@@ -184,6 +185,7 @@ exclude_commit_patterns = ["^chore\\(release\\):"]
184
185
 
185
186
 
186
187
 
188
+
187
189
 
188
190
 
189
191
  [dependency-groups]
@@ -1,3 +1,3 @@
1
1
  """BEACON Framework: lifecycle and discipline for artifact-driven AI-assisted delivery."""
2
2
 
3
- __version__ = "1.2.1"
3
+ __version__ = "1.2.2"
@@ -1281,9 +1281,10 @@ def roadmap_export(
1281
1281
  Markdown document. Safe to commit alongside beacon.md; regenerate on demand or
1282
1282
  wire into CI with ``beacon roadmap export``.
1283
1283
  """
1284
- from beacon import roadmap as _roadmap
1285
1284
  from datetime import date
1286
1285
 
1286
+ from beacon import roadmap as _roadmap
1287
+
1287
1288
  root = _resolve_root(here, path)
1288
1289
  if not (root / "project-management").is_dir():
1289
1290
  console.print(f"[red]✗[/red] Not a BEACON project at [cyan]{root}[/cyan].")
@@ -1300,22 +1301,20 @@ def roadmap_export(
1300
1301
  return
1301
1302
  dest = output or (root / "ROADMAP.md")
1302
1303
  dest.write_text(content, encoding="utf-8")
1303
- console.print(
1304
- f"[green]✓[/green] Roadmap exported → [cyan]{dest.relative_to(root)}[/cyan]"
1305
- )
1304
+ console.print(f"[green]✓[/green] Roadmap exported → [cyan]{dest.relative_to(root)}[/cyan]")
1306
1305
  if not data.epics:
1307
1306
  if data.archived_epics and not include_done:
1308
1307
  n = len(data.archived_epics)
1309
1308
  plural = "s" if n > 1 else ""
1310
1309
  console.print(
1311
1310
  f"[dim] ({n} archived epic{plural}"
1312
- f" — run [/dim][dim cyan]beacon roadmap export --include-done"
1313
- f"[/dim cyan][dim] to include completed work)[/dim]"
1311
+ " — run [/dim][dim cyan]beacon roadmap export --include-done"
1312
+ "[/dim cyan][dim] to include completed work)[/dim]"
1314
1313
  )
1315
1314
  elif not data.archived_epics:
1316
1315
  console.print(
1317
- f"[dim] (project-management/Roadmap/epics/ has no epics yet"
1318
- f" — run [/dim][dim cyan]beacon epic new <slug>[/dim cyan][dim])[/dim]"
1316
+ "[dim] (project-management/Roadmap/epics/ has no epics yet"
1317
+ " — run [/dim][dim cyan]beacon epic new <slug>[/dim cyan][dim])[/dim]"
1319
1318
  )
1320
1319
 
1321
1320
 
@@ -1334,9 +1333,10 @@ def roadmap_render(
1334
1333
  design system (dark, blueprint-grid, engineering-whitepaper aesthetic). Open
1335
1334
  directly in a browser, screenshot into a slide deck, or host as a static page.
1336
1335
  """
1337
- from beacon import roadmap as _roadmap
1338
1336
  from datetime import date
1339
1337
 
1338
+ from beacon import roadmap as _roadmap
1339
+
1340
1340
  root = _resolve_root(here, path)
1341
1341
  if not (root / "project-management").is_dir():
1342
1342
  console.print(f"[red]✗[/red] Not a BEACON project at [cyan]{root}[/cyan].")
@@ -1350,9 +1350,7 @@ def roadmap_render(
1350
1350
  content = _roadmap.render_html(data, today)
1351
1351
  dest = output or (root / "ROADMAP.html")
1352
1352
  dest.write_text(content, encoding="utf-8")
1353
- console.print(
1354
- f"[green]✓[/green] Roadmap rendered → [cyan]{dest.relative_to(root)}[/cyan]"
1355
- )
1353
+ console.print(f"[green]✓[/green] Roadmap rendered → [cyan]{dest.relative_to(root)}[/cyan]")
1356
1354
  console.print(
1357
1355
  "[dim]i[/dim] Add [dim]ROADMAP.html[/dim] to [dim].gitignore[/dim] "
1358
1356
  "to keep it out of version control."
@@ -169,7 +169,7 @@ def _task_pct(root: Path, epic: Epic) -> int | None:
169
169
 
170
170
 
171
171
  def _fidelity_badge(f: EpicFidelity) -> str:
172
- """Return ASCII fidelity string like 'S+ A+ T:67%' or 'S? A? T:–'."""
172
+ """Return ASCII fidelity string like 'S+ A+ T:67%' or 'S? A? T:-'."""
173
173
  spec = "S+" if f.has_specs else "S?"
174
174
  adr = "A+" if f.has_adrs else "A?"
175
175
  task = f"T:{f.task_pct}%" if f.task_pct is not None else "T:-"
@@ -258,9 +258,7 @@ def _mermaid_gantt_src(
258
258
  else:
259
259
  tag = ""
260
260
  safe_title = e.title.replace(":", " -").replace(",", " ")
261
- lines.append(
262
- f" {safe_title} :{tag}{e.slug}, {start}, {dur}d"
263
- )
261
+ lines.append(f" {safe_title} :{tag}{e.slug}, {start}, {dur}d")
264
262
  lines.append("")
265
263
 
266
264
  return "\n".join(lines)
@@ -302,20 +300,22 @@ def _to_json_data(data: RoadmapData, generated_at: str, *, include_done: bool =
302
300
  roll = data.rollups.get(e.slug)
303
301
  f = data.fidelity.get(e.slug)
304
302
  dur = max(7, (len(roll.in_flight) + len(roll.missing)) * 7) if roll else 7
305
- epics_list.append({
306
- "slug": e.slug,
307
- "title": e.title,
308
- "status": e.status,
309
- "started": e.started or "",
310
- "specs_total": roll.total if roll else 0,
311
- "specs_shipped": len(roll.shipped) if roll else 0,
312
- "specs_in_flight": len(roll.in_flight) if roll else 0,
313
- "has_adrs": f.has_adrs if f else False,
314
- "adr_count": f.adr_count if f else 0,
315
- "task_pct": f.task_pct if f else None,
316
- "fidelity_badge": _fidelity_badge(f) if f else "—",
317
- "duration_days": dur,
318
- })
303
+ epics_list.append(
304
+ {
305
+ "slug": e.slug,
306
+ "title": e.title,
307
+ "status": e.status,
308
+ "started": e.started or "",
309
+ "specs_total": roll.total if roll else 0,
310
+ "specs_shipped": len(roll.shipped) if roll else 0,
311
+ "specs_in_flight": len(roll.in_flight) if roll else 0,
312
+ "has_adrs": f.has_adrs if f else False,
313
+ "adr_count": f.adr_count if f else 0,
314
+ "task_pct": f.task_pct if f else None,
315
+ "fidelity_badge": _fidelity_badge(f) if f else "—",
316
+ "duration_days": dur,
317
+ }
318
+ )
319
319
 
320
320
  # Deduplicate ADRs and attach which epics reference each
321
321
  adr_epics: dict[str, list[str]] = {}
@@ -360,13 +360,15 @@ def _to_json_data(data: RoadmapData, generated_at: str, *, include_done: bool =
360
360
  continue
361
361
  roll = data.rollups.get(e.slug)
362
362
  dur = max(7, (len(roll.in_flight) + len(roll.missing)) * 7) if roll else 7
363
- gantt_bars.append({
364
- "slug": e.slug,
365
- "title": e.title,
366
- "status": e.status,
367
- "started": e.started,
368
- "duration_days": dur,
369
- })
363
+ gantt_bars.append(
364
+ {
365
+ "slug": e.slug,
366
+ "title": e.title,
367
+ "status": e.status,
368
+ "started": e.started,
369
+ "duration_days": dur,
370
+ }
371
+ )
370
372
 
371
373
  return {
372
374
  "project_name": data.project_name,
@@ -475,7 +477,7 @@ def render_markdown(
475
477
  )
476
478
  else:
477
479
  lines.append(
478
- "_No epics declared yet. Run `beacon epic new <slug> --title \"<title>\"` to start._"
480
+ '_No epics declared yet. Run `beacon epic new <slug> --title "<title>"` to start._'
479
481
  )
480
482
  # Still render ADR section if there are any (e.g. from archived epics)
481
483
  if data.adrs:
@@ -494,7 +496,9 @@ def render_markdown(
494
496
  lines.append("## Timeline")
495
497
  lines.append("")
496
498
  lines.append("```mermaid")
497
- lines.append(_mermaid_gantt_src(visible_epics, data.rollups, generated_at, include_done=include_done))
499
+ lines.append(
500
+ _mermaid_gantt_src(visible_epics, data.rollups, generated_at, include_done=include_done)
501
+ )
498
502
  lines.append("```")
499
503
  lines.append("")
500
504
 
@@ -504,7 +508,8 @@ def render_markdown(
504
508
  lines.append(_markdown_status_table(visible_epics, data.rollups, data.fidelity))
505
509
  lines.append("")
506
510
  lines.append(
507
- "_Fidelity: `S+/S?` = has specs / none · `A+/A?` = has ADRs / none · `T:N%` = task completion_"
511
+ "_Fidelity: `S+/S?` = has specs / none"
512
+ " · `A+/A?` = has ADRs / none · `T:N%` = task completion_"
508
513
  )
509
514
  lines.append("")
510
515
 
@@ -545,10 +550,7 @@ def render_html(data: RoadmapData, generated_at: str) -> str:
545
550
  from importlib import resources as _res
546
551
 
547
552
  template_bytes = (
548
- _res.files("beacon")
549
- .joinpath("resources")
550
- .joinpath("roadmap_template.html")
551
- .read_bytes()
553
+ _res.files("beacon").joinpath("resources").joinpath("roadmap_template.html").read_bytes()
552
554
  )
553
555
  template = template_bytes.decode("utf-8")
554
556