소스 정보
- 저장소
- lidge-jun/cli-jaw-skills
- 최근 소스 활동
- 2026년 6월 4일 07:27
- 감지된 SKILL.md 언어
- 영어
- 스타
- 5
- 포크
- 1
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/lidge-jun/cli-jaw-skills --skill tdd명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
PDF 읽기·생성·편집·리뷰. reportlab/pdfplumber/pypdf + Korean CJK font handling, TOC generation, purpose-driven workflow, visual verification, and ELI5 patterns.
SVG diagrams, charts, and interactive visualizations for chat UI
Convert HTML slides into native PowerPoint elements. Triggers: HTML to PPTX, convert HTML slides, html2pptx.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | tdd |
| description | Use when implementing any feature or bugfix, before writing implementation code |
Write the test first. Watch it fail. Write minimal code to pass.
If you didn't watch the test fail, you don't know if it tests the right thing.
Exceptions (confirm with user): throwaway prototypes, generated code, configuration files.
Write one minimal test for one behavior.
test('retries failed operations 3 times', async () => {
let attempts = 0;
const operation = () => {
attempts++;
if (attempts < 3) throw new Error('fail');
return 'success';
};
const result = await retryOperation(operation);
expect(result).toBe('success');
expect(attempts).toBe(3);
});
Requirements:
Run the test. Confirm it fails (not errors) for the expected reason — the feature is missing, not a typo.
Test passes immediately? You're testing existing behavior. Fix the test. Test errors? Fix the error, re-run until it fails correctly.
Write the simplest code that passes.
async function retryOperation<T>(fn: () => Promise<T>): Promise<T> {
for (let i = 0; i < 3; i++) {
try {
return await fn();
} catch (e) {
if (i === 2) throw e;
}
}
throw new Error('unreachable');
}
No extra features, no "improvements" beyond the test.
Run the test. Confirm it passes with clean output (no errors or warnings). Confirm other tests still pass.
Test fails? Fix code, not test. Other tests break? Fix now.
After green only: remove duplication, improve names, extract helpers.
Keep tests green. Add no new behavior. Then write the next failing test.
| Quality | Good | Bad |
|---|---|---|
| Minimal | One thing. "and" in name → split it. | test('validates email and domain and whitespace') |
| Clear | Name describes behavior | test('test1') |
| Shows intent | Demonstrates desired API | Obscures what code should do |
Bug: Empty email accepted
RED
test('rejects empty email', async () => {
const result = await submitForm({ email: '' });
expect(result.error).toBe('Email required');
});
→ Run: FAIL: expected 'Email required', got undefined ✓
GREEN
function submitForm(data: FormData) {
if (!data.email?.trim()) return { error: 'Email required' };
// ...
}
→ Run: PASS ✓
REFACTOR — Extract validation for multiple fields if needed.
Write production code only after a failing test exists for it.
If code was written before its test: delete it and restart with TDD. Keeping pre-written code as "reference" leads to testing-after — you test what you built rather than what's required.
| Excuse | Reality |
|---|---|
| "Too simple to test" | Simple code breaks. The test takes 30 seconds. |
| "I'll test after" | Tests passing immediately prove nothing. |
| "Already manually tested" | Ad-hoc ≠ systematic. No record, can't re-run. |
| "Deleting X hours is wasteful" | Sunk cost. Unverified code is technical debt. |
| "Need to explore first" | Explore freely, then discard and start with TDD. |
| "Hard to test" | Hard to test = hard to use. Simplify the design. |
| Problem | Solution |
|---|---|
| Don't know how to test | Write the desired API first. Write the assertion first. Ask user. |
| Test too complicated | Design too complicated. Simplify the interface. |
| Must mock everything | Code too coupled. Use dependency injection. |
| Test setup huge | Extract helpers. Still complex → simplify design. |
Bug found → write a failing test reproducing it → follow TDD cycle. The test proves the fix and prevents regression.
When adding mocks or test utilities, read @testing-anti-patterns.md to avoid:
When AI generates implementation code, the test suite doubles as an evaluation harness.
Measures probability that at least one of k generated samples passes all tests.
| Metric | Meaning |
|---|---|
| pass@1 | First attempt passes all tests |
| pass@5 | At least one of 5 attempts passes |
| pass@10 | At least one of 10 attempts passes |
Workflow:
# Run eval suite against a candidate
npm test -- --testPathPattern="eval/" --bail
# Score: count passing candidates out of k
{
"coverageThreshold": {
"global": { "branches": 80, "functions": 80, "lines": 80, "statements": 80 }
}
}
npx vitest run --coverage # Vitest
npm test -- --coverage # Jest
pytest --cov --cov-report=term # pytest
Review coverage by risk priority: auth, money, mutations, uploads, error paths.
Before marking work complete: