Skip to content

Instantly share code, notes, and snippets.

@anhedonix
Last active October 16, 2024 21:47
Show Gist options
  • Save anhedonix/c5ba757298b59c2313ff118721ebb907 to your computer and use it in GitHub Desktop.
Save anhedonix/c5ba757298b59c2313ff118721ebb907 to your computer and use it in GitHub Desktop.
MakerCore Architecture

Maker Project Architecture

Project Overview

Maker is an advanced, AI-powered web-based tool designed to automate various tasks related to project creation, building, deployment, and URL mapping. It provides a user-friendly interface for selecting and executing tasks with customizable inputs, leveraging AI to optimize workflows and supporting community contributions through a marketplace system.

System Overview

graph TB
    User[User] --> |Interacts with| Frontend[Frontend SvelteKit App]
    Frontend --> |API Requests| API[API Gateway]
    Frontend --> |WebSocket| WS[WebSocket Server]
    API --> |Routes requests| Services[Microservices]
    WS --> |Real-time updates| Services
    Services --> |Read/Write| DB[(PostgreSQL)]
    Services --> |Cache| Redis[(Redis)]
    Services --> |Executes| Tasks[Task Runner]
    Tasks --> |Uses| AI[AI Service]
    AI --> |Interfaces with| AIProviders[AI Providers]
    Services --> |Manages| Plugins[Plugin System]
    Services --> |Integrates| Marketplace[Marketplace]
    Tasks --> |Logs| Monitoring[Monitoring System]
Loading

Technology Stack

Backend

  • Language: Go (version 1.21 or later)
  • Web Framework: Gin (github.com/gin-gonic/gin)
  • ORM: GORM (gorm.io/gorm)
  • WebSocket: Gorilla WebSocket (github.com/gorilla/websocket)
  • Database: PostgreSQL (with Supabase support)
  • Logging: Zerolog (github.com/rs/zerolog)
  • Configuration: Viper (github.com/spf13/viper)
  • AI Integration: tozd/go/fun (gitlab.com/tozd/go/fun)
  • Task Runner: Machinery (github.com/RichardKnop/machinery)
  • Caching: Redis (github.com/go-redis/redis/v8)

Frontend

  • Framework: SvelteKit
  • UI Components: Custom components with Tailwind CSS
  • State Management: Built-in Svelte stores
  • HTTP Client: Axios
  • WebSocket Client: svelte-websocket-store

Infrastructure

  • Containerization: Docker
  • Orchestration: Kubernetes (for scalability)
  • CI/CD: GitHub Actions
  • Monitoring: Prometheus & Grafana

Project Structure

maker/
├── backend/
│   ├── cmd/
│   │   └── server/
│   │       └── main.go
│   ├── internal/
│   │   ├── api/
│   │   │   ├── handlers/
│   │   │   ├── middleware/
│   │   │   └── routes.go
│   │   ├── config/
│   │   │   └── config.go
│   │   ├── db/
│   │   │   └── db.go
│   │   ├── models/
│   │   ├── services/
│   │   │   ├── ai_service.go
│   │   │   ├── analytics_service.go
│   │   │   ├── cache_service.go
│   │   │   ├── collaboration_service.go
│   │   │   ├── marketplace_service.go
│   │   │   ├── plugin_service.go
│   │   │   ├── task_service.go
│   │   │   └── user_service.go
│   │   └── utils/
│   ├── migrations/
│   ├── plugins/
│   ├── config/
│   │   ├── config.yaml
│   │   └── tasks/
│   │       ├── project.toml
│   │       └── web.toml
│   └── go.mod
├── frontend/
│   ├── src/
│   │   ├── lib/
│   │   ├── routes/
│   │   ├── components/
│   │   └── stores/
│   ├── static/
│   └── svelte.config.js
├── shared/
│   └── api/
│       └── openapi.yaml
└── README.md

Key Components

Task Management

  • Tasks are defined in backend/config/tasks/*.toml
  • Loaded and managed by the backend services
  • Each task has a name, description, function, and input fields
type Task struct {
    ID          string
    Name        string
    Description string
    Inputs      []TaskInput
    Execute     func(context.Context, map[string]interface{}) (interface{}, error)
}

type TaskInput struct {
    Name        string
    Type        string
    Description string
    Required    bool
}

type TaskService struct {
    tasks map[string]*Task
    runner *machinery.Server
}

func (s *TaskService) RegisterTask(task *Task) {
    s.tasks[task.ID] = task
    s.runner.RegisterTask(task.Name, task.Execute)
}

func (s *TaskService) ExecuteTask(ctx context.Context, taskID string, inputs map[string]interface{}) (interface{}, error) {
    task, exists := s.tasks[taskID]
    if !exists {
        return nil, fmt.Errorf("task not found")
    }
    
    asyncResult, err := s.runner.SendTask(&machinery.Signature{
        Name: task.Name,
        Args: inputs,
    })
    if err != nil {
        return nil, err
    }
    
    return asyncResult.Get(ctx)
}

User Interface

  • SvelteKit-based frontend provides a responsive and intuitive interface
  • Real-time updates using WebSocket connections
  • Task selection, input fields, and execution status displayed in a user-friendly manner

Backend Services

  • RESTful API endpoints for task management and execution
  • WebSocket support for real-time updates
  • Database integration for storing task results and user data
  • AI integration for task automation and optimization

Knowledge Base

  • Stored in the database with a flexible schema to support various technologies
  • Used for project scaffolding, structure guidance, and documentation
  • Easily extensible for adding new technologies or updating existing ones

Authentication and Authorization

  • JWT-based authentication for secure access to the application
  • Role-based access control for managing user permissions

URL Mapper and Web Crawler

  • Implemented as a backend service with frontend visualization
  • Supports concurrent crawling with rate limiting
  • Generates JSON output and visualizations of crawled pages

Microservices Architecture

graph TB
    API[API Gateway] --> UserService[User Service]
    API --> TaskService[Task Service]
    API --> AnalyticsService[Analytics Service]
    API --> MarketplaceService[Marketplace Service]
    API --> CollaborationService[Collaboration Service]
    
    UserService --> UserDB[(User DB)]
    TaskService --> TaskDB[(Task DB)]
    AnalyticsService --> AnalyticsDB[(Analytics DB)]
    MarketplaceService --> MarketplaceDB[(Marketplace DB)]
    
    TaskService --> MessageQueue[Message Queue]
    MessageQueue --> WorkerPool[Worker Pool]
    WorkerPool --> AIService[AI Service]
    
    CollaborationService --> Redis[(Redis PubSub)]
Loading

API Design

  1. RESTful API Endpoints:

    GET    /api/tasks                 # List all available tasks
    POST   /api/tasks/:taskName       # Execute a specific task
    GET    /api/tasks/:taskName/status # Get the status of a running task
    GET    /api/knowledge-base        # Retrieve knowledge base entries
    POST   /api/knowledge-base        # Add a new knowledge base entry
    GET    /api/marketplace           # List marketplace items
    POST   /api/marketplace           # Create a new marketplace item
    GET    /api/marketplace/:id       # Get a specific marketplace item
    POST   /api/marketplace/:id/install # Install a marketplace item
    
  2. WebSocket Endpoint:

    WS     /ws                        # WebSocket connection for real-time updates
    
  3. Authentication Endpoints:

    POST   /api/auth/login            # User login
    POST   /api/auth/refresh          # Refresh authentication token
    POST   /api/auth/logout           # User logout
    

Data Flow

  1. User interacts with the SvelteKit frontend to select and configure tasks.
  2. Frontend sends requests to the Gin backend API.
  3. Backend processes the request, interacts with the database and external services as needed.
  4. For long-running tasks, status updates are sent via WebSocket to the frontend.
  5. Results are stored in the database and sent back to the frontend for display.

Security Considerations

  1. Use HTTPS for all communications between frontend and backend.
  2. Implement rate limiting on the backend to prevent abuse.
  3. Use prepared statements and parameter binding to prevent SQL injection.
  4. Sanitize and validate all user inputs on both frontend and backend.
  5. Implement proper error handling to avoid leaking sensitive information.
  6. Regularly update dependencies to patch security vulnerabilities.

Scalability and Performance

  1. Use database indexing and query optimization for faster data retrieval.
  2. Implement caching mechanisms for frequently accessed data using Redis and in-memory caches.
  3. Use goroutines for concurrent task execution in the backend.
  4. Optimize frontend bundle size and implement code splitting in SvelteKit.
  5. Use a CDN for serving static assets.
  6. Implement a microservices architecture for better scalability and maintainability.
  7. Use message queues (e.g., RabbitMQ or Redis) for handling long-running tasks asynchronously.

Advanced Features

Plugin System

The plugin system allows for extensibility through dynamically loaded plugins.

graph TB
    PluginLoader[Plugin Loader] --> PluginA[Plugin A]
    PluginLoader --> PluginB[Plugin B]
    PluginLoader --> PluginC[Plugin C]
    
    PluginA --> |Registers Routes| Router[Gin Router]
    PluginB --> |Registers Routes| Router
    PluginC --> |Registers Routes| Router
    
    PluginA --> |Uses| DB[(Database)]
    PluginB --> |Uses| DB
    PluginC --> |Uses| DB
    
    PluginA --> |Logs| Logger[Logger]
    PluginB --> |Logs| Logger
    PluginC --> |Logs| Logger
Loading
type Plugin struct {
    Name        string
    Version     string
    Description string
    Init        func(*PluginContext) error
    Cleanup     func() error
    Handlers    map[string]gin.HandlerFunc
}

type PluginContext struct {
    Router  *gin.Engine
    DB      *gorm.DB
    Config  *viper.Viper
    Logger  *zerolog.Logger
}

func LoadPlugins(ctx *PluginContext) error {
    files, err := ioutil.ReadDir("./plugins")
    if err != nil {
        return err
    }

    for _, file := range files {
        if filepath.Ext(file.Name()) == ".so" {
            p, err := plugin.Open("./plugins/" + file.Name())
            if err != nil {
                return err
            }

            symPlugin, err := p.Lookup("Plugin")
            if err != nil {
                return err
            }

            plugin := symPlugin.(*Plugin)
            if err := plugin.Init(ctx); err != nil {
                return err
            }

            for path, handler := range plugin.Handlers {
                ctx.Router.Any("/plugins/"+plugin.Name+path, handler)
            }
        }
    }
    return nil
}

AI Integration

The AI Service integrates multiple AI providers using the fun package for enhanced task automation.

graph TB
    AIService[AI Service] --> OpenAIProvider[OpenAI Provider]
    AIService --> CustomProvider[Custom AI Provider]
    AIService --> FutureProvider[Future AI Provider]
    
    OpenAIProvider --> |Uses| FunLibrary[tozd/go/fun Library]
    CustomProvider --> |Uses| FunLibrary
    FutureProvider --> |Uses| FunLibrary
    
    TaskService[Task Service] --> |Requests Completion| AIService
    PluginA[Plugin A] --> |Requests Completion| AIService
Loading
import (
    "gitlab.com/tozd/go/fun"
    "gitlab.com/tozd/go/fun/openai"
)

type AIService struct {
    providers map[string]fun.LLM
}

func (s *AIService) AddProvider(name string, provider fun.LLM) {
    s.providers[name] = provider
}

func (s *AIService) GetCompletion(ctx context.Context, providerName, prompt string) (string, error) {
    provider, ok := s.providers[providerName]
    if !ok {
        return "", fmt.Errorf("provider not found: %s", providerName)
    }

    response, err := provider.Complete(ctx, fun.ChatRequest{
        Messages: []fun.ChatMessage{
            {
                Role:    fun.ChatMessageRoleUser,
                Content: prompt,
            },
        },
    })
    if err != nil {
        return "", err
    }

    return response.Text(), nil
}

Marketplace

The Marketplace enables sharing and discovery of community-created tasks and workflows.

sequenceDiagram
    participant User
    participant Frontend
    participant MarketplaceService
    participant Database
    participant PluginSystem

    User->>Frontend: Browse Marketplace
    Frontend->>MarketplaceService: Request Items
    MarketplaceService->>Database: Query Items
    Database-->>MarketplaceService: Return Items
    MarketplaceService-->>Frontend: Display Items
    User->>Frontend: Select Item to Install
    Frontend->>MarketplaceService: Request Installation
    MarketplaceService->>Database: Retrieve Item Details
    Database-->>MarketplaceService: Return Item Details
    MarketplaceService->>PluginSystem: Install Plugin
    PluginSystem-->>MarketplaceService: Installation Result
    MarketplaceService-->>Frontend: Confirm Installation
    Frontend-->>User: Display Confirmation
Loading
type MarketplaceItem struct {
    ID          uint `gorm:"primaryKey"`
    Name        string
    Description string
    AuthorID    uint
    Category    string
    Version     string
    Content     datatypes.JSON
    CreatedAt   time.Time
    UpdatedAt   time.Time
}

type MarketplaceService struct {
    db *gorm.DB
}

func (s *MarketplaceService) CreateItem(item *MarketplaceItem) error {
    return s.db.Create(item).Error
}

func (s *MarketplaceService) GetItem(id uint) (*MarketplaceItem, error) {
    var item MarketplaceItem
    if err := s.db.First(&item, id).Error; err != nil {
        return nil, err
    }
    return &item, nil
}

func (s *MarketplaceService) ListItems(category string, page, pageSize int) ([]MarketplaceItem, error) {
    var items []MarketplaceItem
    query := s.db.Model(&MarketplaceItem{})
    if category != "" {
        query = query.Where("category = ?", category)
    }
    if err := query.Offset((page - 1) * pageSize).Limit(pageSize).Find(&items).Error; err != nil {
        return nil, err
    }
    return items, nil
}

Advanced Analytics

Implement a comprehensive analytics system using time-series data and real-time processing.

import (
    "github.com/influxdata/influxdb-client-go/v2"
)

type AnalyticsService struct {
    influxClient influxdb2.Client
}

func NewAnalyticsService(url, token, org, bucket string) *AnalyticsService {
    client := influxdb2.NewClient(url, token)
    return &AnalyticsService{influxClient: client}
}

func (s *AnalyticsService) TrackEvent(userID string, eventType string, metadata map[string]interface{}) error {
    writeAPI := s.influxClient.WriteAPI("maker", "events")
    
    point := influxdb2.NewPoint(
        eventType,
        map[string]string{"user_id": userID},
        metadata,
        time.Now(),
    )
    
    writeAPI.WritePoint(point)
    return nil
}

func (s *AnalyticsService) GetUserActivity(userID string, start, end time.Time) ([]influxdb2.Result, error) {
    queryAPI := s.influxClient.QueryAPI("maker")
    query := fmt.Sprintf(`
        from(bucket:"events")
            |> range(start: %s, stop: %s)
            |> filter(fn: (r) => r["user_id"] == "%s")
    `, start.Format(time.RFC3339), end.Format(time.RFC3339), userID)
    
    return queryAPI.Query(context.Background(), query)
}

Team Collaboration

Implement real-time collaboration using WebSockets and a pub/sub system with Redis.

graph TB
    User1[User 1] --> |WebSocket| CollabHub[Collaboration Hub]
    User2[User 2] --> |WebSocket| CollabHub
    User3[User 3] --> |WebSocket| CollabHub
    CollabHub --> |Publish/Subscribe| Redis[Redis PubSub]
    CollabHub --> |Store/Retrieve| DB[(Database)]
Loading
import (
    "github.com/go-redis/redis/v8"
    "github.com/gorilla/websocket"
)

type CollaborationHub struct {
    clients    map[*websocket.Conn]bool
    broadcast  chan []byte
    register   chan *websocket.Conn
    unregister chan *websocket.Conn
    redisClient *redis.Client
}

func NewCollaborationHub() *CollaborationHub {
    return &CollaborationHub{
        clients:    make(map[*websocket.Conn]bool),
        broadcast:  make(chan []byte),
        register:   make(chan *websocket.Conn),
        unregister: make(chan *websocket.Conn),
        redisClient: redis.NewClient(&redis.Options{
            Addr: "localhost:6379",
        }),
    }
}

func (h *CollaborationHub) Run() {
    pubsub := h.redisClient.Subscribe(context.Background(), "collaboration")
    defer pubsub.Close()

    go func() {
        for msg := range pubsub.Channel() {
            h.broadcast <- []byte(msg.Payload)
        }
    }()

    for {
        select {
        case client := <-h.register:
            h.clients[client] = true
        case client := <-h.unregister:
            if _, ok := h.clients[client]; ok {
                delete(h.clients, client)
                client.Close()
            }
        case message := <-h.broadcast:
            for client := range h.clients {
                if err := client.WriteMessage(websocket.TextMessage, message); err != nil {
                    delete(h.clients, client)
                    client.Close()
                }
            }
        }
    }
}

Development Workflow

  1. Version Control:

    • Use Git for version control
    • Implement a branching strategy (e.g., GitFlow)
    • Main branches: main (production), develop (integration)
    • Feature branches for new features and bug fixes
  2. Code Quality:

    • Use linters for both Go (e.g., golangci-lint) and JavaScript/TypeScript (ESLint)
    • Enforce code formatting with gofmt for Go and Prettier for JavaScript/TypeScript
    • Implement pre-commit hooks to run linters and formatters
  3. Testing:

    • Write unit tests for all core functionality
    • Implement integration tests for API endpoints and service interactions
    • Use end-to-end tests for critical user flows
    • Aim for high test coverage (e.g., >80%)
  4. Continuous Integration (CI):

    • Use GitHub Actions for CI pipelines
    • Run tests, linters, and security scans on every pull request
    • Build and test Docker images as part of CI
  5. Continuous Deployment (CD):

    • Implement automatic deployment to staging environment for develop branch
    • Use manual approval process for production deployments from main branch
    • Implement blue-green or canary deployment strategies for zero-downtime updates
  6. Code Review:

    • Require pull request reviews before merging
    • Use a code review checklist to ensure consistency
    • Encourage pair programming for complex features
  7. Documentation:

    • Maintain up-to-date API documentation using OpenAPI/Swagger
    • Use inline code comments for complex logic
    • Keep README files updated with setup and contribution guidelines
  8. Monitoring and Logging:

    • Implement structured logging using Zerolog
    • Set up centralized log aggregation (e.g., ELK stack)
    • Use Prometheus for metrics collection and Grafana for visualization
  9. Security:

    • Regularly update dependencies to patch known vulnerabilities
    • Implement security scanning in CI pipeline (e.g., using Snyk or OWASP ZAP)
    • Conduct periodic security audits
  10. Performance:

    • Implement performance benchmarks for critical paths
    • Use profiling tools to identify and fix bottlenecks
    • Conduct load testing before major releases

Conclusion

This architecture provides a solid foundation for building Maker, a user-friendly, AI-powered web application for automating development workflows. It leverages the strengths of Go and Gin for the backend, and SvelteKit for a responsive frontend, while maintaining flexibility for future expansions and improvements.

The modular design, with features like the plugin system and marketplace, allows for easy extensibility. The integration of AI services and advanced analytics provides powerful capabilities for task automation and insights.

As the project evolves, this architecture can be adjusted and expanded to meet new requirements and incorporate emerging technologies. Regular reviews and refactoring sessions should be conducted to ensure the architecture remains aligned with the project's goals and maintains its scalability and maintainability.

Optimized Prism Project Structure

1. Overall Structure

Using individual Docker containers for functionality

  graph LR
  A[Prism Project] --> B[Frontend]
  A --> C[Backend]
  A --> D[Docs]
  A --> E[Project Management]
  B --> F[SvelteKit App]
  C --> G[Go Server]
  C --> H[AI Service]
  C --> I[Data Service]
  C --> J[Task Scheduler]
  C --> K[Project Manager]
  C --> L[TUI]
  C --> M[Web Modules]
  E --> N[Git Flow]
  E --> O[Version Control]
  E --> P[CI/CD]
Loading

2. Component Breakdown

2.1 Frontend (SvelteKit)

  graph LR
  A[Frontend] --> B[Components]
  A --> C[Stores]
  A --> D[Services]
  A --> E[Utils]
  A --> F[Web Workers]
  B --> Z[Atoms]
  B --> G[Amino]
  B --> H[Structure]
  B --> I[Protein]
  F --> J[NodeEditor]
  F --> K[Toolbar]
  F --> L[PropertyEditor]
  G --> M[Connection]
  G --> N[NodeShapeRecognition]
  H --> O[SomeStructureComponent]
  I --> P[SomeProteinComponent]
  C --> Q[nodeStore]
  C --> R[connectionStore]
  C --> S[workflowStore]
  C --> T[uiStore]
  D --> U[apiService]
  D --> V[websocketService]
  E --> W[nodeTypes]
  E --> X[layoutUtils]
  E --> Y[colorSchemes]
Loading

Components

Atoms: Small elements without their own functionality. These are the basic building blocks of the UI.

Amino: Small elements with some functionality. They are slightly more complex than atoms and can perform specific tasks.

Structure: Combinations of any number of aminos or atoms that are self-enclosed in functionality, meaning they don't affect other components.

Protein: These are combinations of anything which affect other components in any manner. They are the most complex and interactive components.

File Structure

  frontend/
  ├── src/
  │   ├── libs/
  │   │   ├── components/
  │   │   │   ├── Node.svelte
  │   │   │   ├── Connection.svelte
  │   │   │   ├── NodeEditor.svelte
  │   │   │   ├── Toolbar.svelte
  │   │   │   ├── PropertyEditor.svelte
  │   │   │   └── NodeShapeRecognition.svelte
  │   │   ├── stores/
  │   │   │   ├── nodeStore.ts
  │   │   │   ├── connectionStore.ts
  │   │   │   ├── workflowStore.ts
  │   │   │   └── uiStore.ts
  │   ├── services/
  │   │   ├── apiService.ts
  │   │   └── websocketService.ts
  │   ├── utils/
  │   │   ├── nodeTypes.ts
  │   │   ├── layoutUtils.ts
  │   │   └── colorSchemes.ts
  │   ├── routes/
  │       ├── +page.svelte
  │       ├── +layout.svelte
  ├── static/
  ├── tests/
  └── package.json

2.2 Backend (Go)

  graph LR
  A[Backend] --> B[HTTP Server]
  A --> C[WebSocket Server]
  A --> D[GraphQL Server]
  A --> E[Task Scheduler]
  A --> F[Data Service]
  A --> G[Project Manager]
  A --> H[TUI]
  A --> I[Web Modules]
  A --> J[AI Service]
  F --> K[Data Loading]
  F --> L[Caching]
  F --> M[Unified API]
  I --> N[URL Mapper]
  I --> O[Web Scraper]
  J --> P[Model Manager]
  J --> Q[Prompt Handler]
  J --> R[Tool Registry]
Loading

File Structure

  backend/
  ├── cmd/
  │   └── server/
  │       └── main.go
  ├── internal/
  │   ├── api/
  │   │   ├── rest/
  │   │   ├── websocket/
  │   │   └── graphql/
  │   ├── scheduler/
  │   ├── dataservice/
  │   │   ├── loader/
  │   │   ├── cache/
  │   │   └── api/
  │   ├── projectmanager/
  │   ├── tui/
  │   ├── webmodules/
  │   │   ├── urlmapper/
  │   │   └── webscraper/
  │   └── aiservice/
  │       ├── modelmanager/
  │       ├── prompthandler/
  │       └── toolregistry/
  ├── pkg/
  │   ├── models/
  │   ├── utils/
  │   └── config/
  └── go.mod

2.3 Project Management

  graph LR
  A[Project Management] --> B[Git Flow]
  A --> C[Version Control]
  A --> D[CI/CD]
  B --> E[Feature Branches]
  B --> F[Release Branches]
  C --> G[Submodule Manager]
  C --> H[Conventional Commits]
  D --> I[Automated Testing]
  D --> J[Deployment Pipeline]
Loading

File Structure

  project_management/
  ├── git_flow/
  │   └── branch_guidelines.md
  ├── version_control/
  │   ├── submodule_manager.go
  │   └── commit_conventions.md
  ├── ci_cd/
  │   ├── .github/
  │   │   └── workflows/
  │   │       ├── test.yml
  │   │       └── deploy.yml
  │   └── scripts/
  │       ├── bump_version.sh
  │       └── release.sh
  └── README.md

3. Communication Flows

  sequenceDiagram
  participant FE as Frontend
  participant BE as Backend
  participant CF as Config Storage
  participant AI as AI Service
  participant DS as Data Service
  participant DB as Database
  
  FE->>BE: REST: Node operations
  FE->>BE: GraphQL: Query workflow data
  BE<<->>CF: Local: Load configuration
  FE<<->>BE: WebSocket: Real-time updates
  BE->>AI: Internal: AI model requests
  BE->>DS: Internal: Data operations
  DS->>DB: SQL: Persist data
  AI->>BE: Internal: AI model responses
  DS->>BE: Internal: Cached/Loaded data
Loading

4. Key Improvements

Compared to previous versions

  1. Unified Project Management System

Integrated git-flow model with conventional commits

Centralized system for managing Git submodules

Automated version bumping based on commit types

  1. Centralized Data Loading Service

Support for TOML, JSON, and YAML formats

Implemented caching mechanism for frequently accessed data

Unified API for data access across the application

  1. Enhanced Node Design and UX

Node shape recognition for easier identification

Improved color schemes for better visual hierarchy

Streamlined node action workflows

  1. Comprehensive TUI for Backend Operations

TUI interface for common node operations

Command-line workflow for sequential operations

TUI functions mirroring the API functionality

  1. Integrated AI Service

Flexible tool and model registry system

Standardized prompt format for various AI tasks

Modular design for future expansion

This updated structure provides a more robust, efficient, and scalable foundation for the Prism project, incorporating all the recommended improvements while maintaining a clear and organized architecture.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment