fix(ux): deduplicate install messages, add newlines to SSH polling - #2900

Merged
louisgv merged 1 commit into
mainfrom
fix/issue-2899
Mar 23, 2026
Merged

fix(ux): deduplicate install messages, add newlines to SSH polling#2900
louisgv merged 1 commit into
mainfrom
fix/issue-2899

Conversation

@la14-1

Copy link
Copy Markdown
Collaborator

Why: Installation success message is printed up to 4x creating confusion about whether multiple installations occurred; SSH port polling output runs together without newlines when stderr is not a TTY; post-install completion messages are redundant.

Fixes#2899

Changes

  • Suppress stdout+stderr from claude install --force finalize step to prevent duplicate "successfully installed" messages from both the curl installer and the forced re-install
  • Add TTY detection to logStepInline / logStepDone: when stderr is a TTY, use carriage return for in-place updates; when not a TTY (piped/captured), use newline-separated output so each SSH polling attempt is readable
  • Consolidate two separate post-install messages ("X is ready" + "Y setup completed successfully!") into one clear milestone: "Agent setup complete -- X is ready on Y"
  • Bump CLI version to 0.25.16
  • Update ui-cov tests to match new non-TTY behavior

Test plan

  • biome check passes (0 errors)
  • bun test passes (1868/1868)
  • Verify install message appears only once during spawn claude hetzner
  • Verify SSH polling has newlines when captured by E2E harness

-- refactor/ux-engineer

…larify completion messages
- Suppress stdout+stderr from `claude install --force` to prevent duplicate
"successfully installed" messages (was printed up to 4x)
- Make logStepInline fall back to newline-separated output when stderr is not
a TTY, so SSH port polling status is readable in piped/captured contexts
- Consolidate post-install completion messages into a single clear milestone:
"Agent setup complete -- {agent} is ready on {cloud}"
- Bump CLI version to 0.25.16
Fixes#2899
Agent: ux-engineer
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@la14-1
la14-1 marked this pull request as ready for review March 23, 2026 07:51

@louisgvlouisgv left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Security Review

Verdict: APPROVED
Commit: 1668619

Findings

No security issues found. This PR contains UX improvements only.

Changes Reviewed

  • agent-setup.ts:105 — Changed stderr redirect from 2>/dev/null to >/dev/null 2>&1 (standard pattern, safe)
  • orchestrate.ts:535 — Deduplicated install completion messages (cosmetic, safe)
  • ui.ts:43-56 — Added TTY detection to logStepInline/logStepDone (prevents escape sequences in non-TTY, safe)
  • ui-cov.test.ts — Updated test expectations for non-TTY behavior (test-only, safe)
  • package.json — Version bump 0.25.15 → 0.25.16 (standard)

Tests

  • bash -n: N/A (TypeScript only)
  • bun test: PASS (1927 tests, 0 failures)
  • biome lint: PASS (0 errors)
  • curl|bash: N/A (no shell scripts modified)
  • macOS compat: OK (standard shell redirects used)

Assessment

All changes are low-risk UX improvements with no security impact. The stderr redirect change follows standard shell patterns. TTY detection prevents escape sequence leakage into logs/CI.


-- security/pr-reviewer

@louisgv
louisgv merged commit 7aba20e into mainMar 23, 2026
6 checks passed
@louisgv
louisgv deleted the fix/issue-2899 branch March 23, 2026 08:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ux: spawn claude hetzner — 5 UX issue(s) found in interactive session

2 participants

@la14-1@louisgv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(ux): deduplicate install messages, add newlines to SSH polling - #2900

Merged
louisgv merged 1 commit into
mainfrom
fix/issue-2899
Mar 23, 2026
Merged

fix(ux): deduplicate install messages, add newlines to SSH polling#2900
louisgv merged 1 commit into
mainfrom
fix/issue-2899

Conversation

@la14-1

Copy link
Copy Markdown
Collaborator

Why: Installation success message is printed up to 4x creating confusion about whether multiple installations occurred; SSH port polling output runs together without newlines when stderr is not a TTY; post-install completion messages are redundant.

Fixes#2899

Changes

  • Suppress stdout+stderr from claude install --force finalize step to prevent duplicate "successfully installed" messages from both the curl installer and the forced re-install
  • Add TTY detection to logStepInline / logStepDone: when stderr is a TTY, use carriage return for in-place updates; when not a TTY (piped/captured), use newline-separated output so each SSH polling attempt is readable
  • Consolidate two separate post-install messages ("X is ready" + "Y setup completed successfully!") into one clear milestone: "Agent setup complete -- X is ready on Y"
  • Bump CLI version to 0.25.16
  • Update ui-cov tests to match new non-TTY behavior

Test plan

  • biome check passes (0 errors)
  • bun test passes (1868/1868)
  • Verify install message appears only once during spawn claude hetzner
  • Verify SSH polling has newlines when captured by E2E harness

-- refactor/ux-engineer

…larify completion messages
- Suppress stdout+stderr from `claude install --force` to prevent duplicate
"successfully installed" messages (was printed up to 4x)
- Make logStepInline fall back to newline-separated output when stderr is not
a TTY, so SSH port polling status is readable in piped/captured contexts
- Consolidate post-install completion messages into a single clear milestone:
"Agent setup complete -- {agent} is ready on {cloud}"
- Bump CLI version to 0.25.16
Fixes#2899
Agent: ux-engineer
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@la14-1
la14-1 marked this pull request as ready for review March 23, 2026 07:51

@louisgvlouisgv left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Security Review

Verdict: APPROVED
Commit: 1668619

Findings

No security issues found. This PR contains UX improvements only.

Changes Reviewed

  • agent-setup.ts:105 — Changed stderr redirect from 2>/dev/null to >/dev/null 2>&1 (standard pattern, safe)
  • orchestrate.ts:535 — Deduplicated install completion messages (cosmetic, safe)
  • ui.ts:43-56 — Added TTY detection to logStepInline/logStepDone (prevents escape sequences in non-TTY, safe)
  • ui-cov.test.ts — Updated test expectations for non-TTY behavior (test-only, safe)
  • package.json — Version bump 0.25.15 → 0.25.16 (standard)

Tests

  • bash -n: N/A (TypeScript only)
  • bun test: PASS (1927 tests, 0 failures)
  • biome lint: PASS (0 errors)
  • curl|bash: N/A (no shell scripts modified)
  • macOS compat: OK (standard shell redirects used)

Assessment

All changes are low-risk UX improvements with no security impact. The stderr redirect change follows standard shell patterns. TTY detection prevents escape sequence leakage into logs/CI.


-- security/pr-reviewer

@louisgv
louisgv merged commit 7aba20e into mainMar 23, 2026
6 checks passed
@louisgv
louisgv deleted the fix/issue-2899 branch March 23, 2026 08:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ux: spawn claude hetzner — 5 UX issue(s) found in interactive session

2 participants

@la14-1@louisgv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(ux): deduplicate install messages, add newlines to SSH polling - #2900

Merged
louisgv merged 1 commit into
mainfrom
fix/issue-2899
Mar 23, 2026
Merged

fix(ux): deduplicate install messages, add newlines to SSH polling#2900
louisgv merged 1 commit into
mainfrom
fix/issue-2899

Conversation

@la14-1

Copy link
Copy Markdown
Collaborator

Why: Installation success message is printed up to 4x creating confusion about whether multiple installations occurred; SSH port polling output runs together without newlines when stderr is not a TTY; post-install completion messages are redundant.

Fixes#2899

Changes

  • Suppress stdout+stderr from claude install --force finalize step to prevent duplicate "successfully installed" messages from both the curl installer and the forced re-install
  • Add TTY detection to logStepInline / logStepDone: when stderr is a TTY, use carriage return for in-place updates; when not a TTY (piped/captured), use newline-separated output so each SSH polling attempt is readable
  • Consolidate two separate post-install messages ("X is ready" + "Y setup completed successfully!") into one clear milestone: "Agent setup complete -- X is ready on Y"
  • Bump CLI version to 0.25.16
  • Update ui-cov tests to match new non-TTY behavior

Test plan

  • biome check passes (0 errors)
  • bun test passes (1868/1868)
  • Verify install message appears only once during spawn claude hetzner
  • Verify SSH polling has newlines when captured by E2E harness

-- refactor/ux-engineer

…larify completion messages
- Suppress stdout+stderr from `claude install --force` to prevent duplicate
"successfully installed" messages (was printed up to 4x)
- Make logStepInline fall back to newline-separated output when stderr is not
a TTY, so SSH port polling status is readable in piped/captured contexts
- Consolidate post-install completion messages into a single clear milestone:
"Agent setup complete -- {agent} is ready on {cloud}"
- Bump CLI version to 0.25.16
Fixes#2899
Agent: ux-engineer
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@la14-1
la14-1 marked this pull request as ready for review March 23, 2026 07:51

@louisgvlouisgv left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Security Review

Verdict: APPROVED
Commit: 1668619

Findings

No security issues found. This PR contains UX improvements only.

Changes Reviewed

  • agent-setup.ts:105 — Changed stderr redirect from 2>/dev/null to >/dev/null 2>&1 (standard pattern, safe)
  • orchestrate.ts:535 — Deduplicated install completion messages (cosmetic, safe)
  • ui.ts:43-56 — Added TTY detection to logStepInline/logStepDone (prevents escape sequences in non-TTY, safe)
  • ui-cov.test.ts — Updated test expectations for non-TTY behavior (test-only, safe)
  • package.json — Version bump 0.25.15 → 0.25.16 (standard)

Tests

  • bash -n: N/A (TypeScript only)
  • bun test: PASS (1927 tests, 0 failures)
  • biome lint: PASS (0 errors)
  • curl|bash: N/A (no shell scripts modified)
  • macOS compat: OK (standard shell redirects used)

Assessment

All changes are low-risk UX improvements with no security impact. The stderr redirect change follows standard shell patterns. TTY detection prevents escape sequence leakage into logs/CI.


-- security/pr-reviewer

@louisgv
louisgv merged commit 7aba20e into mainMar 23, 2026
6 checks passed
@louisgv
louisgv deleted the fix/issue-2899 branch March 23, 2026 08:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ux: spawn claude hetzner — 5 UX issue(s) found in interactive session

2 participants

@la14-1@louisgv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(ux): deduplicate install messages, add newlines to SSH polling - #2900

Merged
louisgv merged 1 commit into
mainfrom
fix/issue-2899
Mar 23, 2026
Merged

fix(ux): deduplicate install messages, add newlines to SSH polling#2900
louisgv merged 1 commit into
mainfrom
fix/issue-2899

Conversation

@la14-1

Copy link
Copy Markdown
Collaborator

Why: Installation success message is printed up to 4x creating confusion about whether multiple installations occurred; SSH port polling output runs together without newlines when stderr is not a TTY; post-install completion messages are redundant.

Fixes#2899

Changes

  • Suppress stdout+stderr from claude install --force finalize step to prevent duplicate "successfully installed" messages from both the curl installer and the forced re-install
  • Add TTY detection to logStepInline / logStepDone: when stderr is a TTY, use carriage return for in-place updates; when not a TTY (piped/captured), use newline-separated output so each SSH polling attempt is readable
  • Consolidate two separate post-install messages ("X is ready" + "Y setup completed successfully!") into one clear milestone: "Agent setup complete -- X is ready on Y"
  • Bump CLI version to 0.25.16
  • Update ui-cov tests to match new non-TTY behavior

Test plan

  • biome check passes (0 errors)
  • bun test passes (1868/1868)
  • Verify install message appears only once during spawn claude hetzner
  • Verify SSH polling has newlines when captured by E2E harness

-- refactor/ux-engineer

…larify completion messages
- Suppress stdout+stderr from `claude install --force` to prevent duplicate
"successfully installed" messages (was printed up to 4x)
- Make logStepInline fall back to newline-separated output when stderr is not
a TTY, so SSH port polling status is readable in piped/captured contexts
- Consolidate post-install completion messages into a single clear milestone:
"Agent setup complete -- {agent} is ready on {cloud}"
- Bump CLI version to 0.25.16
Fixes#2899
Agent: ux-engineer
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@la14-1
la14-1 marked this pull request as ready for review March 23, 2026 07:51

@louisgvlouisgv left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Security Review

Verdict: APPROVED
Commit: 1668619

Findings

No security issues found. This PR contains UX improvements only.

Changes Reviewed

  • agent-setup.ts:105 — Changed stderr redirect from 2>/dev/null to >/dev/null 2>&1 (standard pattern, safe)
  • orchestrate.ts:535 — Deduplicated install completion messages (cosmetic, safe)
  • ui.ts:43-56 — Added TTY detection to logStepInline/logStepDone (prevents escape sequences in non-TTY, safe)
  • ui-cov.test.ts — Updated test expectations for non-TTY behavior (test-only, safe)
  • package.json — Version bump 0.25.15 → 0.25.16 (standard)

Tests

  • bash -n: N/A (TypeScript only)
  • bun test: PASS (1927 tests, 0 failures)
  • biome lint: PASS (0 errors)
  • curl|bash: N/A (no shell scripts modified)
  • macOS compat: OK (standard shell redirects used)

Assessment

All changes are low-risk UX improvements with no security impact. The stderr redirect change follows standard shell patterns. TTY detection prevents escape sequence leakage into logs/CI.


-- security/pr-reviewer

@louisgv
louisgv merged commit 7aba20e into mainMar 23, 2026
6 checks passed
@louisgv
louisgv deleted the fix/issue-2899 branch March 23, 2026 08:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ux: spawn claude hetzner — 5 UX issue(s) found in interactive session

2 participants

@la14-1@louisgv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(ux): deduplicate install messages, add newlines to SSH polling - #2900

Merged
louisgv merged 1 commit into
mainfrom
fix/issue-2899
Mar 23, 2026
Merged

fix(ux): deduplicate install messages, add newlines to SSH polling#2900
louisgv merged 1 commit into
mainfrom
fix/issue-2899

Conversation

@la14-1

Copy link
Copy Markdown
Collaborator

Why: Installation success message is printed up to 4x creating confusion about whether multiple installations occurred; SSH port polling output runs together without newlines when stderr is not a TTY; post-install completion messages are redundant.

Fixes#2899

Changes

  • Suppress stdout+stderr from claude install --force finalize step to prevent duplicate "successfully installed" messages from both the curl installer and the forced re-install
  • Add TTY detection to logStepInline / logStepDone: when stderr is a TTY, use carriage return for in-place updates; when not a TTY (piped/captured), use newline-separated output so each SSH polling attempt is readable
  • Consolidate two separate post-install messages ("X is ready" + "Y setup completed successfully!") into one clear milestone: "Agent setup complete -- X is ready on Y"
  • Bump CLI version to 0.25.16
  • Update ui-cov tests to match new non-TTY behavior

Test plan

  • biome check passes (0 errors)
  • bun test passes (1868/1868)
  • Verify install message appears only once during spawn claude hetzner
  • Verify SSH polling has newlines when captured by E2E harness

-- refactor/ux-engineer

…larify completion messages
- Suppress stdout+stderr from `claude install --force` to prevent duplicate
"successfully installed" messages (was printed up to 4x)
- Make logStepInline fall back to newline-separated output when stderr is not
a TTY, so SSH port polling status is readable in piped/captured contexts
- Consolidate post-install completion messages into a single clear milestone:
"Agent setup complete -- {agent} is ready on {cloud}"
- Bump CLI version to 0.25.16
Fixes#2899
Agent: ux-engineer
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@la14-1
la14-1 marked this pull request as ready for review March 23, 2026 07:51

@louisgvlouisgv left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Security Review

Verdict: APPROVED
Commit: 1668619

Findings

No security issues found. This PR contains UX improvements only.

Changes Reviewed

  • agent-setup.ts:105 — Changed stderr redirect from 2>/dev/null to >/dev/null 2>&1 (standard pattern, safe)
  • orchestrate.ts:535 — Deduplicated install completion messages (cosmetic, safe)
  • ui.ts:43-56 — Added TTY detection to logStepInline/logStepDone (prevents escape sequences in non-TTY, safe)
  • ui-cov.test.ts — Updated test expectations for non-TTY behavior (test-only, safe)
  • package.json — Version bump 0.25.15 → 0.25.16 (standard)

Tests

  • bash -n: N/A (TypeScript only)
  • bun test: PASS (1927 tests, 0 failures)
  • biome lint: PASS (0 errors)
  • curl|bash: N/A (no shell scripts modified)
  • macOS compat: OK (standard shell redirects used)

Assessment

All changes are low-risk UX improvements with no security impact. The stderr redirect change follows standard shell patterns. TTY detection prevents escape sequence leakage into logs/CI.


-- security/pr-reviewer

@louisgv
louisgv merged commit 7aba20e into mainMar 23, 2026
6 checks passed
@louisgv
louisgv deleted the fix/issue-2899 branch March 23, 2026 08:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ux: spawn claude hetzner — 5 UX issue(s) found in interactive session

2 participants

@la14-1@louisgv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(ux): deduplicate install messages, add newlines to SSH polling - #2900

Merged
louisgv merged 1 commit into
mainfrom
fix/issue-2899
Mar 23, 2026
Merged

fix(ux): deduplicate install messages, add newlines to SSH polling#2900
louisgv merged 1 commit into
mainfrom
fix/issue-2899

Conversation

@la14-1

Copy link
Copy Markdown
Collaborator

Why: Installation success message is printed up to 4x creating confusion about whether multiple installations occurred; SSH port polling output runs together without newlines when stderr is not a TTY; post-install completion messages are redundant.

Fixes#2899

Changes

  • Suppress stdout+stderr from claude install --force finalize step to prevent duplicate "successfully installed" messages from both the curl installer and the forced re-install
  • Add TTY detection to logStepInline / logStepDone: when stderr is a TTY, use carriage return for in-place updates; when not a TTY (piped/captured), use newline-separated output so each SSH polling attempt is readable
  • Consolidate two separate post-install messages ("X is ready" + "Y setup completed successfully!") into one clear milestone: "Agent setup complete -- X is ready on Y"
  • Bump CLI version to 0.25.16
  • Update ui-cov tests to match new non-TTY behavior

Test plan

  • biome check passes (0 errors)
  • bun test passes (1868/1868)
  • Verify install message appears only once during spawn claude hetzner
  • Verify SSH polling has newlines when captured by E2E harness

-- refactor/ux-engineer

…larify completion messages
- Suppress stdout+stderr from `claude install --force` to prevent duplicate
"successfully installed" messages (was printed up to 4x)
- Make logStepInline fall back to newline-separated output when stderr is not
a TTY, so SSH port polling status is readable in piped/captured contexts
- Consolidate post-install completion messages into a single clear milestone:
"Agent setup complete -- {agent} is ready on {cloud}"
- Bump CLI version to 0.25.16
Fixes#2899
Agent: ux-engineer
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@la14-1
la14-1 marked this pull request as ready for review March 23, 2026 07:51

@louisgvlouisgv left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Security Review

Verdict: APPROVED
Commit: 1668619

Findings

No security issues found. This PR contains UX improvements only.

Changes Reviewed

  • agent-setup.ts:105 — Changed stderr redirect from 2>/dev/null to >/dev/null 2>&1 (standard pattern, safe)
  • orchestrate.ts:535 — Deduplicated install completion messages (cosmetic, safe)
  • ui.ts:43-56 — Added TTY detection to logStepInline/logStepDone (prevents escape sequences in non-TTY, safe)
  • ui-cov.test.ts — Updated test expectations for non-TTY behavior (test-only, safe)
  • package.json — Version bump 0.25.15 → 0.25.16 (standard)

Tests

  • bash -n: N/A (TypeScript only)
  • bun test: PASS (1927 tests, 0 failures)
  • biome lint: PASS (0 errors)
  • curl|bash: N/A (no shell scripts modified)
  • macOS compat: OK (standard shell redirects used)

Assessment

All changes are low-risk UX improvements with no security impact. The stderr redirect change follows standard shell patterns. TTY detection prevents escape sequence leakage into logs/CI.


-- security/pr-reviewer

@louisgv
louisgv merged commit 7aba20e into mainMar 23, 2026
6 checks passed
@louisgv
louisgv deleted the fix/issue-2899 branch March 23, 2026 08:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ux: spawn claude hetzner — 5 UX issue(s) found in interactive session

2 participants

@la14-1@louisgv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(ux): deduplicate install messages, add newlines to SSH polling - #2900

Merged
louisgv merged 1 commit into
mainfrom
fix/issue-2899
Mar 23, 2026
Merged

fix(ux): deduplicate install messages, add newlines to SSH polling#2900
louisgv merged 1 commit into
mainfrom
fix/issue-2899

Conversation

@la14-1

Copy link
Copy Markdown
Collaborator

Why: Installation success message is printed up to 4x creating confusion about whether multiple installations occurred; SSH port polling output runs together without newlines when stderr is not a TTY; post-install completion messages are redundant.

Fixes#2899

Changes

  • Suppress stdout+stderr from claude install --force finalize step to prevent duplicate "successfully installed" messages from both the curl installer and the forced re-install
  • Add TTY detection to logStepInline / logStepDone: when stderr is a TTY, use carriage return for in-place updates; when not a TTY (piped/captured), use newline-separated output so each SSH polling attempt is readable
  • Consolidate two separate post-install messages ("X is ready" + "Y setup completed successfully!") into one clear milestone: "Agent setup complete -- X is ready on Y"
  • Bump CLI version to 0.25.16
  • Update ui-cov tests to match new non-TTY behavior

Test plan

  • biome check passes (0 errors)
  • bun test passes (1868/1868)
  • Verify install message appears only once during spawn claude hetzner
  • Verify SSH polling has newlines when captured by E2E harness

-- refactor/ux-engineer

…larify completion messages
- Suppress stdout+stderr from `claude install --force` to prevent duplicate
"successfully installed" messages (was printed up to 4x)
- Make logStepInline fall back to newline-separated output when stderr is not
a TTY, so SSH port polling status is readable in piped/captured contexts
- Consolidate post-install completion messages into a single clear milestone:
"Agent setup complete -- {agent} is ready on {cloud}"
- Bump CLI version to 0.25.16
Fixes#2899
Agent: ux-engineer
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@la14-1
la14-1 marked this pull request as ready for review March 23, 2026 07:51

@louisgvlouisgv left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Security Review

Verdict: APPROVED
Commit: 1668619

Findings

No security issues found. This PR contains UX improvements only.

Changes Reviewed

  • agent-setup.ts:105 — Changed stderr redirect from 2>/dev/null to >/dev/null 2>&1 (standard pattern, safe)
  • orchestrate.ts:535 — Deduplicated install completion messages (cosmetic, safe)
  • ui.ts:43-56 — Added TTY detection to logStepInline/logStepDone (prevents escape sequences in non-TTY, safe)
  • ui-cov.test.ts — Updated test expectations for non-TTY behavior (test-only, safe)
  • package.json — Version bump 0.25.15 → 0.25.16 (standard)

Tests

  • bash -n: N/A (TypeScript only)
  • bun test: PASS (1927 tests, 0 failures)
  • biome lint: PASS (0 errors)
  • curl|bash: N/A (no shell scripts modified)
  • macOS compat: OK (standard shell redirects used)

Assessment

All changes are low-risk UX improvements with no security impact. The stderr redirect change follows standard shell patterns. TTY detection prevents escape sequence leakage into logs/CI.


-- security/pr-reviewer

@louisgv
louisgv merged commit 7aba20e into mainMar 23, 2026
6 checks passed
@louisgv
louisgv deleted the fix/issue-2899 branch March 23, 2026 08:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ux: spawn claude hetzner — 5 UX issue(s) found in interactive session

2 participants

@la14-1@louisgv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(ux): deduplicate install messages, add newlines to SSH polling - #2900

Merged
louisgv merged 1 commit into
mainfrom
fix/issue-2899
Mar 23, 2026
Merged

fix(ux): deduplicate install messages, add newlines to SSH polling#2900
louisgv merged 1 commit into
mainfrom
fix/issue-2899

Conversation

@la14-1

Copy link
Copy Markdown
Collaborator

Why: Installation success message is printed up to 4x creating confusion about whether multiple installations occurred; SSH port polling output runs together without newlines when stderr is not a TTY; post-install completion messages are redundant.

Fixes#2899

Changes

  • Suppress stdout+stderr from claude install --force finalize step to prevent duplicate "successfully installed" messages from both the curl installer and the forced re-install
  • Add TTY detection to logStepInline / logStepDone: when stderr is a TTY, use carriage return for in-place updates; when not a TTY (piped/captured), use newline-separated output so each SSH polling attempt is readable
  • Consolidate two separate post-install messages ("X is ready" + "Y setup completed successfully!") into one clear milestone: "Agent setup complete -- X is ready on Y"
  • Bump CLI version to 0.25.16
  • Update ui-cov tests to match new non-TTY behavior

Test plan

  • biome check passes (0 errors)
  • bun test passes (1868/1868)
  • Verify install message appears only once during spawn claude hetzner
  • Verify SSH polling has newlines when captured by E2E harness

-- refactor/ux-engineer

…larify completion messages
- Suppress stdout+stderr from `claude install --force` to prevent duplicate
"successfully installed" messages (was printed up to 4x)
- Make logStepInline fall back to newline-separated output when stderr is not
a TTY, so SSH port polling status is readable in piped/captured contexts
- Consolidate post-install completion messages into a single clear milestone:
"Agent setup complete -- {agent} is ready on {cloud}"
- Bump CLI version to 0.25.16
Fixes#2899
Agent: ux-engineer
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@la14-1
la14-1 marked this pull request as ready for review March 23, 2026 07:51

@louisgvlouisgv left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Security Review

Verdict: APPROVED
Commit: 1668619

Findings

No security issues found. This PR contains UX improvements only.

Changes Reviewed

  • agent-setup.ts:105 — Changed stderr redirect from 2>/dev/null to >/dev/null 2>&1 (standard pattern, safe)
  • orchestrate.ts:535 — Deduplicated install completion messages (cosmetic, safe)
  • ui.ts:43-56 — Added TTY detection to logStepInline/logStepDone (prevents escape sequences in non-TTY, safe)
  • ui-cov.test.ts — Updated test expectations for non-TTY behavior (test-only, safe)
  • package.json — Version bump 0.25.15 → 0.25.16 (standard)

Tests

  • bash -n: N/A (TypeScript only)
  • bun test: PASS (1927 tests, 0 failures)
  • biome lint: PASS (0 errors)
  • curl|bash: N/A (no shell scripts modified)
  • macOS compat: OK (standard shell redirects used)

Assessment

All changes are low-risk UX improvements with no security impact. The stderr redirect change follows standard shell patterns. TTY detection prevents escape sequence leakage into logs/CI.


-- security/pr-reviewer

@louisgv
louisgv merged commit 7aba20e into mainMar 23, 2026
6 checks passed
@louisgv
louisgv deleted the fix/issue-2899 branch March 23, 2026 08:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ux: spawn claude hetzner — 5 UX issue(s) found in interactive session

2 participants

@la14-1@louisgv