@rch4com/agent-setup 1.1.0 → 1.3.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/LICENSE +21 -21
- package/README.md +197 -55
- package/install.mjs +152 -101
- package/lib/args.mjs +276 -311
- package/lib/bootstrap/adapter.mjs +96 -95
- package/lib/bootstrap/apply.mjs +380 -379
- package/lib/bootstrap/flow.mjs +73 -70
- package/lib/bootstrap/record.mjs +154 -142
- package/lib/bootstrap/templates.mjs +148 -148
- package/lib/bootstrap/text.mjs +19 -19
- package/lib/catalog.mjs +213 -145
- package/lib/claude-plugins.mjs +64 -64
- package/lib/clis.mjs +102 -102
- package/lib/context.mjs +66 -65
- package/lib/deps.mjs +5 -7
- package/lib/design-md/catalog.json +454 -454
- package/lib/design-md/catalog.mjs +266 -268
- package/lib/design-md/flow.mjs +181 -166
- package/lib/design-md/open.mjs +51 -50
- package/lib/design-md/providers/awesome-design-md.mjs +117 -114
- package/lib/design-md/providers/index.mjs +9 -9
- package/lib/design-md/scan.mjs +14 -10
- package/lib/engine.mjs +48 -44
- package/lib/gitignore.mjs +18 -18
- package/lib/i18n/catalog/en.mjs +369 -0
- package/lib/i18n/catalog/ko.mjs +359 -0
- package/lib/i18n/detect.mjs +39 -0
- package/lib/i18n/index.mjs +93 -0
- package/lib/items/mcp.codebase-memory.mjs +6 -6
- package/lib/items/mcp.graphify.mjs +8 -0
- package/lib/items/mcp.headroom.mjs +8 -0
- package/lib/items/mcp.notion.mjs +6 -6
- package/lib/items/mcp.supabase.mjs +6 -6
- package/lib/items/mcp.vercel.mjs +6 -6
- package/lib/items/plugin.bkit.mjs +7 -7
- package/lib/items/plugin.ecc.mjs +11 -0
- package/lib/items/plugin.impeccable.mjs +14 -0
- package/lib/items/plugin.mattpocock-skills.mjs +2 -2
- package/lib/items/plugin.ponytail.mjs +104 -0
- package/lib/items/plugin.superpowers.mjs +7 -7
- package/lib/items/plugin.understand-anything.mjs +10 -0
- package/lib/items/skill.caveman.mjs +7 -0
- package/lib/items/skill.gsd.mjs +25 -24
- package/lib/items/skill.gstack.mjs +40 -39
- package/lib/items/skill.karpathy.mjs +7 -0
- package/lib/items/skill.taste.mjs +9 -0
- package/lib/jsonfile.mjs +40 -40
- package/lib/status.mjs +93 -92
- package/lib/tomlfile.mjs +60 -60
- package/lib/tui/render.mjs +41 -63
- package/lib/tui/rows.mjs +278 -206
- package/lib/tui/run.mjs +64 -28
- package/lib/update.mjs +85 -85
- package/lib/width.mjs +57 -0
- package/package.json +36 -36
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
// 한국어 카탈로그. 키 집합은 en.mjs를 그대로 따른다.
|
|
2
|
+
export default {
|
|
3
|
+
'locale.en': 'English',
|
|
4
|
+
'locale.ko': '한국어',
|
|
5
|
+
|
|
6
|
+
'error.notGitRepo': 'git 저장소 안에서 실행해야 합니다.',
|
|
7
|
+
'error.pathOutsideRepo': '저장소 밖의 경로에는 쓸 수 없습니다: {path}',
|
|
8
|
+
'error.pathUnresolvable': '경로를 확인할 수 없습니다: {path} ({code})',
|
|
9
|
+
'error.pathEscapesViaLink': '저장소 내부 경로가 외부 링크를 통해 이탈합니다: {path} -> {real}',
|
|
10
|
+
|
|
11
|
+
'usage.bootstrap': [
|
|
12
|
+
'사용법: npx @rch4com/agent-setup bootstrap [--skill-mode auto|link|copy] [--dry-run]',
|
|
13
|
+
' node install.mjs bootstrap [옵션] # 저장소에 설치기를 두고 쓸 때',
|
|
14
|
+
'',
|
|
15
|
+
'옵션:',
|
|
16
|
+
' --skill-mode auto|link|copy 스킬 연결 방식을 지정합니다. (기본값: auto)',
|
|
17
|
+
' auto: 심볼릭 링크를 먼저 시도하고, 실패하면 복사로 전환합니다.',
|
|
18
|
+
' link: 심볼릭 링크만 시도합니다. 실패하면 오류로 종료합니다.',
|
|
19
|
+
' copy: 항상 복제본을 만듭니다.',
|
|
20
|
+
' --adopt 파일을 만들지 않고, 이미 있는 파일 중 이 버전의',
|
|
21
|
+
' 템플릿과 같은 것만 관리 대상으로 기록합니다.',
|
|
22
|
+
' --lang en|ko 이번 실행에 쓸 표시 언어입니다.',
|
|
23
|
+
' --dry-run 아무것도 바꾸지 않고 예정된 동작만 출력합니다.',
|
|
24
|
+
' -h, --help 이 도움말을 출력하고 종료합니다.',
|
|
25
|
+
'',
|
|
26
|
+
'런처로도 사용할 수 있습니다:',
|
|
27
|
+
' ./setup-agents.sh [옵션]',
|
|
28
|
+
' pwsh -File ./setup-agents.ps1 [옵션]',
|
|
29
|
+
' --tui (또는 -Tui)를 주면 의존성을 설치하고 대화형 화면을 엽니다.',
|
|
30
|
+
' 거기서 부트스트랩·에이전트·design.md를 한 목록에서 검색하고 고릅니다.',
|
|
31
|
+
],
|
|
32
|
+
'usage.root': [
|
|
33
|
+
'사용법: npx @rch4com/agent-setup [옵션]',
|
|
34
|
+
' npx @rch4com/agent-setup bootstrap [옵션]',
|
|
35
|
+
' npx @rch4com/agent-setup update [옵션]',
|
|
36
|
+
' npx @rch4com/agent-setup status [옵션]',
|
|
37
|
+
' npx @rch4com/agent-setup design [옵션]',
|
|
38
|
+
'',
|
|
39
|
+
'저장소에 설치기를 두고 쓸 때는 npx @rch4com/agent-setup 자리에',
|
|
40
|
+
'node install.mjs 를 넣으면 됩니다.',
|
|
41
|
+
'',
|
|
42
|
+
'옵션이 없으면 대화형 화면을 엽니다 — 부트스트랩·에이전트·design.md를',
|
|
43
|
+
'한 목록에서 검색하고 고릅니다.',
|
|
44
|
+
'',
|
|
45
|
+
'옵션:',
|
|
46
|
+
' --list 현재 설치 상태만 출력하고 종료합니다.',
|
|
47
|
+
' --set <목록> 쉼표로 구분한 항목을 목표 상태로 맞춥니다.',
|
|
48
|
+
' 전체 제거는 --set "" 로 명시하세요.',
|
|
49
|
+
' --skill-mode auto|link|copy 대화형 화면에서 실행하는 부트스트랩의 스킬',
|
|
50
|
+
' 연결 방식입니다. (기본값: auto)',
|
|
51
|
+
' --design-dir <경로> design.md 소스를 더합니다. <소스id>=<경로>',
|
|
52
|
+
' 형식도 받으며 반복 지정할 수 있습니다.',
|
|
53
|
+
' --lang en|ko 이번 실행에 쓸 표시 언어입니다.',
|
|
54
|
+
' --dry-run 아무것도 바꾸지 않고 예정된 동작만 출력합니다.',
|
|
55
|
+
' -h, --help 이 도움말을 출력하고 종료합니다.',
|
|
56
|
+
'',
|
|
57
|
+
'--list와 --set은 동작을 고르는 플래그라 함께 쓸 수 없습니다.',
|
|
58
|
+
'',
|
|
59
|
+
'서브커맨드 도움말: npx @rch4com/agent-setup bootstrap --help',
|
|
60
|
+
' npx @rch4com/agent-setup update --help',
|
|
61
|
+
' npx @rch4com/agent-setup status --help',
|
|
62
|
+
' npx @rch4com/agent-setup design --help',
|
|
63
|
+
],
|
|
64
|
+
'usage.design': [
|
|
65
|
+
'사용법: npx @rch4com/agent-setup design [옵션]',
|
|
66
|
+
' node install.mjs design [옵션] # 저장소에 설치기를 두고 쓸 때',
|
|
67
|
+
'',
|
|
68
|
+
'옵션이 없으면 대화형 화면을 엽니다 — DESIGN.MD 섹션이 그 안에 있습니다.',
|
|
69
|
+
'',
|
|
70
|
+
'옵션:',
|
|
71
|
+
' --list 카탈로그와 설치 상태를 출력합니다.',
|
|
72
|
+
' --set <목록> 쉼표로 구분한 항목을 목표 상태로 맞춥니다.',
|
|
73
|
+
' 토큰은 <이름> 또는 <제공자>/<이름> 입니다.',
|
|
74
|
+
' 전체 제거는 --set "" 로 명시하세요.',
|
|
75
|
+
' --preview <목록> 미리보기를 엽니다.',
|
|
76
|
+
' --sync=installed 설치본을 원본 최신으로 다시 받습니다.',
|
|
77
|
+
' --sync=catalog 사용 가능 목록·카테고리를 소스에서 다시 만듭니다.',
|
|
78
|
+
' --sync=stale 설치본을 원본과 해시 비교합니다.',
|
|
79
|
+
' --design-dir <경로> design.md 소스를 더합니다. <소스id>=<경로>',
|
|
80
|
+
' 형식도 받으며 반복 지정할 수 있습니다.',
|
|
81
|
+
' --lang en|ko 이번 실행에 쓸 표시 언어입니다.',
|
|
82
|
+
' --dry-run 아무것도 바꾸지 않고 예정된 동작만 출력합니다.',
|
|
83
|
+
' -h, --help 이 도움말을 출력하고 종료합니다.',
|
|
84
|
+
'',
|
|
85
|
+
'--list, --set, --preview, --sync는 동작을 고르는 플래그라',
|
|
86
|
+
'한 번에 하나만 지정할 수 있습니다.',
|
|
87
|
+
],
|
|
88
|
+
'usage.update': [
|
|
89
|
+
'사용법: npx @rch4com/agent-setup update [옵션]',
|
|
90
|
+
'',
|
|
91
|
+
'설치 기록에 남은 해시와 대조해, 우리가 쓴 그대로인 관리 파일만',
|
|
92
|
+
'최신 템플릿으로 갱신합니다. 사용자가 고친 파일은 건드리지 않고',
|
|
93
|
+
'드리프트로 보고합니다.',
|
|
94
|
+
'',
|
|
95
|
+
'옵션:',
|
|
96
|
+
' --force 드리프트 파일까지 덮어씁니다. 워킹트리가 깨끗해야 합니다',
|
|
97
|
+
' (git이 유일한 되돌리기 수단이므로).',
|
|
98
|
+
' --lang en|ko 이번 실행에 쓸 표시 언어입니다.',
|
|
99
|
+
' --dry-run 아무것도 바꾸지 않고 예정된 동작만 출력합니다.',
|
|
100
|
+
' -h, --help 이 도움말을 출력하고 종료합니다.',
|
|
101
|
+
],
|
|
102
|
+
'usage.status': [
|
|
103
|
+
'사용법: npx @rch4com/agent-setup status [옵션]',
|
|
104
|
+
'',
|
|
105
|
+
'설치 기록(의도) / 실제 저장소 상태(스캔) / 실행 중 도구 버전을',
|
|
106
|
+
'나란히 보여줍니다. 아무것도 바꾸지 않습니다.',
|
|
107
|
+
'',
|
|
108
|
+
'옵션:',
|
|
109
|
+
' --json 기계가 읽을 형태로 출력합니다 (CI 판정용).',
|
|
110
|
+
' --lang en|ko 이번 실행에 쓸 표시 언어입니다.',
|
|
111
|
+
' -h, --help 이 도움말을 출력하고 종료합니다.',
|
|
112
|
+
],
|
|
113
|
+
|
|
114
|
+
'error.unknownArg': '알 수 없는 인자입니다: {token}\n\n{usage}',
|
|
115
|
+
'error.flagTakesNoValue': '{name}에는 값을 줄 수 없습니다: {token}\n\n{usage}',
|
|
116
|
+
'error.singleAction': '함께 쓸 수 없습니다: {given} — 동작 플래그는 한 번에 하나만 지정하세요.\n\n{usage}',
|
|
117
|
+
'error.badSkillMode': '--skill-mode는 {list} 중 하나여야 합니다: {value}\n\n{usage}',
|
|
118
|
+
'error.skillModeNeedsValue': '--skill-mode 뒤에 값이 필요합니다 ({list} 중 하나).\n\n{usage}',
|
|
119
|
+
'error.badLang': '--lang은 {list} 중 하나여야 합니다: {value}\n\n{usage}',
|
|
120
|
+
'error.langNeedsValue': '--lang 뒤에 값이 필요합니다 ({list} 중 하나).\n\n{usage}',
|
|
121
|
+
'error.needsValue': '{name} 뒤에 값이 필요합니다.',
|
|
122
|
+
'error.setNeedsValue': '--set 뒤에 항목 목록이 필요합니다. 전체 제거는 --set "" 로 명시하세요.',
|
|
123
|
+
'error.badSync': '--sync=installed|catalog|stale 형식으로 지정하세요.',
|
|
124
|
+
|
|
125
|
+
'status.installed': '설치됨',
|
|
126
|
+
'status.partial': '일부 설치됨',
|
|
127
|
+
'status.absent': '미설치',
|
|
128
|
+
|
|
129
|
+
'change.install': '설치',
|
|
130
|
+
'change.complete': '보완 설치',
|
|
131
|
+
'change.uninstall': '제거',
|
|
132
|
+
|
|
133
|
+
'apply.noChanges': '변경할 항목이 없습니다.',
|
|
134
|
+
'apply.finalState': '최종 상태:',
|
|
135
|
+
'apply.seeGitDiff': '설정 파일 변경 내용은 git diff로 확인할 수 있습니다.',
|
|
136
|
+
'error.unknownItem': '알 수 없는 항목: {id}',
|
|
137
|
+
|
|
138
|
+
'error.depsMissing': [
|
|
139
|
+
'이 기능에는 의존성이 필요합니다. 다음 중 하나를 실행하세요:',
|
|
140
|
+
' ./setup-agents.sh --tui',
|
|
141
|
+
' npm install --prefix agent-installer',
|
|
142
|
+
],
|
|
143
|
+
|
|
144
|
+
'log.record.write': '설치 기록 기록: {path}',
|
|
145
|
+
'error.recordUnreadable': '{path}을 읽을 수 없습니다 ({code})',
|
|
146
|
+
'error.recordNotJson': '{path}을 읽을 수 없습니다 — JSON이 아닙니다 ({message})',
|
|
147
|
+
'error.recordVersion': '{path}의 형식 버전이 {found}입니다. 이 도구는 {expected}을 씁니다 — 도구를 올리거나 기록을 다시 만드세요.',
|
|
148
|
+
|
|
149
|
+
'log.repoRoot': '저장소 루트: {path}',
|
|
150
|
+
'log.noGlobalWrites': '글로벌 설정 경로는 읽거나 수정하지 않습니다.',
|
|
151
|
+
'log.dir.create': '디렉터리 생성: {path}',
|
|
152
|
+
'log.file.keep': '기존 파일 유지: {path}',
|
|
153
|
+
'log.file.create': '파일 생성: {path}',
|
|
154
|
+
'log.file.update': '파일 갱신: {path}',
|
|
155
|
+
'log.file.userEdited': '사용자 수정 — 건드리지 않음: {path}',
|
|
156
|
+
'log.block.keep': '관리 블록 확인: {path}',
|
|
157
|
+
'log.block.add': '관리 블록 추가: {path}',
|
|
158
|
+
'log.block.update': '관리 블록 갱신: {path}',
|
|
159
|
+
'log.block.missing': '관리 블록 없음 — 건드리지 않음: {path}',
|
|
160
|
+
'log.block.userEdited': '블록 사용자 수정 — 건드리지 않음: {path}',
|
|
161
|
+
'log.json.keep': '설정 키 확인: {path} — {key}',
|
|
162
|
+
'log.json.add': '설정 키 추가: {path} — {key}',
|
|
163
|
+
'log.ignore.keep': '.gitignore 항목 확인: {entries}',
|
|
164
|
+
'log.ignore.add': '.gitignore 항목 추가: {entries}',
|
|
165
|
+
'log.warn.unreadable': '경고: {path}을 읽을 수 없어 건너뜁니다 ({code})',
|
|
166
|
+
'log.warn.noRootObject': '경고: {path}에서 루트 객체를 찾지 못해 건너뜁니다',
|
|
167
|
+
'log.warn.ignoreShadowed': '경고: .gitignore의 "{parent}"가 디렉터리 전체를 제외해 "{entry}" 부정 항목이 무효화됩니다. "{parent}/*" 형태로 바꾸면 다시 포함됩니다.',
|
|
168
|
+
'log.skill.linkOk': '{tool} 스킬 링크 확인: {path}',
|
|
169
|
+
'log.skill.linkCreate': '{tool} 스킬 링크 생성: {path} -> {target}',
|
|
170
|
+
'log.skill.copyCreate': '{tool} 스킬 복제본 생성: {path}',
|
|
171
|
+
'log.skill.copySync': '{tool} 스킬 복제본 동기화: {path}',
|
|
172
|
+
'log.skill.plan': '{tool} 스킬 어댑터 생성 예정: {path} ({mode})',
|
|
173
|
+
'log.skill.warnForeignLink': '경고: {path} 경로가 다른 위치를 가리키는 링크입니다. 변경하지 않습니다.',
|
|
174
|
+
'log.skill.warnUnmanaged': '경고: {path} 경로가 이미 존재하며 agent-kit 관리 대상이 아닙니다. 변경하지 않습니다.',
|
|
175
|
+
'log.skill.linkFellBack': '경고: {tool} 링크 생성에 실패하여 복사 방식으로 전환합니다.',
|
|
176
|
+
|
|
177
|
+
'msg.readFailed': '읽기 실패',
|
|
178
|
+
'msg.noRootObject': '루트 객체 없음',
|
|
179
|
+
'msg.foreignLink': '다른 위치를 가리키는 링크',
|
|
180
|
+
'msg.unmanagedExisting': '관리 대상이 아닌 기존 항목',
|
|
181
|
+
'msg.noManagedBlock': '관리 블록 없음',
|
|
182
|
+
'msg.linkFailed': '링크 생성 실패: {message}',
|
|
183
|
+
|
|
184
|
+
'bootstrap.failures': '실패 {count}건:',
|
|
185
|
+
'bootstrap.done': '완료되었습니다.',
|
|
186
|
+
'bootstrap.sharedGuide': '공통 지침: AGENTS.md',
|
|
187
|
+
'bootstrap.sharedSkills': '공통 스킬: .agents/skills/',
|
|
188
|
+
'bootstrap.tools': '적용 도구: {list}',
|
|
189
|
+
'bootstrap.repoOnly': '도구별 설정은 모두 현재 저장소 안에만 생성되었습니다.',
|
|
190
|
+
'bootstrap.noOverwrite': '기존 설정 파일은 덮어쓰지 않았습니다.',
|
|
191
|
+
'bootstrap.record': '설치 기록: {path}',
|
|
192
|
+
|
|
193
|
+
'error.badSkillModeRuntime': '--skill-mode는 {list} 중 하나여야 합니다: {value}',
|
|
194
|
+
|
|
195
|
+
// status·update 화면 문구. status.row.tool/files는 원본보다 공백을 늘려
|
|
196
|
+
// items 블록(설치됨·기록에만·저장소에만)과 값 시작 열을 맞췄다 — 나머지는
|
|
197
|
+
// 기존 status.mjs·update.mjs의 문구를 그대로 옮겼다.
|
|
198
|
+
'status.noRecord': '설치 기록이 없습니다.',
|
|
199
|
+
'status.noRecord.hint1': ' 이 저장소를 기록 체계로 끌어오려면 bootstrap --adopt 를 실행하세요.',
|
|
200
|
+
'status.noRecord.hint2': ' 파일을 만들지 않고, 템플릿과 같은 파일만 관리 대상으로 기록합니다.',
|
|
201
|
+
'status.row.tool': '도구 {version}',
|
|
202
|
+
'status.version.pinned': '{pinned} 고정 · 실행 중 {running}',
|
|
203
|
+
'status.version.latest': '{pinned} 고정 · 실행 중 {running} · 최신 {latest}',
|
|
204
|
+
'status.hint.update': ' → update로 고정 버전을 옮길 수 있습니다',
|
|
205
|
+
'status.row.files': '관리 파일 {total}개 중 {current} 최신 · {pending} 갱신 대기 · {drift} 사용자 수정',
|
|
206
|
+
'status.hint.pending': ' → update',
|
|
207
|
+
'status.hint.drift': ' → 사용자 수정 파일은 update가 건드리지 않습니다',
|
|
208
|
+
'status.row.items': '항목 설치됨 {list}',
|
|
209
|
+
'status.row.recordOnly': ' 기록에만 {list}',
|
|
210
|
+
'status.row.repoOnly': ' 저장소에만 {list}',
|
|
211
|
+
'status.none': '(없음)',
|
|
212
|
+
'update.versionMove': '고정 {pinned} → 실행 중 {running}',
|
|
213
|
+
'update.summary': '갱신 {updated}건 · 신규 {created}건 · 드리프트 {drift}건',
|
|
214
|
+
'update.driftHeader': '드리프트 (건드리지 않았습니다)',
|
|
215
|
+
'update.driftHint': '최신 템플릿을 반영하려면 update --force (워킹트리가 깨끗해야 합니다)',
|
|
216
|
+
'error.forceNeedsCleanTree': '--force는 워킹트리가 깨끗할 때만 쓸 수 있습니다. git이 유일한 되돌리기 수단이라 커밋되지 않은 변경 위에 덮어쓰면 복구할 수 없습니다.',
|
|
217
|
+
'error.noRecordForUpdate': '{path}이 없습니다. 이 저장소를 기록 체계로 끌어오려면 먼저 `bootstrap --adopt`를 실행하세요 — 파일을 만들지 않고 기록만 만듭니다.',
|
|
218
|
+
|
|
219
|
+
// 항목 카탈로그 — 기존 원문을 그대로 옮긴다. en.mjs 쪽 주석 참고.
|
|
220
|
+
'item.unsupported.claudePlugin': 'Claude Code 전용 플러그인',
|
|
221
|
+
'item.unsupported.claudeSkill': 'Claude Code 스킬 설치본',
|
|
222
|
+
'item.unsupported.ponytailUser': '상류 설치 경로가 사용자 스코프입니다 (codex·copilot 플러그인, gemini 확장)',
|
|
223
|
+
'item.unsupported.ponytailRules': '플러그인 기구가 없습니다 — 규칙을 AGENTS.md에 직접 옮겨 적으세요',
|
|
224
|
+
'item.mcp.partial': '등록됨: {present} / 누락: {missing}',
|
|
225
|
+
'item.plugin.partial': '배선됨: {present} / 누락: {missing}',
|
|
226
|
+
'item.plugin.deferred': '설정 기록됨 — 다음 Claude Code 실행 시 다운로드됩니다',
|
|
227
|
+
'item.scanFailed': '감지 실패: {message}',
|
|
228
|
+
'log.mcp.add': ' [dry-run] {cli} 설정에 {name} 등록',
|
|
229
|
+
'log.mcp.remove': ' [dry-run] {cli} 설정에서 {name} 제거',
|
|
230
|
+
'log.plugin.add': ' [dry-run] {cli} 설정에 플러그인 {name} 추가',
|
|
231
|
+
'log.plugin.remove': ' [dry-run] {cli} 설정에서 플러그인 {name} 제거',
|
|
232
|
+
|
|
233
|
+
'item.mcp.notion.note': '인증: 각 CLI 첫 사용 시 OAuth',
|
|
234
|
+
'item.mcp.vercel.note': '인증: 첫 사용 시 OAuth (승인된 클라이언트만 연결 가능)',
|
|
235
|
+
'item.mcp.supabase.note': '인증: OAuth 동적 등록. 프로젝트 고정이 필요하면 URL에 ?project_ref=<id> 추가',
|
|
236
|
+
'item.mcp.codebase-memory.note': 'PATH에 codebase-memory-mcp 바이너리 필요. 설치: https://github.com/DeusData/codebase-memory-mcp (install.sh / install.ps1)',
|
|
237
|
+
'item.mcp.graphify.note': 'PATH에 graphify-mcp 바이너리 필요. 설치: uv tool install "graphifyy[mcp]". graphify-out/graph.json을 읽으므로 /graphify .로 그래프를 먼저 만드세요',
|
|
238
|
+
'item.mcp.headroom.note': 'PATH에 headroom 바이너리 필요. 설치: uv tool install --python 3.13 "headroom-ai[proxy,mcp]". 프록시(headroom wrap)는 실행 방식이라 저장소 설정 대상이 아닙니다',
|
|
239
|
+
'item.plugin.superpowers.note': '공식 마켓플레이스 플러그인',
|
|
240
|
+
'item.plugin.mattpocock-skills.note': '엔지니어링·생산성 스킬 22종 (tdd, code-review, research 등)',
|
|
241
|
+
'item.plugin.ponytail.note': '군더더기 없는 코드 규칙 묶음. Claude Code 플러그인과 OpenCode plugin 항목을 저장소 범위로 배선합니다',
|
|
242
|
+
'item.plugin.ecc.note': '에이전트 하네스용 스킬·본능·메모리·보안 묶음. skills/에 281개가 들어 있어 공유 스킬 디렉터리에 복사하지 않고 플러그인으로 설치합니다',
|
|
243
|
+
'item.plugin.impeccable.note': 'AI 하네스용 디자인 언어. 플러그인 경로를 쓰는 이유는 npx impeccable install이 .claude/skills를 갈아치워 공유 .agents/skills 연결을 끊기 때문입니다',
|
|
244
|
+
'item.plugin.understand-anything.note': '코드베이스를 탐색 가능한 지식 그래프로 만듭니다. 다른 CLI용 스크립트는 ~/.understand-anything에 클론하는 사용자 스코프라 플러그인만 배선합니다',
|
|
245
|
+
'item.skill.caveman.note': '원시인 말투로 답해 출력 토큰을 줄입니다. 코드와 오류는 그대로 둡니다. /caveman으로 켜고 끕니다',
|
|
246
|
+
'item.skill.taste.note': '랜딩 페이지·포트폴리오·리디자인용 안티슬롭 프런트엔드 스킬 (스킬 이름: design-taste-frontend)',
|
|
247
|
+
'item.skill.karpathy.note': '과설계와 모호한 완료 기준을 줄이는 행동 지침',
|
|
248
|
+
'item.skill.gstack.note': '저장소 로컬 clone + setup (bash 필요, Windows는 Git Bash). 런타임 상태(~/.gstack)는 전역에 생길 수 있음.',
|
|
249
|
+
'item.skill.gsd.note': 'npx @opengsd/gsd-core 프로젝트 로컬 설치',
|
|
250
|
+
'error.gstackClone': 'gstack clone 실패: {output}',
|
|
251
|
+
'error.gstackSetup': 'gstack setup 실패: {output}',
|
|
252
|
+
'error.gsdInstall': 'GSD 설치 실패: {output}',
|
|
253
|
+
'error.gsdUninstall': 'GSD 제거 실패: {output}',
|
|
254
|
+
'error.ponytailOpencodePlugin': '{file}: plugin 키가 배열이 아닙니다. 덮어쓰지 않고 그대로 둡니다 — "@dietrichgebert/ponytail"을 직접 추가하세요.',
|
|
255
|
+
'error.registrySkillInstall': '스킬 레지스트리 설치 실패 ({skill}): {output}',
|
|
256
|
+
'error.itemFieldMissing': '{file}: {field} 누락',
|
|
257
|
+
'error.itemReasonMissing': '{id}: 미지원 CLI \'{cli}\'의 사유(unsupported.{cli})가 필요합니다',
|
|
258
|
+
'error.shellQuote': '셸에 넘길 수 없는 큰따옴표가 인자에 있습니다: {value}',
|
|
259
|
+
|
|
260
|
+
// TUI 탭 이름. en.mjs 쪽 주석 참고. PLUGIN·MCP·SKILL·DESIGN.MD는 형식·브랜드
|
|
261
|
+
// 이름이라 번역하지 않는다 — 두 로케일에서 값이 같은 게 맞다.
|
|
262
|
+
'section.action': '작업',
|
|
263
|
+
'section.plugin': 'PLUGIN',
|
|
264
|
+
'section.mcp': 'MCP',
|
|
265
|
+
'section.skill': 'SKILL',
|
|
266
|
+
'section.design': 'DESIGN.MD',
|
|
267
|
+
|
|
268
|
+
// TUI 목록·검토 화면 문구. en.mjs 쪽 주석 참고.
|
|
269
|
+
'tui.counts': '선택 {picked} / 전체 {total}',
|
|
270
|
+
'tui.search.prefix': '검색 › ',
|
|
271
|
+
'tui.search.placeholder': '타이핑하면 검색 · ↓ 로 목록',
|
|
272
|
+
'tui.empty.filtered': ' 이 탭에는 일치하는 항목이 없습니다. Tab으로 다른 탭을 보세요.',
|
|
273
|
+
'tui.empty.none': ' 항목이 없습니다.',
|
|
274
|
+
'tui.hint.search': '입력=검색어(스페이스 포함) ↓ 목록으로 Tab 탭이동 Esc 검색해제',
|
|
275
|
+
'tui.hint.list': 'Space 선택 ↑↓ 이동(맨 위 ↑=검색칸) Tab 탭 Enter 실행/제출 Ctrl+A 전체 Ctrl+O 미리보기',
|
|
276
|
+
'tui.review.title': '제출 검토 — 변경 {count}건',
|
|
277
|
+
'tui.review.more': ' …외 {count}건',
|
|
278
|
+
'tui.review.hint': 'Enter 적용 Esc 취소',
|
|
279
|
+
'tui.notItemRow': '이 행은 Enter로 실행합니다.',
|
|
280
|
+
'tui.noPreview': '이 항목은 미리보기를 제공하지 않습니다.',
|
|
281
|
+
'tui.opened': '열었습니다: {target}',
|
|
282
|
+
'tui.noChanges': '변경할 항목이 없습니다.',
|
|
283
|
+
'tui.submitCancelled': '제출을 취소했습니다.',
|
|
284
|
+
'tui.toggledAll': '{tab} 탭의 보이는 항목을 모두 선택했습니다.',
|
|
285
|
+
'tui.toggledNone': '{tab} 탭의 보이는 항목을 모두 해제했습니다.',
|
|
286
|
+
'tui.nonInteractive': '대화형 화면은 터미널에서만 열립니다. --list · --set 으로도 다룰 수 있습니다.',
|
|
287
|
+
'tui.applyHeader': '적용할 변경 {count}건{suffix}:',
|
|
288
|
+
'tui.pressAnyKey': '계속하려면 아무 키나 누르세요…',
|
|
289
|
+
'tui.confirmSuffix': ' [y/N] ',
|
|
290
|
+
|
|
291
|
+
// 언어 행(action.language) 전용. en.mjs 쪽 주석 참고.
|
|
292
|
+
'tui.lang.saved': '{path}에 저장했습니다',
|
|
293
|
+
'tui.lang.dryRun': 'dry-run — 이번 세션에만 적용했습니다',
|
|
294
|
+
'tui.lang.saveFailed': '언어를 저장하지 못했습니다: {message}',
|
|
295
|
+
'tui.lang.overridden': '다음 실행에서는 --lang / AGENT_SETUP_LANG이 여전히 이깁니다.',
|
|
296
|
+
|
|
297
|
+
'item.location.user': '설치 위치: 사용자 글로벌',
|
|
298
|
+
// en.mjs 쪽 주석 참고.
|
|
299
|
+
'item.cliCoverage': 'CLI {covered}/{total}',
|
|
300
|
+
'item.unsupportedList': '미배선 {count}곳: {groups}',
|
|
301
|
+
'item.unsupportedGroup': '{clis} — {why}',
|
|
302
|
+
|
|
303
|
+
// 상주 언어 행 — en.mjs 쪽 주석 참고.
|
|
304
|
+
'action.language.label': '언어',
|
|
305
|
+
'action.language.hint': '{current} · Enter로 변경',
|
|
306
|
+
'action.bootstrap.label': '부트스트랩 실행',
|
|
307
|
+
'action.bootstrap.hint': '지침 · 스킬 · 도구별 설정 · 파일 {total}개 중 {present}개 존재',
|
|
308
|
+
'action.sync.installed.label': '설치본 업데이트',
|
|
309
|
+
'action.sync.installed.hint': 'design.md 설치본을 원본 최신으로 다시 받는다',
|
|
310
|
+
'action.sync.catalog.label': '카탈로그 새로고침',
|
|
311
|
+
'action.sync.catalog.hint': 'design.md 목록·카테고리를 소스에서 다시 만든다',
|
|
312
|
+
'action.sync.stale.label': '오래된 항목 확인',
|
|
313
|
+
'action.sync.stale.hint': '설치본을 원본과 해시 비교한다',
|
|
314
|
+
|
|
315
|
+
// design.md 서브시스템. en.mjs 쪽 주석 참고.
|
|
316
|
+
'category.other': '기타',
|
|
317
|
+
'category.local': '사내',
|
|
318
|
+
// 항목 탭 안쪽의 성격 그룹. en.mjs 쪽 주석 참고.
|
|
319
|
+
'category.token': '토큰 절감',
|
|
320
|
+
'category.context': '코드 이해',
|
|
321
|
+
'category.style': '디자인 감각',
|
|
322
|
+
'category.flow': '작업 방식',
|
|
323
|
+
'category.service': '외부 서비스',
|
|
324
|
+
'design.localSuffix': '{id} (로컬)',
|
|
325
|
+
'design.localTag': '로컬',
|
|
326
|
+
'design.unknownItem': ' 알 수 없는 항목: {token}',
|
|
327
|
+
'design.ambiguous': ' 중복된 이름 \'{token}\' — 제공자를 지정하세요: {options}',
|
|
328
|
+
'design.provider.count': ' {label}: {count}개',
|
|
329
|
+
'design.provider.failed': ' {label}: 실패 — {message}',
|
|
330
|
+
'design.catalog.empty': '가져온 항목이 없어 카탈로그를 갱신하지 않습니다.',
|
|
331
|
+
'design.catalog.planned': ' [dry-run] {total}개로 갱신 예정',
|
|
332
|
+
'design.catalog.updated': '카탈로그 갱신됨: {total}개',
|
|
333
|
+
'design.none': '설치된 design.md가 없습니다.',
|
|
334
|
+
'design.updated': ' ✔ 업데이트 {label}',
|
|
335
|
+
'design.updateFailed': ' ✖ 업데이트 {label} — {message}',
|
|
336
|
+
'design.sourceCheckFailed': ' ? {label}: 원본 확인 실패',
|
|
337
|
+
'design.allCurrent': '모든 설치본이 최신입니다.',
|
|
338
|
+
'design.staleList': '오래된 항목 {count}개: {names}',
|
|
339
|
+
'design.staleConfirm': '{count}개를 지금 업데이트할까요?',
|
|
340
|
+
'design.unknownSync': '알 수 없는 동기화 작업: {action}',
|
|
341
|
+
'design.write': ' [dry-run] design-md/{provider}/{name}/DESIGN.md 작성',
|
|
342
|
+
'design.remove': ' [dry-run] design-md/{provider}/{name} 제거',
|
|
343
|
+
'design.nameClash': ' design.md 이름이 겹쳐 \'{picked}\'로 구분합니다: {path}',
|
|
344
|
+
'design.sourceIdClash': ' design.md 소스 id가 겹쳐 \'{picked}\'로 사용합니다: {path}',
|
|
345
|
+
'design.noDesignFile': ' design.md 소스에 DESIGN.md가 없습니다: {path}',
|
|
346
|
+
'design.pathMissing': ' design.md 경로를 찾을 수 없습니다: {path}',
|
|
347
|
+
'design.noPreviewUrl': ' {label}: 미리보기 URL이 없습니다.',
|
|
348
|
+
'design.openFailed': ' {label}: 열기 실패 — 직접 여세요: {target}',
|
|
349
|
+
'design.notOpenable': '열 수 있는 대상이 아닙니다',
|
|
350
|
+
|
|
351
|
+
'error.catalogUnreadable': 'design.md 카탈로그를 읽을 수 없습니다: {path}\n{message}\n`design --sync=catalog`로 다시 만들 수 있습니다.',
|
|
352
|
+
'error.responseTooLarge': '응답이 상한({limit} 바이트)을 넘었습니다: {url}',
|
|
353
|
+
'error.badDesignId': '잘못된 design.md 식별자: {provider}/{name}',
|
|
354
|
+
// resolveTokens(--set/--preview 토큰 해석)의 예외 전용 — design.ambiguous와
|
|
355
|
+
// 같은 상황이지만 로그 줄이 아니라 최상위 예외라 들여쓰기가 없다.
|
|
356
|
+
'error.ambiguousDesignId': '중복된 이름 \'{token}\' — 제공자를 지정하세요: {options}',
|
|
357
|
+
'error.designDownload': '{provider}/{name}: DESIGN.md 다운로드 실패',
|
|
358
|
+
'error.readmeFetch': 'README 가져오기 실패: HTTP {status}',
|
|
359
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// OS 언어 감지. 순수 함수다 — env와 Intl 결과를 인자로 받는다.
|
|
2
|
+
// 여기서 지원 여부를 판단하지 않는다: OS가 뭐라고 하는지만 그대로 보고하고,
|
|
3
|
+
// 그중 무엇을 쓸지는 resolveLocale이 정한다. 둘을 섞으면 "감지는 됐는데
|
|
4
|
+
// 지원하지 않아 영어로 갔다"와 "감지 자체가 실패했다"를 구별할 수 없다.
|
|
5
|
+
|
|
6
|
+
// POSIX 관례상 뒤에 오는 것이 앞을 덮지 않는다 — 먼저 잡히는 것이 이긴다.
|
|
7
|
+
const ENV_KEYS = ['LC_ALL', 'LC_MESSAGES', 'LANG', 'LANGUAGE']
|
|
8
|
+
|
|
9
|
+
// 로케일을 지정하지 않았다는 뜻의 값. 여기서 멈추면 Intl로 내려가지 못한다.
|
|
10
|
+
const NEUTRAL = new Set(['c', 'posix'])
|
|
11
|
+
|
|
12
|
+
// `ko_KR.UTF-8` · `en_US:en` · `ko-KR` 을 모두 `ko`/`en`으로 줄인다.
|
|
13
|
+
// `.`은 인코딩, `@`는 변형(modifier), `:`은 LANGUAGE의 목록 구분자다.
|
|
14
|
+
export function baseTag(raw) {
|
|
15
|
+
if (typeof raw !== 'string') return null
|
|
16
|
+
const head = raw.trim().split(/[.:@]/)[0]
|
|
17
|
+
if (!head) return null
|
|
18
|
+
if (NEUTRAL.has(head.toLowerCase())) return null
|
|
19
|
+
const tag = head.replace(/_/g, '-').split('-')[0].toLowerCase()
|
|
20
|
+
return tag || null
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Node 20+는 full-icu가 기본이라 Windows에서도 OS 언어를 반영한다.
|
|
24
|
+
// 축소 빌드에서는 'en-US'로 고정되는데, 그때는 영어로 시작하는 것이 맞다.
|
|
25
|
+
function intlLocale() {
|
|
26
|
+
try {
|
|
27
|
+
return Intl.DateTimeFormat().resolvedOptions().locale
|
|
28
|
+
} catch {
|
|
29
|
+
return null
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function detectLocale(env = {}, intl = intlLocale()) {
|
|
34
|
+
for (const key of ENV_KEYS) {
|
|
35
|
+
const tag = baseTag(env[key])
|
|
36
|
+
if (tag) return tag
|
|
37
|
+
}
|
|
38
|
+
return baseTag(intl)
|
|
39
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// 로케일 해석과 문구 조회. 잎(leaf) 모듈이라 아무것도 import 하지 않는다 —
|
|
2
|
+
// args.mjs·context.mjs·bootstrap/*가 전부 여기에 닿으므로, 외부 의존성이
|
|
3
|
+
// 하나라도 들어오면 npm install 없이 도는 부트스트랩이 깨진다.
|
|
4
|
+
// bootstrap.isolation.test.mjs가 이 불변식을 지킨다.
|
|
5
|
+
//
|
|
6
|
+
// 전역 싱글턴을 두지 않는다. t는 만들어서 넘기는 값이다 — 그래야 순수
|
|
7
|
+
// 모듈(state.mjs)이 계속 아무것도 import 하지 않고, 테스트가 파일 병렬로
|
|
8
|
+
// 돌아도 로케일이 서로를 오염시키지 않는다.
|
|
9
|
+
import EN from './catalog/en.mjs'
|
|
10
|
+
import KO from './catalog/ko.mjs'
|
|
11
|
+
|
|
12
|
+
export const LOCALES = ['en', 'ko']
|
|
13
|
+
|
|
14
|
+
const CATALOGS = { en: EN, ko: KO }
|
|
15
|
+
const PLACEHOLDER = /\{(\w+)\}/g
|
|
16
|
+
|
|
17
|
+
// 자리에 값이 없으면 던진다. `12 of undefined files`가 화면에 남는 것보다
|
|
18
|
+
// 즉시 실패가 낫다 — 이건 번역 누락이 아니라 호출부의 버그다.
|
|
19
|
+
function fill(template, params, key) {
|
|
20
|
+
return template.replace(PLACEHOLDER, (_, name) => {
|
|
21
|
+
if (!Object.hasOwn(params, name)) {
|
|
22
|
+
throw new Error(`i18n: '${key}'의 자리 {${name}}에 값이 없습니다`)
|
|
23
|
+
}
|
|
24
|
+
return String(params[name])
|
|
25
|
+
})
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// 활성 카탈로그 → 영어 폴백 → 예외.
|
|
29
|
+
// 번역 누락은 사용자 화면을 깨뜨리지 않아야 하지만, 영어에도 없는 키는
|
|
30
|
+
// 개발자 오타다. 조용히 넘기면 화면에 'log.file.creat'가 그대로 찍힌다.
|
|
31
|
+
function lookup(locale, key) {
|
|
32
|
+
const value = CATALOGS[locale]?.[key]
|
|
33
|
+
if (value !== undefined) return value
|
|
34
|
+
const base = EN[key]
|
|
35
|
+
if (base === undefined) throw new Error(`i18n: 알 수 없는 키입니다: ${key}`)
|
|
36
|
+
return base
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function createT(locale) {
|
|
40
|
+
const use = LOCALES.includes(locale) ? locale : 'en'
|
|
41
|
+
const t = (key, params = {}) => {
|
|
42
|
+
const value = lookup(use, key)
|
|
43
|
+
return Array.isArray(value)
|
|
44
|
+
? value.map((line) => fill(line, params, key)).join('\n')
|
|
45
|
+
: fill(value, params, key)
|
|
46
|
+
}
|
|
47
|
+
t.locale = use
|
|
48
|
+
return t
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// 앞이 이긴다: 플래그 > 환경변수 > 설치 기록 > OS 감지 > 영어.
|
|
52
|
+
// 지원하지 않는 값은 조용히 건너뛴다 — 손으로 편집된 기록이나 환경에 남은
|
|
53
|
+
// 값 때문에 도구가 죽으면 안 된다. 사용자가 --lang으로 명시한 경우만
|
|
54
|
+
// args.mjs가 따로 거부한다.
|
|
55
|
+
export function resolveLocale({ flag = null, env = {}, record = null, detected = null } = {}) {
|
|
56
|
+
for (const value of [flag, env.AGENT_SETUP_LANG, record?.lang, detected]) {
|
|
57
|
+
if (typeof value === 'string' && LOCALES.includes(value)) return value
|
|
58
|
+
}
|
|
59
|
+
return 'en'
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// 플래그나 환경변수가 로케일을 못박았는가. TUI에서 고른 언어는 이번 실행에는
|
|
63
|
+
// 적용되지만 기록에만 남고 다음 실행에서 다시 밀리므로, 화면이 그 사실을
|
|
64
|
+
// 알려야 한다. 판정 규칙이 resolveLocale과 갈리면 안 되므로 같은 모듈에 둔다 —
|
|
65
|
+
// 지원하지 않는 값은 resolveLocale이 이미 건너뛰었고, 셸에 남은
|
|
66
|
+
// AGENT_SETUP_LANG=ja까지 "환경변수가 이긴다"고 말하면 거짓말이 된다.
|
|
67
|
+
export function isLocaleForced({ flag = null, env = {} } = {}) {
|
|
68
|
+
return [flag, env.AGENT_SETUP_LANG].some((v) => typeof v === 'string' && LOCALES.includes(v))
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// 옵션 주머니가 없어 t를 꿸 수 없는 곳(context.mjs의 repoPath,
|
|
72
|
+
// record.mjs의 readRecord)이 쓴다. .message는 영어로 즉시 채워 스택
|
|
73
|
+
// 트레이스가 그대로 읽히게 하고, 진입점이 .key를 보고 다시 렌더한다.
|
|
74
|
+
export class LocalizedError extends Error {
|
|
75
|
+
constructor(key, params = {}) {
|
|
76
|
+
super(createT('en')(key, params))
|
|
77
|
+
this.name = 'LocalizedError'
|
|
78
|
+
this.key = key
|
|
79
|
+
this.params = params
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// 데이터 계층이 만들어 나중에 표시되는 문구용. detect()의 detail이나
|
|
84
|
+
// unsupported 사유는 만들어지는 시점에 로케일을 모른다 — 키를 담아 두고
|
|
85
|
+
// 렌더 시점에 toText로 푼다.
|
|
86
|
+
export function msg(key, params = {}) {
|
|
87
|
+
return { key, params }
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function toText(t, value) {
|
|
91
|
+
if (value === null || value === undefined) return value
|
|
92
|
+
return typeof value === 'string' ? value : t(value.key, value.params)
|
|
93
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { defineMcp } from '../catalog.mjs'
|
|
2
|
-
export default defineMcp({
|
|
3
|
-
id: 'mcp.codebase-memory', label: 'Codebase Memory MCP',
|
|
4
|
-
server: { kind: 'stdio', command: 'codebase-memory-mcp', args: [] },
|
|
5
|
-
note: '
|
|
6
|
-
})
|
|
1
|
+
import { defineMcp } from '../catalog.mjs'
|
|
2
|
+
export default defineMcp({
|
|
3
|
+
id: 'mcp.codebase-memory', label: 'Codebase Memory MCP', group: '__context',
|
|
4
|
+
server: { kind: 'stdio', command: 'codebase-memory-mcp', args: [] },
|
|
5
|
+
note: 'item.mcp.codebase-memory.note',
|
|
6
|
+
})
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { defineMcp } from '../catalog.mjs'
|
|
2
|
+
// graphify-mcp는 인자가 없으면 실행 디렉터리의 graphify-out/graph.json을 읽는다.
|
|
3
|
+
// 즉 그래프가 저장소 안에 있으므로 등록도 프로젝트 설정에만 하면 된다.
|
|
4
|
+
export default defineMcp({
|
|
5
|
+
id: 'mcp.graphify', label: 'Graphify MCP', group: '__context',
|
|
6
|
+
server: { kind: 'stdio', command: 'graphify-mcp', args: [] },
|
|
7
|
+
note: 'item.mcp.graphify.note',
|
|
8
|
+
})
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { defineMcp } from '../catalog.mjs'
|
|
2
|
+
// 상류가 배포하는 server.json의 계약과 같은 명령이다: headroom mcp serve (stdio).
|
|
3
|
+
// 프록시(headroom wrap)는 실행 방식이라 저장소 설정에 담을 것이 없고, MCP만 배선한다.
|
|
4
|
+
export default defineMcp({
|
|
5
|
+
id: 'mcp.headroom', label: 'Headroom MCP', group: '__token',
|
|
6
|
+
server: { kind: 'stdio', command: 'headroom', args: ['mcp', 'serve'] },
|
|
7
|
+
note: 'item.mcp.headroom.note',
|
|
8
|
+
})
|
package/lib/items/mcp.notion.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { defineMcp } from '../catalog.mjs'
|
|
2
|
-
export default defineMcp({
|
|
3
|
-
id: 'mcp.notion', label: 'Notion MCP',
|
|
4
|
-
server: { kind: 'http', url: 'https://mcp.notion.com/mcp' },
|
|
5
|
-
note: '
|
|
6
|
-
})
|
|
1
|
+
import { defineMcp } from '../catalog.mjs'
|
|
2
|
+
export default defineMcp({
|
|
3
|
+
id: 'mcp.notion', label: 'Notion MCP', group: '__service',
|
|
4
|
+
server: { kind: 'http', url: 'https://mcp.notion.com/mcp' },
|
|
5
|
+
note: 'item.mcp.notion.note',
|
|
6
|
+
})
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { defineMcp } from '../catalog.mjs'
|
|
2
|
-
export default defineMcp({
|
|
3
|
-
id: 'mcp.supabase', label: 'Supabase MCP',
|
|
4
|
-
server: { kind: 'http', url: 'https://mcp.supabase.com/mcp' },
|
|
5
|
-
note: '
|
|
6
|
-
})
|
|
1
|
+
import { defineMcp } from '../catalog.mjs'
|
|
2
|
+
export default defineMcp({
|
|
3
|
+
id: 'mcp.supabase', label: 'Supabase MCP', group: '__service',
|
|
4
|
+
server: { kind: 'http', url: 'https://mcp.supabase.com/mcp' },
|
|
5
|
+
note: 'item.mcp.supabase.note',
|
|
6
|
+
})
|
package/lib/items/mcp.vercel.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { defineMcp } from '../catalog.mjs'
|
|
2
|
-
export default defineMcp({
|
|
3
|
-
id: 'mcp.vercel', label: 'Vercel MCP',
|
|
4
|
-
server: { kind: 'http', url: 'https://mcp.vercel.com' },
|
|
5
|
-
note: '
|
|
6
|
-
})
|
|
1
|
+
import { defineMcp } from '../catalog.mjs'
|
|
2
|
+
export default defineMcp({
|
|
3
|
+
id: 'mcp.vercel', label: 'Vercel MCP', group: '__service',
|
|
4
|
+
server: { kind: 'http', url: 'https://mcp.vercel.com' },
|
|
5
|
+
note: 'item.mcp.vercel.note',
|
|
6
|
+
})
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { definePlugin } from '../catalog.mjs'
|
|
2
|
-
export default definePlugin({
|
|
3
|
-
id: 'plugin.bkit', label: 'bkit',
|
|
4
|
-
installId: 'bkit@bkit-marketplace',
|
|
5
|
-
detectIds: ['bkit@bkit-marketplace'],
|
|
6
|
-
marketplace: { name: 'bkit-marketplace', repo: 'popup-studio-ai/bkit-claude-code' },
|
|
7
|
-
})
|
|
1
|
+
import { definePlugin } from '../catalog.mjs'
|
|
2
|
+
export default definePlugin({
|
|
3
|
+
id: 'plugin.bkit', label: 'bkit', group: '__flow',
|
|
4
|
+
installId: 'bkit@bkit-marketplace',
|
|
5
|
+
detectIds: ['bkit@bkit-marketplace'],
|
|
6
|
+
marketplace: { name: 'bkit-marketplace', repo: 'popup-studio-ai/bkit-claude-code' },
|
|
7
|
+
})
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { definePlugin } from '../catalog.mjs'
|
|
2
|
+
// 레지스트리 경로(`npx skills add`)도 열려 있지만 쓰지 않는다 — ECC의 skills/에는
|
|
3
|
+
// 281개가 들어 있어 `--skill` 없이 넣으면 공유 스킬 디렉터리를 통째로 덮는다.
|
|
4
|
+
// 플러그인은 프로필을 상류가 관리하므로 저장소에 남는 파일이 없다.
|
|
5
|
+
export default definePlugin({
|
|
6
|
+
id: 'plugin.ecc', label: 'ECC', group: '__flow',
|
|
7
|
+
installId: 'ecc@ecc',
|
|
8
|
+
detectIds: ['ecc@ecc'],
|
|
9
|
+
marketplace: { name: 'ecc', repo: 'affaan-m/ECC' },
|
|
10
|
+
note: 'item.plugin.ecc.note',
|
|
11
|
+
})
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { definePlugin } from '../catalog.mjs'
|
|
2
|
+
// 상류의 멀티 CLI 경로(`npx impeccable install --providers=... --scope=project`)는
|
|
3
|
+
// 쓰지 않는다. 실측 결과 그 명령이 `.claude/skills`를 **실제 디렉터리로 갈아치워**
|
|
4
|
+
// 부트스트랩이 만든 `.agents/skills` Junction을 끊는다 — 공유 스킬이 전부
|
|
5
|
+
// Claude Code 화면에서 사라진다. 플러그인 경로는 `.claude/skills`를 건드리지 않는다.
|
|
6
|
+
// 또 그 명령은 `--providers`와 `--scope`를 함께 주지 않으면 대화형으로 물으며,
|
|
7
|
+
// 비TTY에서는 조용히 global을 골라 홈에 설치한다.
|
|
8
|
+
export default definePlugin({
|
|
9
|
+
id: 'plugin.impeccable', label: 'impeccable', group: '__style',
|
|
10
|
+
installId: 'impeccable@impeccable',
|
|
11
|
+
detectIds: ['impeccable@impeccable'],
|
|
12
|
+
marketplace: { name: 'impeccable', repo: 'pbakaus/impeccable' },
|
|
13
|
+
note: 'item.plugin.impeccable.note',
|
|
14
|
+
})
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { definePlugin } from '../catalog.mjs'
|
|
2
2
|
export default definePlugin({
|
|
3
|
-
id: 'plugin.mattpocock-skills', label: 'Matt Pocock skills',
|
|
3
|
+
id: 'plugin.mattpocock-skills', label: 'Matt Pocock skills', group: '__flow',
|
|
4
4
|
installId: 'mattpocock-skills@mattpocock',
|
|
5
5
|
detectIds: ['mattpocock-skills@mattpocock'],
|
|
6
6
|
marketplace: { name: 'mattpocock', repo: 'mattpocock/skills' },
|
|
7
|
-
note: '
|
|
7
|
+
note: 'item.plugin.mattpocock-skills.note',
|
|
8
8
|
})
|