{"_id":"@404sl/pitwall","_rev":"2-d63f59c95f7eda68ab7635e798955ecf","name":"@404sl/pitwall","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@404sl/pitwall","version":"0.1.0","license":"AGPL-3.0-only","_id":"@404sl/pitwall@0.1.0","maintainers":[{"name":"railsblueprint","email":"info@railsblueprint.com"}],"homepage":"https://pitwall.build","bugs":{"url":"https://github.com/404sl/pitwall/issues"},"bin":{"pitwall":"dist/cli.js"},"dist":{"shasum":"f6a78e4ac261a857a04afc4eb7109264b056bf01","tarball":"https://registry.npmjs.org/@404sl/pitwall/-/pitwall-0.1.0.tgz","fileCount":35,"integrity":"sha512-6zM/eB4sbUlvU4YJiDuXTC7TWDQ6DW+wKpyj8xhPFQDhJ7pfrHiOQD7VqTujmsKx47iaeoYII7WHKfK0XUh40g==","signatures":[{"sig":"MEQCIHsHElHJUSiVGHpThU6X8sJwTZQZX+Kmk2v8JWlQNcrUAiBM57owCkptsaZt1qR699HAq+kRWUxdu54AHEBP3ows+Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":534377},"type":"module","engines":{"node":">=20"},"gitHead":"7b8cffadb39ea9bc45c97de7da1ee1103febb755","scripts":{"dev":"tsx src/cli.ts","lint":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.ui.json --noEmit && tsc -p tsconfig.test.json --noEmit","test":"tsx --tsconfig tsconfig.ui.json --test test/*.test.ts","build":"tsc -p tsconfig.json && vite build","dev:ui":"vite","build:ui":"vite build"},"_npmUser":{"name":"railsblueprint","email":"info@railsblueprint.com"},"repository":{"url":"git+https://github.com/404sl/pitwall.git","type":"git"},"_npmVersion":"10.9.2","description":"One screen over every project you have work running in - what is blocked, what needs you, and whether that is still true","directories":{},"_nodeVersion":"23.4.0","dependencies":{"@404sl/pitwall-schema":"^0.3.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vite":"^6.0.0","react":"^18.3.1","react-dom":"^18.3.1","typescript":"^5.7.0","@types/node":"^22.10.0","@types/react":"^18.3.0","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.3.0"},"_npmOperationalInternal":{"tmp":"tmp/pitwall_0.1.0_1788969762969_0.9784115104324482","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@404sl/pitwall","version":"0.1.1","description":"One screen over every project you have work running in - what is blocked, what needs you, and whether that is still true","license":"AGPL-3.0-only","type":"module","bin":{"pitwall":"dist/cli.js"},"engines":{"node":">=20"},"repository":{"type":"git","url":"git+https://github.com/404sl/pitwall.git"},"homepage":"https://pitwall.build","scripts":{"build":"tsc -p tsconfig.json && vite build","test":"tsx --tsconfig tsconfig.ui.json --test test/*.test.ts","lint":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.ui.json --noEmit && tsc -p tsconfig.test.json --noEmit","build:ui":"vite build","dev:ui":"vite","dev":"tsx src/cli.ts"},"dependencies":{"@404sl/pitwall-schema":"^0.3.0"},"devDependencies":{"@types/node":"^22.10.0","@types/react":"^18.3.0","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.3.0","react":"^18.3.1","react-dom":"^18.3.1","tsx":"^4.19.0","typescript":"^5.7.0","vite":"^6.0.0"},"gitHead":"a47c10396a164d3aa1091a7e7bb4092438087394","_id":"@404sl/pitwall@0.1.1","bugs":{"url":"https://github.com/404sl/pitwall/issues"},"_nodeVersion":"22.23.2","_npmVersion":"12.0.2","dist":{"integrity":"sha512-EUFkqJzILk6138LLa5a/M70J4noQ1o7J/5TwvpNU3iJw0fUDm4Z/XVr2RwXPXGXi3CbX8Z6sCUsDShqDQd8cow==","shasum":"62fa8545a49f90a8e7ea981c7469aa1006470255","tarball":"https://registry.npmjs.org/@404sl/pitwall/-/pitwall-0.1.1.tgz","fileCount":35,"unpackedSize":534974,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@404sl%2fpitwall@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHAqZ6KjXnjHxNTguRhGK1KkhMgFj/NZYRzX+HqPSDCFAiBHY45KXunzWm+Wvlc4kiPvShz+YoVkcli1qNpFmXzUNQ=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e96f5bdd-be60-4c8d-9866-c9dc39b379cc"}},"directories":{},"maintainers":[{"name":"railsblueprint","email":"info@railsblueprint.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pitwall_0.1.1_1788970340506_0.5143734329724516"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-09T16:02:42.734Z","modified":"2026-09-09T16:12:21.007Z","0.1.0":"2026-09-09T16:02:43.118Z","0.1.1":"2026-09-09T16:12:20.652Z"},"bugs":{"url":"https://github.com/404sl/pitwall/issues"},"license":"AGPL-3.0-only","homepage":"https://pitwall.build","repository":{"type":"git","url":"git+https://github.com/404sl/pitwall.git"},"description":"One screen over every project you have work running in - what is blocked, what needs you, and whether that is still true","maintainers":[{"name":"railsblueprint","email":"info@railsblueprint.com"}],"readme":"<!-- THE MARK, NOT THE LOCKUP, and deliberately.\n     The lockup and wordmark SVGs set live text in Barlow Condensed. GitHub does not have\n     that font, falls back to something much wider, and the text overflows the viewBox and\n     is CLIPPED - \"pitwall.buil\". The brand package says so in as many words: on a platform\n     that cannot load the font, convert the text to outlines or use the mark alone.\n     The mark is three rectangles and a tile. It has no font to miss. -->\n<img alt=\"Pitwall\" width=\"96\" src=\"https://raw.githubusercontent.com/404sl/pitwall/master/ui/brand/logo/pitwall-mark.svg\">\n\n# Pitwall\n\nOne screen over every project you have work running in — what is blocked, what needs\na person, and whether that is still true.\n\n[pitwall.build](https://pitwall.build) · AGPL-3.0\n\n---\n\n## The dashboard is not the point\n\nPitwall reads a project's tracker, its repositories and its lanes, and reports them\ntogether. Most of what it prints is gathered. Two things are computed, and neither\nexists in any source it reads:\n\n**Classification** — why an issue is not simply \"open\", in the terms that matter to a\nperson. Only two states are somebody's own queue: a decision only they can make, and an\naction only they can run. Everything else is parked, blocked, or being worked on by\nsomething else.\n\nSumming those together overstated a real backlog more than fourfold — 74 against an\nactual 17 — so the split is defined once, in the contract, and never re-derived by a\nconsumer.\n\n**Staleness** — whether the reason an issue stopped is still true. An issue records why\nit was parked; nothing records when that reason expired. Four of six blockers surveyed by\nhand were already dead: a title asking for a smoke test that had run nine days earlier, a\nlabel describing access since granted, a decision already made.\n\nA third rule follows from both: **a source that could not be read is never rendered as a\nsource with nothing in it.** Anything that fails to collect says so, per project and per\nrun. \"Nothing to do\" and \"we could not look\" are different answers and the screen has to\ntell them apart.\n\n## Status\n\nEarly, and honest about it. Working today:\n\n```\npitwall snapshot     collect every project and print the snapshot as JSON\npitwall status       print the latest snapshot as one screen\npitwall doctor       check every source a snapshot reads and say what is wrong\npitwall serve        serve the console on http://127.0.0.1:7373/\n```\n\n`snapshot` discovers projects, reads their trackers, classifies every issue and reports\nlane state. `status` renders that document as one terminal screen, reading the snapshot\nthe server reads or another file given with `--from`; both it and the console lead with the\nsnapshot's age rather than the time it was taken, and both call a snapshot stale once it is\nten minutes old, because a screen that reads as current when it is not is worse than no\nscreen. `doctor` prints one line per source\n— the roots, each workspace file, the tracker, `bd`, `gh`, every repository and every lane\nregistry — with what was tried and what came back, and exits non-zero when a hard\nrequirement fails. `serve` serves that document over HTTP. **The console itself is still\nbeing built** — until it lands, `serve` gives you the API and a placeholder page.\n\n## Try it\n\n```bash\nnpx @404sl/pitwall snapshot\n```\n\nProjects are found by looking for `.pitwall.json` files, which describe a workspace: one\nauthoritative tracker, and the repositories under it. The older name `.autofix.json` is\nstill read, so a workspace that has not been renamed keeps working; where a directory has\nboth, `.pitwall.json` is the one in use. Run it from a directory whose children are\nproject workspaces, or configure the roots explicitly.\n\nEvery `snapshot` run is appended to a local SQLite log at `~/.local/state/pitwall/history.db`\n(`XDG_STATE_HOME` is honoured). A tracker holds current state and no time series, so the\nmetrics that need more than one reading — what landed today, the median minutes from claim\nto close, how often claimed work goes back to open — are derived from that log rather than\nstored in it. Each of them needs at least two runs before it says anything; until then the\nmedian and the bounce rate are absent rather than zero.\n\nThe log keeps the newest 500 snapshots and 30 days of them, and both bounds also bound the\nanswers, because the metrics can only be derived from runs the log still holds. The window\nis 14 days or as far back as the log reaches, whichever is shorter: at hourly runs 500\nsnapshots is the full fortnight, and at the ten-minute cadence the status screen's staleness\nline invites it is under four days. `history.maxSnapshots` and `history.maxAgeDays` in\n`~/.config/pitwall/config.json` move both bounds — a fortnight at ten minutes needs about\n2000 snapshots and, at a couple of hundred kilobytes each, roughly half a gigabyte. The\ndefault is sized to be safe on an unattended laptop, not to reach the longest window.\n\n`landedToday` counts work the log saw claimed and then gone, so it can only count what two\nruns bracket: an issue claimed and closed between one run and the next is never observed.\n\nA log that cannot be written costs those metrics and nothing else: the snapshot still\narrives, and the failure is recorded in `errors`. `node:sqlite` arrived in Node 22.13, and\non an older Node there is no log at all — the metrics are simply absent, and nothing is\nreported as an error, because a module a runtime never shipped is not a failed read.\n\n## How it is put together\n\n```\n@404sl/pitwall-schema    the snapshot contract — MIT, so an adapter for your own\n                         tracker need not adopt copyleft\n@404sl/pitwall           this — the agent and the local console, AGPL-3.0\n```\n\nThe contract is a separate package on purpose. It is what a console renders, what a\nserver would validate on ingest, and what an adapter for a different tracker is written\nagainst. It emits a JSON Schema artifact alongside its types, so a consumer that is not\nTypeScript has something to validate against.\n\n## Licence\n\nAGPL-3.0. The contract package is MIT.\n","readmeFilename":"README.md"}