#๋ฆฌํฌํŠธ ๋ช…๋ น

#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}.json
  • data/{myAppId}/reviews-ko/.translation-cache.json

#report:render-html

์•ก์…”๋„ˆ๋ธ” ๋งˆํฌ๋‹ค์šด ๋ฆฌํฌํŠธ๋ฅผ ๊ณต์šฉ ๋ทฐ์–ด์šฉ bundle JSON์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • npm run report:render-html -- --my-app <owner> ...
  • npm run report:render-html -- --all
  • node 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::reviewId scoped 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 -- --all
  • node 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 -- --all
  • node 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/:appId
    • PUT /api/preview-state/:appId
    • ์ €์žฅ ํŒŒ์ผ: data/{myAppId}/reports/preview-state.json
  • ๋ฐฑ๋กœ๊ทธ ํŽธ์ง‘ ์ €์žฅ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    • GET /api/backlog/:appId
    • PUT /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  # ๋ ˆ๊ฑฐ์‹œ ๋ชจ๋“œ