mirror of
https://github.com/The-Low-Code-Foundation/OpenNoodl.git
synced 2026-01-12 15:22:55 +01:00
8.9 KiB
8.9 KiB
COMP Series: Shared Component System
Overview
The COMP series transforms Noodl's component sharing from manual zip file exchanges into a modern, Git-based collaborative ecosystem. Teams can share design systems via organization repositories, individuals can build personal component libraries, and improvements can flow back upstream via pull requests.
Target Environment
- Editor: React 19 version only
- Runtime: Not affected (components work in any runtime)
- Backwards Compatibility: Existing prefabs continue to work
Task Dependency Graph
COMP-001 (Prefab System Refactoring)
│
├────────────────────────┬───────────────────────┐
↓ ↓ ↓
COMP-002 (Built-in) COMP-003 (Export) GIT-001 (OAuth)
│ │ │
↓ ↓ │
│ COMP-004 (Org Components) ←───┘
│ │
└────────────┬───────────┘
↓
COMP-005 (Version Control)
│
↓
COMP-006 (Forking & PR)
Task Summary
| Task ID | Name | Est. Hours | Priority |
|---|---|---|---|
| COMP-001 | Prefab System Refactoring | 14-20 | Critical |
| COMP-002 | Built-in Prefabs | 19-26 | High |
| COMP-003 | Component Export to Repository | 19-25 | High |
| COMP-004 | Organization Components Repository | 18-24 | High |
| COMP-005 | Component Import with Version Control | 19-25 | Medium |
| COMP-006 | Component Forking & PR Workflow | 28-35 | Medium |
Total Estimated: 117-155 hours
Implementation Order
Phase 1: Foundation (Weeks 1-2)
- COMP-001 - Refactor prefab system for multiple sources
Phase 2: Local & Built-in (Weeks 3-4)
- COMP-002 - Bundle essential prefabs with editor
Phase 3: Export & Organization (Weeks 5-7)
- COMP-003 - Enable exporting to GitHub repositories
- COMP-004 - Auto-detect and load organization repos
Phase 4: Version Control & Collaboration (Weeks 8-10)
- COMP-005 - Track imports, detect updates
- COMP-006 - Fork detection, PR workflow
Existing Infrastructure
ModuleLibraryModel
// Current implementation
class ModuleLibraryModel {
modules: IModule[]; // External libraries
prefabs: IModule[]; // Component bundles
fetchModules(type: 'modules' | 'prefabs'): Promise<IModule[]>;
installModule(path: string): Promise<void>;
installPrefab(path: string): Promise<void>;
}
ProjectImporter
// Handles actual component import
class ProjectImporter {
listComponentsAndDependencies(dir, callback);
checkForCollisions(imports, callback);
import(dir, imports, callback);
}
NodePicker
packages/noodl-editor/src/editor/src/views/NodePicker/
├── NodePicker.tsx # Main component
├── NodePicker.context.tsx # State management
├── tabs/
│ ├── NodeLibrary/ # Built-in nodes
│ ├── NodePickerSearchView/ # Prefabs & modules
│ └── ImportFromProject/ # Import from other project
└── components/
└── ModuleCard/ # Prefab/module display card
Export Functionality
// exportProjectComponents.ts
export function exportProjectComponents() {
// Shows export popup
// User selects components
// Creates zip file with dependencies
}
New Architecture
PrefabRegistry (COMP-001)
Central hub for all prefab sources:
class PrefabRegistry {
private sources: Map<string, PrefabSource>;
registerSource(source: PrefabSource): void;
getAllPrefabs(): Promise<PrefabMetadata[]>;
installPrefab(id: string): Promise<void>;
}
Source Types
| Source | Priority | Description |
|---|---|---|
| BuiltInPrefabSource | 100 | Bundled with editor |
| OrganizationPrefabSource | 80 | Team component repos |
| PersonalPrefabSource | 70 | User's own repos |
| DocsPrefabSource | 50 | Community prefabs |
Component Tracking (COMP-005)
interface ImportedComponent {
componentId: string;
source: ComponentSource;
importedVersion: string;
isFork: boolean;
updateAvailable?: string;
activePR?: PRInfo;
}
Repository Structure Convention
All component repositories follow this structure:
noodl-components/
├── index.json # Repository manifest
├── README.md # Documentation
├── LICENSE # License file
└── components/
├── component-name/
│ ├── prefab.json # Component metadata
│ ├── component.ndjson # Component data
│ ├── dependencies/ # Styles, variants
│ └── assets/ # Images, fonts
└── ...
Manifest Format (index.json)
{
"name": "Acme Design System",
"version": "2.1.0",
"noodlVersion": ">=2.10.0",
"components": [
{
"id": "acme-button",
"name": "Acme Button",
"version": "2.1.0",
"path": "components/acme-button"
}
]
}
Key User Flows
1. Team Member Imports Org Component
User opens NodePicker
↓
Sees "Acme Corp" section with org components
↓
Clicks "Clone" on AcmeButton
↓
Component imported, source tracked
↓
Later: notification "AcmeButton update available"
2. Developer Shares Component
User right-clicks component
↓
Selects "Export to Repository"
↓
Chooses personal repo or org repo
↓
Fills metadata (description, tags)
↓
Component committed and pushed
3. Developer Improves Org Component
User modifies imported AcmeButton
↓
System detects fork, shows badge
↓
User right-clicks → "Contribute Changes"
↓
PR created in org repo
↓
Team reviews and merges
Services to Create
| Service | Purpose |
|---|---|
| PrefabRegistry | Central source management |
| ComponentTrackingService | Import/version tracking |
| ComponentExportService | Export to repositories |
| OrganizationService | Org detection & management |
| ComponentForkService | Fork detection & PR workflow |
UI Components to Create
| Component | Location | Purpose |
|---|---|---|
| ComponentSourceBadge | noodl-core-ui | Show source (Built-in, Org, etc.) |
| ForkBadge | noodl-core-ui | Show fork status |
| ExportToRepoModal | noodl-core-ui | Export workflow |
| ComponentUpdatesModal | noodl-core-ui | Update selection |
| ComponentDiffModal | noodl-core-ui | View changes |
| CreatePRModal | noodl-core-ui | PR creation |
| OrganizationSettings | noodl-core-ui | Org repo settings |
Dependencies on Other Series
Required from GIT Series
- GIT-001 (GitHub OAuth) - Required for COMP-003, COMP-004
Enables for Future
- Community marketplace
- Component ratings/reviews
- Usage analytics
Testing Strategy
Unit Tests
- Source registration
- Metadata parsing
- Checksum calculation
- Version comparison
Integration Tests
- Full import flow
- Export to repo flow
- Update detection
- PR creation
Manual Testing
- Multiple organizations
- Large component libraries
- Offline scenarios
- Permission edge cases
Cline Usage Notes
Before Starting Each Task
- Read task document completely
- Review existing prefab system:
modulelibrarymodel.tsprojectimporter.jsNodePicker/views
- Understand export flow:
exportProjectComponents.ts
Key Gotchas
- Singleton Pattern:
ModuleLibraryModel.instanceis used everywhere - Async Import: Import process is callback-based, not Promise
- Collision Handling: Existing collision detection must be preserved
- File Paths: Components use relative paths internally
Testing Prefabs
# Run editor tests
npm run test:editor
# Manual: Open NodePicker, try importing prefab
Success Criteria (Series Complete)
- ✅ Multiple prefab sources supported
- ✅ Built-in prefabs available offline
- ✅ Components exportable to GitHub
- ✅ Organization repos auto-detected
- ✅ Import source/version tracked
- ✅ Updates detected and installable
- ✅ Forks can create PRs upstream
Future Work (Post-COMP)
The COMP series enables:
- Marketplace: Paid/free component marketplace
- Analytics: Usage tracking per component
- Ratings: Community ratings and reviews
- Templates: Project templates from components
- Subscriptions: Organization component subscriptions
Files in This Series
COMP-001-prefab-system-refactoring.mdCOMP-002-builtin-prefabs.mdCOMP-003-component-export.mdCOMP-004-organization-components.mdCOMP-005-component-import-version-control.mdCOMP-006-forking-pr-workflow.mdCOMP-OVERVIEW.md(this file)