mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-10-08 16:39:42 +02:00
chore: bump version to 0.1536
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -35,7 +35,7 @@ When user says "COM":
|
|||||||
1. Increment version in BOTH `package.json` AND `CLAUDE.md` (verify they match with `grep version package.json && grep Version CLAUDE.md`)
|
1. Increment version in BOTH `package.json` AND `CLAUDE.md` (verify they match with `grep version package.json && grep Version CLAUDE.md`)
|
||||||
2. Run: `git add -A && git commit -m "chore: bump version to X.XXXX" && git push && npm run build && systemctl --user restart claudeman-web`
|
2. Run: `git add -A && git commit -m "chore: bump version to X.XXXX" && git push && npm run build && systemctl --user restart claudeman-web`
|
||||||
|
|
||||||
**Version**: 0.1535 (must match `package.json` for npm publish)
|
**Version**: 0.1536 (must match `package.json` for npm publish)
|
||||||
|
|
||||||
## Project Overview
|
## Project Overview
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "claudeman",
|
"name": "claudeman",
|
||||||
"version": "0.1535",
|
"version": "0.1536",
|
||||||
"description": "The missing control plane for Claude Code - run 20 autonomous agents with real-time monitoring and session persistence",
|
"description": "The missing control plane for Claude Code - run 20 autonomous agents with real-time monitoring and session persistence",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
|
|||||||
+34
-16
@@ -1340,6 +1340,7 @@ class ClaudemanApp {
|
|||||||
this.fitAddon = null;
|
this.fitAddon = null;
|
||||||
this.activeSessionId = null;
|
this.activeSessionId = null;
|
||||||
this._initGeneration = 0; // dedup concurrent handleInit calls
|
this._initGeneration = 0; // dedup concurrent handleInit calls
|
||||||
|
this._initFallbackTimer = null; // fallback timer if SSE init doesn't arrive
|
||||||
this._selectGeneration = 0; // cancel stale selectSession loads
|
this._selectGeneration = 0; // cancel stale selectSession loads
|
||||||
this.respawnStatus = {};
|
this.respawnStatus = {};
|
||||||
this.respawnTimers = {}; // Track timed respawn timers
|
this.respawnTimers = {}; // Track timed respawn timers
|
||||||
@@ -1551,8 +1552,13 @@ class ClaudemanApp {
|
|||||||
// The inline <script> in <head> added this to prevent flash-of-content on mobile.
|
// The inline <script> in <head> added this to prevent flash-of-content on mobile.
|
||||||
document.documentElement.classList.remove('mobile-init');
|
document.documentElement.classList.remove('mobile-init');
|
||||||
this.connectSSE();
|
this.connectSSE();
|
||||||
this.loadState();
|
// Only fetch state if SSE init event hasn't arrived within 3s (avoids duplicate handleInit)
|
||||||
this.loadQuickStartCases();
|
this._initFallbackTimer = setTimeout(() => {
|
||||||
|
if (this._initGeneration === 0) this.loadState();
|
||||||
|
}, 3000);
|
||||||
|
// Share a single settings fetch between both consumers
|
||||||
|
const settingsPromise = fetch('/api/settings').then(r => r.ok ? r.json() : null).catch(() => null);
|
||||||
|
this.loadQuickStartCases(null, settingsPromise);
|
||||||
this.setupEventListeners();
|
this.setupEventListeners();
|
||||||
// Mobile settings gear: non-passive touchstart to prevent keyboard dismiss
|
// Mobile settings gear: non-passive touchstart to prevent keyboard dismiss
|
||||||
const settingsBtn = document.querySelector('.btn-settings-mobile');
|
const settingsBtn = document.querySelector('.btn-settings-mobile');
|
||||||
@@ -1563,12 +1569,11 @@ class ClaudemanApp {
|
|||||||
app.openAppSettings();
|
app.openAppSettings();
|
||||||
}, { passive: false });
|
}, { passive: false });
|
||||||
}
|
}
|
||||||
// Start system stats polling
|
// System stats polling deferred until sessions exist (started in handleInit/session:created)
|
||||||
this.startSystemStatsPolling();
|
|
||||||
// Setup online/offline detection
|
// Setup online/offline detection
|
||||||
this.setupOnlineDetection();
|
this.setupOnlineDetection();
|
||||||
// Load server-stored settings (async, re-applies visibility after load)
|
// Load server-stored settings (async, re-applies visibility after load)
|
||||||
this.loadAppSettingsFromServer().then(() => {
|
this.loadAppSettingsFromServer(settingsPromise).then(() => {
|
||||||
this.applyHeaderVisibilitySettings();
|
this.applyHeaderVisibilitySettings();
|
||||||
this.applyTabWrapSettings();
|
this.applyTabWrapSettings();
|
||||||
this.applyMonitorVisibility();
|
this.applyMonitorVisibility();
|
||||||
@@ -2308,6 +2313,8 @@ class ClaudemanApp {
|
|||||||
}
|
}
|
||||||
this.renderSessionTabs();
|
this.renderSessionTabs();
|
||||||
this.updateCost();
|
this.updateCost();
|
||||||
|
// Start stats polling when first session appears
|
||||||
|
if (this.sessions.size === 1) this.startSystemStatsPolling();
|
||||||
});
|
});
|
||||||
|
|
||||||
addListener('session:updated', (e) => {
|
addListener('session:updated', (e) => {
|
||||||
@@ -2348,6 +2355,8 @@ class ClaudemanApp {
|
|||||||
this.renderSessionTabs();
|
this.renderSessionTabs();
|
||||||
this.renderRalphStatePanel(); // Update ralph panel after session deleted
|
this.renderRalphStatePanel(); // Update ralph panel after session deleted
|
||||||
this.renderProjectInsightsPanel(); // Update project insights panel after session deleted
|
this.renderProjectInsightsPanel(); // Update project insights panel after session deleted
|
||||||
|
// Stop stats polling when no sessions remain
|
||||||
|
if (this.sessions.size === 0) this.stopSystemStatsPolling();
|
||||||
});
|
});
|
||||||
|
|
||||||
addListener('session:terminal', (e) => {
|
addListener('session:terminal', (e) => {
|
||||||
@@ -3370,6 +3379,11 @@ class ClaudemanApp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleInit(data) {
|
handleInit(data) {
|
||||||
|
// Clear the init fallback timer since we got data
|
||||||
|
if (this._initFallbackTimer) {
|
||||||
|
clearTimeout(this._initFallbackTimer);
|
||||||
|
this._initFallbackTimer = null;
|
||||||
|
}
|
||||||
const gen = ++this._initGeneration;
|
const gen = ++this._initGeneration;
|
||||||
|
|
||||||
// Update version displays (header and toolbar)
|
// Update version displays (header and toolbar)
|
||||||
@@ -3498,6 +3512,13 @@ class ClaudemanApp {
|
|||||||
this.updateCost();
|
this.updateCost();
|
||||||
this.renderSessionTabs();
|
this.renderSessionTabs();
|
||||||
|
|
||||||
|
// Start/stop system stats polling based on session count
|
||||||
|
if (this.sessions.size > 0) {
|
||||||
|
this.startSystemStatsPolling();
|
||||||
|
} else {
|
||||||
|
this.stopSystemStatsPolling();
|
||||||
|
}
|
||||||
|
|
||||||
// CRITICAL: Clean up all floating windows before loading new subagents
|
// CRITICAL: Clean up all floating windows before loading new subagents
|
||||||
// This prevents memory leaks from ResizeObservers, EventSources, and DOM elements
|
// This prevents memory leaks from ResizeObservers, EventSources, and DOM elements
|
||||||
this.cleanupAllFloatingWindows();
|
this.cleanupAllFloatingWindows();
|
||||||
@@ -7334,22 +7355,20 @@ class ClaudemanApp {
|
|||||||
|
|
||||||
// ========== Quick Start ==========
|
// ========== Quick Start ==========
|
||||||
|
|
||||||
async loadQuickStartCases(selectCaseName = null) {
|
async loadQuickStartCases(selectCaseName = null, settingsPromise = null) {
|
||||||
try {
|
try {
|
||||||
// Load settings to get lastUsedCase
|
// Load settings to get lastUsedCase (reuse shared promise if provided)
|
||||||
let lastUsedCase = null;
|
let lastUsedCase = null;
|
||||||
try {
|
try {
|
||||||
const settingsRes = await fetch('/api/settings');
|
const settings = settingsPromise ? await settingsPromise : await fetch('/api/settings').then(r => r.ok ? r.json() : null);
|
||||||
if (settingsRes.ok) {
|
if (settings) {
|
||||||
const settings = await settingsRes.json();
|
|
||||||
lastUsedCase = settings.lastUsedCase || null;
|
lastUsedCase = settings.lastUsedCase || null;
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
// Ignore settings load errors
|
// Ignore settings load errors
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add cache-busting to ensure fresh data
|
const res = await fetch('/api/cases');
|
||||||
const res = await fetch('/api/cases?_t=' + Date.now());
|
|
||||||
const cases = await res.json();
|
const cases = await res.json();
|
||||||
this.cases = cases;
|
this.cases = cases;
|
||||||
console.log('[loadQuickStartCases] Loaded cases:', cases.map(c => c.name), 'lastUsedCase:', lastUsedCase);
|
console.log('[loadQuickStartCases] Loaded cases:', cases.map(c => c.name), 'lastUsedCase:', lastUsedCase);
|
||||||
@@ -9967,11 +9986,10 @@ class ClaudemanApp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async loadAppSettingsFromServer() {
|
async loadAppSettingsFromServer(settingsPromise = null) {
|
||||||
try {
|
try {
|
||||||
const res = await fetch('/api/settings');
|
const settings = settingsPromise ? await settingsPromise : await fetch('/api/settings').then(r => r.ok ? r.json() : null);
|
||||||
if (res.ok) {
|
if (settings) {
|
||||||
const settings = await res.json();
|
|
||||||
// Extract notification prefs before merging app settings
|
// Extract notification prefs before merging app settings
|
||||||
const { notificationPreferences, ...appSettings } = settings;
|
const { notificationPreferences, ...appSettings } = settings;
|
||||||
// Filter out display settings — these are device-specific (mobile vs desktop)
|
// Filter out display settings — these are device-specific (mobile vs desktop)
|
||||||
|
|||||||
@@ -10,9 +10,10 @@
|
|||||||
<!-- DNS preconnect for CDN — saves ~100ms on first load -->
|
<!-- DNS preconnect for CDN — saves ~100ms on first load -->
|
||||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin>
|
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin>
|
||||||
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net">
|
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net">
|
||||||
<link rel="stylesheet" href="styles.css?v=0.1534">
|
<link rel="stylesheet" href="styles.css?v=0.1536">
|
||||||
<link rel="stylesheet" href="mobile.css?v=0.1534">
|
<link rel="stylesheet" href="mobile.css?v=0.1536" media="(max-width: 1023px)">
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/xterm@5.3.0/css/xterm.css">
|
<link rel="preload" href="https://cdn.jsdelivr.net/npm/xterm@5.3.0/css/xterm.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
|
||||||
|
<noscript><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/xterm@5.3.0/css/xterm.css"></noscript>
|
||||||
<!-- Defer CDN scripts — they no longer block initial HTML parsing/paint.
|
<!-- Defer CDN scripts — they no longer block initial HTML parsing/paint.
|
||||||
'defer' preserves execution order (xterm loads before fit addon). -->
|
'defer' preserves execution order (xterm loads before fit addon). -->
|
||||||
<script defer src="https://cdn.jsdelivr.net/npm/xterm@5.3.0/lib/xterm.min.js"></script>
|
<script defer src="https://cdn.jsdelivr.net/npm/xterm@5.3.0/lib/xterm.min.js"></script>
|
||||||
@@ -1474,6 +1475,6 @@
|
|||||||
<!-- Lines drawn dynamically -->
|
<!-- Lines drawn dynamically -->
|
||||||
</svg>
|
</svg>
|
||||||
|
|
||||||
<script defer src="app.js?v=0.1534"></script>
|
<script defer src="app.js?v=0.1536"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Reference in New Issue
Block a user