gitifact 0.8.5 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -36
- package/dist/browser/assets/{HgiRefresh-BSPkIVFZ.js → HgiRefresh-CmdxsKUC.js} +1 -1
- package/dist/browser/assets/{Markdown-B1P3lpA0.js → Markdown-BpWtY88p.js} +1 -1
- package/dist/browser/assets/{Selector-BG3Gd_OR.js → Selector-Dji19JSe.js} +1 -1
- package/dist/browser/assets/Tab-BY4IuGKn.js +4 -0
- package/dist/browser/assets/{Table-DjTkmoR7.js → Table-Dm6wz2kf.js} +2 -2
- package/dist/browser/assets/{Token-D337a1e3.js → Token-9hr7eTF1.js} +1 -1
- package/dist/browser/assets/about-C3KamVtV.js +3 -0
- package/dist/browser/assets/activity-timeline-BdRnSGAp.js +2 -0
- package/dist/browser/assets/changelog-C8_hi0cv.js +1 -0
- package/dist/browser/assets/commit-BWyvKMHI.js +4 -0
- package/dist/browser/assets/contributors-Bk_xjPNJ.js +1 -0
- package/dist/browser/assets/{contributors._email-B7ATmxN1.js → contributors._email-C8GGV2IN.js} +1 -1
- package/dist/browser/assets/{contributors.index-Cc0QRJwQ.js → contributors.index-BKMSdIFJ.js} +1 -1
- package/dist/browser/assets/dashboard.index-COyVOMnD.js +1 -0
- package/dist/browser/assets/{document-kGFspd5u.js → document-BbL374wf.js} +4 -4
- package/dist/browser/assets/{document-Cmx0e6kz.css → document-DXzNxu17.css} +1 -1
- package/dist/browser/assets/document-Dtyl4_It.js +2 -0
- package/dist/browser/assets/features-B1FsIXwk.js +2 -0
- package/dist/browser/assets/{features._featureId-DGUBnzjL.js → features._featureId-DT63dqjw.js} +1 -1
- package/dist/browser/assets/{features.index-Dgw4kiMG.js → features.index-BGBefKJN.js} +1 -1
- package/dist/browser/assets/getting-started-CCqN7NFk.js +1 -0
- package/dist/browser/assets/git-CzKF2N75.js +1 -0
- package/dist/browser/assets/index-DsduXf6u.js +49 -0
- package/dist/browser/assets/{load-more-DVsjzCxE.js → load-more-COb87OhG.js} +1 -1
- package/dist/browser/assets/page-header-Cs2fqdqC.js +246 -0
- package/dist/browser/assets/{records._recordId-C2qxnLKN.js → records._recordId-DP2stdvW.js} +1 -1
- package/dist/browser/assets/{records.commits._commit-CSa3sQ8C.js → records.commits._commit-DQlC8mSd.js} +1 -1
- package/dist/browser/assets/{records.docs._docId-SIPsGTwH.js → records.docs._docId-C7snDAo3.js} +1 -1
- package/dist/browser/assets/{records.index-DoE_3GrP.js → records.index-DRPp4IAb.js} +1 -1
- package/dist/browser/assets/{records.working-Cp5ualrr.js → records.working-Qv9R2KgB.js} +1 -1
- package/dist/browser/assets/{settings-tVQIx1Uf.js → settings-DDEler3s.js} +1 -1
- package/dist/browser/assets/useInfiniteQuery-IoAmrFi4.js +1 -0
- package/dist/browser/assets/{useKeyboardHint-D5jGavym.js → useKeyboardHint-Wwnf-tpi.js} +1 -1
- package/dist/browser/index.html +18 -24
- package/dist/i18n/en/block.md +7 -7
- package/dist/i18n/en/changelog.md +25 -0
- package/dist/i18n/en/docs/commit.md +1 -1
- package/dist/i18n/en/docs/design.md +3 -3
- package/dist/i18n/en/docs/migrate.md +31 -34
- package/dist/i18n/en/docs/records.md +2 -2
- package/dist/i18n/en/docs/spec.md +80 -4
- package/dist/i18n/en/docs/workflow.md +12 -12
- package/dist/i18n/en/docs/writing.md +4 -4
- package/dist/i18n/ko/block.md +7 -7
- package/dist/i18n/ko/changelog.md +25 -0
- package/dist/i18n/ko/docs/commit.md +1 -1
- package/dist/i18n/ko/docs/design.md +3 -3
- package/dist/i18n/ko/docs/migrate.md +30 -33
- package/dist/i18n/ko/docs/records.md +2 -2
- package/dist/i18n/ko/docs/spec.md +80 -4
- package/dist/i18n/ko/docs/workflow.md +12 -12
- package/dist/i18n/ko/docs/writing.md +4 -4
- package/dist/launcher/cli.mjs +77 -0
- package/dist/main.js +405 -639
- package/package.json +3 -3
- package/dist/browser/assets/MetadataListItem-BEwPg27H.js +0 -1
- package/dist/browser/assets/Tab-RKLZrCiK.js +0 -1
- package/dist/browser/assets/about-D06ipt4C.js +0 -3
- package/dist/browser/assets/activity-timeline-Bl6a55GR.js +0 -2
- package/dist/browser/assets/changelog-DCvEVceR.js +0 -1
- package/dist/browser/assets/commit-Cj7mcn9u.js +0 -4
- package/dist/browser/assets/contributor-2mkEa2Wo.css +0 -1
- package/dist/browser/assets/contributor-D1TZSDq9.js +0 -1
- package/dist/browser/assets/contributors-lkpVuCXS.js +0 -1
- package/dist/browser/assets/dashboard.index-BNTyn3_V.js +0 -1
- package/dist/browser/assets/document-7jVYmB_Z.js +0 -2
- package/dist/browser/assets/features-CBeEOrok.js +0 -2
- package/dist/browser/assets/getting-started-B_LeBSZE.js +0 -1
- package/dist/browser/assets/git-DW-pzDOm.js +0 -1
- package/dist/browser/assets/index-IML0_BCy.js +0 -49
- package/dist/browser/assets/instructions-2OUMP-vh.css +0 -1
- package/dist/browser/assets/instructions-Qhbd8_KG.js +0 -1
- package/dist/browser/assets/instructions._instructionId-CnX6OyFZ.js +0 -1
- package/dist/browser/assets/instructions.agents-0tKcPahQ.js +0 -1
- package/dist/browser/assets/instructions.index-B3v6vtEg.js +0 -1
- package/dist/browser/assets/lazyRouteComponent-tJOK5sxC.js +0 -1
- package/dist/browser/assets/page-header-AS8jZ1ve.js +0 -248
- package/dist/browser/assets/project-instructions-DsWrw-nY.jpg +0 -0
- package/dist/browser/assets/useInfiniteQuery-C0rB-9Ci.js +0 -1
- package/dist/i18n/en/docs/instructions.md +0 -94
- package/dist/i18n/ko/docs/instructions.md +0 -94
|
@@ -1 +1 @@
|
|
|
1
|
-
import{l as e}from"./themeProps-CkLe5zXY.js";import{o as t}from"./commit-
|
|
1
|
+
import{l as e}from"./themeProps-CkLe5zXY.js";import{o as t}from"./commit-BWyvKMHI.js";import{a as n}from"./index-DsduXf6u.js";var r=e();function i(){let{recordId:e}=n.useParams();return(0,r.jsx)(t,{recordId:e})}export{i as component};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{l as e}from"./themeProps-CkLe5zXY.js";import{s as t}from"./commit-
|
|
1
|
+
import{l as e}from"./themeProps-CkLe5zXY.js";import{s as t}from"./commit-BWyvKMHI.js";import{r as n}from"./index-DsduXf6u.js";var r=e();function i(){let{commit:e}=n.useParams(),i=n.useSearch();return(0,r.jsx)(t,{commit:e,search:i})}export{i as component};
|
package/dist/browser/assets/{records.docs._docId-SIPsGTwH.js → records.docs._docId-C7snDAo3.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{l as e}from"./themeProps-CkLe5zXY.js";import{n as t,t as n}from"./index-
|
|
1
|
+
import{l as e}from"./themeProps-CkLe5zXY.js";import{n as t,t as n}from"./index-DsduXf6u.js";var r=e();function i(){let{docId:e}=n.useParams();return(0,r.jsx)(t,{docId:e})}export{i as component};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{l as e}from"./themeProps-CkLe5zXY.js";import{o as t,s as n}from"./index-
|
|
1
|
+
import{l as e}from"./themeProps-CkLe5zXY.js";import{o as t,s as n}from"./index-DsduXf6u.js";var r=e();function i(){let e=t.useSearch(),i=t.useNavigate();return(0,r.jsx)(n,{search:e,change:(e,t)=>{i({search:e,replace:t??!1})}})}export{i as component};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{l as e}from"./themeProps-CkLe5zXY.js";import{a as t}from"./commit-
|
|
1
|
+
import{l as e}from"./themeProps-CkLe5zXY.js";import{a as t}from"./commit-BWyvKMHI.js";import{i as n}from"./index-DsduXf6u.js";var r=e();function i(){let e=n.useSearch();return(0,r.jsx)(t,{search:e})}export{i as component};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{K as t,l as n,n as r,q as i}from"./themeProps-CkLe5zXY.js";import{n as a}from"./useIsomorphicLayoutEffect-BiEJxDg_.js";import{_t as o,an as s,bt as c,cn as l,gt as u,hn as d,mn as f,pn as p,sn as m,t as h,un as g}from"./page-header-AS8jZ1ve.js";import{a as _}from"./useMediaQuery-twbHF0pO.js";import{E as v,S as y,W as b,w as x}from"./Icon-DPaLmsmh.js";import{t as S}from"./useKeyboardHint-D5jGavym.js";import{a as C,c as w,l as T,n as E,o as D,r as O}from"./appearance-DyJA06C4.js";import{n as k,t as A}from"./Grid-DCCm_m5g.js";var j=e(i(),1),M=(0,j.createContext)(null);M.displayName=`SegmentedControlContext`;function N(){let e=(0,j.use)(M);if(e==null)throw Error(`useSegmentedControlContext must be used within SegmentedControl. Wrap your SegmentedControlItem in <SegmentedControl>.`);return e}var P=n(),F={container:{k1xSpc:`x3nfvp2`,kGNEyG:`x6s0dn4`,kOIVth:`x1lsbc85`,"--_segmented-control-padding":`x18jk3ff`,kmVPX3:`xpoxszi`,kWkggS:`x17x4s8c`,$$css:!0},fill:{k1xSpc:`x78zum5`,kzqmXN:`xh8yej3`,$$css:!0},disabled:{kSiTet:`xbyyjgo`,kfzvcC:`x47corl`,$$css:!0},disabledWithMessage:{kSiTet:`xbyyjgo`,$$css:!0}},I={sm:{"--_segmented-control-radius":`x9icjy1`,kaIpWk:`x1hapoqb`,$$css:!0},md:{"--_segmented-control-radius":`x9icjy1`,kaIpWk:`x1hapoqb`,$$css:!0},lg:{"--_segmented-control-radius":`x9icjy1`,kaIpWk:`x1hapoqb`,$$css:!0}};function L({ref:e,value:n,onChange:i,label:o,size:s,layout:u=`hug`,isDisabled:d=!1,disabledMessage:f,children:p,xstyle:m,className:h,style:g,onKeyDown:b,onFocus:x,onBlur:C,...w}){let T=y(s,`md`),E=d&&!!f,D=a({placement:`above`,focusTrigger:`always`,isEnabled:E}),{listRef:O,handleKeyDown:k,handleFocus:A}=c({itemSelector:`[role="radio"]:not([aria-disabled="true"])`,hasRovingTabIndex:!0,wrap:!0,orientation:`horizontal`}),N=S({orientation:`horizontal`,isEnabled:!d}),L=(0,j.useCallback)(e=>{b?.(e),!e.defaultPrevented&&(N.onKeyDown(e),k(e))},[b,N,k]),R=(0,j.useCallback)(e=>{if(x?.(e),e.defaultPrevented||(N.onFocus(e),A(e),d)||!e.currentTarget.contains(e.relatedTarget))return;let t=e.target?.closest(`[role="radio"][data-value]`);if(!t||t.getAttribute(`aria-disabled`)===`true`)return;let r=t.dataset.value;r!=null&&r!==n&&i(r)},[x,N,A,d,i,n]),z=(0,j.useMemo)(()=>({value:n,onChange:i,size:T,layout:u,isDisabled:d,hasDisabledMessage:E}),[n,i,T,u,d,E]);return(0,P.jsxs)(M,{value:z,children:[(0,P.jsxs)(`div`,{ref:v(e,O,D.ref),...w,role:`radiogroup`,"aria-label":o,"aria-disabled":d||void 0,"aria-describedby":E?D.describedBy:void 0,onKeyDown:L,onFocus:R,onBlur:l(C,N.onBlur),..._(r(`segmented-control`,{size:T}),t(F.container,I[T],u===`fill`&&F.fill,d&&(E?F.disabledWithMessage:F.disabled),m),h,g),children:[p,N.hintElement]}),E&&D.renderTooltip(f)]})}L.displayName=`SegmentedControl`;var R={base:{kVAEAm:`x1n2onr6`,k1xSpc:`x3nfvp2`,kGNEyG:`x6s0dn4`,kjj79g:`xl56j7k`,kOIVth:`xzye2dw`,kg3NbH:`xrrkdod`,kWkggS:`xjbqb8w`,kMzoRj:`xc342km`,ksu8eU:`xng3xce`,kMv6JI:`xjb2p0i`,kGuDYH:`xcr08ib`,kLWn49:`x1kq96og`,k63SB2:`x1e4wzip`,kMwMTN:`xv1l7n4`,kkrTdU:`x1ypdohk x16khyan`,khDVqt:`xuxw1ft`,k1ekBW:`x1vix5yk`,kIyJzY:`xuedmi6`,kAMwcw:`xlr8y92`,$$css:!0},hover:{kWkggS:`xoevpu5`,$$css:!0},selected:{kAXs8y:`x1kzknox`,kMwMTN:`x1tgivj0 x1k5gbb1`,k63SB2:`x2mo6ok`,kWkggS:`x10xzikg x1jzqe4`,kGVxlE:`x1i5ehqx`,$$css:!0},disabled:{kkrTdU:`xt0e3qv`,kMwMTN:`xnbbluu`,$$css:!0},fill:{kUk6DE:`x98rzlu`,k7Eaqz:`xeuugli`,kjj79g:`xl56j7k`,$$css:!0},icon:{k1xSpc:`x3nfvp2`,kGNEyG:`x6s0dn4`,kjj79g:`xl56j7k`,kmuXW:`x2lah0s`,$$css:!0}},z={sm:{kZKoxP:`xzj98nu`,kaIpWk:`xc910v0`,kg3NbH:`xf314gf`,kGuDYH:`x141an7d`,$$css:!0},md:{kZKoxP:`x184gfjb`,kaIpWk:`xc910v0`,kg3NbH:`xrrkdod`,$$css:!0},lg:{kZKoxP:`x1uiybsj`,kaIpWk:`xc910v0`,kg3NbH:`xrrkdod`,$$css:!0}},B={sm:{kzqmXN:`x6jxa94`,kZKoxP:`x1v9usgg`,$$css:!0},md:{kzqmXN:`x1kky2od`,kZKoxP:`xlup9mm`,$$css:!0},lg:{kzqmXN:`x1xp8n7a`,kZKoxP:`xmix8c7`,$$css:!0}};function V({ref:e,value:n,label:i,isLabelHidden:a=!1,icon:o,isDisabled:s=!1,onClick:c,xstyle:u,...d}){let f=N(),p=f.value===n,m=s||f.isDisabled,h=p&&(f.hasDisabledMessage??!1)&&!s,g=f.size,v=f.layout===`fill`,y=l(c,()=>{!m&&!p&&f.onChange(n)}),x=o?(0,P.jsx)(`span`,{...t(R.icon,B[g]),children:o}):null;return(0,P.jsxs)(`button`,{ref:e,...d,type:`button`,role:`radio`,"aria-checked":p,"aria-disabled":m||void 0,"aria-label":a?i:void 0,"data-value":n,tabIndex:p&&!m||h?0:-1,onClick:y,..._(r(`segmented-control-item`,{size:g,selected:p?`selected`:null,disabled:m?`disabled`:null}),b.focusVisible(R.base,z[g],v&&R.fill,p&&R.selected,!p&&!m&&R.hover,m&&R.disabled,u)),children:[x,!a&&(0,P.jsx)(`span`,{className:`xb3r6kr xlyipyv xeuugli`,children:i})]})}V.displayName=`SegmentedControlItem`;var H={interactive:{"--selectable-card-ring-color":`x11rj6l1`,kVAEAm:`x1n2onr6`,kkrTdU:`x1ypdohk x16khyan`,k1ekBW:`x16mfhj0`,kIyJzY:`xuedmi6`,kAMwcw:`xlr8y92`,$$css:!0},overlay:{k5JduY:`x1s928wv`,kwXMNM:`x1j6awrg`,kv0HGH:`xarstr8`,kUfP38:`x1k48kgn`,kloYau:`x2q1x1w`,kRicXK:`x1ywzrc5`,kPNhGg:`x97pup0`,kA8PQs:`x1dlmc9c`,ks3ayO:`xyhc2n1`,kAcZsS:`x1k7wiig`,$$css:!0},hoverOnPointer:{k8t4tK:`x1912f9e`,$$css:!0},disabled:{kkrTdU:`xt0e3qv`,kSiTet:`xbyyjgo`,$$css:!0},selected:{kVAM5u:`xad5do`,"--_card-ring":`xr9ms2c`,$$css:!0},selectedBlue:{kVAM5u:`xlee4gx`,"--_card-ring":`xgwwt2v`,$$css:!0},selectedCyan:{kVAM5u:`xb1xfl`,"--_card-ring":`xcdi0x3`,$$css:!0},selectedGray:{kVAM5u:`x1w9ec3u`,"--_card-ring":`x1m1zkwp`,$$css:!0},selectedGreen:{kVAM5u:`xy90a9n`,"--_card-ring":`x1485227`,$$css:!0},selectedOrange:{kVAM5u:`xloqurj`,"--_card-ring":`x1cclxpp`,$$css:!0},selectedPink:{kVAM5u:`x1czkbn8`,"--_card-ring":`xzs6dn4`,$$css:!0},selectedPurple:{kVAM5u:`xq98wne`,"--_card-ring":`x9zgi83`,$$css:!0},selectedRed:{kVAM5u:`xjqgoec`,"--_card-ring":`xo8718j`,$$css:!0},selectedTeal:{kVAM5u:`x1r9gxr1`,"--_card-ring":`xp4e5fy`,$$css:!0},selectedYellow:{kVAM5u:`x1kpnwn1`,"--_card-ring":`x1glw7ee`,$$css:!0},selectedUnknown:{"--_card-ring":`x3zsw4j`,$$css:!0}},U=e=>{switch(e){case`default`:case`transparent`:case`muted`:return H.selected;case`blue`:return H.selectedBlue;case`cyan`:return H.selectedCyan;case`gray`:return H.selectedGray;case`green`:return H.selectedGreen;case`orange`:return H.selectedOrange;case`pink`:return H.selectedPink;case`purple`:return H.selectedPurple;case`red`:return H.selectedRed;case`teal`:return H.selectedTeal;case`yellow`:return H.selectedYellow;default:return H.selectedUnknown}};function W({label:e,isSelected:t,onChange:n,onClick:i,onMouseUp:a,isDisabled:o=!1,children:s,padding:c,variant:l=`default`,elevation:u=`none`,width:d,height:f,maxWidth:p,ref:h,xstyle:g,className:y,style:x,...S}){let C=(0,j.useRef)(null),w=(0,j.useRef)(null),T=(0,j.useCallback)(e=>{o||n(!t)},[o,t,n]),E=(0,j.useCallback)(e=>{!o&&e.key===`Enter`&&(e.preventDefault(),n(!t))},[o,t,n]),{onClick:D,onMouseUp:O}=m({containerRef:C,interactiveRef:w,onClick:T,disabled:o}),A=i?e=>{D(e),i(e)}:D,M=a?e=>{O(e),a(e)}:O;return(0,P.jsxs)(k,{ref:v(h,C),width:d,height:f,maxWidth:p,padding:c,variant:l,elevation:u,..._(r(`selectable-card`,{variant:l,selected:t?`true`:`false`}),b.focusWithin(),y,x),xstyle:[H.interactive,t&&U(l),!o&&H.overlay,!o&&H.hoverOnPointer,o&&H.disabled,g],onClick:o?void 0:A,onMouseUp:o?void 0:M,...S,children:[(0,P.jsx)(`input`,{ref:w,type:`checkbox`,checked:t,"aria-label":e,disabled:o,onChange:()=>n(!t),onKeyDown:E,className:`x10l6tqk x1i1rx1s xjm9jq1 x1717udv xkdpibf xb3r6kr xzpqnlu xuxw1ft xc342km`}),s]})}W.displayName=`SelectableCard`;var G={page:`_page_1yxii_2`,column:`_column_1yxii_3`,pageTitle:`_pageTitle_1yxii_4`,sections:`_sections_1yxii_5`,section:`_section_1yxii_5`,swatches:`_swatches_1yxii_8`,sample:`_sample_1yxii_9`,sampleSurface:`_sampleSurface_1yxii_10`,sampleDot:`_sampleDot_1yxii_11`,sampleLine:`_sampleLine_1yxii_12`},K=()=>({system:g(`settings.mode.system`),light:g(`settings.mode.light`),dark:g(`settings.mode.dark`)}),q=()=>({stone:[g(`settings.palette.stone`),g(`settings.palette.stoneHint`)],sage:[g(`settings.palette.sage`),g(`settings.palette.sageHint`)],olive:[g(`settings.palette.olive`),g(`settings.palette.oliveHint`)],slate:[g(`settings.palette.slate`),g(`settings.palette.slateHint`)],clay:[g(`settings.palette.clay`),g(`settings.palette.clayHint`)]}),J=e=>e===`stone`?w:O[e],Y=[0,1];function X(){f();let{mode:e,palette:t}=T(),n=d();return(0,P.jsxs)(o,{gap:0,className:G.page,children:[(0,P.jsx)(h,{trail:[{label:g(`settings.title`)}]}),(0,P.jsxs)(o,{gap:0,className:G.column,children:[(0,P.jsxs)(o,{gap:1,className:G.pageTitle,children:[(0,P.jsx)(s,{level:1,children:g(`settings.title`)}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:g(`settings.subtitle`)})]}),(0,P.jsxs)(o,{gap:0,className:G.sections,children:[(0,P.jsxs)(o,{as:`section`,gap:3,className:G.section,"aria-label":g(`settings.language`),children:[(0,P.jsx)(o,{gap:1,children:(0,P.jsx)(s,{level:2,children:g(`settings.language`)})}),(0,P.jsx)(u,{gap:0,children:(0,P.jsxs)(L,{label:g(`settings.language`),value:n,onChange:e=>p(e),children:[(0,P.jsx)(V,{value:`system`,label:g(`settings.language.system`)}),(0,P.jsx)(V,{value:`en`,label:`English`}),(0,P.jsx)(V,{value:`ko`,label:`한국어`})]})})]}),(0,P.jsxs)(o,{as:`section`,gap:3,className:G.section,"aria-label":g(`settings.mode`),children:[(0,P.jsxs)(o,{gap:1,children:[(0,P.jsx)(s,{level:2,children:g(`settings.mode`)}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:g(`settings.modeHint`)})]}),(0,P.jsx)(u,{gap:0,children:(0,P.jsx)(L,{label:g(`settings.mode`),value:e,onChange:e=>D({mode:e}),children:E.map(e=>(0,P.jsx)(V,{value:e,label:K()[e]},e))})})]}),(0,P.jsxs)(o,{as:`section`,gap:3,className:G.section,"aria-label":g(`settings.palette`),children:[(0,P.jsxs)(o,{gap:1,children:[(0,P.jsx)(s,{level:2,children:g(`settings.palette`)}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:g(`settings.paletteHint`)})]}),(0,P.jsx)(A,{columns:{minWidth:176,repeat:`fit`,max:5},gap:3,children:C.map(e=>{let n=J(e),[r,i]=q()[e];return(0,P.jsx)(W,{label:r,isSelected:t===e,onChange:t=>{t&&D({palette:e})},children:(0,P.jsxs)(o,{gap:3,children:[(0,P.jsx)(o,{gap:0,className:G.swatches,"aria-hidden":`true`,children:Y.map(e=>(0,P.jsx)(u,{gap:2,vAlign:`center`,className:G.sample,style:{background:n.body[e]},children:(0,P.jsxs)(u,{gap:2,vAlign:`center`,className:G.sampleSurface,style:{background:n.surface[e],color:n.text[e]},children:[(0,P.jsx)(o,{gap:0,className:G.sampleDot,style:{background:n.accent[e]}}),(0,P.jsx)(o,{gap:0,className:G.sampleLine,style:{background:n.text[e]}})]})},e))}),(0,P.jsxs)(o,{gap:1,children:[(0,P.jsx)(x,{type:`label`,children:r}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:i})]})]})},e)})})]})]})]})]})}var Z=X;export{Z as component};
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{K as t,l as n,n as r,q as i}from"./themeProps-CkLe5zXY.js";import{n as a}from"./useIsomorphicLayoutEffect-BiEJxDg_.js";import{_t as o,an as s,dn as c,fn as l,in as u,mt as d,nn as f,pt as p,sn as m,t as h,un as g}from"./page-header-Cs2fqdqC.js";import{a as _}from"./useMediaQuery-twbHF0pO.js";import{E as v,S as y,W as b,w as x}from"./Icon-DPaLmsmh.js";import{t as S}from"./useKeyboardHint-Wwnf-tpi.js";import{a as C,c as w,l as T,n as E,o as D,r as O}from"./appearance-DyJA06C4.js";import{n as k,t as A}from"./Grid-DCCm_m5g.js";var j=e(i(),1),M=(0,j.createContext)(null);M.displayName=`SegmentedControlContext`;function N(){let e=(0,j.use)(M);if(e==null)throw Error(`useSegmentedControlContext must be used within SegmentedControl. Wrap your SegmentedControlItem in <SegmentedControl>.`);return e}var P=n(),F={container:{k1xSpc:`x3nfvp2`,kGNEyG:`x6s0dn4`,kOIVth:`x1lsbc85`,"--_segmented-control-padding":`x18jk3ff`,kmVPX3:`xpoxszi`,kWkggS:`x17x4s8c`,$$css:!0},fill:{k1xSpc:`x78zum5`,kzqmXN:`xh8yej3`,$$css:!0},disabled:{kSiTet:`xbyyjgo`,kfzvcC:`x47corl`,$$css:!0},disabledWithMessage:{kSiTet:`xbyyjgo`,$$css:!0}},I={sm:{"--_segmented-control-radius":`x9icjy1`,kaIpWk:`x1hapoqb`,$$css:!0},md:{"--_segmented-control-radius":`x9icjy1`,kaIpWk:`x1hapoqb`,$$css:!0},lg:{"--_segmented-control-radius":`x9icjy1`,kaIpWk:`x1hapoqb`,$$css:!0}};function L({ref:e,value:n,onChange:i,label:c,size:l,layout:u=`hug`,isDisabled:d=!1,disabledMessage:f,children:p,xstyle:m,className:h,style:g,onKeyDown:b,onFocus:x,onBlur:C,...w}){let T=y(l,`md`),E=d&&!!f,D=a({placement:`above`,focusTrigger:`always`,isEnabled:E}),{listRef:O,handleKeyDown:k,handleFocus:A}=o({itemSelector:`[role="radio"]:not([aria-disabled="true"])`,hasRovingTabIndex:!0,wrap:!0,orientation:`horizontal`}),N=S({orientation:`horizontal`,isEnabled:!d}),L=(0,j.useCallback)(e=>{b?.(e),!e.defaultPrevented&&(N.onKeyDown(e),k(e))},[b,N,k]),R=(0,j.useCallback)(e=>{if(x?.(e),e.defaultPrevented||(N.onFocus(e),A(e),d)||!e.currentTarget.contains(e.relatedTarget))return;let t=e.target?.closest(`[role="radio"][data-value]`);if(!t||t.getAttribute(`aria-disabled`)===`true`)return;let r=t.dataset.value;r!=null&&r!==n&&i(r)},[x,N,A,d,i,n]),z=(0,j.useMemo)(()=>({value:n,onChange:i,size:T,layout:u,isDisabled:d,hasDisabledMessage:E}),[n,i,T,u,d,E]);return(0,P.jsxs)(M,{value:z,children:[(0,P.jsxs)(`div`,{ref:v(e,O,D.ref),...w,role:`radiogroup`,"aria-label":c,"aria-disabled":d||void 0,"aria-describedby":E?D.describedBy:void 0,onKeyDown:L,onFocus:R,onBlur:s(C,N.onBlur),..._(r(`segmented-control`,{size:T}),t(F.container,I[T],u===`fill`&&F.fill,d&&(E?F.disabledWithMessage:F.disabled),m),h,g),children:[p,N.hintElement]}),E&&D.renderTooltip(f)]})}L.displayName=`SegmentedControl`;var R={base:{kVAEAm:`x1n2onr6`,k1xSpc:`x3nfvp2`,kGNEyG:`x6s0dn4`,kjj79g:`xl56j7k`,kOIVth:`xzye2dw`,kg3NbH:`xrrkdod`,kWkggS:`xjbqb8w`,kMzoRj:`xc342km`,ksu8eU:`xng3xce`,kMv6JI:`xjb2p0i`,kGuDYH:`xcr08ib`,kLWn49:`x1kq96og`,k63SB2:`x1e4wzip`,kMwMTN:`xv1l7n4`,kkrTdU:`x1ypdohk x16khyan`,khDVqt:`xuxw1ft`,k1ekBW:`x1vix5yk`,kIyJzY:`xuedmi6`,kAMwcw:`xlr8y92`,$$css:!0},hover:{kWkggS:`xoevpu5`,$$css:!0},selected:{kAXs8y:`x1kzknox`,kMwMTN:`x1tgivj0 x1k5gbb1`,k63SB2:`x2mo6ok`,kWkggS:`x10xzikg x1jzqe4`,kGVxlE:`x1i5ehqx`,$$css:!0},disabled:{kkrTdU:`xt0e3qv`,kMwMTN:`xnbbluu`,$$css:!0},fill:{kUk6DE:`x98rzlu`,k7Eaqz:`xeuugli`,kjj79g:`xl56j7k`,$$css:!0},icon:{k1xSpc:`x3nfvp2`,kGNEyG:`x6s0dn4`,kjj79g:`xl56j7k`,kmuXW:`x2lah0s`,$$css:!0}},z={sm:{kZKoxP:`xzj98nu`,kaIpWk:`xc910v0`,kg3NbH:`xf314gf`,kGuDYH:`x141an7d`,$$css:!0},md:{kZKoxP:`x184gfjb`,kaIpWk:`xc910v0`,kg3NbH:`xrrkdod`,$$css:!0},lg:{kZKoxP:`x1uiybsj`,kaIpWk:`xc910v0`,kg3NbH:`xrrkdod`,$$css:!0}},B={sm:{kzqmXN:`x6jxa94`,kZKoxP:`x1v9usgg`,$$css:!0},md:{kzqmXN:`x1kky2od`,kZKoxP:`xlup9mm`,$$css:!0},lg:{kzqmXN:`x1xp8n7a`,kZKoxP:`xmix8c7`,$$css:!0}};function V({ref:e,value:n,label:i,isLabelHidden:a=!1,icon:o,isDisabled:c=!1,onClick:l,xstyle:u,...d}){let f=N(),p=f.value===n,m=c||f.isDisabled,h=p&&(f.hasDisabledMessage??!1)&&!c,g=f.size,v=f.layout===`fill`,y=s(l,()=>{!m&&!p&&f.onChange(n)}),x=o?(0,P.jsx)(`span`,{...t(R.icon,B[g]),children:o}):null;return(0,P.jsxs)(`button`,{ref:e,...d,type:`button`,role:`radio`,"aria-checked":p,"aria-disabled":m||void 0,"aria-label":a?i:void 0,"data-value":n,tabIndex:p&&!m||h?0:-1,onClick:y,..._(r(`segmented-control-item`,{size:g,selected:p?`selected`:null,disabled:m?`disabled`:null}),b.focusVisible(R.base,z[g],v&&R.fill,p&&R.selected,!p&&!m&&R.hover,m&&R.disabled,u)),children:[x,!a&&(0,P.jsx)(`span`,{className:`xb3r6kr xlyipyv xeuugli`,children:i})]})}V.displayName=`SegmentedControlItem`;var H={interactive:{"--selectable-card-ring-color":`x11rj6l1`,kVAEAm:`x1n2onr6`,kkrTdU:`x1ypdohk x16khyan`,k1ekBW:`x16mfhj0`,kIyJzY:`xuedmi6`,kAMwcw:`xlr8y92`,$$css:!0},overlay:{k5JduY:`x1s928wv`,kwXMNM:`x1j6awrg`,kv0HGH:`xarstr8`,kUfP38:`x1k48kgn`,kloYau:`x2q1x1w`,kRicXK:`x1ywzrc5`,kPNhGg:`x97pup0`,kA8PQs:`x1dlmc9c`,ks3ayO:`xyhc2n1`,kAcZsS:`x1k7wiig`,$$css:!0},hoverOnPointer:{k8t4tK:`x1912f9e`,$$css:!0},disabled:{kkrTdU:`xt0e3qv`,kSiTet:`xbyyjgo`,$$css:!0},selected:{kVAM5u:`xad5do`,"--_card-ring":`xr9ms2c`,$$css:!0},selectedBlue:{kVAM5u:`xlee4gx`,"--_card-ring":`xgwwt2v`,$$css:!0},selectedCyan:{kVAM5u:`xb1xfl`,"--_card-ring":`xcdi0x3`,$$css:!0},selectedGray:{kVAM5u:`x1w9ec3u`,"--_card-ring":`x1m1zkwp`,$$css:!0},selectedGreen:{kVAM5u:`xy90a9n`,"--_card-ring":`x1485227`,$$css:!0},selectedOrange:{kVAM5u:`xloqurj`,"--_card-ring":`x1cclxpp`,$$css:!0},selectedPink:{kVAM5u:`x1czkbn8`,"--_card-ring":`xzs6dn4`,$$css:!0},selectedPurple:{kVAM5u:`xq98wne`,"--_card-ring":`x9zgi83`,$$css:!0},selectedRed:{kVAM5u:`xjqgoec`,"--_card-ring":`xo8718j`,$$css:!0},selectedTeal:{kVAM5u:`x1r9gxr1`,"--_card-ring":`xp4e5fy`,$$css:!0},selectedYellow:{kVAM5u:`x1kpnwn1`,"--_card-ring":`x1glw7ee`,$$css:!0},selectedUnknown:{"--_card-ring":`x3zsw4j`,$$css:!0}},U=e=>{switch(e){case`default`:case`transparent`:case`muted`:return H.selected;case`blue`:return H.selectedBlue;case`cyan`:return H.selectedCyan;case`gray`:return H.selectedGray;case`green`:return H.selectedGreen;case`orange`:return H.selectedOrange;case`pink`:return H.selectedPink;case`purple`:return H.selectedPurple;case`red`:return H.selectedRed;case`teal`:return H.selectedTeal;case`yellow`:return H.selectedYellow;default:return H.selectedUnknown}};function W({label:e,isSelected:t,onChange:n,onClick:i,onMouseUp:a,isDisabled:o=!1,children:s,padding:c,variant:l=`default`,elevation:d=`none`,width:f,height:p,maxWidth:m,ref:h,xstyle:g,className:y,style:x,...S}){let C=(0,j.useRef)(null),w=(0,j.useRef)(null),T=(0,j.useCallback)(e=>{o||n(!t)},[o,t,n]),E=(0,j.useCallback)(e=>{!o&&e.key===`Enter`&&(e.preventDefault(),n(!t))},[o,t,n]),{onClick:D,onMouseUp:O}=u({containerRef:C,interactiveRef:w,onClick:T,disabled:o}),A=i?e=>{D(e),i(e)}:D,M=a?e=>{O(e),a(e)}:O;return(0,P.jsxs)(k,{ref:v(h,C),width:f,height:p,maxWidth:m,padding:c,variant:l,elevation:d,..._(r(`selectable-card`,{variant:l,selected:t?`true`:`false`}),b.focusWithin(),y,x),xstyle:[H.interactive,t&&U(l),!o&&H.overlay,!o&&H.hoverOnPointer,o&&H.disabled,g],onClick:o?void 0:A,onMouseUp:o?void 0:M,...S,children:[(0,P.jsx)(`input`,{ref:w,type:`checkbox`,checked:t,"aria-label":e,disabled:o,onChange:()=>n(!t),onKeyDown:E,className:`x10l6tqk x1i1rx1s xjm9jq1 x1717udv xkdpibf xb3r6kr xzpqnlu xuxw1ft xc342km`}),s]})}W.displayName=`SelectableCard`;var G={page:`_page_1yxii_2`,column:`_column_1yxii_3`,pageTitle:`_pageTitle_1yxii_4`,sections:`_sections_1yxii_5`,section:`_section_1yxii_5`,swatches:`_swatches_1yxii_8`,sample:`_sample_1yxii_9`,sampleSurface:`_sampleSurface_1yxii_10`,sampleDot:`_sampleDot_1yxii_11`,sampleLine:`_sampleLine_1yxii_12`},K=()=>({system:m(`settings.mode.system`),light:m(`settings.mode.light`),dark:m(`settings.mode.dark`)}),q=()=>({stone:[m(`settings.palette.stone`),m(`settings.palette.stoneHint`)],sage:[m(`settings.palette.sage`),m(`settings.palette.sageHint`)],olive:[m(`settings.palette.olive`),m(`settings.palette.oliveHint`)],slate:[m(`settings.palette.slate`),m(`settings.palette.slateHint`)],clay:[m(`settings.palette.clay`),m(`settings.palette.clayHint`)]}),J=e=>e===`stone`?w:O[e],Y=[0,1];function X(){c();let{mode:e,palette:t}=T(),n=l();return(0,P.jsxs)(d,{gap:0,className:G.page,children:[(0,P.jsx)(h,{trail:[{label:m(`settings.title`)}]}),(0,P.jsxs)(d,{gap:0,className:G.column,children:[(0,P.jsxs)(d,{gap:1,className:G.pageTitle,children:[(0,P.jsx)(f,{level:1,children:m(`settings.title`)}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:m(`settings.subtitle`)})]}),(0,P.jsxs)(d,{gap:0,className:G.sections,children:[(0,P.jsxs)(d,{as:`section`,gap:3,className:G.section,"aria-label":m(`settings.language`),children:[(0,P.jsx)(d,{gap:1,children:(0,P.jsx)(f,{level:2,children:m(`settings.language`)})}),(0,P.jsx)(p,{gap:0,children:(0,P.jsxs)(L,{label:m(`settings.language`),value:n,onChange:e=>g(e),children:[(0,P.jsx)(V,{value:`system`,label:m(`settings.language.system`)}),(0,P.jsx)(V,{value:`en`,label:`English`}),(0,P.jsx)(V,{value:`ko`,label:`한국어`})]})})]}),(0,P.jsxs)(d,{as:`section`,gap:3,className:G.section,"aria-label":m(`settings.mode`),children:[(0,P.jsxs)(d,{gap:1,children:[(0,P.jsx)(f,{level:2,children:m(`settings.mode`)}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:m(`settings.modeHint`)})]}),(0,P.jsx)(p,{gap:0,children:(0,P.jsx)(L,{label:m(`settings.mode`),value:e,onChange:e=>D({mode:e}),children:E.map(e=>(0,P.jsx)(V,{value:e,label:K()[e]},e))})})]}),(0,P.jsxs)(d,{as:`section`,gap:3,className:G.section,"aria-label":m(`settings.palette`),children:[(0,P.jsxs)(d,{gap:1,children:[(0,P.jsx)(f,{level:2,children:m(`settings.palette`)}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:m(`settings.paletteHint`)})]}),(0,P.jsx)(A,{columns:{minWidth:176,repeat:`fit`,max:5},gap:3,children:C.map(e=>{let n=J(e),[r,i]=q()[e];return(0,P.jsx)(W,{label:r,isSelected:t===e,onChange:t=>{t&&D({palette:e})},children:(0,P.jsxs)(d,{gap:3,children:[(0,P.jsx)(d,{gap:0,className:G.swatches,"aria-hidden":`true`,children:Y.map(e=>(0,P.jsx)(p,{gap:2,vAlign:`center`,className:G.sample,style:{background:n.body[e]},children:(0,P.jsxs)(p,{gap:2,vAlign:`center`,className:G.sampleSurface,style:{background:n.surface[e],color:n.text[e]},children:[(0,P.jsx)(d,{gap:0,className:G.sampleDot,style:{background:n.accent[e]}}),(0,P.jsx)(d,{gap:0,className:G.sampleLine,style:{background:n.text[e]}})]})},e))}),(0,P.jsxs)(d,{gap:1,children:[(0,P.jsx)(x,{type:`label`,children:r}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:i})]})]})},e)})})]})]})]})]})}var Z=X;export{Z as component};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{l as t,q as n}from"./themeProps-CkLe5zXY.js";import{$t as r,At as i,Dt as a,G as o,H as s,St as c,V as l,W as u,Yt as d,bt as f,en as p,jt as m,xt as h,yt as g,zt as _}from"./page-header-Cs2fqdqC.js";var v=`__root__`;function y(e){e.statusCode=e.statusCode||e.code||307;let t=new Headers(e.headers);e.href&&t.get(`Location`)===null&&t.set(`Location`,e.href);let n=new Response(null,{status:e.statusCode,headers:t});if(n.options=e,e.throw)throw n;return n}function b(e){return e instanceof Response&&!!e.options}var x=class{get to(){return this._to}get id(){return this._id}get path(){return this._path}get fullPath(){return this._fullPath}constructor(e){if(this.init=e=>{this.originalIndex=e.originalIndex;let t=this.options,n=!t?.path&&!t?.id;this.parentRoute=this.options.getParentRoute?.(),n?this._path=v:this.parentRoute||_();let r=n?v:t?.path;r&&r!==`/`&&(r=i(r));let o=t?.id||r,s=n?v:a([this.parentRoute.id===`__root__`?``:this.parentRoute.id,o]);r===`__root__`&&(r=`/`),s!==`__root__`&&(s=a([`/`,s]));let c=s===`__root__`?`/`:a([this.parentRoute.fullPath,r]);this._path=r,this._id=s,this._fullPath=c,this._to=m(c)},this.addChildren=e=>this._addFileChildren(e),this._addFileChildren=e=>(Array.isArray(e)&&(this.children=e),typeof e==`object`&&e&&(this.children=Object.values(e)),this),this._addFileTypes=()=>this,this.updateLoader=e=>(Object.assign(this.options,e),this),this.update=e=>(Object.assign(this.options,e),this),this.lazy=e=>(this.lazyFn=e,this),this.redirect=e=>y({from:this.fullPath,...e}),this.options=e||{},this.isRoot=!e?.getParentRoute,e?.id&&e?.path)throw Error(`Route cannot have both an 'id' and a 'path' option.`)}},S=class extends x{constructor(e){super(e)}},C=e(n(),1),w=C.createContext(void 0),T=C.createContext(void 0),E={};function D(e,t){let n=C.useRef();return i=>{let a=e?.select?e.select(i):i;return e?.structuralSharing??t.options.defaultStructuralSharing?n.current=r(n.current,a):a}}function O(e){let t=c(),n=C.useContext(e.from?T:w),r=e.from??n,i=t.stores.getMatchStore(r),a=D(e,t),o=h(i,e=>e?a(e):E);if(o!==E)return o;(e.shouldThrow??!0)&&_()}function k(e){return O({from:e.from,strict:e.strict,structuralSharing:e.structuralSharing,select:t=>e.select?e.select(t.loaderData):t.loaderData})}function A(e){let{select:t,...n}=e;return O({...n,select:e=>t?t(e.loaderDeps):e.loaderDeps})}function j(e){return O({from:e.from,shouldThrow:e.shouldThrow,structuralSharing:e.structuralSharing,strict:e.strict,select:t=>{let n=e.strict===!1?t.params:t._strictParams;return e.select?e.select(n):n}})}function M(e){return O({from:e.from,strict:e.strict,shouldThrow:e.shouldThrow,structuralSharing:e.structuralSharing,select:t=>e.select?e.select(t.search):t.search})}function N(e){return O({...e,select:t=>e.select?e.select(t.context):t.context})}var P=t(),F=class extends x{constructor(e){super(e),this.useMatch=e=>O({...e,from:this.id}),this.useRouteContext=e=>N({...e,from:this.id}),this.useSearch=e=>M({...e,from:this.id}),this.useParams=e=>j({...e,from:this.id}),this.useLoaderDeps=e=>A({...e,from:this.id}),this.useLoaderData=e=>k({...e,from:this.id}),this.useNavigate=()=>f({from:this.fullPath}),this.Link=C.forwardRef((e,t)=>(0,P.jsx)(g,{ref:t,from:this.fullPath,...e}))}};function I(e){return new F(e)}function L(){return e=>z(e)}var R=class extends S{constructor(e){super(e),this.useMatch=e=>O({...e,from:this.id}),this.useRouteContext=e=>N({...e,from:this.id}),this.useSearch=e=>M({...e,from:this.id}),this.useParams=e=>j({...e,from:this.id}),this.useLoaderDeps=e=>A({...e,from:this.id}),this.useLoaderData=e=>k({...e,from:this.id}),this.useNavigate=()=>f({from:this.fullPath}),this.Link=C.forwardRef((e,t)=>(0,P.jsx)(g,{ref:t,from:this.fullPath,...e}))}};function z(e){return new R(e)}function B(e){return e=>{let t=I(e);return t.isRoot=!1,t}}function V(e,t){let n,r,i,a=()=>(n||=(i=void 0,e().then(e=>{n=void 0,o.preload=void 0,r=e[t??`default`]}).catch(e=>{n=void 0,i=e})),n),o=function(e){if(i){if(d(i)&&typeof sessionStorage<`u`){let e=`tanstack_router_reload:${i.message}`;if(!sessionStorage.getItem(e))throw sessionStorage.setItem(e,`1`),window.location.reload(),new Promise(()=>{})}throw i}if(!r){if(p)p(a());else throw a()}return C.createElement(r,e)};return o.preload=a,o}var H=class extends s{constructor(e,t){super(e,t)}bindMethods(){super.bindMethods(),this.fetchNextPage=this.fetchNextPage.bind(this),this.fetchPreviousPage=this.fetchPreviousPage.bind(this)}setOptions(e){e._type=`infinite`,super.setOptions(e)}getOptimisticResult(e){return e._type=`infinite`,super.getOptimisticResult(e)}fetchNextPage(e){return this.fetch({...e,meta:{fetchMore:{direction:`forward`}}})}fetchPreviousPage(e){return this.fetch({...e,meta:{fetchMore:{direction:`backward`}}})}createResult(e,t){let{state:n}=e,r=super.createResult(e,t),{isFetching:i,isRefetching:a,isError:s,isRefetchError:c}=r,l=n.fetchMeta?.fetchMore?.direction,d=s&&l===`forward`,f=i&&l===`forward`,p=s&&l===`backward`,m=i&&l===`backward`;return{...r,fetchNextPage:this.fetchNextPage,fetchPreviousPage:this.fetchPreviousPage,hasNextPage:u(t,n.data),hasPreviousPage:o(t,n.data),isFetchNextPageError:d,isFetchingNextPage:f,isFetchPreviousPageError:p,isFetchingPreviousPage:m,isRefetchError:c&&!d&&!p,isRefetching:a&&!f&&!m}}};function U(e,t){return l(e,H,t)}export{D as a,y as c,L as i,v as l,V as n,w as o,B as r,b as s,U as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{V as t,l as n,q as r}from"./themeProps-CkLe5zXY.js";import{u as i}from"./useIsomorphicLayoutEffect-BiEJxDg_.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{V as t,l as n,q as r}from"./themeProps-CkLe5zXY.js";import{u as i}from"./useIsomorphicLayoutEffect-BiEJxDg_.js";import{gt as a}from"./page-header-Cs2fqdqC.js";import{_ as o}from"./Icon-DPaLmsmh.js";var s=e(r(),1),c=n(),l=new Set([`ArrowLeft`,`ArrowRight`,`ArrowUp`,`ArrowDown`]),u={horizontal:[`left`,`right`],vertical:[`up`,`down`],both:[`left`,`right`,`up`,`down`]},d={hint:{kVAEAm:`xixxii4`,kpwlN0:`x1anvkwx`,kogj98:`x1ghz6dp`,kWkggS:`x1prclbq`,kaIpWk:`xh6dtrn`,kGVxlE:`x1i5ehqx`,kLKAdn:`xfsso4q`,kGO01o:`xy143xn`,kZCmMZ:`x12gdq22`,kwRFfy:`x1djylfy`,kGuDYH:`x141an7d`,kLWn49:`x1ltkj2j`,kMwMTN:`xv1l7n4`,khDVqt:`xuxw1ft`,kSiTet:`xg01cxk xofkqq2`,k1ekBW:`xsm4mo9`,kIyJzY:`xx6bhzk`,kzIqYQ:`xd00j3c`,kfzvcC:`x47corl`,$$css:!0}};function f(e={}){let{orientation:n=`horizontal`,dismissAfterMs:r=3e3,isEnabled:f=!0}=e,p=o(),m=(0,s.useRef)(null),h=(0,s.useRef)(!1),g=(0,s.useRef)(!1),_=(0,s.useRef)(()=>{}),v=(0,s.useCallback)(()=>{m.current&&=(clearTimeout(m.current),null)},[]),y=(0,s.useCallback)(()=>{g.current=!0},[]),b=(0,s.useCallback)(()=>{g.current=!1,v(),_.current(null)},[v]),x=i({mode:`context`,onShow:y,onHide:b});_.current=x.ref;let S=(0,s.useCallback)(()=>{h.current=!0,v(),x.hide(),g.current=!1,_.current(null)},[v,x]),C=(0,s.useCallback)(e=>{!h.current&&f&&(_.current(e),x.show(),v(),m.current=setTimeout(()=>{S()},r))},[v,S,r,f,x]);(0,s.useEffect)(()=>()=>{v(),_.current(null)},[v]);let w=(0,s.useCallback)(e=>{if(h.current||!f)return;let t=e.target;if(!t.matches(`:focus-visible`))return;let n=e.currentTarget;e.relatedTarget instanceof Node&&n.contains(e.relatedTarget)||C(t)},[C,f]),T=(0,s.useCallback)(e=>{if(!g.current)return;let t=e.currentTarget;if(e.relatedTarget instanceof Node&&t.contains(e.relatedTarget)){!h.current&&e.relatedTarget instanceof HTMLElement&&_.current(e.relatedTarget);return}S()},[S]),E=(0,s.useCallback)(e=>{g.current&&l.has(e.key)&&S()},[S]),D=(0,c.jsx)(`span`,{className:`x3nfvp2 x6s0dn4 xzye2dw`,children:u[n].map(e=>(0,c.jsx)(a,{keys:e},e))});return{hintElement:x.render((0,c.jsxs)(`span`,{"aria-hidden":`true`,children:[D,(0,c.jsx)(`span`,{className:`x11g1kdw`,children:p(`@astryx.keyboardHint.toNavigate`)})]}),{placement:`below`,alignment:`start`,xstyle:d.hint,style:{marginBlockStart:t[`--spacing-2`]}}),onFocus:w,onBlur:T,onKeyDown:E}}export{f as t};
|
package/dist/browser/index.html
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
crossorigin
|
|
15
15
|
/>
|
|
16
16
|
<title>Gitifact</title>
|
|
17
|
-
<script type="module" crossorigin src="/assets/index-
|
|
17
|
+
<script type="module" crossorigin src="/assets/index-DsduXf6u.js"></script>
|
|
18
18
|
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-hePW80VL.js">
|
|
19
19
|
<link rel="modulepreload" crossorigin href="/assets/themeProps-CkLe5zXY.js">
|
|
20
20
|
<link rel="modulepreload" crossorigin href="/assets/useIsomorphicLayoutEffect-BiEJxDg_.js">
|
|
@@ -23,45 +23,39 @@
|
|
|
23
23
|
<link rel="modulepreload" crossorigin href="/assets/Icon-DPaLmsmh.js">
|
|
24
24
|
<link rel="modulepreload" crossorigin href="/assets/useScrollLock-D-Y-zHSV.js">
|
|
25
25
|
<link rel="modulepreload" crossorigin href="/assets/container.stylex-rwI38dw9.js">
|
|
26
|
-
<link rel="modulepreload" crossorigin href="/assets/page-header-
|
|
26
|
+
<link rel="modulepreload" crossorigin href="/assets/page-header-Cs2fqdqC.js">
|
|
27
27
|
<link rel="modulepreload" crossorigin href="/assets/IconButton-Br-4XhQr.js">
|
|
28
28
|
<link rel="modulepreload" crossorigin href="/assets/useDevWarning-Dudfg3qF.js">
|
|
29
|
-
<link rel="modulepreload" crossorigin href="/assets/Table-
|
|
29
|
+
<link rel="modulepreload" crossorigin href="/assets/Table-Dm6wz2kf.js">
|
|
30
30
|
<link rel="modulepreload" crossorigin href="/assets/Tooltip-MoU3alsv.js">
|
|
31
31
|
<link rel="modulepreload" crossorigin href="/assets/useClipboard-Cqx6Upy7.js">
|
|
32
|
-
<link rel="modulepreload" crossorigin href="/assets/Markdown-
|
|
32
|
+
<link rel="modulepreload" crossorigin href="/assets/Markdown-BpWtY88p.js">
|
|
33
33
|
<link rel="modulepreload" crossorigin href="/assets/appearance-DyJA06C4.js">
|
|
34
|
-
<link rel="modulepreload" crossorigin href="/assets/document-
|
|
34
|
+
<link rel="modulepreload" crossorigin href="/assets/document-BbL374wf.js">
|
|
35
35
|
<link rel="modulepreload" crossorigin href="/assets/HoverCard-Bpt8LVFT.js">
|
|
36
|
-
<link rel="modulepreload" crossorigin href="/assets/Token-
|
|
37
|
-
<link rel="modulepreload" crossorigin href="/assets/HgiRefresh-
|
|
38
|
-
<link rel="modulepreload" crossorigin href="/assets/document-
|
|
36
|
+
<link rel="modulepreload" crossorigin href="/assets/Token-9hr7eTF1.js">
|
|
37
|
+
<link rel="modulepreload" crossorigin href="/assets/HgiRefresh-CmdxsKUC.js">
|
|
38
|
+
<link rel="modulepreload" crossorigin href="/assets/document-Dtyl4_It.js">
|
|
39
39
|
<link rel="modulepreload" crossorigin href="/assets/Section-Z2PuhE6c.js">
|
|
40
|
-
<link rel="modulepreload" crossorigin href="/assets/Selector-
|
|
41
|
-
<link rel="modulepreload" crossorigin href="/assets/
|
|
42
|
-
<link rel="modulepreload" crossorigin href="/assets/useKeyboardHint-
|
|
43
|
-
<link rel="modulepreload" crossorigin href="/assets/Tab-
|
|
44
|
-
<link rel="modulepreload" crossorigin href="/assets/
|
|
45
|
-
<link rel="modulepreload" crossorigin href="/assets/
|
|
46
|
-
<link rel="modulepreload" crossorigin href="/assets/
|
|
47
|
-
<link rel="modulepreload" crossorigin href="/assets/activity-timeline-Bl6a55GR.js">
|
|
48
|
-
<link rel="modulepreload" crossorigin href="/assets/commit-Cj7mcn9u.js">
|
|
40
|
+
<link rel="modulepreload" crossorigin href="/assets/Selector-Dji19JSe.js">
|
|
41
|
+
<link rel="modulepreload" crossorigin href="/assets/useInfiniteQuery-IoAmrFi4.js">
|
|
42
|
+
<link rel="modulepreload" crossorigin href="/assets/useKeyboardHint-Wwnf-tpi.js">
|
|
43
|
+
<link rel="modulepreload" crossorigin href="/assets/Tab-BY4IuGKn.js">
|
|
44
|
+
<link rel="modulepreload" crossorigin href="/assets/load-more-COb87OhG.js">
|
|
45
|
+
<link rel="modulepreload" crossorigin href="/assets/activity-timeline-BdRnSGAp.js">
|
|
46
|
+
<link rel="modulepreload" crossorigin href="/assets/commit-BWyvKMHI.js">
|
|
49
47
|
<link rel="modulepreload" crossorigin href="/assets/Grid-DCCm_m5g.js">
|
|
50
|
-
<link rel="modulepreload" crossorigin href="/assets/
|
|
51
|
-
<link rel="modulepreload" crossorigin href="/assets/features-CBeEOrok.js">
|
|
48
|
+
<link rel="modulepreload" crossorigin href="/assets/features-B1FsIXwk.js">
|
|
52
49
|
<link rel="modulepreload" crossorigin href="/assets/search-CbtiuqNx.js">
|
|
53
|
-
<link rel="modulepreload" crossorigin href="/assets/contributors-
|
|
54
|
-
<link rel="modulepreload" crossorigin href="/assets/instructions-Qhbd8_KG.js">
|
|
50
|
+
<link rel="modulepreload" crossorigin href="/assets/contributors-Bk_xjPNJ.js">
|
|
55
51
|
<link rel="stylesheet" crossorigin href="/assets/page-header-DTEyUWBS.css">
|
|
56
52
|
<link rel="stylesheet" crossorigin href="/assets/document-Drgtj94X.css">
|
|
57
53
|
<link rel="stylesheet" crossorigin href="/assets/Token-CKcN25HT.css">
|
|
58
|
-
<link rel="stylesheet" crossorigin href="/assets/document-
|
|
59
|
-
<link rel="stylesheet" crossorigin href="/assets/contributor-2mkEa2Wo.css">
|
|
54
|
+
<link rel="stylesheet" crossorigin href="/assets/document-DXzNxu17.css">
|
|
60
55
|
<link rel="stylesheet" crossorigin href="/assets/activity-timeline-BEeyw2GA.css">
|
|
61
56
|
<link rel="stylesheet" crossorigin href="/assets/commit-DVyOH45R.css">
|
|
62
57
|
<link rel="stylesheet" crossorigin href="/assets/features-FKxsPKab.css">
|
|
63
58
|
<link rel="stylesheet" crossorigin href="/assets/contributors-CPdOQKMF.css">
|
|
64
|
-
<link rel="stylesheet" crossorigin href="/assets/instructions-2OUMP-vh.css">
|
|
65
59
|
<link rel="stylesheet" crossorigin href="/assets/index-CswY1wJ4.css">
|
|
66
60
|
</head>
|
|
67
61
|
<body>
|
package/dist/i18n/en/block.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
## Gitifact Guide
|
|
2
2
|
|
|
3
|
-
Product behavior (requirements and designs)
|
|
3
|
+
Product behavior (requirements and designs) and decision records live in `.gitifact/` and are managed with the CLI `gitifact`. If the project specifies another way to run it, that is what `gitifact` means.
|
|
4
4
|
|
|
5
5
|
### At the start of a session
|
|
6
6
|
|
|
7
|
-
1.
|
|
8
|
-
2.
|
|
7
|
+
1. Run Gitifact commands as `node .gitifact/bin/cli.mjs <command>`; `gitifact` in this block means that command. The first run fetches the `cli` version in `.gitifact/config.json` once for this computer. If that file is missing, show the user the exact command `npx --yes gitifact@<cli version> update` (`npx.cmd` in Windows PowerShell), ask whether to run it, and run it yourself once allowed. Do not leave the install to the user.
|
|
8
|
+
2. Check git status and existing staging.
|
|
9
9
|
|
|
10
10
|
### What belongs in requirements
|
|
11
11
|
|
|
@@ -23,8 +23,8 @@ Record product behavior and constraints that must be maintained.
|
|
|
23
23
|
| Situation | First |
|
|
24
24
|
| --- | --- |
|
|
25
25
|
| Product behavior comes up | Check existing specs and conflicts with `specs list --type requirement` |
|
|
26
|
-
| Before changing code or documents | Read the feature's requirements and designs (`specs show <ID>`)
|
|
27
|
-
| Writing a new document | Read `guide show spec` (`design` for designs
|
|
26
|
+
| Before changing code or documents | Read the feature's requirements and designs (`specs show <ID>`) and the document's decision flow (`records list --doc <ID>`) |
|
|
27
|
+
| Writing a new document | Read `guide show spec` (`design` for designs) and `guide show writing`. Get IDs with `specs new`, and verify with `gitifact check` after editing |
|
|
28
28
|
| Changing a document or choosing between options | Write a decision record with `records new` (`guide show records`) |
|
|
29
29
|
| Asked to commit | Read `guide show commit`, write the input to the file `changes list` names, then run `changes commit` |
|
|
30
30
|
| Asked to show the records | Run `gitifact browser` in the background and give the URL |
|
|
@@ -32,7 +32,7 @@ Record product behavior and constraints that must be maintained.
|
|
|
32
32
|
|
|
33
33
|
### Rules
|
|
34
34
|
|
|
35
|
-
- When a version notice appears before a command's output, show the user the notice's
|
|
35
|
+
- When a version notice appears before a command's output, show the user the notice's update command and ask before the next step: update now (recommended) or later (`gitifact update --later`). Once allowed, run that command yourself and reread this block. If your tool blocks it, request that tool's approval.
|
|
36
36
|
- Commit only on a user request or project policy; push only when asked separately. Commit each decision with its record, documents, code and tests, and suggest a commit once when work is finished and left uncommitted.
|
|
37
37
|
- Do not issue IDs, check or commit without running the CLI, or report that as done.
|
|
38
38
|
- Write requirements and designs together for a new feature, in the project's language. Ask only about unclear product behavior and carry on with the rest.
|
|
@@ -40,7 +40,7 @@ Record product behavior and constraints that must be maintained.
|
|
|
40
40
|
|
|
41
41
|
### Commands
|
|
42
42
|
|
|
43
|
-
- `specs`·`
|
|
43
|
+
- `specs`·`records`: `list`·`show`·`new`. `check`: whole check. `changes list`·`changes commit --file <json> [--dry-run]`
|
|
44
44
|
- `browser`, `feedback`, `update [--check | --commit | --later]`, `init`, `guide list`·`guide show <topic>` ({topics}). Lists show 20 at a time; read on with the `--after <value>` at the end (`--all` for everything). They take `--fields` and `--format json`; see `--help` for options.
|
|
45
45
|
|
|
46
46
|
---
|
|
@@ -1,3 +1,28 @@
|
|
|
1
|
+
## 0.9.0 - 2026-10-12
|
|
2
|
+
### Added
|
|
3
|
+
- A project launcher, `.gitifact/bin/cli.mjs`. `init` and `update` write it, and agents run `node .gitifact/bin/cli.mjs <command>` without a global install. On first run the launcher fetches the `cli` version in `.gitifact/config.json` once into the user cache (sha512 integrity checked) and runs that version, so projects on different versions do not affect each other. A global install is optional.
|
|
4
|
+
### Changed
|
|
5
|
+
- Updating is one `npx --yes gitifact@<version> update`. It moves the config's `cli`, the agent block and the launcher to the new version together. Version notices, the agent block and the guides point to it.
|
|
6
|
+
- `init` no longer creates a one-line `@AGENTS.md` CLAUDE.md for a project whose block lives only in AGENTS.md. Claude Code reads AGENTS.md when there is no CLAUDE.md. An existing CLAUDE.md or `.claude/CLAUDE.md` still gets the block. `update` no longer reports that file as missing, and `agentDocs.missing` in the update result (v6) is always empty.
|
|
7
|
+
- The history cache is rebuilt once; the first history read after updating takes a little longer.
|
|
8
|
+
- Upgrading from 0.8.x: run `npx --yes gitifact@0.9.0 update`, move any `.gitifact/instructions/` as section 8 of `guide show migrate` describes, then commit the new launcher `.gitifact/bin/cli.mjs` together with the config and block changes.
|
|
9
|
+
### Removed
|
|
10
|
+
- Project instructions (`.gitifact/instructions/`) are no longer kept. The `instructions` command, `guide show instructions`, and the browser's instructions page and API are gone; Gitifact handles requirements, designs and records only. `check` stops on a leftover instruction folder with `INSTRUCTION_MOVED`, and section 8 of `guide show migrate` moves it to the skills folder of the agent you use (`.claude/skills/`, `.agents/skills/` and so on). Instructions in commits before 0.9.0 still read in the history.
|
|
11
|
+
### Fixed
|
|
12
|
+
- `records new --docs` and the `--fields` option split values on commas and spaces. A list now reads correctly when Windows PowerShell passes an unquoted `a,b` through npm's shim as `a b`.
|
|
13
|
+
- The message check of `changes commit` refuses only trailer lines of the form `Gitifact-<key>:`. A body line such as `gitifact-playbook skill ...` without a colon passes.
|
|
14
|
+
|
|
15
|
+
## 0.8.6 - 2026-09-28
|
|
16
|
+
### Added
|
|
17
|
+
- Requirements can be written as use cases (optional). Put `style: usecase` in the frontmatter, write a basic flow and alternative flows (A1…) in the body, and give each acceptance criterion a `Path:` line naming the path it checks. A project that does not use it works as before ("Use-case style" in `guide show spec`).
|
|
18
|
+
- With `"requirementStyle": "usecase"` written into `.gitifact/config.json`, `specs new requirement` writes a use-case skeleton and `style: usecase`. `--style usecase` or `--style default` makes one file differently. `init` and `update` neither write nor change the value.
|
|
19
|
+
- `changes list` and `changes commit` warn `REQUIREMENT_FLOW_FORMAT` (no basic flow, sections out of order) and `REQUIREMENT_PATH_FORMAT` (no `Path:`, a flow that does not exist) for a use-case requirement changed in this work, and `REQUIREMENT_STYLE_MISSING` for a requirement without `style` in a project that writes use cases. They do not block a commit, and `check` does not give them.
|
|
20
|
+
- The browser's feature page puts a "Use case" badge on the number line of a use-case requirement. A change comparison also shows a changed `style`.
|
|
21
|
+
### Changed
|
|
22
|
+
- The browser shows each line indented under a requirement's list item on its own line instead of joining them, so `Condition:` and `Expected:` no longer run together.
|
|
23
|
+
- The history cache is rebuilt once; the first history read after updating takes a little longer.
|
|
24
|
+
- Releases 0.8.5 and earlier cannot read a requirement with the `style` key. Have the team update to 0.8.6 before using use cases (the config's `cli` version notice tells them).
|
|
25
|
+
|
|
1
26
|
## 0.8.5 - 2026-09-27
|
|
2
27
|
### Added
|
|
3
28
|
- The browser has a history page for one document (`/records/docs/<document ID>`). It shows every commit that changed the document, newest first, each record with its title and the start of its decision, and opens the context and alternatives in place. Links such as "Change history of this requirement →" on features, instructions and records lead there.
|
|
@@ -43,4 +43,4 @@ If the project has its own rules for grouping commits, follow them. Under a spli
|
|
|
43
43
|
|
|
44
44
|
## Message and trailers
|
|
45
45
|
|
|
46
|
-
Follow the project's commit message convention. If none exists, state briefly what changed on the first line and why in the body. The CLI adds trailers for the changed documents and the documents records name (`Gitifact-Req` for requirements, `Gitifact-Design` for designs, `Gitifact-Doc` for features
|
|
46
|
+
Follow the project's commit message convention. If none exists, state briefly what changed on the first line and why in the body. The CLI adds trailers for the changed documents and the documents records name (`Gitifact-Req` for requirements, `Gitifact-Design` for designs, `Gitifact-Doc` for features, `Gitifact-Record` for records). A message with a `Gitifact-` trailer line such as `Gitifact-Req: ...` is refused (the key ignores case). An ordinary sentence that starts with `Gitifact-` is allowed.
|
|
@@ -32,8 +32,8 @@ order: 20
|
|
|
32
32
|
requirements:
|
|
33
33
|
- R-actual-related-requirement
|
|
34
34
|
sources:
|
|
35
|
-
- id:
|
|
36
|
-
note:
|
|
35
|
+
- id: D-actual-design-referred-to
|
|
36
|
+
note: Uses the same storage flow
|
|
37
37
|
- title: Library docs
|
|
38
38
|
url: https://example.test/docs
|
|
39
39
|
---
|
|
@@ -58,7 +58,7 @@ A design keeps no decision table. A choice among options goes into a record with
|
|
|
58
58
|
|
|
59
59
|
For diagrams, follow `gitifact guide show writing` for choosing the kind and drawing it, and place each in the file for the axis it explains. Each axis has kinds that suit it: `erDiagram` and a `flowchart` of cache or read flows for data, a `sequenceDiagram` of requests between components for interface, a `stateDiagram-v2` of screen states for ui, and failure and recovery flows for errors.
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
Do not repeat what the project's rules for working (AGENTS.md or the agent's skills) already say; a design holds only what is particular to this feature. If the design conflicts with those rules, agree with the user on whether to change the rules first.
|
|
62
62
|
|
|
63
63
|
## When to write one
|
|
64
64
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
title:
|
|
3
|
-
description: Steps
|
|
2
|
+
title: Moving old formats
|
|
3
|
+
description: Steps and the migration commit for moving a schemaVersion 2 project to the 0.8.0 document format, and moving 0.8 project instructions to the agent's skills
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
When the user asks to move a 0.7 project (`schemaVersion: 2` in `.gitifact/config.json`) to the 0.8.0 document format (schemaVersion 3), follow
|
|
6
|
+
When the user asks to move a 0.7 project (`schemaVersion: 2` in `.gitifact/config.json`) to the 0.8.0 document format (schemaVersion 3), follow sections 1 to 7. A project with only the 0.8 project instructions (`.gitifact/instructions/`) left follows section 8. The CLI has no conversion command, so the agent reads the old files and writes the new structure itself. Finish with a report in the form of the "Report" section.
|
|
7
7
|
|
|
8
8
|
In this guide, `gitifact` means the way to run the CLI that printed it (0.8.0 or later). Do not use a 0.7.x CLI. The 0.8.0 CLI refuses to read a schemaVersion 2 project, so read the files directly until step 3 changes the configuration.
|
|
9
9
|
|
|
@@ -12,7 +12,7 @@ In this guide, `gitifact` means the way to run the CLI that printed it (0.8.0 or
|
|
|
12
12
|
- `git status` must be clean. If there are uncommitted changes or staged files, stop and tell the user.
|
|
13
13
|
- If an **open branch** changed `.gitifact/` in the old format, tell the user to merge it before the migration and ask whether to merge or continue. Merging an old-format branch after the migration mixes the two formats, and `gitifact check` fails.
|
|
14
14
|
- The migration ends in a single commit. Confirm that you may commit. When possible, work on a new branch and merge after verification.
|
|
15
|
-
- Section 3 of this guide describes the whole new format. If a detail is unclear, run `gitifact init` and `gitifact specs new feature|requirement|design
|
|
15
|
+
- Section 3 of this guide describes the whole new format. If a detail is unclear, run `gitifact init` and `gitifact specs new feature|requirement|design …` in an empty Git repository outside the project to see the skeletons the CLI writes, and check them with `gitifact check`.
|
|
16
16
|
|
|
17
17
|
## 2. Reading the old format
|
|
18
18
|
|
|
@@ -54,7 +54,7 @@ Every structural fact lives in frontmatter only. Bodies carry no `#` title and n
|
|
|
54
54
|
```
|
|
55
55
|
4. **Designs:** for each feature with an old design.md, run `gitifact specs new design <feature>/overview --title "<old design title>" --description "<one line>"` to get a D- ID. Replace the body of the `design/overview.md` it created with the old design body (without its first line `# Design title`) and remove the `draft: true` line. Then:
|
|
56
56
|
- Remove the old `<!-- gitifact-ref: … -->` lines and list every R- ID they named, without duplicates, in the frontmatter `requirements`.
|
|
57
|
-
- Move old `sources`: a `path` becomes `- id: W-…` for the wiki page it points to (with its `note`, if any); a `url` becomes `- title: …` / `url: …`.
|
|
57
|
+
- Move old `sources`: a `path` becomes `- id: W-…` for the wiki page it points to (with its `note`, if any); a `url` becomes `- title: …` / `url: …`. Step 5 removes the W-.
|
|
58
58
|
- Leave the rest of the body unchanged. Keep the `order: 10` that `specs new` wrote. Do not split a design into files per concern (data, interface, ui, errors, …) in the migration commit. Move it as one overview so the moved body can be compared, and split it afterwards in a separate commit following `gitifact guide show design`.
|
|
59
59
|
- The frontmatter ends up like this. Sources in the new format have no `title`, so the old title of a wiki source is dropped.
|
|
60
60
|
```markdown
|
|
@@ -67,41 +67,26 @@ Every structural fact lives in frontmatter only. Bodies carry no `#` title and n
|
|
|
67
67
|
- R-…
|
|
68
68
|
- R-…
|
|
69
69
|
sources:
|
|
70
|
-
- id: I-…
|
|
71
|
-
note: the old note (if any)
|
|
72
70
|
- title: Outside document title
|
|
73
71
|
url: https://…
|
|
74
72
|
---
|
|
75
73
|
```
|
|
76
|
-
5. **Wiki
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
| Root page `wiki/<name>.md` | `index.md` of instruction `<name>`. Upper-case names become lower case (`ARCHITECTURE.md` → `architecture`) |
|
|
82
|
-
| Top-level folder `wiki/<folder>/` | Instruction `<folder>`. The folder's `README.md`, if any, becomes `index.md`; the other pages become `references/<path inside the folder>` |
|
|
83
|
-
| Folder with the same name as a root page | One instruction; the root page is `index.md` |
|
|
84
|
-
|
|
85
|
-
- For each instruction, run `gitifact instructions new <name> --title "<title>" --description "<one line>"` to get an I- ID. The title is the old title of the page that becomes `index.md`. For a folder without such a page, name the topic the folder holds (for example `handbook` → Team handbook). The description says what the instruction holds and for which work to read it.
|
|
86
|
-
- For the page that becomes `index.md`, drop the first body line `# Title` and move the rest unchanged: replace the body `specs new` wrote with it and remove the `draft: true` line. If a folder has no page to become `index.md`, write one line per reference file in the body, with its old title and a link.
|
|
87
|
-
- Pages moved to references keep the old body as it is (including the `# Title` line); replace `id: W-…` in the frontmatter with `title` (the old `# Title`) and `description` (one line on what the file holds and for which work to read it). Reference files have no ID.
|
|
88
|
-
- Move images and other non-Markdown files from the wiki folder into the instruction folder that uses them.
|
|
89
|
-
- Instructions cannot point at specs (`INSTRUCTION_SPEC_LINK`). In the moved files, reduce links under `.gitifact/spec/` from `[text](path)` to their text. Other relative links are fixed for the new location in step 6.
|
|
90
|
-
- Design `sources` that named a wiki page W- in step 4 now name the I- of the instruction that page moved to. If a design ends up naming the same instruction twice, merge the two and join the notes with `; `.
|
|
91
|
-
- The old W- IDs disappear from documents and stay only in the reasons of 0.7 commits.
|
|
92
|
-
- Do not turn the wiki's decision record (ADR) pages into record files or regroup instructions in the migration commit. Move bodies unchanged so they can be compared, and polish them in a separate commit after the migration.
|
|
93
|
-
6. **Relative links:** requirements and designs moved, so fix relative links in document bodies that point to the old `requirements.md` or `design.md`, or that break because a file moved (requirement and design bodies are now one folder deeper). Point links to wiki pages at the instruction files the pages moved to, and fix links inside moved instruction files for their new location. Do not edit bodies beyond fixing links.
|
|
74
|
+
5. **Wiki:** the wiki went in 0.8.0, and how work is done in the project is not kept by Gitifact. `check` refuses pages left in `.gitifact/wiki/` with `WIKI_REMOVED`. Show the user a table of where each page goes (the agent's skills folder, AGENTS.md outside the block, or a plain document such as under `docs/`), and move them once confirmed. The moved files are not Gitifact documents and have no ID: delete the `id: W-…` line of the frontmatter and keep the first `# Title` line. A page moved to a skill follows that agent's skill format (steps 2 and 3 of section 8).
|
|
75
|
+
- Remove the `- id: W-…` items written into design `sources` in step 4. To keep the reference, write the moved file's path in the design body.
|
|
76
|
+
- The old W- IDs leave the documents and remain only in the reasons of the 0.7 commits.
|
|
77
|
+
- Do not regroup or polish the wiki pages in the migration commit. Move bodies unchanged so they can be compared, and polish them in a separate commit afterwards.
|
|
78
|
+
6. **Relative links:** requirements and designs moved, so fix relative links in document bodies that point to the old `requirements.md` or `design.md`, or that break because a file moved (requirement and design bodies are now one folder deeper). Point links to wiki pages at the files the pages moved to, and fix links inside the moved files for their new location. Do not edit bodies beyond fixing links.
|
|
94
79
|
7. **Reasons:** do not move the reasons in the old history.jsonl files. They stay in the 0.7 commits and remain visible in the history (`records list --doc`, the browser) after the migration. Reasons for changes from 0.8.0 on are kept in records (`gitifact guide show records`). The migration commit gets no records; it is hidden from the history.
|
|
95
80
|
8. **Delete the old files:** remove every `.gitifact/spec/<feature>/requirements.md`, `design.md`, `history.jsonl` and the whole `.gitifact/wiki/` folder (including `wiki/history.jsonl`), once step 5 has moved every page, with a plain file deletion. Do not use `git rm`: it stages the deletion and the commit in section 5 refuses existing staging. If something is staged, unstage it with `git restore --staged <path>`.
|
|
96
81
|
|
|
97
|
-
The mechanical parts (splitting files, moving wiki pages) may be done with a one-off script. Keep the script outside the project and never commit it. Write slugs, descriptions and feature bodies yourself after reading the content. Every feature
|
|
82
|
+
The mechanical parts (splitting files, moving wiki pages) may be done with a one-off script. Keep the script outside the project and never commit it. Write slugs, descriptions and feature bodies yourself after reading the content. Every feature and requirement needs a description, which makes this the largest part of the migration (63 for a project with 18 features and 45 requirements). A description should let a reader recognize in one line of a list what the document requires or covers; do not repeat the title, condense the user story or the first paragraph instead.
|
|
98
83
|
|
|
99
|
-
**Allowed exceptions:** normally only the CLI issues IDs and committed reasons are never edited. For this migration only, existing S- and R- IDs are copied over. Never invent IDs (designs get their D-
|
|
84
|
+
**Allowed exceptions:** normally only the CLI issues IDs and committed reasons are never edited. For this migration only, existing S- and R- IDs are copied over. Never invent IDs (designs get their D- from `specs new`).
|
|
100
85
|
|
|
101
86
|
## 4. Checks
|
|
102
87
|
|
|
103
88
|
1. `gitifact check` must report no problems. Fix anything it reports.
|
|
104
|
-
2. Compare with the counts from section 2: features = number of `index.md`, requirements, designs (`design/overview.md` per feature), wiki pages (the
|
|
89
|
+
2. Compare with the counts from section 2: features = number of `index.md`, requirements, designs (`design/overview.md` per feature), wiki pages (the files moved in step 5). Count documents with `gitifact specs list --format json`.
|
|
105
90
|
3. Check that every old ID is present. Collect old IDs from `git grep -ohE '(S|R)-[a-z2-7]{10}' HEAD -- .gitifact` at their definitions (frontmatter `id`, `gitifact-req` comments) and new IDs from `documents[].id` of `gitifact specs list --format json`. No `.gitifact/wiki/` or `history.jsonl` file may remain and no design `sources` may name a W-.
|
|
106
91
|
4. The last lines of `gitifact changes list` must include `Document check: no problems`. Its other output is expected at this point: the old format does not parse as documents, so every document shows as `created`. New documents need no record. None of this blocks the commit.
|
|
107
92
|
|
|
@@ -125,16 +110,28 @@ Write JSON to the input path that `gitifact changes list` reports and run `gitif
|
|
|
125
110
|
|
|
126
111
|
## 6. After the migration
|
|
127
112
|
|
|
128
|
-
- Refresh the GITIFACT block in the agent instruction files with `gitifact update`. If project instructions outside the block (AGENTS.md, CLAUDE.md, …) mention old commands such as `spec working`, `spec save`, `spec commit` or `docs <topic>`, ask the user whether to replace them with the new ones (`list`, `show` and `new` of `specs
|
|
113
|
+
- Refresh the GITIFACT block in the agent instruction files with `gitifact update`. If project instructions outside the block (AGENTS.md, CLAUDE.md, …) mention old commands such as `spec working`, `spec save`, `spec commit` or `docs <topic>`, ask the user whether to replace them with the new ones (`list`, `show` and `new` of `specs` and `records`, `check`, `changes list`·`commit`, `guide show`) in a separate commit.
|
|
129
114
|
- If the old index of the 0.7.x browser exists at `<git common dir>/gitifact/` (usually `.git/gitifact/`), tell the user it can be deleted. 0.8.0 does not use it; leave the deletion to the user.
|
|
130
115
|
- The 0.8.0 cache lives in `.gitifact/cache/` and keeps itself out of Git. The first query reads the history from the start and may take a few seconds.
|
|
131
|
-
-
|
|
132
|
-
-
|
|
133
|
-
- The migration commit leaves bodies as they were, so instructions or specification bodies may still describe the old format (`requirements.md`, `spec save`, …) or refer to the wiki. Report where, and agree with the user on fixing them in a separate commit.
|
|
116
|
+
- Turning moved wiki pages that were decision records (ADRs) into records (`gitifact guide show records`), and regrouping the pages, are agreed with the user and done in a separate commit. The migration commit is hidden, so records written in that later commit are the ones the history shows.
|
|
117
|
+
- The migration commit leaves bodies as they were, so moved files or specification bodies may still describe the old format (`requirements.md`, `spec save`, …) or refer to the wiki. Report where, and agree with the user on fixing them in a separate commit.
|
|
134
118
|
|
|
135
119
|
## 7. Report
|
|
136
120
|
|
|
137
|
-
- Moved counts: features, requirements, designs, wiki pages (with the old counts), and the table of
|
|
121
|
+
- Moved counts: features, requirements, designs, wiki pages (with the old counts), and the table of where the wiki pages moved
|
|
138
122
|
- The `check` result and the comparison result
|
|
139
123
|
- Relative links fixed, anything not moved or that needed a judgment call
|
|
140
|
-
- The commit hash (if committed) and what remains (old commands in
|
|
124
|
+
- The commit hash (if committed) and what remains (old commands in the moved files)
|
|
125
|
+
|
|
126
|
+
## 8. Moving 0.8 project instructions
|
|
127
|
+
|
|
128
|
+
From 0.9.0 Gitifact does not keep how work is done in the project (instructions). If `.gitifact/instructions/` is still there, `check` refuses each folder with `INSTRUCTION_MOVED`. The document format (schemaVersion 3) stays; once the user agrees, move them in this order.
|
|
129
|
+
|
|
130
|
+
1. Ask the user where the instructions go. Each agent has its own skills folder (`.claude/skills/<name>/SKILL.md` for Claude Code; `.agents/skills/<name>/SKILL.md` for Codex, Cursor, Gemini CLI, GitHub Copilot and others). With several agents, place them for each, or use a skill distribution tool. They may also be merged into AGENTS.md outside the block instead of becoming skills.
|
|
131
|
+
2. Move `.gitifact/instructions/<name>/` to `<name>/` in the chosen skills folder and rename `index.md` to `SKILL.md`. Keep the other files (`references/` and so on) as they are.
|
|
132
|
+
3. Change the frontmatter to that agent's skill format. In the Agent Skills format, keep `name: <folder name>` and `description`, and remove `id` and `title`. Fix links in the body that break at the new location.
|
|
133
|
+
4. The instruction index outside the block of AGENTS.md: delete it when the instructions became skills, since agents see the skill descriptions themselves; point it at the new place when they were merged into AGENTS.md.
|
|
134
|
+
5. Remove the `- id: I-…` items from design `sources`. A moved instruction is not a Gitifact document, so an ID cannot name it (`MISSING_REFERENCE`). To keep the reference, write the skill's path in the design body.
|
|
135
|
+
6. Make sure `gitifact check` reports no problems. Write one record of the move, with the I- of the removed instructions and the designs whose `sources` changed in `docs` (`gitifact guide show records`). Commit the deleted instruction files, the new skill files, the changed designs and AGENTS.md and the record together (`gitifact guide show commit`). A commit takes up to 128 paths; split it beyond that.
|
|
136
|
+
|
|
137
|
+
The old instructions (I-) stay in the commits before 0.9.0 and are read in the history (`records list --doc`, the browser). Read a commit's text with `gitifact specs show <I-ID> --ref <commit>`.
|
|
@@ -9,7 +9,7 @@ A record keeps why a document looks the way it does. A document body holds only
|
|
|
9
9
|
|
|
10
10
|
| Case | Record |
|
|
11
11
|
| :--- | :--- |
|
|
12
|
-
| Changing or removing what an existing requirement
|
|
12
|
+
| Changing or removing what an existing requirement or design says | Write one. The old text is gone, so a record is the only place for the context |
|
|
13
13
|
| Choosing one of several options while creating or changing something | Write one. Alternatives considered do not go into the document body |
|
|
14
14
|
| Simply adding a new requirement | None. The user story is the reason |
|
|
15
15
|
| A document changed as a consequence of another decision | None of its own. Add the document to that decision's `docs` |
|
|
@@ -64,7 +64,7 @@ The body holds only these `##` sections. Headings may be in English (`## Context
|
|
|
64
64
|
|
|
65
65
|
## Length
|
|
66
66
|
|
|
67
|
-
Write two to five sentences each for the context and the decision. The context says what the problem was (what was seen and any numbers measured), who asked for what, and the constraints to keep. The decision says what was decided, how far it applies and its exceptions. Do not pad a section with what nothing supports. A section over 500 characters is a `check` problem (`RECORD_SECTION_TOO_LONG`). List alternatives one per line with why they were not chosen in brackets. Leave out the history, the measuring and the old ways. API fields, implementation steps and test notes stay in the design or the commit, not the record. If a longer explanation is needed, put it in the design
|
|
67
|
+
Write two to five sentences each for the context and the decision. The context says what the problem was (what was seen and any numbers measured), who asked for what, and the constraints to keep. The decision says what was decided, how far it applies and its exceptions. Do not pad a section with what nothing supports. A section over 500 characters is a `check` problem (`RECORD_SECTION_TOO_LONG`). List alternatives one per line with why they were not chosen in brackets. Leave out the history, the measuring and the old ways. API fields, implementation steps and test notes stay in the design or the commit, not the record. If a longer explanation is needed, put it in the design body and keep only the gist in the record. Follow `gitifact guide show writing` for the prose.
|
|
68
68
|
|
|
69
69
|
## Committing
|
|
70
70
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Requirement format
|
|
3
|
-
description: Feature and requirement files, frontmatter, user stories, scope and constraints and acceptance criteria, where quality targets go, creating, editing and moving
|
|
3
|
+
description: Feature and requirement files, frontmatter, user stories, scope and constraints and acceptance criteria, the optional use-case style, where quality targets go, creating, editing and moving
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
A feature is one folder, `.gitifact/spec/<feature>/`. The feature introduction is `index.md`, each requirement is its own `requirements/<slug>.md`, and the design is the files under `design/` (`gitifact guide show design`). Why a document changed is kept in records (`.gitifact/records/`, `gitifact guide show records`).
|
|
@@ -56,7 +56,7 @@ These IDs and sentences illustrate the structure and are not valid input. The bo
|
|
|
56
56
|
- **`order`:** requirements only. Number them in the order of the feature's use; two in one feature may not share a number. `specs new` uses the folder's highest value plus 10, leaving room to insert between.
|
|
57
57
|
- **Body:** required. Do not use a `#` heading or gitifact comments (`<!-- gitifact-… -->`). The body of a feature's `index.md` states in a paragraph or two what the feature is and where it ends.
|
|
58
58
|
|
|
59
|
-
Put no other keys in the frontmatter. Relations between documents are expressed by a design's `requirements` and `sources`; the folder decides which feature a requirement belongs to.
|
|
59
|
+
A requirement written as a use case also has `style` (see "Use-case style" below). Put no other keys in the frontmatter. Relations between documents are expressed by a design's `requirements` and `sources`; the folder decides which feature a requirement belongs to.
|
|
60
60
|
|
|
61
61
|
Links to other documents are relative to this file (from a requirement to an asset: `../../../assets/flow.png`). The browser opens their destinations. `check` and `changes list` report a missing target as a `MISSING_LINK_TARGET` warning. Warnings do not block a commit.
|
|
62
62
|
|
|
@@ -107,7 +107,83 @@ Apply this to new requirements and those being revised for the current request.
|
|
|
107
107
|
- A rule whose result can be checked in a given situation becomes an acceptance criterion instead. Do not write the same rule in both places.
|
|
108
108
|
- A quality target for this feature alone (performance, availability, security, accessibility, compatibility) is one item with a number. Example: "- One page of the list shows within 1 second for 95% of requests." Do not write targets without an agreed number ("fast", "stable").
|
|
109
109
|
|
|
110
|
-
System-wide quality targets (response time of every query, supported browsers, session expiry) are not repeated per requirement; gather them in one common feature. For example, `.gitifact/spec/quality/` holds one target per requirement, with what can be judged written as acceptance criteria. Do not put them
|
|
110
|
+
System-wide quality targets (response time of every query, supported browsers, session expiry) are not repeated per requirement; gather them in one common feature. For example, `.gitifact/spec/quality/` holds one target per requirement, with what can be judged written as acceptance criteria. Do not put them with how the project works (AGENTS.md or skills): those describe how to work, and what the product promises belongs in the specs.
|
|
111
|
+
|
|
112
|
+
## Use-case style (optional)
|
|
113
|
+
|
|
114
|
+
A requirement can also be written as a use case: it walks through the normal flow and every way it branches, and each acceptance criterion names the path it checks. If you do not use it, the default shape above stays as it is and this section can be skipped.
|
|
115
|
+
|
|
116
|
+
- **Marker:** `style: usecase` in the requirement's frontmatter. Without it the requirement has the default shape.
|
|
117
|
+
- **Project default:** write `"requirementStyle": "usecase"` into `.gitifact/config.json` by hand, and `specs new requirement` writes `style: usecase` and a use-case skeleton. `init` and `update` neither write nor change the value. To make one file differently, pass `--style usecase` or `--style default`.
|
|
118
|
+
- **In a project with that value:** a changed requirement without `style` draws the `REQUIREMENT_STYLE_MISSING` warning. A requirement that keeps the default shape says `style: default`.
|
|
119
|
+
|
|
120
|
+
```markdown
|
|
121
|
+
---
|
|
122
|
+
id: R-issued-by-the-CLI
|
|
123
|
+
title: Deleting a post
|
|
124
|
+
description: The author removes their own post
|
|
125
|
+
order: 30
|
|
126
|
+
style: usecase
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
As a post author, I want to delete my post so that I can take back something posted by mistake.
|
|
130
|
+
|
|
131
|
+
### Scope and constraints
|
|
132
|
+
|
|
133
|
+
- A deleted post stays in the trash for 30 days.
|
|
134
|
+
|
|
135
|
+
### Basic flow
|
|
136
|
+
|
|
137
|
+
1. The author chooses delete on the post.
|
|
138
|
+
2. The system asks for confirmation.
|
|
139
|
+
3. When the author confirms, the system moves the post to the trash.
|
|
140
|
+
|
|
141
|
+
### Alternative flows
|
|
142
|
+
|
|
143
|
+
- **A1. Not the author** (at step 1)
|
|
144
|
+
1. The delete button is not shown.
|
|
145
|
+
- **A2. Confirmation cancelled** (at step 3)
|
|
146
|
+
1. The post stays as it is.
|
|
147
|
+
|
|
148
|
+
### Acceptance criteria
|
|
149
|
+
|
|
150
|
+
1. Path: Basic flow
|
|
151
|
+
Condition: The author confirms the deletion.
|
|
152
|
+
Expected: The post leaves the list and shows in the trash.
|
|
153
|
+
2. Path: Basic flow, A2
|
|
154
|
+
Condition: The author cancels the confirmation.
|
|
155
|
+
Expected: The post stays.
|
|
156
|
+
3. Path: A1
|
|
157
|
+
Condition: Another user opens the post.
|
|
158
|
+
Expected: There is no delete button.
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
The body runs: user story, `### Scope and constraints`, `### Preconditions`, `### Basic flow`, `### Alternative flows`, `### Postconditions`, `### Acceptance criteria`. The basic flow and the acceptance criteria are required; the rest only when needed.
|
|
162
|
+
|
|
163
|
+
- **Basic flow:** the normal exchange between the actor and the system as numbered steps, one action per step.
|
|
164
|
+
- **Alternative flows:** `- **A1. Situation** (at step N)`: a number, where it branches and from which step, with its steps below. Errors and exceptions go here too. Say so when a flow returns to the basic flow.
|
|
165
|
+
- **Pre- and postconditions:** what must hold before it starts and after it ends, as `-` items.
|
|
166
|
+
- **Acceptance criteria:** three lines per item, `Path:`, `Condition:` and `Expected:`. The path joins `Basic flow` and this requirement's alternative flow numbers with commas (for example `Path: Basic flow, A2`). Give every path at least one criterion.
|
|
167
|
+
- **Scope:** write the flows as behavior the user can check; screen layout and APIs belong in the design (see "What stays out of a requirement" below). Implementation order and effort stay out of the requirement.
|
|
168
|
+
|
|
169
|
+
For a use-case requirement changed in this commit, `changes list` and `changes commit` warn `REQUIREMENT_FLOW_FORMAT` when the basic flow is missing or the sections are out of order, and `REQUIREMENT_PATH_FORMAT` when a criterion has no `Path:` or names a flow that does not exist. As with the default shape, they do not stop the commit and `check` does not give them.
|
|
170
|
+
|
|
171
|
+
A feature's `index.md` may draw its use-case model as a Mermaid flowchart: the actors, the feature's boundary (`subgraph`) and a use case per requirement, joined. It is optional and the CLI does not check it.
|
|
172
|
+
|
|
173
|
+
````markdown
|
|
174
|
+
## Use-case model
|
|
175
|
+
|
|
176
|
+
```mermaid
|
|
177
|
+
flowchart LR
|
|
178
|
+
writer[Post author]
|
|
179
|
+
subgraph posts[Posts]
|
|
180
|
+
uc1([Creating a post])
|
|
181
|
+
uc2([Deleting a post])
|
|
182
|
+
end
|
|
183
|
+
writer --- uc1
|
|
184
|
+
writer --- uc2
|
|
185
|
+
```
|
|
186
|
+
````
|
|
111
187
|
|
|
112
188
|
## What stays out of a requirement
|
|
113
189
|
|
|
@@ -119,6 +195,6 @@ A requirement says what to build, as results the user can check. Keep the follow
|
|
|
119
195
|
|
|
120
196
|
Example: instead of "each row shows the applicant, period and status columns", write "the user can tell applications apart by applicant, period and status".
|
|
121
197
|
|
|
122
|
-
Follow `gitifact guide show writing` for prose. Its style rules do not replace the user-story pattern and the condition/expected
|
|
198
|
+
Follow `gitifact guide show writing` for prose. Its style rules do not replace the user-story pattern and the acceptance criteria format above (condition/expected, with a path first in a use case). Write project content in the project's language; the language of these instructions does not change it.
|
|
123
199
|
|
|
124
200
|
Refine the files during the conversation. When an existing requirement changes or one of several options is chosen, write a draft record then (`gitifact guide show records`). Simply adding a requirement needs no record. While changing code and tests, bring requirements into line with the final agreement.
|