required:true only worked by accident: a bare z.string() or z.array(...) accepts "" / [] just fine, so a required field with no minLength (e.g. secret tokens like webhookToken, apiKey) could be submitted empty and the run would start anyway. Required now implies min(1) when no stricter bound is already configured, for both string and multiselect fields. This is the single schema shared by the client form resolver and the server run-creation route, so both now reject it. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
TriggerShell web app
This is the Next.js app that TriggerShell's Python CLI (triggershell dev / triggershell start)
launches — it's not meant to be run standalone with next dev/next start since it needs a
custom server (server.ts) for the WebSocket endpoint.
See the repo root README for how to run TriggerShell end-to-end, and
../docs/ARCHITECTURE.md for how this app is put together.
pnpm install
pnpm dev # tsx watch server.ts - reads TRIGGERSHELL_CONFIG_PATH from the environment
pnpm lint
pnpm typecheck
pnpm db:studio # browse the SQLite database