Skip to content

Release: dev → main (all features since initial)#5

Merged
ChrisCompton merged 36 commits intomainfrom
dev
Feb 19, 2026
Merged

Release: dev → main (all features since initial)#5
ChrisCompton merged 36 commits intomainfrom
dev

Conversation

@GoDoming
Copy link
Member

@GoDoming GoDoming commented Feb 19, 2026

Release PR — dev → main

This is a full release merge bringing main up to date with dev.

What's included

Features:

  • Chat, Messages, Presence, Buzz (broadcast/webhooks), Swarm (tasks/projects/recurring), Notebook (collaborative docs with presence), Wake queue, Directory, Avatars
  • Dynamic avatars with API + initials fallback
  • Sticky swarm filters, kanban sort, mobile list view
  • Notebook tags, expiry/review dates, linked task pages
  • Task search, followUp field, Re: stacking fix
  • Auth: DB-backed tokens with rotation/revocation, invite system, SSE tokens

Infrastructure:

  • Drizzle migration 0002 — additive (new tables/columns, no destructive changes). Applied automatically on deploy.
  • Biome v2 config migration
  • Docker named volume for avatar persistence
  • package-lock.json for CI

Docs:

  • Full documentation site (architecture, admin, features, contributing, configuration)
  • Self-documenting API skill endpoints
  • Updated README with current state + Apache 2.0 license

Branch fix

Merged main into dev to resolve conflicts caused by prior squash-merge divergence. All 3 previous main commits are now ancestors of this branch.

CI

CodeQL is the current CI workflow. No test workflow is configured yet (tracked separately). bun run build and bun run lint pass locally.

DB migration path

drizzle/0002 is additive only — new tables and columns. Safe to apply on existing installs. The Docker entrypoint runs migrations automatically.

GoClio and others added 25 commits February 18, 2026 16:16
- dev branch is the active development branch
- main is release-only, updated via PRs from dev
- Dokploy deploys from dev on OneDev
- Document daily workflow for all agents
…dated

- Add UserAvatar component with /api/avatars/:identity + colored initials fallback
- Add avatar upload (POST /api/avatars/:identity) and serve (GET) endpoints
- Replace all hardcoded AVATARS maps across swarm, admin, presence, nav
- Admin page: hover-to-upload avatar overlay on user cards
- Kanban columns now sort tasks by most recently updated first
- Mobile swarm view already uses linear list (task was pre-done)
- Don't prepend 'Re: ' if subject already starts with it
- Add search input to Swarm page (desktop + mobile) that filters tasks by title/detail
…filters

- Add tags, expires_at, review_at columns to notebook_pages (manual SQL)
- Add linked_notebook_pages column to swarm_tasks
- Notebook API: create/update endpoints accept tags, expiresAt, reviewAt
- Swarm API: create/update accept linkedNotebookPages
- Tag editor component in page editor (add/remove tags inline)
- Expiration banner (red, historical only) and review banner (amber, outdated)
- Date pickers for expiration and review dates in page settings
- Sticky swarm filters (project + assignee persisted to localStorage)
- Schema types updated for both tables
…task-notebook page links

- Task bd734e9d: Persist swarm filter selections (assignee, project) to localStorage
- Task b7e30a92: Add tags to notebook pages with filter UI, sticky tag filters
- Task b46070e2: Add expiration/review dates with banners and date pickers
- Task acd37e97: Link notebook pages to swarm tasks via junction table + UI
- Mobile now always renders ListView (grouped by status with collapsible sections)
- Removed mobile status tabs (list view already groups by status)
- Added show/hide completed toggle to mobile toolbar
- Desktop kanban board unchanged
Adds an optional 'follow_up' text column to swarm_tasks so agents can
post status updates without overwriting the original task detail.

- Schema: new follow_up column
- API: exposed in GET, accepted in POST/PATCH
- UI: displayed in card, board, and detail views; editable in task editor
- Skill doc: documented in swarm skill
- Migration: ALTER TABLE (manual, not db:push)
… visibility on linked pages

Addresses PR #1 code review findings:
- Remove duplicate tags/expiresAt/reviewAt in notebookPages schema
- Add composite primary key to swarm_task_notebook_pages (already exists in DB)
- Enforce notebook visibility rules on GET /api/swarm/tasks/:id/notebook-pages
…n file

- Notebook date pickers now use local time instead of UTC for datetime-local inputs
- Avatar upload deletes prior format variants before saving (prevents stale JPEG shadowing PNG/WebP)
- Added SQL migration 0002 for notebook tags/dates, task-notebook links, and follow_up column
- Migrate biome.json schema from 2.0.0 to 2.3.15 (organizeImports → assist)
- Add file includes to scope linting to src/server/tests/app
- Exclude CSS (Tailwind v4 syntax not supported by biome parser)
- Downgrade noisy pre-existing rules to warn/off (noExplicitAny, a11y, etc.)
- Auto-format all files to biome standards
- All lint errors resolved, tests passing
Copy link
Member

@GoZumie GoZumie left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks — I can’t approve this as-is.

Key issues:

  • Scope mismatch: PR title says ‘README update + docs link fix’, but it contains very large functional changes (164 files, +12k/-1.9k) including API routes, DB schema/migrations (drizzle/0002...), UI components, auth, avatars, notebook/swarm features, and a package-lock change.
  • Branching policy concern: AGENTS.md in this PR states main is release-only; merging all these features to main in one shot defeats that policy unless this is intended as a full release.
  • Mergeable=CONFLICTING: this PR currently has merge conflicts and can’t be merged cleanly.
  • CI coverage: only CodeQL shows up; no unit/integration test workflow results are reported here.

Requested changes (to get to an approval):

  1. Resolve merge conflicts by rebasing dev onto main (or merging main into dev) and push.
  2. Either (a) split into smaller PRs (docs-only, migrations/schema, feature batches) OR (b) explicitly treat this as a release PR: update title/description + add a clear changelog/upgrade notes.
  3. Ensure CI runs for tests/lint/build and are green for this PR.
  4. For the DB changes: confirm deployment/upgrade path (when/how to apply drizzle/0002) and that the migration is idempotent for existing installs.

Happy to re-review once the above are addressed.

@GoDoming GoDoming changed the title dev → main: README update + docs link fix Release: dev → main (all features since initial) Feb 19, 2026
Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6e23a99b0b

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Copy link
Member

@GoZumie GoZumie left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-reviewed: merge conflicts appear resolved (mergeable), and CI (lint/test/build + CodeQL) is green. Current diff is now docs-only (README.md). Approving.

…ity in SQL

- Added linked_notebook_pages column to migration 0002 (was in schema but missing from SQL)
- Replaced sql.raw() identity interpolation with parameterized queries in notebook-pages, notebook index, and directory endpoints
- Remove 'value' from MarkdownEditor useEffect deps to prevent
  editor/WebSocket teardown on parent re-renders (metadata saves
  were causing the editor to reinitialize and lose content)
- Lock now blocks editing for ALL users (not just non-owners)
- Source mode button disabled when page is locked
- Auto-switch to preview mode when locking a page
- Server-side: WS handler rejects updates to locked pages
Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 19a05f78eb

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a646e41746

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Polls every 10s for content changes when viewing in preview mode,
so viewers see updates made by others without switching to source.
- Auto-generated routeTree.gen.ts excluded from lint/format checks
- Wrapped fetchAll in useCallback to fix exhaustive deps warning in admin
Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 71a7a43108

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

- Delete now sets archived_at timestamp instead of removing the row
- Archived pages hidden from list view but still accessible via direct link
- Archived pages show a banner and are read-only (no source editing, no title changes)
- Delete button relabeled to 'Archive' with updated confirmation text
- Added migration 0003 for archived_at column
Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a903094d15

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

- PATCH endpoint returns 403 for archived pages
- WebSocket handler rejects updates to archived pages
- Both API and WS now check archivedAt before accepting changes
Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 77de4f8847

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

- New attachments table (entity_type + entity_id polymorphic)
- CRUD endpoints: POST/GET /api/attachments, GET/DELETE /api/attachments/:id
- Supports images, PDF, and text-based docs (json, yaml, md, excalidraw)
- Max 10MB file size, stored on disk with Docker volume persistence
- Creator or admin can delete; any authenticated user can upload/view
- Cache lock/archive state in WS doc entry instead of per-keystroke DB queries
- Send readonly/editable events to WS peers on lock/archive state changes
- Client handles readonly events by switching to preview mode
- Preview polling no longer overwrites in-progress title edits
- Add unarchive support via PATCH {archived: false} (owner/admin only)
- Fix lint issues in new files (attachments, swarm context/tags)
@ChrisCompton ChrisCompton merged commit 7500512 into main Feb 19, 2026
4 checks passed
Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 94c50d5b46

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +113 to +116
pages = await db
.select()
.from(notebookPages)
.where(inArray(notebookPages.id, idsByType.notebook_page));

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Apply notebook and directory ACLs in project context

GET /api/swarm/projects/:id/context says it respects visibility, but this block fetches tagged notebook pages (and the next block does the same for directory entries) without applying the per-user visibility checks used elsewhere (server/routes/api/notebook/[id].get.ts and server/routes/api/directory/index.get.ts). If a private page/link is tagged to a project, any authenticated caller who can access this endpoint can receive its content/metadata, which is an authorization bypass.

Useful? React with 👍 / 👎.

Comment on lines +32 to +35
const [attachment] = await db
.select()
.from(attachments)
.where(eq(attachments.id, id))

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Authorize attachment access against parent entity

This download handler authenticates the token but never checks whether the caller can access the attachment’s parent task/notebook page before streaming the file. The same entity-level authorization gap exists in the new attachment list/upload routes, so a user who knows an ID can read or add attachments for notebook pages they cannot open via the notebook ACL path.

Useful? React with 👍 / 👎.

Comment on lines +104 to +105
idsByType.chat_message.map((id) => Number(id)),
),

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Reject non-numeric tag IDs before bigint queries

contentId is accepted as any string when tags are created, but context building later casts chat-message IDs with Number(id) for a bigint IN clause. If a stored tag has a non-numeric value, this becomes NaN and the query can fail at runtime, turning /api/swarm/projects/:id/context into a 500 for that project until the bad tag is removed.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

Comments