@uzysjung/agent-harness 26.140.0 → 26.141.1
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.ko.md +20 -18
- package/README.md +2 -2
- package/dist/{chunk-4XPSQ7XF.js → chunk-5RWSZT2J.js} +313 -344
- package/dist/chunk-5RWSZT2J.js.map +1 -0
- package/dist/index.js +178 -271
- package/dist/index.js.map +1 -1
- package/dist/trust-tier-drift.js +1 -1
- package/package.json +1 -1
- package/templates/CLAUDE.md +2 -2
- package/templates/agents/plan-checker.md +1 -2
- package/templates/antigravity/AGENTS.md.template +2 -2
- package/templates/codex/AGENTS.md.template +4 -6
- package/templates/codex/config.toml.template +1 -1
- package/templates/hooks/mcp-pre-exec.sh +18 -0
- package/templates/hooks/protect-files.sh +23 -0
- package/templates/hooks/session-start.sh +6 -21
- package/templates/hooks/task-brief-nudge.sh +57 -0
- package/templates/opencode/AGENTS.md.template +4 -6
- package/templates/rules/benchmark-parity.md +13 -74
- package/templates/rules/change-management.md +7 -26
- package/templates/rules/cli-development.md +11 -38
- package/templates/rules/doc-governance.md +22 -59
- package/templates/rules/git-policy.md +14 -48
- package/templates/rules/playwright-launch.md +5 -13
- package/templates/rules/ship-checklist.md +5 -14
- package/templates/rules/test-policy.md +15 -59
- package/templates/scripts/protect-branch.sh +108 -0
- package/templates/settings.json +10 -1
- package/templates/skills/audit-service-gaps/SKILL.md +247 -0
- package/templates/skills/audit-service-gaps/references/modes-and-evidence.md +61 -0
- package/templates/skills/audit-service-gaps/references/worked-example.md +40 -0
- package/templates/skills/clear-korean-communication/SKILL.md +256 -0
- package/templates/skills/clear-korean-communication/references/pre-send-checklist.md +37 -0
- package/templates/skills/clear-korean-communication/references/why-it-works.md +24 -0
- package/templates/skills/clear-korean-communication/references/worked-examples.md +89 -0
- package/templates/skills/external-model-consult/SKILL.md +291 -0
- package/templates/skills/external-model-consult/references/direct-calls.md +90 -0
- package/templates/skills/external-model-consult/references/prompt-templates.md +87 -0
- package/templates/skills/{codex-consult → external-model-consult}/scripts/codex-ask.sh +0 -0
- package/templates/skills/{gemini-consult → external-model-consult}/scripts/gemini-ask.sh +0 -0
- package/templates/skills/gh-issue-workflow/SKILL.md +50 -5
- package/templates/skills/model-orchestration/SKILL.md +52 -55
- package/templates/skills/multi-persona-review/SKILL.md +52 -61
- package/templates/skills/multi-persona-review/references/reviewer-design.md +55 -0
- package/templates/skills/multi-persona-review/references/worked-example.md +42 -0
- package/templates/skills/north-star/NORTH_STAR.template.md +10 -26
- package/templates/skills/north-star/SKILL.md +96 -25
- package/templates/skills/north-star/references/roadmap-method.md +86 -0
- package/templates/skills/recurrence-prevention/SKILL.md +54 -16
- package/templates/skills/recurrence-prevention/references/failure-analysis.md +64 -0
- package/templates/skills/task-brief/SKILL.md +218 -0
- package/templates/skills/verification-loop/SKILL.md +72 -3
- package/templates/skills/verification-loop/references/tracks.md +49 -0
- package/dist/chunk-4XPSQ7XF.js.map +0 -1
- package/templates/hooks/checkpoint-snapshot.sh +0 -94
- package/templates/hooks/karpathy-gate.sh +0 -59
- package/templates/hooks/spec-drift-check.sh +0 -126
- package/templates/rules/api-contract.md +0 -33
- package/templates/rules/code-style.md +0 -23
- package/templates/rules/data-analysis.md +0 -61
- package/templates/rules/database.md +0 -29
- package/templates/rules/design-workflow.md +0 -17
- package/templates/rules/error-handling.md +0 -23
- package/templates/rules/gates-taxonomy.md +0 -21
- package/templates/rules/htmx.md +0 -42
- package/templates/rules/nextjs.md +0 -35
- package/templates/rules/no-false-ship.md +0 -67
- package/templates/rules/pyside6.md +0 -59
- package/templates/rules/shadcn.md +0 -33
- package/templates/rules/tauri.md +0 -40
- package/templates/skills/asis-tobe-decision/SKILL.md +0 -161
- package/templates/skills/codex-consult/SKILL.md +0 -249
- package/templates/skills/explain-plainly/SKILL.md +0 -156
- package/templates/skills/gap-analysis-e2e/SKILL.md +0 -241
- package/templates/skills/gemini-consult/SKILL.md +0 -338
- package/templates/skills/harness-health-audit/SKILL.md +0 -509
- package/templates/skills/harness-health-audit/scripts/observation-digest.mjs +0 -212
- package/templates/skills/northstar-roadmap/SKILL.md +0 -177
- package/templates/skills/ultracode-service-audit/SKILL.md +0 -224
|
@@ -68,8 +68,7 @@ function resolveScope(scope) {
|
|
|
68
68
|
}
|
|
69
69
|
var DEFAULT_OPTIONS = {
|
|
70
70
|
withPrune: false,
|
|
71
|
-
withCodexTrust: false
|
|
72
|
-
withKarpathyHook: false
|
|
71
|
+
withCodexTrust: false
|
|
73
72
|
};
|
|
74
73
|
|
|
75
74
|
// src/external-assets.ts
|
|
@@ -102,60 +101,8 @@ var CSR_SSR_NEXTJS_FULL = [
|
|
|
102
101
|
"ssr-nextjs",
|
|
103
102
|
"full"
|
|
104
103
|
];
|
|
105
|
-
var RAILWAY_TRACKS = ["csr-fastify", "csr-fastapi", "ssr-htmx", "ssr-nextjs", "full"];
|
|
106
104
|
var EXTERNAL_ASSETS = [
|
|
107
105
|
// === data Track ===
|
|
108
|
-
{
|
|
109
|
-
id: "polars-K-Dense",
|
|
110
|
-
tier: "vetted",
|
|
111
|
-
// K-Dense-AI 26k
|
|
112
|
-
description: "Polars \u2014 fast Rust-based DataFrame (pandas alternative, data track)",
|
|
113
|
-
category: "data",
|
|
114
|
-
source: "K-Dense-AI",
|
|
115
|
-
condition: { kind: "any-track", tracks: ["data", "full"] },
|
|
116
|
-
method: { kind: "skill", source: "K-Dense-AI/scientific-agent-skills", skill: "polars" }
|
|
117
|
-
// v26.56.0 — description 보강: 트랙 hint + 한 줄 의미
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
id: "dask-K-Dense",
|
|
121
|
-
tier: "vetted",
|
|
122
|
-
// K-Dense-AI 26k
|
|
123
|
-
description: "Dask \u2014 distributed processing (large DataFrames \xB7 cluster, data track)",
|
|
124
|
-
category: "data",
|
|
125
|
-
source: "K-Dense-AI",
|
|
126
|
-
condition: { kind: "any-track", tracks: ["data", "full"] },
|
|
127
|
-
method: { kind: "skill", source: "K-Dense-AI/scientific-agent-skills", skill: "dask" }
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
// v26.106.0 (ADR-035, 사용자 승인 A): 일반 Python 패턴 = 순수 pattern-guide → opt-in 강등 (T2 가설 전제).
|
|
131
|
-
id: "python-resource-management",
|
|
132
|
-
tier: "vetted",
|
|
133
|
-
// wshobson/agents 36k
|
|
134
|
-
description: "Python memory \xB7 CPU management patterns (wshobson, data track)",
|
|
135
|
-
category: "data",
|
|
136
|
-
source: "wshobson",
|
|
137
|
-
condition: { kind: "opt-in" },
|
|
138
|
-
method: {
|
|
139
|
-
kind: "skill",
|
|
140
|
-
source: "https://github.com/wshobson/agents",
|
|
141
|
-
skill: "python-resource-management"
|
|
142
|
-
}
|
|
143
|
-
},
|
|
144
|
-
{
|
|
145
|
-
// v26.106.0 (ADR-035, 사용자 승인 A): 동일 — 순수 pattern-guide → opt-in 강등.
|
|
146
|
-
id: "python-performance-optimization",
|
|
147
|
-
tier: "vetted",
|
|
148
|
-
// wshobson/agents 36k
|
|
149
|
-
description: "Python performance optimization (profiling \xB7 vectorize, wshobson, data track)",
|
|
150
|
-
category: "data",
|
|
151
|
-
source: "wshobson",
|
|
152
|
-
condition: { kind: "opt-in" },
|
|
153
|
-
method: {
|
|
154
|
-
kind: "skill",
|
|
155
|
-
source: "https://github.com/wshobson/agents",
|
|
156
|
-
skill: "python-performance-optimization"
|
|
157
|
-
}
|
|
158
|
-
},
|
|
159
106
|
{
|
|
160
107
|
id: "anthropic-data-plugin",
|
|
161
108
|
tier: "official",
|
|
@@ -196,168 +143,135 @@ var EXTERNAL_ASSETS = [
|
|
|
196
143
|
condition: { kind: "opt-in" },
|
|
197
144
|
method: { kind: "internal", key: "ci-scaffold" }
|
|
198
145
|
},
|
|
199
|
-
// ===
|
|
200
|
-
//
|
|
201
|
-
//
|
|
202
|
-
{
|
|
203
|
-
id: "multi-persona-review",
|
|
204
|
-
tier: "official",
|
|
205
|
-
// uzys 본 하네스 자체 템플릿
|
|
206
|
-
description: "Multi-persona review \u2014 critique one artifact via 3-5 parallel user personas, then synthesize P0/P1/P2 fixes",
|
|
207
|
-
category: "dev-tools",
|
|
208
|
-
source: "uzys",
|
|
209
|
-
condition: { kind: "has-dev-track" },
|
|
210
|
-
method: { kind: "internal", key: "multi-persona-review" }
|
|
211
|
-
},
|
|
146
|
+
// === Repo-bundled internal skills (uzys 1st-party, v26.87.0) ===
|
|
147
|
+
// 2026-08-02 복원 (ADR-062) — 이관(ADR-060) 후 감사에서 본문 열화 104건(dropped 76 ·
|
|
148
|
+
// damaged 28)이 확인돼 9종을 이 리포 번들로 되돌렸다. 아래 10종 전부 `kind: "internal"`.
|
|
212
149
|
{
|
|
213
|
-
id: "
|
|
214
|
-
tier: "official",
|
|
215
|
-
// uzys 본 하네스 자체 템플릿
|
|
216
|
-
description: "Gap analysis E2E \u2014 detect north-star / correctness / UX gaps, then benchmark how reference services solved each",
|
|
217
|
-
category: "dev-tools",
|
|
218
|
-
source: "uzys",
|
|
219
|
-
condition: { kind: "has-dev-track" },
|
|
220
|
-
method: { kind: "internal", key: "gap-analysis-e2e" }
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
id: "ultracode-service-audit",
|
|
150
|
+
id: "compaction-handoff",
|
|
224
151
|
tier: "official",
|
|
225
152
|
// uzys 본 하네스 자체 템플릿
|
|
226
|
-
description: "
|
|
227
|
-
category: "
|
|
153
|
+
description: "Compaction handoff \u2014 persist durable state + git snapshot + resume anchor before a context /compact so nothing is lost",
|
|
154
|
+
category: "workflow",
|
|
228
155
|
source: "uzys",
|
|
229
156
|
condition: { kind: "has-dev-track" },
|
|
230
|
-
method: { kind: "internal", key: "
|
|
157
|
+
method: { kind: "internal", key: "compaction-handoff" }
|
|
231
158
|
},
|
|
159
|
+
// === uzys 방법론 스킬 — 이 리포 번들 (2026-08-02 복원, ADR-062) ===
|
|
160
|
+
// ASIS(ADR-060): `kind: "skill"` — uzysjung/uzys-agent-skills 에서 `npx skills add`.
|
|
161
|
+
// TOBE: templates/skills/<id>/ 번들 → 설치 시 dir copy (`kind: "internal"`).
|
|
162
|
+
// 이관본이 판정 기준·수치·워크드 예시를 잃어(감사 실측 104건) 스킬이 무엇을 하라는지가
|
|
163
|
+
// 남고 무엇으로 판정하는지가 사라졌다. 배포 경로를 하나로 모으는 이득보다 본문 보존이
|
|
164
|
+
// 앞선다 — 본문 게이트(테스트)가 이 리포에만 있기 때문이다. tier official = 자사
|
|
165
|
+
// (star 무관 — trust-tier-drift 가 official 을 건너뛴다). condition 은 이관 전 도달 범위 유지.
|
|
232
166
|
{
|
|
233
|
-
id: "
|
|
167
|
+
id: "clear-korean-communication",
|
|
234
168
|
tier: "official",
|
|
235
|
-
// uzys
|
|
236
|
-
description: "
|
|
169
|
+
// uzys 자사 스킬 리포
|
|
170
|
+
description: "Clear Korean communication \u2014 restate technical facts from the reader's position (impact and cause first, then evidence) instead of translation-ese; covers decisions, approval requests, and AS-IS/TO-BE contrasts",
|
|
237
171
|
category: "workflow",
|
|
238
172
|
source: "uzys",
|
|
239
173
|
condition: { kind: "has-dev-track" },
|
|
240
|
-
method: { kind: "internal", key: "
|
|
174
|
+
method: { kind: "internal", key: "clear-korean-communication" }
|
|
241
175
|
},
|
|
242
176
|
{
|
|
243
|
-
id: "
|
|
177
|
+
id: "north-star",
|
|
244
178
|
tier: "official",
|
|
245
|
-
// uzys
|
|
246
|
-
description: "
|
|
179
|
+
// uzys 자사 스킬 리포
|
|
180
|
+
description: "North Star \u2014 create or safely update the project direction baseline and its revision-linked roadmap, then analyze the impact on audits, verification criteria, issues, and work in progress",
|
|
247
181
|
category: "workflow",
|
|
248
182
|
source: "uzys",
|
|
249
|
-
|
|
250
|
-
|
|
183
|
+
// 전 트랙 상주 보존 — 이관 전에는 manifest COMMON_SKILL_DIRS(조건 없는 전 트랙 설치)였다.
|
|
184
|
+
// 이 카탈로그에 "always" kind 가 없어 전 트랙 나열로 같은 도달 범위를 표현한다.
|
|
185
|
+
condition: { kind: "any-track", tracks: [...TRACKS] },
|
|
186
|
+
method: { kind: "internal", key: "north-star" }
|
|
251
187
|
},
|
|
252
188
|
{
|
|
253
|
-
id: "
|
|
189
|
+
id: "audit-service-gaps",
|
|
254
190
|
tier: "official",
|
|
255
|
-
// uzys
|
|
256
|
-
description: "
|
|
257
|
-
category: "
|
|
191
|
+
// uzys 자사 스킬 리포
|
|
192
|
+
description: "Audit service gaps \u2014 audit observable gaps between the service's current state and an explicit North Star baseline (reverse \xB7 defect \xB7 experience \xB7 benchmark \xB7 verify \xB7 change-impact \xB7 drift modes)",
|
|
193
|
+
category: "dev-tools",
|
|
258
194
|
source: "uzys",
|
|
259
195
|
condition: { kind: "has-dev-track" },
|
|
260
|
-
method: { kind: "internal", key: "
|
|
196
|
+
method: { kind: "internal", key: "audit-service-gaps" }
|
|
261
197
|
},
|
|
262
198
|
{
|
|
263
|
-
id: "
|
|
199
|
+
id: "verification-loop",
|
|
264
200
|
tier: "official",
|
|
265
|
-
// uzys
|
|
266
|
-
description: "
|
|
267
|
-
category: "
|
|
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",
|
|
268
204
|
source: "uzys",
|
|
269
205
|
condition: { kind: "has-dev-track" },
|
|
270
|
-
method: { kind: "internal", key: "
|
|
206
|
+
method: { kind: "internal", key: "verification-loop" }
|
|
271
207
|
},
|
|
272
|
-
// v26.98.0 — 하네스 건강 감사 (ADR-027). 어제(2026-07-14) 3개 프로젝트 교차 하네스 교정
|
|
273
|
-
// 작업에서 추출한 방법론 + 리서치 근거(context rot·lost-in-the-middle·skill undertriggering·
|
|
274
|
-
// Ratchet). 기존 5분류(드리프트=정확성만)에서 3질문(A truth / B efficacy / C economy)으로
|
|
275
|
-
// 재설계 — "맞는 말인데 아무것도 안 일어나는" 하네스와 "다 맞는데 너무 길어 안 지켜지는"
|
|
276
|
-
// 하네스를 잡는다. 결정적 경계: 결정론적 린터(AgentLint/cclint)가 할 수 있는 form 검사는
|
|
277
|
-
// 위임하고, 린터가 구조적으로 못 하는 판단(이 단언이 이 repo 의 진짜 스택인가 / 이 훅이
|
|
278
|
-
// 실제로 fire 하는가 / 이 스킬이 트리거되는가)만 모델이 한다 (판단만 모델 몫).
|
|
279
|
-
// v26.101.0 — 안전(SAFE) 4번째 축 신설 (ADR-030): ADR-027 (z) 알려진 갭 해소. D1 위험 활성
|
|
280
|
-
// 지시 · D2 폭발 반경 · D3 비신뢰 입력 취급. D 는 flag 기본(보안 태세 결정은 사용자 몫),
|
|
281
|
-
// 완전성 단언은 계속 금지, "clean D ≠ security clearance" 명시.
|
|
282
208
|
{
|
|
283
|
-
id: "
|
|
209
|
+
id: "multi-persona-review",
|
|
284
210
|
tier: "official",
|
|
285
|
-
// uzys
|
|
286
|
-
description: "
|
|
211
|
+
// uzys 자사 스킬 리포
|
|
212
|
+
description: "Multi-persona review \u2014 review one artifact through independent stakeholder and failure lenses, then synthesize evidence-backed, severity-ranked findings without discarding minority views",
|
|
287
213
|
category: "dev-tools",
|
|
288
214
|
source: "uzys",
|
|
289
215
|
condition: { kind: "has-dev-track" },
|
|
290
|
-
method: { kind: "internal", key: "
|
|
216
|
+
method: { kind: "internal", key: "multi-persona-review" }
|
|
291
217
|
},
|
|
292
|
-
// v26.104.0 — 재발방지 (ADR-033, 사용자 지시 2026-07-17). 동일 이슈 재발 시: 재발을 증거로
|
|
293
|
-
// 검증(메모리·룰 사례표·git 이력 — "느낌상 재발" 금지) → 단순 실수 vs 복잡 하네스 문제 분류 →
|
|
294
|
-
// 단순 실수는 에스컬레이션 사다리(1회 기록 → 2회 룰 강제 등록 → 3회+ 구조적 게이트: 테스트/훅/
|
|
295
|
-
// derive), 복잡 문제는 다면 페르소나로 대책 후보 설계. 본 repo 실무 관행(no-false-ship 3회
|
|
296
|
-
// 재발→rule 신설, CHANGELOG 7릴리즈 drift→테스트 게이트, "주석 경고 ≠ 차단 수단")의 스킬화.
|
|
297
|
-
// 대책이 실제 fire 하는지 검증(RED→GREEN/훅 exit 2) 없이 "보호됨" 보고 금지.
|
|
298
218
|
{
|
|
299
219
|
id: "recurrence-prevention",
|
|
300
220
|
tier: "official",
|
|
301
|
-
// uzys
|
|
302
|
-
description: "Recurrence prevention \u2014
|
|
221
|
+
// uzys 자사 스킬 리포
|
|
222
|
+
description: "Recurrence prevention \u2014 reconstruct a repeated defect's failure signature and timeline, then pick the least costly countermeasure (code \xB7 regression test \xB7 rule \xB7 hook \xB7 derivation \xB7 gate)",
|
|
303
223
|
category: "workflow",
|
|
304
224
|
source: "uzys",
|
|
305
225
|
condition: { kind: "has-dev-track" },
|
|
306
226
|
method: { kind: "internal", key: "recurrence-prevention" }
|
|
307
227
|
},
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
228
|
+
{
|
|
229
|
+
id: "gh-issue-workflow",
|
|
230
|
+
tier: "official",
|
|
231
|
+
// uzys 자사 스킬 리포
|
|
232
|
+
description: "GitHub issue workflow \u2014 investigate, draft, create, implement, verify, and close issue-backed work while keeping read-only, draft, external-write, and status stages distinct",
|
|
233
|
+
category: "workflow",
|
|
234
|
+
source: "uzys",
|
|
235
|
+
// 전 트랙 상주 보존 — north-star 와 같은 이유 (이관 전 COMMON_SKILL_DIRS).
|
|
236
|
+
condition: { kind: "any-track", tracks: [...TRACKS] },
|
|
237
|
+
method: { kind: "internal", key: "gh-issue-workflow" }
|
|
238
|
+
},
|
|
318
239
|
{
|
|
319
240
|
id: "model-orchestration",
|
|
320
241
|
tier: "official",
|
|
321
|
-
// uzys
|
|
322
|
-
description: "Model orchestration
|
|
242
|
+
// 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)",
|
|
323
244
|
category: "workflow",
|
|
324
245
|
source: "uzys",
|
|
325
246
|
condition: { kind: "opt-in" },
|
|
326
247
|
method: { kind: "internal", key: "model-orchestration" }
|
|
327
248
|
},
|
|
328
|
-
// gemini-consult: uzys 1st-party skill wrapping Antigravity's `agy` CLI for natural Korean
|
|
329
|
-
// phrasing + multi-persona second-opinion review. Bundled like dev-method skills
|
|
330
|
-
// (templates/skills/gemini-consult/) so it renders across all 4 CLIs, but opt-in (condition
|
|
331
|
-
// opt-in) — installed only on wizard check / `--with gemini-consult`. Ships a bash wrapper
|
|
332
|
-
// (scripts/gemini-ask.sh) to Claude scope via the dir copy; non-Claude CLIs get the SKILL.md
|
|
333
|
-
// which degrades to a direct `agy` call (graceful — no broken wrapper reference). tier
|
|
334
|
-
// official (repo template); runtime dep on the external `agy` binary is a prereq, not a source.
|
|
335
249
|
{
|
|
336
|
-
|
|
250
|
+
// 전신 = gemini-consult + codex-consult. provider 중립 한 스킬로 통합됐다(통합은 유지 —
|
|
251
|
+
// 되돌린 것은 배포 경로이지 통합이 아니다).
|
|
252
|
+
id: "external-model-consult",
|
|
337
253
|
tier: "official",
|
|
338
|
-
// uzys
|
|
339
|
-
description: "
|
|
254
|
+
// uzys 자사 스킬 리포
|
|
255
|
+
description: "External model consult \u2014 ask an available external model/provider for an independent draft, critique, or provider-only output such as image generation (opt-in \u2014 recommended; requires that provider's CLI)",
|
|
340
256
|
category: "dev-tools",
|
|
341
257
|
source: "uzys",
|
|
342
258
|
condition: { kind: "opt-in" },
|
|
343
|
-
method: { kind: "internal", key: "
|
|
259
|
+
method: { kind: "internal", key: "external-model-consult" }
|
|
344
260
|
},
|
|
345
|
-
// codex-consult (v26.100.0): uzys 1st-party sibling of gemini-consult, wrapping the OpenAI
|
|
346
|
-
// `codex` CLI (`codex exec`) for concise rewriting / document structuring + image generation
|
|
347
|
-
// (codex `image_generation` tool → real PNG on disk). Same bundling shape: dir copy ships
|
|
348
|
-
// scripts/codex-ask.sh to Claude scope; non-Claude CLIs get SKILL.md with a direct-call
|
|
349
|
-
// fallback. Division of labor is encoded in both skills' descriptions (Korean nuance/persona
|
|
350
|
-
// → gemini, concision/structure/default images → codex). Runtime dep on `codex` binary is a
|
|
351
|
-
// user prereq, not a source.
|
|
352
261
|
{
|
|
353
|
-
|
|
262
|
+
// 복원 9종이 아니라 신설이다 — 이관 이력이 없다.
|
|
263
|
+
// 전 트랙인 이유: 위임과 요청 정규화는 개발 트랙의 행위가 아니라 **전 트랙의 행위**다.
|
|
264
|
+
// executive 트랙도 서브에이전트에 일을 넘기고, 그때 브리프가 없으면 완료 판정 기준 없이
|
|
265
|
+
// 넘긴다. 짝인 `task-brief-nudge.sh` 훅이 `ALWAYS_HOOKS`(전 설치본)라 스킬만 좁게 깔면
|
|
266
|
+
// 넛지가 없는 스킬을 가리킨다 — 훅과 스킬의 도달 범위는 같아야 한다.
|
|
267
|
+
id: "task-brief",
|
|
354
268
|
tier: "official",
|
|
355
|
-
// uzys
|
|
356
|
-
description: "
|
|
357
|
-
category: "
|
|
269
|
+
// 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",
|
|
271
|
+
category: "workflow",
|
|
358
272
|
source: "uzys",
|
|
359
|
-
condition: { kind: "
|
|
360
|
-
method: { kind: "internal", key: "
|
|
273
|
+
condition: { kind: "any-track", tracks: [...TRACKS] },
|
|
274
|
+
method: { kind: "internal", key: "task-brief" }
|
|
361
275
|
},
|
|
362
276
|
// === Option-gated (v26.42.0 — opt-in, BREAKING vs prior has-dev-track auto-install) ===
|
|
363
277
|
{
|
|
@@ -471,7 +385,8 @@ var EXTERNAL_ASSETS = [
|
|
|
471
385
|
description: "Railway agent-skills (deploy + project/service/env management)",
|
|
472
386
|
category: "backend",
|
|
473
387
|
source: "railwayapp",
|
|
474
|
-
|
|
388
|
+
// 2026-08-02 사용자 결정: 트랙 기본 → opt-in (ADR-063)
|
|
389
|
+
condition: { kind: "opt-in" },
|
|
475
390
|
method: {
|
|
476
391
|
kind: "plugin",
|
|
477
392
|
marketplace: "railwayapp/railway-skills",
|
|
@@ -486,7 +401,8 @@ var EXTERNAL_ASSETS = [
|
|
|
486
401
|
description: "Vercel CLI (npm)",
|
|
487
402
|
category: "backend",
|
|
488
403
|
source: "vercel",
|
|
489
|
-
|
|
404
|
+
// 2026-08-02 사용자 결정: 트랙 기본 → opt-in (ADR-063)
|
|
405
|
+
condition: { kind: "opt-in" },
|
|
490
406
|
method: { kind: "npm", pkg: "vercel", version: "54.17.3" }
|
|
491
407
|
},
|
|
492
408
|
{
|
|
@@ -508,27 +424,14 @@ var EXTERNAL_ASSETS = [
|
|
|
508
424
|
description: "Supabase CLI (npm) \u2014 first 'supabase login' requires OAuth",
|
|
509
425
|
category: "backend",
|
|
510
426
|
source: "supabase",
|
|
511
|
-
|
|
427
|
+
// 2026-08-02 사용자 결정: 트랙 기본 → opt-in (ADR-063)
|
|
428
|
+
condition: { kind: "opt-in" },
|
|
512
429
|
method: { kind: "npm", pkg: "supabase", version: "2.108.0" }
|
|
513
430
|
},
|
|
514
431
|
// === UI tracks (csr-*|ssr-*|full) ===
|
|
515
|
-
{
|
|
516
|
-
// v26.106.0 (ADR-035, 사용자 결정 2026-07-18): frontend-design(official)이 기본인 이상 taste
|
|
517
|
-
// 가이드류는 opt-in 으로 충분 — v26.92.0 의 "생성↔리뷰 보완재" 논리는 권고이지 결합이 아님.
|
|
518
|
-
id: "impeccable",
|
|
519
|
-
tier: "vetted",
|
|
520
|
-
// pbakaus 31k
|
|
521
|
-
description: "Impeccable \u2014 UI design guide + visual consistency review (pbakaus, single-skill repo)",
|
|
522
|
-
category: "frontend",
|
|
523
|
-
source: "pbakaus",
|
|
524
|
-
condition: { kind: "opt-in" },
|
|
525
|
-
// v26.54.1 — skills cli 1.5.7 부터 `--skill <name>` 명시 필수 (single-skill repo 도)
|
|
526
|
-
method: { kind: "skill", source: "pbakaus/impeccable", skill: "impeccable" }
|
|
527
|
-
},
|
|
528
432
|
// v26.92.0 — frontend-design (Anthropic official, claude-plugins-official 984.5K installs).
|
|
529
|
-
//
|
|
530
|
-
//
|
|
531
|
-
// 넓게 — 모든 개발 트랙, executive 제외). category=frontend (UI 자산, wizard 그룹).
|
|
433
|
+
// 사용자 결정: has-dev-track 기본추천 (모든 개발 트랙, executive 제외).
|
|
434
|
+
// category=frontend (UI 자산, wizard 그룹).
|
|
532
435
|
// repoForAsset=marketplace(anthropics/claude-plugins-official); official tier=drift 제외.
|
|
533
436
|
{
|
|
534
437
|
id: "frontend-design",
|
|
@@ -544,6 +447,44 @@ var EXTERNAL_ASSETS = [
|
|
|
544
447
|
pluginId: "frontend-design@claude-plugins-official"
|
|
545
448
|
}
|
|
546
449
|
},
|
|
450
|
+
// 2026-08-02 정비 — 프론트엔드 품질 3종 (사용자 지시). 전부 opt-in: frontend-design 이 기본
|
|
451
|
+
// 생성기이고 이 셋은 그 위의 취향·디테일 층이라 상시 비용을 물릴 근거가 없다 (ADR-032/035
|
|
452
|
+
// 와 같은 축). star 는 각 tier 라인 주석 = 2026-08-02 `gh api` 실측.
|
|
453
|
+
{
|
|
454
|
+
id: "jakubkrehel-skills",
|
|
455
|
+
tier: "vetted",
|
|
456
|
+
// jakubkrehel/skills 2,602 (2026-08-02)
|
|
457
|
+
description: "Better-* interface suite \u2014 7 skills reviewing/improving UI detail, typography, OKLCH color, accessibility, layout, and UX writing, one concern per skill",
|
|
458
|
+
category: "frontend",
|
|
459
|
+
source: "jakubkrehel",
|
|
460
|
+
condition: { kind: "opt-in" },
|
|
461
|
+
// `--skill` 미지정 = 리포의 7 스킬 전부 설치. 다른 multi-skill 출처(K-Dense·softaworks)는
|
|
462
|
+
// 한 자산 = 한 스킬이라 `--skill` 을 썼지만, 여기 광고 문구가 "7 skills" 세트다 —
|
|
463
|
+
// 한 개만 깔면 description 이 곧 거짓이 된다. 실호출 형태는 Docker 실설치(AC8)로 확인한다.
|
|
464
|
+
method: { kind: "skill", source: "jakubkrehel/skills" }
|
|
465
|
+
},
|
|
466
|
+
{
|
|
467
|
+
id: "taste-skill",
|
|
468
|
+
tier: "vetted",
|
|
469
|
+
// Leonxlnx/taste-skill 70,078 (2026-08-02)
|
|
470
|
+
description: "Anti-slop frontend design \u2014 removes the boilerplate look of AI-generated UI; infers a design language and tunes VARIANCE/MOTION/DENSITY, with minimalist/brutalist/high-end style variants",
|
|
471
|
+
category: "frontend",
|
|
472
|
+
source: "Leonxlnx",
|
|
473
|
+
condition: { kind: "opt-in" },
|
|
474
|
+
// 리포에 스킬 14종(brandkit·brutalist·minimalist 등)이 있고 본체가 `taste-skill` —
|
|
475
|
+
// 스타일 변형은 그 안에서 고른다. 다른 단일 대표 자산(remotion)과 같은 형태.
|
|
476
|
+
method: { kind: "skill", source: "Leonxlnx/taste-skill", skill: "taste-skill" }
|
|
477
|
+
},
|
|
478
|
+
{
|
|
479
|
+
id: "scroll-world",
|
|
480
|
+
tier: "vetted",
|
|
481
|
+
// oso95/scroll-world 6,863 (2026-08-02)
|
|
482
|
+
description: "Scroll-driven 3D world landing pages \u2014 interviews for brand/scene direction, generates AI assets, then builds a continuous camera-flight scroll engine",
|
|
483
|
+
category: "frontend",
|
|
484
|
+
source: "oso95",
|
|
485
|
+
condition: { kind: "opt-in" },
|
|
486
|
+
method: { kind: "skill", source: "oso95/scroll-world", skill: "scroll-world" }
|
|
487
|
+
},
|
|
547
488
|
// === dev tools (has_dev_track) ===
|
|
548
489
|
// v26.110.0 (ADR-039) — code-review: /code-review 커맨드 1개 (다중 에이전트 confidence
|
|
549
490
|
// 스코어링 PR 리뷰). 기본 리뷰 스택(reviewer·code-reviewer·security-reviewer)과 표면 중복
|
|
@@ -579,21 +520,6 @@ var EXTERNAL_ASSETS = [
|
|
|
579
520
|
pluginId: "security-guidance@claude-plugins-official"
|
|
580
521
|
}
|
|
581
522
|
},
|
|
582
|
-
{
|
|
583
|
-
id: "playwright-skill",
|
|
584
|
-
tier: "experimental",
|
|
585
|
-
// testdino-hq/playwright-skill 264
|
|
586
|
-
description: "Playwright \u2014 browser automation E2E test authoring guide (testdino-hq)",
|
|
587
|
-
category: "dev-tools",
|
|
588
|
-
source: "testdino-hq",
|
|
589
|
-
condition: { kind: "has-dev-track" },
|
|
590
|
-
// v26.54.1 — skills cli 1.5.7 부터 `--skill <name>` 명시 필수
|
|
591
|
-
method: {
|
|
592
|
-
kind: "skill",
|
|
593
|
-
source: "testdino-hq/playwright-skill",
|
|
594
|
-
skill: "playwright-skill"
|
|
595
|
-
}
|
|
596
|
-
},
|
|
597
523
|
{
|
|
598
524
|
id: "find-skills",
|
|
599
525
|
tier: "vetted",
|
|
@@ -861,35 +787,6 @@ var EXTERNAL_ASSETS = [
|
|
|
861
787
|
// alirezarezvani/claude-skills marketplace (v2.3.0) — 2026-04-25 통합 갱신.
|
|
862
788
|
// 기존 alirezarezvani/c-level-skills + alirezarezvani/finance-skills 별도 marketplace
|
|
863
789
|
// → 통합된 alirezarezvani/claude-skills marketplace (claude-code-skills 이름)로 이동.
|
|
864
|
-
{
|
|
865
|
-
id: "c-level-skills",
|
|
866
|
-
tier: "vetted",
|
|
867
|
-
// alirezarezvani 16k
|
|
868
|
-
description: "c-level-skills (claude-code-skills, 28 advisory)",
|
|
869
|
-
category: "business",
|
|
870
|
-
source: "alirezarezvani",
|
|
871
|
-
condition: { kind: "any-track", tracks: ["executive", "full"] },
|
|
872
|
-
method: {
|
|
873
|
-
kind: "plugin",
|
|
874
|
-
marketplace: "alirezarezvani/claude-skills",
|
|
875
|
-
pluginId: "c-level-skills@claude-code-skills"
|
|
876
|
-
}
|
|
877
|
-
},
|
|
878
|
-
{
|
|
879
|
-
id: "business-growth-skills",
|
|
880
|
-
tier: "vetted",
|
|
881
|
-
// alirezarezvani 16k
|
|
882
|
-
description: "business-growth-skills (4 \u2014 customer success, sales eng, revops, contract)",
|
|
883
|
-
category: "business",
|
|
884
|
-
source: "alirezarezvani",
|
|
885
|
-
// v0.5.0 — growth-marketing Track에서도 재사용. 합집합 조건.
|
|
886
|
-
condition: { kind: "any-track", tracks: ["executive", "full", "growth-marketing"] },
|
|
887
|
-
method: {
|
|
888
|
-
kind: "plugin",
|
|
889
|
-
marketplace: "alirezarezvani/claude-skills",
|
|
890
|
-
pluginId: "business-growth-skills@claude-code-skills"
|
|
891
|
-
}
|
|
892
|
-
},
|
|
893
790
|
{
|
|
894
791
|
id: "finance-skills",
|
|
895
792
|
tier: "vetted",
|
|
@@ -897,7 +794,8 @@ var EXTERNAL_ASSETS = [
|
|
|
897
794
|
description: "finance-skills (3 \u2014 financial analyst, SaaS metrics, investment advisor)",
|
|
898
795
|
category: "business",
|
|
899
796
|
source: "alirezarezvani",
|
|
900
|
-
|
|
797
|
+
// 2026-08-02 사용자 결정: 트랙 기본 → opt-in (ADR-063)
|
|
798
|
+
condition: { kind: "opt-in" },
|
|
901
799
|
method: {
|
|
902
800
|
kind: "plugin",
|
|
903
801
|
marketplace: "alirezarezvani/claude-skills",
|
|
@@ -905,21 +803,6 @@ var EXTERNAL_ASSETS = [
|
|
|
905
803
|
}
|
|
906
804
|
},
|
|
907
805
|
// === Project Management Track (v0.5.0) ===
|
|
908
|
-
// SPEC docs/specs/new-tracks-pm-growth.md §3.5 — pm-skills 4/4.
|
|
909
|
-
{
|
|
910
|
-
id: "pm-skills",
|
|
911
|
-
tier: "vetted",
|
|
912
|
-
// alirezarezvani 16k
|
|
913
|
-
description: "pm-skills (6 \u2014 senior PM, scrum master, Jira/Confluence/Atlassian admin, template creator)",
|
|
914
|
-
category: "business",
|
|
915
|
-
source: "alirezarezvani",
|
|
916
|
-
condition: { kind: "any-track", tracks: ["project-management"] },
|
|
917
|
-
method: {
|
|
918
|
-
kind: "plugin",
|
|
919
|
-
marketplace: "alirezarezvani/claude-skills",
|
|
920
|
-
pluginId: "pm-skills@claude-code-skills"
|
|
921
|
-
}
|
|
922
|
-
},
|
|
923
806
|
// SPEC §3.5 — product-skills: has-dev-track + project-management 합집합 (executive/growth-marketing 제외).
|
|
924
807
|
{
|
|
925
808
|
id: "product-skills",
|
|
@@ -930,7 +813,8 @@ var EXTERNAL_ASSETS = [
|
|
|
930
813
|
source: "alirezarezvani",
|
|
931
814
|
// v26.106.0 (ADR-035, 사용자 승인 C): dev 8트랙 기본에서 제외 — PM 스킬 15종은 PM 트랙 목적
|
|
932
815
|
// 자산. dev 트랙은 wizard 체크 / --with 로 opt-in.
|
|
933
|
-
|
|
816
|
+
// 2026-08-02 사용자 결정: 트랙 기본 → opt-in (ADR-063)
|
|
817
|
+
condition: { kind: "opt-in" },
|
|
934
818
|
method: {
|
|
935
819
|
kind: "plugin",
|
|
936
820
|
marketplace: "alirezarezvani/claude-skills",
|
|
@@ -938,23 +822,10 @@ var EXTERNAL_ASSETS = [
|
|
|
938
822
|
}
|
|
939
823
|
},
|
|
940
824
|
// === Growth Marketing Track (v0.5.0) ===
|
|
941
|
-
//
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
// alirezarezvani 16k
|
|
946
|
-
description: "marketing-skills (44 \u2014 content/SEO/CRO/channels/growth/intelligence/sales/twitter)",
|
|
947
|
-
category: "business",
|
|
948
|
-
source: "alirezarezvani",
|
|
949
|
-
condition: { kind: "any-track", tracks: ["growth-marketing"] },
|
|
950
|
-
method: {
|
|
951
|
-
kind: "plugin",
|
|
952
|
-
marketplace: "alirezarezvani/claude-skills",
|
|
953
|
-
pluginId: "marketing-skills@claude-code-skills"
|
|
954
|
-
}
|
|
955
|
-
},
|
|
956
|
-
// v26.91.0 — coreyhaines31/marketingskills (35k★, MIT, plugin v2.5.1). 위 alirezarezvani
|
|
957
|
-
// marketing-skills(16k) 와 병존 — id 구분(marketingskills ≠ marketing-skills). opt-in =
|
|
825
|
+
// 2026-08-02 정비 — alirezarezvani 번들 4종(c-level·business-growth·pm·marketing) +
|
|
826
|
+
// research-summarizer 제거. 남는 마케팅 번들은 아래 coreyhaines31/marketingskills 하나로,
|
|
827
|
+
// 동명이물(marketing-skills ≠ marketingskills) 병존도 이로써 해소된다.
|
|
828
|
+
// v26.91.0 — coreyhaines31/marketingskills (35k★, MIT, plugin v2.5.1). opt-in =
|
|
958
829
|
// growth-marketing 외 전 트랙에서도 wizard 토글 + `--with marketingskills` 로 설치 가능
|
|
959
830
|
// ("SEO 는 일반 개발에도 활용" 충족: dev 트랙에서 본 번들 토글). 45 스킬 중 SEO 7종
|
|
960
831
|
// (seo-audit/schema/ai-seo/site-architecture/programmatic-seo/content/aso)은 상호참조
|
|
@@ -976,38 +847,10 @@ var EXTERNAL_ASSETS = [
|
|
|
976
847
|
},
|
|
977
848
|
// v26.76.0 — content-creator / demand-gen 제거: alirezarezvani/claude-skills marketplace.json 에
|
|
978
849
|
// 해당 plugin 부재(Docker 실설치 검출, exit 1). 거짓 광고 0건 원칙(Promise=Implementation).
|
|
979
|
-
//
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
// alirezarezvani 16k
|
|
984
|
-
description: "research-summarizer (market research summarization)",
|
|
985
|
-
category: "business",
|
|
986
|
-
source: "alirezarezvani",
|
|
987
|
-
condition: { kind: "any-track", tracks: ["growth-marketing"] },
|
|
988
|
-
method: {
|
|
989
|
-
kind: "plugin",
|
|
990
|
-
marketplace: "alirezarezvani/claude-skills",
|
|
991
|
-
pluginId: "research-summarizer@claude-code-skills"
|
|
992
|
-
}
|
|
993
|
-
},
|
|
994
|
-
// === Code-quality enforcement (has-dev-track, v0.5.0) ===
|
|
995
|
-
// SPEC §3.5 — karpathy-coder 4/4. CLAUDE.md P1-P4 선언적 원칙의 검출 도구 layer.
|
|
996
|
-
// 4 Python tools (stdlib only) + reviewer agent + /karpathy-check + pre-commit hook.
|
|
997
|
-
{
|
|
998
|
-
id: "karpathy-coder",
|
|
999
|
-
tier: "vetted",
|
|
1000
|
-
// alirezarezvani 16k
|
|
1001
|
-
description: "karpathy-coder (4 Python tool + reviewer agent + /karpathy-check + pre-commit hook)",
|
|
1002
|
-
category: "dev-tools",
|
|
1003
|
-
source: "alirezarezvani",
|
|
1004
|
-
condition: { kind: "has-dev-track" },
|
|
1005
|
-
method: {
|
|
1006
|
-
kind: "plugin",
|
|
1007
|
-
marketplace: "alirezarezvani/claude-skills",
|
|
1008
|
-
pluginId: "karpathy-coder@claude-code-skills"
|
|
1009
|
-
}
|
|
1010
|
-
},
|
|
850
|
+
// 2026-08-02 정비 — karpathy-coder 제거. Write|Edit 마다 Python complexity 검사를 돌리는
|
|
851
|
+
// 상시 훅이었고, 그 검사는 현행 모델이 이미 하는 일이다 (Opus 5 가이드의 "legacy harness
|
|
852
|
+
// scaffolding"에 정확히 해당). 딸린 배선(`--with-karpathy-hook` 플래그 · templates/hooks/
|
|
853
|
+
// karpathy-gate.sh · settings.json PreToolUse auto-wire)도 함께 삭제 — BREAKING, ADR-060.
|
|
1011
854
|
// === Option-gated ===
|
|
1012
855
|
{
|
|
1013
856
|
// v26.39.2 fix — marketplace name = "trailofbits" (NOT "trailofbits-skills") +
|
|
@@ -1060,30 +903,20 @@ var EXTERNAL_ASSETS = [
|
|
|
1060
903
|
}
|
|
1061
904
|
];
|
|
1062
905
|
var DEV_METHOD_SKILL_IDS = [
|
|
1063
|
-
"multi-persona-review",
|
|
1064
|
-
"gap-analysis-e2e",
|
|
1065
|
-
"ultracode-service-audit",
|
|
1066
|
-
"asis-tobe-decision",
|
|
1067
906
|
"compaction-handoff",
|
|
1068
|
-
"
|
|
1069
|
-
|
|
1070
|
-
"
|
|
1071
|
-
|
|
1072
|
-
"
|
|
1073
|
-
// v26.105.0 (ADR-034) — model-orchestration 은 '수단(권장)' 계층으로 이동 (opt-in internal).
|
|
907
|
+
"clear-korean-communication",
|
|
908
|
+
"audit-service-gaps",
|
|
909
|
+
"multi-persona-review",
|
|
910
|
+
"recurrence-prevention",
|
|
911
|
+
"verification-loop"
|
|
1074
912
|
];
|
|
1075
913
|
var INTERNAL_BUNDLED_SKILL_IDS = [
|
|
1076
914
|
...DEV_METHOD_SKILL_IDS,
|
|
1077
|
-
|
|
1078
|
-
|
|
915
|
+
"north-star",
|
|
916
|
+
"gh-issue-workflow",
|
|
917
|
+
"task-brief",
|
|
1079
918
|
"model-orchestration",
|
|
1080
|
-
"
|
|
1081
|
-
// v26.100.0 — Codex advisor (concision/structure + image gen). ADR-029.
|
|
1082
|
-
"codex-consult",
|
|
1083
|
-
// v26.130.0 — 설명 진단(지시대상 → 한 문장 → 근거). asis-tobe-decision 의 형제지만
|
|
1084
|
-
// **opt-in** 이다: 기본 설치 descriptor 예산(ADR-032 ratchet)을 33 토큰 넘겼고, 아직
|
|
1085
|
-
// 이 리포 밖에서 가치가 입증되지 않은 자산에 그 상향을 요구하지 않는다.
|
|
1086
|
-
"explain-plainly"
|
|
919
|
+
"external-model-consult"
|
|
1087
920
|
];
|
|
1088
921
|
var TRUST_TIER = Object.fromEntries(
|
|
1089
922
|
EXTERNAL_ASSETS.map((a) => [a.id, a.tier])
|
|
@@ -1174,38 +1007,160 @@ var CATEGORY_TITLES = {
|
|
|
1174
1007
|
|
|
1175
1008
|
// src/manifest.ts
|
|
1176
1009
|
init_esm_shims();
|
|
1010
|
+
|
|
1011
|
+
// src/project-claude-merge.ts
|
|
1012
|
+
init_esm_shims();
|
|
1013
|
+
var HARNESS_ANCHOR_FILE = "CLAUDE-uzys-harness.md";
|
|
1014
|
+
var HARNESS_IMPORT_LINE = `@${HARNESS_ANCHOR_FILE}`;
|
|
1015
|
+
var IMPORT_MARKER_START = "<!-- uzys-harness:import:start -->";
|
|
1016
|
+
var IMPORT_MARKER_END = "<!-- uzys-harness:import:end -->";
|
|
1017
|
+
var IMPORT_BLOCK = `${IMPORT_MARKER_START}
|
|
1018
|
+
${HARNESS_IMPORT_LINE}
|
|
1019
|
+
${IMPORT_MARKER_END}`;
|
|
1020
|
+
var TRACK_DISPLAY_NAMES = {
|
|
1021
|
+
tooling: "Tooling",
|
|
1022
|
+
"csr-supabase": "CSR Supabase",
|
|
1023
|
+
"csr-fastify": "CSR Fastify",
|
|
1024
|
+
"csr-fastapi": "CSR FastAPI",
|
|
1025
|
+
"ssr-htmx": "SSR HTMX",
|
|
1026
|
+
"ssr-nextjs": "SSR Next.js",
|
|
1027
|
+
data: "Data",
|
|
1028
|
+
executive: "Executive",
|
|
1029
|
+
full: "Full",
|
|
1030
|
+
"project-management": "Project Management",
|
|
1031
|
+
"growth-marketing": "Growth Marketing"
|
|
1032
|
+
};
|
|
1033
|
+
var FULL_EXPANSION = TRACKS.filter((t) => t !== "full");
|
|
1034
|
+
var FILL_SECTIONS = [
|
|
1035
|
+
"identity",
|
|
1036
|
+
"stack",
|
|
1037
|
+
"architecture",
|
|
1038
|
+
"installed-assets",
|
|
1039
|
+
"boundaries",
|
|
1040
|
+
"verify"
|
|
1041
|
+
];
|
|
1042
|
+
var FILL_SPECS = {
|
|
1043
|
+
identity: {
|
|
1044
|
+
title: "Identity & Purpose",
|
|
1045
|
+
prompt: `Replace the H1 title above with this project's real name, then state in 1-2 plain sentences what it does, who uses it, and why it exists. Sources: README.md, the package.json / pyproject.toml "description", docs/. Do NOT describe the harness itself. Delete this comment when done.`,
|
|
1046
|
+
placeholder: "what this project is, who it is for, and why it exists"
|
|
1047
|
+
},
|
|
1048
|
+
stack: {
|
|
1049
|
+
title: "Stack & Commands",
|
|
1050
|
+
prompt: "Replace the list below with this project's REAL stack. Inspect package.json / pyproject.toml / go.mod / Cargo.toml / Gemfile + lockfiles and any Makefile/justfile/package scripts. List the language(s)+versions, framework(s), package manager, and the exact install/build/test/run commands. Verify each command exists before writing it \u2014 never guess. Delete lines that do not apply, then delete this comment.",
|
|
1051
|
+
placeholder: "languages, runtimes, package manager, and the install/build/test/run commands"
|
|
1052
|
+
},
|
|
1053
|
+
architecture: {
|
|
1054
|
+
title: "Architecture & Layout",
|
|
1055
|
+
prompt: "Map this repository. List each top-level source directory and what it holds, the entry point(s), the 3-5 files a newcomer reads first, and how data/requests flow between the main layers. View the real tree (e.g. `git ls-files | sed 's#/.*##' | sort -u`) \u2014 do not assume a framework's conventional layout. Flag any generated/vendored directories that must never be hand-edited. If this is a single small module, say so in one line. Delete this comment when done.",
|
|
1056
|
+
placeholder: "where things live, the entry points, and how data flows between layers"
|
|
1057
|
+
},
|
|
1058
|
+
"installed-assets": {
|
|
1059
|
+
title: "Installed Harness Assets",
|
|
1060
|
+
prompt: "List the harness assets installed in this project (rules / skills / agents / commands) and add one line each on when to reach for it here. Verify against .claude/rules/*.md, .claude/skills/, .claude/agents/, .claude/commands/ (or this CLI's equivalent) and list ONLY assets whose file exists on disk \u2014 do not invent any. Do NOT restate the harness's working principles (they live in this project's harness anchor and rules layer) \u2014 cross-reference them instead. Delete this comment when done.",
|
|
1061
|
+
placeholder: "the installed rules/skills/agents/commands and when to use each"
|
|
1062
|
+
},
|
|
1063
|
+
boundaries: {
|
|
1064
|
+
title: "Boundaries \u2014 Always / Ask First / Never",
|
|
1065
|
+
prompt: `Fill the Always / Ask First / Never lists with this repo's real red lines. Read the CI config, CODEOWNERS, .gitignore, and release/deploy scripts. Never must include secrets, generated files, force-push, and direct commits to the default branch, plus any repo-specific "do not touch" directories. Every entry must be specific and enforceable here. Delete this comment when done.`,
|
|
1066
|
+
placeholder: "what to always do, ask before doing, and never do in this repo"
|
|
1067
|
+
},
|
|
1068
|
+
verify: {
|
|
1069
|
+
title: "Verification Gate",
|
|
1070
|
+
prompt: 'State the single command (or short sequence) that PROVES a change is safe here \u2014 the test/lint/typecheck/build gate you run before committing \u2014 plus the coverage/CI threshold and what "done" means. Sources: package scripts, CI workflow files, CONTRIBUTING. An agent must be able to self-verify without guessing. Delete this comment when done.',
|
|
1071
|
+
placeholder: "the single command that proves a change is safe, and the done bar"
|
|
1072
|
+
}
|
|
1073
|
+
};
|
|
1074
|
+
var SCAFFOLD_BANNER = [
|
|
1075
|
+
"> \u2699\uFE0F **SCAFFOLD \u2014 not filled in yet.** The sections below are a fill-in template for THIS project, not verified facts.",
|
|
1076
|
+
"> To fill: open this file and paste each `<!-- FILL: \u2026 -->` comment's instruction into your coding agent (e.g. Claude Code) \u2014 it will inspect the real repo and write the section. You can also fill them by hand; the comments are the instructions.",
|
|
1077
|
+
`> The working principles live in this project's harness anchor \u2014 \`${HARNESS_ANCHOR_FILE}\` (Claude Code, imported from this file), \`AGENTS.md\` (Codex/OpenCode), or \`.agents/rules/uzys-harness.md\` (Antigravity). This file is **project-specific context only**.`
|
|
1078
|
+
].join("\n");
|
|
1079
|
+
function renderFillScaffold() {
|
|
1080
|
+
const blocks = FILL_SECTIONS.map((id) => {
|
|
1081
|
+
const spec = FILL_SPECS[id];
|
|
1082
|
+
return `## ${spec.title}
|
|
1083
|
+
|
|
1084
|
+
<!-- FILL:${id} \u2014 ${spec.prompt} -->
|
|
1085
|
+
|
|
1086
|
+
_(not filled yet \u2014 ${spec.placeholder})_`;
|
|
1087
|
+
});
|
|
1088
|
+
return `${SCAFFOLD_BANNER}
|
|
1089
|
+
|
|
1090
|
+
${blocks.join("\n\n")}`;
|
|
1091
|
+
}
|
|
1092
|
+
function mergeProjectClaude(opts) {
|
|
1093
|
+
const expanded = expandTracks(opts.tracks);
|
|
1094
|
+
const trackList = expanded.map((t) => TRACK_DISPLAY_NAMES[t]).join(", ");
|
|
1095
|
+
const header = `# ${opts.projectName}
|
|
1096
|
+
|
|
1097
|
+
> Active track(s): ${trackList}`;
|
|
1098
|
+
return `${header}
|
|
1099
|
+
|
|
1100
|
+
${renderFillScaffold()}
|
|
1101
|
+
`;
|
|
1102
|
+
}
|
|
1103
|
+
function upsertHarnessImport(existing, opts) {
|
|
1104
|
+
if (existing === null) {
|
|
1105
|
+
return `${mergeProjectClaude(opts)}
|
|
1106
|
+
${IMPORT_BLOCK}
|
|
1107
|
+
`;
|
|
1108
|
+
}
|
|
1109
|
+
if (hasHarnessImport(existing)) {
|
|
1110
|
+
return existing;
|
|
1111
|
+
}
|
|
1112
|
+
const body = existing.endsWith("\n") ? existing : `${existing}
|
|
1113
|
+
`;
|
|
1114
|
+
return `${body}
|
|
1115
|
+
${IMPORT_BLOCK}
|
|
1116
|
+
`;
|
|
1117
|
+
}
|
|
1118
|
+
function stripHarnessImport(text) {
|
|
1119
|
+
const start = text.indexOf(IMPORT_MARKER_START);
|
|
1120
|
+
if (start === -1) return null;
|
|
1121
|
+
const endAt = text.indexOf(IMPORT_MARKER_END, start);
|
|
1122
|
+
if (endAt === -1) return null;
|
|
1123
|
+
const before = text.slice(0, start).replace(/\n+$/, "\n");
|
|
1124
|
+
const after = text.slice(endAt + IMPORT_MARKER_END.length).replace(/^\n+/, "");
|
|
1125
|
+
return `${before}${after}`;
|
|
1126
|
+
}
|
|
1127
|
+
function hasHarnessImport(text) {
|
|
1128
|
+
if (text.includes(IMPORT_MARKER_START)) return true;
|
|
1129
|
+
let inFence = false;
|
|
1130
|
+
for (const line of text.split("\n")) {
|
|
1131
|
+
if (/^\s*(?:```|~~~)/.test(line)) {
|
|
1132
|
+
inFence = !inFence;
|
|
1133
|
+
continue;
|
|
1134
|
+
}
|
|
1135
|
+
if (!inFence && line.trim() === HARNESS_IMPORT_LINE) return true;
|
|
1136
|
+
}
|
|
1137
|
+
return false;
|
|
1138
|
+
}
|
|
1139
|
+
function expandTracks(tracks) {
|
|
1140
|
+
if (tracks.includes("full")) {
|
|
1141
|
+
return FULL_EXPANSION;
|
|
1142
|
+
}
|
|
1143
|
+
return tracks;
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
// src/manifest.ts
|
|
1177
1147
|
var all = () => true;
|
|
1178
1148
|
var dev = (s) => hasDevTrack(s.tracks);
|
|
1179
1149
|
var ui = (s) => hasUiTrack(s.tracks);
|
|
1180
1150
|
var onTracks = (pattern) => (s) => anyTrack(s.tracks, pattern);
|
|
1181
|
-
var COMMON_RULES = [
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
"gates-taxonomy",
|
|
1185
|
-
"doc-governance",
|
|
1186
|
-
"no-false-ship"
|
|
1187
|
-
];
|
|
1188
|
-
var DEV_RULES = ["test-policy", "ship-checklist", "code-style", "error-handling"];
|
|
1189
|
-
var UI_RULES = ["design-workflow", "playwright-launch", "benchmark-parity"];
|
|
1151
|
+
var COMMON_RULES = ["git-policy", "change-management", "doc-governance"];
|
|
1152
|
+
var DEV_RULES = ["test-policy", "ship-checklist"];
|
|
1153
|
+
var UI_RULES = ["playwright-launch", "benchmark-parity"];
|
|
1190
1154
|
var TRACK_RULES = {
|
|
1191
|
-
"csr-supabase": [
|
|
1192
|
-
"csr-fastify": [
|
|
1193
|
-
"csr-fastapi": [
|
|
1194
|
-
"ssr-htmx": [
|
|
1195
|
-
"ssr-nextjs": [
|
|
1196
|
-
data: [
|
|
1155
|
+
"csr-supabase": [],
|
|
1156
|
+
"csr-fastify": [],
|
|
1157
|
+
"csr-fastapi": [],
|
|
1158
|
+
"ssr-htmx": [],
|
|
1159
|
+
"ssr-nextjs": [],
|
|
1160
|
+
data: [],
|
|
1197
1161
|
executive: [],
|
|
1198
1162
|
tooling: ["cli-development"],
|
|
1199
|
-
full: [
|
|
1200
|
-
"shadcn",
|
|
1201
|
-
"api-contract",
|
|
1202
|
-
"database",
|
|
1203
|
-
"htmx",
|
|
1204
|
-
"nextjs",
|
|
1205
|
-
"pyside6",
|
|
1206
|
-
"data-analysis",
|
|
1207
|
-
"cli-development"
|
|
1208
|
-
],
|
|
1163
|
+
full: ["cli-development"],
|
|
1209
1164
|
// v0.5.0 — executive-style baselines (no dev rules; common rules only).
|
|
1210
1165
|
"project-management": [],
|
|
1211
1166
|
"growth-marketing": []
|
|
@@ -1217,9 +1172,6 @@ function resolveRules(spec) {
|
|
|
1217
1172
|
set.add(r);
|
|
1218
1173
|
}
|
|
1219
1174
|
}
|
|
1220
|
-
if (spec.withTauri && anyTrack(spec.tracks, "csr-*|full")) {
|
|
1221
|
-
set.add("tauri");
|
|
1222
|
-
}
|
|
1223
1175
|
if (hasUiTrack(spec.tracks)) {
|
|
1224
1176
|
for (const r of UI_RULES) {
|
|
1225
1177
|
set.add(r);
|
|
@@ -1240,15 +1192,17 @@ var ALWAYS_HOOKS = [
|
|
|
1240
1192
|
"session-start.sh",
|
|
1241
1193
|
"protect-files.sh",
|
|
1242
1194
|
"mcp-pre-exec.sh",
|
|
1243
|
-
|
|
1244
|
-
|
|
1195
|
+
// UserPromptSubmit 넛지. 차단하지 않는 유일한 훅 — 판정은 결정적 두 조건뿐이고(길이 ·
|
|
1196
|
+
// `<objective>` 표식 부재) 변환 자체는 `task-brief` 스킬 몫이다. `templates/settings.json`
|
|
1197
|
+
// 배선과 한 벌 (hook-wiring-parity 가 한쪽만 있는 상태를 문다).
|
|
1198
|
+
"task-brief-nudge.sh"
|
|
1245
1199
|
];
|
|
1246
|
-
var COMMON_SKILL_DIRS = [
|
|
1200
|
+
var COMMON_SKILL_DIRS = [];
|
|
1247
1201
|
var COMMON_SKILL_DIRS_ECC = ["strategic-compact", "continuous-learning-v2"];
|
|
1248
1202
|
var MODIFIED_COMMON_SKILL_DIRS = ["deep-research"];
|
|
1249
1203
|
var DEV_SKILL_DIRS = [];
|
|
1250
1204
|
var DEV_SKILL_DIRS_ECC = ["agent-introspection-debugging"];
|
|
1251
|
-
var MODIFIED_DEV_SKILL_DIRS = ["
|
|
1205
|
+
var MODIFIED_DEV_SKILL_DIRS = ["eval-harness"];
|
|
1252
1206
|
var MODIFIED_ECC_SKILL_DIRS = [...MODIFIED_COMMON_SKILL_DIRS, ...MODIFIED_DEV_SKILL_DIRS];
|
|
1253
1207
|
var UI_SKILL_DIRS = ["ui-visual-review"];
|
|
1254
1208
|
var UI_SKILL_DIRS_ECC = ["e2e-testing"];
|
|
@@ -1271,7 +1225,13 @@ function buildManifest(spec) {
|
|
|
1271
1225
|
});
|
|
1272
1226
|
m.push({
|
|
1273
1227
|
source: "CLAUDE.md",
|
|
1274
|
-
target:
|
|
1228
|
+
target: HARNESS_ANCHOR_FILE,
|
|
1229
|
+
type: "file",
|
|
1230
|
+
applies: all
|
|
1231
|
+
});
|
|
1232
|
+
m.push({
|
|
1233
|
+
source: "scripts/protect-branch.sh",
|
|
1234
|
+
target: ".uzys-agent-harness/protect-branch.sh",
|
|
1275
1235
|
type: "file",
|
|
1276
1236
|
applies: all
|
|
1277
1237
|
});
|
|
@@ -1501,8 +1461,10 @@ function residentCost(entries, root = resolveBundleRoot()) {
|
|
|
1501
1461
|
skillItems += 1;
|
|
1502
1462
|
}
|
|
1503
1463
|
}
|
|
1504
|
-
const
|
|
1505
|
-
const
|
|
1464
|
+
const harnessAnchor = fileTokens(join(root, "templates", "CLAUDE.md"));
|
|
1465
|
+
const projectScaffold = estimateTokens(renderFillScaffold().trim().length);
|
|
1466
|
+
const projectClaudeMd = harnessAnchor + projectScaffold;
|
|
1467
|
+
const claudeMdItems = (harnessAnchor > 0 ? 1 : 0) + (projectScaffold > 0 ? 1 : 0);
|
|
1506
1468
|
return {
|
|
1507
1469
|
rules,
|
|
1508
1470
|
projectClaudeMd,
|
|
@@ -1546,8 +1508,10 @@ function formatResidentCostLine(r, unmeasuredCount) {
|
|
|
1546
1508
|
var RESIDENT_ROWS = [
|
|
1547
1509
|
{ label: "rules", gap: 14, count: (r) => r.items.rules, tokens: (r) => r.rules },
|
|
1548
1510
|
{
|
|
1549
|
-
|
|
1550
|
-
|
|
1511
|
+
// 한 행에 두 파일(앵커 + 스캐폴드). 개수 열이 2 를 뱉어 그 사실을 드러낸다 — 라벨로
|
|
1512
|
+
// 하나만 이름 붙이면 v26.140.0 이전과 같은 거짓 라벨이 된다.
|
|
1513
|
+
label: "CLAUDE.md",
|
|
1514
|
+
gap: 11,
|
|
1551
1515
|
count: (r) => r.items.claudeMd,
|
|
1552
1516
|
tokens: (r) => r.projectClaudeMd
|
|
1553
1517
|
},
|
|
@@ -1599,6 +1563,11 @@ export {
|
|
|
1599
1563
|
assetCliSupport,
|
|
1600
1564
|
assetReachesCli,
|
|
1601
1565
|
filterApplicableAssets,
|
|
1566
|
+
HARNESS_ANCHOR_FILE,
|
|
1567
|
+
HARNESS_IMPORT_LINE,
|
|
1568
|
+
renderFillScaffold,
|
|
1569
|
+
upsertHarnessImport,
|
|
1570
|
+
stripHarnessImport,
|
|
1602
1571
|
CATEGORIES,
|
|
1603
1572
|
CATEGORY_TITLES,
|
|
1604
1573
|
buildManifest,
|
|
@@ -1610,4 +1579,4 @@ export {
|
|
|
1610
1579
|
formatResidentCostLine,
|
|
1611
1580
|
formatResidentCostBlock
|
|
1612
1581
|
};
|
|
1613
|
-
//# sourceMappingURL=chunk-
|
|
1582
|
+
//# sourceMappingURL=chunk-5RWSZT2J.js.map
|