<feed xmlns='http://www.w3.org/2005/Atom'>
<title>sl0ppi.git/docs/cli-design.md, branch main</title>
<subtitle>a sl0p.foo repository</subtitle>
<id>https://git.sl0p.foo/sl0ppi.git/atom/docs/cli-design.md?h=main</id>
<link rel='self' href='https://git.sl0p.foo/sl0ppi.git/atom/docs/cli-design.md?h=main'/>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0ppi.git/'/>
<updated>2026-08-12T20:05:55Z</updated>
<entry>
<title>docs(cli): record the fork gap the design turned up</title>
<updated>2026-08-12T20:05:55Z</updated>
<author>
<name>user</name>
<email>user@clank</email>
</author>
<published>2026-08-12T20:05:55Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0ppi.git/commit/?id=939748a62ce72dbdd8dfc8edd7c40ca5891439bf'/>
<id>urn:sha1:939748a62ce72dbdd8dfc8edd7c40ca5891439bf</id>
<content type='text'>
Runtime new-tab dropped purposes until 5873374; the design depends on it, so
the dependency is written down rather than assumed. Also notes the single-line
KDL terminator trap, which cost a debugging round.
</content>
</entry>
<entry>
<title>docs: agree the sl0ppi CLI design</title>
<updated>2026-08-12T19:31:31Z</updated>
<author>
<name>user</name>
<email>user@clank</email>
</author>
<published>2026-08-12T19:31:31Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0ppi.git/commit/?id=2f2d568f742605c7c3333c90229d0f73e4a369fd'/>
<id>urn:sha1:2f2d568f742605c7c3333c90229d0f73e4a369fd</id>
<content type='text'>
One root dir = one sl0ppij session, one project = one tab, panes from the
project's .sl0ppi/layout.kdl fragment.

Verified against the fork before designing on top of it, rather than assuming:

  - `action new-tab --layout|--layout-string --name --cwd` exists and returns
    the new tab id
  - `tab name= purpose=` is reported by `action list-tabs --json`
  - purposes accept [A-Za-z0-9_.:/-] up to 64 chars, so "project:foo.a1b2c3"
    survives the sanitiser verbatim
  - layout-declared purposes outrank in-band ones and survive resurrection, so
    tab identity cannot be spoofed from inside a pane and is stable across a
    session restart
  - `start_suspended` exists, which is what keeps `up` on a twelve-project root
    from becoming twelve running servers

Load-bearing property: `up` diffs discovered projects against list-tabs and
creates only what is missing, so running it repeatedly is a no-op. First thing
the tests will assert.

Entry point fails open: any error warns and execs plain sl0ppij with the
original args. Today's incident is the argument -- when the environment breaks,
the terminal is what you debug it with, so the orchestrator must never stand
between the user and their multiplexer.

Also records two problems found while designing: tab overflow (twelve projects
vs a status bar showing ~six, so `open` wants to be a picker) and that the
shipped `pir` needs python3 + fzf, neither of which is in the tarball.
</content>
</entry>
</feed>
