Add auto-loading java and typescript language skills; split the Spring reference - #67
Merged
Merged
Conversation
…ut of the language half The java skill carries the J-standards: records for value types, sealed hierarchies switched without default, invariants in types, JSpecify @NullMarked everywhere with NullAway as a build error, immutability by default, virtual-threads-default with the JEP-491-corrected pinning guidance, ScopedValue over ThreadLocal, a stated preview-feature policy for structured concurrency, version catalogs as the only version location, OSV-Scanner and verification metadata, JUnit 6 with jqwik properties, ArchUnit rules as the executable form of approved boundaries, PIT mutation thresholds on changed classes, Testcontainers-first integration tests, and boundary security with named guards — plus a reference with complete Gradle/Maven wiring for every gate. The typescript skill carries the T-standards: the strictest checked-in tsconfig, unknown-at-boundaries with no any, discriminated unions with exhaustive never checks, branded IDs, parse-don't-validate with Zod at every I/O edge and process.env read in exactly one module, generated wire types with a CI drift check, ESM-only packaging, no floating promises via typescript-eslint's type-aware rules, AbortSignal cancellation, Vitest/MSW/fast-check testing, and supply-chain hygiene — plus a reference with the complete checked-in templates. The backend role's java-expertise reference splits: its language half (Java 25 features, virtual-thread guidance, generic testing doctrine, micro-standards) moves to the java skill, and the kept Spring half gains a Spring Boot 4 standards block (S1-S10) and loses its stale claims (synchronized-pins, @MockBean). The frontend role's React reference points its language-level TypeScript section at the typescript skill and keeps only React-specific TS patterns; both roles' routers gain the language-skill rows. The reviewer's backend and frontend references gain a NullAway/ArchUnit gate-presence check and a floating-promise spot-check. Skill count claims updated 40 -> 42 at every checked site.
J28's SSRF deny list gains IPv4 loopback and IPv6 link-local; the PIT wiring stops claiming JUnit Platform support is built in (pitest 1.19.4 plus the separate junit5 plugin, in the catalog, the Gradle pitest configuration, and the Maven plugin dependencies); the Maven jvm.config opens javac.comp instead of a nonexistent package; J14's no-preview fallback describes semantics invokeAll can actually deliver (completion service, cancel-on-first-failure by hand); S6 and the Spring 7 bullet cite the real versioning mechanism (the version attribute plus ApiVersionConfigurer, not a phantom annotation); the Testcontainers templates' AssertJ and JDBC dependencies are declared in the catalog and build fragments they claim to complete; the kept Vitest bullet names the real coverage providers; --enable-preview is qualified by the preview opt-in policy instead of recommended as a default; and the two knowledge blocks the split had orphaned — the concurrency-primitives selection table and the unit-test tooling doctrine — are restored into the java skill.
There was a problem hiding this comment.
Pull request overview
This PR expands the framework’s auto-loading language-skill layer by introducing dedicated Java and TypeScript language skills, and refactors the backend Java reference to cleanly separate Spring ecosystem guidance from Java-the-language standards. It also updates routing/docs across the repo to reflect the new skills and the updated skill count.
Changes:
- Added new auto-loading language skills:
claude/skills/development/languages/java/andclaude/skills/development/languages/typescript/(plus build/tooling/template references). - Split backend Java guidance so Spring/Boot ecosystem standards live in
java-expertise.md, while language-level standards live in the new Java language skill. - Updated docs, routing surfaces, and reviewer checklists to reference the new language skills and bump skill-count claims to 42.
Reviewed changes
Copilot reviewed 20 out of 20 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| README.md | Updates skill count to 42 and lists Java/TypeScript as auto-loading language skills. |
| docs/skill-extension-guide.md | Updates the “core languages” exception description to include Java/TypeScript. |
| CONTRIBUTING.md | Updates contributor guidance to reflect Java/TypeScript language skills in development/languages/. |
| claude/skills/quality/review/reviewer/references/frontend-review.md | Adds stricter tsc flags guidance and a floating-promise spot-check referencing the TypeScript language skill. |
| claude/skills/quality/review/reviewer/references/backend-review.md | Adds a Java-skill-derived gate-presence check (NullAway + ArchUnit). |
| claude/skills/disambiguation.md | Updates disambiguation to include Java/TypeScript language skills and routing roles. |
| claude/skills/development/languages/typescript/SKILL.md | Introduces the TypeScript language skill doctrine, triggers, and standards (T1–T14). |
| claude/skills/development/languages/typescript/references/templates.md | Adds checked-in TypeScript toolchain templates (tsconfig, ESLint flat config, Vitest, env parsing, CI fragment). |
| claude/skills/development/languages/java/SKILL.md | Introduces the Java language skill doctrine, triggers, and standards (J1–J30). |
| claude/skills/development/languages/java/references/build-and-quality-gates.md | Adds Gradle/Maven wiring templates for NullAway/ErrorProne, ArchUnit, PIT, Testcontainers, and supply-chain gates. |
| claude/skills/development/frontend/react/frontend-developer/SKILL.md | Adds a routing row and pointer to the TypeScript language skill for language-level depth. |
| claude/skills/development/frontend/react/frontend-developer/references/react-expertise.md | Removes general TS language section and replaces it with a pointer to the TypeScript language skill; updates some stack version headings. |
| claude/skills/development/backend/java/backend-developer/SKILL.md | Updates Java/Spring routing text to point to Spring ecosystem reference + auto-loading Java language skill. |
| claude/skills/development/backend/java/backend-developer/references/java-expertise.md | Refactors into “Spring ecosystem” reference with Spring Boot 4 standards (S1–S10) and removes language-level duplication. |
| claude/skills/ai-dev-team/SKILL.md | Updates framework-level description of core language skills to include Java/TypeScript. |
| claude/commands/agents.md | Updates agent directory text to include Java/TypeScript as auto-loading language skills. |
| claude/CLAUDE.md | Updates skill count to 42 and refreshes the “core languages” exception text. |
| claude/AGENTS.md | Mirrors claude/CLAUDE.md updates for editors that read AGENTS.md. |
| CLAUDE.md | Updates repo-level overview text (skill count and languages list). |
| CHANGELOG.md | Records addition of Java/TypeScript language skills and the Java/Spring reference split. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Comment on lines
+238
to
+253
| <plugin> | ||
| <groupId>org.pitest</groupId> | ||
| <artifactId>pitest-maven</artifactId> | ||
| <version>1.19.4</version> | ||
| <configuration> | ||
| <threads>4</threads> | ||
| <mutationThreshold>75</mutationThreshold> | ||
| <withHistory>true</withHistory> | ||
| </configuration> | ||
| <dependencies> | ||
| <dependency> | ||
| <groupId>org.pitest</groupId> | ||
| <artifactId>pitest-junit5-plugin</artifactId> | ||
| <version>1.2.1</version> | ||
| </dependency> | ||
| </dependencies> |
Comment on lines
+21
to
+43
| jqwik = "1.10.1" | ||
| archunit = "1.4.1" | ||
| pitest = "1.19.4" # floor for the current junit5 plugin; re-verify at adoption | ||
| pitestJunit5Plugin = "1.2.1" # JUnit Platform engines are NOT built into pitest core | ||
| pitestPlugin = "1.15.0" | ||
| testcontainers = "1.21.3" # Spring Boot's BOM manages this when present | ||
| assertj = "3.27.3" | ||
| cyclonedxPlugin = "2.3.0" | ||
|
|
||
| [libraries] | ||
| jspecify = { module = "org.jspecify:jspecify", version.ref = "jspecify" } | ||
| errorprone-core = { module = "com.google.errorprone:error_prone_core", version.ref = "errorprone" } | ||
| nullaway = { module = "com.uber.nullaway:nullaway", version.ref = "nullaway" } | ||
| junit-bom = { module = "org.junit:junit-bom", version.ref = "junit" } | ||
| junit-jupiter = { module = "org.junit.jupiter:junit-jupiter" } | ||
| junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher" } | ||
| jqwik = { module = "net.jqwik:jqwik", version.ref = "jqwik" } | ||
| archunit = { module = "com.tngtech.archunit:archunit", version.ref = "archunit" } | ||
| testcontainers-junit = { module = "org.testcontainers:junit-jupiter", version.ref = "testcontainers" } | ||
| testcontainers-postgresql = { module = "org.testcontainers:postgresql", version.ref = "testcontainers" } | ||
| assertj = { module = "org.assertj:assertj-core", version.ref = "assertj" } | ||
| postgresql = { module = "org.postgresql:postgresql", version = "42.7.7" } | ||
| pitest-junit5 = { module = "org.pitest:pitest-junit5-plugin", version.ref = "pitestJunit5Plugin" } |
Comment on lines
+103
to
+113
| <properties> | ||
| <maven.compiler.release>25</maven.compiler.release> | ||
| <errorprone.version>2.41.0</errorprone.version><!-- NullAway requires >= 2.36 --> | ||
| <nullaway.version>0.12.10</nullaway.version> | ||
| </properties> | ||
|
|
||
| <plugin> | ||
| <groupId>org.apache.maven.plugins</groupId> | ||
| <artifactId>maven-compiler-plugin</artifactId> | ||
| <version>3.14.0</version> | ||
| <configuration> |
Comment on lines
+398
to
+402
| **J28 — SSRF: allowlist before fetch.** A client-supplied URL passes a host allowlist and | ||
| a deny of loopback, private and link-local ranges (127.0.0.0/8, 10/8, 172.16/12, | ||
| 192.168/16, 169.254/16, `::1`, `fd00::/8`, `fe80::/10`) **before** any request is made — after DNS resolution, so a hostname pointing | ||
| into the private range is caught too. The guard is the checked resolver the HTTP client | ||
| is built with. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Java and TypeScript expertise lived fused into role references: the backend role's
java-expertise.mdmixed Java-the-language with the Spring ecosystem (so language standards loaded only when /be was explicitly invoked, and carried stale claims — pre-JDK-24 virtual-thread pinning advice, a removed@MockBean), and TypeScript-the-language existed only as a version-bullet section inside the React reference. Neither could load from context when the language was being written.What changed
Stacked on #66 (which introduced the language-skill category).
claude/skills/development/languages/java/— SKILL.md with the J-standards: records for value types, sealed hierarchies switched withoutdefault, invariants in types, JSpecify@NullMarked+ NullAway as a build error, immutability by default, virtual-threads-default with JEP-491-corrected pinning guidance,ScopedValueoverThreadLocal, a stated preview policy for structured concurrency, version catalogs as the only version location, OSV-Scanner/verification-metadata supply chain, JUnit 6 + jqwik + ArchUnit-rules-as-tests + PIT mutation thresholds, Testcontainers-first, and boundary security with named guards. Plusreferences/build-and-quality-gates.md: complete Gradle/Maven wiring for every gate.claude/skills/development/languages/typescript/— SKILL.md with the T-standards: the strictest checked-in tsconfig,unknownat boundaries with noany, discriminated unions + exhaustiveneverchecks, branded IDs, parse-don't-validate with Zod 4 at every I/O edge (process.envread in exactly one module), generated wire types with a CI drift check, ESM-only packaging, typescript-eslint with the promise rules as errors, AbortSignal cancellation, Vitest 4/MSW 2/fast-check. Plusreferences/templates.md: the complete checked-in artifacts.java-expertise.mdkeeps the Spring/backend ecosystem, gains a Spring Boot 4 standards block (S1–S10), and loses its stale claims; the React reference's language-level TS section becomes a router to the typescript skill, keeping only React-specific TS patterns; both roles' stack routers gain the language-skill rows; the reviewer's backend/frontend references gain a NullAway/ArchUnit gate-presence check and a floating-promise spot-check.Review
A high-effort review of the diff surfaced ten confirmed defects — including an SSRF deny list missing IPv4 loopback, a PIT pin that predates JUnit 6 (the mutation gate would silently discover no tests), templates missing their own declared dependencies, a phantom Spring annotation, and two knowledge blocks orphaned by the split — all fixed in the final commit, with the pitest facts re-verified against the plugin's own documentation.
Tests
python3 scripts/validate-framework.py— all seven gates pass (G3: skills=42, commands=50, templates=6).claude plugin validate ./claudeand./install.sh --dry-run --editors=all --scope=project --yes— pass.