Software Development with Claude Code
Dani Zysman
AI Curriculum Manager @ DataCamp

Hooks:
.claude/settings.jsonUse /hooks to list what's active
music-analytics-api/
app.py
routes.py
test_routes.py
CLAUDE.md
.claude/
agents/
skills/
settings.json # <- Hook configuration

PreToolUse: fires before the tool runs → Use it to inspect or block dangerous operations
PostToolUse: fires after the tool completes → Use it to run tests, lint checks, or log results
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "cd $CLAUDE_PROJECT_DIR && python -m pytest --tb=short -q"
}
]
}
]
}
}
def pytest_terminal_summary(terminalreporter, exitstatus, config):
passed = len(terminalreporter.stats.get('passed', []))
failed = len(terminalreporter.stats.get('failed', []))
if failed:
title = "pytest FAILED"
message = f"{failed} failed {passed} passed"
else:
title = "pytest PASSED"
message = f"All {passed} tests passed!"
with open("/tmp/pytest_results.log", "a") as f:
f.write(f"{title}: {message}\n")
[23:07:35] pytest FAILED: ❌; 2 failed, 15 passed
[23:07:38] pytest PASSED: ✅ All 17 tests passed!
[23:08:09] pytest PASSED: ✅ All 17 tests passed!
[23:08:12] pytest PASSED: ✅ All 17 tests passed!

| Feature | Invoke | List | Config Path |
|---|---|---|---|
| Agents | @agent-name |
/agents |
.claude/agents/name.md |
| Skills | /skill-name |
/skills |
.claude/skills/name/SKILL.md |
| Hooks | (automatic) | /hooks |
.claude/settings.json |
Software Development with Claude Code