spexcode 0.5.5 → 0.5.7

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 (38) hide show
  1. package/package.json +1 -1
  2. package/spec-cli/src/cli.ts +18 -1
  3. package/spec-cli/src/client.ts +21 -0
  4. package/spec-cli/src/git.ts +460 -238
  5. package/spec-cli/src/harness.ts +116 -24
  6. package/spec-cli/src/help.ts +3 -1
  7. package/spec-cli/src/index.ts +48 -9
  8. package/spec-cli/src/layout.ts +2 -0
  9. package/spec-cli/src/mentions.ts +10 -5
  10. package/spec-cli/src/process-identity.ts +20 -0
  11. package/spec-cli/src/reviewSnapshot.ts +4 -0
  12. package/spec-cli/src/reviews.ts +10 -5
  13. package/spec-cli/src/session-maintenance.ts +2 -1
  14. package/spec-cli/src/sessions.ts +898 -140
  15. package/spec-cli/src/specs.ts +3 -3
  16. package/spec-dashboard/dist/assets/{App-C5vbTw8Q.js → App-u2P7KdSg.js} +2 -2
  17. package/spec-dashboard/dist/assets/Dashboard-B8wp5_61.js +27 -0
  18. package/spec-dashboard/dist/assets/{EvalsPage-BS7ITcNo.js → EvalsPage-Bq1Tkb8y.js} +2 -2
  19. package/spec-dashboard/dist/assets/IssuesPage-BlkPSkmv.js +1 -0
  20. package/spec-dashboard/dist/assets/{MobileApp-DVLnk9hz.js → MobileApp-B1GxRZXK.js} +2 -2
  21. package/spec-dashboard/dist/assets/{Modal-6mHq6fbZ.js → Modal-bAkq9IIT.js} +1 -1
  22. package/spec-dashboard/dist/assets/{PageScroll-CAY4S4g4.js → PageScroll-px_rUZVJ.js} +1 -1
  23. package/spec-dashboard/dist/assets/{ProjectsPage-UQyzsTWN.js → ProjectsPage-8uGqYM12.js} +1 -1
  24. package/spec-dashboard/dist/assets/SessionInterface-CswwbewF.js +39 -0
  25. package/spec-dashboard/dist/assets/SessionWindow-IspcLjFA.js +1 -0
  26. package/spec-dashboard/dist/assets/{Settings-igR17pns.js → Settings-bpAbfnmS.js} +1 -1
  27. package/spec-dashboard/dist/assets/{Thread-B-ZUarN1.js → Thread-BpL3N3kw.js} +11 -11
  28. package/spec-dashboard/dist/assets/{TimelineChat-sc49Qj5d.js → TimelineChat-Ckmb1Ez2.js} +1 -1
  29. package/spec-dashboard/dist/assets/{data-B1ot4PF0.js → data-CQFbQEMH.js} +1 -1
  30. package/spec-dashboard/dist/assets/index-CixSnz1H.css +1 -0
  31. package/spec-dashboard/dist/assets/index-Di1ch5dd.js +41 -0
  32. package/spec-dashboard/dist/index.html +2 -2
  33. package/spec-dashboard/dist/assets/Dashboard-u8RIS3NY.js +0 -27
  34. package/spec-dashboard/dist/assets/IssuesPage-DXbqQFW_.js +0 -1
  35. package/spec-dashboard/dist/assets/SessionInterface-DKU4c1Z-.js +0 -39
  36. package/spec-dashboard/dist/assets/SessionWindow-zGwJaGbR.js +0 -1
  37. package/spec-dashboard/dist/assets/index-BqBNCa1V.js +0 -41
  38. package/spec-dashboard/dist/assets/index-CzutlTDf.css +0 -1
@@ -1 +0,0 @@
1
- import{u as D,f as z,A,r as v,j as e,n as H,g as R,c as F,I as $,h as Q,q as G,s as V}from"./index-BqBNCa1V.js";import{m as J,n as X,o as Z,q as W,r as ee}from"./data-B1ot4PF0.js";import{l as se,n as te,D as P,a0 as _,j as ne,g as ie,d as C,f as E,O as le,a as U,q as M,R as ae,a1 as re,L as oe,S as ce,F as ue,K as de,a2 as fe,a3 as pe,a4 as q,a5 as me,a6 as K,a7 as O,M as ve}from"./Thread-B-ZUarN1.js";import"./PageScroll-CAY4S4g4.js";const Y="new",xe=s=>s.status!=="open",be=s=>{const o=Math.max(0,(Date.now()-new Date(s).getTime())/1e3);return Number.isFinite(o)?o<3600?`${Math.max(1,Math.floor(o/60))}m`:o<86400?`${Math.floor(o/3600)}h`:`${Math.floor(o/86400)}d`:""},je=s=>{const o=String(s||"").split("#"),d=o.length>1?o.at(-1):o[0];return`#${d.length>16?`${d.slice(0,13)}…`:d}`},ge=["is","state","store","author","node","session"],T=(s,o,d,c=l=>l)=>{var l,t;return(((t=(l=s==null?void 0:s.facets)==null?void 0:l[o])==null?void 0:t.options)??[]).map(u=>({value:u.value,label:u.value===""?d:c(u.value)}))};function he({data:s,loading:o,error:d,query:c,notice:l}){var a,y,x,I;const t=D();if(s&&!s.enabled)return e.jsx("div",{className:"fv-note",children:t("session.issuesOff")});const u=Array.isArray(s==null?void 0:s.items)?s.items:[],r=String(c.q??"").trim()||A,b=i=>H("issues",null,{query:G(i,A)}),m=(i,n)=>b(V(r,i,n)),p=(((y=(a=s==null?void 0:s.facets)==null?void 0:a.store)==null?void 0:y.options)??[]).map(i=>i.value).filter(Boolean),w=u,j=((x=s==null?void 0:s.counts)==null?void 0:x.open)||0,f=((I=s==null?void 0:s.counts)==null?void 0:I.closed)||0,h=F(r,"state"),L=w.map(i=>{var g,B;const n=i.status||"open";return{key:i.id,href:R("issues",i.id),content:e.jsx(e.Fragment,{children:e.jsx(ae,{state:e.jsx(U,{kind:"issue",state:n}),title:i.concern,meta:e.jsxs(e.Fragment,{children:[e.jsx("span",{"data-tip":i.id,children:je(i.id)}),i.by&&e.jsx("span",{"data-tip":i.by,children:t("reviewList.openedBy",{by:re(i.by)})}),i.created&&e.jsx("span",{children:t("reviewList.openedAt",{at:be(i.created)})})]}),aside:e.jsxs(e.Fragment,{children:[(((g=i.replies)==null?void 0:g.length)??0)>0&&e.jsxs("span",{className:"rl-comments","data-tip":t("session.issuesReplies",{n:i.replies.length}),children:[e.jsx($,{name:"message-square",size:14}),i.replies.length]}),p.length>1&&e.jsx("span",{className:`rl-tag fv-store-${i.store==="local"?"local":"forge"}`,children:i.store}),((B=i.nodes)==null?void 0:B[0])&&e.jsx("span",{className:"rl-tag node",children:i.nodes[0]})]})})})}}),k=e.jsxs("a",{className:"rl-new",href:R("issues",Y),children:[e.jsx($,{name:"plus",size:14}),t("session.issuesNew")]}),N={label:t("reviewList.facetStore"),value:F(r,"store"),options:T(s,"store",t("reviewList.all"))},S={label:t("reviewList.facetSession"),value:F(r,"session"),options:T(s,"session",t("reviewList.all"),i=>t(i==="present"?"reviewList.sessionPresent":"reviewList.sessionMissing"))};return e.jsx(oe,{notice:l,loading:o,error:d,title:t("reviewList.issuesTitle"),action:k,search:{value:String(c.q??"").trim()?c.q:A,onSubmit:b,placeholder:t("reviewList.searchIssues"),label:t("reviewList.search"),keys:ge,suggest:{author:T(s,"author",t("reviewList.all")).filter(i=>i.value),node:T(s,"node",t("reviewList.all")).filter(i=>i.value)}},sections:[{key:"open",label:t("reviewList.open"),count:j,active:h===""||h==="open",onSelect:()=>m("state","open")},{key:"closed",label:t("reviewList.closed"),count:f,active:h!==""&&h!=="open",onSelect:()=>m("state","closed")}],facets:e.jsx(ue,{label:N.label,value:N.value,options:N.options,clearLabel:t("reviewList.all"),onChange:i=>m("store",i),mobile:!0}),secondaryFilters:e.jsx(ce,{label:t("reviewList.filters"),clearLabel:t("reviewList.all"),groups:[{label:S.label,value:S.value,active:!!S.value,options:S.options,onChange:i=>m("session",i)}]}),rows:L,pagination:s?{page:s.page,pageCount:s.pageCount,prev:s.prev,next:s.next,hrefFor:i=>R("issues",null,Q(r,A,i))}:null,empty:{hasData:((s==null?void 0:s.sourceTotal)??0)>0,dataset:t("session.issuesEmpty"),filtered:t("session.issuesNoMatch")}})}function ye({issue:s,specs:o,sessions:d,onFocusNode:c,onOpenSession:l,onWrite:t,notice:u}){const r=D(),b=s.store==="local",m=xe(s),[p,w]=v.useState(""),[j,f]=v.useState(""),h=Array.isArray(s.nodes)?s.nodes:[],L=Array.isArray(s.replies)?s.replies:[],k=s.status||"open",N=(a,y)=>async()=>{if(!p){w(a);try{const x=await y();x!=null&&x.ok?(f(""),await(t==null?void 0:t(""))):f((x==null?void 0:x.error)||`${a} failed`)}finally{w("")}}},S=(a,y,x,I)=>e.jsx("button",{type:"button",className:`fv-close-issue fv-life-${a}`,disabled:!!p,"data-tip":I,onMouseDown:i=>i.preventDefault(),onClick:N(a,x),children:p===a?r("session.issuesActing"):y});return e.jsxs(P,{title:s.concern,backHref:M("issues"),backLabel:r("detail.backToIssues"),status:e.jsx(U,{kind:"issue",state:k,showLabel:!0,className:"ds-status-pill",size:16}),side:e.jsxs(e.Fragment,{children:[e.jsx(C,{label:r("detail.sideIssue"),children:e.jsx(E,{text:s.id,mono:!0})}),e.jsxs(C,{label:r("detail.sideStore"),children:[e.jsx(E,{text:s.store,className:`fv-store fv-store-${b?"local":"forge"}`}),s.url&&e.jsx(E,{text:r("session.issuesOpenOnStore",{store:Se(s.store)}),href:s.url,external:!0})]}),s.by&&e.jsx(C,{label:r("detail.sideOriginator"),children:b?e.jsx(le,{originator:s.by,sessions:d,kind:"issue",onOpenSession:l}):e.jsx(E,{text:s.by,dim:!0})}),h.length>0&&e.jsx(C,{label:r("detail.sideNodes"),children:h.map(a=>e.jsx(E,{text:a,mono:!0,tip:r("session.issuesFocusNode"),onClick:()=>c==null?void 0:c(a)},a))})]}),composer:e.jsx(ie,{onSend:(a,y)=>Z(s.id,a,y),specs:o,sessions:d,focusId:h[0]||null,onDone:t,actionsEnd:!m&&e.jsxs(e.Fragment,{children:[j&&e.jsx("span",{className:"fv-error",children:j}),b&&S("promote",r("session.issuesPromote"),()=>J(s.id),r("session.issuesPromoteTitle")),S("close",r("session.issuesCloseIssue"),()=>X(s.id),r("session.issuesCloseIssueTitle"))]})},s.id),children:[u&&e.jsx("div",{className:"fv-notice",children:u}),s.body&&e.jsx("div",{className:"fvd-body",children:e.jsx(_,{body:s.body})}),e.jsx(ne,{replies:L,threadId:b?s.id:null,onRemarkChange:()=>t==null?void 0:t("")})]})}function we(s,o){const[d,c]=v.useState(null),[l,t]=v.useState(null),u=v.useRef(0),r=v.useCallback(async()=>{if(!s)return null;const m=++u.current;t(null);try{const p=await W(s);return m===u.current&&c(p),p}catch(p){return m===u.current&&(c(!1),t(p instanceof Error?p.message:String(p))),null}},[s]),b=v.useRef(null);return v.useEffect(()=>{s!==b.current&&(b.current=s,c(null),t(null)),s&&r()},[s,o,r]),{issue:d,error:l,reload:r}}function Ae({onFocusNode:s,onOpenSession:o,specs:d=[],sessions:c=[],issuesStamp:l=null}){var S;const t=D(),{param:u,query:r}=z(),b=u===Y,m=String(r.q??"").trim()||A,p=se(r.page),w=v.useMemo(()=>c.map(a=>a.id).join(","),[c]),j=te("issues",m,p,{enabled:!u||b,refreshKey:`${l??""}|${w}`}),f=we(b?null:u,l),[h,L]=v.useState(""),k=a=>{a&&(L(a),setTimeout(()=>L(""),6e3))},N=async a=>{k(a),await(u?f.reload():j.reload())};if(b){if(j.data&&!j.data.enabled)return e.jsx("div",{className:"fv-note",children:t("session.issuesOff")});const a=Array.isArray((S=j.data)==null?void 0:S.stores)&&j.data.stores.length?j.data.stores:[{id:"local",label:"local",kind:"local"}];return e.jsx(Le,{specs:d,sessions:c,stores:a,onCreated:(y,x)=>{k(x),H("issues",y,{replace:!0})}})}return u?f.issue==null?e.jsx("div",{className:"fv-note",children:t("session.issuesLoading")}):f.error?e.jsx(P,{failure:f.error,listHref:R("issues"),listLabel:t("reviewShell.backToIssues")}):f.issue===!1?e.jsx(P,{missing:t("reviewShell.issueNotFound",{id:u}),listHref:R("issues"),listLabel:t("reviewShell.backToIssues")}):e.jsx(ye,{issue:f.issue,specs:d,sessions:c,onFocusNode:s,onOpenSession:o,onWrite:N,notice:h}):e.jsx(he,{data:j.data,loading:j.loading,error:j.error,query:r,notice:h})}const Ne={github:"GitHub",gitlab:"GitLab"},Se=s=>Ne[s]||s;function Le({specs:s,sessions:o,stores:d,onCreated:c}){var i;const l=D(),[t,u]=v.useState(((i=d[0])==null?void 0:i.id)||"local"),[r,b]=v.useState(""),[m,p]=v.useState(""),[w,j]=v.useState(!1),[f,h]=v.useState(!1),[L,k]=v.useState(""),N=v.useRef(null),{launchers:S}=de(),a=fe({inputRef:N,value:m,setValue:p,specs:s,sessions:o,launchers:S});v.useEffect(()=>{var n;d.some(g=>g.id===t)||u(((n=d[0])==null?void 0:n.id)||"local")},[d,t]);const y=[...new Set([...m.matchAll(pe)].map(n=>n[1]))],x=async()=>{const n=r.trim();if(!(!n||f)){h(!0),k("");try{const g=await ee({concern:n,body:m.trim()||void 0,store:t});g!=null&&g.ok&&g.id?c==null||c(g.id,g.outcomes||""):k((g==null?void 0:g.error)||l("session.issuesPostFailed"))}finally{h(!1)}}},I=(n,g)=>e.jsx("button",{type:"button",role:"tab","aria-selected":w===n,className:`fv-tab ${w===n?"on":""}`,onClick:()=>j(n),children:g});return e.jsx(P,{title:l("session.issuesNewTitle"),backHref:M("issues"),backLabel:l("detail.backToIssues"),side:e.jsxs(e.Fragment,{children:[e.jsx(C,{label:l("session.issuesStoreLabel"),children:e.jsxs("label",{className:"fv-store-pick",children:[e.jsx("span",{className:"sr-only",children:l("session.issuesStoreLabel")}),e.jsx("select",{value:t,disabled:f,onChange:n=>u(n.target.value),children:d.map(n=>e.jsx("option",{value:n.id,children:n.label||n.id},n.id))})]})}),e.jsx(C,{label:l("detail.sideNodes"),children:y.length>0?y.map(n=>e.jsx(E,{text:n,mono:!0},n)):e.jsx(E,{text:l("session.issuesNodesHint"),dim:!0})})]}),children:e.jsxs("div",{className:"fv-new-page",children:[e.jsxs("label",{className:"fv-field",children:[e.jsx("span",{className:"fv-field-label",children:l("session.issuesTitleLabel")}),e.jsx("input",{className:"fv-input fv-new-title",value:r,placeholder:l("session.issuesConcernPlaceholder"),disabled:f,autoFocus:!0,onChange:n=>b(n.target.value),onKeyDown:n=>{q(n)||n.key==="Enter"&&(n.preventDefault(),x())}})]}),e.jsxs("div",{className:"fv-field",children:[e.jsxs("div",{className:"fv-field-head",children:[e.jsx("span",{className:"fv-field-label",children:l("session.issuesBodyLabel")}),e.jsxs("div",{className:"fv-tabs",role:"tablist","aria-label":l("session.issuesBodyLabel"),children:[I(!1,l("session.issuesWrite")),I(!0,l("session.issuesPreview"))]})]}),e.jsx(me,{className:"fv-new-compose",editor:w?e.jsx("div",{className:"fv-new-preview",role:"tabpanel",children:m.trim()?e.jsx(_,{body:m}):e.jsx("span",{className:"fv-new-hint",children:l("session.issuesPreviewEmpty")})}):e.jsxs("div",{className:"fv-tawrap",role:"tabpanel",children:[e.jsx(ve,{ref:N,className:"fv-textarea",rows:1,value:m,placeholder:l("session.issuesBodyPlaceholder"),disabled:f,onChange:n=>{p(n.target.value),a.sync(n.target)},onSelect:n=>a.sync(n.target),onBlur:a.close,onKeyDown:n=>{q(n)||a.onKeyDown(n)||n.key==="Enter"&&(n.metaKey||n.ctrlKey)&&(n.preventDefault(),x())}}),a.menuEl]}),footer:e.jsxs("div",{className:"fv-actions",children:[e.jsx(K,{label:l("thread.mentionActor"),disabled:f||w,onClick:()=>O(N.current,"@",p,a.sync),children:"@"}),e.jsx(K,{label:l("thread.mentionNode"),disabled:f||w,onClick:()=>O(N.current,"[[",p,a.sync),children:"[["})]})})]}),e.jsxs("div",{className:"fv-new-actions",children:[L&&e.jsx("span",{className:"fv-error",children:L}),e.jsx("a",{className:"fv-cancel",href:M("issues"),children:l("session.issuesCancel")}),e.jsx("button",{type:"button",className:"fv-post",disabled:f||!r.trim(),onClick:x,children:l(f?"session.issuesSending":"session.issuesPost")})]})]})})}export{ge as ISSUE_QUERY_KEYS,ye as IssueDetailPage,he as IssuesListPage,Y as NEW_PARAM,Ae as default};