Skip to content

Commit 81ed144

Browse files
release: v0.43.0 (#1612)
Version bump across pyproject, the three package __init__ constants, the two Claude Code plugin manifests and server.json, with uv.lock regenerated. The lockfile also picks up tree-sitter-pascal, which #1353 added to pyproject without relocking. Changelog for the cycle, resynced into the bundled copy the whats-new panel reads. Plugin parity: four commands documented behaviour that has moved. - risk now leads with fix history; the score measures diff size and spread, omitting the revspec scores uncommitted work, and --baseline / --target exist - --no-editor-setup now also skips the four project-local files, and --save-key / --no-save-key are new - decision add records from flags with no prompting - why answers about --target, and refuses a question the store cannot answer Edited in plugins/shared and re-rendered, so the Codex prompts move with them. Codex plugin to 0.6.0: it shipped a hooks change this cycle. README language count to 19 for Object Pascal.
1 parent 93879a9 commit 81ed144

25 files changed

Lines changed: 398 additions & 136 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.42.0",
17+
"version": "0.43.0",
1818
"category": "productivity",
1919
"keywords": [
2020
"codebase",

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ queryable from the CLI, the MCP tools, and the local dashboard.
128128

129129
| Layer | What it gives you | Edge |
130130
|---|---|---|
131-
| **◈ Graph** | Dependency graph across 18 languages · file + symbol nodes · 3-tier call resolution · Leiden communities · PageRank and execution flows · route→handler edges across 22 frameworks | A real graph most tools never build |
131+
| **◈ Graph** | Dependency graph across 19 languages · file + symbol nodes · 3-tier call resolution · Leiden communities · PageRank and execution flows · route→handler edges across 22 frameworks | A real graph most tools never build |
132132
| **◈ Git** | Hotspots (decayed churn + activity floors) · ownership % · co-change pairs (hidden coupling) · bus factor · which files actually get bug-fixed, and how recently | Behavioural signals static analysis cannot see |
133133
| **◈ Docs** | A generated wiki page per module and file · rebuilt incrementally every commit · freshness and confidence scoring · hybrid search (full-text + vector) · selectable style and output language | Stays current instead of rotting |
134134
| **◈ Decisions** | Architectural decisions mined from five sources, evidence-backed, each traced to a verbatim source span and stamped exact / fuzzy / unverified | **★ Captured nowhere else** |
@@ -404,7 +404,7 @@ the orchestrators. Full matrix and the contributor recipe:
404404

405405
## Supported languages
406406

407-
**18 languages parsed to AST · 13 at the Full tier · framework-aware across all of them.**
407+
**19 languages parsed to AST · 13 at the Full tier · framework-aware across all of them.**
408408

409409
<p>
410410
<strong>Full tier &nbsp;</strong>
@@ -428,6 +428,7 @@ the orchestrators. Full matrix and the contributor recipe:
428428
<img src="https://img.shields.io/badge/Swift-F05138?style=flat-square&logo=swift&logoColor=white" alt="Swift" />
429429
<img src="https://img.shields.io/badge/PHP-777BB4?style=flat-square&logo=php&logoColor=white" alt="PHP" />
430430
<img src="https://img.shields.io/badge/Dart-0175C2?style=flat-square&logo=dart&logoColor=white" alt="Dart" />
431+
<img src="https://img.shields.io/badge/Delphi-EE1F35?style=flat-square&logo=delphi&logoColor=white" alt="Object Pascal / Delphi" />
431432
&nbsp;<strong>· Partial &nbsp;</strong>
432433
<img src="https://img.shields.io/badge/Luau-00A2FF?style=flat-square&logo=lua&logoColor=white" alt="Luau" />
433434
</p>

docs/CHANGELOG.md

Lines changed: 78 additions & 20 deletions
Large diffs are not rendered by default.

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.42.0"
19+
__version__ = "0.43.0"

packages/cli/src/repowise/cli/agent_targets/_data/codex_prompts/repowise-decision.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,12 @@ sources and tracks them for staleness and conflicts. This command drives the
2424
- **show**`repowise decision show <id>` — full record: rationale, evidence
2525
spans, status, and the supersession lineage.
2626
- **add**`repowise decision add` — guided interactive capture (~90s). Use when
27-
the user makes a decision during the session and wants it recorded.
27+
the user makes a decision during the session and wants it recorded. With both
28+
`--title` and `--decision` it records without prompting and prints the id
29+
(`--format json` to parse it back), which is the form to use with no terminal.
30+
The rest are optional: `--context`, `--rationale`, `--alternative`,
31+
`--consequence`, `--affects`, `--tag`, the last four repeatable. A flag-driven
32+
record lands `proposed` for a person to `confirm`.
2833
- **confirm**`repowise decision confirm` — review decisions auto-proposed from
2934
git history and accept or reject them.
3035
- **deprecate / dismiss**`repowise decision deprecate <id>` (optionally
@@ -35,5 +40,6 @@ sources and tracks them for staleness and conflicts. This command drives the
3540
- For *querying* why code looks the way it does mid-task, prefer the `get_why`
3641
MCP tool (the `architectural-decisions` skill) — it returns lineage and an
3742
alignment score. This command is for *managing* the decision records themselves.
38-
- `add` and `confirm` are interactive; tell the user when a step needs their input.
43+
- `confirm` is interactive, and so is `add` unless you pass `--title` and
44+
`--decision`; tell the user when a step needs their input.
3945
- If unsure of an exact subcommand or flag, run `repowise decision --help`.

packages/cli/src/repowise/cli/agent_targets/_data/codex_prompts/repowise-init.md

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,22 @@ Git:
9696
--follow-renames Track files across renames (slower but more accurate history)
9797
9898
Editor integration:
99-
--editor-setup / Register (default) or skip the global MCP server entry
100-
--no-editor-setup and Claude Code hooks in ~/.claude/settings.json and
101-
Claude Desktop's config, plus the distill rewrite-hook
102-
offer. There is one 'repowise' MCP entry per config, so
103-
a later init from another repo repoints it. See Step 3b.
99+
--editor-setup / Wire repowise into your editors (default), or skip it
100+
--no-editor-setup entirely. Covers both halves: the machine-wide config
101+
(~/.claude/settings.json, Claude Desktop's config, the
102+
Claude Code hooks, the distill rewrite-hook offer) and
103+
the project-local files (.mcp.json, .claude/CLAUDE.md,
104+
.vscode/mcp.json, .vscode/extensions.json). With
105+
--no-editor-setup only .repowise/ is touched. There is
106+
one 'repowise' MCP entry per machine-wide config, so a
107+
later init from another repo repoints it. See Step 3b.
108+
109+
Keys:
110+
--save-key / Save the provider key this run authenticated with to
111+
--no-save-key .repowise/.env (gitignored, owner-only). Default: on,
112+
so the MCP server can answer later without the shell
113+
that set it. Use --no-save-key in CI or on a shared
114+
machine.
104115
105116
Output:
106117
--no-claude-md Don't generate/update CLAUDE.md
@@ -122,8 +133,10 @@ Then ask if they want you to construct a command or if they'll handle it.
122133
Every path reaches this step. It is about the repo, not the provider.
123134

124135
By default `init` registers repowise as the user's global MCP server, in
125-
`~/.claude/settings.json` and Claude Desktop's config. There is **one**
126-
`repowise` key in each file, so this repo replaces whatever repo is registered
136+
`~/.claude/settings.json` and Claude Desktop's config, and writes four
137+
project-local files into the repo (`.mcp.json`, `.claude/CLAUDE.md`,
138+
`.vscode/mcp.json`, `.vscode/extensions.json`). There is **one** `repowise` key
139+
in each machine-wide config, so this repo replaces whatever repo is registered
127140
now. That is the right default for the repo someone actually works in, and the
128141
wrong one for a checkout that is about to disappear.
129142

@@ -138,9 +151,11 @@ Also add it if the user says they don't want their editor or MCP setup touched.
138151
Do **not** infer that from "just index it" or "don't ask me questions" — those
139152
are about prompts, not config.
140153

141-
The index, the wiki, and every project-local file are identical either way.
142-
Only the machine-wide registration is skipped, and it can be done later by
143-
re-running `repowise init` in that repo without the flag.
154+
The index and the wiki are identical either way. What the flag skips is both
155+
the machine-wide registration and the four project-local files, so with it only
156+
`.repowise/` is touched. (`.repowise/mcp.json` is still written: it is what
157+
`repowise mcp .` prints, and it is how you opt back in.) Either half can be
158+
done later by re-running `repowise init` in that repo without the flag.
144159

145160
Whichever you pick, say which in one line so the user can correct you.
146161

@@ -218,10 +233,11 @@ After init completes successfully:
218233
3. Tell the user:
219234
- "Repowise has indexed your codebase. The MCP tools are now active — I can answer questions about your architecture, ownership, dependencies, and more."
220235
**Only if you did not pass `--no-editor-setup`.** With that flag nothing was
221-
registered, so say instead: "The index is built. I did not register it as
222-
your global MCP server (this looked like a temporary checkout). The
223-
repowise plugin's tools still work here; to make this the repo the MCP
224-
server points at, re-run `repowise init` without `--no-editor-setup`."
236+
registered and nothing was written into the repo outside `.repowise/`, so
237+
say instead: "The index is built. I did not register it as your global MCP
238+
server and wrote no editor files into the repo (this looked like a
239+
temporary checkout). The repowise plugin's tools still work here; to wire
240+
it up properly, re-run `repowise init` without `--no-editor-setup`."
225241
- "Try asking me something like 'how does the auth module work?' or 'what depends on utils.py?'"
226242
- "Run `/prompts:repowise-status` anytime to check the health of your index."
227243
- "Run `/prompts:repowise-update` after making code changes to keep the wiki in sync."

packages/cli/src/repowise/cli/agent_targets/_data/codex_prompts/repowise-risk.md

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,33 @@ description: Score the defect risk of a change — a commit or a base..head rang
44

55
# Repowise Risk
66

7-
Score a *change* (not a file) for defect risk. Repowise reads the diff shape —
8-
lines added/deleted, files, directories, subsystems, change entropy, and author
9-
familiarity — and returns a 0–10 score with an attributable driver breakdown.
10-
Pure git + learned constants: no LLM, no network. A natural pre-merge / PR gate.
7+
Score a *change* (not a file) for defect risk. The response leads with
8+
`fix_history`: the recency-weighted bug-fix record of the files the change
9+
touches, which of them carry it, and where that sits among the repo's own
10+
fix-bearing files. The 0–10 score sits beside it and measures diff size and
11+
spread (named in `score_measures`) rather than danger, so read the fix history
12+
first. Pure git + learned constants: no LLM, no network. A natural pre-merge /
13+
PR gate.
1114

1215
## Steps
1316

1417
1. If `.repowise/` doesn't exist: "This repo isn't indexed yet. Run `/prompts:repowise-init` first." Stop.
1518
2. Resolve the target from `$ARGUMENTS`, run `repowise risk`, and present the
16-
score, level, and top drivers — calling out *why* it's risky (e.g. wide
17-
diffusion across subsystems, low author familiarity).
19+
fix history first (which files keep breaking, and the repo-relative
20+
percentile), then the score and its drivers.
1821

1922
## Choosing the revspec
2023

21-
- No args → `repowise risk` (scores `HEAD`)
24+
- No args → `repowise risk` (scores uncommitted work, or `HEAD` when the tree is clean)
2225
- A commit SHA → `repowise risk <sha>`
2326
- A range / PR / branch → `repowise risk <base>..<head>` (e.g. `repowise risk main..HEAD`)
2427

2528
Useful flags:
2629
- `--ext .py,.ts` — only count changes in those file types
2730
- `-x, --exclude <pattern>` — gitignore-style pattern to drop from the diff (repeatable; also honors a `.riskignore` file)
28-
- `--format json` — machine-readable score + features + drivers
31+
- `--format json` — machine-readable fix history + score + features + drivers
32+
- `--baseline <n>` — how many recent commits to rank the change against (0 disables)
33+
- `-t, --target <path>` — score what history says about named files instead of a change (repeatable; reads the index)
2934
- `--path <dir>` — point at a different git repo
3035

3136
## How this differs from the other risk views

packages/cli/src/repowise/cli/agent_targets/_data/codex_prompts/repowise-why.md

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ command **queries** why something is shaped a certain way.
2424
- File path (governing decisions + origin story) → `repowise why src/api/auth.py`
2525
- Target-anchored search → `repowise why "why the retry cap?" --target src/api/client.py`
2626
(`--target` is repeatable)
27-
- No args → `repowise why` (decision-health dashboard: stale / proposed /
28-
ungoverned hotspots)
27+
- `--target` with no question → answers about those files: one target behaves
28+
like passing the path, several get a card each
29+
- No args and no target → `repowise why` (decision-health dashboard: stale /
30+
proposed / ungoverned hotspots)
2931
- Machine-readable / raw payload → `--format json` / `--full`
3032

3133
```
@@ -40,8 +42,13 @@ tool-adapter commands.
4042

4143
## Notes
4244

43-
- Falls back to git archaeology when a path has no decisions, so it is never
44-
empty — call that out so the user knows it is reconstructed, not recorded.
45+
- A *path* falls back to git archaeology when it has no decisions, so it is
46+
never empty — call that out so the user knows it is reconstructed, not
47+
recorded.
48+
- A *question* the store cannot answer comes back with no decisions, one
49+
sentence on why, and a pointer to the tool that fits the question's shape.
50+
Relay the redirect rather than filling the gap: an empty result there means
51+
the decision store has nothing, not that the question is unanswerable.
4552
- For *managing* ADR records (add / confirm / deprecate), use
4653
`/prompts:repowise-decision`.
4754
- Before contradicting an existing decision, surface it to the user first.

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.42.0"
9+
__version__ = "0.43.0"

0 commit comments

Comments
 (0)