cc-cream 0.1.10 → 0.1.12

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.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,16 @@ All notable changes to cc-cream are documented here. Format follows
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions follow
5
5
  [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [0.1.12] — 2026-05-29
8
+
9
+ ### Changed
10
+ - **`/cc-cream:setup` and `/cc-cream:uninstall` are much cheaper to run** (CREAM-qhgyiodh). These are slash commands, so their `.md` body and the installer's stdout both enter the model context (~1k tokens for an uninstall). Trimmed the command bodies to just the bang line — the only essential human hint (“run `/plugin uninstall cc-cream` afterwards”) now lives in the frontmatter `description`, which is menu metadata rather than model-facing body. And `install.js` no longer echoes the full statusLine command JSON: it prints terse confirmations (`Removed cc-cream's statusLine.`, `Setting the cc-cream statusLine.`). The terse summary also survives Claude Code's command-output fold, so the “what was removed / kept” feedback is actually visible. (The bar itself remains zero-token — it's never in the model context; this only concerns the occasional setup/uninstall commands.)
11
+
12
+ ## [0.1.11] — 2026-05-29
13
+
14
+ ### Fixed
15
+ - **Status bar could pin to an old version when a non-semver cache dir exists** (CREAM-kxwhbwzq). The plugin-mode statusLine self-resolves the highest installed version with `ls -1d …/cc-cream/*/ | sort -V | tail -1`. `sort -V` sorts directory *names*, so a git-sha install dir (e.g. `c83650b6360f/`) sorts after every `0.1.x` and got picked — pinning the bar to whatever version that dir held (observed: 0.1.3), with `/plugin update` unable to move off it. The command now filters to semver-named dirs (`grep -E '/[0-9]+(\.[0-9]+)+/$'`) before `sort -V`, so a stray non-numeric dir can't hijack version selection. Re-run `/cc-cream:setup` once (or reinstall) to rewrite the statusLine with the hardened command.
16
+
7
17
  ## [0.1.10] — 2026-05-29
8
18
 
9
19
  ### Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cc-cream",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "description": "Claude Code cache/context/cost status-line tool",
5
5
  "directories": {
6
6
  "doc": "docs"
package/src/install.js CHANGED
@@ -23,10 +23,13 @@ const TRUST_NOTE =
23
23
  // `nodePath` is the ABSOLUTE node binary, resolved once at setup time — the
24
24
  // statusLine subprocess may not inherit the user's PATH, so a bare `node` is
25
25
  // unsafe. The `-d .../*/` glob yields directory paths with a trailing slash, so
26
- // `src/cc-cream.js` concatenates directly. `sort -V | tail -1` picks the highest
27
- // installed version, so `/plugin update` is applied live with no re-run of setup.
26
+ // `src/cc-cream.js` concatenates directly. The `grep` keeps ONLY semver-named
27
+ // dirs (e.g. `0.1.10/`) before `sort -V | tail -1` picks the highest — without
28
+ // it, a non-numeric cache dir (a git-sha install like `c83650b6360f/`) sorts
29
+ // last and pins the bar to whatever version that happens to be, defeating
30
+ // auto-update. With it, `/plugin update` is applied live with no re-run of setup.
28
31
  export function autoUpdateCommand(nodePath) {
29
- return `${nodePath} "$(ls -1d "\${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/plugins/cache/*/cc-cream/*/ 2>/dev/null | sort -V | tail -1)src/cc-cream.js"`;
32
+ return `${nodePath} "$(ls -1d "\${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/plugins/cache/*/cc-cream/*/ 2>/dev/null | grep -E '/[0-9]+(\\.[0-9]+)+/$' | sort -V | tail -1)src/cc-cream.js"`;
30
33
  }
31
34
 
32
35
  // `desired` is considered already installed if it matches the planned command
@@ -65,16 +68,14 @@ export function planUninstall(settings) {
65
68
 
66
69
  if (!isCcCreamStatusLine(existing)) {
67
70
  if (existing && typeof existing === 'object') {
68
- messages.push(
69
- `Your statusLine is not cc-cream's — leaving it untouched:\n ${JSON.stringify(existing)}`,
70
- );
71
+ messages.push("Your statusLine is not cc-cream's — leaving it untouched.");
71
72
  } else {
72
73
  messages.push('No cc-cream statusLine found in settings.json — nothing to remove.');
73
74
  }
74
75
  return { settings: s, changed: false, messages };
75
76
  }
76
77
 
77
- messages.push(`Removing cc-cream statusLine:\n ${JSON.stringify(existing)}`);
78
+ messages.push("Removed cc-cream's statusLine.");
78
79
  const next = { ...s };
79
80
  delete next.statusLine;
80
81
  return { settings: next, changed: true, messages };
@@ -110,7 +111,7 @@ export function plan(settings, { entrypoint, consent, plugin = false, nodePath }
110
111
  // An existing (different) statusLine must be confirmed before replacing.
111
112
  const hasExisting = existing && typeof existing === 'object';
112
113
  if (hasExisting) {
113
- messages.push(`An existing statusLine is configured:\n ${JSON.stringify(existing)}`);
114
+ messages.push('An existing statusLine is configured.');
114
115
  messages.push('Replace it with cc-cream?');
115
116
  if (consent !== true) {
116
117
  messages.push('Declined — your existing statusLine is unchanged.');
@@ -118,7 +119,7 @@ export function plan(settings, { entrypoint, consent, plugin = false, nodePath }
118
119
  }
119
120
  }
120
121
 
121
- messages.push(`Will set statusLine to:\n ${JSON.stringify(desired)}`);
122
+ messages.push('Setting the cc-cream statusLine.');
122
123
  messages.push(TRUST_NOTE);
123
124
  return { settings: { ...s, statusLine: desired }, changed: true, messages, needsConsent: hasExisting };
124
125
  }