token-pilot 0.28.0 → 0.28.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,14 +6,14 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "Token Pilot \u2014 save 60-90% tokens when AI reads code",
9
- "version": "0.28.0"
9
+ "version": "0.28.1"
10
10
  },
11
11
  "plugins": [
12
12
  {
13
13
  "name": "token-pilot",
14
14
  "source": "./",
15
15
  "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.",
16
- "version": "0.28.0",
16
+ "version": "0.28.1",
17
17
  "author": {
18
18
  "name": "Digital-Threads"
19
19
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "token-pilot",
3
- "version": "0.28.0",
3
+ "version": "0.28.1",
4
4
  "description": "Saves 60-90% tokens when AI reads code. AST-aware lazy reading, symbol navigation, cross-session tool-usage analytics, 22 subagents (haiku/sonnet/opus-tiered) with budget watchdog.",
5
5
  "author": {
6
6
  "name": "Digital-Threads",
package/CHANGELOG.md CHANGED
@@ -5,6 +5,27 @@ All notable changes to Token Pilot will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.28.1] - 2026-04-19
9
+
10
+ ### Fixed — `session_analytics` hidden in `nav` profile defeated the whole point of profiles
11
+
12
+ Field report from Opus 4.7 running our own verification prompt against v0.28.0 on Windows: user had `TOKEN_PILOT_PROFILE=nav` set, Opus tried `mcp__plugin_token-pilot_token-pilot__session_analytics` for the pre-flight baseline and got "No matching deferred tools found". The whole verification stalled — the tool that measures whether the profile saves tokens wasn't in the profile.
13
+
14
+ Root cause: in v0.26.3 I bucketed `session_analytics` / `session_budget` / `session_snapshot` as "full-only" along with `test_summary`, `code_audit`, `find_unused`. That was a mistake — those three are **diagnostic meta-tools**, not workflow tools. Hiding them from `nav` and `edit` contradicts the profile feature's own purpose: if you can't verify the savings, why would you trust the profile?
15
+
16
+ Fix: new `META_TOOLS` set in `src/server/tool-profiles.ts`. META is **always visible** regardless of profile. Contents:
17
+ - `session_analytics` — self-measurement (verifies the profile is working)
18
+ - `session_budget` — remaining budget view
19
+ - `session_snapshot` — state capture for /clear recovery
20
+
21
+ `filterToolsByProfile` now does `NAV_TOOLS ∪ META_TOOLS` for nav and `NAV_TOOLS ∪ EDIT_EXTRAS ∪ META_TOOLS` for edit. New regression test asserts META is present in every profile.
22
+
23
+ ### Impact
24
+
25
+ Users on `nav` / `edit` profiles get **3 extra tools** in their `tools/list` (~400 additional tokens at session start) but retain the ability to verify savings. The math: if a profile saves 2200 tokens on the original 22-tool list but hides the observability tools, the user mentally pads the savings with uncertainty and eventually switches back to `full`. The 400-token tax for keeping visibility is cheaper than that.
26
+
27
+ 1019 tests passing (+1 new — META_TOOLS cross-profile visibility).
28
+
8
29
  ## [0.28.0] - 2026-04-19
9
30
 
10
31
  ### Added — passive pre-intercept hooks for Grep and Bash
@@ -9,7 +9,7 @@ tools:
9
9
  - mcp__token-pilot__read_symbol
10
10
  - Bash
11
11
  model: haiku
12
- token_pilot_version: "0.28.0"
12
+ token_pilot_version: "0.28.1"
13
13
  token_pilot_body_hash: f30fb3378463d6518041650487f1074b5411c6c3d6d7df315d21267f25f812d6
14
14
  ---
15
15
 
@@ -11,7 +11,7 @@ tools:
11
11
  - Grep
12
12
  - Read
13
13
  model: sonnet
14
- token_pilot_version: "0.28.0"
14
+ token_pilot_version: "0.28.1"
15
15
  token_pilot_body_hash: a740dc6c928d11d7c2c5fbaa953c50b0e35f2abc2dd6e5ef5117bf469a2d0207
16
16
  ---
17
17
 
@@ -8,7 +8,7 @@ tools:
8
8
  - mcp__token-pilot__test_summary
9
9
  - mcp__token-pilot__outline
10
10
  - Bash
11
- token_pilot_version: "0.28.0"
11
+ token_pilot_version: "0.28.1"
12
12
  token_pilot_body_hash: 559a0b61d20974bf33e35bc4c80dcf1b41d10d4df46cf9d05d3d5620713cd46f
13
13
  ---
14
14
 
@@ -13,7 +13,7 @@ tools:
13
13
  - Edit
14
14
  - Glob
15
15
  model: sonnet
16
- token_pilot_version: "0.28.0"
16
+ token_pilot_version: "0.28.1"
17
17
  token_pilot_body_hash: 8977f452021085a9ba63338bf94e8903e56b30e199dc32e41acc4ec3173a931d
18
18
  ---
19
19
 
@@ -11,7 +11,7 @@ tools:
11
11
  - Grep
12
12
  - Read
13
13
  model: sonnet
14
- token_pilot_version: "0.28.0"
14
+ token_pilot_version: "0.28.1"
15
15
  token_pilot_body_hash: 33798b70002a206c4547d08ff46caefe6dbe5a9300f94ab5dad4a57ab5fb4478
16
16
  ---
17
17
 
@@ -12,7 +12,7 @@ tools:
12
12
  - Read
13
13
  - Bash
14
14
  model: sonnet
15
- token_pilot_version: "0.28.0"
15
+ token_pilot_version: "0.28.1"
16
16
  token_pilot_body_hash: ada78a5a3f029721fa51e7cd203395ff0e87f0ab614cc7cf0d5bcc1bf9a80435
17
17
  ---
18
18
 
@@ -9,7 +9,7 @@ tools:
9
9
  - Bash
10
10
  - Read
11
11
  model: haiku
12
- token_pilot_version: "0.28.0"
12
+ token_pilot_version: "0.28.1"
13
13
  token_pilot_body_hash: 6224d989835ea284985b474005b8b46052b7007c4610e661b10658286b5c6624
14
14
  ---
15
15
 
@@ -13,7 +13,7 @@ tools:
13
13
  - Edit
14
14
  - Glob
15
15
  model: haiku
16
- token_pilot_version: "0.28.0"
16
+ token_pilot_version: "0.28.1"
17
17
  token_pilot_body_hash: 72347b06aaea75ed960972e96e2523c221b2ea7c892a3931aa0e7c32e4c86555
18
18
  ---
19
19
 
@@ -10,7 +10,7 @@ tools:
10
10
  - Bash
11
11
  - Read
12
12
  model: haiku
13
- token_pilot_version: "0.28.0"
13
+ token_pilot_version: "0.28.1"
14
14
  token_pilot_body_hash: b2daca007e959eaf26bf9a4d92ba36c3aa277a51de4ca4db674833d36acbe11b
15
15
  ---
16
16
 
@@ -12,7 +12,7 @@ tools:
12
12
  - mcp__token-pilot__read_symbols
13
13
  - Read
14
14
  model: sonnet
15
- token_pilot_version: "0.28.0"
15
+ token_pilot_version: "0.28.1"
16
16
  token_pilot_body_hash: 0be2620ce0303f912f6b3334f261d169f064970c0d16602fa1e76db4cb2ea441
17
17
  ---
18
18
 
@@ -8,7 +8,7 @@ tools:
8
8
  - mcp__token-pilot__read_symbol
9
9
  - Bash
10
10
  model: inherit
11
- token_pilot_version: "0.28.0"
11
+ token_pilot_version: "0.28.1"
12
12
  token_pilot_body_hash: 420ffc423c7479a8d4e1b226cf73eb98d6d41388317c74a950d7f3b6240b6786
13
13
  ---
14
14
 
@@ -13,7 +13,7 @@ tools:
13
13
  - Edit
14
14
  - Bash
15
15
  model: sonnet
16
- token_pilot_version: "0.28.0"
16
+ token_pilot_version: "0.28.1"
17
17
  token_pilot_body_hash: 9cb0bdf6e209d8ac613487385c01ef269d827dc3eddaf81b8eba581a3150b1e3
18
18
  ---
19
19
 
@@ -11,7 +11,7 @@ tools:
11
11
  - Grep
12
12
  - Glob
13
13
  model: sonnet
14
- token_pilot_version: "0.28.0"
14
+ token_pilot_version: "0.28.1"
15
15
  token_pilot_body_hash: cf32cdee777430ecc6732db32b3f883a685c8a02b6dc93379d71b15555e79b3e
16
16
  ---
17
17
 
@@ -10,7 +10,7 @@ tools:
10
10
  - mcp__token-pilot__smart_read
11
11
  - mcp__token-pilot__smart_read_many
12
12
  - mcp__token-pilot__read_section
13
- token_pilot_version: "0.28.0"
13
+ token_pilot_version: "0.28.1"
14
14
  token_pilot_body_hash: ae0b86eaffaf34bf283b94b5572481fa8c2d6a2a25193f1173b70bef0fbe1919
15
15
  ---
16
16
 
@@ -11,7 +11,7 @@ tools:
11
11
  - Bash
12
12
  - Read
13
13
  model: sonnet
14
- token_pilot_version: "0.28.0"
14
+ token_pilot_version: "0.28.1"
15
15
  token_pilot_body_hash: 14b6fb4423a839c119120c2ea12c9dd6ab6ad1aeb13df1e7c22807b290cf1f9c
16
16
  ---
17
17
 
@@ -11,7 +11,7 @@ tools:
11
11
  - mcp__token-pilot__read_for_edit
12
12
  - Read
13
13
  model: sonnet
14
- token_pilot_version: "0.28.0"
14
+ token_pilot_version: "0.28.1"
15
15
  token_pilot_body_hash: 73ba5844c8354088dcb10c671622daecc0e8589568de15a6001e1cf951eea586
16
16
  ---
17
17
 
@@ -8,7 +8,7 @@ tools:
8
8
  - mcp__token-pilot__outline
9
9
  - mcp__token-pilot__read_symbol
10
10
  model: sonnet
11
- token_pilot_version: "0.28.0"
11
+ token_pilot_version: "0.28.1"
12
12
  token_pilot_body_hash: dcc2c2aaeb443cc9688639b4337c6069b9d5bf21e3ed757fc8b3ac8a9d61bc03
13
13
  ---
14
14
 
@@ -9,7 +9,7 @@ tools:
9
9
  - mcp__token-pilot__module_info
10
10
  - Bash
11
11
  model: sonnet
12
- token_pilot_version: "0.28.0"
12
+ token_pilot_version: "0.28.1"
13
13
  token_pilot_body_hash: 72b635f511492188587d6cb6fd70f936ae34cf5df1f9cd9eff7849cf1231e185
14
14
  ---
15
15
 
package/agents/tp-run.md CHANGED
@@ -16,7 +16,7 @@ tools:
16
16
  - Glob
17
17
  - Bash
18
18
  model: haiku
19
- token_pilot_version: "0.28.0"
19
+ token_pilot_version: "0.28.1"
20
20
  token_pilot_body_hash: d665d57085db38077d0eeab74bda8bdb84c9ad59688495486059af5d3fac67cf
21
21
  ---
22
22
 
@@ -9,7 +9,7 @@ tools:
9
9
  - mcp__token-pilot__session_budget
10
10
  - Bash
11
11
  - Read
12
- token_pilot_version: "0.28.0"
12
+ token_pilot_version: "0.28.1"
13
13
  token_pilot_body_hash: 35b7f333a28c94e7dc89fcc3171703c4b466225f55cd5c701b7592f4f6486440
14
14
  ---
15
15
 
@@ -11,7 +11,7 @@ tools:
11
11
  - Read
12
12
  - Grep
13
13
  model: sonnet
14
- token_pilot_version: "0.28.0"
14
+ token_pilot_version: "0.28.1"
15
15
  token_pilot_body_hash: e8f9c28da23e318328f5afd85b09e8e7b96e0dab21a4c6779ba798cd709ced64
16
16
  ---
17
17
 
@@ -9,7 +9,7 @@ tools:
9
9
  - Read
10
10
  - Write
11
11
  model: sonnet
12
- token_pilot_version: "0.28.0"
12
+ token_pilot_version: "0.28.1"
13
13
  token_pilot_body_hash: ed0b9f938c152c0d7be5a6a5eaf3c97c19b27ae4a9540aec342f0edb0927cb27
14
14
  ---
15
15
 
@@ -10,7 +10,7 @@ tools:
10
10
  - mcp__token-pilot__test_summary
11
11
  - Glob
12
12
  - Grep
13
- token_pilot_version: "0.28.0"
13
+ token_pilot_version: "0.28.1"
14
14
  token_pilot_body_hash: cc3d1f46fdb95ac3caf9344f69f1ddcd5ce5a175ee70aa150b7f9fda93edb152
15
15
  ---
16
16
 
@@ -8,7 +8,7 @@ tools:
8
8
  - mcp__token-pilot__find_usages
9
9
  - mcp__token-pilot__read_symbol
10
10
  model: sonnet
11
- token_pilot_version: "0.28.0"
11
+ token_pilot_version: "0.28.1"
12
12
  token_pilot_body_hash: 255912c47661d203c8f9a735237bc419f97e937f788a01811bbe126ee3dd5878
13
13
  ---
14
14
 
@@ -13,7 +13,7 @@ tools:
13
13
  - Edit
14
14
  - Bash
15
15
  model: sonnet
16
- token_pilot_version: "0.28.0"
16
+ token_pilot_version: "0.28.1"
17
17
  token_pilot_body_hash: 96211a3e7f6b52dd47fef286eec3584b1c269fb3464c1102f8b7edbe470700e6
18
18
  ---
19
19
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * v0.26.3 — tool profiles.
2
+ * v0.26.3 — tool profiles. v0.28.1 — META_TOOLS always-available fix.
3
3
  *
4
4
  * Idea lifted honestly from Token Savior's TOKEN_SAVIOR_PROFILE. When an
5
5
  * MCP server advertises 22 tools, every tools/list response costs the
@@ -10,20 +10,26 @@
10
10
  * user in the same server can still reach the full set if they know
11
11
  * the name).
12
12
  *
13
- * Three profiles:
14
- * - full (default): everything, same as pre-v0.26.3.
15
- * - nav : read-only exploration. smart_read, outline, find_usages,
16
- * read_symbol, project_overview, module_info, related_files,
17
- * explore_area, smart_log, smart_diff.
18
- * - edit : nav + batch reads + everything Edit needs to hit a symbol
19
- * precisely. Adds read_symbols, read_range, read_section,
20
- * read_diff, read_for_edit, smart_read_many.
13
+ * Three profiles, plus one always-on set:
14
+ * - META (implicit): always advertised, every profile — meta-tools
15
+ * the user needs to verify token-pilot is actually saving anything.
16
+ * Excluding them contradicts the whole point of profiles.
17
+ * - full (default): everything, same as pre-v0.26.3.
18
+ * - nav : META + read-only exploration (10 tools + META).
19
+ * - edit: META + nav + batch reads + edit-prep (16 tools + META).
21
20
  *
22
21
  * Selection: TOKEN_PILOT_PROFILE=nav|edit|full env var. Unknown values
23
22
  * fall back to full with a stderr warning. Silent on missing env.
24
23
  */
25
24
  export type ToolProfile = "full" | "nav" | "edit";
26
25
  export declare const PROFILE_NAMES: readonly ToolProfile[];
26
+ /**
27
+ * Meta-tools — diagnostic / self-observation tools that must be visible
28
+ * in EVERY profile. Excluding them defeats the profile feature's own
29
+ * purpose: if you can't check whether token-pilot is saving tokens, why
30
+ * would you trust the savings number?
31
+ */
32
+ export declare const META_TOOLS: ReadonlySet<string>;
27
33
  /** Minimum nav profile — exploration only, no editing support. */
28
34
  export declare const NAV_TOOLS: ReadonlySet<string>;
29
35
  /** Edit profile adds batch reads + edit-preparation tools. */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * v0.26.3 — tool profiles.
2
+ * v0.26.3 — tool profiles. v0.28.1 — META_TOOLS always-available fix.
3
3
  *
4
4
  * Idea lifted honestly from Token Savior's TOKEN_SAVIOR_PROFILE. When an
5
5
  * MCP server advertises 22 tools, every tools/list response costs the
@@ -10,14 +10,13 @@
10
10
  * user in the same server can still reach the full set if they know
11
11
  * the name).
12
12
  *
13
- * Three profiles:
14
- * - full (default): everything, same as pre-v0.26.3.
15
- * - nav : read-only exploration. smart_read, outline, find_usages,
16
- * read_symbol, project_overview, module_info, related_files,
17
- * explore_area, smart_log, smart_diff.
18
- * - edit : nav + batch reads + everything Edit needs to hit a symbol
19
- * precisely. Adds read_symbols, read_range, read_section,
20
- * read_diff, read_for_edit, smart_read_many.
13
+ * Three profiles, plus one always-on set:
14
+ * - META (implicit): always advertised, every profile — meta-tools
15
+ * the user needs to verify token-pilot is actually saving anything.
16
+ * Excluding them contradicts the whole point of profiles.
17
+ * - full (default): everything, same as pre-v0.26.3.
18
+ * - nav : META + read-only exploration (10 tools + META).
19
+ * - edit: META + nav + batch reads + edit-prep (16 tools + META).
21
20
  *
22
21
  * Selection: TOKEN_PILOT_PROFILE=nav|edit|full env var. Unknown values
23
22
  * fall back to full with a stderr warning. Silent on missing env.
@@ -27,6 +26,17 @@ export const PROFILE_NAMES = [
27
26
  "nav",
28
27
  "edit",
29
28
  ];
29
+ /**
30
+ * Meta-tools — diagnostic / self-observation tools that must be visible
31
+ * in EVERY profile. Excluding them defeats the profile feature's own
32
+ * purpose: if you can't check whether token-pilot is saving tokens, why
33
+ * would you trust the savings number?
34
+ */
35
+ export const META_TOOLS = new Set([
36
+ "session_analytics",
37
+ "session_budget",
38
+ "session_snapshot",
39
+ ]);
30
40
  /** Minimum nav profile — exploration only, no editing support. */
31
41
  export const NAV_TOOLS = new Set([
32
42
  "smart_read",
@@ -59,10 +69,17 @@ export const EDIT_EXTRAS = new Set([
59
69
  export function filterToolsByProfile(tools, profile) {
60
70
  if (profile === "full")
61
71
  return [...tools];
62
- if (profile === "nav")
63
- return tools.filter((t) => NAV_TOOLS.has(t.name));
64
- // edit = nav + extras
65
- return tools.filter((t) => NAV_TOOLS.has(t.name) || EDIT_EXTRAS.has(t.name));
72
+ // META_TOOLS are ALWAYS visible — session_analytics, session_budget,
73
+ // session_snapshot are the instruments for verifying the profile is
74
+ // doing its job. Hiding them would turn "did this save tokens?" into
75
+ // a guess.
76
+ if (profile === "nav") {
77
+ return tools.filter((t) => NAV_TOOLS.has(t.name) || META_TOOLS.has(t.name));
78
+ }
79
+ // edit = nav + extras + meta
80
+ return tools.filter((t) => NAV_TOOLS.has(t.name) ||
81
+ EDIT_EXTRAS.has(t.name) ||
82
+ META_TOOLS.has(t.name));
66
83
  }
67
84
  /**
68
85
  * Parse the TOKEN_PILOT_PROFILE env value. Unknown values get a warning
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "token-pilot",
3
- "version": "0.28.0",
3
+ "version": "0.28.1",
4
4
  "description": "Save up to 80% tokens when AI reads code \u2014 MCP server for token-efficient code navigation, AST-aware structural reading instead of dumping full files into context window",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",