siso-shell · for every agent
Reuse the bank
Three ways in, from cheapest to most complete. Nothing to install beyond node for the third.
no frameworkpublic repo
01
Three ways
Link the shell by URLAdd
head("https://siso-shell.pages.dev/shell") output to your page and paste a <nav class="siso-sidebar"> from any published page with your own destinations.Copy a template folder
templates/<id>/ has the template, its schema, a real example and a README with the reasoning and contract.Run bin/composeJSON in, page out, inside the shell, with "On this page" built from your sections.
02
Compose a page from JSON
git clone https://github.com/sisodias/siso-shell && cd siso-shellcat templates/U4/schema.json # what the JSON carriescp templates/U4/example.json my.json # start from real data, replace it with yoursbin/compose U4 my.json --nav my-nav.json --base https://siso-shell.pages.dev --out out/index.htmlnode --test # engine + shell tests
Agent entry
- Read first
templates/<id>/README.md- Done when
- Open out/index.html: your data in the CRM shell; every section is in the rail's "On this page" group.
03
Only the shell
import { rail, head } from './shell.mjs';
const nav = { title: 'My site', mark: 'M', home: '/', groups: [
{ id: 'now', label: 'Now', destinations: [ { label: 'Dashboard', href: '/', icon: 'layout-dashboard' } ] },
] };
const page = [ { label: 'Why', href: '#why' }, { label: 'Repos', href: '#repos' } ];
document.write(`<!doctype html><html class="no-js"><head>${head('https://siso-shell.pages.dev/shell')}</head>
<body class="rail-expanded">${rail({ ...nav, current: '/', page })}<div class="siso-shell-page">…</div></body></html>`);
Icons are lucide names (shell/icons.mjs, 75 shipped). nav.json is the site map: groups → destinations → optional private / status chip. The rail marks current active and lists page under "On this page".
04
What is where
siso-shell/
shell/ tokens.css (CRM, verbatim) · rail.css (GroupedRail.css verbatim + static additions) · rail.js · icons.mjs (lucide, ISC)
shell.mjs rail({title, groups, current, page}) → <nav> · head(base) → <link>/<script>
parts/ the twelve modules + atoms, one HTML partial each · parts.css · catalogue.js
templates/ one folder per family U0…U23: template.html · schema.json · example.json · README.md (+ _layout.html)
bin/compose compose <family> <data.json> [--nav nav.json] [--base URL] [--out page.html]
bin/build-site renders site/ (the published bank: gallery, /t/<id>/, /t/<id>/example/, /how/, 404)
site/ what siso-shell.pages.dev serves
05
Rules
- 1Real data or an empty stateexample.json is real (projects.json, catalog.json, receipts). A part with nothing to show says so; never filler.
- 2The shell is copied, not adaptedEvery rail value is the CRM's through the CRM's token names. Change tokens.css only by re-copying it from the CRM.
- 3Groups are headingsClicking a group heading does nothing. Only "On this page" folds.
- 4Public payload onlyRepos and visibility yes; roster, routing, auth, money no. Private records render as U11 stubs.
- 5Licences travelLucide is ISC (notice in icons.mjs). Action Model and 21st.dev presentation is robbed with its receipt named.