diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 0f995e2..3055291 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -6,14 +6,14 @@ }, "metadata": { "description": "Token Pilot \u2014 save 60-90% tokens when AI reads code", - "version": "0.42.0" + "version": "0.42.1" }, "plugins": [ { "name": "token-pilot", "source": "./", "description": "Reduces token consumption by 60-90% via AST-aware lazy file reading, structural symbol navigation, and cross-session tool-usage analytics. 22 MCP tools + 19 subagents + budget watchdog hooks.", - "version": "0.42.0", + "version": "0.42.1", "author": { "name": "Digital-Threads" }, diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 4f69d98..fd094cb 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "token-pilot", - "version": "0.42.0", + "version": "0.42.1", "description": "Saves 60-90% tokens on AI code reading. AST-aware lazy reads, symbol navigation, find_usages, structural git diff/log, edit-safety guard, Task-routing matcher, cross-session telemetry (errors + diagnostics), 25 tp-* subagents tiered to haiku/sonnet/opus with budget watchdog.", "author": { "name": "Digital-Threads", diff --git a/agents/tp-api-surface-tracker.md b/agents/tp-api-surface-tracker.md index 4022a7d..44b6fc7 100644 --- a/agents/tp-api-surface-tracker.md +++ b/agents/tp-api-surface-tracker.md @@ -9,7 +9,7 @@ tools: - mcp__token-pilot__read_symbol - Bash model: haiku -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: dd184501203fa7f3c73f419c4ffbe33c4be75400cb64a7a51733a3fe23f6e085 requiredMcpServers: - "token-pilot" diff --git a/agents/tp-audit-scanner.md b/agents/tp-audit-scanner.md index 7ee64a9..f580898 100644 --- a/agents/tp-audit-scanner.md +++ b/agents/tp-audit-scanner.md @@ -11,7 +11,7 @@ tools: - Grep - Read model: sonnet -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: d172f600bf32277ea6eb4cbbee4542ddd698a986dcd96997d33930561964569b requiredMcpServers: - "token-pilot" diff --git a/agents/tp-commit-writer.md b/agents/tp-commit-writer.md index 5ff26ff..ae83875 100644 --- a/agents/tp-commit-writer.md +++ b/agents/tp-commit-writer.md @@ -8,7 +8,7 @@ tools: - mcp__token-pilot__test_summary - mcp__token-pilot__outline - Bash -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: de64a406b5176de19f7422619c7de7949b1f28865f225402c9cea9255f377428 requiredMcpServers: - "token-pilot" diff --git a/agents/tp-context-engineer.md b/agents/tp-context-engineer.md index 06076a6..02f8af9 100644 --- a/agents/tp-context-engineer.md +++ b/agents/tp-context-engineer.md @@ -13,7 +13,7 @@ tools: - Edit - Glob model: sonnet -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: 68b32af2dacd82ebe52c4eec93edb903d452688274c3065218270627c564d8b0 requiredMcpServers: - "token-pilot" diff --git a/agents/tp-dead-code-finder.md b/agents/tp-dead-code-finder.md index 2e2a8f2..3c512a6 100644 --- a/agents/tp-dead-code-finder.md +++ b/agents/tp-dead-code-finder.md @@ -11,7 +11,7 @@ tools: - Grep - Read model: sonnet -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: d9b7f5b7ae6f4ae21305c775361bcab097cc774370a6d976c093571d46d55021 requiredMcpServers: - "token-pilot" diff --git a/agents/tp-debugger.md b/agents/tp-debugger.md index b3a501e..79aff8c 100644 --- a/agents/tp-debugger.md +++ b/agents/tp-debugger.md @@ -12,7 +12,7 @@ tools: - Read - Bash model: sonnet -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: 052413de8d92377edcde6ae5c823f5378db304baccfa29e8866467f42553a500 requiredMcpServers: - "token-pilot" diff --git a/agents/tp-dep-health.md b/agents/tp-dep-health.md index 1d1d42e..aac7e98 100644 --- a/agents/tp-dep-health.md +++ b/agents/tp-dep-health.md @@ -9,7 +9,7 @@ tools: - Bash - Read model: haiku -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: e14dc57493d816f8c2e017963e2ef5f66bea50fd0b805a80e8a0d97c968427e7 requiredMcpServers: - "token-pilot" diff --git a/agents/tp-doc-writer.md b/agents/tp-doc-writer.md index 927692a..1b20684 100644 --- a/agents/tp-doc-writer.md +++ b/agents/tp-doc-writer.md @@ -13,7 +13,7 @@ tools: - Edit - Glob model: haiku -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: 57d741794ab40e31a7ac49c68ea39a9088f5827cdef866ce81bfca1b7c9180cf requiredMcpServers: - "token-pilot" diff --git a/agents/tp-history-explorer.md b/agents/tp-history-explorer.md index 760fc91..5539429 100644 --- a/agents/tp-history-explorer.md +++ b/agents/tp-history-explorer.md @@ -10,7 +10,7 @@ tools: - Bash - Read model: haiku -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: 7b70fa76a60e3c58a1de4f56c32c0f166424137e203a0cf1c8654e7c9235d904 requiredMcpServers: - "token-pilot" diff --git a/agents/tp-impact-analyzer.md b/agents/tp-impact-analyzer.md index 5ff4412..6f16d81 100644 --- a/agents/tp-impact-analyzer.md +++ b/agents/tp-impact-analyzer.md @@ -12,7 +12,7 @@ tools: - mcp__token-pilot__read_symbols - Read model: sonnet -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: 351a987e11eba63852f5431a16d8eb53104f4f689f82fdcc5a2bf4db948ba92f requiredMcpServers: - "token-pilot" diff --git a/agents/tp-incident-timeline.md b/agents/tp-incident-timeline.md index 719b7c0..45d6330 100644 --- a/agents/tp-incident-timeline.md +++ b/agents/tp-incident-timeline.md @@ -8,7 +8,7 @@ tools: - mcp__token-pilot__read_symbol - Bash model: inherit -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: de5722bfea374eaab096c1ae635c37879e7a91370ee3cd0532f4240be03c91eb requiredMcpServers: - "token-pilot" diff --git a/agents/tp-incremental-builder.md b/agents/tp-incremental-builder.md index 35febbf..287073c 100644 --- a/agents/tp-incremental-builder.md +++ b/agents/tp-incremental-builder.md @@ -13,7 +13,7 @@ tools: - Edit - Bash model: sonnet -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: 375a824d0d847bb5453ec594c7a62ad566ee7e4d92717b0473f771f1a0477c60 requiredMcpServers: - "token-pilot" diff --git a/agents/tp-migration-scout.md b/agents/tp-migration-scout.md index 793cd1a..d314e9b 100644 --- a/agents/tp-migration-scout.md +++ b/agents/tp-migration-scout.md @@ -11,7 +11,7 @@ tools: - Grep - Glob model: sonnet -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: 0334de1bf99b431b65359637d125cda7c44c6f780eb92c57cc538715b1939536 requiredMcpServers: - "token-pilot" diff --git a/agents/tp-onboard.md b/agents/tp-onboard.md index 6ec7639..4a64dfa 100644 --- a/agents/tp-onboard.md +++ b/agents/tp-onboard.md @@ -10,7 +10,7 @@ tools: - mcp__token-pilot__smart_read - mcp__token-pilot__smart_read_many - mcp__token-pilot__read_section -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: 832e95633fbc8e9b0c10f3e540a327d4be062fb4b3f17a6cce6be13f414e2927 requiredMcpServers: - "token-pilot" diff --git a/agents/tp-performance-profiler.md b/agents/tp-performance-profiler.md index de9a797..2ebc1b1 100644 --- a/agents/tp-performance-profiler.md +++ b/agents/tp-performance-profiler.md @@ -11,7 +11,7 @@ tools: - Bash - Read model: sonnet -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: b61f06380d80798fa2e49d37bcba0653495bee04dd6bdbc1feff9a75607b0508 requiredMcpServers: - "token-pilot" diff --git a/agents/tp-pr-reviewer.md b/agents/tp-pr-reviewer.md index 487c2a5..62a415a 100644 --- a/agents/tp-pr-reviewer.md +++ b/agents/tp-pr-reviewer.md @@ -11,7 +11,7 @@ tools: - mcp__token-pilot__read_for_edit - Read model: sonnet -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: f83f50d05b4f70285ae7afed2b1a406fc436df56e61a0aedbfb31edc7f2b6e66 requiredMcpServers: - "token-pilot" diff --git a/agents/tp-refactor-planner.md b/agents/tp-refactor-planner.md index b91acb8..d906d4b 100644 --- a/agents/tp-refactor-planner.md +++ b/agents/tp-refactor-planner.md @@ -8,7 +8,7 @@ tools: - mcp__token-pilot__outline - mcp__token-pilot__read_symbol model: sonnet -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: c5f6fc122c89e16e5cf774045f92169ee3468555320b898171ba13eca5323550 requiredMcpServers: - "token-pilot" diff --git a/agents/tp-review-impact.md b/agents/tp-review-impact.md index e6e1335..dc4e30c 100644 --- a/agents/tp-review-impact.md +++ b/agents/tp-review-impact.md @@ -9,7 +9,7 @@ tools: - mcp__token-pilot__module_info - Bash model: sonnet -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: 8ef3c3341cbfed4eb8dd130126a9683edc57e378c92ff0ca764d584fd941c55c requiredMcpServers: - "token-pilot" diff --git a/agents/tp-run.md b/agents/tp-run.md index 5ac4065..63ac00a 100644 --- a/agents/tp-run.md +++ b/agents/tp-run.md @@ -16,7 +16,7 @@ tools: - Glob - Bash model: haiku -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: 2b08618d34a61f00aafccbda9fed6d83243296dedb83440edbd2d5c28bb6dbc4 requiredMcpServers: - "token-pilot" diff --git a/agents/tp-session-restorer.md b/agents/tp-session-restorer.md index 79a140f..1f0c0b9 100644 --- a/agents/tp-session-restorer.md +++ b/agents/tp-session-restorer.md @@ -9,7 +9,7 @@ tools: - mcp__token-pilot__session_budget - Bash - Read -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: 529374ed728f5eed5b758b3be3da65624783c0bf0c1a253d7d661a843eb5f767 requiredMcpServers: - "token-pilot" diff --git a/agents/tp-ship-coordinator.md b/agents/tp-ship-coordinator.md index 968d19e..400c9e6 100644 --- a/agents/tp-ship-coordinator.md +++ b/agents/tp-ship-coordinator.md @@ -11,7 +11,7 @@ tools: - Read - Grep model: sonnet -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: a60f6ae110eb3138064bce074e8ba26fa0ce5f4659df1624a9d9d3646803391b requiredMcpServers: - "token-pilot" diff --git a/agents/tp-spec-writer.md b/agents/tp-spec-writer.md index c35b56b..6dae544 100644 --- a/agents/tp-spec-writer.md +++ b/agents/tp-spec-writer.md @@ -9,7 +9,7 @@ tools: - Read - Write model: sonnet -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: c7a4e8b39228fd5158528f389c924c5ff2d98c4b9b05ee0106d54a26c5dc1350 requiredMcpServers: - "token-pilot" diff --git a/agents/tp-test-coverage-gapper.md b/agents/tp-test-coverage-gapper.md index c418cbb..07eee6f 100644 --- a/agents/tp-test-coverage-gapper.md +++ b/agents/tp-test-coverage-gapper.md @@ -10,7 +10,7 @@ tools: - mcp__token-pilot__test_summary - Glob - Grep -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: be81eed53a3720d146cf89e4a14a7a56577633f7c84c234c412ab70d64c05b11 requiredMcpServers: - "token-pilot" diff --git a/agents/tp-test-triage.md b/agents/tp-test-triage.md index bb23770..bb35e1f 100644 --- a/agents/tp-test-triage.md +++ b/agents/tp-test-triage.md @@ -8,7 +8,7 @@ tools: - mcp__token-pilot__find_usages - mcp__token-pilot__read_symbol model: sonnet -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: 362ecf4cb03b059421ea26933473700900073dc38b3a7fe271208dfb1ae14f90 requiredMcpServers: - "token-pilot" diff --git a/agents/tp-test-writer.md b/agents/tp-test-writer.md index 9c79b50..644507f 100644 --- a/agents/tp-test-writer.md +++ b/agents/tp-test-writer.md @@ -13,7 +13,7 @@ tools: - Edit - Bash model: sonnet -token_pilot_version: "0.42.0" +token_pilot_version: "0.42.1" token_pilot_body_hash: 269f2fe22ff4517c277d3f56ca67d8a5527b93290ab21079a83ba7af22c1b5a9 requiredMcpServers: - "token-pilot" diff --git a/hooks/tp-statusline.sh b/hooks/tp-statusline.sh index 5531b61..0f3dab3 100755 --- a/hooks/tp-statusline.sh +++ b/hooks/tp-statusline.sh @@ -52,26 +52,24 @@ SESSION_ID=$(printf '%s' "$SESSION_ID" | tr -cd 'a-zA-Z0-9-_') # CWD: allow path chars only — no ; $ ` quotes, etc. CWD=$(printf '%s' "$CWD" | tr -cd 'a-zA-Z0-9/._-') -# Compute cumulative savedTokens for this session, if we have enough info -# to find the events log. Any error → render without the saved-tokens suffix. +# Compute cumulative savedTokens for the whole PROJECT (every session), +# if we can find the events log. Any error → render without the suffix. +# +# v0.42.1 — sum ALL savedTokens, not just the current session_id. The +# old per-session filter showed an empty `[TP]` at the start of every +# fresh session (nothing saved yet), which is what users hit on screen. +# The cumulative project total is always meaningful after first use and +# matches the number the removed sessionTitle displayed. SAVED_SUFFIX="" -if [ -n "$SESSION_ID" ] && [ -n "$CWD" ] && [ -d "$CWD/.token-pilot" ]; then +if [ -n "$CWD" ] && [ -d "$CWD/.token-pilot" ]; then EVENTS_FILE="$CWD/.token-pilot/hook-events.jsonl" if [ -f "$EVENTS_FILE" ] && [ ! -L "$EVENTS_FILE" ]; then - TOTAL=$(awk -v sid="$SESSION_ID" ' + TOTAL=$(awk ' { - # Find session_id in the line - if (match($0, /"session_id"[[:space:]]*:[[:space:]]*"[^"]+"/)) { - line_sid = substr($0, RSTART, RLENGTH) - sub(/^"session_id"[[:space:]]*:[[:space:]]*"/, "", line_sid) - sub(/"$/, "", line_sid) - if (line_sid == sid) { - if (match($0, /"savedTokens"[[:space:]]*:[[:space:]]*-?[0-9]+/)) { - t = substr($0, RSTART, RLENGTH) - gsub(/[^0-9-]/, "", t) - total += t + 0 - } - } + if (match($0, /"savedTokens"[[:space:]]*:[[:space:]]*-?[0-9]+/)) { + t = substr($0, RSTART, RLENGTH) + gsub(/[^0-9-]/, "", t) + total += t + 0 } } END { printf("%d", total + 0) } diff --git a/package.json b/package.json index e609deb..b5d4e16 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "token-pilot", - "version": "0.42.0", + "version": "0.42.1", "description": "Save up to 80% tokens when AI reads code — MCP server for token-efficient code navigation, AST-aware structural reading instead of dumping full files into context window", "type": "module", "main": "dist/index.js", diff --git a/tests/hooks/statusline.test.ts b/tests/hooks/statusline.test.ts index ef938ca..ac3c8c5 100644 --- a/tests/hooks/statusline.test.ts +++ b/tests/hooks/statusline.test.ts @@ -87,7 +87,7 @@ describe("tp-statusline.sh", () => { expect(out).toBe("[TP]"); }); - it("shows cumulative savedTokens suffix when events file exists", async () => { + it("shows cumulative PROJECT savedTokens (all sessions) when events file exists", async () => { const root = join(tmpdir(), `tp-statusline-${process.pid}-${Date.now()}`); await mkdir(join(root, ".token-pilot"), { recursive: true }); const events = [ @@ -103,26 +103,28 @@ describe("tp-statusline.sh", () => { workspace: { current_dir: root }, }); const out = strip(runScript(TP_SCRIPT, payload)); - // 5000 + 3500 + 2000 = 10500 → "10k" - expect(out).toMatch(/\[TP 10k\]/); + // v0.42.1 — cumulative across ALL sessions: 5000+3500+9999+2000 = 20499 → "20k" + expect(out).toMatch(/\[TP 20k\]/); await rm(root, { recursive: true, force: true }); }); - it("ignores events for other sessions", async () => { + it("counts every session's savings, not just the current one (v0.42.1)", async () => { const root = join(tmpdir(), `tp-statusline-${process.pid}-${Date.now()}-2`); await mkdir(join(root, ".token-pilot"), { recursive: true }); await writeFile( join(root, ".token-pilot", "hook-events.jsonl"), '{"session_id":"other","savedTokens":99999}\n', ); + // A brand-new session ("me") with no events of its own still shows + // the project's cumulative total — this is exactly the bare-[TP] + // bug fix (per-session filter made fresh sessions show nothing). const payload = JSON.stringify({ session_id: "me", workspace: { current_dir: root }, }); const out = strip(runScript(TP_SCRIPT, payload)); - // session "me" has no events → no saved suffix - expect(out).toBe("[TP]"); + expect(out).toMatch(/\[TP 99k\]/); await rm(root, { recursive: true, force: true }); });