184 lines
6.0 KiB
Markdown
184 lines
6.0 KiB
Markdown
# WarpBox Development Rules
|
|
|
|
This guide exists for contributors and LLM agents doing behavior-preserving
|
|
cleanup. It complements [docs/tech.md](docs/tech.md), which maps the current
|
|
implementation.
|
|
|
|
## Cleanup Principles
|
|
|
|
- Keep systems boring and obvious.
|
|
- Prefer short files grouped by one clear responsibility.
|
|
- Prefer narrow helpers over clever abstraction.
|
|
- Keep related functions physically close.
|
|
- Split files when one file mixes multiple domains.
|
|
- Avoid huge utility drawers where unrelated helpers gather.
|
|
- Do behavior-preserving cleanup before feature work.
|
|
- Use tests before and after each cleanup slice.
|
|
|
|
Cleanup is not feature work. Do not change runtime behavior unless the task
|
|
explicitly says to fix behavior.
|
|
|
|
## File Responsibility Goals
|
|
|
|
Files should not mix:
|
|
|
|
- UI and state.
|
|
- Transport and rendering.
|
|
- Validation and routing.
|
|
- Filesystem operations and business rules.
|
|
- Admin workflows and public box workflows.
|
|
|
|
When a file is large and contains multiple concerns, prefer splitting by
|
|
responsibility. Use comment regions only when a file is cohesive and splitting
|
|
would make it harder to follow.
|
|
|
|
Previously split cleanup targets:
|
|
|
|
- `static/js/app.js` now bootstraps `static/js/upload/`.
|
|
- `static/css/upload.css` now lives under `static/css/upload/` and `static/css/components/`.
|
|
- `lib/server/handlers.go` is split by handler responsibility.
|
|
- `lib/boxstore/store.go` is split by storage responsibility.
|
|
- `lib/server/admin.go` is split by admin responsibility.
|
|
- `lib/config/config.go` is split by config responsibility.
|
|
|
|
Do not refactor multiple systems in one cleanup slice.
|
|
|
|
## Comment and JSDoc Guidance
|
|
|
|
Add comments for:
|
|
|
|
- Behavior rules that are easy to break.
|
|
- Edge cases.
|
|
- Concurrency or background worker behavior.
|
|
- Security-sensitive choices.
|
|
- Non-obvious product decisions.
|
|
|
|
Avoid comments that restate code. Prefer clear names and small functions first.
|
|
Use JSDoc only when it clarifies non-obvious inputs, outputs, or side effects.
|
|
|
|
## Go Rules
|
|
|
|
- Keep public routes stable.
|
|
- Keep environment variable names stable.
|
|
- Keep API response shapes stable.
|
|
- Keep manifest JSON field names stable.
|
|
- Keep storage directory layout stable.
|
|
- Keep handler files focused on one handler category.
|
|
- Keep route registration separate from validation and business logic.
|
|
- Return clear wrapped errors when context helps debugging.
|
|
- Avoid package moves unless the cleanup slice is specifically about package
|
|
ownership.
|
|
- Run `gofmt`, `go vet`, and `go test` through `./check.sh`.
|
|
|
|
Server handler files:
|
|
|
|
- `pages.go`
|
|
- `downloads.go`
|
|
- `uploads.go`
|
|
- `box_auth.go`
|
|
- `validation.go`
|
|
- `retention.go`
|
|
|
|
Keep `lib/server/handlers.go` absent unless there is a deliberate reason to
|
|
reintroduce a cohesive handler file.
|
|
|
|
## JavaScript Rules
|
|
|
|
- Use vanilla JavaScript only.
|
|
- Do not add a build step.
|
|
- Keep browser scripts loaded directly by templates.
|
|
- Avoid new globals; centralize mutable upload state when splitting.
|
|
- Keep DOM queries/rendering separate from API calls and upload orchestration.
|
|
- Prefer an action map over long action `if` chains when cleaning event code.
|
|
- Share generic UI helpers through `static/js/warpbox-ui.js`.
|
|
- Preserve existing data attributes and template contracts unless explicitly
|
|
changing behavior.
|
|
|
|
Target upload split when that cleanup slice is chosen:
|
|
|
|
- `static/js/upload/state.js`
|
|
- `static/js/upload/dom.js`
|
|
- `static/js/upload/files.js`
|
|
- `static/js/upload/api.js`
|
|
- `static/js/upload/upload-flow.js`
|
|
- `static/js/upload/options.js`
|
|
- `static/js/upload/popups.js`
|
|
- `static/js/upload/terminal.js`
|
|
- `static/js/upload/events.js`
|
|
- `static/js/app.js` as bootstrap only
|
|
|
|
## CSS Rules
|
|
|
|
- Keep shared styles in shared files.
|
|
- Keep page-specific styles page-scoped.
|
|
- Avoid duplicated popup, toast, button, and window rules.
|
|
- Use page prefixes for page styles:
|
|
- `upload-`
|
|
- `box-`
|
|
- `admin-`
|
|
- Keep visual changes out of behavior-preserving cleanup unless the cleanup
|
|
slice is CSS-only.
|
|
- Preserve template class names unless the same slice updates every use.
|
|
|
|
Target CSS split when that cleanup slice is chosen:
|
|
|
|
- `base.css`
|
|
- `window.css`
|
|
- `components/buttons.css`
|
|
- `components/popups.css`
|
|
- `components/toast.css`
|
|
- `upload/layout.css`
|
|
- `upload/queue.css`
|
|
- `upload/options.css`
|
|
- `upload/dialogs.css`
|
|
- `upload/responsive.css`
|
|
- `box.css`
|
|
- `admin.css`
|
|
|
|
## Template Rules
|
|
|
|
- Keep server-rendered HTML simple.
|
|
- Do not rename public routes during cleanup.
|
|
- Do not change form field names or data attributes unless the matching Go and
|
|
JavaScript code changes in the same slice.
|
|
- Keep static CSS and JS loading explicit.
|
|
- Avoid hidden behavior changes through template conditionals.
|
|
|
|
Current loading model:
|
|
|
|
- Go loads templates from `templates/*.html`.
|
|
- Gin serves `/static` from `./static` with gzip middleware.
|
|
- Templates link CSS directly from `/static/css/...`.
|
|
- Templates load browser JavaScript directly from `/static/js/...`.
|
|
- There is no JavaScript or CSS build step.
|
|
|
|
## Safety Rules
|
|
|
|
- Inspect repository structure before editing.
|
|
- Identify relevant files for the current cleanup slice.
|
|
- Identify how JavaScript and CSS are loaded before frontend cleanup.
|
|
- Identify available test/check commands before editing.
|
|
- Summarize the intended change before editing.
|
|
- Make the smallest useful change.
|
|
- Do not rename public routes.
|
|
- Do not rename environment variables.
|
|
- Do not change API response shapes.
|
|
- Do not change manifest JSON field names.
|
|
- Do not change storage directory layout.
|
|
- Do not add frontend tooling during cleanup.
|
|
- Do not rewrite working code just to make it look different.
|
|
- Do not mix unrelated cleanup areas in one change.
|
|
- Do not claim tests passed unless they actually ran.
|
|
|
|
## Definition of Done
|
|
|
|
For each cleanup slice:
|
|
|
|
- Change scope matches one cleanup area.
|
|
- Behavior is unchanged unless the slice is explicitly a fix.
|
|
- Files have clearer responsibility than before.
|
|
- Comments explain only non-obvious rules or risks.
|
|
- Tests or checks were run and recorded.
|
|
- Any failed command is recorded with the exact reason.
|
|
- Next cleanup slice is clear.
|