JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 22
  • Score
    100M100P100Q81992F
  • License MIT

Maskweaver plugin for opencode - Expert AI personas

Package Exports

  • @maskweaver/plugin

Readme

@maskweaver/plugin

๐ŸŽญ Give your AI coding assistant expert personalities - ๊ฐ€๋ฉด์ˆ ์‚ฌ

์ „๋ฌธ๊ฐ€ ๊ฐ€๋ฉด์„ ํ†ตํ•ด AI ์ฝ”๋”ฉ ์–ด์‹œ์Šคํ„ดํŠธ๋ฅผ ๊ฐ•ํ™”ํ•˜์„ธ์š”.

์›ํด๋ฆญ ์„ค์น˜

๋ฐฉ๋ฒ• 1: CLI ์‚ฌ์šฉ (๊ถŒ์žฅ)

# npx ์‚ฌ์šฉ
npx @maskweaver/plugin install

# ๋˜๋Š” bunx ์‚ฌ์šฉ
bunx @maskweaver/plugin install

๋ฐฉ๋ฒ• 2: ์ˆ˜๋™ ์„ค์น˜

~/.config/opencode/opencode.json ๋˜๋Š” ํ”„๋กœ์ ํŠธ์˜ opencode.json์— ์ถ”๊ฐ€:

{
  "plugin": ["@maskweaver/plugin"]
}

์‚ญ์ œ

# CLI๋กœ ์ œ๊ฑฐ
npx @maskweaver/plugin uninstall

# ๋˜๋Š” ํ”„๋กœ์ ํŠธ๋ณ„ ์ œ๊ฑฐ
npx @maskweaver/plugin uninstall --local

์‚ญ์ œ ํ›„ ๋‹ค์Œ ํŒŒ์ผ๋“ค์„ ์ˆ˜๋™์œผ๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ~/.config/opencode/maskweaver.json (์ „์—ญ ์„ค์ •)
  • .opencode/maskweaver.json (ํ”„๋กœ์ ํŠธ ์„ค์ •)
  • .opencode/masks/ (์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋ฉด)
  • .opencode/agents/ (์‚ฌ์šฉ์ž ์ •์˜ ์—์ด์ „ํŠธ)

์„ค์น˜ ์ƒํƒœ ํ™•์ธ

npx @maskweaver/plugin status

์„ค์ •

.opencode/maskweaver.json ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

{
  "$schema": "https://unpkg.com/@maskweaver/plugin/schema.json",
  "masks": {
    "default": "kent-beck",
    "autoActivate": true
  },
  "disabled_tools": [],
  "disabled_masks": [],
  "agents": {
    "coder": {
      "model": "anthropic/claude-sonnet-4-5"
    }
  },
  "logging": {
    "verbose": false
  }
}

์„ค์ • ์˜ต์…˜

์˜ต์…˜ ์„ค๋ช…
masks.default ์„ธ์…˜ ์‹œ์ž‘ ์‹œ ์ž๋™ ํ™œ์„ฑํ™”ํ•  ๊ฐ€๋ฉด ID
masks.autoActivate ๊ธฐ๋ณธ ๊ฐ€๋ฉด ์ž๋™ ํ™œ์„ฑํ™” ์—ฌ๋ถ€
disabled_tools ๋น„ํ™œ์„ฑํ™”ํ•  ๋„๊ตฌ ๋ชฉ๋ก
disabled_masks ๋น„ํ™œ์„ฑํ™”ํ•  ๊ฐ€๋ฉด ๋ชฉ๋ก
agents ์—์ด์ „ํŠธ๋ณ„ ์„ค์ • ์˜ค๋ฒ„๋ผ์ด๋“œ
logging.verbose ์ƒ์„ธ ๋กœ๊น… ํ™œ์„ฑํ™”

์‚ฌ์šฉ๋ฒ•

1. ๊ฐ€๋ฉด ๋ชฉ๋ก ํ™•์ธ

AI์—๊ฒŒ list_masks ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์š”์ฒญ:

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€๋ฉด์„ ๋ณด์—ฌ์ค˜

2. ๊ฐ€๋ฉด ์„ ํƒ

select_mask ๋„๊ตฌ๋กœ ๊ฐ€๋ฉด ํ™œ์„ฑํ™”:

Kent Beck ๊ฐ€๋ฉด์„ ์ ์šฉํ•ด์ค˜

3. ๊ฐ€๋ฉด ํ•ด์ œ

deselect_mask ๋„๊ตฌ๋กœ ๊ฐ€๋ฉด ์ œ๊ฑฐ:

ํ˜„์žฌ ๊ฐ€๋ฉด์„ ํ•ด์ œํ•ด์ค˜

4. ์ƒํƒœ ํ™•์ธ

maskweaver_status ๋„๊ตฌ๋กœ ์ƒํƒœ ํ™•์ธ:

maskweaver ์ƒํƒœ๋ฅผ ๋ณด์—ฌ์ค˜

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€๋ฉด

Software Engineering

  • kent-beck: ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ(TDD)์˜ ์ฐฝ์‹œ์ž
  • martin-fowler: ๋ฆฌํŒฉํ† ๋ง๊ณผ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํŒจํ„ด์˜ ๋Œ€๊ฐ€
  • linus-torvalds: ๋ฆฌ๋ˆ…์Šค์™€ Git์˜ ์ฐฝ์‹œ์ž
  • dan-abramov: React์™€ Redux์˜ ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž

Architecture

  • jeff-dean: ๊ตฌ๊ธ€์˜ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๋Œ€๊ฐ€

AI/ML

  • andrew-ng: ๋จธ์‹ ๋Ÿฌ๋‹ ๊ต์œก์˜ ์„ ๊ตฌ์ž

Tools

Maskweaver ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋ฉ”๋ชจ๋ฆฌ, ์ปจํ…์ŠคํŠธ, ํšŒ๊ณ ๋ฅผ ์œ„ํ•œ 7๊ฐœ์˜ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Memory Tools

์˜๋ฏธ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰์œผ๋กœ ์ด์ „ ๋Œ€ํ™”, ๊ฒฐ์ • ์‚ฌํ•ญ, ์‚ฌ์šฉ ๊ธฐ๋ก, ์œ ์ € ์„ ํ˜ธ๋„๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

Parameters:

  • query (required): ๊ฒ€์ƒ‰ํ•  ํ…์ŠคํŠธ
  • maxResults (optional): ์ตœ๋Œ€ ๊ฒฐ๊ณผ ์ˆ˜
  • minScore (optional): ์ตœ์†Œ ์œ ์‚ฌ๋„ ์ ์ˆ˜
  • sources (optional): ๊ฒ€์ƒ‰ ๋ฒ”์œ„ (memory, masks, retrospect, daily, user)

Example:

// "OAuth ๊ตฌํ˜„"๊ณผ ๊ด€๋ จ๋œ ์ด์ „ ๋Œ€ํ™” ๊ฒ€์ƒ‰
memory_search({ query: "OAuth ๊ตฌํ˜„", maxResults: 5 })

// ์œ ์ € ์ •๋ณด๋งŒ ๊ฒ€์ƒ‰
memory_search({ query: "์„ ํ˜ธํ•˜๋Š” ์ฝ”๋”ฉ ์Šคํƒ€์ผ", sources: ["user"] })

memory_write

๋งˆํฌ๋‹ค์šด ํŒŒ์ผ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

Parameters:

  • content (required): ์ €์žฅํ•  ๋‚ด์šฉ
  • target (required): ์ €์žฅ ์œ„์น˜
    • daily: ์˜ค๋Š˜์˜ ์ž‘์—… ๊ธฐ๋ก (์ž๋™์œผ๋กœ ์˜ค๋Š˜ ๋‚ ์งœ ํŒŒ์ผ์— ์ถ”๊ฐ€)
    • memory: ์žฅ๊ธฐ ๊ธฐ์–ต (MEMORY.md์— ์ถ”๊ฐ€)
    • user: ์œ ์ € ์ •๋ณด (USER.md ์—…๋ฐ์ดํŠธ)
  • section (optional): ์„น์…˜ ์ด๋ฆ„

Example:

// ์˜ค๋Š˜์˜ ์ž‘์—… ๊ธฐ๋ก
memory_write({ 
  content: "OAuth ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์™„๋ฃŒ", 
  target: "daily" 
})

// ์žฅ๊ธฐ ๊ธฐ์–ต ์ €์žฅ
memory_write({ 
  content: "JWT ํ† ํฐ์€ 7์ผ ๋งŒ๋ฃŒ ์ •์ฑ… ์‚ฌ์šฉ", 
  target: "memory",
  section: "์ธ์ฆ ์ •์ฑ…"
})

// ์œ ์ € ์„ ํ˜ธ๋„ ์ €์žฅ
memory_write({ 
  content: "TypeScript strict ๋ชจ๋“œ ์„ ํ˜ธ", 
  target: "user" 
})

memory_get

๋ฉ”๋ชจ๋ฆฌ ํŒŒ์ผ์˜ ์ƒ์„ธ ๋‚ด์šฉ์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

Parameters:

  • path (required): ํŒŒ์ผ ๊ฒฝ๋กœ
  • from (optional): ์‹œ์ž‘ ๋ผ์ธ ๋ฒˆํ˜ธ
  • lines (optional): ์ฝ์„ ๋ผ์ธ ์ˆ˜

Example:

// memory_search๋กœ ์ฐพ์€ ํŒŒ์ผ์˜ ์ „์ฒด ๋‚ด์šฉ ์ฝ๊ธฐ
memory_get({ path: ".memory/daily/2026-02-01.md" })

// ํŠน์ • ๋ฒ”์œ„๋งŒ ์ฝ๊ธฐ
memory_get({ path: ".memory/MEMORY.md", from: 10, lines: 20 })

memory_indexer

ํŒŒ์ผ์„ ์˜๋ฏธ ๊ฒ€์ƒ‰์šฉ์œผ๋กœ ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค.

Parameters:

  • action (required): ์ž‘์—… ํƒ€์ž…
    • index: ์ƒˆ ํŒŒ์ผ ์ธ๋ฑ์‹ฑ
    • reindex: ๊ธฐ์กด ํŒŒ์ผ ์žฌ์ธ๋ฑ์‹ฑ
    • index-all: ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ํŒŒ์ผ ์ธ๋ฑ์‹ฑ
  • path (required): ํŒŒ์ผ ๊ฒฝ๋กœ

Example:

// ์ƒˆ ํŒŒ์ผ ์ธ๋ฑ์‹ฑ
memory_indexer({ action: "index", path: ".memory/daily/2026-02-01.md" })

// ์ „์ฒด ์žฌ์ธ๋ฑ์‹ฑ
memory_indexer({ action: "index-all", path: ".memory" })

Context Tools

context

ํ”ผ์ฒ˜ ๊ธฐ๋ฐ˜ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ๋กœ ์ž‘์—…์„ ๊ตฌ์กฐํ™”ํ•˜๊ณ  ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.

Actions:

  • start: ์ƒˆ ํ”ผ์ฒ˜ ์‹œ์ž‘ (name, goal ํ•„์š”)
  • switch: ํ”ผ์ฒ˜ ์ „ํ™˜ (id ๋˜๋Š” name ํ•„์š”)
  • status: ํ˜„์žฌ ํ™œ์„ฑ ํ”ผ์ฒ˜ ์ƒํƒœ ํ‘œ์‹œ
  • done: ํ”ผ์ฒ˜ ์™„๋ฃŒ ์ฒ˜๋ฆฌ (id ์—†์œผ๋ฉด ํ˜„์žฌ ํ”ผ์ฒ˜)
  • add: ํ˜„์žฌ ํ”ผ์ฒ˜์— ํŒŒ์ผ ์ถ”๊ฐ€ (file ํ•„์š”)
  • drop: ํ˜„์žฌ ํ”ผ์ฒ˜์—์„œ ํŒŒ์ผ ์ œ๊ฑฐ (file ํ•„์š”)
  • goal: ํ˜„์žฌ ํ”ผ์ฒ˜ ๋ชฉํ‘œ ๋ณ€๊ฒฝ (goal ํ•„์š”)
  • list: ๋ชจ๋“  ํ”ผ์ฒ˜ ๋ชฉ๋ก ์กฐํšŒ

Example:

// ์ƒˆ ํ”ผ์ฒ˜ ์‹œ์ž‘
context({ action: "start", name: "login-oauth", goal: "OAuth ๋กœ๊ทธ์ธ ๊ตฌํ˜„" })

// ํŒŒ์ผ ์ถ”๊ฐ€
context({ action: "add", file: "src/auth/oauth.ts" })

// ์ƒํƒœ ํ™•์ธ
context({ action: "status" })

// ๋ชฉํ‘œ ๋ณ€๊ฒฝ
context({ action: "goal", goal: "OAuth 2.0 + PKCE ๊ตฌํ˜„" })

// ํ”ผ์ฒ˜ ์™„๋ฃŒ
context({ action: "done" })

// ๋ชจ๋“  ํ”ผ์ฒ˜ ๋ชฉ๋ก
context({ action: "list" })

Retrospect Tools

retrospect

์„ธ์…˜ ํšŒ๊ณ ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ž‘์—…์„ ๋ถ„์„ํ•˜๊ณ  ๊ฐœ์„ ์ ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

Parameters:

  • trigger (required): ํšŒ๊ณ  ํŠธ๋ฆฌ๊ฑฐ
    • manual: ์œ ์ €๊ฐ€ ๋ช…๋ น์œผ๋กœ ์š”์ฒญ
    • session_end: ์„ธ์…˜ ์ข…๋ฃŒ ์‹œ ์ž๋™ ์‹คํ–‰
    • periodic: ๋”๋ฏธ์ธ๊ฐ„ 5๋ฒˆ ์†Œํ™˜ ํ›„ ์ž๋™ ์‹คํ–‰
  • summary (required): ์ž‘์—… ์š”์•ฝ
  • masksUsed (optional): ์‚ฌ์šฉํ•œ ๊ฐ€๋ฉด ๋ชฉ๋ก
    • name: ๊ฐ€๋ฉด ์ด๋ฆ„
    • task: ์ˆ˜ํ–‰ํ•œ ์ž‘์—…
    • effectiveness: ํšจ๊ณผ์„ฑ ์ ์ˆ˜ (0-10)
  • wellDone (optional): ์ž˜๋œ ์  ๋ชฉ๋ก
  • improvements (optional): ๊ฐœ์„ ์  ๋ชฉ๋ก
  • lessons (optional): ๋ฐฐ์šด ๊ตํ›ˆ ๋ชฉ๋ก
  • depth (optional): ํšŒ๊ณ  ๊นŠ์ด
    • quick: ์š”์•ฝ๋งŒ ๊ธฐ๋ก (๋น ๋ฅธ ํšŒ๊ณ )
    • standard: ์š”์•ฝ + ์ž˜๋œ์ /๊ฐœ์„ ์  (๊ธฐ๋ณธ)
    • deep: ์ „์ฒด + ์ƒ์„ธ ๊ตํ›ˆ (์‹ฌ์ธต ํšŒ๊ณ )

Example:

// ๊ธฐ๋ณธ ํšŒ๊ณ 
retrospect({ 
  trigger: "manual",
  summary: "OAuth ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์™„๋ฃŒ",
  wellDone: ["TDD๋กœ ๊ฐœ๋ฐœํ•˜์—ฌ ๋ฒ„๊ทธ ์ตœ์†Œํ™”", "PKCE ์ ์šฉ์œผ๋กœ ๋ณด์•ˆ ๊ฐ•ํ™”"],
  improvements: ["์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ", "๋ฌธ์„œํ™” ์ถ”๊ฐ€ ํ•„์š”"]
})

// ์‹ฌ์ธต ํšŒ๊ณ  (๊ฐ€๋ฉด ์‚ฌ์šฉ ๊ธฐ๋ก ํฌํ•จ)
retrospect({
  trigger: "session_end",
  summary: "์ธ์ฆ ์‹œ์Šคํ…œ ๋ฆฌํŒฉํ† ๋ง",
  masksUsed: [
    { name: "kent-beck", task: "TDD๋กœ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ", effectiveness: 9 },
    { name: "martin-fowler", task: "์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง", effectiveness: 8 }
  ],
  wellDone: ["ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ 95%", "์ˆœํ™˜ ์ฐธ์กฐ ์ œ๊ฑฐ"],
  improvements: ["์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€", "API ๋ฌธ์„œ ์—…๋ฐ์ดํŠธ"],
  lessons: ["TDD๊ฐ€ ๋ฆฌํŒฉํ† ๋ง ์‹ ๋ขฐ๋„๋ฅผ ํฌ๊ฒŒ ๋†’์ž„", "์ž‘์€ ๋‹จ์œ„๋กœ ์ปค๋ฐ‹ํ•˜๋‹ˆ ๋กค๋ฐฑ์ด ์‰ฌ์›€"],
  depth: "deep"
})

mask_save

ํšจ๊ณผ์ ์ธ ๊ฐ€๋ฉด์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

Parameters:

  • name (required): ๊ฐ€๋ฉด ์ด๋ฆ„
  • expertise (required): ์ „๋ฌธ ๋ถ„์•ผ
  • thinkingStyle (required): ์‚ฌ๊ณ  ๋ฐฉ์‹
  • strengths (required): ๊ฐ•์ 
  • suitableFor (required): ์ ํ•ฉํ•œ ์ž‘์—…
  • effectivenessScore (required): ํšจ๊ณผ์„ฑ ์ ์ˆ˜ (0-10)
  • usageNote (optional): ์‚ฌ์šฉ ๋…ธํŠธ

Example:

mask_save({
  name: "test-architect",
  expertise: "ํ…Œ์ŠคํŠธ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๋ฐ ์ „๋žต ์ˆ˜๋ฆฝ",
  thinkingStyle: "์ฒด๊ณ„์ ์ด๊ณ  ๊ณ„์ธต์ ์ธ ์ ‘๊ทผ. ํ…Œ์ŠคํŠธ ํ”ผ๋ผ๋ฏธ๋“œ ์šฐ์„  ๊ณ ๋ ค",
  strengths: "E2E/ํ†ตํ•ฉ/๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๊ท ํ˜•, ํ…Œ์ŠคํŠธ ์œ ์ง€๋ณด์ˆ˜์„ฑ",
  suitableFor: "ํ…Œ์ŠคํŠธ ์ „๋žต ์ˆ˜๋ฆฝ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง, CI/CD ํŒŒ์ดํ”„๋ผ์ธ",
  effectivenessScore: 9,
  usageNote: "๋ณต์žกํ•œ ์‹œ์Šคํ…œ์˜ ํ…Œ์ŠคํŠธ ์ „๋žต ์ˆ˜๋ฆฝ์— ๋งค์šฐ ํšจ๊ณผ์ "
})

์ปค์Šคํ…€ ๋”๋ฏธ์ธ๊ฐ„ ์ถ”๊ฐ€

๊ธฐ๋ณธ์ ์œผ๋กœ dummy-human (๊ธฐ๋ณธ ๋ชจ๋ธ ์ƒ์†) ํ•˜๋‚˜๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ง์ ‘ ๋”๋ฏธ์ธ๊ฐ„์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. ํ…œํ”Œ๋ฆฟ ๋ณต์‚ฌ

.opencode/agents/dummy-template.md๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ƒˆ ํŒŒ์ผ ์ƒ์„ฑ:

# ์˜ˆ: Gemini Flash ๋ชจ๋ธ์šฉ ๋”๋ฏธ์ธ๊ฐ„
cp .opencode/agents/dummy-template.md .opencode/agents/dummy-flash.md

2. ๋ชจ๋ธ ์ง€์ •

---
description: ๋”๋ฏธ์ธ๊ฐ„(Flash) - Gemini Flash. ๋น ๋ฅด๊ณ  ์ €๋ ดํ•œ ๋‹จ์ˆœ ์ž‘์—…์šฉ
model: google/gemini-2.5-flash
mode: subagent
---
๊ฐ€๋ฉด์ˆ ์‚ฌ๊ฐ€ ์ „๋‹ฌํ•œ ์ง€์‹œ์‚ฌํ•ญ์„ ์ถฉ์‹คํžˆ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ถ”์ฒœ ๋ชจ๋ธ ์˜ˆ์‹œ

ํŒŒ์ผ๋ช… ๋ชจ๋ธ ์šฉ๋„
dummy-flash.md google/gemini-2.5-flash ๋น ๋ฅด๊ณ  ์ €๋ ดํ•œ ๋‹จ์ˆœ ์ž‘์—…
dummy-premium.md anthropic/claude-opus-4 ๋ณต์žกํ•œ ์ถ”๋ก , ์•„ํ‚คํ…์ฒ˜
dummy-coder.md deepseek/deepseek-coder ์ฝ”๋“œ ์ƒ์„ฑ ํŠนํ™”
dummy-gpt.md openai/gpt-4o ๋ฒ”์šฉ ์ž‘์—…

oh-my-opencode ํŒจํ„ด

์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ oh-my-opencode ํŒจํ„ด์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค:

  • โœ… ์›ํด๋ฆญ ์„ค์น˜/์‚ญ์ œ
  • โœ… ์„ค์ • ํŒŒ์ผ์„ ํ†ตํ•œ ๋น„ํ™œ์„ฑํ™”
  • โœ… ์ž๋™ ์—์…‹ ์„ค์น˜
  • โœ… ์ด๋ฒคํŠธ ํ›… ์ง€์›
  • โœ… ์—์ด์ „ํŠธ ์„ค์ • ์˜ค๋ฒ„๋ผ์ด๋“œ

๋ผ์ด์„ ์Šค

MIT ยฉ ULJI SOFT