hospital
/opt/assistantโ ๋ํ ๊ณ ๋ํ 5์ข + ํ์ 8์ข ์ ๋ผ์ด๋ธ ๋ฐฐํฌยท๊ฒ์ฆ. ์์ CEO /sprint ๋ฐฉ์, ์ ๋ถ ๊ทผ๋ณธ ํด๊ฒฐ.
hospital ์๋ฒ์ assistant.starium.site(AI ํตํฉ ์ผ์ ๊ด๋ฆฌ ํ๋ซํผ: web Next15 44p + api-gateway NestJS + ai-service FastAPI + mcp-server)์ ๋ํด ํ๋ฃจ ๋์ 4๋ ๋ํ ๊ณ ๋ํ์ ๊ทธ ํ์ ์์ ์ ๊ทผ๋ณธ ํด๊ฒฐ ๋ฐฉ์์ผ๋ก ๋ผ์ด๋ธ ๋ฐฐํฌํ๋ค. ๊ฐ ์์ ์ ํค๋๋ฆฌ์ค E2E ๋๋ ๋ผ์ด๋ธ ๊ฒ์ฆ์ ๊ฑฐ์ณค์ผ๋ฉฐ, ๋ฌดํ๊ท๋ฅผ ํ์ธํ๋ค.
| Wave | ์์ | ์ปค๋ฐ | ์ํ |
|---|---|---|---|
| 4 | <html lang> ํ๋์ฝ๋ฉ ๊ทผ๋ณธ์์ |
27ee6af | โ ๋ผ์ด๋ธ |
| 5 | ์ปค๋จธ์ค ์๋ + @IsUUID cuid๋ฒ๊ทธ ๊ทผ๋ณธ์์ |
f7bd255 | โ ๋ผ์ด๋ธ |
| 6 | ์ปค์คํ i18n โ next-intl ์ด๊ด (+react ์ด์ค๋ณธ) | cfaea3c | โ ๋ผ์ด๋ธ |
| 7 | Pipecat ์ค์๊ฐ ์์ฑ ํ์ดํ๋ผ์ธ | 9f66bf5 | โ ๋ผ์ด๋ธ |
| 8 | ์ค์ MCP 2.0 ์๋ฒ (fastmcp) | d4031bc | โ |
| 8b | MCP ์๋ฒ ๊ณต๊ฐ ๋ ธ์ถ | 163494d | โ ๊ณต๊ฐ |
| 8c | MCP ๋ฏธ๋ฑ๋ก 6 atom ๋ฐฐ์ โ 19ํด | 44b883a | โ |
| 9 | Agent Skills(SKILL.md) MCP ํ๋กฌํํธ | ab41572 | โ |
| 9b | ์น SkillBuilder SKILL.md import/export | 6cfc926 | โ |
| 9c | react_agent SKILL.md ๋ฐ๋ | bbfbf3e | โ |
| 9d | UserSkill.settings ์๋ณธ SKILL.md ๋ณด์กด | ec180c0 | โ |
| 9e | react_agent DB ์ฌ์ฉ์์คํฌ ๋ฐ๋ | d7e5e7c | โ |
| 9f | ์คํฌ hot-reload | fe313bd | โ |
<html lang> ํ๋์ฝ๋ฉ ๊ทผ๋ณธ์์ ๋ฃจํธ app/layout.tsx๊ฐ ์ ๋ก์ผ์ผ์ lang="ko"๋ฅผ ๊ณ ์ ๋ฐ๊ธ โ en/ja/zh/vi/th ์ฌ์ฉ์์ ์คํฌ๋ฆฐ๋ฆฌ๋ยท๊ฒ์์์ง์ ์๋ชป๋ ์ธ์ด ์ ํธ. Next 15 ๋ฃจํธ layout์ [lang] param ์ ๊ทผ ๋ถ๊ฐํ๋ฏ๋ก middleware๊ฐ ํ์ฑ ๋ก์ผ์ผ์ x-lang ์์ฒญํค๋๋ก ์ ํ โ ๋ฃจํธ layout์ด headers()๋ก ์ฝ์ด <html lang={lang}> ๋์ ํ.
๊ฒ์ฆ: 6๋ก์ผ์ผ /login 200 + ์ ํํ lang (ko/en/ja/zh/vi/th ๋ผ์ด๋ธ curl E2E).
@IsUUID cuid ๋ฒ๊ทธshops ์นดํ๋ก๊ทธ 0๊ฑด์ผ๋ก ์ฅ๋ฐ๊ตฌ๋โ์ฃผ๋ฌธ E2E๊ฐ ๋ถ๊ฐํ๋ค. ์๋(๋ฉฑ๋ฑ upsert: ์์ 3ยท์นดํ ๊ณ ๋ฆฌ9ยท์ํ16)๋ฅผ ๋ฃ์ ์ง์ง ์์ธ์ด ๋๋ฌ๋ฌ๋ค.
@IsUUID() 17๊ณณ์ด ์ค์ cuid id๋ฅผ ๊ฑฐ๋ถ. ์คํค๋ง ์ ์ฒด @default(uuid())=0 ยท @default(cuid())=184 โ ๋ชจ๋ id๊ฐ cuid์ธ๋ฐ ๊ฒ์ฆ๊ธฐ๊ฐ UUID๋ฅผ ๊ฐ์ โ cart/order/review/follow/ํํธ๋์น์ธ ์ write๊ฐ 400. @IsUUID()โ@IsString().@IsUUID()๋ฅผ id์ ๋ถ์ด๋ฉด ์กฐ์ฉํ ์ write API๊ฐ ๊นจ์ง๋ค.๊ฒ์ฆ(E2E): loginโcart(โฉ147,000ยท๋ฌด๋ฃ๋ฐฐ์ก)โ์ฃผ๋ฌธ ORDMRPY6IWD10ยทpointsEarned 3830(์ ํ)โ์ฌ๊ณ ๊ฐ์ยท์๋ธ์๊ณ ๋ฐฐ์ก๋น โฉ3,000.
438KB ์ปค์คํ
React-context i18n(74ํ์ผ์ด useTranslation() ์ฌ์ฉ)์ ์คํธ๋ญ๊ธ๋ฌ-ํผ๊ทธ shim์ผ๋ก ์ด๊ด: ์์ง๋ง next-intl๋ก ๊ต์ฒดํ๊ณ useTranslation() API ์๊ทธ๋์ฒ๋ฅผ ์ ์งํด 74๊ฐ ํธ์ถ๋ถ๋ฅผ ๋ฌด์์ . t()๋ .raw()๋ก ์๋ฌธ ๋ฐํ(๋ณด๊ฐ ์์ด ICU ํน์๋ฌธ์ ์์ ).
react@18.3.1 vs web 19.2.7)์ผ๋ก next-intl ํด๋ผ ์ปจํ
์คํธ๊ฐ useContext null ํฌ๋์. root package.json overrides์ react/react-dom=19.2.7 ๋จ์ผํ.--install-strategy=nested๊ฐ ํธ๋ฆฌ ํ๊ดด(React #31) โขplugin/config ํ์(๋ฐํ์ 500) โฃ์๋ฒโํด๋ผ ํจ์ props ๊ธ์ง.๊ฒ์ฆ: 6๋ก์ผ์ผ ์ค๋ฒ์ญ ๋ ๋ยทํค๋์ถ 0ยท18ํ์ด์ง sweep 200ยทtsc0ยทbuild0.
ํ๋ก ํธ์ ์คํธ๋ฆฌ๋ฐ ์์ฑ UI(voiceSocket.ts+VoiceAgentButton)๋ ์์์ผ๋ ๋ฐฑ์๋๊ฐ ์์๋ค. Pipecat๋ก ๊ตฌ์ถ:
๋ธ๋ผ์ฐ์ WS โ VAD(Silero onnx, torch ๋ถํ์) โ Groq STT(Whisper)
โ Groq LLM(Llama) โ edge-tts(๋ฌด๋ฃ) โ ์ค๋์ค ์ฌ์ [์ ๊ณผ์ ์คํธ๋ฆฌ๋ฐ]
STT/LLM์ ๊ธฐ์กด Groq ํค, TTS๋ edge-tts(๋ฌด๋ฃ). ํ๋ก ํธ voiceSocket.ts๋ฅผ socket.ioโraw WS๋ก ๊ต์ฒด(์ธํฐํ์ด์ค ์ ์ง). ์ธํ๋ผ: systemd PrivateTmp(ffmpeg)ยทNLTK_DATAยท--host 0.0.0.0, nginx /voice/ws WS ํ๋ก์.
VADProcessor(TransportParams ์๋)ยท์ ์ฌ๋ TranscriptTap ๋ฆด๋ ์ดยทffmpeg๋ PrivateTmpยทdockerโํธ์คํธ๋ 0.0.0.0.๊ฒ์ฆ(ํฉ์ฑ์ค๋์ค E2E, ๊ณต๊ฐ wss): ์ธ์ฌ๋งโํ๊ตญ์ด ๋ฐํ ์คํธ๋ฆฌ๋ฐโSTT ํ๊ตญ์ด("์ค๋ ์์ธ ๋ ์จ ์ด๋์?")โLLM ํ๊ตญ์ด ์๋ตโTTS ์๋ณต PASS. (๋ธ๋ผ์ฐ์ ๋ง์ดํฌ E2E๋ ์๋ ํ์ธ ์์ฌ)
๊ธฐ์กด mcp-server(NestJS)๋ REST /tools API์ผ ๋ฟ MCP ํ๋กํ ์ฝ์ด ์๋์๋ค. fastmcp๋ก ์ง์ง MCP ์๋ฒ(streamable HTTP)๋ฅผ ๊ตฌ์ถ, 19๊ฐ ๋๊ตฌ๋ฅผ ๋
ธ์ถํ๊ณ ์คํ์ ๊ธฐ์กด :7003 /tools/execute๋ก ํ๋ก์(NestJS ๋ฌด์์ ).
https://assistant.starium.site/mcp (x-api-key ์ธ์ฆ). fastmcp host=0.0.0.0 + UFW 172.16/12โ7009(docker๋ง ํ์ฉยท์ธ๋ถ ์ฐจ๋จ, ์ฌ์ฉ์ ์น์ธ) + nginx /mcp(SSE).@prisma/client ๋ฏธ์์ฑ(node_modules ์ฒ๋) ๊ทผ๋ณธ์์ ..mjs ๋ณ๋ ์คํ.๊ฒ์ฆ(MCP SDK ํด๋ผ์ด์ธํธ): initializeยทtools/list 19ยทtools/call ์ค๋ฐ์ดํฐยทํค็ก 401.
๊ธฐ์กด skills ๊ธฐ๋ฅ์ tool-chain ๋งคํฌ๋ก์ผ ๋ฟ Anthropic Agent Skills(SKILL.md) ํ์ค ๋ฏธ์ง์. ์ ์โ์ ์ฅโ๋ฐ๋โhot-reload ์ ์ฒด ํ๋ฆ์ ์์ฑํ๋ค. ์ธ ์๋น์(MCPยท์นยท์์ด์ ํธ)๊ฐ ๊ฐ์ apps/mcp-server/skills/ ๋๋ ํ ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ค.
| # | ์์ | ํต์ฌ |
|---|---|---|
| 9 | MCP ํ๋กฌํํธ ๋ ธ์ถ | SKILL.md 4์ข
โaddPrompt(progressive disclosure: list=name+desc, get=๋ณธ๋ฌธ) |
| 9b | ์น SkillBuilder import/export | lib/skillMd.ts ๋ผ์ด๋ํธ๋ฆฝ(frontmatter+mco:steps JSON๋ธ๋ก) |
| 9c | react_agent ๋ฐ๋ | ์์คํ ํ๋กฌํํธ์ ์นดํ๋ก๊ทธ+๋งค์นญ์คํฌ ์ ์ฐจ ์ฃผ์ |
| 9d | ์๋ณธ SKILL.md ๋ณด์กด | UserSkill.settings์ ์๋ณธ prose ์ ์ฅ |
| 9e | DB ์ฌ์ฉ์์คํฌ ๋ฐ๋ | asyncpg๋ก user_skills ์กฐํ, ์ ์ญ+์ฌ์ฉ์ ๋ณํฉ |
| 9f | hot-reload | MCP fs.watchโaddPrompt ์ฌํธ์ถ(๋ฌด์ฌ์์ยทlist_changed), ํ์ด์ฌ mtime ์บ์ |
ํต์ฌ ๊ฒ์ฆ: ๋ผ์ด๋ธ /api/v1/agent/run "Give me my morning briefing" โ ์์ด์ ํธ thought = "the morning-briefing skill is active. first step call get_current_time" โ ์คํฌ ์ ์ฐจ๋๋ก ๋๊ตฌ ์คํยท์คํฌ ์ถ๋ ฅํฌ๋งท๋๋ก ๋ต๋ณ. = SKILL.md๊ฐ ์ค์ ์์ด์ ํธ ํ๋์ ์ ๋ํจ์ ์ค์ฆ. quick-note SKILL.md ์ถ๊ฐโ๊ณต๊ฐ prompts/list ์ฆ์ 5(๋ฌด์ฌ์์).
removePrompt ๋ถ์ฌ โ ์คํฌ ํ์ผ ์ญ์ ๋ hot-reload ๋ถ๊ฐ(์ฌ์์ ํ์, ๋ก๊ทธ ํ๊ธฐ). ์ถ๊ฐ/์์ ์ ์ฆ์ ๋ฐ์.https://assistant.starium.site (6๋ก์ผ์ผ ์ ํ lang), /mcp (MCP 2.0, 19ํด + 4 Agent Skills ํ๋กฌํํธ), /voice/ws (์ค์๊ฐ ์์ฑ wss)์ด๋ฒ ์คํ๋ฆฐํธ๋ฅผ star365 HQ์ ๋ชจ๋ ๊ณต๊ฐ ์ฑ๋์ ๊ฐ ์๋น์ค ์ฑ๊ฒฉ์ ๋ง๊ฒ ๋ฐ์ํ๋ค. ์ด ๋ฆฌํฌํธ ํ๋์์ ์ ๋ฐ์ ์ง์ ์ผ๋ก ์ด์ด์ง๋ค.
| # | ์ฑ๋ | ๋ฐ์ ํํ | ๋งํฌ |
|---|---|---|---|
| 1 | docs ํ | ์๋จ featured ์นด๋ | https://docs.star365.site/ |
| 2 | docs 04-report | ์ธ์ ๋ฆฌํฌํธ(๋ณธ ๋ฌธ์) | https://docs.star365.site/04-report/assistant-starium-advanced-sprint-20260718.report |
| 3 | AI ์ง์ ๋ช ๋ถ | "๋ฐฐํฌ ์๋ํ" KPI + ๋งํฌ | https://docs.star365.site/ai-employees/18 |
| 4 | 8 ๋ณธ๋ถ์ฅ | "์ธํ๋ผ ๋ณธ๋ถ์ฅ" ์๋ฃ ํ์คํฌ | https://docs.star365.site/departments/infra-lead |
| 5 | admin ๊ด์ | ๋์๋ณด๋ ์๋จ ๋ฐฐ๋ | https://admin.star365.site/ |
| 6 | status ํฌ์ค | assistant + MCP ์๋ํฌ์ธํธ ๋ชจ๋ํฐ๋ง | https://status.star365.site/ |
| 7 | ceo Command | ํ์๋ผ์ธ + ์๋ฆผ | https://ceo.star365.site/ |
| 8 | team Multica | ์๋ฃ ์ด์ (#5) | https://team.star365.site/ |
| 9 | models ๋ฒค์น | "์ค์ ์ ์ฉ" ๋ฐฐ๋(์ฑํ ๋ชจ๋ธ ์คํ) | https://models.star365.site/ |
| 10 | api ๋ธ๋ฆฟ์ง | latestSprint API |
https://api.star365.site/hq/latest-sprint |
| 11 | obs Langfuse | ์คํ๋ฆฐํธ trace(6 span + score) | https://obs.star365.site/ |
| 12 | translate PWA | ์ค์น ๋๋ฉ ๋ฐฐ๋ + CHANGELOG | https://translate.star365.site/app-install.html |
| โ | members ํ์ | ๋ง์ดํ์ด์ง ์๋น์ค ์ ๋ฐ์ดํธ(ํ์์ฉ) | https://members.star365.site/me |
HQ ๊ด์ ยท๋ฌธ์ยท์์ฌ๊ฒฐ์ ยทํ์ ยท๋ฒค์นยทAPIยทLLM๊ด์ ์ฑ๋์ ์์ธ ๋ฆฌํฌํธ๋ฅผ, ํ์ ํ์ด์ง์ ํ์์ฉ ์๋น์ค ์๋ด๋ฅผ ๋ฐ์(๋ด๋ถ ๋ก๊ทธ ๋น๋ ธ์ถ).
@IsUUID()๋ฅผ id์ ๋ถ์ด๋ฉด ์ write API๊ฐ ์กฐ์ฉํ ๊นจ์ง๋ค.prisma generate ์ฌ์คํ โ ์ ํ๋ฉด prisma ์ฐ๋ ์๋น์ค๊ฐ ๋ค์ ์ฌ์์์ ์ฃฝ๋๋ค..mjs ๋ณ๋ ์คํ.${}) โ ssh "..." ์์์ ๋ช
๋ น์นํ์ผ๋ก ํ์ผ ๊นจ์ง. ์ ์ฒด ํ์ผ ๋ก์ปฌ ์์ฑ + scp๊ฐ ์ ๋ต.--host 0.0.0.0 ๋ฐ์ธ๋ ํ์(loopback์ด๋ฉด 502).