{% extends "base.html" %} {% block title %}{{ project_name }} · Harbormaster{% endblock %} {% block page_title %}{{ project_name }}{% endblock %} {% block content %} {# v19.0.0a2: tab system. Tabs live above main pane content; URL hash #tab= persists active tab across reloads; keyboard shortcuts 1-5 cycle tabs (skipped when typing in inputs/textareas). The Overview tab carries the existing project header + status; Trajectories tab wraps the existing trajectoryList component (relocated, not duplicated); Memories / Q&A History tabs are placeholders that land in v19.0.0a6 / v19.0.0a5; Settings shows read-only metadata until v19.0.0a4 adds per-project budget edit. #}

{{ project_name }}

{% if project %} last commit: {% if project.last_commit %} {{ project.last_commit.hash }} {% else %} (no git) {% endif %} {% endif %}
{% if project %}

{{ project.brief or "(no description)" }}

{% if project.has_serena %} serena {% endif %} {% if project.has_claude_md %} claude.md {% endif %} {{ project.path }}
{% endif %}

Status

sourced from project_status
{{ status_markdown }}
{% include "_partials/ask_form.html" %} {% include "_partials/delegate_form.html" %}
Select a memory file to edit, or click "+ new" to create one.
unsaved
{# v19.0.0a6: legacy memoriesPanel REMOVED. The v10.0.0a5 viewer + v11/v12/v13/v14/v15 editor stack (the entire `memoriesPanel` Alpine component, its file list, edit toolbar, tag chip editor, history aside, diff panel, new-file form, and the 535- line `function memoriesPanel(initial) { ... }` script) used to live below this comment. It has been replaced wholesale by the split-pane `memoriesEditor` Alpine component at the top of the Memories tab. The new editor reuses the same backend API surface (memory-history, memory-revisions/diff, render-markdown), so server-side bleach-sanitised preview, undo/redo (via local stack), and HTML diff still work — they're just driven by a simpler component with a fixed split-pane layout instead of toggling edit/preview modes inline. Wrapped in {%- if false -%} so Jinja never emits the legacy markup even if some downstream regex stumbles into a stray closing fence. #} {% if false %}

Memories

No memories found

This project doesn't yet have a CLAUDE.md or any .serena/memories/*.md files.

match

Select a file to view.

Tags (frontmatter)

Cmd+Z = previous revision · Cmd+Shift+Z = next revision · position

Create new memory…
{% endif %}

Recent Q&A

No questions asked yet

Use the Ask form above to query this project. Each question + answer pair lands here as a trajectory.

Q&A history

  • No Q&A history yet. Use the Ask form above to query this project — saved questions appear here.
{% if project %}

Metadata

Project name
{{ project.name }}
Path
{{ project.path }}
Last commit
{% if project.last_commit %}{{ project.last_commit.hash }}{% else %}(no git){% endif %}
Language
{{ project.language or 'unknown' }}

Daily call budget

Current effective cap (tightest wins): per-host · per-tool · per-project

{% else %}

Settings are unavailable for remote-host project views.

{% endif %}
{% endblock %} {# v19.0.0a3: project inspector — metadata pulled from the existing `project` context dict (last_commit, language, path) + a budget summary fetched from /api/projects/budget?host=. No new endpoint; data the page already owns is rendered inline. #} {% block inspector %}

Metadata

last commit:
language:
host:
path:
serena memories:
CLAUDE.md:

Budget (24h)

  • calls:
  • usage:
  • tightest cap:

no budget configured

{% endblock %}