{% extends "_base.html" %} {% from "_macros.html" import modal %} {% block title %}Projects · Urika{% endblock %} {% block heading %}Projects{% endblock %} {% block content %}
{% if projects %} {# Live filter + sort over the rendered DOM. "newest" and "recent" both sort by last_activity desc — when a separate created_at field exists they could diverge. #}
{% else %}

No projects yet. Click + New project above to create one.

{% endif %} {% call modal('new-project', 'New project') %}
Stashed to the project for the builder agent. The create step itself does scan + profile + knowledge ingestion non-interactively; tick "Run interactive setup" below to continue into the agent Q&A wizard.
{# Interactive setup wizard — parity with the agent scoping loop ``urika new`` runs in a TTY. When ticked, the create response redirects to /projects/{name}/builder, which drives the builder Q&A loop over SSE (questions, suggestions, plan, criteria co-draft, refine/accept). #}
Opens the setup wizard after the workspace is created: the project builder asks clarifying questions, suggests experiments, and co-drafts success criteria — same flow as urika new. Uses agent calls (costs tokens).
Web search is ignored (forced off) in private privacy mode. An isolated environment prevents package conflicts between projects — use one if agents will pip install large packages.
{# GitHub auto-create — cross-surface parity with ``urika new --github / --public``. When unchecked, falls back to ``[preferences] github_auto_create`` server-side. When ``gh`` is missing/unauthed, the failure is non-fatal: the project is still created and the response carries the failure detail. #}
Requires the gh CLI installed and authenticated (gh auth login). A missing or unauthed gh is non-fatal — the project is still created and the response notes the failure.
{# v0.4: when private/hybrid is selected AND globals have at least one configured endpoint, render a dropdown listing every named endpoint so the user can pick which one to use. Mirrors the CLI's endpoint-picker. The selected endpoint name is posted as ``private_endpoint_name``; the server resolves it. #} {# Hint shown only when the user picks private/hybrid AND there is no globally-configured endpoint with a non-empty base_url. The Submit button stays clickable on purpose — the server-side 422 is the source of truth; the hint just saves a round trip. #}
{% endcall %} {% endblock %}