@rch4com/agent-setup 1.27.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.
- package/README.md +31 -20
- package/install.mjs +25 -8
- package/lib/activation.mjs +31 -0
- package/lib/args.mjs +5 -2
- package/lib/bootstrap/manifest.mjs +17 -47
- package/lib/bootstrap/templates.mjs +7 -60
- package/lib/catalog.mjs +14 -240
- package/lib/clis.mjs +7 -118
- package/lib/commands.mjs +47 -0
- package/lib/engine.mjs +16 -11
- package/lib/i18n/catalog/en.mjs +50 -47
- package/lib/i18n/catalog/ko.mjs +50 -47
- package/lib/items/mcp.codebase-memory.mjs +6 -4
- package/lib/items/mcp.graft.mjs +6 -4
- package/lib/items/mcp.graphify.mjs +6 -4
- package/lib/items/mcp.headroom.mjs +6 -4
- package/lib/items/mcp.notion.mjs +7 -4
- package/lib/items/mcp.supabase.mjs +7 -4
- package/lib/items/mcp.vercel.mjs +7 -4
- package/lib/items/plugin.ai-memory.mjs +29 -0
- package/lib/items/plugin.cli-anything.mjs +16 -15
- package/lib/items/plugin.ecc.mjs +16 -20
- package/lib/items/plugin.hyperframes.mjs +15 -13
- package/lib/items/plugin.impeccable.mjs +17 -22
- package/lib/items/plugin.mattpocock-skills.mjs +19 -17
- package/lib/items/plugin.ponytail.mjs +21 -106
- package/lib/items/plugin.superpowers.mjs +17 -24
- package/lib/items/plugin.understand-anything.mjs +16 -18
- package/lib/items/skill.agent-browser.mjs +6 -6
- package/lib/items/skill.archify.mjs +5 -5
- package/lib/items/skill.caveman.mjs +5 -5
- package/lib/items/skill.diagram-design.mjs +5 -5
- package/lib/items/skill.eli5.mjs +6 -6
- package/lib/items/skill.find-skills.mjs +5 -5
- package/lib/items/skill.gsd.mjs +24 -89
- package/lib/items/skill.gstack.mjs +54 -65
- package/lib/items/skill.hallmark.mjs +5 -5
- package/lib/items/skill.i-have-adhd.mjs +6 -6
- package/lib/items/skill.im-not-ai.mjs +15 -0
- package/lib/items/skill.impeccable.mjs +6 -6
- package/lib/items/skill.karpathy.mjs +5 -5
- package/lib/items/skill.mattpocock-skills.mjs +5 -6
- package/lib/items/skill.mcp-builder.mjs +5 -5
- package/lib/items/skill.officecli.mjs +5 -5
- package/lib/items/skill.prompt-master.mjs +5 -5
- package/lib/items/skill.remotion.mjs +5 -5
- package/lib/items/skill.strix.mjs +5 -6
- package/lib/items/skill.superpowers.mjs +6 -7
- package/lib/items/skill.taste.mjs +5 -5
- package/lib/probe.mjs +111 -0
- package/lib/recipe-helpers.mjs +205 -0
- package/lib/recipe.mjs +181 -0
- package/lib/skills-registry.mjs +93 -0
- package/lib/status.mjs +7 -3
- package/lib/tui/detail.mjs +5 -25
- package/lib/tui/rows.mjs +25 -14
- package/lib/tui/run.mjs +35 -8
- package/package.json +3 -3
- package/lib/claude-plugins.mjs +0 -64
- package/lib/global-plugin.mjs +0 -239
- package/lib/items/global.ponytail.mjs +0 -56
- package/lib/items/global.superpowers.mjs +0 -58
- 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,
|
|
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
|
|
58
|
-
|
|
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
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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,
|
|
116
|
-
|
|
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
|
|
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자
|
|
189
|
-
(
|
|
190
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
3
|
-
AGENT_KIT_README, CLAUDE_SETTINGS, CODEX_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
|
|
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
|
|
60
|
-
// `
|
|
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
|
-
//
|
|
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/
|
|
76
|
-
// `.vscode/*`를 무시하기 때문에 필요하다.
|
|
77
|
-
//
|
|
78
|
-
//
|
|
79
|
-
|
|
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
|
|
157
|
-
|
|
158
|
-
|
|
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
|
|
186
|
-
- exposes \`.agents/skills\` to Claude Code
|
|
187
|
-
|
|
188
|
-
|
|
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
|
-
}`
|