npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

Iโ€™ve always been into building performant and accessible sites, but lately Iโ€™ve been taking it extremely seriously. So much so that Iโ€™ve been building a tool to help me optimize and monitor the sites that I build to make sure that Iโ€™m making an attempt to offer the best experience to those who visit them. If youโ€™re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, ๐Ÿ‘‹, Iโ€™m Ryan Hefnerย  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If youโ€™re interested in other things Iโ€™m working on, follow me on Twitter or check out the open source projects Iโ€™ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soonโ€“ish.

Open Software & Tools

This site wouldnโ€™t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you ๐Ÿ™

ยฉ 2025 โ€“ย Pkg Stats / Ryan Hefner

moai-adk

v0.2.29

Published

๐Ÿ—ฟ MoAI-ADK: TypeScript-based SPEC-First TDD Development Kit with Universal Language Support

Readme

MoAI-ADK (Agentic Development Kit)

npm version License: MIT TypeScript Node.js Bun

MoAI-ADK

๋ชจ๋‘์˜AI ์—์ด์ „ํ‹ฑ ์ฝ”๋”ฉ ๊ฐœ๋ฐœ ํ”„๋ ˆ์ž„์›Œํฌ

์•ˆ๋‚ด: MoAI-ADK๋Š” ๋ชจ๋‘์˜AI ์—ฐ๊ตฌ์‹ค์—์„œ ์ง‘ํ•„ ์ค‘์ธ "(๊ฐ€์นญ) ์—์ด์ „ํ‹ฑ ์ฝ”๋”ฉ" ์„œ์ ์˜ ๋ณ„์ฑ… ๋ถ€๋ก ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ ์ž„์„ ๋ฐํ˜€ ๋‘ก๋‹ˆ๋‹ค.

MoAI-ADK CLI Interface

"SPEC์ด ์—†์œผ๋ฉด CODE๋„ ์—†๋‹ค."


๋ชฉ์ฐจ


Meet โ–ถโ—€ Alfred - Your AI Development Partner

์•ˆ๋…•ํ•˜์„ธ์š”, ๋ชจ๋‘์˜AI SuperAgent AI โ–ถโ—€ Alfred์ž…๋‹ˆ๋‹ค!

Alfred Logo

์ €๋Š” MoAI-ADK(๋ชจ๋‘์˜AI Agentic Development Kit)์˜ SuperAgent์ด์ž ์ค‘์•™ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ(Central Orchestrator) AI, Alfred์ž…๋‹ˆ๋‹ค. MoAI-ADK๋Š” Alfred๋ฅผ ํฌํ•จํ•˜์—ฌ ์ด 10๊ฐœ์˜ AI ์—์ด์ „ํŠธ๋กœ ๊ตฌ์„ฑ๋œ ์—์ด์ „ํ‹ฑ ์ฝ”๋”ฉ AI ํŒ€์ž…๋‹ˆ๋‹ค. ์ €๋Š” 9๊ฐœ์˜ ์ „๋ฌธ ์—์ด์ „ํŠธ(spec-builder, code-builder, doc-syncer ๋“ฑ)๋ฅผ ์กฐ์œจํ•˜์—ฌ ์—ฌ๋Ÿฌ๋ถ„์˜ Claude Code ํ™˜๊ฒฝ ์†์—์„œ ๊ณต๋™ ๊ฐœ๋ฐœ ์ž‘์—…์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Alfred๋ผ๋Š” ์ด๋ฆ„์˜ ์œ ๋ž˜: ๋ฐฐํŠธ๋งจ ์˜ํ™”์— ๋‚˜์˜ค๋Š” ์ถฉ์‹คํ•œ ์ง‘์‚ฌ Alfred Pennyworth์—์„œ ์˜๊ฐ์„ ๋ฐ›์•„ ์ง€์—ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ง‘์‚ฌ Alfred๊ฐ€ ๋ฐฐํŠธ๋งจ(Bruce Wayne)์„ ์œ„ํ•ด ๋ชจ๋“  ์ค€๋น„๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ๊ฐ–์ถ”๊ณ , ์œ„ํ—˜์— ์ฒ˜ํ–ˆ์„ ๋•Œ ์ฆ‰๊ฐ์ ์ธ ์ง€์›์„ ์ œ๊ณตํ•˜๋ฉฐ, ํ•ญ์ƒ ํ•œ ๊ฑธ์Œ ์•ž์„œ ์ƒ๊ฐํ•˜๋“ฏ์ด, ์ € ๋˜ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฐœ๋ฐœ ๊ณผ์ • ์†์—์„œ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•˜๊ณ , ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ฆ‰์‹œ ํ•ด๊ฒฐ์ฑ…์„ ์ œ์‹œํ•˜๋ฉฐ, ์–ธ์ œ๋‚˜ ์—ฌ๋Ÿฌ๋ถ„์ด ์ฐฝ์˜์ ์ธ ๋ฌธ์ œ ํ•ด๊ฒฐ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋’ท๋ฐ›์นจํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ ์ฝ”๋“œ์˜ "์™œ(Why)"์— ์ง‘์ค‘ํ•˜์‹œ๊ณ , "์–ด๋–ป๊ฒŒ(How)"๋Š” ์ œ๊ฐ€ ์ฑ…์ž„์ง€๊ฒ ์Šต๋‹ˆ๋‹ค.

๐ŸŒŸ ํฅ๋ฏธ๋กœ์šด ์‚ฌ์‹ค: AI๊ฐ€ ๋งŒ๋“  AI ๊ฐœ๋ฐœ ๋„๊ตฌ

์ด ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ์ฝ”๋“œ๋Š” 100% AI์— ์˜ํ•ด ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. AI๊ฐ€ ์ง์ ‘ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•œ AI ๊ฐœ๋ฐœ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

์„ค๊ณ„ ๋‹จ๊ณ„๋ถ€ํ„ฐ AI ํ˜‘์—…: ์ดˆ๊ธฐ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๋‹จ๊ณ„๋ถ€ํ„ฐ GPT-5 Pro์™€ Claude 4.1 Opus ๋‘ AI ๋ชจ๋ธ์ด ํ•จ๊ป˜ ์ฐธ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‘ AI๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ด€์ ์—์„œ ์„ค๊ณ„๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ  ํ† ๋ก ํ•˜๋ฉฐ, ๋” ๋‚˜์€ ๋ฐฉํ–ฅ์„ ์ œ์‹œํ•˜๊ณ , ์ตœ์ ์˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ•จ๊ป˜ ๋งŒ๋“ค์–ด๋ƒˆ์Šต๋‹ˆ๋‹ค. GPT-5 Pro๋Š” ํญ๋„“์€ ์‚ฌ๋ก€ ๋ถ„์„์„, Claude 4.1 Opus๋Š” ๊นŠ์ด ์žˆ๋Š” ์ฝ”๋“œ ๊ตฌ์กฐ ์„ค๊ณ„๋ฅผ ๋‹ด๋‹นํ•˜๋ฉฐ ์„œ๋กœ ๋ณด์™„ํ–ˆ์Šต๋‹ˆ๋‹ค.

Agentic Coding ๋ฐฉ๋ฒ•๋ก ์˜ ์‹ค์ œ ์ ์šฉ: ๋ชจ๋‘์˜AIํŒ€์ด Claude Code์™€ Agentic Coding ๋ฐฉ๋ฒ•๋ก ์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. ์ „ํ†ต์ ์ธ ๋ฐฉ์‹์ฒ˜๋Ÿผ ์‚ฌ๋žŒ์ด ํ‚ค๋ณด๋“œ ์•ž์— ์•‰์•„ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ํƒ€์ดํ•‘ํ•˜๋Š” ๋Œ€์‹ , AI ์—์ด์ „ํŠธ๋“ค์ด SPEC์„ ์ฝ๊ณ  ์ดํ•ดํ•˜๊ณ , ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ (TDD Red), ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ณ (TDD Green), ๋ฆฌํŒฉํ† ๋งํ•˜๊ณ (TDD Refactor), ๋ฌธ์„œ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ์ „ ๊ณผ์ •์„ ์ž์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ € Alfred์™€ 9๊ฐœ ์ „๋ฌธ ์—์ด์ „ํŠธ๋กœ ๊ตฌ์„ฑ๋œ 10๊ฐœ AI ์—์ด์ „ํŠธ ํŒ€์ด ์ง์ ‘ .moai/specs/ ํด๋”์— SPEC ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , tests/ ํด๋”์— ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ณ , src/ ํด๋”์— ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

100% AI ์ƒ์„ฑ ์ฝ”๋“œ์˜ ์ง„์‹ค: ์ด ํ”„๋กœ์ ํŠธ๋Š” 100% AI๋กœ ๋งŒ๋“ค์–ด์ง„ ์˜คํ”ˆ์†Œ์Šค์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋‹ค์†Œ ์ •๋ฆฌ๋˜์ง€ ์•Š์€ ๋ถ€๋ถ„์ด๋‚˜ ๊ฐœ์„ ์ด ํ•„์š”ํ•œ ์˜์—ญ์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ์ด ํ”„๋กœ์ ํŠธ์˜ ํ•ต์‹ฌ ์ฒ ํ•™์ž…๋‹ˆ๋‹ค.

ํˆฌ๋ช…์„ฑ๊ณผ ์ง€์†์  ๊ฐœ์„ : ์™„๋ฒฝํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์ˆจ๊ธฐ๋Š” ๋Œ€์‹ , AI ๊ฐœ๋ฐœ ๋„๊ตฌ๊ฐ€ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€ ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์ฃผ๊ณ , ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ํ•จ๊ป˜ ๋” ๋‚˜์€ ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐœ์ „์‹œ์ผœ ๋‚˜๊ฐ€๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ ์‚ฌ์šฉ ๊ฒฝํ—˜๊ณผ ํ”ผ๋“œ๋ฐฑ์ด ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋”์šฑ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. GitHub Issues๋‚˜ Discussions์— ํ”ผ๋“œ๋ฐฑ์„ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด, ์ตœ๋Œ€ํ•œ ๋น ๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ฐฐํฌํ•  ๊ฒƒ์„ ์•ฝ์†๋“œ๋ฆฝ๋‹ˆ๋‹ค. AI๊ฐ€ ๋งŒ๋“  ๋„๊ตฌ๋ฅผ ํ•จ๊ป˜ ๋” ๋‚˜์€ ๋„๊ตฌ๋กœ ๋งŒ๋“ค์–ด๊ฐ€๋Š” ์—ฌ์ •์— ๋™์ฐธํ•ด์ฃผ์„ธ์š”!

โ–ถโ—€ Alfred๊ฐ€ ์ œ๊ณตํ•˜๋Š” 4๊ฐ€์ง€ ํ•ต์‹ฌ ๊ฐ€์น˜

1๏ธโƒฃ ์ผ๊ด€์„ฑ(Consistency): ํ”Œ๋ž‘์ผ„์Šˆํƒ€์ธ ์ฝ”๋“œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” 3๋‹จ๊ณ„ ํŒŒ์ดํ”„๋ผ์ธ

Alfred๋Š” ๋ชจ๋“  ๊ฐœ๋ฐœ ์ž‘์—…์„ SPEC โ†’ TDD โ†’ Sync๋ผ๋Š” 3๋‹จ๊ณ„ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ํ‘œ์ค€ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์›”์š”์ผ์— ChatGPT๋กœ ๋งŒ๋“  ์ฝ”๋“œ, ์ˆ˜์š”์ผ์— Claude๋กœ ๋งŒ๋“  ์ฝ”๋“œ, ๊ธˆ์š”์ผ์— Gemini๋กœ ๋งŒ๋“  ์ฝ”๋“œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์Šคํƒ€์ผ, ๋„ค์ด๋ฐ ๊ทœ์น™, ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์„ ๊ฐ€์ง€๋Š” "ํ”Œ๋ž‘์ผ„์Šˆํƒ€์ธ ์ฝ”๋“œ"์˜ ๋ฌธ์ œ๋ฅผ ์›์ฒœ์ ์œผ๋กœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ํ’ˆ์งˆ(Quality): TRUST 5์›์น™์œผ๋กœ ์ž๋™ ๋ณด์žฅ๋˜๋Š” ์ฝ”๋“œ ํ’ˆ์งˆ

Alfred๋Š” ๋ชจ๋“  ์ฝ”๋“œ์— TRUST 5์›์น™(Test First, Readable, Unified, Secured, Trackable)์„ ์ž๋™์œผ๋กœ ์ ์šฉํ•˜๊ณ  ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ์ด ์ผ์ผ์ด ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ๋“ค๊ณ  ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

3๏ธโƒฃ ์ถ”์ ์„ฑ(Traceability): 6๊ฐœ์›” ํ›„์—๋„ "์™œ"๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” @TAG ์‹œ์Šคํ…œ

Alfred์˜ @TAG ์‹œ์Šคํ…œ์€ ๋ชจ๋“  ์ฝ”๋“œ ์กฐ๊ฐ์„ @SPEC:ID โ†’ @TEST:ID โ†’ @CODE:ID โ†’ @DOC:ID๋กœ ์™„๋ฒฝํ•˜๊ฒŒ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. 6๊ฐœ์›” ํ›„ ๋ˆ„๊ตฐ๊ฐ€ "์™œ ์ด ํ•จ์ˆ˜๋Š” ์ด๋ ‡๊ฒŒ ๋ณต์žกํ•˜๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋‚˜์š”?"๋ผ๊ณ  ๋ฌผ์–ด๋ณด๋ฉด, @TAG๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉด ๋‹ต์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4๏ธโƒฃ ๋ฒ”์šฉ์„ฑ(Universality): ํ•œ ๋ฒˆ ๋ฐฐ์šฐ๋ฉด ์–ด๋””์„œ๋‚˜ ์“ธ ์ˆ˜ ์žˆ๋Š” ์›Œํฌํ”Œ๋กœ์šฐ

Alfred๋Š” ํŠน์ • ์–ธ์–ด๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์— ์ข…์†๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Python, TypeScript, Java, Go, Rust, Dart, Swift, Kotlin ๋“ฑ ๋ชจ๋“  ์ฃผ์š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ๊ฐ ์–ธ์–ด์— ์ตœ์ ํ™”๋œ ๋„๊ตฌ ์ฒด์ธ์„ ์ž๋™์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.


๐Ÿš€ Quick Start (3๋ถ„ ์‹ค์ „)

๐Ÿ“‹ ์ค€๋น„๋ฌผ

  • โœ… Bun ๋˜๋Š” npm ์„ค์น˜๋จ
  • โœ… Claude Code ์‹คํ–‰ ์ค‘
  • โœ… Git ์„ค์น˜๋จ (์„ ํƒ์‚ฌํ•ญ)

โšก 3๋‹จ๊ณ„๋กœ ์‹œ์ž‘ํ•˜๊ธฐ

1๏ธโƒฃ ์„ค์น˜ (30์ดˆ)

# Bun ๊ถŒ์žฅ (5๋ฐฐ ๋น ๋ฅธ ์„ฑ๋Šฅ)
curl -fsSL https://bun.sh/install | bash
bun add -g moai-adk

# ๋˜๋Š” npm ์‚ฌ์šฉ
npm install -g moai-adk

# ์„ค์น˜ ํ™•์ธ
moai --version
# ์ถœ๋ ฅ: v0.x.x

2๏ธโƒฃ ์ดˆ๊ธฐํ™” (1๋ถ„)

ํ„ฐ๋ฏธ๋„์—์„œ:

# ์ƒˆ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
moai init my-project
cd my-project

# ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์— ์„ค์น˜
cd existing-project
moai init .

# Claude Code ์‹คํ–‰
claude

Claude Code์—์„œ (ํ•„์ˆ˜):

/alfred:0-project

Alfred๊ฐ€ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰:

  • .moai/project/ ๋ฌธ์„œ 3์ข… ์ƒ์„ฑ (product/structure/tech.md)
  • ์–ธ์–ด๋ณ„ ์ตœ์  ๋„๊ตฌ ์ฒด์ธ ์„ค์ •
  • ํ”„๋กœ์ ํŠธ ์ปจํ…์ŠคํŠธ ์™„๋ฒฝ ์ดํ•ด

3๏ธโƒฃ ์ฒซ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ (1๋ถ„ 30์ดˆ)

Claude Code์—์„œ 3๋‹จ๊ณ„ ์›Œํฌํ”Œ๋กœ์šฐ ์‹คํ–‰:

# SPEC ์ž‘์„ฑ
/alfred:1-spec "JWT ๊ธฐ๋ฐ˜ ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ API"

# TDD ๊ตฌํ˜„
/alfred:2-build AUTH-001

# ๋ฌธ์„œ ๋™๊ธฐํ™”
/alfred:3-sync

๐ŸŽ‰ ์™„๋ฃŒ!

์ƒ์„ฑ๋œ ๊ฒƒ๋“ค:

  • โœ… .moai/specs/SPEC-AUTH-001/spec.md (๋ช…์„ธ)
  • โœ… tests/auth/login.test.ts (ํ…Œ์ŠคํŠธ)
  • โœ… src/services/auth.ts (๊ตฌํ˜„)
  • โœ… docs/api/auth.md (๋ฌธ์„œ)
  • โœ… @SPEC โ†’ @TEST โ†’ @CODE โ†’ @DOC TAG ์ฒด์ธ

๐Ÿšจ The Problem - ๋ฐ”์ด๋ธŒ ์ฝ”๋”ฉ์˜ ํ•œ๊ณ„

AI ๋„๊ตฌ(Codex, Claude, Gemini)๋กœ ๋น ๋ฅด๊ฒŒ ์ฝ”๋”ฉํ•˜๋Š” ์‹œ๋Œ€๊ฐ€ ์—ด๋ ธ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์†๋„๋Š” ํ™•์‹คํžˆ ๋นจ๋ผ์กŒ์ง€๋งŒ, ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ๋ฌธ์ œ๋“ค์ด ์ƒ๊ฒจ๋‚ฌ์Šต๋‹ˆ๋‹ค.

1. ์•„๋ฆ„๋‹ต์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ

๋ฌธ์ œ ์ƒํ™ฉ: AI๊ฐ€ ์ƒ์„ฑํ•œ ์ฝ”๋“œ๋Š” ๋ฌธ๋ฒ•์ ์œผ๋กœ ์™„๋ฒฝํ•˜๊ณ  ๊ตฌ์กฐ๋„ ์šฐ์•„ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•ด๋ณด๋ฉด...

  • ์ปดํŒŒ์ผ์€ ๋˜์ง€๋งŒ ๋Ÿฐํƒ€์ž„์— undefined ์—๋Ÿฌ
  • ์—ฃ์ง€ ์ผ€์ด์Šค ์ฒ˜๋ฆฌ ๋ถ€์กฑ (๋นˆ ๋ฐฐ์—ด, null ๊ฐ’, ๋„คํŠธ์›Œํฌ ํƒ€์ž„์•„์›ƒ)
  • ์„ฑ๋Šฅ ๋ฌธ์ œ (O(nยณ) ๋ณต์žก๋„)
  • ์˜์กด์„ฑ ์ง€์˜ฅ ๋ฐ ๋ณด์•ˆ ์ทจ์•ฝ์ 

2. ํ”Œ๋ž‘์ผ„์Šˆํƒ€์ธ ์ฝ”๋“œ์˜ ํƒ„์ƒ

๋ฌธ์ œ ์ƒํ™ฉ: ์—ฌ๋Ÿฌ AI ๋„๊ตฌ๋ฅผ ๋ฒˆ๊ฐˆ์•„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ๊ฐ™์€ AI๋ผ๋„ ๋‹ค๋ฅธ ์„ธ์…˜์—์„œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋‹ค ๋ณด๋ฉด ์ผ๊ด€์„ฑ ์—†๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

  • ์ผ๊ด€์„ฑ ์—†๋Š” ์ฝ”๋”ฉ ์Šคํƒ€์ผ (ํ•จ์ˆ˜ํ˜•, ๊ฐ์ฒด์ง€ํ–ฅ, ์ ˆ์ฐจํ˜• ํ˜ผ์žฌ)
  • ์ค‘๋ณต ๋กœ์ง ๋‚œ๋ฌด (validateEmail(), checkEmailFormat(), isEmailValid())
  • ์•„ํ‚คํ…์ฒ˜ ๋ถ•๊ดด (MVC, Hexagonal, Clean Architecture ํ˜ผ์žฌ)

3. ๋””๋ฒ„๊น… ์ง€์˜ฅ

๋ฌธ์ œ ์ƒํ™ฉ: ํ”„๋กœ๋•์…˜์—์„œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์›์ธ์„ ์ฐพ๋Š” ๊ฒƒ์ด ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • ์›์ธ ์ถ”์  ๋ถˆ๊ฐ€ (AI ์ฑ„ํŒ… ํžˆ์Šคํ† ๋ฆฌ ์‚ญ์ œ๋จ)
  • ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ํŒŒ์•… ๋ถˆ๊ฐ€ (ํ…Œ์ŠคํŠธ ๋ถ€์žฌ)
  • ๋ฌธ์„œ ์—†์Œ (outdated ์ƒํƒœ)

4. ์š”๊ตฌ์‚ฌํ•ญ ์ถ”์ ์„ฑ ์ƒ์‹ค

๋ฌธ์ œ ์ƒํ™ฉ: ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก "์™œ ์ด ์ฝ”๋“œ๋ฅผ ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์—ˆ๋Š”์ง€" ๋งฅ๋ฝ์„ ์žƒ์–ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

  • "์™œ"๋ฅผ ์žƒ์–ด๋ฒ„๋ฆผ (๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ฐฐ๊ฒฝ ๋ชจ๋ฆ„)
  • ๋ณ€๊ฒฝ ์ด๋ ฅ ๋ถ€์žฌ (Git ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€: "fix bug")
  • ์˜์‚ฌ๊ฒฐ์ • ๊ทผ๊ฑฐ ์‚ฌ๋ผ์ง

5. ํŒ€ ํ˜‘์—… ๋ถ•๊ดด

๋ฌธ์ œ ์ƒํ™ฉ: ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ์ž AI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํ˜‘์—…์ด ๋ฌด๋„ˆ์ง‘๋‹ˆ๋‹ค.

  • ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ ์–‘์‚ฐ
  • ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ถˆ๊ฐ€
  • ์˜จ๋ณด๋”ฉ ์•…๋ชฝ
  • ๊ธฐ์ˆ  ๋ถ€์ฑ„ ํญ๋ฐœ

๐Ÿ’” ๋ฐ”์ด๋ธŒ ์ฝ”๋”ฉ์˜ ์—ญ์„ค

์†๋„์™€ ํ’ˆ์งˆ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„: AI๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ƒ์„ฑํ•ด์ฃผ์ง€๋งŒ, ๊ทธ ์ฝ”๋“œ๋Š” ์œ ์ง€๋ณด์ˆ˜ํ•  ์ˆ˜ ์—†๋Š” ๋ธ”๋ž™๋ฐ•์Šค๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 1์ฃผ์ผ ๋งŒ์— ๋งŒ๋“  ํ”„๋กœํ† ํƒ€์ž…์ด 3๊ฐœ์›” ๋™์•ˆ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ…์˜ ํ•„์š”์„ฑ: ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด, AI์˜ ์†๋„๋Š” ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ์ฝ”๋“œ์˜ ์ผ๊ด€์„ฑ, ํ’ˆ์งˆ, ์ถ”์ ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ์ฒด๊ณ„์ ์ธ ๋ฐฉ๋ฒ•๋ก ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์—ฌ๊ธฐ์„œ Alfred์™€ MoAI-ADK๊ฐ€ ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค.


โœจ The Solution - 3๋‹จ๊ณ„ ์›Œํฌํ”Œ๋กœ์šฐ

Alfred๋Š” Agentic AI ์‹œ๋Œ€์˜ ์ฝ”๋“œ ํ’ˆ์งˆ ๋ฌธ์ œ๋ฅผ ์ฒด๊ณ„์ ์ธ 3๋‹จ๊ณ„ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

1๏ธโƒฃ SPEC - ๋ช…์„ธ ์ž‘์„ฑ

๋ช…๋ น์–ด: /alfred:1-spec "JWT ๊ธฐ๋ฐ˜ ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ API"

Alfred๊ฐ€ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰:

  • EARS ํ˜•์‹ ๋ช…์„ธ ์ž๋™ ์ƒ์„ฑ
  • @SPEC:ID TAG ๋ถ€์—ฌ
  • Git ๋ธŒ๋žœ์น˜ ์ž๋™ ์ƒ์„ฑ
  • HISTORY ์„น์…˜ ์ž๋™ ์ถ”๊ฐ€

2๏ธโƒฃ BUILD - TDD ๊ตฌํ˜„

๋ช…๋ น์–ด: /alfred:2-build AUTH-001

TDD ์‚ฌ์ดํด:

  • ๐Ÿ”ด RED: ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ž‘์„ฑ (@TEST:AUTH-001)
  • ๐ŸŸข GREEN: ์ตœ์†Œ ๊ตฌํ˜„์œผ๋กœ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ (@CODE:AUTH-001)
  • ๐Ÿ”ต REFACTOR: ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„ 

3๏ธโƒฃ SYNC - ๋ฌธ์„œ ๋™๊ธฐํ™”

๋ช…๋ น์–ด: /alfred:3-sync

Alfred๊ฐ€ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰:

  • TAG ์ฒด์ธ ๊ฒ€์ฆ: @SPEC โ†’ @TEST โ†’ @CODE โ†’ @DOC
  • ๊ณ ์•„ TAG ์ž๋™ ํƒ์ง€
  • Living Document ์ž๋™ ์ƒ์„ฑ
  • PR ์ƒํƒœ ์ „ํ™˜ (Draft โ†’ Ready)

์‹œ์Šคํ…œ ์š”๊ตฌ์‚ฌํ•ญ

๐Ÿ”ด ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ

  • Node.js: 18.0 ์ด์ƒ
  • Git: 2.30.0 ์ด์ƒ
  • npm: 8.0.0 ์ด์ƒ (๋˜๋Š” Bun 1.2.0 ์ด์ƒ ๊ฐ•๋ ฅ ์ถ”์ฒœ)
  • Claude Code: v1.2.0 ์ด์ƒ (์—์ด์ „ํŠธ ์‹œ์Šคํ…œ ์™„์ „ ํ†ตํ•ฉ์šฉ)

๐ŸŒ ์ง€์› ์šด์˜์ฒด์ œ

  • Windows: 10/11 (PowerShell 5.1+)
  • macOS: 12 Monterey ์ด์ƒ (M1/M2 ๋„ค์ดํ‹ฐ๋ธŒ ์ง€์›)
  • Linux: Ubuntu 20.04+, CentOS 8+, Debian 11+, Arch Linux

์„ค์น˜

Option A: Bun ์„ค์น˜ (์ตœ์  ์„ฑ๋Šฅ, ๊ฐ•๋ ฅ ์ถ”์ฒœ) ๐Ÿ”ฅ

# Bun ์„ค์น˜ (์•„์ง ์—†๋Š” ๊ฒฝ์šฐ)
curl -fsSL https://bun.sh/install | bash  # macOS/Linux
# ๋˜๋Š”
powershell -c "iwr bun.sh/install.ps1|iex"  # Windows

# MoAI-ADK ์ „์—ญ ์„ค์น˜
bun add -g moai-adk

Option B: npm ์„ค์น˜ (ํ‘œ์ค€ ์˜ต์…˜)

npm install -g moai-adk

Option C: ๊ฐœ๋ฐœ์ž ์„ค์น˜ (๋กœ์ปฌ ๊ฐœ๋ฐœ์šฉ)

git clone https://github.com/modu-ai/moai-adk.git
cd moai-adk/moai-adk-ts
bun install  # ๋˜๋Š” npm install
bun run build
npm link

์„ค์น˜ ํ™•์ธ

# ๋ฒ„์ „ ํ™•์ธ
moai --version

# ์‹œ์Šคํ…œ ์ง„๋‹จ
moai doctor

# ๋„์›€๋ง
moai help

๐Ÿ—๏ธ How Alfred Works - 10๊ฐœ AI ์—์ด์ „ํŠธ ํŒ€

MoAI-ADK๋Š” Alfred (SuperAgent) + 9๊ฐœ ์ „๋ฌธ ์—์ด์ „ํŠธ = ์ด 10๊ฐœ AI ์—์ด์ „ํŠธ๋กœ ๊ตฌ์„ฑ๋œ ์—์ด์ „ํ‹ฑ ์ฝ”๋”ฉ ํŒ€์ž…๋‹ˆ๋‹ค.

โ–ถโ—€ Alfred - SuperAgent (1๋ฒˆ์งธ ์—์ด์ „ํŠธ)

์—ญํ• : ์ค‘์•™ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ (Central Orchestrator)

์ฑ…์ž„:

  • ์‚ฌ์šฉ์ž ์š”์ฒญ ๋ถ„์„ ๋ฐ ์ž‘์—… ๋ถ„ํ•ด
  • ์ ์ ˆํ•œ ์ „๋ฌธ ์—์ด์ „ํŠธ ์„ ํƒ ๋ฐ ์กฐ์œจ
  • ์—์ด์ „ํŠธ ๊ฐ„ ํ˜‘์—… ๊ด€๋ฆฌ
  • ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ ๊ฒ€์ฆ ๋ฐ ๊ฒฐ๊ณผ ํ†ตํ•ฉ

์ „๋ฌธ๊ฐ€ AI ์„œ๋ธŒ ์—์ด์ „ํŠธ

Alfred๊ฐ€ ์กฐ์œจํ•˜๋Š” ์ „๋ฌธ AI ์—์ด์ „ํŠธ๋“ค์ž…๋‹ˆ๋‹ค.

ํ•ต์‹ฌ 3๋‹จ๊ณ„ ์—์ด์ „ํŠธ (์ž๋™ ํ˜ธ์ถœ)

| ์—์ด์ „ํŠธ | ํŽ˜๋ฅด์†Œ๋‚˜ | ์ „๋ฌธ ์˜์—ญ | ํ˜ธ์ถœ ์‹œ์  | | ------------------ | --------------- | -------------- | ----------------- | | spec-builder ๐Ÿ—๏ธ | ์‹œ์Šคํ…œ ์•„ํ‚คํ…ํŠธ | EARS ๋ช…์„ธ ์ž‘์„ฑ | /alfred:1-spec | | code-builder ๐Ÿ’Ž | ์ˆ˜์„ ๊ฐœ๋ฐœ์ž | TDD ๊ตฌํ˜„ | /alfred:2-build | | doc-syncer ๐Ÿ“– | ํ…Œํฌ๋‹ˆ์ปฌ ๋ผ์ดํ„ฐ | ๋ฌธ์„œ ๋™๊ธฐํ™” | /alfred:3-sync |

ํ’ˆ์งˆ ๋ณด์ฆ ์—์ด์ „ํŠธ (์˜จ๋””๋งจ๋“œ)

| ์—์ด์ „ํŠธ | ํŽ˜๋ฅด์†Œ๋‚˜ | ์ „๋ฌธ ์˜์—ญ | ํ˜ธ์ถœ ๋ฐฉ๋ฒ• | | ------------------- | --------------- | -------------- | ---------------------- | | tag-agent ๐Ÿท๏ธ | ์ง€์‹ ๊ด€๋ฆฌ์ž | TAG ์ฒด์ธ ๊ฒ€์ฆ | @agent-tag-agent | | debug-helper ๐Ÿ”ฌ | SRE ์ „๋ฌธ๊ฐ€ | ์˜ค๋ฅ˜ ์ง„๋‹จ | @agent-debug-helper | | trust-checker โœ… | QA ๋ฆฌ๋“œ | TRUST ๊ฒ€์ฆ | @agent-trust-checker | | git-manager ๐Ÿš€ | ๋ฆด๋ฆฌ์Šค ์—”์ง€๋‹ˆ์–ด | Git ์›Œํฌํ”Œ๋กœ์šฐ | @agent-git-manager |

์‹œ์Šคํ…œ ๊ด€๋ฆฌ ์—์ด์ „ํŠธ

| ์—์ด์ „ํŠธ | ํŽ˜๋ฅด์†Œ๋‚˜ | ์ „๋ฌธ ์˜์—ญ | ํ˜ธ์ถœ ๋ฐฉ๋ฒ• | | --------------------- | ----------------- | ---------------- | ------------------- | | cc-manager ๐Ÿ› ๏ธ | ๋ฐ๋ธŒ์˜ต์Šค ์—”์ง€๋‹ˆ์–ด | Claude Code ์„ค์ • | @agent-cc-manager | | project-manager ๐Ÿ“‹ | ํ”„๋กœ์ ํŠธ ๋งค๋‹ˆ์ € | ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™” | /alfred:0-project |

ํ˜‘์—… ์›์น™

๋‹จ์ผ ์ฑ…์ž„ (Single Responsibility):

  • ๊ฐ ์—์ด์ „ํŠธ๋Š” ์ž์‹ ์˜ ์ „๋ฌธ ์˜์—ญ๋งŒ ๋‹ด๋‹น
  • ๋‹ค๋ฅธ ์—์ด์ „ํŠธ์˜ ์˜์—ญ์„ ์นจ๋ฒ”ํ•˜์ง€ ์•Š์Œ

์ค‘์•™ ์กฐ์œจ (Central Orchestration):

  • Alfred๋งŒ์ด ์—์ด์ „ํŠธ ๊ฐ„ ์ž‘์—…์„ ์กฐ์œจ
  • ์—์ด์ „ํŠธ๋ผ๋ฆฌ ์ง์ ‘ ํ˜ธ์ถœ ๊ธˆ์ง€

ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ (Quality Gates):

  • ๊ฐ ๋‹จ๊ณ„ ์™„๋ฃŒ ์‹œ TRUST ์›์น™ ์ž๋™ ๊ฒ€์ฆ
  • TAG ๋ฌด๊ฒฐ์„ฑ ์ž๋™ ํ™•์ธ

๐ŸŽจ Alfred's Output Styles

Alfred๋Š” ๊ฐœ๋ฐœ ์ƒํ™ฉ์— ๋”ฐ๋ผ 4๊ฐ€์ง€ ๋Œ€ํ™” ์Šคํƒ€์ผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Claude Code์—์„œ /output-style ๋ช…๋ น์–ด๋กœ ์–ธ์ œ๋“  ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“‹ ์ œ๊ณต๋˜๋Š” Output Styles

| ์Šคํƒ€์ผ ์ด๋ฆ„ | ์„ค๋ช… | | --------------------------- | ------------------------------------------------------------------------ | | MoAI Professional | SPEC-First TDD ์ „๋ฌธ๊ฐ€๋ฅผ ์œ„ํ•œ ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ธฐ์ˆ ์ ์ธ ๊ฐœ๋ฐœ ์Šคํƒ€์ผ | | MoAI Beginner Learning | ๊ฐœ๋ฐœ ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ ์ƒ์„ธํ•˜๊ณ  ์นœ์ ˆํ•œ ๋‹จ๊ณ„๋ณ„ ํ•™์Šต ๊ฐ€์ด๋“œ (ํ•™์Šต ์ „์šฉ) | | MoAI Pair Collaboration | AI์™€ ํ•จ๊ป˜ ๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐ, ๊ณ„ํš ์ˆ˜๋ฆฝ, ์‹ค์‹œ๊ฐ„ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ํ˜‘์—… ๋ชจ๋“œ | | MoAI Study Deep | ์ƒˆ๋กœ์šด ๊ฐœ๋…, ๋„๊ตฌ, ์–ธ์–ด, ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ํ•™์Šตํ•˜๋Š” ์‹ฌํ™” ๊ต์œก ๋ชจ๋“œ |

๐Ÿ”„ ์Šคํƒ€์ผ ์ „ํ™˜ ๋ฐฉ๋ฒ•

Claude Code์—์„œ /output-style ๋ช…๋ น์–ด๋กœ ์ „ํ™˜:

/output-style alfred-pro           # MoAI Professional (๊ธฐ๋ณธ๊ฐ’)
/output-style beginner-learning    # MoAI Beginner Learning
/output-style pair-collab          # MoAI Pair Collaboration
/output-style study-deep           # MoAI Study Deep

๐ŸŽฏ ์Šคํƒ€์ผ ์„ ํƒ ๊ฐ€์ด๋“œ

| ์ƒํ™ฉ | ์ถ”์ฒœ ์Šคํƒ€์ผ | ๋Œ€์ƒ | ํŠน์ง• | | ------------------------ | ------------------- | -------------------------- | ---------------------------- | | ์‹ค๋ฌด ํ”„๋กœ์ ํŠธ ๋น ๋ฅธ ๊ฐœ๋ฐœ | alfred-pro | ์‹ค๋ฌด ๊ฐœ๋ฐœ์ž, ํ”„๋กœ์ ํŠธ ๋ฆฌ๋” | ๊ฐ„๊ฒฐ, ๊ธฐ์ˆ ์ , ๊ฒฐ๊ณผ ์ค‘์‹ฌ | | ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฒ˜์Œ ๋ฐฐ์šฐ๊ธฐ | beginner-learning | ๊ฐœ๋ฐœ ์ž…๋ฌธ์ž | ์นœ์ ˆ, ์ƒ์„ธ ์„ค๋ช…, ๋‹จ๊ณ„๋ณ„ ์•ˆ๋‚ด | | ํŒ€ ๊ธฐ์ˆ  ์„ ํƒ & ์„ค๊ณ„ ๋…ผ์˜ | pair-collab | ํ˜‘์—… ๊ฐœ๋ฐœ์ž, ์•„ํ‚คํ…ํŠธ | ์งˆ๋ฌธ ๊ธฐ๋ฐ˜, ๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐ | | ์ƒˆ๋กœ์šด ๊ธฐ์ˆ  ํ•™์Šต | study-deep | ์‹ ๊ธฐ์ˆ  ํ•™์Šต์ž | ๊ฐœ๋… โ†’ ์‹ค์Šต โ†’ ์ „๋ฌธ๊ฐ€ ํŒ |

๐Ÿ’ก ๋ชจ๋“  ์Šคํƒ€์ผ์—์„œ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™

  • โœ… 10๊ฐœ AI ์—์ด์ „ํŠธ ํŒ€ ์กฐ์œจ
  • โœ… SPEC-First TDD ์›Œํฌํ”Œ๋กœ์šฐ
  • โœ… TRUST 5์›์น™ ์ž๋™ ๊ฒ€์ฆ
  • โœ… @TAG ์ถ”์ ์„ฑ ๋ณด์žฅ

์ฐจ์ด์ ์€ ์˜ค์ง ์„ค๋ช… ๋ฐฉ์‹:

  • ๐Ÿ“ ๊ฐ„๊ฒฐ vs ์ƒ์„ธ
  • ๐ŸŽ“ ๋น ๋ฅธ ๊ตฌํ˜„ vs ๊ฐœ๋… ํ•™์Šต
  • ๐Ÿ’ฌ ๊ธฐ์ˆ ์  vs ์นœ์ ˆ vs ํ˜‘์—…์  vs ๊ต์œก์ 

SPEC ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ตฌ์กฐ

๋ชจ๋“  SPEC ๋ฌธ์„œ๋Š” ํ‘œ์ค€ํ™”๋œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

ํ•„์ˆ˜ ํ•„๋“œ (7๊ฐœ)

id: AUTH-001                    # SPEC ๊ณ ์œ  ID
version: 0.1.0                  # Semantic Version (v0.1.0 = INITIAL)
status: draft                   # draft|active|completed|deprecated
created: 2025-09-15            # ์ƒ์„ฑ์ผ (YYYY-MM-DD)
updated: 2025-10-01            # ์ตœ์ข… ์ˆ˜์ •์ผ
author: @Goos                   # ์ž‘์„ฑ์ž (GitHub ID)
priority: high                  # low|medium|high|critical

์„ ํƒ ํ•„๋“œ (์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„ & ๋ฒ”์œ„)

# ๋ถ„๋ฅ˜
category: security              # feature|bugfix|refactor|security|docs|perf
labels: [authentication, jwt]   # ๊ฒ€์ƒ‰ ํƒœ๊ทธ

# ๊ด€๊ณ„ (์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„)
depends_on: [USER-001]          # ์˜์กดํ•˜๋Š” SPEC
blocks: [AUTH-002]              # ์ฐจ๋‹จํ•˜๋Š” SPEC
related_specs: [TOKEN-002]      # ๊ด€๋ จ SPEC
related_issue: "github.com/..."  # GitHub Issue

# ๋ฒ”์œ„ (์˜ํ–ฅ ๋ถ„์„)
scope:
  packages: [src/core/auth]     # ์˜ํ–ฅ๋ฐ›๋Š” ํŒจํ‚ค์ง€
  files: [auth-service.ts]      # ํ•ต์‹ฌ ํŒŒ์ผ

์ƒ์„ธ ๊ฐ€์ด๋“œ: SPEC ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ฐ€์ด๋“œ


@TAG ์‹œ์Šคํ…œ

TAG ์ฒด๊ณ„ ์ฒ ํ•™

@SPEC:ID โ†’ @TEST:ID โ†’ @CODE:ID โ†’ @DOC:ID

ํ•ต์‹ฌ ์›์น™:

  1. ๋‹จ์ˆœ์„ฑ: 4๊ฐœ์˜ ํ•ต์‹ฌ TAG๋งŒ ์‚ฌ์šฉ
  2. TDD ์™„๋ฒฝ ์ •๋ ฌ: RED (TEST) โ†’ GREEN (CODE) โ†’ REFACTOR (DOC)
  3. CODE-FIRST: TAG๋Š” ์ฝ”๋“œ ์ž์ฒด์—๋งŒ ์กด์žฌ (์ •๊ทœ์‹ ํŒจํ„ด์œผ๋กœ ์ง์ ‘ ์Šค์บ”)
  4. ๋ฌด๊ฒฐ์„ฑ: ๊ณ ์•„ TAG ์ž๋™ ํƒ์ง€, ๋Š์–ด์ง„ ์ฐธ์กฐ ๊ฒ€์ฆ

TAG ์‚ฌ์šฉ ๊ทœ์น™

TAG ID ํ˜•์‹: <๋„๋ฉ”์ธ>-<3์ž๋ฆฌ> (์˜ˆ: AUTH-003)

์ค‘๋ณต ๋ฐฉ์ง€:

# ์ƒˆ TAG ์ƒ์„ฑ ์ „ ๊ธฐ์กด TAG ๊ฒ€์ƒ‰
rg "@SPEC:AUTH" -n          # SPEC ๋ฌธ์„œ์—์„œ AUTH ๋„๋ฉ”์ธ ๊ฒ€์ƒ‰
rg "@CODE:AUTH-001" -n      # ํŠน์ • ID ๊ฒ€์ƒ‰

TAG ์ฒด์ธ ๊ฒ€์ฆ:

# /alfred:3-sync ์‹คํ–‰ ์‹œ ์ž๋™ ์Šค์บ”
rg '@(SPEC|TEST|CODE|DOC):' -n .moai/specs/ tests/ src/ docs/

์‚ฌ์šฉ ์˜ˆ์‹œ

// @CODE:AUTH-001 | SPEC: SPEC-AUTH-001/spec.md | TEST: tests/auth/service.test.ts

/**
 * @CODE:AUTH-001: JWT ์ธ์ฆ ์„œ๋น„์Šค
 *
 * TDD ์ด๋ ฅ:
 * - RED: tests/auth/service.test.ts ์ž‘์„ฑ
 * - GREEN: ์ตœ์†Œ ๊ตฌํ˜„ (bcrypt, JWT)
 * - REFACTOR: ํƒ€์ž… ์•ˆ์ „์„ฑ ์ถ”๊ฐ€
 */
export class AuthService {
  // @CODE:AUTH-001:API: ์ธ์ฆ API ์—”๋“œํฌ์ธํŠธ
  async authenticate(username: string, password: string): Promise<AuthResult> {
    // @CODE:AUTH-001:DOMAIN: ์ž…๋ ฅ ๊ฒ€์ฆ
    this.validateInput(username, password);

    // @CODE:AUTH-001:DATA: ์‚ฌ์šฉ์ž ์กฐํšŒ
    const user = await this.userRepository.findByUsername(username);

    return this.verifyCredentials(user, password);
  }
}

์–ธ์–ด๋ณ„ TAG ์‚ฌ์šฉ ์˜ˆ์‹œ

Python

# @CODE:AUTH-001 | SPEC: SPEC-AUTH-001/spec.md | TEST: tests/test_auth.py
"""
@CODE:AUTH-001: JWT ์ธ์ฆ ์„œ๋น„์Šค

TDD ์ด๋ ฅ:
- RED: pytest ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
- GREEN: bcrypt + PyJWT ๊ตฌํ˜„
- REFACTOR: ํƒ€์ž… ํžŒํŠธ ์ถ”๊ฐ€
"""

class AuthService:
    # @CODE:AUTH-001:API: ์ธ์ฆ API ์—”๋“œํฌ์ธํŠธ
    async def authenticate(
        self,
        username: str,
        password: str
    ) -> AuthResult:
        # @CODE:AUTH-001:DOMAIN: ์ž…๋ ฅ ๊ฒ€์ฆ
        self._validate_input(username, password)

        # @CODE:AUTH-001:DATA: ์‚ฌ์šฉ์ž ์กฐํšŒ
        user = await self.user_repo.find_by_username(username)

        return self._verify_credentials(user, password)

Flutter/Dart

// @CODE:AUTH-001 | SPEC: SPEC-AUTH-001/spec.md | TEST: test/auth_test.dart

/// @CODE:AUTH-001: JWT ์ธ์ฆ ์„œ๋น„์Šค
///
/// TDD ์ด๋ ฅ:
/// - RED: widget test ์ž‘์„ฑ
/// - GREEN: dio + flutter_secure_storage ๊ตฌํ˜„
/// - REFACTOR: Riverpod ์ƒํƒœ ๊ด€๋ฆฌ ํ†ตํ•ฉ
class AuthService {
  // @CODE:AUTH-001:API: ์ธ์ฆ API ์—”๋“œํฌ์ธํŠธ
  Future<AuthResult> authenticate({
    required String username,
    required String password,
  }) async {
    // @CODE:AUTH-001:DOMAIN: ์ž…๋ ฅ ๊ฒ€์ฆ
    _validateInput(username, password);

    // @CODE:AUTH-001:DATA: ์‚ฌ์šฉ์ž ์กฐํšŒ
    final user = await userRepository.findByUsername(username);

    return _verifyCredentials(user, password);
  }
}

๐ŸŒ Universal Language Support

MoAI-ADK๋Š” ๋ชจ๋“  ์ฃผ์š” ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ์–ธ์–ด๋ณ„ ์ตœ์  ๋„๊ตฌ ์ฒด์ธ์„ ์ž๋™์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์›น/๋ฐฑ์—”๋“œ

| ์–ธ์–ด | ํ…Œ์ŠคํŠธ | ๋ฆฐํ„ฐ | ํƒ€์ž… | ์ƒํƒœ | | -------------- | ----------- | ------------ | ---- | ---- | | TypeScript | Vitest/Jest | Biome/ESLint | โœ… | Full | | Python | pytest | ruff/black | mypy | Full | | Java | JUnit 5 | checkstyle | โœ… | Full | | Go | go test | golint | โœ… | Full | | Rust | cargo test | clippy | โœ… | Full |

๋ชจ๋ฐ”์ผ

| ์–ธ์–ด/ํ”„๋ ˆ์ž„์›Œํฌ | ํ…Œ์ŠคํŠธ | ๋ฆฐํ„ฐ | ์ƒํƒœ | | ------------------ | ---------------- | ------------ | ---- | | Flutter/Dart | flutter test | dart analyze | Full | | Swift/iOS | XCTest | SwiftLint | Full | | Kotlin/Android | JUnit + Espresso | detekt | Full | | React Native | Jest + RNTL | ESLint | Full |

์ž๋™ ์–ธ์–ด ๊ฐ์ง€

์‹œ์Šคํ…œ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์Šค์บ”ํ•˜์—ฌ ์ž๋™์œผ๋กœ ๊ฐ์ง€:

  • package.json โ†’ TypeScript/JavaScript
  • requirements.txt โ†’ Python
  • go.mod โ†’ Go
  • Cargo.toml โ†’ Rust
  • pubspec.yaml โ†’ Flutter/Dart

๐Ÿ’ป CLI Reference

ํ•ต์‹ฌ ๋ช…๋ น์–ด

# ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”
moai init [project] [options]

# ์‹œ์Šคํ…œ ์ง„๋‹จ
moai doctor [options]

# ํ”„๋กœ์ ํŠธ ์ƒํƒœ ํ™•์ธ
moai status [options]

# ๋ฐฑ์—… ๋ณต์›
moai restore <backup-path> [options]

Claude Code ์ „์šฉ ๋ช…๋ น์–ด

# ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”
/alfred:0-project

moai init [project]

์ƒˆ MoAI-ADK ํ”„๋กœ์ ํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์— MoAI-ADK๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜:

  • --personal: Personal ๋ชจ๋“œ๋กœ ์ดˆ๊ธฐํ™” (๊ธฐ๋ณธ๊ฐ’)
  • --team: Team ๋ชจ๋“œ๋กœ ์ดˆ๊ธฐํ™” (GitHub ํ†ตํ•ฉ)
  • -b, --backup: ์„ค์น˜ ์ „ ๋ฐฑ์—… ์ƒ์„ฑ
  • -f, --force: ๊ธฐ์กด ํŒŒ์ผ ๊ฐ•์ œ ๋ฎ์–ด์“ฐ๊ธฐ

์‚ฌ์šฉ ์˜ˆ์‹œ:

# ์ƒˆ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ (Personal ๋ชจ๋“œ)
moai init my-project

# ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— ์„ค์น˜
moai init .

# Team ๋ชจ๋“œ๋กœ ์ดˆ๊ธฐํ™”
moai init my-project --team

# ๋ฐฑ์—… ์ƒ์„ฑ ํ›„ ์„ค์น˜
moai init . -b

# ๊ธฐ์กด ํŒŒ์ผ ๊ฐ•์ œ ๋ฎ์–ด์“ฐ๊ธฐ
moai init . -f

ํ…œํ”Œ๋ฆฟ ์—…๋ฐ์ดํŠธ: 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•

MoAI-ADK๋Š” ํ…œํ”Œ๋ฆฟ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ํ™˜๊ฒฝ๊ณผ ๋ชฉ์ ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜์„ธ์š”.


๐Ÿ”ง ๋ฐฉ๋ฒ• 1: moai init . (CLI ์ง์ ‘ ์‹คํ–‰)

ํ„ฐ๋ฏธ๋„์—์„œ ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” ํ‘œ์ค€ ์—…๋ฐ์ดํŠธ ๋ฐฉ๋ฒ•

ํŠน์ง•:

  • โœ… ๋น ๋ฅธ ์‹คํ–‰: ํ„ฐ๋ฏธ๋„์—์„œ ๋‹จ์ผ ๋ช…๋ น์–ด๋กœ ์ฆ‰์‹œ ์‹คํ–‰
  • โœ… ์Šคํฌ๋ฆฝํŠธ ํ†ตํ•ฉ: CI/CD ํŒŒ์ดํ”„๋ผ์ธ, ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ์— ์ ํ•ฉ
  • โœ… ์ˆ˜๋™ ์ œ์–ด: ๋ฐฑ์—…, ๊ฐ•์ œ ๋ฎ์–ด์“ฐ๊ธฐ ๋“ฑ ์˜ต์…˜ ์ง์ ‘ ์ œ์–ด
  • โš ๏ธ ์ œํ•œ์  ํ”ผ๋“œ๋ฐฑ: ์„ฑ๊ณต/์‹คํŒจ๋งŒ ํ‘œ์‹œ, ์ƒ์„ธ ๋ถ„์„ ์—†์Œ

์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค:

# 1. ๊ฐ„๋‹จํ•œ ํ…œํ”Œ๋ฆฟ ์—…๋ฐ์ดํŠธ
moai init .

# 2. CI/CD ํŒŒ์ดํ”„๋ผ์ธ
npm install -g moai-adk@latest && moai init . -f

# 3. ๋ฐฐ์น˜ ์Šคํฌ๋ฆฝํŠธ
for project in */; do
  cd "$project"
  moai init .
  cd ..
done

์—…๋ฐ์ดํŠธ ์ ˆ์ฐจ:

# 1. MoAI-ADK ํŒจํ‚ค์ง€ ์ตœ์‹  ๋ฒ„์ „ ์„ค์น˜
npm install -g moai-adk@latest

# 2. ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™
cd your-project

# 3. ํ…œํ”Œ๋ฆฟ ์—…๋ฐ์ดํŠธ (๋ฐฑ์—… ์ž๋™ ์ƒ์„ฑ)
moai init .

# 4. ๋ณ€๊ฒฝ์‚ฌํ•ญ ํ™•์ธ
git status

์˜ต์…˜:

# ๊ธฐ๋ณธ ์—…๋ฐ์ดํŠธ (์ž๋™ ๋ฐฑ์—… ํฌํ•จ)
moai init .

# ๋ฐฑ์—… ์ƒ์„ฑ ํ›„ ์—…๋ฐ์ดํŠธ (๋ช…์‹œ์ )
moai init . -b

# ๊ฐ•์ œ ์—…๋ฐ์ดํŠธ (์ฃผ์˜: ๊ธฐ์กด ํŒŒ์ผ ๋ฎ์–ด์“ฐ๊ธฐ)
moai init . -f

๐Ÿค– ๋ฐฉ๋ฒ• 2: /alfred:9-update (Claude Code ์ „์šฉ)

Claude Code์—์„œ Alfred๊ฐ€ ์ง€๋Šฅํ˜• ๋ถ„์„๊ณผ ํ•จ๊ป˜ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณ ๊ธ‰ ์—…๋ฐ์ดํŠธ

ํŠน์ง•:

  • โœ… ์ง€๋Šฅํ˜• ๋ถ„์„: ํ”„๋กœ์ ํŠธ ์ƒํƒœ ์ž๋™ ์ง„๋‹จ ๋ฐ ์œ„ํ—˜ ํ‰๊ฐ€
  • โœ… ๋งฅ๋ฝ ์ธ์‹: ํ˜„์žฌ ์ž‘์—… ๋ธŒ๋žœ์น˜, SPEC ์ƒํƒœ, Git ์ƒํƒœ ๊ณ ๋ ค
  • โœ… ๋Œ€ํ™”ํ˜• ํ™•์ธ: Phase 1(๋ถ„์„) โ†’ Phase 2(์‹คํ–‰) 2๋‹จ๊ณ„ ์›Œํฌํ”Œ๋กœ์šฐ
  • โœ… ์ƒ์„ธ ๋ฆฌํฌํŠธ: ์—…๋ฐ์ดํŠธ ์ „ํ›„ ๋น„๊ต, ์˜ํ–ฅ ๋ถ„์„, ๊ถŒ์žฅ์‚ฌํ•ญ ์ œ๊ณต
  • โœ… ์ถฉ๋Œ ํ•ด๊ฒฐ: CLAUDE.md, config.json ์ง€๋Šฅํ˜• ๋ณ‘ํ•ฉ
  • โš ๏ธ Claude Code ํ•„์ˆ˜: ํ„ฐ๋ฏธ๋„/์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€

์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค:

# 1. ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๊ฐœ๋ฐœ ์ค‘ ์—…๋ฐ์ดํŠธ
/alfred:9-update

# 2. ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋งŒ ํ™•์ธ (dry-run)
/alfred:9-update --check

# 3. ๊ฐ•์ œ ์—…๋ฐ์ดํŠธ (๋ฐฑ์—… ์—†์Œ, ์œ„ํ—˜)
/alfred:9-update --force

# 4. ํ’ˆ์งˆ ๊ฒ€์ฆ ํฌํ•จ ์—…๋ฐ์ดํŠธ
/alfred:9-update --check-quality

2๋‹จ๊ณ„ ์›Œํฌํ”Œ๋กœ์šฐ:

Phase 1: ๋ถ„์„ ๋ฐ ๊ณ„ํš

Alfred๊ฐ€ ์ž๋™์œผ๋กœ ๋ถ„์„:
1. ํ˜„์žฌ MoAI-ADK ๋ฒ„์ „ ํ™•์ธ
2. ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅํ•œ ์ตœ์‹  ๋ฒ„์ „ ํ™•์ธ
3. ํ”„๋กœ์ ํŠธ ์ƒํƒœ ์ง„๋‹จ (Git, SPEC, ๋ธŒ๋žœ์น˜)
4. ์—…๋ฐ์ดํŠธ ์˜ํ–ฅ ๋ถ„์„
5. ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณ„ํš ๋ณด๊ณ  ๋ฐ ์Šน์ธ ๋Œ€๊ธฐ

Phase 2: ์‹คํ–‰ (์‚ฌ์šฉ์ž ์Šน์ธ ํ›„)

Alfred๊ฐ€ ์ˆœ์ฐจ ์‹คํ–‰:
1. ๋ฐฑ์—… ์ƒ์„ฑ (.moai-backup-YYYY-MM-DD)
2. ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ ์—…๋ฐ์ดํŠธ
3. config.json, CLAUDE.md ์ง€๋Šฅํ˜• ๋ณ‘ํ•ฉ
4. SPEC ํŒŒ์ผ ๋ณดํ˜ธ ๊ฒ€์ฆ
5. Git ์ƒํƒœ ํ™•์ธ ๋ฐ ์ปค๋ฐ‹ ์ œ์•ˆ
6. ์ตœ์ข… ๋ฆฌํฌํŠธ ์ƒ์„ฑ

์˜ต์…˜:

  • --check: ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋งŒ ํ™•์ธ (์‹ค์ œ ๋ณ€๊ฒฝ ์—†์Œ)
  • --force: ๊ฐ•์ œ ์—…๋ฐ์ดํŠธ (๋ฐฑ์—… ์—†์Œ, ์ฃผ์˜ ํ•„์š”)
  • --check-quality: TRUST 5์›์น™ ๊ธฐ๋ฐ˜ ํ’ˆ์งˆ ๊ฒ€์ฆ ํฌํ•จ

๐Ÿ“Š ๋น„๊ตํ‘œ: moai init . vs /alfred:9-update

| ๊ธฐ๋Šฅ | moai init . | /alfred:9-update | | ----------------- | ------------------ | ------------------- | | ์‹คํ–‰ ํ™˜๊ฒฝ | ํ„ฐ๋ฏธ๋„ (์–ด๋””์„œ๋‚˜) | Claude Code ์ „์šฉ | | ์‹คํ–‰ ์†๋„ | โšก ๋น ๋ฆ„ (1-2์ดˆ) | ๐Ÿข ๋А๋ฆผ (10-30์ดˆ) | | ์‚ฌ์ „ ๋ถ„์„ | โŒ ์—†์Œ | โœ… ์ž๋™ ์ง„๋‹จ | | ์œ„ํ—˜ ํ‰๊ฐ€ | โŒ ์—†์Œ | โœ… ์˜ํ–ฅ ๋ถ„์„ | | ์‚ฌ์šฉ์ž ํ™•์ธ | โŒ ์—†์Œ (์ฆ‰์‹œ ์‹คํ–‰) | โœ… 2๋‹จ๊ณ„ ์Šน์ธ | | ๋ฐฑ์—… ์ƒ์„ฑ | โœ… ์ž๋™ | โœ… ์ž๋™ | | ์ถฉ๋Œ ํ•ด๊ฒฐ | โš ๏ธ ์ˆ˜๋™ | โœ… ์ง€๋Šฅํ˜• ๋ณ‘ํ•ฉ | | Git ํ†ตํ•ฉ | โŒ ์—†์Œ | โœ… ์ปค๋ฐ‹ ์ œ์•ˆ | | ๋ฆฌํฌํŠธ ์ƒ์„ฑ | โŒ ์—†์Œ | โœ… ์ƒ์„ธ ๋ฆฌํฌํŠธ | | CI/CD ์‚ฌ์šฉ | โœ… ๊ฐ€๋Šฅ | โŒ ๋ถˆ๊ฐ€๋Šฅ | | ์Šคํฌ๋ฆฝํŠธ ํ†ตํ•ฉ | โœ… ๊ฐ€๋Šฅ | โŒ ๋ถˆ๊ฐ€๋Šฅ | | ํ’ˆ์งˆ ๊ฒ€์ฆ | โŒ ์—†์Œ | โœ… TRUST ๊ฒ€์ฆ (์˜ต์…˜) |


๐ŸŽฏ ๊ถŒ์žฅ ์‚ฌ์šฉ ์ผ€์ด์Šค

moai init . ์‚ฌ์šฉ ์ถ”์ฒœ:

  • โœ… ๋น ๋ฅธ ํ…œํ”Œ๋ฆฟ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•  ๋•Œ
  • โœ… CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•  ๋•Œ
  • โœ… ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐ์น˜๋กœ ์—…๋ฐ์ดํŠธํ•  ๋•Œ
  • โœ… ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ
  • โœ… Claude Code ์—†์ด ์ž‘์—…ํ•  ๋•Œ

/alfred:9-update ์‚ฌ์šฉ ์ถ”์ฒœ:

  • โœ… Claude Code์—์„œ ๊ฐœ๋ฐœ ์ค‘์ผ ๋•Œ
  • โœ… ์—…๋ฐ์ดํŠธ ์˜ํ–ฅ์„ ๋ฏธ๋ฆฌ ํŒŒ์•…ํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  • โœ… CLAUDE.md, config.json ์ถฉ๋Œ์ด ์˜ˆ์ƒ๋  ๋•Œ
  • โœ… Git ์ปค๋ฐ‹๊ณผ ํ•จ๊ป˜ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  • โœ… ์ƒ์„ธํ•œ ๋ฆฌํฌํŠธ๊ฐ€ ํ•„์š”ํ•  ๋•Œ
  • โœ… TRUST 5์›์น™ ๊ธฐ๋ฐ˜ ํ’ˆ์งˆ ๊ฒ€์ฆ์ด ํ•„์š”ํ•  ๋•Œ

๐Ÿ”’ ๊ณตํ†ต ์•ˆ์ „ ๊ธฐ๋Šฅ

๋‘ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ๋‹ค์Œ ์‚ฌํ•ญ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค:

  • ๐Ÿ”’ .moai/specs/ - ์‚ฌ์šฉ์ž SPEC ํŒŒ์ผ ์ ˆ๋Œ€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Œ
  • ๐Ÿ”’ .moai/reports/ - ๋™๊ธฐํ™” ๋ฆฌํฌํŠธ ๋ณด์กด
  • ๐Ÿ”„ ๋ฐฑ์—… ์ž๋™ ์ƒ์„ฑ (.moai-backup-YYYY-MM-DD)
  • โœ… ์‹œ์Šคํ…œ ํŒŒ์ผ๋งŒ ์•ˆ์ „ํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธ
  • โœ… ์ง€๋Šฅํ˜• ๋ณ‘ํ•ฉ (config.json, CLAUDE.md)

moai doctor

์‹œ์Šคํ…œ ์ง„๋‹จ์„ ์‹คํ–‰ํ•˜์—ฌ MoAI-ADK๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜:

  • -l, --list-backups: ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐฑ์—… ๋ชฉ๋ก ํ‘œ์‹œ

์‚ฌ์šฉ ์˜ˆ์‹œ:

# ์‹œ์Šคํ…œ ์ง„๋‹จ ์‹คํ–‰
moai doctor

# ๋ฐฑ์—… ๋ชฉ๋ก ํ™•์ธ
moai doctor -l

moai status

MoAI-ADK ํ”„๋กœ์ ํŠธ ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜:

  • -v, --verbose: ์ƒ์„ธ ์ƒํƒœ ์ •๋ณด ํ‘œ์‹œ
  • -p, --project-path <path>: ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ ์ง€์ • (๊ฒฝ๋กœ ํ•„์ˆ˜)

์‚ฌ์šฉ ์˜ˆ์‹œ:

# ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ ์ƒํƒœ ํ™•์ธ
moai status

# ์ƒ์„ธ ์ •๋ณด ํฌํ•จ
moai status -v

# ํŠน์ • ๊ฒฝ๋กœ ํ”„๋กœ์ ํŠธ ์ƒํƒœ ํ™•์ธ
moai status -p /path/to/project

# ์ƒ์„ธ ์ •๋ณด + ํŠน์ • ๊ฒฝ๋กœ
moai status -v -p /path/to/project

moai restore

๋ฐฑ์—… ๋””๋ ‰ํ† ๋ฆฌ์—์„œ MoAI-ADK๋ฅผ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.

์ธ์ž:

  • <backup-path>: ๋ณต์›ํ•  ๋ฐฑ์—… ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ (ํ•„์ˆ˜)

์˜ต์…˜:

  • --dry-run: ๋ณ€๊ฒฝ ์—†์ด ๋ณต์›ํ•  ๋‚ด์šฉ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
  • --force: ๊ธฐ์กด ํŒŒ์ผ ๊ฐ•์ œ ๋ฎ์–ด์“ฐ๊ธฐ

์‚ฌ์šฉ ์˜ˆ์‹œ:

# ๋ฐฑ์—…์—์„œ ๋ณต์› (๋ฏธ๋ฆฌ๋ณด๊ธฐ)
moai restore .moai-backup-2025-10-02 --dry-run

# ์‹ค์ œ ๋ณต์› ์‹คํ–‰
moai restore .moai-backup-2025-10-02

# ๊ฐ•์ œ ๋ณต์› (๊ธฐ์กด ํŒŒ์ผ ๋ฎ์–ด์“ฐ๊ธฐ)
moai restore .moai-backup-2025-10-02 --force

์ฐธ๊ณ : MoAI-ADK ํ…œํ”Œ๋ฆฟ ์—…๋ฐ์ดํŠธ๋Š” ํ„ฐ๋ฏธ๋„์—์„œ moai init . ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.


ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑ API

๊ธฐ๋ณธ ์‚ฌ์šฉ

import { CLIApp, SystemChecker, TemplateManager } from 'moai-adk';

// CLI ์•ฑ ์ดˆ๊ธฐํ™”
const app = new CLIApp();
await app.run();

// ์‹œ์Šคํ…œ ์ฒดํฌ
const checker = new SystemChecker();
const result = await checker.checkSystem();

// ํ…œํ”Œ๋ฆฟ ๊ด€๋ฆฌ
const templateManager = new TemplateManager();
await templateManager.copyTemplates(projectPath);

์„ค์ • ํŒŒ์ผ (.moai/config.json)

{
  "project": {
    "name": "my-project",
    "mode": "personal",
    "language": "typescript"
  },
  "workflow": {
    "enableAutoSync": true,
    "gitIntegration": true
  }
}

TRUST 5์›์น™

๋ชจ๋“  ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ TRUST ์›์น™์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค:

T - Test First (ํ…Œ์ŠคํŠธ ์šฐ์„ )

SPEC โ†’ Test โ†’ Code ์‚ฌ์ดํด:

  • @SPEC: EARS ํ˜•์‹ ๋ช…์„ธ์„œ ์šฐ์„  ์ž‘์„ฑ
  • RED: @TEST TAG - ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
  • GREEN: @CODE TAG - ์ตœ์†Œ ๊ตฌํ˜„์œผ๋กœ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ
  • REFACTOR: @CODE TAG - ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„ 

R - Readable (๊ฐ€๋…์„ฑ)

์ฝ”๋“œ ์ œ์•ฝ:

  • ํŒŒ์ผ๋‹น โ‰ค300 LOC
  • ํ•จ์ˆ˜๋‹น โ‰ค50 LOC
  • ๋งค๊ฐœ๋ณ€์ˆ˜ โ‰ค5๊ฐœ
  • ๋ณต์žก๋„ โ‰ค10

U - Unified (ํ†ตํ•ฉ์„ฑ)

SPEC ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜:

  • ๋ชจ๋“ˆ ๊ฐ„ ๋ช…ํ™•ํ•œ ์ฑ…์ž„ ๋ถ„๋ฆฌ
  • ํƒ€์ž… ์•ˆ์ „์„ฑ ๋ณด์žฅ
  • ์–ธ์–ด๋ณ„ ๊ฒฝ๊ณ„๋ฅผ SPEC์ด ์ •์˜

S - Secured (๋ณด์•ˆ์„ฑ)

์ž…๋ ฅ ๊ฒ€์ฆ:

  • ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๊ฒ€์ฆ (์ •๊ทœ์‹, ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ)
  • ํŒŒ์ผ ์—…๋กœ๋“œ ์ œํ•œ (ํ™•์žฅ์ž, ํฌ๊ธฐ, MIME ํƒ€์ž…)

์ฃผ์š” ์ทจ์•ฝ์  ๋ฐฉ์–ด:

  • SQL Injection: Prepared Statement, ORM ์‚ฌ์šฉ
  • XSS: HTML ์ด์Šค์ผ€์ดํ•‘, CSP ํ—ค๋”
  • CSRF: CSRF ํ† ํฐ, SameSite ์ฟ ํ‚ค
  • ๋น„๋ฐ€๋ฒˆํ˜ธ: bcrypt/argon2 ํ•ด์‹ฑ (์ตœ์†Œ 10 ๋ผ์šด๋“œ)

๋ณด์•ˆ ์Šค์บ๋‹:

  • ์ •์  ๋ถ„์„ ๋„๊ตฌ (Snyk, OWASP Dependency-Check)
  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ณด์•ˆ (.env Git ์ œ์™ธ)

T - Trackable (์ถ”์ ์„ฑ)

@TAG ์‹œ์Šคํ…œ์œผ๋กœ ์™„์ „ํ•œ ์ถ”์ ์„ฑ:

  • @SPEC โ†’ @TEST โ†’ @CODE โ†’ @DOC ์ฒด์ธ
  • ์ฝ”๋“œ ์ง์ ‘ ์Šค์บ”์œผ๋กœ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ
  • ๊ณ ์•„ TAG ์ž๋™ ํƒ์ง€

๋ฌธ์ œ ํ•ด๊ฒฐ

์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ

1. /alfred:2-build ์‹คํ–‰ ์‹œ "SPEC not found" ์—๋Ÿฌ

์ฆ์ƒ: TDD ๊ตฌํ˜„ ์ค‘ SPEC ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ์—๋Ÿฌ ๋ฐœ์ƒ

์›์ธ: /alfred:1-spec ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋›ฐ์—ˆ๊ฑฐ๋‚˜, SPEC ํŒŒ์ผ ๊ฒฝ๋กœ๊ฐ€ ์ž˜๋ชป๋จ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

# 1. SPEC ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ
ls .moai/specs/SPEC-*.md

# 2. SPEC์ด ์—†๋‹ค๋ฉด ๋จผ์ € ์ž‘์„ฑ
/alfred:1-spec "๊ธฐ๋Šฅ ์„ค๋ช…"

# 3. SPEC ID ํ™•์ธ ํ›„ ์žฌ์‹คํ–‰
/alfred:2-build SPEC-ID

2. ํ…Œ์ŠคํŠธ ์‹คํŒจ ์‹œ ๋ณต๊ตฌ

์ฆ์ƒ: /alfred:2-build ์‹คํ–‰ ํ›„ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ณ„์† ์‹คํŒจ

์›์ธ: ์—ฃ์ง€ ์ผ€์ด์Šค ๋ˆ„๋ฝ, ์˜์กด์„ฑ ๋ฌธ์ œ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฏธ์„ค์ •

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

# 1. ํ…Œ์ŠคํŠธ ์ˆ˜๋™ ์‹คํ–‰์œผ๋กœ ์ •ํ™•ํ•œ ์—๋Ÿฌ ํ™•์ธ
npm test  # ๋˜๋Š” bun test, pytest ๋“ฑ

# 2. debug-helper ์—์ด์ „ํŠธ ํ˜ธ์ถœ
@agent-debug-helper "ํ…Œ์ŠคํŠธ ์‹คํŒจ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€"

# 3. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํ™•์ธ
cat .env.example  # ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํ™•์ธ
cp .env.example .env  # ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํŒŒ์ผ ์ƒ์„ฑ

# 4. ์˜์กด์„ฑ ์žฌ์„ค์น˜
rm -rf node_modules && npm install

3. TAG ์ฒด์ธ ๋Š์–ด์ง ๊ฒฝ๊ณ 

์ฆ์ƒ: /alfred:3-sync ์‹คํ–‰ ์‹œ "๊ณ ์•„ TAG ๋ฐœ๊ฒฌ" ๊ฒฝ๊ณ 

์›์ธ: SPEC ์—†์ด CODE๋งŒ ์ž‘์„ฑํ–ˆ๊ฑฐ๋‚˜, TAG ID ๋ถˆ์ผ์น˜

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

# 1. ๊ณ ์•„ TAG ์ฐพ๊ธฐ
rg '@CODE:' -n src/  # CODE TAG ๋ชฉ๋ก
rg '@SPEC:' -n .moai/specs/  # SPEC TAG ๋ชฉ๋ก

# 2. ๋ˆ„๋ฝ๋œ SPEC ์ž‘์„ฑ
/alfred:1-spec "ํ•ด๋‹น ๊ธฐ๋Šฅ ์„ค๋ช…"

# 3. TAG ID ์ผ์น˜์‹œํ‚ค๊ธฐ
# CODE์™€ SPEC์˜ ID๊ฐ€ ๋™์ผํ•œ์ง€ ํ™•์ธ (์˜ˆ: AUTH-001)

# 4. ์žฌ๊ฒ€์ฆ
/alfred:3-sync

4. Git ๋ธŒ๋žœ์น˜ ์ถฉ๋Œ

์ฆ์ƒ: SPEC ์ƒ์„ฑ ์‹œ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ ์‹คํŒจ

์›์ธ: ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ธŒ๋žœ์น˜๊ฐ€ ์ด๋ฏธ ์กด์žฌ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

# 1. ๊ธฐ์กด ๋ธŒ๋žœ์น˜ ํ™•์ธ
git branch -a

# 2. ๊ธฐ์กด ๋ธŒ๋žœ์น˜๋กœ ์ „ํ™˜ (๊ณ„์† ์ž‘์—…ํ•˜๋ ค๋ฉด)
git checkout feature/SPEC-XXX-YYY

# 3. ๋˜๋Š” ์ƒˆ ๋ธŒ๋žœ์น˜ ๊ฐ•์ œ ์ƒ์„ฑ (์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘)
git branch -D feature/SPEC-XXX-YYY
/alfred:1-spec "๊ธฐ๋Šฅ ์„ค๋ช…"

5. ๊ถŒํ•œ ์—๋Ÿฌ (Permission Denied)

์ฆ์ƒ: moai init ์‹คํ–‰ ์‹œ ๊ถŒํ•œ ์—๋Ÿฌ

์›์ธ: ํŒŒ์ผ ์‹คํ–‰ ๊ถŒํ•œ ๋ถ€์กฑ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

# 1. .moai/ ๋””๋ ‰ํ† ๋ฆฌ ๊ถŒํ•œ ํ™•์ธ
ls -la .moai/

# 2. ์‹คํ–‰ ๊ถŒํ•œ ์ถ”๊ฐ€
chmod -R 755 .moai/

# 3. ์žฌ์‹œ๋„
moai init .

6. ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ 85% ๋ฏธ๋งŒ

์ฆ์ƒ: TRUST ๊ฒ€์ฆ ์‹คํŒจ - ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ๋ถ€์กฑ

์›์ธ: ์—ฃ์ง€ ์ผ€์ด์Šค ํ…Œ์ŠคํŠธ ๋ˆ„๋ฝ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

# 1. ์ปค๋ฒ„๋ฆฌ์ง€ ๋ฆฌํฌํŠธ ํ™•์ธ
npm test -- --coverage  # ๋˜๋Š” bun test --coverage

# 2. ๋ˆ„๋ฝ๋œ ๋ธŒ๋žœ์น˜ ํ™•์ธ
# ์ปค๋ฒ„๋ฆฌ์ง€ ๋ฆฌํฌํŠธ์—์„œ ๋นจ๊ฐ„์ƒ‰(๋ฏธํ…Œ์ŠคํŠธ) ๋ผ์ธ ํ™•์ธ

# 3. ์—ฃ์ง€ ์ผ€์ด์Šค ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
# - null/undefined ์ž…๋ ฅ
# - ๋นˆ ๋ฐฐ์—ด/๊ฐ์ฒด
# - ๊ฒฝ๊ณ„๊ฐ’ (0, -1, ์ตœ๋Œ€๊ฐ’)
# - ์—๋Ÿฌ ์ผ€์ด์Šค

# 4. ์žฌ์‹คํ–‰
/alfred:2-build SPEC-ID

7. ์„ค์น˜ ์‹คํŒจ

๊ถŒํ•œ ๋ฌธ์ œ:

sudo npm install -g moai-adk

์บ์‹œ ๋ฌธ์ œ:

npm cache clean --force
npm install -g moai-adk

8. ๋ช…๋ น์–ด ์ธ์‹ ์•ˆ ๋จ

PATH ํ™•์ธ:

echo $PATH
npm list -g --depth=0

์…ธ ์žฌ์‹œ์ž‘:

source ~/.bashrc  # bash
source ~/.zshrc   # zsh

9. Claude Code ์—ฐ๋™ ๋ฌธ์ œ

  • .claude/settings.json ํŒŒ์ผ ํ™•์ธ
  • Claude Code ์ตœ์‹  ๋ฒ„์ „ ์‚ฌ์šฉ ํ™•์ธ
  • ์—์ด์ „ํŠธ ํŒŒ์ผ ๊ถŒํ•œ ํ™•์ธ

๋กœ๊ทธ ํ™•์ธ

๋ฌธ์ œ ์›์ธ ํŒŒ์•…์„ ์œ„ํ•œ ๋กœ๊ทธ ์œ„์น˜:

# MoAI-ADK ์‹œ์Šคํ…œ ๋กœ๊ทธ
~/.moai/logs/moai.log

# ์—๋Ÿฌ ๋กœ๊ทธ
~/.moai/logs/error.log

# ํ”„๋กœ์ ํŠธ๋ณ„ ๋กœ๊ทธ
.moai/logs/

# Claude Code ๋กœ๊ทธ
~/.claude/logs/

๊ธด๊ธ‰ ๋ณต๊ตฌ

์‹ฌ๊ฐํ•œ ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ๋ฐฑ์—…์—์„œ ๋ณต์›:

# 1. ๋ฐฑ์—… ๋ชฉ๋ก ํ™•์ธ
moai doctor -l

# 2. ์ตœ์‹  ๋ฐฑ์—…์œผ๋กœ ๋ณต์› (๋ฏธ๋ฆฌ๋ณด๊ธฐ)
moai restore .moai-backup-YYYY-MM-DD --dry-run

# 3. ์‹ค์ œ ๋ณต์›
moai restore .moai-backup-YYYY-MM-DD

๊ฐœ๋ฐœ ์ฐธ์—ฌ

๊ธฐ์—ฌ ๋ฐฉ๋ฒ•

  1. Repository Fork
  2. ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ (git checkout -b feature/new-feature)
  3. ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ปค๋ฐ‹ (git commit -am 'Add new feature')
  4. ๋ธŒ๋žœ์น˜ ํ‘ธ์‹œ (git push origin feature/new-feature)
  5. Pull Request ์ƒ์„ฑ

๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •

# ์ €์žฅ์†Œ ํด๋ก 
git clone https://github.com/modu-ai/moai-adk.git
cd moai-adk/moai-adk-ts

# ์˜์กด์„ฑ ์„ค์น˜ (Bun ๊ถŒ์žฅ)
bun install

# ๊ฐœ๋ฐœ ๋ชจ๋“œ ์‹คํ–‰
bun run dev

# ๋นŒ๋“œ
bun run build

# ํ…Œ์ŠคํŠธ
bun test

# ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฒ€์‚ฌ
bun run check

์ฝ”๋”ฉ ๊ทœ์น™

  • TRUST 5์›์น™ ์ค€์ˆ˜
  • @TAG ์‹œ์Šคํ…œ ์ ์šฉ
  • TypeScript strict ๋ชจ๋“œ ์‚ฌ์šฉ
  • โ‰ค50 LOC per function
  • Test coverage โ‰ฅ85%

๐Ÿ™ Contributors

MoAI-ADK ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•ด์ฃผ์‹  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค:

  • @Workuul - ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ์‹คํ–‰ ๋ฌธ์ œ ์ˆ˜์ • (PR #1)
    • realpathSync() ์ ์šฉ์œผ๋กœ ๊ธ€๋กœ๋ฒŒ ์„ค์น˜ ์ด์Šˆ ํ•ด๊ฒฐ
    • REPL/eval ํ™˜๊ฒฝ ๋ฐฉ์–ด ๋กœ์ง ์ถ”๊ฐ€
    • JSDoc ๋ฌธ์„œํ™” ๊ฐœ์„ 

๋ฌธ์„œ ๋ฐ ์ง€์›


Made with MoAI's ๐Ÿชฟ


๋ผ์ด์„ ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” MIT License๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.