feat: Phase 5 BYOB foundation + Phase 3 GitHub integration

Phase 5 - BYOB Backend (TASK-007A/B):
- LocalSQL Adapter with full CloudStore API compatibility
- QueryBuilder translates Parse-style queries to SQL
- SchemaManager with PostgreSQL/Supabase export
- LocalBackendServer with REST endpoints
- BackendManager with IPC handlers for Electron
- In-memory fallback when better-sqlite3 unavailable

Phase 3 - GitHub Panel (GIT-004):
- Issues tab with list/detail views
- Pull Requests tab with list/detail views
- GitHub API client with OAuth support
- Repository info hook integration

Phase 3 - Editor UX Bugfixes (TASK-013):
- Legacy runtime detection banners
- Read-only enforcement for legacy projects
- Code editor modal close improvements
- Property panel stuck state fix
- Blockly node deletion and UI polish

Phase 11 - Cloud Functions Planning:
- Architecture documentation for workflow automation
- Execution history storage schema design
- Canvas overlay concept for debugging

Docs: Updated LEARNINGS.md and COMMON-ISSUES.md
This commit is contained in:
Richard Osborne
2026-01-15 17:37:15 +01:00
parent dd73b1339b
commit ddcb9cd02e
86 changed files with 17408 additions and 1873 deletions

View File

@@ -731,6 +731,60 @@ const NoodlRuntime = require('../../noodl-runtime'); // 2 levels from src/api/
---
### 🔴 GOTCHA #8: Port Properties Must Be Inside `type` Object (Jan 2026)
**THE BUG:**
```javascript
// Port-level properties are NOT passed to property panel
generatedCode: {
type: {
name: 'string',
codeeditor: 'javascript'
},
readOnly: true // ❌ Not accessible in property panel!
}
```
**WHY IT BREAKS:**
- Port object only contains: `['name', 'type', 'plug', 'group', 'displayName', 'index']`
- Custom properties like `readOnly` at port level are NOT included in this list
- Property panel accesses ports via `port.type.propertyName`, not `port.propertyName`
- Result: `port.readOnly` is `undefined`, property panel ignores the flag
**THE FIX:**
```javascript
// ✅ CORRECT - Put custom properties inside type object
generatedCode: {
type: {
name: 'string',
codeeditor: 'javascript',
readOnly: true // ✅ Accessible as port.type.readOnly
},
displayName: 'Generated code',
group: 'Advanced'
}
```
**DEBUGGING TIP:**
Add logging to see what properties are actually available:
```javascript
console.log('Port properties:', {
name: p.name,
readOnly: p.readOnly, // undefined ❌
typeReadOnly: p.type?.readOnly, // true ✅
allKeys: Object.keys(p) // Shows actual properties
});
```
**RULE:** Any custom property you want accessible in the property panel must be inside the `type` object.
---
## Complete Working Pattern (HTTP Node Reference)
Here's the proven pattern from the HTTP node that handles all gotchas: