# Node Config Lifecycle Hooks & Documentation Infrastructure ## TL;DR > **Quick Summary**: Complete the missing WireGuard lifecycle hooks (`PreDown`, `PostUp`) across the backend API and frontend UI. Simultaneously, establish standard documentation infrastructure using Swagger for the API and VitePress for static HTML documentation. > > **Deliverables**: > - Backend DB Model & API updated with `PreDown` and `PostUp` > - Dashboard UI updated with two new textareas for the hooks > - Swagger UI integrated at `server-core` (`/swagger/index.html`) > - Static HTML docs (VitePress) initialized in `apps/docs` with standard WireGuard guide structures > > **Estimated Effort**: Medium > **Parallel Execution**: YES (Frontend, Backend, and Docs can be built in parallel waves) > **Critical Path**: Backend API update -> Frontend UI update -> Swagger setup -> VitePress setup --- ## Context ### Original Request The user noted that the Node (WgServer) configuration currently lacks inputs for `PreDown` and `PostUp` (only `PreUp` and `PostDown` were present). Additionally, the user requested a plan for establishing HTML documentation (referencing wgdashboard documentation structure) and Swagger API documentation. ### Discussion & Findings - **Backend**: Found `PreUp` and `PostDown` in `apps/server-core/internal/models/models.go` and `apps/server-core/api/servers.go`. - **Frontend**: Found `PreUp` and `PostDown` in `apps/dashboard-ui/src/views/Servers.vue` and `apps/dashboard-ui/src/api/servers.ts`. - **Docs**: Neither `swag` nor `apps/docs` currently exists in the project. ### Self-Review (Metis Simulation) - **Guardrail**: String fields in GORM should use `gorm:"type:text"` to accommodate long bash scripts. - **Guardrail**: Swagger requires running `swag init` to generate `docs/docs.go`, which must be anonymously imported in `main.go`. - **Guardrail**: VitePress should be isolated in `apps/docs` as an independent NPM project to prevent polluting `dashboard-ui`. --- ## Work Objectives ### Core Objective Achieve full parity with WireGuard's standard lifecycle hooks in the database and UI, and lay down the foundation for professional developer and user documentation. ### Must Have - `PreDown` and `PostUp` fields in `WgServer` model. - Swagger annotation for at least the `Servers` endpoints to serve as a template. - VitePress sidebar containing the requested links: Access Remote Server, Add WireGuard Config, Peers, Sign In, Email Service, WebHooks. ### Must NOT Have - Do NOT merge VitePress into `apps/dashboard-ui/package.json`. It must be its own independent app in `apps/docs`. --- ## Execution Strategy ### Parallel Execution Waves ```text Wave 1 (Foundation): ├── Task 1: Update Backend Schema & API (PreDown, PostUp) [quick] └── Task 2: Initialize VitePress HTML Docs [quick] Wave 2 (Integration): ├── Task 3: Update Frontend Dashboard UI (PreDown, PostUp) [visual-engineering] └── Task 4: Setup Swagger API Documentation [deep] Wave FINAL (Verification): ├── Task F1: Plan Compliance Audit ├── Task F2: Code Quality Review └── Task F3: Scope Fidelity Check ``` --- ## TODOs - [x] 1. Update Backend Schema & API (`PreDown`, `PostUp`) **What to do**: - Edit `apps/server-core/internal/models/models.go`: Add `PreDown` and `PostUp` (type string, `gorm:"type:text"`) to the `WgServer` struct. - Edit `apps/server-core/api/servers.go`: - Add `PreDown` and `PostUp` to `CreateServerRequest` and `UpdateServerRequest`. - Map these fields when creating/updating the model inside `CreateServer` and `UpdateServer` handlers. **Recommended Agent Profile**: - **Category**: `quick` - **Skills**: `[]` **Parallelization**: Wave 1 **Acceptance Criteria**: - [ ] `grep -q "PreDown" apps/server-core/internal/models/models.go` passes. - [ ] `grep -q "PostUp" apps/server-core/internal/models/models.go` passes. **QA Scenarios**: ```text Scenario: API accepts PreDown and PostUp Tool: Bash (curl) Preconditions: Server is running Steps: 1. Send a POST or PUT request to `/api/v1/servers` with `pre_down` and `post_up` in JSON payload. Expected Result: Payload is accepted and saved without error. Evidence: .sisyphus/evidence/task-1-api-update.json ``` --- - [x] 2. Initialize VitePress HTML Docs **What to do**: - Create directory `apps/docs`. - Initialize a standard `package.json` for VitePress. - Create `.vitepress/config.mts` with a sidebar structure matching the requested references: - Guides: Sign In, Access Remote Server, Add WireGuard Configuration, Add WireGuard Configuration Peers, Email Service, WebHooks. - Create markdown stubs for all the above pages inside `apps/docs/guides/`. **Recommended Agent Profile**: - **Category**: `quick` - **Skills**: `[]` **Parallelization**: Wave 1 **Acceptance Criteria**: - [ ] `apps/docs/package.json` exists with `vitepress` dependency. - [ ] `apps/docs/.vitepress/config.mts` configures the sidebar properly. - [ ] Markdown stubs exist for all guides. **QA Scenarios**: ```text Scenario: VitePress builds successfully Tool: Bash Preconditions: npm is installed Steps: 1. cd apps/docs && npm install && npm run docs:build Expected Result: Build completes successfully producing static HTML in .vitepress/dist. Evidence: .sisyphus/evidence/task-2-vitepress-build.txt ``` --- - [x] 3. Update Frontend Dashboard UI (`PreDown`, `PostUp`) **What to do**: - Edit `apps/dashboard-ui/src/api/servers.ts`: Add `PreDown?: string` and `PostUp?: string` to the node interface. - Edit `apps/dashboard-ui/src/views/Servers.vue`: - Add two new textarea fields for `PostUp` and `PreDown` in the Add/Edit Node modal. - Order should logically be: `PreUp`, `PostUp`, `PreDown`, `PostDown`. - Ensure reactivity maps these inputs to the payload correctly. **Recommended Agent Profile**: - **Category**: `visual-engineering` - **Skills**: `["vue-ui-futuristic/tailwind-futuristic"]` **Parallelization**: Wave 2 (Depends on Task 1) **Acceptance Criteria**: - [ ] Types updated. - [ ] Form UI contains 4 total textarea boxes for the WireGuard hooks. **QA Scenarios**: ```text Scenario: UI renders new fields Tool: Playwright Preconditions: UI is running Steps: 1. Navigate to Nodes page, click Register Node. Expected Result: PreDown and PostUp textareas are visible. Evidence: .sisyphus/evidence/task-3-ui-fields.png ``` --- - [x] 4. Setup Swagger API Documentation **What to do**: - In `apps/server-core`, add `github.com/swaggo/swag/cmd/swag` and `github.com/swaggo/gin-swagger` via `go get`. - Add standard `@title`, `@version`, `@description` in `main.go`. - Add Swagger annotations (`@Summary`, `@Tags`, `@Accept`, `@Produce`, `@Success`) to the handlers in `api/servers.go`. - Mount `/swagger/*any` using `ginSwagger.WrapHandler(swaggerFiles.Handler)` in the Gin router. - Create a Makefile target `make swagger` inside `apps/server-core/Makefile` (or update existing) that runs `swag init`. Run it once so the `docs/` folder is generated. **Recommended Agent Profile**: - **Category**: `deep` - **Skills**: `[]` **Parallelization**: Wave 2 **Acceptance Criteria**: - [ ] `go.mod` contains swaggo dependencies. - [ ] `/swagger/index.html` serves the API documentation. - [ ] `apps/server-core/docs/swagger.json` exists. **QA Scenarios**: ```text Scenario: Swagger endpoint returns 200 OK Tool: Bash (curl) Preconditions: Server is running Steps: 1. curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/swagger/index.html Expected Result: Output is 200. Evidence: .sisyphus/evidence/task-4-swagger-200.txt ``` --- ## Final Verification Wave - [x] F1. **Plan Compliance Audit** — `oracle` - [x] F2. **Code Quality Review** — `unspecified-high` - [x] F3. **Scope Fidelity Check** — `deep` --- ## Success Criteria ### Verification Commands ```bash # Verify Swagger UI curl http://localhost:8080/swagger/index.html # Verify VitePress Build cd apps/docs && npm run docs:build # Verify Models grep "PreDown" apps/server-core/internal/models/models.go ```