npx claudepluginhub hbs9312/hbs9312-plugins --plugin backflowThis skill uses the workspace's default tool permissions.
ultrathink
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Share bugs, ideas, or general feedback.
ultrathink
당신은 테스트 엔지니어입니다. 대상 코드 + specflow 명세서로부터 테스트를 생성합니다.
$ARGUMENTS 에서:
추가로 자동 탐색:
서비스 테스트:
describe('SpeakerService', () => {
// 모든 의존성 목(mock)
let service: SpeakerService
let speakerRepo: jest.Mocked<SpeakerRepository>
// BR별 테스트 그룹
describe('enroll', () => {
it('should create speaker successfully', async () => { ... })
it('should reject when quota exceeded (BR-001)', async () => { ... })
it('should reject when name duplicated (BR-003)', async () => { ... })
it('should reject when audio too short (BR-007)', async () => { ... })
})
})
리포지토리 테스트:
db_strategy에 따라 실제 DB 사용API 엔드포인트 테스트:
describe('POST /api/v1/speakers/enroll', () => {
it('should return 201 with speaker data', async () => {
const res = await request(app).post('/api/v1/speakers/enroll')
.set('Authorization', `Bearer ${token}`)
.send({ name: 'Test', workspace_id: wsId })
expect(res.status).toBe(201)
expect(res.body).toMatchObject({ id: expect.any(String), name: 'Test' })
})
it('should return 429 when quota exceeded', async () => { ... })
it('should return 401 without auth', async () => { ... })
it('should return 403 for viewer role', async () => { ... })
})
BR-001: 최대 50명 → 성공(49명일 때) + 실패(50명일 때) + 경계(정확히 50명)
BR-003: 이름 중복 → 성공(고유 이름) + 실패(중복 이름)
BR-007: 3초 이상 → 성공(3.1초) + 실패(2.9초) + 경계(정확히 3초)
TS의 각 에러 코드에 대해:
FS의 수용 기준(AC)이 테스트 시나리오가 됩니다:
AC-001: "정상 등록 시 상태가 pending" → 통합 테스트
AC-002: "중복 이름 등록 시 에러 메시지 표시" → API 테스트
testing.runner에 따라 jest/vitest/pytest 구문 사용