mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-10-10 09:19:42 +02:00
chore: bump version to 0.1582
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.1581 (must match `package.json` for npm publish)
|
**Version**: 0.1582 (must match `package.json` for npm publish)
|
||||||
|
|
||||||
## Project Overview
|
## Project Overview
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "claudeman",
|
"name": "claudeman",
|
||||||
"version": "0.1581",
|
"version": "0.1582",
|
||||||
"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",
|
||||||
|
|||||||
+19
-10
@@ -967,22 +967,31 @@ class LocalEchoOverlay {
|
|||||||
this.overlay.style.display = 'none';
|
this.overlay.style.display = 'none';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a styled line div with opaque background
|
// Create a styled line div with per-character grid positioning.
|
||||||
_makeLine(text, leftPx, topPx, widthPx, cellH) {
|
// Each char is placed at exact col*cellW to match xterm's canvas renderer
|
||||||
|
// (DOM text flow drifts vs canvas due to sub-pixel glyph width differences).
|
||||||
|
_makeLine(text, leftPx, topPx, widthPx, cellH, cellW) {
|
||||||
const el = document.createElement('div');
|
const el = document.createElement('div');
|
||||||
el.style.cssText = `position:absolute;white-space:pre;font-kerning:none;pointer-events:none`;
|
el.style.cssText = `position:absolute;pointer-events:none`;
|
||||||
el.style.fontFamily = this._fontFamily;
|
|
||||||
el.style.fontSize = this._fontSize;
|
|
||||||
el.style.fontWeight = this._fontWeight;
|
|
||||||
el.style.letterSpacing = this._letterSpacing;
|
|
||||||
el.style.color = this._color;
|
|
||||||
el.style.backgroundColor = this._bg;
|
el.style.backgroundColor = this._bg;
|
||||||
el.style.left = leftPx + 'px';
|
el.style.left = leftPx + 'px';
|
||||||
el.style.top = topPx + 'px';
|
el.style.top = topPx + 'px';
|
||||||
el.style.width = widthPx + 'px';
|
el.style.width = widthPx + 'px';
|
||||||
el.style.height = (cellH + 1) + 'px';
|
el.style.height = (cellH + 1) + 'px';
|
||||||
el.style.lineHeight = cellH + 'px';
|
el.style.lineHeight = cellH + 'px';
|
||||||
el.textContent = text;
|
// Place each character at its exact grid position
|
||||||
|
for (let i = 0; i < text.length; i++) {
|
||||||
|
const span = document.createElement('span');
|
||||||
|
span.style.cssText = `position:absolute;display:inline-block;text-align:center;pointer-events:none`;
|
||||||
|
span.style.left = (i * cellW) + 'px';
|
||||||
|
span.style.width = cellW + 'px';
|
||||||
|
span.style.fontFamily = this._fontFamily;
|
||||||
|
span.style.fontSize = this._fontSize;
|
||||||
|
span.style.fontWeight = this._fontWeight;
|
||||||
|
span.style.color = this._color;
|
||||||
|
span.textContent = text[i];
|
||||||
|
el.appendChild(span);
|
||||||
|
}
|
||||||
return el;
|
return el;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1038,7 +1047,7 @@ class LocalEchoOverlay {
|
|||||||
const leftPx = i === 0 ? startCol * cellW : 0;
|
const leftPx = i === 0 ? startCol * cellW : 0;
|
||||||
const widthPx = i === 0 ? (fullWidthPx - leftPx) : fullWidthPx;
|
const widthPx = i === 0 ? (fullWidthPx - leftPx) : fullWidthPx;
|
||||||
const topPx = i * cellH;
|
const topPx = i * cellH;
|
||||||
const lineEl = this._makeLine(lines[i], leftPx, topPx, widthPx, cellH);
|
const lineEl = this._makeLine(lines[i], leftPx, topPx, widthPx, cellH, cellW);
|
||||||
this.overlay.appendChild(lineEl);
|
this.overlay.appendChild(lineEl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+12
-35
@@ -662,51 +662,28 @@ describe('Subagent window simulation', () => {
|
|||||||
expect(timing).toBeLessThan(THRESHOLDS.SUBAGENT_WINDOW_OPEN);
|
expect(timing).toBeLessThan(THRESHOLDS.SUBAGENT_WINDOW_OPEN);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('closes subagent window within threshold', async () => {
|
it('closes (minimizes) subagent window within threshold', async () => {
|
||||||
// Ensure a window is open
|
// perf-agent-1 should still be open from the previous test
|
||||||
const hasWindow = await page.locator('.subagent-window').count().then(c => c > 0);
|
// Note: closeSubagentWindow minimizes to tab (display:none), doesn't remove from DOM
|
||||||
if (!hasWindow) {
|
const isVisible = await page.locator('#subagent-window-perf-agent-1').isVisible();
|
||||||
const claudeSessionId = await page.evaluate((sid: string) => {
|
expect(isVisible).toBe(true);
|
||||||
const app = (window as unknown as { app: { sessions: Map<string, { claudeSessionId?: string }> } }).app;
|
|
||||||
return app.sessions.get(sid)?.claudeSessionId || 'fake-claude-session';
|
|
||||||
}, sessionId);
|
|
||||||
await page.evaluate(({ cSessionId }: { cSessionId: string }) => {
|
|
||||||
const app = (window as unknown as {
|
|
||||||
app: {
|
|
||||||
subagents: Map<string, Record<string, unknown>>;
|
|
||||||
openSubagentWindow: (id: string) => void;
|
|
||||||
}
|
|
||||||
}).app;
|
|
||||||
app.subagents.set('perf-agent-close', {
|
|
||||||
agentId: 'perf-agent-close',
|
|
||||||
sessionId: cSessionId,
|
|
||||||
status: 'active',
|
|
||||||
description: 'Close test agent',
|
|
||||||
startedAt: Date.now(),
|
|
||||||
lastActivityAt: Date.now(),
|
|
||||||
toolCallCount: 0,
|
|
||||||
entryCount: 0,
|
|
||||||
fileSize: 0,
|
|
||||||
});
|
|
||||||
app.openSubagentWindow('perf-agent-close');
|
|
||||||
}, { cSessionId: claudeSessionId });
|
|
||||||
await page.waitForSelector('.subagent-window', { timeout: 3000 });
|
|
||||||
}
|
|
||||||
|
|
||||||
const timing = await measure(async () => {
|
const timing = await measure(async () => {
|
||||||
await page.evaluate(() => {
|
await page.evaluate(() => {
|
||||||
const app = (window as unknown as { app: { closeSubagentWindow: (id: string) => void } }).app;
|
const app = (window as unknown as { app: { closeSubagentWindow: (id: string) => void } }).app;
|
||||||
const win = document.querySelector('.subagent-window');
|
app.closeSubagentWindow('perf-agent-1');
|
||||||
const id = win?.id?.replace('subagent-window-', '') || 'perf-agent-close';
|
|
||||||
app.closeSubagentWindow(id);
|
|
||||||
});
|
});
|
||||||
|
// Wait for element to become hidden (display: none)
|
||||||
await page.waitForFunction(
|
await page.waitForFunction(
|
||||||
() => document.querySelectorAll('.subagent-window').length === 0,
|
() => {
|
||||||
|
const el = document.getElementById('subagent-window-perf-agent-1');
|
||||||
|
return el && el.style.display === 'none';
|
||||||
|
},
|
||||||
{ timeout: 2000 },
|
{ timeout: 2000 },
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log(`[subagent window] close: ${timing.toFixed(0)}ms`);
|
console.log(`[subagent window] close (minimize): ${timing.toFixed(0)}ms`);
|
||||||
expect(timing).toBeLessThan(THRESHOLDS.SUBAGENT_WINDOW_CLOSE);
|
expect(timing).toBeLessThan(THRESHOLDS.SUBAGENT_WINDOW_CLOSE);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user