Help us improve
Share bugs, ideas, or general feedback.
From my-harness
작업이 끝난 뒤 협업팀과 공유하기 위한 API 변경 요약 문서를 생성하는 스킬. 지정된 범위(또는 최근 작업 커밋)에서 추가/수정/삭제된 API 엔드포인트를 자동 파싱하여 신규/수정/삭제로 분류한 Markdown을 만든다. Express, NestJS, FastAPI, Django REST, Flask 등 자동 감지. API 변경 공유, 팀 공유, 릴리즈 노트, PR 설명, API changelog 요청 시 이 스킬을 사용할 것.
npx claudepluginhub pokuding/my-harness --plugin my-harnessHow this skill is triggered — by the user, by Claude, or both
Slash command
/my-harness:api-summaryThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
코드 리뷰 반영, 새 기능 구현, 리팩토링 등 **어떤 종류의 작업이든 끝난 뒤** 그 작업으로 발생한 API 변경을 협업팀에 공유할 문서로 정리한다.
Guides technical evaluation of code review feedback: read fully, restate for understanding, verify against codebase, respond with reasoning or pushback before implementing.
Share bugs, ideas, or general feedback.
코드 리뷰 반영, 새 기능 구현, 리팩토링 등 어떤 종류의 작업이든 끝난 뒤 그 작업으로 발생한 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" 등)