Skip to content

Add logicsrc teams tui, a browser for team vaults - #146

Merged
ralyodio merged 1 commit into
masterfrom
vault-tui
Sep 8, 2026
Merged

Add logicsrc teams tui, a browser for team vaults#146
ralyodio merged 1 commit into
masterfrom
vault-tui

Conversation

@ralyodio

@ralyodio ralyodio commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Teams on the left, their vaults in the middle, and the selected vault's detail on the right across three tabs: secret names, who can decrypt, and the audit trail.

 logicsrc vaults anthony@profullstack.com                              Tab panes  ←/→ view  r reload  q quit
╭─ Teams (3) ──────────────╮ ╭─ Vaults · profullstack (4) ──────────────╮ ╭─ hqtui · secrets ──────────────────╮
│ profullstack             │ │ Project      Env         Secrets Access  │ │   secrets    grants    audit       │
│ coinpay                  │ │ hqtui        prod              6 yes     │ │ ────────────────────────────────── │
│ crawlproof               │ │ rssamplifier prod             14 yes     │ │ Name              Ver   Fingerprint│
│                          │ │ rssamplifier staging          14 no      │ │ DATABASE_URL      v4    3f9a2c8e1b0│
│                          │ │ tipoffwatch  prod              9 yes     │ │ NPM_TOKEN         v2    a71c05de9f3│
│                          │ │                                          │ │ ────────────────────────────────── │
│                          │ │                                          │ │ Values stay encrypted. To read     │
│                          │ │                                          │ │ them: logicsrc teams pull …        │
╰──────────────────────────╯ ╰──────────────────────────────────────────╯ ╰────────────────────────────────────╯
 Tab detail  ←/→ secrets  ↑↓ Move  r Reload  q Quit

It never handles plaintext

That is the point rather than a limitation. The server only ever holds ciphertext and this keeps it that way: no decryption key is fetched, none is unwrapped, and there is no keybinding that would.

The secrets tab says so on screen and points at logicsrc teams pull, because otherwise the first thing anyone does is hunt for a reveal key. A value that can appear on screen can appear in a screen share, a scrollback buffer or a recording. Names are what you need to navigate; values are what you rarely need to look at.

Names, fingerprints and versions answer the questions you actually open this for: does the vault exist, has the rotation landed, and who can still read it.

Shape

  • Lazy loading. Vaults and detail are each a round trip, so they load on selection. The three detail calls settle independently — a member without decryption access still sees the vault's shape, and a missing audit endpoint does not blank the secrets list.
  • Changing team resets the vault selection. The old index means nothing in a different team's list, and keeping it silently selects an unrelated vault.
  • The secrets table shows a date, not a timestamp. Three fixed columns plus a name that can run to thirty characters leaves no room, and a truncated clock (2026-09-0…) looks like data while telling you nothing the date did not.
  • The audit table gives its widest floor to the action, not the actor. An email truncates to something recognisable; secrets… could be put, get or delete.

Testing

The view is split from the loader so it renders headlessly with no authenticated client and no terminal. 17 tests, including one asserting no ciphertext reaches the screen. 226 pass across the CLI suite.

Notes

  • Built on @profullstack/hqtui ^0.3.0, loaded lazily with the same Node 22.6 fallback message the CoinPay finances TUI uses.
  • There is no top-level logicsrc vault command; that name belongs to the OpenCreds personal vault. The team vaults these browse live under teams, so the command went there.
  • packages/cli/src/context.ts has a pre-existing typecheck error (@logicsrc/opencontext/commands unresolved). It reproduces on a clean HEAD and is untouched here.

🤖 Generated with Claude Code

https://claude.ai/code/session_017Df2FNu5DhinMV2soRz3cy

Teams on the left, their vaults in the middle, and the selected vault's
detail on the right across three tabs: secret names, who can decrypt,
and the audit trail.

It never handles plaintext, and that is the point rather than a
limitation. The server only ever holds ciphertext and this keeps it that
way: no decryption key is fetched, none is unwrapped, and there is no
keybinding that would. The secrets tab says so on screen and points at
`logicsrc teams pull`, because otherwise the first thing anyone does is
hunt for a reveal key. A value that can appear on screen can appear in a
screen share, a scrollback buffer or a recording; names are what you
need to navigate, values are what you rarely need to look at.

Names, fingerprints and versions are enough to answer the questions you
actually open this for: does the vault exist, has the rotation landed,
and who can still read it.

Notes on the shape:

  - Vaults and detail load lazily, because each is a round trip. The
    three detail calls are settled independently, so a member without
    decryption access still sees the vault's shape and a missing audit
    endpoint does not blank the secrets list.
  - Changing team resets the vault selection. The old index means
    nothing in a different team's list, and keeping it silently selects
    an unrelated vault.
  - The secrets table shows a date rather than a timestamp. Three fixed
    columns plus a name that can run to thirty characters leaves no room,
    and a truncated clock looks like data while telling you nothing.
  - The audit table gives its widest floor to the action, not the actor:
    an email truncates to something recognisable, where "secrets…" could
    be put, get or delete.

The view is split from the loader so it renders headlessly without an
authenticated client or a terminal. 17 tests cover that, including one
asserting no ciphertext reaches the screen; 226 pass across the CLI.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Df2FNu5DhinMV2soRz3cy
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown

ThreatCrush Security Scan

21 finding(s)

HIGH/CRITICAL: 3 | MEDIUM: 9 | LOW: 9

Severity Rule Location
HIGH secret-private-key plugins/credential-sharing/src/providers/ssh.ts:129
HIGH js-host-header-trust apps/commandboard-web/server.js:27
HIGH js-ssrf-outbound-request apps/pwa/public/sw.js:45
MEDIUM js-unescaped-html-sink apps/commandboard-web/src/main.ts:19
MEDIUM js-unescaped-html-sink apps/logicsrc-web/src/app/[[...slug]]/page.tsx:73
MEDIUM js-unescaped-html-sink apps/logicsrc-web/src/app/layout.tsx:83
MEDIUM js-unescaped-html-sink apps/logicsrc-web/src/app/pricing/page.tsx:46
MEDIUM js-unescaped-html-sink apps/logicsrc-web/src/components/site-shell.tsx:49
MEDIUM redos-nested-quantifier packages/opencontext/src/ids.ts:10
MEDIUM redos-nested-quantifier packages/opencontext/src/ids.ts:11
MEDIUM js-timing-unsafe-mac-compare packages/opencontext/src/validate.ts:208
MEDIUM redos-nested-quantifier packages/openontology/src/ids.ts:20
LOW secret-generic-credential apps/pwa/test/appbar.test.mjs:10
LOW secret-aws-access-key packages/opencontext/src/permissions.test.ts:260
LOW secret-private-key packages/opencontext/src/permissions.test.ts:261
LOW secret-stripe-key packages/opencontext/src/permissions.test.ts:262
LOW secret-aws-access-key packages/opencontext/src/security.test.ts:228
LOW secret-private-key plugins/credential-sharing/src/providers/ssh.test.ts:7
LOW secret-database-url plugins/credential-sharing/src/rekey.test.ts:33
LOW secret-openai-key plugins/credential-sharing/src/vault-encryption.test.ts:21
LOW secret-generic-credential plugins/credential-sharing/src/vault-encryption.test.ts:21

Snippets are redacted; ThreatCrush never prints matched credential material.

@socket-security

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Added@​profullstack/​hqtui@​0.3.08110010095100

View full report

@ralyodio
ralyodio merged commit ca21348 into master Sep 8, 2026
6 checks passed
@ralyodio
ralyodio deleted the vault-tui branch September 8, 2026 15:07
Sign up for free to 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.

1 participant