@ictechgy/context-guard 0.4.10 → 0.4.11

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.
Files changed (27) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/README.ko.md +32 -21
  3. package/README.md +38 -29
  4. package/docs/benchmark-fixtures/token-savings-12task.evidence.example.jsonl +24 -0
  5. package/docs/benchmark-workflow-examples.md +3 -0
  6. package/docs/benchmark-workflows/context-pack-byte-proxy.example.json +278 -137
  7. package/docs/benchmark-workflows/measured-token-workflow.example.json +279 -138
  8. package/docs/benchmark-workflows/provider-cache-telemetry.example.json +279 -138
  9. package/docs/experimental-benchmark-fixtures.md +24 -7
  10. package/package.json +2 -1
  11. package/plugins/context-guard/.claude-plugin/plugin.json +1 -1
  12. package/plugins/context-guard/README.ko.md +14 -11
  13. package/plugins/context-guard/README.md +15 -14
  14. package/plugins/context-guard/bin/context-guard +46 -11
  15. package/plugins/context-guard/bin/context-guard-artifact +342 -33
  16. package/plugins/context-guard/bin/context-guard-audit +33 -2
  17. package/plugins/context-guard/bin/context-guard-bench +1542 -31
  18. package/plugins/context-guard/bin/context-guard-cache-score +318 -33
  19. package/plugins/context-guard/bin/context-guard-cost +7 -2
  20. package/plugins/context-guard/bin/context-guard-experiments +364 -8
  21. package/plugins/context-guard/bin/context-guard-failed-nudge +6 -2
  22. package/plugins/context-guard/bin/context-guard-pack +301 -17
  23. package/plugins/context-guard/bin/context-guard-sanitize-output +76 -12
  24. package/plugins/context-guard/bin/context-guard-tool-prune +241 -54
  25. package/plugins/context-guard/bin/context-guard-trim-output +288 -41
  26. package/plugins/context-guard/brief/README.md +5 -5
  27. package/plugins/context-guard/lib/context_guard_commands.py +214 -190
@@ -1,206 +1,230 @@
1
- #!/usr/bin/env python3
2
1
  """Canonical ContextGuard command/package manifest.
3
2
 
4
3
  This module is intentionally side-effect free. It centralizes command, copy,
5
4
  package, and smoke-test inventories that were previously repeated across the
6
5
  runtime dispatcher, release gates, sync tooling, smoke tests, and unit tests.
7
6
  """
8
- from __future__ import annotations
9
7
 
10
- from typing import Any
8
+ IMPLEMENTATION_PAIRS = (('context_guard_cli.py', 'context-guard'),
9
+ ('cost_guard.py', 'context-guard-cost'),
10
+ ('cache_score.py', 'context-guard-cache-score'),
11
+ ('benchmark_runner.py', 'context-guard-bench'),
12
+ ('context_escrow.py', 'context-guard-artifact'),
13
+ ('context_compress.py', 'context-guard-compress'),
14
+ ('context_pack.py', 'context-guard-pack'),
15
+ ('context_filter.py', 'context-guard-filter'),
16
+ ('tool_schema_pruner.py', 'context-guard-tool-prune'),
17
+ ('claude_transcript_cost_audit.py', 'context-guard-audit'),
18
+ ('context_guard_diet.py', 'context-guard-diet'),
19
+ ('experimental_registry.py', 'context-guard-experiments'),
20
+ ('failed_attempt_nudge.py', 'context-guard-failed-nudge'),
21
+ ('guard_large_read.py', 'context-guard-guard-read'),
22
+ ('read_symbol.py', 'context-guard-read-symbol'),
23
+ ('rewrite_bash_for_token_budget.py', 'context-guard-rewrite-bash'),
24
+ ('sanitize_output.py', 'context-guard-sanitize-output'),
25
+ ('setup_wizard.py', 'context-guard-setup'),
26
+ ('statusline.sh', 'context-guard-statusline'),
27
+ ('statusline_merged.sh', 'context-guard-statusline-merged'),
28
+ ('trim_command_output.py', 'context-guard-trim-output'))
11
29
 
12
- IMPLEMENTATION_PAIRS: tuple[tuple[str, str], ...] = (
13
- ("context_guard_cli.py", "context-guard"),
14
- ("cost_guard.py", "context-guard-cost"),
15
- ("cache_score.py", "context-guard-cache-score"),
16
- ("benchmark_runner.py", "context-guard-bench"),
17
- ("context_escrow.py", "context-guard-artifact"),
18
- ("context_compress.py", "context-guard-compress"),
19
- ("context_pack.py", "context-guard-pack"),
20
- ("context_filter.py", "context-guard-filter"),
21
- ("tool_schema_pruner.py", "context-guard-tool-prune"),
22
- ("claude_transcript_cost_audit.py", "context-guard-audit"),
23
- ("context_guard_diet.py", "context-guard-diet"),
24
- ("experimental_registry.py", "context-guard-experiments"),
25
- ("failed_attempt_nudge.py", "context-guard-failed-nudge"),
26
- ("guard_large_read.py", "context-guard-guard-read"),
27
- ("read_symbol.py", "context-guard-read-symbol"),
28
- ("rewrite_bash_for_token_budget.py", "context-guard-rewrite-bash"),
29
- ("sanitize_output.py", "context-guard-sanitize-output"),
30
- ("setup_wizard.py", "context-guard-setup"),
31
- ("statusline.sh", "context-guard-statusline"),
32
- ("statusline_merged.sh", "context-guard-statusline-merged"),
33
- ("trim_command_output.py", "context-guard-trim-output"),
34
- )
30
+ HELPER_PAIRS = (('hook_secret_patterns.py', 'lib/hook_secret_patterns.py'),
31
+ ('context_guard_commands.py', 'lib/context_guard_commands.py'))
35
32
 
36
- HELPER_PAIRS: tuple[tuple[str, str], ...] = (
37
- ("hook_secret_patterns.py", "lib/hook_secret_patterns.py"),
38
- ("context_guard_commands.py", "lib/context_guard_commands.py"),
39
- )
33
+ NPM_BINS = ('context-guard',
34
+ 'context-guard-cost',
35
+ 'context-guard-cache-score',
36
+ 'context-guard-bench',
37
+ 'context-guard-artifact',
38
+ 'context-guard-compress',
39
+ 'context-guard-pack',
40
+ 'context-guard-filter',
41
+ 'context-guard-tool-prune',
42
+ 'context-guard-audit',
43
+ 'context-guard-diet',
44
+ 'context-guard-experiments',
45
+ 'context-guard-failed-nudge',
46
+ 'context-guard-guard-read',
47
+ 'context-guard-read-symbol',
48
+ 'context-guard-rewrite-bash',
49
+ 'context-guard-sanitize-output',
50
+ 'context-guard-setup',
51
+ 'context-guard-statusline',
52
+ 'context-guard-statusline-merged',
53
+ 'context-guard-trim-output')
40
54
 
41
- NPM_BINS: tuple[str, ...] = (
42
- "context-guard",
43
- "context-guard-cost",
44
- "context-guard-cache-score",
45
- "context-guard-bench",
46
- "context-guard-artifact",
47
- "context-guard-compress",
48
- "context-guard-pack",
49
- "context-guard-filter",
50
- "context-guard-tool-prune",
51
- "context-guard-audit",
52
- "context-guard-diet",
53
- "context-guard-experiments",
54
- "context-guard-failed-nudge",
55
- "context-guard-guard-read",
56
- "context-guard-read-symbol",
57
- "context-guard-rewrite-bash",
58
- "context-guard-sanitize-output",
59
- "context-guard-setup",
60
- "context-guard-statusline",
61
- "context-guard-statusline-merged",
62
- "context-guard-trim-output",
63
- )
64
- NPM_BIN_PATHS: dict[str, str] = {
65
- name: f"plugins/context-guard/bin/{name}" for name in NPM_BINS
66
- }
55
+ NPM_BIN_PATHS = {'context-guard': 'plugins/context-guard/bin/context-guard',
56
+ 'context-guard-cost': 'plugins/context-guard/bin/context-guard-cost',
57
+ 'context-guard-cache-score': 'plugins/context-guard/bin/context-guard-cache-score',
58
+ 'context-guard-bench': 'plugins/context-guard/bin/context-guard-bench',
59
+ 'context-guard-artifact': 'plugins/context-guard/bin/context-guard-artifact',
60
+ 'context-guard-compress': 'plugins/context-guard/bin/context-guard-compress',
61
+ 'context-guard-pack': 'plugins/context-guard/bin/context-guard-pack',
62
+ 'context-guard-filter': 'plugins/context-guard/bin/context-guard-filter',
63
+ 'context-guard-tool-prune': 'plugins/context-guard/bin/context-guard-tool-prune',
64
+ 'context-guard-audit': 'plugins/context-guard/bin/context-guard-audit',
65
+ 'context-guard-diet': 'plugins/context-guard/bin/context-guard-diet',
66
+ 'context-guard-experiments': 'plugins/context-guard/bin/context-guard-experiments',
67
+ 'context-guard-failed-nudge': 'plugins/context-guard/bin/context-guard-failed-nudge',
68
+ 'context-guard-guard-read': 'plugins/context-guard/bin/context-guard-guard-read',
69
+ 'context-guard-read-symbol': 'plugins/context-guard/bin/context-guard-read-symbol',
70
+ 'context-guard-rewrite-bash': 'plugins/context-guard/bin/context-guard-rewrite-bash',
71
+ 'context-guard-sanitize-output': 'plugins/context-guard/bin/context-guard-sanitize-output',
72
+ 'context-guard-setup': 'plugins/context-guard/bin/context-guard-setup',
73
+ 'context-guard-statusline': 'plugins/context-guard/bin/context-guard-statusline',
74
+ 'context-guard-statusline-merged': 'plugins/context-guard/bin/context-guard-statusline-merged',
75
+ 'context-guard-trim-output': 'plugins/context-guard/bin/context-guard-trim-output'}
67
76
 
68
- DISPATCHER_SUBCOMMANDS: dict[str, tuple[str, ...]] = {
69
- "setup": ("context-guard-setup",),
70
- "doctor": ("context-guard-setup", "--verify"),
71
- "audit": ("context-guard-audit",),
72
- "diet": ("context-guard-diet",),
73
- "experiments": ("context-guard-experiments",),
74
- "scan": ("context-guard-diet", "scan"),
75
- "trim-output": ("context-guard-trim-output",),
76
- "trim": ("context-guard-trim-output",),
77
- "sanitize-output": ("context-guard-sanitize-output",),
78
- "sanitize": ("context-guard-sanitize-output",),
79
- "filter": ("context-guard-filter",),
80
- "artifact": ("context-guard-artifact",),
81
- "pack": ("context-guard-pack",),
82
- "tool-prune": ("context-guard-tool-prune",),
83
- "compress": ("context-guard-compress",),
84
- "cost": ("context-guard-cost",),
85
- "route-advisor": ("context-guard-cost", "route-advisor"),
86
- "route": ("context-guard-cost", "route-advisor"),
87
- "cache-score": ("context-guard-cache-score",),
88
- "bench": ("context-guard-bench",),
89
- "read-symbol": ("context-guard-read-symbol",),
90
- "rewrite-bash": ("context-guard-rewrite-bash",),
91
- "guard-read": ("context-guard-guard-read",),
92
- "failed-nudge": ("context-guard-failed-nudge",),
93
- "statusline": ("context-guard-statusline",),
94
- "statusline-merged": ("context-guard-statusline-merged",),
95
- }
77
+ DISPATCHER_SUBCOMMANDS = {'setup': ('context-guard-setup',),
78
+ 'doctor': ('context-guard-setup', '--verify'),
79
+ 'audit': ('context-guard-audit',),
80
+ 'diet': ('context-guard-diet',),
81
+ 'experiments': ('context-guard-experiments',),
82
+ 'scan': ('context-guard-diet', 'scan'),
83
+ 'trim-output': ('context-guard-trim-output',),
84
+ 'trim': ('context-guard-trim-output',),
85
+ 'sanitize-output': ('context-guard-sanitize-output',),
86
+ 'sanitize': ('context-guard-sanitize-output',),
87
+ 'filter': ('context-guard-filter',),
88
+ 'artifact': ('context-guard-artifact',),
89
+ 'pack': ('context-guard-pack',),
90
+ 'tool-prune': ('context-guard-tool-prune',),
91
+ 'compress': ('context-guard-compress',),
92
+ 'cost': ('context-guard-cost',),
93
+ 'route-advisor': ('context-guard-cost', 'route-advisor'),
94
+ 'route': ('context-guard-cost', 'route-advisor'),
95
+ 'cache-score': ('context-guard-cache-score',),
96
+ 'bench': ('context-guard-bench',),
97
+ 'read-symbol': ('context-guard-read-symbol',),
98
+ 'rewrite-bash': ('context-guard-rewrite-bash',),
99
+ 'guard-read': ('context-guard-guard-read',),
100
+ 'failed-nudge': ('context-guard-failed-nudge',),
101
+ 'statusline': ('context-guard-statusline',),
102
+ 'statusline-merged': ('context-guard-statusline-merged',)}
96
103
 
97
- LEGACY_WRAPPERS: tuple[str, ...] = (
98
- "claude-read-symbol",
99
- "claude-sanitize-output",
100
- "claude-token-artifact",
101
- "claude-token-audit",
102
- "claude-token-bench",
103
- "claude-token-diet",
104
- "claude-token-failed-nudge",
105
- "claude-token-guard-read",
106
- "claude-token-rewrite-bash",
107
- "claude-token-setup",
108
- "claude-token-statusline",
109
- "claude-token-statusline-merged",
110
- "claude-trim-output",
111
- )
104
+ LEGACY_WRAPPERS = ('claude-read-symbol',
105
+ 'claude-sanitize-output',
106
+ 'claude-token-artifact',
107
+ 'claude-token-audit',
108
+ 'claude-token-bench',
109
+ 'claude-token-diet',
110
+ 'claude-token-failed-nudge',
111
+ 'claude-token-guard-read',
112
+ 'claude-token-rewrite-bash',
113
+ 'claude-token-setup',
114
+ 'claude-token-statusline',
115
+ 'claude-token-statusline-merged',
116
+ 'claude-trim-output')
112
117
 
113
- ENTRYPOINT_SMOKE_CASES: dict[str, dict[str, Any]] = {
114
- "context-guard": {"args": ["--version"], "mode": "text"},
115
- "context-guard-read-symbol": {"args": ["--help"], "mode": "text"},
116
- "context-guard-sanitize-output": {"args": ["--help"], "mode": "text"},
117
- "context-guard-artifact": {"args": ["--help"], "mode": "text"},
118
- "context-guard-audit": {"args": ["--help"], "mode": "text"},
119
- "context-guard-bench": {"args": ["--help"], "mode": "text"},
120
- "context-guard-compress": {"args": ["--help"], "mode": "text"},
121
- "context-guard-cost": {"args": ["--help"], "mode": "text"},
122
- "context-guard-cache-score": {"args": ["--help"], "mode": "text"},
123
- "context-guard-pack": {"args": ["--help"], "mode": "text"},
124
- "context-guard-tool-prune": {"args": ["--help"], "mode": "text"},
125
- "context-guard-diet": {"args": ["--help"], "mode": "text"},
126
- "context-guard-experiments": {"args": ["--help"], "mode": "text"},
127
- "context-guard-failed-nudge": {"args": [], "mode": "hook-json"},
128
- "context-guard-filter": {"args": ["--help"], "mode": "text"},
129
- "context-guard-guard-read": {"args": [], "mode": "hook-json"},
130
- "context-guard-rewrite-bash": {"args": [], "mode": "hook-json"},
131
- "context-guard-setup": {"args": ["--help"], "mode": "text"},
132
- "context-guard-statusline": {"args": [], "mode": "statusline"},
133
- "context-guard-statusline-merged": {"args": [], "mode": "statusline"},
134
- "context-guard-trim-output": {"args": ["--help"], "mode": "text"},
135
- # Legacy wrappers kept so existing automation does not break during the rebrand.
136
- "claude-read-symbol": {"args": ["--help"], "mode": "text"},
137
- "claude-sanitize-output": {"args": ["--help"], "mode": "text"},
138
- "claude-token-artifact": {"args": ["--help"], "mode": "text"},
139
- "claude-token-audit": {"args": ["--help"], "mode": "text"},
140
- "claude-token-bench": {"args": ["--help"], "mode": "text"},
141
- "claude-token-diet": {"args": ["--help"], "mode": "text"},
142
- "claude-token-failed-nudge": {"args": [], "mode": "hook-json"},
143
- "claude-token-guard-read": {"args": [], "mode": "hook-json"},
144
- "claude-token-rewrite-bash": {"args": [], "mode": "hook-json"},
145
- "claude-token-setup": {"args": ["--help"], "mode": "text"},
146
- "claude-token-statusline": {"args": [], "mode": "statusline"},
147
- "claude-token-statusline-merged": {"args": [], "mode": "statusline"},
148
- "claude-trim-output": {"args": ["--help"], "mode": "text"},
149
- }
118
+ ENTRYPOINT_SMOKE_CASES = {'context-guard': {'args': ['--version'], 'mode': 'text'},
119
+ 'context-guard-read-symbol': {'args': ['--help'], 'mode': 'text'},
120
+ 'context-guard-sanitize-output': {'args': ['--help'], 'mode': 'text'},
121
+ 'context-guard-artifact': {'args': ['--help'], 'mode': 'text'},
122
+ 'context-guard-audit': {'args': ['--help'], 'mode': 'text'},
123
+ 'context-guard-bench': {'args': ['--help'], 'mode': 'text'},
124
+ 'context-guard-compress': {'args': ['--help'], 'mode': 'text'},
125
+ 'context-guard-cost': {'args': ['--help'], 'mode': 'text'},
126
+ 'context-guard-cache-score': {'args': ['--help'], 'mode': 'text'},
127
+ 'context-guard-pack': {'args': ['--help'], 'mode': 'text'},
128
+ 'context-guard-tool-prune': {'args': ['--help'], 'mode': 'text'},
129
+ 'context-guard-diet': {'args': ['--help'], 'mode': 'text'},
130
+ 'context-guard-experiments': {'args': ['--help'], 'mode': 'text'},
131
+ 'context-guard-failed-nudge': {'args': [], 'mode': 'hook-json'},
132
+ 'context-guard-filter': {'args': ['--help'], 'mode': 'text'},
133
+ 'context-guard-guard-read': {'args': [], 'mode': 'hook-json'},
134
+ 'context-guard-rewrite-bash': {'args': [], 'mode': 'hook-json'},
135
+ 'context-guard-setup': {'args': ['--help'], 'mode': 'text'},
136
+ 'context-guard-statusline': {'args': [], 'mode': 'statusline'},
137
+ 'context-guard-statusline-merged': {'args': [], 'mode': 'statusline'},
138
+ 'context-guard-trim-output': {'args': ['--help'], 'mode': 'text'},
139
+ 'claude-read-symbol': {'args': ['--help'], 'mode': 'text'},
140
+ 'claude-sanitize-output': {'args': ['--help'], 'mode': 'text'},
141
+ 'claude-token-artifact': {'args': ['--help'], 'mode': 'text'},
142
+ 'claude-token-audit': {'args': ['--help'], 'mode': 'text'},
143
+ 'claude-token-bench': {'args': ['--help'], 'mode': 'text'},
144
+ 'claude-token-diet': {'args': ['--help'], 'mode': 'text'},
145
+ 'claude-token-failed-nudge': {'args': [], 'mode': 'hook-json'},
146
+ 'claude-token-guard-read': {'args': [], 'mode': 'hook-json'},
147
+ 'claude-token-rewrite-bash': {'args': [], 'mode': 'hook-json'},
148
+ 'claude-token-setup': {'args': ['--help'], 'mode': 'text'},
149
+ 'claude-token-statusline': {'args': [], 'mode': 'statusline'},
150
+ 'claude-token-statusline-merged': {'args': [], 'mode': 'statusline'},
151
+ 'claude-trim-output': {'args': ['--help'], 'mode': 'text'}}
150
152
 
151
- PLUGIN_ENTRYPOINTS: tuple[str, ...] = (
152
- "claude-read-symbol",
153
- "claude-sanitize-output",
154
- "claude-token-artifact",
155
- "claude-token-audit",
156
- "claude-token-bench",
157
- "claude-token-diet",
158
- "claude-token-failed-nudge",
159
- "claude-token-guard-read",
160
- "claude-token-rewrite-bash",
161
- "claude-token-setup",
162
- "claude-token-statusline",
163
- "claude-token-statusline-merged",
164
- "claude-trim-output",
165
- "context-guard",
166
- "context-guard-artifact",
167
- "context-guard-audit",
168
- "context-guard-bench",
169
- "context-guard-compress",
170
- "context-guard-cost",
171
- "context-guard-cache-score",
172
- "context-guard-diet",
173
- "context-guard-experiments",
174
- "context-guard-failed-nudge",
175
- "context-guard-filter",
176
- "context-guard-guard-read",
177
- "context-guard-pack",
178
- "context-guard-read-symbol",
179
- "context-guard-rewrite-bash",
180
- "context-guard-sanitize-output",
181
- "context-guard-setup",
182
- "context-guard-statusline",
183
- "context-guard-statusline-merged",
184
- "context-guard-tool-prune",
185
- "context-guard-trim-output",
186
- )
153
+ PLUGIN_ENTRYPOINTS = ('claude-read-symbol',
154
+ 'claude-sanitize-output',
155
+ 'claude-token-artifact',
156
+ 'claude-token-audit',
157
+ 'claude-token-bench',
158
+ 'claude-token-diet',
159
+ 'claude-token-failed-nudge',
160
+ 'claude-token-guard-read',
161
+ 'claude-token-rewrite-bash',
162
+ 'claude-token-setup',
163
+ 'claude-token-statusline',
164
+ 'claude-token-statusline-merged',
165
+ 'claude-trim-output',
166
+ 'context-guard',
167
+ 'context-guard-artifact',
168
+ 'context-guard-audit',
169
+ 'context-guard-bench',
170
+ 'context-guard-compress',
171
+ 'context-guard-cost',
172
+ 'context-guard-cache-score',
173
+ 'context-guard-diet',
174
+ 'context-guard-experiments',
175
+ 'context-guard-failed-nudge',
176
+ 'context-guard-filter',
177
+ 'context-guard-guard-read',
178
+ 'context-guard-pack',
179
+ 'context-guard-read-symbol',
180
+ 'context-guard-rewrite-bash',
181
+ 'context-guard-sanitize-output',
182
+ 'context-guard-setup',
183
+ 'context-guard-statusline',
184
+ 'context-guard-statusline-merged',
185
+ 'context-guard-tool-prune',
186
+ 'context-guard-trim-output')
187
187
 
188
- DISPATCHER_SMOKE_CASES: tuple[dict[str, Any], ...] = (
189
- {"entrypoint": "context-guard", "args": ["experiments", "list", "--json"], "mode": "json"},
190
- {"entrypoint": "context-guard", "args": ["cost", "--help"], "mode": "text"},
191
- {"entrypoint": "context-guard", "args": ["route-advisor", "--help"], "mode": "text"},
192
- {"entrypoint": "context-guard", "args": ["cache-score", "--help"], "mode": "text"},
193
- {"entrypoint": "context-guard-pack", "args": ["suggest", "--help"], "mode": "text"},
194
- {"entrypoint": "context-guard-pack", "args": ["auto", "--help"], "mode": "text"},
195
- )
188
+ DISPATCHER_SMOKE_CASES = ({'entrypoint': 'context-guard', 'args': ['experiments', 'list', '--json'], 'mode': 'json'},
189
+ {'entrypoint': 'context-guard', 'args': ['cost', '--help'], 'mode': 'text'},
190
+ {'entrypoint': 'context-guard', 'args': ['route-advisor', '--help'], 'mode': 'text'},
191
+ {'entrypoint': 'context-guard', 'args': ['cache-score', '--help'], 'mode': 'text'},
192
+ {'entrypoint': 'context-guard-pack', 'args': ['suggest', '--help'], 'mode': 'text'},
193
+ {'entrypoint': 'context-guard-pack', 'args': ['auto', '--help'], 'mode': 'text'})
196
194
 
197
-
198
- def expected_command_pack_files() -> tuple[str, ...]:
199
- # npm packages ship the plugin-local executable/helper copies only. The
200
- # checkout-local ``context-guard-kit`` files remain the source of truth for
201
- # maintainers and are kept byte-synchronized with these packaged copies by
202
- # ``scripts/sync_plugin_copies.py`` and ``scripts/prepublish_check.py``.
203
- files = {f"plugins/context-guard/bin/{bin_name}" for _kit_name, bin_name in IMPLEMENTATION_PAIRS}
204
- files.update(f"plugins/context-guard/{plugin_rel}" for _kit_name, plugin_rel in HELPER_PAIRS)
205
- files.update(f"plugins/context-guard/bin/{wrapper}" for wrapper in LEGACY_WRAPPERS)
206
- return tuple(sorted(files))
195
+ EXPECTED_COMMAND_PACK_FILES = ('plugins/context-guard/bin/claude-read-symbol',
196
+ 'plugins/context-guard/bin/claude-sanitize-output',
197
+ 'plugins/context-guard/bin/claude-token-artifact',
198
+ 'plugins/context-guard/bin/claude-token-audit',
199
+ 'plugins/context-guard/bin/claude-token-bench',
200
+ 'plugins/context-guard/bin/claude-token-diet',
201
+ 'plugins/context-guard/bin/claude-token-failed-nudge',
202
+ 'plugins/context-guard/bin/claude-token-guard-read',
203
+ 'plugins/context-guard/bin/claude-token-rewrite-bash',
204
+ 'plugins/context-guard/bin/claude-token-setup',
205
+ 'plugins/context-guard/bin/claude-token-statusline',
206
+ 'plugins/context-guard/bin/claude-token-statusline-merged',
207
+ 'plugins/context-guard/bin/claude-trim-output',
208
+ 'plugins/context-guard/bin/context-guard',
209
+ 'plugins/context-guard/bin/context-guard-artifact',
210
+ 'plugins/context-guard/bin/context-guard-audit',
211
+ 'plugins/context-guard/bin/context-guard-bench',
212
+ 'plugins/context-guard/bin/context-guard-cache-score',
213
+ 'plugins/context-guard/bin/context-guard-compress',
214
+ 'plugins/context-guard/bin/context-guard-cost',
215
+ 'plugins/context-guard/bin/context-guard-diet',
216
+ 'plugins/context-guard/bin/context-guard-experiments',
217
+ 'plugins/context-guard/bin/context-guard-failed-nudge',
218
+ 'plugins/context-guard/bin/context-guard-filter',
219
+ 'plugins/context-guard/bin/context-guard-guard-read',
220
+ 'plugins/context-guard/bin/context-guard-pack',
221
+ 'plugins/context-guard/bin/context-guard-read-symbol',
222
+ 'plugins/context-guard/bin/context-guard-rewrite-bash',
223
+ 'plugins/context-guard/bin/context-guard-sanitize-output',
224
+ 'plugins/context-guard/bin/context-guard-setup',
225
+ 'plugins/context-guard/bin/context-guard-statusline',
226
+ 'plugins/context-guard/bin/context-guard-statusline-merged',
227
+ 'plugins/context-guard/bin/context-guard-tool-prune',
228
+ 'plugins/context-guard/bin/context-guard-trim-output',
229
+ 'plugins/context-guard/lib/context_guard_commands.py',
230
+ 'plugins/context-guard/lib/hook_secret_patterns.py')