{"id":"bd55f55b-7402-4f8c-8cad-4df8cccac164","shortId":"3DvarM","kind":"skill","title":"jspecify-skill","tagline":"Use this skill when asked to perform any of the following actions in a Java project:   - To add jspecify support   - To prevent NullPointerExceptions   - To better handle Nullability  This skill will add jspecify dependency, configure Maven or Gradle build to automatically use js","description":"Jspecify provides a set of annotations to explicitly declare the nullness expectations of the Java code.\n\n## Add jSpecify support in Maven projects\nIf you are using Maven, then add the jspecify dependency in `pom.xml`.\nIn `pom.xml`, update or add the `maven-compiler-plugin`, to include the following configuration.\n\n```xml\n<dependencies>\n    <dependency>\n        <groupId>org.jspecify</groupId>\n        <artifactId>jspecify</artifactId>\n        <version>1.0.0</version>\n    </dependency>\n</dependencies>\n\n<build>\n    <plugins>\n        <plugin>\n            <groupId>org.apache.maven.plugins</groupId>\n            <artifactId>maven-compiler-plugin</artifactId>\n            <version>3.14.1</version>\n            <configuration>\n                <release>25</release>\n                <encoding>UTF-8</encoding>\n                <fork>true</fork>\n                <compilerArgs>\n                    <arg>-XDcompilePolicy=simple</arg>\n                    <arg>--should-stop=ifError=FLOW</arg>\n                    <arg>-Xplugin:ErrorProne -XepDisableAllChecks -Xep:NullAway:ERROR -XepOpt:NullAway:OnlyNullMarked -XepOpt:NullAway:JSpecifyMode=true</arg>\n                    <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg>\n                    <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>\n                    <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>\n                    <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>\n                    <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>\n                    <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>\n                    <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>\n                    <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>\n                    <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>\n                    <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>\n                </compilerArgs>\n                <annotationProcessorPaths>\n                    <path>\n                        <groupId>com.google.errorprone</groupId>\n                        <artifactId>error_prone_core</artifactId>\n                        <version>2.42.0</version>\n                    </path>\n                    <path>\n                        <groupId>com.uber.nullaway</groupId>\n                        <artifactId>nullaway</artifactId>\n                        <version>0.12.12</version>\n                    </path>\n                </annotationProcessorPaths>\n            </configuration>\n        </plugin>\n    </plugins>\n</build>\n```\n\n## Add jSpecify support in Gradle projects\nIf you are using Gradle, then add the jspecify dependency.\nIn `build.gradle` or `build.gradle.kts`, update or add the following jspecify configuration.\n\n```groovy\nplugins {\n    id(\"net.ltgt.errorprone\") version \"4.3.0\"\n}\n\ntasks.withType(JavaCompile).configureEach {\n    options.errorprone {\n        disableAllChecks = true // Other error prone checks are disabled\n        option(\"NullAway:OnlyNullMarked\", \"true\") // Enable nullness checks only in null-marked code\n        error(\"NullAway\") // bump checks from warnings (default) to errors\n        option(\"NullAway:JSpecifyMode\", \"true\") // https://github.com/uber/NullAway/wiki/JSpecify-Support\n    }\n    // Keep a JDK 25 baseline\n    options.release = 25\n}\n\ndependencies {\n    implementation(\"org.jspecify:jspecify:1.0.0\")\n    errorprone(\"com.google.errorprone:error_prone_core:2.42.0\")\n    errorprone(\"com.uber.nullaway:nullaway:0.12.12\")\n}\n```\n\n## Add @NullMarked to package-info.java files\nIn every java package under the application main source code (`src/main/java`), \ncreate `package-info.java` if not exists already, and add the `@NullMarked` annotation as follows:\n\n```java\n@org.jspecify.annotations.NullMarked\npackage com.mycompnay.myproject;\n```\n\nIf `package-info.java` file already exists, update the file to add `@org.jspecify.annotations.NullMarked` annotation.\nDO NOT REMOVE ANY OTHER EXISTING CODE IN `package-info.java` FILE.\n\n## Verify jSpecify support\nIf python is installed, after adding the jSpecify support, run `scripts/verify_nullmarked.py` \nto check if all non-empty packages has `package-info.java` file or not.","tags":["jspecify","sivalabs","agent","skills","sivaprasadreddy","agent-skills","ai-agents","claude-code","claude-skills","java","spring-boot","spring-modulith"],"capabilities":["skill","source-sivaprasadreddy","skill-jspecify","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-claude-skills","topic-java","topic-spring-boot","topic-spring-modulith"],"categories":["sivalabs-agent-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sivaprasadreddy/sivalabs-agent-skills/jspecify","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sivaprasadreddy/sivalabs-agent-skills","source_repo":"https://github.com/sivaprasadreddy/sivalabs-agent-skills","install_from":"skills.sh"}},"qualityScore":"0.512","qualityRationale":"deterministic score 0.51 from registry signals: · indexed on github topic:agent-skills · 125 github stars · SKILL.md body (4,405 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-02T12:54:53.080Z","embedding":null,"createdAt":"2026-04-18T22:10:17.504Z","updatedAt":"2026-05-02T12:54:53.080Z","lastSeenAt":"2026-05-02T12:54:53.080Z","tsv":"'-8':107 '/com.sun.tools.javac.api=all-unnamed':135 '/com.sun.tools.javac.code=all-unnamed':191 '/com.sun.tools.javac.comp=all-unnamed':198 '/com.sun.tools.javac.file=all-unnamed':142 '/com.sun.tools.javac.main=all-unnamed':149 '/com.sun.tools.javac.model=all-unnamed':156 '/com.sun.tools.javac.parser=all-unnamed':163 '/com.sun.tools.javac.processing=all-unnamed':170 '/com.sun.tools.javac.tree=all-unnamed':177 '/com.sun.tools.javac.util=all-unnamed':184 '/uber/nullaway/wiki/jspecify-support':280 '0.12.12':206,302 '1.0.0':98,292 '2.42.0':203,298 '25':105,284,287 '3.14.1':104 '4.3.0':239 'action':15 'ad':366 'add':21,34,62,74,84,131,138,145,152,159,166,173,180,187,194,207,219,229,303,326,345 'add-export':130,137,144,151,158,165,172,179 'add-open':186,193 'alreadi':324,339 'annot':51,329,347 'applic':314 'ask':8 'automat':43 'baselin':285 'better':28 'build':41 'build.gradle':224 'build.gradle.kts':226 'bump':267 'check':249,258,268,373 'code':61,264,317,354 'com.google.errorprone':199,294 'com.mycompnay.myproject':335 'com.uber.nullaway':204,300 'compil':88,102 'configur':37,94,233 'configureeach':242 'core':202,297 'creat':319 'declar':54 'default':271 'depend':36,77,222,288 'disabl':251 'disableallcheck':244 'empti':378 'enabl':256 'error':121,200,247,265,273,295 'errorpron':117,293,299 'everi':309 'exist':323,340,353 'expect':57 'explicit':53 'export':132,139,146,153,160,167,174,181 'file':307,338,343,357,382 'flow':115 'follow':14,93,231,331 'github.com':279 'github.com/uber/nullaway/wiki/jspecify-support':278 'gradl':40,211,217 'groovi':234 'handl':29 'id':236 'iferror':114 'implement':289 'includ':91 'instal':364 'j':129,136,143,150,157,164,171,178,185,192 'java':18,60,310,332 'javacompil':241 'jdk':283 'jdk.compiler':134,141,148,155,162,169,176,183,190,197 'jdk.compiler/com.sun.tools.javac.api=all-unnamed':133 'jdk.compiler/com.sun.tools.javac.code=all-unnamed':189 'jdk.compiler/com.sun.tools.javac.comp=all-unnamed':196 'jdk.compiler/com.sun.tools.javac.file=all-unnamed':140 'jdk.compiler/com.sun.tools.javac.main=all-unnamed':147 'jdk.compiler/com.sun.tools.javac.model=all-unnamed':154 'jdk.compiler/com.sun.tools.javac.parser=all-unnamed':161 'jdk.compiler/com.sun.tools.javac.processing=all-unnamed':168 'jdk.compiler/com.sun.tools.javac.tree=all-unnamed':175 'jdk.compiler/com.sun.tools.javac.util=all-unnamed':182 'js':45 'jspecifi':2,22,35,46,63,76,97,208,221,232,291,359,368 'jspecify-skil':1 'jspecifymod':127,276 'keep':281 'main':315 'mark':263 'maven':38,66,72,87,101 'maven-compiler-plugin':86,100 'net.ltgt.errorprone':237 'non':377 'non-empti':376 'null':56,257,262 'null-mark':261 'nullabl':30 'nullaway':120,123,126,205,253,266,275,301 'nullmark':304,328 'nullpointerexcept':26 'onlynullmark':124,254 'open':188,195 'option':252,274 'options.errorprone':243 'options.release':286 'org.apache.maven.plugins':99 'org.jspecify':96,290 'org.jspecify.annotations.nullmarked':333,346 'packag':311,334,379 'package-info.java':306,320,337,356,381 'perform':10 'plugin':89,103,235 'pom.xml':79,81 'prevent':25 'project':19,67,212 'prone':201,248,296 'provid':47 'python':362 'remov':350 'run':370 'scripts/verify_nullmarked.py':371 'set':49 'should-stop':111 'simpl':110 'skill':3,6,32 'skill-jspecify' 'sourc':316 'source-sivaprasadreddy' 'src/main/java':318 'stop':113 'support':23,64,209,360,369 'tasks.withtype':240 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-claude-skills' 'topic-java' 'topic-spring-boot' 'topic-spring-modulith' 'true':108,128,245,255,277 'updat':82,227,341 'use':4,44,71,216 'utf':106 'verifi':358 'version':238 'warn':270 'xdcompilepolici':109 'xep':119 'xepdisableallcheck':118 'xepopt':122,125 'xml':95 'xplugin':116","prices":[{"id":"8dec860e-758f-4522-b69b-c3e286348221","listingId":"bd55f55b-7402-4f8c-8cad-4df8cccac164","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sivaprasadreddy","category":"sivalabs-agent-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:10:17.504Z"}],"sources":[{"listingId":"bd55f55b-7402-4f8c-8cad-4df8cccac164","source":"github","sourceId":"sivaprasadreddy/sivalabs-agent-skills/jspecify","sourceUrl":"https://github.com/sivaprasadreddy/sivalabs-agent-skills/tree/main/skills/jspecify","isPrimary":false,"firstSeenAt":"2026-04-18T22:10:17.504Z","lastSeenAt":"2026-05-02T12:54:53.080Z"}],"details":{"listingId":"bd55f55b-7402-4f8c-8cad-4df8cccac164","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sivaprasadreddy","slug":"jspecify","github":{"repo":"sivaprasadreddy/sivalabs-agent-skills","stars":125,"topics":["agent-skills","ai","ai-agents","claude-code","claude-skills","java","spring-boot","spring-modulith"],"license":"mit","html_url":"https://github.com/sivaprasadreddy/sivalabs-agent-skills","pushed_at":"2026-04-29T04:04:54Z","description":"Spring Boot skills for AI coding agents","skill_md_sha":"82f1f98c50f0439509d2dd92742a1a89e6eaedb3","skill_md_path":"skills/jspecify/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sivaprasadreddy/sivalabs-agent-skills/tree/main/skills/jspecify"},"layout":"multi","source":"github","category":"sivalabs-agent-skills","frontmatter":{"name":"jspecify-skill","description":"Use this skill when asked to perform any of the following actions in a Java project:   - To add jspecify support   - To prevent NullPointerExceptions   - To better handle Nullability  This skill will add jspecify dependency, configure Maven or Gradle build to automatically use jspecify for checking Nullability issues."},"skills_sh_url":"https://skills.sh/sivaprasadreddy/sivalabs-agent-skills/jspecify"},"updatedAt":"2026-05-02T12:54:53.080Z"}}