[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DAK360MFSSWP226J1MHP6R":3,"skill-same:01M6DAK360MFSSWP226J1MHP6R":63},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":37,"linkOnly":38,"markdownContent":39,"markdownBody":40,"frontMatter":41,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":14,"repositoryHtmlUrl":46,"repositoryHomepageUrl":6,"ownerHtmlUrl":47,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":48,"install":49,"resources":62},"01M6DAK360MFSSWP226J1MHP6R","springboot-verification",null,"Verification loop for Spring Boot projects: build, static analysis, tests with coverage, security scans, and diff review before release or PR.","Prekzursil\u002Fagent-skills-toolchain","Prekzursil","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F54636077?v=4","01M6DACZ1PCQHD99SCR1YXG28B","Andrei Mihai Visalon","01M6DACZ670WZF535V3WYYSS4Z",0,"MIT","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Flibrary\u002Fskills\u002Fspringboot-verification\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],"verification","springboot verification","loop","tests","build","diff","coverage","spring","projects","verification loop","review","analysis","spring boot","release","boot","pr","static analysis","security","2026-11-10 10:12:30",false,"---\nname: springboot-verification\ndescription: \"Verification loop for Spring Boot projects: build, static analysis, tests with coverage, security scans, and diff review before release or PR.\"\norigin: ECC\n---\n\n# Spring Boot Verification Loop\n\nRun before PRs, after major changes, and pre-deploy.\n\n## When to Activate\n\n- Before opening a pull request for a Spring Boot service\n- After major refactoring or dependency upgrades\n- Pre-deployment verification for staging or production\n- Running full build → lint → test → security scan pipeline\n- Validating test coverage meets thresholds\n\n## Phase 1: Build\n\n```bash\nmvn -T 4 clean verify -DskipTests\n# or\n.\u002Fgradlew clean assemble -x test\n```\n\nIf build fails, stop and fix.\n\n## Phase 2: Static Analysis\n\nMaven (common plugins):\n```bash\nmvn -T 4 spotbugs:check pmd:check checkstyle:check\n```\n\nGradle (if configured):\n```bash\n.\u002Fgradlew checkstyleMain pmdMain spotbugsMain\n```\n\n## Phase 3: Tests + Coverage\n\n```bash\nmvn -T 4 test\nmvn jacoco:report   # verify 80%+ coverage\n# or\n.\u002Fgradlew test jacocoTestReport\n```\n\nReport:\n- Total tests, passed\u002Ffailed\n- Coverage % (lines\u002Fbranches)\n\n### Unit Tests\n\nTest service logic in isolation with mocked dependencies:\n\n```java\n@ExtendWith(MockitoExtension.class)\nclass UserServiceTest {\n\n  @Mock private UserRepository userRepository;\n  @InjectMocks private UserService userService;\n\n  @Test\n  void createUser_validInput_returnsUser() {\n    var dto = new CreateUserDto(\"Alice\", \"alice@example.com\");\n    var expected = new User(1L, \"Alice\", \"alice@example.com\");\n    when(userRepository.save(any(User.class))).thenReturn(expected);\n\n    var result = userService.create(dto);\n\n    assertThat(result.name()).isEqualTo(\"Alice\");\n    verify(userRepository).save(any(User.class));\n  }\n\n  @Test\n  void createUser_duplicateEmail_throwsException() {\n    var dto = new CreateUserDto(\"Alice\", \"existing@example.com\");\n    when(userRepository.existsByEmail(dto.email())).thenReturn(true);\n\n    assertThatThrownBy(() -> userService.create(dto))\n        .isInstanceOf(DuplicateEmailException.class);\n  }\n}\n```\n\n### Integration Tests with Testcontainers\n\nTest against a real database instead of H2:\n\n```java\n@SpringBootTest\n@Testcontainers\nclass UserRepositoryIntegrationTest {\n\n  @Container\n  static PostgreSQLContainer\u003C?> postgres = new PostgreSQLContainer\u003C>(\"postgres:16-alpine\")\n      .withDatabaseName(\"testdb\");\n\n  @DynamicPropertySource\n  static void configureProperties(DynamicPropertyRegistry registry) {\n    registry.add(\"spring.datasource.url\", postgres::getJdbcUrl);\n    registry.add(\"spring.datasource.username\", postgres::getUsername);\n    registry.add(\"spring.datasource.password\", postgres::getPassword);\n  }\n\n  @Autowired private UserRepository userRepository;\n\n  @Test\n  void findByEmail_existingUser_returnsUser() {\n    userRepository.save(new User(\"Alice\", \"alice@example.com\"));\n\n    var found = userRepository.findByEmail(\"alice@example.com\");\n\n    assertThat(found).isPresent();\n    assertThat(found.get().getName()).isEqualTo(\"Alice\");\n  }\n}\n```\n\n### API Tests with MockMvc\n\nTest controller layer with full Spring context:\n\n```java\n@WebMvcTest(UserController.class)\nclass UserControllerTest {\n\n  @Autowired private MockMvc mockMvc;\n  @MockBean private UserService userService;\n\n  @Test\n  void createUser_validInput_returns201() throws Exception {\n    var user = new UserDto(1L, \"Alice\", \"alice@example.com\");\n    when(userService.create(any())).thenReturn(user);\n\n    mockMvc.perform(post(\"\u002Fapi\u002Fusers\")\n            .contentType(MediaType.APPLICATION_JSON)\n            .content(\"\"\"\n                {\"name\": \"Alice\", \"email\": \"alice@example.com\"}\n                \"\"\"))\n        .andExpect(status().isCreated())\n        .andExpect(jsonPath(\"$.name\").value(\"Alice\"));\n  }\n\n  @Test\n  void createUser_invalidEmail_returns400() throws Exception {\n    mockMvc.perform(post(\"\u002Fapi\u002Fusers\")\n            .contentType(MediaType.APPLICATION_JSON)\n            .content(\"\"\"\n                {\"name\": \"Alice\", \"email\": \"not-an-email\"}\n                \"\"\"))\n        .andExpect(status().isBadRequest());\n  }\n}\n```\n\n## Phase 4: Security Scan\n\n```bash\n# Dependency CVEs\nmvn org.owasp:dependency-check-maven:check\n# or\n.\u002Fgradlew dependencyCheckAnalyze\n\n# Secrets in source\ngrep -rn \"password\\s*=\\s*\\\"\" src\u002F --include=\"*.java\" --include=\"*.yml\" --include=\"*.properties\"\ngrep -rn \"sk-\\|api_key\\|secret\" src\u002F --include=\"*.java\" --include=\"*.yml\"\n\n# Secrets (git history)\ngit secrets --scan  # if configured\n```\n\n### Common Security Findings\n\n```\n# Check for System.out.println (use logger instead)\ngrep -rn \"System\\.out\\.print\" src\u002Fmain\u002F --include=\"*.java\"\n\n# Check for raw exception messages in responses\ngrep -rn \"e\\.getMessage()\" src\u002Fmain\u002F --include=\"*.java\"\n\n# Check for wildcard CORS\ngrep -rn \"allowedOrigins.*\\*\" src\u002Fmain\u002F --include=\"*.java\"\n```\n\n## Phase 5: Lint\u002FFormat (optional gate)\n\n```bash\nmvn spotless:apply   # if using Spotless plugin\n.\u002Fgradlew spotlessApply\n```\n\n## Phase 6: Diff Review\n\n```bash\ngit diff --stat\ngit diff\n```\n\nChecklist:\n- No debugging logs left (`System.out`, `log.debug` without guards)\n- Meaningful errors and HTTP statuses\n- Transactions and validation present where needed\n- Config changes documented\n\n## Output Template\n\n```\nVERIFICATION REPORT\n===================\nBuild:     [PASS\u002FFAIL]\nStatic:    [PASS\u002FFAIL] (spotbugs\u002Fpmd\u002Fcheckstyle)\nTests:     [PASS\u002FFAIL] (X\u002FY passed, Z% coverage)\nSecurity:  [PASS\u002FFAIL] (CVE findings: N)\nDiff:      [X files changed]\n\nOverall:   [READY \u002F NOT READY]\n\nIssues to Fix:\n1. ...\n2. ...\n```\n\n## Continuous Mode\n\n- Re-run phases on significant changes or every 30–60 minutes in long sessions\n- Keep a short loop: `mvn -T 4 test` + spotbugs for quick feedback\n\n**Remember**: Fast feedback beats late surprises. Keep the gate strict—treat warnings as defects in production systems.\n","# Spring Boot Verification Loop\n\nRun before PRs, after major changes, and pre-deploy.\n\n## When to Activate\n\n- Before opening a pull request for a Spring Boot service\n- After major refactoring or dependency upgrades\n- Pre-deployment verification for staging or production\n- Running full build → lint → test → security scan pipeline\n- Validating test coverage meets thresholds\n\n## Phase 1: Build\n\n```bash\nmvn -T 4 clean verify -DskipTests\n# or\n.\u002Fgradlew clean assemble -x test\n```\n\nIf build fails, stop and fix.\n\n## Phase 2: Static Analysis\n\nMaven (common plugins):\n```bash\nmvn -T 4 spotbugs:check pmd:check checkstyle:check\n```\n\nGradle (if configured):\n```bash\n.\u002Fgradlew checkstyleMain pmdMain spotbugsMain\n```\n\n## Phase 3: Tests + Coverage\n\n```bash\nmvn -T 4 test\nmvn jacoco:report   # verify 80%+ coverage\n# or\n.\u002Fgradlew test jacocoTestReport\n```\n\nReport:\n- Total tests, passed\u002Ffailed\n- Coverage % (lines\u002Fbranches)\n\n### Unit Tests\n\nTest service logic in isolation with mocked dependencies:\n\n```java\n@ExtendWith(MockitoExtension.class)\nclass UserServiceTest {\n\n  @Mock private UserRepository userRepository;\n  @InjectMocks private UserService userService;\n\n  @Test\n  void createUser_validInput_returnsUser() {\n    var dto = new CreateUserDto(\"Alice\", \"alice@example.com\");\n    var expected = new User(1L, \"Alice\", \"alice@example.com\");\n    when(userRepository.save(any(User.class))).thenReturn(expected);\n\n    var result = userService.create(dto);\n\n    assertThat(result.name()).isEqualTo(\"Alice\");\n    verify(userRepository).save(any(User.class));\n  }\n\n  @Test\n  void createUser_duplicateEmail_throwsException() {\n    var dto = new CreateUserDto(\"Alice\", \"existing@example.com\");\n    when(userRepository.existsByEmail(dto.email())).thenReturn(true);\n\n    assertThatThrownBy(() -> userService.create(dto))\n        .isInstanceOf(DuplicateEmailException.class);\n  }\n}\n```\n\n### Integration Tests with Testcontainers\n\nTest against a real database instead of H2:\n\n```java\n@SpringBootTest\n@Testcontainers\nclass UserRepositoryIntegrationTest {\n\n  @Container\n  static PostgreSQLContainer\u003C?> postgres = new PostgreSQLContainer\u003C>(\"postgres:16-alpine\")\n      .withDatabaseName(\"testdb\");\n\n  @DynamicPropertySource\n  static void configureProperties(DynamicPropertyRegistry registry) {\n    registry.add(\"spring.datasource.url\", postgres::getJdbcUrl);\n    registry.add(\"spring.datasource.username\", postgres::getUsername);\n    registry.add(\"spring.datasource.password\", postgres::getPassword);\n  }\n\n  @Autowired private UserRepository userRepository;\n\n  @Test\n  void findByEmail_existingUser_returnsUser() {\n    userRepository.save(new User(\"Alice\", \"alice@example.com\"));\n\n    var found = userRepository.findByEmail(\"alice@example.com\");\n\n    assertThat(found).isPresent();\n    assertThat(found.get().getName()).isEqualTo(\"Alice\");\n  }\n}\n```\n\n### API Tests with MockMvc\n\nTest controller layer with full Spring context:\n\n```java\n@WebMvcTest(UserController.class)\nclass UserControllerTest {\n\n  @Autowired private MockMvc mockMvc;\n  @MockBean private UserService userService;\n\n  @Test\n  void createUser_validInput_returns201() throws Exception {\n    var user = new UserDto(1L, \"Alice\", \"alice@example.com\");\n    when(userService.create(any())).thenReturn(user);\n\n    mockMvc.perform(post(\"\u002Fapi\u002Fusers\")\n            .contentType(MediaType.APPLICATION_JSON)\n            .content(\"\"\"\n                {\"name\": \"Alice\", \"email\": \"alice@example.com\"}\n                \"\"\"))\n        .andExpect(status().isCreated())\n        .andExpect(jsonPath(\"$.name\").value(\"Alice\"));\n  }\n\n  @Test\n  void createUser_invalidEmail_returns400() throws Exception {\n    mockMvc.perform(post(\"\u002Fapi\u002Fusers\")\n            .contentType(MediaType.APPLICATION_JSON)\n            .content(\"\"\"\n                {\"name\": \"Alice\", \"email\": \"not-an-email\"}\n                \"\"\"))\n        .andExpect(status().isBadRequest());\n  }\n}\n```\n\n## Phase 4: Security Scan\n\n```bash\n# Dependency CVEs\nmvn org.owasp:dependency-check-maven:check\n# or\n.\u002Fgradlew dependencyCheckAnalyze\n\n# Secrets in source\ngrep -rn \"password\\s*=\\s*\\\"\" src\u002F --include=\"*.java\" --include=\"*.yml\" --include=\"*.properties\"\ngrep -rn \"sk-\\|api_key\\|secret\" src\u002F --include=\"*.java\" --include=\"*.yml\"\n\n# Secrets (git history)\ngit secrets --scan  # if configured\n```\n\n### Common Security Findings\n\n```\n# Check for System.out.println (use logger instead)\ngrep -rn \"System\\.out\\.print\" src\u002Fmain\u002F --include=\"*.java\"\n\n# Check for raw exception messages in responses\ngrep -rn \"e\\.getMessage()\" src\u002Fmain\u002F --include=\"*.java\"\n\n# Check for wildcard CORS\ngrep -rn \"allowedOrigins.*\\*\" src\u002Fmain\u002F --include=\"*.java\"\n```\n\n## Phase 5: Lint\u002FFormat (optional gate)\n\n```bash\nmvn spotless:apply   # if using Spotless plugin\n.\u002Fgradlew spotlessApply\n```\n\n## Phase 6: Diff Review\n\n```bash\ngit diff --stat\ngit diff\n```\n\nChecklist:\n- No debugging logs left (`System.out`, `log.debug` without guards)\n- Meaningful errors and HTTP statuses\n- Transactions and validation present where needed\n- Config changes documented\n\n## Output Template\n\n```\nVERIFICATION REPORT\n===================\nBuild:     [PASS\u002FFAIL]\nStatic:    [PASS\u002FFAIL] (spotbugs\u002Fpmd\u002Fcheckstyle)\nTests:     [PASS\u002FFAIL] (X\u002FY passed, Z% coverage)\nSecurity:  [PASS\u002FFAIL] (CVE findings: N)\nDiff:      [X files changed]\n\nOverall:   [READY \u002F NOT READY]\n\nIssues to Fix:\n1. ...\n2. ...\n```\n\n## Continuous Mode\n\n- Re-run phases on significant changes or every 30–60 minutes in long sessions\n- Keep a short loop: `mvn -T 4 test` + spotbugs for quick feedback\n\n**Remember**: Fast feedback beats late surprises. Keep the gate strict—treat warnings as defects in production systems.\n",{"name":5,"origin":42,"description":7},"ECC","main","a298c929b6cbd662e1fce54302ce520d5ceea1a5",".agents\u002Flibrary\u002Fskills\u002Fspringboot-verification","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain","https:\u002F\u002Fgithub.com\u002FPrekzursil","2026-11-02 14:30:57",{"source":8,"skillName":5,"commands":50,"prompt":60,"zipAvailable":61},[51,54,57],{"tool":52,"command":53},"npx","npx skills add Prekzursil\u002Fagent-skills-toolchain --skill springboot-verification",{"tool":55,"command":56},"bunx","bunx skills add Prekzursil\u002Fagent-skills-toolchain --skill springboot-verification",{"tool":58,"command":59},"pnpm","pnpm dlx skills add Prekzursil\u002Fagent-skills-toolchain --skill springboot-verification","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Flibrary\u002Fskills\u002Fspringboot-verification\u002FSKILL.md",true,[],[64,86,117,143,157,173],{"skillNo":65,"name":66,"nameZh":6,"description":67,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":68,"categories":69,"keywords":70,"publishedAt":37},"01M6DF7D7478R55P46REYH4QAC","clarify-requirements","Resolve genuine pre-execution ambiguity by scanning repo context, generating 1-6 grounded options, and asking 1-3 focused questions via AskUserQuestion. NOT for mid-task use (injection risk); NOT when the goal is already unambiguous; use to disambiguate vague prompts before any file edits.","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Fworkspace-hooks\u002Fskills\u002Fclarify-requirements\u002FSKILL.md",[],[71,72,73,74,75,76,77,78,79,80,81,82,83,84,85],"clarify requirements","clarify","requirements","risk","options","task","prompts","goal","scanning","use","context","repo","injection","execution","file",{"skillNo":87,"name":88,"nameZh":6,"description":89,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":97,"publishedAt":37},"01M6DF79CA4BHJS66J8EZDBPWJ","openmm-md","Run FREE, open-source, Windows-native GPU molecular dynamics via the openmm-md MCP (OpenMM + CUDA on the local NVIDIA GPU). Use for protein \u002F protein-ligand MD when you want a free stack or are on Windows without a Schrodinger license. Covers the full workflow (prepare, solvate, minimize, equilibrate, production, analyze, mmgbsa) AND an honest decision guide vs Schrodinger Desmond, including how to run Desmond legitimately on Linux or a cloud GPU with a real license. This is a deliberately LESSER free alternative and does NOT replace the schrodinger MCP tools. Do NOT use it to pick a free tool when a validated FEP+, WaterMap, IFD-MD, or Prime MM-GBSA result is actually required.","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Fmcp\u002Fopenmm-md-mcp\u002Fskill\u002Fopenmm-md\u002FSKILL.md",[92],{"categoryNo":93,"categoryName":94,"taxonomyType":95,"taxonomyTypeDesc":96},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[98,99,100,101,102,103,104,105,106,107,108,109,110,111,80,112,113,114,115,116],"openmm md","how","decision","pick","linux","analyze","tool","stack","open","NVIDIA","gpu","license","workflow","windows","free","molecular dynamics","local","do","MCP",{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":129,"publishedAt":37},"01M6DF76C1MG85VEWP8VZCBNMN","visual-review","Take screenshots of web pages and UI using Playwright for visual review and iteration","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fvisual-review\u002FSKILL.md",[123,126],{"categoryNo":124,"categoryName":125,"taxonomyType":95,"taxonomyTypeDesc":96},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":127,"categoryName":128,"taxonomyType":95,"taxonomyTypeDesc":96},"01JBSEEDCAT000000000000008","测试与质量",[29,130,131,132,133,134,135,136,137,138,99,139,140,141,142],"visual","visual review","pages","web","false","iteration","take","check","slides","ui","screenshot","playwright","screenshots",{"skillNo":144,"name":145,"nameZh":6,"description":146,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":147,"categories":148,"keywords":149,"publishedAt":37},"01M6DF73AQVCBZKEN0YXEX9FXP","status","Diagnostic status report — shows metaswarm installation state, project setup, and potential issues","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fstatus\u002FSKILL.md",[],[145,150,151,152,153,154,155,156],"setup","report","project","installation","project setup","issues","state",{"skillNo":158,"name":159,"nameZh":6,"description":160,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":161,"categories":162,"keywords":164,"publishedAt":37},"01M6DF6X6C2XB0P6GX76P7TTYV","start","Use when starting work on any task, when the user mentions metaswarm, or when the user wants to begin tracked development work","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fstart\u002FSKILL.md",[163],{"categoryNo":93,"categoryName":94,"taxonomyType":95,"taxonomyTypeDesc":96},[159,165,76,166,167,168,80,169,170,171,172],"start issue","issue","ready","work on issue","user","work","work on","development",{"skillNo":174,"name":150,"nameZh":6,"description":175,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":176,"categories":177,"keywords":178,"publishedAt":37},"01M6DF6QMJ9AJKFKHHKRT005PQ","Interactive project setup — detects your project, configures metaswarm, writes project-local files","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fsetup\u002FSKILL.md",[],[150,152,114,179,154,180],"files","interactive"]