@uzysjung/agent-harness 26.165.0 → 26.167.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.
@@ -17,7 +17,7 @@ import {
17
17
  init_esm_shims,
18
18
  residentCost,
19
19
  resolveBundleRoot
20
- } from "./chunk-QHBJ7PMU.js";
20
+ } from "./chunk-KVXCTS6D.js";
21
21
 
22
22
  // src/trust-tier-drift.ts
23
23
  init_esm_shims();
@@ -35,8 +35,11 @@ var REPO_OVERRIDE = {
35
35
  // npm (v26.75.0)
36
36
  "bmad-method": "bmad-code-org/BMAD-METHOD",
37
37
  // npx-run (v26.75.0)
38
- "railway-mcp-server": "railwayapp/railway-mcp-server"
39
- // internal — 트랙 표 MCP 행(#709)
38
+ // internal — 트랙 표 MCP 행(#709 · #722). 원격 서버에 공개 저장소가 따로 없으면 같은 벤더의 공개 저장소를 감시한다(ADR-106)
39
+ "railway-mcp-server": "railwayapp/cli",
40
+ "chrome-devtools": "ChromeDevTools/chrome-devtools-mcp",
41
+ "github-mcp": "github/github-mcp-server",
42
+ vercel: "vercel/vercel"
40
43
  };
41
44
  function normalizeRepo(source) {
42
45
  const stripped = source.replace(/^https?:\/\/github\.com\//i, "");
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/trust-tier-drift.ts"],"sourcesContent":["/**\n * A1 — Trust Tier star-drift 검출 데이터 + 순수 로직.\n *\n * TRUST_TIER 의 star 기반 라벨(vetted ≥ 1000★ / experimental < 1000★)이 실제 GitHub\n * star 와 어긋났는지(drift) 판정한다. `official` 은 star 무관(Anthropic 공식·하네스 자체)\n * 이라 검사 제외.\n *\n * repo 출처 = 각 자산 method (in-code authoritative — 주석이 아니라 실제 설치 source):\n * skill → method.source (\"owner/repo\" 또는 github URL)\n * plugin → method.marketplace (\"owner/repo\")\n * npm → NPM_REPO_OVERRIDE[id] (pkg 는 npm 명이므로 GitHub repo 를 별도 명시)\n *\n * fetch/네트워크는 본 모듈에 없음 — 순수 로직만(테스트 가능). 실 fetch 는\n * `scripts/trust-tier-drift.mjs` 가 담당.\n */\nimport { EXTERNAL_ASSETS, type ExternalAsset, TRUST_TIER } from \"./external-assets.js\";\n\n// v26.79.0 — gen-compatibility 의 카테고리 exhaustiveness 가드용 SSOT (하드코딩 drift 차단).\nexport { CATEGORIES } from \"./categories.js\";\n// v26.116.0 (ADR-043) — context-cost-report.mjs 가 dist 에서 비용 계측기를 읽도록 re-export.\n// v26.140.0 — formatResidentCostBlock: 리포트가 표를 직접 조립하지 않도록 표시 계약도 함께 노출.\nexport {\n assetCostRows,\n estimateTokens,\n formatResidentCostBlock,\n residentCost,\n resolveBundleRoot,\n} from \"./context-cost.js\";\n// v26.76.0 — gen-compatibility.mjs 가 dist 에서 자산 카탈로그+tier 를 읽도록 re-export.\n// v26.93.0 — DEV_METHOD_SKILL_IDS 추가: gen-compatibility 의 CLI scope override 를\n// 하드코딩 id 목록 대신 SSOT 에서 derive (no-false-ship drift 구조 차단).\n// v26.95.0 — INTERNAL_BUNDLED_SKILL_IDS (dev-method + opt-in gemini-consult) 로 CLI scope derive.\nexport {\n // v26.102.0 (ADR-031) — gen-compatibility 의 CLI 열이 도달 범위를 derive 하도록 re-export.\n assetCliSupport,\n DEV_METHOD_SKILL_IDS,\n EXTERNAL_ASSETS,\n INTERNAL_BUNDLED_SKILL_IDS,\n TRUST_TIER,\n} from \"./external-assets.js\";\nexport { buildAssetSpec, buildManifest } from \"./manifest.js\";\n// v26.102.0 (ADR-031) — 도달 라벨(\"N-CLI\")의 N 을 derive 하기 위한 re-export (매직 넘버 금지).\nexport { CLI_BASES, DEFAULT_OPTIONS, TRACKS } from \"./types.js\";\n\n/** vetted 경계 (NORTH_STAR / PRD v26-71 D2). */\nexport const STAR_THRESHOLD = 1000;\n\nexport type StarTier = \"vetted\" | \"experimental\";\nexport type DriftVerdict = \"ok\" | \"promote\" | \"demote\";\n\n/**\n * method 가 GitHub repo 를 안 담는 자산(npm.pkg / npx-run.cmd 는 npm 명) → 트러스트 근거가\n * 된 GitHub repo 를 명시 매핑. override 가 method 도출보다 우선.\n */\nconst REPO_OVERRIDE: Record<string, string> = {\n \"vercel-cli\": \"vercel/vercel\", // npm\n \"netlify-cli\": \"netlify/cli\", // npm\n \"supabase-cli\": \"supabase/cli\", // npm\n \"agent-browser\": \"vercel-labs/agent-browser\", // npm\n openspec: \"Fission-AI/OpenSpec\", // npm (v26.75.0)\n \"bmad-method\": \"bmad-code-org/BMAD-METHOD\", // npx-run (v26.75.0)\n \"railway-mcp-server\": \"railwayapp/railway-mcp-server\", // internal — 트랙 표 MCP 행(#709)\n};\n\n/** \"https://github.com/owner/repo\" 또는 \"owner/repo[/...]\" → \"owner/repo\". 실패 시 null. */\nexport function normalizeRepo(source: string): string | null {\n const stripped = source.replace(/^https?:\\/\\/github\\.com\\//i, \"\");\n const m = stripped.match(/^([^/\\s]+\\/[^/\\s]+)/);\n return m?.[1] ?? null;\n}\n\n/** 자산의 GitHub owner/repo 도출. override 우선 → skill/plugin method. 도출 불가 시 null. */\nexport function repoForAsset(asset: ExternalAsset): string | null {\n const override = REPO_OVERRIDE[asset.id];\n if (override) return override;\n const m = asset.method;\n if (m.kind === \"skill\") return normalizeRepo(m.source);\n if (m.kind === \"plugin\") return normalizeRepo(m.marketplace);\n return null;\n}\n\nexport interface DriftTarget {\n id: string;\n tier: StarTier;\n repo: string;\n}\n\n/** star 기반(vetted/experimental) 자산만 + repo 도출 가능한 것만 검사 대상. */\nexport function driftTargets(\n assets: ReadonlyArray<ExternalAsset> = EXTERNAL_ASSETS,\n): DriftTarget[] {\n const out: DriftTarget[] = [];\n for (const a of assets) {\n const tier = TRUST_TIER[a.id];\n if (tier !== \"vetted\" && tier !== \"experimental\") continue;\n const repo = repoForAsset(a);\n if (!repo) continue; // 도출 불가 — 테스트가 0건을 강제하므로 정상 경로에선 발생 안 함\n out.push({ id: a.id, tier, repo });\n }\n return out;\n}\n\n/** 정적 tier 가 실제 star 와 어긋났는지 판정. */\nexport function classifyDrift(tier: StarTier, stars: number): DriftVerdict {\n if (tier === \"vetted\" && stars < STAR_THRESHOLD) return \"demote\";\n if (tier === \"experimental\" && stars >= STAR_THRESHOLD) return \"promote\";\n return \"ok\";\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AA6CO,IAAM,iBAAiB;AAS9B,IAAM,gBAAwC;AAAA,EAC5C,cAAc;AAAA;AAAA,EACd,eAAe;AAAA;AAAA,EACf,gBAAgB;AAAA;AAAA,EAChB,iBAAiB;AAAA;AAAA,EACjB,UAAU;AAAA;AAAA,EACV,eAAe;AAAA;AAAA,EACf,sBAAsB;AAAA;AACxB;AAGO,SAAS,cAAc,QAA+B;AAC3D,QAAM,WAAW,OAAO,QAAQ,8BAA8B,EAAE;AAChE,QAAM,IAAI,SAAS,MAAM,qBAAqB;AAC9C,SAAO,IAAI,CAAC,KAAK;AACnB;AAGO,SAAS,aAAa,OAAqC;AAChE,QAAM,WAAW,cAAc,MAAM,EAAE;AACvC,MAAI,SAAU,QAAO;AACrB,QAAM,IAAI,MAAM;AAChB,MAAI,EAAE,SAAS,QAAS,QAAO,cAAc,EAAE,MAAM;AACrD,MAAI,EAAE,SAAS,SAAU,QAAO,cAAc,EAAE,WAAW;AAC3D,SAAO;AACT;AASO,SAAS,aACd,SAAuC,iBACxB;AACf,QAAM,MAAqB,CAAC;AAC5B,aAAW,KAAK,QAAQ;AACtB,UAAM,OAAO,WAAW,EAAE,EAAE;AAC5B,QAAI,SAAS,YAAY,SAAS,eAAgB;AAClD,UAAM,OAAO,aAAa,CAAC;AAC3B,QAAI,CAAC,KAAM;AACX,QAAI,KAAK,EAAE,IAAI,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,EACnC;AACA,SAAO;AACT;AAGO,SAAS,cAAc,MAAgB,OAA6B;AACzE,MAAI,SAAS,YAAY,QAAQ,eAAgB,QAAO;AACxD,MAAI,SAAS,kBAAkB,SAAS,eAAgB,QAAO;AAC/D,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/trust-tier-drift.ts"],"sourcesContent":["/**\n * A1 — Trust Tier star-drift 검출 데이터 + 순수 로직.\n *\n * TRUST_TIER 의 star 기반 라벨(vetted ≥ 1000★ / experimental < 1000★)이 실제 GitHub\n * star 와 어긋났는지(drift) 판정한다. `official` 은 star 무관(Anthropic 공식·하네스 자체)\n * 이라 검사 제외.\n *\n * repo 출처 = 각 자산 method (in-code authoritative — 주석이 아니라 실제 설치 source):\n * skill → method.source (\"owner/repo\" 또는 github URL)\n * plugin → method.marketplace (\"owner/repo\")\n * npm → NPM_REPO_OVERRIDE[id] (pkg 는 npm 명이므로 GitHub repo 를 별도 명시)\n *\n * fetch/네트워크는 본 모듈에 없음 — 순수 로직만(테스트 가능). 실 fetch 는\n * `scripts/trust-tier-drift.mjs` 가 담당.\n */\nimport { EXTERNAL_ASSETS, type ExternalAsset, TRUST_TIER } from \"./external-assets.js\";\n\n// v26.79.0 — gen-compatibility 의 카테고리 exhaustiveness 가드용 SSOT (하드코딩 drift 차단).\nexport { CATEGORIES } from \"./categories.js\";\n// v26.116.0 (ADR-043) — context-cost-report.mjs 가 dist 에서 비용 계측기를 읽도록 re-export.\n// v26.140.0 — formatResidentCostBlock: 리포트가 표를 직접 조립하지 않도록 표시 계약도 함께 노출.\nexport {\n assetCostRows,\n estimateTokens,\n formatResidentCostBlock,\n residentCost,\n resolveBundleRoot,\n} from \"./context-cost.js\";\n// v26.76.0 — gen-compatibility.mjs 가 dist 에서 자산 카탈로그+tier 를 읽도록 re-export.\n// v26.93.0 — DEV_METHOD_SKILL_IDS 추가: gen-compatibility 의 CLI scope override 를\n// 하드코딩 id 목록 대신 SSOT 에서 derive (no-false-ship drift 구조 차단).\n// v26.95.0 — INTERNAL_BUNDLED_SKILL_IDS (dev-method + opt-in gemini-consult) 로 CLI scope derive.\nexport {\n // v26.102.0 (ADR-031) — gen-compatibility 의 CLI 열이 도달 범위를 derive 하도록 re-export.\n assetCliSupport,\n DEV_METHOD_SKILL_IDS,\n EXTERNAL_ASSETS,\n INTERNAL_BUNDLED_SKILL_IDS,\n TRUST_TIER,\n} from \"./external-assets.js\";\nexport { buildAssetSpec, buildManifest } from \"./manifest.js\";\n// v26.102.0 (ADR-031) — 도달 라벨(\"N-CLI\")의 N 을 derive 하기 위한 re-export (매직 넘버 금지).\nexport { CLI_BASES, DEFAULT_OPTIONS, TRACKS } from \"./types.js\";\n\n/** vetted 경계 (NORTH_STAR / PRD v26-71 D2). */\nexport const STAR_THRESHOLD = 1000;\n\nexport type StarTier = \"vetted\" | \"experimental\";\nexport type DriftVerdict = \"ok\" | \"promote\" | \"demote\";\n\n/**\n * method 가 GitHub repo 를 안 담는 자산(npm.pkg / npx-run.cmd 는 npm 명) → 트러스트 근거가\n * 된 GitHub repo 를 명시 매핑. override 가 method 도출보다 우선.\n */\nconst REPO_OVERRIDE: Record<string, string> = {\n \"vercel-cli\": \"vercel/vercel\", // npm\n \"netlify-cli\": \"netlify/cli\", // npm\n \"supabase-cli\": \"supabase/cli\", // npm\n \"agent-browser\": \"vercel-labs/agent-browser\", // npm\n openspec: \"Fission-AI/OpenSpec\", // npm (v26.75.0)\n \"bmad-method\": \"bmad-code-org/BMAD-METHOD\", // npx-run (v26.75.0)\n // internal — 트랙 표 MCP 행(#709 · #722). 원격 서버에 공개 저장소가 따로 없으면 같은 벤더의 공개 저장소를 감시한다(ADR-106)\n \"railway-mcp-server\": \"railwayapp/cli\",\n \"chrome-devtools\": \"ChromeDevTools/chrome-devtools-mcp\",\n \"github-mcp\": \"github/github-mcp-server\",\n vercel: \"vercel/vercel\",\n};\n\n/** \"https://github.com/owner/repo\" 또는 \"owner/repo[/...]\" → \"owner/repo\". 실패 시 null. */\nexport function normalizeRepo(source: string): string | null {\n const stripped = source.replace(/^https?:\\/\\/github\\.com\\//i, \"\");\n const m = stripped.match(/^([^/\\s]+\\/[^/\\s]+)/);\n return m?.[1] ?? null;\n}\n\n/** 자산의 GitHub owner/repo 도출. override 우선 → skill/plugin method. 도출 불가 시 null. */\nexport function repoForAsset(asset: ExternalAsset): string | null {\n const override = REPO_OVERRIDE[asset.id];\n if (override) return override;\n const m = asset.method;\n if (m.kind === \"skill\") return normalizeRepo(m.source);\n if (m.kind === \"plugin\") return normalizeRepo(m.marketplace);\n return null;\n}\n\nexport interface DriftTarget {\n id: string;\n tier: StarTier;\n repo: string;\n}\n\n/** star 기반(vetted/experimental) 자산만 + repo 도출 가능한 것만 검사 대상. */\nexport function driftTargets(\n assets: ReadonlyArray<ExternalAsset> = EXTERNAL_ASSETS,\n): DriftTarget[] {\n const out: DriftTarget[] = [];\n for (const a of assets) {\n const tier = TRUST_TIER[a.id];\n if (tier !== \"vetted\" && tier !== \"experimental\") continue;\n const repo = repoForAsset(a);\n if (!repo) continue; // 도출 불가 — 테스트가 0건을 강제하므로 정상 경로에선 발생 안 함\n out.push({ id: a.id, tier, repo });\n }\n return out;\n}\n\n/** 정적 tier 가 실제 star 와 어긋났는지 판정. */\nexport function classifyDrift(tier: StarTier, stars: number): DriftVerdict {\n if (tier === \"vetted\" && stars < STAR_THRESHOLD) return \"demote\";\n if (tier === \"experimental\" && stars >= STAR_THRESHOLD) return \"promote\";\n return \"ok\";\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AA6CO,IAAM,iBAAiB;AAS9B,IAAM,gBAAwC;AAAA,EAC5C,cAAc;AAAA;AAAA,EACd,eAAe;AAAA;AAAA,EACf,gBAAgB;AAAA;AAAA,EAChB,iBAAiB;AAAA;AAAA,EACjB,UAAU;AAAA;AAAA,EACV,eAAe;AAAA;AAAA;AAAA,EAEf,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,QAAQ;AACV;AAGO,SAAS,cAAc,QAA+B;AAC3D,QAAM,WAAW,OAAO,QAAQ,8BAA8B,EAAE;AAChE,QAAM,IAAI,SAAS,MAAM,qBAAqB;AAC9C,SAAO,IAAI,CAAC,KAAK;AACnB;AAGO,SAAS,aAAa,OAAqC;AAChE,QAAM,WAAW,cAAc,MAAM,EAAE;AACvC,MAAI,SAAU,QAAO;AACrB,QAAM,IAAI,MAAM;AAChB,MAAI,EAAE,SAAS,QAAS,QAAO,cAAc,EAAE,MAAM;AACrD,MAAI,EAAE,SAAS,SAAU,QAAO,cAAc,EAAE,WAAW;AAC3D,SAAO;AACT;AASO,SAAS,aACd,SAAuC,iBACxB;AACf,QAAM,MAAqB,CAAC;AAC5B,aAAW,KAAK,QAAQ;AACtB,UAAM,OAAO,WAAW,EAAE,EAAE;AAC5B,QAAI,SAAS,YAAY,SAAS,eAAgB;AAClD,UAAM,OAAO,aAAa,CAAC;AAC3B,QAAI,CAAC,KAAM;AACX,QAAI,KAAK,EAAE,IAAI,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,EACnC;AACA,SAAO;AACT;AAGO,SAAS,cAAc,MAAgB,OAA6B;AACzE,MAAI,SAAS,YAAY,QAAQ,eAAgB,QAAO;AACxD,MAAI,SAAS,kBAAkB,SAAS,eAAgB,QAAO;AAC/D,SAAO;AACT;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uzysjung/agent-harness",
3
- "version": "26.165.0",
3
+ "version": "26.167.0",
4
4
  "description": "Curate vetted AI-coding skills & plugins by your tech stack — install only what you need, across Claude Code, Codex, OpenCode & Antigravity",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -58,6 +58,3 @@ timeout = 10
58
58
  # MCP Servers — 설치기가 이 아래에 이 프로젝트 트랙의 서버를 붙인다
59
59
  # 원천 = templates/mcp.json + templates/track-mcp-map.tsv (Claude .mcp.json 과 같다, #568)
60
60
  # ============================================================
61
- # github MCP 에 토큰을 줄 때 (필요 시 활성화):
62
- # [mcp_servers.github]
63
- # env = { GITHUB_PERSONAL_ACCESS_TOKEN = "{GITHUB_TOKEN}" }
@@ -1,4 +1,4 @@
1
- # ci.yml — CI scaffold installed by @uzysjung/agent-harness (`--with ci-scaffold`).
1
+ # ci.yml — CI scaffold installed by @uzysjung/agent-harness (`ci-scaffold`, default on development tracks — skip it with `--without ci-scaffold`).
2
2
  # Fill-in template: replace the FILL markers with your project's commands, then commit.
3
3
  # Re-installs never overwrite this file once it exists — it is yours after install.
4
4
  #
@@ -1,4 +1,4 @@
1
- # ci-python.yml — CI scaffold installed by @uzysjung/agent-harness (`--with ci-scaffold`).
1
+ # ci-python.yml — CI scaffold installed by @uzysjung/agent-harness (`ci-scaffold`, default on development tracks — skip it with `--without ci-scaffold`).
2
2
  # Fill-in template: replace the FILL markers with your project's commands, then commit.
3
3
  # Re-installs never overwrite this file once it exists — it is yours after install.
4
4
  #
@@ -1,4 +1,4 @@
1
- # e2e.yml — Playwright E2E scaffold installed by @uzysjung/agent-harness (`--with ci-scaffold`).
1
+ # e2e.yml — Playwright E2E scaffold installed by @uzysjung/agent-harness (`ci-scaffold`, default on development tracks — skip it with `--without ci-scaffold`).
2
2
  # Fill-in template: replace the FILL markers with your project's setup, then commit.
3
3
  # Re-installs never overwrite this file once it exists — it is yours after install.
4
4
  #
@@ -1,20 +1,10 @@
1
1
  {
2
- "_comment": "프로젝트 .mcp.json 템플릿. setup-harness.sh가 Track별로 조건부 항목을 동적 추가한다. 글로벌 ~/.claude/는 절대 건드리지 않음.",
2
+ "_comment": "프로젝트 .mcp.json 의 모든 트랙 기본 서버. 트랙별 · 고를 수 있는 서버는 track-mcp-map.tsv 가 더한다. 글로벌 ~/.claude/는 절대 건드리지 않음.",
3
3
  "mcpServers": {
4
4
  "context7": {
5
5
  "type": "stdio",
6
6
  "command": "npx",
7
7
  "args": ["-y", "@upstash/context7-mcp@latest"]
8
- },
9
- "github": {
10
- "type": "stdio",
11
- "command": "npx",
12
- "args": ["-y", "@modelcontextprotocol/server-github"]
13
- },
14
- "chrome-devtools": {
15
- "type": "stdio",
16
- "command": "npx",
17
- "args": ["-y", "chrome-devtools-mcp@latest"]
18
8
  }
19
9
  }
20
10
  }
@@ -0,0 +1,13 @@
1
+ ---
2
+ paths:
3
+ - "**/*.tsx"
4
+ - "**/*.jsx"
5
+ ---
6
+
7
+ # UI Components
8
+
9
+ React · Next.js 프로젝트의 UI 는 shadcn/ui 컴포넌트로 만들고, 공식 린터 `@shadcn/lint`(shadcn-ui/lint — ESLint·Oxlint 플러그인)로 검사한다. shadcn CLI 에는 `lint` 명령이 없다.
10
+
11
+ - **전제**: shadcn/ui 는 Tailwind 가, `@shadcn/lint` 는 Tailwind v4 와 ESLint 9.30+ 또는 Oxlint 1.80+ 가 필요하다. 프로젝트가 다른 컴포넌트 라이브러리·스타일 체계를 쓰거나 Tailwind v3 이면, 바꾸기 전에 사용자에게 묻는다 — 컴포넌트 소스·CSS 변수·의존성을 써 넣는 구조 변경이다.
12
+ - **없으면 첫 UI 작업 때 설치한다**: shadcn/ui 는 `npx shadcn@latest init`, 린터는 `https://github.com/shadcn-ui/lint/blob/main/SETUP.md` 를 읽고 그 절차대로 등록한다. 그 절차는 규칙을 하나도 켜지 않는다 — 바뀐 파일을 알리고, README 의 Rules 표에서 시작할 규칙을 제안해 사용자 확인을 받아 켠다. 켜기 전의 lint 는 설정이 로드되는지만 확인한다.
13
+ - **UI 를 바꾼 뒤** 프로젝트의 lint 명령(`npm run lint` 등)을 돌려 오류를 고친다. 오류 문구가 그 프로젝트의 컴포넌트·variant·테마에 맞는 대안을 알려 준다.
@@ -60,7 +60,7 @@ description: >-
60
60
  **`WRITE`/`UPDATE` 실행 전에 영향받는 이슈 번호와 바뀔 내용을 목록으로 보여주고 진행한다.**
61
61
  단계·모드와 무관한 상시 요구다. 재조정은 본질적으로 다건 일괄 변경이라(§8) 여기가 가장 중요하다.
62
62
 
63
- MCP `mcp__github__*` 를 쓸 수 있으면 셸 `gh` 보다 우선한다 — 같은 승인 규칙이 그대로 적용된다.
63
+ GitHub 작업은 셸 `gh` 로 한다. GitHub MCP 서버를 붙여 두었으면 그 도구를 써도 된다 — 어느 쪽이든 같은 승인 규칙이 그대로 적용된다.
64
64
 
65
65
  ## 중간 요청 접수 — 멈추지 않고 받는다
66
66
 
@@ -2,15 +2,20 @@
2
2
  # v26.12.0 — setup-harness.sh의 .mcp.json 조립 case문 외재화
3
3
  #
4
4
  # 형식 (탭 구분):
5
- # <mcp_name> <track_pattern> <command> <args_json>
5
+ # <mcp_name> <track_pattern> <command|url> <args_json|remote_json>
6
6
  #
7
7
  # - mcp_name: .mcp.json의 mcpServers[키]
8
8
  # - track_pattern: any_track 패턴 (csr-*|full 같은 bash glob). 패턴은 **기본** 트랙이다 — 같은 이름의
9
- # 카탈로그 `internal` 자산이 있으면 그 서버는 어느 트랙에서든 `--with <id>`/위저드로 고를 수 있다(#709)
10
- # - command: 실행 명령 (npx 등)
11
- # - args_json: jq 인자 배열 (JSON 형식)
9
+ # 카탈로그 `internal` 자산이 있으면 그 서버는 어느 트랙에서든 `--with <id>`/위저드로 고를 수 있다(#709).
10
+ # `-` = 어느 트랙에서도 기본이 아니다 — 같은 이름의 카탈로그 internal 자산으로만 고른다(#722 · ADR-106)
11
+ # - command: 실행 명령 (npx 등). 리터럴 `url` 이면 원격(Streamable HTTP) 행이다
12
+ # - args_json: jq 인자 배열 (JSON 형식). 원격 행은 {"url":"https://…","bearerEnv":"ENV_NAME"?} —
13
+ # bearerEnv 는 Authorization: Bearer 를 그 환경변수에서 읽게 한다. 값은 어느 파일에도 쓰지 않는다
12
14
  #
13
15
  # 신규 MCP 추가 시: 이 파일에 1줄 추가만 하면 setup-harness.sh 수정 불필요.
14
16
  # 주석 (#) 라인은 무시.
15
- railway-mcp-server csr-supabase|csr-fastify|csr-fastapi|ssr-htmx|full npx ["-y", "@railway/mcp-server"]
17
+ railway-mcp-server csr-supabase|csr-fastify|csr-fastapi|ssr-htmx|full url {"url":"https://mcp.railway.com"}
16
18
  supabase csr-supabase|full npx ["-y", "@supabase/mcp-server"]
19
+ chrome-devtools csr-*|ssr-*|full npx ["-y", "chrome-devtools-mcp@latest", "--no-usage-statistics"]
20
+ vercel - url {"url":"https://mcp.vercel.com"}
21
+ github-mcp - url {"url":"https://api.githubcopilot.com/mcp/","bearerEnv":"GITHUB_PAT"}