Repository navigation
Expand file tree
/
Copy pathwhatsnew.json
More file actions
227 lines (227 loc) · 21 KB
/
Copy pathwhatsnew.json
File metadata and controls
227 lines (227 loc) · 21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
{
"current": "1.108.414",
"entries": [
{
"version": "1.108.414",
"date": "2026-11-03",
"title": "a class comes back as its outline, and an import finds the file in its own language",
"summary": "Fetching a class now returns its outline, each method collapsed to its signature; pass class_body=\"full\" for the whole body. An import with no extension now finds the file in the importer's own language first."
},
{
"version": "1.108.413",
"date": "2026-11-03",
"title": "the license terms read the same in the terminal, the package and the site",
"summary": "The license lines in the terminal and the package's own descriptions now say what the site says: work use at a for-profit company, or for client or paid work, needs a license."
},
{
"version": "1.108.412",
"date": "2026-11-03",
"title": "graph tools resolve each import once per loaded index, and a savings file holding the wrong type is refused, not frozen",
"summary": "Graph tools (dependency graph, importers, blast radius) now resolve each import once per loaded index instead of on every call, so a second call on a large repo answers in a fraction of the time. A savings file that parses but holds a string or another wrong type where the meter adds a number is now refused with a warning and the counts kept, instead of silently freezing the meter."
},
{
"version": "1.108.411",
"date": "2026-11-03",
"title": "a C or C++ #include resolves where the compiler finds it, and Go callers in the same package are found",
"summary": "A C or C++ #include now resolves where the compiler finds it: beside the including file, then at the repo root and under include/ and src/, so a C++ repo's import graph is no longer missing most of its header edges. Asking who calls a Go function now finds callers in the same package, which call each other with no import. The next index re-parses every file."
},
{
"version": "1.108.410",
"date": "2026-11-02",
"title": "a savings meter that stops measuring says so, and Rails views are indexed",
"summary": "A savings meter that stops measuring now says so: receipt, diagnose and get_session_stats report whether the lifetime total is current, stale or unknown, and a write can no longer wipe or lose counts. Ruby ERB templates (.erb) are indexed, so Rails views are searchable. reflect --apply-weights writes the tuning file the server actually reads when CODE_INDEX_PATH is set."
},
{
"version": "1.108.409",
"date": "2026-11-02",
"title": "a search for a name nothing carries says so on a default install",
"summary": "A search for a name that no symbol carries now says so in the answer itself, even on a default install that hides metadata: the results stay, marked as sharing words with the query only, and the answer is never presented as proof the name is absent. The work-license reminder's buy link now says where it was shown."
},
{
"version": "1.108.408",
"date": "2026-11-02",
"title": "a rare work-license reminder, never shown to a license holder",
"summary": "Using jCodeMunch for work needs a license, and a machine is now reminded of that rarely: 7 days after its first index, then at most once every 30 days, as one stderr line after a command a person reads or one field on a tool answer. Never with a license key, on CI, or after `jcodemunch-mcp config set license_reminder false`. Nothing is sent."
},
{
"version": "1.108.407",
"date": "2026-11-02",
"title": "a stdio server exits when the process that started it is gone, and storage reports how much disk the index uses",
"summary": "A stdio server now exits when the client that started it is gone, checked every 5 seconds, even if something else holds its input open. jcodemunch-mcp storage prints the index store's path and total, then each index by name, largest first. A query that names a tool, bare or with the host prefix, finds that tool first."
},
{
"version": "1.108.406",
"date": "2026-11-01",
"title": "watch-all leaves temp and idle indexes unwatched, and agents sharing an index stop reloading it",
"summary": "watch-all skips indexes under a temp folder and ones idle for 14 days, and watch exits when it cannot watch. Agents sharing one index no longer make each other reload it, and the first search on a large index tokenizes faster. init --git-hook re-indexes the files a branch switch changed. A key holder is never shown where to buy a license."
},
{
"version": "1.108.405",
"date": "2026-11-01",
"title": "get_class_hierarchy and find_implementations read a base list written after a colon",
"summary": "For a C# class Circle : IShape, get_class_hierarchy names IShape as an ancestor and find_implementations(\"IShape\") returns Circle. The same holds for Kotlin, Swift, C++ and Rust base lists, Ruby's class A < B, and Scala and Dart's extends B with T. An enum's underlying type (enum E : byte) is not read as a base. No re-index is needed."
},
{
"version": "1.108.404",
"date": "2026-11-01",
"title": "a failed summarizer keeps the summaries it had, and tool descriptions open with the agent's question",
"summary": "summarize_repo(force=true) keeps each stored summary when the provider fails for that symbol, and reports provider_fallbacks and previous_summaries_kept. Seventeen tool descriptions open with the question an agent asks, so a host that searches descriptions finds them. The plugin listing and the MCP registry show the jCodeMunch icon."
},
{
"version": "1.108.403",
"date": "2026-10-30",
"title": "a file pattern means the same thing in every tool, and the rate_limit config key turns the limit on",
"summary": "A file_pattern with a slash is anchored at the repo root and a bare one matches at any depth, the same way in search_text, the index store and every scope check. The rate_limit key in config.jsonc now turns on the HTTP rate limit, in the documented order. On Windows, init writes Codex's entry as the bare command name when PATH finds the same install. The CLI's license link points at the current site."
},
{
"version": "1.108.402",
"date": "2026-10-28",
"title": "the server instructions name the tools in the first 512 characters, and tool names hold across 1.x",
"summary": "Clients that read only the first 512 characters of the server instructions, Codex among them, now see the core tool names. Tool names are frozen for 1.x: a renamed tool keeps its old name as an alias for at least 30 days. Writing a file into a watched folder no longer re-walks the whole repo, and an install that never ran init sees the license terms once."
},
{
"version": "1.108.401",
"date": "2026-10-28",
"title": "a redirected Grep can carry the index's answer, and a substring search opens only the files that can match",
"summary": "With JCODEMUNCH_HOOK_GREP_ANSWER=1, the PreToolUse hook answers a redirected Grep with the search_text result instead of asking for a second turn; it is off by default. Indexing writes a trigram bitmap per cached file, so a substring search_text skips files that cannot match; a cold index takes about 10% longer."
},
{
"version": "1.108.400",
"date": "2026-10-27",
"title": "a text search returns the code it found, and a retired tool name says what replaced it",
"summary": "When search_text's matches fall inside a few small functions or classes, the page carries each one's source once, so an agent can edit without opening the file. Calling get_symbol or get_symbols, retired in March, now returns an error naming get_symbol_source and its argument."
},
{
"version": "1.108.399",
"date": "2026-10-26",
"title": "four core tool descriptions open with the question each tool answers",
"summary": "search_symbols, get_symbol_source, get_call_hierarchy and check_references now open with the question each answers, so a host that searches tool names and descriptions can match them. The counter instructions add a line for an issue that names its code."
},
{
"version": "1.108.398",
"date": "2026-10-25",
"title": "the semantic and all extras install a fixed filelock on every Python",
"summary": "pip install \"jcodemunch-mcp[semantic]\" on Python 3.10 took filelock 4.1.0, which has published advisories. The semantic and all extras now pin filelock 3.20.3 on Python 3.10 and require 4.2.1 or later on 3.11 and up."
},
{
"version": "1.108.397",
"date": "2026-10-24",
"title": "a cut search names the files it left off, and file_pattern takes braces",
"summary": "When search_text stops at max_results it lists the matching files it left off, with a count each (at most 20, with a total). file_pattern expands brace alternation such as a/{b,c}/**, bounded; a literal-brace path still matches."
},
{
"version": "1.108.396",
"date": "2026-10-23",
"title": "the first search on a large repository resolves each import once",
"summary": "The first search in a process resolves each distinct import once per file set instead of once per importing file. On a copy of the home-assistant/core index the first search_symbols took 24.4 s instead of 102.2 s, with identical import resolution."
},
{
"version": "1.108.395",
"date": "2026-10-22",
"title": "a text match says which function it is in",
"summary": "search_text and check_references give each match the innermost function, method or class around it, as in: {id, line, end_line}. search_text reports truncated and timed_out in the response body, and a file_pattern that matches no file returns a note saying nothing was searched."
},
{
"version": "1.108.394",
"date": "2026-10-22",
"title": "index_dependency validates package paths",
"summary": "index_dependency accepts only package names and reads only what is installed inside the repo: every package directory and its metadata must resolve inside the repo and be one package, the snapshot stays one directory in the store, and the copy skips secret, oversize, binary, symlinked and repo-gitignored files. index_folder(paths=...) honors .gitignore like a full index."
},
{
"version": "1.108.393",
"date": "2026-10-22",
"title": "a default install adds nothing to the model's context",
"summary": "A default `init` registers the server and installs only the hooks whose output the model never sees; the policy pastes (`--policy`) and the model-facing hooks (`--guidance`) are opt-in, an existing install keeps what it has, and `init --remove-guidance` removes them with backups. A question about how code works ranks functions, classes and methods above fields and UPPER_CASE constants that share a word with it, unless the query names values. The published token benchmark is re-measured: a lookup now fetches the code a question is about, so the headline against a grep-and-read agent moves from 96.6% (29.2x) to 96.2% (26.5x)."
},
{
"version": "1.108.392",
"date": "2026-10-22",
"title": "a warning in a tool's answer survives the compact encoding",
"summary": "A warning in a tool's answer, and its negative_evidence, now survive the compact encoding on a default install, where they were dropped; if any declared key would still be lost the answer falls back to JSON. A question about code ranks code above settings files: symbols from YAML, TOML, JSON and XML files and from stylesheets count for half unless the query names configuration or styling. get_call_hierarchy says which callers are direct (depth 1) and, for an indirect one, which row it is reached from (via), with direct_caller_count beside caller_count."
},
{
"version": "1.108.391",
"date": "2026-10-21",
"title": "a question about how code works ranks the code above its tests",
"summary": "A question about how code works now ranks the code above its tests: function words such as \"how\" and \"does\" count less in a multi-word question (never in a name), and test-file symbols rank below source code unless the query is about tests. A git worktree nested inside an indexed checkout (such as .claude/worktrees/x) is no longer given that checkout's index, in resolve_repo and in the session hooks. The .windsurfrules backup is named .windsurfrules.bak."
},
{
"version": "1.108.390",
"date": "2026-10-21",
"title": "the local embedding model is pinned and checked before it is used",
"summary": "The optional local embedding model is now downloaded from one fixed upstream revision and each file is checked against a pinned SHA-256 before it is used. A download goes to a temporary file and replaces the real one only after it matches, so an interrupted download no longer leaves a truncated model that later runs would load, and download-model re-checks a copy already on disk. The stated download size is corrected to about 90 MB. Pillow is no longer installed on Python 3.10, where no patched release exists; the groq-explain and all extras install Pillow 13 or newer on Python 3.11 and later."
},
{
"version": "1.108.389",
"date": "2026-10-21",
"title": "the core tools load up front where clients defer MCP tools",
"summary": "In clients that defer MCP tools, Claude Code among them by default, jcodemunch's core tools now load up front (route, menu and order on the default surface; the six core tools on the full surface), so the agent can use them from the first turn without a tool-search step. On stdio, the server's startup note says \"This repo is indexed by jcodemunch (N files)\" when the working directory was indexed. The steering hook names only tools the active surface publishes and says how to load order when it isn't loaded, and init reads the tool surface the way the server serves it."
},
{
"version": "1.108.388",
"date": "2026-10-21",
"title": "the license names jMunch, LLC, and the product says \"license\"",
"summary": "LICENSE moves to version 1.2, effective 2026-10-21: the copyright holder is now jMunch, LLC. The terms are word for word those of 1.1, and the SPDX identifier is unchanged, so nobody who allowlists it has to approve it again. The product now spells the word \"license\" everywhere a buyer reads it, and `jcodemunch-mcp license` with a rejected key points to j@gravelle.us for help instead of stopping at the error."
},
{
"version": "1.108.387",
"date": "2026-10-21",
"title": "a licensed install is not shown a sales line",
"summary": "init no longer ends with the $79 commercial-license line, and install-pack's listing no longer ends with \"Get a license\", when a license key is configured; jMunch promises paid clients they are never marketed to. The license command shows a pricing link (in text and in --json) only to an install with no key, and a valid Builder key reads \"Team features (org-rollup): not included in your license\". The gate reads the key and never validates it, so init still makes no network call. Also: certifi and Pillow lock updates for published advisories."
},
{
"version": "1.108.386",
"date": "2026-10-20",
"title": "the AI summary prompt can carry each symbol's own source, opt-in",
"summary": "summarizer_body_chars (default 0, off) lets the AI summary prompt carry up to that many characters of each symbol's indexed source plus its decorators, so a summary can say what a function does rather than what its signature suggests. The body goes to a non-local provider only when allow_remote_summarizer is true; it is redacted before it is cut. Contributed by @skibadubskiybadubs (#1175, #1179). Also: a Flask route declared with methods= reports the verbs it serves instead of GET (#1177), the prompt's Context: lines keep one order on every run (#1178), and a deferred AI summary writes the summary column and nothing else, so complexity and call references survive it (L-227)."
},
{
"version": "1.108.385",
"date": "2026-10-19",
"title": "a summary written by another process reaches this one's searches",
"summary": "A summary written by another process (a second server, a script) never reached this process's search cache, whose key held indexed_at, which a summary write leaves alone; a journal restored after an offline refresh served old summaries too. update_symbol_summaries now advances a summaries_generation counter in the same transaction and the cache key carries it. Also: an index read back in the process that saved it keeps ecosystem_context (L-224), and the README and registry description name the benchmark behind the 96.6% figure."
},
{
"version": "1.108.384",
"date": "2026-10-19",
"title": "the watcher no longer polls trees nothing indexes",
"summary": "Under WSL the file watcher polls every directory its census returns, and the census pruned only the built-in skip names, so it polled gitignored trees, caches and virtualenvs nothing indexes (96,191 entries across 23 repos in the report). The census and discovery now share one directory rule, which also prunes a gitignored or extra-ignored directory when everything below it would be ignored. discovery_skip_counts gains gitignored_dir and extra_ignore_dir. Reported by @yagiii1344 (#1163). Also: a search repeated after summarize_repo now serves the new summaries; the summary write evicts that repository from the search cache in the same process (L-226)."
},
{
"version": "1.108.383",
"date": "2026-10-19",
"title": "refreshing summaries no longer erases complexity and the call graph",
"summary": "summarize_repo(force=true), the documented way to refresh AI summaries, rewrote every symbol row and stored NULL in the fields its converter did not copy: cyclomatic, max_nesting, param_count and call_references. get_hotspots then returned [] and get_symbol_complexity said the data was unavailable. A refresh now writes only the summaries that changed, never onto a body a re-index changed meanwhile (reported as not_written). Reported by @SlimLemon (#1161)."
},
{
"version": "1.108.382",
"date": "2026-10-19",
"title": "a task capsule's risk entry carries the PR's real risk score",
"summary": "assemble_task_context copies get_pr_risk_profile's verdict into the capsule for review and audit tasks, and it read three keys the profile never published, so every capsule's risk entry said 0, \"\" and {} whatever the change. It now carries the real risk_score, risk_level and signal_breakdown; a score the profile withholds stays null with unmeasurable_axes beside it, and the list of files the import graph could not walk is capped at 20 with its total."
},
{
"version": "1.108.381",
"date": "2026-10-19",
"title": "one repository's index can no longer replace or stand in for another's",
"summary": "Two repositories whose owner and name join to the same <owner>-<name>, such as foo-bar/baz and foo/bar-baz, shared one index file, so indexing the second silently replaced the first and reads served its source under the first's name. The store now checks which repository each index belongs to before it writes, serves or deletes it, and refuses across a mismatch with an error naming both. Reported by mich3333."
},
{
"version": "1.108.380",
"date": "2026-10-19",
"title": "compacting a session no longer waits on a large index's landmarks",
"summary": "Before Claude Code compacts a conversation, jCodeMunch's PreCompact hook builds a Structural Landmarks section, and Claude Code waits for it. That section loaded and ranked every index holding a file the session touched, with no size cap or time limit. It now uses the same limits as the agent briefing (indexes over 100,000 symbols or of unknown size are skipped, and no index is started after 3 seconds), and it lists any index it skipped and why."
},
{
"version": "1.108.379",
"date": "2026-10-19",
"title": "a spawned agent no longer waits minutes for its jCodeMunch briefing",
"summary": "The SubagentStart hook briefed every index whose folder overlapped the agent's, and every index on the machine when nothing matched, loading and ranking each one before the agent could start; one report measured a 90-second median and 533 seconds at worst. It now loads at most one index (the most specific one containing the agent's folder, and only if it is small), describes everything else from counts it already has, briefs no repo when nothing matches, and stops ranking after 3 seconds. Reported by treyecollins (#1139)."
},
{
"version": "1.108.378",
"date": "2026-10-18",
"title": "install-pack's licence lookup writes no config file",
"summary": "install-pack without --license looked up your licence key in a way that could create a default config.jsonc when none existed, and that file could pin a new user to the full tool surface. The lookup now reads the config without ever writing one; --license, JCODEMUNCH_LICENSE_KEY and a license_key in config.jsonc resolve as before."
}
]
}