Skip to content

Commit 6bf9133

Browse files
release: v0.38.0 (#1298)
Version bump across pyproject, the three package __init__ files, uv.lock and both plugin manifests, plus the 0.38.0 changelog section and its bundled copy. Store format and parser schema are unchanged. The parse cache self-invalidates this cycle anyway: the .scm query sources and the models.py dataclass shapes both moved, and both are folded into the parse fingerprint. uv.lock also picks up tree-sitter-svelte and tree-sitter-html, which the Svelte, Vue and HTML language support added this cycle and which had not been relocked on main. Plugin parity check: the live MCP tool list, the CLI flags the commands document and the hook matchers in hooks.json are all unchanged, so the plugin work is the version bump alone.
1 parent 7c037e9 commit 6bf9133

10 files changed

Lines changed: 177 additions & 7 deletions

File tree

.claude-plugin/marketplace.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"name": "repowise",
1515
"source": "./plugins/claude-code",
1616
"description": "Codebase intelligence for Claude Code. Indexes your repo into five layers (Graph, Git, Docs, Decisions, Code Health) and gives Claude deep understanding of architecture, ownership, hotspots, decisions, and defect risk — fewer greps, fewer file reads, lower cost per query.",
17-
"version": "0.37.0",
17+
"version": "0.38.0",
1818
"category": "productivity",
1919
"keywords": [
2020
"codebase",

docs/CHANGELOG.md

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,70 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
---
1111

12+
## [0.38.0] — 2026-08-04
13+
14+
Four new languages, an orientation set rebuilt around what a reader actually needs, and a wiki that draws on the repository's own vocabulary instead of writing generic prose about it. Svelte and Vue reach the Full tier through a byte-preserving projection into TypeScript; HTML lands at the import tier; reStructuredText documents are read as reStructuredText rather than silently yielding nothing. Onboarding is six pages now, ending in a glossary built entirely from mined terms, and a directory that heads a subsystem gets a chapter even when it also holds files of its own. Full-text search was rebuilt on both backends after the query shape turned out to match 65% of the corpus on a median question. The agent hooks got measurement first and then acted on it: the Grep flood is replaced by its digest instead of ranked next to it, triage ranks the files the search actually matched, and the three hot index lookups dropped an ORM import that cost a second per hook fire.
15+
16+
### Added
17+
- **Svelte and Vue at the Full tier.** A markup grammar locates the JavaScript-bearing regions of a single-file component, every other byte is blanked to a space with newlines preserved, and each markup expression is fenced by rewriting its two surrounding delimiter bytes. The result is valid TypeScript at byte-identical offsets, so the TypeScript queries, language config and all three health dialects apply unchanged; only region location differs per language. Components reach the file tree, git history, wiki and health for the first time. (#1221, #1232)
18+
- **HTML at the import tier,** via `script src` and `link href`. HTML has no functions, classes or calls, so this ships an import-only tier and says so on every surface rather than minting symbols that do not exist. Template dialects are out of scope and that is stated: `{% extends %}` is plain text to an HTML grammar, and 744 of 749 measured dialect files produce no edges. (#1235)
19+
- **reStructuredText is read as reStructuredText.** Every pattern in the document miner was markdown-only, so a repository that documents itself in `.rst` looked identical to one that says nothing. flask, requests and django were all in that position. Underline-length, directive bodies and roles are each handled, and `.rst` prose written under a `.txt` extension is picked up too. (#1238, #1247)
20+
- **A glossary page, written entirely in the repository's own words.** House vocabulary (blast radius, change risk, co-change, distill) had no definition anywhere a reader could reach. Each row is a term, the repository's own defining sentence, where it is used and which document it was written in. The page has no model in its path at all: every cell is a fact the run already holds, so it costs no tokens and cannot hallucinate. (#1276)
21+
- **Subject chapters.** A parent directory was disqualified from heading its children whenever it also held loose files of its own, because both pages would collide on one page id. That excluded exactly the directories a reader most wants a chapter for, and did it silently: nine of thirteen chapters suppressed on this repository, five of six on django. (#1282)
22+
- **Perf dialects for Kotlin and C++, and a dataflow def/use dialect for C++,** which moves C++ to the Full tier with intra-procedural CFG, reaching definitions and Extract Method suggestions. C++ deliberately omits three markers other languages carry, each of which would be a guaranteed false positive there. (#1224, #1225)
23+
- **A page says how far it can be trusted.** `confidence` had been a constant 1.0 on every page ever generated, so the reader's low-confidence banner had never rendered for anyone and retrieval could not weight by it. A wiki where a provider outage left hundreds of structural stubs looked exactly as trustworthy as a complete one. (#1213)
24+
- **File pages and symbol spotlights name the questions they answer,** built from structure rather than prose, and emitted only where the page can actually answer them. (#1209, #1210)
25+
- **Hook efficacy measurement.** Four of five hook surfaces wrote rows nobody read, and the Read surface wrote none at all, so a nudge could fire 500 times at a 0.2% action rate with nothing in the product noticing. Transcripts are replayed to pair each emission with the tool calls that followed it. (#1272)
26+
- **Vocabulary mining with provenance.** Mined terms now carry their defining sentence, the document they were read from and every document that names them, which is what the overview, onboarding, key concepts and the glossary are built on. (#1233, #1241, #1242, #1249)
27+
- **`get_answer` meters what one synthesis call costs,** and configurable synthesis evidence lets a deployment choose how much the model is shown. (#1180, #1227)
28+
- **Retired page ids keep resolving,** and a retired page can hand off to the repository overview instead of dead-ending. (#1163, #1166)
29+
- **The OpenAI embedder honours a configured output width,** for deployments pinning a narrower vector than the model's default. (#1254)
30+
- **`update` names the orientation pages an index has never been offered** and points at `--full`, which is the path that can actually deliver them. An incremental run reads a changed-file slice, and every onboarding gate reads whole-repo signals. (#1288)
31+
32+
### Changed
33+
- **The docs tree opens on the shape of the repository, not its contents.** Layers used to open by default, which was fine when a layer held a handful of children and wrong once layers grouped every module: roughly ninety module rows on the first screen, burying the layer names and the chapters alike. Layers start closed, the file corpus sits above the layer outline rather than under it, and an unclaimed module no longer poses as a layer. (#1184, #1185, #1186, #1187)
34+
- **A search hit's snippet is centred on what the query matched.** It used to be the first 200 characters of the page, which on a generated page is the same `## Overview` opener every time: identical across thousands of hits, and never the passage that matched. (#1191)
35+
- **The Grep flood is served as its digest, not ranked beside it.** Ranking a flood you also keep is a lens, not a saving; the digest was being added next to output the agent had already been billed for. It replaces the flood now, the same trade `distill` makes for shell output. Measured over real Grep payloads in 25 transcripts, the digest is 0.30 of the flood. (#1283)
36+
- **Grep triage ranks the files the search actually matched.** It built candidates from name and path matches ranked by PageRank without ever reading the grep output; replayed over 1,899 real Grep calls, 83 of the 111 files it named were not in the grep results at all. (#1296)
37+
- **The Read hook serves the skeleton instead of recommending it.** (#1275)
38+
- **`distill` rewrites safe command chains instead of bailing on their shape.** `repowise saved --missed` reported 138,827 tokens over 478 runs in 7 days that never reached distill. The binding gate was a re-quoting rule that refused any command containing a quote, a dollar sign or a backslash, so `grep -n "a\|b" f.py | head` bailed on the quotes it obviously contains. What `--missed` counts is corrected alongside. (#1291)
39+
- **Module pages name their own symbols** and stop opening with the same sentence as every other module page. (#1211, #1212)
40+
- **The overview carries the architecture map, counts its packages** rather than describing them, and says what the repository does in the repository's own words. (#1164, #1246, #1249)
41+
- **One recipe for every page vector,** with a page below the information floor getting no vector at all and pages that lose text at the embedding cap named rather than silently truncated. (#1200, #1192, #1203)
42+
- **Running one CLI command stops paying for the whole import graph.** Three module-level imports were charging their dependency tree to every invocation, including every hook fire: `repowise --version` drops from 1,240ms to 150ms, and a silent hook from 965ms to 167ms. (#1273)
43+
- **The three hot index lookups read through stdlib `sqlite3`.** Reaching the index from a hook cost a second, 95% of it a single import that none of the three plain SELECTs needed. (#1297)
44+
- **A command no longer waits out its own telemetry POST.** (#1286)
45+
- **Decisions rank a person above a document,** two sources that never landed are retired, and `get_why` path mode is bounded. (#1290, #1293)
46+
- **Layers group the docs tree without needing a page to hang off,** and pages carry the provenance of the layer that groups them. (#1165, #1170, #1171)
47+
48+
### Fixed
49+
- **Full-text search was asking for most of the corpus.** Both backends built a MATCH expression that could not retrieve, failing in opposite directions: SQLite OR-ed every token with a prefix wildcard, so on a 3,678-page corpus the median question matched 65% of it and one matched everything; PostgreSQL handed the raw question to `plainto_tsquery`, which ANDs every lexeme and therefore matched almost nothing. A tombstoned page is also dropped from the index now, and a page can be too thin to be worth indexing. (#1188, #1190, #1198)
50+
- **The served skeleton never reached the agent.** `updatedToolOutput` is validated against the schema of the tool being replaced; the hook emitted a bare string where Read's output is an object, so Claude Code rejected it, used the original file, and the hook went on recording a saving. Every firing since the feature landed was a no-op that reported success. (#1278)
51+
- **The answer prompt formatter halved every page excerpt it fetched,** page content is attached on every retrieval rather than only the weak ones, and decision vectors and pageless ids stay out of the answer. (#1168, #1169, #1183)
52+
- **The first MCP tool call raced the lancedb import,** and the embedder API key is resolved from persisted config rather than the environment alone. (#1230, #1231)
53+
- **The data-shape fast path reads the question, not the whole paste,** and the early returns hand back the ranked pool they already hold. (#1284, #1289)
54+
- **Generation rejects pages that talk to the prompter,** refuses a structurally-keyed page with no key, drops sections a page cannot fill, tombstones a page whose file is gone, grounds flow narratives in exact source, and reads execution flows by the field names they have. A definition is taken to be prose the author wrote, not the markup below it. (#1172, #1201, #1202, #1206, #1207, #1208, #1229, #1245, #1248)
55+
- **JS/TS extraction picks up unparenthesized single-parameter arrow functions,** and HTML intrinsic elements no longer pose as JSX component call targets. (#1215, #1217)
56+
- **Python aliased imports parse correctly,** and a Node.js package `exports` wildcard may cross directory boundaries. (#1243, #1256)
57+
- **`doctor` reconciles the store against the database again.** (#1196)
58+
- **The Python perf dialect knows `pathlib` is filesystem I/O.** (#1269)
59+
- **The betweenness pool is bounded, live update locks are kept, and a failed page is counted once.** (#1262)
60+
- **Generation checks reach a normal run of `init` and `update`.** (#1178)
61+
- **Docker:** `/data` is created before `chown`, the image moves to `node:20-bookworm-slim` for glibc compatibility, and `.gitattributes` enforces LF on `.sh` files so the entrypoint runs on a Windows checkout. (#1266, #1268, #1270)
62+
- **The Stats punch card's UTC footnote describes rather than prescribes.** (#1240)
63+
64+
### Documentation
65+
- The README carries media that renders on GitHub, a section and a picture for the PR bot, and cites the 21-repo health validation. (#1197, #1205, #1218)
66+
- Published measured results with a comparison against real peers. (#1287)
67+
- A `structurizr` export walkthrough in the examples and in the CLI package README. (#1175, #1176)
68+
- CONTRIBUTING documents how to claim an issue. (#1263)
69+
- The vocabulary overlap thresholds record what they actually measure. (#1181)
70+
71+
### Dependencies
72+
- `tree-sitter-svelte` and `tree-sitter-html` are new, for Svelte and Vue respectively. There is no `tree-sitter-vue` on PyPI, and `tree-sitter-html` parses a Vue single-file component cleanly because `<template>`, `<script>` and `<style>` are ordinary elements to it.
73+
74+
---
75+
1276
## [0.37.0] — 2026-07-29
1377

1478
The release where the web UI got taken apart and put back together. Fourteen surfaces moved onto one design language: sections and hairlines instead of a grid of near-identical bordered cards, a sentence above every figure saying what the figure means, and a header row plus a key row on the pages whose canvas is the page. Overview, Docs, Commits, Contributors, Code Health, Coverage, Dead code, Chat, Settings, Decisions, Stats, Files, Refactoring, Knowledge Graph and Architecture all changed shape. The Architecture and Knowledge Graph canvases also got their marks named and their per-frame cost cut, and the docs page stopped downloading 38 MB of page bodies to draw a tree. Away from the UI there is a Structurizr DSL export, a first-run pass over interactive `init`, refreshed provider model defaults, and three MCP response fixes.

packages/cli/src/repowise/cli/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@
1616
# is already UTF-8.
1717
_ensure_utf8_stdio()
1818

19-
__version__ = "0.37.0"
19+
__version__ = "0.38.0"

packages/core/src/repowise/core/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@
66
Namespace package: repowise.core is part of the repowise namespace.
77
"""
88

9-
__version__ = "0.37.0"
9+
__version__ = "0.38.0"

0 commit comments

Comments
 (0)