#๋ฆฌํฌํธ ๋ช ๋ น
#report:translate
์์ง๋ ๋ฆฌ๋ทฐ JSON์ ํ๊ตญ์ด๋ก ๋ฒ์ญํฉ๋๋ค.
npm run report:translate -- --my-app <owner> ...node dist/translateReviews.js ...
#CLI ์ต์
--my-app(ํ์)--registered-apps-path--input-dir(๊ธฐ๋ณธ๊ฐ:data/{myAppId}/reviews)--output-dir(๊ธฐ๋ณธ๊ฐ:data/{myAppId}/reviews-ko)--target-lang(๊ธฐ๋ณธ๊ฐko)--provider(google-web|none, ๊ธฐ๋ณธ๊ฐgoogle-web)--overwrite(๊ธฐ๋ณธ๊ฐfalse)--concurrency(๊ธฐ๋ณธ๊ฐ4)--output text|json
#์์
npm run report:translate -- --my-app golden-horizon
#์ถ๋ ฅ
data/{myAppId}/reviews-ko/{competitor}.jsondata/{myAppId}/reviews-ko/.translation-cache.json
#report:render-html
์ก์ ๋๋ธ ๋งํฌ๋ค์ด ๋ฆฌํฌํธ๋ฅผ ๊ณต์ฉ ๋ทฐ์ด์ฉ bundle JSON์ผ๋ก ๋ณํํฉ๋๋ค.
npm run report:render-html -- --my-app <owner> ...npm run report:render-html -- --allnode dist/renderReportHtml.js ...- ๊ธฐ๋ณธ ์ถ๋ ฅ์ JSON bundle๋ง ์์ฑํฉ๋๋ค. ์ฑ๋ณ HTML ํ์ผ์ ์ต์
(
--with-html)์ผ๋ก๋ง ์์ฑํฉ๋๋ค. - HTML ๋ฌธ์ ์ ๋ชฉ(H1/
<title>)์ ํญ ๊ธฐ์ค์ผ๋ก ๋ฐ๋๋๋ค:reviewํญ์{myAppId} ๋ฆฌ๋ทฐ(์๋ฌธ์{myAppId} Review),backlogํญ์{myAppId} ๋ฐฑ๋ก๊ทธ(์๋ฌธ์{myAppId} Backlog)๋ฅผ ์ฌ์ฉํฉ๋๋ค. - ์์ฑ๋๋ HTML ์๋จ ์ผ์ชฝ์๋ ํ์ผ๋ก ์ด๋ํ๋
Home๋ฒํผ(/)์ด ํฌํจ๋ฉ๋๋ค. - ํํฐ๋ ์๋จ
ํํฐ๋ฒํผ์ผ๋ก ์ฌ๋ ๋ณ๋ ํจ๋์์ ๊ด๋ฆฌํฉ๋๋ค. - ์ข์ ํ๋ฉด์์๋ ํํฐ ํจ๋์ด ๋ฐํ ์ํธ๋ก ์ด๋ฆฝ๋๋ค.
- ์ข์ ํ๋ฉด์์๋ ๋ ธํธ ํจ๋๋ ์ฐ์ธก ์ฌ์ด๋๋ฐ ๋์ ๋ฐํ ์ํธ๋ก ์ด๋ฆฝ๋๋ค.
- ๊ฒ์์ ๊ธฐ๋ณธ
๐๋ฒํผ์ผ๋ก ํ์๋๋ฉฐ, ๋ฒํผ์ ๋๋ฅด๋ฉด ๊ฒ์ ์ ๋ ฅ์ฐฝ์ด ํ์ฅ๋ฉ๋๋ค. - ๊ฒ์ ์
๋ ฅ์ฐฝ์ ํค๋ ๋จ๋ ๊ณต๊ฐ์
flex๋ก ์ฑ์ ๋ฒํผ ์์ญ๊ณผ ํจ๊ป ๋ฐ์ํ์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค. - ์๋จ ์ปจํธ๋กค์ ํญ์ ๋ฐ๋ผ ํ์๋ฉ๋๋ค:
๋ฆฌ๋ทฐ์๋ฐฑ๋ก๊ทธ๋ชจ๋ํํฐ์๋ ธํธ๋ฅผ ํ์ํฉ๋๋ค. ๋ฐฑ๋ก๊ทธ์๋ฆฌ๋ทฐ ํผ์น๊ธฐ๋ ํํฐ ํจ๋ ๋ด๋ถ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.- ์๋จ ๋ค๋น๊ฒ์ด์
์ํ๋ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธฐํ๋๋ฉฐ, ์๋ก๊ณ ์นจ ์์๋ ๋์ผํ UI ์ํ๊ฐ ์ ์ง๋ฉ๋๋ค.
tab(review|backlog)q(๊ฒ์์ด)tags(๋ค์ค ์ ํ ํ๊ทธ, ์ฝค๋ง ๊ตฌ๋ถ)exclude(all|active|excluded)min100(100์ ์ด์ํ์ฑ ์1)orig(์์ด ๋ณด๊ธฐํ์ฑ ์1)priority(๋ฐฑ๋ก๊ทธํญall|must|should|could)effort(๋ฐฑ๋ก๊ทธํญall|high|medium|low)page(๋ฆฌ๋ทฐํ์ด์ง๋ค์ด์ ๋ฒํธ, 1๋ถํฐ ์์ํ๋ฉฐ 1ํ์ด์ง์ผ ๋๋ ์๋ต)
- ํค๋ ์๋ ์ํ์ค์ ๋ ํญ ๋ชจ๋ ํ์๋ฉ๋๋ค.
- ์ข์ธก: ํ์ฌ ์ ์ฉ ํํฐ ์นฉ(์์ผ๋ฉด
ํํฐ ์์) - ์ฐ์ธก: ์ ์ฒด ๋๋น ์ ํ/ํํฐ ๊ฒฐ๊ณผ ์(
๋ฆฌ๋ทฐ x/y๋๋๋ฐฑ๋ก๊ทธ x/y)
- ์ข์ธก: ํ์ฌ ์ ์ฉ ํํฐ ์นฉ(์์ผ๋ฉด
๋ฐฑ๋ก๊ทธ๋ ์ฑ๋ณ ์น์ ์ด ์๋ ์ ์ฒด ํตํฉ ๋ฐฑ๋ก๊ทธ ํ ์ด๋ธ๋ก ํ์๋ฉ๋๋ค.๋ฐฑ๋ก๊ทธ์์๋ ์ฑ์ด ๋ฌ๋ผ๋ ๋์ผํ ๋ฐฑ๋ก๊ทธ ํญ๋ชฉ์ด๋ฉด ํ๋์ ํ์ผ๋ก ํตํฉํด ํ์ํฉ๋๋ค.๋ฐฑ๋ก๊ทธ์์๋ ์ ๋ชฉ/์ก์ ์ ๊ทํ ๊ธฐ์ค์ผ๋ก ์ ์ฌํ ๋ฐฑ๋ก๊ทธ ํญ๋ชฉ๋ ์ ์ฅ ์ ๊ทํ ๋จ๊ณ์์ ๋ณํฉํฉ๋๋ค.๋ฐฑ๋ก๊ทธ์ ๊ธฐ๋ณธ ๋ฐฑ๋ก๊ทธ ์ ๋ ฌ์์ฐ์ ์์(MUST > SHOULD > COULD) โ Status(Not Started > In Progress > Done) โ Effort(High > Medium > Low) โ ๋ฆฌ๋ทฐ ์(์ ์ฒด ๊ธฐ์ค, ๋ด๋ฆผ์ฐจ์)์์์ ๋๋ค.๋ฐฑ๋ก๊ทธ์ ๊ฐ ๋ฐฑ๋ก๊ทธ ํ์๋Status(Not Started | In Progress | Done) ์ปฌ๋ผ์ด ์ถ๊ฐ๋์๊ณ , ์ธ๋ผ์ธ์ผ๋ก ์ฆ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.Status๋ ๋น ๋ฅธ ์๋ณ์ ์ํด ์์์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค:Not Started(๋นจ๊ฐ),In Progress(๋ ธ๋),Done(์ด๋ก).- ๋ฐฑ๋ก๊ทธ ํ์ ์ธ๋ผ์ธ ์
๋ ํฐ๋
Priority(MUST/SHOULD/COULD)์Effort(High/Medium/Low)๋ ์์์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. - ๊ฐ ๋ฐฑ๋ก๊ทธ ํ์ ์ฑ ๋ชฉ๋ก์ 1์ค ํ
์คํธ๋ก ํ์๋๋ฉฐ, ๊ธธ๋ฉด ๋ง์ค์(
...) ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ฐฑ๋ก๊ทธ์์๋๋ฆฌ๋ทฐ์ ๋์ผํ ํํฐ ํจ๋ UX๋กPriority / Effort๋ฅผ ํํฐ๋งํ ์ ์์ต๋๋ค.๋ฐฑ๋ก๊ทธํ ์ด๋ธ์๋ ๋ณ๋๋ฆฌ๋ทฐ ์์ธ์ปฌ๋ผ์ด ์์ผ๋ฉฐ,๋ฆฌ๋ทฐ ์์ ํ์ดํ ๋ฒํผ์ผ๋ก ๋ฆฌ๋ทฐ ํ์ ํผ์น๊ณ /์ ์ต๋๋ค.๋ฆฌ๋ทฐ ์์ปฌ๋ผ์ํ์ฑ/์ ์ฒดํ์์ผ๋ก ํ์๋ฉ๋๋ค(์:2/8).๋ฆฌ๋ทฐ ์์์ ์ฒด๊ฐ์ ์๋ฌธ ์ธ์ฉ ๋ผ์ธ ์๊ฐ ์๋๋ผ,reviewId๊ธฐ์ค์ผ๋ก ์ค๋ณต ์ ๊ฑฐํ ๊ณ ์ ๋ฆฌ๋ทฐ ์์ ๋๋ค.- ๋ฆฌ๋ทฐ ํ์ ํผ์น๋ฉด ํ๊ตญ์ด ๋ฌธ์ฅ๋ง ๊ธฐ๋ณธ ํ์๋๋ฉฐ(
KR:์ ๋์ฌ ์์),์์ธํ๋ณด๊ธฐ์์ ๋ฆฌ๋ทฐ ID/๋ฉํ/์๋ฌธ์ ํ์ธํ ์ ์์ต๋๋ค. - ๋ฆฌ๋ทฐ ํ์ ํผ์น๋ฉด ์ฐ์ ์์๊ฐ ๋์ ๋ฆฌ๋ทฐ๋ง ๋ ๋ํฉ๋๋ค(๋ฐฑ๋ก๊ทธ ํญ๋ชฉ๋น ์ต๋ 8๊ฐ).
- ๋ฐฑ๋ก๊ทธ ํ ๋ง๋ ๊ณ ์ ํ๋์ฝ๋ฉ ๋ชฉ๋ก์ด ์๋๋ผ, ์ฑ๋ณ ๋ฆฌ๋ทฐ ํ ์คํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ ์ผ๋ก ์ถ์ถ๋ฉ๋๋ค(ํ ํฐ ๋น๋ ๊ธฐ๋ฐ ํด๋ฆฌ์คํฑ).
- ํฉ์ฑ ๋ฐฑ๋ก๊ทธ ์ ๋ ฅ ๋จ๊ณ์์ ์ ์ ํธ ๋ฆฌ๋ทฐ(์์ฒญ/์ด์ ์๋ ์งง์ ์นญ์ฐฌ ๋ฑ)๋ ์ ์ธํ๊ณ , ์ก์ ๊ฐ๋ฅํ ๋ฆฌ๋ทฐ๋ฅผ ์ฐ์ ์ฌ์ฉํฉ๋๋ค.
- ๋ฐฑ๋ก๊ทธ
action๋ฌธ๊ตฌ๋ ๋จ์ ๊ฑด์ ๋ฌธ์ฅ์ด ์๋๋ผ, ๋ฆฌ๋ทฐ ํจํด์์ ์ถ๋ก ํ ๊ตฌ์ฒด ์ฒดํฌ๋ฆฌ์คํธ(์ต๋ 3๊ฐ) ํํ๋ก ์์ฑ๋ฉ๋๋ค. - ๋ฐฑ๋ก๊ทธ
action๋ฌธ๊ตฌ ๋์(๋ฆฌ๋ทฐ N๊ฑด)/(evidence N reviews)๊ฐ์ ๊ฑด์ ํ๊ธฐ๋ ๋ ์ด์ ๋ถ์ด์ง ์์ผ๋ฉฐ, ๊ฑด์๋๋ฆฌ๋ทฐ ์์ปฌ๋ผ์์ ํ์ธํฉ๋๋ค. ๋ฆฌ๋ทฐ์์๋ ํด์ํ๊ทธ ํํฐ๋ฅผ#โค๏ธ / #์์ฒญ๊ธฐ๋ฅ / #๋ง์กฑ / #๋ถ๋ง์กฑ๋ค์ค ์ ํํ ์ ์๊ณ ,ํ๊ทธ ์ ์ฒด๋ก ์ด๊ธฐํํ ์ ์์ต๋๋ค.๋ฆฌ๋ทฐํํฐ ํจ๋์์ ์ฑ ํํฐ(์ฑ ์ ์ฒด+ ์ฑ๋ณ ๋ฒํผ)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.๋ฆฌ๋ทฐ์์๋ ํ์ฑ ์ํ ํํฐ๋ฅผ์ ์ฒด / ํ์ฑ / ๋นํ์ฑ์ผ๋ก ์ ํํ ์ ์์ต๋๋ค(๊ธฐ๋ณธ๊ฐ์ ์ฒด).๋ฆฌ๋ทฐ์ ์ฑ ์น์ ์ ์ต์ ๋ฑ๋ก์ผ ๋ฆฌ๋ทฐ๊ฐ ์๋ ์ฑ์ด ๋จผ์ ๋์ค๊ณ , ๋ฑ๋ก์ผ์ด ๊ฐ์ผ๋ฉด ์ฑ ๋ณ์ ์ด ๋์ ์์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค.๋ฆฌ๋ทฐ์ ์ฑ ์น์ ์ ํญ์ ํผ์นจ ์ํ๋ก ํ์๋๋ฉฐ, ์ ๊ธฐ/๋ซ๊ธฐ ๋์์ ์ ๊ณตํ์ง ์์ต๋๋ค.๋ฆฌ๋ทฐ์นด๋๋ ๋ฑ๋ก์ผ ์ต์ ์์ด ๊ธฐ๋ณธ์ด๋ฉฐ, ๋ฑ๋ก์ผ์ด ๊ฐ์ผ๋ฉด ๋ณ์ ๋์์์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค.๋ฆฌ๋ทฐ์นด๋๋ ํ์ด์ง๋ค์ด์ (ํ์ด์ง๋น 50๊ฐ)์ผ๋ก ํ์๋๋ฉฐ, ์๋จ ์ํ์ค์์ด์ /๋ค์๋ฒํผ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค.์ด์ ํด๋ฆญ ์ ํ์ด์ง ํ๋จ์ผ๋ก,๋ค์ํด๋ฆญ ์ ๋ฆฌ๋ทฐ ์นด๋ ์น์ ์๋จ์ผ๋ก ์คํฌ๋กค๋ฉ๋๋ค.๋ฆฌ๋ทฐ์์๋ ์ฑ ํํฐ๋ฅผ ์ ์ธํ ๋ค๋ฅธ ํํฐ๊ฐ ์์ ๋(๊ฒ์/ํ๊ทธ/์ํ/100์ ์ด์๊ธฐ๋ณธ๊ฐ) ํ์ด์ง๋ค์ด์ ์ข์ธก์ ๋ถ๋งํฌ UI๊ฐ ํ์๋ฉ๋๋ค. ๋ถ๋งํฌ๋ ์ฑ ํํฐ๋ณ๋ก ๋ถ๋ฆฌ ์ ์ฅ๋๋ฏ๋ก, ์ฑ๋ณ ํํฐ ํ๋ฉด๋ง๋ค ๋ ๋ฆฝ๋ ๋ถ๋งํฌ๋ฅผ ๊ฐ์ง๋๋ค. ๋ถ๋งํฌ ์ ์ฅ์ ์์ด์ฝ ๋ฒํผ์ผ๋ก ์ํํ๋ฉฐ, ํ์ฌ ๋ถ๋งํฌ ํ์ด์ง์์๋ ์์ด์ฝ์ด ์ฑ์์ง๊ณ ๋ค๋ฅธ ํ์ด์ง์์๋ ๋น์์ง ์ํ๋ก ํ์๋ฉ๋๋ค. ๋ถ๋งํฌ ์์ฝ์๋ถ๋งํฌ {ํ์ฌํ์ด์ง}/{์ ์ฒดํ์ด์ง}ํ์์ผ๋ก ํ์๋๊ณ , ๋ง์ง๋ง ํ์ด์ง๋ฉด๋ถ๋งํฌ {์ ์ฒดํ์ด์ง}/{์ ์ฒดํ์ด์ง} ยท ์๋ฃ๋ก ํ์๋ฉ๋๋ค.๋ถ๋งํฌ๋ก ์ด๋๋ฒํผ์ผ๋ก ์ ์ฅ๋ ๋ถ๋งํฌ ํ์ด์ง๋ก ์ด๋ํ ์ ์์ต๋๋ค.๋ฆฌ๋ทฐ์์ ๋ถ๋งํฌ๊ฐ ๋ง์ง๋ง ํ์ด์ง์ธ ๊ฒฝ์ฐ ์๋จ ํํฐ ์นฉ์๊ฒํ ์ํ: ์๋ฃ๊ฐ ํ์๋ฉ๋๋ค.๋ฆฌ๋ทฐ์์๋100์ ์ด์ํ ๊ธ๋ก ๊ธด ๋ฆฌ๋ทฐ๋ง ๋น ๋ฅด๊ฒ ๋ณผ ์ ์์ต๋๋ค.ํํฐ ์ด๊ธฐํ๋ฒํผ์ผ๋ก ๊ฒ์/์ฑ/์ํ/ํ๊ทธ/๊ธธ์ด ํํฐ๋ฅผ ํ ๋ฒ์ ํด์ ํ ์ ์์ต๋๋ค.- ํํฐ ํจ๋์
์ ์ฒด ๋ฆฌ๋ทฐ ๋นํ์ฑ ๋ฆฌ์ ๋ฒํผ์ผ๋ก ๋ชจ๋ ๋ฆฌ๋ทฐ๋ฅผ๋นํ์ฑ์ํ๋ก ์ผ๊ด ์ ํํ๊ณ ํด์ํ๊ทธ๋ฅผ ์ด๊ธฐํํ ์ ์์ต๋๋ค. - ๋ฆฌ๋ทฐ ํํฐ ์ฌ์ด๋๋ฐ/๋ฐํ
์ํธ ํค๋์
ํํฐ๋ง ๋ฆฌ๋ทฐ ์/์ ์ฒด ๋ฆฌ๋ทฐ ์๊ฐ ์ค์๊ฐ์ผ๋ก ํ์๋ฉ๋๋ค. ๋ฆฌ๋ทฐํญ์ ๊ฐ ์ฑ ํ ์ฐ์ธก ์นด์ดํธ๋ํํฐ๋ง ๋ฆฌ๋ทฐ ์/์ ์ฒด ๋ฆฌ๋ทฐ ์๋ก ํ์๋ฉ๋๋ค.- ์ ๋ชฉ ์๋ ์ปจํ ์คํธ ๋ธ๋ก์ ํญ์ ๋ฐ๋ผ ์ ํ๋์ด, ๊ฐ ํญ์ ํ์ํ ์ ๋ณด๋ง ํ์๋ฉ๋๋ค.
๋ฐฑ๋ก๊ทธํญ ์ปจํ ์คํธ๋ ์นด๋ํ ํต๊ณ/๋ฉํ ์์ด, ๋ฐฑ๋ก๊ทธ ๊ฑด์ยท์ฐ์ ์์ ๊ท์น(ํด์ํ๊ทธ ๊ธฐ์ค)์ ๊ฐ๋จํ ํ ์คํธ๋ก ํ์ํฉ๋๋ค.๋ฆฌ๋ทฐํญ ์๋จ ์์ฝ ๋ธ๋ก์ ์นด๋ ์์ด ์ค๊ธ๋ก์ฑ ์,ํด์ํ๊ทธ ์ ์,ํ์ฑ ์ํ ์ ์๋ฅผ ํ์ํฉ๋๋ค.- ๋ฆฌ๋ทฐ ์นด๋์์
#โค๏ธ / #์์ฒญ๊ธฐ๋ฅ / #๋ง์กฑ / #๋ถ๋ง์กฑ,๋นํ์ฑ/ํ์ฑ์ ์ง์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. - ์ ๋ณ ๋ฆฌ๋ทฐ๋ ์นดํ
๊ณ ๋ฆฌ ์น์
๋์
์ ๋ณ ๋ฆฌ๋ทฐ (ํด์ํ๊ทธ ๊ธฐ๋ฐ)1๊ฐ ์น์ ์ผ๋ก ํ์๋ฉ๋๋ค. - ๋ฆฌ๋ทฐ ์นด๋์
์์ด์ด๊ธฐ/๋ซ๊ธฐ๋ ๋ถ๋๋ฌ์ด ํผ์นจ/์ ํ ์ ๋๋ฉ์ด์ ์ผ๋ก ๋์ํฉ๋๋ค. - ์นด๋ ์ํ๊ฐ
๋นํ์ฑ์ด์ด๋ ํด์ํ๊ทธ๋ฅผ ํฌํจํ ์นด๋ ๋ฒํผ์ ๊ทธ๋๋ก ๋๋ฅผ ์ ์์ต๋๋ค(์ํ ๊ธฐ๋ฐ ํด๋ฆญ ์ฐจ๋จ ์์). - ์๋จ ์ฐ์ธก ์ปจํธ๋กค์
๋ ธํธ๋ฒํผ์ด ์์ผ๋ฉฐ, ์ฐ์ธก ์ฌ์ด๋๋ฐ์์ ๋ ธํธ CRUD(์์ฑ/์ ํ/์์ /์ญ์ )๋ฅผ ์ง์ ์ํํ ์ ์์ต๋๋ค. - ํค๋ ์ก์
๋ฒํผ
โ ๋ฐฑ๋ก๊ทธ ์์ฑ์๋ฆฌ๋ทฐํญ๊ณผ๋ฐฑ๋ก๊ทธํญ ๋ชจ๋์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. - ๋ ธํธ ํจ๋์ ๋ฐฑ๋ก๊ทธ ์ ๋ ํฐ๊ฐ ์๋๋ผ ์ ์ฉ ๋ ธํธ ๋ชฉ๋ก UI๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๊ฐ ๋
ธํธ๋
์ ๋ชฉ๊ณผ๋ด์ฉ์ ๋ ๋ฆฝ์ ์ผ๋ก ํธ์งํ ์ ์์ต๋๋ค. - ๋
ธํธ
์์ฑ์ ์ฆ์ ์ ์ฅ๋ฉ๋๋ค. - ๋
ธํธ
์ ์ฅ์ ํ์ฌ ํ์ฑ ๋ ธํธ 1๊ฐ์๋ง ์ ์ฉ๋ฉ๋๋ค(๋ด์ฉ ์ ๋ ฅ์ฐฝ ์๋์ ์ฅ๋ฒํผ ๋๋ ๋ ธํธ ํจ๋ ์ด๋ฆฐ ์ํ์์Ctrl/Cmd + S). - ๋
ธํธ
์ญ์ ๋ ํ์ฌ ํ์ฑ ๋ ธํธ๋ฅผ ์ฆ์ ์ญ์ /์ ์ฅํฉ๋๋ค. ๋ฐฑ๋ก๊ทธํญ์์ ๋ฐฑ๋ก๊ทธ๋ฅผ ํ์ด์ง์์ ์ง์ ํธ์งํ ์ ์์ต๋๋ค.- ๋ฐฑ๋ก๊ทธ ํญ๋ชฉ ์ถ๊ฐ/์ญ์
- ํ ์ปฌ๋ผ ์์๋
Priority โ ๋ฐฑ๋ก๊ทธ ํญ๋ชฉ โ Status โ Effort โ ๋ฆฌ๋ทฐ ์(ํ์ฑ/์ ์ฒด) โ ์์์ ๋๋ค - ๊ฐ ํ์
Priority / Status / Effort๋ฅผ ์ธ๋ผ์ธ ์ ๋ ํฐ๋ก ์ฆ์ ๋ณ๊ฒฝ - ์ธ๋ผ์ธ ์ ๋ ํฐ๋ ์จํ ๋นจ๊ฐ/๋ ธ๋/์ด๋ก ํ ์คํธ์ ๋ณผ๋ ์ฒ๋ฆฌ๋ก ์ํ ๊ตฌ๋ถ์ ๊ฐํํฉ๋๋ค(์ํ ๋ฐฐ๊ฒฝ ์ฑ์ ์์)
Status๋ผ๋ฒจ๋ ๋์ผํ ์จํ ๋นจ๊ฐ/๋ ธ๋/์ด๋ก ํ ์คํธ ์ ์ฉ ์คํ์ผ์ ์ฌ์ฉํฉ๋๋ค- ๋ฐฑ๋ก๊ทธ ํ์ ํด๋น ํ(row) ํด๋ฆญ ์ ํธ์ง๊ธฐ๊ฐ ๋ฐ๋ก ์ด๋ฆฝ๋๋ค(์ ๋ ํฐ/ํ ๊ธ/๋ฒํผ ๊ฐ์ ์ธ๋ผ์ธ ์ปจํธ๋กค ํด๋ฆญ์ ์ ์ธ)
- ํ ์ก์
๋ฒํผ์ ์์ด์ฝ ์ ์ฉ์ผ๋ก ์ฐ์ธก ๋์ ๋ฐฐ์น๋๋ฉฐ, ์์๋
์ญ์ โ ํธ์ง์ ๋๋ค - ๋ฐฑ๋ก๊ทธ ํ ์ญ์ ์ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ ์๋ฟ์ด ์๋, ์ค์ ์ปค์คํ ํ์ธ ๋ชจ๋ฌ์ด ํ์๋ฉ๋๋ค
- ๋ฆฌ๋ทฐ ์ ํ์ ์ค์ ๋ชจ๋ฌ(ํ์ด์ง๋ค์ด์
)์์ ์ํํ๋ฉฐ, ๋ชจ๋ฌ์๋
ํ์ฑ๋ฆฌ๋ทฐ๋ง ํ์๋๊ณ ์ด๊ธฐ/๋ซ๊ธฐ ์ ๋๋ฉ์ด์ ์ด ์ ์ฉ๋ฉ๋๋ค - ๋ฆฌ๋ทฐ ์ ํ ๋ชจ๋ฌ์ ๊ฒ์ ๊ฒฐ๊ณผ ๊ฐ์์ ๋ฌด๊ดํ๊ฒ ๊ณ ์ ๋์ด๋ฅผ ์ ์งํ๊ณ , ๋ชฉ๋ก ์์ญ๋ง ๋ด๋ถ ์คํฌ๋กค๋ฉ๋๋ค
- ํธ์ง๊ธฐ ์๋จ ์์ฝ์
์ ํ ๊ฐ์์ ํจ๊ป์ ์ฅ ์ ์ฒด ๊ฐ์๋ฅผ ํจ๊ป ํ์ํ๋ฉฐ, ๋นํ์ฑ ๋ฆฌ๋ทฐ๊ฐ ์์ผ๋ฉด ์๋ด ๋ฌธ๊ตฌ๋ก ํ์๋ฉ๋๋ค - ๋ฐฑ๋ก๊ทธ ํธ์ง๊ธฐ
๋ฆฌ๋ทฐ๋ชฉ๋ก์์ ๊ฐ ๋ฆฌ๋ทฐ๋ณ๋กํ์ฑโ๋นํ์ฑ์ํ๋ฅผ ์ง์ ์ ํํ ์ ์์ต๋๋ค(์ฆ์preview-state๋ฐ์) ๋นํ์ฑ์ผ๋ก ์ ํํด๋ ๋ฐฑ๋ก๊ทธ ์ฐ๊ฒฐ์ ์ ์ง๋๋ฉฐ, ์ฐ๊ฒฐ ํด์ (ร)๋ฅผ ๋๋ฌ์ผ evidence์์ ์ ๊ฑฐ๋ฉ๋๋ค- ๋ฐฑ๋ก๊ทธ ํธ์ง ๋ณธ๋ฌธ์๋ ํ์ฌ ์ ํ๋ ๋ฆฌ๋ทฐ๊ฐ ID ์นฉ์ด ์๋ ์ปดํฉํธํ ๋ฆฌ๋ทฐ ๋ณธ๋ฌธ(ํ ์คํธ๋ง, ์ฑ๋ช ์ ์ธ) ํํ๋ก ํ์๋ฉ๋๋ค
- ๋ฐฑ๋ก๊ทธ ํธ์ง๊ธฐ ํค๋ ์ก์
์
์ญ์ ,์ ์ฉ, ๋ซ๊ธฐ(โ) ์์์ด๋ฉฐ์ญ์ ๋ฒํผ์์ ์ฉ์ผ์ชฝ์ ๋ฐฐ์น๋ฉ๋๋ค - ๋ฐฑ๋ก๊ทธ ํธ์ง๊ธฐ์์๋
์ ์ฉ๋ฒํผ์ผ๋กStatusํฌํจ ์ฆ์ ์๊ตฌ ์ ์ฅ๋ฉ๋๋ค - ๋ฐฑ๋ก๊ทธ ํธ์ง๊ธฐ ์ธ ๋ฆฌํฌํธ ํ ํธ์ง(ํ ์ญ์ , ์ธ๋ผ์ธ ์ฐ์ ์์/์ํ/๋์ด๋ ๋ณ๊ฒฝ,
๋ฆฌ๋ทฐํญ ๋น ๋ฅธ ์ถ๊ฐ)๋ ์๋์ผ๋ก ์๊ตฌ ์ ์ฅ๋ฉ๋๋ค
๋ฆฌ๋ทฐํญ์ ๊ฐ ๋ฆฌ๋ทฐ ์นด๋์๋ ๋จ์ผ ๋น ๋ฅธ ์ถ๊ฐ ์ ๋ ํฐ๊ฐ ์์ผ๋ฉฐ, ๋ฐฑ๋ก๊ทธ๋ฅผ ์ ํํ๋ฉด ์ฆ์ ์ฐ๊ฒฐ ์ํ๊ฐ ํ ๊ธ๋ฉ๋๋ค(๋ฏธ์ฐ๊ฒฐ์ด๋ฉด์ถ๊ฐ, ์ด๋ฏธ ์ฐ๊ฒฐ๋จ์ด๋ฉดํด์ ).- ๋น ๋ฅธ ์ถ๊ฐ ์
๋ ํฐ์์๋ ์ด๋ฏธ ์ฐ๊ฒฐ๋ ๋ฐฑ๋ก๊ทธ ํญ๋ชฉ์ด ์ฐ์ ์์ ์์ด
โ๋ก ํ์๋๊ณ , ์นด๋์๋ ์ฐ์ธก ์ ๋ ฌ๋(N๊ฐ ์ฐ๊ฒฐ: ์ ๋ชฉ, ์ ๋ชฉ)ํ์์ ์ฐ๊ฒฐ ์ํ ํ ์คํธ๊ฐ ํ์๋ฉ๋๋ค. - ๋น ๋ฅธ ์ถ๊ฐ ์ ๋ ํฐ๋ ์นด๋ ์ก์ ํ ์๋์ ๋ฐฑ๋ก๊ทธ ์ ์ฉ ํ์ผ๋ก ๋ถ๋ฆฌ๋์ด ํ์๋ฉ๋๋ค(ํ๊ทธ/ํ์ฑ ํ ๊ธ๊ณผ ๋ถ๋ฆฌ).
๋ฆฌ๋ทฐํญ์์ ๋ฐฑ๋ก๊ทธ์ ์ถ๊ฐ๋ ๋ฆฌ๋ทฐ๋ ์๋์ผ๋กํ์ฑ์ํ๋ก ์ ํ๋ฉ๋๋ค.- ๋น ๋ฅธ ์ถ๊ฐ ์ ๋ ํฐ๋ ํ์ด์ง ์๋ก๊ณ ์นจ ์์ด ๋ฐฑ๋ก๊ทธ ์ต์ ์ ์๋ ๊ฐฑ์ ํฉ๋๋ค: ์ ๋ ํฐ ํฌ์ปค์ค/์ด๊ธฐ ์ ์ฌ๊ฒ์ฆํ๊ณ , ํญ์ด ๋ค์ ํ์ฑํ๋ ๋์ ํ๋ฉด ํ์ ์ค ์ฃผ๊ธฐ์ ์ผ๋ก ๋๊ธฐํํฉ๋๋ค.
- ๋ฆฌ๋ทฐ ๋ทฐ๋ ์ฑ๋ณ ์ ์ฒด ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ(
data/{myAppId}/reviews-ko/*.json, ์์ผ๋ฉดreviews/*.json)๋ฅผ ํจ๊ป ๋ถ๋ฌ์ต๋๋ค.- ๋ฆฌํฌํธ ์ ๋ณ ๋ฆฌ๋ทฐ๋ ๊ธฐ๋ณธ
ํ์ฑ - ๋ฏธ์ ๋ณ ๋ฆฌ๋ทฐ๋ ๊ธฐ๋ณธ
๋นํ์ฑ์ํ๋ก ํฌํจ๋์ด ์๋ ํ๋ ์ด์ ๊ฐ๋ฅ
- ๋ฆฌํฌํธ ์ ๋ณ ๋ฆฌ๋ทฐ๋ ๊ธฐ๋ณธ
- preview ๋ชจ๋์์๋ ์นด๋ ์ํ์ ๋
ธํธ๊ฐ
data/{myAppId}/reports/preview-state.json์ ์ ์ฅ๋ฉ๋๋ค(๋ ๋ค ์ฆ์ ๋ฐ์). preview-state.json์ ๋ฆฌ๋ทฐ ์นด๋์ ์ ์ฒด ์ํ(full-state)๋ฅผ ์ ์ฅํฉ๋๋ค(diff-only override ์๋).preview-state.json์ v4 ์คํค๋ง(reviews.tags,reviews.excluded,notes.{id}.title,notes.{id}.content)๋ฅผ ์ฌ์ฉํฉ๋๋ค.data/{myAppId}/icon.png๊ฐ ์กด์ฌํ๋ฉด HTML์ ์์ด์ฝ ๋ฉํ ํ๊ทธ(icon,og:image,twitter:image)๊ฐ ์๋ ๋ฐ์๋ฉ๋๋ค.
#CLI ์ต์
--my-app(--all๋ฏธ์ฌ์ฉ ์ ํ์)--all(๊ธฐ๋ณธ๊ฐfalse): ๋ฆฌ๋ทฐ JSON(data/{appId}/reviews-ko/*.json, ์์ผ๋ฉดreviews/*.json)์ด ์๋ ์ฑ ์ ์ฒด ์ผ๊ด ๋ ๋๋ง--registered-apps-path--input(์ ํ): ์์ค ํ์ผ(.md๋๋.json). ์๋ตํ๋ฉด raw ๋ฆฌ๋ทฐ JSON์์ ์ฑ ์์ค๋ฅผ ์๋ ๊ตฌ์ฑํฉ๋๋ค.--output(๊ธฐ๋ณธ๊ฐ:data/{myAppId}/reports/competitor-raw-actionable.ko.json)--with-html(๊ธฐ๋ณธ๊ฐfalse): ๋ ๊ฑฐ์ HTML ํ์ผ๋ ํจ๊ป ์์ฑ--html-output(--with-html์ผ ๋ ์ฌ์ฉ, ๊ธฐ๋ณธ๊ฐ:data/{myAppId}/reports/competitor-raw-actionable.ko.html)--all์--my-app,--input,--output,--html-output๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
#์์
npm run report:render-html -- --my-app aurora-eos
npm run report:render-html -- --all
#์ถ๋ ฅ
data/{myAppId}/reports/competitor-raw-actionable.ko.json(๊ณต์ฉ ๋ทฐ์ด ๋ฒ๋ค ๋ฐ์ดํฐ)data/{myAppId}/reports/backlog.ko.json(status๋ฅผ ํฌํจํ ํตํฉ ๋ฐฑ๋ก๊ทธitems๋ฐ์ดํฐ, ๋ฆฌ๋ทฐ๋sourceToken::reviewIdscoped ID๋ก ์ ์ฅ)--with-html์ฌ์ฉ ์์๋ง:data/{myAppId}/reports/competitor-raw-actionable.ko.html
#report:init-backlog
์ฑ๋ณ backlog.ko.json์ ์ด๊ธฐํํฉ๋๋ค(preview-state ์ด๊ธฐํ์ ๋ณ๋).
npm run report:init-backlog -- --my-app <owner> ...npm run report:init-backlog -- --allnode dist/initReportBacklog.js ...- ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊ธฐ์กด backlog๋ ์ ์งํ๊ณ , ์๋ ํ์ผ๋ง ์ด๊ธฐํํฉ๋๋ค.
- ๋ด๋ถ์ ์ผ๋ก
report:render-html์ ํธ์ถํด backlog๋ฅผ ์์ฑ/์ ๊ทํํฉ๋๋ค.
#CLI ์ต์
--my-app(--all๋ฏธ์ฌ์ฉ ์ ํ์)--all(๊ธฐ๋ณธ๊ฐfalse):data/ํ์์์ ๋ ๋ ๊ฐ๋ฅํ ์ฑ ์ ์ฒด ์ด๊ธฐํ--registered-apps-path--data-dir(๊ธฐ๋ณธ๊ฐ:data/)--input(๋จ์ผ ์ฑ ๋ชจ๋ ์ ์ฉ):report:render-html๋ก ์ ๋ฌํ ์์ค ํ์ผ(.md/.json)--force(๊ธฐ๋ณธ๊ฐfalse):backlog.ko.json์ด ์์ด๋ ์ฌ์์ฑ--dry-run(๊ธฐ๋ณธ๊ฐfalse)--all์--my-app,--input๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
#์์
npm run report:init-backlog -- --my-app aurora-eos
npm run report:init-backlog -- --my-app aurora-eos --force
npm run report:init-backlog -- --all
#์ถ๋ ฅ
data/{myAppId}/reports/backlog.ko.json
#report:init-state
๋ฆฌํฌํธ bundle์ ๊ธฐ๋ณธ๊ฐ์ ๊ธฐ์ค์ผ๋ก preview-state.json์ ์ด๊ธฐํํฉ๋๋ค.
npm run report:init-state -- --my-app <owner> ...npm run report:init-state -- --allnode dist/initReportState.js ...- ๋ชจ๋ ๋ฆฌ๋ทฐ ์ํ๋ฅผ
data/{myAppId}/reports/preview-state.json์ผ๋ก ์๋ํฉ๋๋ค.reviewDefaults[reviewId].excluded(๊ธฐ๋ณธ ํ์ฑ/๋นํ์ฑ)reviewDefaults[reviewId].tags(๊ธฐ๋ณธ ํด์ํ๊ทธ)
- ์ด ๋ช ๋ น์ ์ด๊ธฐ ๋ง์ด๊ทธ๋ ์ด์ /๋ฆฌ์ ์ฉ๋์ ๋๋ค. ์ด๊ธฐํ ์ดํ์๋ preview UI์์ ์ํ๋ฅผ ์๋ ๊ด๋ฆฌํ๋ฉด ๋ฉ๋๋ค.
report:render-html์ ๋ฆฌํฌํธ ๋ฒ๋ค(JSON)๊ณผ ์ต์ ๋ ๊ฑฐ์ HTML๋ง ์์ฑํ๋ฉฐpreview-state.json์ ๋ฆฌ์ ํ์ง ์์ต๋๋ค.
#CLI ์ต์
--my-app(--all๋ฏธ์ฌ์ฉ ์ ํ์)--all(๊ธฐ๋ณธ๊ฐfalse):data/{appId}/reports/competitor-raw-actionable.ko.json๊ฐ ์๋ ์ฑ ์ ์ฒด ์ด๊ธฐํ--registered-apps-path--data-dir(๊ธฐ๋ณธ๊ฐ:data/)--input(๊ธฐ๋ณธ๊ฐ:data/{myAppId}/reports/competitor-raw-actionable.ko.json)--output(๊ธฐ๋ณธ๊ฐ:data/{myAppId}/reports/preview-state.json)--keep-notes(๊ธฐ๋ณธ๊ฐtrue): ๋ฆฌ๋ทฐ ์ํ๋ฅผ ๋ค์ ์ด๊ธฐํํ ๋ ๊ธฐ์กด ์ฌ์ฉ์ ๋ ธํธ ์ ์ง--all์--my-app,--input,--output๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
#์์
npm run report:init-state -- --my-app aurora-eos
npm run report:init-state -- --all
#์ถ๋ ฅ
data/{myAppId}/reports/preview-state.json
#report:preview
localhost ํ๋ฆฌ๋ทฐ ์๋ฒ๋ฅผ ์คํํฉ๋๋ค.
-
๋์๋ณด๋ ๋ชจ๋: ์ฑ ๋ชฉ๋ก + ์์ฑ๋ ๋ฆฌํฌํธ ํ์ผ(
.md,.json, ์ต์ ๋ ๊ฑฐ์.html) ํ์ -
๊ถ์ฅ ํ๋ฆ: ์ฑ๋ณ ๋ฐ์ดํฐ๋ JSON bundle๋ง ์ ์งํ๊ณ
/v/:appId๊ณต์ฉ ๋ทฐ์ด๋ก ํ์ธ -
๋์๋ณด๋์ ๊ธฐ๋ณธ
View Report๋งํฌ๋ ๊ณต์ฉ ๋ทฐ์ด ๋ผ์ฐํธ(/v/:appId)๋ฅผ ์ฌ์ฉํฉ๋๋ค. -
/v/:appId๋ ์๋ฒ์์competitor-raw-actionable.ko.json์ ์ฝ์ดhtml๋ด์ฉ์ ์ง์ ์๋ตํฉ๋๋ค(ํด๋ผ์ด์ธํธ ๋ฒ๋ค ๋ถํธ์คํธ๋ฉ ์์). -
๋์๋ณด๋ ๋ชจ๋์์
data/{appId}/icon.png๊ฐ ์์ผ๋ฉด ์ฑ ์์ด์ฝ ํ์ -
๋ฆฌํฌํธ ํ๋ฉด ์๋จ๋
data/{appId}/icon.png๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์์ด์ฝ์ด ์์ผ๋ฉดappIdํ ์คํธ๋ก fallback -
๋์๋ณด๋ ๋ฐฐ๊ฒฝ์ ๋ทฐํฌํธ ์ ์ฒด ๋์ด๋ฅผ ์ฑ์ฐ๋๋ก ๋ ๋๋ง๋ฉ๋๋ค(์งง์ ์ฝํ ์ธ ์์๋ ๋ฐฐ๊ฒฝ์ด ๋๊ธฐ์ง ์์).
-
๋จ์ผ ํ์ผ ๋ชจ๋:
--file๋ก ๋ ๊ฑฐ์ HTML 1๊ฐ ์๋น -
๋ฆฌ๋ทฐ ์นด๋ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
GET /api/preview-state/:appIdPUT /api/preview-state/:appId- ์ ์ฅ ํ์ผ:
data/{myAppId}/reports/preview-state.json
-
๋ฐฑ๋ก๊ทธ ํธ์ง ์ ์ฅ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
GET /api/backlog/:appIdPUT /api/backlog/:appId- ์์ฒญ/์๋ต์
items[].evidenceReviewIds๋ scoped ID(sourceToken::reviewId)๋ฅผ ์ฌ์ฉํฉ๋๋ค. - ์ ์ฅ ํ์ผ:
data/{myAppId}/reports/backlog.ko.json
-
npm run report:preview -- [options] -
node dist/previewReport.js ...
#CLI ์ต์
--my-app(์ ํ): ๋์๋ณด๋ ํํฐ--registered-apps-path--file: ๋จ์ผ ํ์ผ ๋ชจ๋ ๊ฒฝ๋ก--data-dir(๊ธฐ๋ณธ๊ฐ:data/)--host(๊ธฐ๋ณธ๊ฐ:127.0.0.1)--port(๊ธฐ๋ณธ๊ฐ:4173)
#์์
npm run report:preview -- --port 4173
npm run report:preview -- --my-app aurora-eos --port 4173
npm run report:preview -- --file data/aurora-eos/reports/competitor-raw-actionable.ko.html --port 4173 # ๋ ๊ฑฐ์ ๋ชจ๋