Feature: SSH key management UI #19

Closed
opened 2026-03-10 03:48:06 +00:00 by Mark · 3 comments
Owner

Issue

Users need to manage SSH keys for Git operations, but there's no UI for this currently.

Location

  • Mentioned in ROADMAP.md as future feature
  • Some FIDO2 SSH key endpoints exist but no UI

Current State

  • FIDO2 SSH key generation endpoint exists (/sessions/{id}/ssh/fido2/generate)
  • List SSH keys endpoint exists
  • But no UI to manage keys

Proposed Solution

  1. SSH key list in session settings
  2. Generate new key pair (RSA, Ed25519, FIDO2)
  3. Import existing keys
  4. Copy public key to clipboard
  5. Delete keys

Acceptance Criteria

  • SSH key management tab in session view
  • List existing keys
  • Generate new SSH key pairs
  • FIDO2/WebAuthn key support
  • Import existing keys
  • Copy public key button
  • Delete key confirmation
  • Integration with Git credentials

Priority: Low
Type: Feature
References: ROADMAP.md UX Enhancements

## Issue Users need to manage SSH keys for Git operations, but there's no UI for this currently. ## Location - Mentioned in ROADMAP.md as future feature - Some FIDO2 SSH key endpoints exist but no UI ## Current State - FIDO2 SSH key generation endpoint exists (`/sessions/{id}/ssh/fido2/generate`) - List SSH keys endpoint exists - But no UI to manage keys ## Proposed Solution 1. SSH key list in session settings 2. Generate new key pair (RSA, Ed25519, FIDO2) 3. Import existing keys 4. Copy public key to clipboard 5. Delete keys ## Acceptance Criteria - [ ] SSH key management tab in session view - [ ] List existing keys - [ ] Generate new SSH key pairs - [ ] FIDO2/WebAuthn key support - [ ] Import existing keys - [ ] Copy public key button - [ ] Delete key confirmation - [ ] Integration with Git credentials **Priority:** Low **Type:** Feature **References:** ROADMAP.md UX Enhancements
Author
Owner

GSD VERIFY phase failed after 3 attempts.
═══ Gate: verify-passed (devforge#19) ═══
Mode: Tier 1 (functional only)

GATE OK: All gates up to 'implement' pass
── Tier 1: Functional ────────────────────────────────
Running tests...
❌ Tests failed (exit 1)
 FAIL  services/web/src/utils/terminalUtils.test.ts > terminalUtils > decodeTerminalMessage > should return empty Uint8Array for Blob input in sync decoder
 FAIL  services/web/src/utils/terminalUtils.test.ts > terminalUtils > debug mode > should return false when debug is not enabled
 FAIL  services/web/src/utils/terminalUtils.test.ts > terminalUtils > debug mode > should return true when debug is enabled
 FAIL  services/web/src/utils/terminalUtils.test.ts > terminalUtils > debug mode > should disable debug mode
ReferenceError: localStorage is not defined
 ❯ services/web/src/utils/terminalUtils.test.ts:12:5
 10|  beforeEach(() => {
 11|  vi.restoreAllMocks();
 12|  localStorage.clear();
 |  ^
 13|  });
 14| 

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/9]⎯

 Test Files  4 failed | 1 passed (5)
 Tests  6 failed | 4 passed (10)
 Start at  23:14:25
 Duration  635ms (transform 466ms, setup 0ms, import 126ms, tests 9ms, environment 1ms)
Running linter...
✅ Lint clean
⚠️ No type checker discovered
Previous test count: unknown

❌ GATE FAIL: verify-passed
- Tests failed with exit code 1
GATE FAIL: verify — blocked at 2026-05-21T06:14:27Z
Class: test-failure
Evidence: Verification failed: 1 failures
Git tag: devforge#19-gate-verify-fail-a52a2ece7719 (use gate-retry after fixing)

GSD VERIFY phase failed after 3 attempts. ═══ Gate: verify-passed (devforge#19) ═══ Mode: Tier 1 (functional only) GATE OK: All gates up to 'implement' pass ── Tier 1: Functional ──────────────────────────────── Running tests... ❌ Tests failed (exit 1)  FAIL  services/web/src/utils/terminalUtils.test.ts > terminalUtils > decodeTerminalMessage > should return empty Uint8Array for Blob input in sync decoder  FAIL  services/web/src/utils/terminalUtils.test.ts > terminalUtils > debug mode > should return false when debug is not enabled  FAIL  services/web/src/utils/terminalUtils.test.ts > terminalUtils > debug mode > should return true when debug is enabled  FAIL  services/web/src/utils/terminalUtils.test.ts > terminalUtils > debug mode > should disable debug mode ReferenceError: localStorage is not defined  ❯ services/web/src/utils/terminalUtils.test.ts:12:5  10|  beforeEach(() => {  11|  vi.restoreAllMocks();  12|  localStorage.clear();  |  ^  13|  });  14|  ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/9]⎯  Test Files  4 failed | 1 passed (5)  Tests  6 failed | 4 passed (10)  Start at  23:14:25  Duration  635ms (transform 466ms, setup 0ms, import 126ms, tests 9ms, environment 1ms) Running linter... ✅ Lint clean ⚠️ No type checker discovered Previous test count: unknown ❌ GATE FAIL: verify-passed - Tests failed with exit code 1 GATE FAIL: verify — blocked at 2026-05-21T06:14:27Z Class: test-failure Evidence: Verification failed: 1 failures Git tag: devforge#19-gate-verify-fail-a52a2ece7719 (use gate-retry after fixing)
Author
Owner

GSD RESEARCH phase could not determine a clear fix.

]11;?\Based on my investigation, here's my assessment:

STATUS: UNCLEAR

EVIDENCE:

  • Backend endpoints DO exist for FIDO2 SSH keys:
    • POST /sessions/{id}/ssh/fido2/generate (main.py:1077-1149) - generates ed25519-sk keys
    • POST /sessions/{id}/ssh/fido2/add (main.py:1179-1212) - adds existing FIDO2 key to ssh-agent
    • GET /sessions/{id}/ssh/keys (main.py:1152-1176) - lists keys BUT returns raw ls -la /root/.ssh/ output, not structured JSON
  • Frontend: SessionView.tsx has tabs for F
GSD RESEARCH phase could not determine a clear fix. ]11;?\Based on my investigation, here's my assessment: STATUS: UNCLEAR EVIDENCE: - Backend endpoints DO exist for FIDO2 SSH keys: - `POST /sessions/{id}/ssh/fido2/generate` (main.py:1077-1149) - generates ed25519-sk keys - `POST /sessions/{id}/ssh/fido2/add` (main.py:1179-1212) - adds existing FIDO2 key to ssh-agent - `GET /sessions/{id}/ssh/keys` (main.py:1152-1176) - lists keys BUT returns raw `ls -la /root/.ssh/` output, not structured JSON - Frontend: SessionView.tsx has tabs for F
Mark 2026-08-05 03:23:22 +00:00
Mark 2026-08-08 08:55:32 +00:00
Author
Owner

Re-opened: false-positive close confirmed. Issue was closed but no fix commit exists on master. Re-adding triage-approved to route back through the pipeline.

Re-opened: false-positive close confirmed. Issue was closed but no fix commit exists on master. Re-adding triage-approved to route back through the pipeline.
Mark closed this issue 2026-08-08 08:57:52 +00:00
Sign in to join this conversation.
No description provided.