chore: bump version to 0.1594

This commit is contained in:
arkon
2026-02-22 05:45:04 +01:00
parent 67b5c71019
commit 3a5ab330b7
4 changed files with 63 additions and 12 deletions
+1 -1
View File
@@ -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`)
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.1593 (must match `package.json` for npm publish)
**Version**: 0.1594 (must match `package.json` for npm publish)
## Project Overview
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "claudeman",
"version": "0.1593",
"version": "0.1594",
"description": "The missing control plane for Claude Code - run 20 autonomous agents with real-time monitoring and session persistence",
"type": "module",
"main": "dist/index.js",
+58 -7
View File
@@ -955,7 +955,33 @@ class LocalEchoOverlay {
return null;
}
// Auto-detect text already on the prompt line in the terminal buffer.
// Called on first keystroke when overlay is empty (pendingText='' and
// flushedOffset=0). Handles Tab completion, arrow-key edits, and any
// other case where the PTY has prompt text the overlay doesn't know about.
// Without this, the overlay's opaque background covers the canvas text.
_detectBufferText() {
try {
const prompt = this._findPrompt();
if (!prompt) return;
const buf = this.terminal.buffer.active;
const absRow = buf.viewportY + prompt.row;
const line = buf.getLine(absRow);
if (!line) return;
const lineText = line.translateToString(true);
const textStart = prompt.col + 2; // after "❯ "
const afterPrompt = lineText.slice(textStart).trimEnd();
if (afterPrompt.length > 0) {
this._flushedOffset = afterPrompt.length;
this._flushedText = afterPrompt;
this._lastPromptPos = prompt;
}
} catch {}
}
addChar(char) {
// On first keystroke after overlay was empty, detect existing buffer text
if (!this.pendingText && !this._flushedOffset) this._detectBufferText();
this.pendingText += char;
this._persist();
this._render();
@@ -981,6 +1007,7 @@ class LocalEchoOverlay {
appendText(text) {
if (!text) return;
if (!this.pendingText && !this._flushedOffset) this._detectBufferText();
this.pendingText += text;
this._persist();
this._render();
@@ -2227,8 +2254,29 @@ class ClaudemanApp {
}
this._pendingInput += data;
flushInput();
} else if (this._localEchoOverlay) {
// No pending or flushed text — try detecting buffer text first
// (handles Tab completion, arrow edits, etc.)
this._localEchoOverlay._detectBufferText();
if (this._localEchoOverlay._flushedOffset > 0) {
// Found buffer text — delete last char
this._localEchoOverlay._flushedOffset--;
if (this._localEchoOverlay._flushedText) {
this._localEchoOverlay._flushedText = this._localEchoOverlay._flushedText.slice(0, -1);
}
this._localEchoOverlay._lastRenderKey = '';
if (this._localEchoOverlay._flushedOffset > 0) {
this._localEchoOverlay._render();
} else {
this._localEchoOverlay._lastPromptPos = null;
this._localEchoOverlay.overlay.innerHTML = '';
this._localEchoOverlay.overlay.style.display = 'none';
}
this._pendingInput += data;
flushInput();
}
// else: truly nothing to delete — swallow the backspace
}
// else: nothing to delete — swallow the backspace
return;
}
if (/^[\r\n]+$/.test(data)) {
@@ -4789,16 +4837,19 @@ class ClaudemanApp {
// the PTY echo arrives in the terminal buffer.
if (this.activeSessionId) {
const echoText = this._localEchoOverlay?.pendingText || '';
// Include buffer-detected flushed text (from Tab completion, etc.)
// so it's preserved across tab switches.
const existingFlushed = this._localEchoOverlay?._flushedOffset || 0;
const existingFlushedText = this._localEchoOverlay?._flushedText || '';
if (echoText) {
this._sendInputAsync(this.activeSessionId, echoText);
// Store flushed length AND text PER SESSION so it's available when switching back.
// The text is needed because the terminal buffer may be stale after async reload.
}
const totalOffset = existingFlushed + echoText.length;
if (totalOffset > 0) {
if (!this._flushedOffsets) this._flushedOffsets = new Map();
if (!this._flushedTexts) this._flushedTexts = new Map();
const prev = this._flushedOffsets.get(this.activeSessionId) || 0;
const prevText = this._flushedTexts.get(this.activeSessionId) || '';
this._flushedOffsets.set(this.activeSessionId, prev + echoText.length);
this._flushedTexts.set(this.activeSessionId, prevText + echoText);
this._flushedOffsets.set(this.activeSessionId, totalOffset);
this._flushedTexts.set(this.activeSessionId, existingFlushedText + echoText);
}
}
this._localEchoOverlay?.clear();
+3 -3
View File
@@ -8,8 +8,8 @@
<meta name="google" content="notranslate">
<title>Claudeman</title>
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Cdefs%3E%3ClinearGradient id='g' x1='0%25' y1='0%25' x2='100%25' y2='100%25'%3E%3Cstop offset='0%25' stop-color='%2360a5fa'/%3E%3Cstop offset='100%25' stop-color='%233b82f6'/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect width='32' height='32' rx='6' fill='%230a0a0a'/%3E%3Cpath d='M18 4L8 18h6l-2 10 10-14h-6z' fill='url(%23g)'/%3E%3C/svg%3E">
<link rel="stylesheet" href="styles.css?v=0.1593">
<link rel="stylesheet" href="mobile.css?v=0.1593" media="(max-width: 1023px)">
<link rel="stylesheet" href="styles.css?v=0.1594">
<link rel="stylesheet" href="mobile.css?v=0.1594" media="(max-width: 1023px)">
<!-- xterm.css loaded async — terminal won't display until xterm.js runs anyway -->
<link rel="preload" href="vendor/xterm.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="vendor/xterm.css"></noscript>
@@ -1559,6 +1559,6 @@
<!-- Lines drawn dynamically -->
</svg>
<script defer src="app.js?v=0.1593"></script>
<script defer src="app.js?v=0.1594"></script>
</body>
</html>