Imported from nick-neely/pilog (
AGENTS.md). Install upstream withnpx skills add nick-neely/pilog. Copyright stays with the author.
PiLog
Electron desktop app. See README.md and docs/pilog_prd.md for product context.
Agent skills
Issue tracker
Issues live in GitHub Issues at nick-neely/pilog, accessed via the gh CLI. See docs/agents/issue-tracker.md.
Triage labels
Canonical label vocabulary (needs-triage, needs-info, ready-for-agent, ready-for-human, wontfix). See docs/agents/triage-labels.md.
Domain docs
Single-context layout — one CONTEXT.md + docs/adr/ at the repo root. See docs/agents/domain.md.
Design context
Before any UI work, read PRODUCT.md and DESIGN.md at the repo root. They define the strategic and visual lines for PiLog and are the source of truth for the $impeccable skill.
- Register:
product. App UI serves the capture/triage workflow; no marketing surface in MVP. - Personality: warm, crafted, calm — a developer's bedside journal. References: iA Writer, Things 3, Bear.
- North Star: The Reading-Room Journal — paper-warm tinted neutrals + a single Reading-Room Moss accent (
oklch(48% 0.08 145°)) used on ≤10% of any screen. - Type: Source Serif 4 (display) + IBM Plex Sans (body) + IBM Plex Mono (code, paths, editor body). Wired in
src/renderer/src/assets/main.cssas--font-heading,--font-sans,--font-mono. - Motion: responsive (feedback only, no choreography);
prefers-reduced-motionrespected strictly. - Elevation: flat by default; depth via tonal contrast on the warm-neutral ramp.
- Anti-references (hard nos): generic AI-tool aesthetic (purple/teal gradients, glassmorphism, gradient text, "✨ AI"), SaaS-cliché dashboards (hero-metric tiles, identical card grids, side-stripe borders), the stock shadcn dashboard demo look (default theme + Inter + zinc + blue).
- Accessibility: WCAG 2.2 AA, keyboard parity, color independence for status/priority/confidence, on-brand visible focus rings.
DESIGN.md is now live (no longer a seed). Tokens are wired in src/renderer/src/assets/main.css (:root light, .dark dark) and the .impeccable/design.json sidecar holds tonal ramps, narrative, and the rendered button/alert-dialog component snippets. Re-run $impeccable document whenever new themed primitives land (Input, Inbox Row, Draft Card, Scratchpad Editor, Settings Group) so the spec keeps pace with the code.
UI/UX skill routing
Use skills to keep implementation aligned with PiLog’s design system and shadcn discipline.
- Before any UI/UX work (renderer components, layout, typography, microcopy, visual hierarchy, accessibility, settings/onboarding/empty states, tokens, or themed primitives): invoke
/impeccableand follow its setup. If slash commands or skills are unavailable in your harness, readPRODUCT.mdandDESIGN.mdend to end and apply the same constraints (Reading-Room Journal, anti-references, WCAG 2.2 AA, keyboard parity). - When touching shadcn/ui (adding, changing, debugging, or composing primitives under
src/renderer/src/components/ui/or imports from@renderer/components/ui): invoke/shadcn. Prefer existing primitives; add missing ones withpnpm dlx shadcn@latest add <component>(this repo uses pnpm). Afteradd, read the generated files and fix imports, icon library (HugeIcons only), and composition before shipping. - Sandcastle (Claude): the driver mounts host
~/.claude/skillsat/home/agent/.claude/skillsso Claude Code can resolve those skills in-container. Ensure that directory exists on the machine that runs Sandcastle.
Learned User Preferences
- Prefer incremental polish over a full UI redesign when feedback is localized to one surface (for example the Repositories New Issue dialog).
- For sidebar and status-filter polish across Inbox, Runs, and Drafts, treat Inbox as the default visual standard unless the user specifies otherwise.
- Status filters across Inbox, Runs, and Drafts should be clearable; the cleared state shows all statuses instead of forcing a default selection.
- For contextual help or secondary detail in dialogs and sidebars, prefer a compact info-icon hover card (like the Inbox Generate Drafts footer) over large inline disclosures.
- Avoid em dashes in marketing site copy.
Learned Workspace Facts
- For impeccable design context, run
node .claude/skills/impeccable/scripts/context.mjs(or the equivalent under.agents//.cursor/); if context is missing, readPRODUCT.mdandDESIGN.mdat the repo root. - ESLint and Prettier exclude
.agents/,.claude/, and.cursor/harness skill trees from lint/format checks (eslint.config.mjsignores,.prettierignore). .cursor/hooks/state/is listed in.gitignore; hook state and continual-learning index files stay local and are not committed by default.- The shared
Notetype includesrunId: string | null; main-process mapping from SQLite and test fixtures that constructNotevalues must includerunId(fromrun_idornull). - The
.sandcastle/Dockerfileimage is a long-lived sandbox (sleep infinity); typical workflow is build, run with the repo mounted at/home/agent/workspace, then usedocker execfor a shell (unless Sandcastle CLI drives mounts for you). Sandcastle’s ready hook runsCI=true PILOG_SANDBOX=1 pnpm install, which skipsapp:rebuild(avoids flakyelectronjs.orgfetches duringelectron-rebuild). Normal install on the host or for e2e should not rely onPILOG_SANDBOXalone: run a full install/rebuild (pnpm installwithout that flag orpnpm run app:install/app:rebuild) sobetter-sqlite3matches Electron’s ABI. Vitest uses Node’s native module ABI; ifbetter-sqlite3was built only for Electron, local tests can fail with aNODE_MODULE_VERSIONmismatch until you rebuild under the same Node that runs Vitest. - In
src/shared/ipc.ts, optional invoke payloads should be modeled asT | undefined, notT | void, so handlers line up with optional repository arguments and IDE TypeScript agrees with CLI checks. PILOG_BUNDLED_GITHUB_CLIENT_IDis the GitHub OAuth app Client ID for packaged device-flow builds; local dev can useGITHUB_CLIENT_ID, and client secrets only belong to the optional loopback flow.SANDCASTLE_MAX_PARALLEL_ISSUEScaps the number of issues emitted by one planner result; if the planner returns one issue, Sandcastle runs one issue even when the cap is higher. Sandcastle dependency ordering is inferred from issue body text returned bygh issue list; use explicit sections likeBlocked by/Blocksbecause GitHub native parent relationships are not validated by the runner.- In renderer UI, prefer shadcn/Radix
Tooltipover nativetitleattributes for controls so the app avoids double tooltips and keeps styled accessible hints. scripts/site-metadata.test.ts(and similar) should derive expected downloadsoftwareVersion/releaseNotesfromsite/src/data/release-manifest.jsonusing the samestable ?? previewrule assite/src/lib/metadata.ts, not hardcoded preview version strings.- Root
pnpm run verifyruns typecheck, lint, and test in parallel viaconcurrently. - Preview release Git tags must use the
vprefix and matchvX.Y.Z-preview.N(e.g.v0.0.1-preview.10); the Release — Preview workflow validates this format.