๐Ÿ“– star365 Docs
โ† ๋ณด๊ณ ์„œ ๋ชฉ๋ก

assistant.starium.site ๊ณ ๋„ํ™” ์Šคํ”„๋ฆฐํŠธ (2026-07-18)

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 ๋˜๋Š” ๋ผ์ด๋ธŒ ๊ฒ€์ฆ์„ ๊ฑฐ์ณค์œผ๋ฉฐ, ๋ฌดํšŒ๊ท€๋ฅผ ํ™•์ธํ–ˆ๋‹ค.

์ž‘์—… ์š”์•ฝ (Wave4 ~ Wave9f)

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 โœ…

Wave4 โ€” <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).

Wave5 โ€” ์ปค๋จธ์Šค ์‹œ๋“œ + @IsUUID cuid ๋ฒ„๊ทธ

shops ์นดํƒˆ๋กœ๊ทธ 0๊ฑด์œผ๋กœ ์žฅ๋ฐ”๊ตฌ๋‹ˆโ†’์ฃผ๋ฌธ E2E๊ฐ€ ๋ถˆ๊ฐ€ํ–ˆ๋‹ค. ์‹œ๋“œ(๋ฉฑ๋“ฑ upsert: ์ƒ์ 3ยท์นดํ…Œ๊ณ ๋ฆฌ9ยท์ƒํ’ˆ16)๋ฅผ ๋„ฃ์ž ์ง„์งœ ์›์ธ์ด ๋“œ๋Ÿฌ๋‚ฌ๋‹ค.

๊ฒ€์ฆ(E2E): loginโ†’cart(โ‚ฉ147,000ยท๋ฌด๋ฃŒ๋ฐฐ์†ก)โ†’์ฃผ๋ฌธ ORDMRPY6IWD10ยทpointsEarned 3830(์ •ํ™•)โ†’์žฌ๊ณ ๊ฐ์†Œยท์„œ๋ธŒ์ž„๊ณ„ ๋ฐฐ์†ก๋น„ โ‚ฉ3,000.

Wave6 โ€” ์ปค์Šคํ…€ i18n โ†’ next-intl ์ด๊ด€

438KB ์ปค์Šคํ…€ React-context i18n(74ํŒŒ์ผ์ด useTranslation() ์‚ฌ์šฉ)์„ ์ŠคํŠธ๋žญ๊ธ€๋Ÿฌ-ํ”ผ๊ทธ shim์œผ๋กœ ์ด๊ด€: ์—”์ง„๋งŒ next-intl๋กœ ๊ต์ฒดํ•˜๊ณ  useTranslation() API ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์œ ์ง€ํ•ด 74๊ฐœ ํ˜ธ์ถœ๋ถ€๋ฅผ ๋ฌด์ˆ˜์ •. t()๋Š” .raw()๋กœ ์›๋ฌธ ๋ฐ˜ํ™˜(๋ณด๊ฐ„ ์—†์–ด ICU ํŠน์ˆ˜๋ฌธ์ž ์•ˆ์ „).

๊ฒ€์ฆ: 6๋กœ์ผ€์ผ ์‹ค๋ฒˆ์—ญ ๋ Œ๋”ยทํ‚ค๋ˆ„์ถœ 0ยท18ํŽ˜์ด์ง€ sweep 200ยทtsc0ยทbuild0.

Wave7 โ€” Pipecat ์‹ค์‹œ๊ฐ„ ์Œ์„ฑ ํŒŒ์ดํ”„๋ผ์ธ

ํ”„๋ก ํŠธ์— ์ŠคํŠธ๋ฆฌ๋ฐ ์Œ์„ฑ 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 ํ”„๋ก์‹œ.

๊ฒ€์ฆ(ํ•ฉ์„ฑ์˜ค๋””์˜ค E2E, ๊ณต๊ฐœ wss): ์ธ์‚ฌ๋งโ†’ํ•œ๊ตญ์–ด ๋ฐœํ™” ์ŠคํŠธ๋ฆฌ๋ฐโ†’STT ํ•œ๊ตญ์–ด("์˜ค๋Š˜ ์„œ์šธ ๋‚ ์”จ ์–ด๋•Œ์š”?")โ†’LLM ํ•œ๊ตญ์–ด ์‘๋‹ตโ†’TTS ์™•๋ณต PASS. (๋ธŒ๋ผ์šฐ์ € ๋งˆ์ดํฌ E2E๋Š” ์ˆ˜๋™ ํ™•์ธ ์ž”์—ฌ)

Wave8 โ€” ์‹ค์ œ MCP 2.0 ์„œ๋ฒ„ (fastmcp)

๊ธฐ์กด mcp-server(NestJS)๋Š” REST /tools API์ผ ๋ฟ MCP ํ”„๋กœํ† ์ฝœ์ด ์•„๋‹ˆ์—ˆ๋‹ค. fastmcp๋กœ ์ง„์งœ MCP ์„œ๋ฒ„(streamable HTTP)๋ฅผ ๊ตฌ์ถ•, 19๊ฐœ ๋„๊ตฌ๋ฅผ ๋…ธ์ถœํ•˜๊ณ  ์‹คํ–‰์€ ๊ธฐ์กด :7003 /tools/execute๋กœ ํ”„๋ก์‹œ(NestJS ๋ฌด์ˆ˜์ •).

๊ฒ€์ฆ(MCP SDK ํด๋ผ์ด์–ธํŠธ): initializeยทtools/list 19ยทtools/call ์‹ค๋ฐ์ดํ„ฐยทํ‚ค็„ก 401.

Wave9 โ€” Agent Skills (SKILL.md) 6๊ฐ ์™„๊ฒฐ

๊ธฐ์กด 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(๋ฌด์žฌ์‹œ์ž‘).


์ตœ์ข… ์ƒํƒœ

HQ ์ „ ์ฑ„๋„ ๋ฐ˜์˜ ํ˜„ํ™ฉ (12 ์ฑ„๋„)

์ด๋ฒˆ ์Šคํ”„๋ฆฐํŠธ๋ฅผ 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๊ด€์ œ ์ฑ„๋„์—” ์ƒ์„ธ ๋ฆฌํฌํŠธ๋ฅผ, ํšŒ์› ํŽ˜์ด์ง€์—” ํšŒ์›์šฉ ์„œ๋น„์Šค ์•ˆ๋‚ด๋ฅผ ๋ฐ˜์˜(๋‚ด๋ถ€ ๋กœ๊ทธ ๋น„๋…ธ์ถœ).

๊ตํ›ˆ (์žฌ์‚ฌ์šฉ)

  1. Prisma id๋Š” cuid โ€” @IsUUID()๋ฅผ id์— ๋ถ™์ด๋ฉด ์ „ write API๊ฐ€ ์กฐ์šฉํžˆ ๊นจ์ง„๋‹ค.
  2. node_modules ๋Œ€๋Ÿ‰ ์žฌ์„ค์น˜(npm install/override) ํ›„์—” prisma generate ์žฌ์‹คํ–‰ โ€” ์•ˆ ํ•˜๋ฉด prisma ์“ฐ๋Š” ์„œ๋น„์Šค๊ฐ€ ๋‹ค์Œ ์žฌ์‹œ์ž‘์— ์ฃฝ๋Š”๋‹ค.
  3. fastmcp๋Š” ESM-only โ€” CJS NestJS์— ํ†ตํ•ฉ ๋ถˆ๊ฐ€, .mjs ๋ณ„๋„ ์‹คํ–‰.
  4. bash heredoc + JS ํ…œํ”Œ๋ฆฟ๋ฆฌํ„ฐ๋Ÿด(๋ฐฑํ‹ฑ/${}) โ€” ssh "..." ์•ˆ์—์„œ ๋ช…๋ น์น˜ํ™˜์œผ๋กœ ํŒŒ์ผ ๊นจ์ง. ์ „์ฒด ํŒŒ์ผ ๋กœ์ปฌ ์ž‘์„ฑ + scp๊ฐ€ ์ •๋‹ต.
  5. Silero VAD๋Š” 8k/16k๋งŒ โ€” ๋ธŒ๋ผ์šฐ์ € ์บก์ฒ˜๋ฅผ 16k๋กœ ๋งž์ถฐ์•ผ ํ•œ๋‹ค.
  6. docker nginxโ†’ํ˜ธ์ŠคํŠธ๋Š” --host 0.0.0.0 ๋ฐ”์ธ๋“œ ํ•„์ˆ˜(loopback์ด๋ฉด 502).

๋‚จ์€ ๊ฒƒ (์†Œ๊ทœ๋ชจยท๋น„๊ธด๊ธ‰)