trybeacon 0.1.49 → 0.1.51
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.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +22 -18
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/routes-manifest.json +26 -0
- package/.next/server/app/_global-error/page.js +3 -3
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js +2 -2
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +11 -11
- package/.next/server/app/_not-found.segments/_full.segment.rsc +11 -11
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +11 -11
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/board-annotations/[id]/route.js +1 -1
- package/.next/server/app/api/board-annotations/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/board-annotations/route.js +1 -1
- package/.next/server/app/api/board-annotations/route.js.nft.json +1 -1
- package/.next/server/app/api/board-layout/route.js +1 -1
- package/.next/server/app/api/board-layout/route.js.nft.json +1 -1
- package/.next/server/app/api/bug-flags/[id]/route.js +1 -1
- package/.next/server/app/api/bug-flags/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/bug-flags/route.js +1 -1
- package/.next/server/app/api/bug-flags/route.js.nft.json +1 -1
- package/.next/server/app/api/code-graph/position/route.js +1 -1
- package/.next/server/app/api/code-graph/position/route.js.nft.json +1 -1
- package/.next/server/app/api/code-graph/route.js +1 -1
- package/.next/server/app/api/code-graph/route.js.nft.json +1 -1
- package/.next/server/app/api/context/feature/route.js +1 -1
- package/.next/server/app/api/context/feature/route.js.nft.json +1 -1
- package/.next/server/app/api/context/file/route.js +1 -1
- package/.next/server/app/api/context/file/route.js.nft.json +1 -1
- package/.next/server/app/api/context/route.js +2 -2
- package/.next/server/app/api/context/route.js.nft.json +1 -1
- package/.next/server/app/api/db/arrange/route.js +1 -1
- package/.next/server/app/api/db/arrange/route.js.nft.json +1 -1
- package/.next/server/app/api/db/backfill-access/route.js +1 -1
- package/.next/server/app/api/db/backfill-access/route.js.nft.json +1 -1
- package/.next/server/app/api/db/position/route.js +1 -1
- package/.next/server/app/api/db/position/route.js.nft.json +1 -1
- package/.next/server/app/api/db/prune-planned/route.js +1 -1
- package/.next/server/app/api/db/prune-planned/route.js.nft.json +1 -1
- package/.next/server/app/api/db/reconcile-endpoints/route.js +1 -1
- package/.next/server/app/api/db/reconcile-endpoints/route.js.nft.json +1 -1
- package/.next/server/app/api/db/relations/[id]/route.js +1 -1
- package/.next/server/app/api/db/relations/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/db/tables/[id]/route.js +1 -1
- package/.next/server/app/api/db/tables/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/draft/approve/route.js +1 -1
- package/.next/server/app/api/draft/approve/route.js.nft.json +1 -1
- package/.next/server/app/api/draft/route.js +1 -1
- package/.next/server/app/api/draft/route.js.nft.json +1 -1
- package/.next/server/app/api/draft/status/route.js +1 -1
- package/.next/server/app/api/draft/status/route.js.nft.json +1 -1
- package/.next/server/app/api/edges/[id]/route.js +1 -1
- package/.next/server/app/api/edges/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/edges/route.js +1 -1
- package/.next/server/app/api/edges/route.js.nft.json +1 -1
- package/.next/server/app/api/endpoints/[id]/route.js +1 -1
- package/.next/server/app/api/endpoints/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/entities/route.js +1 -1
- package/.next/server/app/api/entities/route.js.nft.json +1 -1
- package/.next/server/app/api/feedback/[id]/route.js +1 -1
- package/.next/server/app/api/feedback/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/feedback/[id]/vote/route.js +1 -1
- package/.next/server/app/api/feedback/[id]/vote/route.js.nft.json +1 -1
- package/.next/server/app/api/feedback/route.js +1 -1
- package/.next/server/app/api/feedback/route.js.nft.json +1 -1
- package/.next/server/app/api/flags/route.js +1 -1
- package/.next/server/app/api/flags/route.js.nft.json +1 -1
- package/.next/server/app/api/ingest/route.js +2 -2
- package/.next/server/app/api/ingest/route.js.nft.json +1 -1
- package/.next/server/app/api/init/route.js +2 -2
- package/.next/server/app/api/init/route.js.nft.json +1 -1
- package/.next/server/app/api/map/describe/route.js +2 -2
- package/.next/server/app/api/map/describe/route.js.nft.json +1 -1
- package/.next/server/app/api/map/files/route.js +1 -1
- package/.next/server/app/api/map/files/route.js.nft.json +1 -1
- package/.next/server/app/api/map/finish/route.js +1 -1
- package/.next/server/app/api/map/finish/route.js.nft.json +1 -1
- package/.next/server/app/api/map/route.js +1 -1
- package/.next/server/app/api/map/route.js.nft.json +1 -1
- package/.next/server/app/api/map/start/route.js +1 -1
- package/.next/server/app/api/map/start/route.js.nft.json +1 -1
- package/.next/server/app/api/map/touch-active/route.js +1 -1
- package/.next/server/app/api/map/touch-active/route.js.nft.json +1 -1
- package/.next/server/app/api/mention-search/route.js +1 -0
- package/.next/server/app/api/mention-search/route.js.nft.json +1 -0
- package/.next/server/app/api/mention-search/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/nodes/[id]/position/route.js +1 -1
- package/.next/server/app/api/nodes/[id]/position/route.js.nft.json +1 -1
- package/.next/server/app/api/nodes/[id]/route.js +1 -1
- package/.next/server/app/api/nodes/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/nodes/positions/route.js +1 -1
- package/.next/server/app/api/nodes/positions/route.js.nft.json +1 -1
- package/.next/server/app/api/nodes/route.js +1 -1
- package/.next/server/app/api/nodes/route.js.nft.json +1 -1
- package/.next/server/app/api/nodes/subtasks/route.js +1 -1
- package/.next/server/app/api/nodes/subtasks/route.js.nft.json +1 -1
- package/.next/server/app/api/notes/[id]/route.js +1 -1
- package/.next/server/app/api/notes/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/notes/route.js +1 -1
- package/.next/server/app/api/notes/route.js.nft.json +1 -1
- package/.next/server/app/api/open/route.js +1 -1
- package/.next/server/app/api/open/route.js.nft.json +1 -1
- package/.next/server/app/api/plan/annotations/route.js +3 -3
- package/.next/server/app/api/plan/annotations/route.js.nft.json +1 -1
- package/.next/server/app/api/plan/approve/route.js +2 -2
- package/.next/server/app/api/plan/approve/route.js.nft.json +1 -1
- package/.next/server/app/api/plan/history/route.js +1 -1
- package/.next/server/app/api/plan/history/route.js.nft.json +1 -1
- package/.next/server/app/api/plan/markdown/route.js +1 -1
- package/.next/server/app/api/plan/markdown/route.js.nft.json +1 -1
- package/.next/server/app/api/plan/presence/route.js +1 -1
- package/.next/server/app/api/plan/presence/route.js.nft.json +1 -1
- package/.next/server/app/api/plan/route.js +1 -1
- package/.next/server/app/api/plan/route.js.nft.json +1 -1
- package/.next/server/app/api/plan/verdict/route.js +1 -1
- package/.next/server/app/api/plan/verdict/route.js.nft.json +1 -1
- package/.next/server/app/api/preferences/route.js +1 -1
- package/.next/server/app/api/preferences/route.js.nft.json +1 -1
- package/.next/server/app/api/project-meta/route.js +1 -1
- package/.next/server/app/api/project-meta/route.js.nft.json +1 -1
- package/.next/server/app/api/reset/route.js +1 -1
- package/.next/server/app/api/reset/route.js.nft.json +1 -1
- package/.next/server/app/api/scope-guard/check/route.js +1 -1
- package/.next/server/app/api/scope-guard/check/route.js.nft.json +1 -1
- package/.next/server/app/api/share/create/route.js +1 -0
- package/.next/server/app/api/share/create/route.js.nft.json +1 -0
- package/.next/server/app/api/share/create/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/share/route.js +1 -0
- package/.next/server/app/api/share/route.js.nft.json +1 -0
- package/.next/server/app/api/share/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/stream/route.js +2 -2
- package/.next/server/app/api/stream/route.js.nft.json +1 -1
- package/.next/server/app/api/tab/nav/route.js +1 -1
- package/.next/server/app/api/tab/nav/route.js.nft.json +1 -1
- package/.next/server/app/api/tab/presence/route.js +1 -1
- package/.next/server/app/api/tab/presence/route.js.nft.json +1 -1
- package/.next/server/app/api/telemetry/route.js +1 -1
- package/.next/server/app/api/telemetry/route.js.nft.json +1 -1
- package/.next/server/app/api/telemetry/stats/route.js +1 -1
- package/.next/server/app/api/telemetry/stats/route.js.nft.json +1 -1
- package/.next/server/app/api/version/route.js +1 -1
- package/.next/server/app/api/version/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/activate/route.js +1 -1
- package/.next/server/app/api/workspace/activate/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/route.js +1 -1
- package/.next/server/app/api/workspace/route.js.nft.json +1 -1
- package/.next/server/app/apple-icon.png/route.js +1 -1
- package/.next/server/app/docs/page.js +2 -2
- package/.next/server/app/docs/page.js.nft.json +1 -1
- package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/docs.html +1 -1
- package/.next/server/app/docs.rsc +12 -12
- package/.next/server/app/docs.segments/_full.segment.rsc +12 -12
- package/.next/server/app/docs.segments/_head.segment.rsc +1 -1
- package/.next/server/app/docs.segments/_index.segment.rsc +11 -11
- package/.next/server/app/docs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/docs.segments/docs.segment.rsc +1 -1
- package/.next/server/app/feedback/page.js +2 -2
- package/.next/server/app/feedback/page.js.nft.json +1 -1
- package/.next/server/app/feedback/page_client-reference-manifest.js +1 -1
- package/.next/server/app/feedback.html +1 -1
- package/.next/server/app/feedback.rsc +11 -11
- package/.next/server/app/feedback.segments/_full.segment.rsc +11 -11
- package/.next/server/app/feedback.segments/_head.segment.rsc +1 -1
- package/.next/server/app/feedback.segments/_index.segment.rsc +11 -11
- package/.next/server/app/feedback.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/feedback.segments/feedback/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/feedback.segments/feedback.segment.rsc +1 -1
- package/.next/server/app/help/page.js +2 -2
- package/.next/server/app/help/page.js.nft.json +1 -1
- package/.next/server/app/help/page_client-reference-manifest.js +1 -1
- package/.next/server/app/help.html +1 -1
- package/.next/server/app/help.rsc +13 -13
- package/.next/server/app/help.segments/_full.segment.rsc +13 -13
- package/.next/server/app/help.segments/_head.segment.rsc +1 -1
- package/.next/server/app/help.segments/_index.segment.rsc +11 -11
- package/.next/server/app/help.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/help.segments/help/__PAGE__.segment.rsc +10 -12
- package/.next/server/app/help.segments/help.segment.rsc +1 -1
- package/.next/server/app/icon.svg/route.js +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +12 -12
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +12 -12
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +11 -11
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/map/page.js +2 -2
- package/.next/server/app/map/page.js.nft.json +1 -1
- package/.next/server/app/map/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page.js +2 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/plan/page.js +2 -2
- package/.next/server/app/plan/page.js.nft.json +1 -1
- package/.next/server/app/plan/page_client-reference-manifest.js +1 -1
- package/.next/server/app/s/[token]/page.js +2 -0
- package/.next/server/app/s/[token]/page.js.nft.json +1 -0
- package/.next/server/app/s/[token]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/settings/page.js +2 -2
- package/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +22 -18
- package/.next/server/chunks/1130.js +1 -1
- package/.next/server/chunks/1669.js +1 -0
- package/.next/server/chunks/2050.js +1 -0
- package/.next/server/chunks/249.js +1 -1
- package/.next/server/chunks/{3221.js → 2693.js} +1 -1
- package/.next/server/chunks/2942.js +1 -0
- package/.next/server/chunks/3098.js +1 -0
- package/.next/server/chunks/3254.js +1 -1
- package/.next/server/chunks/{2999.js → 3304.js} +65 -4
- package/.next/server/chunks/3622.js +1 -1
- package/.next/server/chunks/4046.js +3 -3
- package/.next/server/chunks/4307.js +1 -1
- package/.next/server/chunks/{4217.js → 4700.js} +19 -19
- package/.next/server/chunks/5841.js +1 -0
- package/.next/server/chunks/{4940.js → 7350.js} +1 -1
- package/.next/server/chunks/{8423.js → 9338.js} +8 -8
- package/.next/server/chunks/9683.js +1 -1
- package/.next/server/chunks/9734.js +1 -1
- package/.next/server/chunks/9884.js +2 -2
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/Etq8pxeFDTNRRYXdxo_DD/_buildManifest.js +1 -0
- package/.next/static/chunks/1099-208cc390a92efae0.js +62 -0
- package/.next/static/chunks/1175-715e4664e518ded4.js +1 -0
- package/.next/static/chunks/2231-379685a022444780.js +1 -0
- package/.next/static/chunks/{2500-15c373070714563d.js → 3021-ed52ee7b3f02e2cd.js} +1 -1
- package/.next/static/chunks/54a60aa6-0378818fce5a4dc5.js +82 -0
- package/.next/static/chunks/874-c750840a8644deb1.js +1 -0
- package/.next/static/chunks/9320-7bd45e3feba086b6.js +1 -0
- package/.next/static/chunks/9887-e8954568a4031ed3.js +74 -0
- package/.next/static/chunks/app/_global-error/page-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/board-annotations/[id]/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/board-annotations/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/board-layout/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/bug-flags/[id]/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/bug-flags/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/code-graph/position/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/code-graph/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/context/feature/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/context/file/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/context/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/db/arrange/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/db/backfill-access/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/db/position/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/db/prune-planned/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/db/reconcile-endpoints/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/db/relations/[id]/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/db/tables/[id]/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/draft/approve/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/draft/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/draft/status/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/edges/[id]/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/edges/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/endpoints/[id]/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/entities/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/feedback/[id]/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/feedback/[id]/vote/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/feedback/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/flags/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/ingest/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/init/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/map/describe/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/map/files/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/map/finish/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/map/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/map/start/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/map/touch-active/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/mention-search/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/nodes/[id]/position/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/nodes/[id]/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/nodes/positions/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/nodes/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/nodes/subtasks/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/notes/[id]/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/notes/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/open/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/plan/annotations/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/plan/approve/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/plan/history/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/plan/markdown/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/plan/presence/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/plan/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/plan/verdict/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/preferences/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/project-meta/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/reset/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/scope-guard/check/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/share/create/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/share/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/stream/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/tab/nav/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/tab/presence/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/telemetry/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/telemetry/stats/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/version/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/workspace/activate/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/api/workspace/route-548a84d85e061550.js +1 -0
- package/.next/static/chunks/app/docs/page-ae19d2e91ec24771.js +1 -0
- package/.next/static/chunks/app/layout-3115f8503ff00902.js +1 -0
- package/.next/static/chunks/app/map/page-07f6e0d7c4cac26c.js +1 -0
- package/.next/static/chunks/app/{page-541e900d67f17dae.js → page-a229992616b3a3de.js} +1 -1
- package/.next/static/chunks/app/plan/page-e314ca5940473e0e.js +1 -0
- package/.next/static/chunks/app/s/[token]/page-5fbceb666bceb88e.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-548a84d85e061550.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-548a84d85e061550.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-548a84d85e061550.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-548a84d85e061550.js +1 -0
- package/.next/static/css/d60eecd8c5676c16.css +1 -0
- package/.next/trace +42 -39
- package/.next/trace-build +1 -1
- package/.next/types/app/api/mention-search/route.ts +351 -0
- package/.next/types/app/api/share/create/route.ts +351 -0
- package/.next/types/app/api/share/route.ts +351 -0
- package/.next/types/app/s/[token]/page.ts +87 -0
- package/.next/types/routes.d.ts +6 -2
- package/.next/types/validator.ts +36 -0
- package/dist/bin/doctor.js +16 -6
- package/dist/bin/hook.js +16 -6
- package/dist/bin/mcp.js +47 -37
- package/dist/bin/plan.js +22 -12
- package/dist/bin/prompt.js +1 -1
- package/dist/bin/uninstall.js +16 -6
- package/dist/lib/assets.js +16 -6
- package/dist/lib/codex-install.js +16 -6
- package/dist/lib/global-install.js +16 -6
- package/package.json +4 -1
- package/.next/server/chunks/1341.js +0 -1
- package/.next/server/chunks/7331.js +0 -1
- package/.next/static/chunks/1439-260d1c3a9b3b79b3.js +0 -1
- package/.next/static/chunks/3343-af1292b51a276724.js +0 -1
- package/.next/static/chunks/54a60aa6-407808fee210eca2.js +0 -82
- package/.next/static/chunks/7323-480fb88e9d24f9e9.js +0 -1
- package/.next/static/chunks/7886-46eaf3a9533310f7.js +0 -74
- package/.next/static/chunks/app/_global-error/page-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/board-annotations/[id]/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/board-annotations/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/board-layout/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/bug-flags/[id]/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/bug-flags/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/code-graph/position/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/code-graph/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/context/feature/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/context/file/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/context/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/db/arrange/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/db/backfill-access/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/db/position/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/db/prune-planned/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/db/reconcile-endpoints/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/db/relations/[id]/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/db/tables/[id]/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/draft/approve/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/draft/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/draft/status/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/edges/[id]/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/edges/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/endpoints/[id]/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/entities/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/feedback/[id]/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/feedback/[id]/vote/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/feedback/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/flags/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/ingest/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/init/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/map/describe/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/map/files/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/map/finish/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/map/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/map/start/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/map/touch-active/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/nodes/[id]/position/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/nodes/[id]/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/nodes/positions/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/nodes/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/nodes/subtasks/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/notes/[id]/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/notes/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/open/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/plan/annotations/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/plan/approve/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/plan/history/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/plan/markdown/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/plan/presence/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/plan/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/plan/verdict/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/preferences/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/project-meta/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/reset/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/scope-guard/check/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/stream/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/tab/nav/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/tab/presence/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/telemetry/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/telemetry/stats/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/version/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/workspace/activate/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/api/workspace/route-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/app/docs/page-0c841cb9a7aa2f9a.js +0 -1
- package/.next/static/chunks/app/layout-1bc5f9fd4ce6bff9.js +0 -1
- package/.next/static/chunks/app/map/page-66d71744ae3363d7.js +0 -1
- package/.next/static/chunks/app/plan/page-e7d16fa2a3713a92.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-dc3f0f4fd9e88c4e.js +0 -1
- package/.next/static/css/629ab377241de9ca.css +0 -1
- package/.next/static/qeqVD-yeoYO_3C0pw9kHg/_buildManifest.js +0 -1
- /package/.next/static/{qeqVD-yeoYO_3C0pw9kHg → Etq8pxeFDTNRRYXdxo_DD}/_ssgManifest.js +0 -0
package/dist/bin/plan.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
var
|
|
3
|
+
var uZ=Object.defineProperty;var wZ=(Q)=>Q;function fZ(Q,Z){this[Q]=wZ.bind(null,Z)}var JQ=(Q,Z)=>{for(var $ in Z)uZ(Q,$,{get:Z[$],enumerable:!0,configurable:!0,set:fZ.bind(Z,$)})};var v=(Q,Z)=>()=>(Q&&(Z=Q(Q=0)),Z);var OQ=1500,yQ=480000,U1=1800000,D=3600000,W1=3000;var VQ=()=>{};var UQ={};JQ(UQ,{removeRepoAssets:()=>kZ,installRefreshSkill:()=>AZ,installPlanSkill:()=>IZ,installInitSkill:()=>DZ,installCodexRepoSkills:()=>bZ,ensureWorkflowDoc:()=>OZ,ensureMcp:()=>yZ,auditRepo:()=>LZ,REFRESH_SKILL:()=>qQ,PLAN_SKILL:()=>kQ,INIT_SKILL:()=>zQ});import{existsSync as C,mkdirSync as I,readFileSync as G,rmSync as A,writeFileSync as B}from"fs";import{join as U}from"path";function DZ(Q){let Z=U(Q,".claude","skills","beacon-init");I(Z,{recursive:!0});let $=U(Z,"SKILL.md");return B($,zQ),$}function AZ(Q){let Z=U(Q,".claude","skills","beacon-refresh");I(Z,{recursive:!0});let $=U(Z,"SKILL.md");return B($,qQ),$}function IZ(Q){let Z=U(Q,".claude","skills","beacon-plan");I(Z,{recursive:!0});let $=U(Z,"SKILL.md");return B($,kQ),$}function bZ(Q){let Z=[];for(let $ of EZ){let Y=U(Q,".agents","skills",$.name);I(Y,{recursive:!0});let J=U(Y,"SKILL.md");B(J,$.body()),Z.push(J)}return Z}function OZ(Q){let Z=U(Q,"AGENTS.md"),$="";try{$=G(Z,"utf8")}catch{}let Y=new RegExp(`${E}[\\s\\S]*?${XQ}`);$=Y.test($)?$.replace(Y,LQ):`${$.trim()}
|
|
4
4
|
|
|
5
5
|
${LQ}
|
|
6
6
|
`.trimStart(),B(Z,$.endsWith(`
|
|
@@ -71,7 +71,7 @@ Beacon was already initialized in this repo (\`/beacon-init\` ran at some point)
|
|
|
71
71
|
|
|
72
72
|
## What gets preserved vs replaced
|
|
73
73
|
|
|
74
|
-
The \`beacon_init_persist\` tool **replaces only init-derived nodes** (\`source=INIT\`). A curated architecture node (created by \`
|
|
74
|
+
The \`beacon_init_persist\` tool **replaces only init-derived nodes** (\`source=INIT\`). A curated architecture node (created by \`beacon_feature\` action:done or by hand) whose title matches a component in your refreshed analysis is **merged in place** \u2014 your fresh \`domain\`/\`role\`/\`plain\`/\`layer\`/\`files\` land on it, but it keeps its source, position, status, and bug flags, and no duplicate INIT node is created. Curated nodes your analysis does NOT mention survive untouched, as do hand-edited tables, custom positions, notes, and draft feature plans. So you can re-run this freely.
|
|
75
75
|
|
|
76
76
|
The one caveat: if the user manually edited an INIT-source node on the canvas (e.g., renamed it, rewrote its role), that edit IS overwritten when you re-persist \u2014 and a renamed node no longer title-matches, so it survives as its own card. If the user mentions hand-curated INIT nodes, ask whether they want those carried into the new analysis verbatim.
|
|
77
77
|
|
|
@@ -175,13 +175,23 @@ When listing endpoints, give each \`uses: [{ table, access }]\` so the endpoint\
|
|
|
175
175
|
|
|
176
176
|
EVERY feature MUST carry \`category\` (e.g. AUTH | SEARCH | DATA | INTEL | BILLING | \u2026; \`cluster\` is accepted as an alias) and \`priority\` (0 = P0 critical, 1 = P1 high, 2 = P2 medium, 3 = P3 low). Beacon REJECTS a plan whose features omit either \u2014 \`beacon_propose_plan\` returns the list of what's missing, and an ExitPlanMode \`\`\`beacon block is denied \u2014 so set both on every feature instead of relying on defaults.
|
|
177
177
|
|
|
178
|
-
When the workspace HAS A FRONTEND (Beacon knows \u2014 the agent set \`hasFrontend\` at init, or frontend files were detected), every feature must ALSO carry \`layer\`: \`"frontend" | "backend" | "fullstack"\` \u2014 which side of the stack the work lands on. Plans omitting it are REJECTED the same way category/priority are. It works on every surface that creates roadmap cards (\`beacon_propose_plan\`, the \`\`\`beacon block, \`
|
|
178
|
+
When the workspace HAS A FRONTEND (Beacon knows \u2014 the agent set \`hasFrontend\` at init, or frontend files were detected), every feature must ALSO carry \`layer\`: \`"frontend" | "backend" | "fullstack"\` \u2014 which side of the stack the work lands on. Plans omitting it are REJECTED the same way category/priority are. It works on every surface that creates roadmap cards (\`beacon_propose_plan\`, the \`\`\`beacon block, \`beacon_feature\` \u2014 sub-tasks default to the parent's layer) and on architecture components (\`beacon_feature\` action:done / \`beacon_init_persist\`). In a pure-backend repo, never set it \u2014 the boards don't show it there.
|
|
179
179
|
|
|
180
|
-
|
|
180
|
+
### Adding a card directly \u2014 \`beacon_feature\` (no review gate)
|
|
181
|
+
|
|
182
|
+
To put a card on the board WITHOUT the plan-review flow, call \`beacon_feature\` \u2014 ONE tool for a feature's whole lifecycle:
|
|
183
|
+
- \`{ action: "add" }\` creates a card in a SINGLE call. It defaults to \`status: "backlog"\` (a PENDING item you're NOT working on yet); pass \`status: "active"\` to start it IN_PROGRESS now. A title that matches an existing card returns \`exists\` (reuse it) \u2014 \`add\` never activates or demotes a card already on the board.
|
|
184
|
+
- \`{ action: "start" }\` marks an existing card IN_PROGRESS (create-or-flag).
|
|
185
|
+
- \`{ action: "subtasks" }\` adds child tasks under a card.
|
|
186
|
+
- \`{ action: "done" }\` completes feature(s) and registers the files/architecture touched.
|
|
187
|
+
|
|
188
|
+
A NEW card REQUIRES \`category\` + \`priority\` (and \`layer\` where the workspace has a frontend). Use \`beacon_propose_plan\` / \`beacon_present_plan\` only when you want the user to REVIEW before the card lands.
|
|
189
|
+
|
|
190
|
+
REUSE before you create. Call \`beacon_map\` FIRST \u2014 it lists every card with its \`category\`, \`priority\`, \`layer\` and \`status\`, so you reuse an existing category (don't invent a near-synonym) and spot duplicates WITHOUT calling \`beacon_entities\`. Beacon HARD-BLOCKS a feature that duplicates an existing one (it returns the existing feature to use instead) and one created without a category. \`category\` is the ONLY domain field. \`front\` (in \`beacon_feature\`) nests a card UNDER an existing parent feature \u2014 it is NOT a domain tag; a \`front\` that matches no real feature is rejected.
|
|
181
191
|
|
|
182
192
|
When listing features, give each \`dependsOn: ["Other feature title", \u2026]\` for any feature that must ship after another in the same plan. Beacon draws these as "depends on" links so the roadmap shows the dependency chain instead of loose, disconnected cards.
|
|
183
193
|
|
|
184
|
-
A roadmap item that is a BUG to fix (not a feature to build) should carry \`kind: "BUG"\` \u2014 it renders as a typed bug card. This works everywhere roadmap cards are created: \`beacon_propose_plan\` features, the \`\`\`beacon block, \`
|
|
194
|
+
A roadmap item that is a BUG to fix (not a feature to build) should carry \`kind: "BUG"\` \u2014 it renders as a typed bug card. This works everywhere roadmap cards are created: \`beacon_propose_plan\` features, the \`\`\`beacon block, \`beacon_feature\` (add/start when the user is working on a bug; or \`subtasks\` items for a bug discovered mid-work), and \`beacon_init_persist\` roadmap items. Default is FEATURE.
|
|
185
195
|
|
|
186
196
|
### 2b. Presenting a plan in plan mode (ExitPlanMode)
|
|
187
197
|
|
|
@@ -199,11 +209,11 @@ Beacon extracts it deterministically and **strips the block from the prose** (it
|
|
|
199
209
|
|
|
200
210
|
### 3. At the end, register the work \u2014 in ONE call
|
|
201
211
|
|
|
202
|
-
Call \`
|
|
212
|
+
Call \`beacon_feature({ action: "done" })\` **ONCE** with a \`features\` array \u2014 one entry per feature the plan created \u2014 each with the files you touched and a short markdown description. This flips each one to **Done** \u2014 including its sub-tasks (the cascade completes every PENDING/IN_PROGRESS child; a sub-task you did NOT finish must be set BLOCKED or CANCELLED before registering, so it survives visibly) \u2014 and keeps \`beacon_context_for_feature\` accurate for the next session.
|
|
203
213
|
|
|
204
214
|
Key each entry by its node \`id\`: the ids are handed back to you when the plan is approved (in the approval message / additionalContext), so you don't fuzzy-match titles or pay a disambiguation round-trip. If you don't have an id, \`title\` still works.
|
|
205
215
|
|
|
206
|
-
Register them all in that single batched call. If a plan added five features, that's ONE \`
|
|
216
|
+
Register them all in that single batched call. If a plan added five features, that's ONE \`beacon_feature({ action: "done" })\` call with five entries \u2014 NOT five calls, and NOT just an umbrella ("Harden auth"), which leaves the individual features stuck on **Pending**.
|
|
207
217
|
|
|
208
218
|
If the feature added or materially changed a REAL architectural component (a subsystem \u2014 NOT a file), also pass \`architecture: [{ title, domain, role, \u2026 }]\` so the Architecture map stays accurate. It upserts curated components by title; never list files as components. If you found a bug or something worth investigating in a component's code, add \`bugs: [{ note }]\` to its architecture entry \u2014 it renders as a bug flag on the node (attributed to the agent); identical open flags are not duplicated. Only flag what you actually saw in the code.
|
|
209
219
|
|
|
@@ -240,24 +250,24 @@ the user reviews on a canvas at /plan, and feedback flows back as the next round
|
|
|
240
250
|
Feedback bundles inline annotations on the markdown PLUS any edits the user made directly
|
|
241
251
|
on the /map and /db boards (added features, attached subtasks, edited columns, new
|
|
242
252
|
endpoints). Treat board edits as the user's revision intent \u2014 re-propose matching them
|
|
243
|
-
verbatim. Do NOT implement until the tool returns approval.`;var jQ=v(()=>{x=["beacon-init","beacon-refresh","beacon-plan"]});import{mkdirSync as SZ,renameSync as hZ,rmSync as mZ,writeFileSync as pZ}from"fs";import{dirname as cZ}from"path";function l(Q,Z){SZ(cZ(Q),{recursive:!0});let $=`${Q}.tmp`;try{pZ($,Z),hZ($,Q)}catch(Y){throw mZ($,{force:!0}),Y}}function C1(Q,Z,$=!1){l(Q,JSON.stringify(Z,null,$?2:void 0))}var mQ=()=>{};var sQ={};JQ(sQ,{setupCodexAssets:()=>aZ,removeCodexMcp:()=>tQ,removeCodexArtifacts:()=>sZ,hasCodexMcp:()=>PQ,ensureCodexMcp:()=>aQ,codexMcpProblem:()=>nZ,codexDetected:()=>lQ,auditCodex:()=>tZ,CODEX_HOOKS:()=>s});import{readFileSync as t}from"fs";import{homedir as lZ}from"os";import{join as
|
|
253
|
+
verbatim. Do NOT implement until the tool returns approval.`;var jQ=v(()=>{x=["beacon-init","beacon-refresh","beacon-plan"]});import{mkdirSync as SZ,renameSync as hZ,rmSync as mZ,writeFileSync as pZ}from"fs";import{dirname as cZ}from"path";function l(Q,Z){SZ(cZ(Q),{recursive:!0});let $=`${Q}.tmp`;try{pZ($,Z),hZ($,Q)}catch(Y){throw mZ($,{force:!0}),Y}}function C1(Q,Z,$=!1){l(Q,JSON.stringify(Z,null,$?2:void 0))}var mQ=()=>{};var sQ={};JQ(sQ,{setupCodexAssets:()=>aZ,removeCodexMcp:()=>tQ,removeCodexArtifacts:()=>sZ,hasCodexMcp:()=>PQ,ensureCodexMcp:()=>aQ,codexMcpProblem:()=>nZ,codexDetected:()=>lQ,auditCodex:()=>tZ,CODEX_HOOKS:()=>s});import{readFileSync as t}from"fs";import{homedir as lZ}from"os";import{join as u}from"path";function pQ(){return process.env.HOME||process.env.USERPROFILE||lZ()}function lQ(){if(process.env.BEACON_CODEX==="1")return!0;if(process.env.BEACON_CODEX==="0")return!1;if(GQ===void 0)GQ=Bun.which("codex")!==null;return GQ}function g(Q){try{return Bun.TOML.parse(Q)}catch{return null}}function PQ(){try{return Boolean(g(t(M(),"utf8"))?.mcp_servers?.beacon)}catch{return!1}}function nZ(){let Q="";try{Q=t(M(),"utf8")}catch{return null}let Z=g(Q);if(!Z)return`~/.codex/config.toml does not parse \u2014 ${R}`;if(Z.mcp_servers?.beacon)return null;if(/^\s*mcp_servers\s*=/m.test(Q))return`mcp_servers is an inline table \u2014 ${R}`;return null}function aQ(){let Q="",Z=!1;try{Q=t(M(),"utf8"),Z=!0}catch{}if(Z){let V=g(Q);if(!V)return{added:!1,error:`~/.codex/config.toml does not parse \u2014 ${R}`};if(V.mcp_servers?.beacon)return{added:!1};if(/^\s*mcp_servers\s*=/m.test(Q))return{added:!1,error:`mcp_servers is an inline table \u2014 ${R}`}}let $=!Q?"":Q.endsWith(`
|
|
244
254
|
`)?`
|
|
245
255
|
`:`
|
|
246
256
|
|
|
247
|
-
`,Y=Q+$+dZ;if(
|
|
257
|
+
`,Y=Q+$+dZ;if(g(Y)?.mcp_servers?.beacon?.command!=="beacon")return{added:!1,error:`could not safely append [mcp_servers.beacon] \u2014 ${R}`};return l(M(),Y),{added:!0}}function tQ(){let Q="";try{Q=t(M(),"utf8")}catch{return{removed:!1}}let Z=Q.split(`
|
|
248
258
|
`),$=Z.indexOf(dQ);if($===-1)return{removed:!1,skipped:PQ()};let Y=Z.indexOf(nQ,$);if(Y===-1)return{removed:!1,skipped:!0};Z.splice($,Y-$+1);let J=Z.join(`
|
|
249
259
|
`).replace(/\n{3,}/g,`
|
|
250
260
|
|
|
251
|
-
`).replace(/^\n+/,"");if(
|
|
261
|
+
`).replace(/^\n+/,"");if(g(J)===null)return{removed:!1,skipped:!0};return l(M(),J),{removed:!0}}async function aZ(){let{INIT_SKILL:Q,REFRESH_SKILL:Z,PLAN_SKILL:$}=await Promise.resolve().then(() => (WQ(),UQ)),Y={"beacon-init":Q,"beacon-refresh":Z,"beacon-plan":$},J=[];for(let z of x){if(!F(n(),z))J.push(z);p(n(),z,Y[z])}let V=0;for(let z of s)if(k(KQ(),{event:z.event,matcher:z.matcher,command:z.command}))V++;let q=T(d(),a);h(d(),a,cQ,L);let X=aQ();return{skillsAdded:J,hooksAdded:V,agentsMdBlockTouched:!q,mcp:X}}function tZ(){let Q={};for(let $ of x)Q[$]=F(n(),$);let Z={};for(let $ of s)Z[$.event]=_(KQ(),{event:$.event,command:$.command});return{detected:lQ(),skills:Q,hooks:Z,agentsMdBlock:T(d(),a),mcp:PQ()}}function sZ(){let Q=[];for(let J of x)if(c(n(),J))Q.push(J);let Z=0;for(let J of s)if(S(KQ(),{event:J.event,command:J.command}))Z++;let $=m(d(),a,cQ),Y=tQ();return{skillsRemoved:Q,hooksRemoved:Z,agentsMdBlockRemoved:$,mcpRemoved:Y.removed,mcpSkipped:Y.skipped}}var xQ=()=>u(pQ(),".codex"),KQ=()=>u(xQ(),"hooks.json"),M=()=>u(xQ(),"config.toml"),d=()=>u(xQ(),"AGENTS.md"),n=()=>u(pQ(),".agents","skills"),a="<!-- beacon:global:start -->",cQ="<!-- beacon:global:end -->",s,GQ,dQ="# beacon:start (managed by Beacon \u2014 `beacon uninstall` removes this block)",nQ="# beacon:end",dZ,R="add it manually: codex mcp add beacon -- beacon mcp";var rQ=v(()=>{jQ();mQ();s=[{event:"PostToolUse",matcher:"apply_patch",command:"beacon hook",description:"Report file edits to Beacon's active feature so the map stays fresh."},{event:"UserPromptSubmit",matcher:"*",command:"beacon prompt",description:"On feature-y prompts in a Beacon-wired repo, remind the agent to run the context\u2192propose\u2192describe loop (no-op otherwise)."},{event:"Stop",matcher:"*",command:"beacon stop-hook",description:"When the agent ends a turn asking for plan approval in prose, nudge it to present the plan on Beacon's /plan canvas."}];dZ=`${dQ}
|
|
252
262
|
[mcp_servers.beacon]
|
|
253
263
|
command = "beacon"
|
|
254
264
|
args = ["mcp"]
|
|
255
265
|
${nQ}
|
|
256
|
-
`});var $Z={};JQ($Z,{provisionDb:()=>v0});import{createClient as X0}from"@libsql/client";import{drizzle as U0}from"drizzle-orm/libsql";import{migrate as W0}from"drizzle-orm/libsql/migrator";import{readMigrationFiles as H0}from"drizzle-orm/migrator";import{dirname as FQ,join as B0}from"path";import{fileURLToPath as j0}from"url";async function i(Q,Z){return(await Q.execute({sql:"SELECT 1 FROM sqlite_master WHERE type='table' AND name = ?",args:[Z]})).rows.length>0}async function P0(Q,Z){let $=await Q.execute(`PRAGMA table_info("${Z}")`);return new Set($.rows.map((Y)=>String(Y.name)))}async function ZZ(Q){if(!await i(Q,"__drizzle_migrations"))return 0;let Z=await Q.execute('SELECT count(*) AS n FROM "__drizzle_migrations"');return Number(Z.rows[0]?.n??0)}async function N0(Q){for(let[Z,$]of Object.entries(K0)){if(!await i(Q,Z))continue;let Y=await P0(Q,Z);for(let J of $){if(!Y.has(J))continue;await Q.execute(`UPDATE "${Z}" SET "${J}" = CAST((julianday("${J}") - 2440587.5) * 86400000 AS INTEGER) WHERE typeof("${J}") = 'text'`)}}}async function v0(Q,Z=x0){let $=X0({url:Q});try{await $.execute("PRAGMA journal_mode = WAL;"),await $.execute("PRAGMA foreign_keys = ON;"),await $.execute("PRAGMA busy_timeout = 5000;");let Y=await i($,"__drizzle_migrations"),J=await i($,"Node"),V=!1;if(J&&!Y){let X=H0({migrationsFolder:Z})[0];if(X)await $.execute('CREATE TABLE IF NOT EXISTS "__drizzle_migrations" (id SERIAL PRIMARY KEY, hash text NOT NULL, created_at numeric)'),await $.execute({sql:'INSERT INTO "__drizzle_migrations" ("hash", "created_at") VALUES (?, ?)',args:[X.hash,X.folderMillis]}),V=!0}let q=await ZZ($);if(await W0(U0($),{migrationsFolder:Z}),await ZZ($)>q)V=!0;return await N0($),{migrated:V}}finally{$.close()}}var G0,x0,K0;var YZ=v(async()=>{G0=FQ(FQ(FQ(j0(import.meta.url)))),x0=process.env.BEACON_MIGRATIONS_DIR||B0(G0,"drizzle"),K0={Node:["createdAt","updatedAt"],Note:["createdAt","updatedAt"],DbTable:["createdAt","updatedAt"],Endpoint:["createdAt","updatedAt"],DraftTable:["createdAt"],SyncState:["codeGraphSyncedAt","updatedAt"],AppSetting:["updatedAt"],ProjectMeta:["updatedAt"],CodeFile:["updatedAt"]}});jQ();import{existsSync as rZ}from"fs";import{homedir as oZ}from"os";import{join as r}from"path";function iZ(){return process.env.HOME||process.env.USERPROFILE||oZ()}var o=()=>r(iZ(),".claude"),NQ=()=>r(o(),"skills"),vQ=()=>r(o(),"settings.json"),CQ=()=>r(o(),"CLAUDE.md"),MQ="<!-- beacon:global:start -->",oQ="<!-- beacon:global:end -->";var eZ=L,TQ=[{event:"PreToolUse",matcher:"Edit|Write|MultiEdit",command:"beacon guard",description:"Gate edits against the active plan's scope contract (when the scope-guard flag is on): in-scope \u2192 allow, off-scope \u2192 ask the user to authorize. No-op + fail-open otherwise."},{event:"PostToolUse",matcher:"Edit|Write|MultiEdit",command:"beacon hook",description:"Report file edits to Beacon's active feature so the map stays fresh."},{event:"PermissionRequest",matcher:"ExitPlanMode",command:"beacon plan",description:"Pipe the agent's plan markdown into Beacon's /plan canvas for review."},{event:"UserPromptSubmit",matcher:"*",command:"beacon prompt",description:"On feature-y prompts in a Beacon-wired repo, remind the agent to run the context\u2192propose\u2192describe loop (no-op otherwise)."},{event:"Stop",matcher:"*",command:"beacon stop-hook",description:"When the agent ends a turn asking for plan approval in prose (instead of presenting it), nudge it to present the plan on Beacon's /plan canvas. Bounded by stop_hook_active \u2014 at most one nudge."}];function Q0(Q,Z){return p(NQ(),Q,Z)}function iQ(Q){return F(NQ(),Q)}function Z0(Q){return c(NQ(),Q)}function $0(Q){return k(vQ(),Q)}function Y0(Q){return _(vQ(),Q)}function J0(Q){return S(vQ(),Q)}function V0(Q){h(CQ(),MQ,oQ,Q)}function eQ(){return T(CQ(),MQ)}function z0(){return m(CQ(),MQ,oQ)}function I1(){let Q={};for(let $ of x)Q[$]=iQ($);let Z={};for(let $ of TQ)Z[$.event]=Y0({event:$.event,command:$.command});return{homeExists:rZ(o()),skills:Q,hooks:Z,claudeMdBlock:eQ()}}async function q0(){let{INIT_SKILL:Q,REFRESH_SKILL:Z,PLAN_SKILL:$}=await Promise.resolve().then(() => (WQ(),UQ)),Y={"beacon-init":Q,"beacon-refresh":Z,"beacon-plan":$},J=[];for(let X of x){if(!iQ(X))J.push(X);Q0(X,Y[X])}let V=0;for(let X of TQ)if($0({event:X.event,matcher:X.matcher,command:X.command}))V++;let q=eQ();return V0(eZ),{skillsAdded:J,hooksAdded:V,claudeMdBlockTouched:!q}}async function QZ(){let Q;try{Q={ok:!0,...await q0()}}catch(Z){Q={ok:!1,error:Z instanceof Error?Z.message:String(Z),skillsAdded:[],hooksAdded:0,claudeMdBlockTouched:!1}}try{let Z=await Promise.resolve().then(() => (rQ(),sQ));if(Z.codexDetected())Q.codex={ok:!0,...await Z.setupCodexAssets()}}catch(Z){Q.codex={ok:!1,error:Z instanceof Error?Z.message:String(Z),skillsAdded:[],hooksAdded:0,agentsMdBlockTouched:!1,mcp:{added:!1}}}return Q}function E1(){let Q=[];for(let Y of x)if(Z0(Y))Q.push(Y);let Z=0;for(let Y of TQ)if(J0(Y))Z++;let $=z0();return{skillsRemoved:Q,hooksRemoved:Z,claudeMdBlockRemoved:$}}import{AsyncLocalStorage as C0}from"async_hooks";import{spawnSync as M0}from"child_process";import{createHash as T0}from"crypto";import{existsSync as VZ,mkdirSync as w,readFileSync as RQ,writeFileSync as gQ}from"fs";import{homedir as zZ}from"os";import{basename as F0,join as K,parse as u0,resolve as JZ}from"path";function j(){return process.env.BEACON_HOME||K(zZ(),".beacon")}function wQ(){return K(j(),"workspaces.json")}function e(Q){return T0("sha256").update(Q).digest("hex").slice(0,12)}function n1(Q=process.cwd()){let Z=M0("git",["rev-parse","--show-toplevel"],{cwd:Q,stdio:["ignore","pipe","ignore"]});if(Z.status===0){let $=Z.stdout?.toString().trim();if($)return $}return Q}function qZ(Q){let Z=JZ(Q);return Z!==JZ(zZ())&&Z!==u0(Z).root}function XZ(){return K(j(),"deleted.json")}function fQ(){try{let Q=JSON.parse(RQ(XZ(),"utf8"));return Array.isArray(Q)?Q:[]}catch{return[]}}function UZ(Q){w(j(),{recursive:!0}),gQ(XZ(),JSON.stringify(Q,null,2))}function WZ(Q){return fQ().includes(Q)}function a1(Q){let Z=fQ();if(!Z.includes(Q))UZ([...Z,Q])}function R0(Q){let Z=fQ();if(Z.includes(Q))UZ(Z.filter(($)=>$!==Q))}function QQ(Q){return K(j(),Q)}function g0(Q){return`file:${K(QQ(Q),"db.sqlite")}`}function f(){try{let Q=JSON.parse(RQ(wQ(),"utf8"));return Array.isArray(Q)?Q:[]}catch{return[]}}function DQ(Q){w(j(),{recursive:!0}),gQ(wQ(),JSON.stringify(Q,null,2))}function HZ(){return f().sort((Q,Z)=>Z.lastOpenedAt.localeCompare(Q.lastOpenedAt))}function P(Q){return f().find((Z)=>Z.id===Q)??null}function BZ(Q,Z,$=new Date().toISOString()){if(!qZ(Q))throw Error(`beacon: refusing to register a non-repo path as a workspace: ${Q}`);let Y=e(Q);if(WZ(Y))throw Error(`beacon: workspace ${Y} (${Q}) was deleted \u2014 run \`beacon\` or /beacon-init to re-add it`);let J=f(),V=J.find((z)=>z.id===Y),q={id:Y,path:Q,name:Z||V?.name||F0(Q),lastOpenedAt:$},X=[q,...J.filter((z)=>z.id!==Y)];return w(QQ(Y),{recursive:!0}),DQ(X),q}function t1(Q,Z){return R0(e(Q)),BZ(Q,Z)}function s1(Q,Z=new Date().toISOString()){let $=f(),Y=$.find((J)=>J.id===Q);if(!Y)return;Y.lastOpenedAt=Z,DQ($)}function r1(Q){if(DQ(f().filter((Z)=>Z.id!==Q)),AQ()===Q)w0(HZ()[0]?.id??null)}function jZ(){return K(j(),"active")}function AQ(){try{return RQ(jZ(),"utf8").trim()||null}catch{return null}}function w0(Q){w(j(),{recursive:!0}),gQ(jZ(),Q??"")}function o1(){let Q=AQ();return Q?P(Q):null}function i1(){let Q=A0()??AQ();return Q?P(Q):null}function e1(Q){return P(Q)?.path??null}function Q2(){return VZ(wQ())}var GZ="beacon_ws";function xZ(Q,Z){let $=Q.headers.get("cookie");if(!$)return null;for(let Y of $.split(";")){let J=Y.indexOf("=");if(J===-1)continue;if(Y.slice(0,J).trim()===Z)return decodeURIComponent(Y.slice(J+1).trim())}return null}function Z2(Q){let Z=Q.headers.get("x-beacon-workspace");if(Z&&P(Z))return Z;let $=xZ(Q,GZ);if($&&P($))return $;return f0()}function f0(){let Q=HZ();return Q.length===1?Q[0].id:null}var D0="x-beacon-workspace-path";async function $2(Q){let Z=Q.headers.get("x-beacon-workspace");if(Z&&P(Z))return Z;let $=Q.headers.get(D0);if($&&qZ($)&&!WZ(e($))&&(!Z||e($)===Z)){let J=BZ($);return await I0(J.id),J.id}let Y=xZ(Q,GZ);if(Y&&P(Y))return Y;return null}var KZ=new C0;function Y2(Q,Z){return Q?KZ.run(Q,Z):Z()}function A0(){return KZ.getStore()??null}var uQ=new Set;function J2(Q){uQ.delete(K(QQ(Q),"db.sqlite"))}async function I0(Q){let Z=QQ(Q),$=K(Z,"db.sqlite"),Y=VZ($);if(Y&&uQ.has($))return{ok:!0,created:!1,migrated:!1};try{w(Z,{recursive:!0});let{provisionDb:J}=await YZ().then(() => $Z),V=await J(g0(Q));return uQ.add($),{ok:!0,created:!Y,migrated:Y&&V.migrated}}catch(J){return{ok:!1,created:!1,migrated:!1,error:J instanceof Error?J.message:String(J)}}}import{connect as E0}from"net";var q2=4319;function b0(Q,Z,$=400){return new Promise((Y)=>{let J=E0({host:Q,port:Z}),V=!1,q=(X)=>{if(V)return;V=!0,J.destroy(),Y(X)};J.once("connect",()=>q(!0)),J.once("error",()=>q(!1)),J.setTimeout($,()=>q(!1))})}async function O0(Q){for(let Z of["127.0.0.1","::1"])if(await b0(Z,Q))return!1;return!0}async function PZ(Q,Z=20){for(let $=Q;$<Q+Z;$++)if(await O0($))return $;return Q}import{execSync as p0,spawn as c0}from"child_process";import{mkdirSync as l0,openSync as d0,readFileSync as n0,writeFileSync as a0}from"fs";import{homedir as t0}from"os";import{dirname as s0,join as $Q}from"path";import{fileURLToPath as r0}from"url";import{createHash as o0}from"crypto";VQ();import{mkdirSync as L0,readFileSync as k0,writeFileSync as _0}from"fs";import{join as S0}from"path";var y0=["default","acceptEdits","bypassPermissions","auto"];function NZ(Q){return typeof Q==="string"&&y0.includes(Q)}function vZ(Q,Z){let $={behavior:"allow"};if(Q)$.updatedPermissions=[{type:"setMode",mode:Q,destination:"session"}];let Y={hookEventName:"PermissionRequest",decision:$};if(Z?.trim())Y.additionalContext=Z;return{hookSpecificOutput:Y}}function CZ(){return S0(j(),"preferences.json")}function IQ(){try{let Q=JSON.parse(k0(CZ(),"utf8"));return{planApprovalMode:NZ(Q.planApprovalMode)?Q.planApprovalMode:void 0,planApprovalModeConfigured:Q.planApprovalModeConfigured===!0,telemetryUuid:typeof Q.telemetryUuid==="string"?Q.telemetryUuid:void 0,telemetryEnabled:Q.telemetryEnabled===!1?!1:Q.telemetryEnabled===!0?!0:void 0}}catch{return{}}}function G2(Q){let Z={...IQ(),...Q};return L0(j(),{recursive:!0}),_0(CZ(),JSON.stringify(Z,null,2)),Z}function MZ(Q){if(!Q?.length)return"";let Z=Q.map((Y)=>Y.id?` \u2022 ${Y.title} \u2014 id: ${Y.id}`:` \u2022 ${Y.title}`),$=Q.some((Y)=>Y.id);return`
|
|
266
|
+
`});var $Z={};JQ($Z,{provisionDb:()=>v0});import{createClient as X0}from"@libsql/client";import{drizzle as U0}from"drizzle-orm/libsql";import{migrate as W0}from"drizzle-orm/libsql/migrator";import{readMigrationFiles as H0}from"drizzle-orm/migrator";import{dirname as FQ,join as B0}from"path";import{fileURLToPath as j0}from"url";async function i(Q,Z){return(await Q.execute({sql:"SELECT 1 FROM sqlite_master WHERE type='table' AND name = ?",args:[Z]})).rows.length>0}async function P0(Q,Z){let $=await Q.execute(`PRAGMA table_info("${Z}")`);return new Set($.rows.map((Y)=>String(Y.name)))}async function ZZ(Q){if(!await i(Q,"__drizzle_migrations"))return 0;let Z=await Q.execute('SELECT count(*) AS n FROM "__drizzle_migrations"');return Number(Z.rows[0]?.n??0)}async function N0(Q){for(let[Z,$]of Object.entries(K0)){if(!await i(Q,Z))continue;let Y=await P0(Q,Z);for(let J of $){if(!Y.has(J))continue;await Q.execute(`UPDATE "${Z}" SET "${J}" = CAST((julianday("${J}") - 2440587.5) * 86400000 AS INTEGER) WHERE typeof("${J}") = 'text'`)}}}async function v0(Q,Z=x0){let $=X0({url:Q});try{await $.execute("PRAGMA journal_mode = WAL;"),await $.execute("PRAGMA foreign_keys = ON;"),await $.execute("PRAGMA busy_timeout = 5000;");let Y=await i($,"__drizzle_migrations"),J=await i($,"Node"),V=!1;if(J&&!Y){let X=H0({migrationsFolder:Z})[0];if(X)await $.execute('CREATE TABLE IF NOT EXISTS "__drizzle_migrations" (id SERIAL PRIMARY KEY, hash text NOT NULL, created_at numeric)'),await $.execute({sql:'INSERT INTO "__drizzle_migrations" ("hash", "created_at") VALUES (?, ?)',args:[X.hash,X.folderMillis]}),V=!0}let q=await ZZ($);if(await W0(U0($),{migrationsFolder:Z}),await ZZ($)>q)V=!0;return await N0($),{migrated:V}}finally{$.close()}}var G0,x0,K0;var YZ=v(async()=>{G0=FQ(FQ(FQ(j0(import.meta.url)))),x0=process.env.BEACON_MIGRATIONS_DIR||B0(G0,"drizzle"),K0={Node:["createdAt","updatedAt"],Note:["createdAt","updatedAt"],DbTable:["createdAt","updatedAt"],Endpoint:["createdAt","updatedAt"],DraftTable:["createdAt"],SyncState:["codeGraphSyncedAt","updatedAt"],AppSetting:["updatedAt"],ProjectMeta:["updatedAt"],CodeFile:["updatedAt"]}});jQ();import{existsSync as rZ}from"fs";import{homedir as oZ}from"os";import{join as r}from"path";function iZ(){return process.env.HOME||process.env.USERPROFILE||oZ()}var o=()=>r(iZ(),".claude"),NQ=()=>r(o(),"skills"),vQ=()=>r(o(),"settings.json"),CQ=()=>r(o(),"CLAUDE.md"),MQ="<!-- beacon:global:start -->",oQ="<!-- beacon:global:end -->";var eZ=L,TQ=[{event:"PreToolUse",matcher:"Edit|Write|MultiEdit",command:"beacon guard",description:"Gate edits against the active plan's scope contract (when the scope-guard flag is on): in-scope \u2192 allow, off-scope \u2192 ask the user to authorize. No-op + fail-open otherwise."},{event:"PostToolUse",matcher:"Edit|Write|MultiEdit",command:"beacon hook",description:"Report file edits to Beacon's active feature so the map stays fresh."},{event:"PermissionRequest",matcher:"ExitPlanMode",command:"beacon plan",description:"Pipe the agent's plan markdown into Beacon's /plan canvas for review."},{event:"UserPromptSubmit",matcher:"*",command:"beacon prompt",description:"On feature-y prompts in a Beacon-wired repo, remind the agent to run the context\u2192propose\u2192describe loop (no-op otherwise)."},{event:"Stop",matcher:"*",command:"beacon stop-hook",description:"When the agent ends a turn asking for plan approval in prose (instead of presenting it), nudge it to present the plan on Beacon's /plan canvas. Bounded by stop_hook_active \u2014 at most one nudge."}];function Q0(Q,Z){return p(NQ(),Q,Z)}function iQ(Q){return F(NQ(),Q)}function Z0(Q){return c(NQ(),Q)}function $0(Q){return k(vQ(),Q)}function Y0(Q){return _(vQ(),Q)}function J0(Q){return S(vQ(),Q)}function V0(Q){h(CQ(),MQ,oQ,Q)}function eQ(){return T(CQ(),MQ)}function z0(){return m(CQ(),MQ,oQ)}function I1(){let Q={};for(let $ of x)Q[$]=iQ($);let Z={};for(let $ of TQ)Z[$.event]=Y0({event:$.event,command:$.command});return{homeExists:rZ(o()),skills:Q,hooks:Z,claudeMdBlock:eQ()}}async function q0(){let{INIT_SKILL:Q,REFRESH_SKILL:Z,PLAN_SKILL:$}=await Promise.resolve().then(() => (WQ(),UQ)),Y={"beacon-init":Q,"beacon-refresh":Z,"beacon-plan":$},J=[];for(let X of x){if(!iQ(X))J.push(X);Q0(X,Y[X])}let V=0;for(let X of TQ)if($0({event:X.event,matcher:X.matcher,command:X.command}))V++;let q=eQ();return V0(eZ),{skillsAdded:J,hooksAdded:V,claudeMdBlockTouched:!q}}async function QZ(){let Q;try{Q={ok:!0,...await q0()}}catch(Z){Q={ok:!1,error:Z instanceof Error?Z.message:String(Z),skillsAdded:[],hooksAdded:0,claudeMdBlockTouched:!1}}try{let Z=await Promise.resolve().then(() => (rQ(),sQ));if(Z.codexDetected())Q.codex={ok:!0,...await Z.setupCodexAssets()}}catch(Z){Q.codex={ok:!1,error:Z instanceof Error?Z.message:String(Z),skillsAdded:[],hooksAdded:0,agentsMdBlockTouched:!1,mcp:{added:!1}}}return Q}function E1(){let Q=[];for(let Y of x)if(Z0(Y))Q.push(Y);let Z=0;for(let Y of TQ)if(J0(Y))Z++;let $=z0();return{skillsRemoved:Q,hooksRemoved:Z,claudeMdBlockRemoved:$}}import{AsyncLocalStorage as C0}from"async_hooks";import{spawnSync as M0}from"child_process";import{createHash as T0}from"crypto";import{existsSync as VZ,mkdirSync as w,readFileSync as gQ,writeFileSync as uQ}from"fs";import{homedir as zZ}from"os";import{basename as F0,join as K,parse as R0,resolve as JZ}from"path";function j(){return process.env.BEACON_HOME||K(zZ(),".beacon")}function wQ(){return K(j(),"workspaces.json")}function e(Q){return T0("sha256").update(Q).digest("hex").slice(0,12)}function n1(Q=process.cwd()){let Z=M0("git",["rev-parse","--show-toplevel"],{cwd:Q,stdio:["ignore","pipe","ignore"]});if(Z.status===0){let $=Z.stdout?.toString().trim();if($)return $}return Q}function qZ(Q){let Z=JZ(Q);return Z!==JZ(zZ())&&Z!==R0(Z).root}function XZ(){return K(j(),"deleted.json")}function fQ(){try{let Q=JSON.parse(gQ(XZ(),"utf8"));return Array.isArray(Q)?Q:[]}catch{return[]}}function UZ(Q){w(j(),{recursive:!0}),uQ(XZ(),JSON.stringify(Q,null,2))}function WZ(Q){return fQ().includes(Q)}function a1(Q){let Z=fQ();if(!Z.includes(Q))UZ([...Z,Q])}function g0(Q){let Z=fQ();if(Z.includes(Q))UZ(Z.filter(($)=>$!==Q))}function QQ(Q){return K(j(),Q)}function u0(Q){return`file:${K(QQ(Q),"db.sqlite")}`}function f(){try{let Q=JSON.parse(gQ(wQ(),"utf8"));return Array.isArray(Q)?Q:[]}catch{return[]}}function DQ(Q){w(j(),{recursive:!0}),uQ(wQ(),JSON.stringify(Q,null,2))}function HZ(){return f().sort((Q,Z)=>Z.lastOpenedAt.localeCompare(Q.lastOpenedAt))}function P(Q){return f().find((Z)=>Z.id===Q)??null}function BZ(Q,Z,$=new Date().toISOString()){if(!qZ(Q))throw Error(`beacon: refusing to register a non-repo path as a workspace: ${Q}`);let Y=e(Q);if(WZ(Y))throw Error(`beacon: workspace ${Y} (${Q}) was deleted \u2014 run \`beacon\` or /beacon-init to re-add it`);let J=f(),V=J.find((z)=>z.id===Y),q={id:Y,path:Q,name:Z||V?.name||F0(Q),lastOpenedAt:$},X=[q,...J.filter((z)=>z.id!==Y)];return w(QQ(Y),{recursive:!0}),DQ(X),q}function t1(Q,Z){return g0(e(Q)),BZ(Q,Z)}function s1(Q,Z=new Date().toISOString()){let $=f(),Y=$.find((J)=>J.id===Q);if(!Y)return;Y.lastOpenedAt=Z,DQ($)}function r1(Q){if(DQ(f().filter((Z)=>Z.id!==Q)),AQ()===Q)w0(HZ()[0]?.id??null)}function jZ(){return K(j(),"active")}function AQ(){try{return gQ(jZ(),"utf8").trim()||null}catch{return null}}function w0(Q){w(j(),{recursive:!0}),uQ(jZ(),Q??"")}function o1(){let Q=AQ();return Q?P(Q):null}function i1(){let Q=A0()??AQ();return Q?P(Q):null}function e1(Q){return P(Q)?.path??null}function Q2(){return VZ(wQ())}var GZ="beacon_ws";function xZ(Q,Z){let $=Q.headers.get("cookie");if(!$)return null;for(let Y of $.split(";")){let J=Y.indexOf("=");if(J===-1)continue;if(Y.slice(0,J).trim()===Z)return decodeURIComponent(Y.slice(J+1).trim())}return null}function Z2(Q){let Z=Q.headers.get("x-beacon-workspace");if(Z&&P(Z))return Z;let $=xZ(Q,GZ);if($&&P($))return $;return f0()}function f0(){let Q=HZ();return Q.length===1?Q[0].id:null}var D0="x-beacon-workspace-path";async function $2(Q){let Z=Q.headers.get("x-beacon-workspace");if(Z&&P(Z))return Z;let $=Q.headers.get(D0);if($&&qZ($)&&!WZ(e($))&&(!Z||e($)===Z)){let J=BZ($);return await I0(J.id),J.id}let Y=xZ(Q,GZ);if(Y&&P(Y))return Y;return null}var KZ=new C0;function Y2(Q,Z){return Q?KZ.run(Q,Z):Z()}function A0(){return KZ.getStore()??null}var RQ=new Set;function J2(Q){RQ.delete(K(QQ(Q),"db.sqlite"))}async function I0(Q){let Z=QQ(Q),$=K(Z,"db.sqlite"),Y=VZ($);if(Y&&RQ.has($))return{ok:!0,created:!1,migrated:!1};try{w(Z,{recursive:!0});let{provisionDb:J}=await YZ().then(() => $Z),V=await J(u0(Q));return RQ.add($),{ok:!0,created:!Y,migrated:Y&&V.migrated}}catch(J){return{ok:!1,created:!1,migrated:!1,error:J instanceof Error?J.message:String(J)}}}import{connect as E0}from"net";var q2=4319;function b0(Q,Z,$=400){return new Promise((Y)=>{let J=E0({host:Q,port:Z}),V=!1,q=(X)=>{if(V)return;V=!0,J.destroy(),Y(X)};J.once("connect",()=>q(!0)),J.once("error",()=>q(!1)),J.setTimeout($,()=>q(!1))})}async function O0(Q){for(let Z of["127.0.0.1","::1"])if(await b0(Z,Q))return!1;return!0}async function PZ(Q,Z=20){for(let $=Q;$<Q+Z;$++)if(await O0($))return $;return Q}import{execSync as p0,spawn as c0}from"child_process";import{mkdirSync as l0,openSync as d0,readFileSync as n0,writeFileSync as a0}from"fs";import{homedir as t0}from"os";import{dirname as s0,join as $Q}from"path";import{fileURLToPath as r0}from"url";import{createHash as o0}from"crypto";VQ();import{mkdirSync as L0,readFileSync as k0,writeFileSync as _0}from"fs";import{join as S0}from"path";var y0=["default","acceptEdits","bypassPermissions","auto"];function NZ(Q){return typeof Q==="string"&&y0.includes(Q)}function vZ(Q,Z){let $={behavior:"allow"};if(Q)$.updatedPermissions=[{type:"setMode",mode:Q,destination:"session"}];let Y={hookEventName:"PermissionRequest",decision:$};if(Z?.trim())Y.additionalContext=Z;return{hookSpecificOutput:Y}}function CZ(){return S0(j(),"preferences.json")}function IQ(){try{let Q=JSON.parse(k0(CZ(),"utf8"));return{planApprovalMode:NZ(Q.planApprovalMode)?Q.planApprovalMode:void 0,planApprovalModeConfigured:Q.planApprovalModeConfigured===!0,telemetryUuid:typeof Q.telemetryUuid==="string"?Q.telemetryUuid:void 0,telemetryEnabled:Q.telemetryEnabled===!1?!1:Q.telemetryEnabled===!0?!0:void 0}}catch{return{}}}function G2(Q){let Z={...IQ(),...Q};return L0(j(),{recursive:!0}),_0(CZ(),JSON.stringify(Z,null,2)),Z}function MZ(Q){if(!Q?.length)return"";let Z=Q.map((Y)=>Y.id?` \u2022 ${Y.title} \u2014 id: ${Y.id}`:` \u2022 ${Y.title}`),$=Q.some((Y)=>Y.id);return`
|
|
257
267
|
|
|
258
268
|
This plan created these roadmap feature(s):
|
|
259
269
|
`+Z.join(`
|
|
260
|
-
`)+
|
|
270
|
+
`)+'\n\nWhen the work ships, register them in ONE call: `beacon_feature({ action: "done" })` with a '+"`features` array \u2014 one entry per feature"+($?", each keyed by the `id` above (no title-matching needed)":"")+", each with the files you touched + a short markdown summary. Do them all in that single "+"batched call so every feature flips to Done \u2014 do NOT register only the umbrella, and do "+"NOT make one call per feature."}import{execSync as h0}from"child_process";import{platform as TZ}from"os";function m0(Q){if(process.env.BEACON_NO_OPEN)return;let Z=TZ()==="darwin"?"open":TZ()==="win32"?"start":"xdg-open";try{h0(`${Z} "${Q}"`,{stdio:"ignore"})}catch{}}async function FZ(Q,Z){if(await fetch(`${Q}/api/plan/presence`,{headers:{"x-beacon-workspace":Z}}).then((J)=>J.json()).then((J)=>!!J?.live).catch(()=>!1))return;let Y=encodeURIComponent(`/plan?ws=${Z}`);m0(`${Q}/api/workspace/activate?id=${Z}&redirect=${Y}`)}var i0=$Q(s0(r0(import.meta.url)),".."),bQ=process.env.BEACON_HOME||$Q(t0(),".beacon"),RZ=$Q(bQ,"server.json"),e0=process.env.PORT||"4319";function Q1(Q){try{return process.kill(Q,0),!0}catch{return!1}}function Z1(Q){try{return JSON.parse(n0(Q,"utf8"))}catch{return null}}async function gZ(Q){try{return(await fetch(Q)).ok}catch{return!1}}async function $1(Q,Z=60){for(let $=0;$<Z;$++){if(await gZ(Q))return!0;await new Promise((Y)=>setTimeout(Y,500))}return!1}function Y1(Q){l0(bQ,{recursive:!0});let Z=d0($Q(bQ,"server.log"),"a"),$={...process.env,PORT:Q,BEACON_NO_OPEN:"1"};delete $.BEACON_REPO,delete $.BEACON_DATA_DIR,delete $.DATABASE_URL;let Y=c0("bun",["run","dev"],{cwd:i0,env:$,detached:!0,stdio:["ignore",Z,Z]});Y.unref();let J={pid:Y.pid??0,port:Q};return a0(RZ,JSON.stringify(J)),J}async function J1(){let Q=Z1(RZ);if(Q&&Q1(Q.pid)&&await gZ(`http://localhost:${Q.port}/api/workspace`))return Q.port;let Z=String(await PZ(Number(e0))),{port:$}=Y1(Z);return await $1(`http://localhost:${$}/api/workspace`),$}function V1(){try{return p0("git rev-parse --show-toplevel",{cwd:process.cwd(),stdio:["ignore","pipe","ignore"]}).toString().trim()}catch{return""}}function z1(Q){return o0("sha256").update(Q).digest("hex").slice(0,12)}async function q1(){if(process.stdin.isTTY)return null;let Q=[];for await(let $ of process.stdin)Q.push($);let Z=Buffer.concat(Q).toString("utf8").trim();if(!Z)return null;try{return JSON.parse(Z)}catch{return null}}function EQ(Q,Z){return vZ(Q,Z)}function ZQ(Q){return{hookSpecificOutput:{hookEventName:"PermissionRequest",decision:{behavior:"deny",message:Q}}}}function N(Q){process.stdout.write(JSON.stringify(Q)),process.exit(0)}(async()=>{await QZ();let Z=(await q1())?.tool_input?.plan;if(!Z||!Z.trim())N(EQ());let Y=`http://localhost:${await J1()}`,J=V1()||process.cwd(),V=z1(J);await fetch(`${Y}/api/workspace/activate?id=${V}`).catch(()=>{});let q=Z.split(`
|
|
261
271
|
`,1)[0]?.replace(/^#+\s*/,"").slice(0,160)||"Plan review",X=await fetch(`${Y}/api/plan`,{method:"POST",headers:{"content-type":"application/json","x-beacon-workspace":V},body:JSON.stringify({description:q,markdown:Z})});if(X.status===422){let H=await X.json().catch(()=>({}));N(ZQ(H.error??"Beacon rejected the plan: every roadmap feature needs a category and a priority. Add them and re-present."))}if(!X.ok)N(EQ());await FZ(Y,V);let z=Date.now()+yQ,W=(H)=>new Promise((YQ)=>setTimeout(YQ,H));while(Date.now()<z){await W(OQ);let H=await fetch(`${Y}/api/plan/verdict`,{headers:{"x-beacon-workspace":V}}).then((YQ)=>YQ.json()).catch(()=>null);if(!H)continue;if(H.kind==="approved")N(EQ(IQ().planApprovalMode,MZ(H.features)));if(H.kind==="discarded")N(ZQ("The user discarded the plan in Beacon. Ask what they want to adjust before re-presenting."));if(H.kind==="feedback")N(ZQ(`The user left feedback on the plan in Beacon (inline comments and/or edits on the /map and /db boards). Revise the plan based on the feedback below, then re-present (call ExitPlanMode again):
|
|
262
272
|
|
|
263
273
|
`+H.feedback))}N(ZQ("\u23F3 Still awaiting your review in Beacon \u2014 the plan is open on /plan and nothing was lost. "+"Claude Code caps a single plan-review hook at ~10 minutes, so to keep waiting you MUST call ExitPlanMode again now with the SAME plan. Re-presenting resumes the same review (your in-progress annotations and any decision are preserved). Do NOT implement, and do "+"NOT ask in the terminal \u2014 just re-present."))})();
|
package/dist/bin/prompt.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
import{execSync as X}from"child_process";import{existsSync as Y,readFileSync as Z}from"fs";import{join as $}from"path";function D(){process.exit(0)}function f(q){let G=q;try{G=X("git rev-parse --show-toplevel",{cwd:q,stdio:["ignore","pipe","ignore"]}).toString().trim()||q}catch{}for(let Q of new Set([G,q])){let H=$(Q,".mcp.json");try{if(Y(H)&&Z(H,"utf8").includes("beacon"))return!0}catch{}}return!1}var g=/@beacon:feature/i,j=/\b(feature|sub-?tasks?)\b/i,B=/\b(implement|build|add|create|design|develop|work on|wire up|ship|refactor)\b/i,J="";try{for await(let q of process.stdin)J+=q}catch{D()}var z="",P=process.cwd();try{let q=JSON.parse(J||"{}");if(typeof q.prompt==="string")z=q.prompt;if(typeof q.cwd==="string"&&q.cwd)P=q.cwd}catch{D()}var C=g.test(z)||j.test(z)&&B.test(z);if(!z||!C||!f(P))D();var I=["[Beacon] This looks like feature work. Follow Beacon's loop IN ORDER \u2014 do not start blind codebase searches:","1. Call beacon_context_for_feature({ id | title | query }) FIRST. It returns the attached files, 1-hop import blast radius, the domain's endpoints + tables + FK relations, sibling components, and conventions \u2014 and marks the feature active. That replaces the discovery phase.","2. Design data before code: if the feature needs tables that don't exist yet, call beacon_propose_plan (tables + relations + endpoints) and WAIT for approval on /plan before writing migrations or code.",
|
|
3
|
+
import{execSync as X}from"child_process";import{existsSync as Y,readFileSync as Z}from"fs";import{join as $}from"path";function D(){process.exit(0)}function f(q){let G=q;try{G=X("git rev-parse --show-toplevel",{cwd:q,stdio:["ignore","pipe","ignore"]}).toString().trim()||q}catch{}for(let Q of new Set([G,q])){let H=$(Q,".mcp.json");try{if(Y(H)&&Z(H,"utf8").includes("beacon"))return!0}catch{}}return!1}var g=/@beacon:feature/i,j=/\b(feature|sub-?tasks?)\b/i,B=/\b(implement|build|add|create|design|develop|work on|wire up|ship|refactor)\b/i,J="";try{for await(let q of process.stdin)J+=q}catch{D()}var z="",P=process.cwd();try{let q=JSON.parse(J||"{}");if(typeof q.prompt==="string")z=q.prompt;if(typeof q.cwd==="string"&&q.cwd)P=q.cwd}catch{D()}var C=g.test(z)||j.test(z)&&B.test(z);if(!z||!C||!f(P))D();var I=["[Beacon] This looks like feature work. Follow Beacon's loop IN ORDER \u2014 do not start blind codebase searches:","1. Call beacon_context_for_feature({ id | title | query }) FIRST. It returns the attached files, 1-hop import blast radius, the domain's endpoints + tables + FK relations, sibling components, and conventions \u2014 and marks the feature active. That replaces the discovery phase.","2. Design data before code: if the feature needs tables that don't exist yet, call beacon_propose_plan (tables + relations + endpoints) and WAIT for approval on /plan before writing migrations or code.",'3. When done, call beacon_feature({ action: "done" }) with the files you touched + a short markdown summary so the map and AGENTS.md stay accurate.'].join(`
|
|
4
4
|
`);process.stdout.write(JSON.stringify({hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:I}}));process.exit(0);
|
package/dist/bin/uninstall.js
CHANGED
|
@@ -71,7 +71,7 @@ Beacon was already initialized in this repo (\`/beacon-init\` ran at some point)
|
|
|
71
71
|
|
|
72
72
|
## What gets preserved vs replaced
|
|
73
73
|
|
|
74
|
-
The \`beacon_init_persist\` tool **replaces only init-derived nodes** (\`source=INIT\`). A curated architecture node (created by \`
|
|
74
|
+
The \`beacon_init_persist\` tool **replaces only init-derived nodes** (\`source=INIT\`). A curated architecture node (created by \`beacon_feature\` action:done or by hand) whose title matches a component in your refreshed analysis is **merged in place** \u2014 your fresh \`domain\`/\`role\`/\`plain\`/\`layer\`/\`files\` land on it, but it keeps its source, position, status, and bug flags, and no duplicate INIT node is created. Curated nodes your analysis does NOT mention survive untouched, as do hand-edited tables, custom positions, notes, and draft feature plans. So you can re-run this freely.
|
|
75
75
|
|
|
76
76
|
The one caveat: if the user manually edited an INIT-source node on the canvas (e.g., renamed it, rewrote its role), that edit IS overwritten when you re-persist \u2014 and a renamed node no longer title-matches, so it survives as its own card. If the user mentions hand-curated INIT nodes, ask whether they want those carried into the new analysis verbatim.
|
|
77
77
|
|
|
@@ -175,13 +175,23 @@ When listing endpoints, give each \`uses: [{ table, access }]\` so the endpoint\
|
|
|
175
175
|
|
|
176
176
|
EVERY feature MUST carry \`category\` (e.g. AUTH | SEARCH | DATA | INTEL | BILLING | \u2026; \`cluster\` is accepted as an alias) and \`priority\` (0 = P0 critical, 1 = P1 high, 2 = P2 medium, 3 = P3 low). Beacon REJECTS a plan whose features omit either \u2014 \`beacon_propose_plan\` returns the list of what's missing, and an ExitPlanMode \`\`\`beacon block is denied \u2014 so set both on every feature instead of relying on defaults.
|
|
177
177
|
|
|
178
|
-
When the workspace HAS A FRONTEND (Beacon knows \u2014 the agent set \`hasFrontend\` at init, or frontend files were detected), every feature must ALSO carry \`layer\`: \`"frontend" | "backend" | "fullstack"\` \u2014 which side of the stack the work lands on. Plans omitting it are REJECTED the same way category/priority are. It works on every surface that creates roadmap cards (\`beacon_propose_plan\`, the \`\`\`beacon block, \`
|
|
178
|
+
When the workspace HAS A FRONTEND (Beacon knows \u2014 the agent set \`hasFrontend\` at init, or frontend files were detected), every feature must ALSO carry \`layer\`: \`"frontend" | "backend" | "fullstack"\` \u2014 which side of the stack the work lands on. Plans omitting it are REJECTED the same way category/priority are. It works on every surface that creates roadmap cards (\`beacon_propose_plan\`, the \`\`\`beacon block, \`beacon_feature\` \u2014 sub-tasks default to the parent's layer) and on architecture components (\`beacon_feature\` action:done / \`beacon_init_persist\`). In a pure-backend repo, never set it \u2014 the boards don't show it there.
|
|
179
179
|
|
|
180
|
-
|
|
180
|
+
### Adding a card directly \u2014 \`beacon_feature\` (no review gate)
|
|
181
|
+
|
|
182
|
+
To put a card on the board WITHOUT the plan-review flow, call \`beacon_feature\` \u2014 ONE tool for a feature's whole lifecycle:
|
|
183
|
+
- \`{ action: "add" }\` creates a card in a SINGLE call. It defaults to \`status: "backlog"\` (a PENDING item you're NOT working on yet); pass \`status: "active"\` to start it IN_PROGRESS now. A title that matches an existing card returns \`exists\` (reuse it) \u2014 \`add\` never activates or demotes a card already on the board.
|
|
184
|
+
- \`{ action: "start" }\` marks an existing card IN_PROGRESS (create-or-flag).
|
|
185
|
+
- \`{ action: "subtasks" }\` adds child tasks under a card.
|
|
186
|
+
- \`{ action: "done" }\` completes feature(s) and registers the files/architecture touched.
|
|
187
|
+
|
|
188
|
+
A NEW card REQUIRES \`category\` + \`priority\` (and \`layer\` where the workspace has a frontend). Use \`beacon_propose_plan\` / \`beacon_present_plan\` only when you want the user to REVIEW before the card lands.
|
|
189
|
+
|
|
190
|
+
REUSE before you create. Call \`beacon_map\` FIRST \u2014 it lists every card with its \`category\`, \`priority\`, \`layer\` and \`status\`, so you reuse an existing category (don't invent a near-synonym) and spot duplicates WITHOUT calling \`beacon_entities\`. Beacon HARD-BLOCKS a feature that duplicates an existing one (it returns the existing feature to use instead) and one created without a category. \`category\` is the ONLY domain field. \`front\` (in \`beacon_feature\`) nests a card UNDER an existing parent feature \u2014 it is NOT a domain tag; a \`front\` that matches no real feature is rejected.
|
|
181
191
|
|
|
182
192
|
When listing features, give each \`dependsOn: ["Other feature title", \u2026]\` for any feature that must ship after another in the same plan. Beacon draws these as "depends on" links so the roadmap shows the dependency chain instead of loose, disconnected cards.
|
|
183
193
|
|
|
184
|
-
A roadmap item that is a BUG to fix (not a feature to build) should carry \`kind: "BUG"\` \u2014 it renders as a typed bug card. This works everywhere roadmap cards are created: \`beacon_propose_plan\` features, the \`\`\`beacon block, \`
|
|
194
|
+
A roadmap item that is a BUG to fix (not a feature to build) should carry \`kind: "BUG"\` \u2014 it renders as a typed bug card. This works everywhere roadmap cards are created: \`beacon_propose_plan\` features, the \`\`\`beacon block, \`beacon_feature\` (add/start when the user is working on a bug; or \`subtasks\` items for a bug discovered mid-work), and \`beacon_init_persist\` roadmap items. Default is FEATURE.
|
|
185
195
|
|
|
186
196
|
### 2b. Presenting a plan in plan mode (ExitPlanMode)
|
|
187
197
|
|
|
@@ -199,11 +209,11 @@ Beacon extracts it deterministically and **strips the block from the prose** (it
|
|
|
199
209
|
|
|
200
210
|
### 3. At the end, register the work \u2014 in ONE call
|
|
201
211
|
|
|
202
|
-
Call \`
|
|
212
|
+
Call \`beacon_feature({ action: "done" })\` **ONCE** with a \`features\` array \u2014 one entry per feature the plan created \u2014 each with the files you touched and a short markdown description. This flips each one to **Done** \u2014 including its sub-tasks (the cascade completes every PENDING/IN_PROGRESS child; a sub-task you did NOT finish must be set BLOCKED or CANCELLED before registering, so it survives visibly) \u2014 and keeps \`beacon_context_for_feature\` accurate for the next session.
|
|
203
213
|
|
|
204
214
|
Key each entry by its node \`id\`: the ids are handed back to you when the plan is approved (in the approval message / additionalContext), so you don't fuzzy-match titles or pay a disambiguation round-trip. If you don't have an id, \`title\` still works.
|
|
205
215
|
|
|
206
|
-
Register them all in that single batched call. If a plan added five features, that's ONE \`
|
|
216
|
+
Register them all in that single batched call. If a plan added five features, that's ONE \`beacon_feature({ action: "done" })\` call with five entries \u2014 NOT five calls, and NOT just an umbrella ("Harden auth"), which leaves the individual features stuck on **Pending**.
|
|
207
217
|
|
|
208
218
|
If the feature added or materially changed a REAL architectural component (a subsystem \u2014 NOT a file), also pass \`architecture: [{ title, domain, role, \u2026 }]\` so the Architecture map stays accurate. It upserts curated components by title; never list files as components. If you found a bug or something worth investigating in a component's code, add \`bugs: [{ note }]\` to its architecture entry \u2014 it renders as a bug flag on the node (attributed to the agent); identical open flags are not duplicated. Only flag what you actually saw in the code.
|
|
209
219
|
|
package/dist/lib/assets.js
CHANGED
|
@@ -70,7 +70,7 @@ Beacon was already initialized in this repo (\`/beacon-init\` ran at some point)
|
|
|
70
70
|
|
|
71
71
|
## What gets preserved vs replaced
|
|
72
72
|
|
|
73
|
-
The \`beacon_init_persist\` tool **replaces only init-derived nodes** (\`source=INIT\`). A curated architecture node (created by \`
|
|
73
|
+
The \`beacon_init_persist\` tool **replaces only init-derived nodes** (\`source=INIT\`). A curated architecture node (created by \`beacon_feature\` action:done or by hand) whose title matches a component in your refreshed analysis is **merged in place** \u2014 your fresh \`domain\`/\`role\`/\`plain\`/\`layer\`/\`files\` land on it, but it keeps its source, position, status, and bug flags, and no duplicate INIT node is created. Curated nodes your analysis does NOT mention survive untouched, as do hand-edited tables, custom positions, notes, and draft feature plans. So you can re-run this freely.
|
|
74
74
|
|
|
75
75
|
The one caveat: if the user manually edited an INIT-source node on the canvas (e.g., renamed it, rewrote its role), that edit IS overwritten when you re-persist \u2014 and a renamed node no longer title-matches, so it survives as its own card. If the user mentions hand-curated INIT nodes, ask whether they want those carried into the new analysis verbatim.
|
|
76
76
|
|
|
@@ -174,13 +174,23 @@ When listing endpoints, give each \`uses: [{ table, access }]\` so the endpoint\
|
|
|
174
174
|
|
|
175
175
|
EVERY feature MUST carry \`category\` (e.g. AUTH | SEARCH | DATA | INTEL | BILLING | \u2026; \`cluster\` is accepted as an alias) and \`priority\` (0 = P0 critical, 1 = P1 high, 2 = P2 medium, 3 = P3 low). Beacon REJECTS a plan whose features omit either \u2014 \`beacon_propose_plan\` returns the list of what's missing, and an ExitPlanMode \`\`\`beacon block is denied \u2014 so set both on every feature instead of relying on defaults.
|
|
176
176
|
|
|
177
|
-
When the workspace HAS A FRONTEND (Beacon knows \u2014 the agent set \`hasFrontend\` at init, or frontend files were detected), every feature must ALSO carry \`layer\`: \`"frontend" | "backend" | "fullstack"\` \u2014 which side of the stack the work lands on. Plans omitting it are REJECTED the same way category/priority are. It works on every surface that creates roadmap cards (\`beacon_propose_plan\`, the \`\`\`beacon block, \`
|
|
177
|
+
When the workspace HAS A FRONTEND (Beacon knows \u2014 the agent set \`hasFrontend\` at init, or frontend files were detected), every feature must ALSO carry \`layer\`: \`"frontend" | "backend" | "fullstack"\` \u2014 which side of the stack the work lands on. Plans omitting it are REJECTED the same way category/priority are. It works on every surface that creates roadmap cards (\`beacon_propose_plan\`, the \`\`\`beacon block, \`beacon_feature\` \u2014 sub-tasks default to the parent's layer) and on architecture components (\`beacon_feature\` action:done / \`beacon_init_persist\`). In a pure-backend repo, never set it \u2014 the boards don't show it there.
|
|
178
178
|
|
|
179
|
-
|
|
179
|
+
### Adding a card directly \u2014 \`beacon_feature\` (no review gate)
|
|
180
|
+
|
|
181
|
+
To put a card on the board WITHOUT the plan-review flow, call \`beacon_feature\` \u2014 ONE tool for a feature's whole lifecycle:
|
|
182
|
+
- \`{ action: "add" }\` creates a card in a SINGLE call. It defaults to \`status: "backlog"\` (a PENDING item you're NOT working on yet); pass \`status: "active"\` to start it IN_PROGRESS now. A title that matches an existing card returns \`exists\` (reuse it) \u2014 \`add\` never activates or demotes a card already on the board.
|
|
183
|
+
- \`{ action: "start" }\` marks an existing card IN_PROGRESS (create-or-flag).
|
|
184
|
+
- \`{ action: "subtasks" }\` adds child tasks under a card.
|
|
185
|
+
- \`{ action: "done" }\` completes feature(s) and registers the files/architecture touched.
|
|
186
|
+
|
|
187
|
+
A NEW card REQUIRES \`category\` + \`priority\` (and \`layer\` where the workspace has a frontend). Use \`beacon_propose_plan\` / \`beacon_present_plan\` only when you want the user to REVIEW before the card lands.
|
|
188
|
+
|
|
189
|
+
REUSE before you create. Call \`beacon_map\` FIRST \u2014 it lists every card with its \`category\`, \`priority\`, \`layer\` and \`status\`, so you reuse an existing category (don't invent a near-synonym) and spot duplicates WITHOUT calling \`beacon_entities\`. Beacon HARD-BLOCKS a feature that duplicates an existing one (it returns the existing feature to use instead) and one created without a category. \`category\` is the ONLY domain field. \`front\` (in \`beacon_feature\`) nests a card UNDER an existing parent feature \u2014 it is NOT a domain tag; a \`front\` that matches no real feature is rejected.
|
|
180
190
|
|
|
181
191
|
When listing features, give each \`dependsOn: ["Other feature title", \u2026]\` for any feature that must ship after another in the same plan. Beacon draws these as "depends on" links so the roadmap shows the dependency chain instead of loose, disconnected cards.
|
|
182
192
|
|
|
183
|
-
A roadmap item that is a BUG to fix (not a feature to build) should carry \`kind: "BUG"\` \u2014 it renders as a typed bug card. This works everywhere roadmap cards are created: \`beacon_propose_plan\` features, the \`\`\`beacon block, \`
|
|
193
|
+
A roadmap item that is a BUG to fix (not a feature to build) should carry \`kind: "BUG"\` \u2014 it renders as a typed bug card. This works everywhere roadmap cards are created: \`beacon_propose_plan\` features, the \`\`\`beacon block, \`beacon_feature\` (add/start when the user is working on a bug; or \`subtasks\` items for a bug discovered mid-work), and \`beacon_init_persist\` roadmap items. Default is FEATURE.
|
|
184
194
|
|
|
185
195
|
### 2b. Presenting a plan in plan mode (ExitPlanMode)
|
|
186
196
|
|
|
@@ -198,11 +208,11 @@ Beacon extracts it deterministically and **strips the block from the prose** (it
|
|
|
198
208
|
|
|
199
209
|
### 3. At the end, register the work \u2014 in ONE call
|
|
200
210
|
|
|
201
|
-
Call \`
|
|
211
|
+
Call \`beacon_feature({ action: "done" })\` **ONCE** with a \`features\` array \u2014 one entry per feature the plan created \u2014 each with the files you touched and a short markdown description. This flips each one to **Done** \u2014 including its sub-tasks (the cascade completes every PENDING/IN_PROGRESS child; a sub-task you did NOT finish must be set BLOCKED or CANCELLED before registering, so it survives visibly) \u2014 and keeps \`beacon_context_for_feature\` accurate for the next session.
|
|
202
212
|
|
|
203
213
|
Key each entry by its node \`id\`: the ids are handed back to you when the plan is approved (in the approval message / additionalContext), so you don't fuzzy-match titles or pay a disambiguation round-trip. If you don't have an id, \`title\` still works.
|
|
204
214
|
|
|
205
|
-
Register them all in that single batched call. If a plan added five features, that's ONE \`
|
|
215
|
+
Register them all in that single batched call. If a plan added five features, that's ONE \`beacon_feature({ action: "done" })\` call with five entries \u2014 NOT five calls, and NOT just an umbrella ("Harden auth"), which leaves the individual features stuck on **Pending**.
|
|
206
216
|
|
|
207
217
|
If the feature added or materially changed a REAL architectural component (a subsystem \u2014 NOT a file), also pass \`architecture: [{ title, domain, role, \u2026 }]\` so the Architecture map stays accurate. It upserts curated components by title; never list files as components. If you found a bug or something worth investigating in a component's code, add \`bugs: [{ note }]\` to its architecture entry \u2014 it renders as a bug flag on the node (attributed to the agent); identical open flags are not duplicated. Only flag what you actually saw in the code.
|
|
208
218
|
|
|
@@ -70,7 +70,7 @@ Beacon was already initialized in this repo (\`/beacon-init\` ran at some point)
|
|
|
70
70
|
|
|
71
71
|
## What gets preserved vs replaced
|
|
72
72
|
|
|
73
|
-
The \`beacon_init_persist\` tool **replaces only init-derived nodes** (\`source=INIT\`). A curated architecture node (created by \`
|
|
73
|
+
The \`beacon_init_persist\` tool **replaces only init-derived nodes** (\`source=INIT\`). A curated architecture node (created by \`beacon_feature\` action:done or by hand) whose title matches a component in your refreshed analysis is **merged in place** \u2014 your fresh \`domain\`/\`role\`/\`plain\`/\`layer\`/\`files\` land on it, but it keeps its source, position, status, and bug flags, and no duplicate INIT node is created. Curated nodes your analysis does NOT mention survive untouched, as do hand-edited tables, custom positions, notes, and draft feature plans. So you can re-run this freely.
|
|
74
74
|
|
|
75
75
|
The one caveat: if the user manually edited an INIT-source node on the canvas (e.g., renamed it, rewrote its role), that edit IS overwritten when you re-persist \u2014 and a renamed node no longer title-matches, so it survives as its own card. If the user mentions hand-curated INIT nodes, ask whether they want those carried into the new analysis verbatim.
|
|
76
76
|
|
|
@@ -174,13 +174,23 @@ When listing endpoints, give each \`uses: [{ table, access }]\` so the endpoint\
|
|
|
174
174
|
|
|
175
175
|
EVERY feature MUST carry \`category\` (e.g. AUTH | SEARCH | DATA | INTEL | BILLING | \u2026; \`cluster\` is accepted as an alias) and \`priority\` (0 = P0 critical, 1 = P1 high, 2 = P2 medium, 3 = P3 low). Beacon REJECTS a plan whose features omit either \u2014 \`beacon_propose_plan\` returns the list of what's missing, and an ExitPlanMode \`\`\`beacon block is denied \u2014 so set both on every feature instead of relying on defaults.
|
|
176
176
|
|
|
177
|
-
When the workspace HAS A FRONTEND (Beacon knows \u2014 the agent set \`hasFrontend\` at init, or frontend files were detected), every feature must ALSO carry \`layer\`: \`"frontend" | "backend" | "fullstack"\` \u2014 which side of the stack the work lands on. Plans omitting it are REJECTED the same way category/priority are. It works on every surface that creates roadmap cards (\`beacon_propose_plan\`, the \`\`\`beacon block, \`
|
|
177
|
+
When the workspace HAS A FRONTEND (Beacon knows \u2014 the agent set \`hasFrontend\` at init, or frontend files were detected), every feature must ALSO carry \`layer\`: \`"frontend" | "backend" | "fullstack"\` \u2014 which side of the stack the work lands on. Plans omitting it are REJECTED the same way category/priority are. It works on every surface that creates roadmap cards (\`beacon_propose_plan\`, the \`\`\`beacon block, \`beacon_feature\` \u2014 sub-tasks default to the parent's layer) and on architecture components (\`beacon_feature\` action:done / \`beacon_init_persist\`). In a pure-backend repo, never set it \u2014 the boards don't show it there.
|
|
178
178
|
|
|
179
|
-
|
|
179
|
+
### Adding a card directly \u2014 \`beacon_feature\` (no review gate)
|
|
180
|
+
|
|
181
|
+
To put a card on the board WITHOUT the plan-review flow, call \`beacon_feature\` \u2014 ONE tool for a feature's whole lifecycle:
|
|
182
|
+
- \`{ action: "add" }\` creates a card in a SINGLE call. It defaults to \`status: "backlog"\` (a PENDING item you're NOT working on yet); pass \`status: "active"\` to start it IN_PROGRESS now. A title that matches an existing card returns \`exists\` (reuse it) \u2014 \`add\` never activates or demotes a card already on the board.
|
|
183
|
+
- \`{ action: "start" }\` marks an existing card IN_PROGRESS (create-or-flag).
|
|
184
|
+
- \`{ action: "subtasks" }\` adds child tasks under a card.
|
|
185
|
+
- \`{ action: "done" }\` completes feature(s) and registers the files/architecture touched.
|
|
186
|
+
|
|
187
|
+
A NEW card REQUIRES \`category\` + \`priority\` (and \`layer\` where the workspace has a frontend). Use \`beacon_propose_plan\` / \`beacon_present_plan\` only when you want the user to REVIEW before the card lands.
|
|
188
|
+
|
|
189
|
+
REUSE before you create. Call \`beacon_map\` FIRST \u2014 it lists every card with its \`category\`, \`priority\`, \`layer\` and \`status\`, so you reuse an existing category (don't invent a near-synonym) and spot duplicates WITHOUT calling \`beacon_entities\`. Beacon HARD-BLOCKS a feature that duplicates an existing one (it returns the existing feature to use instead) and one created without a category. \`category\` is the ONLY domain field. \`front\` (in \`beacon_feature\`) nests a card UNDER an existing parent feature \u2014 it is NOT a domain tag; a \`front\` that matches no real feature is rejected.
|
|
180
190
|
|
|
181
191
|
When listing features, give each \`dependsOn: ["Other feature title", \u2026]\` for any feature that must ship after another in the same plan. Beacon draws these as "depends on" links so the roadmap shows the dependency chain instead of loose, disconnected cards.
|
|
182
192
|
|
|
183
|
-
A roadmap item that is a BUG to fix (not a feature to build) should carry \`kind: "BUG"\` \u2014 it renders as a typed bug card. This works everywhere roadmap cards are created: \`beacon_propose_plan\` features, the \`\`\`beacon block, \`
|
|
193
|
+
A roadmap item that is a BUG to fix (not a feature to build) should carry \`kind: "BUG"\` \u2014 it renders as a typed bug card. This works everywhere roadmap cards are created: \`beacon_propose_plan\` features, the \`\`\`beacon block, \`beacon_feature\` (add/start when the user is working on a bug; or \`subtasks\` items for a bug discovered mid-work), and \`beacon_init_persist\` roadmap items. Default is FEATURE.
|
|
184
194
|
|
|
185
195
|
### 2b. Presenting a plan in plan mode (ExitPlanMode)
|
|
186
196
|
|
|
@@ -198,11 +208,11 @@ Beacon extracts it deterministically and **strips the block from the prose** (it
|
|
|
198
208
|
|
|
199
209
|
### 3. At the end, register the work \u2014 in ONE call
|
|
200
210
|
|
|
201
|
-
Call \`
|
|
211
|
+
Call \`beacon_feature({ action: "done" })\` **ONCE** with a \`features\` array \u2014 one entry per feature the plan created \u2014 each with the files you touched and a short markdown description. This flips each one to **Done** \u2014 including its sub-tasks (the cascade completes every PENDING/IN_PROGRESS child; a sub-task you did NOT finish must be set BLOCKED or CANCELLED before registering, so it survives visibly) \u2014 and keeps \`beacon_context_for_feature\` accurate for the next session.
|
|
202
212
|
|
|
203
213
|
Key each entry by its node \`id\`: the ids are handed back to you when the plan is approved (in the approval message / additionalContext), so you don't fuzzy-match titles or pay a disambiguation round-trip. If you don't have an id, \`title\` still works.
|
|
204
214
|
|
|
205
|
-
Register them all in that single batched call. If a plan added five features, that's ONE \`
|
|
215
|
+
Register them all in that single batched call. If a plan added five features, that's ONE \`beacon_feature({ action: "done" })\` call with five entries \u2014 NOT five calls, and NOT just an umbrella ("Harden auth"), which leaves the individual features stuck on **Pending**.
|
|
206
216
|
|
|
207
217
|
If the feature added or materially changed a REAL architectural component (a subsystem \u2014 NOT a file), also pass \`architecture: [{ title, domain, role, \u2026 }]\` so the Architecture map stays accurate. It upserts curated components by title; never list files as components. If you found a bug or something worth investigating in a component's code, add \`bugs: [{ note }]\` to its architecture entry \u2014 it renders as a bug flag on the node (attributed to the agent); identical open flags are not duplicated. Only flag what you actually saw in the code.
|
|
208
218
|
|
|
@@ -70,7 +70,7 @@ Beacon was already initialized in this repo (\`/beacon-init\` ran at some point)
|
|
|
70
70
|
|
|
71
71
|
## What gets preserved vs replaced
|
|
72
72
|
|
|
73
|
-
The \`beacon_init_persist\` tool **replaces only init-derived nodes** (\`source=INIT\`). A curated architecture node (created by \`
|
|
73
|
+
The \`beacon_init_persist\` tool **replaces only init-derived nodes** (\`source=INIT\`). A curated architecture node (created by \`beacon_feature\` action:done or by hand) whose title matches a component in your refreshed analysis is **merged in place** \u2014 your fresh \`domain\`/\`role\`/\`plain\`/\`layer\`/\`files\` land on it, but it keeps its source, position, status, and bug flags, and no duplicate INIT node is created. Curated nodes your analysis does NOT mention survive untouched, as do hand-edited tables, custom positions, notes, and draft feature plans. So you can re-run this freely.
|
|
74
74
|
|
|
75
75
|
The one caveat: if the user manually edited an INIT-source node on the canvas (e.g., renamed it, rewrote its role), that edit IS overwritten when you re-persist \u2014 and a renamed node no longer title-matches, so it survives as its own card. If the user mentions hand-curated INIT nodes, ask whether they want those carried into the new analysis verbatim.
|
|
76
76
|
|
|
@@ -174,13 +174,23 @@ When listing endpoints, give each \`uses: [{ table, access }]\` so the endpoint\
|
|
|
174
174
|
|
|
175
175
|
EVERY feature MUST carry \`category\` (e.g. AUTH | SEARCH | DATA | INTEL | BILLING | \u2026; \`cluster\` is accepted as an alias) and \`priority\` (0 = P0 critical, 1 = P1 high, 2 = P2 medium, 3 = P3 low). Beacon REJECTS a plan whose features omit either \u2014 \`beacon_propose_plan\` returns the list of what's missing, and an ExitPlanMode \`\`\`beacon block is denied \u2014 so set both on every feature instead of relying on defaults.
|
|
176
176
|
|
|
177
|
-
When the workspace HAS A FRONTEND (Beacon knows \u2014 the agent set \`hasFrontend\` at init, or frontend files were detected), every feature must ALSO carry \`layer\`: \`"frontend" | "backend" | "fullstack"\` \u2014 which side of the stack the work lands on. Plans omitting it are REJECTED the same way category/priority are. It works on every surface that creates roadmap cards (\`beacon_propose_plan\`, the \`\`\`beacon block, \`
|
|
177
|
+
When the workspace HAS A FRONTEND (Beacon knows \u2014 the agent set \`hasFrontend\` at init, or frontend files were detected), every feature must ALSO carry \`layer\`: \`"frontend" | "backend" | "fullstack"\` \u2014 which side of the stack the work lands on. Plans omitting it are REJECTED the same way category/priority are. It works on every surface that creates roadmap cards (\`beacon_propose_plan\`, the \`\`\`beacon block, \`beacon_feature\` \u2014 sub-tasks default to the parent's layer) and on architecture components (\`beacon_feature\` action:done / \`beacon_init_persist\`). In a pure-backend repo, never set it \u2014 the boards don't show it there.
|
|
178
178
|
|
|
179
|
-
|
|
179
|
+
### Adding a card directly \u2014 \`beacon_feature\` (no review gate)
|
|
180
|
+
|
|
181
|
+
To put a card on the board WITHOUT the plan-review flow, call \`beacon_feature\` \u2014 ONE tool for a feature's whole lifecycle:
|
|
182
|
+
- \`{ action: "add" }\` creates a card in a SINGLE call. It defaults to \`status: "backlog"\` (a PENDING item you're NOT working on yet); pass \`status: "active"\` to start it IN_PROGRESS now. A title that matches an existing card returns \`exists\` (reuse it) \u2014 \`add\` never activates or demotes a card already on the board.
|
|
183
|
+
- \`{ action: "start" }\` marks an existing card IN_PROGRESS (create-or-flag).
|
|
184
|
+
- \`{ action: "subtasks" }\` adds child tasks under a card.
|
|
185
|
+
- \`{ action: "done" }\` completes feature(s) and registers the files/architecture touched.
|
|
186
|
+
|
|
187
|
+
A NEW card REQUIRES \`category\` + \`priority\` (and \`layer\` where the workspace has a frontend). Use \`beacon_propose_plan\` / \`beacon_present_plan\` only when you want the user to REVIEW before the card lands.
|
|
188
|
+
|
|
189
|
+
REUSE before you create. Call \`beacon_map\` FIRST \u2014 it lists every card with its \`category\`, \`priority\`, \`layer\` and \`status\`, so you reuse an existing category (don't invent a near-synonym) and spot duplicates WITHOUT calling \`beacon_entities\`. Beacon HARD-BLOCKS a feature that duplicates an existing one (it returns the existing feature to use instead) and one created without a category. \`category\` is the ONLY domain field. \`front\` (in \`beacon_feature\`) nests a card UNDER an existing parent feature \u2014 it is NOT a domain tag; a \`front\` that matches no real feature is rejected.
|
|
180
190
|
|
|
181
191
|
When listing features, give each \`dependsOn: ["Other feature title", \u2026]\` for any feature that must ship after another in the same plan. Beacon draws these as "depends on" links so the roadmap shows the dependency chain instead of loose, disconnected cards.
|
|
182
192
|
|
|
183
|
-
A roadmap item that is a BUG to fix (not a feature to build) should carry \`kind: "BUG"\` \u2014 it renders as a typed bug card. This works everywhere roadmap cards are created: \`beacon_propose_plan\` features, the \`\`\`beacon block, \`
|
|
193
|
+
A roadmap item that is a BUG to fix (not a feature to build) should carry \`kind: "BUG"\` \u2014 it renders as a typed bug card. This works everywhere roadmap cards are created: \`beacon_propose_plan\` features, the \`\`\`beacon block, \`beacon_feature\` (add/start when the user is working on a bug; or \`subtasks\` items for a bug discovered mid-work), and \`beacon_init_persist\` roadmap items. Default is FEATURE.
|
|
184
194
|
|
|
185
195
|
### 2b. Presenting a plan in plan mode (ExitPlanMode)
|
|
186
196
|
|
|
@@ -198,11 +208,11 @@ Beacon extracts it deterministically and **strips the block from the prose** (it
|
|
|
198
208
|
|
|
199
209
|
### 3. At the end, register the work \u2014 in ONE call
|
|
200
210
|
|
|
201
|
-
Call \`
|
|
211
|
+
Call \`beacon_feature({ action: "done" })\` **ONCE** with a \`features\` array \u2014 one entry per feature the plan created \u2014 each with the files you touched and a short markdown description. This flips each one to **Done** \u2014 including its sub-tasks (the cascade completes every PENDING/IN_PROGRESS child; a sub-task you did NOT finish must be set BLOCKED or CANCELLED before registering, so it survives visibly) \u2014 and keeps \`beacon_context_for_feature\` accurate for the next session.
|
|
202
212
|
|
|
203
213
|
Key each entry by its node \`id\`: the ids are handed back to you when the plan is approved (in the approval message / additionalContext), so you don't fuzzy-match titles or pay a disambiguation round-trip. If you don't have an id, \`title\` still works.
|
|
204
214
|
|
|
205
|
-
Register them all in that single batched call. If a plan added five features, that's ONE \`
|
|
215
|
+
Register them all in that single batched call. If a plan added five features, that's ONE \`beacon_feature({ action: "done" })\` call with five entries \u2014 NOT five calls, and NOT just an umbrella ("Harden auth"), which leaves the individual features stuck on **Pending**.
|
|
206
216
|
|
|
207
217
|
If the feature added or materially changed a REAL architectural component (a subsystem \u2014 NOT a file), also pass \`architecture: [{ title, domain, role, \u2026 }]\` so the Architecture map stays accurate. It upserts curated components by title; never list files as components. If you found a bug or something worth investigating in a component's code, add \`bugs: [{ note }]\` to its architecture entry \u2014 it renders as a bug flag on the node (attributed to the agent); identical open flags are not duplicated. Only flag what you actually saw in the code.
|
|
208
218
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "trybeacon",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.51",
|
|
4
4
|
"description": "The visual planning surface for the coding agent in your terminal.",
|
|
5
5
|
"homepage": "https://trybeacon.sh",
|
|
6
6
|
"bin": {
|
|
@@ -42,11 +42,14 @@
|
|
|
42
42
|
"@radix-ui/react-tooltip": "^1.2.8",
|
|
43
43
|
"@tiptap/core": "^3.26.0",
|
|
44
44
|
"@tiptap/extension-list": "^3.26.0",
|
|
45
|
+
"@tiptap/extension-mention": "^3.26.0",
|
|
45
46
|
"@tiptap/extension-underline": "^3.26.0",
|
|
47
|
+
"@tiptap/extensions": "^3.26.0",
|
|
46
48
|
"@tiptap/markdown": "^3.26.0",
|
|
47
49
|
"@tiptap/pm": "^3.26.0",
|
|
48
50
|
"@tiptap/react": "^3.26.0",
|
|
49
51
|
"@tiptap/starter-kit": "^3.26.0",
|
|
52
|
+
"@tiptap/suggestion": "^3.26.0",
|
|
50
53
|
"@types/d3-force": "^3.0.10",
|
|
51
54
|
"@xyflow/react": "^12.11.0",
|
|
52
55
|
"chokidar": "^5.0.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=1341,exports.ids=[1341],exports.modules={31059:(a,b,c)=>{c.d(b,{ie:()=>f});var d=c(37096),e=c(71484);function f(...a){return a[0].columns?new g(a[0].columns,a[0].name):new g(a)}class g{static [d.i]="SQLitePrimaryKeyBuilder";columns;name;constructor(a,b){this.columns=a,this.name=b}build(a){return new h(a,this.columns,this.name)}}class h{constructor(a,b,c){this.table=a,this.columns=b,this.name=c}static [d.i]="SQLitePrimaryKey";columns;name;getName(){return this.name??`${this.table[e.jo.Symbol.Name]}_${this.columns.map(a=>a.name).join("_")}_pk`}}},32753:(a,b,c)=>{c.d(b,{EC:()=>h,jR:()=>f});let d=["frontend","backend","fullstack"],e={fe:"frontend",front:"frontend",be:"backend",back:"backend",fs:"fullstack","full-stack":"fullstack","full stack":"fullstack"};function f(a){let b=(a??"").trim().toLowerCase();return b?d.includes(b)?b:e[b]??null:null}let g=/\.(tsx|jsx|vue|svelte)$/i;function h(a){return a.some(a=>g.test(a))}},72595:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Wg:()=>k,hA:()=>i,jZ:()=>l,zr:()=>j});var e=c(56727),f=c(30046),g=c(32753),h=a([e]);async function i(a=e.db){let[b]=await a.insert(f.projectMeta).values({id:"singleton"}).onConflictDoUpdate({target:f.projectMeta.id,set:{id:"singleton"}}).returning();return b}async function j(a,b=e.db){let c={};null!=a.overview&&(c.overview=a.overview),a.conventions&&(c.conventions=JSON.stringify(a.conventions)),void 0!==a.hasFrontend&&(c.hasFrontend=a.hasFrontend),a.classificationRoots&&(c.classificationRoots=JSON.stringify(a.classificationRoots)),0===Object.keys(c).length&&(c.id="singleton");let[d]=await b.insert(f.projectMeta).values({id:"singleton",overview:a.overview??null,conventions:JSON.stringify(a.conventions??[]),hasFrontend:a.hasFrontend??null,classificationRoots:JSON.stringify(a.classificationRoots??[])}).onConflictDoUpdate({target:f.projectMeta.id,set:c}).returning();return d}async function k(a=e.db){let b=await i(a);try{let a=JSON.parse(b.classificationRoots??"[]");return Array.isArray(a)?a.filter(a=>"string"==typeof a):[]}catch{return[]}}async function l(a=e.db){let b=await i(a);if(null!=b.hasFrontend)return b.hasFrontend;let c=await a.select({path:f.codeFile.path}).from(f.codeFile);return(0,g.EC)(c.map(a=>a.path))}e=(h.then?(await h)():h)[0],d()}catch(a){d(a)}})},72967:(a,b,c)=>{c.d(b,{to:()=>e});var d=c(47782);function e(a,b,c={}){if(0===a.length)return new Map;let f=function(a,b){let c=a.map(a=>a.id).sort(),d=new Map(c.map(a=>[a,[]]));for(let a of[...b].sort((a,b)=>a.fromId.localeCompare(b.fromId)||a.toId.localeCompare(b.toId)))d.get(a.fromId)?.push(a);let e=new Map,f=[],g=a=>{for(let b of(e.set(a,"visiting"),d.get(a)??[])){let a=e.get(b.toId);"visiting"!==a&&(f.push(b),"done"!==a&&g(b.toId))}e.set(a,"done")};for(let a of c)e.has(a)||g(a);return f}(a,b),g=function(a,b){let c=new Map(a.map(a=>[a.id,[]]));for(let a of b)c.get(a.fromId)?.push(a.toId);let d=new Map,e=a=>{let b=d.get(a);if(void 0!==b)return b;d.set(a,0);let f=c.get(a)??[],g=f.length?1+Math.max(...f.map(e)):0;return d.set(a,g),g};for(let b of a)e(b.id);return d}(a,f),h=new Map(a.map(a=>[a.id,[]]));for(let a of f)h.get(a.fromId)?.push(a.toId);let i=Array.from(new Set(a.map(a=>a.group))),j=i.filter(a=>"—"!==a).sort(),k=i.includes("—")?[...j,"—"]:j,l=[];for(let b of k){let c=a.filter(a=>a.group===b),d=Math.min(...c.map(a=>g.get(a.id)??0)),e=Math.max(...c.map(a=>g.get(a.id)??0)),f=new Map,i=new Map,j=0,k=1;for(let a=d;a<=e;a++){let b=c.filter(b=>g.get(b.id)===a);if(!b.length)continue;let d=a=>{let b=(h.get(a.id)??[]).map(a=>i.get(a)).filter(a=>void 0!==a);return b.length?b.reduce((a,b)=>a+b,0)/b.length:1/0};b.sort((a,b)=>d(a)-d(b)||a.id.localeCompare(b.id));let e=Math.max(1,Math.ceil(Math.sqrt(2*b.length)));b.forEach((a,b)=>{let c=Math.floor(b/e),d=b%e;i.set(a.id,d),f.set(a.id,{x:j+360*c,y:150*d}),k=Math.max(k,d+1)}),j+=360*Math.ceil(b.length/e)}l.push({d:b,w:j,h:150*k,local:f})}let m=(0,d.Xi)(l.map(a=>({id:a.d,w:a.w,h:a.h})),{gapX:84,gapY:80,viewportAspect:c.viewportAspect,minBandW:1080,aspectSlack:1.5}),n=new Map;for(let a of l){let b=m.get(a.d);for(let[c,d]of a.local)n.set(c,{x:b.x+d.x,y:b.y+d.y})}return n}},76968:(a,b,c)=>{c.d(b,{GL:()=>i,Pe:()=>h});var d=c(37096);class e{constructor(a,b){this.name=a,this.unique=b}static [d.i]="SQLiteIndexBuilderOn";on(...a){return new f(this.name,a,this.unique)}}class f{static [d.i]="SQLiteIndexBuilder";config;constructor(a,b,c){this.config={name:a,columns:b,unique:c,where:void 0}}where(a){return this.config.where=a,this}build(a){return new g(this.config,a)}}class g{static [d.i]="SQLiteIndex";config;constructor(a,b){this.config={...a,table:b}}}function h(a){return new e(a,!1)}function i(a){return new e(a,!0)}},93118:(a,b,c)=>{c.d(b,{VI:()=>f});let d=["IN_PROGRESS","PENDING","BLOCKED","DONE","DEPRIORITIZED","CANCELLED"];var e=c(47782);function f(a,b,c={}){let g=c.colW??320,h=c.rowH??150,i=c.childIndent??24,j=c.laneGap??56,k=c.bandGap??110,l=c.maxCols??10,m=c.minBandW??3*g,n=new Set(a.map(a=>a.id)),o=a=>!a.parentId||!n.has(a.parentId),p=a.filter(o),q=new Map;for(let b of a){if(o(b))continue;let a=q.get(b.parentId);a?a.push(b):q.set(b.parentId,[b])}let r="status"===b?a=>a.status:"priority"===b?a=>String(a.priority):a=>(a.cluster??"").trim()||"—",s=new Map;for(let a of p){let b=r(a),c=s.get(b);c?c.push(a):s.set(b,[a])}let t=(function(a,b,c){if("status"===a)return[...d];if("priority"===a)return["0","1","2","3"];let e=Array.from(new Set(b.map(c))),f=e.filter(a=>"—"!==a).sort();return e.includes("—")?[...f,"—"]:f})(b,p,r).filter(a=>s.has(a)),u=[];for(let a of t){let b=s.get(a),c=b.reduce((a,b)=>a+1+(q.get(b.id)?.length??0),0),d=Math.max(1,Math.min(l,b.length,Math.round(Math.sqrt(.85*c))||1)),e=Array(d).fill(0),f=new Map;for(let a of b){let b=0;for(let a=1;a<d;a++)e[a]<e[b]&&(b=a);let c=b*g,j=e[b]*h;f.set(a.id,{x:c,y:j});let k=q.get(a.id)??[];k.forEach((a,b)=>{f.set(a.id,{x:c+i,y:j+(b+1)*h})}),e[b]+=1+k.length}let j=e.reduce((a,b)=>Math.max(a,b),0);u.push({id:a,w:d*g,h:j*h,local:f})}let v=(0,e.Xi)(u.map(a=>({id:a.id,w:a.w,h:a.h})),{gapX:j,gapY:k,viewportAspect:c.viewportAspect,minBandW:m,aspectSlack:1.5}),w=new Map;for(let a of u){let b=v.get(a.id);for(let[c,d]of a.local)w.set(c,{x:b.x+d.x,y:b.y+d.y})}return w}}};
|