apple-oss-lab / pkl
apple/pkl
Configuration language on the JVM. Architecture and build analysis by arcade-agent. Upstream: apple/pkl · Fork: arcade-agent/pkl
Scope: static analysis of the default branch plus GitHub metadata for open PRs and the 30 most recently merged PRs. Java sources only (5603 entities, tests excluded); Kotlin files are not parsed. This is an independent, unofficial analysis; it does not evaluate people.
Architecture baseline
5603entities
45787dependency edges
10components (package-based)
6smells
0.8968RCI (intra-edge ratio)
0.3836BasicMQ
Components
| Component | Entities |
|---|---|
| Core | 4234 |
| Parser | 835 |
| Gradle | 216 |
| Config | 210 |
| Executor | 73 |
| Formatter | 23 |
| Commons | 4 |
| Libpkl | 4 |
| Default | 2 |
| Tools | 2 |
Architectural smells (6)
| Type | Severity | Description |
|---|---|---|
| Dependency Cycle | high | Circular dependency among 5 components: Config <-> Core <-> Executor <-> Formatter <-> Parser |
| Concern Overload | medium | Formatter contains 23 entities but only 4 internal dependencies (0.17 per entity), suggesting multiple responsibilities. |
| Scattered Parasitic Functionality | medium | 'Exception' pattern is scattered across 4 components: Config, Core, Executor, Parser |
| Scattered Parasitic Functionality | medium | 'Spec' pattern is scattered across 3 components: Core, Gradle, Parser |
| Scattered Parasitic Functionality | medium | 'Utils' pattern is scattered across 3 components: Config, Core, Gradle |
| Link/Upstream Overload | medium | Core is depended on by 6 other components (67% of all components). |
Build & CI audit (Gradle)
Same measure → report → fix methodology as mvn-perf, ported to Gradle (mvn-perf itself only hooks Maven). Each row cites where it was found.
| Check | State | Evidence |
|---|---|---|
| Gradle parallel + local build cache | on | gradle.properties: org.gradle.parallel=true, org.gradle.caching=true |
| CI Gradle setup | on | gradle/actions/setup-gradle in .github/workflows/build.yml |
| Configuration cache | off | Not enabled in gradle.properties; only referenced by pkl-gradle plugin tests |
| Test fork tuning | info | maxParallelForks / forkEvery are templated in build-logic/.../BuildInfo.kt |
| CI daemon | info | CI runs ./gradlew --no-daemon ... check with -DpklMultiJdkTesting=true |
Measured
No measured Gradle run for this repository (static audit only).
Pull requests (82)
Filter:
| # | Title | State | Kind | +/− |
|---|---|---|---|---|
| 1882 | Fixes to commands where (sub)commands never extend `pkl:Command` | open | mixed | +75/−37 |
| 1881 | Adjust nullable handling for references | open | mixed | +80/−52 |
| 1880 | Fix `String.endsWith` for overlapping regex matches | open | mixed | +15/−6 |
| 1879 | Replace VmObjectLike.iterateMemberValues() with VmObjectCursor | open | mixed | +2628/−951 |
| 1878 | Housekeeping: replace repo-level CODE_OF_CONDUCT | merged | docs-only | +0/−77 |
| 1877 | Add pkl-binary encoding of Reference referent type | open | mixed | +1269/−47 |
| 1875 | Improve cases where type nodes can turn into TypeNode.UnionOfStringLiterals | open | mixed | +167/−29 |
| 1874 | Fix "unchecked or unsafe operations" warning in javac | merged | mixed | +12/−10 |
| 1873 | Switch ad-hoc vmobject building to use VmObjectBuilder | merged | mixed | +68/−74 |
| 1872 | Make `join` call overriden `toString()` | merged | mixed | +176/−40 |
| 1871 | Make typechecking more PE friendly | open | main-only | +344/−150 |
| 1869 | Elide capturing of closures in functions and objects | open | mixed | +749/−249 |
| 1867 | Improve error message when amending a property with no value set | merged | mixed | +149/−1 |
| 1865 | Fix native image build | merged | main-only | +7/−1 |
| 1864 | Mark overridable `external` properties as `const` | merged | mixed | +31/−18 |
| 1862 | Fix invalid prefix when generating spring boot config | merged | mixed | +173/−3 |
| 1861 | Fix CI on Windows | merged | test-only | +1/−1 |
| 1860 | Fix `Duration.isoString` for sub-nanosecond values | open | mixed | +14/−4 |
| 1859 | Round fractional seconds in `Duration.isoString` | open | mixed | +21/−7 |
| 1858 | Fix failing test on Windows | merged | test-only | +2/−2 |
| 1857 | Switch inferred `new {}` expressions in method args to using frame slots | merged | mixed | +422/−202 |
| 1855 | [docs] Document netRcHeaders in 0.33 release notes | open | docs-only | +24/−2 |
| 1854 | Improve documentation on netRcHeaders method | merged | other-only | +14/−0 |
| 1853 | Optimize super property and super subscript nodes | merged | mixed | +206/−62 |
| 1850 | Avoid using `Object.toString()` for in-language API | merged | mixed | +165/−57 |
| 1849 | Add user generic methods | open | mixed | +1868/−790 |
| 1848 | Use `ChoiceFormat` for better plurals in error messages | merged | mixed | +30/−11 |
| 1847 | Error when inferring a self type in a method argument | merged | mixed | +40/−1 |
| 1846 | Escape characters that YAML cannot carry literally | merged | mixed | +48/−4 |
| 1845 | Optimize `new` inference in method args | merged | mixed | +150/−59 |
| 1844 | Make generator nodes more PE friendly | merged | main-only | +26/−10 |
| 1843 | Optimize annotations without object bodies | merged | main-only | +3/−12 |
| 1842 | Make enclosing frame lookup more PE friendly | merged | main-only | +58/−59 |
| 1840 | Silence the pkl-gradle pom metadata warning | open | build-only | +10/−0 |
| 1838 | Add `VmType` intermediate representation for types | merged | mixed | +2163/−1479 |
| 1837 | Make listing/mapping typecasts more PE-friendly | merged | main-only | +25/−27 |
| 1836 | Improve partial-evaluation when amending null parents | merged | mixed | +1038/−41 |
| 1835 | Improve reading of const members | merged | main-only | +9/−2 |
| 1834 | Add net stdlib module with URL support | open | mixed | +3641/−15 |
| 1824 | Add inference for let bindings | merged | mixed | +192/−41 |
| 1823 | Add a CPU profiler | open | mixed | +1244/−18 |
| 1822 | Typed syntax for pkl:syntax | open | mixed | +8069/−7 |
| 1821 | Add pkl:syntax stdlib module | open | mixed | +3327/−126 |
| 1817 | Add withNetrc support for evaluator settings | merged | mixed | +1007/−0 |
| 1814 | Respect fixed and const properties when converting Map or Dynamic to Typed | open | mixed | +40/−1 |
| 1813 | Document public module APIs | open | main-only | +104/−2 |
| 1811 | Throw when an object key `default` would become a `Dynamic` property | open | mixed | +196/−1 |
| 1810 | Enforce trust levels on resource reads | open | mixed | +209/−93 |
| 1807 | Suppress pkl-gradle POM metadata warning | open | build-only | +4/−0 |
| 1802 | Add `open` and `override` modifiers for class members | open | mixed | +900/−855 |
| 1783 | Add feature flagging system | open | mixed | +374/−69 |
| 1778 | Mark protobuf module as deprecated | merged | mixed | +14/−17 |
| 1768 | Add inference for implicitly typed `new` in method arguments | merged | mixed | +677/−322 |
| 1728 | Bump gradle/actions/dependency-submission from 6.1.0 to 6.2.0 | open | ci-only | +2/−2 |
| 1708 | Add `this` as a self type | merged | mixed | +1487/−561 |
| 1663 | Handle modulo by 0 | open | mixed | +23/−1 |
| 1585 | Add Scoped per-evaluation external properties to config evaluators | open | mixed | +710/−46 |
| 1562 | Follow symbolic links during glob expansion | open | mixed | +168/−5 |
| 1553 | Bump com.squareup:kotlinpoet from 1.6.0 to 2.3.0 | open | build-only | +1/−1 |
| 1548 | Add custom CodeQL query to prevent project evaluator misuse in the CLI | open | mixed | +19/−1 |
| 1461 | Add `import` destructuring and `amends`/`extends` of classes within modules | open | mixed | +529/−70 |
| 1445 | Add `starlark` output format | open | mixed | +786/−1 |
| 1412 | Change how VmValueRenderer renders Typed values | open | mixed | +49/−49 |
| 1332 | Add compose and andThen function to Function1 | open | mixed | +46/−0 |
| 1320 | Fix NPE in VmTyped.hashCode when property is null | open | main-only | +6/−2 |
| 1257 | Add `Object.toMixin()` method | open | mixed | +1055/−5 |
| 1180 | Fix cyclic dependencies bug | open | mixed | +143/−9 |
| 1113 | Add `iterate` and `iterateIndexed` methods for `Collections` in the stdlib | open | mixed | +137/−24 |
| 1082 | Test for nested expession output as JSON | open | test-only | +23/−0 |
| 1076 | PKL Config Scala | open | mixed | +1334/−1 |
| 980 | Fix hash code computation of cyclical objects | open | mixed | +189/−65 |
| 970 | Java class and record generators and friends side-by-side | open | mixed | +4587/−161 |
| 919 | Kotlin ABI checks | open | mixed | +15860/−1 |
| 831 | Delay instantiation of `cachedValues` to save memory | open | main-only | +46/−18 |
| 795 | Vendor org.graalvm.collections | open | mixed | +2608/−492 |
| 658 | Implementation of delete (SPICE-0008) | open | mixed | +462/−48 |
| 629 | [fix] Add support for handling remote file URIs. | open | mixed | +14/−1 |
| 524 | Fix links to dependencies | open | mixed | +44/−30 |
| 197 | Improve docs and usability of EvaluatorBuilder | open | mixed | +617/−129 |
| 190 | Add summaries and groups to Gradle tasks | open | build-only | +50/−1 |
| 149 | [Addition] Added IniRenderer and IniRenderer test cases #137 | open | mixed | +1233/−1 |
| 140 | Issue Template Forms | open | mixed | +249/−0 |
Generated 2026-09-28 · arcade-agent baseline computed in 4.2 s.