springboot-verification — скилл для Claude Code
Скилл прогоняет Spring Boot-проект через сборку, анализ кода, тесты, проверки безопасности и ревью diff. Подходит перед PR и деплоем.
npx skills add affaan-m/ECC --skill springboot-verification -a claude-codeЧто делает springboot-verification
springboot-verification запускает последовательную проверку Spring Boot-сервиса. Он собирает проект через Maven или Gradle, выполняет SpotBugs, PMD и Checkstyle, затем запускает модульные тесты, интеграционные тесты с Testcontainers и отчёт JaCoCo с проверкой порога покрытия 80%+.
Скилл также проверяет зависимости через OWASP Dependency Check, ищет секреты в исходниках и истории Git, смотрит на отладочные логи, необработанные сообщения исключений и wildcard CORS. В конце он анализирует git diff и формирует отчёт с результатом по сборке, static analysis, тестам, безопасности и изменённым файлам.
Ставьте его, если нужен единый pre-PR или pre-deploy gate для Spring Boot. Для проекта без Maven или Gradle, JaCoCo, настроенных анализаторов либо Testcontainers часть шагов не сработает.
Какие задачи решает
- проверить Spring Boot-сервис перед pull request
- собрать Maven или Gradle-проект без запуска тестов
- найти дефекты через SpotBugs, PMD и Checkstyle
- сверить покрытие JaCoCo с порогом 80%+
- просканировать зависимости, исходники и историю Git на риски
Примеры запросов агенту
- Проверь этот Spring Boot-проект перед pull request и подготовь VERIFICATION REPORT.
- Запусти `mvn -T 4 test`, JaCoCo, SpotBugs и OWASP-проверку, затем перечисли проблемы.
- Проведи ревью `git diff` и скажи, готов ли проект к деплою.
Как установить springboot-verification
1Через Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill springboot-verification -a claude-code2Вручную: положить файлы
~/.claude/skills/springboot-verification/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/springboot-verification/
1Через Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill springboot-verification -a codex2Вручную: положить файлы
.agents/skills/springboot-verification/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill springboot-verification -a cursor2Вручную: положить файлы
.cursor/skills/springboot-verification/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install affaan-m/ECC springboot-verification2Вручную: положить файлы
.github/skills/springboot-verification/SKILL.md1Через Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill springboot-verification -a gemini-cli2Командой платформы
gemini skills install https://github.com/affaan-m/ECC --path skills/springboot-verificationВручную: положить файлы
.devin/skills/springboot-verification/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill springboot-verification -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
Из того же набора146
Весь набор →Похожие
Вопросы о springboot-verification
Как установить springboot-verification в Claude Code?
Выполните npx skills add affaan-m/ECC --skill springboot-verification -a claude-code. Файл скилла появится в ~/.claude/skills/springboot-verification/SKILL.md.
Что делает springboot-verification?
Скилл проверяет сборку, static analysis, модульные и интеграционные тесты, покрытие JaCoCo, зависимости, секреты и git diff, после чего выдаёт pass/fail-отчёт.
С какими платформами работает springboot-verification?
Скилл рассчитан на Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI и OpenCode. Для интеграционных проверок используются Testcontainers, а сборка поддерживает Maven или Gradle.
Исходный текст
SKILL.md · MIT
---
name: springboot-verification
description: Run the full Spring Boot verification loop — Maven or Gradle build, SpotBugs, PMD, and Checkstyle static analysis, unit and Testcontainers integration tests with JaCoCo coverage, OWASP dependency and secret scans, and diff review — producing a pass/fail readiness report. Use when preparing a Spring Boot pull request, validating coverage thresholds, or running pre-deploy verification.
metadata:
origin: ECC
---
# Spring Boot Verification Loop
Run before PRs, after major changes, and pre-deploy.
## When to Activate
- Before opening a pull request for a Spring Boot service
- After major refactoring or dependency upgrades
- Pre-deployment verification for staging or production
- Running full build → lint → test → security scan pipeline
- Validating test coverage meets thresholds
## Phase 1: Build
```bash
mvn -T 4 clean verify -DskipTests
# or
./gradlew clean assemble -x test
```
If build fails, stop and fix.
## Phase 2: Static Analysis
Maven (common plugins):
```bash
mvn -T 4 spotbugs:check pmd:check checkstyle:check
```
Gradle (if configured):
```bash
./gradlew checkstyleMain pmdMain spotbugsMain
```
## Phase 3: Tests + Coverage
```bash
mvn -T 4 test
mvn jacoco:report # verify 80%+ coverage
# or
./gradlew test jacocoTestReport
```
Report:
- Total tests, passed/failed
- Coverage % (lines/branches)
### Unit Tests
Test service logic in isolation with mocked dependencies:
```java
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock private UserRepository userRepository;
@InjectMocks private UserService userService;
@Test
void createUser_validInput_returnsUser() {
var dto = new CreateUserDto("Alice", "[email protected]");
var expected = new User(1L, "Alice", "[email protected]");
when(userRepository.save(any(User.class))).thenReturn(expected);
var result = userService.create(dto);
assertThat(result.name()).isEqualTo("Alice");
verify(userRepository).save(any(User.class));
}
@Test
void createUser_duplicateEmail_throwsException() {
var dto = new CreateUserDto("Alice", "[email protected]");
when(userRepository.existsByEmail(dto.email())).thenReturn(true);
assertThatThrownBy(() -> userService.create(dto))
.isInstanceOf(DuplicateEmailException.class);
}
}
```
### Integration Tests with Testcontainers
Test against a real database instead of H2:
```java
@SpringBootTest
@Testcontainers
class UserRepositoryIntegrationTest {
@Container
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine")
.withDatabaseName("testdb");
@DynamicPropertySource
static void configureProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", postgres::getJdbcUrl);
registry.add("spring.datasource.username", postgres::getUsername);
registry.add("spring.datasource.password", postgres::getPassword);
}
@Autowired private UserRepository userRepository;
@Test
void findByEmail_existingUser_returnsUser() {
userRepository.save(new User("Alice", "[email protected]"));
var found = userRepository.findByEmail("[email protected]");
assertThat(found).isPresent();
assertThat(found.get().getName()).isEqualTo("Alice");
}
}
```
### API Tests with MockMvc
Test controller layer with full Spring context:
```java
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired private MockMvc mockMvc;
@MockBean private UserService userService;
@Test
void createUser_validInput_returns201() throws Exception {
var user = new UserDto(1L, "Alice", "[email protected]");
when(userService.create(any())).thenReturn(user);
mockMvc.perform(post("/api/users")
.contentType(MediaType.APPLICATION_JSON)
.content("""
{"name": "Alice", "email": "[email protected]"}
"""))
.andExpect(status().isCreated())
.andExpect(jsonPath("$.name").value("Alice"));
}
@Test
void createUser_invalidEmail_returns400() throws Exception {
mockMvc.perform(post("/api/users")
.contentType(MediaType.APPLICATION_JSON)
.content("""
{"name": "Alice", "email": "not-an-email"}
"""))
.andExpect(status().isBadRequest());
}
}
```
## Phase 4: Security Scan
```bash
# Dependency CVEs
mvn org.owasp:dependency-check-maven:check
# or
./gradlew dependencyCheckAnalyze
# Secrets in source
grep -rn "password\s*=\s*\"" src/ --include="*.java" --include="*.yml" --include="*.properties"
grep -rn "sk-\|api_key\|secret" src/ --include="*.java" --include="*.yml"
# Secrets (git history)
git secrets --scan # if configured
```
### Common Security Findings
```
# Check for System.out.println (use logger instead)
grep -rn "System\.out\.print" src/main/ --include="*.java"
# Check for raw exception messages in responses
grep -rn "e\.getMessage()" src/main/ --include="*.java"
# Check for wildcard CORS
grep -rn "allowedOrigins.*\*" src/main/ --include="*.java"
```
## Phase 5: Lint/Format (optional gate)
```bash
mvn spotless:apply # if using Spotless plugin
./gradlew spotlessApply
```
## Phase 6: Diff Review
```bash
git diff --stat
git diff
```
Checklist:
- No debugging logs left (`System.out`, `log.debug` without guards)
- Meaningful errors and HTTP statuses
- Transactions and validation present where needed
- Config changes documented
## Output Template
```
VERIFICATION REPORT
===================
Build: [PASS/FAIL]
Static: [PASS/FAIL] (spotbugs/pmd/checkstyle)
Tests: [PASS/FAIL] (X/Y passed, Z% coverage)
Security: [PASS/FAIL] (CVE findings: N)
Diff: [X files changed]
Overall: [READY / NOT READY]
Issues to Fix:
1. ...
2. ...
```
## Continuous Mode
- Re-run phases on significant changes or every 30–60 minutes in long sessions
- Keep a short loop: `mvn -T 4 test` + spotbugs for quick feedback
**Remember**: Fast feedback beats late surprises. Keep the gate strict—treat warnings as defects in production systems.
© affaan-m · MIT · affaan-m/ECC