@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
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { defineGlobalPlugin } from '../global-plugin.mjs'
|
|
2
|
-
import { CLI_IDS } from '../clis.mjs'
|
|
3
|
-
import { msg } from '../i18n/index.mjs'
|
|
4
|
-
|
|
5
|
-
// Ponytail의 하니스별 전역 설치 판. 공통 기구는 global-plugin.mjs에 있다.
|
|
6
|
-
//
|
|
7
|
-
// 하니스별 근거(2026-08-15 상류 README 재검증):
|
|
8
|
-
// codex — `codex plugin marketplace add DietrichGebert/ponytail` +
|
|
9
|
-
// `codex plugin add ponytail@ponytail`. 상류는 설치 후 codex에서
|
|
10
|
-
// /hooks로 라이프사이클 훅 등록을 확인하고 새 스레드를 시작하라는
|
|
11
|
-
// 대화형 후속 단계를 안내한다 — 명령으로 대신할 수 없어 note에
|
|
12
|
-
// 적는다. 제거는 `codex plugin remove <id>`.
|
|
13
|
-
// copilot — `copilot plugin marketplace add` + `copilot plugin install
|
|
14
|
-
// ponytail@ponytail`. 상류 README에 제거 명령은 없지만
|
|
15
|
-
// `copilot plugin uninstall <이름>`은 copilot CLI 자체의 범용
|
|
16
|
-
// 명령이다(--help 실측).
|
|
17
|
-
// gemini — `gemini extensions install https://github.com/DietrichGebert/ponytail`.
|
|
18
|
-
//
|
|
19
|
-
// opencode는 프로젝트 항목(plugin.ponytail)이 opencode.jsonc의 plugin 배열로
|
|
20
|
-
// 이미 배선한다 — 전역 판에서 겹치면 같은 플러그인이 두 번 등록된다. claude도
|
|
21
|
-
// 같은 이유로 프로젝트 항목의 자리다.
|
|
22
|
-
// grok — `grok plugin install DietrichGebert/ponytail --trust`. 2026-09-05
|
|
23
|
-
// 이 머신(grok 1.0.5)에서 설치·감지·제거 왕복을 실측했다. 상류
|
|
24
|
-
// README는 "기본 꺼짐이라 /plugins에서 켜라"고 적지만 1.0.5는
|
|
25
|
-
// --trust 설치 직후 config.toml [plugins].enabled에 이름을 넣었다.
|
|
26
|
-
// kiro·vscode는 상류가 룰 파일 수동 배치만 안내하고, kilo·kimi는 경로가 없다.
|
|
27
|
-
//
|
|
28
|
-
// 상류는 플러그인 제거 전에 node scripts/uninstall.js로 ~/.config/ponytail
|
|
29
|
-
// 설정과 statusLine 항목을 정리하라고 안내한다 — 하니스마다 스크립트 위치가
|
|
30
|
-
// 달라 자동화하지 않고 note로 알린다. 이 항목은 플러그인만 제거한다.
|
|
31
|
-
const SUPPORTS = ['codex', 'gemini', 'copilot', 'grok']
|
|
32
|
-
|
|
33
|
-
const CONFIG = {
|
|
34
|
-
id: 'global.ponytail', label: 'Ponytail', group: '__token',
|
|
35
|
-
note: 'item.global.ponytail.note',
|
|
36
|
-
verified: '2026-09-05',
|
|
37
|
-
pluginName: 'ponytail',
|
|
38
|
-
marketplaceRepo: 'DietrichGebert/ponytail',
|
|
39
|
-
installId: 'ponytail@ponytail',
|
|
40
|
-
gemini: 'https://github.com/DietrichGebert/ponytail',
|
|
41
|
-
grok: 'DietrichGebert/ponytail',
|
|
42
|
-
unsupported: Object.fromEntries(
|
|
43
|
-
CLI_IDS.filter((c) => !SUPPORTS.includes(c)).map((c) => [
|
|
44
|
-
c,
|
|
45
|
-
['claude', 'opencode'].includes(c) ? msg('item.unsupported.globalProjectItem', { item: 'Ponytail' })
|
|
46
|
-
: ['kiro', 'vscode'].includes(c) ? msg('item.unsupported.ponytailRules')
|
|
47
|
-
: msg('item.unsupported.upstreamNone'),
|
|
48
|
-
]),
|
|
49
|
-
),
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export function createItem(deps = {}) {
|
|
53
|
-
return defineGlobalPlugin(CONFIG, deps)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export default createItem()
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { defineGlobalPlugin } from '../global-plugin.mjs'
|
|
2
|
-
import { CLI_IDS } from '../clis.mjs'
|
|
3
|
-
import { msg } from '../i18n/index.mjs'
|
|
4
|
-
|
|
5
|
-
// superpowers를 프로젝트 스코프로 배선할 길이 없는 하니스에 상류의 하니스별
|
|
6
|
-
// 전역 설치("install separately for each one")를 대신 해 주는 항목. 공통
|
|
7
|
-
// 기구는 global-plugin.mjs에 있고, 여기는 상류 좌표와 사유만 든다.
|
|
8
|
-
//
|
|
9
|
-
// 하니스별 근거(2026-08-15, v6.3.0):
|
|
10
|
-
// codex — 이 머신에서 marketplace add + plugin add를 실측. 기록은
|
|
11
|
-
// $CODEX_HOME/config.toml의 [plugins."superpowers@…"].
|
|
12
|
-
// copilot — 이 머신에서 설치·목록·제거를 실측(~/.copilot/config.json).
|
|
13
|
-
// gemini — 공식 extensions 기구. 로컬 CLI가 없어 문서 근거다.
|
|
14
|
-
// opencode— 상류 .opencode/INSTALL.md가 전역 opencode.json의 plugin 배열에
|
|
15
|
-
// 아래 항목 한 줄을 더하라고 안내한다.
|
|
16
|
-
//
|
|
17
|
-
// grok — 2026-09-05 이 머신(grok 1.0.5)에서 `grok plugin install
|
|
18
|
-
// superpowers@xai-official --trust`로 설치·감지·제거 왕복을 실측.
|
|
19
|
-
// 기록은 ~/.grok/installed-plugins/registry.json(global-plugin.mjs).
|
|
20
|
-
//
|
|
21
|
-
// kimi는 설치가 대화형 /plugins뿐이라 헤드리스 경로가 없다. claude는 프로젝트
|
|
22
|
-
// 스코프 항목(plugin.superpowers)의 자리다.
|
|
23
|
-
//
|
|
24
|
-
// skill.superpowers(공유 .agents/skills)와 배타로 묶지 않는다 — 저쪽은 이
|
|
25
|
-
// 저장소에만, 이쪽은 머신 전체에 작용해 평면이 다르고, "claude는 프로젝트
|
|
26
|
-
// 플러그인 + 나머지는 전역" 같은 조합이 정당하다. 겹치는 하니스가 같은 스킬을
|
|
27
|
-
// 두 곳에서 본다는 것은 note에 적어 둔다.
|
|
28
|
-
const SUPPORTS = ['codex', 'gemini', 'opencode', 'copilot', 'grok']
|
|
29
|
-
|
|
30
|
-
const CONFIG = {
|
|
31
|
-
id: 'global.superpowers', label: 'superpowers', group: '__flow',
|
|
32
|
-
note: 'item.global.superpowers.note',
|
|
33
|
-
verified: '2026-09-05',
|
|
34
|
-
pluginName: 'superpowers',
|
|
35
|
-
marketplaceRepo: 'obra/superpowers-marketplace',
|
|
36
|
-
installId: 'superpowers@superpowers-marketplace',
|
|
37
|
-
gemini: 'https://github.com/obra/superpowers',
|
|
38
|
-
opencode: 'superpowers@git+https://github.com/obra/superpowers.git',
|
|
39
|
-
grok: 'superpowers@xai-official',
|
|
40
|
-
unsupported: Object.fromEntries(
|
|
41
|
-
CLI_IDS.filter((c) => !SUPPORTS.includes(c)).map((c) => [
|
|
42
|
-
c,
|
|
43
|
-
c === 'claude' ? msg('item.unsupported.superpowersGlobalClaude')
|
|
44
|
-
: c === 'kimi' ? msg('item.unsupported.superpowersGlobalKimi')
|
|
45
|
-
// 상류 README가 Antigravity 설치를 안내하지만 감지·제거 경로를 실측할
|
|
46
|
-
// CLI가 없다 — grok과 같은 기준으로 아직 배선하지 않는다.
|
|
47
|
-
: c === 'antigravity' ? msg('item.unsupported.unmeasuredUpstream')
|
|
48
|
-
: msg('item.unsupported.upstreamNone'),
|
|
49
|
-
]),
|
|
50
|
-
),
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// 테스트가 홈·환경·PATH 탐지를 갈아끼울 수 있게 공장으로 노출한다.
|
|
54
|
-
export function createItem(deps = {}) {
|
|
55
|
-
return defineGlobalPlugin(CONFIG, deps)
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export default createItem()
|
package/lib/tomlfile.mjs
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs'
|
|
2
|
-
import { dirname } from 'node:path'
|
|
3
|
-
import { parse } from 'smol-toml'
|
|
4
|
-
import { LocalizedError } from './i18n/index.mjs'
|
|
5
|
-
import { escapeRegExp } from './untrusted.mjs'
|
|
6
|
-
|
|
7
|
-
function readText(file) {
|
|
8
|
-
return existsSync(file) ? readFileSync(file, 'utf8') : ''
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
// 깨진 TOML은 읽기·쓰기 모두 거부한다. 예전에는 파싱 실패를 "섹션 없음"으로
|
|
12
|
-
// 돌려줘, 닫는 대괄호가 빠진 파일 끝에 같은 섹션이 하나 더 붙고 사용자는
|
|
13
|
-
// 파일이 깨진 것을 끝까지 몰랐다 — jsonfile.mjs의 JSON 규칙과 같다.
|
|
14
|
-
function parseStrict(text, file) {
|
|
15
|
-
try {
|
|
16
|
-
return parse(text)
|
|
17
|
-
} catch (err) {
|
|
18
|
-
throw new LocalizedError('error.tomlInvalid', { path: file, message: err.message.split('\n')[0] })
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export function hasSection(file, name) {
|
|
23
|
-
const text = readText(file)
|
|
24
|
-
if (!text.trim()) return false
|
|
25
|
-
const data = parseStrict(text, file)
|
|
26
|
-
return data.mcp_servers != null && Object.hasOwn(data.mcp_servers, name)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function appendSection(file, name, lines) {
|
|
30
|
-
let text = readText(file)
|
|
31
|
-
if (text.trim()) parseStrict(text, file)
|
|
32
|
-
if (text.length > 0 && !text.endsWith('\n')) text += '\n'
|
|
33
|
-
const separator = text.length > 0 ? '\n' : ''
|
|
34
|
-
text += `${separator}[mcp_servers.${name}]\n${lines.join('\n')}\n`
|
|
35
|
-
mkdirSync(dirname(file), { recursive: true })
|
|
36
|
-
writeFileSync(file, text)
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function removeSection(file, name) {
|
|
40
|
-
const text = readText(file)
|
|
41
|
-
if (!text) return
|
|
42
|
-
parseStrict(text, file)
|
|
43
|
-
const lines = text.split('\n')
|
|
44
|
-
const headerRe = new RegExp(`^\\s*\\[mcp_servers\\.${escapeRegExp(name)}(\\.|\\])`)
|
|
45
|
-
const anyHeaderRe = /^\s*\[/
|
|
46
|
-
const out = []
|
|
47
|
-
let skipping = false
|
|
48
|
-
let removedAt = -1
|
|
49
|
-
for (const line of lines) {
|
|
50
|
-
if (skipping && anyHeaderRe.test(line) && !headerRe.test(line)) skipping = false
|
|
51
|
-
if (headerRe.test(line)) {
|
|
52
|
-
skipping = true
|
|
53
|
-
if (removedAt === -1) removedAt = out.length
|
|
54
|
-
}
|
|
55
|
-
if (!skipping) out.push(line)
|
|
56
|
-
}
|
|
57
|
-
// 제거 지점의 경계에서만 빈 줄 하나를 정리해, 다른 위치의 빈 줄들은 그대로 보존한다.
|
|
58
|
-
if (
|
|
59
|
-
removedAt > 0 &&
|
|
60
|
-
removedAt < out.length &&
|
|
61
|
-
out[removedAt - 1].trim() === '' &&
|
|
62
|
-
(out[removedAt] ?? '').trim() === ''
|
|
63
|
-
) {
|
|
64
|
-
out.splice(removedAt - 1, 1)
|
|
65
|
-
}
|
|
66
|
-
writeFileSync(file, out.join('\n'))
|
|
67
|
-
}
|