gitifact 0.3.1 → 0.3.2
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 +1 -3
- package/dist/browser/assets/{Markdown-Br4lZgRm.js → Markdown-C8BT0YZz.js} +2 -2
- package/dist/browser/assets/about-DMFBT-sA.js +3 -0
- package/dist/browser/assets/about-Df__2EC8.css +1 -0
- package/dist/browser/assets/{contributors._email-BedFTFKd.js → contributors._email-bq12TRAr.js} +1 -1
- package/dist/browser/assets/{contributors.index-Bnzf41H5.js → contributors.index-eTu4P306.js} +1 -1
- package/dist/browser/assets/{features._featureId-DcMHCk6D.js → features._featureId-CGRWLMyZ.js} +1 -1
- package/dist/browser/assets/{requirements-Dwwz8esQ.js → features.index-_wXeEia1.js} +1 -1
- package/dist/browser/assets/git-CTULSVR7.js +1 -0
- package/dist/browser/assets/gitifact-logo-DPewkDQ4.svg +5 -0
- package/dist/browser/assets/{guides._documentId-DCT-3idQ.js → guides._documentId-D3RCTjtd.js} +1 -1
- package/dist/browser/assets/{guides.index-D1kTKyw-.js → guides.index-CFMN9ggJ.js} +1 -1
- package/dist/browser/assets/index-Cl1J8uRf.js +56 -0
- package/dist/browser/assets/{page-header-BL8BYIMW.js → page-header-CYf1yQV1.js} +75 -5
- package/dist/browser/assets/product-BxZktNQM.js +8 -0
- package/dist/browser/assets/{product.index-DByH6f_H.js → product.index-AF24IXK3.js} +1 -1
- package/dist/browser/assets/request-state-DzkYXwJR.js +1 -0
- package/dist/browser/assets/{features.index-De9qZC-A.js → requirements-DpTMK_Uu.js} +1 -1
- package/dist/browser/assets/{routes-3pD4uVSj.js → routes-jgWFqeRv.js} +1 -1
- package/dist/browser/index.html +5 -5
- package/dist/i18n/ko/block.md +30 -0
- package/dist/i18n/ko/changelog.md +41 -0
- package/dist/main.js +860 -524
- package/package.json +3 -3
- package/dist/browser/assets/about-BEuntqm_.js +0 -52
- package/dist/browser/assets/about-yX6os7bt.css +0 -1
- package/dist/browser/assets/git-D7ZvYMaq.js +0 -1
- package/dist/browser/assets/index-Dv_ANS5w.js +0 -56
- package/dist/browser/assets/product-mRpyGR_g.js +0 -8
- package/dist/browser/assets/request-state-CcdtplxL.js +0 -1
- /package/dist/{docs → i18n/ko/docs}/commit.md +0 -0
- /package/dist/{docs → i18n/ko/docs}/design.md +0 -0
- /package/dist/{docs → i18n/ko/docs}/product.md +0 -0
- /package/dist/{docs → i18n/ko/docs}/spec.md +0 -0
- /package/dist/{docs → i18n/ko/docs}/workflow.md +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gitifact",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "Git-backed requirements and change history for coding agents.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -36,8 +36,8 @@
|
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"commander": "15.0.0",
|
|
38
38
|
"esbuild": "0.28.2",
|
|
39
|
-
"@gitifact/
|
|
40
|
-
"@gitifact/
|
|
39
|
+
"@gitifact/core": "0.0.0",
|
|
40
|
+
"@gitifact/contracts": "0.0.0"
|
|
41
41
|
},
|
|
42
42
|
"scripts": {
|
|
43
43
|
"build": "node scripts/build.mjs",
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import{l as e}from"./themeProps-MQSlTycI.js";import{Rt as t,k as n,t as r}from"./page-header-BL8BYIMW.js";import{t as i}from"./Markdown-Br4lZgRm.js";var a={page:`_page_103o2_2`,column:`_column_103o2_3`,pageTitle:`_pageTitle_103o2_4`,body:`_body_103o2_5`},o=e(),s=`제품을 만드는 대화가 요구사항과 결정의 기록으로 이어지도록 돕는 도구입니다.
|
|
2
|
-
|
|
3
|
-
Gitifact가 지향하는 것은 사용자가 자신의 제품을 만드는 일에 집중하는 환경입니다. 평소처럼 에이전트와 무엇을 만들지 고민하고, 구현하고, 고쳐나가세요. 그 과정에서 요구사항과 변경 이유가 Git에 쌓이고, 사람과 에이전트가 같은 기록을 보며 제품의 상태를 이해할 수 있도록 만들고 있습니다.
|
|
4
|
-
|
|
5
|
-
## 에이전트에게 시작을 맡기세요
|
|
6
|
-
|
|
7
|
-
아래 프롬프트를 프로젝트에서 사용하는 에이전트에게 전달하세요.
|
|
8
|
-
|
|
9
|
-
\`\`\`text
|
|
10
|
-
이 프로젝트에 gitifact가 없으면 npm install -g gitifact@latest로 설치하고 gitifact init을 실행하세요.
|
|
11
|
-
init이 AGENTS.md 등에 쓴 GITIFACT 블록을 읽고 이번 세션부터 따르세요.
|
|
12
|
-
\`\`\`
|
|
13
|
-
|
|
14
|
-
Node.js 24.x와 Git이 필요합니다. \`init\`은 프로젝트의 AGENTS.md 같은 에이전트 지침 파일에 작업 규칙 블록을 씁니다. 그 뒤로는 평소처럼 제품을 설명하고 개발을 이어가면 됩니다. CLI를 업데이트했다면 \`init\`을 다시 실행해 블록을 갱신하세요. 명령 목록은 [CLI 안내](https://github.com/dev-goraebap/gitifact/blob/main/apps/cli/README.md)에 있습니다.
|
|
15
|
-
|
|
16
|
-
## 제품에 집중할 수 있도록
|
|
17
|
-
|
|
18
|
-
Gitifact는 스펙 주도 개발과 Anthropic의 [AI-Native SDLC Playbook](https://academy.claude.com/courses/ai-native-sdlc-playbook)에서 영감을 받았습니다. 요구사항을 정리하고 변경을 추적한다는 기본 원리를 따르되, 사용자가 이 개념들을 먼저 공부하거나 정해진 개발 절차에 익숙해져야 할 필요는 없도록 하려 합니다.
|
|
19
|
-
|
|
20
|
-
CLI, 데스크탑 앱, VS Code 어디에서 에이전트와 대화하든 자신에게 익숙한 방식으로 제품을 만들 수 있어야 합니다. 개발자뿐 아니라 로컬 에이전트와 대화하며 제품을 만드는 비개발자와 바이브 코더도 같은 대상입니다.
|
|
21
|
-
|
|
22
|
-
에이전트는 대화의 맥락에서 요구사항과 결정을 식별하고, Gitifact는 그 기록을 프로젝트의 Git 이력에 연결합니다. 사용자가 매번 기록할 항목과 명령을 지정하지 않아도 필요한 맥락이 남는 것이 목표입니다.
|
|
23
|
-
|
|
24
|
-
## 커밋된 명세를 기준으로
|
|
25
|
-
|
|
26
|
-
작업 중 에이전트와 대화하며 명세를 다듬고, 커밋할 때 최종 변경과 맞는지 확인하는 방식입니다. 초안의 모든 수정 과정을 따로 보존하지 않고 Git에 남은 버전에서 과거 내용과 변경 전후를 읽습니다. 자동 기록은 자동 커밋·푸시 권한이 아니며 프로젝트의 정책을 따릅니다.
|
|
27
|
-
|
|
28
|
-
## 처음부터 완벽하게 정리하지 않아도
|
|
29
|
-
|
|
30
|
-
기존 프로젝트에는 도입한 시점부터 기록을 쌓아가면 됩니다. 유지보수하거나 기능을 추가하면서 해당 영역의 요구사항을 정리하면 되고, 과거 전체를 먼저 문서화해야 시작할 수 있는 흐름은 요구하지 않습니다. 원한다면 에이전트에게 기존 기능을 살펴보고 요구사항과 설계 초안을 함께 정리하도록 맡길 수 있습니다.
|
|
31
|
-
|
|
32
|
-
새 프로젝트라면 처음 아이디어를 나누는 대화부터 시작하면 됩니다. 만들고 싶은 제품을 구체화하는 동안 에이전트가 요구사항과 구현 설계를 함께 정리하고 불명확한 제품 동작을 질문합니다.
|
|
33
|
-
|
|
34
|
-
## 적용 범위와 한계
|
|
35
|
-
|
|
36
|
-
Gitifact는 개인이나 팀이 **하나의 Git 저장소 안에서 제품을 만드는 환경**을 전제로 합니다. 하나의 제품을 여러 저장소로 나누어 운영하는 멀티 레포의 통합 요구사항 관리는 지원하지 않습니다. 이슈 트래커 연계는 검토한 적이 있지만 개발 여부와 일정은 미정입니다.
|
|
37
|
-
|
|
38
|
-
## 프로젝트 상태
|
|
39
|
-
|
|
40
|
-
공개 버전은 \`gitifact@0.3.1\`입니다. Markdown 요구사항·설계와 커밋 시점의 변경 이유를 Git에 연결하고, 읽기 전용 브라우저에서 활동·요구사항·참여자를 볼 수 있습니다. 에이전트에게 "gitifact 브라우저를 열어주세요"라고 요청하세요. 이전 Tryce 프로젝트는 \`gitifact migrate\`로 전환합니다.
|
|
41
|
-
|
|
42
|
-
0.3.1은 브라우저를 다듬은 패치이며, 0.3.0은 0.2.0의 스킬 설치(\`skills install\`)를 \`init\`이 쓰는 지침 블록과 \`gitifact docs\`로 대체했습니다. 0.2.0으로 설치한 스킬 파일은 직접 삭제하고 \`init\`을 다시 실행하세요.
|
|
43
|
-
|
|
44
|
-
제품의 목적·원칙·범위는 [제품 개요](/product)에서, 기능별 요구사항과 설계는 [요구사항](/features)에서 확인할 수 있습니다.
|
|
45
|
-
|
|
46
|
-
## Gitifact 개발에 참여하려면
|
|
47
|
-
|
|
48
|
-
실행·빌드·검증과 코드 구조는 [GitHub 저장소](https://github.com/dev-goraebap/gitifact)의 개발 환경 문서와 아키텍처 지침을 참고하세요.
|
|
49
|
-
|
|
50
|
-
## 라이선스
|
|
51
|
-
|
|
52
|
-
[MIT](https://github.com/dev-goraebap/gitifact/blob/main/LICENSE). 배포물에 포함된 의존성의 라이선스 고지는 \`dist/THIRD_PARTY_NOTICES.txt\`에 제공합니다.`;function c(){return(0,o.jsxs)(n,{gap:0,className:a.page,children:[(0,o.jsx)(r,{trail:[{label:`Gitifact 소개`}]}),(0,o.jsxs)(n,{gap:0,className:a.column,children:[(0,o.jsx)(n,{gap:1,className:a.pageTitle,children:(0,o.jsx)(t,{level:1,children:`Gitifact 소개`})}),(0,o.jsx)(n,{as:`article`,"aria-label":`Gitifact 소개`,gap:0,className:a.body,children:(0,o.jsx)(i,{headingLevelStart:2,children:s})})]})]})}var l=c;export{l as component};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._page_103o2_2{min-width:0}._column_103o2_3{width:100%;min-width:0;max-width:64rem;margin-inline:auto}._pageTitle_103o2_4{padding-inline:var(--spacing-5);padding-block:var(--spacing-6) var(--spacing-2)}._body_103o2_5{padding:var(--spacing-2) var(--spacing-5) var(--spacing-8);overflow-wrap:anywhere;min-width:0}._body_103o2_5 p,._body_103o2_5 li{line-height:1.9}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{K as e,V as t,X as n,l as r,n as i,q as a}from"./themeProps-MQSlTycI.js";import{B as o,D as s,E as c,F as l,H as u,Ht as d,J as f,O as p,Q as m,Rt as h,S as g,T as _,W as v,Z as ee,f as y,k as b,nt as x,p as S,r as te,t as C,tt as w,w as T,y as E}from"./page-header-BL8BYIMW.js";import{a as D}from"./useMediaQuery-C_nG4b-e.js";import{S as ne,T as O,f as k,n as A,p as re,t as j}from"./IconButton-BqlnBu_N.js";import{a as M,i as N,l as P,o as F,r as I,s as L,t as R}from"./request-state-CcdtplxL.js";import{u as z}from"./index-Dv_ANS5w.js";var B=class extends u{#e;#t=void 0;#n;#r;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#i()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#e.defaultMutationOptions(e),ee(this.options,t)||this.#e.getMutationCache().notify({type:`observerOptionsUpdated`,mutation:this.#n,observer:this}),t?.mutationKey&&this.options.mutationKey&&v(t.mutationKey)!==v(this.options.mutationKey)?this.reset():this.#n?.state.status===`pending`&&this.#n.setOptions(this.options)}onSubscribe(){this.listeners.size===1&&this.#n&&(this.#n.addObserver(this),this.#i())}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(e){this.#i(),this.#a(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#i(),this.#a()}mutate(e,t){return this.#r=t,this.#n?.removeObserver(this),this.#n=this.#e.getMutationCache().build(this.#e,this.options),this.#n.addObserver(this),this.#n.execute(e)}#i(){let e=this.#n?.state??z();this.#t={...e,isPending:e.status===`pending`,isSuccess:e.status===`success`,isError:e.status===`error`,isIdle:e.status===`idle`,mutate:this.mutate,reset:this.reset}}#a(e){o.batch(()=>{if(this.#r&&this.hasListeners()){let t=this.#t.variables,n=this.#t.context,r={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type===`success`){try{this.#r.onSuccess?.(e.data,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(e.data,null,t,n,r)}catch(e){Promise.reject(e)}}else if(e?.type===`error`){try{this.#r.onError?.(e.error,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(void 0,e.error,t,n,r)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}},V=n(a(),1);function H(e,t){let n=w(t),[r]=V.useState(()=>new B(n,e));V.useEffect(()=>{r.setOptions(e)},[r,e]);let i=V.useSyncExternalStore(V.useCallback(e=>r.subscribe(o.batchCalls(e)),[r]),()=>r.getCurrentResult(),()=>r.getCurrentResult()),a=V.useCallback((...e)=>{r.mutate(e[0],e[1]).catch(f)},[r]);if(i.error&&m(r.options.throwOnError,[i.error]))throw i.error;return{...i,mutate:a,mutateAsync:i.mutate}}var U=(0,V.createContext)(null);U.displayName=`CollapsibleGroupContext`;var W=(0,V.createContext)(null);W.displayName=`CollapsibleGroupPresentationContext`;function ie(e){let{isCollapsible:t,value:n}=e,r=(0,V.use)(U),i=r!=null&&n!=null,a=t===!0?{}:t||null,o=a!=null,[s,c]=(0,V.useState)(()=>i?!0:a?.isOpen===void 0?a?.defaultIsOpen??!0:a.isOpen),l;return l=i&&n!=null?r.isOpen(n):a?.isOpen===void 0?s:a.isOpen,{isEnabled:o,isOpen:l,toggle:()=>{if(i&&n!=null){r.toggle(n);return}let e=!l;a?.isOpen===void 0&&c(e),a?.onOpenChange?.(e)}}}var G=r(),ae={info:`info`,warning:`warning`,error:`error`,success:`success`},oe={info:`status`,warning:`alert`,error:`alert`,success:`status`},se=`status`,ce={info:`accent`,warning:`warning`,error:`error`,success:`success`},K={root:{k1xSpc:`x78zum5`,kXwgrk:`xdt5ytf`,kMv6JI:`xjb2p0i`,$$css:!0},rootElevatedCard:{kaIpWk:`x1vf2byn`,$$css:!0},header:{k1xSpc:`x78zum5`,kGNEyG:`x1cy8zhl`,kwnvtZ:`x1a02dak`,k1C7PZ:`xak3so`,khm7nJ:`x4olc9o`,k8WAf4:`x8o8v82`,kg3NbH:`x1pzlopt`,$$css:!0},headerCardStandalone:{kaIpWk:`x1vf2byn`,$$css:!0},headerCardWithContent:{krdFHd:`xwxb7qi`,kfmiAY:`x13nour3`,kVL7Gh:`xbiv7yw`,kT0f0o:`x16uus16`,$$css:!0},headerCentered:{kGNEyG:`x6s0dn4`,$$css:!0},endArea:{k1xSpc:`x78zum5`,kGNEyG:`x6s0dn4`,kwnvtZ:`x1a02dak`,kjj79g:`x13a6bvl`,kOIVth:`x1txdalj`,kmuXW:`x2lah0s`,ks0D6T:`x193iq5w`,keTefX:`xvc5jky`,kqGvvJ:`x81ka23`,$$css:!0},chevron:{k1ekBW:`x11xpdln`,kIyJzY:`xuedmi6 x12w9bfk`,kAMwcw:`xlr8y92`,$$css:!0},chevronExpanded:{k3aq6I:`x19jd1h0`,$$css:!0}},q={info:{kWkggS:`xgcxg3y`,$$css:!0},warning:{kWkggS:`x24i8r5`,$$css:!0},error:{kWkggS:`x1pritpl`,$$css:!0},success:{kWkggS:`xu13z74`,$$css:!0}};function le(e){return Object.prototype.hasOwnProperty.call(q,e)}var ue={none:{kGVxlE:`x1gnnqk1`,$$css:!0},low:{kGVxlE:`x1i5ehqx`,$$css:!0},med:{kGVxlE:`x14hfi27`,$$css:!0},high:{kGVxlE:`x1kcpxr7`,$$css:!0}};function J({status:n,title:r,description:a,icon:o,isDismissable:s=!1,onDismiss:c,dismissLabel:l,endContent:u,container:f=`card`,elevation:p=`none`,collapsible:m=!0,children:h,xstyle:g,className:_,style:v,ref:ee,onFocusCapture:y,onPointerDownCapture:b,...x}){let S=re(),[te,C]=(0,V.useState)(!1),w=typeof m==`object`&&m?m:{},{isEnabled:T,isOpen:E,toggle:O}=ie({isCollapsible:m!==!1&&{...w,defaultIsOpen:w.defaultIsOpen??!1}}),j=(0,V.useRef)(null),M=(0,V.useId)(),N=ae[n],F=oe[n]??se,I=ce[n],L=d(h),R=S(`@astryx.banner.dismiss`),z=l??R,B=l??(typeof r==`string`?S(`@astryx.banner.dismissTitled`,{dismiss:R,title:r}):R);if(te)return null;let H=(e,t)=>{e instanceof HTMLElement&&e!==document.body&&!t.contains(e)&&(j.current=e)},U=e=>{H(e.relatedTarget,e.currentTarget)},W=e=>{H(document.activeElement,e.currentTarget)},J=()=>{let e=j.current;C(!0),c?.(),e?.isConnected&&e.focus()},Y=T&&L,X=d(u)||s||Y,Z=d(u)||s,de=!d(a)&&Z,Q=L&&(!T||E),$=f===`card`;return(0,G.jsxs)(`div`,{ref:ee,role:F,onFocusCapture:P(y,U),onPointerDownCapture:P(b,W),...D(i(`banner-frame`,{container:f,elevation:p}),e(K.root,ue[p],$&&p!==`none`&&K.rootElevatedCard,g),_,v),...x,children:[(0,G.jsxs)(`div`,{...D(i(`banner`,{container:f,status:n}),e(K.header,de&&K.headerCentered,le(n)&&q[n],$&&(Q?K.headerCardWithContent:K.headerCardStandalone))),children:[(0,G.jsx)(`div`,{...d(o)?D(i(`banner-icon`,{status:n}),{className:`x78zum5 x6s0dn4 x2lah0s`}):{className:`x78zum5 x6s0dn4 x2lah0s`},"aria-hidden":`true`,children:d(o)?o:N==null?null:(0,G.jsx)(A,{icon:N,size:`md`,color:I,...i(`banner-icon`,{status:n})})}),(0,G.jsxs)(`div`,{...{0:{className:`x78zum5 xdt5ytf xxhr3t x98rzlu xeuugli`},1:{className:`x78zum5 xdt5ytf xxhr3t x98rzlu xeuugli xgualba`}}[!!d(u)<<0],children:[(0,G.jsx)(`div`,{className:`x1ghz6dp xjb2p0i xcr08ib x2mo6ok x1kq96og x1tgivj0 xj0a0fe`,children:r}),d(a)&&(0,G.jsx)(`div`,{...D(i(`banner-description`),{className:`x1ghz6dp xjb2p0i x141an7d x1sodnla x1ltkj2j xv1l7n4 xj0a0fe`}),children:a})]}),X&&(0,G.jsxs)(`div`,{...e(K.endArea,ne.inset(t[`--spacing-2`])),children:[u,Y&&(0,G.jsx)(k,{variant:`ghost`,size:`sm`,label:S(E?`@astryx.banner.collapse`:`@astryx.banner.expand`),tooltip:S(E?`@astryx.banner.collapse`:`@astryx.banner.expand`),icon:(0,G.jsx)(A,{icon:`chevronDown`,size:`sm`,color:`inherit`,xstyle:[K.chevron,E&&K.chevronExpanded]}),onClick:O,"aria-expanded":E,"aria-controls":Q?M:void 0,isIconOnly:!0}),s&&(0,G.jsx)(k,{variant:`ghost`,size:`sm`,label:B,tooltip:z,icon:(0,G.jsx)(A,{icon:`close`,size:`sm`,color:`inherit`}),onClick:J,isIconOnly:!0})]})]}),Q&&(0,G.jsx)(`div`,{id:Y?M:void 0,...D(i(`banner-content`,{container:f,status:n}),{0:{className:`x1de1mus x8o8v82 x1pzlopt xgbv0en xw8tdv1 x92x3c3 x1t7ytsu x18b5jzi x1q0q8m5 x1j92z86 x1gejf6u xw8gpjh`},1:{className:`x1de1mus x8o8v82 x1pzlopt xgbv0en xw8tdv1 x92x3c3 x1t7ytsu x18b5jzi x1q0q8m5 x1j92z86 x1gejf6u xw8gpjh x1k5g1gk x1eprgri`}}[!!$<<0]),children:h})]})}J.displayName=`Banner`;var Y={page:`_page_1rfdm_2`,column:`_column_1rfdm_3`,pageTitle:`_pageTitle_1rfdm_4`,content:`_content_1rfdm_5`,reveal:`_reveal_1rfdm_1`,summary:`_summary_1rfdm_8`,summaryItem:`_summaryItem_1rfdm_9`,code:`_code_1rfdm_10`,changes:`_changes_1rfdm_11`,path:`_path_1rfdm_12`,headerActions:`_headerActions_1rfdm_13`,headerTime:`_headerTime_1rfdm_14`};function X(e){if(e.kind===`unmerged`)return[{label:`충돌`,color:`red`}];if(e.kind===`untracked`||!e.xy)return[{label:`Untracked`,color:`gray`}];let t=[];return e.xy[0]!==`.`&&t.push({label:`Staged`,color:`green`}),e.xy[1]!==`.`&&t.push({label:`Unstaged`,color:`blue`}),t}function Z(e){return e.submodule?[e.submodule.commitChanged&&`submodule 커밋 변경`,e.submodule.trackedChanges&&`내부 tracked 변경`,e.submodule.untrackedChanges&&`내부 untracked 변경`].filter(Boolean).join(`, `):null}function de({session:e,reconnect:t}){let n=w(),r=l(s(e)),i=g(),a=H({mutationFn:()=>T(e),retry:!1,onMutate:async()=>{await n.cancelQueries({queryKey:c(e)})},onSuccess:async()=>{await n.cancelQueries({queryKey:c(e)}),await n.invalidateQueries({queryKey:c(e)})}}),o=a.error??r.error,u=o instanceof p&&(o.code===`SESSION_CHANGED`||o.code===`INVALID_RESPONSE`),d=u?void 0:r.data,f=a.isPending||r.isFetching,m=!!d?.changes.some(e=>e.submodule),_=[{key:`xy`,header:`상태`,width:y(150),renderCell:e=>(0,G.jsx)(E,{gap:1,wrap:`wrap`,children:X(e).map(e=>(0,G.jsx)(M,{label:e.label,color:e.color,size:`sm`},e.label))})},{key:`code`,header:`코드`,width:y(64),renderCell:e=>(0,G.jsx)(O,{type:`supporting`,color:`secondary`,className:Y.code,children:e.xy??`??`})},{key:`path`,header:`경로`,width:S(1,{minWidth:160}),renderCell:e=>(0,G.jsx)(O,{className:Y.path,children:e.path})}];m&&_.push({key:`submodule`,header:`추가 정보`,width:S(1),renderCell:e=>(0,G.jsx)(O,{type:`supporting`,color:`secondary`,children:Z(e)??`—`})});let v=d?[[`Staged`,d.summary.staged],[`Unstaged`,d.summary.unstaged],[`Untracked`,d.summary.untracked],[`충돌`,d.summary.conflicted]]:[];return(0,G.jsxs)(b,{gap:0,className:Y.page,"aria-busy":f,children:[(0,G.jsx)(C,{trail:[{label:`Git 상태`}],actions:(0,G.jsxs)(E,{gap:3,className:Y.headerActions,children:[d&&(0,G.jsxs)(O,{type:`supporting`,color:`secondary`,className:Y.headerTime,children:[(0,G.jsx)(`time`,{dateTime:d.observation.completedAt,children:new Date(d.observation.completedAt).toLocaleString()}),` 조회`]}),(0,G.jsx)(j,{label:f?`조회 중…`:`상태 새로고침`,icon:(0,G.jsx)(F,{}),variant:`ghost`,size:`sm`,isLoading:f,isDisabled:f||u,onClick:()=>a.mutate()})]})}),(0,G.jsxs)(b,{gap:0,className:Y.column,children:[(0,G.jsx)(b,{gap:1,className:Y.pageTitle,children:(0,G.jsx)(h,{level:1,children:`Git 상태`})}),(0,G.jsxs)(b,{gap:5,className:Y.content,"aria-label":`저장소 상태`,children:[i&&(0,G.jsx)(J,{status:`warning`,container:`card`,collapsible:!1,title:`미커밋 명세 변경이 있습니다`,description:(0,G.jsxs)(O,{type:`supporting`,children:[`요구사항·제품 개요·지침 화면은 작업 중인 내용이고, 활동은 커밋된 내용입니다. 커밋은 에이전트에게 요청하세요. `,(0,G.jsx)(x,{to:`/features`,children:`요구사항 보기 →`})]})}),o&&(0,G.jsxs)(b,{role:`alert`,gap:3,children:[(0,G.jsx)(O,{children:o.message}),u?(0,G.jsx)(E,{children:(0,G.jsx)(k,{label:`다시 연결`,onClick:t})}):d&&(0,G.jsx)(O,{type:`supporting`,color:`secondary`,children:`이전 조회 결과입니다. 상단의 조회 시각을 참고하세요.`})]}),!d&&r.isPending&&(0,G.jsx)(O,{role:`status`,type:`supporting`,color:`secondary`,children:`저장소 상태를 읽고 있습니다.`}),d&&(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(N,{columns:`multi`,children:[(0,G.jsx)(I,{label:`브랜치`,children:d.head.branch??`detached HEAD`}),(0,G.jsx)(I,{label:`HEAD`,children:d.head.commit?(0,G.jsx)(O,{className:Y.code,children:d.head.commit.slice(0,10)}):`아직 커밋이 없습니다`}),(0,G.jsx)(I,{label:`저장소`,children:(0,G.jsx)(O,{className:Y.path,children:d.repository.rootPath})})]}),(0,G.jsx)(E,{gap:6,wrap:`wrap`,"aria-label":`변경 집계`,className:Y.summary,children:v.map(([e,t])=>(0,G.jsxs)(E,{gap:2,className:Y.summaryItem,children:[(0,G.jsx)(O,{type:`supporting`,color:`secondary`,children:e}),(0,G.jsx)(O,{weight:`semibold`,children:t})]},e))}),d.changes.length===0?(0,G.jsx)(L,{isCompact:!0,title:`변경된 파일이 없습니다`,description:`작업 트리가 마지막 커밋과 같습니다.`}):(0,G.jsxs)(b,{gap:3,className:Y.changes,children:[(0,G.jsxs)(O,{type:`supporting`,color:`secondary`,children:[`변경 경로 `,d.changes.length,`개 · 코드의 첫 글자는 staged, 두 번째는 unstaged이며 .은 변경 없음입니다.`]}),(0,G.jsx)(te,{data:d.changes,idKey:`path`,columns:_,density:`compact`,dividers:`rows`,textOverflow:`wrap`})]}),(0,G.jsxs)(E,{gap:3,wrap:`wrap`,children:[(0,G.jsx)(O,{type:`supporting`,color:`secondary`,children:`관측한 Git 상태이며 파일 내용을 고정한 스냅샷은 아닙니다.`}),(0,G.jsx)(O,{type:`supporting`,color:`secondary`,children:`gitifact 요구사항 검사는 아직 실행하지 않습니다.`})]})]})]})]})]})}function Q(){let e=l(_()),t=w(),[n,r]=(0,V.useState)(0),i=async()=>{await t.cancelQueries({queryKey:[`repository-status`]}),t.removeQueries({queryKey:[`repository-status`]}),await e.refetch(),r(e=>e+1)};return e.data&&!e.error?(0,G.jsx)(de,{session:e.data,reconnect:()=>{i()}},e.data.sessionId+`:`+n):(0,G.jsxs)(b,{gap:0,className:Y.page,children:[(0,G.jsx)(C,{trail:[{label:`Git 상태`}]}),(0,G.jsxs)(b,{gap:0,className:Y.column,children:[(0,G.jsx)(b,{gap:1,className:Y.pageTitle,children:(0,G.jsx)(h,{level:1,children:`Git 상태`})}),e.isPending&&(0,G.jsx)(b,{padding:5,children:(0,G.jsx)(O,{role:`status`,type:`supporting`,color:`secondary`,children:`로컬 서버에 연결하고 있습니다.`})}),e.error&&(0,G.jsx)(R,{error:e.error,retry:()=>{i()}})]})]})}var $=Q;export{$ as component};
|