vibedoc 1.7.0 → 1.8.0
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 +9 -0
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +42 -14
- package/.next/routes-manifest.json +54 -0
- package/.next/server/app/(app)/activity/page.js.nft.json +1 -1
- package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/board/page.js.nft.json +1 -1
- package/.next/server/app/(app)/board/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/chat/page.js.nft.json +1 -1
- package/.next/server/app/(app)/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/docs/page.js.nft.json +1 -1
- package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/explorer/page.js.nft.json +1 -1
- package/.next/server/app/(app)/explorer/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/manual-tests/page/app-paths-manifest.json +3 -0
- package/.next/server/app/(app)/manual-tests/page/build-manifest.json +20 -0
- package/.next/server/app/(app)/manual-tests/page/next-font-manifest.json +11 -0
- package/.next/server/app/(app)/manual-tests/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/(app)/manual-tests/page/server-reference-manifest.json +4 -0
- package/.next/server/app/(app)/manual-tests/page.js +15 -0
- package/.next/server/app/(app)/manual-tests/page.js.map +5 -0
- package/.next/server/app/(app)/manual-tests/page.js.nft.json +1 -0
- package/.next/server/app/(app)/manual-tests/page_client-reference-manifest.js +3 -0
- package/.next/server/app/(app)/memory/page.js.nft.json +1 -1
- package/.next/server/app/(app)/memory/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/roadmap/page.js.nft.json +1 -1
- package/.next/server/app/(app)/roadmap/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/settings/page.js.nft.json +1 -1
- package/.next/server/app/(app)/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/setup/page.js.nft.json +1 -1
- package/.next/server/app/(app)/setup/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/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- 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 +3 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +3 -2
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/activity.html +1 -1
- package/.next/server/app/activity.rsc +20 -18
- package/.next/server/app/activity.segments/!KGFwcCk/activity/__PAGE__.segment.rsc +7 -6
- package/.next/server/app/activity.segments/_full.segment.rsc +20 -18
- package/.next/server/app/activity.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/api/activity/route.js +2 -2
- package/.next/server/app/api/activity/route.js.nft.json +1 -1
- package/.next/server/app/api/backlinks/route.js +2 -2
- package/.next/server/app/api/backlinks/route.js.nft.json +1 -1
- package/.next/server/app/api/chat/route.js +1 -1
- package/.next/server/app/api/chat/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/conversations/route.js +2 -2
- package/.next/server/app/api/conversations/route.js.nft.json +1 -1
- package/.next/server/app/api/decisions/route.js +2 -2
- package/.next/server/app/api/decisions/route.js.nft.json +1 -1
- package/.next/server/app/api/docs/route.js +1 -1
- package/.next/server/app/api/docs/route.js.nft.json +1 -1
- package/.next/server/app/api/explorer/route.js +2 -2
- package/.next/server/app/api/explorer/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/route.js +1 -1
- package/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/.next/server/app/api/memory/route.js +2 -2
- package/.next/server/app/api/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/plan/apply/route.js +3 -3
- package/.next/server/app/api/plan/apply/route.js.nft.json +1 -1
- package/.next/server/app/api/projects/route.js +2 -2
- package/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/.next/server/app/api/registry/route.js +2 -2
- package/.next/server/app/api/registry/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/create/route.js +3 -3
- package/.next/server/app/api/roadmap/create/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/delete/route.js +3 -3
- package/.next/server/app/api/roadmap/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/generate/route.js +3 -3
- package/.next/server/app/api/roadmap/generate/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/layout/route.js +3 -3
- package/.next/server/app/api/roadmap/layout/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/restore/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/roadmap/restore/route/build-manifest.json +12 -0
- package/.next/server/app/api/roadmap/restore/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/roadmap/restore/route.js +9 -0
- package/.next/server/app/api/roadmap/restore/route.js.map +5 -0
- package/.next/server/app/api/roadmap/restore/route.js.nft.json +1 -0
- package/.next/server/app/api/roadmap/restore/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/roadmap/route.js +3 -3
- package/.next/server/app/api/roadmap/route.js.nft.json +1 -1
- package/.next/server/app/api/roadmap/update/route.js +3 -3
- package/.next/server/app/api/roadmap/update/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/route.js +2 -2
- package/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/route.js +3 -3
- package/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/.next/server/app/api/setup/generate/route.js +1 -1
- package/.next/server/app/api/setup/generate/route.js.nft.json +1 -1
- package/.next/server/app/api/setup/write/route.js +2 -2
- package/.next/server/app/api/setup/write/route.js.nft.json +1 -1
- package/.next/server/app/api/summary/route.js +2 -2
- package/.next/server/app/api/summary/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/bulk/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tasks/bulk/route/build-manifest.json +12 -0
- package/.next/server/app/api/tasks/bulk/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tasks/bulk/route.js +9 -0
- package/.next/server/app/api/tasks/bulk/route.js.map +5 -0
- package/.next/server/app/api/tasks/bulk/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/bulk/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/tasks/create/route.js +2 -2
- package/.next/server/app/api/tasks/create/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/delete/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tasks/delete/route/build-manifest.json +12 -0
- package/.next/server/app/api/tasks/delete/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tasks/delete/route.js +9 -0
- package/.next/server/app/api/tasks/delete/route.js.map +5 -0
- package/.next/server/app/api/tasks/delete/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/delete/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/tasks/manual-tests/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tasks/manual-tests/route/build-manifest.json +12 -0
- package/.next/server/app/api/tasks/manual-tests/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tasks/manual-tests/route.js +8 -0
- package/.next/server/app/api/tasks/manual-tests/route.js.map +5 -0
- package/.next/server/app/api/tasks/manual-tests/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/manual-tests/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/tasks/restore/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tasks/restore/route/build-manifest.json +12 -0
- package/.next/server/app/api/tasks/restore/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tasks/restore/route.js +9 -0
- package/.next/server/app/api/tasks/restore/route.js.map +5 -0
- package/.next/server/app/api/tasks/restore/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/restore/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/tasks/review/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tasks/review/route/build-manifest.json +12 -0
- package/.next/server/app/api/tasks/review/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tasks/review/route.js +9 -0
- package/.next/server/app/api/tasks/review/route.js.map +5 -0
- package/.next/server/app/api/tasks/review/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/review/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/tasks/route.js +2 -2
- package/.next/server/app/api/tasks/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/update/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tasks/update/route/build-manifest.json +12 -0
- package/.next/server/app/api/tasks/update/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tasks/update/route.js +9 -0
- package/.next/server/app/api/tasks/update/route.js.map +5 -0
- package/.next/server/app/api/tasks/update/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/update/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/views/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/views/route/build-manifest.json +12 -0
- package/.next/server/app/api/views/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/views/route.js +9 -0
- package/.next/server/app/api/views/route.js.map +5 -0
- package/.next/server/app/api/views/route.js.nft.json +1 -0
- package/.next/server/app/api/views/route_client-reference-manifest.js +3 -0
- package/.next/server/app/board.html +1 -1
- package/.next/server/app/board.rsc +20 -18
- package/.next/server/app/board.segments/!KGFwcCk/board/__PAGE__.segment.rsc +7 -6
- package/.next/server/app/board.segments/_full.segment.rsc +20 -18
- package/.next/server/app/board.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/chat.html +1 -1
- package/.next/server/app/chat.rsc +20 -18
- package/.next/server/app/chat.segments/!KGFwcCk/chat/__PAGE__.segment.rsc +12 -9
- package/.next/server/app/chat.segments/_full.segment.rsc +20 -18
- package/.next/server/app/chat.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/docs.html +1 -1
- package/.next/server/app/docs.rsc +20 -18
- package/.next/server/app/docs.segments/!KGFwcCk/docs/__PAGE__.segment.rsc +6 -5
- package/.next/server/app/docs.segments/_full.segment.rsc +20 -18
- package/.next/server/app/docs.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/explorer.html +1 -1
- package/.next/server/app/explorer.rsc +20 -18
- package/.next/server/app/explorer.segments/!KGFwcCk/explorer/__PAGE__.segment.rsc +11 -9
- package/.next/server/app/explorer.segments/_full.segment.rsc +20 -18
- package/.next/server/app/explorer.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +3 -2
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -2
- package/.next/server/app/index.segments/_full.segment.rsc +3 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/manual-tests.html +1 -0
- package/.next/server/app/manual-tests.meta +31 -0
- package/.next/server/app/manual-tests.rsc +31 -0
- package/.next/server/app/manual-tests.segments/!KGFwcCk/manual-tests/__PAGE__.segment.rsc +33 -0
- package/.next/server/app/manual-tests.segments/_full.segment.rsc +31 -0
- package/.next/server/app/manual-tests.segments/_tree.segment.rsc +5 -0
- package/.next/server/app/memory.html +1 -1
- package/.next/server/app/memory.rsc +20 -18
- package/.next/server/app/memory.segments/!KGFwcCk/memory/__PAGE__.segment.rsc +11 -9
- package/.next/server/app/memory.segments/_full.segment.rsc +20 -18
- package/.next/server/app/memory.segments/_tree.segment.rsc +3 -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/roadmap.html +1 -1
- package/.next/server/app/roadmap.rsc +20 -18
- package/.next/server/app/roadmap.segments/!KGFwcCk/roadmap/__PAGE__.segment.rsc +6 -5
- package/.next/server/app/roadmap.segments/_full.segment.rsc +20 -18
- package/.next/server/app/roadmap.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +20 -18
- package/.next/server/app/settings.segments/!KGFwcCk/settings/__PAGE__.segment.rsc +7 -6
- package/.next/server/app/settings.segments/_full.segment.rsc +20 -18
- package/.next/server/app/settings.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/setup.html +1 -1
- package/.next/server/app/setup.rsc +20 -18
- package/.next/server/app/setup.segments/!KGFwcCk/setup/__PAGE__.segment.rsc +11 -9
- package/.next/server/app/setup.segments/_full.segment.rsc +20 -18
- package/.next/server/app/setup.segments/_tree.segment.rsc +3 -2
- package/.next/server/app-paths-manifest.json +9 -0
- package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0-5bkpj._.js → 11mp_@anthropic-ai_sdk_00p3fu1._.js} +1 -1
- package/.next/server/chunks/{11mp_@anthropic-ai_sdk_01l5h3i._.js → 11mp_@anthropic-ai_sdk_01amtux._.js} +1 -1
- package/.next/server/chunks/{11mp_@anthropic-ai_sdk_00psb_y._.js → 11mp_@anthropic-ai_sdk_01jjl08._.js} +1 -1
- package/.next/server/chunks/{11mp_@anthropic-ai_sdk_072r2bd._.js → 11mp_@anthropic-ai_sdk_071zfm8._.js} +1 -1
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_07v3boe._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_09iva72._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0bom1b1._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0dvji7p._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0dzo8jn._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0hvqsqq._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0i7i-jw._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0k0iop5._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0l3-6aq._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0oegm3y._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0p5cyes._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0qw8i6_._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0yk-a7v._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_11fsqvb._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_143_7ez._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_14a4-64._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_17d_oma._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_18qwuyb._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_19au8y6._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ak_hy5._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1cqa0nq._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1i-x_q0._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jmtliz._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jmtliz._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jouwlj._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jouwlj._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1r_q5um._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1r_q5um._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1t959xd._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1t959xd._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1vkprw9._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1vkprw9._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y95ax9._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y95ax9._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y9misr._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1y9misr._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_21b8wwy._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_21b8wwy._.js.map +1 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_08ecfgc._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_09--sd6._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0e3mwc6._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0go4301._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0iq9dmt._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0n9ijke._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0szcyrx._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0xy2s3x._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0yaujn7._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0z9ly74._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1hmq3al._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1tqk4bp._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1x-hr6f._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1zsdhg0._.js +3 -0
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_20t__fe._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__1u_q61h._.js → [root-of-the-server]__0-pmfg2._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__02co2yq._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__02co2yq._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__1y3u5ud._.js → [root-of-the-server]__04tibmn._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__17xb02p._.js → [root-of-the-server]__05g5cgo._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__0aynzrb._.js → [root-of-the-server]__0b5pwze._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__142icjb._.js → [root-of-the-server]__0druay_._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__106gpvh._.js → [root-of-the-server]__0p6ja6l._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__0q3-t8a._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0q3-t8a._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0vcsqzd._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0vcsqzd._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__0nfvvy9._.js → [root-of-the-server]__1-e3i_5._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__1-ic3af._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1-ic3af._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__11a4ptn._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__11a4ptn._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__0e59y5j._.js → [root-of-the-server]__11c8641._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__12nzy_6._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__12nzy_6._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__15ck1wv._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__15ck1wv._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1613hjb._.js +30 -19
- package/.next/server/chunks/[root-of-the-server]__1613hjb._.js.map +1 -1
- package/.next/server/chunks/{[root-of-the-server]__06zf_sh._.js → [root-of-the-server]__197vw9g._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__1j0rrps._.js → [root-of-the-server]__19k8t87._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__0eqd-tw._.js → [root-of-the-server]__1ezzeji._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__1mrmaf9._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__17p0rkn._.js → [root-of-the-server]__1n68akx._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__1n68akx._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__11s76m8._.js → [root-of-the-server]__1npya5q._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__1npya5q._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1qusy4g._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1qusy4g._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__1q4ahvz._.js → [root-of-the-server]__1umrorf._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__093hlkh._.js → [root-of-the-server]__1vh9g2o._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__1y-tt29._.js → [root-of-the-server]__1vq38ov._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__1xb0fmp._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1xb0fmp._.js.map +1 -1
- package/.next/server/chunks/_04byth9._.js +24 -19
- package/.next/server/chunks/_04byth9._.js.map +1 -1
- package/.next/server/chunks/_1au4syj._.js +1 -1
- package/.next/server/chunks/_1au4syj._.js.map +1 -1
- package/.next/server/chunks/_1b5fqxy._.js.map +1 -1
- package/.next/server/chunks/_1ivswa9._.js +3 -0
- package/.next/server/chunks/_1ivswa9._.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_roadmap_restore_route_actions_0skshp1.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_roadmap_restore_route_actions_0skshp1.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_bulk_route_actions_1k75mlb.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_bulk_route_actions_1k75mlb.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_delete_route_actions_1k1g6mw.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_delete_route_actions_1k1g6mw.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_manual-tests_route_actions_1rpog0y.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_manual-tests_route_actions_1rpog0y.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_restore_route_actions_1ecsti8.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_restore_route_actions_1ecsti8.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_review_route_actions_1dly07f.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_review_route_actions_1dly07f.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_update_route_actions_0z-ho6g.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_tasks_update_route_actions_0z-ho6g.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_views_route_actions_10-2c0e.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_views_route_actions_10-2c0e.js.map +1 -0
- package/.next/server/chunks/ssr/0_g__next_dist_000c5_m._.js +3 -0
- package/.next/server/chunks/ssr/0_g__next_dist_000c5_m._.js.map +1 -0
- package/.next/server/chunks/ssr/{0_nd_mermaid_dist_mermaid_core_mjs_0vv_0i3._.js → 0_nd_mermaid_dist_mermaid_core_mjs_027n2yl._.js} +2 -2
- package/.next/server/chunks/ssr/0_nd_mermaid_dist_mermaid_core_mjs_027n2yl._.js.map +1 -0
- package/.next/server/chunks/ssr/{1u84_katex_dist_katex_mjs_1z0p1bs._.js → 1u84_katex_dist_katex_mjs_1kb5xea._.js} +1 -1
- package/.next/server/chunks/ssr/1u84_katex_dist_katex_mjs_1kb5xea._.js.map +1 -0
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_05ggp3i._.js +1 -1
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_05ggp3i._.js.map +1 -1
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0wurouw._.js +3 -0
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0wurouw._.js.map +1 -0
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_14hl50o._.js +3 -0
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_14hl50o._.js.map +1 -0
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_folder-open_mjs_117ipzw._.js +3 -0
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_folder-open_mjs_117ipzw._.js.map +1 -0
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_triangle-alert_mjs_0ei-mpz._.js +3 -0
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_triangle-alert_mjs_0ei-mpz._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0hcextx._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0hcextx._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0xt_0w2._.js.map +1 -1
- package/.next/server/chunks/ssr/_04xff_2._.js +1 -1
- package/.next/server/chunks/ssr/_04xff_2._.js.map +1 -1
- package/.next/server/chunks/ssr/_071j6mr._.js +4 -0
- package/.next/server/chunks/ssr/_071j6mr._.js.map +1 -0
- package/.next/server/chunks/ssr/_09b02z-._.js +3 -0
- package/.next/server/chunks/ssr/_09b02z-._.js.map +1 -0
- package/.next/server/chunks/ssr/_0d0f1s1._.js +3 -0
- package/.next/server/chunks/ssr/_0d0f1s1._.js.map +1 -0
- package/.next/server/chunks/ssr/_0idb-vo._.js +151 -0
- package/.next/server/chunks/ssr/_0idb-vo._.js.map +1 -0
- package/.next/server/chunks/ssr/_0lnt_va._.js +4 -0
- package/.next/server/chunks/ssr/_0lnt_va._.js.map +1 -0
- package/.next/server/chunks/ssr/_0qlymco._.js +3 -0
- package/.next/server/chunks/ssr/_0qlymco._.js.map +1 -0
- package/.next/server/chunks/ssr/_0qp3gu7._.js +3 -0
- package/.next/server/chunks/ssr/_0qp3gu7._.js.map +1 -0
- package/.next/server/chunks/ssr/_0sg1oeq._.js +3 -0
- package/.next/server/chunks/ssr/_0sg1oeq._.js.map +1 -0
- package/.next/server/chunks/ssr/_14emfpq._.js +3 -0
- package/.next/server/chunks/ssr/_14emfpq._.js.map +1 -0
- package/.next/server/chunks/ssr/_1ftruw6._.js +4 -0
- package/.next/server/chunks/ssr/_1ftruw6._.js.map +1 -0
- package/.next/server/chunks/ssr/_1gxjjvh._.js +1 -1
- package/.next/server/chunks/ssr/_1gxjjvh._.js.map +1 -1
- package/.next/server/chunks/ssr/_1ncdakv._.js +4 -0
- package/.next/server/chunks/ssr/_1ncdakv._.js.map +1 -0
- package/.next/server/chunks/ssr/_1t76zdx._.js +3 -0
- package/.next/server/chunks/ssr/_1t76zdx._.js.map +1 -0
- package/.next/server/chunks/ssr/_1x7ggg5._.js +4 -0
- package/.next/server/chunks/ssr/_1x7ggg5._.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_(app)_manual-tests_page_actions_1g5zjb7.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_(app)_manual-tests_page_actions_1g5zjb7.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules__pnpm_04khl_s._.js → node_modules__pnpm_01bjcv9._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_08sqeu2._.js → node_modules__pnpm_03qrzdb._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_104pzhc._.js → node_modules__pnpm_06d-fdo._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules__pnpm_1xzf8g_._.js → node_modules__pnpm_0ctisl0._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0og06fy._.js → node_modules__pnpm_0fwp8jm._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0a9b2ei._.js → node_modules__pnpm_0kpu0-2._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0jpv2b6._.js → node_modules__pnpm_0vry74x._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules__pnpm_0fd3pr1._.js → node_modules__pnpm_0ycbjbd._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules__pnpm_1l8k8w1._.js → node_modules__pnpm_1-76qxg._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0ah02mu._.js → node_modules__pnpm_1-r94f7._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_1yq90z7._.js → node_modules__pnpm_14piqi4._.js} +1 -1
- package/.next/server/chunks/ssr/node_modules__pnpm_14piqi4._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules__pnpm_0dwi7mu._.js → node_modules__pnpm_16u1vfb._.js} +2 -2
- package/.next/server/chunks/ssr/node_modules__pnpm_16u1vfb._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules__pnpm_0f77_ng._.js → node_modules__pnpm_17i6z2d._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_09_i2jk._.js → node_modules__pnpm_189m48n._.js} +1 -1
- package/.next/server/chunks/ssr/node_modules__pnpm_189m48n._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules__pnpm_0ttvopp._.js → node_modules__pnpm_192f222._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_07t_e8c._.js → node_modules__pnpm_1a48_nl._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_195j8p_._.js → node_modules__pnpm_1aa37e1._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0cj8ryj._.js → node_modules__pnpm_1f440kx._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0u3u82f._.js → node_modules__pnpm_1fn3ejy._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0ts89ne._.js → node_modules__pnpm_1min2jl._.js} +1 -1
- package/.next/server/chunks/ssr/node_modules__pnpm_1q89l7p._.js +3 -0
- package/.next/server/chunks/ssr/node_modules__pnpm_1q89l7p._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules__pnpm_1woddr6._.js → node_modules__pnpm_1q_hhr3._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules__pnpm_1x0t5_z._.js → node_modules__pnpm_1qmkxyo._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0gifu-u._.js → node_modules__pnpm_1qp_jvj._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules__pnpm_0y35hs4._.js → node_modules__pnpm_1ssjj4u._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_0qc3gsk._.js → node_modules__pnpm_1txccoj._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules__pnpm_1w0f1m5._.js → node_modules__pnpm_1uwkcin._.js} +1 -1
- package/.next/server/chunks/ssr/node_modules__pnpm_1xeothw._.js +3 -0
- package/.next/server/chunks/ssr/node_modules__pnpm_1xeothw._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules__pnpm_0286-tg._.js → node_modules__pnpm_1ygal0c._.js} +1 -1
- package/.next/server/chunks/ssr/src_app_(app)_activity_page_tsx_13jd6bn._.js +1 -1
- package/.next/server/chunks/ssr/src_app_(app)_activity_page_tsx_13jd6bn._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_(app)_board_page_tsx_0gpfc77._.js +3 -0
- package/.next/server/chunks/ssr/src_app_(app)_board_page_tsx_0gpfc77._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_(app)_chat_page_tsx_0c3e4l4._.js +1 -1
- package/.next/server/chunks/ssr/src_app_(app)_chat_page_tsx_0c3e4l4._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_(app)_layout_tsx_1yu5hom._.js +1 -1
- package/.next/server/chunks/ssr/src_app_(app)_layout_tsx_1yu5hom._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_(app)_manual-tests_page_tsx_01tnunf._.js +3 -0
- package/.next/server/chunks/ssr/src_app_(app)_manual-tests_page_tsx_01tnunf._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_(app)_roadmap_page_tsx_0vcq3jr._.js +2 -2
- package/.next/server/chunks/ssr/src_app_(app)_roadmap_page_tsx_0vcq3jr._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_(app)_settings_page_tsx_0zevtee._.js +2 -2
- package/.next/server/chunks/ssr/src_app_(app)_settings_page_tsx_0zevtee._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_(app)_setup_page_tsx_1yids_n._.js +1 -1
- package/.next/server/chunks/ssr/src_app_(app)_setup_page_tsx_1yids_n._.js.map +1 -1
- package/.next/server/chunks/ssr/src_components_chat_ChatView_tsx_0h5j-e2._.js +3 -0
- package/.next/server/chunks/ssr/src_components_chat_ChatView_tsx_0h5j-e2._.js.map +1 -0
- package/.next/server/chunks/ssr/src_context_ChatContext_tsx_0lowp8p._.js +2 -2
- package/.next/server/chunks/ssr/src_context_ChatContext_tsx_0lowp8p._.js.map +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/next-font-manifest.js +1 -1
- package/.next/server/next-font-manifest.json +4 -0
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/prefetch-hints.json +19 -0
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/02cj5_i9np4sg.js +3 -0
- package/.next/static/chunks/02i5hsdat1nuq.css +9 -0
- package/.next/static/chunks/0mgifb98wbesa.js +1 -0
- package/.next/static/chunks/0p1-hkgnm2ll2.js +1 -0
- package/.next/static/chunks/0pgu5q5vodev6.js +1 -0
- package/.next/static/chunks/0rqzvayflendx.js +2 -0
- package/.next/static/chunks/0vcfs7dii85tw.js +21 -0
- package/.next/static/chunks/13l4l-boqg8fx.js +1 -0
- package/.next/static/chunks/14hxe1qiaram9.js +1 -0
- package/.next/static/chunks/150y5rwg6gwvx.css +1 -0
- package/.next/static/chunks/16k196zyl-n9q.js +1 -0
- package/.next/static/chunks/18b5l8p0vd9f8.js +1 -0
- package/.next/static/chunks/1c_8t2kecjnua.js +1 -0
- package/.next/static/chunks/1fd43t9y42wd3.js +1 -0
- package/.next/static/chunks/1q50zh5z-fq2k.js +2 -0
- package/.next/static/chunks/1tu8lforstp1o.js +1 -0
- package/.next/static/chunks/23-xknrz6o748.js +1 -0
- package/.next/static/chunks/2_xpm7qhr69n8.js +2 -0
- package/.next/static/chunks/2ls_yp4-qgb42.js +1 -0
- package/.next/static/chunks/2zz0ip2l_29c3.js +3 -0
- package/.next/static/chunks/3ly7b47esdb7j.js +1 -0
- package/.next/static/chunks/3ruw8lu2_re-h.js +1 -0
- package/.next/static/chunks/3vf5nnd4xjo5_.js +1 -0
- package/.next/static/chunks/40jaenrnspnlh.js +68 -0
- package/.next/static/chunks/41oxcdcw-pcwt.js +1 -0
- package/README.md +2 -1
- package/package.json +1 -1
- package/skills/work-epic/SKILL.md +22 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0am8bw2._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0enefn6._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0k3n_5f._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0lcfjm4._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0lfx9av._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0qau3qw._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_0r1pmvm._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_11t-z2t._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_15hyn79._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1_qk07x._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1b2929e._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1e72c89._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1eq7asn._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1fhdojs._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1htgzmb._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1lh_vwq._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ludf-o._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1m3luz3._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1x1iz3d._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_1xsmwlh._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_202spah._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_215hw9u._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0d2_lq6._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0n-i0pd._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_13pos4j._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_17b4pqr._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1bkcmom._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1hlj_3l._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1ip-sor._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1pex5o1._.js +0 -3
- package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1s8lc8_._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1o4a-4j._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1o4a-4j._.js.map +0 -1
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0cvmffy._.js +0 -3
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0cvmffy._.js.map +0 -1
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0u3jxas._.js +0 -3
- package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0u3jxas._.js.map +0 -1
- package/.next/server/chunks/ssr/_059qmur._.js +0 -3
- package/.next/server/chunks/ssr/_059qmur._.js.map +0 -1
- package/.next/server/chunks/ssr/_081irea._.js +0 -3
- package/.next/server/chunks/ssr/_081irea._.js.map +0 -1
- package/.next/server/chunks/ssr/_0d8t8l4._.js +0 -3
- package/.next/server/chunks/ssr/_0d8t8l4._.js.map +0 -1
- package/.next/server/chunks/ssr/_0dyvcdg._.js +0 -3
- package/.next/server/chunks/ssr/_0dyvcdg._.js.map +0 -1
- package/.next/server/chunks/ssr/_1-ghqy4._.js +0 -3
- package/.next/server/chunks/ssr/_1-ghqy4._.js.map +0 -1
- package/.next/server/chunks/ssr/_17jy5db._.js +0 -3
- package/.next/server/chunks/ssr/_17jy5db._.js.map +0 -1
- package/.next/server/chunks/ssr/_1c95ems._.js +0 -151
- package/.next/server/chunks/ssr/_1c95ems._.js.map +0 -1
- package/.next/server/chunks/ssr/_1dllfz5._.js +0 -4
- package/.next/server/chunks/ssr/_1dllfz5._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules__pnpm_006_c8z._.js +0 -3
- package/.next/server/chunks/ssr/node_modules__pnpm_006_c8z._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules__pnpm_1imm4ut._.js +0 -3
- package/.next/server/chunks/ssr/node_modules__pnpm_1imm4ut._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules__pnpm_1kcnkjs._.js +0 -3
- package/.next/server/chunks/ssr/node_modules__pnpm_1kcnkjs._.js.map +0 -1
- package/.next/server/chunks/ssr/src_components_14pwej-._.js +0 -3
- package/.next/server/chunks/ssr/src_components_14pwej-._.js.map +0 -1
- package/.next/server/chunks/ssr/src_components_ui_scroll-area_tsx_0i-n_27._.js +0 -3
- package/.next/server/chunks/ssr/src_components_ui_scroll-area_tsx_0i-n_27._.js.map +0 -1
- package/.next/static/chunks/0-z7kyblalrea.js +0 -1
- package/.next/static/chunks/050mq8l4e1ubn.js +0 -1
- package/.next/static/chunks/098le48845_fg.js +0 -3
- package/.next/static/chunks/0cw4-ebkoufdc.js +0 -1
- package/.next/static/chunks/0feo-go1w5nct.js +0 -1
- package/.next/static/chunks/0k2qhx29amdgs.js +0 -1
- package/.next/static/chunks/14sefb904pl64.js +0 -21
- package/.next/static/chunks/1fer-wulyrjrs.js +0 -3
- package/.next/static/chunks/1o7b1x4umy8a6.js +0 -1
- package/.next/static/chunks/1q_io1j58aukw.js +0 -1
- package/.next/static/chunks/1r7z33e9jk3vp.js +0 -1
- package/.next/static/chunks/1t-cgh4477hfo.js +0 -1
- package/.next/static/chunks/1u-1po1qesc9f.js +0 -1
- package/.next/static/chunks/1u5kegkgm0xoz.js +0 -1
- package/.next/static/chunks/24ygzsgd-moqy.js +0 -1
- package/.next/static/chunks/26folxgplfa9t.js +0 -68
- package/.next/static/chunks/2ocixvjhv34_3.js +0 -1
- package/.next/static/chunks/3_lsdgxa-h7ma.css +0 -10
- package/.next/static/chunks/3rmv-sb9w9i3e.js +0 -1
- package/.next/static/chunks/3smp1lj103j-l.js +0 -1
- package/.next/static/chunks/3ttzomivj48jh.js +0 -2
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0-5bkpj._.js.map → 11mp_@anthropic-ai_sdk_00p3fu1._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_00psb_y._.js.map → 11mp_@anthropic-ai_sdk_01amtux._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_01l5h3i._.js.map → 11mp_@anthropic-ai_sdk_01jjl08._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_072r2bd._.js.map → 11mp_@anthropic-ai_sdk_071zfm8._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0am8bw2._.js.map → 11mp_@anthropic-ai_sdk_07v3boe._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0enefn6._.js.map → 11mp_@anthropic-ai_sdk_09iva72._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0k3n_5f._.js.map → 11mp_@anthropic-ai_sdk_0bom1b1._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0lcfjm4._.js.map → 11mp_@anthropic-ai_sdk_0dvji7p._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0lfx9av._.js.map → 11mp_@anthropic-ai_sdk_0dzo8jn._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0qau3qw._.js.map → 11mp_@anthropic-ai_sdk_0hvqsqq._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0r1pmvm._.js.map → 11mp_@anthropic-ai_sdk_0i7i-jw._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_11t-z2t._.js.map → 11mp_@anthropic-ai_sdk_0k0iop5._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_15hyn79._.js.map → 11mp_@anthropic-ai_sdk_0l3-6aq._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1_qk07x._.js.map → 11mp_@anthropic-ai_sdk_0oegm3y._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1b2929e._.js.map → 11mp_@anthropic-ai_sdk_0p5cyes._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1e72c89._.js.map → 11mp_@anthropic-ai_sdk_0qw8i6_._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1eq7asn._.js.map → 11mp_@anthropic-ai_sdk_0yk-a7v._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1fhdojs._.js.map → 11mp_@anthropic-ai_sdk_11fsqvb._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1htgzmb._.js.map → 11mp_@anthropic-ai_sdk_143_7ez._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1lh_vwq._.js.map → 11mp_@anthropic-ai_sdk_14a4-64._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1ludf-o._.js.map → 11mp_@anthropic-ai_sdk_17d_oma._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1m3luz3._.js.map → 11mp_@anthropic-ai_sdk_18qwuyb._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1x1iz3d._.js.map → 11mp_@anthropic-ai_sdk_19au8y6._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1xsmwlh._.js.map → 11mp_@anthropic-ai_sdk_1ak_hy5._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_202spah._.js.map → 11mp_@anthropic-ai_sdk_1cqa0nq._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_215hw9u._.js.map → 11mp_@anthropic-ai_sdk_1i-x_q0._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0d2_lq6._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_08ecfgc._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0n-i0pd._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_09--sd6._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_13pos4j._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0e3mwc6._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_17b4pqr._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0go4301._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1bkcmom._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0iq9dmt._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1hlj_3l._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0n9ijke._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1ip-sor._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0szcyrx._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1pex5o1._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0xy2s3x._.js.map} +0 -0
- /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1s8lc8_._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0yaujn7._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__0e59y5j._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0z9ly74._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__11s76m8._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1hmq3al._.js.map} +0 -0
- /package/.next/server/chunks/{ssr/0_nd_mermaid_dist_mermaid_core_mjs_0vv_0i3._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1tqk4bp._.js.map} +0 -0
- /package/.next/server/chunks/{ssr/1u84_katex_dist_katex_mjs_1z0p1bs._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1x-hr6f._.js.map} +0 -0
- /package/.next/server/chunks/{ssr/node_modules__pnpm_09_i2jk._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1zsdhg0._.js.map} +0 -0
- /package/.next/server/chunks/{ssr/node_modules__pnpm_0dwi7mu._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_20t__fe._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__1u_q61h._.js.map → [root-of-the-server]__0-pmfg2._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__1y3u5ud._.js.map → [root-of-the-server]__04tibmn._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__17xb02p._.js.map → [root-of-the-server]__05g5cgo._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__0aynzrb._.js.map → [root-of-the-server]__0b5pwze._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__142icjb._.js.map → [root-of-the-server]__0druay_._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__106gpvh._.js.map → [root-of-the-server]__0p6ja6l._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__0nfvvy9._.js.map → [root-of-the-server]__1-e3i_5._.js.map} +0 -0
- /package/.next/server/chunks/{ssr/node_modules__pnpm_1yq90z7._.js.map → [root-of-the-server]__11c8641._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__06zf_sh._.js.map → [root-of-the-server]__197vw9g._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__1j0rrps._.js.map → [root-of-the-server]__19k8t87._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__0eqd-tw._.js.map → [root-of-the-server]__1ezzeji._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__17p0rkn._.js.map → [root-of-the-server]__1mrmaf9._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__1q4ahvz._.js.map → [root-of-the-server]__1umrorf._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__093hlkh._.js.map → [root-of-the-server]__1vh9g2o._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__1y-tt29._.js.map → [root-of-the-server]__1vq38ov._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_04khl_s._.js.map → node_modules__pnpm_01bjcv9._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_08sqeu2._.js.map → node_modules__pnpm_03qrzdb._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_104pzhc._.js.map → node_modules__pnpm_06d-fdo._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_1xzf8g_._.js.map → node_modules__pnpm_0ctisl0._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0og06fy._.js.map → node_modules__pnpm_0fwp8jm._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0a9b2ei._.js.map → node_modules__pnpm_0kpu0-2._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0jpv2b6._.js.map → node_modules__pnpm_0vry74x._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0fd3pr1._.js.map → node_modules__pnpm_0ycbjbd._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_1l8k8w1._.js.map → node_modules__pnpm_1-76qxg._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0ah02mu._.js.map → node_modules__pnpm_1-r94f7._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0f77_ng._.js.map → node_modules__pnpm_17i6z2d._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0ttvopp._.js.map → node_modules__pnpm_192f222._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_07t_e8c._.js.map → node_modules__pnpm_1a48_nl._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_195j8p_._.js.map → node_modules__pnpm_1aa37e1._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0cj8ryj._.js.map → node_modules__pnpm_1f440kx._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0u3u82f._.js.map → node_modules__pnpm_1fn3ejy._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0ts89ne._.js.map → node_modules__pnpm_1min2jl._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_1woddr6._.js.map → node_modules__pnpm_1q_hhr3._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_1x0t5_z._.js.map → node_modules__pnpm_1qmkxyo._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0gifu-u._.js.map → node_modules__pnpm_1qp_jvj._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0y35hs4._.js.map → node_modules__pnpm_1ssjj4u._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0qc3gsk._.js.map → node_modules__pnpm_1txccoj._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_1w0f1m5._.js.map → node_modules__pnpm_1uwkcin._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules__pnpm_0286-tg._.js.map → node_modules__pnpm_1ygal0c._.js.map} +0 -0
- /package/.next/static/{uJ5RYxgFnE5svAvnuLDXN → fGPda81_8-K4GmaNUE6KA}/_buildManifest.js +0 -0
- /package/.next/static/{uJ5RYxgFnE5svAvnuLDXN → fGPda81_8-K4GmaNUE6KA}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{uJ5RYxgFnE5svAvnuLDXN → fGPda81_8-K4GmaNUE6KA}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports=[694739,a=>{"use strict";var b=a.i(662145),c=a.i(147758),d=a.i(174897),e=a.i(822404),f=a.i(256857);let g={name:"arrow-right",size:24,node:[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]};g.node;let h=(0,f.default)(g);var i=a.i(425404),j=a.i(531761),k=a.i(270923),l=a.i(544394),m=a.i(173628);let n=/^\s*[-*]\s+\[( |x|X)\]\s+(.*)$/;var o=a.i(368114);function p({epic:a}){let c=a.match(/^(R\d+)\s*[—–-]\s*(.+)$/);return(0,b.jsxs)("h2",{className:"flex items-baseline gap-3 pt-2",children:[c&&(0,b.jsx)("span",{className:"font-mono text-[11px] text-muted",children:c[1]}),(0,b.jsx)("span",{className:"text-[1.1rem] leading-snug font-semibold text-txt",children:c?c[2]:a})]})}let q=/((?<=^|[\s(])\/[\w\-./#?=]+|\b[a-z][\w-]+\/[\w\-./]*\w|\b[\w-]+\.(?:md|json|tsx?|mts)\b|\b(?:[TR]\d{3}|ADR-\d{3})\b|\bvibedoc_\w+|\bmanualTests\b)/g;function r({text:a}){return(0,b.jsx)(b.Fragment,{children:a.split(q).map((a,c)=>c%2?(0,b.jsx)("code",{className:"font-mono text-[0.9em]",children:a},c):a)})}function s({text:a,checked:c}){let d=a.indexOf(" → "),e=d<0?a:a.slice(0,d),f=d<0?null:a.slice(d+3);return(0,b.jsxs)("span",{className:(0,o.cn)("flex min-w-0 flex-col gap-1 transition-colors duration-(--duration-base)",c?"text-muted line-through":"text-txt"),children:[(0,b.jsx)("span",{className:"text-sm leading-snug",children:(0,b.jsx)(r,{text:e})}),f&&(0,b.jsxs)("span",{className:"flex items-start gap-1.5 text-[13px] leading-snug text-muted",children:[(0,b.jsx)(h,{className:"mt-0.5 size-3.5 shrink-0","aria-hidden":!0}),(0,b.jsx)("span",{className:"sr-only",children:"Expected: "}),(0,b.jsx)("span",{children:(0,b.jsx)(r,{text:f})})]})]})}function t({t:a,checkedOf:d,onToggle:f}){let g=a.tests.items.filter(d).length,h=a.tests.total,i=g===h,j=[{label:"Steps",items:a.tests.items.filter(a=>"steps"===a.group)},{label:"Regression risk",items:a.tests.items.filter(a=>"regression"===a.group)}].filter(a=>a.items.length);return(0,b.jsxs)("article",{id:a.task.id,className:(0,o.cn)("scroll-mt-16 rounded-lg border bg-surface animate-fade-in transition-colors duration-(--duration-slow)",i?"border-teal/30":"border-border"),children:[(0,b.jsxs)("header",{className:"flex flex-col gap-3 px-4 pt-4 pb-3 sm:px-5",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-baseline gap-x-3 gap-y-1.5",children:[(0,b.jsx)("span",{className:"font-mono text-[11px] text-muted",children:a.task.id}),(0,b.jsx)(e.default,{href:`/board?task=${a.task.id}`,className:"min-w-0 flex-1 basis-60 text-[15px] leading-snug font-semibold text-txt hover:text-accent focus-visible:text-accent focus-visible:outline-none",children:a.task.title}),(0,b.jsxs)("span",{className:"flex items-center gap-3",children:[(0,b.jsx)(m.StatusChip,{status:(0,c.displayStatus)(a.task)}),(0,b.jsxs)("span",{className:"font-mono text-[11px] text-muted tabular-nums",children:[(0,b.jsx)("span",{className:"text-txt",children:g}),"/",h]})]})]}),(0,b.jsx)("div",{className:"flex gap-0.5",role:"progressbar","aria-label":`${a.task.id} manual tests`,"aria-valuemin":0,"aria-valuemax":h,"aria-valuenow":g,children:a.tests.items.map(a=>(0,b.jsx)("span",{className:(0,o.cn)("h-1 flex-1 rounded-full transition-colors duration-(--duration-base)",d(a)?"bg-teal":"regression"===a.group?"bg-amber/25":"bg-border2")},a.index))})]}),(0,b.jsxs)("div",{className:"flex flex-col gap-4 border-t border-border px-4 py-4 sm:px-5",children:[j.map(a=>(0,b.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,b.jsx)("p",{className:(0,o.cn)("font-mono text-[10px] uppercase tracking-widest","Steps"===a.label?"text-muted":"text-amber"),children:a.label}),(0,b.jsx)("ol",{className:"flex flex-col",children:a.items.map((c,e)=>{let g=d(c);return(0,b.jsx)("li",{children:(0,b.jsxs)("label",{className:"-mx-2 grid cursor-pointer grid-cols-[1rem_1.25rem_1fr] items-start gap-x-2.5 rounded-md px-2 py-2 hover:bg-surface2",children:[(0,b.jsx)(u,{checked:g,onChange:a=>f(c,a)}),(0,b.jsx)("span",{className:"mt-px font-mono text-[11px] leading-5 text-muted tabular-nums","aria-hidden":!0,children:"Steps"===a.label?String(e+1).padStart(2,"0"):""}),(0,b.jsx)(s,{text:c.text,checked:g})]})},c.index)})})]},a.label)),a.tests.date&&(0,b.jsxs)("p",{className:"font-mono text-[10px] text-muted",children:["Report from ",a.tests.date]})]})]})}function u({checked:a,onChange:c,className:d}){return(0,b.jsxs)("span",{className:(0,o.cn)("relative mt-0.5 flex size-4 shrink-0",d),children:[(0,b.jsx)("input",{type:"checkbox",checked:a,onChange:a=>c(a.target.checked),className:"peer size-4 cursor-pointer appearance-none rounded-sm border border-muted bg-bg transition-colors duration-(--duration-fast) checked:border-teal checked:bg-teal hover:border-txt focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"}),(0,b.jsx)(i.Check,{strokeWidth:3,className:"pointer-events-none absolute inset-0.5 size-3 text-accent-fg opacity-0 peer-checked:opacity-100","aria-hidden":!0})]})}a.s(["default",0,function(){let{board:a,rootParam:c}=(0,l.useApp)(),[e,f]=(0,d.useState)(!1),[g,h]=(0,d.useState)({}),[i,m]=(0,d.useState)(null),[o,q]=(0,d.useState)([]),r=(0,d.useMemo)(()=>(a?Object.values(a).flat():[]).flatMap(a=>{let b=a.raw?function(a){let b=a.split("\n"),c=function(a){let b,c=(b=!1,a.map(a=>/^\s*```/.test(a)?(b=!b,!0):b)),d=a.findIndex((a,b)=>!c[b]&&"## Manual tests"===a.trim());if(d<0)return null;let e=a.findIndex((a,b)=>b>d&&!c[b]&&/^##\s/.test(a));return[d,e<0?a.length:e]}(b);if(!c)return null;let d=[],e="steps",f=null;for(let a of b.slice(c[0]+1,c[1])){let b=a.match(/^_(\d{4}-\d{2}-\d{2})\b/);if(b&&!f&&!d.length){f=b[1];continue}if(/^\s*###\s/.test(a)){e=/^\s*###\s+regression/i.test(a)?"regression":"steps";continue}let c=a.match(n);c&&d.push({text:c[2].trim(),checked:" "!==c[1],group:e,index:d.length})}return d.length?{items:d,total:d.length,done:d.filter(a=>a.checked).length,date:f}:null}(a.raw):null;return b?[{task:a,tests:b}]:[]}),[a]),s=(a,b)=>{let c=g[`${a.task.id}:${b.index}`];return c&&c.raw===a.task.raw?c.checked:b.checked},v=a=>a.tests.items.filter(b=>!s(a,b)).length,w=r.filter(a=>v(a)>0),x=e?r:r.filter(a=>v(a)>0||o.includes(a.task.id)),y=w.reduce((a,b)=>a+v(b),0),z=(0,d.useMemo)(()=>{let a=new Map;for(let b of[...x].sort((a,b)=>(b.tests.date??"").localeCompare(a.tests.date??"")||b.task.id.localeCompare(a.task.id))){let c=b.task.phase||"No epic";a.set(c,[...a.get(c)??[],b])}return[...a.entries()]},[x]),A=r.length>0;async function B(a,b,d){let e=`${a.task.id}:${b.index}`;m(null),h(b=>({...b,[e]:{checked:d,raw:a.task.raw??""}})),d&&1===v(a)&&q(b=>[...b,a.task.id]);try{let e=await fetch(`/api/tasks/manual-tests${c}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:a.task.id,index:b.index,checked:d})});if(!e.ok)throw Error((await e.json().catch(()=>null))?.error??`Request failed (${e.status})`)}catch(b){h(a=>{let b={...a};return delete b[e],b}),m(`Couldn't save the tick on ${a.task.id}: ${b.message}. The box is back as it was; try again.`)}}return(0,d.useEffect)(()=>{let a=window.location.hash.slice(1);a&&A&&document.getElementById(a)?.scrollIntoView({block:"start",behavior:"smooth"})},[A]),(0,b.jsxs)("div",{className:"mx-auto flex max-w-4xl flex-col gap-6 px-6 py-8",children:[(0,b.jsxs)("header",{className:"flex flex-wrap items-end gap-x-6 gap-y-3 border-b border-border pb-5",children:[(0,b.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,b.jsx)("h1",{className:"text-[1.6rem] leading-tight font-semibold tracking-[-0.02em] text-txt",children:"Manual tests"}),(0,b.jsx)("p",{className:"mt-2 text-[1.1rem] leading-snug font-semibold text-txt",children:w.length?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{className:"font-mono tabular-nums",children:y})," check",1===y?"":"s"," left across"," ",(0,b.jsx)("span",{className:"font-mono tabular-nums",children:w.length})," task",1===w.length?"":"s"]}):r.length?"Everything is checked":"Nothing to check yet"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-muted",children:"Ticking saves to the task file. It never changes the task's status."})]}),(0,b.jsxs)("label",{className:"flex w-full cursor-pointer items-center gap-2 text-xs text-muted select-none hover:text-txt sm:w-auto",children:[(0,b.jsx)(u,{checked:e,onChange:f,className:"mt-0"}),"Show fully tested ",(0,b.jsxs)("span",{className:"font-mono tabular-nums",children:["(",r.length-w.length,")"]})]})]}),i&&(0,b.jsx)("p",{role:"alert",className:"rounded-md border border-danger/30 bg-danger/5 px-3 py-2 text-xs text-danger",children:i}),0===r.length&&(0,b.jsxs)("div",{className:"flex flex-col items-start gap-2 rounded-lg border border-dashed border-border2 p-6 animate-fade-in",children:[(0,b.jsx)(k.FlaskConical,{className:"size-5 text-muted"}),(0,b.jsx)("p",{className:"text-sm text-txt",children:"No manual test reports yet"}),(0,b.jsxs)("p",{className:"max-w-lg text-xs leading-relaxed text-muted",children:["When an agent finishes a task with ",(0,b.jsx)("code",{className:"font-mono",children:"vibedoc_update_task"})," and a ",(0,b.jsx)("code",{className:"font-mono",children:"manualTests"})," checklist, the steps to click through show up here."]})]}),r.length>0&&0===z.length&&(0,b.jsxs)("div",{className:"flex items-center gap-2.5 rounded-lg border border-teal/30 px-4 py-3 text-sm text-txt animate-fade-in",children:[(0,b.jsx)(j.CircleCheck,{className:"size-4 shrink-0 text-teal","aria-hidden":!0}),"All ",r.length," report",1===r.length?" is":"s are"," fully checked. Turn on Show fully tested to see them again."]}),z.map(([a,c])=>(0,b.jsxs)("section",{className:"flex flex-col gap-4",children:[(0,b.jsx)(p,{epic:a}),c.map(a=>(0,b.jsx)(t,{t:a,checkedOf:b=>s(a,b),onToggle:(b,c)=>B(a,b,c)},a.task.id))]},a))]})}],694739)}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=src_app_%28app%29_manual-tests_page_tsx_01tnunf._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/%28app%29/manual-tests/page.tsx","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/arrow-right.ts","../../../../src/lib/manual-tests.ts"],"sourcesContent":["\"use client\"\n\nimport { displayStatus } from \"@/lib/statuses\"\nimport { useEffect, useMemo, useState } from \"react\"\nimport Link from \"next/link\"\nimport { ArrowRight, Check, CircleCheck, FlaskConical } from \"lucide-react\"\nimport { useApp } from \"@/context/AppContext\"\nimport { StatusChip } from \"@/components/shared/StatusIcon\"\nimport { parseManualTests, type ManualTestItem, type ManualTests } from \"@/lib/manual-tests\"\nimport { cn } from \"@/lib/utils\"\nimport type { Task } from \"@/types\"\n\ninterface Tested { task: Task; tests: ManualTests }\n\n/** A tick not yet reflected in the board data, keyed \"T001:3\"; only applies while the task file is unchanged. */\ntype Pending = Record<string, { checked: boolean; raw: string }>\n\nexport default function ManualTestsPage() {\n const { board, rootParam } = useApp()\n const [showTested, setShowTested] = useState(false)\n const [pending, setPending] = useState<Pending>({})\n const [error, setError] = useState<string | null>(null)\n // Tasks finished during this visit stay in place (marked done) instead of vanishing under the cursor\n const [finishedHere, setFinishedHere] = useState<string[]>([])\n\n const all = useMemo<Tested[]>(() => {\n const tasks = board ? Object.values(board).flat() : []\n return tasks.flatMap((task) => {\n const tests = task.raw ? parseManualTests(task.raw) : null\n return tests ? [{ task, tests }] : []\n })\n }, [board])\n\n const checkedOf = (t: Tested, item: ManualTestItem) => {\n const p = pending[`${t.task.id}:${item.index}`]\n return p && p.raw === t.task.raw ? p.checked : item.checked\n }\n const remaining = (t: Tested) => t.tests.items.filter((i) => !checkedOf(t, i)).length\n\n const open = all.filter((t) => remaining(t) > 0)\n const shown = showTested ? all : all.filter((t) => remaining(t) > 0 || finishedHere.includes(t.task.id))\n const itemsLeft = open.reduce((n, t) => n + remaining(t), 0)\n\n // Group by epic (Phase); newest report first, both for groups and for tasks inside them\n const groups = useMemo(() => {\n const byEpic = new Map<string, Tested[]>()\n for (const t of [...shown].sort((a, b) => (b.tests.date ?? \"\").localeCompare(a.tests.date ?? \"\") || b.task.id.localeCompare(a.task.id))) {\n const key = t.task.phase || \"No epic\"\n byEpic.set(key, [...(byEpic.get(key) ?? []), t])\n }\n return [...byEpic.entries()]\n }, [shown])\n\n // /manual-tests#T060 (the card badge): scroll that task into view once it's rendered\n const hasTasks = all.length > 0\n useEffect(() => {\n const id = window.location.hash.slice(1)\n if (id && hasTasks) document.getElementById(id)?.scrollIntoView({ block: \"start\", behavior: \"smooth\" })\n }, [hasTasks])\n\n async function toggle(t: Tested, item: ManualTestItem, checked: boolean) {\n const key = `${t.task.id}:${item.index}`\n setError(null)\n setPending((p) => ({ ...p, [key]: { checked, raw: t.task.raw ?? \"\" } }))\n if (checked && remaining(t) === 1) setFinishedHere((ids) => [...ids, t.task.id])\n try {\n const res = await fetch(`/api/tasks/manual-tests${rootParam}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ id: t.task.id, index: item.index, checked }),\n })\n if (!res.ok) throw new Error((await res.json().catch(() => null))?.error ?? `Request failed (${res.status})`)\n // The SSE task_updated refresh brings the new file; the pending entry stops applying once raw changes\n } catch (e) {\n setPending((p) => { const next = { ...p }; delete next[key]; return next })\n setError(`Couldn't save the tick on ${t.task.id}: ${(e as Error).message}. The box is back as it was; try again.`)\n }\n }\n\n return (\n <div className=\"mx-auto flex max-w-4xl flex-col gap-6 px-6 py-8\">\n <header className=\"flex flex-wrap items-end gap-x-6 gap-y-3 border-b border-border pb-5\">\n <div className=\"min-w-0 flex-1\">\n <h1 className=\"text-[1.6rem] leading-tight font-semibold tracking-[-0.02em] text-txt\">Manual tests</h1>\n <p className=\"mt-2 text-[1.1rem] leading-snug font-semibold text-txt\">\n {open.length ? (\n <>\n <span className=\"font-mono tabular-nums\">{itemsLeft}</span> check{itemsLeft === 1 ? \"\" : \"s\"} left across{\" \"}\n <span className=\"font-mono tabular-nums\">{open.length}</span> task{open.length === 1 ? \"\" : \"s\"}\n </>\n ) : all.length ? \"Everything is checked\" : \"Nothing to check yet\"}\n </p>\n <p className=\"mt-1 text-sm text-muted\">Ticking saves to the task file. It never changes the task's status.</p>\n </div>\n <label className=\"flex w-full cursor-pointer items-center gap-2 text-xs text-muted select-none hover:text-txt sm:w-auto\">\n <Tick checked={showTested} onChange={setShowTested} className=\"mt-0\" />\n Show fully tested <span className=\"font-mono tabular-nums\">({all.length - open.length})</span>\n </label>\n </header>\n\n {error && <p role=\"alert\" className=\"rounded-md border border-danger/30 bg-danger/5 px-3 py-2 text-xs text-danger\">{error}</p>}\n\n {all.length === 0 && (\n <div className=\"flex flex-col items-start gap-2 rounded-lg border border-dashed border-border2 p-6 animate-fade-in\">\n <FlaskConical className=\"size-5 text-muted\" />\n <p className=\"text-sm text-txt\">No manual test reports yet</p>\n <p className=\"max-w-lg text-xs leading-relaxed text-muted\">\n When an agent finishes a task with <code className=\"font-mono\">vibedoc_update_task</code> and a <code className=\"font-mono\">manualTests</code> checklist,\n the steps to click through show up here.\n </p>\n </div>\n )}\n\n {all.length > 0 && groups.length === 0 && (\n <div className=\"flex items-center gap-2.5 rounded-lg border border-teal/30 px-4 py-3 text-sm text-txt animate-fade-in\">\n <CircleCheck className=\"size-4 shrink-0 text-teal\" aria-hidden />\n All {all.length} report{all.length === 1 ? \" is\" : \"s are\"} fully checked. Turn on Show fully tested to see them again.\n </div>\n )}\n\n {groups.map(([epic, tasks]) => (\n <section key={epic} className=\"flex flex-col gap-4\">\n <EpicHeading epic={epic} />\n {tasks.map((t) => (\n <TaskTests key={t.task.id} t={t} checkedOf={(i) => checkedOf(t, i)} onToggle={(i, c) => toggle(t, i, c)} />\n ))}\n </section>\n ))}\n </div>\n )\n}\n\n/** \"R043 — Task verification & review\" → the ID in mono, the name as a headline. */\nfunction EpicHeading({ epic }: { epic: string }) {\n const m = epic.match(/^(R\\d+)\\s*[—–-]\\s*(.+)$/)\n return (\n <h2 className=\"flex items-baseline gap-3 pt-2\">\n {m && <span className=\"font-mono text-[11px] text-muted\">{m[1]}</span>}\n <span className=\"text-[1.1rem] leading-snug font-semibold text-txt\">{m ? m[2] : epic}</span>\n </h2>\n )\n}\n\n// Paths, commands, files, IDs and tool names inside a step (the Grep rule: set them in mono)\nconst CODE = /((?<=^|[\\s(])\\/[\\w\\-./#?=]+|\\b[a-z][\\w-]+\\/[\\w\\-./]*\\w|\\b[\\w-]+\\.(?:md|json|tsx?|mts)\\b|\\b(?:[TR]\\d{3}|ADR-\\d{3})\\b|\\bvibedoc_\\w+|\\bmanualTests\\b)/g\n\nfunction Inline({ text }: { text: string }) {\n return (\n <>\n {text.split(CODE).map((part, i) =>\n i % 2 ? <code key={i} className=\"font-mono text-[0.9em]\">{part}</code> : part,\n )}\n </>\n )\n}\n\n/** A step reads \"do this → see that\": the action, then the expected result on its own line. */\nfunction StepText({ text, checked }: { text: string; checked: boolean }) {\n const at = text.indexOf(\" → \")\n const action = at < 0 ? text : text.slice(0, at)\n const expected = at < 0 ? null : text.slice(at + 3)\n return (\n <span className={cn(\"flex min-w-0 flex-col gap-1 transition-colors duration-(--duration-base)\", checked ? \"text-muted line-through\" : \"text-txt\")}>\n <span className=\"text-sm leading-snug\"><Inline text={action} /></span>\n {expected && (\n <span className=\"flex items-start gap-1.5 text-[13px] leading-snug text-muted\">\n <ArrowRight className=\"mt-0.5 size-3.5 shrink-0\" aria-hidden />\n <span className=\"sr-only\">Expected: </span>\n <span><Inline text={expected} /></span>\n </span>\n )}\n </span>\n )\n}\n\nfunction TaskTests({ t, checkedOf, onToggle }: {\n t: Tested\n checkedOf: (item: ManualTestItem) => boolean\n onToggle: (item: ManualTestItem, checked: boolean) => void\n}) {\n const done = t.tests.items.filter(checkedOf).length\n const total = t.tests.total\n const complete = done === total\n const groups = [\n { label: \"Steps\", items: t.tests.items.filter((i) => i.group === \"steps\") },\n { label: \"Regression risk\", items: t.tests.items.filter((i) => i.group === \"regression\") },\n ].filter((g) => g.items.length)\n\n return (\n <article\n id={t.task.id}\n className={cn(\"scroll-mt-16 rounded-lg border bg-surface animate-fade-in transition-colors duration-(--duration-slow)\", complete ? \"border-teal/30\" : \"border-border\")}\n >\n <header className=\"flex flex-col gap-3 px-4 pt-4 pb-3 sm:px-5\">\n <div className=\"flex flex-wrap items-baseline gap-x-3 gap-y-1.5\">\n <span className=\"font-mono text-[11px] text-muted\">{t.task.id}</span>\n <Link href={`/board?task=${t.task.id}`} className=\"min-w-0 flex-1 basis-60 text-[15px] leading-snug font-semibold text-txt hover:text-accent focus-visible:text-accent focus-visible:outline-none\">\n {t.task.title}\n </Link>\n <span className=\"flex items-center gap-3\">\n <StatusChip status={displayStatus(t.task)} />\n <span className=\"font-mono text-[11px] text-muted tabular-nums\">\n <span className=\"text-txt\">{done}</span>/{total}\n </span>\n </span>\n </div>\n {/* One mark per item: the report's ruling, filled as you tick */}\n <div className=\"flex gap-0.5\" role=\"progressbar\" aria-label={`${t.task.id} manual tests`} aria-valuemin={0} aria-valuemax={total} aria-valuenow={done}>\n {t.tests.items.map((i) => (\n <span\n key={i.index}\n className={cn(\"h-1 flex-1 rounded-full transition-colors duration-(--duration-base)\", checkedOf(i) ? \"bg-teal\" : i.group === \"regression\" ? \"bg-amber/25\" : \"bg-border2\")}\n />\n ))}\n </div>\n </header>\n <div className=\"flex flex-col gap-4 border-t border-border px-4 py-4 sm:px-5\">\n {groups.map((g) => (\n <div key={g.label} className=\"flex flex-col gap-1\">\n <p className={cn(\"font-mono text-[10px] uppercase tracking-widest\", g.label === \"Steps\" ? \"text-muted\" : \"text-amber\")}>{g.label}</p>\n <ol className=\"flex flex-col\">\n {g.items.map((item, n) => {\n const checked = checkedOf(item)\n return (\n <li key={item.index}>\n <label className=\"-mx-2 grid cursor-pointer grid-cols-[1rem_1.25rem_1fr] items-start gap-x-2.5 rounded-md px-2 py-2 hover:bg-surface2\">\n <Tick checked={checked} onChange={(c) => onToggle(item, c)} />\n {/* Steps are a sequence; regression checks aren't */}\n <span className=\"mt-px font-mono text-[11px] leading-5 text-muted tabular-nums\" aria-hidden>{g.label === \"Steps\" ? String(n + 1).padStart(2, \"0\") : \"\"}</span>\n <StepText text={item.text} checked={checked} />\n </label>\n </li>\n )\n })}\n </ol>\n </div>\n ))}\n {t.tests.date && <p className=\"font-mono text-[10px] text-muted\">Report from {t.tests.date}</p>}\n </div>\n </article>\n )\n}\n\n/** The native checkbox, drawn in the system: pencil-grey box, teal fill with an ink check when ticked. */\nfunction Tick({ checked, onChange, className }: { checked: boolean; onChange: (checked: boolean) => void; className?: string }) {\n return (\n <span className={cn(\"relative mt-0.5 flex size-4 shrink-0\", className)}>\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => onChange(e.target.checked)}\n className=\"peer size-4 cursor-pointer appearance-none rounded-sm border border-muted bg-bg transition-colors duration-(--duration-fast) checked:border-teal checked:bg-teal hover:border-txt focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent\"\n />\n <Check strokeWidth={3} className=\"pointer-events-none absolute inset-0.5 size-3 text-accent-fg opacity-0 peer-checked:opacity-100\" aria-hidden />\n </span>\n )\n}\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'arrow-right',\n size: 24,\n node: [\n ['path', { d: 'M5 12h14', key: '1ays0h' }],\n ['path', { d: 'm12 5 7 7-7 7', key: 'xquz4c' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name ArrowRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/arrow-right\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ArrowRight = createLucideIcon(__iconData);\n\nexport default ArrowRight;\n","// Manual test report on a task (R043): a `## Manual tests` checklist section at the end of the task file.\n// Pure (no fs): core.ts reads/writes the file; `node src/lib/manual-tests.check.mts` runs the self-check.\n//\n// ## Manual tests\n// _2026-10-01 — ai_\n// ### Steps\n// - [ ] Open /roadmap, click \"Break down\" on R043 → a chat opens titled with the epic\n// ### Regression risk\n// - [ ] Dragging a card between columns still works\n\nexport const MANUAL_TESTS_HEADING = \"## Manual tests\"\n\nexport type ManualTestGroup = \"steps\" | \"regression\"\n\nexport interface ManualTestItem {\n text: string\n checked: boolean\n group: ManualTestGroup\n /** Position among all checklist items in the section (T061 toggles by this) */\n index: number\n}\n\nexport interface ManualTests {\n items: ManualTestItem[]\n total: number\n done: number\n /** From the `_YYYY-MM-DD — actor_` line; null if missing */\n date: string | null\n}\n\nconst ITEM = /^\\s*[-*]\\s+\\[( |x|X)\\]\\s+(.*)$/\nconst BULLET = /^\\s*[-*]\\s+(.*)$/\n\n/** Lines inside ``` fences, so an example section quoted in a task's spec is never taken for the real one. */\nfunction fenced(lines: string[]): boolean[] {\n let inFence = false\n return lines.map((l) => {\n if (/^\\s*```/.test(l)) { inFence = !inFence; return true }\n return inFence\n })\n}\n\n/** [start, end) line range of the section: its heading up to the next `## ` heading or the end of the file. */\nfunction sectionRange(lines: string[]): [number, number] | null {\n const code = fenced(lines)\n const start = lines.findIndex((l, i) => !code[i] && l.trim() === MANUAL_TESTS_HEADING)\n if (start < 0) return null\n const next = lines.findIndex((l, i) => i > start && !code[i] && /^##\\s/.test(l))\n return [start, next < 0 ? lines.length : next]\n}\n\n/**\n * The report body as a checklist: `### ` group headings kept, every other non-empty line becomes `- [ ] …`\n * (plain text and plain bullets alike). Items before any heading go under `### Steps`.\n */\nexport function normalizeReport(report: string): string {\n const out: string[] = []\n for (const raw of report.replace(/\\r\\n/g, \"\\n\").split(\"\\n\")) {\n const line = raw.trimEnd()\n if (!line.trim()) continue\n if (/^\\s*###\\s/.test(line)) { out.push(line.trim()); continue }\n if (/^\\s*##?\\s/.test(line)) continue // a stray \"## Manual tests\" or H1 from the agent\n const item = line.match(ITEM)\n const text = item ? item[2] : (line.match(BULLET)?.[1] ?? line.trim())\n if (!out.some((l) => l.startsWith(\"### \"))) out.push(\"### Steps\")\n out.push(`- [${item && item[1] !== \" \" ? \"x\" : \" \"}] ${text.trim()}`)\n }\n return out.join(\"\\n\")\n}\n\n/** Write the report as the task's `## Manual tests` section, replacing an older one (old ticks no longer apply). */\nexport function setManualTests(raw: string, report: string, actor: \"ai\" | \"human\", date: string): string {\n const body = normalizeReport(report)\n if (!body) throw new Error(\"manualTests is empty: give at least one checklist item\")\n const lines = raw.split(\"\\n\")\n const range = sectionRange(lines)\n const rest = range ? [...lines.slice(0, range[0]), ...lines.slice(range[1])] : lines\n const kept = rest.join(\"\\n\").replace(/\\s+$/, \"\")\n return `${kept}\\n\\n${MANUAL_TESTS_HEADING}\\n_${date} — ${actor}_\\n${body}\\n`\n}\n\n/** The checklist in a task file, or null when it has no `## Manual tests` section (or the section has no items). */\nexport function parseManualTests(raw: string): ManualTests | null {\n const lines = raw.split(\"\\n\")\n const range = sectionRange(lines)\n if (!range) return null\n const items: ManualTestItem[] = []\n let group: ManualTestGroup = \"steps\"\n let date: string | null = null\n for (const line of lines.slice(range[0] + 1, range[1])) {\n const stamp = line.match(/^_(\\d{4}-\\d{2}-\\d{2})\\b/)\n if (stamp && !date && !items.length) { date = stamp[1]; continue }\n if (/^\\s*###\\s/.test(line)) { group = /^\\s*###\\s+regression/i.test(line) ? \"regression\" : \"steps\"; continue }\n const m = line.match(ITEM)\n if (m) items.push({ text: m[2].trim(), checked: m[1] !== \" \", group, index: items.length })\n }\n if (!items.length) return null\n return { items, total: items.length, done: items.filter((i) => i.checked).length, date }\n}\n\n/** Tick or untick the `index`th checklist item of the `## Manual tests` section (file order), nothing else. */\nexport function toggleManualTest(raw: string, index: number, checked: boolean): string {\n const lines = raw.split(\"\\n\")\n const range = sectionRange(lines)\n if (!range) throw new RangeError(\"This task has no manual tests\")\n let n = 0\n for (let i = range[0] + 1; i < range[1]; i++) {\n if (!ITEM.test(lines[i])) continue\n if (n++ === index) {\n lines[i] = lines[i].replace(/\\[( |x|X)\\]/, checked ? \"[x]\" : \"[ ]\")\n return lines.join(\"\\n\")\n }\n }\n throw new RangeError(`No manual test item ${index} (the task has ${n})`)\n}\n"],"names":[],"mappings":"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","ignoreList":[1]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
module.exports=[690793,a=>{"use strict";var b=a.i(662145),c=a.i(174897),d=a.i(365465),e=a.i(152716),f=a.i(340933),g=a.i(795667),h=a.i(926128),i=a.i(256857);let j={name:"list-tree",size:24,node:[["path",{d:"M8 5h13",key:"1pao27"}],["path",{d:"M13 12h8",key:"h98zly"}],["path",{d:"M13 19h8",key:"c3s6r1"}],["path",{d:"M3 10a2 2 0 0 0 2 2h3",key:"1npucw"}],["path",{d:"M3 5v12a2 2 0 0 0 2 2h3",key:"x1gjn2"}]]};j.node;let k=(0,i.default)(j);var l=a.i(200382),m=a.i(551729),n=a.i(913975),o=a.i(544394),p=a.i(21215),q=a.i(699570);let r=a=>"done"===a||"cancelled"===a;function s(a,b){let c=new Map(b.map(a=>[a.id,a])),d=a.tasks.map(a=>c.get(a)).filter(a=>!!a),e=a=>[...new Set((a.dependsOn.match(/\bT\d+\b/gi)??[]).map(a=>a.toUpperCase()))].filter(a=>{let b=c.get(a);return!b||!r(b.status)});for(let a of d)if("todo"===a.status&&!e(a).length)return{kind:"ready",taskId:a.id};if(d.every(a=>r(a.status)))return{kind:"finished"};let f=new Set(a.tasks),g=new Map,h=a=>{if(g.has(a))return g.get(a)??!1;g.set(a,!1);let b=c.get(a),d=!!b&&"blocked"!==b.status&&("todo"!==b.status||f.has(a)&&e(b).every(h));return g.set(a,d),d},i=[];for(let b of a.tasks){let a=c.get(b);if(a){if("in-progress"===a.status)i.push({taskId:b,reason:`${b} is in progress (claimed)`});else if("blocked"===a.status)i.push({taskId:b,reason:`${b} is blocked`});else if("todo"===a.status){let d=e(a).map(a=>`${a} (${c.get(a)?.status??"missing"})`);i.push({taskId:b,reason:`${b} waits on ${d.join(", ")}`})}}else i.push({taskId:b,reason:`${b} has no task file`})}return{kind:"waiting",waiting:i,needsHuman:i.every(a=>!h(a.taskId))}}var t=a.i(452696),u=a.i(368114),v=a.i(525395),w=a.i(618940),x=a.i(815122),y=a.i(581040);function z({items:a,today:d,onSelect:e,progressById:f}){let g=new Map(a.filter(a=>null===a.parent).sort((a,b)=>a.order-b.order).map((a,b)=>[a.id,b+1])),h=(0,c.useMemo)(()=>(0,y.buildTimeline)(a,d),[a,d]),i=(0,c.useRef)(null);(0,c.useEffect)(()=>{let a=i.current;a&&(a.scrollLeft=Math.max(0,h.todayX-(a.clientWidth-200)/3))},[h.todayX]);let j=h.lanes.some(a=>a.markers.length>0);return(0,b.jsxs)("div",{className:"flex flex-1 min-h-0 flex-col",children:[(0,b.jsx)("div",{ref:i,className:"relative flex-1 min-h-0 overflow-auto",children:(0,b.jsxs)("div",{className:"relative",style:{width:200+h.width,minHeight:"100%"},children:[(0,b.jsxs)("div",{className:"pointer-events-none absolute inset-y-0",style:{left:200,width:h.width},children:[h.months.map(a=>(0,b.jsx)("div",{className:"absolute inset-y-0 border-l border-border",style:{left:a.x}},a.x)),(0,b.jsx)("div",{className:"absolute inset-y-0 left-0 bg-surface/50",style:{width:h.todayX}}),(0,b.jsx)("div",{className:"absolute inset-y-0 w-px bg-accent shadow-[0_0_12px_rgb(var(--rgb-accent)/0.8)]",style:{left:h.todayX},children:(0,b.jsx)("span",{className:"absolute -translate-x-1/2 rounded-full bg-accent px-2 py-0.5 font-mono text-[10px] uppercase tracking-wider text-white",style:{top:42},children:"Today"})})]}),(0,b.jsxs)("div",{className:"sticky top-0 z-20 flex border-b border-border bg-bg",style:{height:36},children:[(0,b.jsx)("div",{className:"sticky left-0 z-10 shrink-0 bg-bg",style:{width:200}}),(0,b.jsx)("div",{className:"relative",children:h.months.map(a=>(0,b.jsx)("span",{className:"absolute top-3 whitespace-nowrap pl-2 font-mono text-[10px] uppercase tracking-widest text-muted",style:{left:a.x},children:a.label},a.x))})]}),h.lanes.map(a=>(0,b.jsxs)("div",{className:"relative flex border-b border-border",children:[(0,b.jsx)(A,{item:a.item,chapter:g.get(a.item.id),progress:f[a.item.id],onSelect:e}),(0,b.jsx)("div",{className:"relative",style:{width:h.width,height:a.rows*y.LANE_ROW_H+12},children:a.markers.map(a=>(0,b.jsxs)("button",{type:"button",onClick:()=>e(a.item.id),title:`${a.item.id} \xb7 ${a.item.title} \xb7 due ${a.item.due}${"overdue"===a.state?" (overdue)":""}`,className:"group absolute flex items-center gap-1.5",style:{left:a.x-10,top:6+a.row*y.LANE_ROW_H},children:[a.horizon?(0,b.jsx)("span",{className:(0,u.cn)("h-4 w-4 rotate-45 border-2 border-accent","done"===a.item.status?"bg-accent":"bg-bg","overdue"===a.state&&"border-danger")}):(0,b.jsx)("span",{className:(0,u.cn)("rounded-full","overdue"===a.state&&"ring-2 ring-danger ring-offset-1 ring-offset-bg"),children:(0,b.jsx)(w.StatusDot,{status:a.item.status})}),(0,b.jsxs)("span",{className:(0,u.cn)("flex max-w-[150px] flex-col rounded-md border px-2 py-0.5 text-left transition-colors","in-progress"===a.item.status?"border-accent/50 bg-surface shadow-[0_6px_18px_-10px_rgb(var(--rgb-accent)/0.7)]":"done"===a.item.status?"border-border bg-surface/60":"border-dashed border-border2 bg-bg","group-hover:border-accent"),children:[(0,b.jsxs)("span",{className:"flex items-center gap-1",children:[(0,b.jsx)("span",{className:(0,u.cn)("truncate text-xs","done"===a.item.status?"text-muted":"text-txt",a.horizon&&"font-semibold"),children:a.item.title}),(0,b.jsx)(x.AgentDot,{attach:{kind:"epic",id:a.item.id}})]}),(0,b.jsx)("span",{className:(0,u.cn)("font-mono text-[10px]","overdue"===a.state?"text-danger":"soon"===a.state?"text-amber":"text-muted"),children:(0,y.formatDay)(a.item.due)})]})]},a.item.id))})]},a.item.id)),!j&&(0,b.jsx)("p",{className:"px-6 py-8 text-sm text-muted",style:{marginLeft:200},children:"No due dates yet — open an item and set a Due date."})]})}),h.undated.length>0&&(0,b.jsxs)("div",{className:"max-h-28 shrink-0 overflow-y-auto border-t border-border bg-surface px-4 py-2",children:[(0,b.jsxs)("p",{className:"mb-2 font-mono text-[10px] uppercase tracking-widest text-muted",children:["No due date · ",h.undated.length]}),(0,b.jsx)("div",{className:"flex flex-wrap gap-1.5",children:h.undated.map(a=>(0,b.jsxs)("button",{type:"button",onClick:()=>e(a.id),className:"flex items-center gap-1 rounded-md border border-border px-1.5 py-0.5 text-xs text-muted hover:border-accent hover:text-txt",children:[(0,b.jsx)(w.StatusDot,{status:a.status}),a.title,(0,b.jsx)(x.AgentDot,{attach:{kind:"epic",id:a.id}})]},a.id))})]})]})}function A({item:a,chapter:c,progress:d,onSelect:e}){return(0,b.jsxs)("button",{type:"button",onClick:()=>e(a.id),className:"sticky left-0 z-10 flex shrink-0 items-center gap-3 border-r border-border bg-surface px-3 text-left hover:bg-surface2",style:{width:200},children:[(0,b.jsx)("span",{className:(0,u.cn)("font-mono text-lg font-semibold tabular-nums","in-progress"===a.status?"text-accent":"done"===a.status?"text-teal":"text-muted"),children:c?String(c).padStart(2,"0"):"··"}),(0,b.jsxs)("span",{className:"flex min-w-0 flex-1 flex-col gap-1",children:[(0,b.jsx)("span",{className:"line-clamp-2 text-[11px] font-semibold uppercase leading-snug tracking-wider text-txt",children:a.title}),d&&(0,b.jsx)("span",{className:"h-1 overflow-hidden rounded-full bg-border",children:(0,b.jsx)("span",{className:"block h-full rounded-full bg-teal",style:{width:`${d.done/d.total*100}%`}})})]})]})}var B=a.i(453161),C=a.i(156298),D=a.i(441852),E=a.i(661661),F=a.i(757061),G=a.i(866718),H=a.i(149350),I=a.i(107742),J=a.i(685698);let K=["planned","in-progress","done"],L="w-full rounded-md border border-border bg-bg px-3 py-2 text-sm text-txt focus:outline-hidden focus:ring-1 focus:ring-accent disabled:opacity-50",M="text-xs font-medium text-muted",N="font-mono text-[10px] uppercase tracking-widest text-muted";function O({item:a,onClose:c,...d}){return(0,b.jsx)(F.Sheet,{open:!!a,onOpenChange:a=>{a||c()},children:(0,b.jsx)(F.SheetContent,{className:"w-[480px] sm:max-w-[480px] gap-0 bg-surface border-border text-txt flex flex-col overflow-y-auto p-0",children:a&&(0,b.jsx)(P,{item:a,onClose:c,...d},a.id)})})}function P(a){let[d,e]=(0,c.useState)(!1);return d?(0,b.jsx)(R,{...a,onCancel:()=>e(!1)}):(0,b.jsx)(Q,{...a,onEdit:()=>e(!0)})}function Q({item:a,items:c,onClose:d,onAddFeature:e,onEditRaw:f,onSelect:i,tasksById:j,progressById:k,onEdit:m}){let n=null===a.parent,o=c.find(b=>b.id===a.parent),p=c.filter(b=>b.parent===a.id).sort((a,b)=>a.order-b.order),r=k[a.id],s=(0,t.localToday)(),{chats:y,showAbout:z}=(0,J.useChats)(),A=n?void 0:(0,I.chatFor)(y,{kind:"epic",id:a.id}),B=!n&&0===a.tasks.length&&!A;return(0,b.jsxs)("div",{className:"flex min-h-full flex-col",children:[(0,b.jsxs)("header",{className:(0,u.cn)("border-b border-border px-6 pb-5 pt-6","in-progress"===a.status&&"bg-[linear-gradient(180deg,rgb(var(--rgb-accent)/0.08),transparent)]"),children:[(0,b.jsx)(F.SheetDescription,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex items-center gap-1 pr-8 font-mono text-[11px] text-muted",children:[o&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("button",{type:"button",onClick:()=>i(o.id),className:"truncate hover:text-txt",children:o.title}),(0,b.jsx)(C.ChevronRight,{className:"h-3 w-3 shrink-0"})]}),(0,b.jsxs)("span",{className:"shrink-0",children:[a.id," · ",n?"horizon":"epic"]})]})}),(0,b.jsx)(F.SheetTitle,{className:"mt-2 text-xl font-semibold leading-tight text-txt",children:a.title}),(0,b.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-3",children:[(0,b.jsx)(w.StatusPill,{status:a.status}),(0,b.jsx)(x.AgentMark,{attach:{kind:"epic",id:a.id}}),(0,b.jsx)(w.DueChip,{due:a.due,state:(0,t.dueState)(a.due,a.status,s)})]}),r&&(0,b.jsxs)("div",{className:"mt-5 flex items-end gap-4",children:[(0,b.jsxs)("p",{className:"font-mono text-3xl font-semibold leading-none tabular-nums text-txt",children:[Math.round(r.done/r.total*100),(0,b.jsx)("span",{className:"text-base text-muted",children:"%"})]}),(0,b.jsxs)("div",{className:"flex-1 pb-1",children:[(0,b.jsxs)("p",{className:"mb-1.5 font-mono text-[10px] text-muted",children:[r.done," of ",r.total,n?"":" tasks"," done"]}),n?(0,b.jsx)("div",{className:"h-1.5 overflow-hidden rounded-full bg-border",children:(0,b.jsx)("div",{className:"h-full rounded-full bg-teal",style:{width:`${r.done/r.total*100}%`}})}):(0,b.jsx)(w.SegmentedProgress,{statuses:a.tasks.map(a=>j[a]?.status).filter(a=>!!a&&"cancelled"!==a)})]})]})]}),(0,b.jsxs)("div",{className:"flex flex-1 flex-col gap-6 px-6 py-5",children:[!n&&a.tasks.length>0&&(0,b.jsx)(S,{item:a,tasksById:j,onOpen:f}),n&&(0,b.jsxs)("section",{className:"flex flex-col gap-2",children:[(0,b.jsxs)("p",{className:N,children:["Epics · ",p.length]}),0===p.length&&(0,b.jsx)("p",{className:"text-sm text-muted",children:"No epics yet."}),(0,b.jsx)("ul",{className:"-mx-2 flex flex-col",children:p.map(a=>{let c=k[a.id];return(0,b.jsx)("li",{children:(0,b.jsxs)("button",{type:"button",onClick:()=>i(a.id),className:"flex w-full items-center gap-3 rounded-md px-2 py-2 text-left hover:bg-surface2",children:[(0,b.jsx)(w.StatusDot,{status:a.status}),(0,b.jsx)("span",{className:"shrink-0 font-mono text-[11px] text-muted",children:a.id}),(0,b.jsx)("span",{className:(0,u.cn)("min-w-0 flex-1 truncate text-sm","done"===a.status?"text-muted":"text-txt"),children:a.title}),c&&(0,b.jsxs)("span",{className:"shrink-0 font-mono text-[10px] text-muted",children:[c.done,"/",c.total]})]})},a.id)})})]}),(0,b.jsxs)("section",{className:"flex flex-col gap-2",children:[(0,b.jsx)("p",{className:N,children:"Brief"}),a.body.trim()?(0,b.jsx)(H.MarkdownRenderer,{content:a.body,className:"text-sm"}):(0,b.jsx)("p",{className:"text-sm text-muted",children:"No description. Edit to add the outcome, scope and “done when”."})]})]}),(0,b.jsxs)("footer",{className:"sticky bottom-0 flex flex-wrap items-center gap-2 border-t border-border bg-surface px-6 py-3",children:[B&&(0,b.jsxs)(q.Button,{size:"sm",onClick:()=>{d(),(0,v.askAgent)(`Break down epic ${a.id} into tasks.`)},className:"bg-accent text-white hover:bg-accent/90",children:[(0,b.jsx)(g.Bot,{})," Break down with agent"]}),!n&&(0,b.jsxs)(q.Button,{size:"sm",variant:B?"outline":"default",onClick:()=>{d(),z({kind:"epic",id:a.id})},className:(0,u.cn)(!B&&"bg-accent text-white hover:bg-accent/90"),children:[(0,b.jsx)(D.MessageSquare,{})," ",A?"Open chat":"Chat"]}),n&&(0,b.jsxs)(q.Button,{size:"sm",onClick:()=>e(a.id),className:"bg-accent text-white hover:bg-accent/90",children:[(0,b.jsx)(l.Plus,{})," Add epic"]}),(0,b.jsxs)(q.Button,{size:"sm",variant:"outline",onClick:m,children:[(0,b.jsx)(E.Pencil,{})," Edit"]}),(0,b.jsxs)(q.Button,{size:"sm",variant:"ghost",onClick:()=>f(a.file),className:"ml-auto text-muted hover:text-txt",children:[(0,b.jsx)(h.FileText,{})," Open file"]})]})]})}function R({item:a,items:d,onClose:e,onSave:f,onDelete:g,onCancel:h}){let[i]=(0,c.useState)(a),[j,k]=(0,c.useState)(a.title),[l,m]=(0,c.useState)(a.status),[n,o]=(0,c.useState)(a.parent??""),[p,r]=(0,c.useState)(String(a.order)),[s,t]=(0,c.useState)(a.tasks.join(", ")),[u,v]=(0,c.useState)(a.due??""),[w,x]=(0,c.useState)(a.body),[y,z]=(0,c.useState)(null),[A,B]=(0,c.useState)(!1),C=d.some(b=>b.parent===a.id),D=d.filter(b=>null===b.parent&&b.id!==a.id),E=null===a.parent,H=null!==a.parent&&!D.some(b=>b.id===a.parent);async function I(a){B(!0),z(null);let b=await a();return B(!1),b&&z(b),!b}async function J(){let b={},c=j.trim()||i.title;if(c!==i.title&&(b.title=c),l!==i.status&&(b.status=l),(n||null)!==i.parent&&(b.parent=n||null),p.trim()!==String(i.order)){let a=Number(p);if(""===p.trim()||!Number.isFinite(a))return void z("Order must be a number");b.order=a}let d=s.split(",").map(a=>a.trim()).filter(Boolean);(d.join(",")!==i.tasks.join(",")&&(b.tasks=d),(u||null)!==i.due&&(b.due=u||null),w!==i.body&&(b.body=w),0===Object.keys(b).length)?h():await I(()=>f(a.id,b))&&e()}async function N(){window.confirm(`Delete ${a.id}: ${a.title}?`)&&await I(()=>g(a.id))&&e()}return(0,b.jsxs)("div",{className:"flex min-h-full flex-col",children:[(0,b.jsxs)("div",{className:"border-b border-border px-6 pb-4 pt-6 pr-12",children:[(0,b.jsxs)(F.SheetDescription,{className:"font-mono text-[11px] text-muted",children:["Editing ",a.id," · ",E?"horizon":"epic"]}),(0,b.jsx)(F.SheetTitle,{className:"mt-1 text-base text-txt",children:a.title})]}),(0,b.jsxs)("div",{className:"flex flex-1 flex-col gap-4 px-6 py-5",children:[(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:M,children:"Title"}),(0,b.jsx)(G.Input,{value:j,onChange:a=>k(a.target.value),className:"bg-bg border-border text-txt"})]}),(0,b.jsxs)("div",{className:"grid grid-cols-3 gap-3",children:[(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:M,children:"Status"}),(0,b.jsx)("select",{value:l,onChange:a=>m(a.target.value),className:L,children:K.map(a=>(0,b.jsx)("option",{value:a,children:a},a))})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:M,children:"Parent"}),(0,b.jsxs)("select",{value:n,onChange:a=>o(a.target.value),disabled:C,title:C?"Items with children must stay on the spine":void 0,className:L,children:[(0,b.jsx)("option",{value:"",children:"— (horizon)"}),H&&(0,b.jsxs)("option",{value:a.parent??"",children:[a.parent," · missing"]}),D.map(a=>(0,b.jsxs)("option",{value:a.id,children:[a.id," · ",a.title]},a.id))]})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:M,children:"Order"}),(0,b.jsx)(G.Input,{type:"number",step:10,value:p,onChange:a=>r(a.target.value),title:E?"Position on the spine":"Position within the branch",className:"bg-bg border-border text-txt"})]})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:M,children:"Due"}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(G.Input,{type:"date",value:u,onChange:a=>v(a.target.value),className:"bg-bg border-border text-txt scheme-light dark:scheme-dark"}),u&&(0,b.jsx)("button",{type:"button",onClick:()=>v(""),className:"text-xs text-muted hover:text-txt",children:"Clear"})]})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:M,children:"Tasks"}),(0,b.jsx)(G.Input,{value:s,onChange:a=>t(a.target.value),placeholder:"T001, T012",className:"bg-bg border-border text-txt font-mono"})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:M,children:"Body (markdown)"}),(0,b.jsx)("textarea",{value:w,onChange:a=>x(a.target.value),rows:12,className:`${L} font-mono resize-y`})]}),y&&(0,b.jsx)("p",{className:"text-xs text-danger",children:y})]}),(0,b.jsxs)("footer",{className:"sticky bottom-0 flex items-center gap-2 border-t border-border bg-surface px-6 py-3",children:[(0,b.jsx)(q.Button,{size:"sm",onClick:J,disabled:A,className:"bg-accent text-white hover:bg-accent/90",children:"Save"}),(0,b.jsx)(q.Button,{size:"sm",variant:"ghost",onClick:h,disabled:A,className:"text-txt",children:"Cancel"}),(0,b.jsx)(q.Button,{size:"sm",variant:"ghost",onClick:N,disabled:A,className:"ml-auto text-danger hover:text-danger",children:"Delete"})]})]})}function S({item:a,tasksById:c,onOpen:d}){let e=(0,t.localToday)(),f=s(a,Object.values(c)),g="ready"===f.kind?f.taskId:null,h="waiting"===f.kind?[...f.waiting].sort((a,b)=>Number(c[b.taskId]?.status==="todo")-Number(c[a.taskId]?.status==="todo")).map(a=>a.reason):[];return(0,b.jsxs)("section",{className:"flex flex-col gap-2",children:[(0,b.jsxs)("p",{className:N,children:["Tasks · ",a.tasks.length]}),(0,b.jsx)("ul",{className:"-mx-2 flex flex-col",children:a.tasks.map(a=>{let f=c[a];if(!f)return(0,b.jsxs)("li",{className:"px-2 py-2 font-mono text-xs text-danger",children:[a," · missing task file"]},a);let h=f.id===g;return(0,b.jsxs)("li",{className:(0,u.cn)("group flex items-center rounded-md hover:bg-surface2",h&&"bg-accent/10 hover:bg-accent/15"),children:[(0,b.jsxs)("button",{type:"button",onClick:()=>d(f.file),className:"flex min-w-0 flex-1 items-center gap-3 px-2 py-2 text-left",children:[(0,b.jsx)("span",{title:f.status,className:(0,u.cn)("h-2 w-2 shrink-0 rounded-full",w.TASK_STATUS_BG[f.status])}),(0,b.jsx)("span",{className:"shrink-0 font-mono text-[11px] text-muted",children:f.id}),(0,b.jsx)("span",{className:(0,u.cn)("min-w-0 flex-1 truncate text-sm","cancelled"===f.status?"text-muted line-through":"done"===f.status?"text-muted":"text-txt"),children:f.title}),(0,b.jsx)(w.DueChip,{due:f.due,state:(0,t.dueState)(f.due,"done"===f.status?"done":"planned",e)}),h?(0,b.jsx)("span",{className:"shrink-0 font-mono text-[10px] uppercase tracking-wider text-accent",children:"Next up"}):f.size&&"—"!==f.size&&(0,b.jsx)("span",{className:"shrink-0 font-mono text-[10px] text-muted",children:f.size.split(" ")[0]}),(0,b.jsx)(x.AgentDot,{attach:{kind:"task",id:f.id}})]}),(0,b.jsx)(T,{taskId:f.id})]},a)})}),h.length>0&&(0,b.jsxs)("p",{className:"truncate text-xs text-muted",title:h.join("\n"),children:[h[0],h.length>1&&` (+${h.length-1} more)`]})]})}function T({taskId:a}){let{chats:c,showAbout:d}=(0,J.useChats)(),e=!!(0,I.chatFor)(c,{kind:"task",id:a});return(0,b.jsx)("button",{type:"button",onClick:()=>d({kind:"task",id:a}),"aria-label":`${e?"Open chat":"Chat"} about ${a}`,title:e?`Open the chat about ${a}`:`Chat about ${a}`,className:(0,u.cn)("mr-1 grid size-7 shrink-0 place-items-center rounded-md text-muted transition-[opacity,color] duration-(--duration-fast) hover:bg-surface hover:text-accent focus-visible:opacity-100",e?"text-accent opacity-100":"opacity-0 group-hover:opacity-100"),children:(0,b.jsx)(D.MessageSquare,{className:"size-3.5"})})}var U=a.i(814574);function V({open:a,heading:d,onOpenChange:e,onSubmit:f}){let[g,h]=(0,c.useState)(""),[i,j]=(0,c.useState)(null),[k,l]=(0,c.useState)(!1);function m(a){a||(h(""),j(null)),e(a)}async function n(a){if(a.preventDefault(),!g.trim())return;l(!0);let b=await f(g.trim());l(!1),b?j(b):m(!1)}return(0,b.jsx)(U.Dialog,{open:a,onOpenChange:m,children:(0,b.jsxs)(U.DialogContent,{className:"max-w-sm bg-surface border-border text-txt",children:[(0,b.jsx)(U.DialogTitle,{className:"text-sm font-semibold text-txt",children:d}),(0,b.jsxs)("form",{onSubmit:n,className:"flex flex-col gap-3",children:[(0,b.jsx)(G.Input,{autoFocus:!0,value:g,onChange:a=>h(a.target.value),placeholder:"Title",className:"bg-bg border-border text-txt"}),i&&(0,b.jsx)("p",{className:"text-xs text-danger",children:i}),(0,b.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,b.jsx)(q.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>m(!1),children:"Cancel"}),(0,b.jsx)(q.Button,{type:"submit",size:"sm",disabled:k||!g.trim(),className:"bg-accent text-white hover:bg-accent/90",children:"Create"})]})]})]})})}function W({open:a,onOpenChange:d}){let[e,f]=(0,c.useState)("");return(0,b.jsx)(U.Dialog,{open:a,onOpenChange:d,children:(0,b.jsxs)(U.DialogContent,{className:"max-w-lg bg-surface border-border text-txt",children:[(0,b.jsx)(U.DialogTitle,{className:"text-sm font-semibold text-txt",children:"Plan from spec"}),(0,b.jsxs)("form",{onSubmit:function(a){a.preventDefault(),e.trim()&&(d(!1),(0,v.askAgent)(`Break down this spec into tasks:
|
|
1
|
+
module.exports=[690793,a=>{"use strict";var b=a.i(662145),c=a.i(174897),d=a.i(365465),e=a.i(152716),f=a.i(340933),g=a.i(795667),h=a.i(926128),i=a.i(553415),j=a.i(200382),k=a.i(551729),l=a.i(913975),m=a.i(544394),n=a.i(21215),o=a.i(699570);let p=a=>"done"===a||"cancelled"===a;function q(a,b){let c=new Map(b.map(a=>[a.id,a])),d=a.tasks.map(a=>c.get(a)).filter(a=>!!a),e=a=>[...new Set((a.dependsOn.match(/\bT\d+\b/gi)??[]).map(a=>a.toUpperCase()))].filter(a=>{let b=c.get(a);return!b||!p(b.status)});for(let a of d)if("todo"===a.status&&!e(a).length)return{kind:"ready",taskId:a.id};if(d.every(a=>p(a.status)))return{kind:"finished"};let f=new Set(a.tasks),g=new Map,h=a=>{if(g.has(a))return g.get(a)??!1;g.set(a,!1);let b=c.get(a),d=!!b&&"blocked"!==b.status&&"paused"!==b.status&&"review"!==b.status&&("todo"!==b.status||f.has(a)&&e(b).every(h));return g.set(a,d),d},i=[];for(let b of a.tasks){let a=c.get(b);if(a){if("in-progress"===a.status)i.push({taskId:b,reason:`${b} is in progress (claimed)`});else if("blocked"===a.status)i.push({taskId:b,reason:`${b} is blocked`});else if("paused"===a.status)i.push({taskId:b,reason:`${b} is paused — needs a human to resume it`});else if("review"===a.status)i.push({taskId:b,reason:`${b} in review — needs a human`});else if("todo"===a.status){let d=e(a).map(a=>`${a} (${c.get(a)?.status??"missing"})`);i.push({taskId:b,reason:`${b} waits on ${d.join(", ")}`})}}else i.push({taskId:b,reason:`${b} has no task file`})}return{kind:"waiting",waiting:i,needsHuman:i.every(a=>!h(a.taskId))}}var r=a.i(452696),s=a.i(368114),t=a.i(525395),u=a.i(618940),v=a.i(815122),w=a.i(581040);function x({items:a,today:d,onSelect:e,onItemContextMenu:f,progressById:g}){let h=new Map(a.filter(a=>null===a.parent).sort((a,b)=>a.order-b.order).map((a,b)=>[a.id,b+1])),i=(0,c.useMemo)(()=>(0,w.buildTimeline)(a,d),[a,d]),j=(0,c.useRef)(null);(0,c.useEffect)(()=>{let a=j.current;a&&(a.scrollLeft=Math.max(0,i.todayX-(a.clientWidth-200)/3))},[i.todayX]);let k=i.lanes.some(a=>a.markers.length>0);return(0,b.jsxs)("div",{className:"flex flex-1 min-h-0 flex-col",children:[(0,b.jsx)("div",{ref:j,className:"relative flex-1 min-h-0 overflow-auto",children:(0,b.jsxs)("div",{className:"relative",style:{width:200+i.width,minHeight:"100%"},children:[(0,b.jsxs)("div",{className:"pointer-events-none absolute inset-y-0",style:{left:200,width:i.width},children:[i.months.map(a=>(0,b.jsx)("div",{className:"absolute inset-y-0 border-l border-border",style:{left:a.x}},a.x)),(0,b.jsx)("div",{className:"absolute inset-y-0 left-0 bg-surface/50",style:{width:i.todayX}}),(0,b.jsx)("div",{className:"absolute inset-y-0 w-px bg-accent shadow-[0_0_12px_rgb(var(--rgb-accent)/0.8)]",style:{left:i.todayX},children:(0,b.jsx)("span",{className:"absolute -translate-x-1/2 rounded-full bg-accent px-2 py-0.5 font-mono text-[10px] uppercase tracking-wider text-accent-fg",style:{top:42},children:"Today"})})]}),(0,b.jsxs)("div",{className:"sticky top-0 z-20 flex border-b border-border bg-bg",style:{height:36},children:[(0,b.jsx)("div",{className:"sticky left-0 z-10 shrink-0 bg-bg",style:{width:200}}),(0,b.jsx)("div",{className:"relative",children:i.months.map(a=>(0,b.jsx)("span",{className:"absolute top-3 whitespace-nowrap pl-2 font-mono text-[10px] uppercase tracking-widest text-muted",style:{left:a.x},children:a.label},a.x))})]}),i.lanes.map(a=>(0,b.jsxs)("div",{className:"relative flex border-b border-border",children:[(0,b.jsx)(y,{item:a.item,chapter:h.get(a.item.id),progress:g[a.item.id],onSelect:e,onContextMenu:f}),(0,b.jsx)("div",{className:"relative",style:{width:i.width,height:a.rows*w.LANE_ROW_H+12},children:a.markers.map(a=>(0,b.jsxs)("button",{type:"button",onClick:()=>e(a.item.id),onContextMenu:b=>f?.(a.item.id,b),title:`${a.item.id} \xb7 ${a.item.title} \xb7 due ${a.item.due}${"overdue"===a.state?" (overdue)":""}`,className:"group absolute flex items-center gap-1.5",style:{left:a.x-10,top:6+a.row*w.LANE_ROW_H},children:[a.horizon?(0,b.jsx)("span",{className:(0,s.cn)("h-4 w-4 rotate-45 border-2 border-accent","done"===a.item.status?"bg-accent":"bg-bg","overdue"===a.state&&"border-danger")}):(0,b.jsx)("span",{className:(0,s.cn)("rounded-full","overdue"===a.state&&"ring-2 ring-danger ring-offset-1 ring-offset-bg"),children:(0,b.jsx)(u.StatusDot,{status:a.item.status})}),(0,b.jsxs)("span",{className:(0,s.cn)("flex max-w-[150px] flex-col rounded-md border px-2 py-0.5 text-left transition-colors","in-progress"===a.item.status?"border-accent/50 bg-surface shadow-[0_6px_18px_-10px_rgb(var(--rgb-accent)/0.7)]":"done"===a.item.status?"border-border bg-surface/60":"border-dashed border-border2 bg-bg","group-hover:border-accent"),children:[(0,b.jsxs)("span",{className:"flex items-center gap-1",children:[(0,b.jsx)("span",{className:(0,s.cn)("truncate text-xs","done"===a.item.status?"text-muted":"text-txt",a.horizon&&"font-semibold"),children:a.item.title}),(0,b.jsx)(v.AgentDot,{attach:{kind:"epic",id:a.item.id}})]}),(0,b.jsx)("span",{className:(0,s.cn)("font-mono text-[10px]","overdue"===a.state?"text-danger":"soon"===a.state?"text-amber":"text-muted"),children:(0,w.formatDay)(a.item.due)})]})]},a.item.id))})]},a.item.id)),!k&&(0,b.jsx)("p",{className:"px-6 py-8 text-sm text-muted",style:{marginLeft:200},children:"No due dates yet — open an item and set a Due date."})]})}),i.undated.length>0&&(0,b.jsxs)("div",{className:"max-h-28 shrink-0 overflow-y-auto border-t border-border bg-surface px-4 py-2",children:[(0,b.jsxs)("p",{className:"mb-2 font-mono text-[10px] uppercase tracking-widest text-muted",children:["No due date · ",i.undated.length]}),(0,b.jsx)("div",{className:"flex flex-wrap gap-1.5",children:i.undated.map(a=>(0,b.jsxs)("button",{type:"button",onClick:()=>e(a.id),onContextMenu:b=>f?.(a.id,b),className:"flex items-center gap-1 rounded-md border border-border px-1.5 py-0.5 text-xs text-muted hover:border-accent hover:text-txt",children:[(0,b.jsx)(u.StatusDot,{status:a.status}),a.title,(0,b.jsx)(v.AgentDot,{attach:{kind:"epic",id:a.id}})]},a.id))})]})]})}function y({item:a,chapter:c,progress:d,onSelect:e,onContextMenu:f}){return(0,b.jsxs)("button",{type:"button",onClick:()=>e(a.id),onContextMenu:b=>f?.(a.id,b),className:"sticky left-0 z-10 flex shrink-0 items-center gap-3 border-r border-border bg-surface px-3 text-left hover:bg-surface2",style:{width:200},children:[(0,b.jsx)("span",{className:(0,s.cn)("font-mono text-lg font-semibold tabular-nums","in-progress"===a.status?"text-accent":"done"===a.status?"text-teal":"text-muted"),children:c?String(c).padStart(2,"0"):"··"}),(0,b.jsxs)("span",{className:"flex min-w-0 flex-1 flex-col gap-1",children:[(0,b.jsx)("span",{className:"line-clamp-2 text-[11px] font-semibold uppercase leading-snug tracking-wider text-txt",children:a.title}),d&&(0,b.jsx)("span",{className:"h-1 overflow-hidden rounded-full bg-border",children:(0,b.jsx)("span",{className:"block h-full rounded-full bg-teal",style:{width:`${d.done/d.total*100}%`}})})]})]})}var z=a.i(453161),A=a.i(156298),B=a.i(441852),C=a.i(661661),D=a.i(757061),E=a.i(866718),F=a.i(149350),G=a.i(107742),H=a.i(685698),I=a.i(60084),J=a.i(717143),K=a.i(763747),L=a.i(28386),M=a.i(335732),N=a.i(890728);let O=["planned","in-progress","paused","done"];function P({item:a,items:c,actions:d}){let e=null===a.parent,f=c.filter(b=>null===b.parent&&b.id!==a.parent).sort((a,b)=>a.order-b.order),g=c.filter(b=>b.parent===a.id).length;return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.edit(a.id),children:[(0,b.jsx)(C.Pencil,{})," Edit",(0,b.jsx)(M.DropdownMenuShortcut,{children:(0,N.itemKeyLabel)("edit")})]}),(0,b.jsxs)(M.DropdownMenuSub,{children:[(0,b.jsxs)(M.DropdownMenuSubTrigger,{children:[(0,b.jsx)(u.StatusDot,{status:a.status})," Status",(0,b.jsx)(M.DropdownMenuShortcut,{children:(0,N.itemKeyLabel)("status")})]}),(0,b.jsx)(M.DropdownMenuSubContent,{children:O.map(c=>(0,b.jsxs)(M.DropdownMenuItem,{disabled:c===a.status,onSelect:()=>d.setStatus(a.id,c),children:[(0,b.jsx)(u.StatusDot,{status:c})," ",u.STATUS_LABEL[c]]},c))})]}),!e&&f.length>0&&(0,b.jsxs)(M.DropdownMenuSub,{children:[(0,b.jsxs)(M.DropdownMenuSubTrigger,{children:[(0,b.jsx)(J.FolderInput,{})," Move to horizon"]}),(0,b.jsx)(M.DropdownMenuSubContent,{className:"max-h-72 overflow-y-auto",children:f.map(c=>(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.move(a.id,c.id),children:[(0,b.jsx)("span",{className:"font-mono text-[11px] text-muted",children:c.id})," ",c.title]},c.id))})]}),e&&(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.addEpic(a.id),children:[(0,b.jsx)(j.Plus,{})," Add epic"]}),(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.duplicate(a.id),children:[(0,b.jsx)(I.Copy,{})," Duplicate",(0,b.jsx)(M.DropdownMenuShortcut,{children:(0,N.itemKeyLabel)("duplicate")})]}),(0,b.jsx)(M.DropdownMenuSeparator,{}),!e&&(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.chat(a.id),children:[(0,b.jsx)(B.MessageSquare,{})," Chat about it",(0,b.jsx)(M.DropdownMenuShortcut,{children:(0,N.itemKeyLabel)("chat")})]}),(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.openFile(a.file),children:[(0,b.jsx)(h.FileText,{})," Open file"]}),(0,b.jsx)(M.DropdownMenuSeparator,{}),g>0?(0,b.jsxs)(M.DropdownMenuItem,{disabled:!0,className:"flex-col items-start gap-0",children:[(0,b.jsxs)("span",{className:"flex items-center gap-2",children:[(0,b.jsx)(L.Trash2,{})," Delete"]}),(0,b.jsxs)("span",{className:"pl-6 text-[11px]",children:["Move or delete its ",g," epic",1===g?"":"s"," first"]})]}):(0,b.jsxs)(M.DropdownMenuItem,{onSelect:()=>d.remove(a.id),className:"text-danger focus:text-danger",children:[(0,b.jsx)(L.Trash2,{})," Delete",(0,b.jsx)(M.DropdownMenuShortcut,{children:(0,N.itemKeyLabel)("remove")})]})]})}function Q({item:a,items:c,actions:d,className:e,open:f,onOpenChange:g}){return(0,b.jsxs)(M.DropdownMenu,{open:f,onOpenChange:g,children:[(0,b.jsx)(M.DropdownMenuTrigger,{asChild:!0,children:(0,b.jsx)("button",{type:"button","aria-label":`Actions for ${a.id}`,className:(0,s.cn)("grid size-7 place-items-center rounded-md text-muted hover:bg-surface2 hover:text-txt",e),children:(0,b.jsx)(K.MoreHorizontal,{className:"size-4"})})}),(0,b.jsx)(M.DropdownMenuContent,{align:"end",className:"w-52",children:(0,b.jsx)(P,{item:a,items:c,actions:d})})]})}function R({at:a,items:c,actions:d,onClose:e}){let f=a&&c.find(b=>b.id===a.id);return a&&f?(0,b.jsxs)(M.DropdownMenu,{open:!0,onOpenChange:a=>{a||e()},children:[(0,b.jsx)(M.DropdownMenuTrigger,{asChild:!0,children:(0,b.jsx)("span",{"aria-hidden":!0,className:"pointer-events-none fixed size-0",style:{left:a.x,top:a.y}})}),(0,b.jsx)(M.DropdownMenuContent,{align:"start",className:"w-52",children:(0,b.jsx)(P,{item:f,items:c,actions:d})})]},`${a.id}:${a.x}:${a.y}`):null}var S=a.i(813722),T=a.i(192698),U=a.i(787714),V=a.i(269769);let W=["planned","in-progress","paused","done"],X="w-full rounded-md border border-border bg-bg px-3 py-2 text-sm text-txt focus:outline-hidden focus:ring-1 focus:ring-accent disabled:opacity-50",Y="text-xs font-medium text-muted",Z="font-mono text-[10px] uppercase tracking-widest text-muted";function $({item:a,onClose:c,...d}){return(0,b.jsx)(D.Sheet,{open:!!a,onOpenChange:a=>{a||c()},children:(0,b.jsx)(D.SheetContent,{className:"w-[480px] sm:max-w-[480px] gap-0 bg-surface border-border text-txt flex flex-col overflow-y-auto p-0",children:a&&(0,b.jsx)(_,{item:a,onClose:c,...d},a.id)})})}function _(a){return a.editing?(0,b.jsx)(ab,{...a,onCancel:()=>a.onEditingChange(!1)}):(0,b.jsx)(aa,{...a,onEdit:()=>a.onEditingChange(!0)})}function aa({item:a,items:d,onClose:e,onAddFeature:f,onEditRaw:i,onSelect:k,tasksById:l,progressById:m,onEdit:n,actions:p,onSave:q}){let w=null===a.parent,x=d.find(b=>b.id===a.parent),y=d.filter(b=>b.parent===a.id).sort((a,b)=>a.order-b.order),z=m[a.id],E=(0,r.localToday)(),{chats:I,showAbout:J}=(0,H.useChats)(),K=w?void 0:(0,G.chatFor)(I,{kind:"epic",id:a.id}),L=!w&&0===a.tasks.length&&!K,[M,O]=(0,c.useState)(!1),P=b=>{q(a.id,b).then(a=>{a&&(0,V.toast)(a)})};return(0,N.useItemCommands)(`${a.id} \xb7 ${a.title}`,[{action:"edit",label:"Edit",run:n},{action:"status",label:"Change status…",run:()=>O(!0)},{action:"duplicate",label:"Duplicate",run:()=>p.duplicate(a.id)},...w?[]:[{action:"chat",label:"Chat about it",run:()=>p.chat(a.id)}],...y.length?[]:[{action:"remove",label:"Delete",run:()=>p.remove(a.id)}]]),(0,b.jsxs)("div",{className:"flex min-h-full flex-col",children:[(0,b.jsx)(T.ItemPanelHeader,{className:(0,s.cn)("px-6","in-progress"===a.status&&"bg-[linear-gradient(180deg,rgb(var(--rgb-accent)/0.08),transparent)]"),kicker:(0,b.jsx)(D.SheetDescription,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex min-w-0 items-center gap-1",children:[x&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("button",{type:"button",onClick:()=>k(x.id),className:"truncate hover:text-txt",children:x.title}),(0,b.jsx)(A.ChevronRight,{className:"h-3 w-3 shrink-0"})]}),(0,b.jsxs)("span",{className:"shrink-0",children:[a.id," · ",w?"horizon":"epic"]}),(0,b.jsx)(v.AgentMark,{attach:{kind:"epic",id:a.id}})]})}),title:(0,b.jsx)(D.SheetTitle,{className:"text-xl font-semibold leading-tight text-txt",children:a.title}),menu:(0,b.jsx)(Q,{item:a,items:d,actions:p,open:M,onOpenChange:O}),properties:[{label:"Status",value:(0,b.jsx)(U.InlineSelect,{label:`Status of ${a.id}`,value:a.status,onChange:b=>p.setStatus(a.id,b),options:W.map(a=>({value:a,label:u.STATUS_LABEL[a],node:(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(u.StatusDot,{status:a}),u.STATUS_LABEL[a]]})})),children:(0,b.jsx)(u.StatusPill,{status:a.status})})},{label:"Owner",value:(0,b.jsx)(U.InlineSelect,{label:`Owner of ${a.id}`,value:a.owner??"",onChange:a=>P({owner:a||null}),options:[{value:"human",label:"Human",node:(0,b.jsx)(S.OwnerChip,{owner:"human",className:"text-xs"})},...[...new Set(["ai:claude",...a.owner?.startsWith("ai:")?[a.owner]:[]])].map(a=>({value:a,label:a,node:(0,b.jsx)(S.OwnerChip,{owner:a,className:"text-xs"})})),{value:"",label:"No owner",node:(0,b.jsx)("span",{className:"text-muted",children:"No owner"})}],children:a.owner?(0,b.jsx)(S.OwnerChip,{owner:a.owner,className:"text-xs"}):(0,b.jsx)("span",{className:"text-muted",children:"—"})})},{label:"Due",value:(0,b.jsx)(U.InlineDate,{label:`Due date of ${a.id}`,value:a.due,onChange:a=>P({due:a}),children:a.due?(0,b.jsx)(u.DueChip,{due:a.due,state:(0,r.dueState)(a.due,a.status,E)}):(0,b.jsx)("span",{className:"text-muted",children:"—"})})},{label:w?"Epics":"Tasks",value:(0,b.jsx)("span",{className:"font-mono",children:w?y.length:a.tasks.length})}],children:z&&(0,b.jsxs)("div",{className:"mt-2 flex items-end gap-4",children:[(0,b.jsxs)("p",{className:"font-mono text-3xl font-semibold leading-none tabular-nums text-txt",children:[Math.round(z.done/z.total*100),(0,b.jsx)("span",{className:"text-base text-muted",children:"%"})]}),(0,b.jsxs)("div",{className:"flex-1 pb-1",children:[(0,b.jsxs)("p",{className:"mb-1.5 font-mono text-[10px] text-muted",children:[z.done," of ",z.total,w?"":" tasks"," done"]}),w?(0,b.jsx)("div",{className:"h-1.5 overflow-hidden rounded-full bg-border",children:(0,b.jsx)("div",{className:"h-full rounded-full bg-teal",style:{width:`${z.done/z.total*100}%`}})}):(0,b.jsx)(u.SegmentedProgress,{statuses:a.tasks.map(a=>l[a]?.status).filter(a=>!!a&&"cancelled"!==a)})]})]})}),(0,b.jsxs)("div",{className:"flex flex-1 flex-col gap-6 px-6 py-5",children:[!w&&a.tasks.length>0&&(0,b.jsx)(ac,{item:a,tasksById:l,onOpen:i}),w&&(0,b.jsxs)("section",{className:"flex flex-col gap-2",children:[(0,b.jsxs)("p",{className:Z,children:["Epics · ",y.length]}),0===y.length&&(0,b.jsx)("p",{className:"text-sm text-muted",children:"No epics yet."}),(0,b.jsx)("ul",{className:"-mx-2 flex flex-col",children:y.map(a=>{let c=m[a.id];return(0,b.jsx)("li",{children:(0,b.jsxs)("button",{type:"button",onClick:()=>k(a.id),className:"flex w-full items-center gap-3 rounded-md px-2 py-2 text-left hover:bg-surface2",children:[(0,b.jsx)(u.StatusDot,{status:a.status}),(0,b.jsx)("span",{className:"shrink-0 font-mono text-[11px] text-muted",children:a.id}),(0,b.jsx)("span",{className:(0,s.cn)("min-w-0 flex-1 truncate text-sm","done"===a.status?"text-muted":"text-txt"),children:a.title}),c&&(0,b.jsxs)("span",{className:"shrink-0 font-mono text-[10px] text-muted",children:[c.done,"/",c.total]})]})},a.id)})})]}),(0,b.jsxs)("section",{className:"flex flex-col gap-2",children:[(0,b.jsx)("p",{className:Z,children:"Brief"}),a.body.trim()?(0,b.jsx)(F.MarkdownRenderer,{content:a.body,className:"text-sm"}):(0,b.jsx)("p",{className:"text-sm text-muted",children:"No description. Edit to add the outcome, scope and “done when”."})]})]}),(0,b.jsxs)("footer",{className:"sticky bottom-0 flex flex-wrap items-center gap-2 border-t border-border bg-surface px-6 py-3",children:[L&&(0,b.jsxs)(o.Button,{size:"sm",onClick:()=>{e(),(0,t.askAgent)(`Break down epic ${a.id} into tasks.`)},className:"bg-accent text-accent-fg hover:bg-accent/90",children:[(0,b.jsx)(g.Bot,{})," Break down with agent"]}),!w&&(0,b.jsxs)(o.Button,{size:"sm",variant:L?"outline":"default",onClick:()=>{e(),J({kind:"epic",id:a.id})},className:(0,s.cn)(!L&&"bg-accent text-accent-fg hover:bg-accent/90"),children:[(0,b.jsx)(B.MessageSquare,{})," ",K?"Open chat":"Chat"]}),w&&(0,b.jsxs)(o.Button,{size:"sm",onClick:()=>f(a.id),className:"bg-accent text-accent-fg hover:bg-accent/90",children:[(0,b.jsx)(j.Plus,{})," Add epic"]}),(0,b.jsxs)(o.Button,{size:"sm",variant:"outline",onClick:n,children:[(0,b.jsx)(C.Pencil,{})," Edit"]}),(0,b.jsxs)(o.Button,{size:"sm",variant:"ghost",onClick:()=>i(a.file),className:"ml-auto text-muted hover:text-txt",children:[(0,b.jsx)(h.FileText,{})," Open file"]})]})]})}function ab({item:a,items:d,onClose:e,onSave:f,onDelete:g,onCancel:h}){let[i]=(0,c.useState)(a),[j,k]=(0,c.useState)(a.title),[l,m]=(0,c.useState)(a.status),[n,p]=(0,c.useState)(a.parent??""),[q,r]=(0,c.useState)(String(a.order)),[s,t]=(0,c.useState)(a.tasks.join(", ")),[u,v]=(0,c.useState)(a.due??""),[w,x]=(0,c.useState)(a.body),[y,z]=(0,c.useState)(null),[A,B]=(0,c.useState)(!1),C=d.some(b=>b.parent===a.id),F=d.filter(b=>null===b.parent&&b.id!==a.id),G=null===a.parent,H=null!==a.parent&&!F.some(b=>b.id===a.parent);async function I(a){B(!0),z(null);let b=await a();return B(!1),b&&z(b),!b}async function J(){let b={},c=j.trim()||i.title;if(c!==i.title&&(b.title=c),l!==i.status&&(b.status=l),(n||null)!==i.parent&&(b.parent=n||null),q.trim()!==String(i.order)){let a=Number(q);if(""===q.trim()||!Number.isFinite(a))return void z("Order must be a number");b.order=a}let d=s.split(",").map(a=>a.trim()).filter(Boolean);(d.join(",")!==i.tasks.join(",")&&(b.tasks=d),(u||null)!==i.due&&(b.due=u||null),w!==i.body&&(b.body=w),0===Object.keys(b).length)?h():await I(()=>f(a.id,b))&&e()}async function K(){await I(()=>g(a.id))&&e()}return(0,b.jsxs)("div",{className:"flex min-h-full flex-col",children:[(0,b.jsxs)("div",{className:"border-b border-border px-6 pb-4 pt-6 pr-12",children:[(0,b.jsxs)(D.SheetDescription,{className:"font-mono text-[11px] text-muted",children:["Editing ",a.id," · ",G?"horizon":"epic"]}),(0,b.jsx)(D.SheetTitle,{className:"mt-1 text-base text-txt",children:a.title})]}),(0,b.jsxs)("div",{className:"flex flex-1 flex-col gap-4 px-6 py-5",children:[(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:Y,children:"Title"}),(0,b.jsx)(E.Input,{value:j,onChange:a=>k(a.target.value),className:"bg-bg border-border text-txt"})]}),(0,b.jsxs)("div",{className:"grid grid-cols-3 gap-3",children:[(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:Y,children:"Status"}),(0,b.jsx)("select",{value:l,onChange:a=>m(a.target.value),className:X,children:W.map(a=>(0,b.jsx)("option",{value:a,children:a},a))})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:Y,children:"Parent"}),(0,b.jsxs)("select",{value:n,onChange:a=>p(a.target.value),disabled:C,title:C?"Items with children must stay on the spine":void 0,className:X,children:[(0,b.jsx)("option",{value:"",children:"— (horizon)"}),H&&(0,b.jsxs)("option",{value:a.parent??"",children:[a.parent," · missing"]}),F.map(a=>(0,b.jsxs)("option",{value:a.id,children:[a.id," · ",a.title]},a.id))]})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:Y,children:"Order"}),(0,b.jsx)(E.Input,{type:"number",step:10,value:q,onChange:a=>r(a.target.value),title:G?"Position on the spine":"Position within the branch",className:"bg-bg border-border text-txt"})]})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:Y,children:"Due"}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(E.Input,{type:"date",value:u,onChange:a=>v(a.target.value),className:"bg-bg border-border text-txt scheme-light dark:scheme-dark"}),u&&(0,b.jsx)("button",{type:"button",onClick:()=>v(""),className:"text-xs text-muted hover:text-txt",children:"Clear"})]})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:Y,children:"Tasks"}),(0,b.jsx)(E.Input,{value:s,onChange:a=>t(a.target.value),placeholder:"T001, T012",className:"bg-bg border-border text-txt font-mono"})]}),(0,b.jsxs)("label",{className:"flex flex-col gap-1",children:[(0,b.jsx)("span",{className:Y,children:"Body (markdown)"}),(0,b.jsx)("textarea",{value:w,onChange:a=>x(a.target.value),rows:12,className:`${X} font-mono resize-y`})]}),y&&(0,b.jsx)("p",{className:"text-xs text-danger",children:y})]}),(0,b.jsxs)("footer",{className:"sticky bottom-0 flex items-center gap-2 border-t border-border bg-surface px-6 py-3",children:[(0,b.jsx)(o.Button,{size:"sm",onClick:J,disabled:A,className:"bg-accent text-accent-fg hover:bg-accent/90",children:"Save"}),(0,b.jsx)(o.Button,{size:"sm",variant:"ghost",onClick:h,disabled:A,className:"text-txt",children:"Cancel"}),(0,b.jsx)(o.Button,{size:"sm",variant:"ghost",onClick:K,disabled:A,className:"ml-auto text-danger hover:text-danger",children:"Delete"})]})]})}function ac({item:a,tasksById:c,onOpen:d}){let e=(0,r.localToday)(),f=q(a,Object.values(c)),g="ready"===f.kind?f.taskId:null,h="waiting"===f.kind?[...f.waiting].sort((a,b)=>Number(c[b.taskId]?.status==="todo")-Number(c[a.taskId]?.status==="todo")).map(a=>a.reason):[];return(0,b.jsxs)("section",{className:"flex flex-col gap-2",children:[(0,b.jsxs)("p",{className:Z,children:["Tasks · ",a.tasks.length]}),(0,b.jsx)("ul",{className:"-mx-2 flex flex-col",children:a.tasks.map(a=>{let f=c[a];if(!f)return(0,b.jsxs)("li",{className:"px-2 py-2 font-mono text-xs text-danger",children:[a," · missing task file"]},a);let h=f.id===g;return(0,b.jsxs)("li",{className:(0,s.cn)("group flex items-center rounded-md hover:bg-surface2",h&&"bg-accent/10 hover:bg-accent/15"),children:[(0,b.jsxs)("button",{type:"button",onClick:()=>d(f.file),className:"flex min-w-0 flex-1 items-center gap-3 px-2 py-2 text-left",children:[(0,b.jsx)("span",{title:f.status,className:(0,s.cn)("h-2 w-2 shrink-0 rounded-full",u.TASK_STATUS_BG[f.status])}),(0,b.jsx)("span",{className:"shrink-0 font-mono text-[11px] text-muted",children:f.id}),(0,b.jsx)("span",{className:(0,s.cn)("min-w-0 flex-1 truncate text-sm","cancelled"===f.status?"text-muted line-through":"done"===f.status?"text-muted":"text-txt"),children:f.title}),(0,b.jsx)(u.DueChip,{due:f.due,state:(0,r.dueState)(f.due,"done"===f.status?"done":"planned",e)}),h?(0,b.jsx)("span",{className:"shrink-0 font-mono text-[10px] uppercase tracking-wider text-accent",children:"Next up"}):f.size&&"—"!==f.size&&(0,b.jsx)("span",{className:"shrink-0 font-mono text-[10px] text-muted",children:f.size.split(" ")[0]}),(0,b.jsx)(v.AgentDot,{attach:{kind:"task",id:f.id}})]}),(0,b.jsx)(ad,{taskId:f.id})]},a)})}),h.length>0&&(0,b.jsxs)("p",{className:"truncate text-xs text-muted",title:h.join("\n"),children:[h[0],h.length>1&&` (+${h.length-1} more)`]})]})}function ad({taskId:a}){let{chats:c,showAbout:d}=(0,H.useChats)(),e=!!(0,G.chatFor)(c,{kind:"task",id:a});return(0,b.jsx)("button",{type:"button",onClick:()=>d({kind:"task",id:a}),"aria-label":`${e?"Open chat":"Chat"} about ${a}`,title:e?`Open the chat about ${a}`:`Chat about ${a}`,className:(0,s.cn)("mr-1 grid size-7 shrink-0 place-items-center rounded-md text-muted transition-[opacity,color] duration-(--duration-fast) hover:bg-surface hover:text-accent focus-visible:opacity-100",e?"text-accent opacity-100":"opacity-0 group-hover:opacity-100"),children:(0,b.jsx)(B.MessageSquare,{className:"size-3.5"})})}var ae=a.i(814574);function af({open:a,heading:d,onOpenChange:e,onSubmit:f}){let[g,h]=(0,c.useState)(""),[i,j]=(0,c.useState)(null),[k,l]=(0,c.useState)(!1);function m(a){a||(h(""),j(null)),e(a)}async function n(a){if(a.preventDefault(),!g.trim())return;l(!0);let b=await f(g.trim());l(!1),b?j(b):m(!1)}return(0,b.jsx)(ae.Dialog,{open:a,onOpenChange:m,children:(0,b.jsxs)(ae.DialogContent,{className:"max-w-sm bg-surface border-border text-txt",children:[(0,b.jsx)(ae.DialogTitle,{className:"text-sm font-semibold text-txt",children:d}),(0,b.jsxs)("form",{onSubmit:n,className:"flex flex-col gap-3",children:[(0,b.jsx)(E.Input,{autoFocus:!0,value:g,onChange:a=>h(a.target.value),placeholder:"Title",className:"bg-bg border-border text-txt"}),i&&(0,b.jsx)("p",{className:"text-xs text-danger",children:i}),(0,b.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,b.jsx)(o.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>m(!1),children:"Cancel"}),(0,b.jsx)(o.Button,{type:"submit",size:"sm",disabled:k||!g.trim(),className:"bg-accent text-accent-fg hover:bg-accent/90",children:"Create"})]})]})]})})}function ag({open:a,onOpenChange:d}){let[e,f]=(0,c.useState)("");return(0,b.jsx)(ae.Dialog,{open:a,onOpenChange:d,children:(0,b.jsxs)(ae.DialogContent,{className:"max-w-lg bg-surface border-border text-txt",children:[(0,b.jsx)(ae.DialogTitle,{className:"text-sm font-semibold text-txt",children:"Plan from spec"}),(0,b.jsxs)("form",{onSubmit:function(a){a.preventDefault(),e.trim()&&(d(!1),(0,t.askAgent)(`Break down this spec into tasks:
|
|
2
2
|
|
|
3
|
-
${e.trim()}`))},className:"flex flex-col gap-3",children:[(0,b.jsx)("textarea",{autoFocus:!0,value:e,onChange:a=>f(a.target.value),placeholder:"Paste a feature spec…",rows:12,className:"w-full resize-y rounded-md border border-border bg-bg px-3 py-2 text-sm text-txt placeholder:text-muted focus:outline-none focus:ring-1 focus:ring-accent"}),(0,b.jsx)("p",{className:"text-xs text-muted",children:"The agent asks where the tasks go (a new epic, an existing epic, or no epic) and shows a plan before writing anything."}),(0,b.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,b.jsx)(q.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>{f(""),d(!1)},children:"Cancel"}),(0,b.jsx)(q.Button,{type:"submit",size:"sm",disabled:!e.trim(),className:"bg-accent text-white hover:bg-accent/90",children:"Break down"})]})]})]})})}function X({open:a,onOpenChange:c,items:d}){return(0,b.jsx)(U.Dialog,{open:a,onOpenChange:c,children:(0,b.jsxs)(U.DialogContent,{className:"max-w-lg bg-surface border-border text-txt",children:[(0,b.jsx)(U.DialogTitle,{className:"text-sm font-semibold text-txt",children:"Break down epics"}),(0,b.jsx)(Y,{items:d,onDone:()=>c(!1)})]})})}function Y({items:a,onDone:d}){let e,f=(e=(a,b)=>a.order-b.order,a.filter(a=>null===a.parent).sort(e).map(b=>({horizon:b,epics:a.filter(a=>a.parent===b.id&&"done"!==a.status).sort((a,b)=>Number(a.tasks.length>0)-Number(b.tasks.length>0)||e(a,b))})).filter(a=>a.epics.length>0)),[g,h]=(0,c.useState)(()=>new Set(f.flatMap(a=>a.epics.filter(a=>0===a.tasks.length).map(a=>a.id)))),i=(0,J.useChats)().runningCount,j=Math.max(0,I.MAX_RUNNING_CHATS-i),k=g.size>j;return(0,b.jsxs)("form",{onSubmit:function(a){if(a.preventDefault(),g.size&&!k)for(let a of(d(),f))for(let b of a.epics)g.has(b.id)&&(0,v.askAgent)(`Break down epic ${b.id} into tasks.`,{newChat:!0})},className:"flex flex-col gap-3",children:[(0,b.jsx)("div",{className:"max-h-[50vh] overflow-y-auto rounded-md border border-border",children:f.map(a=>(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"sticky top-0 bg-surface2 px-3 py-1 text-[10px] font-mono uppercase tracking-widest text-muted",children:[a.horizon.id," · ",a.horizon.title]}),(0,b.jsx)("ul",{children:a.epics.map(a=>{let c=g.has(a.id);return(0,b.jsx)("li",{className:"border-b border-border last:border-b-0",children:(0,b.jsxs)("label",{className:"flex items-start gap-2 px-3 py-1.5 text-xs cursor-pointer has-[:disabled]:cursor-not-allowed",children:[(0,b.jsx)("input",{type:"checkbox",checked:c,disabled:!c&&g.size>=j,onChange:()=>{var b;return b=a.id,void h(a=>{let c=new Set(a);return c.delete(b)||c.add(b),c})},className:"mt-0.5 accent-accent"}),(0,b.jsxs)("span",{className:"flex-1 min-w-0 text-txt",children:[(0,b.jsx)("span",{className:"font-mono text-muted mr-1",children:a.id}),a.title]}),a.tasks.length>0&&(0,b.jsxs)("span",{className:"shrink-0 text-[10px] font-mono text-muted",children:["has ",a.tasks.length," task",1===a.tasks.length?"":"s"]})]})},a.id)})})]},a.horizon.id))}),(0,b.jsx)("p",{className:k||0===j?"text-xs text-amber":"text-xs text-muted",children:0===j?`All ${I.MAX_RUNNING_CHATS} agent slots are busy. Stop a chat or wait for one to finish.`:k?`${g.size} selected, but only ${j} of ${I.MAX_RUNNING_CHATS} agent slots ${1===j?"is":"are"} free (${i} running). Uncheck some or stop a chat.`:`One chat per epic, running at once (${j} of ${I.MAX_RUNNING_CHATS} agent slots free). Each shows a plan before writing anything.`}),(0,b.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,b.jsx)(q.Button,{type:"button",variant:"ghost",size:"sm",onClick:d,children:"Cancel"}),(0,b.jsxs)(q.Button,{type:"submit",size:"sm",disabled:!g.size||k,className:"bg-accent text-white hover:bg-accent/90",children:["Break down ",g.size||""," epic",1===g.size?"":"s"]})]})]})}async function Z(a,b){try{let c=await fetch(a,void 0===b?void 0:{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)}),d=await c.json().catch(()=>null);if(!c.ok)return{error:d?.error??`Request failed (${c.status})`};return{data:d}}catch{return{error:"Could not reach the server"}}}function $(a,b,c,d){var f;let g,h,i,j,k,[l,m]=(f=!d,h=(g=a=>({x:a.position.x+(a.measured?.width??("horizon"===a.type?B.HORIZON_W:B.FEATURE_W))/2,y:a.position.y+(a.measured?.height??48)/2}))(b),j=(i=g(c)).x-h.x,k=i.y-h.y,f||Math.abs(j)>Math.abs(k)?j>0?[e.Position.Right,e.Position.Left]:[e.Position.Left,e.Position.Right]:k>0?[e.Position.Bottom,e.Position.Top]:[e.Position.Top,e.Position.Bottom]);return{id:a,source:b.id,target:c.id,sourceHandle:l,targetHandle:`${m}-t`,type:d?"straight":"default",selectable:!1,...function(a,b,c){if(c)return"done"===a.data.item.status?{style:{stroke:"var(--color-accent)",strokeWidth:3}}:{style:{stroke:"var(--color-border2)",strokeWidth:3,strokeDasharray:"6 6"}};let d=b.data.item.status;return"in-progress"===d?{animated:!0,style:{stroke:"var(--color-accent)",strokeWidth:2}}:"done"===d?{style:{stroke:"var(--color-border2)",strokeWidth:1.5}}:{style:{stroke:"var(--color-border2)",strokeWidth:1.5,strokeDasharray:"2 5",strokeLinecap:"round"}}}(b,c,d)}}function _(a){let b=new MutationObserver(a);return b.observe(document.documentElement,{attributes:!0,attributeFilter:["class"]}),()=>b.disconnect()}let aa={"--xy-background-color":"var(--color-bg)"};function ab(){let{rootParam:a,openDoc:e,board:f}=(0,o.useApp)(),i=(0,n.useRouter)(),j=(0,n.useSearchParams)(),r="timeline"===j.get("view")?"timeline":"map",x=(0,t.localToday)(),[y,A]=(0,c.useState)([]),[C,D]=(0,c.useState)({}),[E,F]=(0,c.useState)([]),[G,H]=(0,c.useState)(!0),[I,J]=(0,c.useState)(null),[K,L]=(0,c.useState)(null),M=j.get("item"),[N,P]=(0,c.useState)(null);M!==N&&(P(M),M&&L(M));let[Q,R]=(0,c.useState)(null),[S,T]=(0,c.useState)(!1),[U,Y]=(0,c.useState)(null),[ab,ae]=(0,c.useState)(!1),[af,ag]=(0,c.useState)(!1),ah=(0,c.useRef)(!1),ai=(0,c.useRef)(null),aj=(0,c.useCallback)(a=>{let b=ai.current?.clientWidth??0,c=a.getNodesBounds(a.getNodes());if(!b||!c.width)return;let d=Math.min(1,Math.max(.75,(b-80)/c.width));a.setViewport({x:b/2-(c.x+c.width/2)*d,y:40-c.y*d,zoom:d})},[]),ak=(0,c.useRef)(!1),al=(0,c.useRef)(0),am=(0,c.useSyncExternalStore)(_,()=>document.documentElement.classList.contains("dark"),()=>!0),an=(0,c.useCallback)((a,b)=>{A(a),D(b),F(c=>{let d,e;return d=(0,B.resolvePositions)(a,b),e=new Map(c.map(a=>[a.id,a])),a.map(a=>{let b=e.get(a.id);return{id:a.id,type:null===a.parent?"horizon":"feature",position:d[a.id]??{x:0,y:0},data:{item:a},measured:b?.measured,selected:b?.selected}})})},[]),ao=(0,c.useCallback)(()=>{let b=++al.current;return Z(`/api/roadmap${a}`).then(({data:a,error:c})=>{if(b===al.current){if(H(!1),c){J(c),an([],{}),L(null);return}J(null),R(a?.generateSource??null),an(a?.items??[],a?.layout??{})}})},[a,an]);(0,c.useEffect)(()=>{ao()},[ao]),(0,c.useEffect)(()=>{let a=new EventSource("/api/events");return a.onmessage=a=>{try{let b=JSON.parse(a.data);if("roadmap_updated"!==b.type)return;ah.current?ak.current=!0:ao()}catch{}},()=>a.close()},[ao]);let ap=(0,c.useMemo)(()=>{let a=new Map(E.map(a=>[a.id,a])),b=[],c=y.filter(a=>null===a.parent).sort((a,b)=>a.order-b.order);for(let d of(c.forEach((d,e)=>{let f=a.get(d.id),g=c[e+1]&&a.get(c[e+1].id);f&&g&&b.push($(`spine-${d.id}`,f,g,!0))}),y)){let c=d.parent&&a.get(d.parent),e=a.get(d.id);c&&e&&"horizon"===c.type&&b.push($(`branch-${d.id}`,c,e,!1))}return b},[y,E]),aq=(0,c.useMemo)(()=>Object.fromEntries(Object.values(f??{}).flat().map(a=>[a.id,a])),[f]),ar=(0,c.useMemo)(()=>(0,t.roadmapHealth)(y,aq,x),[y,aq,x]),as=(0,c.useMemo)(()=>{let a=Object.values(aq),b=new Map(y.filter(a=>null===a.parent).sort((a,b)=>a.order-b.order).map((a,b)=>[a.id,b+1]));return E.map(c=>{var d;let e,{item:f}=c.data,g=y.filter(a=>a.parent===f.id),h="feature"===c.type&&"in-progress"===f.status?s(f,a):null;return{...c,data:{...c.data,progress:ar.progress[c.id],drift:ar.drift.filter(a=>a.id===c.id).map(a=>a.message),dueState:(0,t.dueState)(f.due,f.status,x),..."feature"===c.type&&{...(d=f.tasks,{taskDue:e=(0,t.taskDueSummary)(d,aq,x),taskDueSoon:!!e?.next&&"soon"===(0,t.dueState)(e.next,"planned",x)}),taskStatuses:f.tasks.map(a=>aq[a]?.status).filter(a=>!!a&&"cancelled"!==a),nextTaskId:h?.kind==="ready"?h.taskId:null},..."horizon"===c.type&&{chapter:b.get(f.id),epics:{done:g.filter(a=>"done"===a.status).length,total:g.length}}}}})},[E,y,ar,x,aq]),at=(0,c.useCallback)(a=>F(b=>(0,d.applyNodeChanges)(a,b)),[]);async function au(){T(!0),J(null);let{data:b,error:c}=await Z(`/api/roadmap/generate${a}`,{});if(c){J(c),T(!1);return}let d=Object.fromEntries(Object.entries((0,B.resolvePositions)(b?.items??[],{})).map(([a,b])=>[a,{x:Math.round(b.x),y:Math.round(b.y)}])),{error:e}=await Z(`/api/roadmap/layout${a}`,{positions:d});await ao(),e&&J(e),T(!1)}let av=Object.values(f??{}).flat().filter(a=>"cancelled"!==a.status).length,aw="roadmap-md"===Q?"from ROADMAP.md":"tasks"===Q?`from ${av} tasks, grouped by phase`:"starter horizons: Shipped · Now · Next · Later";async function ax(b){let{error:c}=await Z(`/api/roadmap/create${a}`,{title:b,parent:U||null});return c||(await ao(),null)}async function ay(b,c){let{data:d,error:e}=await Z(`/api/roadmap/update${a}`,{id:b,patch:c});if(e)return e;let f=d?.item;return f?an(y.map(a=>a.id===b?f:a),C):await ao(),null}async function az(b){let{error:c}=await Z(`/api/roadmap/delete${a}`,{id:b});return c||(an(y.filter(a=>a.id!==b),C),null)}let aA=y.find(a=>a.id===K)??null,aB=(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(V,{open:null!==U,heading:U?`New feature under ${U}`:"New horizon",onOpenChange:a=>{a||Y(null)},onSubmit:ax}),(0,b.jsx)(W,{open:ab,onOpenChange:ae}),(0,b.jsx)(X,{open:af,onOpenChange:ag,items:y})]});return G?(0,b.jsx)("div",{className:"flex-1 flex items-center justify-center text-sm text-muted",children:"Loading…"}):0===y.length?(0,b.jsxs)("div",{className:"flex-1 p-6",children:[I&&(0,b.jsx)("p",{className:"mb-4 text-sm text-danger",children:I}),(0,b.jsx)(p.EmptyState,{icon:"🗺️",message:"No roadmap yet",subMessage:"Items live in plans/roadmap/R*.md",bordered:!0}),(0,b.jsxs)("div",{className:"mt-4 flex flex-col items-center gap-2",children:[(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsxs)(q.Button,{size:"sm",onClick:au,disabled:S,className:"bg-accent text-white hover:bg-accent/90",children:[(0,b.jsx)(m.Sparkles,{})," ",S?"Generating…":"Generate roadmap"]}),(0,b.jsxs)(q.Button,{size:"sm",variant:"outline",onClick:()=>(0,v.askAgent)("Plan a roadmap for this project."),disabled:S,children:[(0,b.jsx)(g.Bot,{})," Plan with agent"]}),(0,b.jsxs)(q.Button,{size:"sm",variant:"outline",onClick:()=>ae(!0),disabled:S,children:[(0,b.jsx)(h.FileText,{})," Plan from spec"]}),(0,b.jsxs)(q.Button,{size:"sm",variant:"outline",onClick:()=>Y(""),disabled:S,children:[(0,b.jsx)(l.Plus,{})," Create first horizon"]})]}),(0,b.jsxs)("p",{className:"text-xs text-muted",children:["Generate ",aw,". Existing files are not modified."]})]}),aB]}):(0,b.jsxs)("div",{className:"relative flex flex-1 min-h-0 flex-col",children:[(0,b.jsxs)("div",{className:"flex shrink-0 items-center gap-4 border-b border-border px-3 py-2",children:[(0,b.jsx)("div",{className:"flex rounded-md border border-border p-0.5 text-xs",children:["map","timeline"].map(a=>(0,b.jsx)("button",{type:"button",onClick:()=>{let b,c;return b=new URLSearchParams(j.toString()),"map"===a?b.delete("view"):b.set("view",a),c=b.toString(),void i.replace(c?`/roadmap?${c}`:"/roadmap")},className:(0,u.cn)("rounded-sm px-3 py-1 capitalize",r===a?"bg-surface2 text-txt":"text-muted hover:text-txt"),children:a},a))}),(0,b.jsx)(ac,{items:y,tasksById:aq}),(0,b.jsxs)("div",{className:"ml-auto flex items-center gap-2",children:[I&&(0,b.jsx)("p",{className:"text-xs text-danger",children:I}),ar.drift.length>0&&(0,b.jsx)(ad,{drift:ar.drift,onSelect:L,onApply:a=>a.suggestedStatus&&ay(a.id,{status:a.suggestedStatus}).then(a=>{a&&J(a)})}),(0,b.jsxs)(q.Button,{size:"sm",variant:"outline",onClick:()=>ae(!0),children:[(0,b.jsx)(h.FileText,{})," Plan from spec"]}),y.some(a=>null!==a.parent&&"done"!==a.status)&&(0,b.jsxs)(q.Button,{size:"sm",variant:"outline",onClick:()=>ag(!0),children:[(0,b.jsx)(k,{})," Break down epics…"]}),(0,b.jsxs)(q.Button,{size:"sm",onClick:()=>Y(""),className:"bg-accent text-white hover:bg-accent/90",children:[(0,b.jsx)(l.Plus,{})," Horizon"]})]})]}),"map"===r?(0,b.jsx)("div",{ref:ai,className:"relative flex-1 min-h-0",children:(0,b.jsxs)(d.ReactFlow,{nodes:as,edges:ap,nodeTypes:w.nodeTypes,onNodesChange:at,onNodeClick:(a,b)=>L(b.id),onNodeDragStart:()=>{ah.current=!0},onNodeDragStop:(b,c,d)=>{let e;return ah.current=!1,e=Object.fromEntries(d.map(a=>[a.id,{x:Math.round(a.position.x),y:Math.round(a.position.y)}])),void(an(y,{...C,...e}),Z(`/api/roadmap/layout${a}`,{positions:e}).then(({error:a})=>{a&&J(a),ak.current&&(ak.current=!1,ao())}))},nodesConnectable:!1,deleteKeyCode:null,colorMode:am?"dark":"light",onInit:aj,minZoom:.2,style:aa,children:[(0,b.jsx)(d.Background,{variant:d.BackgroundVariant.Dots,gap:20,size:1}),(0,b.jsx)(d.Controls,{showInteractive:!1})]})}):(0,b.jsx)(z,{items:y,today:x,onSelect:L,progressById:ar.progress}),(0,b.jsx)(O,{item:aA,items:y,onClose:()=>L(null),onSave:ay,onDelete:az,onAddFeature:a=>{L(null),Y(a)},onEditRaw:a=>{e(a)},tasksById:aq,progressById:ar.progress,onSelect:L}),aB]})}function ac({items:a,tasksById:c}){let d=a.filter(a=>null!==a.parent),e=a=>d.filter(b=>b.status===a).length,f=[...new Set(d.flatMap(a=>a.tasks))].map(a=>c[a]).filter(a=>a&&"cancelled"!==a.status),g=f.filter(a=>"done"===a.status).length;return(0,b.jsxs)("div",{className:"hidden items-center gap-4 font-mono text-[11px] text-muted md:flex",children:[["in-progress","done","planned"].map(a=>(0,b.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,b.jsx)(w.StatusDot,{status:a}),(0,b.jsx)("span",{className:(0,u.cn)("tabular-nums","in-progress"===a&&e(a)>0?"text-accent":"text-txt"),children:e(a)}),w.STATUS_LABEL[a].toLowerCase()]},a)),f.length>0&&(0,b.jsxs)("span",{className:"flex items-center gap-2 border-l border-border pl-4",children:[(0,b.jsx)("span",{className:"relative h-1 w-20 overflow-hidden rounded-full bg-border",children:(0,b.jsx)("span",{className:"absolute inset-y-0 left-0 rounded-full bg-teal",style:{width:`${g/f.length*100}%`}})}),(0,b.jsxs)("span",{children:[(0,b.jsxs)("span",{className:"tabular-nums text-txt",children:[g,"/",f.length]})," tasks"]})]})]})}function ad({drift:a,onSelect:c,onApply:d}){return(0,b.jsxs)("details",{className:"group relative",children:[(0,b.jsxs)("summary",{className:"flex h-8 cursor-pointer list-none items-center gap-1.5 rounded-md border border-amber/40 bg-amber/10 px-2.5 text-xs font-medium text-txt hover:bg-amber/15 [&::-webkit-details-marker]:hidden",children:[(0,b.jsx)(f.AlertTriangle,{className:"h-3.5 w-3.5 text-amber"})," ",a.length," need attention"]}),(0,b.jsx)("ul",{className:"absolute right-0 top-full z-30 mt-1.5 max-h-72 w-80 overflow-y-auto rounded-lg border border-border bg-surface text-xs shadow-xl",children:a.map(a=>(0,b.jsxs)("li",{className:"flex items-start gap-2 border-b border-border px-3 py-2.5 last:border-0",children:[(0,b.jsx)("span",{className:"mt-1 h-1.5 w-1.5 shrink-0 rounded-full bg-amber"}),(0,b.jsx)("button",{type:"button",onClick:()=>c(a.id),className:"flex-1 text-left leading-relaxed text-muted hover:text-txt",children:a.message}),a.suggestedStatus&&(0,b.jsxs)("button",{type:"button",onClick:()=>d(a),className:"shrink-0 rounded-sm border border-border px-1.5 py-0.5 font-mono text-[10px] text-txt hover:border-accent hover:text-accent",title:`Set status to ${a.suggestedStatus}`,children:["→ ",a.suggestedStatus]})]},`${a.id}-${a.kind}`))})]})}a.s(["default",0,function(){return(0,b.jsx)("div",{className:"flex flex-col h-[calc(100svh-3rem)]",children:(0,b.jsx)(c.Suspense,{children:(0,b.jsx)(ab,{})})})}],690793)}];
|
|
3
|
+
${e.trim()}`))},className:"flex flex-col gap-3",children:[(0,b.jsx)("textarea",{autoFocus:!0,value:e,onChange:a=>f(a.target.value),placeholder:"Paste a feature spec…",rows:12,className:"w-full resize-y rounded-md border border-border bg-bg px-3 py-2 text-sm text-txt placeholder:text-muted focus:outline-none focus:ring-1 focus:ring-accent"}),(0,b.jsx)("p",{className:"text-xs text-muted",children:"The agent asks where the tasks go (a new epic, an existing epic, or no epic) and shows a plan before writing anything."}),(0,b.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,b.jsx)(o.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>{f(""),d(!1)},children:"Cancel"}),(0,b.jsx)(o.Button,{type:"submit",size:"sm",disabled:!e.trim(),className:"bg-accent text-accent-fg hover:bg-accent/90",children:"Break down"})]})]})]})})}function ah({open:a,onOpenChange:c,items:d}){return(0,b.jsx)(ae.Dialog,{open:a,onOpenChange:c,children:(0,b.jsxs)(ae.DialogContent,{className:"max-w-lg bg-surface border-border text-txt",children:[(0,b.jsx)(ae.DialogTitle,{className:"text-sm font-semibold text-txt",children:"Break down epics"}),(0,b.jsx)(ai,{items:d,onDone:()=>c(!1)})]})})}function ai({items:a,onDone:d}){let e,f=(e=(a,b)=>a.order-b.order,a.filter(a=>null===a.parent).sort(e).map(b=>({horizon:b,epics:a.filter(a=>a.parent===b.id&&"done"!==a.status).sort((a,b)=>Number(a.tasks.length>0)-Number(b.tasks.length>0)||e(a,b))})).filter(a=>a.epics.length>0)),[g,h]=(0,c.useState)(()=>new Set(f.flatMap(a=>a.epics.filter(a=>0===a.tasks.length).map(a=>a.id)))),i=(0,H.useChats)().runningCount,j=Math.max(0,G.MAX_RUNNING_CHATS-i),k=g.size>j;return(0,b.jsxs)("form",{onSubmit:function(a){if(a.preventDefault(),g.size&&!k)for(let a of(d(),f))for(let b of a.epics)g.has(b.id)&&(0,t.askAgent)(`Break down epic ${b.id} into tasks.`,{newChat:!0})},className:"flex flex-col gap-3",children:[(0,b.jsx)("div",{className:"max-h-[50vh] overflow-y-auto rounded-md border border-border",children:f.map(a=>(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"sticky top-0 bg-surface2 px-3 py-1 text-[10px] font-mono uppercase tracking-widest text-muted",children:[a.horizon.id," · ",a.horizon.title]}),(0,b.jsx)("ul",{children:a.epics.map(a=>{let c=g.has(a.id);return(0,b.jsx)("li",{className:"border-b border-border last:border-b-0",children:(0,b.jsxs)("label",{className:"flex items-start gap-2 px-3 py-1.5 text-xs cursor-pointer has-[:disabled]:cursor-not-allowed",children:[(0,b.jsx)("input",{type:"checkbox",checked:c,disabled:!c&&g.size>=j,onChange:()=>{var b;return b=a.id,void h(a=>{let c=new Set(a);return c.delete(b)||c.add(b),c})},className:"mt-0.5 accent-accent"}),(0,b.jsxs)("span",{className:"flex-1 min-w-0 text-txt",children:[(0,b.jsx)("span",{className:"font-mono text-muted mr-1",children:a.id}),a.title]}),a.tasks.length>0&&(0,b.jsxs)("span",{className:"shrink-0 text-[10px] font-mono text-muted",children:["has ",a.tasks.length," task",1===a.tasks.length?"":"s"]})]})},a.id)})})]},a.horizon.id))}),(0,b.jsx)("p",{className:k||0===j?"text-xs text-amber":"text-xs text-muted",children:0===j?`All ${G.MAX_RUNNING_CHATS} agent slots are busy. Stop a chat or wait for one to finish.`:k?`${g.size} selected, but only ${j} of ${G.MAX_RUNNING_CHATS} agent slots ${1===j?"is":"are"} free (${i} running). Uncheck some or stop a chat.`:`One chat per epic, running at once (${j} of ${G.MAX_RUNNING_CHATS} agent slots free). Each shows a plan before writing anything.`}),(0,b.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,b.jsx)(o.Button,{type:"button",variant:"ghost",size:"sm",onClick:d,children:"Cancel"}),(0,b.jsxs)(o.Button,{type:"submit",size:"sm",disabled:!g.size||k,className:"bg-accent text-accent-fg hover:bg-accent/90",children:["Break down ",g.size||""," epic",1===g.size?"":"s"]})]})]})}async function aj(a,b){try{let c=await fetch(a,void 0===b?void 0:{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)}),d=await c.json().catch(()=>null);if(!c.ok)return{error:d?.error??`Request failed (${c.status})`};return{data:d}}catch{return{error:"Could not reach the server"}}}function ak(a,b,c,d){var f;let g,h,i,j,k,[l,m]=(f=!d,h=(g=a=>({x:a.position.x+(a.measured?.width??("horizon"===a.type?z.HORIZON_W:z.FEATURE_W))/2,y:a.position.y+(a.measured?.height??48)/2}))(b),j=(i=g(c)).x-h.x,k=i.y-h.y,f||Math.abs(j)>Math.abs(k)?j>0?[e.Position.Right,e.Position.Left]:[e.Position.Left,e.Position.Right]:k>0?[e.Position.Bottom,e.Position.Top]:[e.Position.Top,e.Position.Bottom]);return{id:a,source:b.id,target:c.id,sourceHandle:l,targetHandle:`${m}-t`,type:d?"straight":"default",selectable:!1,...function(a,b,c){if(c)return"done"===a.data.item.status?{style:{stroke:"var(--color-accent)",strokeWidth:3}}:{style:{stroke:"var(--color-border2)",strokeWidth:3,strokeDasharray:"6 6"}};let d=b.data.item.status;return"in-progress"===d?{animated:!0,style:{stroke:"var(--color-accent)",strokeWidth:2}}:"done"===d?{style:{stroke:"var(--color-border2)",strokeWidth:1.5}}:{style:{stroke:"var(--color-border2)",strokeWidth:1.5,strokeDasharray:"2 5",strokeLinecap:"round"}}}(b,c,d)}}function al(a){let b=new MutationObserver(a);return b.observe(document.documentElement,{attributes:!0,attributeFilter:["class"]}),()=>b.disconnect()}let am={"--xy-background-color":"var(--color-bg)"};function an(){let{rootParam:a,openDoc:e,board:f}=(0,m.useApp)(),{showAbout:p}=(0,H.useChats)(),v=(0,l.useRouter)(),w=(0,l.useSearchParams)(),y="timeline"===w.get("view")?"timeline":"map",A=(0,r.localToday)(),[B,C]=(0,c.useState)([]),[D,E]=(0,c.useState)({}),[F,G]=(0,c.useState)([]),[I,J]=(0,c.useState)(!0),[K,L]=(0,c.useState)(null),[M,N]=(0,c.useState)(null),[O,P]=(0,c.useState)(null),[Q,S]=(0,c.useState)(null),T=w.get("item"),[U,W]=(0,c.useState)(null);T!==U&&(W(T),T&&N(T));let[X,Y]=(0,c.useState)(null),[Z,_]=(0,c.useState)(!1),[aa,ab]=(0,c.useState)(null),[ac,ad]=(0,c.useState)(!1),[ae,ai]=(0,c.useState)(!1),an=(0,c.useRef)(!1),aq=(0,c.useRef)(null),ar=(0,c.useCallback)(a=>{let b=aq.current?.clientWidth??0,c=a.getNodesBounds(a.getNodes());if(!b||!c.width)return;let d=Math.min(1,Math.max(.75,(b-80)/c.width));a.setViewport({x:b/2-(c.x+c.width/2)*d,y:40-c.y*d,zoom:d})},[]),as=(0,c.useRef)(!1),at=(0,c.useRef)(0),au=(0,c.useSyncExternalStore)(al,()=>document.documentElement.classList.contains("dark"),()=>!0),av=(0,c.useCallback)((a,b)=>{C(a),E(b),G(c=>{let d,e;return d=(0,z.resolvePositions)(a,b),e=new Map(c.map(a=>[a.id,a])),a.map(a=>{let b=e.get(a.id);return{id:a.id,type:null===a.parent?"horizon":"feature",position:d[a.id]??{x:0,y:0},data:{item:a},measured:b?.measured,selected:b?.selected}})})},[]),aw=(0,c.useCallback)(()=>{let b=++at.current;return aj(`/api/roadmap${a}`).then(({data:a,error:c})=>{if(b===at.current){if(J(!1),c){L(c),av([],{}),N(null);return}L(null),Y(a?.generateSource??null),av(a?.items??[],a?.layout??{})}})},[a,av]);(0,c.useEffect)(()=>{aw()},[aw]),(0,c.useEffect)(()=>{let a=new EventSource("/api/events");return a.onmessage=a=>{try{let b=JSON.parse(a.data);if("roadmap_updated"!==b.type)return;an.current?as.current=!0:aw()}catch{}},()=>a.close()},[aw]);let ax=(0,c.useMemo)(()=>{let a=new Map(F.map(a=>[a.id,a])),b=[],c=B.filter(a=>null===a.parent).sort((a,b)=>a.order-b.order);for(let d of(c.forEach((d,e)=>{let f=a.get(d.id),g=c[e+1]&&a.get(c[e+1].id);f&&g&&b.push(ak(`spine-${d.id}`,f,g,!0))}),B)){let c=d.parent&&a.get(d.parent),e=a.get(d.id);c&&e&&"horizon"===c.type&&b.push(ak(`branch-${d.id}`,c,e,!1))}return b},[B,F]),ay=(0,c.useMemo)(()=>Object.fromEntries(Object.values(f??{}).flat().map(a=>[a.id,a])),[f]),az=(0,c.useMemo)(()=>(0,r.roadmapHealth)(B,ay,A),[B,ay,A]),aA=(0,c.useMemo)(()=>{let a=Object.values(ay),b=new Map(B.filter(a=>null===a.parent).sort((a,b)=>a.order-b.order).map((a,b)=>[a.id,b+1]));return F.map(c=>{var d;let e,{item:f}=c.data,g=B.filter(a=>a.parent===f.id),h="feature"===c.type&&"in-progress"===f.status?q(f,a):null;return{...c,data:{...c.data,progress:az.progress[c.id],drift:az.drift.filter(a=>a.id===c.id).map(a=>a.message),dueState:(0,r.dueState)(f.due,f.status,A),..."feature"===c.type&&{...(d=f.tasks,{taskDue:e=(0,r.taskDueSummary)(d,ay,A),taskDueSoon:!!e?.next&&"soon"===(0,r.dueState)(e.next,"planned",A)}),taskStatuses:f.tasks.map(a=>ay[a]?.status).filter(a=>!!a&&"cancelled"!==a),nextTaskId:h?.kind==="ready"?h.taskId:null},..."horizon"===c.type&&{chapter:b.get(f.id),epics:{done:g.filter(a=>"done"===a.status).length,total:g.length}}}}})},[F,B,az,A,ay]),aB=(0,c.useCallback)(a=>G(b=>(0,d.applyNodeChanges)(a,b)),[]);async function aC(){_(!0),L(null);let{data:b,error:c}=await aj(`/api/roadmap/generate${a}`,{});if(c){L(c),_(!1);return}let d=Object.fromEntries(Object.entries((0,z.resolvePositions)(b?.items??[],{})).map(([a,b])=>[a,{x:Math.round(b.x),y:Math.round(b.y)}])),{error:e}=await aj(`/api/roadmap/layout${a}`,{positions:d});await aw(),e&&L(e),_(!1)}let aD=Object.values(f??{}).flat().filter(a=>"cancelled"!==a.status).length,aE="roadmap-md"===X?"from ROADMAP.md":"tasks"===X?`from ${aD} tasks, grouped by phase`:"starter horizons: Shipped · Now · Next · Later";async function aF(b){let{error:c}=await aj(`/api/roadmap/create${a}`,{title:b,parent:aa||null});return c||(await aw(),null)}async function aG(b,c){av(B.map(a=>a.id===b?{...a,...c}:a),D);let{data:d,error:e}=await aj(`/api/roadmap/update${a}`,{id:b,patch:c});if(e)return await aw(),e;let f=d?.item;return f?av(B.map(a=>a.id===b?f:a),D):await aw(),null}async function aH(b){let{data:c,error:d}=await aj(`/api/roadmap/delete${a}`,{id:b});return d||(av(B.filter(a=>a.id!==b),D),c&&(0,V.undoToast)(`Deleted ${b}`,async()=>{let{error:b}=await aj(`/api/roadmap/restore${a}`,c);if(b)throw Error(b);await aw()}),null)}let aI=B.find(a=>a.id===M)??null,aJ=a=>{a&&L(a)},aK={edit:a=>{N(a),P(a)},setStatus:(a,b)=>{aG(a,{status:b}).then(aJ)},move:(a,b)=>{aG(a,{parent:b}).then(aJ)},addEpic:a=>{N(null),ab(a)},duplicate:async b=>{let c=B.find(a=>a.id===b);if(!c)return;let{data:d,error:e}=await aj(`/api/roadmap/create${a}`,{title:`${c.title} (copy)`,parent:c.parent,status:"planned",order:c.order+1,due:c.due,body:c.body});if(e)return L(e);await aw(),d?.item&&N(d.item.id)},openFile:a=>e(a),chat:a=>{N(null),p({kind:"epic",id:a})},remove:async a=>{let b=await aH(a);if(b)return L(b);M===a&&N(null)}},aL=(a,b)=>{b.preventDefault(),S({id:a,x:b.clientX,y:b.clientY})},aM=(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(af,{open:null!==aa,heading:aa?`New feature under ${aa}`:"New horizon",onOpenChange:a=>{a||ab(null)},onSubmit:aF}),(0,b.jsx)(ag,{open:ac,onOpenChange:ad}),(0,b.jsx)(ah,{open:ae,onOpenChange:ai,items:B})]});return I?(0,b.jsx)("div",{className:"flex-1 flex items-center justify-center text-sm text-muted",children:"Loading…"}):0===B.length?(0,b.jsxs)("div",{className:"flex-1 p-6",children:[K&&(0,b.jsx)("p",{className:"mb-4 text-sm text-danger",children:K}),(0,b.jsx)(n.EmptyState,{icon:"🗺️",message:"No roadmap yet",subMessage:"Items live in plans/roadmap/R*.md",bordered:!0}),(0,b.jsxs)("div",{className:"mt-4 flex flex-col items-center gap-2",children:[(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsxs)(o.Button,{size:"sm",onClick:aC,disabled:Z,className:"bg-accent text-accent-fg hover:bg-accent/90",children:[(0,b.jsx)(k.Sparkles,{})," ",Z?"Generating…":"Generate roadmap"]}),(0,b.jsxs)(o.Button,{size:"sm",variant:"outline",onClick:()=>(0,t.askAgent)("Plan a roadmap for this project."),disabled:Z,children:[(0,b.jsx)(g.Bot,{})," Plan with agent"]}),(0,b.jsxs)(o.Button,{size:"sm",variant:"outline",onClick:()=>ad(!0),disabled:Z,children:[(0,b.jsx)(h.FileText,{})," Plan from spec"]}),(0,b.jsxs)(o.Button,{size:"sm",variant:"outline",onClick:()=>ab(""),disabled:Z,children:[(0,b.jsx)(j.Plus,{})," Create first horizon"]})]}),(0,b.jsxs)("p",{className:"text-xs text-muted",children:["Generate ",aE,". Existing files are not modified."]})]}),aM]}):(0,b.jsxs)("div",{className:"relative flex flex-1 min-h-0 flex-col",children:[(0,b.jsxs)("div",{className:"flex shrink-0 items-center gap-4 border-b border-border px-3 py-2",children:[(0,b.jsx)("div",{className:"flex rounded-md border border-border p-0.5 text-xs",children:["map","timeline"].map(a=>(0,b.jsx)("button",{type:"button",onClick:()=>{let b,c;return b=new URLSearchParams(w.toString()),"map"===a?b.delete("view"):b.set("view",a),c=b.toString(),void v.replace(c?`/roadmap?${c}`:"/roadmap")},className:(0,s.cn)("rounded-sm px-3 py-1 capitalize",y===a?"bg-surface2 text-txt":"text-muted hover:text-txt"),children:a},a))}),(0,b.jsx)(ao,{items:B,tasksById:ay}),(0,b.jsxs)("div",{className:"ml-auto flex items-center gap-2",children:[K&&(0,b.jsx)("p",{className:"text-xs text-danger",children:K}),az.drift.length>0&&(0,b.jsx)(ap,{drift:az.drift,onSelect:N,onApply:a=>a.suggestedStatus&&aG(a.id,{status:a.suggestedStatus}).then(a=>{a&&L(a)})}),(0,b.jsxs)(o.Button,{size:"sm",variant:"outline",onClick:()=>ad(!0),children:[(0,b.jsx)(h.FileText,{})," Plan from spec"]}),B.some(a=>null!==a.parent&&"done"!==a.status)&&(0,b.jsxs)(o.Button,{size:"sm",variant:"outline",onClick:()=>ai(!0),children:[(0,b.jsx)(i.ListTree,{})," Break down epics…"]}),(0,b.jsxs)(o.Button,{size:"sm",onClick:()=>ab(""),className:"bg-accent text-accent-fg hover:bg-accent/90",children:[(0,b.jsx)(j.Plus,{})," Horizon"]})]})]}),"map"===y?(0,b.jsx)("div",{ref:aq,className:"relative flex-1 min-h-0",children:(0,b.jsxs)(d.ReactFlow,{nodes:aA,edges:ax,nodeTypes:u.nodeTypes,onNodesChange:aB,onNodeClick:(a,b)=>N(b.id),onNodeContextMenu:(a,b)=>aL(b.id,a),onNodeDragStart:()=>{an.current=!0},onNodeDragStop:(b,c,d)=>{let e;return an.current=!1,e=Object.fromEntries(d.map(a=>[a.id,{x:Math.round(a.position.x),y:Math.round(a.position.y)}])),void(av(B,{...D,...e}),aj(`/api/roadmap/layout${a}`,{positions:e}).then(({error:a})=>{a&&L(a),as.current&&(as.current=!1,aw())}))},nodesConnectable:!1,deleteKeyCode:null,colorMode:au?"dark":"light",onInit:ar,minZoom:.2,style:am,children:[(0,b.jsx)(d.Background,{variant:d.BackgroundVariant.Dots,gap:20,size:1}),(0,b.jsx)(d.Controls,{showInteractive:!1})]})}):(0,b.jsx)(x,{items:B,today:A,onSelect:N,onItemContextMenu:aL,progressById:az.progress}),(0,b.jsx)($,{item:aI,items:B,onClose:()=>N(null),editing:!!aI&&O===aI.id,onEditingChange:a=>P(a?M:null),actions:aK,onSave:aG,onDelete:aH,onAddFeature:a=>{N(null),ab(a)},onEditRaw:a=>{e(a)},tasksById:ay,progressById:az.progress,onSelect:N}),(0,b.jsx)(R,{at:Q,items:B,actions:aK,onClose:()=>S(null)}),aM]})}function ao({items:a,tasksById:c}){let d=a.filter(a=>null!==a.parent),e=a=>d.filter(b=>b.status===a).length,f=[...new Set(d.flatMap(a=>a.tasks))].map(a=>c[a]).filter(a=>a&&"cancelled"!==a.status),g=f.filter(a=>"done"===a.status).length;return(0,b.jsxs)("div",{className:"hidden items-center gap-4 font-mono text-[11px] text-muted md:flex",children:[["in-progress","paused","done","planned"].filter(a=>"paused"!==a||e(a)>0).map(a=>(0,b.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,b.jsx)(u.StatusDot,{status:a}),(0,b.jsx)("span",{className:(0,s.cn)("tabular-nums","in-progress"===a&&e(a)>0?"text-accent":"text-txt"),children:e(a)}),u.STATUS_LABEL[a].toLowerCase()]},a)),f.length>0&&(0,b.jsxs)("span",{className:"flex items-center gap-2 border-l border-border pl-4",children:[(0,b.jsx)("span",{className:"relative h-1 w-20 overflow-hidden rounded-full bg-border",children:(0,b.jsx)("span",{className:"absolute inset-y-0 left-0 rounded-full bg-teal",style:{width:`${g/f.length*100}%`}})}),(0,b.jsxs)("span",{children:[(0,b.jsxs)("span",{className:"tabular-nums text-txt",children:[g,"/",f.length]})," tasks"]})]})]})}function ap({drift:a,onSelect:c,onApply:d}){return(0,b.jsxs)("details",{className:"group relative",children:[(0,b.jsxs)("summary",{className:"flex h-8 cursor-pointer list-none items-center gap-1.5 rounded-md border border-amber/40 bg-amber/10 px-2.5 text-xs font-medium text-txt hover:bg-amber/15 [&::-webkit-details-marker]:hidden",children:[(0,b.jsx)(f.AlertTriangle,{className:"h-3.5 w-3.5 text-amber"})," ",a.length," need attention"]}),(0,b.jsx)("ul",{className:"absolute right-0 top-full z-30 mt-1.5 max-h-72 w-80 overflow-y-auto rounded-lg border border-border bg-surface text-xs shadow-xl",children:a.map(a=>(0,b.jsxs)("li",{className:"flex items-start gap-2 border-b border-border px-3 py-2.5 last:border-0",children:[(0,b.jsx)("span",{className:"mt-1 h-1.5 w-1.5 shrink-0 rounded-full bg-amber"}),(0,b.jsx)("button",{type:"button",onClick:()=>c(a.id),className:"flex-1 text-left leading-relaxed text-muted hover:text-txt",children:a.message}),a.suggestedStatus&&(0,b.jsxs)("button",{type:"button",onClick:()=>d(a),className:"shrink-0 rounded-sm border border-border px-1.5 py-0.5 font-mono text-[10px] text-txt hover:border-accent hover:text-accent",title:`Set status to ${a.suggestedStatus}`,children:["→ ",a.suggestedStatus]})]},`${a.id}-${a.kind}`))})]})}a.s(["default",0,function(){return(0,b.jsx)("div",{className:"flex flex-col h-[calc(100svh-3rem)]",children:(0,b.jsx)(c.Suspense,{children:(0,b.jsx)(an,{})})})}],690793)}];
|
|
4
4
|
|
|
5
5
|
//# sourceMappingURL=src_app_%28app%29_roadmap_page_tsx_0vcq3jr._.js.map
|