@shivaedev/work-board 0.7.0 → 0.7.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.
Files changed (43) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +9 -0
  3. package/assets/native.js +1 -1
  4. package/dist/board.d.ts.map +1 -1
  5. package/dist/board.js +6 -0
  6. package/dist/board.js.map +1 -1
  7. package/dist/cli.js +1 -1
  8. package/dist/http/page.d.ts.map +1 -1
  9. package/dist/http/page.js +4 -0
  10. package/dist/http/page.js.map +1 -1
  11. package/dist/http/start.d.ts +4 -0
  12. package/dist/http/start.d.ts.map +1 -0
  13. package/dist/http/start.js +12 -0
  14. package/dist/http/start.js.map +1 -0
  15. package/dist/page/navigationScript.js +1 -1
  16. package/dist/page/shell.d.ts +1 -1
  17. package/dist/page/shell.d.ts.map +1 -1
  18. package/dist/page/shell.js +1 -1
  19. package/dist/page/shell.js.map +1 -1
  20. package/dist/page/startHtml.d.ts +2 -0
  21. package/dist/page/startHtml.d.ts.map +1 -0
  22. package/dist/page/startHtml.js +10 -0
  23. package/dist/page/startHtml.js.map +1 -0
  24. package/dist/page/startTemplates.d.ts +14 -0
  25. package/dist/page/startTemplates.d.ts.map +1 -0
  26. package/dist/page/startTemplates.js +104 -0
  27. package/dist/page/startTemplates.js.map +1 -0
  28. package/dist/page/style.d.ts.map +1 -1
  29. package/dist/page/style.js +12 -0
  30. package/dist/page/style.js.map +1 -1
  31. package/dist/rpc/contract.js +1 -1
  32. package/dist/rpc/contract.js.map +1 -1
  33. package/package.json +1 -1
  34. package/src/board.ts +6 -0
  35. package/src/cli.ts +1 -1
  36. package/src/http/page.ts +4 -0
  37. package/src/http/start.ts +16 -0
  38. package/src/page/navigationScript.ts +1 -1
  39. package/src/page/shell.ts +2 -2
  40. package/src/page/startHtml.ts +10 -0
  41. package/src/page/startTemplates.ts +103 -0
  42. package/src/page/style.ts +12 -0
  43. package/src/rpc/contract.ts +1 -1
package/CHANGELOG.md CHANGED
@@ -4,8 +4,24 @@
4
4
 
5
5
  ### Changed
6
6
 
7
+ - Remove document export and shareable artifact/packet generation from the vision
8
+ and delivery scope. Keep onboarding/report templates and linked in-app review.
7
9
  - Record the approved Platform-first live client direction and its actual shared HTTP/browser fixture evidence; Work Board adopts that foundation in 0.5.0 below.
8
10
 
11
+ ## 0.7.1 - 2026-10-06
12
+
13
+ ### Added
14
+
15
+ - Useful empty-workspace guidance and persistent getting-started access to copyable
16
+ project, investigation and agent-result Markdown templates. Read the same page
17
+ through server-rendered links and native page navigation with Back preservation. Keep source
18
+ creation in existing editors/agent tools and evidence unrecorded until observed.
19
+
20
+ ### Changed
21
+
22
+ - Keep document printing focused on readable content and diagram-source fallback.
23
+ No document export or portable packet generation is part of this project.
24
+
9
25
  ## 0.7.0 - 2026-10-06
10
26
 
11
27
  ### Added
package/README.md CHANGED
@@ -9,6 +9,15 @@ pnpm add --global @shivaedev/work-board
9
9
  work-board ./project-notes --port 4747 --home plan.md
10
10
  ```
11
11
 
12
+ For an empty folder, omit `--home` until its home file exists. It opens
13
+ getting-started guidance at `/`. **Getting started** in the
14
+ sidebar remains available at `/_board/start`, with copyable project, investigation
15
+ and agent-result Markdown templates. Focus a template text area, select all and
16
+ copy; save through your editor or agent tool. Replace example IDs and matching
17
+ references, and record evidence only after an actual observation. The viewer
18
+ does not create project files. Templates and links also work without JavaScript.
19
+ Browser print focuses on the document; document export is outside product scope.
20
+
12
21
  It listens on `127.0.0.1` only and answers only requests addressed to a loopback
13
22
  host. Every `.md` file under the folder appears in the collapsible sidebar with
14
23
  how long ago it changed. Below the folder, files and folders starting with a dot
package/assets/native.js CHANGED
@@ -33,4 +33,4 @@ ${t}}`),r},rg="~effect/Fiber",U3={_A:L,_E:L},D3={id:0},Ji=()=>globalThis[cf],og=
33
33
  `,i)}return r=r.slice(i),gE(r.length,t)&&o(t),c},encode:s=>{if(Array.isArray(s)){if(s.length===0)return;let i="";for(let a=0;a<s.length;a++)i+=JSON.stringify(s[a])+`
34
34
  `;return i}return JSON.stringify(s)+`
35
35
  `}}}})},$z=xE(),qz=e=>En.of({contentType:e?.contentType??"application/json",includesFraming:!1,codecFor:oh,makeUnsafe:()=>{let t=new TextDecoder,n=new Map;return{decode:r=>{let o=JSON.parse(typeof r=="string"?r:t.decode(r));return Hz(o,n)},encode:r=>{let o=Wz(r,n);return o&&JSON.stringify(o)}}}}),zz=e=>En.of({contentType:e?.contentType??"application/json-rpc",includesFraming:!0,codecFor:oh,makeUnsafe:()=>{let t=xE({maxBufferSize:e?.maxBufferSize}).makeUnsafe(),n=new Map;return{decode:r=>{let o=t.decode(r);if(o.length===0)return[];let s=[];for(let i=0;i<o.length;i++){let a=o[i];s.push(...Hz(a,n))}return s},encode:r=>{let o=Wz(r,n);return o&&t.encode(o)}}}});function Hz(e,t){if(Array.isArray(e)){let n={size:0,responses:new Map},r=[];for(let o=0;o<e.length;o++){let s=Nz(e[o]);r.push(s),s._tag==="Request"&&!s.isNotification&&(n.size++,t.set(s.id,n))}return r}return[Nz(e)]}function Nz(e){if(Object.hasOwn(e,"method")){let r=e;if(IA(r.id)&&r.method.startsWith("@effect/rpc/")){let o=r.method.slice(12),s=r.params?.requestId;return s?{_tag:o,requestId:s}:{_tag:o}}return{_tag:"Request",id:r.id??"",tag:r.method,payload:r.params??null,headers:r.headers??[],...B(r,"id")?{}:{isNotification:!0},...r.spanId?{traceId:r.traceId,spanId:r.spanId,sampled:r.sampled}:{}}}let t=e,n=Object.hasOwn(t,"error");return n&&t.error&&t.error._tag==="Defect"?{_tag:"Defect",defect:t.error.data}:Object.hasOwn(t,"chunk")&&t.chunk===!0?{_tag:"Chunk",requestId:t.id??"",values:t.result}:{_tag:"Exit",requestId:t.id??"",exit:n&&t.error!=null?{_tag:"Failure",cause:t.error._tag==="Cause"?t.error.data:[{_tag:"Die",defect:t.error}]}:{_tag:"Success",value:t.result}}}function Lz(e,t){if(!("requestId"in e))return rA(e);let n=t.get(e.requestId);return n?(t.delete(e.requestId),n.responses.set(e.requestId,e),n.size===n.responses.size?Array.from(n.responses.values(),rA):void 0):rA(e)}function Wz(e,t){if(Array.isArray(e)===!1)return Lz(e,t);if(e.length===0)return;let n=[];for(let o=0;o<e.length;o++){let s=Lz(e[o],t);s!==void 0&&n.push(s)}if(n.length===0)return;if(n.length===1)return n[0];let r=[];for(let o=0;o<n.length;o++){let s=n[o];Array.isArray(s)?r.push(...s):r.push(s)}return r}function rA(e){switch(e._tag){case"Request":return{jsonrpc:"2.0",method:e.tag,params:e.payload,...e.isNotification?{}:{id:e.id},...e.headers?.length>0?{headers:e.headers}:{},traceId:e.traceId,spanId:e.spanId,sampled:e.sampled};case"Ping":case"Pong":case"Interrupt":case"Ack":case"Eof":return{jsonrpc:"2.0",method:`@effect/rpc/${e._tag}`,params:"requestId"in e?{requestId:e.requestId}:void 0};case"Chunk":return{jsonrpc:"2.0",chunk:!0,id:e.requestId,result:e.values};case"Exit":{if(e.exit._tag==="Success")return{jsonrpc:"2.0",id:e.requestId??void 0,result:e.exit.value};let t=e.exit.cause.find(r=>r._tag==="Fail"),n=t?._tag==="Fail"?t.error:void 0;return{jsonrpc:"2.0",id:e.requestId??void 0,error:e.exit._tag==="Failure"?{_tag:"Cause",code:n&&B(n,"code")?Number(n.code):0,message:n&&B(n,"message")?n.message:JSON.stringify(e.exit.cause),data:e.exit.cause}:void 0}}case"Defect":return{jsonrpc:"2.0",id:Zne,error:{_tag:"Defect",code:1,message:"A defect occurred",data:e.defect}};case"ClientProtocolError":return{}}}var Zne=-32603,oA=e=>{let{maxBufferSize:t=Bz,...n}=e??{};return En.of({contentType:"application/msgpack",includesFraming:!0,codecFor:oh,makeUnsafe:()=>{let r=new Ri(n),o=new Ac(n),s=new TextEncoder,i,a=c=>{throw i=void 0,new rh({maxBufferSize:c})};return{decode(c){let u=typeof c=="string"?s.encode(c):c;if(i!==void 0){gE(i.length+u.length,t)&&a(t);let f=u;c=new Uint8Array(i.length+u.length),c.set(i),c.set(f,i.length),u=c,i=void 0}try{return r.unpackMultiple(u)}catch(f){let l=f;if(l.incomplete)return i=u.subarray(l.lastPosition),gE(i.length,t)&&a(t),l.values??[];throw f}},encode:c=>o.pack(c)}}})},Kz=oA({useRecords:!0}),Qne=16*1024*1024,Yne=new TextEncoder,Xne=e=>{let t=e?.maxFrameSize??Qne,n=e?.fingerprintPayloads===!0?o=>VC(o,{fingerprint:!0}):VC,r={fingerprint:!0,dictionary:!0};return En.of({contentType:"application/vnd.effect.rpc+schema-binary",includesFraming:!0,codecFor:n,makeUnsafe:()=>{let o=Zq(yC,{...r,maxFrameSize:t}),s=Yq(yC,r);return{decode:i=>o.feedSync(typeof i=="string"?Yne.encode(i):i),encode:i=>{if(!Array.isArray(i))return s.encode(i);if(i.length!==0)return s.encodeMany(i)}}}})},ere=ii(En)(jz),tre=ii(En)($z),nre=e=>ii(En)(xE(e)),rre=e=>ii(En)(qz(e)),ore=e=>ii(En)(zz(e)),sre=ii(En)(Kz),ire=e=>ii(En)(oA(e)),are=e=>W0(En)(()=>Xne(e));var yE=class extends Ke()("effect/rpc/RpcWorker/InitialMessage"){};var Jz=e=>K(()=>{let t=new Set,n=new Map,r=new Map,o=(s,i)=>cr(a=>{let c=n.get(s);return c||(c=[],n.set(s,c)),c.push([i,a]),H});return Y(e((s,i)=>{let a=r.get(s);return a?a(i):o(s,i)},t),s=>({...s,run(i,a){return qt(function*(){t.add(i),r.set(i,a);let c=n.get(i);if(c){n.delete(i);for(let[u,f]of c)yield*Nn(K(()=>a(u)),f)}return yield*ur(Hr,()=>(t.delete(i),r.delete(i),H))})}}))});var ure=e=>yr(e,"RpcClientError"),fre=0,Gz=ye(function*(e,t){let n=t?.spanPrefix??"RpcClient",r=t?.supportsAck??!0,o=t?.disableTracing??!1,s=t?.generateRequestId??(()=>fre++),i=yield*ar(),a=qe(i,It),c=new Map,u=!1;yield*_t(a,xn(E=>(u=!0,f(Lg(E.id)))));let f=ye(function*(E){for(let[y,w]of c)c.delete(y),w._tag==="Queue"?yield*E._tag==="Success"?zp(w.queue):Zt(w.queue,E.cause):w.resume(E)}),l=E=>{let y=jm(E.successSchema),w=h(E);return(S,C)=>{let _=C?.headers?ki(C.headers):Kl,R=C?.context??bt();if(!y){let q=P=>p(E,w,P,E.payloadSchema.make(S),_,R,C?.discard??!1);return o?q(void 0):cp(`${n}.${E._tag}`,{attributes:t.spanAttributes},q)}let M=m(E,w,E.payloadSchema.make(S),_,C?.streamBufferSize??16,R);return C?.asQueue?M:mr(Y(M,Ii))}},p=(E,y,w,S,C,_,R)=>xn(M=>{if(u)return ho;let q=s(),P=y(ee=>t.onFromClient({message:ee,context:_,discard:R}),{_tag:"Request",id:q,tag:E._tag,payload:S,...w?{traceId:w.traceId,spanId:w.spanId,sampled:w.sampled}:{},headers:Vl(M.getRef(SE),C)});if(R)return P;let te;return ui(Es(ee=>{let T={_tag:"Effect",rpc:E,context:_,resume(z){ee(z),te&&!te.pollUnsafe()&&M.currentDispatcher.scheduleTask(()=>{te.interruptUnsafe(M.id)},0)}};c.set(q,T),te=P.pipe(w?Xf(w,{captureStackTrace:!1}):L,Ln(M.context)),te.addObserver(z=>{if(z._tag==="Failure")return ee(z)})}),ee=>(c.delete(q),Dn(yo(te),g(q,Array.from(ee),_))))}),m=ye(function*(E,y,w,S,C,_){if(u)return yield*ho;let R=o?void 0:yield*Uw(`${n}.${E._tag}`,{attributes:t.spanAttributes}),M=xi(),q=s(),P=Jn(M.context,It);yield*Fo(P,ee=>c.has(q)?(c.delete(q),g(q,ri(ee)?Array.from(XM(ee.cause)):[],_)):H);let te=yield*Ou(C);return c.set(q,{_tag:"Queue",rpc:E,queue:te,scope:P,context:_}),yield*y(ee=>t.onFromClient({message:ee,context:_,discard:!1}),{_tag:"Request",id:q,tag:E._tag,payload:w,...R?{traceId:R.traceId,spanId:R.spanId,sampled:R.sampled}:{},headers:Vl(M.getRef(SE),S)}).pipe(R?Xf(R,{captureStackTrace:!1}):L,ft(ee=>Zt(te,ee)),ra,Ut(P,{startImmediately:!0})),te}),h=E=>{let y=[];for(let w of E.middlewares.values()){let S=qi(i,`${w.key}/Client`);S&&y.push(S)}return y.length===0?(w,S)=>w(S):function w(S,C,_=y.length-1){return _===-1?S(C):y[_]({rpc:E,request:C,next(R){return w(S,R,_-1)}})}},g=(E,y,w)=>Es(S=>{let C=xi();t.onFromClient({message:{_tag:"Interrupt",requestId:E,interruptors:y},context:w,discard:!1}).pipe(Iw(1e3),Ln(C.context)).addObserver(()=>{S(H)})}),x=E=>{switch(E._tag){case"Chunk":{let y=E.requestId,w=c.get(y);return!w||w._tag!=="Queue"?H:ga(w.queue,E.values).pipe(r?A(()=>t.onFromClient({message:{_tag:"Ack",requestId:E.requestId},context:w.context,discard:!1})):L,ft(S=>Zt(w.queue,S)))}case"Exit":{let y=E.requestId,w=c.get(y);return w?(c.delete(y),w._tag==="Effect"?(w.resume(E.exit),H):E.exit._tag==="Success"?zp(w.queue):Zt(w.queue,E.exit.cause)):H}case"Defect":return f(Ng(E.defect));case"ClientEnd":return H}},b;if(t.flatten){let E=new Map;b=function(w,S,C){let _=E.get(w);return _||(_=l(e.requests.get(w)),E.set(w,_)),_(S,C)}}else b={},e.requests.forEach(E=>{W(b,E._tag,l(E))});return{client:b,write:x}}),lre=0,sA=ye(function*(e,t){let n=lre++,{codecFor:r,run:o,send:s,supportsAck:i,supportsTransferables:a}=yield*Pi,c=dre(r),u=dm(r(ln())),f=new Map,{client:l,write:p}=yield*Gz(e,{...t,supportsAck:i,onFromClient({message:m}){switch(m._tag){case"Request":{let h=e.requests.get(m.tag),g=a?eq():void 0,x=xi(),b={rpc:h,context:g?Ve(x.context,Bm,g):x.context,schemas:c(h)};return f.set(m.id,b),b.schemas.encodePayload(m.payload).pipe(Nn(b.context),ci,A(E=>s(n,{...m,id:m.id,payload:E,headers:Object.entries(m.headers)},g&&g.readUnsafe())))}case"Ack":return f.get(m.requestId)?s(n,{_tag:"Ack",requestId:m.requestId}):H;case"Interrupt":return f.get(m.requestId)?(f.delete(m.requestId),s(n,{_tag:"Interrupt",requestId:m.requestId})):H;case"Eof":return H}}});return yield*o(n,m=>{switch(m._tag){case"Chunk":{let h=zm(m.requestId),g=f.get(h);return!g||ge(g.schemas.decodeChunk)?H:g.schemas.decodeChunk.value(m.values).pipe(Nn(g.context),ci,A(x=>p({_tag:"Chunk",clientId:0,requestId:zm(m.requestId),values:x})),mo(x=>p({_tag:"Exit",clientId:0,requestId:zm(m.requestId),exit:jt(x)})))}case"Exit":{let h=zm(m.requestId),g=f.get(h);return g?(f.delete(h),g.schemas.decodeExit(m.exit).pipe(Nn(g.context),ci,Kr({onSuccess:x=>p({_tag:"Exit",clientId:0,requestId:h,exit:x}),onFailure:x=>p({_tag:"Exit",clientId:0,requestId:h,exit:jt(x)})}))):H}case"Defect":return p({_tag:"Defect",clientId:0,defect:u(m.defect)});case"ClientProtocolError":{let h=Mo(m.error);return Do(f.keys(),g=>p({_tag:"Exit",clientId:0,requestId:g,exit:h}))}default:return H}}).pipe(ft(fp),ra,bs),l}),dre=e=>{let t=new WeakMap;return n=>{let r=t.get(n);if(r!==void 0)return r;let o=qS(n.successSchema);return r={decodeChunk:Lt(o,s=>hc(e(rS(s.success)))),encodePayload:tS(e(n.payloadSchema)),decodeExit:hc(e(gC(n)))},t.set(n,r),r}},SE=Me("effect/rpc/RpcClient/CurrentHeaders",{defaultValue:()=>Kl}),pre=d(2,(e,t)=>Rw(e,SE,Vl(ki(t)))),Pi=class extends Ke()("effect/rpc/RpcClient/Protocol"){static make=Jz},Zz=e=>Pi.make(ye(function*(t){let n=yield*En,r=n.includesFraming,o=u=>new qs({reason:Jl.fromHttpClientError(u)}),s=(u,f)=>new qs({reason:new Tc({message:u,cause:f})}),i=u=>s("Received empty HTTP response from RPC server",u),a=u=>s("HTTP response ended before RPC request completed",u);return{send:ye(function*(u,f){if(f._tag!=="Request")return;let l=n.makeUnsafe(),p=l.encode(f),m=typeof p=="string"?Fk(p,n.contentType):TS(p,n.contentType),h=yield*e.post("",{body:m}).pipe(Yf(o));if(!r){let b=yield*h.text.pipe(Yf(o)),E=yield*No({try:()=>l.decode(b),catch:S=>s("Error decoding HTTP response",S)});if(!Array.isArray(E))return yield*s("Expected an array of responses",E);if(E.length===0)return yield*i(f);let y=!1,w=0;return yield*Qn({while:()=>w<E.length,body:()=>{let S=E[w++];return SC(S)&&(y=!0),t(u,S)},step:bn}),y?void 0:yield*a(f)}let g=!1,x=!1;if(yield*Wl(h.stream,b=>No({try:()=>b.flatMap(l.decode),catch:E=>s("Error decoding HTTP response",E)}).pipe(A(E=>{if(E.length===0)return H;g=!0;let y=0;return Qn({while:()=>y<E.length,body:()=>{let w=E[y++];return SC(w)&&(x=!0),t(u,w)},step:bn})}))).pipe(Yf(b=>ure(b)?b:o(b))),g){if(!x)return yield*a(f)}else return yield*i(f)}),supportsAck:!1,supportsTransferables:!1,codecFor:n.codecFor}})),mre=e=>qr(Pi)(A(zk,t=>(t=j$(t,M$(e.url)),Zz(e.transformClient?e.transformClient(t):t)))),Qz=e=>Pi.make(ye(function*(t,n){let r=yield*H$,o=yield*En,s=yield*hu(ih),i=new Map,a=yield*r.writer,c=o.makeUnsafe(),u=yield*gre(K(()=>a(c.encode(oq)))),f,l=K(()=>(f=void 0,Te(s)?s.value.onConnect:H)),p=h=>Do(n,g=>t(g,h)),m=h=>(f=h,p({_tag:"ClientProtocolError",error:h}));return yield*K(()=>(c=o.makeUnsafe(),u.reset(),r.runRaw(h=>{try{let g=c.decode(h);if(g.length===0)return;let x=0;return Qn({while:()=>x<g.length,body:()=>{let b=g[x++];if(b._tag==="Pong")return u.onPong(),H;if(Object.hasOwn(b,"requestId")){let E=b.requestId,y=i.get(E);if(y!==void 0)return b._tag==="Exit"&&i.delete(E),t(y,b)}return p(b)},step:bn})}catch(g){return p({_tag:"ClientProtocolError",error:new qs({reason:new Tc({message:"Error decoding message",cause:g})})})}},{onOpen:l}).pipe(Ya(A(u.timeout,()=>G(new Zl({reason:new Pm({kind:"Timeout",cause:new Error("ping timeout")})}))))))).pipe(A(()=>G(new Zl({reason:new Fm({code:1e3})}))),Te(s)?na(s.value.onDisconnect):L,sp(h=>{let g=jf(h),x=Kt(g),b=new qs({reason:x?g.success.reason:new Tc({message:"Unknown socket error",cause:su(h)})});return e?.retryTransientErrors&&x&&g.success.reason._tag==="SocketOpenError"?(e.onTransientError?.(b)??H).pipe(ww({log:!0,message:"RpcClient onTransientError hook failed"})):m(b)}),Ew(e?.retryPolicy??hre,h=>m(new qs({reason:h.reason}))),fx({module:"RpcClient",method:"makeProtocolSocket"}),bs),{send(h,g){if(f)return G(f);g._tag==="Request"&&i.set(g.id,h);let x=c.encode(g);return x===void 0?H:ci(a(x))},supportsAck:!0,supportsTransferables:!1,codecFor:o.codecFor}})),hre=WP([KP(500,1.5),Vf(5e3)]),gre=ye(function*(e){let t=!0,n=fr(),r=()=>{t=!0,n.closeUnsafe()},o=()=>{t=!0};return yield*K(()=>t?(t=!1,e):n.open).pipe(ta("5 seconds"),bw,Ht,ra,bs),{timeout:n.await,reset:r,onPong:o}}),xre=e=>qr(Pi)(Qz(e)),Yz=e=>Pi.make(ye(function*(t,n){let r=yield*$S,o=yield*jo,s=0,i=yield*hu(yE),a=yield*hu(ih),c=new Map,u=m=>Do(n,h=>t(h,m)),f=qt(function*(){let m=s++,h=yield*r.spawn(m);return yield*h.run(g=>{if(g._tag==="Exit"){let x=c.get(g.requestId);if(x)return c.delete(g.requestId),x.latch.openUnsafe(),t(x.clientId,g)}else if(g._tag==="Defect"){for(let[x,b]of c)c.delete(x),b.latch.openUnsafe();return u(g)}else if("requestId"in g){let x=c.get(g.requestId);if(x)return t(x.clientId,g)}return u(g)},{onSpawn:Te(i)?A(i.value,([g,x])=>ci(h.send({_tag:"InitialMessage",value:g},x))):void 0}).pipe(sp(g=>{for(let[b,E]of c)E.worker===h&&(c.delete(b),E.latch.openUnsafe());let x=jf(g);return u({_tag:"ClientProtocolError",error:new qs({reason:Kt(x)?x.success.reason:new Tc({message:"Error in worker",cause:su(g)})})})}),ix(Vf(1e3)),fx({module:"RpcClient",method:"makeProtocolWorker"}),ra,bs),h}),l="minSize"in e?yield*Gj({acquire:f,min:e.minSize,max:e.maxSize,concurrency:e.concurrency,targetUtilization:e.targetUtilization,timeToLive:e.timeToLive}):yield*Jj({acquire:f,size:e.size,concurrency:e.concurrency,targetUtilization:e.targetUtilization});yield*_t(o,se(()=>{for(let m of c.values())m.latch.openUnsafe();c.clear()}));let p=(m,h,g)=>{switch(h._tag){case"Request":return Sk(l).pipe(A(x=>{let b=fr(!1);return c.set(h.id,{clientId:m,worker:x,latch:b}),A(x.send(h,g),()=>b.await)}),gu,ci);case"Interrupt":{let x=c.get(h.requestId);return x?(c.delete(h.requestId),x.latch.openUnsafe(),ci(x.worker.send(h))):H}case"Ack":{let x=c.get(h.requestId);return x?ci(x.worker.send(h)):H}}return H};return yield*gu(Sk(l)),Te(a)&&(yield*a.value.onConnect),{send:p,supportsAck:!0,supportsTransferables:!0,codecFor:Ec}})),yre=Fc(Yz,qr(Pi)),ih=class extends Ke()("effect/rpc/RpcClient/ConnectionHooks"){};var EE="~effect/reactivity/Atom",tH=e=>B(e,EE),aA="~effect/reactivity/Atom/Writable",uh=d(2,(e,t)=>{let n=gt(t),r=as(n);return Object.assign(Object.create(Object.getPrototypeOf(e)),{...e,keepAlive:!r,idleTTL:r?Tn(n):void 0})}),tf=uh(0),uA={[EE]:EE,equals:Object.is,...vn,toJSON(){return{_id:"Atom",keepAlive:this.keepAlive,lazy:this.lazy,label:this.label}}},Sre={...uA,atom(e,t){let n=nH(e,t);return Fi(r=>{let o=r.self(),s=r(this);return s._tag!=="Success"?Dm(s,o):n(r,s.value)})},fn(e,t){return arguments.length===0?(n,r)=>Xz(this,n,r):Xz(this,e,t)},pull(e,t){let n=tf(fA(0)),r=Fi(o=>{let s=o.self(),i=o(this);return i._tag!=="Success"?Dm(i,s):bE(o,Ore(o,n,e,t),Ia(!0),i.value)});return Rre(n,r)},subscriptionRef(e){return kre(tf(Fi(t=>{let n=t.self(),r=t(this);if(r._tag!=="Success")return Dm(r,n);let o=typeof e=="function"?e(t):e;return Om(o)?o:bE(t,o,Ia(!0),r.value)})),(t,n)=>{let r=Xk(t(this));return Tre(t,n,r)})}},Xz=(e,t,n)=>{let[r,o,s]=Are(n?.reactivityKeys?(i,a)=>{let c=t(i,a);return Cr(c)?SS(c,n.reactivityKeys):Cm(c,ES(n.reactivityKeys))}:t,n);return fh(i=>{i.get(s);let a=i.self(),c=i.get(e);return c._tag!=="Success"?Dm(c,a):r(i,c.value)},o)},Ere={...uA,[aA]:aA},bre=e=>aA in e,Fi=(e,t)=>{let n=Object.create(uA);return n.keepAlive=!1,n.lazy=!0,n.read=e,n.refresh=t,n},fh=(e,t,n)=>{let r=Object.create(Ere);return r.keepAlive=!1,r.lazy=!0,r.read=e,r.write=t,r.refresh=n,r};function wre(e,t){e.setSelf(t)}var ch=(e,t)=>{let n=nH(e,t);return EE in n?n:Fi(n)},nH=(e,t)=>{if(typeof e=="function"&&!Cr(e)&&!Ue(e)){let n=e;return function(r,o){let s=n(r);switch(typeof s){case"function":case"object":return s===null?s:rH in s?cA(r,s,t,o):Ire in s?eH(r,s,t,o):s;default:return s}}}else{if(Cr(e))return function(n,r){return cA(n,e,t,r)};if(Ue(e))return function(n,r){return eH(n,e,t,r)}}return fA(e)},rH="~effect/Effect",Ire="~effect/Stream",fA=e=>fh(function(t){return e},wre),cA=(e,t,n,r)=>{let o=n?.initialValue!==void 0?Go(n.initialValue):Ia();return bE(e,t,o,r,n?.uninterruptible)};function bE(e,t,n,r=bt(),o=!1){let s=e.self(),i=$r();e.addFinalizer(()=>{Ln(r)(Je(i,Vt))});let a,c=!1,u=lA(r.pipe(Ve(It,i),Ve(BS,e.registry),Ve(ja,e.registry.scheduler)),t,function(f){a=Qk(f,s),c&&e.setSelf(a)},o);return c=!0,u!==void 0&&e.addFinalizer(u),a!==void 0?a:s._tag==="Some"?LS(s):Um(n)}function lA(e,t,n,r=!1){if(ms(t)){n(t);return}let s=Ln(e)(t);s.currentDispatcher?.flush();let i=s.pollUnsafe();if(i){n(i);return}let a=s.addObserver(n);function c(){a(),r||s.interruptUnsafe()}return c}function vre(e){let t=e?.memoMap??tf(ch(()=>oi())),n=i=>tH(t)?i(t):t,r=bS;function o(i){let a=Object.create(Sre);a.keepAlive=!1,a.lazy=!0,a.refresh=void 0,a.factory=o;let c=hA(Fi(typeof i=="function"?u=>Kd(i(u),r):()=>Kd(i,r)));return a.layer=c,a.read=function(f){let l=f(c),p=A(jo,m=>si(l,n(f),m));return cA(f,p,{uninterruptible:!0})},a}o.memoMap=t,o.addGlobalLayer=i=>{r=Kd(r,gs(i,bS))};let s=tf(ch(i=>cr(a=>si(bS,n(i),qe(a,It))).pipe(Y(qe(Ti)))));return o.withReactivity=i=>a=>_re(a,c=>{let u=Xk(c(s));return c.addFinalizer(u.registerUnsafe(i,()=>{c.refresh(a)})),c.subscribe(a,f=>c.setSelf(f)),c.once(a)},{initialValueTarget:a}),o}var dA=vre(),$pe=dA.withReactivity,eH=(e,t,n,r)=>{let o=n?.initialValue!==void 0?Go(n.initialValue):Ia();return pA(e,t,o,r)};function pA(e,t,n,r=bt()){let o=e.self();r=Ve(r,BS,e.registry);let s=ap(a=>A(Ho(t.channel,a),c=>Qn({while:Xt,body:()=>c,step(u){e.setSelf(Go(Sf(u),{waiting:!0}))}}))).pipe(ft(a=>(Uo(a)?of(e.self(),rs(Yk),rr({onNone:()=>e.setSelf(G$(new $f,{previous:e.self()})),onSome:c=>e.setSelf(Go(c))})):e.setSelf(Yl(a,{previous:e.self()})),H))),i=lA(r.pipe(Ve(BS,e.registry),Ve(ja,e.registry.scheduler)),s,bn,!1);return i!==void 0&&e.addFinalizer(i),o._tag==="Some"?LS(o):Um(n)}var Tre=(e,t,n=bt())=>Om(t)?(e.addFinalizer(vk(t).pipe(Wl(r=>{for(let o=0;o<r.length;o++)e.setSelf(r[o]);return H}),Dw(n))),Bw(n)(n$(t))):t._tag!=="Success"?t:pA(e,vk(t.value),Ia(!0),n),kre=(e,t)=>{function n(r,o){let s=r.get(e);Om(s)?li(Tk(s,o)):Ql(s)&&li(Tk(s.value,o))}return fh(r=>{let o=r(e);return Om(o)||Ql(o)?t(r,o):o},n)};var Cre=Symbol.for("effect/reactivity/atom/Atom/Reset"),iA=Symbol.for("effect/reactivity/atom/Atom/Interrupt");function Are(e,t){let n=tf(fA([0,void 0])),r=t?.initialValue!==void 0?Go(t.initialValue):Ia(),o=t?.concurrent?tf(Fi(a=>{let c=new Set;return a.addFinalizer(()=>c.forEach(u=>u.interruptUnsafe())),c})):void 0;function s(a,c){let u=o?a(o):void 0;a.isFn=!0;let[f,l]=a.get(n);if(f===0)return r;if(l===iA)return Yl(QM(),{previous:a.self()});let p=e(l,a);return rH in p?(u&&(p=A(tl(p,{startImmediately:!0}),h=>(u.add(h),h.addObserver(()=>u.delete(h)),Y(Xx(u),g=>g[0])))),bE(a,p,r,c,!1)):pA(a,p,r,c)}function i(a,c){Pre(()=>{c===Cre?a.set(n,[0,void 0]):c===iA?a.set(n,[a.get(n)[0]+1,iA]):a.set(n,[a.get(n)[0]+1,c]),a.refreshSelf()})}return[s,i,n]}var Ore=(e,t,n,r)=>A(mk(typeof n=="function"?n(e):n),o=>{let i=xi().context,a=rn(),c=Kr(o,{onFailure(f){return Uo(f)?Ye(a)?v({done:!0,items:a}):G(new $f("Atom.pull: no items")):ct(f)},onSuccess(f){let l;return r?.disableAccumulation?l=f:(l=yf(a,f),a=l),v({done:!1,items:l})}}),u=new Set;return e.addFinalizer(()=>{for(let f of u)f()}),e.once(t),e.subscribe(t,()=>{e.setSelf(LS(e.self()));let f;f=lA(i,c,l=>{f&&u.delete(f);let p=Qk(l,e.self()),m=u.size>0;e.setSelf(m?Um(p):p)}),f&&u.add(f)}),c}),Rre=(e,t)=>fh(t.read,function(n,r){n.set(e,n.get(e)+1)}),mA=typeof WeakRef>"u"||typeof FinalizationRegistry>"u"?e=>{let t=cc();return function(n){let r=As(t,n);if(r._tag==="Some")return r.value;let o=e(n);return uc(t,n,o),o}}:e=>{let t=cc(),n=new FinalizationRegistry(r=>{ku(t,r)});return function(r){let o=As(t,r).pipe(YE(i=>i.deref()));if(o._tag==="Some")return o.value;let s=e(r);return uc(t,r,new WeakRef(s)),n.register(s,r),s}};var hA=e=>Object.assign(Object.create(Object.getPrototypeOf(e)),{...e,keepAlive:!0});var _re=d(e=>tH(e[0]),(e,t,n)=>{let r=tf(bre(e)?fh(o=>t(o,e),function(o,s){o.set(e,s)},e.refresh??function(o){o(e)}):Fi(o=>t(o,e),e.refresh??function(o){o(e)}));return n?.initialValueTarget&&(r.initialValueTarget=Mre(n.initialValueTarget)),r}),Mre=e=>{let t=e;for(;t.initialValueTarget;)t=t.initialValueTarget;return t};var Pre=Q$;var Fre="~effect-atom/atom/Atom/Serializable";var gA=d(2,(e,t)=>{let n=Ec(t.schema);return Object.assign(Object.create(Object.getPrototypeOf(e)),{...e,label:e.label??[t.key,new Error().stack?.split(`
36
- `)[5]??""],[Fre]:{key:t.key,encode:vT(n),decode:dm(n)}})});var sH=()=>(e,t)=>{let n=Ke()(e),r=qr(n,t.makeEffect??sA(t.group,{...t,flatten:!0})),o=t.runtime??dA;n.runtime=o(typeof t.protocol=="function"?i=>gs(r,Wg(t.protocol(i))):gs(r,Wg(t.protocol))),n.mutation=mA(i=>{let a=t.group.requests.get(i);return n.runtime.fn()(ye(function*({headers:c,payload:u,reactivityKeys:f}){let p=(yield*n)(i,u,{headers:c});return yield*f?SS(p,f):p})).pipe(gA({key:`AtomRpc:mutation:${i}`,schema:eC({success:a.successSchema,error:oH(a)})}))});let s=mA(i=>{let{headers:a,payload:c,reactivityKeys:u,tag:f,timeToLive:l}=i,p=t.group.requests.get(f),m=jm(p.successSchema),h=m?n.runtime.pull(mr(n.use(g=>v(g(f,c,{headers:a}))))):n.runtime.atom(n.use(g=>g(f,c,{headers:a})));return u&&(h=n.runtime.factory.withReactivity(u)(h)),!m&&i.serializationKey&&(h=gA(h,{key:`AtomRpc:${i.tag}:${i.serializationKey}`,schema:eC({success:p.successSchema,error:oH(p)})})),l&&(h=as(l)?uh(h,l):hA(h)),h});return n.query=(i,a,c)=>{let u={tag:i,payload:a,headers:c?.headers?ki(c.headers):void 0,reactivityKeys:c?.reactivityKeys,timeToLive:c?.timeToLive?gt(c.timeToLive):void 0,serializationKey:c?.serializationKey};return s(u)},n},oH=e=>He([e.errorSchema,...Array.from(e.middlewares,t=>t.error),qs]);var wE={};Hs(wE,{make:()=>Nre});var Dre={add(...e){let t=new Map(this.requests);for(let n of e)t.set(n._tag,n);return Ta({requests:t,annotations:this.annotations})},merge(...e){let t=new Map(this.requests),n=new Map(this.annotations.mapUnsafe);for(let r of e){for(let[o,s]of r.requests)t.set(o,s);for(let[o,s]of r.annotations.mapUnsafe)n.set(o,s)}return Ta({requests:t,annotations:Ro(n)})},omit(...e){let t=new Map(this.requests);for(let n of e)t.delete(n);return Ta({requests:t,annotations:this.annotations})},middleware(e){let t=new Map;for(let[n,r]of this.requests)t.set(n,r.middleware(e));return Ta({requests:t,annotations:this.annotations})},toHandlers(e){let t=this;return qt(function*(){let n=yield*ar(),r=Cr(e)?yield*e:e,o=new Map;return t.requests.forEach((s,i)=>{o.set(s.key,{tag:s._tag,handler:r[i],context:n})}),Ro(o)})},prefix(e){let t=new Map;for(let n of this.requests.values()){let r=n.prefix(e);t.set(r._tag,r)}return Ta({requests:t,annotations:this.annotations})},toLayer(e){return zf(this.toHandlers(e))},of:L,toLayerHandler(e,t){let n=this;return zf(qt(function*(){let r=yield*ar(),o=Cr(t)?yield*t:t,s=new Map,i=n.requests.get(e);return s.set(i.key,{handler:o,context:r}),Ro(s)}))},accessHandler(e){return cr(t=>{let n=this.requests.get(e),{handler:r,context:o}=qi(t,n.key);return v((s,i)=>{i.rpc=n;let a=r(s,i),c=ed(a)?a.value:a;return Cr(c)?Aw(c,o):dk(c,o)})})},annotate(e,t){return Ta({requests:this.requests,annotations:Ve(this.annotations,e,t)})},annotateRpcs(e,t){return this.annotateRpcsMerge(ss(e,t))},annotateMerge(e){return Ta({requests:this.requests,annotations:Er(this.annotations,e)})},annotateRpcsMerge(e){let t=new Map;for(let[n,r]of this.requests)t.set(n,r.annotateMerge(Er(e,r.annotations)));return Ta({requests:t,annotations:this.annotations})}},Ta=e=>Object.assign(function(){},Dre,{requests:e.requests,annotations:e.annotations}),Nre=(...e)=>Ta({requests:new Map(e.map(t=>[t._tag,t])),annotations:bt()});var iH=j.Union([j.Struct({_tag:j.Literal("List"),collection:j.String}),j.Struct({_tag:j.Literal("Item"),collection:j.String,id:j.Union([j.String,j.Number])})]),nf=(e,t)=>({item:n=>({_tag:"Item",collection:e,id:n}),list:{_tag:"List",collection:e},name:e}),aH=e=>e._tag==="List"?e.collection:`${e.collection}:${e.id}`,IE=e=>[...new Set(e.map(aH))],vE=e=>[...new Set(e.flatMap(t=>t._tag==="List"?[t.collection]:[aH(t),t.collection]))];var Lre=Se.fn("EffectContract.invalidateAfter")(function*(e){yield*ES(vE(e))});function Bre(e,t,n){function r(o){return IE(n.reads(o))}return{query:(o,s={})=>e.query(t,o,{...s,reactivityKeys:r(o)}),run:o=>e.use(s=>s(t,o))}}function jre(e,t,n){return{run:r=>e.use(o=>o(t,r)).pipe(Se.tap(o=>Lre(n.invalidates(r,o))))}}function cH(e,t){let{name:n,queries:r,commands:o}=e.declaration;return Object.fromEntries([...r.map(s=>[s.name,Bre(t,`${n}.${s.name}`,s)]),...o.map(s=>[s.name,jre(t,`${n}.${s.name}`,s)])])}var uH=j.Union([j.Struct({_tag:j.Literal("Changed"),keys:j.Array(iH)}),j.Struct({_tag:j.Literal("Resync")})]),$re=256;function fH(e,t){let n=ch(!1),r=ch({connection:"connecting",failure:Le.none(),needsResync:!0,pending:0});return{connection:e.atom(s=>Se.gen(function*(){s.mount(r);let i=yield*Ti;function a(f){s.set(r,{...s.once(r),...f})}function c(){if(s.once(n)){a({needsResync:!0});return}i.invalidateUnsafe(IE(t.resyncKeys)),a({needsResync:!1,pending:0})}s.subscribe(n,f=>{f||c()}),t.resume!==void 0&&(s.once(t.resume),s.subscribe(t.resume,c));let u=Se.suspend(()=>{let f=!0;function l(p){a({connection:"live",failure:Le.none()}),s.once(n)?a({needsResync:!0,pending:Math.min($re,s.once(r).pending+1)}):f||p._tag==="Resync"?c():i.invalidateUnsafe(vE(p.keys)),f=!1}return t.stream.pipe(nr.runForEach(p=>Se.sync(()=>l(p))),Se.scoped,Se.catchCause(p=>Se.sync(()=>a({failure:Le.some(p)}))),Se.andThen(Se.sync(()=>a({connection:"reconnecting",needsResync:!0}))),Se.andThen(Se.sleep(t.retryDelay??"1 second")))});yield*Se.forever(u)})).pipe(uh(0)),paused:n,status:r}}function lH(e,t){return n=>{function r(){e.document.visibilityState==="visible"&&n()}return e.addEventListener(t,r),()=>e.removeEventListener(t,r)}}function dH({window:e,native:t}){let n=e===void 0?[]:[lH(e,"visibilitychange"),lH(e,"online")],r=t===void 0?n:[...n,t];return Fi(o=>{let s=0;function i(){s+=1,o.setSelf(s)}for(let a of r)o.addFinalizer(a(i));return s})}var qre=e=>{let t=e.map(({name:n})=>n).filter((n,r,o)=>o.indexOf(n)!==r);if(t.length>0)throw new Error(`Operation names must be unique; duplicated: ${[...new Set(t)].join(", ")}`)},pH=(e,t)=>{let n=e.middleware.bind(e);return Object.assign(e,{declaration:t,middleware:r=>pH(n(r),t)})};function mH(e,t){let{queries:n=[],commands:r=[]}=t;qre([...n,...r]);let o=[...n,...r].map(s=>vc.make(`${e}.${s.name}`,{error:s.error,payload:s.payload,success:s.success}));return pH(wE.make(...o),{commands:r,name:e,queries:n})}function hH(e){let t=Object.entries(e).map(([n,r])=>[n,j.isSchema(r)?r:j.TaggedError()(n,r)]);return{error:t.length===0?j.Never:j.Union(t.map(([,n])=>n)),Rejection:Object.fromEntries(t),reject:Object.fromEntries(t.map(([n,r])=>[n,(...o)=>Se.fail(Reflect.construct(r,o))]))}}var zre=e=>e===void 0?j.Void:j.isSchema(e)?e:j.Struct(e),Hre=(e,t,n)=>{let{payload:r,success:o,rejections:s={}}=n;return{kind:e,name:t,payload:zre(r),rejections:s,success:o??j.Void,...hH(s)}};function id(e,t){return{...Hre("query",e,t),reads:t.reads}}function Wre(e){return e.startsWith(".")||e==="node_modules"}function gH(e){return e.endsWith(".md")&&!e.split("/").some(Wre)}var Kre=j.String.check(j.makeFilter(e=>gH(e)&&!e.includes("\\")&&!e.includes("\0")&&e.split("/").every(t=>t.length>0&&t!=="..")||"Expected a relative readable Markdown path")),Vre=j.String.check(j.makeFilter(e=>Number.isFinite(Date.parse(e))&&/^\d{4}-\d{2}-\d{2}T.*(?:Z|[+-]\d{2}:\d{2})$/u.exec(e)!==null||"Expected an ISO observation time with timezone")),pme=j.Struct({documents:j.Array(j.Struct({file:Kre,source:j.String})).check(j.makeFilter(e=>new Set(e.map(t=>t.file)).size===e.length||"Duplicate source paths are not a complete observation")),recordedAt:Vre,version:j.Literal(1)}).pipe(j.encodeKeys({recordedAt:"recorded_at"})),xH=j.Struct({action:j.Literals(["check","compare","observe"]),baseline:j.NullOr(j.String)}),yH=j.Struct({discardBaseline:j.Boolean,html:j.String,reason:j.String,snapshot:j.NullOr(j.String)});var ka=nf("work-board/workspace",j.String),SH=nf("work-board/documents",j.String),EH=nf("work-board/identities",j.String),bH=nf("work-board/navigation",j.String),lh=nf("work-board/index",j.String),wH=nf("work-board/watcher",j.String);function IH(e){let t=new URL(e,"http://127.0.0.1").pathname,n=/^\/_board\/item\/(?<id>[^/]+)\/$/u.exec(t)?.groups?.id,r=SH.item(decodeURIComponent(t.slice(1)));return n?r=EH.item(decodeURIComponent(n)):t.startsWith("/_board/")&&(r=lh.list),[ka.list,r]}var _c=class extends j.TaggedError()("ReadFailed",{operation:j.String,status:j.Number}){},Jre=j.String.check(j.isMaxLength(8192),j.makeFilter(e=>{if(!e.startsWith("/")||e.startsWith("//"))return"Expected a local reading URL";try{let t=new URL(e,"http://127.0.0.1").pathname;return t==="/"||["/_board/work","/_board/overview","/_board/changes"].includes(t)||/^\/_board\/item\/[^/]+\/$/u.exec(t)!==null||/\.md$/iu.exec(t)!==null||"Expected a local reading URL"}catch{return"Expected a local reading URL"}})),Gre=j.Struct({html:j.String,status:j.Number}),Zre=j.Struct({file:j.String,href:j.String,kind:j.Literals(["document","heading","passage"]),line:j.optional(j.Number),snippet:j.String,text:j.String,title:j.String}),Qre=id("page",{payload:{url:Jre},reads:({url:e})=>IH(e),rejections:{ReadFailed:_c},success:Gre}),Yre=id("navigation",{reads:()=>[ka.list,bH.list],rejections:{ReadFailed:_c},success:j.String}),Xre=id("search",{payload:{query:j.String.check(j.isMaxLength(8192))},reads:()=>[ka.list,lh.list],rejections:{ReadFailed:_c},success:j.Struct({results:j.Array(Zre),total:j.Number,unavailable:j.Array(j.String)})}),eoe=id("history",{payload:xH,reads:()=>[ka.list,lh.list],rejections:{ReadFailed:_c},success:yH}),toe=id("watcher",{reads:()=>[ka.list,wH.list],rejections:{ReadFailed:_c},success:j.Struct({watching:j.Boolean})}),yA=mH("work-board",{queries:[Qre,Yre,Xre,eoe,toe]}),noe=vc.make("work-board.subscribe",{error:_c,stream:!0,success:uH}),vH=yA.add(noe);function TH(e,t={}){class n extends sH()("WorkBoard/Reader",{group:vH,protocol:ah.layerProtocolHttp({url:`${e}/_board/rpc`}).pipe(zr.provide([US.layer,sh.layerNdjson]))}){}let r=cH(yA,n),o=Z$({defaultIdleTTL:0,timeoutResolution:1}),s=fH(n.runtime,{resume:dH(t),resyncKeys:[ka.list],stream:nr.unwrap(n.use(c=>Se.succeed(c("work-board.subscribe",void 0))))});o.mount(s.connection);async function i(c,u){try{return await Se.runPromise(jS(o,c,{suspendOnWaiting:!0}),{signal:u})}catch(f){if(u?.aborted){let l=new Error("Reading canceled",{cause:f});throw l.name="AbortError",l}throw f}}async function a(c,u){try{return await Se.runPromise(Se.flatMap(jS(o,n.runtime),f=>Se.provideContext(c,f)),{signal:u})}catch(f){if(u?.aborted){let l=new Error("Reading canceled",{cause:f});throw l.name="AbortError",l}throw f}}return{api:r,read:i,registry:o,run:a,updates:s}}var TE=new WeakMap;function Bme(e){let t=TE.get(e);if(t===void 0){let o=function(){r.registry.dispose(),TE.get(e)===r&&TE.delete(e),e.removeEventListener("pagehide",o)};var n=o;t=TH(e.location.origin,{window:e}),TE.set(e,t);let r=t;e.addEventListener("pagehide",o)}return t}export{Bme as session};
36
+ `)[5]??""],[Fre]:{key:t.key,encode:vT(n),decode:dm(n)}})});var sH=()=>(e,t)=>{let n=Ke()(e),r=qr(n,t.makeEffect??sA(t.group,{...t,flatten:!0})),o=t.runtime??dA;n.runtime=o(typeof t.protocol=="function"?i=>gs(r,Wg(t.protocol(i))):gs(r,Wg(t.protocol))),n.mutation=mA(i=>{let a=t.group.requests.get(i);return n.runtime.fn()(ye(function*({headers:c,payload:u,reactivityKeys:f}){let p=(yield*n)(i,u,{headers:c});return yield*f?SS(p,f):p})).pipe(gA({key:`AtomRpc:mutation:${i}`,schema:eC({success:a.successSchema,error:oH(a)})}))});let s=mA(i=>{let{headers:a,payload:c,reactivityKeys:u,tag:f,timeToLive:l}=i,p=t.group.requests.get(f),m=jm(p.successSchema),h=m?n.runtime.pull(mr(n.use(g=>v(g(f,c,{headers:a}))))):n.runtime.atom(n.use(g=>g(f,c,{headers:a})));return u&&(h=n.runtime.factory.withReactivity(u)(h)),!m&&i.serializationKey&&(h=gA(h,{key:`AtomRpc:${i.tag}:${i.serializationKey}`,schema:eC({success:p.successSchema,error:oH(p)})})),l&&(h=as(l)?uh(h,l):hA(h)),h});return n.query=(i,a,c)=>{let u={tag:i,payload:a,headers:c?.headers?ki(c.headers):void 0,reactivityKeys:c?.reactivityKeys,timeToLive:c?.timeToLive?gt(c.timeToLive):void 0,serializationKey:c?.serializationKey};return s(u)},n},oH=e=>He([e.errorSchema,...Array.from(e.middlewares,t=>t.error),qs]);var wE={};Hs(wE,{make:()=>Nre});var Dre={add(...e){let t=new Map(this.requests);for(let n of e)t.set(n._tag,n);return Ta({requests:t,annotations:this.annotations})},merge(...e){let t=new Map(this.requests),n=new Map(this.annotations.mapUnsafe);for(let r of e){for(let[o,s]of r.requests)t.set(o,s);for(let[o,s]of r.annotations.mapUnsafe)n.set(o,s)}return Ta({requests:t,annotations:Ro(n)})},omit(...e){let t=new Map(this.requests);for(let n of e)t.delete(n);return Ta({requests:t,annotations:this.annotations})},middleware(e){let t=new Map;for(let[n,r]of this.requests)t.set(n,r.middleware(e));return Ta({requests:t,annotations:this.annotations})},toHandlers(e){let t=this;return qt(function*(){let n=yield*ar(),r=Cr(e)?yield*e:e,o=new Map;return t.requests.forEach((s,i)=>{o.set(s.key,{tag:s._tag,handler:r[i],context:n})}),Ro(o)})},prefix(e){let t=new Map;for(let n of this.requests.values()){let r=n.prefix(e);t.set(r._tag,r)}return Ta({requests:t,annotations:this.annotations})},toLayer(e){return zf(this.toHandlers(e))},of:L,toLayerHandler(e,t){let n=this;return zf(qt(function*(){let r=yield*ar(),o=Cr(t)?yield*t:t,s=new Map,i=n.requests.get(e);return s.set(i.key,{handler:o,context:r}),Ro(s)}))},accessHandler(e){return cr(t=>{let n=this.requests.get(e),{handler:r,context:o}=qi(t,n.key);return v((s,i)=>{i.rpc=n;let a=r(s,i),c=ed(a)?a.value:a;return Cr(c)?Aw(c,o):dk(c,o)})})},annotate(e,t){return Ta({requests:this.requests,annotations:Ve(this.annotations,e,t)})},annotateRpcs(e,t){return this.annotateRpcsMerge(ss(e,t))},annotateMerge(e){return Ta({requests:this.requests,annotations:Er(this.annotations,e)})},annotateRpcsMerge(e){let t=new Map;for(let[n,r]of this.requests)t.set(n,r.annotateMerge(Er(e,r.annotations)));return Ta({requests:t,annotations:this.annotations})}},Ta=e=>Object.assign(function(){},Dre,{requests:e.requests,annotations:e.annotations}),Nre=(...e)=>Ta({requests:new Map(e.map(t=>[t._tag,t])),annotations:bt()});var iH=j.Union([j.Struct({_tag:j.Literal("List"),collection:j.String}),j.Struct({_tag:j.Literal("Item"),collection:j.String,id:j.Union([j.String,j.Number])})]),nf=(e,t)=>({item:n=>({_tag:"Item",collection:e,id:n}),list:{_tag:"List",collection:e},name:e}),aH=e=>e._tag==="List"?e.collection:`${e.collection}:${e.id}`,IE=e=>[...new Set(e.map(aH))],vE=e=>[...new Set(e.flatMap(t=>t._tag==="List"?[t.collection]:[aH(t),t.collection]))];var Lre=Se.fn("EffectContract.invalidateAfter")(function*(e){yield*ES(vE(e))});function Bre(e,t,n){function r(o){return IE(n.reads(o))}return{query:(o,s={})=>e.query(t,o,{...s,reactivityKeys:r(o)}),run:o=>e.use(s=>s(t,o))}}function jre(e,t,n){return{run:r=>e.use(o=>o(t,r)).pipe(Se.tap(o=>Lre(n.invalidates(r,o))))}}function cH(e,t){let{name:n,queries:r,commands:o}=e.declaration;return Object.fromEntries([...r.map(s=>[s.name,Bre(t,`${n}.${s.name}`,s)]),...o.map(s=>[s.name,jre(t,`${n}.${s.name}`,s)])])}var uH=j.Union([j.Struct({_tag:j.Literal("Changed"),keys:j.Array(iH)}),j.Struct({_tag:j.Literal("Resync")})]),$re=256;function fH(e,t){let n=ch(!1),r=ch({connection:"connecting",failure:Le.none(),needsResync:!0,pending:0});return{connection:e.atom(s=>Se.gen(function*(){s.mount(r);let i=yield*Ti;function a(f){s.set(r,{...s.once(r),...f})}function c(){if(s.once(n)){a({needsResync:!0});return}i.invalidateUnsafe(IE(t.resyncKeys)),a({needsResync:!1,pending:0})}s.subscribe(n,f=>{f||c()}),t.resume!==void 0&&(s.once(t.resume),s.subscribe(t.resume,c));let u=Se.suspend(()=>{let f=!0;function l(p){a({connection:"live",failure:Le.none()}),s.once(n)?a({needsResync:!0,pending:Math.min($re,s.once(r).pending+1)}):f||p._tag==="Resync"?c():i.invalidateUnsafe(vE(p.keys)),f=!1}return t.stream.pipe(nr.runForEach(p=>Se.sync(()=>l(p))),Se.scoped,Se.catchCause(p=>Se.sync(()=>a({failure:Le.some(p)}))),Se.andThen(Se.sync(()=>a({connection:"reconnecting",needsResync:!0}))),Se.andThen(Se.sleep(t.retryDelay??"1 second")))});yield*Se.forever(u)})).pipe(uh(0)),paused:n,status:r}}function lH(e,t){return n=>{function r(){e.document.visibilityState==="visible"&&n()}return e.addEventListener(t,r),()=>e.removeEventListener(t,r)}}function dH({window:e,native:t}){let n=e===void 0?[]:[lH(e,"visibilitychange"),lH(e,"online")],r=t===void 0?n:[...n,t];return Fi(o=>{let s=0;function i(){s+=1,o.setSelf(s)}for(let a of r)o.addFinalizer(a(i));return s})}var qre=e=>{let t=e.map(({name:n})=>n).filter((n,r,o)=>o.indexOf(n)!==r);if(t.length>0)throw new Error(`Operation names must be unique; duplicated: ${[...new Set(t)].join(", ")}`)},pH=(e,t)=>{let n=e.middleware.bind(e);return Object.assign(e,{declaration:t,middleware:r=>pH(n(r),t)})};function mH(e,t){let{queries:n=[],commands:r=[]}=t;qre([...n,...r]);let o=[...n,...r].map(s=>vc.make(`${e}.${s.name}`,{error:s.error,payload:s.payload,success:s.success}));return pH(wE.make(...o),{commands:r,name:e,queries:n})}function hH(e){let t=Object.entries(e).map(([n,r])=>[n,j.isSchema(r)?r:j.TaggedError()(n,r)]);return{error:t.length===0?j.Never:j.Union(t.map(([,n])=>n)),Rejection:Object.fromEntries(t),reject:Object.fromEntries(t.map(([n,r])=>[n,(...o)=>Se.fail(Reflect.construct(r,o))]))}}var zre=e=>e===void 0?j.Void:j.isSchema(e)?e:j.Struct(e),Hre=(e,t,n)=>{let{payload:r,success:o,rejections:s={}}=n;return{kind:e,name:t,payload:zre(r),rejections:s,success:o??j.Void,...hH(s)}};function id(e,t){return{...Hre("query",e,t),reads:t.reads}}function Wre(e){return e.startsWith(".")||e==="node_modules"}function gH(e){return e.endsWith(".md")&&!e.split("/").some(Wre)}var Kre=j.String.check(j.makeFilter(e=>gH(e)&&!e.includes("\\")&&!e.includes("\0")&&e.split("/").every(t=>t.length>0&&t!=="..")||"Expected a relative readable Markdown path")),Vre=j.String.check(j.makeFilter(e=>Number.isFinite(Date.parse(e))&&/^\d{4}-\d{2}-\d{2}T.*(?:Z|[+-]\d{2}:\d{2})$/u.exec(e)!==null||"Expected an ISO observation time with timezone")),pme=j.Struct({documents:j.Array(j.Struct({file:Kre,source:j.String})).check(j.makeFilter(e=>new Set(e.map(t=>t.file)).size===e.length||"Duplicate source paths are not a complete observation")),recordedAt:Vre,version:j.Literal(1)}).pipe(j.encodeKeys({recordedAt:"recorded_at"})),xH=j.Struct({action:j.Literals(["check","compare","observe"]),baseline:j.NullOr(j.String)}),yH=j.Struct({discardBaseline:j.Boolean,html:j.String,reason:j.String,snapshot:j.NullOr(j.String)});var ka=nf("work-board/workspace",j.String),SH=nf("work-board/documents",j.String),EH=nf("work-board/identities",j.String),bH=nf("work-board/navigation",j.String),lh=nf("work-board/index",j.String),wH=nf("work-board/watcher",j.String);function IH(e){let t=new URL(e,"http://127.0.0.1").pathname,n=/^\/_board\/item\/(?<id>[^/]+)\/$/u.exec(t)?.groups?.id,r=SH.item(decodeURIComponent(t.slice(1)));return n?r=EH.item(decodeURIComponent(n)):t.startsWith("/_board/")&&(r=lh.list),[ka.list,r]}var _c=class extends j.TaggedError()("ReadFailed",{operation:j.String,status:j.Number}){},Jre=j.String.check(j.isMaxLength(8192),j.makeFilter(e=>{if(!e.startsWith("/")||e.startsWith("//"))return"Expected a local reading URL";try{let t=new URL(e,"http://127.0.0.1").pathname;return t==="/"||["/_board/work","/_board/overview","/_board/changes","/_board/start"].includes(t)||/^\/_board\/item\/[^/]+\/$/u.exec(t)!==null||/\.md$/iu.exec(t)!==null||"Expected a local reading URL"}catch{return"Expected a local reading URL"}})),Gre=j.Struct({html:j.String,status:j.Number}),Zre=j.Struct({file:j.String,href:j.String,kind:j.Literals(["document","heading","passage"]),line:j.optional(j.Number),snippet:j.String,text:j.String,title:j.String}),Qre=id("page",{payload:{url:Jre},reads:({url:e})=>IH(e),rejections:{ReadFailed:_c},success:Gre}),Yre=id("navigation",{reads:()=>[ka.list,bH.list],rejections:{ReadFailed:_c},success:j.String}),Xre=id("search",{payload:{query:j.String.check(j.isMaxLength(8192))},reads:()=>[ka.list,lh.list],rejections:{ReadFailed:_c},success:j.Struct({results:j.Array(Zre),total:j.Number,unavailable:j.Array(j.String)})}),eoe=id("history",{payload:xH,reads:()=>[ka.list,lh.list],rejections:{ReadFailed:_c},success:yH}),toe=id("watcher",{reads:()=>[ka.list,wH.list],rejections:{ReadFailed:_c},success:j.Struct({watching:j.Boolean})}),yA=mH("work-board",{queries:[Qre,Yre,Xre,eoe,toe]}),noe=vc.make("work-board.subscribe",{error:_c,stream:!0,success:uH}),vH=yA.add(noe);function TH(e,t={}){class n extends sH()("WorkBoard/Reader",{group:vH,protocol:ah.layerProtocolHttp({url:`${e}/_board/rpc`}).pipe(zr.provide([US.layer,sh.layerNdjson]))}){}let r=cH(yA,n),o=Z$({defaultIdleTTL:0,timeoutResolution:1}),s=fH(n.runtime,{resume:dH(t),resyncKeys:[ka.list],stream:nr.unwrap(n.use(c=>Se.succeed(c("work-board.subscribe",void 0))))});o.mount(s.connection);async function i(c,u){try{return await Se.runPromise(jS(o,c,{suspendOnWaiting:!0}),{signal:u})}catch(f){if(u?.aborted){let l=new Error("Reading canceled",{cause:f});throw l.name="AbortError",l}throw f}}async function a(c,u){try{return await Se.runPromise(Se.flatMap(jS(o,n.runtime),f=>Se.provideContext(c,f)),{signal:u})}catch(f){if(u?.aborted){let l=new Error("Reading canceled",{cause:f});throw l.name="AbortError",l}throw f}}return{api:r,read:i,registry:o,run:a,updates:s}}var TE=new WeakMap;function Bme(e){let t=TE.get(e);if(t===void 0){let o=function(){r.registry.dispose(),TE.get(e)===r&&TE.delete(e),e.removeEventListener("pagehide",o)};var n=o;t=TH(e.location.origin,{window:e}),TE.set(e,t);let r=t;e.addEventListener("pagehide",o)}return t}export{Bme as session};
@@ -1 +1 @@
1
- {"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../src/board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,aAAa,EAAc,MAAM,QAAQ,CAAC;AAClG,OAAO,EAAE,UAAU,EAA8C,MAAM,sBAAsB,CAAC;AAE9F,OAAO,EAAE,KAAK,WAAW,EAAU,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAyB,KAAK,cAAc,EAAuD,MAAM,iBAAiB,CAAC;AAYlI,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKtD,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAsED,KAAK,UAAU,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,CAAC,aAAa,GAAG,YAAY,CAAC;AAC5F,KAAK,aAAa,GAAG,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;AAE1I,eAAO,MAAM,UAAU,GAAI,SAAS,YAAY,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,CACxC,CAAC"}
1
+ {"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../src/board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,aAAa,EAAc,MAAM,QAAQ,CAAC;AAClG,OAAO,EAAE,UAAU,EAA8C,MAAM,sBAAsB,CAAC;AAE9F,OAAO,EAAE,KAAK,WAAW,EAAU,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAyB,KAAK,cAAc,EAAuD,MAAM,iBAAiB,CAAC;AAalI,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKtD,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AA2ED,KAAK,UAAU,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,CAAC,aAAa,GAAG,YAAY,CAAC;AAC5F,KAAK,aAAa,GAAG,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;AAE1I,eAAO,MAAM,UAAU,GAAI,SAAS,YAAY,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,CACxC,CAAC"}
package/dist/board.js CHANGED
@@ -13,6 +13,7 @@ import { page } from "#http/page.ts";
13
13
  import { respond } from "#http/respond.ts";
14
14
  import { sameOrigin } from "#http/sameOrigin.ts";
15
15
  import { search } from "#http/search.ts";
16
+ import { start } from "#http/start.ts";
16
17
  import { work } from "#http/work.ts";
17
18
  import { Highlighter } from "#render/highlighter.ts";
18
19
  import { server } from "#rpc/server.ts";
@@ -27,6 +28,8 @@ const routes = (options) => HttpRouter.use((router) => Effect.gen(function* () {
27
28
  yield* serve("/_board/attachment/*", attachment(options.root, changes.realRoot));
28
29
  const index = yield* searchSnapshot(options.root, home, changes);
29
30
  yield* serve("/_board/search", search(index));
31
+ const startPage = start(changes, home);
32
+ yield* serve("/_board/start", startPage);
30
33
  const workPage = work(index, changes, home);
31
34
  const overviewPage = overview(index, changes, home);
32
35
  const historyPage = changesPage(changes, home);
@@ -47,6 +50,9 @@ const routes = (options) => HttpRouter.use((router) => Effect.gen(function* () {
47
50
  const pathname = new URL(url, "http://127.0.0.1").pathname;
48
51
  let selected;
49
52
  switch (pathname) {
53
+ case "/_board/start":
54
+ selected = startPage();
55
+ break;
50
56
  case "/_board/work":
51
57
  selected = workPage(request);
52
58
  break;
package/dist/board.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"board.js","sourceRoot":"","sources":["../src/board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAkC,MAAM,QAAQ,CAAC;AAClG,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAA2B,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAoB,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,aAAa,EAAuB,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAClI,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAUrD,MAAM,MAAM,GAAG,CAAC,OAAqB,EAAE,EAAE,CACxC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACzB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACnB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAY,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtH,MAAM,KAAK,GAAG,CAAI,KAA2B,EAAE,OAAmB,EAAE,SAAyB,KAAK,EAAE,EAAE,CACrG,MAAM,CAAC,GAAG,CACT,MAAM,EACN,KAAK,EACL,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAC3E,CAAC;IACH,KAAK,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,KAAK,CAAC,CAAC,KAAK,CAAC,sBAAsB,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjF,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACjE,KAAK,CAAC,CAAC,KAAK,CAAC,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/C,KAAK,CAAC,CAAC,KAAK,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACvC,KAAK,CAAC,CAAC,KAAK,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;IAC/C,KAAK,CAAC,CAAC,KAAK,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;IAC7C,KAAK,CAAC,CAAC,KAAK,CAAC,iBAAiB,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;IACxD,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,MAAM,EAAE,CAAC;QACjD,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,KAAK,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IAClD,KAAK,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACpD,KAAK,CAAC,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IACtC,SAAS,QAAQ,CAAC,GAAW;QAC5B,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC,CAAC;QACjF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC;QAC3D,IAAI,QAAkC,CAAC;QACvC,QAAQ,QAAQ,EAAE,CAAC;YAClB,KAAK,cAAc;gBAClB,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC7B,MAAM;YACP,KAAK,kBAAkB;gBACtB,QAAQ,GAAG,YAAY,EAAE,CAAC;gBAC1B,MAAM;YACP,KAAK,iBAAiB;gBACrB,QAAQ,GAAG,WAAW,EAAE,CAAC;gBACzB,MAAM;YACP;gBACC,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3G,KAAK,CAAC,CAAC,KAAK,CACX,aAAa,EACb,CAAC,OAAO,EAAE,EAAE,CACX,UAAU,CAAC,OAAO,CAAC;QAClB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QAC/E,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,iCAAiC,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,EACjF,MAAM,CACN,CAAC;IACF,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzB,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC,CAAC,CACF,CAAC;AAKH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAqB,EAAiD,EAAE,CAClG,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"board.js","sourceRoot":"","sources":["../src/board.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -3,7 +3,7 @@ import { NodeRuntime, NodeServices } from "@effect/platform-node";
3
3
  import { Effect, Layer, Option, Path } from "effect";
4
4
  import { Argument, Command, Flag } from "effect/unstable/cli";
5
5
  import { HOST, serveBoard } from "./serve.js";
6
- const VERSION = "0.7.0";
6
+ const VERSION = "0.7.1";
7
7
  const serve = Effect.fn("WorkBoard.serve")(function* (input) {
8
8
  const path = yield* Path.Path;
9
9
  return yield* Layer.launch(serveBoard({ home: Option.getOrUndefined(input.home), port: input.port, root: path.resolve(input.dir) }));
@@ -1 +1 @@
1
- {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/http/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAU,MAAM,QAAQ,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAYjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAaD,eAAO,MAAM,IAAI,GAAI,SAAS,WAAW,EAAE,SAAS,OAAO,EAAE,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,mWAyDpH,CAAC"}
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/http/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAU,MAAM,QAAQ,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAajD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAaD,eAAO,MAAM,IAAI,GAAI,SAAS,WAAW,EAAE,SAAS,OAAO,EAAE,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,mWA4DpH,CAAC"}
package/dist/http/page.js CHANGED
@@ -8,6 +8,7 @@ import { escapeHtml } from "#page/escape.ts";
8
8
  import { metadataHtml } from "#page/metadata.ts";
9
9
  import { navHtml } from "#page/nav.ts";
10
10
  import { shell } from "#page/shell.ts";
11
+ import { startHtml } from "#page/startHtml.ts";
11
12
  import { boardOf } from "#render/board.ts";
12
13
  import { respond } from "./respond.js";
13
14
  const requestedPath = (url) => {
@@ -55,6 +56,9 @@ export const page = (options, changes, index) => {
55
56
  const missing = () => respond(layout(message(expectedIdentity
56
57
  ? `No item with ID ${expectedIdentity} at ${requested}; its source identity changed or is invalid.`
57
58
  : `No markdown file at ${requested || options.root}.`)), "text/html", 404);
59
+ if (files.length === 0 && requestedPath(request.url) === "" && resolved === undefined && expectedIdentity === undefined) {
60
+ return respond(layout(startHtml(true)), "text/html");
61
+ }
58
62
  if (file === undefined) {
59
63
  return missing();
60
64
  }
@@ -1 +1 @@
1
- {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/http/page.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/http/page.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Effect } from "effect";
2
+ import type { Changes } from "#files/changes.ts";
3
+ export declare function start(changes: Changes, home: string | undefined): () => Effect.Effect<import("effect/unstable/http/HttpServerResponse").HttpServerResponse, import("effect/PlatformError").PlatformError, never>;
4
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/http/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAMjD,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,kJAQ/D"}
@@ -0,0 +1,12 @@
1
+ import { Effect } from "effect";
2
+ import { navHtml } from "#page/nav.ts";
3
+ import { shell } from "#page/shell.ts";
4
+ import { startHtml } from "#page/startHtml.ts";
5
+ import { respond } from "./respond.js";
6
+ export function start(changes, home) {
7
+ return Effect.fn("WorkBoard.start")(function* () {
8
+ const files = yield* changes.files;
9
+ return respond(shell("Getting started", navHtml(files, "", home), startHtml(files.length === 0), changes.realRoot, false, undefined, "start"), "text/html");
10
+ });
11
+ }
12
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/http/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,UAAU,KAAK,CAAC,OAAgB,EAAE,IAAwB;IAC/D,OAAO,MAAM,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC;QAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QACnC,OAAO,OAAO,CACb,KAAK,CAAC,iBAAiB,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,EAC9H,WAAW,CACX,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -88,7 +88,7 @@ document.addEventListener("click", (event) => {
88
88
  const link = event.target.closest?.("a[href]");
89
89
  if (!link || event.defaultPrevented || event.button !== 0 || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey || link.hasAttribute("download") || (link.target && link.target !== "_self")) return;
90
90
  const target = new URL(link.href, location.href);
91
- if (target.origin !== location.origin || !(target.pathname === "/" || (target.pathname === "/_board/changes" || target.pathname === "/_board/overview" || target.pathname === "/_board/work" || target.pathname.startsWith("/_board/item/")) || /\\.md$/i.test(target.pathname))) return;
91
+ if (target.origin !== location.origin || !(target.pathname === "/" || (target.pathname === "/_board/start" || target.pathname === "/_board/changes" || target.pathname === "/_board/overview" || target.pathname === "/_board/work" || target.pathname.startsWith("/_board/item/")) || /\\.md$/i.test(target.pathname))) return;
92
92
  event.preventDefault();
93
93
  navigate(target);
94
94
  });
@@ -1,2 +1,2 @@
1
- export declare const shell: (title: string, nav: string, main: string, workspace: string, board: boolean, identity?: string, view?: boolean | "overview" | "changes") => string;
1
+ export declare const shell: (title: string, nav: string, main: string, workspace: string, board: boolean, identity?: string, view?: boolean | "overview" | "changes" | "start") => string;
2
2
  //# sourceMappingURL=shell.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/page/shell.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,KAAK,GACjB,OAAO,MAAM,EACb,KAAK,MAAM,EACX,MAAM,MAAM,EACZ,WAAW,MAAM,EACjB,OAAO,OAAO,EACd,WAAW,MAAM,EACjB,OAAM,OAAO,GAAG,UAAU,GAAG,SAAiB,KAC5C,MAmBQ,CAAC"}
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/page/shell.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,KAAK,GACjB,OAAO,MAAM,EACb,KAAK,MAAM,EACX,MAAM,MAAM,EACZ,WAAW,MAAM,EACjB,OAAO,OAAO,EACd,WAAW,MAAM,EACjB,OAAM,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,OAAe,KACtD,MAmBQ,CAAC"}
@@ -15,7 +15,7 @@ export const shell = (title, nav, main, workspace, board, identity, view = false
15
15
  '<link rel="stylesheet" href="/_board/style.css"><script type="module" src="/_board/client.js"></script>',
16
16
  '</head><body><noscript><style>html:not([data-js]) figure.diagram .diagram-source{display:block}html:not([data-js]) figure.diagram[data-state="pending"]{min-height:0}</style></noscript><a class="skip" href="#doc">Skip to content</a><div class="workspace">',
17
17
  '<aside id="sidebar" class="sidebar"><a class="brand" href="/">work board<span>Local workspace</span></a>',
18
- '<div id="reading-library" class="reading-library" hidden></div><h2 class="nav-heading">Project files</h2>',
18
+ '<div id="reading-library" class="reading-library" hidden></div><a id="start-open" class="start-open" href="/_board/start">Getting started</a><h2 class="nav-heading">Project files</h2>',
19
19
  `<nav id="files" class="files" aria-label="Project files">${nav}</nav></aside>`,
20
20
  '<div class="page"><header class="bar"><button id="sidebar-toggle" type="button" aria-controls="sidebar" aria-expanded="true">Files</button>',
21
21
  `<nav id="breadcrumbs" class="breadcrumbs" aria-label="File location"><a href="/">Workspace</a><span class="separator">/</span>${location(title)}</nav>`,
@@ -1 +1 @@
1
- {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/page/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,SAAS,QAAQ,CAAC,IAAY;IAC7B,OAAO,IAAI;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;SACjD,IAAI,CAAC,kCAAkC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CACpB,KAAa,EACb,GAAW,EACX,IAAY,EACZ,SAAiB,EACjB,KAAc,EACd,QAAiB,EACjB,OAAyC,KAAK,EACrC,EAAE,CACX;IACC,kDAAkD,UAAU,CAAC,SAAS,CAAC,gCAAgC;IACvG,qHAAqH;IACrH,UAAU,UAAU,CAAC,KAAK,CAAC,UAAU;IACrC,yGAAyG;IACzG,gQAAgQ;IAChQ,0GAA0G;IAC1G,2GAA2G;IAC3G,4DAA4D,GAAG,gBAAgB;IAC/E,6IAA6I;IAC7I,iIAAiI,QAAQ,CAAC,KAAK,CAAC,QAAQ;IACxJ,kEAAkE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,kFAAkF,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,yEAAyE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,6QAA6Q;IACtnB,yEAAyE;IACzE,wMAAwM;IACxM,0LAA0L;IAC1L,wJAAwJ;IACxJ,QAAQ,IAAI,CAAC,CAAC,CAAC,eAAe,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,mBAAmB,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,wBAAwB,UAAU,CAAC,KAAK,CAAC,eAAe,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,mBAAmB,IAAI,SAAS;IAC/S,eAAe,YAAY,GAAG,YAAY,gBAAgB;CAC1D,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/page/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,SAAS,QAAQ,CAAC,IAAY;IAC7B,OAAO,IAAI;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;SACjD,IAAI,CAAC,kCAAkC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CACpB,KAAa,EACb,GAAW,EACX,IAAY,EACZ,SAAiB,EACjB,KAAc,EACd,QAAiB,EACjB,OAAmD,KAAK,EAC/C,EAAE,CACX;IACC,kDAAkD,UAAU,CAAC,SAAS,CAAC,gCAAgC;IACvG,qHAAqH;IACrH,UAAU,UAAU,CAAC,KAAK,CAAC,UAAU;IACrC,yGAAyG;IACzG,gQAAgQ;IAChQ,0GAA0G;IAC1G,yLAAyL;IACzL,4DAA4D,GAAG,gBAAgB;IAC/E,6IAA6I;IAC7I,iIAAiI,QAAQ,CAAC,KAAK,CAAC,QAAQ;IACxJ,kEAAkE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,kFAAkF,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,yEAAyE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,6QAA6Q;IACtnB,yEAAyE;IACzE,wMAAwM;IACxM,0LAA0L;IAC1L,wJAAwJ;IACxJ,QAAQ,IAAI,CAAC,CAAC,CAAC,eAAe,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,mBAAmB,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,wBAAwB,UAAU,CAAC,KAAK,CAAC,eAAe,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,mBAAmB,IAAI,SAAS;IAC/S,eAAe,YAAY,GAAG,YAAY,gBAAgB;CAC1D,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function startHtml(empty?: boolean): string;
2
+ //# sourceMappingURL=startHtml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startHtml.d.ts","sourceRoot":"","sources":["../../src/page/startHtml.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,KAAK,UAAQ,GAAG,MAAM,CAM/C"}
@@ -0,0 +1,10 @@
1
+ import { escapeHtml } from "./escape.js";
2
+ import { startTemplates } from "./startTemplates.js";
3
+ export function startHtml(empty = false) {
4
+ return `<article class="doc onboarding"><h1>${empty ? "Start your local workspace" : "Project and report templates"}</h1>
5
+ <p>Work Board reads Markdown files from your workspace folder. Use your editor or existing agent tools to create and update them; this viewer does not write project files.</p>
6
+ <ol><li>Choose a template below. Focus its text area, select all, and copy the Markdown.</li><li>Save it in the served folder with the suggested filename, or adjust its links to your chosen filenames.</li><li>Replace the example IDs with unique stable IDs and update every matching relationship and criterion reference. Frontmatter is optional; ordinary Markdown and existing heading boards also work.</li><li>Fill in real context and observations. Work Board discovers saved files automatically. Start with the project, then follow the investigation and result links.</li></ol>
7
+ <p>Unknown checks stay unknown. Add criterion evidence only after a real observation; a finished agent run is not verified acceptance. No project content is created or marked seen by opening these templates.</p>
8
+ ${startTemplates.map((template) => `<section class="start-template"><h2>${template.label}</h2><p>Suggested file: <code>${template.file}</code></p><details data-key="template:${template.file}"><summary>Read and copy ${template.label.toLowerCase()} Markdown</summary><label for="template-${template.file}">${template.label} template Markdown</label><textarea id="template-${template.file}" readonly rows="16" spellcheck="false">${escapeHtml(template.source)}</textarea></details></section>`).join("")}</article>`;
9
+ }
10
+ //# sourceMappingURL=startHtml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startHtml.js","sourceRoot":"","sources":["../../src/page/startHtml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,UAAU,SAAS,CAAC,KAAK,GAAG,KAAK;IACtC,OAAO,uCAAuC,KAAK,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,8BAA8B;;;;EAIlH,cAAc,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,uCAAuC,QAAQ,CAAC,KAAK,iCAAiC,QAAQ,CAAC,IAAI,0CAA0C,QAAQ,CAAC,IAAI,4BAA4B,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,2CAA2C,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,KAAK,oDAAoD,QAAQ,CAAC,IAAI,2CAA2C,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC;AAC/f,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare const startTemplates: readonly [{
2
+ readonly file: "project.md";
3
+ readonly label: "Project";
4
+ readonly source: "---\nid: example.project\nkind: project\ncriteria:\n - id: readable-result\n text: A reviewer can trace the result to its reasoning and recorded evidence.\n---\n# Project\n\n## Goal\nDescribe the outcome and who needs it.\n\n## Scope and constraints\nName what belongs here and what must remain outside this work.\n\n## Reading path\n- [Investigation](investigation.md)\n- [Agent result](result.md)\n\n## Acceptance\nThe criterion above is a target, not a recorded pass.\nRecord what was checked, the source revision, and remaining limitations.\n";
5
+ }, {
6
+ readonly file: "investigation.md";
7
+ readonly label: "Investigation";
8
+ readonly source: "---\nid: example.investigation\nkind: investigation\nrelationships:\n - kind: informs\n target: example.project\ncriteria:\n - id: explained-choice\n text: Options, evidence, tradeoffs and the recommendation are explicit.\n---\n# Investigation\n\n## Question and background\nExplain the decision in context; do not require the reader to reconstruct it.\n\n## Options and tradeoffs\n| Option | Benefit | Cost | Evidence |\n| --- | --- | --- | --- |\n| First option | Not recorded | Not recorded | Not recorded |\n| Second option | Not recorded | Not recorded | Not recorded |\n\n## Recommendation\nState your take and what remains uncertain.\n\n## Response needed\nName the exact question and the choices. Do not imply that a response was recorded.\n\n[Project and acceptance target](project.md)\n";
9
+ }, {
10
+ readonly file: "result.md";
11
+ readonly label: "Agent result";
12
+ readonly source: "---\nid: example.result\nkind: result\nrelationships:\n - kind: implements\n target: example.investigation\n - kind: relates_to\n target: example.project\n# Add evidence only after a real observation; replace every placeholder:\n# evidence:\n# - criterion: example.project#readable-result\n# source: ./evidence/reading-check.md\n# method: Describe the actual check.\n# outcome: Describe the observed result and its limits.\n# observed_at: Use the actual ISO timestamp with timezone.\n# checked_revision: Use the actual full source commit SHA.\n---\n# Agent result\n\n## Outcome and changes\nExplain what changed and why. Link the relevant source files or patch.\n\n## Reasoning\n[Investigation and alternatives](investigation.md)\n\n## Checks and evidence\nNot recorded. Replace this with actual commands, observations and local evidence links.\nRecorded evidence does not by itself establish verified acceptance.\n\n## Limits and unresolved questions\nName failures, skipped checks, uncertainty and any response needed.\n\n## Next action\nState the next action and who needs to respond, if known.\n\n[Project and acceptance target](project.md)\n";
13
+ }];
14
+ //# sourceMappingURL=startTemplates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startTemplates.d.ts","sourceRoot":"","sources":["../../src/page/startTemplates.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc;;;;;;;;;;;;EAsGjB,CAAC"}
@@ -0,0 +1,104 @@
1
+ export const startTemplates = [
2
+ {
3
+ file: "project.md",
4
+ label: "Project",
5
+ source: `---
6
+ id: example.project
7
+ kind: project
8
+ criteria:
9
+ - id: readable-result
10
+ text: A reviewer can trace the result to its reasoning and recorded evidence.
11
+ ---
12
+ # Project
13
+
14
+ ## Goal
15
+ Describe the outcome and who needs it.
16
+
17
+ ## Scope and constraints
18
+ Name what belongs here and what must remain outside this work.
19
+
20
+ ## Reading path
21
+ - [Investigation](investigation.md)
22
+ - [Agent result](result.md)
23
+
24
+ ## Acceptance
25
+ The criterion above is a target, not a recorded pass.
26
+ Record what was checked, the source revision, and remaining limitations.
27
+ `,
28
+ },
29
+ {
30
+ file: "investigation.md",
31
+ label: "Investigation",
32
+ source: `---
33
+ id: example.investigation
34
+ kind: investigation
35
+ relationships:
36
+ - kind: informs
37
+ target: example.project
38
+ criteria:
39
+ - id: explained-choice
40
+ text: Options, evidence, tradeoffs and the recommendation are explicit.
41
+ ---
42
+ # Investigation
43
+
44
+ ## Question and background
45
+ Explain the decision in context; do not require the reader to reconstruct it.
46
+
47
+ ## Options and tradeoffs
48
+ | Option | Benefit | Cost | Evidence |
49
+ | --- | --- | --- | --- |
50
+ | First option | Not recorded | Not recorded | Not recorded |
51
+ | Second option | Not recorded | Not recorded | Not recorded |
52
+
53
+ ## Recommendation
54
+ State your take and what remains uncertain.
55
+
56
+ ## Response needed
57
+ Name the exact question and the choices. Do not imply that a response was recorded.
58
+
59
+ [Project and acceptance target](project.md)
60
+ `,
61
+ },
62
+ {
63
+ file: "result.md",
64
+ label: "Agent result",
65
+ source: `---
66
+ id: example.result
67
+ kind: result
68
+ relationships:
69
+ - kind: implements
70
+ target: example.investigation
71
+ - kind: relates_to
72
+ target: example.project
73
+ # Add evidence only after a real observation; replace every placeholder:
74
+ # evidence:
75
+ # - criterion: example.project#readable-result
76
+ # source: ./evidence/reading-check.md
77
+ # method: Describe the actual check.
78
+ # outcome: Describe the observed result and its limits.
79
+ # observed_at: Use the actual ISO timestamp with timezone.
80
+ # checked_revision: Use the actual full source commit SHA.
81
+ ---
82
+ # Agent result
83
+
84
+ ## Outcome and changes
85
+ Explain what changed and why. Link the relevant source files or patch.
86
+
87
+ ## Reasoning
88
+ [Investigation and alternatives](investigation.md)
89
+
90
+ ## Checks and evidence
91
+ Not recorded. Replace this with actual commands, observations and local evidence links.
92
+ Recorded evidence does not by itself establish verified acceptance.
93
+
94
+ ## Limits and unresolved questions
95
+ Name failures, skipped checks, uncertainty and any response needed.
96
+
97
+ ## Next action
98
+ State the next action and who needs to respond, if known.
99
+
100
+ [Project and acceptance target](project.md)
101
+ `,
102
+ },
103
+ ];
104
+ //# sourceMappingURL=startTemplates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startTemplates.js","sourceRoot":"","sources":["../../src/page/startTemplates.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B;QACC,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;CAsBT;KACC;IACD;QACC,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BT;KACC;IACD;QACC,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,cAAc;QACrB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCT;KACC;CACQ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AA0EA,eAAO,MAAM,KAAK,QAYN,CAAC"}
1
+ {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AAsFA,eAAO,MAAM,KAAK,QAYN,CAAC"}
@@ -55,6 +55,18 @@ figure.diagram[data-state="failed"] .diagram-source { display: block; }
55
55
  @media (prefers-reduced-motion: reduce) { * { transition: none !important; animation: none !important; } }
56
56
  `;
57
57
  const documents = `
58
+ .start-open { display: block; padding: 0 12px 18px; color: var(--sidebar-text); }
59
+ .onboarding { max-width: 76ch; }
60
+ .start-template textarea { display: block; box-sizing: border-box; width: 100%; margin: 12px 0; padding: 12px; font-family: var(--mono); font-size: 13px; color: var(--text); background: var(--surface); border: 1px solid var(--border); border-radius: 6px; }
61
+ @media print {
62
+ .sidebar, .bar, .preferences, .reading-tools, .visual-tools { display: none !important; }
63
+ .workspace { display: block !important; }
64
+ .page { width: 100%; }
65
+ #doc { padding: 0; }
66
+ .doc pre, .doc table { white-space: pre-wrap; overflow: visible; }
67
+ figure.diagram[data-state="pending"] .diagram-source, figure.diagram[data-state="failed"] .diagram-source { display: block; }
68
+ }
69
+
58
70
  .visual-document, .visual-callout { border: 1px solid var(--border); border-radius: 12px; padding: 1em 1.2em; margin: 1.2em 0; overflow-wrap: anywhere; }
59
71
  .visual-document > :last-child, .visual-callout > :last-child { margin-bottom: 0; }
60
72
  .visual-label { font-weight: 650; margin-top: 0; }
@@ -1 +1 @@
1
- {"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Bb,CAAC;AAEF,MAAM,KAAK,GAAG;;;;;;;;;;;;CAYb,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;;;CAQhB,CAAC;AAEF,MAAM,SAAS,GAAG;;;;;;;;;;;;CAYjB,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GACjB,KAAK;MACH,MAAM;MACN,KAAK;MACL,KAAK;MACL,QAAQ;MACR,aAAa,EAAE;MACf,YAAY;MACZ,cAAc;MACd,SAAS,EAAE;MACX,cAAc,EAAE;MAChB,YAAY;MACZ,SAAS,CAAC"}
1
+ {"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Bb,CAAC;AAEF,MAAM,KAAK,GAAG;;;;;;;;;;;;CAYb,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;;;CAQhB,CAAC;AAEF,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBjB,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GACjB,KAAK;MACH,MAAM;MACN,KAAK;MACL,KAAK;MACL,QAAQ;MACR,aAAa,EAAE;MACf,YAAY;MACZ,cAAc;MACd,SAAS,EAAE;MACX,cAAc,EAAE;MAChB,YAAY;MACZ,SAAS,CAAC"}
@@ -15,7 +15,7 @@ const PageUrl = Schema.String.check(Schema.isMaxLength(8192), Schema.makeFilter(
15
15
  try {
16
16
  const path = new URL(value, "http://127.0.0.1").pathname;
17
17
  return (path === "/"
18
- || ["/_board/work", "/_board/overview", "/_board/changes"].includes(path)
18
+ || ["/_board/work", "/_board/overview", "/_board/changes", "/_board/start"].includes(path)
19
19
  || /^\/_board\/item\/[^/]+\/$/u.exec(path) !== null
20
20
  || /\.md$/iu.exec(path) !== null
21
21
  || "Expected a local reading URL");
@@ -1 +1 @@
1
- {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/rpc/contract.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/rpc/contract.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shivaedev/work-board",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "description": "Serve a folder of markdown files as a live local page that updates in place when a file changes",
5
5
  "homepage": "https://github.com/ShivaeDev/platform/tree/main/packages/work-board#readme",
6
6
  "bugs": {
package/src/board.ts CHANGED
@@ -13,6 +13,7 @@ import { page } from "#http/page.ts";
13
13
  import { respond } from "#http/respond.ts";
14
14
  import { sameOrigin } from "#http/sameOrigin.ts";
15
15
  import { search } from "#http/search.ts";
16
+ import { start } from "#http/start.ts";
16
17
  import { work } from "#http/work.ts";
17
18
  import type { RenderFailed } from "#render/failed.ts";
18
19
  import { Highlighter } from "#render/highlighter.ts";
@@ -44,6 +45,8 @@ const routes = (options: BoardOptions) =>
44
45
  yield* serve("/_board/attachment/*", attachment(options.root, changes.realRoot));
45
46
  const index = yield* searchSnapshot(options.root, home, changes);
46
47
  yield* serve("/_board/search", search(index));
48
+ const startPage = start(changes, home);
49
+ yield* serve("/_board/start", startPage);
47
50
  const workPage = work(index, changes, home);
48
51
  const overviewPage = overview(index, changes, home);
49
52
  const historyPage = changesPage(changes, home);
@@ -64,6 +67,9 @@ const routes = (options: BoardOptions) =>
64
67
  const pathname = new URL(url, "http://127.0.0.1").pathname;
65
68
  let selected: ReturnType<typeof pages>;
66
69
  switch (pathname) {
70
+ case "/_board/start":
71
+ selected = startPage();
72
+ break;
67
73
  case "/_board/work":
68
74
  selected = workPage(request);
69
75
  break;
package/src/cli.ts CHANGED
@@ -4,7 +4,7 @@ import { Effect, Layer, Option, Path } from "effect";
4
4
  import { Argument, Command, Flag } from "effect/unstable/cli";
5
5
  import { HOST, serveBoard } from "./serve.ts";
6
6
 
7
- const VERSION = "0.7.0";
7
+ const VERSION = "0.7.1";
8
8
 
9
9
  const serve = Effect.fn("WorkBoard.serve")(function* (input: { readonly dir: string; readonly port: number; readonly home: Option.Option<string> }) {
10
10
  const path = yield* Path.Path;
package/src/http/page.ts CHANGED
@@ -11,6 +11,7 @@ import { escapeHtml } from "#page/escape.ts";
11
11
  import { metadataHtml } from "#page/metadata.ts";
12
12
  import { navHtml } from "#page/nav.ts";
13
13
  import { shell } from "#page/shell.ts";
14
+ import { startHtml } from "#page/startHtml.ts";
14
15
  import { boardOf } from "#render/board.ts";
15
16
  import type { searchSnapshot } from "#search/snapshot.ts";
16
17
  import { respond } from "./respond.ts";
@@ -80,6 +81,9 @@ export const page = (options: PageOptions, changes: Changes, index: Effect.Succe
80
81
  "text/html",
81
82
  404,
82
83
  );
84
+ if (files.length === 0 && requestedPath(request.url) === "" && resolved === undefined && expectedIdentity === undefined) {
85
+ return respond(layout(startHtml(true)), "text/html");
86
+ }
83
87
  if (file === undefined) {
84
88
  return missing();
85
89
  }
@@ -0,0 +1,16 @@
1
+ import { Effect } from "effect";
2
+ import type { Changes } from "#files/changes.ts";
3
+ import { navHtml } from "#page/nav.ts";
4
+ import { shell } from "#page/shell.ts";
5
+ import { startHtml } from "#page/startHtml.ts";
6
+ import { respond } from "./respond.ts";
7
+
8
+ export function start(changes: Changes, home: string | undefined) {
9
+ return Effect.fn("WorkBoard.start")(function* () {
10
+ const files = yield* changes.files;
11
+ return respond(
12
+ shell("Getting started", navHtml(files, "", home), startHtml(files.length === 0), changes.realRoot, false, undefined, "start"),
13
+ "text/html",
14
+ );
15
+ });
16
+ }
@@ -88,7 +88,7 @@ document.addEventListener("click", (event) => {
88
88
  const link = event.target.closest?.("a[href]");
89
89
  if (!link || event.defaultPrevented || event.button !== 0 || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey || link.hasAttribute("download") || (link.target && link.target !== "_self")) return;
90
90
  const target = new URL(link.href, location.href);
91
- if (target.origin !== location.origin || !(target.pathname === "/" || (target.pathname === "/_board/changes" || target.pathname === "/_board/overview" || target.pathname === "/_board/work" || target.pathname.startsWith("/_board/item/")) || /\\.md$/i.test(target.pathname))) return;
91
+ if (target.origin !== location.origin || !(target.pathname === "/" || (target.pathname === "/_board/start" || target.pathname === "/_board/changes" || target.pathname === "/_board/overview" || target.pathname === "/_board/work" || target.pathname.startsWith("/_board/item/")) || /\\.md$/i.test(target.pathname))) return;
92
92
  event.preventDefault();
93
93
  navigate(target);
94
94
  });
package/src/page/shell.ts CHANGED
@@ -17,7 +17,7 @@ export const shell = (
17
17
  workspace: string,
18
18
  board: boolean,
19
19
  identity?: string,
20
- view: boolean | "overview" | "changes" = false,
20
+ view: boolean | "overview" | "changes" | "start" = false,
21
21
  ): string =>
22
22
  [
23
23
  `<!doctype html><html lang="en" data-workspace="${escapeHtml(workspace)}"><head><meta charset="utf-8">`,
@@ -26,7 +26,7 @@ export const shell = (
26
26
  '<link rel="stylesheet" href="/_board/style.css"><script type="module" src="/_board/client.js"></script>',
27
27
  '</head><body><noscript><style>html:not([data-js]) figure.diagram .diagram-source{display:block}html:not([data-js]) figure.diagram[data-state="pending"]{min-height:0}</style></noscript><a class="skip" href="#doc">Skip to content</a><div class="workspace">',
28
28
  '<aside id="sidebar" class="sidebar"><a class="brand" href="/">work board<span>Local workspace</span></a>',
29
- '<div id="reading-library" class="reading-library" hidden></div><h2 class="nav-heading">Project files</h2>',
29
+ '<div id="reading-library" class="reading-library" hidden></div><a id="start-open" class="start-open" href="/_board/start">Getting started</a><h2 class="nav-heading">Project files</h2>',
30
30
  `<nav id="files" class="files" aria-label="Project files">${nav}</nav></aside>`,
31
31
  '<div class="page"><header class="bar"><button id="sidebar-toggle" type="button" aria-controls="sidebar" aria-expanded="true">Files</button>',
32
32
  `<nav id="breadcrumbs" class="breadcrumbs" aria-label="File location"><a href="/">Workspace</a><span class="separator">/</span>${location(title)}</nav>`,
@@ -0,0 +1,10 @@
1
+ import { escapeHtml } from "./escape.ts";
2
+ import { startTemplates } from "./startTemplates.ts";
3
+
4
+ export function startHtml(empty = false): string {
5
+ return `<article class="doc onboarding"><h1>${empty ? "Start your local workspace" : "Project and report templates"}</h1>
6
+ <p>Work Board reads Markdown files from your workspace folder. Use your editor or existing agent tools to create and update them; this viewer does not write project files.</p>
7
+ <ol><li>Choose a template below. Focus its text area, select all, and copy the Markdown.</li><li>Save it in the served folder with the suggested filename, or adjust its links to your chosen filenames.</li><li>Replace the example IDs with unique stable IDs and update every matching relationship and criterion reference. Frontmatter is optional; ordinary Markdown and existing heading boards also work.</li><li>Fill in real context and observations. Work Board discovers saved files automatically. Start with the project, then follow the investigation and result links.</li></ol>
8
+ <p>Unknown checks stay unknown. Add criterion evidence only after a real observation; a finished agent run is not verified acceptance. No project content is created or marked seen by opening these templates.</p>
9
+ ${startTemplates.map((template) => `<section class="start-template"><h2>${template.label}</h2><p>Suggested file: <code>${template.file}</code></p><details data-key="template:${template.file}"><summary>Read and copy ${template.label.toLowerCase()} Markdown</summary><label for="template-${template.file}">${template.label} template Markdown</label><textarea id="template-${template.file}" readonly rows="16" spellcheck="false">${escapeHtml(template.source)}</textarea></details></section>`).join("")}</article>`;
10
+ }
@@ -0,0 +1,103 @@
1
+ export const startTemplates = [
2
+ {
3
+ file: "project.md",
4
+ label: "Project",
5
+ source: `---
6
+ id: example.project
7
+ kind: project
8
+ criteria:
9
+ - id: readable-result
10
+ text: A reviewer can trace the result to its reasoning and recorded evidence.
11
+ ---
12
+ # Project
13
+
14
+ ## Goal
15
+ Describe the outcome and who needs it.
16
+
17
+ ## Scope and constraints
18
+ Name what belongs here and what must remain outside this work.
19
+
20
+ ## Reading path
21
+ - [Investigation](investigation.md)
22
+ - [Agent result](result.md)
23
+
24
+ ## Acceptance
25
+ The criterion above is a target, not a recorded pass.
26
+ Record what was checked, the source revision, and remaining limitations.
27
+ `,
28
+ },
29
+ {
30
+ file: "investigation.md",
31
+ label: "Investigation",
32
+ source: `---
33
+ id: example.investigation
34
+ kind: investigation
35
+ relationships:
36
+ - kind: informs
37
+ target: example.project
38
+ criteria:
39
+ - id: explained-choice
40
+ text: Options, evidence, tradeoffs and the recommendation are explicit.
41
+ ---
42
+ # Investigation
43
+
44
+ ## Question and background
45
+ Explain the decision in context; do not require the reader to reconstruct it.
46
+
47
+ ## Options and tradeoffs
48
+ | Option | Benefit | Cost | Evidence |
49
+ | --- | --- | --- | --- |
50
+ | First option | Not recorded | Not recorded | Not recorded |
51
+ | Second option | Not recorded | Not recorded | Not recorded |
52
+
53
+ ## Recommendation
54
+ State your take and what remains uncertain.
55
+
56
+ ## Response needed
57
+ Name the exact question and the choices. Do not imply that a response was recorded.
58
+
59
+ [Project and acceptance target](project.md)
60
+ `,
61
+ },
62
+ {
63
+ file: "result.md",
64
+ label: "Agent result",
65
+ source: `---
66
+ id: example.result
67
+ kind: result
68
+ relationships:
69
+ - kind: implements
70
+ target: example.investigation
71
+ - kind: relates_to
72
+ target: example.project
73
+ # Add evidence only after a real observation; replace every placeholder:
74
+ # evidence:
75
+ # - criterion: example.project#readable-result
76
+ # source: ./evidence/reading-check.md
77
+ # method: Describe the actual check.
78
+ # outcome: Describe the observed result and its limits.
79
+ # observed_at: Use the actual ISO timestamp with timezone.
80
+ # checked_revision: Use the actual full source commit SHA.
81
+ ---
82
+ # Agent result
83
+
84
+ ## Outcome and changes
85
+ Explain what changed and why. Link the relevant source files or patch.
86
+
87
+ ## Reasoning
88
+ [Investigation and alternatives](investigation.md)
89
+
90
+ ## Checks and evidence
91
+ Not recorded. Replace this with actual commands, observations and local evidence links.
92
+ Recorded evidence does not by itself establish verified acceptance.
93
+
94
+ ## Limits and unresolved questions
95
+ Name failures, skipped checks, uncertainty and any response needed.
96
+
97
+ ## Next action
98
+ State the next action and who needs to respond, if known.
99
+
100
+ [Project and acceptance target](project.md)
101
+ `,
102
+ },
103
+ ] as const;
package/src/page/style.ts CHANGED
@@ -59,6 +59,18 @@ figure.diagram[data-state="failed"] .diagram-source { display: block; }
59
59
  `;
60
60
 
61
61
  const documents = `
62
+ .start-open { display: block; padding: 0 12px 18px; color: var(--sidebar-text); }
63
+ .onboarding { max-width: 76ch; }
64
+ .start-template textarea { display: block; box-sizing: border-box; width: 100%; margin: 12px 0; padding: 12px; font-family: var(--mono); font-size: 13px; color: var(--text); background: var(--surface); border: 1px solid var(--border); border-radius: 6px; }
65
+ @media print {
66
+ .sidebar, .bar, .preferences, .reading-tools, .visual-tools { display: none !important; }
67
+ .workspace { display: block !important; }
68
+ .page { width: 100%; }
69
+ #doc { padding: 0; }
70
+ .doc pre, .doc table { white-space: pre-wrap; overflow: visible; }
71
+ figure.diagram[data-state="pending"] .diagram-source, figure.diagram[data-state="failed"] .diagram-source { display: block; }
72
+ }
73
+
62
74
  .visual-document, .visual-callout { border: 1px solid var(--border); border-radius: 12px; padding: 1em 1.2em; margin: 1.2em 0; overflow-wrap: anywhere; }
63
75
  .visual-document > :last-child, .visual-callout > :last-child { margin-bottom: 0; }
64
76
  .visual-label { font-weight: 650; margin-top: 0; }
@@ -18,7 +18,7 @@ const PageUrl = Schema.String.check(
18
18
  const path = new URL(value, "http://127.0.0.1").pathname;
19
19
  return (
20
20
  path === "/"
21
- || ["/_board/work", "/_board/overview", "/_board/changes"].includes(path)
21
+ || ["/_board/work", "/_board/overview", "/_board/changes", "/_board/start"].includes(path)
22
22
  || /^\/_board\/item\/[^/]+\/$/u.exec(path) !== null
23
23
  || /\.md$/iu.exec(path) !== null
24
24
  || "Expected a local reading URL"