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.
Files changed (82) hide show
  1. package/README.md +14 -36
  2. package/dist/browser/assets/{HgiRefresh-BSPkIVFZ.js → HgiRefresh-CmdxsKUC.js} +1 -1
  3. package/dist/browser/assets/{Markdown-B1P3lpA0.js → Markdown-BpWtY88p.js} +1 -1
  4. package/dist/browser/assets/{Selector-BG3Gd_OR.js → Selector-Dji19JSe.js} +1 -1
  5. package/dist/browser/assets/Tab-BY4IuGKn.js +4 -0
  6. package/dist/browser/assets/{Table-DjTkmoR7.js → Table-Dm6wz2kf.js} +2 -2
  7. package/dist/browser/assets/{Token-D337a1e3.js → Token-9hr7eTF1.js} +1 -1
  8. package/dist/browser/assets/about-C3KamVtV.js +3 -0
  9. package/dist/browser/assets/activity-timeline-BdRnSGAp.js +2 -0
  10. package/dist/browser/assets/changelog-C8_hi0cv.js +1 -0
  11. package/dist/browser/assets/commit-BWyvKMHI.js +4 -0
  12. package/dist/browser/assets/contributors-Bk_xjPNJ.js +1 -0
  13. package/dist/browser/assets/{contributors._email-B7ATmxN1.js → contributors._email-C8GGV2IN.js} +1 -1
  14. package/dist/browser/assets/{contributors.index-Cc0QRJwQ.js → contributors.index-BKMSdIFJ.js} +1 -1
  15. package/dist/browser/assets/dashboard.index-COyVOMnD.js +1 -0
  16. package/dist/browser/assets/{document-kGFspd5u.js → document-BbL374wf.js} +4 -4
  17. package/dist/browser/assets/{document-Cmx0e6kz.css → document-DXzNxu17.css} +1 -1
  18. package/dist/browser/assets/document-Dtyl4_It.js +2 -0
  19. package/dist/browser/assets/features-B1FsIXwk.js +2 -0
  20. package/dist/browser/assets/{features._featureId-DGUBnzjL.js → features._featureId-DT63dqjw.js} +1 -1
  21. package/dist/browser/assets/{features.index-Dgw4kiMG.js → features.index-BGBefKJN.js} +1 -1
  22. package/dist/browser/assets/getting-started-CCqN7NFk.js +1 -0
  23. package/dist/browser/assets/git-CzKF2N75.js +1 -0
  24. package/dist/browser/assets/index-DsduXf6u.js +49 -0
  25. package/dist/browser/assets/{load-more-DVsjzCxE.js → load-more-COb87OhG.js} +1 -1
  26. package/dist/browser/assets/page-header-Cs2fqdqC.js +246 -0
  27. package/dist/browser/assets/{records._recordId-C2qxnLKN.js → records._recordId-DP2stdvW.js} +1 -1
  28. package/dist/browser/assets/{records.commits._commit-CSa3sQ8C.js → records.commits._commit-DQlC8mSd.js} +1 -1
  29. package/dist/browser/assets/{records.docs._docId-SIPsGTwH.js → records.docs._docId-C7snDAo3.js} +1 -1
  30. package/dist/browser/assets/{records.index-DoE_3GrP.js → records.index-DRPp4IAb.js} +1 -1
  31. package/dist/browser/assets/{records.working-Cp5ualrr.js → records.working-Qv9R2KgB.js} +1 -1
  32. package/dist/browser/assets/{settings-tVQIx1Uf.js → settings-DDEler3s.js} +1 -1
  33. package/dist/browser/assets/useInfiniteQuery-IoAmrFi4.js +1 -0
  34. package/dist/browser/assets/{useKeyboardHint-D5jGavym.js → useKeyboardHint-Wwnf-tpi.js} +1 -1
  35. package/dist/browser/index.html +18 -24
  36. package/dist/i18n/en/block.md +7 -7
  37. package/dist/i18n/en/changelog.md +25 -0
  38. package/dist/i18n/en/docs/commit.md +1 -1
  39. package/dist/i18n/en/docs/design.md +3 -3
  40. package/dist/i18n/en/docs/migrate.md +31 -34
  41. package/dist/i18n/en/docs/records.md +2 -2
  42. package/dist/i18n/en/docs/spec.md +80 -4
  43. package/dist/i18n/en/docs/workflow.md +12 -12
  44. package/dist/i18n/en/docs/writing.md +4 -4
  45. package/dist/i18n/ko/block.md +7 -7
  46. package/dist/i18n/ko/changelog.md +25 -0
  47. package/dist/i18n/ko/docs/commit.md +1 -1
  48. package/dist/i18n/ko/docs/design.md +3 -3
  49. package/dist/i18n/ko/docs/migrate.md +30 -33
  50. package/dist/i18n/ko/docs/records.md +2 -2
  51. package/dist/i18n/ko/docs/spec.md +80 -4
  52. package/dist/i18n/ko/docs/workflow.md +12 -12
  53. package/dist/i18n/ko/docs/writing.md +4 -4
  54. package/dist/launcher/cli.mjs +77 -0
  55. package/dist/main.js +405 -639
  56. package/package.json +3 -3
  57. package/dist/browser/assets/MetadataListItem-BEwPg27H.js +0 -1
  58. package/dist/browser/assets/Tab-RKLZrCiK.js +0 -1
  59. package/dist/browser/assets/about-D06ipt4C.js +0 -3
  60. package/dist/browser/assets/activity-timeline-Bl6a55GR.js +0 -2
  61. package/dist/browser/assets/changelog-DCvEVceR.js +0 -1
  62. package/dist/browser/assets/commit-Cj7mcn9u.js +0 -4
  63. package/dist/browser/assets/contributor-2mkEa2Wo.css +0 -1
  64. package/dist/browser/assets/contributor-D1TZSDq9.js +0 -1
  65. package/dist/browser/assets/contributors-lkpVuCXS.js +0 -1
  66. package/dist/browser/assets/dashboard.index-BNTyn3_V.js +0 -1
  67. package/dist/browser/assets/document-7jVYmB_Z.js +0 -2
  68. package/dist/browser/assets/features-CBeEOrok.js +0 -2
  69. package/dist/browser/assets/getting-started-B_LeBSZE.js +0 -1
  70. package/dist/browser/assets/git-DW-pzDOm.js +0 -1
  71. package/dist/browser/assets/index-IML0_BCy.js +0 -49
  72. package/dist/browser/assets/instructions-2OUMP-vh.css +0 -1
  73. package/dist/browser/assets/instructions-Qhbd8_KG.js +0 -1
  74. package/dist/browser/assets/instructions._instructionId-CnX6OyFZ.js +0 -1
  75. package/dist/browser/assets/instructions.agents-0tKcPahQ.js +0 -1
  76. package/dist/browser/assets/instructions.index-B3v6vtEg.js +0 -1
  77. package/dist/browser/assets/lazyRouteComponent-tJOK5sxC.js +0 -1
  78. package/dist/browser/assets/page-header-AS8jZ1ve.js +0 -248
  79. package/dist/browser/assets/project-instructions-DsWrw-nY.jpg +0 -0
  80. package/dist/browser/assets/useInfiniteQuery-C0rB-9Ci.js +0 -1
  81. package/dist/i18n/en/docs/instructions.md +0 -94
  82. 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-Cj7mcn9u.js";import{a as n}from"./index-IML0_BCy.js";var r=e();function i(){let{recordId:e}=n.useParams();return(0,r.jsx)(t,{recordId:e})}export{i as component};
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-Cj7mcn9u.js";import{r as n}from"./index-IML0_BCy.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};
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};
@@ -1 +1 @@
1
- import{l as e}from"./themeProps-CkLe5zXY.js";import{n as t,t as n}from"./index-IML0_BCy.js";var r=e();function i(){let{docId:e}=n.useParams();return(0,r.jsx)(t,{docId:e})}export{i as component};
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-IML0_BCy.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
+ 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-Cj7mcn9u.js";import{i as n}from"./index-IML0_BCy.js";var r=e();function i(){let e=n.useSearch();return(0,r.jsx)(t,{search:e})}export{i as component};
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{yt as a}from"./page-header-AS8jZ1ve.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};
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};
@@ -14,7 +14,7 @@
14
14
  crossorigin
15
15
  />
16
16
  <title>Gitifact</title>
17
- <script type="module" crossorigin src="/assets/index-IML0_BCy.js"></script>
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-AS8jZ1ve.js">
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-DjTkmoR7.js">
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-B1P3lpA0.js">
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-kGFspd5u.js">
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-D337a1e3.js">
37
- <link rel="modulepreload" crossorigin href="/assets/HgiRefresh-BSPkIVFZ.js">
38
- <link rel="modulepreload" crossorigin href="/assets/document-7jVYmB_Z.js">
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-BG3Gd_OR.js">
41
- <link rel="modulepreload" crossorigin href="/assets/lazyRouteComponent-tJOK5sxC.js">
42
- <link rel="modulepreload" crossorigin href="/assets/useKeyboardHint-D5jGavym.js">
43
- <link rel="modulepreload" crossorigin href="/assets/Tab-RKLZrCiK.js">
44
- <link rel="modulepreload" crossorigin href="/assets/useInfiniteQuery-C0rB-9Ci.js">
45
- <link rel="modulepreload" crossorigin href="/assets/load-more-DVsjzCxE.js">
46
- <link rel="modulepreload" crossorigin href="/assets/contributor-D1TZSDq9.js">
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/MetadataListItem-BEwPg27H.js">
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-lkpVuCXS.js">
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-Cmx0e6kz.css">
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>
@@ -1,11 +1,11 @@
1
1
  ## Gitifact Guide
2
2
 
3
- Product behavior (requirements and designs), instructions 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.
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. If `gitifact` is missing, show the user the exact command `npm i -g gitifact@<version>` with the `cli` version in `.gitifact/config.json` (`npm.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. Read every instruction with `gitifact instructions list --all`, and check git status and existing staging.
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>`), the instructions the index outside this block points to, and the document's decision flow (`records list --doc <ID>`) |
27
- | Writing a new document | Read `guide show spec` (`design` for designs, `instructions` for instructions) and `guide show writing`. Get IDs with `specs new` or `instructions new`, and verify with `gitifact check` after editing |
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 install command and ask before the next step: update now (recommended) or later (`gitifact update --later`). Once allowed, run the install and `gitifact update` yourself and reread this block. If your tool blocks it, request that tool's approval.
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`·`instructions`·`records`: `list`·`show`·`new`. `check`: whole check. `changes list`·`changes commit --file <json> [--dry-run]`
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 and instructions, `Gitifact-Record` for records). A message with a line starting `Gitifact-` is refused.
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: I-actual-instruction-followed
36
- note: Layers and dependency direction
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
- Before writing a design, read the instructions for the area of work from the AGENTS.md index and list the ones you followed in `sources`. Do not repeat what an instruction already says; a design holds only what is particular to this feature. Instructions do not point at designs, so the relation is written in this one direction only. If the design conflicts with an instruction, agree with the user on whether to change the instruction first.
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: Migrating a 0.7 project
3
- description: Steps, checks and the migration commit for moving a schemaVersion 2 project to the 0.8.0 document format
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 these steps. 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.
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|instruction …` in an empty Git repository outside the project to see the skeletons the CLI writes, and check them with `gitifact check`.
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: …`. The W- becomes the I- of the instruction that page moves to in step 5.
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 → instructions:** in 0.8.0 the wiki became project instructions (`gitifact guide show instructions`). `check` refuses pages left in `.gitifact/wiki/` with `WIKI_REMOVED`, so move every page into an instruction folder. Before moving, show the user a table of which page becomes which file of which instruction and get their confirmation. If the user changes the grouping, follow it.
77
-
78
- | Old location | New location |
79
- | :--- | :--- |
80
- | `wiki/README.md` (policy and entry page) | If it is still the default policy `init` wrote (decision records collected under `adr/`), delete it without moving. If the project rewrote it, move it like a root page to the `index.md` of instruction `overview`. Whether its wiki rules move to AGENTS.md is decided in section 6 |
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, requirement, instruction and reference file needs a description, which makes this the largest part of the migration (68 for a project with 18 features, 45 requirements and 5 instructions). 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.
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- and instructions their I- from `specs new`).
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 `index.md` and reference files in the step 5 table together). Count documents with `gitifact specs list --format json` and `gitifact instructions list --format json`.
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`, `instructions` and `records`, `check`, `changes list`·`commit`, `guide show`) in a separate commit.
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
- - If the wiki README moved to instruction `overview` holds rules for running the wiki (what goes where), agree with the user whether to move them to AGENTS.md or another instruction. Then write the instruction index outside the GITIFACT block of AGENTS.md: one line per instruction saying for which work to read it ("The AGENTS.md index" in `gitifact guide show instructions`). Ask the user whether to record this in a commit separate from the migration.
132
- - Turning the ADRs moved to references into records (`gitifact guide show records`) while leaving only the rules to keep in the instruction body, and regrouping instructions, 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.
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 instructions the wiki pages moved to
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 instructions, the old index)
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, design or instruction says | Write one. The old text is gone, so a record is the only place for the context |
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 or instruction body and keep only the gist in the record. Follow `gitifact guide show writing` for the prose.
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 in project instructions: instructions describe how to work, and what the product promises belongs in the specs.
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 format above. Write project content in the project's language; the language of these instructions does not change it.
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.