@uzysjung/agent-harness 26.168.0 → 26.170.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-V4UY222W.js";
20
+ } from "./chunk-MGFWOWF4.js";
21
21
 
22
22
  // src/trust-tier-drift.ts
23
23
  init_esm_shims();
@@ -39,7 +39,10 @@ var REPO_OVERRIDE = {
39
39
  "railway-mcp-server": "railwayapp/cli",
40
40
  "chrome-devtools": "ChromeDevTools/chrome-devtools-mcp",
41
41
  "github-mcp": "github/github-mcp-server",
42
- vercel: "vercel/vercel"
42
+ vercel: "vercel/vercel",
43
+ // #751 — 남은 기본 서버 둘
44
+ context7: "upstash/context7",
45
+ supabase: "supabase/mcp"
43
46
  };
44
47
  function normalizeRepo(source) {
45
48
  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 // 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":[]}
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 // #751 — 남은 기본 서버 둘\n context7: \"upstash/context7\",\n supabase: \"supabase/mcp\",\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;AAAA;AAAA,EAER,UAAU;AAAA,EACV,UAAU;AACZ;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.168.0",
3
+ "version": "26.170.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": {
@@ -22,6 +22,7 @@
22
22
  "build": "tsup",
23
23
  "dev": "tsup --watch",
24
24
  "gen:compat": "npm run build && node scripts/gen-compatibility.mjs",
25
+ "gen:legacy-fingerprints": "node scripts/gen-legacy-fingerprints.mjs",
25
26
  "test": "vitest run",
26
27
  "test:watch": "vitest",
27
28
  "test:coverage": "vitest run --coverage",
@@ -33,6 +33,13 @@ Treat methods as replaceable. Improve or replace them when new evidence,
33
33
  capabilities, or circumstances offer a better path to the same required outcomes
34
34
  and protections.
35
35
 
36
+ For multi-part work, derive user or operational outcomes from the current request and
37
+ applicable plans, designs, or agreed briefs. Divide them into coherent units described
38
+ well enough to start and verify without re-deriving the plan; sequence by dependencies
39
+ and agreed priorities. Where authorized, preserve material decisions and acceptance
40
+ evidence in existing project records, and judge completion by evidenced required results
41
+ and protections rather than closed units.
42
+
36
43
  ## 3. Keep changes focused and coherent
37
44
 
38
45
  Let scope follow what the requested outcome genuinely needs, including necessary
@@ -26,6 +26,9 @@ origin: self-authored
26
26
  파일을 지정해 바로 실행하라(`npx vitest run tests/<관련>.test.ts`, `pytest tests/test_<관련>.py`).
27
27
  실패를 편집에서 멀리 떼어놓을수록 원인을 좁히는 비용이 커진다.
28
28
  - **범위 안에 머문다.** 인접 코드를 "개선"하지 않는다. 손대야만 하는 것만 손댄다.
29
+ - **경우를 덧대기 전에 구조를 본다.** 리뷰 지적이나 새로 드러난 경우를 막을 때, 분기 · 가드 · 복구 단계를 하나 더
30
+ 얹기 전에 그 경우들이 아예 생기지 않는 더 단순한 구조로 바꿀 수 있는지 먼저 본다. 같은 보호를 더 적은 코드로
31
+ 주는 쪽을 고르고, 브리프가 정한 방식보다 그쪽이 낫다면 한 문장으로 말한다.
29
32
  - **읽고 나서 쓴다.** 바꿀 심볼의 호출부와 export 를 먼저 본다.
30
33
  - 기존 코드의 관용구·명명·주석 밀도를 따른다. 취향보다 일관성이 우선이다.
31
34
 
@@ -43,6 +43,7 @@ git log --oneline -10
43
43
  #### Architecture (아키텍처)
44
44
  - 단일 책임 원칙을 따르는가?
45
45
  - 불필요한 추상화가 없는가?
46
+ - 경우마다 분기 · 가드 · 복구를 덧댄 곳이 있다면, 그 경우들이 아예 생기지 않는 더 단순한 구조가 있는가?
46
47
  - 기존 패턴/컨벤션과 일치하는가?
47
48
  - 의존성 방향이 올바른가?
48
49
  - SPEC/PRD 범위 안에 있는가?
@@ -93,7 +94,7 @@ git log --oneline -10
93
94
  [CRITICAL] Title
94
95
  File: path/to/file.ts:42
95
96
  Issue: 설명
96
- Fix: 코드 예시 포함한 해결 방안
97
+ Fix: 해결 방향
97
98
 
98
99
  [HIGH] Title
99
100
  File: path/to/file.ts:78
@@ -121,7 +122,6 @@ Fix: 해결 방안
121
122
 
122
123
  ## Anti-Patterns (하지 말 것)
123
124
 
124
- - 구현 제안하지 않는다 — 이슈만 식별하고, 수정은 구현 에이전트가 한다.
125
+ - 코드를 쓰지 않는다 — Fix 는 방향만 적고, 수정은 구현 에이전트가 한다.
125
126
  - "전반적으로 잘 되었습니다" 같은 빈말 금지 — 구체적 관찰만.
126
127
  - LGTM을 쉽게 내리지 않는다 — 기준을 통과해야만 승인.
127
- - 변경되지 않은 코드를 리뷰하지 않는다 (CRITICAL 보안 제외).
@@ -1,10 +1,4 @@
1
1
  {
2
- "_comment": "프로젝트 .mcp.json 의 모든 트랙 기본 서버. 트랙별 · 고를 수 있는 서버는 track-mcp-map.tsv 가 더한다. 글로벌 ~/.claude/는 절대 건드리지 않음.",
3
- "mcpServers": {
4
- "context7": {
5
- "type": "stdio",
6
- "command": "npx",
7
- "args": ["-y", "@upstash/context7-mcp@latest"]
8
- }
9
- }
2
+ "_comment": "프로젝트 .mcp.json 의 바탕. 하네스 서버는 전부 track-mcp-map.tsv 한 곳이 정한다(모든 트랙 기본 = 패턴 `*`, #751) — 그래야 위저드 · --without <id> 로 고르고 뺄 수 있다. 글로벌 ~/.claude/는 절대 건드리지 않음.",
3
+ "mcpServers": {}
10
4
  }
@@ -7,6 +7,7 @@
7
7
  # - mcp_name: .mcp.json의 mcpServers[키]
8
8
  # - track_pattern: any_track 패턴 (csr-*|full 같은 bash glob). 패턴은 **기본** 트랙이다 — 같은 이름의
9
9
  # 카탈로그 `internal` 자산이 있으면 그 서버는 어느 트랙에서든 `--with <id>`/위저드로 고를 수 있다(#709).
10
+ # `*` = 모든 트랙의 기본이다(#751 — context7. 위저드 3단계에 체크된 채 보이고 `--without <id>` 로 뺀다).
10
11
  # `-` = 어느 트랙에서도 기본이 아니다 — 같은 이름의 카탈로그 internal 자산으로만 고른다(#722 · ADR-106)
11
12
  # - command: 실행 명령 (npx 등). 리터럴 `url` 이면 원격(Streamable HTTP) 행이다
12
13
  # - args_json: jq 인자 배열 (JSON 형식). 원격 행은 {"url":"https://…","bearerEnv":"ENV_NAME"?} —
@@ -14,8 +15,9 @@
14
15
  #
15
16
  # 신규 MCP 추가 시: 이 파일에 1줄 추가만 하면 setup-harness.sh 수정 불필요.
16
17
  # 주석 (#) 라인은 무시.
18
+ context7 * npx ["-y", "@upstash/context7-mcp@latest"]
17
19
  railway-mcp-server csr-supabase|csr-fastify|csr-fastapi|ssr-htmx|full url {"url":"https://mcp.railway.com"}
18
- supabase csr-supabase|full npx ["-y", "@supabase/mcp-server"]
20
+ supabase csr-supabase|full url {"url":"https://mcp.supabase.com/mcp"}
19
21
  chrome-devtools csr-*|ssr-*|full npx ["-y", "chrome-devtools-mcp@latest", "--no-usage-statistics"]
20
22
  vercel - url {"url":"https://mcp.vercel.com"}
21
23
  github-mcp - url {"url":"https://api.githubcopilot.com/mcp/","bearerEnv":"GITHUB_PAT"}