Repository navigation
v0.5.0 — Java + Salesforce Apex support
New languages
The engine parsed JS/TS and Python only — Java and Salesforce repos x-rayed to zero components. Both are now first-class:
- Java (
.java) — layers inferred from Spring annotations first (@RestController/@Controller→ controller,@Service→ service,@Repository→ repository,@Entity→ model), then Spring Data repository interfaces (extends JpaRepository/CrudRepository/...), then class-name-suffix fallback (*Controller,*Service,*Repository/*Dao). Imports resolve to internal dependency edges; JDBC/JPA calls register as data access. - Salesforce Apex (
.cls,.trigger) — since Apex has no imports, dependency edges come from resolving type references (new X(),extends,implements, static calls) against the org's own class names. SOQL registers as a read, DML as a write/delete. Layers come from Salesforce naming convention (*TriggerHandler→ handler,*Controller→ controller,*Service→ service,*Selector→ repository,*Domain→ model,*Batch/*Queueable/*Schedulable→ job, triggers get their own layer).
Starter packs + auto-detection
archsteer init now inspects the repo for build manifests (pom.xml/build.gradle → java-spring, sfdx-project.json/force-app → salesforce, pyproject.toml/setup.py/requirements.txt → python-service, else express-to-next) and seeds a matching baseline architecture.yaml + ADRs — real rules on first run, not a blank slate. Override with --pack if the guess is wrong.
java-spring: persistence only in repositories; controllers must not touch repositories directlysalesforce: SOQL only in selectors; no DML in triggers or controllerspython-service: persistence only in repositories; API layer must not touch repositories directly
Validation
Benchmarked against real repos: Spring PetClinic scores 100% conformant on the java-spring pack (reference app — any violation there means a broken heuristic). trailheadapps/dreamhouse-lwc genuinely violates the salesforce pack (~29 SOQL-in-controller findings) — a positive control confirming the rules fire correctly on real code.
Full diff: v0.4.2...v0.5.0