docs: bump action count (63→64) and test count (886→891)#8
Merged
Conversation
PR #7 (00559c2) added mem_increment_access action via @register("search"), bringing the mem_do action count from 63 to 64. Test count grew from 886 to 891 (+5 mock-based tests in test_context_window.py::TestMemIncrementAccess). Five places across four files referenced the stale counts. Verified the new ground truth via Python import (not grep, which can over-count due to dead modules like tools/ask.py that are decorated but not imported in server/__init__.py): - ACTIONS dict size: 64 (`from memtomem.server.tool_registry import ACTIONS`) - Full mode tools registered: 72 (`mcp._tool_manager._tools`) - Tests collected: 891 (`pytest --collect-only`) The "72 MCP tools" figure remains accurate and is left unchanged. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Merged
4 tasks
4 tasks
memtomem
pushed a commit
that referenced
this pull request
Apr 29, 2026
Self-review of PR #553 surfaced five real issues — fixing them keeps the surface honest about what's actually wired up. - Drop dead helpers in ``context/projects.py`` (#1): - ``_is_eaccess`` was never called. - ``is_project_scope_id`` claimed to support route error formatting but no route used it. - ``_new_temp_known_projects_path`` claimed test convenience but no test imported it. - ``errno`` and ``tempfile`` imports follow. - Drop ``ProjectScope.counts`` dataclass field (#2). Discovery never populated it; the route layer (``_scope_to_dict``) always overrides via ``_counts_for(root)``. Forward-design pollution. - ``POST /api/context/known-projects`` now returns ``warning_code: "no_runtime_marker"`` alongside the prose ``warning`` (#4). Matches PR1's (#549) machine-readable ``reason_code`` pattern so client matching is i18n-stable; the prose stays for back-compat. - ``_counts_for`` gains a cost comment (#3): 3 × (canonical scan + N runtime scans) per scope on every projects GET. Acceptable at <30 scopes; cache when discovery growth pushes that ceiling. - JS scope badge no longer carries a redundant ``data-i18n`` attribute (#5). The inline ``t()`` already renders text at construction; the attribute would let the i18n DOM walker re-translate and clobber. - ``ctx-scope-summary`` now carries a ``title="${scope.root}"`` (#8) so same-name scopes (``Edu/inflearn`` vs ``Work/inflearn``) disambiguate on hover without bloating the visible label. Cache-bust: ``context-gateway.js?v=4`` → ``?v=5``. Tests updated: ``test_post_warns_on_missing_marker`` asserts the new ``warning_code``; ``test_post_no_warning_when_marker_present`` asserts both fields are absent. 110/110 green; ruff + format clean. Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
memtomem
added a commit
that referenced
this pull request
Apr 29, 2026
…#553) * feat(web): multi-project read-only discovery for context-gateway tabs PR2 of the multi-project context UI series — see ``memtomem-docs/memtomem/planning/multi-project-context-ui-rfc.md``. A user running ``mm web`` from the ``memtomem`` repo could previously only see skills / commands / agents under that one cwd; ``~/Edu/inflearn/ .claude/skills/`` was invisible without restarting the server. PR2 adds discovery for additional project roots (server cwd, user-registered ``known_projects.json``, opt-in ``~/.claude/projects/`` reverse-decode) and renders one collapsible ``<details>`` group per scope inside each tab. Mutating routes stay cwd-only — multi-scope writes ship in PR3. Backend ------- - ``memtomem.context.projects`` is the new discovery module: - ``ProjectScope`` carries ``{scope_id, label, root, tier, sources, missing, experimental, counts}``. - ``compute_scope_id`` derives ``"p-" + sha256(case-normalized Path.resolve())[:12]`` so refresh / restart preserve the id (RFC §Decision 4). On macOS the input is also lowercased: APFS is case-insensitive but ``Path.resolve()`` does not canonicalize case. - ``KnownProjectsStore`` writes ``~/.memtomem/known_projects.json`` via ``tempfile + os.replace`` plus a ``.<name>.lock`` sidecar fcntl lock — locking the data file directly does not survive ``os.replace`` (PR #548 issue). - ``discover_project_scopes`` unions cwd + known-projects + (opt-in) claude-projects, dedupes by resolved path, and clears ``experimental`` on union with a trusted source. - ``ContextGatewayConfig`` (new) carries ``known_projects_path``, ``experimental_claude_projects_scan: bool = False``, and ``user_tier_enabled: bool = False`` (forward-compat for PR3). Routes ------ New ``web/routes/context_projects.py``: - ``GET /api/context/projects`` — full scope list with per-type counts. - ``POST /api/context/known-projects`` — register; absolute + ``is_dir()`` validation; warning (HTTP 200) when no ``.claude``/``.gemini``/``.agents``/ ``.memtomem`` marker is present so users can pre-register an empty checkout. - ``DELETE /api/context/known-projects/{scope_id}`` — drop, including stale entries (matching is path-derived). - ``resolve_scope_root`` is the dependency the existing ``/api/context/{skills,commands,agents}`` GETs now use; without ``?scope_id=`` it falls back to the server cwd so PR1's mutating cwd flow keeps working unchanged. Unknown / stale scope_id → 404. UI -- Each tab gains an "Add Project" button; the list area renders one ``<details class="ctx-scope-group">`` per scope, lazy-fetching items on expand. Server CWD opens by default; non-cwd scope items render as read-only cards (PR2 keeps mutating buttons targeting cwd only). Each non-cwd group has an ✕ button that calls DELETE ``/api/context/known-projects/{scope_id}``. Three new i18n keys (placeholder-form, en + ko parity). Tests ----- PR2 minimum-bar from RFC §Test obligations: - ``tests/test_context_projects.py`` — scope_id stability + collision sanity, trailing-slash invariance, macOS case-insensitivity, symlink dedup, ``experimental`` flag clears on union, both ``experimental_claude_projects_scan`` defaults, ``known_projects.json`` corruption / unknown-version recovery, stale-entry removal, multiprocessing.Process atomic-write race. - ``tests/test_web_routes_context_projects.py`` — HTTP shape, unknown scope_id 404, POST 400 paths (relative / nonexistent / file), marker warning, idempotent registration, DELETE round-trip + 404. Manual smoke ------------ ``HOME=/tmp/.../home uv run mm web --port 8088``: GET projects shows cwd; POST /tmp returns 200 + warning; GET projects shows two scopes (``Server CWD`` + ``tmp``); skills?scope_id=p-bogus → 404; DELETE round-trip works; second DELETE → 404. Refs RFC ``multi-project-context-ui``; gates PR3 (multi-project mutating + Claude user-tier). Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]> * review fixes: drop dead helpers, add warning_code, summary tooltip Self-review of PR #553 surfaced five real issues — fixing them keeps the surface honest about what's actually wired up. - Drop dead helpers in ``context/projects.py`` (#1): - ``_is_eaccess`` was never called. - ``is_project_scope_id`` claimed to support route error formatting but no route used it. - ``_new_temp_known_projects_path`` claimed test convenience but no test imported it. - ``errno`` and ``tempfile`` imports follow. - Drop ``ProjectScope.counts`` dataclass field (#2). Discovery never populated it; the route layer (``_scope_to_dict``) always overrides via ``_counts_for(root)``. Forward-design pollution. - ``POST /api/context/known-projects`` now returns ``warning_code: "no_runtime_marker"`` alongside the prose ``warning`` (#4). Matches PR1's (#549) machine-readable ``reason_code`` pattern so client matching is i18n-stable; the prose stays for back-compat. - ``_counts_for`` gains a cost comment (#3): 3 × (canonical scan + N runtime scans) per scope on every projects GET. Acceptable at <30 scopes; cache when discovery growth pushes that ceiling. - JS scope badge no longer carries a redundant ``data-i18n`` attribute (#5). The inline ``t()`` already renders text at construction; the attribute would let the i18n DOM walker re-translate and clobber. - ``ctx-scope-summary`` now carries a ``title="${scope.root}"`` (#8) so same-name scopes (``Edu/inflearn`` vs ``Work/inflearn``) disambiguate on hover without bloating the visible label. Cache-bust: ``context-gateway.js?v=4`` → ``?v=5``. Tests updated: ``test_post_warns_on_missing_marker`` asserts the new ``warning_code``; ``test_post_no_warning_when_marker_present`` asserts both fields are absent. 110/110 green; ruff + format clean. Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]> --------- Co-authored-by: pandas-studio <[email protected]> Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
PR #7 (
00559c2) added themem_increment_accessaction via@register("search"), which:mem_doaction count from 63 → 64test_context_window.py::TestMemIncrementAccess)Five doc references were not updated in that PR. This commit syncs them in 4 files.
Ground truth (verified via Python import, not grep)
Documentation counts were verified by importing the registry directly — grep over-counts decorators because of dead modules (e.g.
tools/ask.pyhas@mcp.tool()but is not imported inserver/__init__.pyso it never registers, making the grep "73" misleading vs the real "72" registered tools).```python
from memtomem.server.tool_registry import ACTIONS
len(ACTIONS) # → 64
import os; os.environ['MEMTOMEM_TOOL_MODE'] = 'full'
from memtomem.server import mcp
len(mcp._tool_manager._tools) # → 72
```
The "72 MCP tools" figure is therefore left unchanged everywhere.
Test plan
🤖 Generated with Claude Code