spexcode 0.5.1 → 0.5.3

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 (155) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/spec-cli/bin/spex.mjs +25 -1
  4. package/spec-cli/hooks/dispatch.sh +24 -1
  5. package/spec-cli/src/anchors.ts +192 -58
  6. package/spec-cli/src/attach.ts +11 -8
  7. package/spec-cli/src/claude-headless.ts +116 -66
  8. package/spec-cli/src/cli.ts +221 -72
  9. package/spec-cli/src/client.ts +143 -5
  10. package/spec-cli/src/gateway-hub.ts +2 -6
  11. package/spec-cli/src/gateway.ts +96 -11
  12. package/spec-cli/src/git.ts +1395 -96
  13. package/spec-cli/src/graph.ts +21 -17
  14. package/spec-cli/src/graphCache.ts +405 -61
  15. package/spec-cli/src/graphStream.ts +581 -182
  16. package/spec-cli/src/guide.ts +13 -3
  17. package/spec-cli/src/harness.ts +965 -70
  18. package/spec-cli/src/headless-controller.ts +63 -0
  19. package/spec-cli/src/help.ts +120 -64
  20. package/spec-cli/src/host-resources.ts +706 -0
  21. package/spec-cli/src/host.ts +1 -0
  22. package/spec-cli/src/index.ts +95 -21
  23. package/spec-cli/src/init.ts +47 -8
  24. package/spec-cli/src/issues.ts +36 -3
  25. package/spec-cli/src/layout.ts +193 -37
  26. package/spec-cli/src/lint.ts +152 -27
  27. package/spec-cli/src/localIssues.ts +5 -1
  28. package/spec-cli/src/maintenance-wrapper.ts +276 -0
  29. package/spec-cli/src/materialize.ts +6 -7
  30. package/spec-cli/src/opencode-headless.ts +117 -7
  31. package/spec-cli/src/opencode.ts +8 -4
  32. package/spec-cli/src/pi-headless.ts +18 -60
  33. package/spec-cli/src/process-identity.ts +49 -0
  34. package/spec-cli/src/project-store.ts +17 -0
  35. package/spec-cli/src/pty-bridge.ts +37 -7
  36. package/spec-cli/src/pty-helper.mjs +16 -6
  37. package/spec-cli/src/pty-native-helper.mjs +22 -0
  38. package/spec-cli/src/reviews.ts +17 -13
  39. package/spec-cli/src/runtime-ownership.ts +99 -0
  40. package/spec-cli/src/session-maintenance.ts +750 -0
  41. package/spec-cli/src/session-timeline.ts +29 -23
  42. package/spec-cli/src/sessions.ts +1262 -200
  43. package/spec-cli/src/sh.ts +3 -0
  44. package/spec-cli/src/source-files.ts +27 -2
  45. package/spec-cli/src/specs.ts +58 -25
  46. package/spec-cli/src/supervise.ts +31 -11
  47. package/spec-cli/src/uninstall.ts +7 -6
  48. package/spec-cli/templates/hooks/commit-msg +14 -0
  49. package/spec-cli/templates/hooks/pre-commit +26 -6
  50. package/spec-cli/templates/hooks/prepare-commit-msg +20 -48
  51. package/spec-cli/templates/hooks/reference-transaction +105 -0
  52. package/spec-cli/templates/spec/project/.plugins/commands/supervisor/spec.md +1 -1
  53. package/spec-cli/templates/spec/project/.plugins/core/mark-active/mark-active.sh +23 -21
  54. package/spec-cli/templates/spec/project/.plugins/core/spec.md +12 -10
  55. package/spec-cli/templates/spec/project/.plugins/core/stop-gate/stop-gate.sh +15 -6
  56. package/spec-cli/templates/spec/project/.plugins/prompts/atomic-landing/spec.md +32 -0
  57. package/spec-dashboard/dist/assets/App-C5vbTw8Q.js +2 -0
  58. package/spec-dashboard/dist/assets/Dashboard-u8RIS3NY.js +27 -0
  59. package/spec-dashboard/dist/assets/EvalsPage-BS7ITcNo.js +2 -0
  60. package/spec-dashboard/dist/assets/IssuesPage-DXbqQFW_.js +1 -0
  61. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  62. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  63. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  64. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  65. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  66. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  67. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  68. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  69. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  70. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  71. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  72. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  73. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  74. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  75. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  76. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  77. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  78. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  79. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  80. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  81. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  82. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  83. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  84. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  85. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  86. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  87. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  88. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  89. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  90. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  91. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  92. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  93. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  94. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  95. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  96. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  97. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  98. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  99. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  100. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  101. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  102. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  103. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  104. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  105. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  106. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  107. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  108. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  109. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  110. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  111. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  112. package/spec-dashboard/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  113. package/spec-dashboard/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  114. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  115. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  116. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  117. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  118. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  119. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  120. package/spec-dashboard/dist/assets/MobileApp-DVLnk9hz.js +2 -0
  121. package/spec-dashboard/dist/assets/Modal-6mHq6fbZ.js +1 -0
  122. package/spec-dashboard/dist/assets/{PageScroll-B_dKCuXx.js → PageScroll-CAY4S4g4.js} +1 -1
  123. package/spec-dashboard/dist/assets/ProjectsPage-UQyzsTWN.js +1 -0
  124. package/spec-dashboard/dist/assets/SessionInterface-DKU4c1Z-.js +39 -0
  125. package/spec-dashboard/dist/assets/SessionWindow-zGwJaGbR.js +1 -0
  126. package/spec-dashboard/dist/assets/Settings-igR17pns.js +1 -0
  127. package/spec-dashboard/dist/assets/Thread-B-ZUarN1.js +13 -0
  128. package/spec-dashboard/dist/assets/TimelineChat-Cp579UoJ.css +1 -0
  129. package/spec-dashboard/dist/assets/TimelineChat-sc49Qj5d.js +276 -0
  130. package/spec-dashboard/dist/assets/data-B1ot4PF0.js +1 -0
  131. package/spec-dashboard/dist/assets/index-BqBNCa1V.js +41 -0
  132. package/spec-dashboard/dist/assets/index-CzutlTDf.css +1 -0
  133. package/spec-dashboard/dist/assets/{terminalFont-DmTPNdbU.js → terminalFont-C6oGNKrf.js} +1 -1
  134. package/spec-dashboard/dist/index.html +5 -4
  135. package/spec-dashboard/src/reviewFilters.js +46 -8
  136. package/spec-dashboard/src/session.js +64 -9
  137. package/spec-eval/src/cli.ts +144 -32
  138. package/spec-eval/src/evaltab.ts +16 -9
  139. package/spec-eval/src/freshness.ts +336 -54
  140. package/spec-eval/src/scenariofresh.ts +51 -1
  141. package/spec-eval/src/scenarios.ts +324 -25
  142. package/spec-eval/src/sessioneval.ts +969 -173
  143. package/spec-cli/src/message-stream.ts +0 -147
  144. package/spec-dashboard/dist/assets/Dashboard-C_w_wdk5.js +0 -27
  145. package/spec-dashboard/dist/assets/EvalsPage-5_nfIYll.js +0 -2
  146. package/spec-dashboard/dist/assets/IssuesPage-By-u--95.js +0 -1
  147. package/spec-dashboard/dist/assets/MobileApp-CVEwjHr9.js +0 -2
  148. package/spec-dashboard/dist/assets/Modal-BqgvzMJD.js +0 -1
  149. package/spec-dashboard/dist/assets/ProjectsPage-RVP8AqK4.js +0 -1
  150. package/spec-dashboard/dist/assets/SessionInterface-Bh3vq8SU.js +0 -39
  151. package/spec-dashboard/dist/assets/SessionWindow-BuJ5mzjC.js +0 -13
  152. package/spec-dashboard/dist/assets/Settings-B8KFocsz.js +0 -1
  153. package/spec-dashboard/dist/assets/TimelineChat-K0wdlweB.js +0 -1
  154. package/spec-dashboard/dist/assets/index-BKaTHjmU.js +0 -41
  155. package/spec-dashboard/dist/assets/index-DcnCaBAC.css +0 -1
@@ -0,0 +1 @@
1
+ import{d as O}from"./index-BqBNCa1V.js";const R=1e4,v=2.5*R;function N(e,{deadMs:t=v,setTimeoutImpl:s=setTimeout,clearTimeoutImpl:n=clearTimeout}={}){let r=0;const o=()=>{r&&(n(r),r=0)};return{arm:()=>{o(),r=s(()=>{r=0,e()},t)},disarm:o}}const $=280,E=54;function J(e,t){const s={};e.forEach(o=>{var a;o.parent&&(s[a=o.parent]??(s[a]=[])).push(o.id)});const n={},r=(o,a,l)=>{n[o]={x:a*$,y:l};const i=t.has(o)?s[o]||[]:[];if(!i.length)return;const h=l-(i.length-1)/2*E;i.forEach((j,f)=>r(j,a+1,h+f*E))};return e.filter(o=>!o.parent).forEach((o,a)=>r(o.id,0,a*E)),n}const I=[150,350,600,900];async function p(e,t){const s=typeof e=="string"?O(e):e;for(let n=0;;n++)try{return await fetch(s,t)}catch(r){if(n>=I.length)throw r;await new Promise(o=>setTimeout(o,I[n]))}}let T="";const P=()=>{T=""};async function C(){const e=await p("/api/graph",{cache:"no-store",headers:T?{"If-None-Match":T}:{}});if(e.status===304)return null;if(e.status===401||e.status===403){const n=await e.json().catch(()=>null);return{authRequired:(n==null?void 0:n.reason)||"project-login"}}const t=e.headers.get("etag")||"";return{board:await e.json(),seal:()=>{T=t}}}const S=(e,...t)=>O(`/api/specs/${encodeURIComponent(e)}${t.map(s=>"/"+s).join("")}`);function x({onBoard:e,onLegacyChange:t,onStatus:s}){let n=null,r=!1,o=null,a="";const l=u=>{const{nodes:c=[],sessions:m=[],...w}=u,g=new Map([["meta",w],["nodes#order",c.map(d=>d.id)],["sess#order",m.map(d=>d.id)]]);return c.forEach(d=>g.set("node:"+d.id,d)),m.forEach(d=>g.set("sess:"+d.id,d)),g},i=u=>{const c=(m,w)=>(u.get(w)||[]).map(g=>u.get(m+g));return{...u.get("meta")||{},nodes:c("node:","nodes#order"),sessions:c("sess:","sess#order")}},h=()=>{try{n==null||n.close()}catch{}o=null,a="",y()},j=N(()=>{!n||r||(s==null||s(!1),h(),j.arm(),t==null||t())}),f=()=>j.arm(),y=()=>{if(!r){try{n=new EventSource(O("/api/graph/stream?mode=delta"))}catch{n=null;return}n.addEventListener("graph-full",u=>{f();const{to:c,graph:m}=JSON.parse(u.data);o=l(m),a=c,P(),e(m,{authoritative:!0,tag:c}),s==null||s(!0)}),n.addEventListener("graph-delta",u=>{f();const c=JSON.parse(u.data);if(!o||a!==c.from){h();return}for(const m of c.del||[])o.delete(m);for(const[m,w]of Object.entries(c.set||{}))o.set(m,w);a=c.to,P(),e(i(o),{authoritative:!1,tag:c.to}),s==null||s(!0)}),n.addEventListener("graph-changed",()=>{f(),t==null||t()}),n.addEventListener("error",()=>s==null?void 0:s(!1)),n.addEventListener("ping",f),n.addEventListener("ready",f)}};return y(),s==null||s(!1),f(),()=>{r=!0,j.disarm();try{n==null||n.close()}catch{}}}function A(e,t,s=!1){if(!(e!=null&&e.sessions))return e;const n=new Set(e.sessions.map(a=>a.id));if(s)for(const a of t.keys())n.has(a)||t.delete(a);let r=!1;const o=e.sessions.map(a=>{var f,y;const l=a.evalSummary;if(!l||!Number.isInteger(l.generation)||!l.epoch)return a;const i=t.get(a.id),h=i&&i.epoch!==l.epoch;if(!i||(h?s:l.generation>=i.generation)){const u=((f=i==null?void 0:i.projection)==null?void 0:f.phase)==="ready"&&i.projection.value?{generation:i.projection.generation,revision:i.projection.revision,value:i.projection.value}:(y=i==null?void 0:i.projection)==null?void 0:y.lastKnown,c=h&&!l.value&&!l.lastKnown&&u?{...l,lastKnown:u}:l;return t.set(a.id,{epoch:c.epoch,generation:c.generation,projection:c}),c!==l?(r=!0,{...a,evalSummary:c}):a}return r=!0,{...a,evalSummary:i.projection}});return r?{...e,sessions:o}:e}const F=e=>{var t,s;return{title:((t=e==null?void 0:e.identity)==null?void 0:t.title)||(e==null?void 0:e.project)||"",icon:((s=e==null?void 0:e.identity)==null?void 0:s.icon)||(e==null?void 0:e.projectIcon)||"spexcode"}},k=(e,...t)=>O(`/api/sessions/${encodeURIComponent(e)}${t.map(s=>"/"+s).join("")}`);async function _(e){const t=await p(k(e,"timeline"),{cache:"no-store"});return t.ok?t.json():null}async function B(e){const t=await p(k(e));return t.ok?t.json():null}async function D(e,t,{replyVia:s}={}){const n=await p(k(e,"input"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({kind:"text",text:t,...s?{replyVia:s}:{}})}),r=await n.json().catch(()=>({}));return{ok:n.ok&&(r==null?void 0:r.ok)!==!1,error:r==null?void 0:r.error}}async function G(){return(await p("/api/plugins")).json()}async function K(){return(await p("/api/plugins?surface=review")).json()}async function M(){return(await p("/api/settings")).json()}async function q(e){const t=await p(`/api/issues/${encodeURIComponent(e)}`);if(t.status===404)return!1;if(!t.ok)throw new Error(`HTTP ${t.status}`);return t.json()}async function X(e,t,s){return(await p(`/api/issues/${encodeURIComponent(e)}/reply`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({body:t,...s!=null&&s.length?{evidence:s}:{}})})).json()}async function Y(e){return(await p(`/api/issues/${encodeURIComponent(e)}/close`,{method:"POST"})).json()}async function z(e){return(await p(`/api/issues/${encodeURIComponent(e)}/promote`,{method:"POST"})).json()}async function H(e,t){return(await p(`/api/remarks/${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({ref:t})})).json()}async function Q({concern:e,body:t,evidence:s,store:n}){return(await p("/api/issues",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({concern:e,body:t,store:n,...s!=null&&s.length?{evidence:s}:{}})})).json()}async function V({node:e,scenario:t,issue:s,body:n,codeSha:r,evidence:o}){return(await p("/api/remarks",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({node:e,scenario:t,issue:s,body:n,...r?{codeSha:r}:{},...o!=null&&o.length?{evidence:o}:{}})})).json()}async function W(e,t){return(await p(`/api/specs/${encodeURIComponent(e)}/evals/ok`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({scenario:t})})).json()}async function Z(e){return(await p("/api/evidence",{method:"POST",headers:{"Content-Type":"image/png"},body:e})).json()}export{$ as X,E as Y,A as a,K as b,Z as c,V as d,W as e,J as f,p as g,S as h,G as i,M as j,H as k,C as l,z as m,Y as n,X as o,F as p,q,Q as r,x as s,N as t,_ as u,B as v,D as w};