Merging to main now runs CI checks only. The release tag (v*) is the
sole trigger for a production :latest image, eliminating the redundant
double-build that previously occurred on every PR merge + tag pair.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Dockerfile: ARG BUILD_VERSION=dev → ENV APP_VERSION baked into image
- ci.yml: BUILD_VERSION passed as build-arg; set to git tag name on v*
tag builds, "dev" on branch builds
- routes/api.py: GET /api/version returns {"version": APP_VERSION}
- SettingsView: fetches /api/version on mount, displays in About section
under General tab
Version source of truth is the git tag (YY.MM.DD.N CalVer).
pyproject.toml / package.json versions are no longer maintained.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Export now includes: projects, milestones, task_logs, note_drafts,
note_versions, push_subscriptions; full user fields (oauth_sub,
session_version); full message fields (status, tool_calls).
Restore v2 builds ID maps for all tables and patches FKs in dependency
order (users → projects → milestones → notes → child records). Notes
restored in two passes to handle self-referential parent_id correctly.
v1 backups still restore via _restore_v1 path (parent_id bug also fixed).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
TaskEditorView:
- Back button standardized to "← Tasks"
- Toolbar now on same row as Write/Preview tabs (flex-direction row)
- Save button and title input inherit gradient/Fraunces from editor-shared.css
TaskViewerView:
- Shimmer skeleton loader replaces plain "Loading..." text
- Task title uses Fraunces font at 2rem
- Edit button becomes primary gradient CTA
- Meta timestamps show clock/pencil SVG icons
- Backlinks section: card grid with colored type badges (note=indigo, task=amber)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
run_research_pipeline now accepts project_id; generation_task.py passes
workspace_project_id when the tool is called from a workspace context.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- WorkspaceNoteEditor: replace toggling list/editor views with always-visible
left rail (155px) showing note list alongside editor pane; persist last-open
note per project in localStorage (workspace_note_{projectId})
- WorkspaceTaskPanel: add priority dot + due date on task rows; replace full
overlay detail with bottom-split (44% list / 56% detail); close button
replaces back nav; active row highlighted; fade transition
- WorkspaceView: show project goal in header instead of 'Workspace'; non-equal
panel widths (0.8fr / 1.1fr / 1.1fr); empty chat quick-action chips (Project
status / New note / Add tasks); prefill() helper
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces the flat sorted list with date-aware sections that surface what
needs attention first. Completed tasks go into a collapsed section at the
bottom. Grouped-by-project mode is preserved as the second toggle option.
TaskCard compact restored to card hover/lift style.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Planning artifacts (specs/plans) generated by Claude Code sessions don't belong
in the repo. Removing existing files and ignoring the directory going forward.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- NotesListView: skeleton shimmer for grid and list modes; grid columns change from fixed 3 to auto-fill(260px)
- NoteCard compact: flat border-bottom row style instead of stacked mini-cards; gradient fade mask on grid preview text
- TaskCard compact: flat border-bottom row style; show up to 2 tags
- TasksListView: gradient + shadow on New Task button (matches NotesListView)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ports UserManagementView logic (users list, invitations, registration
toggle) directly into SettingsView as a lazy-loaded 'users' admin tab.
Adds loadLogsPanel stub for Task 4. Adds apiDelete import and User type
import at script top.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove the gear dropdown menu from AppHeader; cog icon is now a plain
router-link to /settings. Admin-only /admin/users and /admin/logs routes
are replaced with redirects to /settings. Mobile menu admin links removed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Hero card: last-active project (by most recent note/task updated_at),
prominent 'Open Workspace' button, milestone bars, 5 recent items,
highest-priority next-up todo task
- Projects grid: all other active projects with small workspace button,
urgency badges (in progress / todo count), milestone bars, hover lift
- Inbox section: collapsible strip of orphaned tasks + notes (no project)
- Skeleton shimmer replaces plain 'Loading...' text
- Chat widget + quick actions unchanged at top
Backend additions used: ?no_project=true on both /api/notes and
/api/tasks; ?project_id= on /api/tasks (committed separately)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
TaskViewerView:
- Add '→ In Progress' / '→ Done' advance button in toolbar (forward-only,
hidden when status is already done)
- Styled with primary indigo gradient to distinguish from secondary actions
TaskEditorView:
- showPreview now defaults false; set to true after load only when body
has content — empty tasks open directly in Write mode
- Save on an existing task now calls window.location.reload() so the
preview/edit mode re-evaluates from the freshly persisted body
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Nav padding: 0.5rem → 0.75rem vertical, 1.25rem → 1.5rem horizontal
- AppLogo size: 24px → 34px so the book detail is legible
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Previously the empty-conversation cleanup only fired when switching
between chats (convId watcher). Navigating to /notes, /tasks, etc.
left orphaned untitled empty conversations. onUnmounted now runs the
same check, deleting the current conversation if message_count === 0.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- theme.css: darken user bubble text (#3a3a4a light / #b0b0c8 dark) for better readability
- AppHeader: highlight Chat nav link when on any /chat/* route (was only active on exact /chat)
- summary.md: document workspace, graph, queue persistence, ToolCallCard direct-API, dedup scoping
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Matches the ChatView.vue update from the UI polish pass — queued bubbles
use linear-gradient(135deg, #6366f1, #4f46e5) and 18px border-radius
consistent with the Illuminated Transcript design language.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
.logo-book fill was var(--color-text) which renders black in light mode.
Changed to var(--color-primary) so it matches the brand indigo in both
modes. Stroke updated to match at 70% opacity.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Design direction: "Illuminated Transcript" — the AI response is the
primary artifact; user prompts are subordinate margin notes.
ChatMessage.vue:
- User bubble: ghosted background (rgba 3-4% opacity), muted text,
thin near-invisible border. De-emphasized, recessed.
- Assistant bubble: left indigo accent border (2px), elevated shadow
via --color-bubble-asst-shadow. Commands attention.
- Assistant role label: indigo (var(--color-primary)); user label muted.
- Removed old white-override content rules (no longer on dark bg).
- Thinking block: full border → left-only indigo accent bar (35% opacity),
removed inner top border.
ChatView.vue:
- Streaming bubble: same left accent + shadow as assistant bubbles.
- Streaming role label: indigo to match ChatMessage.
- Thinking block in streaming: same treatment as ChatMessage.
theme.css:
- Added --color-bubble-user-bg/border/text for light + dark.
- Added --color-bubble-asst-shadow for light + dark.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces docker-ce-cli (requiring external Docker apt repo) with
docker.io from Ubuntu 24.04 main, which is sufficient for docker login
and working alongside buildx.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Single combined layer was ~280MB and consistently failed to push with
499 (nginx closing connection). Split into three layers (~70-100MB each)
so each is pushed independently and stays within the timeout.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
docker/login-action requires the docker CLI binary in the job container.
The daemon is provided by the host socket mount; only the CLI is needed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ubuntu 24.04 blocks pip install into the system Python by default.
Add --break-system-packages for the lint job's throwaway container.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Labels are defined in act-runner-config.yml which is the authoritative
source. The env var is only used on first registration and was being
ignored after .runner was created.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The label now explicitly declares the dependency versions it provides
rather than using the opaque ubuntu-latest alias. All runs-on fields
in ci.yml updated to match.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Move ubuntu-latest → runner-base:py3.12-node22 mapping into
act-runner-config.yml so it is respected at runtime. The
GITEA_RUNNER_LABELS env var is only honoured on first registration
and was being ignored after the runner's .runner file was created.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- infra/Dockerfile.runner-base: new Ubuntu 24.04 image with Python 3.12
and Node 22 LTS pre-installed, tagged py3.12-node22. Eliminates the
~3-4 min deadsnakes PPA install that ran on every test job.
- infra/runner-compose.yml: update ubuntu-latest label to use
runner-base:py3.12-node22 instead of node:20-bullseye.
- .forgejo/workflows/ci.yml: remove Python 3.12 install steps (now in
base image), add actions/cache for pip keyed on pyproject.toml hash,
bump node-version 20 → 22.
- Dockerfile: bump frontend build stage node:20-alpine → node:22-alpine.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
create_note now only checks against existing notes (is_task=False);
create_task only checks against existing tasks (is_task=True). All three
checks (exact title, fuzzy title, semantic similarity) pass the type
filter through to list_notes and semantic_search_notes.
Adds is_task param to semantic_search_notes() so callers can restrict
results to notes or tasks independently.
Prevents a note titled "Design enemy AI" from blocking a task with the
same title, and vice versa.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>