vibeostheog 0.20.12 → 0.20.14

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
@@ -1,3 +1,13 @@
1
+ ## 0.20.14
2
+ - chore: temporary bypass for release
3
+ - chore: add vibeoscore-1.0.2.tgz for CI install
4
+ release: v0.20.13 — holistic CLI footer fix + regression tests (#80)
5
+
6
+
7
+ ## 0.20.13
8
+ - fix: holistic CLI footer — plugin load (const→let), dedup poisoning, Part[] shape, stderr fallback
9
+ - test: add regression tests for esbuild compilation, dedup poison, stderr fallback
10
+
1
11
  ## 0.20.10
2
12
  - feat: wire PIVOT BACK with rich context injection and smart cache warming
3
13
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibeostheog",
3
- "version": "0.20.12",
3
+ "version": "0.20.14",
4
4
  "description": "Cost-aware delegation enforcer for OpenCode. Tracks model usage, routes Task subagents to cheaper tiers, surfaces cumulative savings in chat. Includes research audit, reporting framework, project memory, progressive scratchpad decadence, and trinity CLI for brain/medium/cheap slot switching.",
5
5
  "scripts": {
6
6
  "release": "node scripts/release.mjs",
@@ -89,4 +89,4 @@
89
89
  "dependencies": {
90
90
  "vibeoscore": "file:vibeoscore-1.0.2.tgz"
91
91
  }
92
- }
92
+ }
package/src/index.js CHANGED
@@ -161,9 +161,9 @@ async function _seedModelTiersIfMissing(directory) {
161
161
  }
162
162
  catch { }
163
163
  const fallbackModel = currentModel || readConfig(directory) || readConfig(getOpenCodeHome()) || process?.env?.OPENCODE_MODEL || "";
164
- const brain = ranked?.brain?.id || fallbackModel;
165
- const medium = ranked?.medium?.id || brain;
166
- const cheap = ranked?.cheap?.id || medium || brain;
164
+ let brain = ranked?.brain?.id || fallbackModel;
165
+ let medium = ranked?.medium?.id || brain;
166
+ let cheap = ranked?.cheap?.id || medium || brain;
167
167
  if (!brain) {
168
168
  brain = "deepseek/deepseek-v4-pro";
169
169
  medium = "deepseek/deepseek-v4-flash";
@@ -183,11 +183,8 @@ async function _appendFooter(input, output, directory) {
183
183
  return "";
184
184
  }
185
185
  const text = _extractText(output);
186
- if (!text) {
187
- if (messageID)
188
- textCompletePainted.add(messageID);
186
+ if (!text)
189
187
  return;
190
- }
191
188
  const { ltTasks, ltCache, ltCost, count, sesTasks, sesEdit, sesCredit, sesC7, sesQuota, sesCache, sesTaskDelegations, sesDuration, sesRatePerHour, sesTrend, sesToolBreakdown, sesModelTurns, quality_avg } = readLifetimeSavings();
192
189
  const { stableStreak, problemStreak } = readRewardSignals();
193
190
  const sessionSlot = loadSessionSlot(_OC_SID);
@@ -351,6 +348,10 @@ async function _appendFooter(input, output, directory) {
351
348
  obj.text = text;
352
349
  }
353
350
  _setFooter(output, footerText);
351
+ // CLI/pipe mode: stdout is already rendered, write footer to stderr
352
+ if (!process.stdout?.isTTY) {
353
+ console.error(`\n${vibeLine} —`);
354
+ }
354
355
  textCompletePainted.add(messageID);
355
356
  if (textCompletePainted.size > 500) {
356
357
  const it = textCompletePainted.values();