Skip to content

Add auto-loading java and typescript language skills; split the Spring reference - #67

Merged
olehsvyrydov merged 2 commits into
mainfrom
feat/language-skills-java-ts
Aug 9, 2026
Merged

Add auto-loading java and typescript language skills; split the Spring reference#67
olehsvyrydov merged 2 commits into
mainfrom
feat/language-skills-java-ts

Conversation

@olehsvyrydov

Copy link
Copy Markdown
Owner

Problem

Java and TypeScript expertise lived fused into role references: the backend role's java-expertise.md mixed 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 without default, invariants in types, JSpecify @NullMarked + NullAway as a build error, immutability by default, virtual-threads-default with JEP-491-corrected pinning guidance, ScopedValue over ThreadLocal, 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. Plus references/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, unknown at boundaries with no any, discriminated unions + exhaustive never checks, branded IDs, parse-don't-validate with Zod 4 at every I/O edge (process.env read 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. Plus references/templates.md: the complete checked-in artifacts.
  • The split: java-expertise.md keeps 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.
  • Skill count claims updated 40 → 42 at every checked site; routing surfaces extended; CHANGELOG updated.

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 ./claude and ./install.sh --dry-run --editors=all --scope=project --yes — pass.
  • Every backtick-quoted relative path in new/edited skills resolves in-repo.

…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.
Copilot AI lite review requested due to automatic review settings August 9, 2026 13:48

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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/ and claude/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.
Base automatically changed from feat/language-skills-rust-sql to main August 9, 2026 13:52
@olehsvyrydov
olehsvyrydov merged commit e65477f into main Aug 9, 2026
4 checks passed
@olehsvyrydov
olehsvyrydov deleted the feat/language-skills-java-ts branch August 9, 2026 13:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants