Skip to content

Commit 2e84bfa

Browse files
jgravelleclaude
andcommitted
docs: record v1.108.125 in project brief
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent bd9f89a commit 2e84bfa

1 file changed

Lines changed: 1 addition & 0 deletions

File tree

CLAUDE.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# jcodemunch-mcp — Project Brief
22

33
## Current State
4+
- **Version:** 1.108.125 — **Native `.mjs` / `.cjs` indexing as JavaScript (#365, @oderwat).** ES-module `.mjs` and CommonJS `.cjs` files resolved to no language and were dropped at discovery as `wrong_extension` (Claude then reached for Perl to read them). The gap was ONLY the core `LANGUAGE_EXTENSIONS` map in `parser/languages.py` — every downstream layer already recognized both extensions (`imports.py` `_JS_EXTENSIONS`, `find_dead_code`/`get_dead_code_v2`, `index_folder` re-export resolution, `cli/hooks.py`, `secret_classifier.py`), so discovery was the sole choke. Added `.mjs`/`.cjs` → `javascript` to `LANGUAGE_EXTENSIONS` + the fallback ext_map in `storage/sqlite_store.py`. tree-sitter-javascript parses both cleanly (ESM/CJS are just JS module syntax). Verified end-to-end: a temp folder with `esm.mjs`+`cjs.cjs`+`plain.js` now indexes as `{javascript: 3}` (was 1). Previously-skipped files gain symbols on re-index; **purely additive, NO INDEX_VERSION bump**. `LANGUAGE_SUPPORT.md` JS row updated + its stale `JCODEMUNCH_EXTRA_EXTENSIONS=.mjs:javascript` workaround example swapped (now native). New `tests/test_v1_108_125.py` (3: registration/path-resolution/symbol-extraction); parser+language+dead-code JS surface green (133). ruff clean.
45
- **Version:** 1.108.124 — **Tool-use examples on the Counter's menu/route surface (convergent with the industry "tool search" pattern; competitor/vendor unnamed in shipped artifacts).** The Counter (`order`/`menu`/`route`, v1.108.66) already IS jcm's universal tool-search/discovery strategy — `menu` searches the catalog (idf-weighted `search_catalog`) so ~90 schemas need not stay resident, `route` maps a task→ranked actions, `order` dispatches through a read-only charter gate. This release adds the missing "tool use examples" leg: curated example invocations (`counter.EXAMPLES`, ~28 highest-traffic actions) surfaced ONLY on the on-demand discovery surface — `catalog_entry` attaches an `example` (the arg object for `order(action, args)`) into `menu` rows, and `_handle_route` uses `example_for(action)` as the `args_template` fallback when `shape_execute_args` can't build one (was a bare "see menu for args" hint). **Deliberately NOT in resident tool descriptions/schemas** — that would bloat `core_compact` and fight the token thesis; examples cost nothing until discovered. **Correctness-gated:** `tests/test_counter.py` validates every EXAMPLES entry's keys against the LIVE `inputSchema` (unknown-arg + missing-required both fail) — the test caught 9 wrong arg names during authoring (find_references=`identifier` not symbol_id; get_blast_radius/find_implementations/check_delete_safe/check_edit_safe=`symbol`; get_class_hierarchy=`class_name`; get_dependency_graph=`file`; plan_turn=`query`), all corrected. New `counter.example_for()`; +6 tests. NO new tool, NO schema/tool-count/INDEX_VERSION change; `core_compact` byte-identical (examples are catalog-surface data, not Tool schemas). ruff clean; counter/schema-budget/server suites green (100). Origin: a read of the industry "advanced tool use" writeup (tool-search tool + programmatic tool calling + tool-use examples) — jcm shipped the first two in the Counter months ago; this closes the third leg.
56
- **Version:** 1.108.123 — **Licensing hardening sweep (#364 confidence pass, @domis86 = paid client, two prior strikes).** Full audit of the licensing surface. **Three real defects found + fixed:** (1) `org-rollup` CLI had the SAME missing-`load_config()` trap as .121's `license` bug → a Studio/Platform team key in config.jsonc was invisible, org-rollup wrongly "unavailable"; added `config_module.load_config()` before its `check_gate()`. (2) `install-pack` honored only `--license`, ignoring env/config `license_key` → a Builder customer (whose entitlement IS premium starter packs, per validate.php) couldn't download with a persisted key; new `install_pack.resolve_effective_license_key()` does `--license` → `JCODEMUNCH_LICENSE_KEY` → config. (3) offline/unreachable validation rendered as "key not recognized" (alarming false-negative for a proxy/firewalled paid customer on first run); `check_gate()` gains `key_status` ∈ {valid, absent, rejected, unverified_offline} and the CLI shows "key present, not yet verified" for outages (sticky-offline still keeps a confirmed key valid). **Refactor:** the `license` CLI output moved to a pure, unit-tested `org/license.format_license_status(gate, key_provided=)` — a valid non-team tier (Builder) shows `org-rollup: optional team add-on` with NO trial countdown (licensed, not deficient); free-features line corrected (core indexing/search free; premium packs + org-rollup are the paid features). **Verified via seeded-cache end-to-end + pure-renderer sweep of all 6 states + `check_gate` is the ONLY gate and is CLI-only (MCP server gates NO tool on license → reporter's actual MCP usage always worked).** `check_gate()` also carries `key_valid`+`feature` (from .122). New `tests/test_v1_108_122.py` (14: key_status classifier incl. offline≠rejected + sticky-valid, renderer for all states, install-pack key resolution) + extended test_org_license.py. Full suite 5258 passed; the 12 test_semantic_search failures are the KNOWN local-ONNX-model env issue ([[project_pickup_state]] / download-model gotcha), NOT this change. NO INDEX_VERSION/tool-count change. **Also STILL folded in** (from .122, since server.py is touched): the get_delivery_metrics/get_parity_map trigger-clause description edits + refreshed schema_baseline.json. **The stale self-obsoleting server.py reminder hook in `C:/MCPs/.claude/settings.local.json` (hooks.PostToolUse ~lines 1002-1015) still needs manual deletion — the auto-mode classifier blocks me from editing my own settings.**
67
- **Version:** 1.108.122 — **`license` CLI stops calling a valid Builder license "unlicensed" (#364 follow-up, @domis86).** After .121 made the key readable, the reporter saw `License: evaluation (unlicensed)` + `Trial: 14 day(s) left` for a valid `builder` key. Root cause: `check_gate().mode` (`licensed`/`grace`/`blocked`) describes ORG-ROLLUP entitlement (the only license-gated feature), but the CLI printed it as overall license status — so a valid single-seat license (which doesn't include org-rollup, per v1.108.43 `ORG_TIERS={studio,platform}`) read as unrecognized. Fix: `org/license.check_gate()` gains additive `key_valid` (is the KEY valid, independent of org-rollup) + `feature` ("org-rollup") on all grace/blocked returns; the `license` CLI presentation (server.py) now prints two separate lines — `License: licensed (builder)` (or `key not recognized` / `unlicensed (no key set)`) AND `org-rollup: not in your tier — N day(s) evaluation left`, plus "all other features are free". No more "Trial"/"unlicensed" framing for a paid license. **Also folded in** (the 2026-07-09 staged edits, since this touches server.py): explicit "reach for this when…" trigger clauses on `get_delivery_metrics` + `get_parity_map` descriptions (both standard-tier, core_compact unchanged 3969, schema_baseline.json refreshed → standard/full grew). Extended `tests/test_org_license.py` (+1: key_valid across studio/builder/no-key/invalid). NO INDEX_VERSION/tool-count change. **The self-obsoleting server.py reminder hook in `C:/MCPs/.claude/settings.local.json` (hooks.PostToolUse, lines ~1002-1015) is now STALE — its staged edits are applied — but the auto-mode classifier BLOCKED me from removing it (self-modification guard). jjg: delete that `hooks` block manually.**

0 commit comments

Comments
 (0)