Commit Graph

89 Commits

Author SHA1 Message Date
xarmian d136d78cfd fix(web): route empty collection new CTA to create form (BUG-14) (#27) 2026-03-31 16:43:41 -04:00
xarmian 0972347cf0 Fix svelte warnings and add build version info (#26)
* Fix all 17 svelte-check warnings across 7 components

- Add tabindex to toolbar role elements (BoardView, Editor)
- Replace nested buttons with div[role=button] in ListView group headers
- Add role="none" to click-to-close backdrop overlays (Editor, slug page)
- Fix label→span for non-input field labels (CreateWorkspaceModal)
- Add keyboard handlers to interactive divs (CreateWorkspaceModal drop zone, slug page modal)
- Remove unused .slash-backdrop CSS (Editor) and input[type=text] selector (CreateWorkspaceModal)
- Fix state_referenced_locally in RawMarkdownEditor ($state init)
- Add svelte-ignore for conditional tabindex false positive (ToastContainer)

* feat: add build version, commit hash, and timestamp to CLI and web UI

Inject version info via ldflags during build (Makefile, GoReleaser,
Dockerfile). Expose version/commit/build_time in the health API
endpoint and display it in the sidebar footer. Dev builds show
"dev (abc1234 ...)", releases show "v1.2.3 (abc1234 ...)".
2026-03-30 11:54:45 -04:00
xarmian 07ff6faed7 feat: global skill installation registry and detection fixes (#25)
Track all skill installations in ~/.pad/installations.json so
`pad install --update` can update stale skill files across every
project in one shot. Also fixes false Copilot detection on projects
that have .github/ for CI but don't use Copilot.

- Add Installation registry (internal/cli/registry.go) with
  record, prune, status, and update-all operations
- Record installations from all install code paths (install,
  init, skills install, interactive, --all, --update)
- `pad install --list` / `pad skills status` now show tracked
  installations across all projects with freshness indicators
- `pad install --update` / `pad skills update` now update stale
  files globally, not just the current directory
- `pad skills update` and `pad skills status` delegate to the
  same logic as `pad install --update` and `pad install --list`
- Fix Copilot detection: use .github/copilot or .github/instructions
  instead of .github (which exists on most projects for CI)
- Add .codex to agents detection directories
- `pad init` on already-linked workspaces now records existing
  installations in the registry
2026-03-30 11:31:05 -04:00
xarmian a6befde8bf feat: email-based password reset flow (#24)
* feat: email-based password reset flow (IDEA-81)

Add full password reset flow: forgot password request, time-limited
reset tokens (1hr, single-use, SHA-256 hashed), new password form,
and automatic session creation after reset.

* fix: use all: prefix in go:embed to include _-prefixed files

Go's embed package excludes files starting with _ or . when recursing
directories. SvelteKit/Vite occasionally generates chunk filenames with
_ prefixes (e.g. _VLZtjCJ.js), causing them to be silently dropped
from the embedded filesystem and served as HTML by the SPA fallback.

The all: prefix includes everything regardless of filename prefix.
Fixed in both embed.go and the Makefile which regenerates it.

* fix: address PR review — atomic token consumption, error handling, log reset URL

- Replace ValidatePasswordReset + MarkPasswordResetUsed with atomic
  ConsumePasswordReset using UPDATE ... WHERE ... RETURNING to prevent
  race conditions where two concurrent requests consume the same token
- Handle DeleteUserSessions errors (log instead of silently ignoring)
- Log the full reset URL when email is not configured so the admin
  CLI fallback is actually usable
2026-03-29 19:31:16 -04:00
xarmian d94a28c3e8 feat: account settings, email infrastructure, and UX polish (#23)
- Add Account tab to settings: profile editing, password change, API token management
- Add PATCH /api/v1/auth/me endpoint for profile updates with password verification
- Add email sending infrastructure via Maileroo with contextual sender names
- Add Platform settings tab (admin-only) for email configuration with test send
- Add platform_settings table for instance-wide configuration
- Add tab visibility refresh: silently sync data when browser tab regains focus
- Fix filters icon: replace broken Unicode character with proper SVG funnel
- Add cancel invitation support, TypeScript User/APIToken types
2026-03-29 18:29:52 -04:00
xarmian 1da91c4cff feat: reorganize settings page with tabbed layout (IDEA-67) (#22)
Replace the single long-scroll settings page with a 4-tab layout:
General (workspace + theme), Members, Collections, and Danger Zone.
Tab selection persists in the URL hash and survives page refreshes.
2026-03-29 10:55:14 -04:00
xarmian 992690f77d fix: split item detail meta section into two rows for mobile readability (#21)
The meta area (timestamps + action buttons) was a single flex row that
wrapped chaotically on narrow screens. Split it into a `.meta-info` row
for timestamps/save status and a separate `.meta-actions` row for buttons,
both with flex-wrap. Renamed `.history-btn` to `.action-btn` with
consistent sizing (min-width, white-space: nowrap).

Closes IDEA-71
2026-03-29 08:21:52 -04:00
xarmian a49d7606dd fix: prevent layout jump from save status transitions on mobile (#20)
Replace conditional {#if} rendering of save status with always-present
span using opacity transitions. Element stays in the DOM flow so the
flex row never reflows when state changes.
2026-03-29 07:58:35 -04:00
xarmian c7dc653c10 fix: debounce activity entries to prevent autosave flood (#19)
Rapid saves to the same item by the same user within 5 minutes now
coalesce into a single activity entry instead of creating one per save.
SSE events still fire every time for real-time UI updates.
2026-03-29 07:53:36 -04:00
xarmian f5691fd8f6 fix: show activity history on item detail page, not just content versions (#18)
The "History" panel on item detail pages was blank because it only showed
content version snapshots (stored in item_versions). Field changes like
status updates, title edits, and moves generate activity entries but not
content versions, so the panel appeared empty for most items.

Changes:
- Add GET /items/{itemSlug}/activity endpoint to fetch per-item activity
- Update VersionHistory component to fetch both versions AND activity,
  merging them into a unified timeline sorted newest-first
- Deduplicate entries where a version and activity share the same timestamp
- Collapse rapid content autosave bursts (within 5 min) to reduce noise
- Content version entries are expandable with diff view and restore
- Activity entries show field changes, status transitions, moves, etc.
2026-03-28 19:11:44 -04:00
xarmian 4003772538 feat: show user names in activity feeds and real-time events (#17)
Activity entries now display the authenticated user's name instead of
generic "user"/"You" labels. The user_id (already present in the
activities table from migration 012) is persisted when logging activity
and joined against the users table when querying, so actor_name flows
through the API without extra lookups. Falls back to the actor field
value when no user is associated (e.g. pre-auth activities or deleted
users).

Backend:
- Activity model gains UserID and ActorName fields
- Store queries LEFT JOIN users to populate actor_name
- logActivityWithMeta now records currentUserID on every activity
- Dashboard API includes actor_name in recent_activity
- SSE Event struct carries ActorName for real-time toasts
- Item-level activity endpoint added (GET /items/{slug}/activity)

Frontend:
- Activity page shows user name badge (green) instead of "web"
- Dashboard recent activity shows user name inline
- ActivityFeed component displays user name instead of "You"
- SSE toast notifications show user name instead of "CLI"
2026-03-28 19:11:42 -04:00
xarmian b69098d4dd fix: make notification items clickable and keep panel open on navigate (#16)
Change notification rows with links from <button> with goto() to <a>
tags with href, enabling SvelteKit client-side navigation. Remove the
onclose() call so the notification panel stays open after clicking an
item. Add text-decoration/color overrides so <a> tags match the
existing visual style.

Fixes BUG-9.
2026-03-28 16:14:35 -04:00
xarmian a219f81633 fix: CLI and skill file now use issue IDs (TASK-5) instead of slugs (#15)
Agents were using verbose slugs because:
1. The skill file (SKILL.md) taught them to use `<slug>` in every example
2. CLI output showed slugs in parentheses rather than issue IDs
3. CLI usage strings said `<slug>` not `<ref>`
4. JSON output lacked a `ref` field, so agents parsing JSON only saw slugs

Changes:
- Add computed `ref` field to Item model (e.g. "TASK-5") in JSON output
- CLI create/update/delete/edit output now prominently shows issue IDs
- All CLI usage strings changed from `<slug>` to `<ref>`
- Issue IDs displayed in bold cyan (not dim) in list/show/grouped views
- Skill file rewritten to use issue IDs in all examples and instructions
- Dashboard API includes `item_ref`/`ref` in attention, suggestions, phases
- Search results now include item_number and collection_prefix for refs
- CLAUDE.md updated to document issue ID usage
2026-03-28 16:14:32 -04:00
xarmian 46447e5504 feat: user management & authentication (Phase 6) (#14)
* feat: add user management database migration and models

Add migration 012_users.sql with users, sessions, and workspace_members
tables. Add user_id columns to api_tokens, items, comments, activities,
item_links, and item_versions for proper user attribution. Create Go
model structs (User, Session, WorkspaceMember) in models/user.go.

* feat: add store layer for users, sessions, and workspace members

Implement CRUD operations for user management:
- users.go: create, get, update, list, validate password (bcrypt)
- sessions.go: create, validate, delete, cleanup expired (SHA-256 hashed tokens)
- workspace_members.go: add/remove members, role management, access checks

Adds golang.org/x/crypto/bcrypt dependency. Includes 16 new tests
covering all store methods, password validation, session lifecycle,
and workspace membership operations.

* feat: rewrite auth system from single-password to user-based

Replace single-password auth with email/password user authentication:
- New endpoints: POST /auth/register, GET /auth/me
- Rewritten: POST /auth/login (email+password), GET /auth/session
  (needs_setup detection), POST /auth/logout (DB session destroy)
- Delete in-memory SessionManager, use DB-backed sessions via store
- New middleware: SessionAuth (cookie→user), RequireAuth (with
  fresh-install passthrough when no users exist)
- Remove Password field from config, PAD_PASSWORD env var, SetPassword()

All 23 existing server tests pass (fresh DBs have no users → passthrough).

* feat: add workspace access control middleware

Add RequireWorkspaceAccess middleware that checks workspace_members for
authenticated users, with fallback for legacy API tokens and fresh
installs (no users → implicit owner). Includes role hierarchy helpers
(workspaceRole, requireRole) for downstream permission checks.
Wire middleware into the /{slug} workspace route group.

* feat: add CLI auth commands and credential storage

Add pad login, pad logout, pad whoami commands with credential
storage in ~/.pad/credentials.json (0600 permissions). Update CLI
HTTP client to auto-attach auth tokens and X-Pad-Agent header on
all requests. Add auth API methods (Login, Register, Logout,
CheckSession, GetCurrentUser). Extend .pad.toml with optional
agent_name field. Add golang.org/x/term for masked password input.

* feat: derive actor/source from auth context in all handlers

Replace hardcoded "user"/"web" actor/source strings with auth-aware
helpers. actorFromRequest() derives actor ("user"/"agent" via
X-Pad-Agent header) and source ("web"/"cli" from auth method).
agentMeta() merges agent name into activity metadata. Update all
item, document, comment, and move handlers to use request-based
logActivity/logActivityWithMeta. Remove hardcoded CreatedBy/Source
from all CLI commands — server now determines these from auth context.

* feat: frontend auth — login, registration, auth guard, user menu

Rewrite login page with email/password fields, add registration page
for first-time setup, update auth guard to handle needs_setup redirect.
Add user menu to sidebar with logout. Update API client with new auth
methods (register, login with email, session with needs_setup flag).

* feat: migrate API tokens from workspace-scoped to user-owned

API tokens now have a user_id owner and optional workspace_id scope.
CreateAPIToken takes userID as first parameter. ValidateToken resolves
the token's user into the request context. TokenAuth middleware now
sets ctxCurrentUser when a user-owned API token is used. Add user-
scoped endpoints: GET/POST/DELETE /auth/tokens. Keep workspace-scoped
token endpoints for backwards compatibility.

* feat: workspace membership, invitations, and role enforcement

Add workspace_invitations table (migration 013) with join codes.
Implement invitation store methods (create, get by code, accept,
list). Add member management handlers: list members + invitations,
invite (auto-adds existing users or creates invitation), remove
member, change role, accept invitation by code. Add API routes
under /workspaces/{slug}/members/* and /invitations/{code}/accept.
Add CLI commands: pad members, pad invite, pad join.

* feat: auth tests and documentation updates

Add comprehensive auth endpoint tests: registration flow (first user
becomes admin), login/logout, validation errors, duplicate email,
auth enforcement (401 after users exist, exempt paths), /me endpoint.
Update CLAUDE.md and README.md to document user-based auth system,
replacing old PAD_PASSWORD references with pad login/members/invite
workflow and role-based access control.

* feat: add members management UI to workspace settings page

Add Members section to settings with: member list (avatar, name,
email, role), role change dropdown (owner only), remove button
(owner only), pending invitations display with join codes, and
invite form with email + role picker. Add members API methods to
the TypeScript client (list, invite, remove, updateRole).

* fix: backfill workspace owners for pre-migration workspaces

Add backfillWorkspaceOwners() that runs on server start. For any
workspace with no members, adds the first admin user as owner.
This handles the migration case where workspaces existed before the
user system — without it, the members list shows empty.

* feat: shareable invite links with /join/[code] page

Replace raw join codes with full shareable URLs. Server generates
join_url using its configured base URL (e.g. https://pad.example.com/
join/a3f8b2c1). New /join/[code] page handles the full flow: checks
auth → shows login/register if needed → accepts invitation → redirects
to workspace. Settings page shows "Copy invite link" button that copies
URL to clipboard. CLI outputs shareable link instead of raw code.

* fix: auto-add workspace creator as owner, integrate auth into pad init

handleCreateWorkspace now adds the authenticated user as owner of the
new workspace immediately — no more relying on the startup backfill.

pad init now checks auth status before making API calls. If no users
exist, prompts to register. If not logged in, prompts to login. After
auth, proceeds with workspace creation normally.

* fix: add join_url to invite response type in API client

* fix: address codex review — invite registration, logout token revocation, workspace scoping

- Allow registration with valid invitation_code (fixes invite flow for new users)
- Revoke Bearer session tokens on logout, not just cookies
- Filter workspace listing to user's memberships (admins see all)
2026-03-28 15:43:09 -04:00
xarmian 9b0e35a947 fix: revert sticky column header — breaks with nested scroll contexts (#13)
position: sticky on column headers doesn't work because .board-view
has overflow-x: auto on mobile, creating a separate scroll context.
The sticky made headers float over the mobile navbar instead of
pinning correctly. Reverted to non-sticky headers but kept the
drag handle hidden on mobile (still useful).
2026-03-28 12:04:20 -04:00
xarmian 367b81c697 feat: sticky column headers on mobile board view (#12)
Column header sticks to top of viewport when scrolling down through
items on mobile. Page title and filters scroll off naturally, then the
column name (e.g. "Planned (5)") pins at the top so you always know
which column you're in. Also hides drag handle on mobile since column
reordering via drag isn't practical on touch.
2026-03-28 12:01:41 -04:00
xarmian 79ae51c7c1 fix: center-snap mobile board columns for equal peek on both sides (#11)
scroll-snap-align: start → center so the active column is centered
in the viewport with equal peek of adjacent columns on left and right.
2026-03-28 11:56:57 -04:00
xarmian 1fd0911bd9 fix: make adjacent board columns visibly peek on mobile (#10)
- Column width 78vw → 75vw so ~25vw of the next column is visible
- scroll-snap-type mandatory → proximity so the peek persists at rest
- Removed scroll-behavior: smooth for native momentum feel

The previous fix (78vw + mandatory snap) still hid adjacent columns
because mandatory snap forced the viewport to align flush with each
column edge. Proximity snap allows the natural resting position to
show the neighboring column.
2026-03-28 11:54:46 -04:00
xarmian 75f4a48fcb fix: show peek of adjacent columns on mobile board view (#9)
Narrower columns (78vw from 85vw) with start-aligned snap and
horizontal padding so users can see adjacent columns peeking in
from the edges — clear visual affordance that horizontal scrolling
is available.
2026-03-28 11:51:05 -04:00
xarmian 8f2561529b docs: add auth, github integration, and new commands to docs (#8)
- CLAUDE.md: add auth section, auth API endpoints, github/bulk/webhook commands
- README.md: add auth section, standup/changelog/deps/github/webhook commands
2026-03-28 11:43:14 -04:00
xarmian a7d57ea093 fix: show item ref (e.g. TASK-5) in breadcrumb instead of full title (#7)
Breadcrumb now reads "Home / Tasks / TASK-5" instead of
"Home / Tasks / Fix the OAuth redirect bug" — much cleaner navigation.
Falls back to title if no item ref exists.
2026-03-28 11:39:54 -04:00
xarmian a30655aa0e feat: add optional password authentication for web UI (#6)
When PAD_PASSWORD is set (env var) or password is configured in
~/.pad/config.toml, the server requires authentication:

Backend:
- SessionManager with HMAC-SHA256 signed cookies (7-day TTL)
- POST /api/v1/auth/login — validates password, sets session cookie
- GET /api/v1/auth/session — returns auth status (exempt from auth)
- POST /api/v1/auth/logout — destroys session, clears cookie
- PasswordAuth middleware gates all API/page requests
- API tokens still work independently (no change to CLI flow)
- Constant-time password comparison + 500ms delay on failure

Frontend:
- Login page at /login with password form and error handling
- Root layout checks auth status before loading app shell
- Global 401 handler in API client redirects to /login
- Login page renders without sidebar/app shell

When no password is configured, everything works exactly as before
(zero-friction localhost). This is a security requirement for any
deployment that exposes the server beyond localhost.
2026-03-28 11:36:10 -04:00
xarmian 2f39d075d0 feat: GitHub PR integration for Pad items (#5)
* feat: add GitHub PR integration commands

New `pad github` command group for linking GitHub PRs to Pad items:
- `pad github link [item-ref]` — Link current branch's PR to a Pad item,
  with auto-detection of item refs from branch names (e.g. fix/TASK-5-desc)
- `pad github status [item-ref]` — Show PR status for linked items in a table
- `pad github unlink <item-ref>` — Remove a PR link from an item
- `pad show` now displays linked PR info with colored state

PR data stored in the existing fields JSON column — zero migrations needed.
Shells out to `git` and `gh` CLI for git/GitHub interaction.

* fix: github integration refinements

- Fix headRepository field name for gh CLI
- Extract repo from PR URL instead of headRepository response
- Scan all collections for github status (workspace-level items API
  doesn't support the 'all' parameter as a flag)
- Hide github_pr from regular fields display in show command
2026-03-28 11:20:00 -04:00
xarmian d2898edc61 feat: show field change details in dashboard activity section (#4)
Dashboard activity rows now display change metadata inline (e.g.
"status: open → done") when available. Adds parseActivityChanges
helper and subtle muted styling for the change text.
2026-03-28 11:05:57 -04:00
xarmian 2a4fe31103 feat: include field change details in activity metadata (#3)
Item updates now log what actually changed (e.g. "status: open → done,
priority: low → high") in the activity metadata. The activity feed page
already renders meta.changes — this populates it with real diff data.
2026-03-28 10:57:54 -04:00
xarmian a51e145b96 fix: resolve svelte-check type error in TableView component (#2)
page.params.workspace is string | undefined, but EmptyState expects
string. Add fallback to empty string so the type narrows correctly.
Fixes CI failure from svelte-check.
2026-03-28 10:54:03 -04:00
xarmian 52c8348361 fix: enrich activity log entries with item titles and collection info (#1)
The activity list endpoint returned raw entries without item context,
causing the activity page to show bare "Created"/"Updated" verbs.
The dashboard already enriched entries via GetItem() lookups — now the
activity handler does the same, and the frontend reads top-level fields
with metadata fallback.
2026-03-28 10:51:36 -04:00
xarmian fbfaaa8c84 Merge commit '559815f' 2026-03-28 14:17:07 +00:00
xarmian 6ae50f7251 Merge commit 'cf83a60' 2026-03-28 14:16:08 +00:00
xarmian c2527395aa chore: Rebuild embedded assets 2026-03-28 14:15:06 +00:00
xarmian 559815f7a3 Add burndown chart to phase detail pages
Create PhaseChart SVG component showing task completion over time with
an ideal burndown line, actual step chart, and today marker. Wire it
into PhaseTasks (shown when phase has start_date) and pass phaseFields
from the item detail page.
2026-03-28 14:14:32 +00:00
xarmian cf83a60fc2 feat: Add API tokens system for programmatic access
Add a complete API tokens system enabling CI/CD integrations, custom
scripts, and third-party tools to authenticate with the Pad API.

- Migration 011: api_tokens table with hash-based token storage
- Model: APIToken, APITokenCreate, APITokenWithSecret types
- Store: CRUD operations with crypto/rand generation and SHA-256 hashing
- Middleware: Bearer token auth that sets workspace context
- Handlers: POST/GET/DELETE /workspaces/{ws}/tokens endpoints
- CORS: Allow Authorization header for token-based requests
2026-03-28 14:13:50 +00:00
xarmian 51f90fb46e Merge branch 'feat/webhook-cli-and-bulk-ops' 2026-03-28 14:09:00 +00:00
xarmian cdd3dcdc50 fix: Remove incomplete webhook/bulk-update command registrations
The agent registered webhooksCmd() and bulkUpdateCmd() but hasn't
written the implementations yet. Remove the registrations to fix
the build. They'll be re-added when the implementations are complete.
2026-03-28 14:08:53 +00:00
xarmian dc83d7490c feat: Add content templates for collections
Collections can now define a content_template in their settings — a
markdown template that pre-fills new items. When creating a bug report,
for example, the template can include "Steps to Reproduce", "Expected
Behavior", "Actual Behavior" sections automatically.

- Add content_template to CollectionSettings (Go model + TypeScript type)
- Sidebar "New" button uses template when creating items
- Dashboard quick-create buttons use template
- Template is stored in collection settings JSON, configurable via
  the collection edit UI
2026-03-28 14:07:07 +00:00
xarmian dc6ea138b7 feat: Make toast notifications and notification history clickable
Toast notifications from SSE events (agent/CLI item creation) now
include a link to the created item. Clicking the toast navigates
to the item detail page. The notification panel history entries
are also clickable when they have links.

- Toast and HistoryEntry types gain optional `link` field
- ToastContainer renders clickable toasts with hover state and → hint
- NotificationPanel renders linked entries as buttons with hover
- Workspace layout passes item URL to SSE-triggered toasts
2026-03-28 14:04:04 +00:00
xarmian 66d650155c chore: Rebuild embedded assets with updated skill and conventions 2026-03-28 13:56:44 +00:00
xarmian 4708e5bacf docs: Update README, SKILL.md, CLAUDE.md, and add GitHub templates
README: Complete rewrite with value proposition, comparison table,
feature showcase, installation guide, architecture diagram, CLI reference.

SKILL.md: Add standup, changelog, watch, dependencies, and webhooks
to the agent skill so AI tools know about new capabilities.

CLAUDE.md: Document webhooks package, new API endpoints, and all new
CLI commands.

GitHub templates: Bug report and feature request issue templates (YAML),
pull request template with checklist.
2026-03-28 13:55:40 +00:00
xarmian ee932d701d test: Add 23 comprehensive dashboard handler tests
Cover all dashboard computation paths: empty workspace, summary counts,
active items sorting and capping, active phases with progress, overdue
items (due_date and end_date), blocked items via dependency links,
suggested next from active phases, isDoneStatus for all terminal states,
phase completion detection, orphaned tasks, recent activity, item refs,
multiple active phases, and 404 for nonexistent workspaces.
2026-03-28 13:55:31 +00:00
xarmian e6a4bdc986 feat: Redesign web UI with dashboard, activity feed, notifications, and mobile improvements
Dashboard: Complete rewrite as command center with active work cards,
collection grid with status dots and progress bars, phase progress,
side-by-side attention/up-next, skeleton loading, instant creation buttons.

New pages: Activity feed with date grouping, action/source/collection
filters, and pagination. Sidebar navigation link + "View all" from dashboard.

New components: Keyboard shortcuts overlay (press ?), notification center
(bell icon + slide-out panel with toast history), contextual empty states
per collection with agent prompt hints.

Improvements: Command palette with search icon, item refs, colored status
badges. Mobile board horizontal scroll with snap-to-column. Collection
page header with collapsible filter toggle. Saved view tabs. Item detail
relationships section (blocks/blocked-by/wiki-links). Sidebar shows
active item counts only. Mobile header taps to dashboard. PWA manifest.

Bug fix: Mobile sidebar swipe zone reduced to left edge (0-24px) to
avoid conflicts with board horizontal scrolling.
2026-03-28 13:55:23 +00:00
xarmian 86722d7607 feat: Add webhooks, saved views, enhanced dashboard, and dependencies backend
Webhooks:
- Full subsystem with HMAC-SHA256 signing, event filtering, auto-disable
  after 10 failures, test delivery endpoint
- Migration 010_webhooks.sql, model, store CRUD, dispatcher with tests
- Wired into item create/update/delete/move and comment create handlers

Dashboard API:
- active_items: Returns actual in-progress items with refs and priorities
- active_item_count on collections (excludes terminal statuses)
- Blocked item detection in attention (via dependency links)
- isDoneStatus expanded to include cancelled/rejected/fixed/implemented

Saved Views:
- Store CRUD, API handlers, routes for per-collection saved views
- View config stores filters, sort, view_type

Activity:
- Source filtering support (web/cli/agent) in activity list endpoint
2026-03-28 13:55:06 +00:00
xarmian 40fc3eab33 feat: Add standup, changelog, watch, and dependency CLI commands
- pad standup: Auto-generate daily standup from recent activity
  (completed/in-progress/blockers, --days flag, JSON output)
- pad changelog: Generate release notes grouped by collection
  (--days, --since, --phase flags, markdown output for GitHub releases)
- pad watch: Real-time terminal activity stream via SSE
  (colored output, graceful Ctrl+C shutdown)
- pad blocks/blocked-by/deps/unblock: Task dependency management
- Colorized pad init, pad onboard, pad show, and pad status output
  with Active Work section showing in-progress items
2026-03-28 13:54:52 +00:00
xarmian 823afe615c feat: Add terminal colors and improved CLI formatting
Add fatih/color dependency for terminal color output. Status colors
(green=done, yellow=in-progress, blue=open, red=cancelled),
priority colors, item reference numbers in all list output, and
colorized status icons throughout the CLI.
2026-03-28 13:54:41 +00:00
xarmian 6daa8eb68b Add move item between collections with field migration
Full-stack feature: move items between collections (e.g., idea → task)
with automatic field migration.

Backend:
- Field migration engine (items/migrate.go) maps matching fields,
  handles type conversions, drops incompatible fields, applies defaults
- Store method updates collection_id and assigns new item_number
- POST /api/v1/workspaces/{ws}/items/{slug}/move endpoint
- Activity logging with "moved" action and from/to metadata
- 6 migration unit tests covering type matching, conversion, and edge cases

CLI:
- pad move <slug> <target-collection> [--field key=value ...]
- Accepts singular collection names (task, idea, bug, etc.)

Web UI:
- "Move to..." dropdown on item detail page
- Shows all collections except current with icons
- Redirects to the item's new URL after move

Field migration rules:
- Same type: transfer directly (validate select options)
- Compatible types (text↔url, number→text, select→text): auto-convert
- Incompatible types: drop silently
- Missing required target fields: apply defaults or error
2026-03-28 05:01:40 +00:00
xarmian d41842ef7a Enhance dashboard with in-progress focus section and agent activity badges
Dashboard improvements:
- New "In Progress" section at the top showing clickable chips for
  collections with in-progress items — jump straight to what you're
  working on
- Agent activity gets a purple left-border and "AGENT" badge in the
  activity feed, making AI contributions visually distinct
- CLI activity gets a blue "CLI" badge
- Removed redundant "by you via web" text — the badges are cleaner

The dashboard now clearly shows the human-agent collaboration story:
you can see at a glance what the AI has been doing alongside you.
2026-03-28 04:50:34 +00:00
xarmian 5bcdf9a1ab Add keyboard navigation for collection pages
j/k or arrow keys to move between items, Enter to open, Esc to clear
focus. Works in both list and board views. Focused item gets a blue
outline ring and auto-scrolls into view.

Skips keyboard handling when typing in inputs or when the quick-create
bar is open. Doesn't conflict with existing Cmd+K, Cmd+N, etc. global
shortcuts since those all use modifier keys.

This is the kind of keyboard-first navigation that makes developer
tools feel fast — no mouse needed to browse your task board.
2026-03-28 04:48:51 +00:00
xarmian 889c6d3a56 Enhance demo template with playbook, extra convention, and multi-agent refs
The demo workspace now showcases conventions AND playbooks (both key
differentiators), references multi-agent support in the architecture doc,
and has a better description. This is what people see when they run
pad init --template demo to try Pad for the first time.
2026-03-28 04:36:47 +00:00
xarmian 36c2fe25da Add Docker Buildx and GHCR login to release workflow 2026-03-28 04:34:39 +00:00
xarmian a2e5a6622d Add Docker support and PAD_DATA_DIR config
- Multi-stage Dockerfile for building from source
- Dockerfile.goreleaser for GoReleaser-built release images
- GoReleaser config: publish multi-arch Docker images to ghcr.io
- Add PAD_DATA_DIR environment variable for configuring data directory
- Update README with Docker install option
- Add .dockerignore
2026-03-28 04:34:17 +00:00
xarmian 9d0d6cca5e Show toast notifications for external item changes
When the CLI or an agent creates items, the web UI now shows a subtle
toast notification like "Agent created: Fix OAuth redirect" or
"CLI created: New task". Only fires for non-web sources — changes you
make in the browser don't trigger redundant notifications.

This makes the agent collaboration feel alive — you can see items
appearing in real-time as your AI works alongside you.
2026-03-28 04:30:47 +00:00