logicsrc/docs
Anthony Ettinger b1805d08e5
Some checks are pending
CI / build (push) Waiting to run
test / test (push) Waiting to run
Add SSH keys and config to credential sharing (#139)
* Add SSH keys and config to credential sharing

Private keys have lived as plaintext-on-disk files guarded only by a
passphrase. This puts them in the same end-to-end-encrypted vaults as
.env secrets, and adds an agent path so a machine can use a key without
ever writing one to its disk.

- `ssh` provider: ~/.ssh as a value bag. Files are picked by sniffing
  contents (PRIVATE KEY blocks, ssh-*/ecdsa-*/sk-* public keys) plus
  config, config.d/* and allowed_signers. known_hosts and
  authorized_keys are host-specific and access-granting, so they need
  an explicit --include.
- Each file is one secret carrying a JSON envelope of path, mode and
  body. The engine only hands write() the secrets that CHANGED, so a
  separate manifest secret would be absent whenever a key's contents
  change but the file list doesn't — self-describing values keep every
  restore total.
- `logicsrc secrets ssh push|pull|list|agent`, addressed by PERSON not
  project: the vault is ssh--<username>, which teams vaults reads as
  project ssh, env <username>. One teammate's keys never land in
  another's restore; sharing stays a deliberate teams grant.
- Both directions hold back anything that would overwrite a file that
  already differs, and say what they skipped. --force opts in. A
  restore onto a machine with its own keys is otherwise a way to lose
  them.
- Restores chmod each file back to its recorded mode; writeFileSync's
  mode applies only on create, so an existing world-readable key would
  otherwise stay world-readable. The adapter declares delete:false.
- push warns about passphrase-less private keys before they go up.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Add worked examples to secrets and secrets ssh help

Commander's usage line shows only the first alias, so `logicsrc secrets`
— the spelling people actually type — was invisible in its own help.
The examples carry it, alongside the flows worth copying: link/up/down,
the ssh backup round trip, and a plan → dry-run → approve sync.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Advertise the ssh provider on the marketing page

The marketing-drift contract failed the build because `ssh` shipped in the
provider registry with no entry in MARKETING_PROOF -- which is the test
working: it exists so a provider cannot ship while the pages people
actually land on still describe the tool without it.

The proof regex is `/~\/\.ssh|SSH key/` rather than a bare `/SSH/` on
purpose. The provider grid renders every registry `name`, and this one is
"Local SSH directory", so `/SSH/` would already be satisfied by the
generated grid and the provider could ship with no copy written about it
at all -- passing the test while failing its intent. Requiring the path or
the phrase means a human wrote a sentence.

That sentence is the new block in the credential-sharing band: ~/.ssh is a
directory of files whose permission bits are load-bearing, not a set of
KEY=VALUE lines, which is the part that makes this provider different from
the other six. README already named ~/.ssh keys, so it needed no change.

apps/logicsrc-web: 75/75 contract tests pass (was 74 passed, 1 failed).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-13 17:03:00 -07:00
..
opencontext Add the LogicSRC OpenContext specification (#132) 2026-08-09 11:46:11 -07:00
openprd feat(openprd): revise standard to DIP-style numbered proposals (0.2) (#96) 2026-07-12 08:55:19 -07:00
agent-screening.md Add AgentByte screening plugin spec 2026-06-06 15:54:08 +00:00
agentad-marketplace.md feat(agentad): AgentAd Marketplace PRD + reference exchange (M5) 2026-07-01 10:29:36 +00:00
agentad.md feat(agentad): AgentAd Marketplace PRD + reference exchange (M5) 2026-07-01 10:29:36 +00:00
agentgit.md Add AgentGit M1: agent-native git layer over a Forgejo backend 2026-06-14 15:15:06 +00:00
agentstack.md feat(agentstack): add @logicsrc/agentstack coordination module (#5) 2026-06-10 16:39:32 -07:00
ans-sdk.md docs(ans): spec the @logicsrc/ans TypeScript SDK 2026-06-24 14:41:00 +00:00
arcade.md Add waiting arcade MVP 2026-06-06 22:09:22 +00:00
cli.md Add communication account plugin scaffolds 2026-06-09 10:02:07 +00:00
communication-accounts.md Add communication account plugin scaffolds 2026-06-09 10:02:07 +00:00
config.md fix(credentials): one vault per user, in the config dir (#119) 2026-07-31 22:53:17 -07:00
credential-sharing.md Add SSH keys and config to credential sharing (#139) 2026-08-13 17:03:00 -07:00
data-model.md Add communication account plugin scaffolds 2026-06-09 10:02:07 +00:00
openapi.yaml Add communication account plugin scaffolds 2026-06-09 10:02:07 +00:00
opencontext.md Add the LogicSRC OpenContext specification (#132) 2026-08-09 11:46:11 -07:00
openontology-governance.md feat(openontology): implement OpenOntology Phase 0 + local engine and CLI (#99) 2026-07-26 02:10:13 -07:00
openontology-interoperability.md feat(openontology): Phase 2 + Phase 3 — storage, REST/SSE, MCP, RDF/SHACL, adapters, TUI, explorer (#101) 2026-07-28 05:10:33 -07:00
openontology.md feat(openontology): Phase 2 + Phase 3 — storage, REST/SSE, MCP, RDF/SHACL, adapters, TUI, explorer (#101) 2026-07-28 05:10:33 -07:00
openprd.md feat(openprd): implement the OpenPRD standard — engine, CLI, conformance bundle (#100) 2026-07-28 04:11:07 -07:00
openspec-comparison.md feat(agentstack): add @logicsrc/agentstack coordination module (#5) 2026-06-10 16:39:32 -07:00
permissions.md Add communication account plugin scaffolds 2026-06-09 10:02:07 +00:00
plugins.md Add AgentGit M1: agent-native git layer over a Forgejo backend 2026-06-14 15:15:06 +00:00
positioning.md Add credential sharing openspec 2026-06-06 18:47:41 +00:00
roadmap.md Add communication account plugin scaffolds 2026-06-09 10:02:07 +00:00
tui.md Add waiting arcade MVP 2026-06-06 22:09:22 +00:00