@rch4com/agent-setup 2.0.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  Repository-scoped bootstrap for using many coding agents in one repo — plus an
4
4
  optional picker for plugins, MCP servers, skills, and DESIGN.md documents.
5
5
 
6
- Supports **Claude Code, Codex, OpenCode, and Antigravity.**
6
+ Supports **Claude Code, Codex, OpenCode, Antigravity, GitHub Copilot CLI, and VS Code Copilot.**
7
7
 
8
8
  One shared instruction file (`AGENTS.md`) and one shared skills directory
9
9
  (`.agents/skills`) serve every tool. Only the per-tool config files are written,
@@ -118,7 +118,7 @@ MIT
118
118
 
119
119
  # 한국어
120
120
 
121
- Claude Code, Codex, OpenCode, Antigravity를 **한 저장소에서 함께** 쓰기 위한
121
+ Claude Code, Codex, OpenCode, Antigravity, GitHub Copilot CLI, VS Code Copilot을 **한 저장소에서 함께** 쓰기 위한
122
122
  저장소 범위 부트스트랩과 선택 항목 설치기입니다.
123
123
 
124
124
  공통 지침은 루트 `AGENTS.md` 하나, 공통 스킬은 `.agents/skills` 하나로 두고,
@@ -7,13 +7,17 @@ import {
7
7
  // 도구 추가 = dirs 한 줄 + files 한 줄. 실행 로직은 apply.mjs·adapter.mjs에 있다.
8
8
  export const MANIFEST = {
9
9
  // 완료 리포트에 그대로 나열되는 도구 이름. 순서가 출력 순서다.
10
- tools: ['Claude Code', 'Codex', 'OpenCode', 'Antigravity'],
10
+ tools: ['Claude Code', 'Codex', 'OpenCode', 'Antigravity', 'GitHub Copilot CLI', 'VS Code Copilot'],
11
11
 
12
12
  dirs: ['.agents/skills', '.agent-kit', '.claude', '.codex'],
13
13
 
14
14
  // 없을 때만 생성한다. 이미 있으면 내용을 보지 않고 보존한다.
15
15
  // Antigravity는 루트 AGENTS.md와 .agents/skills를 네이티브로 읽고 프로젝트
16
16
  // 설정 파일이 없다(2026-07-18 검증) — 만들 파일이 없다.
17
+ // GitHub Copilot CLI와 VS Code Copilot도 같다(2026-11-06): 둘 다 AGENTS.md와
18
+ // .agents/skills를 네이티브로 읽는다. VS Code의 chat.useAgentsMdFile은 기본값이
19
+ // true라(1.145.1 번들에서 확인) .vscode/settings.json에 보장할 키가 없다 —
20
+ // 이 키를 보장하던 1.x와 달라진 점이다.
17
21
  files: [
18
22
  { path: 'AGENTS.md', template: AGENTS_TEMPLATE },
19
23
  { path: '.agents/skills/README.md', template: SKILL_README },
package/lib/catalog.mjs CHANGED
@@ -60,6 +60,9 @@ export function shellQuote(text, platform = process.platform) {
60
60
 
61
61
  const execFileAsync = promisify(execFile)
62
62
 
63
+ // 셸이 따옴표 없이도 한 단어로 읽는 명령 이름(npx·claude·git 등).
64
+ const BARE_COMMAND = /^[A-Za-z0-9_.-]+$/
65
+
63
66
  // 외부 명령 하나에 주는 시간. npx·git clone이 네트워크에서 멈추면 예전에는
64
67
  // 영원히 기다렸다 — Ctrl+C도 항목 경계에서만 보므로 그 항목이 끝나야 멈췄다.
65
68
  // 10분이면 gsd(3,500파일)·ECC 같은 큰 설치도 끝나고, 멈춘 명령은 결국 실패로
@@ -85,7 +88,11 @@ export function makeExec(dryRun, log = console.log, t = null) {
85
88
  const shell = opts.shell ?? process.platform === 'win32'
86
89
  // shell + 인자 배열을 함께 넘기면 Node가 DEP0190으로 경고한다(인자가 quote 없이 이어붙기 때문).
87
90
  // 어차피 우리가 직접 quote하므로, 완성된 한 줄 명령을 넘기고 인자 배열은 비운다.
88
- const [file, fileArgs] = shell ? [[cmd, ...args].map((s) => shellQuote(s)).join(' '), []] : [cmd, args]
91
+ // 명령 이름은 메타문자가 없으면 감싸지 않는다 — cmd.exe는 따옴표로 감싼
92
+ // 확장자 없는 이름("npx")을 PATH에서 찾으면 그 배치 안의 %~dp0를 현재
93
+ // 디렉터리로 풀어, npx.cmd가 node_modules\npm을 못 찾고 죽는다.
94
+ const head = BARE_COMMAND.test(cmd) ? cmd : shellQuote(cmd)
95
+ const [file, fileArgs] = shell ? [[head, ...args.map((s) => shellQuote(s))].join(' '), []] : [cmd, args]
89
96
  try {
90
97
  // execFile은 stdio를 강제로 파이프로 고정하고 옵션으로 넘겨도 무시한다 —
91
98
  // 그래서 stdout·stderr는 버퍼링이 공짜로 따라온다. 문제는 stdin이다:
package/lib/clis.mjs CHANGED
@@ -1,4 +1,4 @@
1
- // 2.0.0이 지원하는 네 CLI. 설치는 각 CLI의 공식 명령이 맡으므로 여기에는
1
+ // 지원하는 여섯 CLI. 설치는 각 CLI의 공식 명령이 맡으므로 여기에는
2
2
  // 이름과 실행 파일만 둔다 — 설정 파일 경로와 쓰기 어댑터는 더는 없다.
3
3
  export const CLIS = {
4
4
  claude: { label: 'Claude Code', bin: 'claude' },
@@ -6,6 +6,10 @@ export const CLIS = {
6
6
  opencode: { label: 'OpenCode', bin: 'opencode' },
7
7
  // Antigravity CLI의 실행 파일 이름은 agy다.
8
8
  antigravity: { label: 'Antigravity', bin: 'agy' },
9
+ copilot: { label: 'GitHub Copilot CLI', bin: 'copilot' },
10
+ // VS Code Copilot에는 설치 명령이 없다(`code --add-mcp`는 제거·목록이 없다).
11
+ // `code`는 "VS Code가 이 머신에 있다"는 신호로만 쓰고, 설정은 파일로 쓴다.
12
+ vscode: { label: 'VS Code Copilot', bin: 'code' },
9
13
  }
10
14
 
11
15
  export const CLI_IDS = Object.keys(CLIS)
package/lib/engine.mjs CHANGED
@@ -6,19 +6,20 @@ import { createProbe } from './probe.mjs'
6
6
  // 항목처럼 probe를 안 쓰는 detect는 그냥 무시한다.
7
7
  export async function scan(root, items, { probe = null, scope = 'project' } = {}) {
8
8
  const shared = probe ?? createProbe({ root, scope, exec: makeExec(false) })
9
- const states = []
10
- for (const item of items) {
9
+ // 항목 감지를 함께 돌린다 — 감지는 읽기뿐이고 같은 CLI 질의는 probe가 한 번으로
10
+ // 묶는다. 차례로 돌리면 서로 다른 목록 명령(codex 수십 초, npx skills 십여 초)의
11
+ // 시간이 더해져 전역 스캔이 1분을 넘겼다. Promise.all은 순서를 지킨다.
12
+ return Promise.all(items.map(async (item) => {
11
13
  try {
12
14
  const r = await item.detect({ root, probe: shared })
13
15
  // excluded는 "이 머신에 없는 CLI"를 알리는 자리다 — 행 힌트가 supports를
14
16
  // 나열할 때 그 CLI를 빼고 따로 표시한다. result는 감지 결과 전체로,
15
17
  // 레시피 항목의 steps()가 어느 CLI에 이미 있는지(present)를 읽는다.
16
- states.push({ item, status: r.status, detail: r.detail, excluded: r.excluded ?? [], result: r })
18
+ return { item, status: r.status, detail: r.detail, excluded: r.excluded ?? [], result: r }
17
19
  } catch (err) {
18
- states.push({ item, status: 'absent', detail: msg('item.scanFailed', { message: err.message }) })
20
+ return { item, status: 'absent', detail: msg('item.scanFailed', { message: err.message }) }
19
21
  }
20
- }
21
- return states
22
+ }))
22
23
  }
23
24
 
24
25
  // item.exclusive는 "이 항목들은 같은 파일 하나를 두고 다툰다"는 표시다.
@@ -232,13 +232,15 @@ export default {
232
232
  // 항목 카탈로그 — note·unsupported 사유·detect()의 detail은 만들어지는 시점에
233
233
  // 로케일을 모른다. catalog.mjs·lib/items/*가 여기 키를 담아 두고, 표시하는
234
234
  // 쪽이 렌더 시점에 t나 toText로 푼다.
235
- 'item.unsupported.eccScale': 'upstream supports OpenCode and Antigravity through ./install.sh --target, but its skills/ holds 284 entries that would swamp the shared directory — only the plugin route is wired',
235
+ 'item.unsupported.eccScale': 'upstream supports OpenCode, Antigravity and Copilot CLI through ./install.sh --target, but its skills/ holds 284 entries that would swamp the shared directory — only the plugin route is wired',
236
236
  'item.unsupported.uaUser': 'upstream install.sh clones into ~/.understand-anything and links from the home directory — a script, not a CLI command, so this installer cannot detect or remove it',
237
237
  'item.unsupported.cliAnythingCodex': 'upstream\'s codex-skill installer is a script that writes to $CODEX_HOME/skills (or ~/.codex/skills), not a Codex command',
238
238
  'item.unsupported.cliAnythingManual': 'upstream gives OpenCode no installer, only a manual copy of the commands files',
239
239
  'item.unsupported.mattpocockRegistry': 'upstream documents npx skills add — the shared-skill edition skill.mattpocock-skills covers this CLI',
240
240
  'item.unsupported.unmeasuredUpstream': 'upstream has an install command, but the detect/remove path has not been verified, so it is not wired yet — you can install it by hand with the command in the upstream README',
241
241
  'item.unsupported.upstreamNone': 'no official install path upstream',
242
+ 'item.unsupported.vscodePlugin': 'VS Code Copilot has no command that installs plugins (only the Chat: Install Plugin From Source action in the UI)',
243
+ 'item.unsupported.cliAnythingCopilot': 'upstream documents Copilot CLI only as an install from a local clone, labeled community',
242
244
  'item.unsupported.userOnly': 'this CLI installs it only user-globally — switch the scope to Global',
243
245
  'item.unsupported.projectOnly': 'this CLI installs it only per repository — switch the scope to Repo',
244
246
  'item.probeFailed': 'could not read install state: {list}',
@@ -265,6 +267,8 @@ export default {
265
267
  'activation.cli.codex': 'run codex and start a new session',
266
268
  'activation.cli.opencode': 'restart OpenCode',
267
269
  'activation.cli.antigravity': 'restart Antigravity',
270
+ 'activation.cli.copilot': 'start copilot fresh (an open copilot session can make the install fail with "os error 5" — close it and retry)',
271
+ 'activation.cli.vscode': 'reload the VS Code window (Developer: Reload Window) — MCP servers start only after you trust them once',
268
272
  'activation.hooks.codex': 'hooks ({items}): in codex type /hooks, trust the new lifecycle hooks, then start a new session',
269
273
 
270
274
  'item.mcp.notion.note': 'auth: OAuth on first use in each CLI',
@@ -274,20 +278,23 @@ export default {
274
278
  'item.mcp.graft.note': 'serves a codebase knowledge graph as six MCP tools (find_code, trace_calls, file_api and more). Runs as npx -y @nanonets/graft mcp, so nothing to install, but build the graph (graft/) first with graft build (the structural graph needs no LLM key). On Windows the tree-sitter-kotlin dependency needs a C++ toolchain to compile and Node 24 cannot compile it at all (upstream #400) — use Node 22 plus the VS C++ workload. The upstream graft init edits AGENTS.md, GEMINI.md and hooks directly, so it is not used',
275
279
  'item.mcp.graphify.note': 'needs the graphify-mcp binary on PATH. Install: uv tool install "graphifyy[mcp]". Reads graphify-out/graph.json — build it first with /graphify .',
276
280
  'item.mcp.headroom.note': 'needs the headroom binary on PATH. Install: uv tool install --python 3.13 "headroom-ai[proxy,mcp]". The proxy (headroom wrap) is a way of launching, not repo config',
277
- 'item.plugin.superpowers.note': 'official marketplace plugin for Claude Code. Codex, OpenCode and Antigravity use the install command upstream documents for each',
281
+ 'item.plugin.superpowers.note': 'official marketplace plugin for Claude Code. Codex, OpenCode, Antigravity and Copilot CLI use the install command upstream documents for each',
278
282
  'item.plugin.mattpocock-skills.note': '35 engineering and productivity skills (code-review, diagnosing-bugs, domain-modeling, …)',
279
- 'item.plugin.ponytail.note': 'lean-code ruleset. Installs with each CLI\'s own command — Claude and OpenCode per repository or user-globally, Codex and Antigravity user-globally. Upstream recommends scripts/uninstall.js to clean ~/.config/ponytail before removal',
280
- 'item.mcp.oauth.post': 'sign in once with OAuth — in Codex run codex mcp login <server name>; Claude Code, OpenCode and Antigravity ask on first use',
283
+ 'item.plugin.ponytail.note': 'lean-code ruleset. Installs with each CLI\'s own command — Claude and OpenCode per repository or user-globally, Codex, Antigravity and Copilot CLI user-globally. Upstream recommends scripts/uninstall.js to clean ~/.config/ponytail before removal',
284
+ 'item.mcp.oauth.post': 'sign in once with OAuth — in Codex run codex mcp login <server name>; Claude Code, OpenCode, Antigravity, Copilot CLI and VS Code Copilot ask on first use',
281
285
  'item.plugin.ponytail.post': 'Node.js must be on PATH for the always-on hook to run',
282
- 'item.plugin.ai-memory.note': 'long-term memory shared across agents, backed by your own ai-memory server. Claude Code and Codex get the upstream marketplace plugin (hooks and skills); OpenCode and Antigravity get the stdio bridge (ai-memory mcp-bridge --no-session-id) as an MCP server — the bridge reads its token from the data directory, so it never lands in a config file',
286
+ 'item.plugin.ai-memory.note': 'long-term memory shared across agents, backed by your own ai-memory server. Claude Code and Codex get the upstream marketplace plugin (hooks and skills); OpenCode, Antigravity, Copilot CLI and VS Code Copilot get the stdio bridge (ai-memory mcp-bridge --no-session-id) as an MCP server (no hooks) — the bridge reads its token from the data directory, so it never lands in a config file',
283
287
  'item.plugin.ai-memory.post': 'install the ai-memory binary first (install.sh / install.ps1 from the upstream release), run ai-memory setup once, and resume a session with ai-memory run <agent>',
284
288
  'item.plugin.ecc.note': 'skills, instincts, memory and security for agent harnesses. Installed as a plugin — its skills/ holds 284 entries, too many to copy into the shared skills directory',
285
289
  'item.plugin.impeccable.note': 'design language for AI harnesses. This is the Claude Code plugin edition — pick the shared-skill edition skill.impeccable to reach the other CLIs too (only one of the two can be chosen)',
286
290
  'item.skill.impeccable.note': 'design language for AI harnesses, copied into the shared .agents/skills so all four CLIs see it (62 files, 2.3MB). Only one of this and the plugin edition can be chosen. The engine binary is not included — on first run the bundled scripts/impeccable downloads it and caches it in ~/.impeccable, which writes outside the repository',
287
291
  'item.plugin.cli-anything.note': 'harness plugin that turns GUI/desktop software into a Python CLI agents can drive. Generate with /cli-anything <source path or repo>, followed by the refine, test, validate and list commands. Fetching already-built CLIs from the hub is a separate thing, the cli-hub-meta-skill',
288
292
  'item.plugin.hyperframes.note': 'HyperFrames (HeyGen) bundle of 21 skills for writing video in HTML/CSS and rendering deterministic MP4. The /hyperframes router loads the promo, explainer, caption and motion-graphics workflows on demand. Rendering needs Node.js 22+ and FFmpeg. Other CLIs install it separately upstream, so only the plugin is wired',
289
- 'item.plugin.understand-anything.note': 'turns the codebase into an explorable knowledge graph. The script for other CLIs clones into ~/.understand-anything (user scope), so only the plugin is wired',
293
+ 'item.plugin.understand-anything.note': 'turns the codebase into an explorable knowledge graph. The script for other CLIs clones into ~/.understand-anything (user scope), so only the Claude plugin and the Copilot CLI plugin are wired',
290
294
  'item.skill.eli5.note': 'eli5 from the Anthropic community marketplace — turns /eli5 <topic> into an HTML picture explainer with big visuals and few words. Upstream ships it as a Claude plugin, but it is a single skill with no hooks or commands, so it is installed as the shared skill all four CLIs see',
295
+ 'item.skill.html-plan.note': 'html-plan from the Anthropic community marketplace — turns /html-plan <what to build> into one interactive HTML plan page with a claim tree, mockups and decision points. A single skill with no hooks or commands, so it is installed as a shared skill',
296
+ 'item.skill.unslop.note': 'redesigns vibecoded, AI-looking UI (purple gradients, glows, emoji labels and the like) in a direction drawn from the product. Licensed CC-BY-4.0 (attribution required)',
297
+ 'item.skill.agent-handoff-manager.note': 'experimental skill that saves and resumes work handoffs between agents. Its core is scripts/handoff.py, so Python 3.10+ must be on PATH; records go to .handoffs/ in the target repo',
291
298
  'item.skill.i-have-adhd.note': 'output shaping for an ADHD reader — next action first, numbered steps, no tangents, restated progress, no preamble or closers. Turn on with /i-have-adhd, off with "stop adhd mode". Always-on is what the upstream Claude plugin edition adds through its hook; this item instead installs the shared skill that all four CLIs see',
292
299
  'item.skill.caveman.note': 'cuts output tokens by answering in caveman-speak; code and errors stay byte-exact. Toggle with /caveman',
293
300
  'item.skill.taste.note': 'anti-slop frontend skill for landing pages, portfolios and redesigns (skill name: design-taste-frontend)',
@@ -306,7 +313,7 @@ export default {
306
313
  'item.skill.im-not-ai.note': 'copies 4 skills (humanize-korean plus the humanize, humanize-scan and humanize-redo entry points; 22 files, 420KB) that rewrite AI-written Korean text so it reads human, into the shared .agents/skills for all four CLIs. Only the skills come along — upstream\'s 9 subagents live outside the skill folders, so the multi-call heavy route runs only where the CLI can run subagents itself or via the upstream Claude plugin',
307
314
  'item.skill.officecli.note': 'copies a skill for reading, editing and creating Word, Excel and PowerPoint documents (.docx, .xlsx, .pptx) into the shared .agents/skills. The skill drives the officecli binary, so officecli is required on PATH — npm install -g @officecli/officecli or the upstream install.sh/install.ps1. No Office installation needed',
308
315
  'item.skill.gstack.note': 'repo-local clone + setup (needs bash; Git Bash on Windows). Runtime state (~/.gstack) may be created globally. In a bootstrapped repository .claude/skills is a junction, so the files land in the shared .agents/skills — codex and opencode scan recursively and see the individual skills too',
309
- 'item.skill.gsd.note': 'npx @opengsd/gsd-core, installed per project — one command per runtime for claude, codex and opencode (.claude/commands, .codex/skills, .opencode/skills). Each runtime writes roughly 700 files. Antigravity has an upstream flag, but its install path is not measured yet',
316
+ 'item.skill.gsd.note': 'npx @opengsd/gsd-core, installed per project — one command per runtime for claude, codex, opencode and copilot (.claude/commands, .codex/skills, .opencode/skills, .github/skills). Each runtime writes roughly 700 files. Antigravity has an upstream flag, but its install path is not measured yet',
310
317
  // 커밋 템플릿은 CLI 배선이 아니라 저장소 규약이다 — note가 "무엇이 놓이고
311
318
  // 무엇이 설정되는가"를 대신 말한다(상세 패널에 배선표가 없다).
312
319
  'item.config.gitmessage.en.note': 'commit messages in English. Writes the template and points git commit.template at it, so it opens in every editor and every tool in this repository. Also sets VS Code to open the commit editor and to apply the template to Copilot message generation (.vscode/settings.json, only keys not already set)',
@@ -446,6 +453,7 @@ export default {
446
453
  'action.scope.label': 'Install scope',
447
454
  'action.scope.hint': 'now: {current} · Enter switches repo ↔ user-global',
448
455
  'tui.scope.switched': 'Scope: {current}',
456
+ 'tui.scope.scanning': 'Scanning {current} installs — CLI list commands can take up to a minute…',
449
457
  'action.bootstrap.label': 'Run bootstrap',
450
458
  'action.bootstrap.hint': 'guides · skills · per-tool config · {present} of {total} files exist',
451
459
  'action.sync.installed.label': 'Update installed',
@@ -225,12 +225,14 @@ export default {
225
225
  'error.noRecordForUpdate': '{path}이 없습니다. 이 저장소를 기록 체계로 끌어오려면 먼저 `bootstrap --adopt`를 실행하세요 — 파일을 만들지 않고 기록만 만듭니다.',
226
226
 
227
227
  // 항목 카탈로그 — 기존 원문을 그대로 옮긴다. en.mjs 쪽 주석 참고.
228
- 'item.unsupported.eccScale': '상류는 OpenCode·Antigravity를 ./install.sh --target으로 지원하지만 skills/에 284개가 들어 있어 공유 디렉터리를 덮습니다 — 플러그인 경로만 배선합니다',
228
+ 'item.unsupported.eccScale': '상류는 OpenCode·Antigravity·Copilot CLI를 ./install.sh --target으로 지원하지만 skills/에 284개가 들어 있어 공유 디렉터리를 덮습니다 — 플러그인 경로만 배선합니다',
229
229
  'item.unsupported.uaUser': '상류 install.sh가 ~/.understand-anything에 클론하고 홈에 링크를 겁니다 — CLI 명령이 아닌 스크립트라 이 설치기가 감지·제거할 수 없습니다',
230
230
  'item.unsupported.cliAnythingCodex': '상류 codex-skill 설치기는 Codex 명령이 아니라 $CODEX_HOME/skills(없으면 ~/.codex/skills)에 쓰는 스크립트입니다',
231
231
  'item.unsupported.cliAnythingManual': '상류가 OpenCode에는 설치기 없이 commands 파일을 직접 복사하라고만 안내합니다',
232
232
  'item.unsupported.mattpocockRegistry': '상류는 npx skills add를 안내합니다 — 공유 스킬 판 skill.mattpocock-skills가 이 CLI를 맡습니다',
233
233
  'item.unsupported.upstreamNone': '상류에 공식 설치 경로가 없습니다',
234
+ 'item.unsupported.vscodePlugin': 'VS Code Copilot에는 플러그인을 설치하는 명령이 없습니다(화면에서 Chat: Install Plugin From Source만 있음)',
235
+ 'item.unsupported.cliAnythingCopilot': '상류가 Copilot CLI에는 커뮤니티 표기와 함께 로컬 클론을 설치하는 방법만 안내합니다',
234
236
  'item.unsupported.userOnly': '이 CLI는 사용자 전역으로만 설치합니다 — 범위를 전역으로 바꾸세요',
235
237
  'item.unsupported.projectOnly': '이 CLI는 저장소 단위로만 설치합니다 — 범위를 저장소로 바꾸세요',
236
238
  'item.probeFailed': '설치 상태를 읽지 못했습니다: {list}',
@@ -258,6 +260,8 @@ export default {
258
260
  'activation.cli.codex': 'codex를 실행해 새 세션을 시작하세요',
259
261
  'activation.cli.opencode': 'OpenCode를 재시작하세요',
260
262
  'activation.cli.antigravity': 'Antigravity를 재시작하세요',
263
+ 'activation.cli.copilot': 'copilot을 새로 실행하세요 (다른 copilot 세션이 열려 있으면 설치가 "os error 5"로 실패할 수 있으니 닫고 다시 시도)',
264
+ 'activation.cli.vscode': 'VS Code 창을 다시 로드하세요 (Developer: Reload Window) — MCP 서버는 신뢰를 한 번 승인해야 시작합니다',
261
265
  'activation.hooks.codex': '훅({items}): codex에서 /hooks를 입력해 새 라이프사이클 훅을 Trust한 뒤 새 세션을 시작하세요',
262
266
 
263
267
  'item.mcp.notion.note': '인증: 각 CLI 첫 사용 시 OAuth',
@@ -267,20 +271,23 @@ export default {
267
271
  'item.mcp.graft.note': '코드베이스 지식 그래프를 MCP 도구 6종(find_code·trace_calls·file_api 등)으로 냅니다. npx -y @nanonets/graft mcp로 실행하므로 별도 설치는 없지만, graft build로 그래프(graft/)를 먼저 만드세요(구조 그래프는 LLM 키 불필요). Windows는 의존성 tree-sitter-kotlin이 C++ 툴체인 컴파일을 요구하고 Node 24는 컴파일이 안 됩니다(상류 #400) — Node 22 + VS C++ 워크로드가 필요합니다. 상류 graft init은 AGENTS.md·GEMINI.md·훅을 직접 고치므로 쓰지 않습니다',
268
272
  'item.mcp.graphify.note': 'PATH에 graphify-mcp 바이너리 필요. 설치: uv tool install "graphifyy[mcp]". graphify-out/graph.json을 읽으므로 /graphify .로 그래프를 먼저 만드세요',
269
273
  'item.mcp.headroom.note': 'PATH에 headroom 바이너리 필요. 설치: uv tool install --python 3.13 "headroom-ai[proxy,mcp]". 프록시(headroom wrap)는 실행 방식이라 저장소 설정 대상이 아닙니다',
270
- 'item.plugin.superpowers.note': '공식 마켓플레이스 플러그인. Codex·OpenCode·Antigravity는 상류가 안내하는 각자의 설치 명령을 씁니다',
274
+ 'item.plugin.superpowers.note': '공식 마켓플레이스 플러그인. Codex·OpenCode·Antigravity·Copilot CLI는 상류가 안내하는 각자의 설치 명령을 씁니다',
271
275
  'item.plugin.mattpocock-skills.note': '엔지니어링·생산성 스킬 35종 (code-review, diagnosing-bugs, domain-modeling 등)',
272
- 'item.plugin.ponytail.note': '군더더기 없는 코드 규칙 묶음. 각 CLI의 명령으로 설치합니다 — Claude·OpenCode는 저장소 또는 사용자 전역, Codex·Antigravity는 사용자 전역입니다. 상류는 제거 전에 scripts/uninstall.js로 ~/.config/ponytail을 정리하라고 안내합니다',
273
- 'item.mcp.oauth.post': 'OAuth 로그인을 한 번 해야 합니다 — Codex는 codex mcp login <서버 이름>을 실행하고, Claude Code·OpenCode·Antigravity는 처음 쓸 때 묻습니다',
276
+ 'item.plugin.ponytail.note': '군더더기 없는 코드 규칙 묶음. 각 CLI의 명령으로 설치합니다 — Claude·OpenCode는 저장소 또는 사용자 전역, Codex·Antigravity·Copilot CLI는 사용자 전역입니다. 상류는 제거 전에 scripts/uninstall.js로 ~/.config/ponytail을 정리하라고 안내합니다',
277
+ 'item.mcp.oauth.post': 'OAuth 로그인을 한 번 해야 합니다 — Codex는 codex mcp login <서버 이름>을 실행하고, Claude Code·OpenCode·Antigravity·Copilot CLI·VS Code Copilot은 처음 쓸 때 묻습니다',
274
278
  'item.plugin.ponytail.post': '상시 활성화 훅이 돌려면 Node.js가 PATH에 있어야 합니다',
275
- 'item.plugin.ai-memory.note': '에이전트 사이에 공유하는 장기 기억 — 직접 띄운 ai-memory 서버를 씁니다. Claude Code·Codex는 상류 마켓플레이스 플러그인(훅·스킬)을, OpenCode·Antigravity는 stdio 브리지(ai-memory mcp-bridge --no-session-id)를 MCP로 겁니다 — 토큰은 브리지가 데이터 디렉터리에서 읽어 설정 파일에 남지 않습니다',
279
+ 'item.plugin.ai-memory.note': '에이전트 사이에 공유하는 장기 기억 — 직접 띄운 ai-memory 서버를 씁니다. Claude Code·Codex는 상류 마켓플레이스 플러그인(훅·스킬)을, OpenCode·Antigravity·Copilot CLI·VS Code Copilot은 stdio 브리지(ai-memory mcp-bridge --no-session-id)를 MCP로 겁니다(훅은 없음) — 토큰은 브리지가 데이터 디렉터리에서 읽어 설정 파일에 남지 않습니다',
276
280
  'item.plugin.ai-memory.post': 'ai-memory 바이너리를 먼저 설치하고(상류 릴리스의 install.sh / install.ps1) ai-memory setup을 한 번 실행하세요. 세션 이어받기는 ai-memory run <agent>입니다',
277
281
  'item.plugin.ecc.note': '에이전트 하네스용 스킬·본능·메모리·보안 묶음. skills/에 284개가 들어 있어 공유 스킬 디렉터리에 복사하지 않고 플러그인으로 설치합니다',
278
282
  'item.plugin.impeccable.note': 'AI 하네스용 디자인 언어. Claude Code 플러그인 판입니다 — 다른 CLI까지 함께 보려면 공유 스킬 판 skill.impeccable을 고르세요(둘 중 하나만 고를 수 있습니다)',
279
283
  'item.skill.impeccable.note': 'AI 하네스용 디자인 언어를 공유 .agents/skills에 복사해 네 CLI가 함께 봅니다(62개 파일, 2.3MB). 플러그인 판과 하나만 고를 수 있습니다. 엔진 바이너리는 포함되지 않아 첫 실행 때 스킬의 scripts/impeccable이 네트워크로 받아 홈의 ~/.impeccable에 캐시합니다 — 저장소 밖에 쓰는 동작입니다',
280
284
  'item.plugin.cli-anything.note': 'GUI·데스크톱 소프트웨어를 에이전트가 쓸 수 있는 Python CLI로 만들어 주는 하네스 플러그인입니다. /cli-anything <소스 경로 또는 저장소> 로 생성하고 refine·test·validate·list 명령이 따릅니다. 이미 만들어진 CLI를 허브에서 받는 것은 별개의 cli-hub-meta-skill입니다',
281
285
  'item.plugin.hyperframes.note': 'HTML·CSS로 영상을 쓰고 결정적 MP4로 렌더하는 HyperFrames(HeyGen) 스킬 21종 번들입니다. /hyperframes 라우터가 홍보·설명·자막·모션 그래픽 워크플로를 필요할 때 불러옵니다. 렌더에는 Node.js 22+와 FFmpeg가 필요합니다. 다른 CLI는 상류가 CLI별 별도 설치로 안내해 플러그인만 배선합니다',
282
- 'item.plugin.understand-anything.note': '코드베이스를 탐색 가능한 지식 그래프로 만듭니다. 다른 CLI용 스크립트는 ~/.understand-anything에 클론하는 사용자 스코프라 플러그인만 배선합니다',
286
+ 'item.plugin.understand-anything.note': '코드베이스를 탐색 가능한 지식 그래프로 만듭니다. 다른 CLI용 스크립트는 ~/.understand-anything에 클론하는 사용자 스코프라 Claude 플러그인과 Copilot CLI 플러그인만 배선합니다',
283
287
  'item.skill.eli5.note': 'Anthropic 커뮤니티 마켓플레이스의 eli5 — /eli5 <주제>를 큰 그림과 짧은 글의 HTML 설명서로 만듭니다. 상류는 Claude 플러그인이지만 훅·명령 없이 스킬 하나라, 네 CLI가 함께 보는 공유 스킬로 넣습니다',
288
+ 'item.skill.html-plan.note': 'Anthropic 커뮤니티 마켓플레이스의 html-plan — /html-plan <만들 것>을 주장 트리·목업·결정 지점이 담긴 대화형 HTML 계획서 한 장으로 만듭니다. 훅·명령 없이 스킬 하나라 공유 스킬로 넣습니다',
289
+ 'item.skill.unslop.note': 'AI가 만든 티가 나는 UI(보라 그라데이션·글로·이모지 라벨 등)를 제품에 맞는 방향으로 다시 디자인하는 스킬. 라이선스는 CC-BY-4.0(저작자 표시)입니다',
290
+ 'item.skill.agent-handoff-manager.note': '에이전트 사이 작업 인계를 저장하고 이어받는 실험적 스킬. 본체가 scripts/handoff.py라 Python 3.10 이상이 PATH에 있어야 하고, 기록은 대상 저장소의 .handoffs/에 쌓입니다',
284
291
  'item.skill.i-have-adhd.note': 'ADHD 독자를 위한 출력 형식 — 다음 행동부터, 단계는 번호로, 곁길 억제, 진행 상태 재진술, 서두·맺음말 없음. /i-have-adhd로 켜고 "stop adhd mode"로 끕니다. 상시 적용은 상류 Claude 플러그인 판의 훅이 담당하는데, 이 항목은 그 대신 네 CLI가 함께 보는 공유 스킬로 넣습니다',
285
292
  'item.skill.caveman.note': '원시인 말투로 답해 출력 토큰을 줄입니다. 코드와 오류는 그대로 둡니다. /caveman으로 켜고 끕니다',
286
293
  'item.skill.taste.note': '랜딩 페이지·포트폴리오·리디자인용 안티슬롭 프런트엔드 스킬 (스킬 이름: design-taste-frontend)',
@@ -299,7 +306,7 @@ export default {
299
306
  'item.skill.im-not-ai.note': 'AI가 쓴 한글을 사람 글처럼 윤문하는 스킬 4종(humanize-korean 본체와 humanize·humanize-scan·humanize-redo 진입점, 22개 파일 420KB)을 공유 .agents/skills에 복사해 네 CLI가 함께 봅니다. 스킬만 들어옵니다 — 상류 서브에이전트 9종은 스킬 폴더 밖에 있어, 다중 호출 heavy 경로는 CLI가 서브에이전트를 직접 돌릴 수 있거나 상류 Claude 플러그인을 쓸 때만 동작합니다',
300
307
  'item.skill.officecli.note': 'Word·Excel·PowerPoint(.docx·.xlsx·.pptx) 문서를 읽고 고치고 만드는 스킬을 공유 .agents/skills에 복사합니다. 스킬이 officecli 바이너리를 구동하므로 PATH에 officecli가 필요합니다 — npm install -g @officecli/officecli 또는 상류 install.sh·install.ps1. Office 설치는 필요 없습니다',
301
308
  'item.skill.gstack.note': '저장소 로컬 clone + setup (bash 필요, Windows는 Git Bash). 런타임 상태(~/.gstack)는 전역에 생길 수 있음. 부트스트랩 저장소에서는 .claude/skills가 Junction이라 실물이 공유 .agents/skills에 앉습니다 — codex·opencode는 재귀 스캔이라 개별 스킬까지 함께 봅니다',
302
- 'item.skill.gsd.note': 'npx @opengsd/gsd-core 프로젝트 로컬 설치 — claude·codex·opencode 런타임마다 명령 한 줄로 배선합니다(.claude/commands, .codex/skills, .opencode/skills). 런타임마다 700개 안팎의 파일이 생깁니다. Antigravity는 상류 플래그가 있지만 설치 경로를 아직 실측하지 못했습니다',
309
+ 'item.skill.gsd.note': 'npx @opengsd/gsd-core 프로젝트 로컬 설치 — claude·codex·opencode·copilot 런타임마다 명령 한 줄로 배선합니다(.claude/commands, .codex/skills, .opencode/skills, .github/skills). 런타임마다 700개 안팎의 파일이 생깁니다. Antigravity는 상류 플래그가 있지만 설치 경로를 아직 실측하지 못했습니다',
303
310
  // 커밋 템플릿은 CLI 배선이 아니라 저장소 규약이다 — en.mjs 쪽 주석 참고.
304
311
  'item.config.gitmessage.en.note': '커밋 메시지를 영어로 씁니다. 템플릿을 놓고 git commit.template이 그것을 가리키게 하므로, 저장소의 모든 편집기와 도구에서 함께 열립니다. VS Code가 커밋 에디터를 열고 Copilot 생성에도 템플릿을 쓰도록 .vscode/settings.json에 키도 더합니다(이미 있는 키는 그대로)',
305
312
  'item.config.gitmessage.ko.note': '커밋 메시지를 한국어로 씁니다. 템플릿을 놓고 git commit.template이 그것을 가리키게 하므로, 저장소의 모든 편집기와 도구에서 함께 열립니다. VS Code가 커밋 에디터를 열고 Copilot 생성에도 템플릿을 쓰도록 .vscode/settings.json에 키도 더합니다(이미 있는 키는 그대로)',
@@ -433,6 +440,7 @@ export default {
433
440
  'action.scope.label': '설치 범위',
434
441
  'action.scope.hint': '현재: {current} · Enter로 저장소 ↔ 사용자 전역 전환',
435
442
  'tui.scope.switched': '범위: {current}',
443
+ 'tui.scope.scanning': '{current} 설치 상태를 확인하는 중 — CLI 목록 명령이라 1분 가까이 걸릴 수 있습니다…',
436
444
  'action.bootstrap.label': '부트스트랩 실행',
437
445
  'action.bootstrap.hint': '지침 · 스킬 · 도구별 설정 · 파일 {total}개 중 {present}개 존재',
438
446
  'action.sync.installed.label': '설치본 업데이트',
@@ -3,8 +3,8 @@ import { marketplacePlugin, mcpServer } from '../recipe-helpers.mjs'
3
3
 
4
4
  // akitaonrails/ai-memory(MIT). Claude·Codex는 상류 마켓플레이스 플러그인(훅·스킬
5
5
  // 포함, README "Claude Code and Codex users can wire their agent as a
6
- // marketplace plugin"), OpenCode·Antigravity는 상류 docs/install.md가 다른
7
- // 클라이언트에 쓰는 stdio 브리지(`ai-memory mcp-bridge --no-session-id`)를
6
+ // marketplace plugin"), OpenCode·Antigravity·Copilot CLI·VS Code Copilot은 상류 docs/install.md가
7
+ // 다른 클라이언트에 쓰는 stdio 브리지(`ai-memory mcp-bridge --no-session-id`)를
8
8
  // MCP로 건다 — 브리지가 데이터 디렉터리의 토큰 파일을 실행 때 읽으므로 토큰이
9
9
  // 설정에 닿지 않는다. 어느 쪽이든 ai-memory 바이너리와 서버가 먼저 있어야
10
10
  // 한다(postInstall 안내). `ai-memory setup`의 전역 배선은 대신하지 않는다.
@@ -15,13 +15,13 @@ const plugin = marketplacePlugin({
15
15
  const bridge = mcpServer({
16
16
  name: 'ai-memory',
17
17
  server: { kind: 'stdio', command: 'ai-memory', args: ['mcp-bridge', '--no-session-id'] },
18
- clis: ['opencode', 'antigravity'],
18
+ clis: ['opencode', 'antigravity', 'copilot', 'vscode'],
19
19
  })
20
20
 
21
21
  export default defineRecipe({
22
22
  id: 'plugin.ai-memory', category: 'plugin', label: 'ai-memory', group: '__context',
23
23
  note: 'item.plugin.ai-memory.note',
24
- verified: '2026-10-24',
24
+ verified: '2026-11-06',
25
25
  hooks: true,
26
26
  postInstall: 'item.plugin.ai-memory.post',
27
27
  recipes: { ...plugin.recipes, ...bridge.recipes },
@@ -20,5 +20,7 @@ export default defineRecipe({
20
20
  codex: 'item.unsupported.cliAnythingCodex',
21
21
  opencode: 'item.unsupported.cliAnythingManual',
22
22
  antigravity: 'item.unsupported.upstreamNone',
23
+ copilot: 'item.unsupported.cliAnythingCopilot',
24
+ vscode: 'item.unsupported.vscodePlugin',
23
25
  },
24
26
  })
@@ -19,5 +19,11 @@ export default defineRecipe({
19
19
  claude: { marketplace: 'affaan-m/ECC', id: 'ecc@ecc' },
20
20
  codex: { marketplace: 'affaan-m/ECC', id: 'ecc@ecc' },
21
21
  }),
22
- reasons: { opencode: 'item.unsupported.eccScale', antigravity: 'item.unsupported.eccScale' },
22
+ // Copilot CLI도 ./install.sh --target copilot 경로뿐이라 규모 문제가 같다.
23
+ reasons: {
24
+ opencode: 'item.unsupported.eccScale',
25
+ antigravity: 'item.unsupported.eccScale',
26
+ copilot: 'item.unsupported.eccScale',
27
+ vscode: 'item.unsupported.vscodePlugin',
28
+ },
23
29
  })
@@ -21,5 +21,7 @@ export default defineRecipe({
21
21
  codex: 'item.unsupported.superpowersSeparate',
22
22
  opencode: 'item.unsupported.superpowersSeparate',
23
23
  antigravity: 'item.unsupported.superpowersSeparate',
24
+ copilot: 'item.unsupported.superpowersSeparate',
25
+ vscode: 'item.unsupported.vscodePlugin',
24
26
  },
25
27
  })
@@ -19,5 +19,7 @@ export default defineRecipe({
19
19
  codex: 'item.unsupported.impeccableSkill',
20
20
  opencode: 'item.unsupported.impeccableSkill',
21
21
  antigravity: 'item.unsupported.impeccableSkill',
22
+ copilot: 'item.unsupported.impeccableSkill',
23
+ vscode: 'item.unsupported.impeccableSkill',
22
24
  },
23
25
  })
@@ -3,20 +3,24 @@ import { marketplacePlugin } from '../recipe-helpers.mjs'
3
3
 
4
4
  // 상류 README가 Claude 마켓플레이스와 함께 Codex 플러그인(`codex plugin
5
5
  // marketplace add mattpocock/skills` + `codex plugin add
6
- // mattpocock-skills@mattpocock`)을 안내한다(2026-10-24 확인). 그 밖의 에이전트는
6
+ // mattpocock-skills@mattpocock`)을 안내한다(2026-10-24 확인). Copilot CLI도 README가 같은 두 명령을 안내한다
7
+ // (2026-11-06 확인) — `~/.copilot/settings.json`의 extraKnownMarketplaces는 자동
8
+ // 갱신 설정이라 건드리지 않는다. 그 밖의 에이전트는
7
9
  // `npx skills add mattpocock/skills` — 이 저장소의 레지스트리 스킬 항목
8
10
  // (skill.mattpocock-skills)이 쓰는 바로 그 경로라 배타로 묶는다.
9
11
  export default defineRecipe({
10
12
  id: 'plugin.mattpocock-skills', category: 'plugin', label: 'Matt Pocock', group: '__flow',
11
13
  exclusive: 'mattpocock',
12
14
  note: 'item.plugin.mattpocock-skills.note',
13
- verified: '2026-10-24',
15
+ verified: '2026-11-06',
14
16
  ...marketplacePlugin({
15
17
  claude: { marketplace: 'mattpocock/skills', id: 'mattpocock-skills@mattpocock' },
16
18
  codex: { marketplace: 'mattpocock/skills', id: 'mattpocock-skills@mattpocock' },
19
+ copilot: { marketplace: 'mattpocock/skills', id: 'mattpocock-skills@mattpocock' },
17
20
  }),
18
21
  reasons: {
19
22
  opencode: 'item.unsupported.mattpocockRegistry',
20
23
  antigravity: 'item.unsupported.mattpocockRegistry',
24
+ vscode: 'item.unsupported.vscodePlugin',
21
25
  },
22
26
  })
@@ -3,14 +3,15 @@ import { marketplacePlugin } from '../recipe-helpers.mjs'
3
3
 
4
4
  // DietrichGebert/ponytail. 하니스별 공식 경로(상류 README·INSTALL.md, 2026-10-24):
5
5
  // Claude·Codex는 마켓플레이스, OpenCode는 opencode plugin, Antigravity는
6
- // agy plugin install <git URL>. Codex는 설치 후 /hooks에서 라이프사이클 훅
6
+ // agy plugin install <git URL>, Copilot CLI는 마켓플레이스(이 머신에서 설치·감지
7
+ // 확인, 2026-11-06). VS Code Copilot에는 플러그인 설치 명령이 없다. Codex는 설치 후 /hooks에서 라이프사이클 훅
7
8
  // 두 개를 신뢰해야 켜진다 — hooks: true가 활성화 안내에 그 단계를 싣는다.
8
9
  // 상류는 플러그인 제거 전에 scripts/uninstall.js로 ~/.config/ponytail 설정을
9
10
  // 정리하라고 안내한다 — 하니스마다 스크립트 위치가 달라 note로만 알린다.
10
11
  export default defineRecipe({
11
12
  id: 'plugin.ponytail', category: 'plugin', label: 'Ponytail', group: '__token',
12
13
  note: 'item.plugin.ponytail.note',
13
- verified: '2026-10-24',
14
+ verified: '2026-11-06',
14
15
  hooks: true,
15
16
  postInstall: 'item.plugin.ponytail.post',
16
17
  ...marketplacePlugin({
@@ -18,5 +19,7 @@ export default defineRecipe({
18
19
  codex: { marketplace: 'DietrichGebert/ponytail', id: 'ponytail@ponytail' },
19
20
  opencode: { module: '@dietrichgebert/ponytail' },
20
21
  antigravity: { source: 'https://github.com/DietrichGebert/ponytail', name: 'ponytail' },
22
+ copilot: { marketplace: 'DietrichGebert/ponytail', id: 'ponytail@ponytail' },
21
23
  }),
24
+ reasons: { vscode: 'item.unsupported.vscodePlugin' },
22
25
  })
@@ -5,17 +5,20 @@ import { marketplacePlugin } from '../recipe-helpers.mjs'
5
5
  // Superpowers separately for each one"). Claude는 공식 마켓플레이스
6
6
  // (claude-plugins-official, 추가 등록 불필요), Codex는 obra/superpowers-marketplace
7
7
  // (2026-08-15 헤드리스 실측), OpenCode는 git 모듈(.opencode/INSTALL.md),
8
- // Antigravity는 agy plugin install <git URL>(README). 같은 상류를 공유 스킬
8
+ // Antigravity는 agy plugin install <git URL>(README), Copilot CLI는 같은 마켓플레이스
9
+ // (README "GitHub Copilot CLI" 절). VS Code Copilot은 공식 경로가 없다. 같은 상류를 공유 스킬
9
10
  // (skill.superpowers)로도 넣을 수 있어 배타로 묶는다.
10
11
  export default defineRecipe({
11
12
  id: 'plugin.superpowers', category: 'plugin', label: 'superpowers', group: '__flow',
12
13
  exclusive: 'superpowers',
13
14
  note: 'item.plugin.superpowers.note',
14
- verified: '2026-10-24',
15
+ verified: '2026-11-06',
15
16
  ...marketplacePlugin({
16
17
  claude: { id: 'superpowers@claude-plugins-official', detectIds: ['superpowers@claude-plugins-official', 'superpowers@superpowers-marketplace'] },
17
18
  codex: { marketplace: 'obra/superpowers-marketplace', id: 'superpowers@superpowers-marketplace' },
18
19
  opencode: { module: 'superpowers@git+https://github.com/obra/superpowers.git' },
19
20
  antigravity: { source: 'https://github.com/obra/superpowers', name: 'superpowers' },
21
+ copilot: { marketplace: 'obra/superpowers-marketplace', id: 'superpowers@superpowers-marketplace' },
20
22
  }),
23
+ reasons: { vscode: 'item.unsupported.vscodePlugin' },
21
24
  })
@@ -8,13 +8,17 @@ import { marketplacePlugin } from '../recipe-helpers.mjs'
8
8
  export default defineRecipe({
9
9
  id: 'plugin.understand-anything', category: 'plugin', label: 'Understand Anything', group: '__context',
10
10
  note: 'item.plugin.understand-anything.note',
11
- verified: '2026-08-15',
11
+ verified: '2026-11-06',
12
12
  ...marketplacePlugin({
13
13
  claude: { marketplace: 'Egonex-AI/Understand-Anything', id: 'understand-anything@understand-anything' },
14
+ // README "Copilot CLI" 절의 명령(2026-11-06). 마켓 없이 하위 경로를 직접 설치하므로
15
+ // 목록에는 마켓 없는 이름으로 나올 것이다 — 직접 설치의 목록 모양은 실측하지 못했다.
16
+ copilot: { source: 'Egonex-AI/Understand-Anything:understand-anything-plugin', id: 'understand-anything' },
14
17
  }),
15
18
  reasons: {
16
19
  codex: 'item.unsupported.uaUser',
17
20
  opencode: 'item.unsupported.uaUser',
18
21
  antigravity: 'item.unsupported.uaUser',
22
+ vscode: 'item.unsupported.vscodePlugin',
19
23
  },
20
24
  })
@@ -0,0 +1,14 @@
1
+ import { defineRecipe } from '../recipe.mjs'
2
+ import { skillsAdd } from '../recipe-helpers.mjs'
3
+ // rch4com/agent-handoff-manager(MIT). 에이전트 사이 작업 인계를 저장·재개하는
4
+ // 스킬 하나(skills/agent-handoff-manager). 본체는 스킬 폴더의 scripts/handoff.py
5
+ // (표준 라이브러리만, Python 3.10+)라 PATH에 Python이 있어야 한다. 상류는
6
+ // Claude·Copilot 플러그인 매니페스트도 두지만 담긴 것이 같은 스킬 하나라
7
+ // 여섯 CLI가 함께 보는 공유 스킬 판을 택했다. 데이터는 대상 저장소의
8
+ // .handoffs/에 쌓인다.
9
+ export default defineRecipe({
10
+ id: 'skill.agent-handoff-manager', category: 'skill', label: 'Agent Handoff Manager', group: '__context',
11
+ note: 'item.skill.agent-handoff-manager.note',
12
+ verified: '2026-11-12',
13
+ ...skillsAdd({ source: 'https://github.com/rch4com/agent-handoff-manager', skill: 'agent-handoff-manager' }),
14
+ })
@@ -8,6 +8,9 @@ import { defineRecipe } from '../recipe.mjs'
8
8
  // codex `.codex/skills`에 gsd-* 71종. `codex debug prompt-input`이 이
9
9
  // 경로를 스킬 루트로 등록하고 전부 나열하는 것을 확인했다.
10
10
  // opencode `.opencode/skills`. `opencode debug skill`이 로드한다.
11
+ // copilot `.github/skills`(+agents·hooks). `copilot skill list`가 gsd-* 전부를
12
+ // 보여 준다(2026-08-15 실측). VS Code Copilot도 이 경로를 읽지만 상류에
13
+ // --vscode 플래그가 없어 따로 배선하지 않는다.
11
14
  // 런타임마다 명령 한 줄이다 — 부분 설치를 완성할 때 빠진 런타임만 돈다.
12
15
  // `--uninstall`도 런타임 플래그를 받아 그 런타임만 지운다.
13
16
  // Antigravity는 --antigravity 플래그가 있지만 설치 경로를 실측하지 못했다.
@@ -19,6 +22,7 @@ const RUNTIMES = {
19
22
  claude: ['.claude/commands', '.claude/skills'],
20
23
  codex: ['.codex/skills'],
21
24
  opencode: ['.opencode/skills'],
25
+ copilot: ['.github/skills'],
22
26
  }
23
27
  const NPX = ['npx', '-y', '@opengsd/gsd-core@latest']
24
28
 
@@ -34,5 +38,5 @@ export default defineRecipe({
34
38
  },
35
39
  }])),
36
40
  detect: Object.fromEntries(Object.entries(RUNTIMES).map(([cli, dirs]) => [cli, (p) => dirs.some((d) => p.dirHasPrefix(d, 'gsd-'))])),
37
- reasons: { antigravity: 'item.unsupported.unmeasuredUpstream' },
41
+ reasons: { antigravity: 'item.unsupported.unmeasuredUpstream', vscode: 'item.unsupported.upstreamNone' },
38
42
  })
@@ -59,5 +59,9 @@ export default defineRecipe({
59
59
  codex: 'item.unsupported.gstackShared',
60
60
  opencode: 'item.unsupported.gstackShared',
61
61
  antigravity: 'item.unsupported.upstreamNone',
62
+ // 상류 hosts에 Copilot이 없다(2026-08-02). 공유 .agents/skills의 gstack은 Copilot이
63
+ // 한 단계만 훑어 라우터만 보인다(2026-08-15 실측).
64
+ copilot: 'item.unsupported.upstreamNone',
65
+ vscode: 'item.unsupported.upstreamNone',
62
66
  },
63
67
  })
@@ -0,0 +1,15 @@
1
+ import { defineRecipe } from '../recipe.mjs'
2
+ import { skillsAdd } from '../recipe-helpers.mjs'
3
+ // Anthropic 커뮤니티 마켓플레이스(anthropics/claude-plugins-community)의 html-plan
4
+ // 플러그인이 담은 스킬 하나(html-plan/skills/html-plan, MIT). `/html-plan <만들 것>`을
5
+ // 주장 트리·목업·결정 지점이 있는 대화형 HTML 계획서 한 장으로 만든다.
6
+ // eli5와 같은 이유로 하위 경로를 source로 준다 — 마켓 루트에서 받으면 다른
7
+ // 플러그인의 스킬까지 후보에 든다. 스킬 폴더에 runtime/(css·js·pack.mjs)·
8
+ // references/·examples/가 함께 있어 그대로 복사된다. 플러그인이 더 주는 것이
9
+ // 없어(훅·명령 없음) 공유 스킬 판을 택했다.
10
+ export default defineRecipe({
11
+ id: 'skill.html-plan', category: 'skill', label: 'html-plan', group: '__flow',
12
+ note: 'item.skill.html-plan.note',
13
+ verified: '2026-11-12',
14
+ ...skillsAdd({ source: 'https://github.com/anthropics/claude-plugins-community/tree/main/html-plan', skill: 'html-plan' }),
15
+ })
@@ -0,0 +1,12 @@
1
+ import { defineRecipe } from '../recipe.mjs'
2
+ import { skillsAdd } from '../recipe-helpers.mjs'
3
+ // heydamir/unslop(CC-BY-4.0). AI가 만든 티가 나는 UI를 방향을 잡아 다시
4
+ // 디자인하는 스킬 하나(skills/unslop). references/·scripts/(snapshot·story,
5
+ // node 실행)가 스킬 폴더 안에 있어 함께 복사된다. 상류는 마켓플레이스·
6
+ // 플러그인 매니페스트가 없어 공유 스킬이 유일한 경로다.
7
+ export default defineRecipe({
8
+ id: 'skill.unslop', category: 'skill', label: 'Unslop', group: '__style',
9
+ note: 'item.skill.unslop.note',
10
+ verified: '2026-11-12',
11
+ ...skillsAdd({ source: 'https://github.com/heydamir/unslop', skill: 'unslop' }),
12
+ })
package/lib/probe.mjs CHANGED
@@ -43,6 +43,17 @@ export function readOpencodeConfig(opts) {
43
43
  return { file, data: readJson(file) ?? null }
44
44
  }
45
45
 
46
+ // Copilot CLI의 사용자 MCP 설정. VS Code의 Global > Copilot도 같은 파일에 쓴다
47
+ // (code.visualstudio.com/docs/copilot/customization/mcp-servers) — 그래서 두 CLI의
48
+ // 전역 MCP는 한 저장소를 나눠 쓴다.
49
+ export function copilotMcpFile({ home = homedir(), env = process.env } = {}) {
50
+ return join(env.COPILOT_HOME || join(home, '.copilot'), 'mcp-config.json')
51
+ }
52
+
53
+ // VS Code 프로젝트 MCP. `.vscode/mcp.json`은 "호환용"으로 남았다는 표시가 붙었지만
54
+ // 플래그 없이 읽히는 유일한 프로젝트 경로다(`.mcp.json`은 실험 플래그가 필요하다).
55
+ export const VSCODE_MCP_FILE = '.vscode/mcp.json'
56
+
46
57
  function samePath(a, b, platform) {
47
58
  if (!a) return false
48
59
  const norm = (p) => (platform === 'win32' ? resolve(p).toLowerCase() : resolve(p))
@@ -79,6 +90,13 @@ export function createProbe({ root, scope, exec, env = process.env, home = homed
79
90
  async agyPlugin(name) {
80
91
  return (await json('antigravity', ['plugin', 'list', '--json'])).some((p) => p.name === name)
81
92
  },
93
+ // id는 `이름@마켓`이거나 마켓 없이 직접 설치한 `이름`이다. 내장 플러그인은
94
+ // 설치가 아니다 — 같은 이름이 와도 세지 않는다.
95
+ async copilotPlugin(id) {
96
+ const [name, market = ''] = id.split('@')
97
+ return (await json('copilot', ['plugin', 'list', '--json']))
98
+ .some((p) => p.name === name && (p.marketplace ?? '') === market && p.source === 'installed')
99
+ },
82
100
  async opencodePlugin(module) {
83
101
  const list = opencode()?.plugin
84
102
  return Array.isArray(list) && list.includes(module)
@@ -92,6 +110,13 @@ export function createProbe({ root, scope, exec, env = process.env, home = homed
92
110
  if (cli === 'codex') return (await json('codex', ['mcp', 'list', '--json'])).some((s) => s.name === name)
93
111
  if (cli === 'antigravity') return parseAgyMcpList(await run('antigravity', ['mcp', 'list'])).includes(name)
94
112
  if (cli === 'opencode') return opencode()?.mcp?.[name] !== undefined
113
+ // Copilot CLI는 프로젝트 MCP를 쓰는 명령이 없다 — 사용자 설정만 본다.
114
+ if (cli === 'copilot') return scope === 'user' && readJson(copilotMcpFile({ home, env }))?.mcpServers?.[name] !== undefined
115
+ if (cli === 'vscode') {
116
+ return scope === 'project'
117
+ ? readJson(join(root, VSCODE_MCP_FILE))?.servers?.[name] !== undefined
118
+ : readJson(copilotMcpFile({ home, env }))?.mcpServers?.[name] !== undefined
119
+ }
95
120
  return false
96
121
  },
97
122
  async skill(name) {
@@ -1,11 +1,13 @@
1
1
  // 항목 파일이 거의 다 쓰는 레시피 세 갈래. 명령 문법은 2026-10-24 이 머신의
2
2
  // --help 실측(claude 2.1.304, codex-cli 0.163.0, agy)과 opencode.ai/docs/cli를
3
3
  // 따른다.
4
- import { rmSync } from 'node:fs'
4
+ import { existsSync, rmSync } from 'node:fs'
5
5
  import { homedir } from 'node:os'
6
6
  import { repoPathStrict } from './context.mjs'
7
+ import { ensureGitignoreEntries } from './gitignore.mjs'
7
8
  import { LocalizedError } from './i18n/index.mjs'
8
- import { readOpencodeConfig } from './probe.mjs'
9
+ import { readJson, removeKey, setKey } from './jsonfile.mjs'
10
+ import { VSCODE_MCP_FILE, copilotMcpFile, readOpencodeConfig } from './probe.mjs'
9
11
  import { SHARED } from './recipe.mjs'
10
12
  import { SHARED_SKILLS, findSkillDir, isSafeSkillName, lockedSkills, pruneLock, sourceKey } from './skills-registry.mjs'
11
13
 
@@ -16,7 +18,9 @@ const SKILLS = ['npx', '-y', 'skills@latest']
16
18
  // antigravity-cli → ~/.gemini/antigravity-cli/skills(agy가 읽는 전역 경로,
17
19
  // antigravity.google/docs/skills). OpenCode는 ~/.claude/skills와
18
20
  // ~/.agents/skills를 둘 다 읽으므로(opencode.ai/docs/skills) 따로 넣지 않는다 —
19
- // 넣으면 같은 스킬을 세 번 본다.
21
+ // 넣으면 같은 스킬을 세 번 본다. Copilot CLI(`copilot skill --help`, 1.0.105)와
22
+ // VS Code Copilot(code.visualstudio.com/docs/copilot/customization/agent-skills,
23
+ // 2026-11-06)도 ~/.agents/skills를 읽으므로 codex가 깐 것을 그대로 본다.
20
24
  export const SKILLS_AGENTS = ['claude-code', 'codex', 'antigravity-cli']
21
25
 
22
26
  const OPENCODE_FILE = {
@@ -66,7 +70,55 @@ function verifyCodexMcp(name) {
66
70
  }
67
71
  }
68
72
 
69
- export function marketplacePlugin({ claude, codex, opencode, antigravity }) {
73
+ // VS Code Copilot에는 MCP 설치 명령이 없다. `code --add-mcp`는 JSON을 인자로 받는데
74
+ // 그 큰따옴표를 Windows 인용(shellQuote)이 거부하고, 제거·목록 명령도 없다.
75
+ // 그래서 파일을 고친다 — jsonfile.mjs는 사용자 주석과 들여쓰기를 지킨다.
76
+ // 프로젝트: .vscode/mcp.json의 servers (플래그 없이 읽히는 유일한 프로젝트 경로)
77
+ // 전역: ~/.copilot/mcp-config.json의 mcpServers — VS Code의 Global > Copilot이
78
+ // 쓰는 파일이고 `copilot mcp add`도 같은 파일에 쓴다.
79
+ function vscodeMcp(name, server) {
80
+ const http = server.kind === 'http'
81
+ const project = http ? { type: 'http', url: server.url } : { type: 'stdio', command: server.command, args: server.args }
82
+ // `copilot mcp add`가 쓰는 모양 그대로(2026-11-06 실측) — 어느 쪽이 먼저 써도 같은 파일이다.
83
+ const user = http ? { tools: ['*'], type: 'http', url: server.url } : { tools: ['*'], type: 'local', command: server.command, args: server.args }
84
+ return {
85
+ project: {
86
+ install: [{
87
+ describe: `add servers.${name} to ${VSCODE_MCP_FILE}`,
88
+ fn: ({ root }) => {
89
+ setKey(repoPathStrict(root, VSCODE_MCP_FILE), ['servers', name], project)
90
+ // `.vscode/*`를 무시하는 저장소(VisualStudio.gitignore)에서는 이 부정 항목이 없으면
91
+ // mcp.json이 조용히 커밋에서 빠진다. 무시 파일이 없으면 지킬 것이 없다.
92
+ if (existsSync(repoPathStrict(root, '.gitignore'))) ensureGitignoreEntries(root, [`!${VSCODE_MCP_FILE}`])
93
+ },
94
+ }],
95
+ uninstall: [{
96
+ describe: `remove servers.${name} from ${VSCODE_MCP_FILE}`,
97
+ fn: ({ root }) => removeKey(repoPathStrict(root, VSCODE_MCP_FILE), ['servers', name]),
98
+ }],
99
+ },
100
+ user: {
101
+ install: [{
102
+ describe: `add mcpServers.${name} to ~/.copilot/mcp-config.json (shared with Copilot CLI)`,
103
+ fn: () => {
104
+ const file = copilotMcpFile({ home: homedir() })
105
+ // Copilot CLI 단계가 같은 실행에서 먼저 썼을 수 있다 — 있으면 덮지 않는다.
106
+ if (readJson(file)?.mcpServers?.[name] !== undefined) return
107
+ setKey(file, ['mcpServers', name], user)
108
+ },
109
+ }],
110
+ uninstall: [{
111
+ describe: `remove mcpServers.${name} from ~/.copilot/mcp-config.json`,
112
+ fn: () => removeKey(copilotMcpFile({ home: homedir() }), ['mcpServers', name]),
113
+ }],
114
+ },
115
+ }
116
+ }
117
+
118
+ // copilot: `{ marketplace?, id, source? }`. marketplace가 있으면 먼저 등록하고(이미 있으면
119
+ // 참는다), source가 있으면 그것을 설치 인자로 쓴다(마켓 없이 `owner/repo:경로`로 직접
120
+ // 설치). id는 설치 인자이자 제거·감지에 쓰는 `이름@마켓`/`이름`이다.
121
+ export function marketplacePlugin({ claude, codex, opencode, antigravity, copilot }) {
70
122
  const recipes = {}
71
123
  const detect = {}
72
124
  if (claude) {
@@ -112,10 +164,25 @@ export function marketplacePlugin({ claude, codex, opencode, antigravity }) {
112
164
  }
113
165
  detect.antigravity = (p) => p.agyPlugin(antigravity.name)
114
166
  }
167
+ if (copilot) {
168
+ // `copilot plugin install`에도 범위 플래그가 없다 — ~/.copilot 아래 전역에 깔린다.
169
+ // 다른 copilot 세션이 떠 있으면 install·uninstall이 "os error 5"로 실패할 수 있다
170
+ // (2026-08-15 실측) — 세션을 닫고 다시 하면 된다.
171
+ recipes.copilot = {
172
+ user: {
173
+ install: [
174
+ ...(copilot.marketplace ? [{ argv: ['copilot', 'plugin', 'marketplace', 'add', copilot.marketplace], tolerateFail: true }] : []),
175
+ ['copilot', 'plugin', 'install', copilot.source ?? copilot.id],
176
+ ],
177
+ uninstall: [['copilot', 'plugin', 'uninstall', copilot.id]],
178
+ },
179
+ }
180
+ detect.copilot = (p) => p.copilotPlugin(copilot.id)
181
+ }
115
182
  return { recipes, detect }
116
183
  }
117
184
 
118
- export function mcpServer({ name, server, clis = ['claude', 'codex', 'opencode', 'antigravity'] }) {
185
+ export function mcpServer({ name, server, clis = ['claude', 'codex', 'opencode', 'antigravity', 'copilot', 'vscode'] }) {
119
186
  const http = server.kind === 'http'
120
187
  // stdio 명령 앞의 `--`: 인자가 `-y`처럼 대시로 시작해도 CLI가 자기 플래그로 읽지 않는다.
121
188
  const tail = http ? [] : ['--', server.command, ...server.args]
@@ -149,6 +216,15 @@ export function mcpServer({ name, server, clis = ['claude', 'codex', 'opencode',
149
216
  },
150
217
  opencode: { project: opencodeAt('project'), user: opencodeAt('user') },
151
218
  antigravity: { user: { install: [http ? ['agy', 'mcp', 'add', name, server.url] : ['agy', 'mcp', 'add', name, ...tail]], uninstall: [['agy', 'mcp', 'remove', name]] } },
219
+ // `copilot mcp add`는 사용자 설정(~/.copilot/mcp-config.json)에만 쓴다(2026-11-06 실측).
220
+ // 프로젝트 `.mcp.json`·`.github/mcp.json`은 읽기만 하고 쓰는 명령이 없다.
221
+ copilot: {
222
+ user: {
223
+ install: [http ? ['copilot', 'mcp', 'add', '--transport', 'http', name, server.url] : ['copilot', 'mcp', 'add', name, ...tail]],
224
+ uninstall: [['copilot', 'mcp', 'remove', name]],
225
+ },
226
+ },
227
+ vscode: vscodeMcp(name, server),
152
228
  }
153
229
  const recipes = Object.fromEntries(clis.map((c) => [c, all[c]]))
154
230
  const detect = Object.fromEntries(clis.map((c) => [c, (p) => p.mcp(c, name)]))
package/lib/tui/run.mjs CHANGED
@@ -391,6 +391,10 @@ export async function runTui(root, opts = {}) {
391
391
  if (row?.id === 'action.language') { status = await cycleLanguage(); continue }
392
392
  if (row?.id === 'action.scope') {
393
393
  scope = scope === 'project' ? 'user' : 'project'
394
+ // 전역 감지는 CLI 목록 명령(codex plugin list 등)을 돌려 수십 초 걸린다.
395
+ // 그동안 화면이 그대로면 멈춘 것으로 읽힌다 — 먼저 진행 중임을 그린다.
396
+ status = t('tui.scope.scanning', { current: t(`scope.${scope}`) })
397
+ paint()
394
398
  // 다른 범위의 설치 상태로 선택을 다시 맞춘다 — 저장소에서 고르던 체크가
395
399
  // 전역 목록에 남으면 엉뚱한 항목이 설치된다.
396
400
  await rebuild(false)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rch4com/agent-setup",
3
- "version": "2.0.0",
3
+ "version": "2.2.1",
4
4
  "description": "Repository-scoped bootstrap and optional-item installer for using multiple coding-agent CLIs in one repository | 여러 코딩 에이전트 CLI를 한 저장소에서 함께 쓰기 위한 저장소 범위 부트스트랩과 선택 항목 설치기",
5
5
  "keywords": [
6
6
  "agents-md",
@@ -8,6 +8,7 @@
8
8
  "codex",
9
9
  "opencode",
10
10
  "antigravity",
11
+ "github-copilot",
11
12
  "mcp",
12
13
  "agent-skills"
13
14
  ],