From my-harness
작업이 끝난 뒤 협업팀과 공유하기 위한 API 변경 요약 문서를 생성하는 스킬. 지정된 범위(또는 최근 작업 커밋)에서 추가/수정/삭제된 API 엔드포인트를 자동 파싱하여 신규/수정/삭제로 분류한 Markdown을 만든다. Express, NestJS, FastAPI, Django REST, Flask 등 자동 감지. API 변경 공유, 팀 공유, 릴리즈 노트, PR 설명, API changelog 요청 시 이 스킬을 사용할 것.
npx claudepluginhub pokuding/my-harness --plugin my-harnessThis skill uses the workspace's default tool permissions.
코드 리뷰 반영, 새 기능 구현, 리팩토링 등 **어떤 종류의 작업이든 끝난 뒤** 그 작업으로 발생한 API 변경을 협업팀에 공유할 문서로 정리한다.
Generates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
코드 리뷰 반영, 새 기능 구현, 리팩토링 등 어떤 종류의 작업이든 끝난 뒤 그 작업으로 발생한 API 변경을 협업팀에 공유할 문서로 정리한다.
사용 맥락 (독립 스킬, 특정 워크플로우에 종속되지 않음):
원하는 작업이 끝난 어느 시점에서나 독립적으로 실행할 수 있다. 특정 스킬 실행 직후에만 쓰는 것이 아니다.
/api-summary # 최근 변경 범위 자동 탐지
/api-summary --since <commit> # 특정 커밋 이후
/api-summary --range main..HEAD # diff 범위 지정
/api-summary --files src/api/*.ts # 특정 파일만
/api-summary --plan-execute <execute.json> # plan-execute 결과 기반
/api-summary --format md|json # 출력 형식 (기본: md)
다음 우선순위로 변경 범위를 정한다:
--since/--range/--files 플래그 → 명시적 범위--plan-execute → 해당 실행의 files_changed 합집합을 범위로.harness/api-summaries/에 이전 요약 있으면 → 해당 이후 커밋 범위.harness/reviews/ 최근 리뷰 이후 범위 (fallback)git log --since="7 days ago" 범위범위가 결정되면 사용자에게 확인:
변경 범위: main..HEAD (12 커밋, 23 파일)
API 관련 파일 추정: 5개
- src/api/orders.ts
- src/api/payments.ts
- src/routes/index.ts
- ...
진행할까요? [Y/n]
레포를 훑어 API 프레임워크를 식별한다:
| 시그니처 | 프레임워크 |
|---|---|
package.json에 express | Express |
package.json에 @nestjs/core | NestJS |
package.json에 fastify | Fastify |
package.json에 hono, next App Router route.ts | Hono / Next.js |
requirements.txt/pyproject.toml에 fastapi | FastAPI |
requirements.txt에 djangorestframework | Django REST |
requirements.txt에 flask | Flask |
go.mod에 gin-gonic/gin, labstack/echo | Gin / Echo |
*.yaml/*.json OpenAPI 스키마 | OpenAPI spec |
여러 개 감지되면 모두 처리 (모노레포 대응). 하나도 못 찾으면 사용자에게 프레임워크 지정 요청.
변경 전(base)과 변경 후(head) 각각에서 엔드포인트 목록을 추출한다.
프레임워크별 파싱 패턴:
router.get|post|put|patch|delete('/path', handler)
app.METHOD('/path', ...)
.parse(req.body) 근처 스키마 식별@Get('/path'), @Post('/path'), @Controller('/base')
@Body() dto: CreateOrderDto → DTO 필드 추출)@ApiOperation, @ApiResponse 데코레이터 활용@app.get("/path"), @router.post("/path")
urls.py의 path() 패턴@action 데코레이터@app.route('/path', methods=['GET'])
paths.*.* 직접 파싱각 엔드포인트에서 추출할 정보:
method (GET/POST/...)path (정규화: /api/v1/docs)description (주석/데코레이터/docstring)request.params (path params)request.query (쿼리 파라미터)request.body (요청 바디 스키마)request.headers (요구되는 커스텀 헤더)response (응답 스키마 / 상태 코드)file (정의 위치)base와 head의 엔드포인트 집합을 비교:
method + path가 있으나 내용이 다름
path 변경 감지:
"수정" 분류된 각 엔드포인트에 대해 무엇이 변경됐는지 구체화:
커밋 메시지를 참고하여 변경 의도 추정 (단, 단정하지 않고 "추정"으로 표기).
출력 파일: .harness/api-summaries/{YYYYMMDD_HHmmss}-summary.md
# API 스펙 변경 요약
생성일: YYYY-MM-DD
범위: {commit range 또는 plan-execute 파일}
감지 프레임워크: NestJS, FastAPI
---
## 신규 생성
### POST /api/v1/orders
결제 대기 상태의 주문을 생성한다.
- **요청 방법**
- Body: `CreateOrderDto`
- `items: OrderItem[]` (필수) — 상품 목록
- `shippingAddress: string` (필수)
- `couponCode?: string` (선택)
- Headers: `Authorization: Bearer <token>` (필수)
- **응답 값 설명**
- `200 OK`: `{ orderId: string, status: 'pending_payment', totalAmount: number }`
- `400 Bad Request`: 재고 부족 또는 검증 실패
- `401 Unauthorized`: 인증 누락
- **구현**: [src/api/orders.ts:34](src/api/orders.ts#L34)
### GET /api/v1/orders/:id
... (동일 구조)
---
## 수정 사항
### GET /api/v1/docs
문서를 불러오는 api
- **변경 내용**: 쿼리 파라미터 형식 변경 (`ids=1,2,3` → `id=1&id=2&id=3`)
- **요청 방법**
- Query: `id: number[]` (중복 허용, 기존 `ids: string` 단일값)
- **응답 값 설명** (변경 없음)
- `200 OK`: `Doc[]`
- **구현**: [src/api/docs.ts:12](src/api/docs.ts#L12)
- **호환성**: Breaking — 기존 클라이언트 `ids=...` 사용 불가
- **추정 사유** (커밋 `abc1234`): "query param을 표준 배열 형식으로 통일"
---
## 삭제 사항
### DELETE /api/v1/legacy/sync
과거 동기화 엔드포인트
- **삭제 사유** (추정): legacy 경로 정리, 새 엔드포인트 `/api/v2/sync`로 대체됨
- **마지막 구현 위치**: src/api/legacy.ts (삭제됨)
- **영향**: 외부 클라이언트 사용 여부 확인 필요
---
## 요약
| 구분 | 건수 |
|------|------|
| 신규 | 3 |
| 수정 | 2 |
| 삭제 | 1 |
| **합계** | 6 |
**Breaking changes**: 1건 (GET /api/v1/docs 쿼리 형식 변경)
## 메타
- 분석 범위: `<base_sha>..<head_sha>`
- 커밋 수: 12
- 파싱된 엔드포인트: base 37개, head 39개
--format json).harness/api-summaries/{ts}-summary.json:
{
"metadata": {
"date": "YYYY-MM-DDTHH:mm:ss",
"range": "main..HEAD",
"frameworks": ["NestJS", "FastAPI"],
"summary": { "added": 3, "modified": 2, "removed": 1 },
"breaking_changes": 1
},
"added": [
{
"method": "POST",
"path": "/api/v1/orders",
"description": "결제 대기 상태의 주문을 생성",
"request": { "body": {...}, "headers": {...} },
"response": { "200": {...}, "400": {...} },
"file": "src/api/orders.ts",
"line": 34
}
],
"modified": [
{
"method": "GET",
"path": "/api/v1/docs",
"changes": ["query_param_format_changed"],
"breaking": true,
"before": {...},
"after": {...},
"suspected_reason": "query param 표준화",
"commit": "abc1234"
}
],
"removed": [...]
}
요약 파일 경로와 활용 힌트를 표시한다. 이 스킬은 체인의 일부가 아니라 공유 목적의 독립 산출물을 만드는 스킬이다. 따라서 다음 단계를 강제하지 않는다.
저장: .harness/api-summaries/YYYYMMDD_HHmmss-summary.md
요약 통계:
- 신규 3건 / 수정 2건 / 삭제 1건
- Breaking change: 1건
이 문서는 다음 용도로 바로 활용할 수 있습니다:
- PR 설명: 내용 복사 또는 파일 링크
- Slack/Jira 공유: Markdown 블록 그대로 붙여넣기
- 릴리즈 노트: `### API 변경` 섹션으로 편입
- 외부 소비자 공지: breaking change 항목만 발췌
Breaking change가 있으면 상단에 명시적 경고를 한 번 더 표시한다.
/api/ prefix 변형 통일.harness/api-summary.json (선택):
{
"api_path_prefix": "/api",
"ignore_paths": ["/api/internal/*", "/api/debug/*"],
"include_private_endpoints": false,
"framework_override": null
}
api_path_prefix: 이 prefix로 시작하는 경로만 API로 간주ignore_paths: 요약에서 제외할 경로 globinclude_private_endpoints: 내부 전용 경로 포함 여부framework_override: 자동 감지 대신 고정 ("express", "nestjs" 등)