{# One project row. Rendered by the dashboard grid loop AND by GET /api/projects/{name}/row for reactive insertion (no full-page reload). `idx` is the row's position for the search/cap visibility gate (0 from the fragment route, so a freshly created project is always shown). The `:style` below reorders rows VISUALLY for a non-name sort via CSS `order` — it does NOT change DOM/tab order (focus + screen-reader order stay A–Z), the deliberate trade for an opt-in cosmetic sort. Don't turn this into a DOM reorder (the anti-pattern the Active zone avoids). #}
{# DES-07: responsive name cap — clamp scales the truncation width with the viewport (narrow phone → ~10rem, wide desktop → 28rem) instead of a fixed 16rem; min-width:0 lets text-truncate shrink inside the flex row. #} {{ p.name }} {% if p.is_git_repo %}Git{% endif %} {% if p.has_claude_md %}CLAUDE.md{% endif %}
How do you want to drive it?

Connectable from claude.ai / Desktop — converse with it, and Stop it here when done.

{# Plain-language effect of the SELECTED mode, inline (not just title=) so it's visible on touch — the riskiest per-launch choice shouldn't hide in a tooltip. #}

{# Spawn only applies to the standard (multi-session) bridge — it maps to `claude remote-control --spawn`. pty is a single interactive session run under the keeper with no `--spawn`, so it ignores these; hide them in pty mode rather than offer no-op choices. #}
{% if pty_supported %} {# Keep d-flex OFF this x-show element — `.d-flex{display:flex!important}` overrides x-show's inline display:none and would pin this hint visible even in standard mode (same bug as the live-tail banners). Flex goes on the inner wrapper. #}

Runs as one session in the project directory.

{% endif %}
Readiness checks for {{ p.name }} before launch

⚠ Trust the files in {{ p.name }}? Launching a session here lets it run tools and execute any code in CLAUDE.md / .claude in this directory.

bypassPermissions lets sessions in {{ p.name }} run tools without asking. Type the project name to confirm.