@phake/lanework 0.1.0 → 0.1.1

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.
@@ -1,4 +1,4 @@
1
- import{a as e}from"./chunk-Cyuzqnbw.js";import{G as t,l as n,t as r}from"./link-CUk1Z0N6.js";import{_ as i,d as a,f as o,i as s,n as c,r as l,t as u,v as d,y as f}from"./review-status-RAnd_eAC.js";import{ct as p,n as m,ot as h,p as g,r as _}from"./index-TbIMjf2L.js";import{S as v,_ as ee,a as te,b as ne,c as re,d as ie,f as ae,g as oe,h as y,i as b,l as x,m as S,n as C,o as w,p as T,r as E,s as D,t as O,u as k,v as A,x as j,y as M}from"./gemini-2_FJD5P-.js";import{n as N,r as P,t as F}from"./Tag01Icon-DNgtGZ3r.js";var I=[[`path`,{d:`M18 9.00005C18 9.00005 13.5811 15 12 15C10.4188 15 6 9 6 9`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`0`}]],L=[[`path`,{d:`M7 19H13C15.8284 19 17.2426 19 18.1213 18.1213C19 17.2426 19 15.8284 19 13V10M19 10C19.7002 10 21.0085 11.9943 21.5 12.5M19 10C18.2998 10 16.9915 11.9943 16.5 12.5`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`0`}],[`path`,{d:`M5 7L5 17`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`1`}],[`circle`,{cx:`5`,cy:`5`,r:`2`,stroke:`currentColor`,strokeWidth:`1.5`,key:`2`}],[`circle`,{cx:`19`,cy:`5`,r:`2`,stroke:`currentColor`,strokeWidth:`1.5`,key:`3`}],[`circle`,{cx:`5`,cy:`19`,r:`2`,stroke:`currentColor`,strokeWidth:`1.5`,key:`4`}]],R=[[`path`,{d:`M15 2L15.5387 4.39157C15.9957 6.42015 17.5798 8.00431 19.6084 8.46127L22 9L19.6084 9.53873C17.5798 9.99569 15.9957 11.5798 15.5387 13.6084L15 16L14.4613 13.6084C14.0043 11.5798 12.4202 9.99569 10.3916 9.53873L8 9L10.3916 8.46127C12.4201 8.00431 14.0043 6.42015 14.4613 4.39158L15 2Z`,stroke:`currentColor`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`0`}],[`path`,{d:`M7 12L7.38481 13.7083C7.71121 15.1572 8.84275 16.2888 10.2917 16.6152L12 17L10.2917 17.3848C8.84275 17.7112 7.71121 18.8427 7.38481 20.2917L7 22L6.61519 20.2917C6.28879 18.8427 5.15725 17.7112 3.70827 17.3848L2 17L3.70827 16.6152C5.15725 16.2888 6.28879 15.1573 6.61519 13.7083L7 12Z`,stroke:`currentColor`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`1`}]],z=[[`path`,{d:`M4.26781 18.8447C4.49269 20.515 5.87613 21.8235 7.55966 21.9009C8.97627 21.966 10.4153 22 12 22C13.5847 22 15.0237 21.966 16.4403 21.9009C18.1239 21.8235 19.5073 20.515 19.7322 18.8447C19.879 17.7547 20 16.6376 20 15.5C20 14.3624 19.879 13.2453 19.7322 12.1553C19.5073 10.485 18.1239 9.17649 16.4403 9.09909C15.0237 9.03397 13.5847 9 12 9C10.4153 9 8.97627 9.03397 7.55966 9.09909C5.87613 9.17649 4.49269 10.485 4.26781 12.1553C4.12104 13.2453 4 14.3624 4 15.5C4 16.6376 4.12104 17.7547 4.26781 18.8447Z`,stroke:`currentColor`,strokeWidth:`1.5`,key:`0`}],[`path`,{d:`M7.5 9V6.5C7.5 4.01472 9.51472 2 12 2C14.4853 2 16.5 4.01472 16.5 6.5V9`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`1`}],[`path`,{d:`M12.125 15.5H12M12.25 15.5C12.25 15.6381 12.1381 15.75 12 15.75C11.8619 15.75 11.75 15.6381 11.75 15.5C11.75 15.3619 11.8619 15.25 12 15.25C12.1381 15.25 12.25 15.3619 12.25 15.5Z`,stroke:`currentColor`,strokeLinecap:`round`,strokeWidth:`1.5`,key:`2`}]],B=e(t()),V=n();function H(){return(0,V.jsxs)(`div`,{className:`relative min-h-screen overflow-x-hidden bg-background text-foreground`,children:[(0,V.jsx)(se,{}),(0,V.jsx)(U,{}),(0,V.jsx)(W,{}),(0,V.jsx)(de,{}),(0,V.jsx)(fe,{}),(0,V.jsx)(me,{}),(0,V.jsx)(ge,{}),(0,V.jsx)(_e,{}),(0,V.jsx)(Y,{})]})}function se(){return(0,V.jsxs)(`div`,{className:`pointer-events-none absolute inset-0 -z-10 overflow-hidden`,children:[(0,V.jsx)(`div`,{className:`absolute inset-x-0 top-0 h-[900px] bg-[linear-gradient(90deg,var(--border)_1px,transparent_1px)] bg-[size:140px_100%] opacity-50 [mask-image:linear-gradient(to_bottom,black,transparent_85%)]`}),(0,V.jsx)(`div`,{className:`absolute -top-44 left-1/2 h-[28rem] w-[46rem] -translate-x-1/2 rounded-full bg-primary/15 blur-[130px]`})]})}function U(){return(0,V.jsx)(y,{center:(0,V.jsxs)(`nav`,{className:`hidden items-center gap-8 font-mono text-xs tracking-wide text-muted-foreground md:flex`,children:[(0,V.jsx)(`a`,{href:`#how`,className:`transition-colors hover:text-foreground`,children:`how it works`}),(0,V.jsx)(`a`,{href:`#features`,className:`transition-colors hover:text-foreground`,children:`features`}),(0,V.jsx)(r,{to:`/guide`,className:`transition-colors hover:text-foreground`,children:`guide`})]}),actions:(0,V.jsx)(S,{size:`sm`,children:`Sign in`})})}function W(){return(0,V.jsxs)(`section`,{className:`mx-auto max-w-6xl px-6 pb-10 pt-20 sm:pt-28`,children:[(0,V.jsxs)(`div`,{className:`mx-auto max-w-3xl text-center`,children:[(0,V.jsxs)(f.p,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},transition:{duration:.4},className:`inline-flex items-center gap-2 rounded-full border border-border/70 bg-muted/40 px-3 py-1 font-mono text-xs tracking-wide text-muted-foreground`,children:[(0,V.jsx)(`span`,{className:`size-1.5 rounded-full bg-primary`}),`.agents/reviews`,(0,V.jsx)(d,{icon:j,className:`size-3.5`}),`kanban`]}),(0,V.jsxs)(f.h1,{initial:{opacity:0,y:16},animate:{opacity:1,y:0},transition:{duration:.5,delay:.05,ease:[.22,1,.36,1]},className:`mt-6 font-heading text-5xl font-semibold leading-[1.05] tracking-tight sm:text-6xl`,children:[`Every agent review,`,(0,V.jsx)(`br`,{}),(0,V.jsxs)(`span`,{className:`relative whitespace-nowrap`,children:[`in its`,(0,V.jsx)(`span`,{className:`text-primary`,children:` lane`}),`.`,(0,V.jsx)(G,{})]})]}),(0,V.jsxs)(f.p,{initial:{opacity:0,y:16},animate:{opacity:1,y:0},transition:{duration:.5,delay:.12},className:`mx-auto mt-6 max-w-xl text-lg leading-relaxed text-muted-foreground`,children:[`Your AI coding agent writes review checklists before it ships. Lanework turns that `,(0,V.jsx)(`code`,{className:`rounded bg-muted px-1.5 py-0.5 font-mono text-sm`,children:`.agents/reviews`}),` folder into a live Kanban board — so you can see, approve, and track every change across a repo.`]}),(0,V.jsxs)(f.div,{initial:{opacity:0,y:16},animate:{opacity:1,y:0},transition:{duration:.5,delay:.18},className:`mt-9 flex flex-col items-center justify-center gap-3 sm:flex-row`,children:[(0,V.jsx)(S,{size:`lg`,children:`Continue with GitHub`}),(0,V.jsxs)(`a`,{href:`#how`,className:`inline-flex h-12 items-center gap-1.5 rounded-xl px-4 text-sm font-medium text-muted-foreground transition-colors hover:text-foreground`,children:[`See how it works`,(0,V.jsx)(d,{icon:I,className:`size-4`})]})]}),(0,V.jsx)(`p`,{className:`mt-4 font-mono text-xs text-muted-foreground`,children:`read-only · never writes to your repos`})]}),(0,V.jsx)(f.div,{initial:{opacity:0,y:40},animate:{opacity:1,y:0},transition:{duration:.7,delay:.25,ease:[.22,1,.36,1]},className:`mt-16`,children:(0,V.jsx)(ce,{})})]})}function G(){return(0,V.jsx)(`svg`,{className:`absolute -bottom-2 left-0 w-full text-primary/40`,viewBox:`0 0 300 12`,fill:`none`,preserveAspectRatio:`none`,"aria-hidden":!0,children:(0,V.jsx)(`path`,{d:`M2 9C60 3 120 3 180 6c40 2 80 2 118 -2`,stroke:`currentColor`,strokeWidth:`3`,strokeLinecap:`round`})})}var K=[{col:`todo`,cards:[{title:`Add dark mode toggle`,priority:`medium`,tags:[`ui`],done:0,total:8,people:[`A`,`M`]},{title:`Paginate the search API`,priority:`low`,tags:[`api`],done:0,total:5,people:[`P`]}]},{col:`processing`,cards:[{title:`Refactor auth middleware`,priority:`high`,tags:[`auth`,`api`],done:4,total:9,people:[`A`,`J`,`M`]}]},{col:`done`,cards:[{title:`Cache homepage queries`,priority:`medium`,tags:[`perf`],done:14,total:14,people:[`P`]},{title:`Fix flaky checkout test`,priority:`low`,tags:[`tests`],done:6,total:6,people:[`A`,`M`]}]}];function ce(){return(0,V.jsxs)(`div`,{className:`relative mx-auto max-w-5xl rounded-2xl border border-border/70 bg-card/80 p-3 shadow-2xl shadow-black/5 backdrop-blur sm:p-4`,children:[(0,V.jsxs)(`div`,{className:`mb-3 flex items-center gap-1.5 px-2`,children:[(0,V.jsx)(`span`,{className:`size-2.5 rounded-full bg-muted-foreground/25`}),(0,V.jsx)(`span`,{className:`size-2.5 rounded-full bg-muted-foreground/25`}),(0,V.jsx)(`span`,{className:`size-2.5 rounded-full bg-muted-foreground/25`}),(0,V.jsx)(`span`,{className:`ml-3 font-mono text-[11px] text-muted-foreground`,children:`lanework — acme/web`})]}),(0,V.jsx)(`div`,{className:`grid grid-cols-1 gap-3 sm:grid-cols-3`,children:K.map((e,t)=>{let n=u[e.col];return(0,V.jsxs)(f.div,{initial:{opacity:0,y:16},animate:{opacity:1,y:0},transition:{duration:.45,delay:.35+t*.1},className:`rounded-xl bg-muted/40 p-2.5`,children:[(0,V.jsxs)(`div`,{className:`mb-2 flex items-center gap-2 px-1`,children:[(0,V.jsx)(d,{icon:n.icon,className:g(`size-4`,n.color)}),(0,V.jsx)(`span`,{className:`text-sm font-medium`,children:n.label}),(0,V.jsx)(`span`,{className:`text-sm text-muted-foreground`,children:e.cards.length})]}),(0,V.jsx)(`div`,{className:`flex flex-col gap-2`,children:e.cards.map(e=>(0,V.jsx)(ue,{card:e},e.title))})]},e.col)})})]})}var le={high:`bg-rose-100 text-rose-700 dark:bg-rose-950/60 dark:text-rose-300`,medium:`bg-amber-100 text-amber-700 dark:bg-amber-950/60 dark:text-amber-300`,low:`bg-muted text-muted-foreground`},q=[`bg-emerald-500`,`bg-sky-500`,`bg-violet-500`];function ue({card:e}){let t=e.total?Math.round(e.done/e.total*100):0;return(0,V.jsxs)(`div`,{className:`rounded-lg border bg-card p-3 shadow-xs`,children:[(0,V.jsx)(`p`,{className:`text-[13px] font-medium leading-snug`,children:e.title}),(0,V.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-1.5`,children:[e.tags.map(e=>(0,V.jsx)(`span`,{className:g(`rounded-full px-1.5 py-0.5 text-[10px] font-medium`,l(e)),children:e},e)),e.priority?(0,V.jsx)(`span`,{className:g(`ml-auto rounded-full px-1.5 py-0.5 text-[10px] font-medium capitalize`,le[e.priority]),children:e.priority}):null]}),(0,V.jsxs)(`div`,{className:`mt-2.5 flex items-center gap-2 border-t pt-2 text-[11px] text-muted-foreground`,children:[(0,V.jsxs)(`span`,{className:`inline-flex items-center gap-1`,children:[(0,V.jsx)(d,{icon:P,className:`size-3`}),e.done,`/`,e.total]}),(0,V.jsx)(`div`,{className:`flex -space-x-1.5`,children:e.people.map((e,t)=>(0,V.jsx)(`span`,{className:g(`grid size-4 place-items-center rounded-full text-[8px] font-semibold text-white ring-2 ring-card`,q[t%q.length]),children:e},t))}),(0,V.jsxs)(`span`,{className:`ml-auto font-mono`,children:[t,`%`]})]})]})}function de(){return(0,V.jsx)(`section`,{className:`mx-auto max-w-6xl px-6 py-14`,children:(0,V.jsxs)(X,{className:`flex flex-col items-center gap-6`,children:[(0,V.jsx)(`p`,{className:`font-mono text-xs uppercase tracking-[0.2em] text-muted-foreground`,children:`Works with your coding agent`}),(0,V.jsxs)(`div`,{className:`flex flex-wrap items-center justify-center gap-x-10 gap-y-6 text-foreground/80`,children:[(0,V.jsx)(J,{label:`Claude Code`,children:(0,V.jsx)(w,{className:`size-6`})}),(0,V.jsxs)(J,{label:`Codex`,children:[(0,V.jsx)(te,{className:`size-6 dark:hidden`}),(0,V.jsx)(b,{className:`hidden size-6 dark:block`})]}),(0,V.jsxs)(J,{label:`Cursor`,children:[(0,V.jsx)(E,{className:`size-6 dark:hidden`}),(0,V.jsx)(C,{className:`hidden size-6 dark:block`})]}),(0,V.jsx)(J,{label:`Gemini`,children:(0,V.jsx)(O,{className:`size-6`})})]})]})})}function J({children:e,label:t}){return(0,V.jsxs)(`div`,{className:`flex items-center gap-2.5`,children:[e,(0,V.jsx)(`span`,{className:`text-sm font-medium`,children:t})]})}function fe(){return(0,V.jsxs)(`section`,{id:`how`,className:`mx-auto max-w-6xl scroll-mt-20 px-6 py-20`,children:[(0,V.jsx)(Z,{eyebrow:`how it works`,title:`From folder to flow in three steps`}),(0,V.jsxs)(`div`,{className:`mt-12 grid gap-10 lg:grid-cols-[1.2fr_1fr] lg:items-center`,children:[(0,V.jsx)(`div`,{className:`flex flex-col gap-8`,children:[{n:`01`,title:`Add AGENTS.md`,body:`Drop the convention into your repo — one file, works with Claude Code, Codex, Cursor and more. Copy the template from the guide.`},{n:`02`,title:`Your agent writes reviews`,body:`Before changing behavior, it writes a checklist to .agents/reviews/todo/ and waits for you to flip every box to [x].`},{n:`03`,title:`Watch the board`,body:`Open the repo in Lanework. Cards flow todo → processing → done as work gets approved and ships.`}].map((e,t)=>(0,V.jsx)(X,{delay:t*.08,children:(0,V.jsxs)(`div`,{className:`flex gap-5`,children:[(0,V.jsx)(`span`,{className:`font-mono text-sm text-primary`,children:e.n}),(0,V.jsxs)(`div`,{children:[(0,V.jsx)(`h3`,{className:`text-lg font-semibold tracking-tight`,children:e.title}),(0,V.jsx)(`p`,{className:`mt-1.5 max-w-md text-sm leading-relaxed text-muted-foreground`,children:e.body})]})]})},e.n))}),(0,V.jsx)(X,{delay:.1,children:(0,V.jsx)(pe,{})})]})]})}function pe(){return(0,V.jsxs)(`div`,{className:`rounded-2xl border border-border/70 bg-card p-5 shadow-sm`,children:[(0,V.jsx)(`p`,{className:`mb-4 font-mono text-xs text-muted-foreground`,children:`.agents/reviews/`}),(0,V.jsx)(`div`,{className:`flex flex-col gap-2`,children:[{folder:`todo/`,col:`todo`},{folder:`processing/`,col:`processing`},{folder:`done/`,col:`done`},{folder:`dropped/`,col:`dropped`}].map(e=>{let t=u[e.col];return(0,V.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,V.jsx)(`code`,{className:`w-28 font-mono text-sm text-foreground`,children:e.folder}),(0,V.jsx)(d,{icon:j,className:`size-4 text-muted-foreground`}),(0,V.jsxs)(`span`,{className:`inline-flex items-center gap-2 rounded-full bg-muted px-2.5 py-1 text-xs font-medium`,children:[(0,V.jsx)(d,{icon:t.icon,className:g(`size-3.5`,t.color)}),t.label]})]},e.folder)})}),(0,V.jsxs)(`p`,{className:`mt-4 inline-flex flex-wrap items-center gap-x-1.5 gap-y-1 border-t pt-4 font-mono text-[11px] leading-relaxed text-muted-foreground`,children:[`frontmatter`,(0,V.jsx)(d,{icon:j,className:`size-3`}),`priority · assignees · tags`,(0,V.jsx)(`span`,{className:`w-full`}),`checkboxes`,(0,V.jsx)(d,{icon:j,className:`size-3`}),`progress`]})]})}function me(){return(0,V.jsxs)(`section`,{id:`features`,className:`mx-auto max-w-6xl scroll-mt-20 px-6 py-20`,children:[(0,V.jsx)(Z,{eyebrow:`features`,title:`Everything you need to triage agent work`}),(0,V.jsx)(`div`,{className:`mt-12 grid gap-px overflow-hidden rounded-2xl border border-border/70 bg-border/70 sm:grid-cols-2 lg:grid-cols-3`,children:[{icon:i,title:`Board & List`,body:`Four columns from your folders, or a dense list view. Your reviews, organized the way you think.`},{icon:F,title:`Filter by tag & owner`,body:`Slice to My tasks or any tag. The top tags surface right in the sidebar.`},{icon:ne,title:`Full-screen review`,body:`Open a card for the rendered markdown plus a clean metadata panel — status, priority, progress.`},{icon:A,title:`GitHub-native, read-only`,body:`Sign in, pick a repo. Lanework reads your reviews and never writes back — your files stay yours.`},{icon:ee,title:`Fast by design`,body:`File contents batch over GraphQL with an instant skeleton, so big boards open quick.`},{icon:R,title:`Built to feel good`,body:`Fluid motion, dark-mode tokens, and a “/” to jump between repos. A tool you’ll want to open.`}].map((e,t)=>(0,V.jsx)(X,{delay:t%3*.06,className:`bg-card`,children:(0,V.jsxs)(`div`,{className:`group h-full p-6 transition-colors hover:bg-muted/30`,children:[(0,V.jsx)(`span`,{className:`grid size-10 place-items-center rounded-xl bg-primary/10 text-primary transition-transform group-hover:scale-105`,children:(0,V.jsx)(d,{icon:e.icon,className:`size-5`})}),(0,V.jsx)(`h3`,{className:`mt-4 font-semibold tracking-tight`,children:e.title}),(0,V.jsx)(`p`,{className:`mt-1.5 text-sm leading-relaxed text-muted-foreground`,children:e.body})]})},e.title))})]})}var he=`---
1
+ import{a as e}from"./chunk-Cyuzqnbw.js";import{G as t,l as n,t as r}from"./link-CUk1Z0N6.js";import{_ as i,d as a,f as o,i as s,n as c,r as l,t as u,v as d,y as f}from"./review-status-DNKYsJwj.js";import{ct as p,n as m,ot as h,p as g,r as _}from"./index-BBeG6qcu.js";import{S as v,_ as ee,a as te,b as ne,c as re,d as ie,f as ae,g as oe,h as y,i as b,l as x,m as S,n as C,o as w,p as T,r as E,s as D,t as O,u as k,v as A,x as j,y as M}from"./gemini-FrNNf4gc.js";import{n as N,r as P,t as F}from"./Tag01Icon-DNgtGZ3r.js";var I=[[`path`,{d:`M18 9.00005C18 9.00005 13.5811 15 12 15C10.4188 15 6 9 6 9`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`0`}]],L=[[`path`,{d:`M7 19H13C15.8284 19 17.2426 19 18.1213 18.1213C19 17.2426 19 15.8284 19 13V10M19 10C19.7002 10 21.0085 11.9943 21.5 12.5M19 10C18.2998 10 16.9915 11.9943 16.5 12.5`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`0`}],[`path`,{d:`M5 7L5 17`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`1`}],[`circle`,{cx:`5`,cy:`5`,r:`2`,stroke:`currentColor`,strokeWidth:`1.5`,key:`2`}],[`circle`,{cx:`19`,cy:`5`,r:`2`,stroke:`currentColor`,strokeWidth:`1.5`,key:`3`}],[`circle`,{cx:`5`,cy:`19`,r:`2`,stroke:`currentColor`,strokeWidth:`1.5`,key:`4`}]],R=[[`path`,{d:`M15 2L15.5387 4.39157C15.9957 6.42015 17.5798 8.00431 19.6084 8.46127L22 9L19.6084 9.53873C17.5798 9.99569 15.9957 11.5798 15.5387 13.6084L15 16L14.4613 13.6084C14.0043 11.5798 12.4202 9.99569 10.3916 9.53873L8 9L10.3916 8.46127C12.4201 8.00431 14.0043 6.42015 14.4613 4.39158L15 2Z`,stroke:`currentColor`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`0`}],[`path`,{d:`M7 12L7.38481 13.7083C7.71121 15.1572 8.84275 16.2888 10.2917 16.6152L12 17L10.2917 17.3848C8.84275 17.7112 7.71121 18.8427 7.38481 20.2917L7 22L6.61519 20.2917C6.28879 18.8427 5.15725 17.7112 3.70827 17.3848L2 17L3.70827 16.6152C5.15725 16.2888 6.28879 15.1573 6.61519 13.7083L7 12Z`,stroke:`currentColor`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`1`}]],z=[[`path`,{d:`M4.26781 18.8447C4.49269 20.515 5.87613 21.8235 7.55966 21.9009C8.97627 21.966 10.4153 22 12 22C13.5847 22 15.0237 21.966 16.4403 21.9009C18.1239 21.8235 19.5073 20.515 19.7322 18.8447C19.879 17.7547 20 16.6376 20 15.5C20 14.3624 19.879 13.2453 19.7322 12.1553C19.5073 10.485 18.1239 9.17649 16.4403 9.09909C15.0237 9.03397 13.5847 9 12 9C10.4153 9 8.97627 9.03397 7.55966 9.09909C5.87613 9.17649 4.49269 10.485 4.26781 12.1553C4.12104 13.2453 4 14.3624 4 15.5C4 16.6376 4.12104 17.7547 4.26781 18.8447Z`,stroke:`currentColor`,strokeWidth:`1.5`,key:`0`}],[`path`,{d:`M7.5 9V6.5C7.5 4.01472 9.51472 2 12 2C14.4853 2 16.5 4.01472 16.5 6.5V9`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`1`}],[`path`,{d:`M12.125 15.5H12M12.25 15.5C12.25 15.6381 12.1381 15.75 12 15.75C11.8619 15.75 11.75 15.6381 11.75 15.5C11.75 15.3619 11.8619 15.25 12 15.25C12.1381 15.25 12.25 15.3619 12.25 15.5Z`,stroke:`currentColor`,strokeLinecap:`round`,strokeWidth:`1.5`,key:`2`}]],B=e(t()),V=n();function H(){return(0,V.jsxs)(`div`,{className:`relative min-h-screen overflow-x-hidden bg-background text-foreground`,children:[(0,V.jsx)(se,{}),(0,V.jsx)(U,{}),(0,V.jsx)(W,{}),(0,V.jsx)(de,{}),(0,V.jsx)(fe,{}),(0,V.jsx)(me,{}),(0,V.jsx)(ge,{}),(0,V.jsx)(_e,{}),(0,V.jsx)(Y,{})]})}function se(){return(0,V.jsxs)(`div`,{className:`pointer-events-none absolute inset-0 -z-10 overflow-hidden`,children:[(0,V.jsx)(`div`,{className:`absolute inset-x-0 top-0 h-[900px] bg-[linear-gradient(90deg,var(--border)_1px,transparent_1px)] bg-[size:140px_100%] opacity-50 [mask-image:linear-gradient(to_bottom,black,transparent_85%)]`}),(0,V.jsx)(`div`,{className:`absolute -top-44 left-1/2 h-[28rem] w-[46rem] -translate-x-1/2 rounded-full bg-primary/15 blur-[130px]`})]})}function U(){return(0,V.jsx)(y,{center:(0,V.jsxs)(`nav`,{className:`hidden items-center gap-8 font-mono text-xs tracking-wide text-muted-foreground md:flex`,children:[(0,V.jsx)(`a`,{href:`#how`,className:`transition-colors hover:text-foreground`,children:`how it works`}),(0,V.jsx)(`a`,{href:`#features`,className:`transition-colors hover:text-foreground`,children:`features`}),(0,V.jsx)(r,{to:`/guide`,className:`transition-colors hover:text-foreground`,children:`guide`})]}),actions:(0,V.jsx)(S,{size:`sm`,children:`Sign in`})})}function W(){return(0,V.jsxs)(`section`,{className:`mx-auto max-w-6xl px-6 pb-10 pt-20 sm:pt-28`,children:[(0,V.jsxs)(`div`,{className:`mx-auto max-w-3xl text-center`,children:[(0,V.jsxs)(f.p,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},transition:{duration:.4},className:`inline-flex items-center gap-2 rounded-full border border-border/70 bg-muted/40 px-3 py-1 font-mono text-xs tracking-wide text-muted-foreground`,children:[(0,V.jsx)(`span`,{className:`size-1.5 rounded-full bg-primary`}),`.agents/reviews`,(0,V.jsx)(d,{icon:j,className:`size-3.5`}),`kanban`]}),(0,V.jsxs)(f.h1,{initial:{opacity:0,y:16},animate:{opacity:1,y:0},transition:{duration:.5,delay:.05,ease:[.22,1,.36,1]},className:`mt-6 font-heading text-5xl font-semibold leading-[1.05] tracking-tight sm:text-6xl`,children:[`Every agent review,`,(0,V.jsx)(`br`,{}),(0,V.jsxs)(`span`,{className:`relative whitespace-nowrap`,children:[`in its`,(0,V.jsx)(`span`,{className:`text-primary`,children:` lane`}),`.`,(0,V.jsx)(G,{})]})]}),(0,V.jsxs)(f.p,{initial:{opacity:0,y:16},animate:{opacity:1,y:0},transition:{duration:.5,delay:.12},className:`mx-auto mt-6 max-w-xl text-lg leading-relaxed text-muted-foreground`,children:[`Your AI coding agent writes review checklists before it ships. Lanework turns that `,(0,V.jsx)(`code`,{className:`rounded bg-muted px-1.5 py-0.5 font-mono text-sm`,children:`.agents/reviews`}),` folder into a live Kanban board — so you can see, approve, and track every change across a repo.`]}),(0,V.jsxs)(f.div,{initial:{opacity:0,y:16},animate:{opacity:1,y:0},transition:{duration:.5,delay:.18},className:`mt-9 flex flex-col items-center justify-center gap-3 sm:flex-row`,children:[(0,V.jsx)(S,{size:`lg`,children:`Continue with GitHub`}),(0,V.jsxs)(`a`,{href:`#how`,className:`inline-flex h-12 items-center gap-1.5 rounded-xl px-4 text-sm font-medium text-muted-foreground transition-colors hover:text-foreground`,children:[`See how it works`,(0,V.jsx)(d,{icon:I,className:`size-4`})]})]}),(0,V.jsx)(`p`,{className:`mt-4 font-mono text-xs text-muted-foreground`,children:`read-only · never writes to your repos`})]}),(0,V.jsx)(f.div,{initial:{opacity:0,y:40},animate:{opacity:1,y:0},transition:{duration:.7,delay:.25,ease:[.22,1,.36,1]},className:`mt-16`,children:(0,V.jsx)(ce,{})})]})}function G(){return(0,V.jsx)(`svg`,{className:`absolute -bottom-2 left-0 w-full text-primary/40`,viewBox:`0 0 300 12`,fill:`none`,preserveAspectRatio:`none`,"aria-hidden":!0,children:(0,V.jsx)(`path`,{d:`M2 9C60 3 120 3 180 6c40 2 80 2 118 -2`,stroke:`currentColor`,strokeWidth:`3`,strokeLinecap:`round`})})}var K=[{col:`todo`,cards:[{title:`Add dark mode toggle`,priority:`medium`,tags:[`ui`],done:0,total:8,people:[`A`,`M`]},{title:`Paginate the search API`,priority:`low`,tags:[`api`],done:0,total:5,people:[`P`]}]},{col:`processing`,cards:[{title:`Refactor auth middleware`,priority:`high`,tags:[`auth`,`api`],done:4,total:9,people:[`A`,`J`,`M`]}]},{col:`done`,cards:[{title:`Cache homepage queries`,priority:`medium`,tags:[`perf`],done:14,total:14,people:[`P`]},{title:`Fix flaky checkout test`,priority:`low`,tags:[`tests`],done:6,total:6,people:[`A`,`M`]}]}];function ce(){return(0,V.jsxs)(`div`,{className:`relative mx-auto max-w-5xl rounded-2xl border border-border/70 bg-card/80 p-3 shadow-2xl shadow-black/5 backdrop-blur sm:p-4`,children:[(0,V.jsxs)(`div`,{className:`mb-3 flex items-center gap-1.5 px-2`,children:[(0,V.jsx)(`span`,{className:`size-2.5 rounded-full bg-muted-foreground/25`}),(0,V.jsx)(`span`,{className:`size-2.5 rounded-full bg-muted-foreground/25`}),(0,V.jsx)(`span`,{className:`size-2.5 rounded-full bg-muted-foreground/25`}),(0,V.jsx)(`span`,{className:`ml-3 font-mono text-[11px] text-muted-foreground`,children:`lanework — acme/web`})]}),(0,V.jsx)(`div`,{className:`grid grid-cols-1 gap-3 sm:grid-cols-3`,children:K.map((e,t)=>{let n=u[e.col];return(0,V.jsxs)(f.div,{initial:{opacity:0,y:16},animate:{opacity:1,y:0},transition:{duration:.45,delay:.35+t*.1},className:`rounded-xl bg-muted/40 p-2.5`,children:[(0,V.jsxs)(`div`,{className:`mb-2 flex items-center gap-2 px-1`,children:[(0,V.jsx)(d,{icon:n.icon,className:g(`size-4`,n.color)}),(0,V.jsx)(`span`,{className:`text-sm font-medium`,children:n.label}),(0,V.jsx)(`span`,{className:`text-sm text-muted-foreground`,children:e.cards.length})]}),(0,V.jsx)(`div`,{className:`flex flex-col gap-2`,children:e.cards.map(e=>(0,V.jsx)(ue,{card:e},e.title))})]},e.col)})})]})}var le={high:`bg-rose-100 text-rose-700 dark:bg-rose-950/60 dark:text-rose-300`,medium:`bg-amber-100 text-amber-700 dark:bg-amber-950/60 dark:text-amber-300`,low:`bg-muted text-muted-foreground`},q=[`bg-emerald-500`,`bg-sky-500`,`bg-violet-500`];function ue({card:e}){let t=e.total?Math.round(e.done/e.total*100):0;return(0,V.jsxs)(`div`,{className:`rounded-lg border bg-card p-3 shadow-xs`,children:[(0,V.jsx)(`p`,{className:`text-[13px] font-medium leading-snug`,children:e.title}),(0,V.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-1.5`,children:[e.tags.map(e=>(0,V.jsx)(`span`,{className:g(`rounded-full px-1.5 py-0.5 text-[10px] font-medium`,l(e)),children:e},e)),e.priority?(0,V.jsx)(`span`,{className:g(`ml-auto rounded-full px-1.5 py-0.5 text-[10px] font-medium capitalize`,le[e.priority]),children:e.priority}):null]}),(0,V.jsxs)(`div`,{className:`mt-2.5 flex items-center gap-2 border-t pt-2 text-[11px] text-muted-foreground`,children:[(0,V.jsxs)(`span`,{className:`inline-flex items-center gap-1`,children:[(0,V.jsx)(d,{icon:P,className:`size-3`}),e.done,`/`,e.total]}),(0,V.jsx)(`div`,{className:`flex -space-x-1.5`,children:e.people.map((e,t)=>(0,V.jsx)(`span`,{className:g(`grid size-4 place-items-center rounded-full text-[8px] font-semibold text-white ring-2 ring-card`,q[t%q.length]),children:e},t))}),(0,V.jsxs)(`span`,{className:`ml-auto font-mono`,children:[t,`%`]})]})]})}function de(){return(0,V.jsx)(`section`,{className:`mx-auto max-w-6xl px-6 py-14`,children:(0,V.jsxs)(X,{className:`flex flex-col items-center gap-6`,children:[(0,V.jsx)(`p`,{className:`font-mono text-xs uppercase tracking-[0.2em] text-muted-foreground`,children:`Works with your coding agent`}),(0,V.jsxs)(`div`,{className:`flex flex-wrap items-center justify-center gap-x-10 gap-y-6 text-foreground/80`,children:[(0,V.jsx)(J,{label:`Claude Code`,children:(0,V.jsx)(w,{className:`size-6`})}),(0,V.jsxs)(J,{label:`Codex`,children:[(0,V.jsx)(te,{className:`size-6 dark:hidden`}),(0,V.jsx)(b,{className:`hidden size-6 dark:block`})]}),(0,V.jsxs)(J,{label:`Cursor`,children:[(0,V.jsx)(E,{className:`size-6 dark:hidden`}),(0,V.jsx)(C,{className:`hidden size-6 dark:block`})]}),(0,V.jsx)(J,{label:`Gemini`,children:(0,V.jsx)(O,{className:`size-6`})})]})]})})}function J({children:e,label:t}){return(0,V.jsxs)(`div`,{className:`flex items-center gap-2.5`,children:[e,(0,V.jsx)(`span`,{className:`text-sm font-medium`,children:t})]})}function fe(){return(0,V.jsxs)(`section`,{id:`how`,className:`mx-auto max-w-6xl scroll-mt-20 px-6 py-20`,children:[(0,V.jsx)(Z,{eyebrow:`how it works`,title:`From folder to flow in three steps`}),(0,V.jsxs)(`div`,{className:`mt-12 grid gap-10 lg:grid-cols-[1.2fr_1fr] lg:items-center`,children:[(0,V.jsx)(`div`,{className:`flex flex-col gap-8`,children:[{n:`01`,title:`Add AGENTS.md`,body:`Drop the convention into your repo — one file, works with Claude Code, Codex, Cursor and more. Copy the template from the guide.`},{n:`02`,title:`Your agent writes reviews`,body:`Before changing behavior, it writes a checklist to .agents/reviews/todo/ and waits for you to flip every box to [x].`},{n:`03`,title:`Watch the board`,body:`Open the repo in Lanework. Cards flow todo → processing → done as work gets approved and ships.`}].map((e,t)=>(0,V.jsx)(X,{delay:t*.08,children:(0,V.jsxs)(`div`,{className:`flex gap-5`,children:[(0,V.jsx)(`span`,{className:`font-mono text-sm text-primary`,children:e.n}),(0,V.jsxs)(`div`,{children:[(0,V.jsx)(`h3`,{className:`text-lg font-semibold tracking-tight`,children:e.title}),(0,V.jsx)(`p`,{className:`mt-1.5 max-w-md text-sm leading-relaxed text-muted-foreground`,children:e.body})]})]})},e.n))}),(0,V.jsx)(X,{delay:.1,children:(0,V.jsx)(pe,{})})]})]})}function pe(){return(0,V.jsxs)(`div`,{className:`rounded-2xl border border-border/70 bg-card p-5 shadow-sm`,children:[(0,V.jsx)(`p`,{className:`mb-4 font-mono text-xs text-muted-foreground`,children:`.agents/reviews/`}),(0,V.jsx)(`div`,{className:`flex flex-col gap-2`,children:[{folder:`todo/`,col:`todo`},{folder:`processing/`,col:`processing`},{folder:`done/`,col:`done`},{folder:`dropped/`,col:`dropped`}].map(e=>{let t=u[e.col];return(0,V.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,V.jsx)(`code`,{className:`w-28 font-mono text-sm text-foreground`,children:e.folder}),(0,V.jsx)(d,{icon:j,className:`size-4 text-muted-foreground`}),(0,V.jsxs)(`span`,{className:`inline-flex items-center gap-2 rounded-full bg-muted px-2.5 py-1 text-xs font-medium`,children:[(0,V.jsx)(d,{icon:t.icon,className:g(`size-3.5`,t.color)}),t.label]})]},e.folder)})}),(0,V.jsxs)(`p`,{className:`mt-4 inline-flex flex-wrap items-center gap-x-1.5 gap-y-1 border-t pt-4 font-mono text-[11px] leading-relaxed text-muted-foreground`,children:[`frontmatter`,(0,V.jsx)(d,{icon:j,className:`size-3`}),`priority · assignees · tags`,(0,V.jsx)(`span`,{className:`w-full`}),`checkboxes`,(0,V.jsx)(d,{icon:j,className:`size-3`}),`progress`]})]})}function me(){return(0,V.jsxs)(`section`,{id:`features`,className:`mx-auto max-w-6xl scroll-mt-20 px-6 py-20`,children:[(0,V.jsx)(Z,{eyebrow:`features`,title:`Everything you need to triage agent work`}),(0,V.jsx)(`div`,{className:`mt-12 grid gap-px overflow-hidden rounded-2xl border border-border/70 bg-border/70 sm:grid-cols-2 lg:grid-cols-3`,children:[{icon:i,title:`Board & List`,body:`Four columns from your folders, or a dense list view. Your reviews, organized the way you think.`},{icon:F,title:`Filter by tag & owner`,body:`Slice to My tasks or any tag. The top tags surface right in the sidebar.`},{icon:ne,title:`Full-screen review`,body:`Open a card for the rendered markdown plus a clean metadata panel — status, priority, progress.`},{icon:A,title:`GitHub-native, read-only`,body:`Sign in, pick a repo. Lanework reads your reviews and never writes back — your files stay yours.`},{icon:ee,title:`Fast by design`,body:`File contents batch over GraphQL with an instant skeleton, so big boards open quick.`},{icon:R,title:`Built to feel good`,body:`Fluid motion, dark-mode tokens, and a “/” to jump between repos. A tool you’ll want to open.`}].map((e,t)=>(0,V.jsx)(X,{delay:t%3*.06,className:`bg-card`,children:(0,V.jsxs)(`div`,{className:`group h-full p-6 transition-colors hover:bg-muted/30`,children:[(0,V.jsx)(`span`,{className:`grid size-10 place-items-center rounded-xl bg-primary/10 text-primary transition-transform group-hover:scale-105`,children:(0,V.jsx)(d,{icon:e.icon,className:`size-5`})}),(0,V.jsx)(`h3`,{className:`mt-4 font-semibold tracking-tight`,children:e.title}),(0,V.jsx)(`p`,{className:`mt-1.5 text-sm leading-relaxed text-muted-foreground`,children:e.body})]})},e.title))})]})}var he=`---
2
2
  assignees: ["you"]
3
3
  created_at: 2026-06-21
4
4
  priority: high
@@ -9,23 +9,23 @@ var tsrStartManifest = () => ({ routes: {
9
9
  "/board/$owner/$repo"
10
10
  ],
11
11
  preloads: [
12
- "/assets/index-TbIMjf2L.js",
12
+ "/assets/index-BBeG6qcu.js",
13
13
  "/assets/chunk-Cyuzqnbw.js",
14
14
  "/assets/link-CUk1Z0N6.js"
15
15
  ],
16
16
  scripts: [{ attrs: {
17
17
  type: "module",
18
18
  async: !0,
19
- src: "/assets/index-TbIMjf2L.js"
19
+ src: "/assets/index-BBeG6qcu.js"
20
20
  } }]
21
21
  },
22
22
  "/": {
23
23
  filePath: "/Users/pp/fuongz_projects/vibe/agents-kanban/packages/shared/src/routes/index.tsx",
24
24
  children: void 0,
25
25
  preloads: [
26
- "/assets/routes-DhFdKFMi.js",
27
- "/assets/review-status-RAnd_eAC.js",
28
- "/assets/gemini-2_FJD5P-.js",
26
+ "/assets/routes-0vSeDi9u.js",
27
+ "/assets/review-status-DNKYsJwj.js",
28
+ "/assets/gemini-FrNNf4gc.js",
29
29
  "/assets/Tag01Icon-DNgtGZ3r.js"
30
30
  ]
31
31
  },
@@ -33,9 +33,9 @@ var tsrStartManifest = () => ({ routes: {
33
33
  filePath: "/Users/pp/fuongz_projects/vibe/agents-kanban/packages/shared/src/routes/guide.tsx",
34
34
  children: void 0,
35
35
  preloads: [
36
- "/assets/guide-BXJBZbQA.js",
37
- "/assets/review-status-RAnd_eAC.js",
38
- "/assets/gemini-2_FJD5P-.js",
36
+ "/assets/guide-BcU07F30.js",
37
+ "/assets/review-status-DNKYsJwj.js",
38
+ "/assets/gemini-FrNNf4gc.js",
39
39
  "/assets/reviews-core-BKrjFeCa.js"
40
40
  ]
41
41
  },
@@ -43,12 +43,12 @@ var tsrStartManifest = () => ({ routes: {
43
43
  filePath: "/Users/pp/fuongz_projects/vibe/agents-kanban/packages/shared/src/routes/board.$owner.$repo.tsx",
44
44
  children: void 0,
45
45
  preloads: [
46
- "/assets/board._owner._repo-DyrvTwhk.js",
47
- "/assets/board._owner._repo-hvj6B94q.js",
48
- "/assets/review-status-RAnd_eAC.js",
46
+ "/assets/board._owner._repo-BahBdjhM.js",
47
+ "/assets/review-status-DNKYsJwj.js",
49
48
  "/assets/Tag01Icon-DNgtGZ3r.js",
50
- "/assets/dist-DZ2bn-Z6.js",
51
- "/assets/reviews-core-BKrjFeCa.js"
49
+ "/assets/dist-C8XwKPa6.js",
50
+ "/assets/reviews-core-BKrjFeCa.js",
51
+ "/assets/board._owner._repo-DyrvTwhk.js"
52
52
  ]
53
53
  }
54
54
  } });
@@ -88,7 +88,7 @@ function CardSkeleton() {
88
88
  //#endregion
89
89
  //#region ../../packages/shared/src/routes/board.$owner.$repo.tsx
90
90
  var $$splitErrorComponentImporter = () => import("./board._owner._repo-BxCYRjn3.js");
91
- var $$splitComponentImporter = () => import("./board._owner._repo-BgLMPzjG.js");
91
+ var $$splitComponentImporter = () => import("./board._owner._repo-DkTATrxq.js");
92
92
  var Route = createFileRoute("/board/$owner/$repo")({
93
93
  validateSearch: (s) => ({
94
94
  mine: s.mine === true || s.mine === "true" ? true : void 0,
@@ -1,6 +1,6 @@
1
1
  import { a as REVIEW_COLUMNS, c as progressPercent } from "./github-cUIlMgs7.js";
2
2
  import { i as getCardContent, r as getBoard, s as cn, t as Skeleton } from "./skeleton-Cpl83ip3.js";
3
- import { t as Route } from "./board._owner._repo-WPs_mhzX.js";
3
+ import { t as Route } from "./board._owner._repo-Bpsm6LuL.js";
4
4
  import { a as Dialog, c as DialogHeader, l as DialogTitle, n as AppShell, o as DialogContent, r as tagPill, s as DialogDescription, t as STATUS_META } from "./review-status-CdlhgE_Y.js";
5
5
  import { useEffect, useMemo, useState } from "react";
6
6
  import { useRouter } from "@tanstack/react-router";
@@ -353,32 +353,70 @@ function Checkbox$1({ className, ...props }) {
353
353
  }
354
354
  //#endregion
355
355
  //#region ../../packages/shared/src/components/kanban/review-dialog.tsx
356
- var markdownComponents = {
357
- input({ type, checked, ...props }) {
358
- if (type === "checkbox") return /* @__PURE__ */ jsx(Checkbox$1, {
359
- checked: !!checked,
360
- disabled: true,
361
- className: "relative top-px mr-0.5 inline-grid align-text-bottom disabled:opacity-100 data-checked:bg-primary"
362
- });
363
- return /* @__PURE__ */ jsx("input", {
364
- type,
365
- ...props
366
- });
367
- },
368
- li({ className, children, ...props }) {
369
- const isTask = className?.includes("task-list-item");
370
- return /* @__PURE__ */ jsx("li", {
371
- className: cn(className, isTask && "list-none marker:content-none"),
372
- ...props,
373
- children
374
- });
375
- }
376
- };
356
+ /**
357
+ * Build markdown components that render GFM task lists as interactive,
358
+ * Notion-style tasks. Checkbox state is tracked locally by source-line number
359
+ * (`checks`) so toggling is instant and survives re-renders of the same
360
+ * document. Toggling does not write back to GitHub — it's a local working view.
361
+ */
362
+ function makeMarkdownComponents(checks, toggle) {
363
+ return {
364
+ input({ type, checked, node, ...props }) {
365
+ if (type === "checkbox") {
366
+ const line = node?.position?.start.line ?? 0;
367
+ return /* @__PURE__ */ jsx(Checkbox$1, {
368
+ checked: checks[line] ?? !!checked,
369
+ onCheckedChange: () => toggle(line),
370
+ onClick: (e) => e.stopPropagation(),
371
+ className: "relative top-0.5 mr-0.5 inline-grid shrink-0 cursor-pointer align-text-bottom data-checked:bg-primary"
372
+ });
373
+ }
374
+ return /* @__PURE__ */ jsx("input", {
375
+ type,
376
+ ...props
377
+ });
378
+ },
379
+ ul({ className, children, ...props }) {
380
+ const isTaskList = className?.includes("contains-task-list");
381
+ return /* @__PURE__ */ jsx("ul", {
382
+ className: cn(className, isTaskList && "my-2 list-none pl-0"),
383
+ ...props,
384
+ children
385
+ });
386
+ },
387
+ li({ className, children, node, ...props }) {
388
+ if (!className?.includes("task-list-item")) return /* @__PURE__ */ jsx("li", {
389
+ className,
390
+ ...props,
391
+ children
392
+ });
393
+ const line = node?.position?.start.line ?? 0;
394
+ return /* @__PURE__ */ jsx("li", {
395
+ className: cn(className, "group/task my-0.5 flex cursor-pointer list-none items-start gap-2 rounded-md px-2 py-1 transition-colors marker:content-none select-none hover:bg-muted/60", (checks[line] ?? false) && "text-muted-foreground line-through decoration-muted-foreground/40"),
396
+ onClick: (e) => {
397
+ if (e.target.closest("a")) return;
398
+ toggle(line);
399
+ },
400
+ ...props,
401
+ children
402
+ });
403
+ }
404
+ };
405
+ }
377
406
  function ReviewDialog({ owner, repo, branch }) {
378
407
  const activeCard = useBoardStore((s) => s.activeCard);
379
408
  const closeCard = useBoardStore((s) => s.closeCard);
380
409
  const [content, setContent] = useState(null);
381
410
  const [error, setError] = useState(null);
411
+ const [checks, setChecks] = useState({});
412
+ const body = content ? stripFrontmatter(content) : "";
413
+ useEffect(() => {
414
+ setChecks(parseTaskStates(body));
415
+ }, [body]);
416
+ const markdownComponents = useMemo(() => makeMarkdownComponents(checks, (line) => setChecks((prev) => ({
417
+ ...prev,
418
+ [line]: !prev[line]
419
+ }))), [checks]);
382
420
  useEffect(() => {
383
421
  if (!activeCard) return;
384
422
  let cancelled = false;
@@ -467,7 +505,7 @@ function ReviewDialog({ owner, repo, branch }) {
467
505
  /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-2/3" })
468
506
  ]
469
507
  }),
470
- children: stripFrontmatter(content)
508
+ children: body
471
509
  })
472
510
  })
473
511
  ]
@@ -597,6 +635,18 @@ function Row({ icon, label, children }) {
597
635
  function stripFrontmatter(md) {
598
636
  return md.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/, "");
599
637
  }
638
+ /**
639
+ * Map each GFM task-list line (1-based, matching react-markdown's source
640
+ * positions) to its initial checked state, so toggles start from the document.
641
+ */
642
+ function parseTaskStates(body) {
643
+ const states = {};
644
+ body.split("\n").forEach((rawLine, i) => {
645
+ const match = rawLine.match(/^\s*[-*+]\s+\[([ xX])\]\s/);
646
+ if (match) states[i + 1] = match[1].toLowerCase() === "x";
647
+ });
648
+ return states;
649
+ }
600
650
  //#endregion
601
651
  //#region ../../packages/shared/src/hooks/use-local-live.ts
602
652
  /**
@@ -3,12 +3,12 @@ import { t as getAuth } from "./auth-CtuIV0ur.js";
3
3
  import { c as createSsrRpc } from "./skeleton-Cpl83ip3.js";
4
4
  import { i as TooltipProvider, t as Route$2 } from "./guide-DZLtOn4o.js";
5
5
  import { t as Route$3 } from "./routes-BlJSk7OV.js";
6
- import { t as Route$4 } from "./board._owner._repo-WPs_mhzX.js";
6
+ import { t as Route$4 } from "./board._owner._repo-Bpsm6LuL.js";
7
7
  import { HeadContent, Outlet, Scripts, createFileRoute, createRootRoute, createRouter } from "@tanstack/react-router";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  import { MotionConfig } from "motion/react";
10
10
  //#region ../../packages/shared/src/styles/app.css?url
11
- var app_default = "/assets/app-DMYVKfjU.css";
11
+ var app_default = "/assets/app-BLu5Ut7v.css";
12
12
  //#endregion
13
13
  //#region ../../packages/shared/src/routes/__root.tsx
14
14
  var SITE_URL = "https://lanework.dev";
@@ -3459,7 +3459,7 @@ var defaultSerovalPlugins = [
3459
3459
  * the dev styles URL for route-scoped CSS collection.
3460
3460
  */
3461
3461
  async function getStartManifest(matchedRoutes) {
3462
- const { tsrStartManifest } = await import("./assets/_tanstack-start-manifest_v-CNDxZb5c.js");
3462
+ const { tsrStartManifest } = await import("./assets/_tanstack-start-manifest_v-B0OMELmw.js");
3463
3463
  const startManifest = tsrStartManifest();
3464
3464
  let routes = startManifest.routes;
3465
3465
  routes[rootRouteId];
@@ -5385,7 +5385,7 @@ var getBaseManifest = getProdBaseManifest;
5385
5385
  var createEarlyHintsForRequest = createEarlyHintsCollector;
5386
5386
  async function loadEntries() {
5387
5387
  const [routerEntry, startEntry, pluginAdapters] = await Promise.all([
5388
- import("./assets/router-CaG3M3Zu.js"),
5388
+ import("./assets/router-DU-_0lCL.js"),
5389
5389
  import("./assets/start-BJllm2D8.js"),
5390
5390
  import("./assets/empty-plugin-adapters-CrnNP3b2.js")
5391
5391
  ]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phake/lanework",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "type": "module",
5
5
  "description": "Run the lanework Kanban board locally against any repo's .agents/reviews folder — no Cloudflare, no auth, no network.",
6
6
  "license": "MIT",