@rch4com/agent-setup 1.28.0 → 2.0.0

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.
Files changed (63) hide show
  1. package/README.md +31 -20
  2. package/install.mjs +25 -8
  3. package/lib/activation.mjs +31 -0
  4. package/lib/args.mjs +5 -2
  5. package/lib/bootstrap/manifest.mjs +17 -47
  6. package/lib/bootstrap/templates.mjs +7 -60
  7. package/lib/catalog.mjs +14 -240
  8. package/lib/clis.mjs +7 -118
  9. package/lib/commands.mjs +47 -0
  10. package/lib/engine.mjs +16 -11
  11. package/lib/i18n/catalog/en.mjs +50 -48
  12. package/lib/i18n/catalog/ko.mjs +50 -48
  13. package/lib/items/mcp.codebase-memory.mjs +6 -4
  14. package/lib/items/mcp.graft.mjs +6 -4
  15. package/lib/items/mcp.graphify.mjs +6 -4
  16. package/lib/items/mcp.headroom.mjs +6 -4
  17. package/lib/items/mcp.notion.mjs +7 -4
  18. package/lib/items/mcp.supabase.mjs +7 -4
  19. package/lib/items/mcp.vercel.mjs +7 -4
  20. package/lib/items/plugin.ai-memory.mjs +29 -0
  21. package/lib/items/plugin.cli-anything.mjs +16 -15
  22. package/lib/items/plugin.ecc.mjs +16 -20
  23. package/lib/items/plugin.hyperframes.mjs +15 -13
  24. package/lib/items/plugin.impeccable.mjs +17 -22
  25. package/lib/items/plugin.mattpocock-skills.mjs +19 -17
  26. package/lib/items/plugin.ponytail.mjs +21 -106
  27. package/lib/items/plugin.superpowers.mjs +17 -24
  28. package/lib/items/plugin.understand-anything.mjs +16 -18
  29. package/lib/items/skill.agent-browser.mjs +6 -6
  30. package/lib/items/skill.archify.mjs +5 -5
  31. package/lib/items/skill.caveman.mjs +5 -5
  32. package/lib/items/skill.diagram-design.mjs +5 -5
  33. package/lib/items/skill.eli5.mjs +6 -6
  34. package/lib/items/skill.find-skills.mjs +5 -5
  35. package/lib/items/skill.gsd.mjs +24 -89
  36. package/lib/items/skill.gstack.mjs +54 -65
  37. package/lib/items/skill.hallmark.mjs +5 -5
  38. package/lib/items/skill.i-have-adhd.mjs +6 -6
  39. package/lib/items/skill.im-not-ai.mjs +5 -6
  40. package/lib/items/skill.impeccable.mjs +6 -6
  41. package/lib/items/skill.karpathy.mjs +5 -5
  42. package/lib/items/skill.mattpocock-skills.mjs +5 -6
  43. package/lib/items/skill.mcp-builder.mjs +5 -5
  44. package/lib/items/skill.officecli.mjs +5 -5
  45. package/lib/items/skill.prompt-master.mjs +5 -5
  46. package/lib/items/skill.remotion.mjs +5 -5
  47. package/lib/items/skill.strix.mjs +5 -6
  48. package/lib/items/skill.superpowers.mjs +6 -7
  49. package/lib/items/skill.taste.mjs +5 -5
  50. package/lib/probe.mjs +111 -0
  51. package/lib/recipe-helpers.mjs +205 -0
  52. package/lib/recipe.mjs +181 -0
  53. package/lib/skills-registry.mjs +93 -0
  54. package/lib/status.mjs +7 -3
  55. package/lib/tui/detail.mjs +5 -25
  56. package/lib/tui/rows.mjs +25 -14
  57. package/lib/tui/run.mjs +35 -8
  58. package/package.json +3 -3
  59. package/lib/claude-plugins.mjs +0 -64
  60. package/lib/global-plugin.mjs +0 -239
  61. package/lib/items/global.ponytail.mjs +0 -56
  62. package/lib/items/global.superpowers.mjs +0 -58
  63. package/lib/tomlfile.mjs +0 -67
package/README.md CHANGED
@@ -3,8 +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, Gemini CLI, OpenCode, Kilo Code, Kiro, Kimi Code,
7
- Grok Build, Antigravity, GitHub Copilot CLI, and VS Code Copilot.**
6
+ Supports **Claude Code, Codex, OpenCode, and Antigravity.**
8
7
 
9
8
  One shared instruction file (`AGENTS.md`) and one shared skills directory
10
9
  (`.agents/skills`) serve every tool. Only the per-tool config files are written,
@@ -23,8 +22,15 @@ npx @rch4com/agent-setup bootstrap
23
22
  # Show what would be created, without writing anything
24
23
  npx @rch4com/agent-setup bootstrap --dry-run
25
24
 
26
- # Interactive picker for plugins, MCP servers, skills, and DESIGN.md
25
+ # Interactive picker for plugins, MCP servers, skills, and DESIGN.md —
26
+ # installs with each CLI's own install commands
27
27
  npx @rch4com/agent-setup
28
+
29
+ # Install user-globally instead of into this repository
30
+ npx @rch4com/agent-setup --global
31
+
32
+ # Print the CLI commands instead of running them (--dry-run is an alias)
33
+ npx @rch4com/agent-setup --print --set plugin.ponytail
28
34
  ```
29
35
 
30
36
  The package name is scoped, but the installed command is just `agent-setup` —
@@ -54,8 +60,8 @@ The decision is made per file, using hashes stored in the install record
54
60
  | File missing | Created (this is how support for new tools arrives) |
55
61
  | No hash in the record | Origin unknown → left alone |
56
62
 
57
- The managed blocks in `CLAUDE.md` and `GEMINI.md` are replaced **between the
58
- markers only**, so anything you wrote around them survives.
63
+ The managed block in `CLAUDE.md` is replaced **between the markers only**, so
64
+ anything you wrote around it survives.
59
65
 
60
66
  Hashes are computed after normalizing line endings to LF, so a CRLF checkout on
61
67
  Windows is not mistaken for drift.
@@ -79,11 +85,11 @@ show up in `status` and can be pulled in later with `update --force`.
79
85
  ## Safety
80
86
 
81
87
  The rules below are what the **bootstrap** (`bootstrap`, `update`, `status`)
82
- upholds. The optional-item picker runs third-party installers, and its two
83
- `global.*` items (`global.superpowers`, `global.ponytail`) deliberately write
84
- to per-user CLI configuration under your home directory — the screen marks
85
- them as machine-global and `--set` never removes them. The full list of what
86
- each item runs is in the
88
+ upholds. The optional-item picker runs each CLI's official install commands,
89
+ which fetch third-party code, and with `--global` (or the Install scope row) it
90
+ deliberately installs into per-user CLI configuration under your home directory
91
+ — the review screen warns before that happens. The full list of what each item
92
+ runs is in the
87
93
  [usage guide](https://github.com/rch4com/Agent-Setup/blob/main/AgentSetup-README.md#what-the-installer-runs).
88
94
 
89
95
  - Runs only inside a Git repository, and never writes outside the repository root.
@@ -112,9 +118,8 @@ MIT
112
118
 
113
119
  # 한국어
114
120
 
115
- Claude Code, Codex, Gemini CLI, OpenCode, Kilo Code, Kiro, Kimi Code,
116
- Grok Build, Antigravity, GitHub Copilot CLI, VS Code Copilot을 **한 저장소에서
117
- 함께** 쓰기 위한 저장소 범위 부트스트랩과 선택 항목 설치기입니다.
121
+ Claude Code, Codex, OpenCode, Antigravity를 **한 저장소에서 함께** 쓰기 위한
122
+ 저장소 범위 부트스트랩과 선택 항목 설치기입니다.
118
123
 
119
124
  공통 지침은 루트 `AGENTS.md` 하나, 공통 스킬은 `.agents/skills` 하나로 두고,
120
125
  도구별 설정 파일만 각 도구가 읽는 위치에 만듭니다.
@@ -130,8 +135,15 @@ npx @rch4com/agent-setup bootstrap
130
135
  # 무엇이 만들어질지만 확인한다
131
136
  npx @rch4com/agent-setup bootstrap --dry-run
132
137
 
133
- # 플러그인·MCP·스킬·DESIGN.md를 골라 설치하는 대화형 화면
138
+ # 플러그인·MCP·스킬·DESIGN.md를 골라 설치하는 대화형 화면 —
139
+ # 각 CLI의 공식 설치 명령으로 설치한다
134
140
  npx @rch4com/agent-setup
141
+
142
+ # 이 저장소 대신 사용자 전역에 설치한다
143
+ npx @rch4com/agent-setup --global
144
+
145
+ # 실행하지 않고 CLI 명령만 출력한다 (--dry-run과 같음)
146
+ npx @rch4com/agent-setup --print --set plugin.ponytail
135
147
  ```
136
148
 
137
149
  패키지 이름에는 스코프가 붙지만 설치 후 실행 명령은 `agent-setup`입니다 —
@@ -160,8 +172,8 @@ npx @rch4com/agent-setup status # 의도 / 실제 / 버전
160
172
  | 파일이 없음 | 새로 생성 (새 도구 지원이 이 경로로 들어옵니다) |
161
173
  | 기록에 해시가 없음 | 출처 불명 → 건드리지 않음 |
162
174
 
163
- `CLAUDE.md`·`GEMINI.md`의 관리 블록은 **마커 사이만** 교체하므로 주변에 쓴
164
- 내용은 그대로 남습니다.
175
+ `CLAUDE.md`의 관리 블록은 **마커 사이만** 교체하므로 주변에 쓴 내용은 그대로
176
+ 남습니다.
165
177
 
166
178
  해시는 줄바꿈을 LF로 정규화한 뒤 계산하므로, Windows에서 CRLF로 체크아웃해도
167
179
  드리프트로 오판하지 않습니다.
@@ -185,10 +197,9 @@ npx @rch4com/agent-setup bootstrap --adopt
185
197
  ## 안전 원칙
186
198
 
187
199
  아래는 **부트스트랩**(`bootstrap`·`update`·`status`)이 지키는 규칙입니다.
188
- 선택 항목 화면은 제3자 설치기를 실행하며, 그중 `global.*` 두 항목
189
- (`global.superpowers`, `global.ponytail`)은 의도적으로 홈 디렉터리 아래
190
- CLI별 사용자 설정에 씁니다 — 화면이 머신 전역임을 표시하고 `--set`은 이
191
- 항목을 제거하지 않습니다. 항목마다 무엇을 실행하는지는
200
+ 선택 항목 화면은 제3자 코드를 내려받는 각 CLI의 공식 설치 명령을 실행하며,
201
+ `--global`(또는 설치 범위 행)을 고르면 의도적으로 홈 디렉터리 아래 CLI별 사용자
202
+ 설정에 설치합니다 — 그 전에 검토 화면이 경고합니다. 항목마다 무엇을 실행하는지는
192
203
  [사용 안내](https://github.com/rch4com/Agent-Setup/blob/main/AgentSetup-README.ko.md#설치기가-실행하는-것)에
193
204
  있습니다.
194
205
 
package/install.mjs CHANGED
@@ -42,21 +42,26 @@ let sessionT = null
42
42
  const STATUS_KEYS = ['status.installed', 'status.partial', 'status.absent']
43
43
 
44
44
  // 대화형 화면은 TUI가 맡는다.
45
- async function openTui(root, { dryRun, skillMode, designDirs, t, localeForced }) {
45
+ async function openTui(root, { dryRun, skillMode, designDirs, scope, t, localeForced }) {
46
46
  const { runTui } = await withDeps(() => import('./lib/tui/run.mjs'), t)
47
47
  // skillMode는 화면 안의 '부트스트랩 실행' 작업이 쓴다. design 경로에서는
48
48
  // 없으므로 undefined가 넘어가고 runTui의 기본값(auto)이 적용된다.
49
- await runTui(root, { dryRun, skillMode, designDirs, t, localeForced })
49
+ await runTui(root, { dryRun, skillMode, designDirs, scope, t, localeForced })
50
50
  }
51
51
 
52
52
  // --list / --set 전용 비대화형 경로.
53
- async function runClassic(root, { dryRun, listOnly, setArg, t }) {
54
- const { loadItems } = await withDeps(() => import('./lib/catalog.mjs'), t)
53
+ async function runClassic(root, { dryRun, listOnly, setArg, scope = 'project', t }) {
54
+ const { loadItems, makeExec } = await withDeps(() => import('./lib/catalog.mjs'), t)
55
55
  const { scan, planChanges, apply, assertExclusive } = await withDeps(() => import('./lib/engine.mjs'), t)
56
+ const { createProbe } = await withDeps(() => import('./lib/probe.mjs'), t)
57
+ const { planCommands, formatCommands } = await withDeps(() => import('./lib/commands.mjs'), t)
58
+ const { activationLines } = await withDeps(() => import('./lib/activation.mjs'), t)
56
59
  const { plainLine } = await withDeps(() => import('./lib/tui/progress.mjs'), t)
57
60
  const { coverageText } = await withDeps(() => import('./lib/tui/rows.mjs'), t)
58
- const items = await loadItems()
59
- const states = await scan(root, items)
61
+ const items = await loadItems({ scope })
62
+ // 스캔마다 새 probe — 적용 뒤 재스캔이 적용 전 캐시를 읽으면 안 된다.
63
+ const freshProbe = () => createProbe({ root, scope, exec: makeExec(false) })
64
+ const states = await scan(root, items, { probe: freshProbe() })
60
65
  const statusWidth = labelWidth(t, STATUS_KEYS)
61
66
 
62
67
  if (listOnly) {
@@ -94,10 +99,18 @@ async function runClassic(root, { dryRun, listOnly, setArg, t }) {
94
99
  }
95
100
  if (changes.length === 0) { console.log(t('apply.noChanges')); return }
96
101
 
102
+ // 출력 모드(--print, 옛 --dry-run): 실행 모드와 같은 steps()로 명령만 낸다.
103
+ // 아무것도 실행하거나 쓰지 않는다.
104
+ if (dryRun) {
105
+ for (const line of formatCommands(planCommands(changes), { t, scope })) console.log(line)
106
+ const notes = activationLines(changes, t)
107
+ if (notes.length > 0) console.log(notes.join('\n'))
108
+ return
109
+ }
110
+
97
111
  // 비대화형 경로다 — 바를 그리지 않고 평문 한 줄씩 흘린다.
98
112
  // ANSI 제어문자로 CI 로그를 더럽히지 않기 위해서다.
99
113
  const results = await apply(root, changes, {
100
- dryRun,
101
114
  t,
102
115
  onProgress: (event) => {
103
116
  const line = plainLine(event, t)
@@ -108,9 +121,13 @@ async function runClassic(root, { dryRun, listOnly, setArg, t }) {
108
121
  console.log(`${r.ok ? '✔' : '✖'} ${t(`change.${r.action}`)} ${scopedLabel(r.item, t)}${r.message ? ` — ${toText(t, r.message)}` : ''}`)
109
122
  }
110
123
 
111
- const after = await scan(root, items)
124
+ const after = await scan(root, items, { probe: freshProbe() })
112
125
  console.log(`\n${t('apply.finalState')}`)
113
126
  for (const s of after) console.log(` ${pad(t(`status.${s.status}`), statusWidth)} ${scopedLabel(s.item, t)}`)
127
+ // 성공한 설치만 안내한다 — 실패한 항목에 "새 세션을 시작하라"고 하면 거짓이다.
128
+ const done = new Set(results.filter((r) => r.ok).map((r) => r.item.id))
129
+ const notes = activationLines(changes.filter((c) => done.has(c.item.id)), t)
130
+ if (notes.length > 0) console.log(`\n${notes.join('\n')}`)
114
131
  console.log(`\n${t('apply.seeGitDiff')}`)
115
132
  if (results.some((r) => !r.ok)) process.exitCode = 1
116
133
  }
@@ -0,0 +1,31 @@
1
+ // 설치 뒤 사용자가 CLI 안에서 해야 하는 일. CLI마다 한 번만 말한다 — 항목이
2
+ // 다섯 개라고 "새 세션을 시작하라"를 다섯 번 읽힐 이유가 없다.
3
+ import { CLIS, CLI_IDS } from './clis.mjs'
4
+ import { SHARED } from './recipe.mjs'
5
+
6
+ export function activationLines(changes, t) {
7
+ const clis = new Set()
8
+ const hookItems = []
9
+ const extras = []
10
+ for (const { item, action, state } of changes) {
11
+ if (action === 'uninstall' || typeof item.steps !== 'function') continue
12
+ // 공유 스킬 단계는 CLI가 아니라 디렉터리에 쓴다 — 그 디렉터리를 읽는,
13
+ // 이 머신에 있는 CLI(reach)가 안내 대상이다.
14
+ const touched = new Set(item.steps(action, state).flatMap((s) => (s.cli === SHARED ? state?.reach ?? [] : [s.cli])))
15
+ // 실행된 단계가 없으면(대상 CLI가 이 머신에 없음) 이 항목에 대해 말할 것이 없다.
16
+ if (touched.size === 0) continue
17
+ for (const cli of touched) clis.add(cli)
18
+ if (item.hooks && touched.has('codex') && !hookItems.includes(item.label)) hookItems.push(item.label)
19
+ const extra = item.postInstall ? `${item.label}: ${t(item.postInstall)}` : null
20
+ if (extra && !extras.includes(extra)) extras.push(extra)
21
+ }
22
+ if (clis.size === 0 && extras.length === 0) return []
23
+ const lines = [t('activation.title')]
24
+ for (const cli of CLI_IDS) {
25
+ if (!clis.has(cli)) continue
26
+ lines.push(` ${CLIS[cli].label}: ${t(`activation.cli.${cli}`)}`)
27
+ if (cli === 'codex' && hookItems.length > 0) lines.push(` ${t('activation.hooks.codex', { items: hookItems.join(', ') })}`)
28
+ }
29
+ for (const e of extras) lines.push(` · ${e}`)
30
+ return lines
31
+ }
package/lib/args.mjs CHANGED
@@ -29,6 +29,7 @@ const COMMON_SPEC = { '-h': 'bool', '--help': 'bool', '--lang': 'value' }
29
29
  const ROOT_SPEC = {
30
30
  ...COMMON_SPEC, '--dry-run': 'bool', '--list': 'bool',
31
31
  '--set': 'value', '--skill-mode': 'value', '--design-dir': 'value',
32
+ '--global': 'bool', '--print': 'bool',
32
33
  }
33
34
  const DESIGN_SPEC = {
34
35
  ...COMMON_SPEC, '--dry-run': 'bool', '--list': 'bool', '--set': 'value',
@@ -191,14 +192,16 @@ export function parseSetArg(argv) {
191
192
  export function parseRootArgs(argv, t = createT('en')) {
192
193
  const usage = rootUsage(t)
193
194
  if (wantsHelp(argv)) {
194
- return { help: true, dryRun: false, listOnly: false, setArg: null, skillMode: 'auto', designDirs: [], lang: null, interactive: false }
195
+ return { help: true, dryRun: false, scope: 'project', listOnly: false, setArg: null, skillMode: 'auto', designDirs: [], lang: null, interactive: false }
195
196
  }
196
197
  assertKnownArgs(argv, ROOT_SPEC, usage)
197
198
  assertSingleAction(argv, ['--list', '--set'], usage)
198
199
  const setArg = parseSetArg(argv)
199
200
  return {
200
201
  help: false,
201
- dryRun: argv.includes('--dry-run'),
202
+ // --print는 --dry-run의 새 이름이다. 두 런처가 아직 --dry-run을 넘긴다.
203
+ dryRun: argv.includes('--dry-run') || argv.includes('--print'),
204
+ scope: argv.includes('--global') ? 'user' : 'project',
202
205
  listOnly: argv.includes('--list'),
203
206
  setArg,
204
207
  // 대화형 화면에서 실행하는 부트스트랩이 이 값을 쓴다. 예전에는 루트에서
@@ -1,27 +1,19 @@
1
1
  import {
2
- AGENTS_TEMPLATE, CLAUDE_BLOCK, GEMINI_BLOCK, SKILL_README, EXAMPLE_SKILL,
3
- AGENT_KIT_README, CLAUDE_SETTINGS, CODEX_CONFIG, GEMINI_SETTINGS, GROK_CONFIG,
4
- OPENCODE_CONFIG, KILO_CONFIG, KIRO_MCP_CONFIG, KIMI_MCP_CONFIG,
5
- COPILOT_MCP_CONFIG, COPILOT_SETTINGS, VSCODE_MCP_CONFIG,
2
+ AGENTS_TEMPLATE, CLAUDE_BLOCK, SKILL_README, EXAMPLE_SKILL,
3
+ AGENT_KIT_README, CLAUDE_SETTINGS, CODEX_CONFIG, OPENCODE_CONFIG,
6
4
  } from './templates.mjs'
7
5
 
8
6
  // 저장소 부트스트랩이 만들 대상 선언.
9
7
  // 도구 추가 = dirs 한 줄 + files 한 줄. 실행 로직은 apply.mjs·adapter.mjs에 있다.
10
8
  export const MANIFEST = {
11
9
  // 완료 리포트에 그대로 나열되는 도구 이름. 순서가 출력 순서다.
12
- tools: [
13
- 'Claude Code', 'Codex', 'Gemini CLI', 'OpenCode', 'Kilo Code',
14
- 'Kiro', 'Kimi Code', 'Grok Build', 'Antigravity',
15
- 'GitHub Copilot CLI', 'VS Code Copilot',
16
- ],
10
+ tools: ['Claude Code', 'Codex', 'OpenCode', 'Antigravity'],
17
11
 
18
- dirs: [
19
- '.agents/skills', '.agent-kit', '.claude', '.codex',
20
- '.gemini', '.grok', '.kiro/settings', '.kimi-code',
21
- '.github/copilot', '.vscode',
22
- ],
12
+ dirs: ['.agents/skills', '.agent-kit', '.claude', '.codex'],
23
13
 
24
14
  // 없을 때만 생성한다. 이미 있으면 내용을 보지 않고 보존한다.
15
+ // Antigravity는 루트 AGENTS.md와 .agents/skills를 네이티브로 읽고 프로젝트
16
+ // 설정 파일이 없다(2026-07-18 검증) — 만들 파일이 없다.
25
17
  files: [
26
18
  { path: 'AGENTS.md', template: AGENTS_TEMPLATE },
27
19
  { path: '.agents/skills/README.md', template: SKILL_README },
@@ -29,58 +21,36 @@ export const MANIFEST = {
29
21
  { path: '.agent-kit/README.md', template: AGENT_KIT_README },
30
22
  { path: '.claude/settings.json', template: CLAUDE_SETTINGS },
31
23
  { path: '.codex/config.toml', template: CODEX_CONFIG },
32
- { path: '.gemini/settings.json', template: GEMINI_SETTINGS },
33
- { path: '.grok/config.toml', template: GROK_CONFIG },
34
24
  { path: 'opencode.jsonc', template: OPENCODE_CONFIG },
35
- { path: 'kilo.jsonc', template: KILO_CONFIG },
36
- { path: '.kiro/settings/mcp.json', template: KIRO_MCP_CONFIG },
37
- { path: '.kimi-code/mcp.json', template: KIMI_MCP_CONFIG },
38
- { path: '.github/mcp.json', template: COPILOT_MCP_CONFIG },
39
- { path: '.github/copilot/settings.json', template: COPILOT_SETTINGS },
40
- { path: '.vscode/mcp.json', template: VSCODE_MCP_CONFIG },
41
25
  ],
42
26
 
43
27
  // 마커가 없을 때만 덧붙인다. 파일이 없으면 블록만으로 생성한다.
28
+ // Claude Code는 AGENTS.md를 직접 읽지 않아 CLAUDE.md의 import가 필요하다.
44
29
  blocks: [
45
30
  { path: 'CLAUDE.md', block: CLAUDE_BLOCK },
46
- { path: 'GEMINI.md', block: GEMINI_BLOCK },
47
31
  ],
48
32
 
49
33
  // 기존 파일을 보존한 채 최상위 키만 보장한다. 키가 이미 있으면 손대지 않는다.
50
- // VS Code Copilot은 이 키가 있어야 루트 AGENTS.md를 읽는다.
51
- settings: [
52
- { path: '.vscode/settings.json', key: 'chat.useAgentsMdFile', value: true },
53
- ],
34
+ // 지금 보장할 키는 없다(VS Code Copilot 지원 종료) — 기구는 남겨 둔다.
35
+ settings: [],
54
36
 
55
37
  // .agents/skills 를 가리키는 도구별 어댑터.
56
38
  //
57
39
  // 여기에 없는 도구는 그 경로를 네이티브로 읽는다 — 2026-08-15에 도구별로
58
40
  // 실측했다. Codex는 `codex debug prompt-input`이 프로젝트 SKILL.md 경로를
59
- // 그대로 찍고, OpenCode·Kilo Code는 `debug skill`이, Copilot CLI는
60
- // `skill list`가 같은 것을 보여 준다. Kimi Code는 배포본에
61
- // `PROJECT_GENERIC_DIRS = [".agents/skills"]`가 있고, VS Code Copilot 확장은
62
- // 프로젝트 경로 표에 `.agents/skills/<name>/`를 싣는다. Antigravity 바이너리도
63
- // `{workspace}/.agents/skills/{skill_name}/SKILL.md`를 갖고 있다.
41
+ // 그대로 찍고, OpenCode는 `debug skill`이 같은 것을 보여 준다. Antigravity
42
+ // 바이너리도 `{workspace}/.agents/skills/{skill_name}/SKILL.md`를 갖고 있다.
64
43
  //
65
44
  // 네이티브로 읽는 도구에 어댑터를 더하면 같은 스킬이 두 경로에서 잡혀 중복
66
45
  // 등록된다 — 목록을 늘리기 전에 반드시 그 도구가 못 읽는 것을 먼저 확인한다.
67
- // Kiro가 그 증거다: 확장이 `~/.kiro/skills/`와 `<workspace>/.kiro/skills/`만
68
- // 훑고 `.agents/skills`는 한 번도 참조하지 않아, 이 어댑터가 있어야만 닿는다.
46
+ // Claude Code는 `.claude/skills`만 훑는다.
69
47
  adapters: [
70
48
  { tool: 'Claude Code', path: '.claude/skills' },
71
- { tool: 'Kiro', path: '.kiro/skills' },
72
- { tool: 'Grok Build', path: '.grok/skills' },
73
49
  ],
74
50
 
75
- // .vscode/ 아래 두 부정 항목은 널리 쓰이는 VisualStudio.gitignore가
76
- // `.vscode/*`를 무시하기 때문에 필요하다. 부정 항목이 없으면 팀 공유가
77
- // 깨진다 — 특히 settings.json은 VS Code가 AGENTS.md를 읽게 하는
78
- // chat.useAgentsMdFile이 사는 곳이라, 커밋되지 않으면 키를 넣어도
79
- // 그 설정이 팀에 전파되지 않는다. `.vscode/*`가 없는 저장소에서는
80
- // 무해한 no-op이다.
81
- ignore: [
82
- '.claude/skills', '.kiro/skills', '.grok/skills', '.kimi-code/local.toml',
83
- '.github/copilot/settings.local.json',
84
- '!.vscode/mcp.json', '!.vscode/settings.json',
85
- ],
51
+ // .vscode/settings.json 부정 항목은 널리 쓰이는 VisualStudio.gitignore가
52
+ // `.vscode/*`를 무시하기 때문에 필요하다. config.gitmessage.*가 VS Code
53
+ // 커밋 템플릿을 이 파일에 배선하므로, 부정 항목이 없으면 그 설정이 팀에
54
+ // 전파되지 않는다. `.vscode/*`가 없는 저장소에서는 무해한 no-op이다.
55
+ ignore: ['.claude/skills', '!.vscode/settings.json'],
86
56
  }
@@ -134,10 +134,6 @@ export const CLAUDE_BLOCK = `<!-- agent-kit:begin -->
134
134
  @AGENTS.md
135
135
  <!-- agent-kit:end -->`
136
136
 
137
- export const GEMINI_BLOCK = `<!-- agent-kit:begin -->
138
- @./AGENTS.md
139
- <!-- agent-kit:end -->`
140
-
141
137
  export const SKILL_README = `# Shared repository skills
142
138
 
143
139
  Create each shared skill in:
@@ -153,10 +149,9 @@ description: Explain when this skill should be used.
153
149
  ---
154
150
  \`\`\`
155
151
 
156
- Claude Code, Kiro, and Grok Build receive these skills through project-local
157
- adapters at \`.claude/skills\`, \`.kiro/skills\`, and \`.grok/skills\`. Codex,
158
- Gemini CLI, OpenCode, Kilo Code, Kimi Code, Antigravity, GitHub Copilot CLI,
159
- and VS Code Copilot discover \`.agents/skills\` directly.`
152
+ Claude Code receives these skills through the project-local adapter at
153
+ \`.claude/skills\`. Codex, OpenCode, and Antigravity discover \`.agents/skills\`
154
+ directly.`
160
155
 
161
156
  export const EXAMPLE_SKILL = `---
162
157
  name: repository-check
@@ -182,13 +177,10 @@ The installer bootstrap:
182
177
  - creates only project-scoped configuration;
183
178
  - never writes to user-home or system-wide agent configuration;
184
179
  - preserves existing configuration files;
185
- - adds a small managed import block to \`CLAUDE.md\` and \`GEMINI.md\`;
186
- - exposes \`.agents/skills\` to Claude Code, Kiro, and Grok Build through
187
- local adapters;
188
- - adds \`chat.useAgentsMdFile\` to \`.vscode/settings.json\` only when the key
189
- is absent, so VS Code Copilot reads the shared \`AGENTS.md\`;
190
- - relies on the native support of Kilo Code, Kimi Code, Antigravity, GitHub
191
- Copilot CLI, and VS Code Copilot for \`AGENTS.md\` and \`.agents/skills\`.`
180
+ - adds a small managed import block to \`CLAUDE.md\`;
181
+ - exposes \`.agents/skills\` to Claude Code through a local adapter;
182
+ - relies on the native support of Codex, OpenCode, and Antigravity for
183
+ \`AGENTS.md\` and \`.agents/skills\`.`
192
184
 
193
185
  export const CLAUDE_SETTINGS = `{}`
194
186
 
@@ -196,51 +188,6 @@ export const CODEX_CONFIG = `# Repository-local Codex configuration.
196
188
  # Personal or machine-wide defaults belong outside this repository.
197
189
  project_doc_max_bytes = 65536`
198
190
 
199
- export const GEMINI_SETTINGS = `{
200
- "skills": {
201
- "enabled": true
202
- },
203
- "security": {
204
- "folderTrust": {
205
- "enabled": true
206
- },
207
- "disableAlwaysAllow": true,
208
- "enablePermanentToolApproval": false
209
- }
210
- }`
211
-
212
- export const GROK_CONFIG = `# Repository-local Grok Build configuration.
213
- # Project scope supports mcp_servers, plugins, and permission rules only.
214
- # Personal or machine-wide defaults belong in ~/.grok/config.toml.
215
- # Grok Build reads the root AGENTS.md natively.`
216
-
217
191
  export const OPENCODE_CONFIG = `{
218
192
  "$schema": "https://opencode.ai/config.json"
219
193
  }`
220
-
221
- export const KILO_CONFIG = `{
222
- // Project-local Kilo Code configuration.
223
- // Kilo Code automatically loads ./AGENTS.md and ./.agents/skills/.
224
- }`
225
-
226
- export const KIRO_MCP_CONFIG = `{
227
- "mcpServers": {}
228
- }`
229
-
230
- export const KIMI_MCP_CONFIG = `{
231
- "mcpServers": {}
232
- }`
233
-
234
- export const COPILOT_MCP_CONFIG = `{
235
- "mcpServers": {}
236
- }`
237
-
238
- // 모델·추론 강도·컨텍스트 티어를 저장소 단위로 고정하는 공유 설정 자리.
239
- // 구체적인 값은 팀이 정한다. 개인 오버라이드는 settings.local.json이며
240
- // .gitignore 대상이다.
241
- export const COPILOT_SETTINGS = `{}`
242
-
243
- // VS Code는 최상위 키가 servers다 (Copilot CLI의 mcpServers와 다르다).
244
- export const VSCODE_MCP_CONFIG = `{
245
- "servers": {}
246
- }`