claude-code-session-manager 0.35.11 → 0.35.13

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/dist/index.html CHANGED
@@ -7,7 +7,7 @@
7
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
9
  <link href="https://fonts.googleapis.com/css2?family=Newsreader:ital,opsz,wght@0,6..72,400;0,6..72,500;0,6..72,600;0,6..72,700;1,6..72,400&family=Geist:wght@300;400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap" rel="stylesheet">
10
- <script type="module" crossorigin src="./assets/index-CEht6zJc.js"></script>
10
+ <script type="module" crossorigin src="./assets/index-LqC9hNy3.js"></script>
11
11
  <link rel="modulepreload" crossorigin href="./assets/monaco-editor-BW5C4Iv1.js">
12
12
  <link rel="stylesheet" crossorigin href="./assets/monaco-editor-BTnBOi8r.css">
13
13
  <link rel="stylesheet" crossorigin href="./assets/index-C7NyYuXu.css">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-session-manager",
3
- "version": "0.35.11",
3
+ "version": "0.35.13",
4
4
  "description": "Local cockpit for the Claude Code CLI — multi-tab terminal, full config surface, scheduler, voice dictation, and live observability.",
5
5
  "type": "module",
6
6
  "main": "src/main/index.cjs",
@@ -2098,7 +2098,6 @@ async function reverifyNeedsReview() {
2098
2098
  }
2099
2099
  if (healed.length) {
2100
2100
  const healSet = new Set(healed);
2101
- const promoted = [];
2102
2101
  await mutate((s) => {
2103
2102
  for (const j of s.jobs) {
2104
2103
  if (j.status === 'needs_review' && healSet.has(j.slug)) {
@@ -2107,32 +2106,8 @@ async function reverifyNeedsReview() {
2107
2106
  delete j.verifierVerdict;
2108
2107
  }
2109
2108
  }
2110
- // Mirror the live-completion auto-promote (spawnJob, ~line 1583): a
2111
- // healed fix-plan job means its original's work is logically done too.
2112
- // Without this, a job healed here (boot/periodic reverify) never
2113
- // releases its original from needs_review — only a fix-plan job that
2114
- // completes during a live run gets promoted, leaving the boot-heal
2115
- // path unable to fully resolve the fix-plan lineages it just healed
2116
- // (2026-07-12: 521-fix-*/523-fix-* healed but their originals stayed
2117
- // stuck needs_review).
2118
- for (const slug of healed) {
2119
- if (!isFixPlanSlug(slug)) continue;
2120
- const orig = healTargetForFix(slug, s.jobs);
2121
- if (orig) {
2122
- const priorStatus = orig.status;
2123
- orig.status = 'completed';
2124
- orig.exitCode = 0;
2125
- orig.error = null;
2126
- orig.completedBy = slug;
2127
- if (priorStatus === 'needs_review') delete orig.verifierVerdict;
2128
- promoted.push(`${orig.slug} (was ${priorStatus})`);
2129
- }
2130
- }
2131
2109
  });
2132
2110
  console.log(`[scheduler] boot reverify: healed ${healed.length} stale needs_review → completed (${healed.join(', ')})`);
2133
- if (promoted.length) {
2134
- console.log(`[scheduler] boot reverify: auto-promoted ${promoted.length} original(s) via healed fix-plan job(s): ${promoted.join(', ')}`);
2135
- }
2136
2111
  await broadcast();
2137
2112
  }
2138
2113
  if (leftForReview.length) {
@@ -2140,6 +2115,38 @@ async function reverifyNeedsReview() {
2140
2115
  console.log(`[scheduler] boot reverify: left for review: ${detail}`);
2141
2116
  }
2142
2117
 
2118
+ // Mirror the live-completion auto-promote (spawnJob, ~line 1583): ANY
2119
+ // completed fix-plan job whose original is still needs_review/failed means
2120
+ // the original's work is logically done. Runs every pass (not just against
2121
+ // jobs healed THIS pass) and over ALL completed fix-plan jobs, not just
2122
+ // ones just-healed above — a fix-plan job healed by a PRIOR boot/periodic
2123
+ // pass, or completed via a live run, is just as valid a promotion source.
2124
+ // Idempotent: an already-promoted original has status !== 'needs_review'/
2125
+ // 'failed', so isPromotableOriginal excludes it on repeat passes — safe to
2126
+ // re-run unconditionally. (2026-07-12: 521-fix-*/523-fix-* healed on one
2127
+ // boot but their originals stayed stuck needs_review on every subsequent
2128
+ // boot/tick, because the promotion only ran inside `if (healed.length)`
2129
+ // scoped to that single pass's fresh heals.)
2130
+ const promoted = [];
2131
+ await mutate((s) => {
2132
+ for (const job of s.jobs) {
2133
+ if (job.status !== 'completed' || !isFixPlanSlug(job.slug)) continue;
2134
+ const orig = healTargetForFix(job.slug, s.jobs);
2135
+ if (!orig) continue;
2136
+ const priorStatus = orig.status;
2137
+ orig.status = 'completed';
2138
+ orig.exitCode = 0;
2139
+ orig.error = null;
2140
+ orig.completedBy = job.slug;
2141
+ if (priorStatus === 'needs_review') delete orig.verifierVerdict;
2142
+ promoted.push(`${orig.slug} (was ${priorStatus}, via ${job.slug})`);
2143
+ }
2144
+ });
2145
+ if (promoted.length) {
2146
+ console.log(`[scheduler] boot reverify: auto-promoted ${promoted.length} original(s): ${promoted.join(', ')}`);
2147
+ await broadcast();
2148
+ }
2149
+
2143
2150
  // Surface needs_review jobs that can never self-heal or get an auto-fix
2144
2151
  // investigation (no runId, no backfillable run dir) instead of leaving
2145
2152
  // them silently stranded. Also surface no-plan auto-fix jobs whose one