Blame
|
1 | --- |
||||||
|
2 | ## How to read this document |
||||||
| 3 | ||||||||
| 4 | - **Dependencies** list task IDs that must be complete before this task starts |
|||||||
| 5 | - **Parallel group** identifies tasks that can run simultaneously within a phase |
|||||||
| 6 | - **Target** identifies which repo and branch the work goes into |
|||||||
| 7 | - Tasks are numbered `P{phase}-{sequence}` (e.g., P0-3) |
|||||||
| 8 | - Acceptance criteria are binary — pass or fail, no judgment calls |
|||||||
| 9 | ||||||||
| 10 | --- |
|||||||
| 11 | ||||||||
| 12 | ## Phase 3: Frontend |
|||||||
| 13 | ||||||||
| 14 | **Goal:** SPA for user dashboard, wiki settings, and MCP connection instructions. |
|||||||
| 15 | ||||||||
| 16 | ### P3-1: SPA Scaffold |
|||||||
| 17 | ||||||||
| 18 | **Parallel group:** Phase 3 start |
|||||||
| 19 | **Dependencies:** None (can start anytime — just needs API from P2-4) |
|||||||
| 20 | **Target:** `wikibot-io` repo, `feat/P3-1-spa-scaffold` |
|||||||
| 21 | ||||||||
| 22 | **Description:** |
|||||||
| 23 | Scaffold the frontend application. Choose framework (React or Svelte — manager decides based on ecosystem maturity and team capabilities). Set up build pipeline with Vite, TypeScript, and basic routing. |
|||||||
| 24 | ||||||||
| 25 | **Deliverables:** |
|||||||
| 26 | - `app/frontend/` — scaffolded SPA with routing |
|||||||
| 27 | - Build pipeline (Vite + TypeScript) |
|||||||
| 28 | - Framework decision documented |
|||||||
| 29 | - Basic layout: header, sidebar, content area |
|||||||
| 30 | - Dev server that proxies API requests to the backend |
|||||||
| 31 | ||||||||
| 32 | **Acceptance criteria:** |
|||||||
| 33 | - [ ] `npm run dev` starts local dev server |
|||||||
| 34 | - [ ] `npm run build` produces production bundle |
|||||||
| 35 | - [ ] TypeScript compiles without errors |
|||||||
| 36 | - [ ] Basic routing works (dashboard, login, settings pages as empty shells) |
|||||||
| 37 | - [ ] Framework decision documented with rationale |
|||||||
| 38 | ||||||||
| 39 | --- |
|||||||
| 40 | ||||||||
| 41 | ### P3-2: Auth Flow |
|||||||
| 42 | ||||||||
| 43 | **Parallel group:** Phase 3 |
|||||||
| 44 | **Dependencies:** P3-1, P2-2 |
|||||||
| 45 | **Target:** `wikibot-io` repo, `feat/P3-2-auth-flow` |
|||||||
| 46 | ||||||||
| 47 | **Description:** |
|||||||
| 48 | Frontend authentication: login page with OAuth provider buttons, callback handling, JWT storage, authenticated API requests, logout. |
|||||||
| 49 | ||||||||
| 50 | **Deliverables:** |
|||||||
| 51 | - Login page with Google (and other configured) OAuth buttons |
|||||||
| 52 | - OAuth callback handler (receives auth code, exchanges for platform JWT) |
|||||||
| 53 | - JWT stored in httpOnly cookie or localStorage (decide and document tradeoffs) |
|||||||
| 54 | - API client module that attaches JWT to requests |
|||||||
| 55 | - Protected route wrapper (redirects to login if no valid JWT) |
|||||||
| 56 | ||||||||
| 57 | **Acceptance criteria:** |
|||||||
| 58 | - [ ] Login redirects to WorkOS AuthKit |
|||||||
| 59 | - [ ] Callback exchanges code for JWT |
|||||||
| 60 | - [ ] Authenticated API requests succeed |
|||||||
| 61 | - [ ] Unauthenticated access redirects to login |
|||||||
| 62 | - [ ] Logout clears JWT |
|||||||
| 63 | - [ ] Token refresh works (if implemented) |
|||||||
| 64 | ||||||||
| 65 | --- |
|||||||
| 66 | ||||||||
| 67 | ### P3-3: Dashboard |
|||||||
| 68 | ||||||||
| 69 | **Parallel group:** Phase 3 |
|||||||
| 70 | **Dependencies:** P3-1, P2-4 |
|||||||
| 71 | **Target:** `wikibot-io` repo, `feat/P3-3-dashboard` |
|||||||
| 72 | ||||||||
| 73 | **Description:** |
|||||||
| 74 | User dashboard: list of wikis with metadata, create new wiki button and form. |
|||||||
| 75 | ||||||||
| 76 | **Deliverables:** |
|||||||
| 77 | - Dashboard page: wiki list (name, page count, last accessed) |
|||||||
| 78 | - Create wiki form (slug, display name, optional description) |
|||||||
| 79 | - Empty state for new users |
|||||||
| 80 | - Loading and error states |
|||||||
| 81 | ||||||||
| 82 | **Acceptance criteria:** |
|||||||
| 83 | - [ ] Dashboard shows user's wikis |
|||||||
| 84 | - [ ] Create wiki form validates slug (URL-safe characters, 3-30 chars) |
|||||||
| 85 | - [ ] After creation, displays MCP token and connection instructions |
|||||||
| 86 | - [ ] Wiki list links to wiki web UI and settings page |
|||||||
| 87 | ||||||||
| 88 | --- |
|||||||
| 89 | ||||||||
| 90 | ### P3-4: Wiki Settings |
|||||||
| 91 | ||||||||
| 92 | **Parallel group:** Phase 3 |
|||||||
| 93 | **Dependencies:** P3-3 |
|||||||
| 94 | **Target:** `wikibot-io` repo, `feat/P3-4-wiki-settings` |
|||||||
| 95 | ||||||||
| 96 | **Description:** |
|||||||
| 97 | Wiki settings page: rename wiki, regenerate MCP token, manage collaborators (invite by email, set role, revoke), delete wiki. |
|||||||
| 98 | ||||||||
| 99 | **Deliverables:** |
|||||||
| 100 | - Settings page with tabbed sections (general, collaborators, danger zone) |
|||||||
| 101 | - Collaborator management: invite form, list with role badges, revoke buttons |
|||||||
| 102 | - Token regeneration with confirmation and one-time display |
|||||||
| 103 | - Delete wiki with typed-slug confirmation |
|||||||
| 104 | ||||||||
| 105 | **Acceptance criteria:** |
|||||||
| 106 | - [ ] Can rename wiki display name |
|||||||
| 107 | - [ ] Can regenerate MCP token (shown once, confirmation required) |
|||||||
| 108 | - [ ] Can invite collaborator by email with role selection |
|||||||
| 109 | - [ ] Can change collaborator role |
|||||||
| 110 | - [ ] Can revoke collaborator access |
|||||||
| 111 | - [ ] Can delete wiki (requires typing slug to confirm) |
|||||||
| 112 | ||||||||
| 113 | --- |
|||||||
| 114 | ||||||||
| 115 | ### P3-5: MCP Connection Instructions |
|||||||
| 116 | ||||||||
| 117 | **Parallel group:** Phase 3 |
|||||||
| 118 | **Dependencies:** P3-3 |
|||||||
| 119 | **Target:** `wikibot-io` repo, `feat/P3-5-mcp-instructions` |
|||||||
| 120 | ||||||||
| 121 | **Description:** |
|||||||
| 122 | Page showing how to connect MCP clients to the wiki. Copy-paste `claude mcp add` command with the user's token. Instructions for both Claude.ai (OAuth — just add the URL) and Claude Code (bearer token). |
|||||||
| 123 | ||||||||
| 124 | **Deliverables:** |
|||||||
| 125 | - MCP connection page (accessible from dashboard and wiki settings) |
|||||||
| 126 | - Copy-to-clipboard for `claude mcp add` command |
|||||||
| 127 | - Instructions for Claude.ai (OAuth flow — add URL) |
|||||||
| 128 | - Instructions for Claude Code (bearer token) |
|||||||
| 129 | ||||||||
| 130 | **Acceptance criteria:** |
|||||||
| 131 | - [ ] `claude mcp add` command is correct and copyable |
|||||||
| 132 | - [ ] Claude.ai instructions show the correct MCP endpoint URL |
|||||||
| 133 | - [ ] Token is displayed (from creation) or "regenerate to see" if not first visit |
|||||||
| 134 | ||||||||
| 135 | --- |
|||||||
| 136 | ||||||||
| 137 | ### P3-6: Public Wiki Toggle |
|||||||
| 138 | ||||||||
| 139 | **Parallel group:** Phase 3 |
|||||||
| 140 | **Dependencies:** P3-4, P2-3 |
|||||||
| 141 | **Target:** `wikibot-io` repo, `feat/P3-6-public-toggle` |
|||||||
| 142 | ||||||||
| 143 | **Description:** |
|||||||
| 144 | Toggle in wiki settings to make a wiki publicly readable. When enabled, unauthenticated users can view (but not edit) the wiki via the web UI. |
|||||||
| 145 | ||||||||
| 146 | **Deliverables:** |
|||||||
| 147 | - Toggle switch in wiki settings |
|||||||
| 148 | - API call to update wiki `is_public` flag |
|||||||
| 149 | - Frontend handles public wiki URLs (no auth redirect) |
|||||||
| 150 | ||||||||
| 151 | **Acceptance criteria:** |
|||||||
| 152 | - [ ] Toggle updates DynamoDB `is_public` flag |
|||||||
| 153 | - [ ] Public wiki viewable without login |
|||||||
| 154 | - [ ] Public wiki not editable without login |
|||||||
| 155 | - [ ] Private wiki still requires auth |
|||||||
| 156 | ||||||||
| 157 | --- |
|||||||
| 158 | ||||||||
| 159 | ### P3-7: Static Hosting |
|||||||
| 160 | ||||||||
| 161 | **Parallel group:** Phase 3 (parallel with P3-1 — infrastructure can be set up early) |
|||||||
| 162 | **Dependencies:** P3-1 (needs build output) |
|||||||
| 163 | **Target:** `wikibot-io` repo, `feat/P3-7-static-hosting` |
|||||||
| 164 | ||||||||
| 165 | **Description:** |
|||||||
| 166 | S3 bucket + CloudFront distribution for serving the SPA. Pulumi resources. |
|||||||
| 167 | ||||||||
| 168 | **Deliverables:** |
|||||||
| 169 | - `infra/components/frontend.py` — S3 bucket, CloudFront distribution, OAI |
|||||||
| 170 | - Build and deploy script (upload to S3, invalidate CloudFront) |
|||||||
| 171 | - Custom domain: `wikibot.io` (root domain serves SPA) |
|||||||
| 172 | ||||||||
| 173 | **Acceptance criteria:** |
|||||||
| 174 | - [ ] SPA accessible at `https://wikibot.io/` |
|||||||
| 175 | - [ ] CloudFront serves with correct cache headers |
|||||||
| 176 | - [ ] SPA routing works (all paths serve index.html, client-side routing handles them) |
|||||||
| 177 | - [ ] Build artifacts uploaded to S3 |
|||||||
| 178 | ||||||||
| 179 | --- |
|||||||
| 180 | ||||||||
| 181 | ### P3-8: Phase 3 E2E Test |
|||||||
| 182 | ||||||||
| 183 | **Parallel group:** Phase 3 (final) |
|||||||
| 184 | **Dependencies:** All P3 tasks |
|||||||
| 185 | **Target:** `wikibot-io` repo, `feat/P3-8-e2e` |
|||||||
| 186 | ||||||||
| 187 | **Description:** |
|||||||
| 188 | End-to-end user journey: signup → create wiki → connect MCP → use wiki → manage collaborators. |
|||||||
| 189 | ||||||||
| 190 | **Deliverables:** |
|||||||
| 191 | - `tests/e2e/test_phase3.py` |
|||||||
|
192 | - Results written to Dev/Phase 3 Summary per Agent Conventions documentation loop |
||||||
|
193 | |||||||
| 194 | **Acceptance criteria:** |
|||||||
| 195 | - [ ] New user signs up via OAuth → lands on dashboard |
|||||||
| 196 | - [ ] Creates wiki → sees MCP token and instructions |
|||||||
| 197 | - [ ] Connects Claude.ai via MCP OAuth → can read/write notes |
|||||||
| 198 | - [ ] Connects Claude Code via bearer token → can read/write notes |
|||||||
| 199 | - [ ] Invites collaborator → collaborator can access wiki |
|||||||
| 200 | - [ ] Public wiki toggle → anonymous read access works |
|||||||