โ์ดํด~ ๊ฑฐ๋ถ์ด๋๊ฒ ๋ค~โ ์์๋ฆฌํ ์์ธ ๊ต์ ์๋ฆผ ์ฑ (macOS ๋ฉ๋ด๋ฐ ์์ฃผ)
์ฌ์ฉ์๋ผ๋ฉด ๐ DOWNLOAD.md ์์ ์ค์น ๊ฐ์ด๋๋ฅผ ํ์ธํ์ธ์.
| ์นฉ | ๋ฐ๋ก ๋ค์ด๋ก๋ |
|---|---|
| ๐ Apple Silicon (M1/M2/M3/M4) | TurtleAlert-arm64.dmg |
| ๐ป Intel Mac | TurtleAlert-x64.dmg |
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| ์ฑ ์ด๋ฆ | ๊ฑฐ๋ถ์ด๊ฒฝ๋ณด |
| ํ๋ก์ ํธ๋ช | turtle-alert |
| ํ๋ซํผ | macOS (Electron) |
| ํ์ | ๋ฉ๋ด๋ฐ ์์ฃผ ์ฑ (์ฐฝ ์์, Dock ์จ๊น) |
| ์ค์น ์์น | /Applications/๊ฑฐ๋ถ์ด๊ฒฝ๋ณด.app |
| ์คํ ์คํฌ๋ฆฝํธ | pnpm dev |
| ์ ์ฅ์ | project-hh-com/turtle-alert |
| ์ด์/๊ฑด์ | GitHub Issues |
๐ข 29:59)electron-store ์ฌ์ฉ| ์ด๋ชจ์ง | ์ด๋ฆ | ์ค๋ช |
|---|---|---|
| ๐ง | ๋ชฉ ์ข์ฐ ์คํธ๋ ์นญ | ๊ณ ๊ฐ๋ฅผ ์ฒ์ฒํ ์ข์ฐ๋ก ๊ธฐ์ธ์ฌ 10์ด์ฉ ์ ์ง |
| ๐ช | ์ด๊นจ ์ผ์ฑ | ์ด๊นจ๋ฅผ ๊ท๊น์ง ์ฌ๋ ธ๋ค ๋จ์ด๋จ๋ฆฌ๊ธฐ (5ํ) |
| ๐ข | ๊ณ ๊ฐ ๋ค๋ก | ํฑ์ ๋ค๋ก ๋น๊ฒจ ์ด์คํฑ ๋ง๋ค๊ณ 10์ด ์ ์ง |
| ๐ | ๊ฐ์ด ํด๊ธฐ | ์์ ๊น์ง ๋ผ๊ณ ๊ฐ์ด ํ์ง ํด๊ธฐ |
| ๐ | ๋ ์ด๋ | 20-20-20 ๊ท์น (6m ๋ฐ 20์ด ๋ฐ๋ผ๋ณด๊ธฐ) |
| ๐ | ํ๋ฆฌ ๋นํ๊ธฐ | ์์์ ์์ ์ฑ ์์ฒด ์ข์ฐ ๋นํ๊ธฐ |
| ๐ค | ์๋ชฉ ์คํธ๋ ์นญ | ์๊ฐ๋ฝ ๋น๊ฒจ ์๋ชฉ ์คํธ๋ ์นญ |
| ๐ถ | ์ผ์ด์๊ธฐ | ์๋ฆฌ์์ ์ผ์ด๋ 30์ด ์ ์๋ฆฌ ๊ฑธ์ |
turtle-alert/
โโโ main.js # Electron ๋ฉ์ธ ํ๋ก์ธ์ค (ํธ๋ ์ด, ํ์ด๋จธ, ์๋ฆผ)
โโโ lib.js # ์ฑ ์ฝ์ด ๋ก์ง (ํ์ด๋จธ, ์๋ฆผ, ์์ธ ๊ฐ์ ํตํฉ)
โโโ lib/
โ โโโ posture-detector.js # ์์ธ ํ์ ์์ ๋ก์ง (์บ๋ฆฌ๋ธ๋ ์ด์
, 8๊ฐ์ง ๊ฐ์ง)
โ โโโ posture-capture.js # ์นด๋ฉ๋ผ/TensorFlow.js ์์กด ํจ์
โโโ __tests__/ # Vitest ํ
์คํธ (์ปค๋ฒ๋ฆฌ์ง 80%+)
โโโ package.json # ํ๋ก์ ํธ ์ค์ + electron-builder ์ค์
โโโ assets/
โ โโโ icon.svg # ์๋ณธ ์์ด์ฝ (SVG)
โ โโโ icon.png # ์ฑ ์์ด์ฝ (512x512 PNG, ์๋ icns ๋ณํ)
โโโ dist/ # ๋น๋ ๊ฒฐ๊ณผ๋ฌผ (.app, .dmg, .zip)
| ์์ญ | ๊ธฐ์ |
|---|---|
| ๋ฐํ์ | Electron 41 |
| ์ ์ฅ์ | electron-store |
| AI | TensorFlow.js + MoveNet (๋ก์ปฌ ์ถ๋ก ) |
| ์นด๋ฉ๋ผ | imagesnap (macOS CLI) |
| ๋น๋ | electron-builder |
| ํ ์คํธ | Vitest + v8 coverage (80%+) |
| ํจํค์ง ๋งค๋์ | pnpm |
@mediapipe/pose ๋ ์ถ๊ฐํ์ง๋ง ์ค์ ๋ก๋ @tensorflow/tfjs-backend-cpu ๋ ๋น ์ ธ์์ด createDetector ๋จ๊ณ์์ โNo backend found in registryโ ๋ก ์คํจํ๋ ๋ฌธ์ . ๋ฐฑ์๋ ํจํค์ง ์ถ๊ฐ + tf.setBackend('cpu') / tf.ready() ๋ช
์ ํธ์ถ@mediapipe/pose ๊ฐ ํ๋ก๋์
๋น๋์์ ๋๋ฝ๋์ด ํธ๋ ์ด์์ AI ์์ธ ๊ฒ์ฌ๋ฅผ ์ผค ๋ โTensorFlow.js ๋ชจ๋ธ์ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋คโ ์๋ฌ๊ฐ ๋๋ ๋ฌธ์ ํด๊ฒฐ. ์์ธํ ์์ธ๊ณผ ๋๋ฒ๊น
๊ณผ์ ์ docs/2026-04-24-ai-posture-mediapipe.md ์ฐธ๊ณ TurtleAlert) ์ผ๋ก ๋๋, CFBundleDisplayName + .lproj ๋ก์ปฌ๋ผ์ด์ ์ด์
์ผ๋ก Finder/Dock/๋ฉ๋ด๋ฐ ํ์๋ฅผ ๊ฑฐ๋ถ์ด๊ฒฝ๋ณด ํ๊ธ๋ก ๋ณต์brew install imagesnap ์ ๋ฐ๋ก ํ์ง ์์๋ ์ค๋
์ท/AI ๊ธฐ๋ฅ ๋์ (v0.5.1)pnpm release:tag ์คํฌ๋ฆฝํธ๋ก ๋ฒ์ bump โ ํ๊ทธ push โ CI ์๋ ๋น๋ยท๋ฐฐํฌ (v0.5.0)TurtleAlert-arm64.dmg / TurtleAlert-x64.dmg ๋ก ๊ณ ์ ํ์ฌ releases/latest/download/ ์๊ตฌ ๋งํฌ ๋ณด์ฅ@xmldom/xmldom ์ โฅ0.8.13 ์ผ๋ก pnpm overrideposture-detector.js)๊ณผ ์นด๋ฉ๋ผ ์์กด ํจ์(posture-capture.js) ๋ถ๋ฆฌalert-or-turtle โ turtle-alertpnpm install
pnpm dev
์นฉ์ ๋ณ ๊ฐ๋ณ ๋น๋ (์ฉ๋ โ)
npx electron-builder --mac --x64 --arm64 --publish never
์ ๋๋ฒ์ค ๋น๋ (ํ ํ์ผ๋ก ํตํฉ, ์ฉ๋ โ)
npx electron-builder --mac --universal --publish never
๋น๋ ๊ฒฐ๊ณผ:
dist/mac-arm64/TurtleAlert.app โ Apple Silicon์ฉ ์ฑdist/mac/TurtleAlert.app โ Intel์ฉ ์ฑdist/TurtleAlert-X.Y.Z-arm64.dmg โ Apple Silicon DMGdist/TurtleAlert-X.Y.Z.dmg โ Intel DMGcp -R "dist/mac-arm64/TurtleAlert.app" /Applications/
Spotlight(Cmd+Space)์์ โ๊ฑฐ๋ถ์ด๊ฒฝ๋ณดโ ๊ฒ์ ํ ์คํ.
pnpm release:tag patch # 0.5.0 -> 0.5.1 (๋๋ minor / major / 0.6.0)
์คํฌ๋ฆฝํธ๊ฐ version bump โ ์ปค๋ฐ โ ํ๊ทธ โ push๊น์ง ์ฒ๋ฆฌํ๋ฉด, CI(release.yml)๊ฐ ์๋์ผ๋ก ๋น๋ + GitHub Release ์์ฑ + ์์ฐ ์ ๋ก๋๋ฅผ ์งํํฉ๋๋ค.
์์ฐ๋ช
์ TurtleAlert-arm64.dmg, TurtleAlert-x64.dmg (๋ฒ์ ์์)๋ก ๊ณ ์ ๋์ด DOWNLOAD.md์ releases/latest/download/ ๋งํฌ๊ฐ ๋ค์ ๋ฆด๋ฆฌ์ฆ์์๋ ๊ทธ๋๋ก ์๋ํฉ๋๋ค.
๋ก์ปฌ ๋น๋/์ ๋ก๋ (๋๋ฒ๊น ์ฉ):
gh release create vX.Y.Z --title "๊ฑฐ๋ถ์ด๊ฒฝ๋ณด vX.Y.Z" --notes "..."
pnpm release # ๋น๋ + rename + ์
๋ก๋
tray.setTitle("๐ข") ๋ฐฉ์์ผ๋ก ์ด๋ชจ์ง ์ง์ ํ์urgency: "critical"๋ก ์ค์ ํด ์๋ฆผ ์ผํฐ ์ ์งapp.dock.hide()๋ก Dock ์์ด์ฝ ์จ๊น โ ๋ฉ๋ด๋ฐ์๋ง ์์ฃผCannot cleanup ์๋ฌ๋ publish ์ค์ ๋๋ฝ ๊ด๋ จ์ผ๋ก, .app ์์ฑ์๋ ์ํฅ ์์