Skip to content

Commit 69e4821

Browse files
committed
feat(site): language coverage grid + README mirror for new metrics
- Add languages section with 68 cells colored by analysis tier (full AST + type inheritance, full AST + complexity, configurable plugin) - Compact tile size so the grid reads as a coverage map - Mirror edit-risk, score-drift, and bug-density capabilities into README to match the website - Bump README language count from 45 to 68
1 parent b50c89d commit 69e4821

3 files changed

Lines changed: 202 additions & 8 deletions

File tree

README.md

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,27 @@ independent baselines, zero cross-project bleed.
9797
- **Splayed-table agent memory** - scan results materialized as
9898
columnar tables so an agent's follow-up questions are instant
9999
reads, not re-scans
100-
- **Test gap detection** - files without nearby tests, ranked by risk
101-
- **Evolution signal** - bus factor, change-coupling pairs, temporal
102-
hotspots (churn x complexity)
103-
- **45 languages out of the box** - Rust, Python, TypeScript, C, C++
104-
via tree-sitter; 40 more (Go, Java, Kotlin, Swift, Ruby, Elixir,
105-
Haskell, Clojure, Zig, ...) via configurable plugins. Add your own
100+
- **Edit-risk per file** - one number per file ranking which the next
101+
agent edit is most likely to break. Composite of churn, max
102+
complexity, single-owner penalty, and missing-tests penalty,
103+
refreshed on every save
104+
- **Score drift per session** - every baseline save appends a sample;
105+
verify diffs against the previous one and surfaces per-dimension
106+
drift (Equality went B to D) instead of a single aggregate delta
107+
- **Bug-density per file** - files where most of the churn is fix
108+
commits float to the top. Conventional Commits prefixes (fix,
109+
hotfix, revert) drive the classifier; absolute count and ratio
110+
against total commits both feed the ranking
111+
- **Test gap detection** - files without nearby tests, ranked by
112+
structural risk. Feeds directly into the edit-risk score so
113+
untested files in churn-heavy areas surface first
114+
- **Evolution signal** - bus factor per file, change-coupling pairs,
115+
temporal hotspots (churn x complexity), file age windows, and
116+
bug-fix concentration over the last 500 commits
117+
- **68 language profiles out of the box** - Rust, Python, TypeScript,
118+
C, C++ via tree-sitter; 63 more standard profiles (Go, Java,
119+
Kotlin, Swift, Ruby, Elixir, Haskell, Clojure, Zig, GLSL,
120+
Terraform, Dockerfile, ...) via configurable plugins. Add your own
106121
in `.raysense/plugins/`.
107122

108123
## Built on Rayforce

site/index.html

Lines changed: 94 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
<a href="#grading">Grading</a>
9696
<a href="#install">Install</a>
9797
<a href="#agents">Agents</a>
98+
<a href="#languages">Languages</a>
9899
<a class="nav-link-strong" href="https://github.com/RayforceDB/raysense" target="_blank" rel="noopener">GitHub</a>
99100
</div>
100101
</div>
@@ -305,13 +306,104 @@ <h3>Evolution signal</h3>
305306
<p>Bus factor per file, change-coupling pairs, temporal hotspots (churn x complexity), file age windows, and bug-fix concentration. Six lenses on how the codebase has actually moved over the last 500 commits.</p>
306307
</div>
307308
<div class="feature-card">
308-
<h3>45 languages</h3>
309-
<p>Rust, Python, TypeScript, C, C++ via tree-sitter. 40 more (Go, Java, Kotlin, Swift, Ruby, Elixir, Haskell, Clojure, Zig, ...) via configurable plugins.</p>
309+
<h3>68 languages out of the box</h3>
310+
<p>Five tree-sitter built-ins with full AST analysis, plus 63 configurable plugins covering everything from Solidity to COBOL. <a href="#languages">See the coverage map &rarr;</a></p>
310311
</div>
311312
</div>
312313
</div>
313314
</section>
314315

316+
<section id="languages" class="section">
317+
<div class="container">
318+
<div class="section-eyebrow">LANGUAGE COVERAGE</div>
319+
<h2>68 languages, three tiers of analysis depth.</h2>
320+
<p class="section-lead">
321+
Tree-sitter built-ins get the full pipeline: function bodies parsed, cyclomatic and cognitive complexity, type inheritance (Python and TypeScript), and call graphs. The catalog plugins extract functions and imports via configurable prefix patterns, no AST. Every other metric on this page (edit-risk, score drift, bug-density, evolution, blast radius) works at every tier.
322+
</p>
323+
324+
<div class="lang-legend">
325+
<span class="lang-legend-item"><span class="lang-swatch lang-tier-3"></span>Full AST + type inheritance</span>
326+
<span class="lang-legend-item"><span class="lang-swatch lang-tier-2"></span>Full AST + complexity</span>
327+
<span class="lang-legend-item"><span class="lang-swatch lang-tier-1"></span>Configurable plugin</span>
328+
</div>
329+
330+
<div class="lang-grid">
331+
<div class="lang-cell lang-tier-1">Assembly</div>
332+
<div class="lang-cell lang-tier-2">C</div>
333+
<div class="lang-cell lang-tier-1">C#</div>
334+
<div class="lang-cell lang-tier-2">C++</div>
335+
<div class="lang-cell lang-tier-1">Clojure</div>
336+
<div class="lang-cell lang-tier-1">CMake</div>
337+
<div class="lang-cell lang-tier-1">COBOL</div>
338+
<div class="lang-cell lang-tier-1">CoffeeScript</div>
339+
<div class="lang-cell lang-tier-1">Crystal</div>
340+
<div class="lang-cell lang-tier-1">CSS</div>
341+
<div class="lang-cell lang-tier-1">D</div>
342+
<div class="lang-cell lang-tier-1">Dart</div>
343+
<div class="lang-cell lang-tier-1">Dockerfile</div>
344+
<div class="lang-cell lang-tier-1">Elixir</div>
345+
<div class="lang-cell lang-tier-1">Elm</div>
346+
<div class="lang-cell lang-tier-1">Erlang</div>
347+
<div class="lang-cell lang-tier-1">F#</div>
348+
<div class="lang-cell lang-tier-1">Fortran</div>
349+
<div class="lang-cell lang-tier-1">GDScript</div>
350+
<div class="lang-cell lang-tier-1">GLSL</div>
351+
<div class="lang-cell lang-tier-1">Go</div>
352+
<div class="lang-cell lang-tier-1">Gradle</div>
353+
<div class="lang-cell lang-tier-1">GraphQL</div>
354+
<div class="lang-cell lang-tier-1">Groovy</div>
355+
<div class="lang-cell lang-tier-1">Haskell</div>
356+
<div class="lang-cell lang-tier-1">HCL</div>
357+
<div class="lang-cell lang-tier-1">HTML</div>
358+
<div class="lang-cell lang-tier-1">Java</div>
359+
<div class="lang-cell lang-tier-1">JSON</div>
360+
<div class="lang-cell lang-tier-1">Jsonnet</div>
361+
<div class="lang-cell lang-tier-1">Julia</div>
362+
<div class="lang-cell lang-tier-1">Kotlin</div>
363+
<div class="lang-cell lang-tier-1">Lisp</div>
364+
<div class="lang-cell lang-tier-1">Lua</div>
365+
<div class="lang-cell lang-tier-1">Make</div>
366+
<div class="lang-cell lang-tier-1">Markdown</div>
367+
<div class="lang-cell lang-tier-1">MATLAB</div>
368+
<div class="lang-cell lang-tier-1">Nim</div>
369+
<div class="lang-cell lang-tier-1">Objective-C</div>
370+
<div class="lang-cell lang-tier-1">OCaml</div>
371+
<div class="lang-cell lang-tier-1">Pascal</div>
372+
<div class="lang-cell lang-tier-1">Perl</div>
373+
<div class="lang-cell lang-tier-1">PHP</div>
374+
<div class="lang-cell lang-tier-1">PowerShell</div>
375+
<div class="lang-cell lang-tier-1">Proto</div>
376+
<div class="lang-cell lang-tier-3">Python</div>
377+
<div class="lang-cell lang-tier-1">R</div>
378+
<div class="lang-cell lang-tier-1">ReScript</div>
379+
<div class="lang-cell lang-tier-1">Ruby</div>
380+
<div class="lang-cell lang-tier-2">Rust</div>
381+
<div class="lang-cell lang-tier-1">Scala</div>
382+
<div class="lang-cell lang-tier-1">Scheme</div>
383+
<div class="lang-cell lang-tier-1">Shell</div>
384+
<div class="lang-cell lang-tier-1">Solidity</div>
385+
<div class="lang-cell lang-tier-1">SQL</div>
386+
<div class="lang-cell lang-tier-1">Svelte</div>
387+
<div class="lang-cell lang-tier-1">Swift</div>
388+
<div class="lang-cell lang-tier-1">Terraform</div>
389+
<div class="lang-cell lang-tier-1">Thrift</div>
390+
<div class="lang-cell lang-tier-1">TOML</div>
391+
<div class="lang-cell lang-tier-3">TypeScript</div>
392+
<div class="lang-cell lang-tier-1">V</div>
393+
<div class="lang-cell lang-tier-1">VB</div>
394+
<div class="lang-cell lang-tier-1">Vue</div>
395+
<div class="lang-cell lang-tier-1">Vyper</div>
396+
<div class="lang-cell lang-tier-1">XML</div>
397+
<div class="lang-cell lang-tier-1">YAML</div>
398+
<div class="lang-cell lang-tier-1">Zig</div>
399+
</div>
400+
401+
<p class="lang-footnote">
402+
Add your own language at any tier via <code>.raysense/plugins/&lt;name&gt;/plugin.toml</code>. Tree-sitter grammars can be loaded dynamically with the convention <code>tree_sitter_&lt;name&gt;</code>.
403+
</p>
404+
</div>
405+
</section>
406+
315407
<section class="section section-rayforce">
316408
<div class="container narrow">
317409
<div class="section-eyebrow">BUILT ON</div>

site/style.css

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,5 +569,92 @@ em { font-style: normal; color: var(--accent); font-weight: 600; }
569569
color: var(--text-dim);
570570
}
571571

572+
/* ───────── language coverage grid ───────── */
573+
.lang-legend {
574+
display: flex;
575+
flex-wrap: wrap;
576+
gap: 24px;
577+
margin-bottom: 28px;
578+
}
579+
.lang-legend-item {
580+
display: inline-flex;
581+
align-items: center;
582+
gap: 10px;
583+
font-family: var(--font-mono);
584+
font-size: 0.78rem;
585+
font-weight: 500;
586+
letter-spacing: 0.04em;
587+
color: var(--text-mute);
588+
}
589+
.lang-swatch {
590+
width: 14px;
591+
height: 14px;
592+
border-radius: 3px;
593+
border: 1px solid var(--border);
594+
flex: none;
595+
}
596+
597+
.lang-grid {
598+
display: grid;
599+
grid-template-columns: repeat(auto-fill, minmax(76px, 1fr));
600+
gap: 6px;
601+
margin-bottom: 32px;
602+
}
603+
.lang-cell {
604+
aspect-ratio: 1 / 1;
605+
display: flex;
606+
align-items: center;
607+
justify-content: center;
608+
padding: 4px 6px;
609+
border-radius: 6px;
610+
font-family: var(--font-mono);
611+
font-size: 0.7rem;
612+
font-weight: 500;
613+
text-align: center;
614+
border: 1px solid var(--border);
615+
transition: transform 0.12s ease, border-color 0.15s, background 0.15s;
616+
}
617+
.lang-cell:hover {
618+
transform: translateY(-2px);
619+
z-index: 2;
620+
}
621+
622+
.lang-tier-3,
623+
.lang-swatch.lang-tier-3 {
624+
background: rgba(94, 234, 212, 0.18);
625+
border-color: var(--accent);
626+
color: var(--accent);
627+
}
628+
.lang-tier-3:hover {
629+
background: rgba(94, 234, 212, 0.28);
630+
}
631+
.lang-tier-2,
632+
.lang-swatch.lang-tier-2 {
633+
background: rgba(96, 165, 250, 0.10);
634+
border-color: rgba(96, 165, 250, 0.55);
635+
color: #82bbff;
636+
}
637+
.lang-tier-2:hover {
638+
background: rgba(96, 165, 250, 0.18);
639+
}
640+
.lang-tier-1,
641+
.lang-swatch.lang-tier-1 {
642+
background: rgba(255, 255, 255, 0.02);
643+
border-color: var(--border);
644+
color: var(--text-mute);
645+
}
646+
.lang-tier-1:hover {
647+
background: rgba(255, 255, 255, 0.05);
648+
border-color: var(--border-hover);
649+
color: var(--text);
650+
}
651+
652+
.lang-footnote {
653+
font-size: 0.88rem;
654+
color: var(--text-dim);
655+
line-height: 1.6;
656+
max-width: 720px;
657+
}
658+
572659
/* ───────── selection ───────── */
573660
::selection { background: rgba(94, 234, 212, 0.32); color: var(--text); }

0 commit comments

Comments
 (0)