@uzysjung/agent-harness 26.170.0 → 26.172.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +5 -3
- package/README.md +5 -3
- package/dist/{chunk-MGFWOWF4.js → chunk-T2HBTG32.js} +30 -54
- package/dist/chunk-T2HBTG32.js.map +1 -0
- package/dist/index.js +417 -578
- package/dist/index.js.map +1 -1
- package/dist/trust-tier-drift.js +1 -1
- package/package.json +1 -1
- package/templates/CLAUDE.md +3 -1
- package/templates/agents/reviewer.md +10 -62
- package/templates/rules/htmx-fastapi-ui.md +36 -0
- package/templates/rules/htmx-fastify-ui.md +9 -0
- package/templates/rules/ship-checklist.md +2 -2
- package/templates/rules/test-policy.md +7 -4
- package/templates/skills/audit-harness-fit/references/apply.md +6 -1
- package/templates/skills/audit-harness-fit/references/verification.md +5 -0
- package/templates/skills/objective-brief/SKILL.md +3 -1
- package/templates/track-mcp-map.tsv +1 -1
- package/dist/chunk-MGFWOWF4.js.map +0 -1
package/dist/trust-tier-drift.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uzysjung/agent-harness",
|
|
3
|
-
"version": "26.
|
|
3
|
+
"version": "26.172.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": {
|
package/templates/CLAUDE.md
CHANGED
|
@@ -90,7 +90,9 @@ Report what changed, what is supported by evidence, and material remaining gaps.
|
|
|
90
90
|
Work autonomously through the authorized outcome, without seeking repeated
|
|
91
91
|
confirmation for routine progress. Keep readiness and authority distinct:
|
|
92
92
|
preparing or validating a change does not authorize applying it to shared
|
|
93
|
-
systems or persistent application data.
|
|
93
|
+
systems or persistent application data. An explicit user correction of a recorded
|
|
94
|
+
procedure governs at once; before dependent work continues, align active plans and
|
|
95
|
+
delegations, and record a standing change in its project-owned source.
|
|
94
96
|
|
|
95
97
|
Reuse approval that covers the action and target. Obtain explicit approval for
|
|
96
98
|
destructive or privileged actions, deployment, and shared-state writes when
|
|
@@ -14,68 +14,31 @@ context: fork
|
|
|
14
14
|
|
|
15
15
|
## Review Process
|
|
16
16
|
|
|
17
|
-
### Step 1:
|
|
17
|
+
### Step 1: 입력
|
|
18
18
|
|
|
19
19
|
**입력 = 사용자 씬과 그 완료 기준.** diff 는 그 씬의 범위에서 읽는다 — 씬을 이루는 변경분을 모아 한 번에 본다. 씬과 완료 기준을 받지 못했으면 판정 전에 요청자에게 먼저 묻는다.
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
- 변경된 파일, 기능, 의존성 파악
|
|
27
|
-
- 변경 주변 코드(import, 호출 사이트) 읽기
|
|
28
|
-
|
|
29
|
-
### Step 2: Five-Axis Review
|
|
30
|
-
|
|
31
|
-
#### Correctness (정확성)
|
|
32
|
-
- 로직이 의도대로 동작하는가?
|
|
33
|
-
- 엣지케이스 처리가 되어 있는가?
|
|
34
|
-
- 에러 핸들링이 적절한가?
|
|
35
|
-
- 기존 테스트가 통과하는가?
|
|
36
|
-
- 새 기능에 대한 테스트가 있는가?
|
|
37
|
-
|
|
38
|
-
#### Readability (가독성)
|
|
39
|
-
- 함수/변수 이름이 의도를 드러내는가?
|
|
40
|
-
- 함수·파일 길이, 중첩 깊이가 **이 저장소의 관례에 비해** 눈에 띄게 큰가? (절대 숫자가 아니라 주변 코드와 비교한다 — 관례를 따르는 코드에 리팩터를 요구하지 않는다)
|
|
41
|
-
- 불필요한 주석 없이 코드 자체가 설명적인가?
|
|
42
|
-
|
|
43
|
-
#### Architecture (아키텍처)
|
|
44
|
-
- 단일 책임 원칙을 따르는가?
|
|
45
|
-
- 불필요한 추상화가 없는가?
|
|
21
|
+
### Step 2: 판정 기준
|
|
22
|
+
|
|
23
|
+
**블로커는 둘뿐이다 — 필수 완료 기준의 미충족, 그리고 정확성 · 보안 · 데이터 유실 · 무결성 · 사용성에 대한 입증된 중대 위험.** 완료 기준마다 충족 여부를 구현자의 요약이 아니라 산출물과 실행 결과로 확인한다. 위험을 어디서 찾을지는 변경의 종류가 정한다. 그 밖의 개선은 블로커와 섞지 않고 HIGH 이하로 따로 적는다 — 스타일 선호는 LOW 행 기준대로 거른다. 코드가 아닌 산출물(문서 · 계획 · UI · QA)도 같은 기준으로 판정한다.
|
|
24
|
+
|
|
25
|
+
- 함수·파일 길이, 중첩 깊이는 **이 저장소의 관례에 비해** 눈에 띄게 큰지 본다 — 절대 숫자가 아니라 주변 코드와 비교하고, 관례를 따르는 코드에 리팩터를 요구하지 않는다.
|
|
46
26
|
- 경우마다 분기 · 가드 · 복구를 덧댄 곳이 있다면, 그 경우들이 아예 생기지 않는 더 단순한 구조가 있는가?
|
|
47
|
-
- 기존 패턴/컨벤션과 일치하는가?
|
|
48
|
-
- 의존성 방향이 올바른가?
|
|
49
|
-
- SPEC/PRD 범위 안에 있는가?
|
|
50
|
-
|
|
51
|
-
#### Security (보안)
|
|
52
|
-
- 하드코딩된 시크릿이 없는가?
|
|
53
|
-
- 사용자 입력이 검증되는가?
|
|
54
|
-
- SQL injection, XSS, CSRF 방어가 되어 있는가?
|
|
55
|
-
- 인증/인가 확인이 있는가?
|
|
56
|
-
- 에러 메시지가 민감 정보를 노출하지 않는가?
|
|
57
|
-
|
|
58
|
-
#### Performance (성능)
|
|
59
|
-
- N+1 쿼리가 없는가?
|
|
60
|
-
- 불필요한 re-render가 없는가?
|
|
61
|
-
- 캐싱이 필요한 곳에 적용되었는가?
|
|
62
|
-
- 번들 크기에 영향을 주는가?
|
|
63
27
|
|
|
64
28
|
### Step 3: Severity Classification
|
|
65
29
|
|
|
66
30
|
| Severity | 기준 | 행동 |
|
|
67
31
|
|----------|------|------|
|
|
68
|
-
| **CRITICAL** |
|
|
69
|
-
| **HIGH** |
|
|
70
|
-
| **MEDIUM** |
|
|
71
|
-
| **LOW** |
|
|
32
|
+
| **CRITICAL** | 블로커(Step 2) | 즉시 수정 필수. 이 이슈가 해결될 때까지 Review 게이트 통과 불가 |
|
|
33
|
+
| **HIGH** | 입증된 결함·위험이지만 블로커는 아니다 | 수정 권장. 합리적 사유 있으면 예외 가능 |
|
|
34
|
+
| **MEDIUM** | 개선 기회 | 제안. 현재 PR에서 수정하지 않아도 됨 |
|
|
35
|
+
| **LOW** | 스타일 · 선호 | 참고. 프로젝트 컨벤션 위반이 아니면 보고하지 않는다 |
|
|
72
36
|
|
|
73
37
|
### Step 4: Confidence Filtering
|
|
74
38
|
|
|
75
39
|
- 확신 80% 이상인 이슈만 보고한다.
|
|
76
40
|
- 변경되지 않은 코드의 이슈는 CRITICAL 보안 문제가 아니면 건너뛴다.
|
|
77
41
|
- 유사한 이슈는 통합한다 ("5개 함수에서 에러 핸들링 누락" — 5건이 아닌 1건).
|
|
78
|
-
- 스타일 선호도는 프로젝트 컨벤션에 위배되지 않으면 보고하지 않는다.
|
|
79
42
|
|
|
80
43
|
### Step 5: Output Format
|
|
81
44
|
|
|
@@ -96,11 +59,6 @@ File: path/to/file.ts:42
|
|
|
96
59
|
Issue: 설명
|
|
97
60
|
Fix: 해결 방향
|
|
98
61
|
|
|
99
|
-
[HIGH] Title
|
|
100
|
-
File: path/to/file.ts:78
|
|
101
|
-
Issue: 설명
|
|
102
|
-
Fix: 해결 방안
|
|
103
|
-
|
|
104
62
|
### Positive Observations
|
|
105
63
|
- [무엇이 잘 되었는지]
|
|
106
64
|
|
|
@@ -110,16 +68,6 @@ Fix: 해결 방안
|
|
|
110
68
|
- [ ] SPEC/PRD 범위 내
|
|
111
69
|
```
|
|
112
70
|
|
|
113
|
-
## Document / UI / QA Review Mode
|
|
114
|
-
|
|
115
|
-
코드가 아닌 산출물을 리뷰할 때:
|
|
116
|
-
|
|
117
|
-
**문서/제안서**: 논리 흐름, 설득력, 요청 범위 커버리지, 실행 가능성
|
|
118
|
-
**UI**: 시각 디자인 일관성, 접근성, 반응형, 사용자 경험
|
|
119
|
-
**QA**: 테스트 커버리지, 엣지케이스, 회귀 테스트, E2E 시나리오
|
|
120
|
-
|
|
121
|
-
산출물 유형에 따라 적절한 기준을 자동 적용한다.
|
|
122
|
-
|
|
123
71
|
## Anti-Patterns (하지 말 것)
|
|
124
72
|
|
|
125
73
|
- 코드를 쓰지 않는다 — Fix 는 방향만 적고, 수정은 구현 에이전트가 한다.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.html"
|
|
4
|
+
- "**/*.jinja"
|
|
5
|
+
- "**/*.jinja2"
|
|
6
|
+
- "**/*.j2"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# htmx UI — FastAPI 템플릿
|
|
10
|
+
|
|
11
|
+
FastAPI 가 렌더하는 htmx 화면(Jinja·HTML)은 Tailwind v4 + daisyUI 클래스(`btn` · `card` · `bg-base-100`)로 만든다. 다른 CSS 체계나 Tailwind v3 이면 바꾸기 전에 묻는다. 없으면 첫 UI 작업 때 `https://daisyui.com/docs/install/` 대로 설치한다.
|
|
12
|
+
|
|
13
|
+
`@shadcn/lint` 는 템플릿을 못 읽으니 ast-grep(`pip install ast-grep-cli`)으로 검사한다. 없으면 아래 두 파일을 프로젝트 루트에 만들고 lint 명령에 `ast-grep scan` 을 더한다. UI 를 바꾼 뒤 돌려 보고된 줄을 고친다 — 오타·없는 클래스는 못 잡는다.
|
|
14
|
+
|
|
15
|
+
`sgconfig.yml`:
|
|
16
|
+
|
|
17
|
+
```yaml
|
|
18
|
+
ruleDirs: [rules]
|
|
19
|
+
languageGlobs: { html: ["*.jinja", "*.jinja2", "*.j2"] }
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`rules/tailwind.yml`:
|
|
23
|
+
|
|
24
|
+
```yaml
|
|
25
|
+
id: tailwind-tokens
|
|
26
|
+
language: html
|
|
27
|
+
severity: error
|
|
28
|
+
message: 원색 팔레트·임의 값·인라인 style 대신 daisyUI 테마 색·스케일 값·클래스를 쓴다
|
|
29
|
+
rule:
|
|
30
|
+
any:
|
|
31
|
+
- kind: attribute_value
|
|
32
|
+
regex: (^|[^\w-])[a-z-]+-(slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-(50|[1-9]00|950)(/\d+)?([^\w-]|$)
|
|
33
|
+
inside: &class { kind: attribute, has: { kind: attribute_name, regex: ^class$ }, stopBy: end }
|
|
34
|
+
- { kind: attribute_value, regex: '-\[[^\]]+\]', inside: *class }
|
|
35
|
+
- { kind: attribute, has: { kind: attribute_name, regex: ^style$ } }
|
|
36
|
+
```
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.tsx"
|
|
4
|
+
- "**/*.jsx"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# htmx UI — Fastify 서버 JSX
|
|
8
|
+
|
|
9
|
+
Fastify 가 렌더하는 htmx 화면은 서버 JSX 템플릿(`.tsx`, 예: `@kitajs/html`)으로 쓰고 Tailwind v4 + daisyUI 클래스(`btn` · `card` · `bg-base-100`)로 만든다 — 브라우저 React 가 아니라 shadcn/ui 는 안 쓴다. 다른 템플릿 엔진·CSS 체계나 Tailwind v3 이면 바꾸기 전에 묻는다. 없으면 첫 UI 작업 때 `https://daisyui.com/docs/install/` 대로 설치하고, 린터 `@shadcn/lint` 는 `https://github.com/shadcn-ui/lint/blob/main/SETUP.md` 대로 등록한 뒤 켤 규칙을 사용자와 정한다(`class` 속성도 검사하고 daisyUI 클래스를 안다). UI 를 바꾼 뒤 lint 를 돌려 고친다.
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
무엇으로 검증할지는 이 저장소가 정한다. **어느 정도까지**는 Testing 룰이, 그 결과가 **언제** 있어야 하는지는 이 룰이 정한다.
|
|
4
4
|
|
|
5
|
-
- **검증의 리듬**: 구현 중에는 변경 부분의 빠른 검사만 한다. 사용자 씬의 수정분이 모였을 때가 독립 검토를 **판단하는** 시점이다 — 걸지는 아래 머지 전 기준으로 정한다. 수정이 끝난 뒤 통합 테스트 · 빌드 · 실제 사용자 흐름을 검증한다. 작은 수정마다 전체 검증을 반복하지 않고, 재검사는 영향받은 부분만 한다.
|
|
5
|
+
- **검증의 리듬**: 구현 중에는 변경 부분의 빠른 검사만 한다. 사용자 씬의 수정분이 모였을 때가 독립 검토를 **판단하는** 시점이다 — 걸지는 아래 머지 전 기준으로 정한다. 수정이 끝난 뒤 통합 테스트 · 빌드 · 실제 사용자 흐름을 검증한다. 작은 수정마다 전체 검증을 반복하지 않고, 재검사는 영향받은 부분만 한다. 계획·위임문에 적었다는 것만으로는 검증을 넓히지 않는다.
|
|
6
6
|
- **머지 전 독립 검증**은 핵심 사용자 기능 · 되돌리기 어려운 변경 · 돈·권한처럼 틀리면 큰 사고인 것에만 건다. UX 의 큰 변경은 사용자 페르소나 리뷰(선택). 그 밖(테스트 하네스 · 문서 · 리팩터 · 문구 · UI · 리뷰어 처방)은 리그레션 테스트로 들어온다. 독립 검증의 판정은 만든 쪽이 아니라 검증자가 요구사항·변경분·결과를 직접 확인하고 내린다. 어느 쪽이든 변경 위험에 맞는 검증을 **실행하고 결과를 확인한다** — high risk 는 더 많은 증거를 갖고 들어오고, **실행하지 않은 상태는 통과가 아니다.** 필수 보안 · 데이터 보호 검사는 유지한다.
|
|
7
7
|
- **배포**: 배포 전에 풀 테스트 · E2E 를 거친다(Testing 룰의 CI/CD 일정 몫). 독립 검증은 **단계가 아니라** 머지 전과 같은 기준(영향 · 불확실성 · 복구 비용 · 이미 있는 증거)으로 판단한다 — 배포라는 이유로 다시 걸지 않는다. 머지 전에 검증된 것과 **같은 artifact** 를 내보내고, 배포 뒤 실제 환경에서 smoke · health · 핵심 기능을 확인한다.
|
|
8
|
-
- **머지·게시 경로가
|
|
8
|
+
- **머지·게시 경로가 위 기준대로 고른 검증과 저장소의 필수 체크 통과에 의존해야 한다.** 별개 경로면 아무도 우회하려 하지 않았는데 red 가 그대로 나간다. 의존하지 않는 상태를 발견하면 경로를 고치기 전에 먼저 보고한다.
|
|
9
9
|
- 변경분이 사용자에게 닿는 경로가 여럿이면 **경로마다 실행 증거를 따로** 확보한다. 한 경로의 증거를 다른 경로에 전용하지 않는다.
|
|
10
10
|
- 이 저장소가 정의한 **보안·취약점 검사도** 실행하고 결과를 확인한다 — 테스트만 돌리고 나가는 것이 기본값이 되기 쉽다.
|
|
11
11
|
- 추적 문서가 코드와 어긋난 채로 나가지 않게 한다. **이 하네스가 설치해 둔 검사기**를 쓴다(스스로는 존재를 알 수 없으므로 여기 적는다): `bash .uzys-agent-harness/spec-drift-check.sh ship` — **exit 2 면 차단**(동기화 후 재시도), 1 은 경고, 0 이 통과. 백로그는 `ship-gate:ignore` 구간으로 감싸 면제한다(표식이 안 닫히면 면제를 통째로 무시한다).
|
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
**How far** to verify scales with the risk of the change; **when** those results must exist
|
|
4
4
|
belongs to the Delivery rule.
|
|
5
5
|
|
|
6
|
-
- An ordinary change gets
|
|
7
|
-
|
|
8
|
-
proportion to what it touches and what
|
|
6
|
+
- An ordinary change gets static checks and regression across the affected scope — not the whole
|
|
7
|
+
suite merely because the repository's CI runs it; independent verification only where the
|
|
8
|
+
Delivery rule requires it. A high-risk one widens that in proportion to what it touches and what
|
|
9
|
+
its failure would cost.
|
|
9
10
|
- Preserve required outcomes with the least burdensome reliable protection.
|
|
10
11
|
Prefer fixing the cause and reusing or improving existing mechanisms within scope;
|
|
11
12
|
no new guard is needed when those suffice. Judge safeguards by credible risk,
|
|
@@ -29,4 +30,6 @@ belongs to the Delivery rule.
|
|
|
29
30
|
adding indiscriminate retries. Correct or consolidate tests when their expectations are
|
|
30
31
|
wrong, obsolete, or redundant; preserve coverage of the accepted contract and follow project
|
|
31
32
|
policy for changes to mandatory gates.
|
|
32
|
-
- If the affected scope cannot be established confidently,
|
|
33
|
+
- If the affected scope cannot be established confidently, widen along what the change shares
|
|
34
|
+
(callers, data, configuration), not to the whole suite by default. After an environment or CI
|
|
35
|
+
fix, rerun what failed and what the fix could affect.
|
|
@@ -38,7 +38,12 @@ markers/imports. Modify the canonical editable source within authorization. Pres
|
|
|
38
38
|
unrelated text, local customizations, headings, language, and formatting. Synchronize
|
|
39
39
|
mirrors only where ownership, synchronization contract, and scope are established.
|
|
40
40
|
When an installer would overwrite a local fix, report the source/integration change
|
|
41
|
-
needed; generator changes belong to a separately authorized task.
|
|
41
|
+
needed; generator changes belong to a separately authorized task. When re-applying
|
|
42
|
+
edits saved in an update backup, move them to a project-owned place that update leaves
|
|
43
|
+
alone and that gives the same behavior — such as the project's own part of CLAUDE.md /
|
|
44
|
+
AGENTS.md outside the harness block for guidance — and confirm the agent loads or runs it.
|
|
45
|
+
If no such place exists for that asset, report the limit. Not back into the harness-owned
|
|
46
|
+
file: the next update replaces it again and keeps the edit only as a backup.
|
|
42
47
|
|
|
43
48
|
Keep removed content recoverable. Clean tracked content can use existing history;
|
|
44
49
|
dirty or untracked content needs an authorized snapshot. Store snapshots outside
|
|
@@ -72,6 +72,11 @@ Explicit project policy can bind even without CI enforcement. Preserve those gat
|
|
|
72
72
|
route disproportionate mandatory requirements to a separate policy decision. Retain
|
|
73
73
|
an unclear gate pending clarification while continuing work independent of it.
|
|
74
74
|
Generic requests to "think again" are assessed for evidence value, not presumed gates.
|
|
75
|
+
Check project gates against the stage schedule: a merge gate that waits for every CI
|
|
76
|
+
check where CI runs the whole suite, or an evidence rule that voids every result when
|
|
77
|
+
the tree changes, turns each change into a full run. Report that conflict as a policy
|
|
78
|
+
decision without silently adding full-suite gates, standing a local run in for a required
|
|
79
|
+
remote check, or weakening protections.
|
|
75
80
|
Document-only effects normally need document checks unless policy or dependencies
|
|
76
81
|
require more. State checks not run and the resulting limits.
|
|
77
82
|
|
|
@@ -192,7 +192,9 @@ question nobody will answer.
|
|
|
192
192
|
**success_criteria** — prefer conditions someone else can check by running something or looking at
|
|
193
193
|
something. Counts and numbers inside the criteria get compared literally, so verify them against
|
|
194
194
|
reality before writing them; a criterion that says "all 12 cases pass" when there are 11 cases
|
|
195
|
-
makes the worker either invent a case or report failure.
|
|
195
|
+
makes the worker either invent a case or report failure. Verification items follow the
|
|
196
|
+
project's policy for that stage; add checks for the task's risk or the user's request, not
|
|
197
|
+
broader gates.
|
|
196
198
|
|
|
197
199
|
**verification / communication** — the `[N줄]` caps are meant to be replaced with a real number.
|
|
198
200
|
Leaving the placeholder in tells the worker nothing, and an uncapped handoff drifts into a report
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
# 신규 MCP 추가 시: 이 파일에 1줄 추가만 하면 setup-harness.sh 수정 불필요.
|
|
17
17
|
# 주석 (#) 라인은 무시.
|
|
18
18
|
context7 * npx ["-y", "@upstash/context7-mcp@latest"]
|
|
19
|
-
railway-mcp-server csr-supabase|csr-fastify|csr-fastapi|ssr-htmx|full url {"url":"https://mcp.railway.com"}
|
|
19
|
+
railway-mcp-server csr-supabase|csr-fastify|csr-fastapi|ssr-htmx|ssr-htmx-fastify|full url {"url":"https://mcp.railway.com"}
|
|
20
20
|
supabase csr-supabase|full url {"url":"https://mcp.supabase.com/mcp"}
|
|
21
21
|
chrome-devtools csr-*|ssr-*|full npx ["-y", "chrome-devtools-mcp@latest", "--no-usage-statistics"]
|
|
22
22
|
vercel - url {"url":"https://mcp.vercel.com"}
|