Files
OpenNoodl/dev-docs/tasks/phase-3-editor-ux-overhaul/TASK-002B-github-advanced-integration/CHANGELOG.md
2026-01-18 14:38:32 +01:00

22 KiB

GIT-004: GitHub Project Management Integration - Changelog

Overview

This changelog tracks the implementation of the GitHub Project Management Integration feature, enabling teams to manage Issues, Pull Requests, and Discussions directly from the Nodegex editor and dashboard, with the unique ability to link GitHub issues to visual components.

Sub-Task Series

  1. GIT-004A: GitHub OAuth & Client Foundation
  2. GIT-004B: Issues Panel - Read & Display
  3. GIT-004C: Pull Requests Panel - Read & Display
  4. GIT-004D: Create & Update Issues
  5. GIT-004E: Component Linking System
  6. GIT-004F: Dashboard Widgets & Notifications

[Date TBD] - Task Created

Summary

Created comprehensive task documentation for GitHub Project Management Integration feature. This represents a major Phase 3 initiative that will differentiate Nodegex as a collaborative development hub.

Task Documents Created

  • README.md - Full feature specification with 6 sub-tasks
  • CHECKLIST.md - Detailed implementation checklist
  • CHANGELOG.md - This file
  • NOTES.md - Working notes template

Key Decisions

  1. Full OAuth Flow: Upgrading from PAT-based auth to GitHub App OAuth for better security and UX
  2. Component Linking: Including this killer feature in the initial scope
  3. Both Editor + Dashboard: Primary in editor sidebar, overview widgets in dashboard
  4. Issues + PRs: Both in scope from the start

Strategic Context

This feature positions Nodegex as the only low-code platform with deep GitHub integration and component-level issue tracking. Primary target: development teams and professional associations.


[2026-01-14] - GIT-004A: GitHub Client Foundation - COMPLETE

Summary

Built comprehensive GitHub REST API client with rate limiting, caching, error handling, and full test coverage. Foundation is complete and production-ready.

Files Created

  • packages/noodl-editor/src/editor/src/services/github/GitHubTypes.ts (434 lines) - Complete type definitions
  • packages/noodl-editor/src/editor/src/services/github/GitHubClient.ts (668 lines) - API client service
  • packages/noodl-editor/src/editor/src/services/github/index.ts (54 lines) - Public exports
  • packages/noodl-editor/tests/services/github/GitHubClient.test.ts (501 lines) - 20 unit tests
  • dev-docs/tasks/phase-3-editor-ux-overhaul/TASK-002B-github-advanced-integration/GIT-004A-COMPLETE.md - Documentation

Technical Notes

  • Singleton pattern with EventDispatcher for React integration
  • LRU cache (max 100 entries, 30s TTL default)
  • Rate limit tracking with 10% warning threshold
  • Auto-initialization when user authenticates
  • Pattern-based cache invalidation on mutations
  • User-friendly error messages for all HTTP codes

Testing Notes

  • 20 comprehensive unit tests covering:
    • Caching behavior (hits, TTL, invalidation)
    • Rate limiting (tracking, warnings, reset calculations)
    • Error handling (404, 401, 403, 422)
    • API methods (issues, PRs, repos)
    • Singleton pattern and auth integration

Type Safety

Added missing types for backward compatibility:

  • GitHubAuthState - Auth state interface
  • GitHubDeviceCode - OAuth device flow
  • GitHubAuthError - Error types
  • GitHubToken, GitHubInstallation, StoredGitHubAuth

Next Steps

  • GIT-004B: Build Issues Panel UI (useIssues hook, IssuesList, filtering, detail view)

[2026-01-14] - GIT-004B: Issues Panel - Complete

Summary

Built full GitHub Issues panel with data fetching, list display, detail view, and pagination. All core read functionality is complete and compiling without errors.

Files Created

Hooks:

  • packages/noodl-editor/src/editor/src/views/panels/GitHubPanel/hooks/useGitHubRepository.ts (147 lines) - Repository detection from Git remote
  • packages/noodl-editor/src/editor/src/views/panels/GitHubPanel/hooks/useIssues.ts (127 lines) - Issues data fetching with pagination

Components:

  • packages/noodl-editor/src/editor/src/views/panels/GitHubPanel/components/IssuesTab/IssueItem.tsx (105 lines) - Single issue card
  • packages/noodl-editor/src/editor/src/views/panels/GitHubPanel/components/IssuesTab/IssueItem.module.scss (113 lines)
  • packages/noodl-editor/src/editor/src/views/panels/GitHubPanel/components/IssuesTab/IssuesList.tsx (86 lines) - Issues list with states
  • packages/noodl-editor/src/editor/src/views/panels/GitHubPanel/components/IssuesTab/IssuesList.module.scss (153 lines)
  • packages/noodl-editor/src/editor/src/views/panels/GitHubPanel/components/IssuesTab/IssueDetail.tsx (125 lines) - Slide-out detail panel
  • packages/noodl-editor/src/editor/src/views/panels/GitHubPanel/components/IssuesTab/IssueDetail.module.scss (185 lines)

Files Modified

  • packages/noodl-editor/src/editor/src/views/panels/GitHubPanel/GitHubPanel.tsx - Integrated all components with hooks
  • packages/noodl-editor/src/editor/src/router.setup.ts - Panel registered (order 5.5)

Features Implemented

Repository Detection:

  • Parses GitHub owner/repo from Git remote URL
  • Supports both HTTPS and SSH formats
  • Graceful fallback for non-GitHub repos

Issues List:

  • Fetches issues from GitHubClient
  • Display issue cards with number, title, status, labels
  • Shows relative timestamps ("2 hours ago")
  • Comment counts
  • Label badges with contrasting text colors

Issue Detail:

  • Slide-out panel (600px wide)
  • Full issue metadata display
  • Issue body text (simplified, markdown planned for GIT-004D)
  • Labels with GitHub colors
  • "View on GitHub" link

Pagination:

  • Load More button (30 issues per page)
  • Loading spinner during fetch
  • "No more issues" end state

Loading & Error States:

  • Spinner during initial load
  • Error state with retry button
  • Empty states for no issues
  • Loading state for pagination

Multiple Empty States:

  • Not authenticated
  • Not a GitHub repository
  • No issues found
  • Loading repository info

Technical Decisions

  1. Simplified Markdown: Using plain text for now, full markdown rendering deferred to GIT-004D
  2. useEventListener Pattern: Following Phase 0 guidelines for GitHubClient event subscriptions
  3. Repository from Git: Creating Git instance per hook call (stateless approach)
  4. Design Tokens: All colors use var(--theme-color-*) tokens
  5. Slide-out Detail: Chosen over modal for better UX (as discussed with Richard)

Testing

  • TypeScript compilation passes with no errors
  • All components properly typed
  • ⚠️ Manual testing required (needs real GitHub repository)

Known Limitations

  1. No Filtering UI: Hardcoded to show "open" issues only
  2. No Search: Search input not yet functional
  3. No Markdown Rendering: Issue bodies show as plain text
  4. No Comments Display: Comments count shown but not rendered
  5. No Create/Edit: Read-only for now (GIT-004D will add CRUD)

Next Steps (Future Tasks)

GIT-004C: Pull Requests Panel

  • Similar structure to Issues
  • PR-specific features (checks, reviews, merge status)

GIT-004D: Issues CRUD

  • Create issue dialog
  • Edit existing issues
  • Add comments
  • Proper markdown rendering with react-markdown
  • Issue templates support

Immediate Todos:

  • Add filtering UI (state, labels, assignees)
  • Implement search functionality
  • Connect "Connect GitHub" button to OAuth flow
  • Manual testing with real repository

Template for Future Entries

## [YYYY-MM-DD] - GIT-004X: [Sub-Task Name]

### Summary

[Brief description of what was accomplished]

### Files Created

- `path/to/file.tsx` - [Purpose]

### Files Modified

- `path/to/file.ts` - [What changed and why]

### Technical Notes

- [Key decisions made]
- [Patterns discovered]
- [Gotchas encountered]

### Testing Notes

- [What was tested]
- [Any edge cases discovered]

### Next Steps

- [What needs to be done next]

[2026-01-15] - GIT-004C: Pull Requests Panel - Complete

Summary

Built complete GitHub Pull Requests panel following the same patterns as Issues panel. All core read functionality is complete and compiling without errors.

Files Created (7 files, ~1,100 lines)

Hook:

  • hooks/usePullRequests.ts (127 lines) - PR fetching with pagination

Components:

  • components/PullRequestsTab/PRItem.tsx (145 lines) - Single PR card
  • components/PullRequestsTab/PRItem.module.scss (130 lines)
  • components/PullRequestsTab/PRsList.tsx (86 lines) - PR list with states
  • components/PullRequestsTab/PRsList.module.scss (153 lines)
  • components/PullRequestsTab/PRDetail.tsx (215 lines) - Slide-out detail panel
  • components/PullRequestsTab/PRDetail.module.scss (265 lines)

Files Modified

  • GitHubPanel.tsx - Added Pull Requests tab with PullRequestsTab component

Features Implemented

Pull Requests List:

  • Fetches PRs from GitHubClient with caching
  • PR cards with:
    • PR number and title
    • Status badges (Open, Draft, Merged, Closed)
    • Branch information (base ← head)
    • Commits, files changed, comments stats
    • Labels with GitHub colors
    • Relative timestamps

PR Detail Slide-out:

  • 600px wide panel from right side
  • Full PR metadata including branch names
  • Detailed stats (commits, files, comments)
  • Labels display
  • Status-specific info boxes (merged, draft, closed)
  • "View on GitHub" link

Status Badges:

  • 🟢 Open - Green
  • 📝 Draft - Gray
  • 🟣 Merged - Purple
  • 🔴 Closed - Red

Same patterns as Issues:

  • Pagination (30 per page)
  • Loading/error/empty states
  • useEventListener for GitHubClient events
  • Design tokens throughout
  • Slide-out detail view

Technical Notes

  • Reused most patterns from GIT-004B (Issues)
  • Took ~2 hours vs estimated 10-14 (pattern reuse win!)
  • All status colors match GitHub's actual UI
  • PR-specific fields: commits, changed_files, base.ref, head.ref, draft, merged_at

Testing

  • TypeScript compilation passes with no errors
  • All components properly typed
  • ⚠️ Manual testing required (needs real GitHub repository with PRs)

Time Spent

  • usePullRequests hook: 15 min
  • PRItem component: 20 min
  • PRsList component: 15 min
  • PRDetail component: 25 min
  • Styling (all components): 30 min
  • Integration: 10 min
  • Testing & docs: 10 min

Total: ~2 hours (vs 10-14 estimated - 80% time saving from pattern reuse!)


[2026-01-16] - OAuth Flow Bug Fixes - Complete

Summary

Fixed critical bugs preventing GitHub OAuth from working. The OAuth flow was broken due to two separate OAuth implementations that weren't communicating properly.

Root Causes Identified

  1. Git Path Null Error: git.openRepository() didn't handle when open() returns null (not a git repo)
  2. Disconnected OAuth Flows: Two separate OAuth implementations existed:
    • GitHubOAuthService.ts (renderer) - Generated PKCE state, opened browser
    • github-oauth-handler.js (main) - Had separate state, handled callback
    • These didn't communicate - OAuth callback went to main process, but renderer never received it

Files Modified

Bug Fix 1 - Git Null Path:

  • packages/noodl-git/src/git.ts - Added null check in openRepository() to throw clear error instead of crashing

Bug Fix 2 - OAuth Flow:

  • packages/noodl-editor/src/editor/src/services/GitHubOAuthService.ts - Complete rewrite to:
    • Use IPC to get auth URL from main process (reuses main's state)
    • Listen for github-oauth-complete and github-oauth-error IPC events
    • Properly receive and store tokens after OAuth callback

Bug Fix 3 - Error Handling:

  • packages/noodl-editor/src/editor/src/views/panels/GitHubPanel/hooks/useGitHubRepository.ts - Added try/catch around git.openRepository() to gracefully handle non-git projects

Bug Fix 4 - Initialization:

  • packages/noodl-editor/src/editor/src/views/panels/GitHubPanel/GitHubPanel.tsx - Added:
    • GitHubOAuthService.initialize() call on mount to restore saved tokens
    • useEventListener to react to auth state changes
    • Loading state while initializing

Technical Notes

OAuth Flow Now:

  1. User clicks "Connect GitHub Account"
  2. GitHubOAuthService calls ipcRenderer.invoke('github-oauth-start') - main generates state
  3. Main returns auth URL, renderer opens in browser
  4. User authorizes, GitHub redirects to noodl://github-callback
  5. Main process receives callback, validates state (its own), exchanges code for token
  6. Main sends github-oauth-complete IPC event with token + user
  7. GitHubOAuthService receives event, stores token, updates state
  8. GitHubPanel re-renders as connected

Token Storage:

  • Main process uses jsonstorage + Electron safeStorage for encryption
  • Token persisted across sessions
  • initialize() loads saved token on app start

Existing Infrastructure Verified

The following was already correctly implemented in main.js:

  • initializeGitHubOAuthHandlers(app) - Protocol handler registered
  • github-save-token / github-load-token / github-clear-token IPC handlers
  • Token encryption using Electron's safeStorage

Error Messages Improved

  • "Not a git repository: /path" instead of cryptic "path must be string, received null"
  • Console logging for OAuth flow stages for debugging

Testing Required

  • Click "Connect GitHub Account" and complete OAuth flow
  • Verify token is stored and user info displayed
  • Close and reopen app, verify session is restored
  • Test with non-git project (should show graceful error)
  • Test with GitHub repo (should detect owner/repo)

[2026-01-16] - Session 2: Critical Bug Fixes & Unification - Complete

Summary

Second bug-fix session addressing infinite loops, jsonstorage errors, IPC targeting issues, and unifying OAuth across launcher and editor.

Bugs Fixed

Bug 1: jsonstorage.getSync doesn't exist

  • File: packages/noodl-editor/src/main/main.js (line ~672)
  • Fix: The jsonstorage module only has async get(key, callback). Changed to Promise wrapper.
const stored = await new Promise((resolve) => {
  jsonstorage.get('github.token', (data) => resolve(data));
});

Bug 2: IPC event not reaching renderer

  • File: packages/noodl-editor/src/main/github-oauth-handler.js
  • Fix: Was sending to windows[0] which might be viewer/floating window, not editor. Now broadcasts to ALL windows.
windows.forEach((win, index) => {
  win.webContents.send('github-oauth-complete', result);
});

Bug 3: Infinite loop in useIssues hook

  • File: packages/noodl-editor/src/editor/src/views/panels/GitHubPanel/hooks/useIssues.ts
  • Root Cause: filters object in useEffect deps creates new reference on every render
  • Fix: Use useRef for filters and JSON.stringify(filters) for dependency comparison
const filtersRef = useRef(filters);
filtersRef.current = filters;
const filtersKey = JSON.stringify(filters);
useEffect(() => { ... }, [owner, repo, filtersKey, enabled, refetch]);

Bug 4: Infinite loop in usePullRequests hook

  • File: packages/noodl-editor/src/editor/src/views/panels/GitHubPanel/hooks/usePullRequests.ts
  • Fix: Same pattern as useIssues - ref for filters, JSON serialization for deps

New Features

Launcher OAuth Integration

  • File: packages/noodl-editor/src/editor/src/pages/ProjectsPage/ProjectsPage.tsx
  • Added state: githubIsAuthenticated, githubIsConnecting, githubUser
  • Added handlers: handleGitHubConnect, handleGitHubDisconnect
  • Listens for auth state changes via useEventListener
  • Launcher button now initiates real OAuth flow

CredentialsSection OAuth Migration

  • File: packages/noodl-editor/src/editor/src/views/panels/VersionControlPanel/components/GitProviderPopout/sections/CredentialsSection.tsx
  • Migrated from old GitHubAuth service to unified GitHubOAuthService
  • Now shares token storage with GitHubPanel and Launcher

Testing Results

Test Result
OAuth from GitHubPanel in project Works
OAuth from Launcher header button Works
OAuth from CredentialsSection Works (migrated)
Token persistence across restart Works (without clean:all)
Issues/PRs single request (no loop) Works
404 error handling (no loop) Works

Technical Notes

  • All three OAuth entry points now use GitHubOAuthService.instance
  • Token stored via IPC (github-save-token) in main process using Electron's safeStorage
  • clean:all will wipe tokens (expected - wipes electron-store data)

Future Task Created

Created TASK-002C-github-clone-and-connect/README.md documenting two new features:

  • Subtask A: Clone Noodl projects from GitHub (launcher view)
  • Subtask B: Connect unconnected project to GitHub (create/link repo)

Progress Summary

Sub-Task Status Started Completed
GIT-004A: OAuth & Client Complete 2026-01-14 2026-01-14
GIT-004B: Issues Read Complete 2026-01-14 2026-01-14
GIT-004C: PRs Read Complete 2026-01-15 2026-01-15
OAuth Bug Fixes Complete 2026-01-16 2026-01-16
GIT-004D: Issues CRUD Not Started - -
GIT-004E: Component Linking Not Started - -
GIT-004F: Dashboard Not Started - -

Blockers Log

Track any blockers encountered during implementation

Date Blocker Sub-Task Resolution Time Lost
- - - - -

API Rate Limit Notes

Track GitHub API rate limit observations

Date Scenario Requests Used Notes
- - - -

Performance Notes

Track performance observations

Scenario Observation Action Taken
Large issue list (100+) - -
Component linking query - -
Dashboard aggregation - -

User Feedback

Track user feedback during development/testing

Date Feedback Source Action
- - - -

[2026-01-18] - VersionControlPanel Discovery + GIT-005-011 Documentation

Summary

Major documentation effort creating GIT-005 through GIT-011 task specs (Live Collaboration & Multi-Community System), plus critical discovery that the existing VersionControlPanel is already 100% React with full visual diff support.

Key Discovery: VersionControlPanel is React! 🎉

Not jQuery - The entire VersionControlPanel is modern React:

  • React functional components with hooks (useState, useEffect, useRef)
  • Context API (VersionControlContext)
  • TypeScript throughout
  • Uses @noodl-core-ui design system

Visual diff system already works:

  • Click any commit in History tab
  • See green nodes (additions), red nodes (deletions)
  • Component-level diff visualization
  • DiffList.tsx, CommitChangesDiff.tsx already implement this

Integration Strategy Created

Approach: Extend VersionControlPanel with GitHub tabs instead of maintaining separate GitHubPanel.

Benefits:

  • Single unified panel for all version control
  • Existing visual diffs work unchanged
  • No rewrite needed - just add tabs
  • Estimated 11-16 hours vs 70-90 for separate panel

Documentation: GIT-INTEGRATION-STRATEGY.md

Task Documentation Created (GIT-005-011)

Part 2: Live Collaboration & Multi-Community System

Task Name Hours Files Created
GIT-005 Community Infrastructure 60-80 GIT-005-community-infrastructure/README.md
GIT-006 Server Infrastructure 80-100 GIT-006-server-infrastructure/README.md
GIT-007 WebRTC Collaboration 100-130 GIT-007-webrtc-collaboration/README.md
GIT-008 Notification System 50-70 GIT-008-notification-system/README.md
GIT-009 Community Tab UI 80-100 GIT-009-community-ui/README.md
GIT-010 Session Discovery 50-70 GIT-010-session-discovery/README.md
GIT-011 Integration & Polish 61-82 GIT-011-integration-polish/README.md

Total Part 2 Effort: 431-572 hours

Files Created

  • GIT-005-community-infrastructure/README.md
  • GIT-006-server-infrastructure/README.md
  • GIT-007-webrtc-collaboration/README.md
  • GIT-008-notification-system/README.md
  • GIT-009-community-ui/README.md
  • GIT-010-session-discovery/README.md
  • GIT-011-integration-polish/README.md
  • GIT-INTEGRATION-STRATEGY.md

Files Modified

  • README.md - Added Part 2 section, integration strategy reference
  • CHECKLIST.md - Added GIT-005-011 checklists
  • PROGRESS.md (Phase 3) - Updated task list and recent updates

VersionControlPanel Components Verified

All these are modern React:

  • LocalChanges.tsx - Uncommitted changes
  • History.tsx - Commit history
  • HistoryCommitDiff.tsx - Visual commit diff
  • CommitChangesDiff.tsx - Diff logic
  • DiffList.tsx - Green/red node renderer
  • BranchList.tsx - Branch management
  • BranchMerge.tsx - Merge operations
  • MergeConflicts.tsx - Conflict resolution
  • Stashes.tsx - Git stash

Next Steps

  1. Immediate: Integrate Issues/PRs as tabs in VersionControlPanel
  2. Short-term: Enhance GitProviderPopout with OAuth
  3. Medium-term: Begin GIT-005 Community Infrastructure
  4. Long-term: GIT-006-011 server and collaboration features