@uzysjung/agent-harness 26.150.0 → 26.152.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.
Files changed (69) hide show
  1. package/README.ko.md +2 -2
  2. package/README.md +2 -2
  3. package/dist/{chunk-NKBUDHPC.js → chunk-EQDC2AAU.js} +125 -69
  4. package/dist/chunk-EQDC2AAU.js.map +1 -0
  5. package/dist/index.js +269 -284
  6. package/dist/index.js.map +1 -1
  7. package/dist/trust-tier-drift.js +1 -1
  8. package/package.json +1 -1
  9. package/templates/CLAUDE.md +145 -164
  10. package/templates/agents/reviewer.md +4 -5
  11. package/templates/antigravity/AGENTS.md.template +3 -23
  12. package/templates/codex/AGENTS.md.template +5 -56
  13. package/templates/hooks/protect-files.sh +4 -0
  14. package/templates/opencode/AGENTS.md.template +4 -52
  15. package/templates/opencode/opencode.json.template +0 -8
  16. package/templates/rules/change-management.md +2 -4
  17. package/templates/rules/cli-development.md +2 -4
  18. package/templates/rules/doc-governance.md +3 -1
  19. package/templates/rules/git-policy.md +1 -1
  20. package/templates/rules/ship-checklist.md +3 -3
  21. package/templates/rules/test-policy.md +3 -8
  22. package/templates/settings.json +1 -16
  23. package/templates/skills/audit-harness-fit/README.md +113 -0
  24. package/templates/skills/audit-harness-fit/SKILL.md +64 -433
  25. package/templates/skills/audit-harness-fit/evals/scenarios.yaml +222 -0
  26. package/templates/skills/audit-harness-fit/references/apply.md +66 -0
  27. package/templates/skills/audit-harness-fit/references/audit.md +160 -0
  28. package/templates/skills/audit-harness-fit/references/populate.md +74 -0
  29. package/templates/skills/audit-harness-fit/references/verification.md +123 -0
  30. package/templates/skills/audit-service-gaps/SKILL.md +0 -2
  31. package/templates/skills/compaction-handoff/SKILL.md +2 -2
  32. package/templates/skills/model-orchestration/SKILL.md +13 -24
  33. package/templates/skills/natural-korean/SKILL.md +45 -0
  34. package/templates/skills/north-star/references/roadmap-method.md +2 -2
  35. package/templates/skills/{task-brief → objective-brief}/SKILL.md +17 -16
  36. package/templates/skills/recurrence-prevention/SKILL.md +16 -16
  37. package/templates/track-mcp-map.tsv +1 -1
  38. package/dist/chunk-NKBUDHPC.js.map +0 -1
  39. package/templates/agents/build-error-resolver.md +0 -111
  40. package/templates/agents/code-reviewer.md +0 -237
  41. package/templates/agents/plan-checker.md +0 -116
  42. package/templates/agents/security-reviewer.md +0 -108
  43. package/templates/agents/silent-failure-hunter.md +0 -50
  44. package/templates/hooks/task-brief-nudge.sh +0 -57
  45. package/templates/skills/agent-introspection-debugging/SKILL.md +0 -153
  46. package/templates/skills/audit-harness-fit/references/official-criteria.md +0 -367
  47. package/templates/skills/continuous-learning-v2/SKILL.md +0 -361
  48. package/templates/skills/continuous-learning-v2/agents/observer-loop.sh +0 -362
  49. package/templates/skills/continuous-learning-v2/agents/observer.md +0 -189
  50. package/templates/skills/continuous-learning-v2/agents/session-guardian.sh +0 -150
  51. package/templates/skills/continuous-learning-v2/agents/start-observer.sh +0 -252
  52. package/templates/skills/continuous-learning-v2/config.json +0 -8
  53. package/templates/skills/continuous-learning-v2/hooks/observe.sh +0 -585
  54. package/templates/skills/continuous-learning-v2/scripts/detect-project.sh +0 -322
  55. package/templates/skills/continuous-learning-v2/scripts/instinct-cli.py +0 -1956
  56. package/templates/skills/continuous-learning-v2/scripts/lib/homunculus-dir.sh +0 -31
  57. package/templates/skills/continuous-learning-v2/scripts/migrate-homunculus.sh +0 -68
  58. package/templates/skills/continuous-learning-v2/scripts/test_parse_instinct.py +0 -1420
  59. package/templates/skills/deep-research/SKILL.md +0 -179
  60. package/templates/skills/deep-research/agents/openai.yaml +0 -7
  61. package/templates/skills/eval-harness/SKILL.md +0 -306
  62. package/templates/skills/eval-harness/agents/openai.yaml +0 -7
  63. package/templates/skills/humanize-korean/SKILL.md +0 -228
  64. package/templates/skills/spec-scaling/SKILL.md +0 -89
  65. package/templates/skills/strategic-compact/SKILL.md +0 -145
  66. package/templates/skills/strategic-compact/suggest-compact.sh +0 -54
  67. package/templates/skills/verification-loop/SKILL.md +0 -250
  68. package/templates/skills/verification-loop/agents/openai.yaml +0 -7
  69. package/templates/skills/verification-loop/references/tracks.md +0 -49
package/README.ko.md CHANGED
@@ -63,9 +63,9 @@ npx -y @uzysjung/agent-harness uninstall # 무엇을 뺄지 고른다
63
63
 
64
64
  ## 무엇을 얻는가
65
65
 
66
- - **스택 기반 큐레이션.** 검증된 옵션 중에서 이 프로젝트에 실제로 필요한 자산만 골라 설치한다. `csr-supabase` 를 고르면 세 묶음이 미리 체크된다 — 모든 track 이 받는 4종(`north-star`·`task-brief`·`gh-issue-workflow`·`audit-harness-fit`), 개발 track 이 받는 것들(`find-skills`·`agent-browser`·`frontend-design` + 방법론 스킬 6종), 그리고 이 스택이 필요로 하는 React·shadcn·Supabase·Postgres. 카탈로그의 나머지는 처음부터 끼어들지 않는다.
66
+ - **스택 기반 큐레이션.** 검증된 옵션 중에서 이 프로젝트에 실제로 필요한 자산만 골라 설치한다. `csr-supabase` 를 고르면 세 묶음이 미리 체크된다 — 모든 track 이 받는 4종(`north-star`·`objective-brief`·`gh-issue-workflow`·`audit-harness-fit`), 개발 track 이 받는 것들(`find-skills`·`agent-browser`·`frontend-design` + 방법론 스킬 5종), 그리고 이 스택이 필요로 하는 React·shadcn·Supabase·Postgres. 카탈로그의 나머지는 처음부터 끼어들지 않는다.
67
67
 
68
- - **규율 레이어.** 실제 프로덕션 프로젝트를 에이전트로 운영하며 추출한 룰·훅·방법론 스킬·CI 스캐폴드로 구성된다. 문서 거버넌스와 검증 게이트, 작업 브리프 정규화, 재발 방지 체계를 아우르며, 특히 스킬 14종은 마켓플레이스에 의존하지 않고 이 저장소에서 직접 쓰고 관리한다. 그중 12종은 id 로 지정할 수 있고(`--with`/`--without`), 그 12종 가운데 6종은 3단계 화면에서 한 줄로 묶여 함께 켜지고 꺼진다. 이 레이어 덕분에 단순한 skill 모음을 넘어선 하네스로 작동한다.
68
+ - **규율 레이어.** 실제 프로덕션 프로젝트를 에이전트로 운영하며 추출한 룰·훅·방법론 스킬·CI 스캐폴드로 구성된다. 문서 거버넌스와 검증 게이트, 작업 브리프 정규화, 재발 방지 체계를 아우르며, 특히 스킬 14종은 마켓플레이스에 의존하지 않고 이 저장소에서 직접 쓰고 관리한다. 그중 13종은 id 로 지정할 수 있고(`--with`/`--without`), 그 13종 가운데 5종은 3단계 화면에서 한 줄로 묶여 함께 켜지고 꺼진다. 이 레이어 덕분에 단순한 skill 모음을 넘어선 하네스로 작동한다.
69
69
 
70
70
  - **4개 CLI, 하나의 어휘.** 1급 지원 대상인 Claude Code 에는 모든 자산·훅·plugin 을 적용하고, Codex, OpenCode, Antigravity 에는 skill 과 rule 레이어를 적용한다. 프로젝트가 특정 CLI 에 묶이지 않는다.
71
71
 
package/README.md CHANGED
@@ -59,9 +59,9 @@ This tool starts from the stack instead. You pick a track, and it pre-checks the
59
59
 
60
60
  ## What you get
61
61
 
62
- - **Curation by tech stack.** Of the vetted options, you install only what this project calls for. Pick `csr-supabase` and step 3 pre-checks three groups: the four that every track gets (`north-star`, `task-brief`, `gh-issue-workflow`, `audit-harness-fit`), the dev-track set (`find-skills`, `agent-browser`, `frontend-design`, and the six method skills), and the ones this stack calls for — React, shadcn, Supabase, Postgres. Not the rest of the catalog.
62
+ - **Curation by tech stack.** Of the vetted options, you install only what this project calls for. Pick `csr-supabase` and step 3 pre-checks three groups: the four that every track gets (`north-star`, `objective-brief`, `gh-issue-workflow`, `audit-harness-fit`), the dev-track set (`find-skills`, `agent-browser`, `frontend-design`, and the five method skills), and the ones this stack calls for — React, shadcn, Supabase, Postgres. Not the rest of the catalog.
63
63
 
64
- - **A discipline layer.** Rules, hooks, method skills, and CI scaffolds distilled from running real production projects with agents: doc governance, verification gates, normalized task briefs, recurrence prevention. Fourteen of those skills are written and maintained in this repo rather than pulled from a marketplace — twelve of them selectable by id with `--with` / `--without`, six of which collapse into one row at step 3 — so the harness ships the method, not just a pointer to one. This layer is what makes it a harness rather than a skill pack.
64
+ - **A discipline layer.** Rules, hooks, method skills, and CI scaffolds distilled from running real production projects with agents: doc governance, verification gates, normalized task briefs, recurrence prevention. Fourteen of those skills are written and maintained in this repo rather than pulled from a marketplace — thirteen of them selectable by id with `--with` / `--without`, five of which collapse into one row at step 3 — so the harness ships the method, not just a pointer to one. This layer is what makes it a harness rather than a skill pack.
65
65
 
66
66
  - **Four CLIs, one vocabulary.** Claude Code is first class — all assets, hooks, and plugins. Codex, OpenCode, and Antigravity get the skills and rules layer. Your project is not locked to one CLI.
67
67
 
@@ -195,16 +195,6 @@ var EXTERNAL_ASSETS = [
195
195
  condition: { kind: "has-dev-track" },
196
196
  method: { kind: "internal", key: "audit-service-gaps" }
197
197
  },
198
- {
199
- id: "verification-loop",
200
- tier: "official",
201
- // uzys 자사 스킬 리포
202
- description: "Verification loop \u2014 run proportional verification tracks (UI \xB7 API \xB7 CLI \xB7 library \xB7 docs \xB7 real user flow) and end with evidence plus a fixed verdict; a green build is not proof of user-visible completion",
203
- category: "dev-tools",
204
- source: "uzys",
205
- condition: { kind: "has-dev-track" },
206
- method: { kind: "internal", key: "verification-loop" }
207
- },
208
198
  {
209
199
  id: "multi-persona-review",
210
200
  tier: "official",
@@ -240,7 +230,7 @@ var EXTERNAL_ASSETS = [
240
230
  id: "model-orchestration",
241
231
  tier: "official",
242
232
  // uzys 자사 스킬 리포
243
- description: "Model orchestration \u2014 decompose work by capability and route independent, bounded tasks to available agents while preserving ownership, permissions, and verification (opt-in \u2014 recommended)",
233
+ description: "Model orchestration \u2014 decompose work by capability and route independent, bounded tasks to available agents while preserving ownership, permissions, and verification. Model names are Claude Code vocabulary; on other CLIs the same split maps onto that vendor's tiers (opt-in \u2014 recommended)",
244
234
  category: "workflow",
245
235
  source: "uzys",
246
236
  condition: { kind: "opt-in" },
@@ -261,27 +251,31 @@ var EXTERNAL_ASSETS = [
261
251
  {
262
252
  // 복원 9종이 아니라 신설이다 — 이관 이력이 없다.
263
253
  // 전 트랙인 이유: 위임과 요청 정규화는 개발 트랙의 행위가 아니라 **전 트랙의 행위**다.
264
- // executive 트랙도 서브에이전트에 일을 넘기고, 그때 브리프가 없으면 완료 판정 기준 없이
265
- // 넘긴다. 짝인 `task-brief-nudge.sh` 훅이 `ALWAYS_HOOKS`(전 설치본)라 스킬만 좁게 깔면
266
- // 넛지가 없는 스킬을 가리킨다 훅과 스킬의 도달 범위는 같아야 한다.
267
- id: "task-brief",
254
+ // executive 트랙도 서브에이전트에 일을 넘기고, 그때 브리프가 없으면 완료 판정 기준 없이 넘긴다.
255
+ // ADR-088 (#426 F-04) — 전신 `task-brief` 개명. 문턱이 **위임 · 설계 · 다단계(피처/프로젝트
256
+ // 규모 이상)** 좁혀졌고, 요청마다 브리프를 권하던 프롬프트 넛지 훅과 상시 스킬
257
+ // 안내(`CONTINUOUS_SKILLS`)가 함께 빠졌다. 이름이 그 문턱을 들고 있다.
258
+ id: "objective-brief",
268
259
  tier: "official",
269
260
  // uzys 자사 스킬
270
- description: "Task brief \u2014 normalize an incoming request into the canonical brief (objective \xB7 inputs \xB7 invariants \xB7 success criteria \xB7 boundaries \xB7 autonomy \xB7 verification) and write every delegation prompt in that same shape",
261
+ description: "Objective brief \u2014 normalize a delegation, a design task, or multi-step work at feature scale into the canonical brief (objective \xB7 inputs \xB7 invariants \xB7 success criteria \xB7 boundaries \xB7 autonomy \xB7 verification) and write every delegation prompt in that same shape",
271
262
  category: "workflow",
272
263
  source: "uzys",
273
264
  condition: { kind: "any-track", tracks: [...TRACKS] },
274
- method: { kind: "internal", key: "task-brief" }
265
+ method: { kind: "internal", key: "objective-brief" }
275
266
  },
276
267
  {
277
- // task-brief 와 같은 신설이다 — 이관 이력이 없다.
268
+ // objective-brief 와 같은 신설이다 — 이관 이력이 없다.
278
269
  // 전 트랙인 이유: 이 하네스는 **모든 트랙에** 앵커·룰·훅을 깐다. 그 상주층이 밥값을 하는지
279
270
  // 되묻는 루프만 개발 트랙에 두면, 상주 비용은 전원이 무는데 감사는 일부만 갖는 비대칭이
280
271
  // 된다. 감사 대상이 개발 산출물이 아니라 **설치본 자신**이라 트랙 술어와 무관하다.
272
+ // ADR-084 (#425) — 2판. 판정 근거가 공식 체크리스트 인용에서 **확정된 의도 + 리포 실증**으로
273
+ // 바뀌었고, 모드 4개(audit · verification · apply · populate)를 SKILL.md 가 references 로
274
+ // 라우팅한다. 비-Claude CLI 도 디렉터리째 받는 것이 전제다(#431).
281
275
  id: "audit-harness-fit",
282
276
  tier: "official",
283
277
  // uzys 자사 스킬
284
- description: "Audit harness fit \u2014 audit whether the resident steering layer (anchor \xB7 rules \xB7 hooks \xB7 permissions \xB7 skill descriptors) still earns its context, judged by published criteria, block logs, and measurement; relocate procedures to skills, guarantees to hooks/permissions, derivable facts to code",
278
+ description: "Audit harness fit \u2014 audit or clean up agent instructions and skills: remove needless questions and rechecks, reconcile conflicting or changed guidance, retire low-value rules and skills, move decision history out of resident text, right-size user-journey verification; also fill or refresh AGENTS.md / CLAUDE.md project context from repository evidence",
285
279
  category: "workflow",
286
280
  source: "uzys",
287
281
  condition: { kind: "any-track", tracks: [...TRACKS] },
@@ -307,15 +301,18 @@ var EXTERNAL_ASSETS = [
307
301
  // 트랙과 무관한 글쓰기 규율이라 어느 트랙에서도 고를 수 있고, 어느 트랙에도 자동으로는
308
302
  // 안 깔린다(opt-in). 한국어로 쓰지 않는 사용자에게 기본 설치되면 그대로 낭비다.
309
303
  // clear-korean-communication 과의 경계: 저쪽은 **무엇을 어떤 형식으로 말할지**(설명·승인
310
- // 요청의 구조)이고, 이쪽은 **이미 글의 문체**를 진단해 최소 수정한다.
311
- id: "humanize-korean",
304
+ // 요청의 구조)이고, 이쪽은 **한국어로 쓰는 행위 자체**(답변·글쓰기·번역·퇴고)의 표현이다.
305
+ // #428 — 전신 `humanize-korean`(#355, 진단-우선 퇴고)을 개명·교체했다. 범위가 퇴고에서
306
+ // 쓰기·번역까지로 넓어져 이름이 뜻과 어긋났다. 옛 id 로 깐 설치본은 `update` 가 손대지
307
+ // 않고(설치된 디렉터리만 갱신) 그대로 남는다 — 새 판은 `--with natural-korean` 으로 받는다.
308
+ id: "natural-korean",
312
309
  tier: "official",
313
310
  // uzys 자사 스킬
314
- description: "Humanize Korean \u2014 diagnose what actually reads as translationese, AI clich\xE9, or mechanical structure in Korean prose, then fix only what the diagnosis justifies, preserving facts, numbers, terminology and register (opt-in). References epoko77-ai/im-not-ai",
311
+ description: "Natural Korean \u2014 write, answer, translate, and revise in Korean that reads as Korean: keep meaning and register, cut translationese, needless English, stock phrases, and mechanical repetition; fix only what is actually awkward (opt-in)",
315
312
  category: "workflow",
316
313
  source: "uzys",
317
314
  condition: { kind: "opt-in" },
318
- method: { kind: "internal", key: "humanize-korean" }
315
+ method: { kind: "internal", key: "natural-korean" }
319
316
  },
320
317
  // === Option-gated (v26.42.0 — opt-in, BREAKING vs prior has-dev-track auto-install) ===
321
318
  {
@@ -351,8 +348,8 @@ var EXTERNAL_ASSETS = [
351
348
  }
352
349
  },
353
350
  // v26.110.0 (ADR-039, 오피셜 플러그인 큐레이션) — feature-dev: 탐색→설계→구현 워크플로우 +
354
- // 전용 에이전트 3종(code-architect/code-explorer/code-reviewer). 방법론류 — ADR-032
355
- // "워크플로우 강제 구조는 기본 불필요" + 자체 code-reviewer 기본 리뷰 에이전트와 중복
351
+ // 전용 에이전트 3종(탐색·설계·리뷰). 방법론류 — ADR-032 "워크플로우 강제 구조는 기본
352
+ // 불필요" + 리뷰 에이전트가 Claude Code 기본 `/code-review` 중복(ADR-089)
356
353
  // → superpowers 와 동급 opt-in.
357
354
  {
358
355
  id: "feature-dev",
@@ -554,8 +551,8 @@ var EXTERNAL_ASSETS = [
554
551
  },
555
552
  // === dev tools (has_dev_track) ===
556
553
  // v26.110.0 (ADR-039) — code-review: /code-review 커맨드 1개 (다중 에이전트 confidence
557
- // 스코어링 PR 리뷰). 기본 리뷰 스택(reviewer·code-reviewer·security-reviewer)과 표면 중복
558
- // + 최신 Claude Code 네이티브 /code-review 와 충돌 소지 → opt-in.
554
+ // 스코어링 PR 리뷰). 기본 리뷰 레인(`reviewer`)과 표면 중복 + Claude Code 네이티브
555
+ // /code-review 와 충돌 소지 → opt-in. (ADR-089 로 우리 리뷰 에이전트 2종은 은퇴했다.)
559
556
  {
560
557
  id: "code-review",
561
558
  tier: "official",
@@ -572,7 +569,7 @@ var EXTERNAL_ASSETS = [
572
569
  },
573
570
  // v26.110.0 (ADR-039) — security-guidance: 매 편집 패턴 경고 + LLM diff 리뷰 (훅 12파일,
574
571
  // Python + Agent SDK 의존). 상시 훅 = 매 편집 비용 + 폭발 반경 — 실측 전 기본설치 금지
575
- // (Context Cost NSM) → opt-in. security-reviewer 에이전트·agentshield ship 게이트와 보완.
572
+ // (Context Cost NSM) → opt-in. Claude Code `/security-review`·agentshield ship 게이트와 보완.
576
573
  {
577
574
  id: "security-guidance",
578
575
  tier: "official",
@@ -1019,19 +1016,42 @@ var DEV_METHOD_SKILL_IDS = [
1019
1016
  "clear-korean-communication",
1020
1017
  "audit-service-gaps",
1021
1018
  "multi-persona-review",
1022
- "recurrence-prevention",
1023
- "verification-loop"
1019
+ "recurrence-prevention"
1024
1020
  ];
1025
1021
  var INTERNAL_BUNDLED_SKILL_IDS = [
1026
1022
  ...DEV_METHOD_SKILL_IDS,
1027
1023
  "north-star",
1028
1024
  "gh-issue-workflow",
1029
- "task-brief",
1025
+ "objective-brief",
1030
1026
  "audit-harness-fit",
1031
1027
  "model-orchestration",
1032
1028
  "external-model-consult",
1033
1029
  "self-hosted-github-runner",
1034
- "humanize-korean"
1030
+ "natural-korean"
1031
+ ];
1032
+ var CONTINUOUS_SKILLS = [
1033
+ {
1034
+ id: "clear-korean-communication",
1035
+ whenToApply: "applies to every answer, report, and approval request \u2014 a decision is presented as AS-IS \u2192 TO-BE from the position of whoever lives with the result; not only at the moment approval is asked for"
1036
+ },
1037
+ {
1038
+ id: "model-orchestration",
1039
+ whenToApply: "when work is delegated, it decides which lane takes the work and how that lane is run"
1040
+ }
1041
+ ];
1042
+ var RENAMED_SKILL_IDS = {
1043
+ "task-brief": "objective-brief",
1044
+ "humanize-korean": "natural-korean"
1045
+ };
1046
+ var RETIRED_SKILL_IDS = [
1047
+ "strategic-compact",
1048
+ "continuous-learning-v2",
1049
+ "spec-scaling",
1050
+ // ADR-090 (#452) — 관측 없는 자산 은퇴. 앞 세 종과 같은 경로로 안내한다.
1051
+ "verification-loop",
1052
+ "deep-research",
1053
+ "eval-harness",
1054
+ "agent-introspection-debugging"
1035
1055
  ];
1036
1056
  var TRUST_TIER = Object.fromEntries(
1037
1057
  EXTERNAL_ASSETS.map((a) => [a.id, a.tier])
@@ -1415,9 +1435,34 @@ var HARNESS_ANCHOR_FILE = "CLAUDE-uzys-harness.md";
1415
1435
  var HARNESS_IMPORT_LINE = `@${HARNESS_ANCHOR_FILE}`;
1416
1436
  var IMPORT_MARKER_START = "<!-- uzys-harness:import:start -->";
1417
1437
  var IMPORT_MARKER_END = "<!-- uzys-harness:import:end -->";
1418
- var IMPORT_BLOCK = `${IMPORT_MARKER_START}
1419
- ${HARNESS_IMPORT_LINE}
1438
+ function renderContinuousSkillsNote(selectedInternalSkills) {
1439
+ const lines = CONTINUOUS_SKILLS.filter((s) => selectedInternalSkills.includes(s.id)).map(
1440
+ (s) => `- \`${s.id}\` \u2014 ${s.whenToApply}.`
1441
+ );
1442
+ if (lines.length === 0) return "";
1443
+ return [
1444
+ "## Skills that apply continuously",
1445
+ "",
1446
+ "These installed skills apply to every response or delegation; no prompt ever looks like their job, so open them from this list:",
1447
+ "",
1448
+ ...lines
1449
+ ].join("\n");
1450
+ }
1451
+ function withContinuousSkillsNote(scaffold, selectedInternalSkills) {
1452
+ const note = renderContinuousSkillsNote(selectedInternalSkills);
1453
+ return note ? `${scaffold}
1454
+
1455
+ ${note}` : scaffold;
1456
+ }
1457
+ function importBlock(continuousSkills) {
1458
+ const note = renderContinuousSkillsNote(continuousSkills);
1459
+ const body = note ? `${HARNESS_IMPORT_LINE}
1460
+
1461
+ ${note}` : HARNESS_IMPORT_LINE;
1462
+ return `${IMPORT_MARKER_START}
1463
+ ${body}
1420
1464
  ${IMPORT_MARKER_END}`;
1465
+ }
1421
1466
  var TRACK_DISPLAY_NAMES = {
1422
1467
  tooling: "Tooling",
1423
1468
  "csr-supabase": "CSR Supabase",
@@ -1511,18 +1556,27 @@ ${renderFillScaffold()}
1511
1556
  `;
1512
1557
  }
1513
1558
  function upsertHarnessImport(existing, opts) {
1559
+ const block = importBlock(opts.continuousSkills ?? []);
1514
1560
  if (existing === null) {
1515
1561
  return `${mergeProjectClaude(opts)}
1516
- ${IMPORT_BLOCK}
1562
+ ${block}
1517
1563
  `;
1518
1564
  }
1565
+ const start = existing.indexOf(IMPORT_MARKER_START);
1566
+ if (start !== -1) {
1567
+ const endAt = existing.indexOf(IMPORT_MARKER_END, start);
1568
+ if (endAt === -1) return existing;
1569
+ const current = existing.slice(start, endAt + IMPORT_MARKER_END.length);
1570
+ if (current === block) return existing;
1571
+ return `${existing.slice(0, start)}${block}${existing.slice(endAt + IMPORT_MARKER_END.length)}`;
1572
+ }
1519
1573
  if (hasHarnessImport(existing)) {
1520
1574
  return existing;
1521
1575
  }
1522
1576
  const body = existing.endsWith("\n") ? existing : `${existing}
1523
1577
  `;
1524
1578
  return `${body}
1525
- ${IMPORT_BLOCK}
1579
+ ${block}
1526
1580
  `;
1527
1581
  }
1528
1582
  function stripHarnessImport(text) {
@@ -1606,24 +1660,29 @@ function resolveRules(spec) {
1606
1660
  return [...set].sort();
1607
1661
  }
1608
1662
  var ALL_RULES = resolveRules({ tracks: [...TRACKS] });
1609
- var CORE_AGENTS = ["reviewer", "data-analyst", "strategist"];
1610
- var CORE_AGENTS_ECC = ["code-reviewer", "security-reviewer"];
1611
- var DEV_AGENTS = ["plan-checker", "implementer"];
1612
- var DEV_AGENTS_ECC = ["silent-failure-hunter", "build-error-resolver"];
1613
- var ALWAYS_HOOKS = [
1614
- "session-start.sh",
1615
- "protect-files.sh",
1616
- // UserPromptSubmit 넛지. 차단하지 않는 유일한 판정은 결정적 조건뿐이고(길이 ·
1617
- // `<objective>` 표식 부재) 변환 자체는 `task-brief` 스킬 몫이다. `templates/settings.json`
1618
- // 배선과 (hook-wiring-parity 한쪽만 있는 상태를 문다).
1619
- "task-brief-nudge.sh"
1663
+ var CORE_AGENTS = ["reviewer"];
1664
+ var DEV_AGENTS = ["implementer"];
1665
+ var TRACK_AGENTS = [
1666
+ ["data-analyst", "data|full"],
1667
+ ["strategist", "executive|full"]
1668
+ ];
1669
+ var RETIRED_AGENTS = [
1670
+ { id: "code-reviewer", instead: "Claude Code \uC758 `/code-review` \uAC00 \uAC19\uC740 \uC77C\uC744 \uD55C\uB2E4" },
1671
+ { id: "security-reviewer", instead: "Claude Code \uC758 `/security-review` \uAC00 \uAC19\uC740 \uC77C\uC744 \uD55C\uB2E4" },
1672
+ // ADR-090 (#452) spawn 0 · 결함만 관측된 세 종. **대안을 종마다 적는다**: 한 문구로 뭉치면
1673
+ // 자기 에이전트와 상관없는 대안을 읽게 되고, 그건 "대신 쓸 것을 말한다"의 뜻을 잃는다.
1674
+ { id: "plan-checker", instead: "`reviewer` \uAC00 \uACC4\uD68D \uBB38\uC11C\uB3C4 \uAC19\uC740 \uACC4\uC57D\uC73C\uB85C \uAC80\uD1A0\uD55C\uB2E4" },
1675
+ { id: "silent-failure-hunter", instead: "Claude Code \uC758 `/code-review` \uAC00 \uAC19\uC740 \uC77C\uC744 \uD55C\uB2E4" },
1676
+ { id: "build-error-resolver", instead: "\uBAA8\uB378\uC774 \uAE30\uBCF8\uC73C\uB85C \uD558\uB294 \uC77C\uC774\uB77C \uB300\uCCB4 \uC790\uC0B0\uC774 \uC5C6\uB2E4" }
1620
1677
  ];
1678
+ var RETIRED_AGENT_IDS = RETIRED_AGENTS.map((a) => a.id);
1679
+ var ALWAYS_HOOKS = ["session-start.sh", "protect-files.sh"];
1621
1680
  var COMMON_SKILL_DIRS = [];
1622
- var COMMON_SKILL_DIRS_ECC = ["strategic-compact", "continuous-learning-v2"];
1623
- var MODIFIED_COMMON_SKILL_DIRS = ["deep-research"];
1681
+ var COMMON_SKILL_DIRS_ECC = [];
1682
+ var MODIFIED_COMMON_SKILL_DIRS = [];
1624
1683
  var DEV_SKILL_DIRS = [];
1625
- var DEV_SKILL_DIRS_ECC = ["agent-introspection-debugging"];
1626
- var MODIFIED_DEV_SKILL_DIRS = ["eval-harness"];
1684
+ var DEV_SKILL_DIRS_ECC = [];
1685
+ var MODIFIED_DEV_SKILL_DIRS = [];
1627
1686
  var MODIFIED_ECC_SKILL_DIRS = [...MODIFIED_COMMON_SKILL_DIRS, ...MODIFIED_DEV_SKILL_DIRS];
1628
1687
  var UI_SKILL_DIRS = ["ui-visual-review"];
1629
1688
  var UI_SKILL_DIRS_ECC = ["e2e-testing"];
@@ -1681,20 +1740,12 @@ function buildManifest(spec) {
1681
1740
  applies: dev
1682
1741
  });
1683
1742
  }
1684
- for (const a of CORE_AGENTS_ECC) {
1685
- m.push({
1686
- source: `agents/${a}.md`,
1687
- target: `.claude/agents/${a}.md`,
1688
- type: "file",
1689
- applies: (s) => !s.withEcc
1690
- });
1691
- }
1692
- for (const a of DEV_AGENTS_ECC) {
1743
+ for (const [a, pattern] of TRACK_AGENTS) {
1693
1744
  m.push({
1694
1745
  source: `agents/${a}.md`,
1695
1746
  target: `.claude/agents/${a}.md`,
1696
1747
  type: "file",
1697
- applies: (s) => !s.withEcc && hasDevTrack(s.tracks)
1748
+ applies: onTracks(pattern)
1698
1749
  });
1699
1750
  }
1700
1751
  for (const sd of COMMON_SKILL_DIRS) {
@@ -1721,12 +1772,6 @@ function buildManifest(spec) {
1721
1772
  applies: all
1722
1773
  });
1723
1774
  }
1724
- m.push({
1725
- source: "skills/spec-scaling",
1726
- target: ".claude/skills/spec-scaling",
1727
- type: "dir",
1728
- applies: all
1729
- });
1730
1775
  for (const sd of ["market-research", "investor-materials", "investor-outreach"]) {
1731
1776
  m.push({
1732
1777
  source: `skills/${sd}`,
@@ -1932,7 +1977,12 @@ function residentCost(entries, root = resolveBundleRoot()) {
1932
1977
  }
1933
1978
  }
1934
1979
  const harnessAnchor = fileTokens(join3(root, "templates", "CLAUDE.md"));
1935
- const projectScaffold = estimateTokens(renderFillScaffold().trim().length);
1980
+ const projectScaffold = estimateTokens(
1981
+ withContinuousSkillsNote(
1982
+ renderFillScaffold(),
1983
+ CONTINUOUS_SKILLS.map((s) => s.id)
1984
+ ).trim().length
1985
+ );
1936
1986
  const projectClaudeMd = harnessAnchor + projectScaffold;
1937
1987
  const claudeMdItems = (harnessAnchor > 0 ? 1 : 0) + (projectScaffold > 0 ? 1 : 0);
1938
1988
  return makeResidentCost({
@@ -2044,6 +2094,9 @@ export {
2044
2094
  EXTERNAL_ASSETS,
2045
2095
  DEV_METHOD_SKILL_IDS,
2046
2096
  INTERNAL_BUNDLED_SKILL_IDS,
2097
+ CONTINUOUS_SKILLS,
2098
+ RENAMED_SKILL_IDS,
2099
+ RETIRED_SKILL_IDS,
2047
2100
  TRUST_TIER,
2048
2101
  assetTrustTier,
2049
2102
  isAssetSelected,
@@ -2074,12 +2127,15 @@ export {
2074
2127
  legacyInstallLogPath,
2075
2128
  HARNESS_ANCHOR_FILE,
2076
2129
  HARNESS_IMPORT_LINE,
2130
+ withContinuousSkillsNote,
2077
2131
  renderFillScaffold,
2078
2132
  upsertHarnessImport,
2079
2133
  stripHarnessImport,
2080
2134
  buildAssetSpec,
2081
2135
  resolveRules,
2082
2136
  ALL_RULES,
2137
+ RETIRED_AGENTS,
2138
+ RETIRED_AGENT_IDS,
2083
2139
  isCliNeutralTarget,
2084
2140
  buildManifest,
2085
2141
  CATEGORIES,
@@ -2092,4 +2148,4 @@ export {
2092
2148
  formatResidentCostLine,
2093
2149
  formatResidentCostBlock
2094
2150
  };
2095
- //# sourceMappingURL=chunk-NKBUDHPC.js.map
2151
+ //# sourceMappingURL=chunk-EQDC2AAU.js.map