Package Exports
- @maskweaver/plugin
- @maskweaver/plugin/cli
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
memory_search
์๋ฏธ ๊ธฐ๋ฐ ๊ฒ์์ผ๋ก ์ด์ ๋ํ, ๊ฒฐ์ ์ฌํญ, ์ฌ์ฉ ๊ธฐ๋ก, ์ ์ ์ ํธ๋๋ฅผ ์ฐพ์ต๋๋ค.
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.md2. ๋ชจ๋ธ ์ง์
---
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