vibeostheog 0.25.32 → 0.25.34

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,47 +1,18 @@
1
- ## 0.25.32
2
- - feat: anti-lie enforcement verify-claims + claim gauge + cascade cross-ref
3
- - feat: anti-lie enforcement - verify-claims tool, claim gauge in footer
4
- - feat: anti-loop cost guard with per-turn memoization
5
- - feat: remove auto-lock on slot/mode change, README/skills use vibe, lock regression tests
6
- - feat: store API-predicted optimization_mode from blackboxAnalyze + regression test
7
- - feat: add vibe as primary tool name, trinity remains as alias
8
- - feat: delegation guide explicit Task subagent syntax in system prompt + enforcement note
9
- - feat: add plan update/close/completion directives to system prompt + cascade tests
10
- - feat: add cascade icon (▸▸▸) to footer when VibeUltraX cascade is active (#223)
11
- - fix: PCRE (?i) regex syntax not valid in JS - use /pattern/i flag instead
12
- - fix: add runtime claim verifier and strengthen anti-lie directive
13
- - fix: skip 5 pre-existing flaky tests to green CI
14
- - fix: add VIBEOS_API_DISABLED to quality_pipeline test sandbox
15
- - fix: taskModel ReferenceError, remove _warnCounts check from enforcement path
16
- - fix: reset warn counts on each test invocation (_resetWarnCountsForTest)
17
- - fix: add srv.unref() to MCP server so child processes can exit
18
- - fix: move orchestratorDirective inside try/catch (prevents loadSelection throw from breaking onSystemTransform)
19
- - fix: wire orchestratorDirective to system prompt (was dead code)
20
- - fix: add process.exit(0) to delegation test child scripts to prevent MCP server hang
21
- - fix: _cachedPct returns null when total is 0 (avoids stale 0-credit cache)
22
- - fix: set VIBEOS_HOME in recordFlowTodo test to use correct sandbox path
23
- - fix: store cascade data in blackbox history, tune loop detection threshold to 3 (#226)
24
- - fix: keep VIBEOS_HOME set to sandbox (don't delete in beforeEach) to prevent stale credit cache collisions
25
- - fix: reset session ID in beforeEach to prevent warn key collision across tests
26
- - fix: delegation test assertions for new enforcement note format
27
- - fix: delegation test assertions match new format + VIBEOS_API_DISABLED
28
- - fix: always record savings from enforcement, cap UI notes only
29
- - fix: re-add credit nudge for all tools, cap at 5 per tool per session
30
- - fix: cap repetitive warnings (max 3 per tool per session), remove credit nudge from bash/read
31
- - fix: compression notice wording — 'has been compressed' → 'will be compressed next' (accurate)
32
- - fix: readConfig falls back to bare model, fix 3 pre-existing test failures (#225)
33
- - fix: readConfig falls back to bare model, fix 3 pre-existing test failures
34
- - fix: cascade icon uses requested_optimization_mode (not loadOptimizationMode which recovers to budget)
35
- - fix: pass latestUserIntent to computeControlVector for real cascade decision
36
- - fix: cascade icon uses live computeControlVector (not undefined _controlVector) (#224)
37
- - docs: update all .md files to use vibe as primary command name
38
- - docs: footer README, real cascade tests, execFileSync timeouts
39
- - test: add 3 delegation tests (orchestrator guide, enforcement note, syncControlSettings)
40
- - test: add 7 regression tests (classify, readConfig, metrics, status payload, classification patterns, turn counter, autoSelectMode)
41
- - test: add compact memory cascade tests (scratchpad, turn 7+ notice, counter consistency)
42
- - chore: v0.25.31
43
- - chore: remove 8 toy test files, remove dead code (PRIORITY, VIBEMAX_CFG, modeCapitalized)
44
- - chore: remove 8 pure toy test files (zero assertions)
1
+ ## 0.25.34
2
+ - fix: remove hardcoded model names from fallback
3
+ - fix: restore apiRoute gate for cascade (#239)
4
+ - fix: cascade triggered only by ML_ENABLED, not apiRoute (#238)
5
+ - fix: cascade router must run regardless of remote API route (#237)
6
+ - fix: cascade fallback only when ML API route is unavailable
7
+ - fix: race condition in token refresh with concurrent session renewal (#235)
8
+ - fix: cascade applySlot fires for all tools regardless of delegation_enforce
9
+ - fix: rename pipeline tier 'local' to 'cheap' (#232)
10
+ - docs: add TDD template + branch-first workflow to AGENTS.md
11
+ - build: strip sync-ts-build from pipeline, esbuild-only bundle (#242)
12
+ Reapply "fix: remove hardcoded model names from fallback" (#244)
13
+ Revert "fix: remove hardcoded model names from fallback"
14
+ Fix fail-open delegation and remove hardcoded fallback (#243)
15
+ Remove hardcoded task fallback model (#241)
45
16
 
46
17
 
47
18
  ## 0.25.31
@@ -1 +1 @@
1
- window.__VIBEOS_DASHBOARD_BASE__ = "http://127.0.0.1:35533";
1
+ window.__VIBEOS_DASHBOARD_BASE__ = "http://127.0.0.1:42977";
package/dist/vibeOS.js CHANGED
@@ -4200,16 +4200,16 @@ function learnedRouteFromGraph(text) {
4200
4200
  }
4201
4201
  function profileFromCascade(decision, learned = null) {
4202
4202
  if (learned?.learnedTier === "cheap")
4203
- return { profile: "direct", cascade_depth: 1, pipeline_root: ["local"], tier_bias: "cheap" };
4203
+ return { profile: "direct", cascade_depth: 1, pipeline_root: ["cheap"], tier_bias: "cheap" };
4204
4204
  if (learned?.learnedTier === "medium")
4205
4205
  return { profile: "standard", cascade_depth: 2, pipeline_root: ["medium", "brain"], tier_bias: "medium" };
4206
4206
  if (learned?.learnedTier === "brain")
4207
- return { profile: "deep", cascade_depth: 3, pipeline_root: ["local", "medium", "brain"], tier_bias: "brain" };
4207
+ return { profile: "deep", cascade_depth: 3, pipeline_root: ["cheap", "medium", "brain"], tier_bias: "brain" };
4208
4208
  if (decision.useCheap && decision.escalate)
4209
- return { profile: "deep", cascade_depth: 3, pipeline_root: ["local", "medium", "brain"], tier_bias: "brain" };
4209
+ return { profile: "deep", cascade_depth: 3, pipeline_root: ["cheap", "medium", "brain"], tier_bias: "brain" };
4210
4210
  if (decision.escalate)
4211
4211
  return { profile: "standard", cascade_depth: 2, pipeline_root: ["medium", "brain"], tier_bias: "brain" };
4212
- return { profile: "direct", cascade_depth: 1, pipeline_root: ["local"], tier_bias: "cheap" };
4212
+ return { profile: "direct", cascade_depth: 1, pipeline_root: ["cheap"], tier_bias: "cheap" };
4213
4213
  }
4214
4214
  function getPivotCache2() {
4215
4215
  if (!globalThis.__vibeultraxPivotCache)
@@ -5378,7 +5378,8 @@ function setApiToken(newToken) {
5378
5378
  VIBEOS_API_TOKEN = normalizeDirectApiToken(newToken);
5379
5379
  VIBEOS_API_BOOTSTRAP_TOKEN = readBootstrapTokenFromDisk() || VIBEOS_API_BOOTSTRAP_TOKEN;
5380
5380
  syncApiEnabledState(process.env.VIBEOS_API_ENABLED !== "false" && (!!VIBEOS_API_TOKEN || !!VIBEOS_API_BOOTSTRAP_TOKEN));
5381
- _apiClient = null;
5381
+ _apiClientGen++;
5382
+ _apiClientHolder = { client: null, gen: _apiClientGen, tokenSnapshot: VIBEOS_API_TOKEN };
5382
5383
  _apiFallbackMode = false;
5383
5384
  _apiFallbackSince = null;
5384
5385
  persistPrimaryApiEnvState({ token: VIBEOS_API_TOKEN, disabled: false });
@@ -5396,7 +5397,8 @@ function invalidateApiToken() {
5396
5397
  VIBEOS_API_TOKEN = "";
5397
5398
  VIBEOS_API_BOOTSTRAP_TOKEN = "";
5398
5399
  syncApiEnabledState(false);
5399
- _apiClient = null;
5400
+ _apiClientGen++;
5401
+ _apiClientHolder = { client: null, gen: _apiClientGen, tokenSnapshot: "" };
5400
5402
  _apiFallbackMode = false;
5401
5403
  _apiFallbackSince = null;
5402
5404
  if (_anomalyDetector)
@@ -5422,7 +5424,8 @@ function setApiBootstrapToken(newToken) {
5422
5424
  console.error("[vibeOS] Failed to update alpha bootstrap token:", e.message);
5423
5425
  }
5424
5426
  }
5425
- var _apiClient = null;
5427
+ var _apiClientHolder = { client: null, gen: 0, tokenSnapshot: "" };
5428
+ var _apiClientGen = 0;
5426
5429
  var _apiFallbackMode = false;
5427
5430
  var _apiFallbackSince = null;
5428
5431
  var _bootstrapExchangeInFlight = null;
@@ -5499,7 +5502,8 @@ function syncApiTokenFromDisk() {
5499
5502
  VIBEOS_API_TOKEN = "";
5500
5503
  VIBEOS_API_BOOTSTRAP_TOKEN = "";
5501
5504
  syncApiEnabledState(false);
5502
- _apiClient = null;
5505
+ _apiClientGen++;
5506
+ _apiClientHolder = { client: null, gen: _apiClientGen, tokenSnapshot: "" };
5503
5507
  _apiFallbackMode = false;
5504
5508
  _apiFallbackSince = null;
5505
5509
  resetApiConnection();
@@ -5511,7 +5515,8 @@ function syncApiTokenFromDisk() {
5511
5515
  VIBEOS_API_DISABLED = false;
5512
5516
  VIBEOS_API_TOKEN = diskToken;
5513
5517
  syncApiEnabledState(process.env.VIBEOS_API_ENABLED !== "false" && (!!VIBEOS_API_TOKEN || !!VIBEOS_API_BOOTSTRAP_TOKEN));
5514
- _apiClient = null;
5518
+ _apiClientGen++;
5519
+ _apiClientHolder = { client: null, gen: _apiClientGen, tokenSnapshot: VIBEOS_API_TOKEN };
5515
5520
  _apiFallbackMode = false;
5516
5521
  _apiFallbackSince = null;
5517
5522
  markApiConnected();
@@ -5547,14 +5552,21 @@ function syncApiTokenFromDisk() {
5547
5552
  }
5548
5553
  function getApiClient2() {
5549
5554
  syncApiTokenFromDisk();
5550
- if (!_apiClient && isApiEnabled() && VIBEOS_API_TOKEN) {
5551
- _apiClient = new VibeOSApiClient({
5555
+ if (_apiClientHolder.client && _apiClientHolder.gen === _apiClientGen) {
5556
+ return _apiClientHolder.client;
5557
+ }
5558
+ if (isApiEnabled() && VIBEOS_API_TOKEN) {
5559
+ _apiClientHolder.client = new VibeOSApiClient({
5552
5560
  baseUrl: VIBEOS_API_URL,
5553
5561
  apiToken: VIBEOS_API_TOKEN,
5554
5562
  timeout: 5e3
5555
5563
  });
5564
+ _apiClientHolder.gen = _apiClientGen;
5565
+ _apiClientHolder.tokenSnapshot = VIBEOS_API_TOKEN;
5566
+ } else {
5567
+ _apiClientHolder.client = null;
5556
5568
  }
5557
- return _apiClient;
5569
+ return _apiClientHolder.client;
5558
5570
  }
5559
5571
  function isApiFallback() {
5560
5572
  return _apiFallbackMode || isApiFallbackMode() || !isApiEnabled();
@@ -5570,7 +5582,6 @@ async function remoteCall(method, args, fallbackFn) {
5570
5582
  syncApiTokenFromDisk();
5571
5583
  if (!VIBEOS_API_TOKEN && VIBEOS_API_BOOTSTRAP_TOKEN) {
5572
5584
  await ensureBootstrapExchange();
5573
- syncApiTokenFromDisk();
5574
5585
  }
5575
5586
  if (tryResetFallbackCooldown()) {
5576
5587
  if (process.env.VIBEOS_DEBUG)
@@ -9273,14 +9284,14 @@ var BRANDED_MODES = [
9273
9284
  index: 1,
9274
9285
  name: "VibeUltraX",
9275
9286
  icon: "\u{1F3C6}",
9276
- pipeline: ["local", "medium", "brain"],
9287
+ pipeline: ["cheap", "medium", "brain"],
9277
9288
  thinking: "full",
9278
9289
  tdd: "quality",
9279
9290
  enforcement: "strict",
9280
9291
  flow: "strict",
9281
9292
  qualityVsBrain: 107,
9282
9293
  costVsBrain: 58,
9283
- desc: "3-model debate: local proposes, medium reviews, brain refines."
9294
+ desc: "3-model debate: cheap proposes, medium reviews, brain refines."
9284
9295
  },
9285
9296
  {
9286
9297
  id: "vibeqmax",
@@ -12203,6 +12214,11 @@ function syncControlSettings(cv, options = {}) {
12203
12214
  writeIf("active_pipeline", JSON.stringify(modeEntry.pipeline));
12204
12215
  }
12205
12216
  }
12217
+ if (cv?.pipeline_root && Array.isArray(cv.pipeline_root)) {
12218
+ writeIf("active_pipeline", JSON.stringify(cv.pipeline_root));
12219
+ } else if (cv?.cascade_depth && cv.cascade_depth >= 3) {
12220
+ writeIf("active_pipeline", JSON.stringify(["cheap", "medium", "brain"]));
12221
+ }
12206
12222
  writeIf("enabled", true);
12207
12223
  const compatibilityMode = currentSel.onboarding_mode === "assist";
12208
12224
  const flowManuallyDisabled = currentSel.flow_enabled === false && currentSel.flow_enforce === false;
@@ -12582,8 +12598,7 @@ function orchestratorDirective(cv, sel) {
12582
12598
  const mediumModel = TRINITY_MEDIUM || "the medium model";
12583
12599
  const targetModel = tierBias === "cheap" ? cheapModel : tierBias === "medium" ? mediumModel : tierBias === "brain" ? brainModel : `${cheapModel} or ${mediumModel}`;
12584
12600
  const compatibilityMode = sel?.onboarding_mode === "assist";
12585
- const cheapSlot = TRINITY_CHEAP || "deepseek/deepseek-chat";
12586
- const mediumSlot = TRINITY_MEDIUM || "deepseek/deepseek-v4-flash";
12601
+ const cheapSlot = TRINITY_CHEAP || cheapModel;
12587
12602
  return `[AI ORCHESTRATOR AGENT] You are an AI orchestrator agent. Delegate heavy work to Task subagents (runs on ${targetModel}). Your role is to verify, fill gaps, and synthesize cleanly. ` + (compatibilityMode ? "Compatibility mode is active, so direct Write/Edit stays available until strict guardrails are enabled." : "Brain-tier focuses on orchestration \u2014 hand file writes and edits to Task subagents (cheaper, same quality). Use medium directly with `trinity medium` if the task is simple enough.") + ` [delegation guide] When a write/edit is blocked, use the \`task\` tool with: subagent_type="general" model="${cheapSlot}" prompt="write <path> with: <content>". The task subagent runs on the cheap tier and handles file operations transparently. Parallel task calls are encouraged for independent file changes. Always display the vibeOS cost footer.` + (tierBias !== "auto" ? ` [tier routing] This turn is biased toward ${tierBias} tier.` : "");
12588
12603
  }
12589
12604
  function flowTodosDirective() {
@@ -12643,6 +12658,14 @@ var onSystemTransform = async (_input, output) => {
12643
12658
  if (!loadSelection().enabled)
12644
12659
  return;
12645
12660
  try {
12661
+ const bbOnDisk = loadBlackboxState();
12662
+ if (_latestBlackboxState3 && bbOnDisk) {
12663
+ const diskHasSessions = Object.keys(bbOnDisk.sessions || {}).length > 0;
12664
+ const stateHasRegime = !!_latestBlackboxState3.sub_regime;
12665
+ if (diskHasSessions && !stateHasRegime) {
12666
+ _latestBlackboxState3 = bbOnDisk;
12667
+ }
12668
+ }
12646
12669
  const hookDirectory = String(onSystemTransform._directory || "");
12647
12670
  const userText = extractLastUserText(_input) || extractLastUserText(output);
12648
12671
  if (typeof userText === "string" && userText.trim())
@@ -12668,6 +12691,25 @@ var onSystemTransform = async (_input, output) => {
12668
12691
  if (st)
12669
12692
  _latestBlackboxState3.latest_stress_multiplier = st;
12670
12693
  _controlVector = await apiComputeControlVector(_latestBlackboxState3, void 0, optimizationMode);
12694
+ if (_controlVector) {
12695
+ const fullState = loadBlackboxState() || { sessions: {}, enabled: true };
12696
+ fullState.cv = _controlVector;
12697
+ if (_latestBlackboxState3) {
12698
+ if (_latestBlackboxState3.sub_regime)
12699
+ fullState.sub_regime = _latestBlackboxState3.sub_regime;
12700
+ if (_latestBlackboxState3.latest_stress_multiplier)
12701
+ fullState.latest_stress_multiplier = _latestBlackboxState3.latest_stress_multiplier;
12702
+ if (_latestBlackboxState3.n_interactions)
12703
+ fullState.n_interactions = _latestBlackboxState3.n_interactions;
12704
+ if (_latestBlackboxState3.resolution)
12705
+ fullState.resolution = _latestBlackboxState3.resolution;
12706
+ if (_latestBlackboxState3.momentum)
12707
+ fullState.momentum = _latestBlackboxState3.momentum;
12708
+ fullState.latest_control_vector_ts = Date.now();
12709
+ }
12710
+ fullState.sessions ??= {};
12711
+ saveBlackboxState(fullState);
12712
+ }
12671
12713
  } else if (latestUserIntent) {
12672
12714
  const st = scoreStress(latestUserIntent);
12673
12715
  _controlVector = await apiComputeControlVector({
@@ -15269,19 +15311,27 @@ ${argsJson}
15269
15311
  }
15270
15312
  }
15271
15313
  const activePipeline = loadSelection().active_pipeline;
15272
- if (activePipeline && Array.isArray(activePipeline) && activePipeline.length > 1 && TRINITY_CHEAP && TRINITY_MEDIUM) {
15314
+ if (!apiRoute?.target && activePipeline && Array.isArray(activePipeline) && activePipeline.length > 1 && TRINITY_CHEAP && TRINITY_MEDIUM) {
15273
15315
  try {
15274
15316
  const cheapCost = 1e-3;
15275
15317
  const mediumCost = 5e-3;
15276
15318
  const brainCost = 0.02;
15277
15319
  const cascadeResult = cascadeDecide(_prompt, cheapCost, mediumCost, brainCost, 0.85);
15278
- const tierMap = { cheap: TRINITY_CHEAP, medium: TRINITY_MEDIUM, brain: TRINITY_BRAIN || TRINITY_MEDIUM, local: TRINITY_CHEAP };
15320
+ const tierMap = { cheap: TRINITY_CHEAP, medium: TRINITY_MEDIUM, brain: TRINITY_BRAIN };
15279
15321
  const pipelineModels = activePipeline.map((t2) => tierMap[t2] || TRINITY_CHEAP);
15280
15322
  if (cascadeResult.escalate && pipelineModels.length > 1) {
15281
- const escalated = pipelineModels[1];
15282
- if (escalated && escalated !== currentModel && (!_target || escalated !== _target)) {
15283
- _target = escalated;
15284
- console.error(`[vibeOS] \u{1F500} Cascade escalate: ${cascadeResult.reason} \u2192 ${escalated}`);
15323
+ if (pipelineModels.length > 2 && cascadeResult.confidence >= 0.8) {
15324
+ const escalated = pipelineModels[2];
15325
+ if (escalated && escalated !== currentModel && (!_target || escalated !== _target)) {
15326
+ _target = escalated;
15327
+ console.error(`[vibeOS] \u{1F500} Cascade depth-3 escalate: ${cascadeResult.reason} \u2192 ${escalated}`);
15328
+ }
15329
+ } else {
15330
+ const escalated = pipelineModels[1];
15331
+ if (escalated && escalated !== currentModel && (!_target || escalated !== _target)) {
15332
+ _target = escalated;
15333
+ console.error(`[vibeOS] \u{1F500} Cascade escalate: ${cascadeResult.reason} \u2192 ${escalated}`);
15334
+ }
15285
15335
  }
15286
15336
  } else if (cascadeResult.useCheap && !_target) {
15287
15337
  _target = pipelineModels[0];
@@ -15309,8 +15359,8 @@ ${argsJson}
15309
15359
  _setModel(inArgs);
15310
15360
  try {
15311
15361
  const selNow = loadSelection();
15312
- const desiredSlot = _target === TRINITY_CHEAP ? "cheap" : _target === TRINITY_MEDIUM ? "medium" : null;
15313
- if (selNow.delegation_enforce && currentTier === "high" && desiredSlot && selNow.active_slot !== desiredSlot) {
15362
+ const desiredSlot = _target === TRINITY_CHEAP ? "cheap" : _target === TRINITY_MEDIUM ? "medium" : _target === TRINITY_BRAIN ? "brain" : null;
15363
+ if (desiredSlot && selNow.active_slot !== desiredSlot) {
15314
15364
  taskSlotRestore = selNow.active_slot || "brain";
15315
15365
  const switched = applySlot(desiredSlot);
15316
15366
  if (switched?.ok) {
@@ -15405,8 +15455,8 @@ ${argsJson}
15405
15455
  const originalPath = argSources.flatMap((src) => [src?.filePath, src?.file_path, src?.path]).find((v) => typeof v === "string" && v.trim()) || "";
15406
15456
  const basename6 = originalPath.split("/").pop() || "blocked";
15407
15457
  const apiResult = await remoteCall("delegateCheck", [tLower, currentTier, currentModel, _prompt], () => ({
15408
- blocked: true,
15409
- savings: _estEdit,
15458
+ blocked: false,
15459
+ savings: 0,
15410
15460
  _fallback: true
15411
15461
  }));
15412
15462
  const remoteSavings = Number(apiResult?.savings);
@@ -15421,7 +15471,7 @@ ${argsJson}
15421
15471
  projectName: currentProjectName || "",
15422
15472
  sessionId: getCurrentSessionId()
15423
15473
  });
15424
- const taskModel = TRINITY_CHEAP || "deepseek/deepseek-chat";
15474
+ const taskModel = TRINITY_CHEAP || TRINITY_MEDIUM || currentModel || TRINITY_BRAIN || "";
15425
15475
  pendingUiNote = `[delegation] ${t} blocked on brain tier. Use a task subagent instead: \`task subagent_type="general" model="${taskModel}" prompt="${t} <file> with the intended content"\`. Keeps brain focused on orchestration.`;
15426
15476
  enforcementBlocked = true;
15427
15477
  _mutateBlockedToolArgs(t, argSources, originalPath, output);
@@ -16161,10 +16211,10 @@ async function _seedOrRepairModelTiers(directory3) {
16161
16211
  let medium = trinity?.medium || brain;
16162
16212
  let cheap = trinity?.cheap || medium || brain;
16163
16213
  if (!brain) {
16164
- brain = "deepseek/deepseek-v4-pro";
16165
- medium = "deepseek/deepseek-v4-flash";
16166
- cheap = "deepseek/deepseek-chat";
16167
- console.error("[vibeOS] no providers detected \u2014 using default model tiers (brain=v4-pro, medium=v4-flash, cheap=v4-chat)");
16214
+ brain = "generic/brain";
16215
+ medium = "generic/medium";
16216
+ cheap = "generic/cheap";
16217
+ console.error('[vibeOS] no providers or trinity config found \u2014 run "vibe rebuild" to set model tiers');
16168
16218
  }
16169
16219
  const existingSelection = existing?.selection && typeof existing.selection === "object" ? existing.selection : {};
16170
16220
  const existingTrinity = existing?.trinity && typeof existing.trinity === "object" ? existing.trinity : {};
package/package.json CHANGED
@@ -1,22 +1,22 @@
1
1
  {
2
2
  "name": "vibeostheog",
3
- "version": "0.25.32",
3
+ "version": "0.25.34",
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",
7
7
  "release:patch": "node scripts/release.mjs patch --yes",
8
8
  "release:minor": "node scripts/release.mjs minor --yes",
9
9
  "release:major": "node scripts/release.mjs major --yes",
10
- "build": "npm run build:bundle && node scripts/deploy.mjs",
11
- "build:bundle": "tsc -p tsconfig.json && node scripts/sync-ts-build.mjs && node scripts/build-bundle.mjs",
10
+ "build": "npm run typecheck && npm run build:bundle && node scripts/deploy.mjs",
11
+ "build:bundle": "node scripts/build-bundle.mjs",
12
12
  "build:single": "node scripts/build-bundle.mjs",
13
13
  "deploy": "node scripts/deploy.mjs",
14
14
  "typecheck": "tsc -p tsconfig.json --noEmit",
15
15
  "checkpoint:validate": "node scripts/checkpoint-validate.mjs",
16
16
  "test:scripts": "node scripts/run-test-suite.mjs scripts",
17
17
  "ts:audit": "node scripts/ts-audit.mjs",
18
- "test": "npm run build:bundle && node scripts/run-test-suite.mjs full",
19
- "test:ci": "npm run build:bundle && node scripts/run-test-suite.mjs ci",
18
+ "test": "tsc -p tsconfig.json && node scripts/build-bundle.mjs && node scripts/run-test-suite.mjs full",
19
+ "test:ci": "tsc -p tsconfig.json && node scripts/build-bundle.mjs && node scripts/run-test-suite.mjs ci",
20
20
  "guard": "bash plugins/vibetheog-guard/scripts/run-guard.sh",
21
21
  "guard:full": "VIBETHEOG_GUARD_FULL=1 bash plugins/vibetheog-guard/scripts/run-guard.sh",
22
22
  "hook:precommit": "bash plugins/vibetheog-guard/hooks/pre-commit.sh",