enforcement
- test: cover authenticated register, login, upload, list, and download
flow
- test: verify file API routes reject test identity header injection
- test: verify file API routes reject invalid, expired, and malformed
tokens
- test: verify cross-user ownership isolation for all file CRUD
operations
- refactor: rename test-only header constant to clarify it is not used
in production
- feat: add `.agents/skills/playwright-cli/` with complete Skill
markdown, agent interface, and 9 reference files covering session
management, spec-driven testing, video recording, tracing, storage,
request mocking, element attributes, test debugging, and running
custom code
- feat: add `.playwright/cli.config.json` to configure the Playwright
CLI
- feat: add `web/package.json` `playwright:cli` script that resolves
`playwright cli` from the repo root
- build: remove `@playwright/mcp` dependency from `web/package.json`
- build: set `XDG_CACHE_HOME` in `mise.toml`
- build: delete `.codex/config.toml` (MCP server config)
- docs: update `README.md`, `docs/web/roadmap.md`,
`docs/web/decisions.md`, and `web/README.md` to reflect the new
Playwright CLI approach
- build: pin Playwright Test and MCP with repository-local npm, browser, and artifact paths plus sandboxed headless Chromium configuration.
- test: add a browser smoke test for the login page while keeping Playwright isolated from Vitest.
- docs: document Debian dependency setup, dual Chromium revisions, E2E commands, and project-scoped Codex MCP usage.
- feat: connect login and logout to the REST API with session-scoped tokens, protected routing, single-flight refresh, and authenticated query cache cleanup.
- feat: add the Ant Design application shell with root file listing, pagination, small-file upload, and authenticated download.
- test: cover session storage and API retry and error behavior with Vitest.
- docs: document the browser milestone, same-origin API topology, and deferred transfer and account features.
- test: exercise register, login, empty listing, small-file upload, updated listing, and authenticated download through the HTTP router.
- docs: mark the small-file integration flow as covered in the server roadmap.
- docs: move server docs to docs/server/ and update all cross-references
- docs: move web-roadmap.md to docs/web/roadmap.md and create
docs/web/decisions.md
- docs: update AGENTS.md with separate Server and Web sections
- feat: initialize Vite project with React 19, React Router 8, TanStack
Query, Ant Design 6, and Tailwind CSS 4
- feat: add Oxlint with React/TypeScript rules, strict TypeScript
config, and layered CSS import order
- docs: add decision record for client-rendered Web foundation with
React, Ant Design, and Tailwind CSS
- docs: create web roadmap defining architecture boundaries and deferred
dependencies
- build: pin Node.js 24 in mise.toml
- refactor: move HTTP status and DTO concerns out of model and service
layers into API and handler code.
- feat: add admin service boundary and route auth through services
instead of direct repository access.
- test: add architecture and error tests covering package boundaries,
redaction, and service behavior.
- docs: record the protocol-neutral boundary decision and update
architecture and roadmap notes.
- refactor: replace inline AppError literals with model.New*Error
constructors in service and handler layers
- feat: PromoteStaged falls back to copy/delete when os.Rename returns
EXDEV (cross-device link)
- fix: upload error messages no longer leak internal multipart field
names or parser implementation details
- fix: upload size violations are converted to domain error
ErrUploadTooLarge at the handler boundary
- fix: download logs error and size mismatch when io.Copy fails or
writes fewer bytes than expected
- test: add tests for field name leak prevention, parser error
sanitization, read errors after response start, and EXDEV fallback
- fix: replace multipart form parsing with streaming multipart reads and
apply request body limits when max_upload_size is configured.
- refactor: route uploads through staging paths before promotion to
long-term data paths, keeping incomplete uploads out of durable
storage records.
- test: cover oversized uploads, unlimited uploads, staged cleanup, and
local storage promotion boundaries.
- docs: document the staged upload model and multipart parent_id query
parameter.
Replace known development JWT secret placeholders with an ephemeral runtime secret during config loading.
Return LoadInfo so startup can warn when token persistence depends on a stable configured secret.
Update config docs and tests for default, legacy placeholder, custom, env, and empty secret behavior.
- Add GORM dependencies for SQLite and PostgreSQL
- Create domain models (User, Session, File) with common errors
- Implement repository interfaces and database layer with migrations
- Update WebApp to bootstrap with database and repositories
- Add comprehensive unit tests for repository methods
- Update config structure to support multiple database drivers
- Extend AGENTS.md with debugging principles and dependency rules
Add application container, Gin router, graceful shutdown handler,
and version endpoint. This establishes the skeleton for the WebDisk
HTTP API as described in the architecture.
- Add internal/app/WebApp for runtime dependencies and version
- Add internal/server/router with GET /api/v1/version route
- Add graceful shutdown runner with signal handling in cmd/serve
- Add internal/api/ErrorResponse for standard HTTP error body
- Update roadmap, architecture, and decisions documentation
Add initial project structure including:
- Go module with Cobra CLI dependency
- Root command and main entrypoint
- Basic documentation (README, AGENTS.md, architecture, decisions,
development, roadmap)
- Configuration example and gitignore
- Tool version management with mise
- Comprehensive project rules and conventions