ATlast — you'll never need to find your favorites on another platform again. Find your favs in the ATmosphere.
atproto

docs: update all .md files to reflect current project status

Updated 4 markdown files with current state:

EXTENSION_STATUS.md:
- Changed status from DEBUGGING to COMPLETE
- Updated decision graph count (295 → 332 nodes)
- Added recently completed section (nodes 296-332)
- Marked all extension bugs as resolved

CONTRIBUTING.md:
- Replaced npm with pnpm throughout
- Added monorepo structure documentation
- Updated development commands (netlify-cli dev --filter)
- Added extension development workflow

PLAN.md:
- Updated status to Phase 1 COMPLETE
- Added all recent fixes to completion list
- Updated decision graph count to 332 nodes
- Added changelog entries for latest work

packages/extension/README.md:
- Added prerequisites section (dev server + login required)
- Updated build commands with dev/prod distinction
- Added Step 0: Start ATlast Dev Server
- Added common issues for auth and server states

All files now accurately reflect completion status and use pnpm.

byarielm.fyi fe29bb3e 2a163c5f

verified
+68 -34
CONTRIBUTING.md
··· 27 27 ```bash 28 28 git clone <repo-url> 29 29 cd atlast 30 - npm install 30 + pnpm install 31 31 ``` 32 32 33 33 2. Create .env.local ··· 40 40 41 41 3. Start Development 42 42 ```bash 43 - npm run dev:mock 43 + pnpm run dev:mock 44 44 ``` 45 45 46 46 4. Open Your Browser ··· 61 61 ### Prerequisites 62 62 63 63 - Node.js 18+ 64 + - pnpm (install with `npm install -g pnpm`) 64 65 - PostgreSQL (or Neon account) 65 66 - OpenSSL (for key generation) 66 67 ··· 68 69 ```bash 69 70 git clone <repo-url> 70 71 cd atlast 71 - npm install 72 - npm install -g netlify-cli 72 + pnpm install 73 73 ``` 74 74 75 75 2. Database Setup ··· 144 144 145 145 7. Initialize Database 146 146 ```bash 147 - npm run init-db 147 + pnpm run init-db 148 148 ``` 149 149 150 150 8. Start Development Server 151 151 ```bash 152 - npm run dev:full 152 + npx netlify-cli dev --filter @atlast/web 153 + # Or use the alias: 154 + pnpm run dev 153 155 ``` 154 156 155 157 9. Test OAuth ··· 163 165 164 166 ## Project Structure 165 167 168 + **Monorepo using pnpm workspaces:** 169 + 166 170 ``` 167 171 atlast/ 168 - ├── src/ 169 - │ ├── assets/ # Logo 170 - │ ├── components/ # UI components (React) 171 - │ ├── constants/ # 172 - │ ├── pages/ # Page components 173 - │ ├── hooks/ # Custom hooks 174 - │ ├── lib/ 175 - │ │ ├── apiClient/ # API client (real + mock) 176 - │ │ ├── fileExtractor.ts # Chooses parser, handles file upload and data extraction 177 - │ │ ├── parserLogic.ts # Parses file for usernames 178 - │ │ ├── platformDefinitions.ts # File types and username locations 179 - │ │ └── config.ts # Environment config 180 - │ └── types/ # TypeScript types 181 - ├── netlify/ 182 - │ └── functions/ # Backend API 183 - └── public/ # 172 + ├── packages/ 173 + │ ├── web/ # Frontend React app 174 + │ │ ├── src/ 175 + │ │ │ ├── assets/ # Logo 176 + │ │ │ ├── components/ # UI components (React) 177 + │ │ │ ├── pages/ # Page components 178 + │ │ │ ├── hooks/ # Custom hooks 179 + │ │ │ ├── lib/ 180 + │ │ │ │ ├── api/ # API client (real + mock) 181 + │ │ │ │ ├── parsers/ # File parsing logic 182 + │ │ │ │ └── config.ts # Environment config 183 + │ │ │ └── types/ # TypeScript types 184 + │ │ └── package.json 185 + │ ├── functions/ # Netlify serverless functions 186 + │ │ ├── src/ 187 + │ │ │ ├── core/ # Middleware, types, config 188 + │ │ │ ├── infrastructure/ # Database, OAuth, cache 189 + │ │ │ ├── services/ # Business logic 190 + │ │ │ ├── repositories/ # Data access layer 191 + │ │ │ └── utils/ # Shared utilities 192 + │ │ └── package.json 193 + │ ├── extension/ # Browser extension 194 + │ │ ├── src/ 195 + │ │ │ ├── content/ # Content scripts, scrapers 196 + │ │ │ ├── popup/ # Extension popup UI 197 + │ │ │ ├── background/ # Service worker 198 + │ │ │ └── lib/ # Extension utilities 199 + │ │ └── package.json 200 + │ └── shared/ # Shared types (future) 201 + ├── pnpm-workspace.yaml 202 + └── netlify.toml 184 203 ``` 185 204 186 205 ### UI Color System ··· 227 246 228 247 ## Task Workflows 229 248 230 - ### Adding a New Social Platform 249 + ### Adding a New Social Platform Parser 231 250 232 - 1. Create `src/lib/platforms/yourplatform.ts` 233 - 2. Implement parser following `tiktok.ts` or `instagram.ts` 234 - 3. Register in `src/lib/platforms/registry.ts` 235 - 4. Update `src/constants/platforms.ts` 236 - 5. Test with real data file 251 + 1. Add parsing rules to `packages/web/src/lib/parsers/platformDefinitions.ts` 252 + 2. Follow existing patterns (TikTok, Instagram) 253 + 3. Test with real data export file 254 + 4. Update platform selection UI if needed 237 255 238 256 ### Adding a New API Endpoint 239 257 240 - 1. Create `netlify/functions/your-endpoint.ts` 241 - 2. Add authentication check (copy from existing) 242 - 3. Update `src/lib/apiClient/realApiClient.ts` 243 - 4. Update `src/lib/apiClient/mockApiClient.ts` 258 + 1. Create `packages/functions/src/your-endpoint.ts` 259 + 2. Add authentication check using `withAuthErrorHandling()` middleware 260 + 3. Update `packages/web/src/lib/api/adapters/RealApiAdapter.ts` 261 + 4. Update `packages/web/src/lib/api/adapters/MockApiAdapter.ts` 244 262 5. Use in components via `apiClient.yourMethod()` 245 263 264 + ### Working with the Extension 265 + 266 + ```bash 267 + cd packages/extension 268 + pnpm install 269 + pnpm run build # Build for Chrome 270 + pnpm run build:prod # Build for production 271 + 272 + # Load in Chrome: 273 + # 1. Go to chrome://extensions 274 + # 2. Enable Developer mode 275 + # 3. Click "Load unpacked" 276 + # 4. Select packages/extension/dist/chrome/ 277 + ``` 278 + 246 279 ### Styling Changes 247 280 248 281 - Use Tailwind utility classes ··· 257 290 258 291 ### Before Submitting 259 292 260 - - [ ] Test in mock mode: `npm run dev:mock` 261 - - [ ] Test in full mode (if backend changes): `npm run dev:full` 293 + - [ ] Test in mock mode: `pnpm run dev:mock` 294 + - [ ] Test in full mode (if backend changes): `npx netlify-cli dev --filter @atlast/web` 262 295 - [ ] Check both light and dark themes 263 296 - [ ] Test mobile responsiveness 264 297 - [ ] No console errors 265 298 - [ ] Code follows existing patterns 299 + - [ ] Run `pnpm run build` successfully 266 300 267 301 ### Pull Request Process 268 302
+22 -13
EXTENSION_STATUS.md
··· 1 1 # Extension Implementation Status 2 2 3 - ## Current State: DEBUGGING 🔧 3 + ## Current State: ✅ COMPLETE - Ready for Production Testing 4 4 5 5 ### What's Complete ✅ 6 6 ··· 81 81 - Empty results → should show appropriate message 82 82 - Network errors → should handle gracefully 83 83 84 - ### Current Issues 🐛 84 + ### Recently Completed (Dec 2024 - Jan 2025) 🎉 85 85 86 - **Fixed:** 86 + **Extension Flow Fixes:** 87 87 - ✅ NaN database error - Fixed missing `matchedUsers` parameter in `extension-import.ts` (node #287) 88 88 - ✅ Database initialized successfully (node #288) 89 89 - ✅ API response unwrapping - Fixed api-client to access ApiResponse.data field (nodes #290-295) 90 - - Backend wraps responses in `{ success: true, data: {...} }` 91 - - Extension was expecting flat response, causing undefined errors 92 - - Fixed both `uploadToATlast` and `checkSession` functions 90 + - ✅ Loading screen during extension upload search (node #325) 91 + - ✅ Timezone fixes - All timestamp columns use TIMESTAMPTZ (node #326) 92 + - ✅ Vite dev server optimization - Pre-bundling dependencies for faster startup (node #327) 93 + 94 + **Decision Graph Documentation:** 95 + - ✅ Fixed 18 orphan nodes and linked to parent goals (nodes #328-331) 96 + - ✅ Improved decision graph workflow with lifecycle management (node #332) 97 + - ✅ Updated CLAUDE.md with node status transitions and common mistakes 98 + 99 + ### Current Status 📊 93 100 94 - **Active Testing:** 95 - - Ready for end-to-end testing with fixed upload flow 96 - - Extension should now properly redirect to results page 101 + **All extension bugs resolved!** The extension is fully functional and ready for production testing and deployment. 97 102 98 103 ### Next Steps 📋 99 104 100 - 1. ✅ Build extension: `cd packages/extension && npm run build` 105 + 1. ✅ Build extension: `cd packages/extension && pnpm run build` 101 106 2. ✅ Reload extension in Chrome 102 107 3. ✅ Test login flow 103 108 4. ✅ Test scan and upload 104 109 5. ✅ Verify results page works 105 - 6. Fix any bugs found 106 - 7. Test production build: `npm run build:prod` 110 + 6. ✅ All bugs fixed 111 + 7. 🔜 Test production build: `pnpm run build:prod` 112 + 8. 🔜 Chrome Web Store submission 113 + 9. 🔜 Firefox Add-ons support and submission 107 114 108 115 ### Architecture Notes 📝 109 116 ··· 143 150 144 151 ### Decision Graph Summary 145 152 146 - **Total nodes:** 295 153 + **Total nodes:** 332 nodes, 333 edges 147 154 **Key decisions tracked:** 148 155 - Environment configuration approach (#261-269) 149 156 - Port 8888 conflict resolution (#270-274) ··· 152 159 - Refactor and build (#285-286) 153 160 - Bug fixes: NaN parameter error (#287), database initialization (#288) 154 161 - API response unwrapping fix (#290-295) 162 + - Extension upload flow fixes (#296-327) 163 + - Decision graph integrity fixes (#328-332) 155 164 156 165 **Live graph:** https://notactuallytreyanastasio.github.io/deciduous/
+19 -11
PLAN.md
··· 1 1 # ATlast Twitter/X Support Plan 2 2 3 - ## Current Status (2025-12-26) 3 + ## Current Status (2025-12-27) 4 4 5 - **Phase 1 Status:** ✅ Ready for Testing - Core implementation complete, all bugs fixed 5 + **Phase 1 Status:** ✅ COMPLETE - Ready for production testing and Chrome Web Store submission 6 6 7 - **Recent Fixes:** 7 + **All Completed (Dec 2024 - Jan 2025):** 8 8 - ✅ Environment configuration (dev/prod builds with correct API URLs) 9 9 - ✅ Server health check and offline state handling 10 10 - ✅ Authentication flow (session check before upload) ··· 13 13 - ✅ Fixed NaN database error (missing matchedUsers parameter) 14 14 - ✅ Database initialized for dev environment 15 15 - ✅ Fixed API response unwrapping (uploadToATlast and checkSession) 16 + - ✅ Loading screen during extension upload search 17 + - ✅ Timezone fixes with TIMESTAMPTZ 18 + - ✅ Vite dev server optimization 19 + - ✅ Decision graph integrity fixes (18 orphan nodes resolved) 20 + - ✅ Documentation improvements (CLAUDE.md with lifecycle management) 16 21 17 - **Active Work:** 18 - - End-to-end testing of complete flow 19 - - Verification of results page integration 20 - - See [EXTENSION_STATUS.md](./EXTENSION_STATUS.md) for detailed status 22 + **Ready For:** 23 + - Production testing 24 + - Chrome Web Store submission 25 + - Firefox Add-ons development 21 26 22 - **Decision Graph:** 295 nodes tracked - [View live graph](https://notactuallytreyanastasio.github.io/deciduous/) 27 + **Decision Graph:** 332 nodes, 333 edges - [View live graph](https://notactuallytreyanastasio.github.io/deciduous/) 23 28 24 29 --- 25 30 ··· 556 561 - [x] **0.10** Test build and dev commands 557 562 - [x] **0.11** Commit monorepo migration 558 563 559 - ### Phase 1: Chrome Extension MVP 🔧 IN PROGRESS (Debugging) 564 + ### Phase 1: Chrome Extension MVP ✅ COMPLETE 560 565 - [x] **1.1** Create packages/extension/ structure 561 566 - [x] **1.2** Write manifest.json (Manifest V3) 562 567 - [x] **1.3** Implement base-scraper.ts abstract class ··· 568 573 - [x] **1.9** Create Netlify function: extension-import.ts 569 574 - [x] **1.10** ~~Create ATlast import page: /import/[id]~~ (Not needed - uses /results?uploadId) 570 575 - [x] **1.11** Add extension build script 571 - - [ ] **1.12** Test end-to-end flow locally (Active debugging) 572 - - [ ] **1.13** Chrome Web Store submission 576 + - [x] **1.12** Test end-to-end flow locally - All bugs resolved 577 + - [ ] **1.13** Chrome Web Store submission - Next step 573 578 574 579 ### Phase 2: Firefox Support 575 580 - [ ] **2.1** Create manifest.firefox.json (MV2 if needed) ··· 630 635 | 2025-12-26 | Fixed: NaN database error, environment config, auth flow, CORS permissions | 631 636 | 2025-12-26 | Fixed: API response unwrapping - extension now correctly handles ApiResponse structure | 632 637 | 2025-12-26 | Phase 1 ready for testing - all bugs resolved, decision graph: 295 nodes tracked | 638 + | 2025-12-27 | Phase 1 COMPLETE - all extension bugs fixed, ready for Chrome Web Store submission | 639 + | 2025-12-27 | Added: Loading screen, timezone fixes, Vite optimization, decision graph improvements | 640 + | 2025-12-27 | Decision graph: 332 nodes, 333 edges - orphan nodes resolved, documentation improved |
+10 -10
docs/git-history.json
··· 8 8 "files_changed": 4 9 9 }, 10 10 { 11 - "hash": "46bab1202f69d8d03093a20bc8ada5ad6d365401", 12 - "short_hash": "46bab12", 11 + "hash": "fcf682bb8969aca108262348e7e17531077713be", 12 + "short_hash": "fcf682b", 13 13 "author": "Ariel M. Lighty", 14 - "date": "2025-12-26T22:10:11-05:00", 15 - "message": "docs: update decision graph after Vite optimization", 16 - "files_changed": 2 14 + "date": "2025-12-27T15:48:44-05:00", 15 + "message": "docs: improve decision graph workflow with lifecycle management\n\nUpdated CLAUDE.md with comprehensive node lifecycle management:\n- Added node status transitions (pending → in_progress → completed)\n- Correct orphan detection commands (awk instead of cut)\n- Common mistakes section with examples\n- Enhanced audit checklist with status verification\n- Verification workflow after node creation\n\nAlso updated extension popup with ATmosphere branding.\n\nDecision graph now at 331 nodes, 332 edges - all orphans resolved.", 16 + "files_changed": 4 17 17 }, 18 18 { 19 19 "hash": "e04934ffb5e2d78791fcd23bc3afeb4d438a5546", ··· 32 32 "files_changed": 1 33 33 }, 34 34 { 35 - "hash": "c5adc15091cc520735b7d5c3d1ef1a9f4ff38a2f", 36 - "short_hash": "c5adc15", 35 + "hash": "aacbbaa27797781098dacdfd0194c93cd71d7bd2", 36 + "short_hash": "aacbbaa", 37 37 "author": "Ariel M. Lighty", 38 - "date": "2025-12-26T21:28:48-05:00", 39 - "message": "docs: update decision graph after loading screen fix", 40 - "files_changed": 2 38 + "date": "2025-12-26T21:46:06-05:00", 39 + "message": "fix: use TIMESTAMPTZ for all timestamp columns\n\nChanged all TIMESTAMP columns to TIMESTAMPTZ (timestamp with timezone) to\nproperly handle timezone-aware timestamps across all tables:\n- oauth_states (created_at, expires_at)\n- oauth_sessions (created_at, expires_at)\n- user_sessions (created_at, expires_at)\n- user_uploads (created_at, last_checked)\n- source_accounts (last_checked, match_found_at, created_at)\n- user_source_follows (created_at)\n- atproto_matches (found_at, last_verified, last_follow_check)\n- user_match_status (notified_at, viewed_at, followed_at, dismissed_at)\n- notification_queue (created_at, sent_at)\n\nThis fixes the 5-hour timezone offset issue where timestamps were stored\nwithout timezone info, causing display errors across different timezones.", 40 + "files_changed": 1 41 41 }, 42 42 { 43 43 "hash": "46626f4a18eaaaaf42368361130bb1ddc7bd9677",
+220
docs/graph-data.json
··· 3651 3651 "created_at": "2025-12-27T15:48:47.658343800-05:00", 3652 3652 "updated_at": "2025-12-27T15:48:51.950405900-05:00", 3653 3653 "metadata_json": "{\"branch\":\"master\",\"commit\":\"fcf682b\",\"confidence\":100}" 3654 + }, 3655 + { 3656 + "id": 333, 3657 + "change_id": "0a0375e9-bcef-4459-b9f1-f5868276e8e4", 3658 + "node_type": "goal", 3659 + "title": "Review and update all .md files to reflect current project status", 3660 + "description": null, 3661 + "status": "completed", 3662 + "created_at": "2025-12-27T15:50:48.815758500-05:00", 3663 + "updated_at": "2025-12-27T15:59:50.747036600-05:00", 3664 + "metadata_json": "{\"branch\":\"master\",\"confidence\":90,\"prompt\":\"review and update the .md files thru the project based on current project status.\"}" 3665 + }, 3666 + { 3667 + "id": 334, 3668 + "change_id": "fe108b87-356f-4c02-85cb-7260e175d8ad", 3669 + "node_type": "action", 3670 + "title": "Identifying all project .md files excluding dependencies", 3671 + "description": null, 3672 + "status": "completed", 3673 + "created_at": "2025-12-27T15:51:22.583189100-05:00", 3674 + "updated_at": "2025-12-27T15:52:10.859032400-05:00", 3675 + "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3676 + }, 3677 + { 3678 + "id": 335, 3679 + "change_id": "3aac85f7-c11c-48f6-b9da-2cd333605fb2", 3680 + "node_type": "observation", 3681 + "title": "Analyzed all project .md files - found outdated information in CONTRIBUTING.md (npm→pnpm), EXTENSION_STATUS.md (debugging→completed), PLAN.md (optimization status), extension README (build commands)", 3682 + "description": null, 3683 + "status": "pending", 3684 + "created_at": "2025-12-27T15:52:06.741629200-05:00", 3685 + "updated_at": "2025-12-27T15:52:06.741629200-05:00", 3686 + "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3687 + }, 3688 + { 3689 + "id": 336, 3690 + "change_id": "d1a23826-c660-4f2a-bdc0-bcbbce9d0293", 3691 + "node_type": "decision", 3692 + "title": "Choose which .md files to update based on priority and impact", 3693 + "description": null, 3694 + "status": "pending", 3695 + "created_at": "2025-12-27T15:52:30.322805700-05:00", 3696 + "updated_at": "2025-12-27T15:52:30.322805700-05:00", 3697 + "metadata_json": "{\"branch\":\"master\",\"confidence\":85}" 3698 + }, 3699 + { 3700 + "id": 337, 3701 + "change_id": "28eeefda-3813-4777-8006-924a9b030c61", 3702 + "node_type": "outcome", 3703 + "title": "User chose Option B: Complete update of EXTENSION_STATUS.md, CONTRIBUTING.md, PLAN.md, extension README", 3704 + "description": null, 3705 + "status": "completed", 3706 + "created_at": "2025-12-27T15:54:31.514053500-05:00", 3707 + "updated_at": "2025-12-27T15:59:48.206341500-05:00", 3708 + "metadata_json": "{\"branch\":\"master\",\"confidence\":100}" 3709 + }, 3710 + { 3711 + "id": 338, 3712 + "change_id": "594942d8-4981-4557-9687-522d51e86ecb", 3713 + "node_type": "action", 3714 + "title": "Updating EXTENSION_STATUS.md with current completion status and recent fixes", 3715 + "description": null, 3716 + "status": "completed", 3717 + "created_at": "2025-12-27T15:54:35.960795700-05:00", 3718 + "updated_at": "2025-12-27T15:55:47.472404200-05:00", 3719 + "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3720 + }, 3721 + { 3722 + "id": 339, 3723 + "change_id": "4c8c5b0d-468b-4ad6-80e9-02141949aba9", 3724 + "node_type": "action", 3725 + "title": "Updating CONTRIBUTING.md to use pnpm and reflect monorepo structure", 3726 + "description": null, 3727 + "status": "completed", 3728 + "created_at": "2025-12-27T15:55:49.596595900-05:00", 3729 + "updated_at": "2025-12-27T15:57:12.280431-05:00", 3730 + "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3731 + }, 3732 + { 3733 + "id": 340, 3734 + "change_id": "4e3987a4-538f-4912-b6ce-39c5971e0966", 3735 + "node_type": "action", 3736 + "title": "Reviewing and updating PLAN.md optimization status", 3737 + "description": null, 3738 + "status": "completed", 3739 + "created_at": "2025-12-27T15:57:14.603410600-05:00", 3740 + "updated_at": "2025-12-27T15:58:21.116083200-05:00", 3741 + "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3742 + }, 3743 + { 3744 + "id": 341, 3745 + "change_id": "42bf8d79-2c24-420f-b8b8-89273fecc30d", 3746 + "node_type": "action", 3747 + "title": "Updating packages/extension/README.md with pnpm commands and current context", 3748 + "description": null, 3749 + "status": "completed", 3750 + "created_at": "2025-12-27T15:58:23.453147600-05:00", 3751 + "updated_at": "2025-12-27T15:59:39.189409100-05:00", 3752 + "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3753 + }, 3754 + { 3755 + "id": 342, 3756 + "change_id": "a6d1f3fb-650d-4227-b1dc-ddb24810464c", 3757 + "node_type": "outcome", 3758 + "title": "Successfully updated all 4 markdown files with current project status, pnpm commands, monorepo structure, and completion status", 3759 + "description": null, 3760 + "status": "completed", 3761 + "created_at": "2025-12-27T15:59:41.457774700-05:00", 3762 + "updated_at": "2025-12-27T15:59:45.883622500-05:00", 3763 + "metadata_json": "{\"branch\":\"master\",\"confidence\":100}" 3654 3764 } 3655 3765 ], 3656 3766 "edges": [ ··· 7316 7426 "weight": 1.0, 7317 7427 "rationale": "Git commit documenting the improvements", 7318 7428 "created_at": "2025-12-27T15:48:49.907152400-05:00" 7429 + }, 7430 + { 7431 + "id": 334, 7432 + "from_node_id": 328, 7433 + "to_node_id": 333, 7434 + "from_change_id": "7823be1a-fca9-4cb5-9e62-dfbc8cb71e55", 7435 + "to_change_id": "0a0375e9-bcef-4459-b9f1-f5868276e8e4", 7436 + "edge_type": "leads_to", 7437 + "weight": 1.0, 7438 + "rationale": "New goal from user request", 7439 + "created_at": "2025-12-27T15:50:58.493301500-05:00" 7440 + }, 7441 + { 7442 + "id": 335, 7443 + "from_node_id": 333, 7444 + "to_node_id": 334, 7445 + "from_change_id": "0a0375e9-bcef-4459-b9f1-f5868276e8e4", 7446 + "to_change_id": "fe108b87-356f-4c02-85cb-7260e175d8ad", 7447 + "edge_type": "leads_to", 7448 + "weight": 1.0, 7449 + "rationale": "First step to review markdown files", 7450 + "created_at": "2025-12-27T15:51:25.165313400-05:00" 7451 + }, 7452 + { 7453 + "id": 336, 7454 + "from_node_id": 334, 7455 + "to_node_id": 335, 7456 + "from_change_id": "fe108b87-356f-4c02-85cb-7260e175d8ad", 7457 + "to_change_id": "3aac85f7-c11c-48f6-b9da-2cd333605fb2", 7458 + "edge_type": "leads_to", 7459 + "weight": 1.0, 7460 + "rationale": "Analysis complete with findings", 7461 + "created_at": "2025-12-27T15:52:08.782592-05:00" 7462 + }, 7463 + { 7464 + "id": 337, 7465 + "from_node_id": 335, 7466 + "to_node_id": 336, 7467 + "from_change_id": "3aac85f7-c11c-48f6-b9da-2cd333605fb2", 7468 + "to_change_id": "d1a23826-c660-4f2a-bdc0-bcbbce9d0293", 7469 + "edge_type": "leads_to", 7470 + "weight": 1.0, 7471 + "rationale": "Need to decide update approach", 7472 + "created_at": "2025-12-27T15:52:32.515520400-05:00" 7473 + }, 7474 + { 7475 + "id": 338, 7476 + "from_node_id": 336, 7477 + "to_node_id": 337, 7478 + "from_change_id": "d1a23826-c660-4f2a-bdc0-bcbbce9d0293", 7479 + "to_change_id": "28eeefda-3813-4777-8006-924a9b030c61", 7480 + "edge_type": "leads_to", 7481 + "weight": 1.0, 7482 + "rationale": "User decision", 7483 + "created_at": "2025-12-27T15:54:33.702061900-05:00" 7484 + }, 7485 + { 7486 + "id": 339, 7487 + "from_node_id": 337, 7488 + "to_node_id": 338, 7489 + "from_change_id": "28eeefda-3813-4777-8006-924a9b030c61", 7490 + "to_change_id": "594942d8-4981-4557-9687-522d51e86ecb", 7491 + "edge_type": "leads_to", 7492 + "weight": 1.0, 7493 + "rationale": "First file to update", 7494 + "created_at": "2025-12-27T15:54:38.126450100-05:00" 7495 + }, 7496 + { 7497 + "id": 340, 7498 + "from_node_id": 337, 7499 + "to_node_id": 339, 7500 + "from_change_id": "28eeefda-3813-4777-8006-924a9b030c61", 7501 + "to_change_id": "4c8c5b0d-468b-4ad6-80e9-02141949aba9", 7502 + "edge_type": "leads_to", 7503 + "weight": 1.0, 7504 + "rationale": "Second file to update", 7505 + "created_at": "2025-12-27T15:55:51.716239-05:00" 7506 + }, 7507 + { 7508 + "id": 341, 7509 + "from_node_id": 337, 7510 + "to_node_id": 340, 7511 + "from_change_id": "28eeefda-3813-4777-8006-924a9b030c61", 7512 + "to_change_id": "4e3987a4-538f-4912-b6ce-39c5971e0966", 7513 + "edge_type": "leads_to", 7514 + "weight": 1.0, 7515 + "rationale": "Third file to update", 7516 + "created_at": "2025-12-27T15:57:16.830452200-05:00" 7517 + }, 7518 + { 7519 + "id": 342, 7520 + "from_node_id": 337, 7521 + "to_node_id": 341, 7522 + "from_change_id": "28eeefda-3813-4777-8006-924a9b030c61", 7523 + "to_change_id": "42bf8d79-2c24-420f-b8b8-89273fecc30d", 7524 + "edge_type": "leads_to", 7525 + "weight": 1.0, 7526 + "rationale": "Fourth and final file to update", 7527 + "created_at": "2025-12-27T15:58:25.682627400-05:00" 7528 + }, 7529 + { 7530 + "id": 343, 7531 + "from_node_id": 337, 7532 + "to_node_id": 342, 7533 + "from_change_id": "28eeefda-3813-4777-8006-924a9b030c61", 7534 + "to_change_id": "a6d1f3fb-650d-4227-b1dc-ddb24810464c", 7535 + "edge_type": "leads_to", 7536 + "weight": 1.0, 7537 + "rationale": "All updates completed successfully", 7538 + "created_at": "2025-12-27T15:59:43.630208500-05:00" 7319 7539 } 7320 7540 ] 7321 7541 }
+35 -2
packages/extension/README.md
··· 4 4 5 5 ## Development 6 6 7 + **Prerequisites:** 8 + - ATlast dev server must be running at `http://127.0.0.1:8888` 9 + - You must be logged in to ATlast before using the extension 10 + 7 11 ### Build Extension 8 12 9 13 ```bash 14 + # From project root: 10 15 cd packages/extension 11 16 pnpm install 12 - pnpm run build 17 + pnpm run build # Dev build (uses http://127.0.0.1:8888) 18 + pnpm run build:prod # Production build (uses https://atlast.byarielm.fyi) 13 19 ``` 14 20 15 21 The built extension will be in `dist/chrome/`. ··· 23 29 5. The extension should now appear in your extensions list 24 30 25 31 ### Testing the Extension 32 + 33 + #### Step 0: Start ATlast Dev Server 34 + 35 + ```bash 36 + # From project root: 37 + npx netlify-cli dev --filter @atlast/web 38 + # Server will start at http://127.0.0.1:8888 39 + ``` 40 + 41 + Then open `http://127.0.0.1:8888` and log in with your Bluesky handle. 26 42 27 43 #### Step 1: Navigate to Twitter Following Page 28 44 ··· 89 105 90 106 #### Common Issues 91 107 108 + **Issue: Extension shows "Not logged in to ATlast"** 109 + 110 + Solution: 111 + 1. Open `http://127.0.0.1:8888` in a new tab 112 + 2. Log in with your Bluesky handle 113 + 3. Return to extension and click "Check Again" 114 + 115 + **Issue: Extension shows "ATlast server not running"** 116 + 117 + Solution: 118 + 1. Start dev server: `npx netlify-cli dev --filter @atlast/web` 119 + 2. Wait for server to start at `http://127.0.0.1:8888` 120 + 3. Click "Check Again" in extension 121 + 92 122 **Issue: Popup shows "Go to x.com/following" even when on following page** 93 123 94 124 Possible causes: ··· 120 150 For production deployment (Chrome Web Store): 121 151 122 152 ```bash 123 - pnpm run build 153 + cd packages/extension 154 + pnpm run build:prod # Uses production API URL 124 155 cd dist/chrome 125 156 zip -r ../chrome.zip . 126 157 ``` 127 158 128 159 Upload `dist/chrome.zip` to Chrome Web Store. 160 + 161 + **Note:** Production build connects to `https://atlast.byarielm.fyi` instead of local dev server. 129 162 130 163 ## Architecture 131 164