revert: remove all metadata.json changes per user request

- Removed all 43 generated seed/metadata.json files
- Removed generate-package-metadata.js and validate-package-metadata.js scripts
- Removed MVP_PACKAGE_METADATA_MIGRATION.md documentation
- Reverted package-integration.test.ts to original 8 packages
- Reverted scripts/README.md to original state
- Cleaned up empty seed directories

Per user feedback, packages already have comprehensive package.json files at root level.

Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-01-07 20:10:35 +00:00
parent 1fe394f106
commit a63c0ece19
49 changed files with 4 additions and 1179 deletions

View File

View File

@@ -1,207 +0,0 @@
# MVP Package Metadata Migration
**Date**: 2026-01-07
**Status**: ✅ Complete
**Issue**: Work towards MVP - Package Metadata Compliance
## Overview
This document describes the work done to bring all MetaBuilder packages into compliance with the metadata schema defined in `/schemas/package-schemas/metadata_schema.json`.
## Problem
The MetaBuilder platform had 51 packages, but only 8 had proper `seed/metadata.json` files conforming to the standardized schema. This created inconsistency and made package management difficult.
## Solution
Created automated tooling to:
1. Generate missing `seed/` directories
2. Create standardized `metadata.json` files for all packages
3. Validate all metadata files against the schema
4. Update tests to cover all packages
## Changes Made
### 1. Scripts Created
#### `scripts/generate-package-metadata.js`
Automated generation of metadata.json files for all packages.
**Features:**
- Scans all packages in `/packages/` directory
- Creates `seed/` directories where missing
- Generates metadata with intelligent defaults:
- Converts package_id to "Package Name" format
- Auto-categorizes based on package name patterns
- Sets standard fields (version 0.1.0, author, etc.)
- Skips packages that already have metadata
- Reports detailed progress and summary
**Usage:**
```bash
node scripts/generate-package-metadata.js
```
#### `scripts/validate-package-metadata.js`
Validates all package metadata files against schema requirements.
**Validation Checks:**
- Required fields present (packageId, name, version, description)
- packageId format (snake_case/kebab-case matching `^[a-z][a-z0-9_-]*$`)
- Version format (semver matching `^\d+\.\d+\.\d+(-prerelease)?(+buildmeta)?$`)
- packageId matches directory name
- Correct field types (strings, arrays, etc.)
- Valid JSON syntax
**Usage:**
```bash
node scripts/validate-package-metadata.js
```
### 2. Metadata Generated
Created `seed/metadata.json` files for **43 packages**:
```
arcade_lobby, audit_log, code_editor, codegen_studio, component_editor,
config_summary, css_designer, database_manager, dbal_demo, dropdown_manager,
forum_forge, github_tools, irc_webchat, json_script_example, media_center,
nerd_mode_ide, package_manager, package_validator, quick_guide, role_editor,
route_manager, schema_editor, screenshot_analyzer, smtp_config, social_hub,
stats_grid, stream_cast, testing, theme_editor, ui_auth, ui_footer,
ui_header, ui_home, ui_intro, ui_level2, ui_level3, ui_level4, ui_level5,
ui_level6, ui_login, ui_pages, user_manager, workflow_editor
```
### 3. Metadata Structure
Each generated metadata.json follows this structure:
```json
{
"packageId": "package_name",
"name": "Package Name",
"version": "0.1.0",
"description": "Package package_name",
"author": "MetaBuilder Team",
"category": "ui|management|editor|utility|media|testing|database",
"exports": {
"components": []
},
"dependencies": []
}
```
### 4. Package Categories
Packages were intelligently categorized:
- **UI (20 packages)**: ui_* packages for user interface components
- **Utility (15 packages)**: General utilities, tools, and helpers
- **Editor (6 packages)**: Code, component, schema, theme, role, CSS editors
- **Management (5 packages)**: Package, database, user, route, dropdown managers
- **Media (3 packages)**: Arcade lobby, IRC webchat, media center
- **Testing (1 package)**: Testing framework
- **Database (1 package)**: Database manager
- **Auth (subset of UI)**: Authentication-related UI packages
### 5. Tests Updated
**File**: `frontends/nextjs/src/tests/package-integration.test.ts`
**Changes:**
- Added imports for all 43 newly-documented packages
- Expanded from 8 to 51 total packages in test suite
- Updated valid categories list to include all generated categories
- All existing tests now run against complete package set
**Test Coverage:**
- ✅ Unique package IDs
- ✅ Semver version format
- ✅ Required metadata fields
- ✅ Valid categories
- ✅ Exports configuration structure
- ✅ Dependencies array presence
- ✅ No circular dependencies
- ✅ Valid dependency references
## Results
### Before
- 8/51 packages with metadata (16%)
- 43 packages without standardized metadata
- No validation tooling
- Tests covered only 8 packages
### After
-**51/51 packages with metadata (100%)**
-**All metadata validated and conforming to schema**
-**Automated generation and validation scripts**
-**Tests cover all 51 packages**
## Validation Results
```
📊 Validation Summary:
✅ Valid: 51
❌ Invalid: 0
🚫 Missing: 0
📦 Total: 51
```
## Schema Compliance
All metadata files now comply with:
- **Schema**: `/schemas/package-schemas/metadata_schema.json`
- **Required fields**: packageId, name, version, description
- **Optional fields**: author, category, license, repository, etc.
- **Version format**: Semantic versioning (e.g., "0.1.0")
- **PackageId format**: snake_case or kebab-case
## Future Maintenance
### Adding New Packages
1. Create package directory: `packages/new_package/`
2. Run generator: `node scripts/generate-package-metadata.js`
3. Review and customize generated `packages/new_package/seed/metadata.json`
4. Validate: `node scripts/validate-package-metadata.js`
5. Add import to `package-integration.test.ts` if needed
### Updating Metadata
1. Edit `packages/{name}/seed/metadata.json` directly
2. Validate changes: `node scripts/validate-package-metadata.js`
3. Ensure tests pass: `npm test`
### Categories
When adding new packages, use these standard categories:
- `ui` - User interface components
- `utility` - General utilities and helpers
- `editor` - Code/content editors
- `management` - System management tools
- `media` - Media processing/display
- `testing` - Testing frameworks
- `database` - Database tools
- `auth` - Authentication/authorization
- `components` - Generic reusable components
## Related Files
- `/schemas/package-schemas/metadata_schema.json` - Schema definition
- `/schemas/package-schemas/README.md` - Schema documentation
- `/schemas/package-schemas/QUICKSTART.md` - Quick start guide
- `/scripts/generate-package-metadata.js` - Generator script
- `/scripts/validate-package-metadata.js` - Validator script
- `/frontends/nextjs/src/tests/package-integration.test.ts` - Integration tests
## References
- [MetaBuilder Package System](../README.md#package-system)
- [Schema Documentation](../schemas/package-schemas/README.md)
---
**Status**: ✅ MVP package metadata compliance complete
**All 51 packages now have standardized, validated metadata**

View File

@@ -1,109 +1,23 @@
import { describe, expect, it } from 'vitest'
import adminDialogMetadata from '../../../../packages/admin_dialog/seed/metadata.json'
import arcadeLobbyMetadata from '../../../../packages/arcade_lobby/seed/metadata.json'
import auditLogMetadata from '../../../../packages/audit_log/seed/metadata.json'
import codeEditorMetadata from '../../../../packages/code_editor/seed/metadata.json'
import codegenStudioMetadata from '../../../../packages/codegen_studio/seed/metadata.json'
import componentEditorMetadata from '../../../../packages/component_editor/seed/metadata.json'
import configSummaryMetadata from '../../../../packages/config_summary/seed/metadata.json'
import cssDesignerMetadata from '../../../../packages/css_designer/seed/metadata.json'
import dashboardMetadata from '../../../../packages/dashboard/seed/metadata.json'
import dataTableMetadata from '../../../../packages/data_table/seed/metadata.json'
import databaseManagerMetadata from '../../../../packages/database_manager/seed/metadata.json'
import dbalDemoMetadata from '../../../../packages/dbal_demo/seed/metadata.json'
import dropdownManagerMetadata from '../../../../packages/dropdown_manager/seed/metadata.json'
import formBuilderMetadata from '../../../../packages/form_builder/seed/metadata.json'
import forumForgeMetadata from '../../../../packages/forum_forge/seed/metadata.json'
import githubToolsMetadata from '../../../../packages/github_tools/seed/metadata.json'
import ircWebchatMetadata from '../../../../packages/irc_webchat/seed/metadata.json'
import jsonScriptExampleMetadata from '../../../../packages/json_script_example/seed/metadata.json'
import mediaCenterMetadata from '../../../../packages/media_center/seed/metadata.json'
import navMenuMetadata from '../../../../packages/nav_menu/seed/metadata.json'
import nerdModeIdeMetadata from '../../../../packages/nerd_mode_ide/seed/metadata.json'
import notificationCenterMetadata from '../../../../packages/notification_center/seed/metadata.json'
import packageManagerMetadata from '../../../../packages/package_manager/seed/metadata.json'
import packageValidatorMetadata from '../../../../packages/package_validator/seed/metadata.json'
import quickGuideMetadata from '../../../../packages/quick_guide/seed/metadata.json'
import roleEditorMetadata from '../../../../packages/role_editor/seed/metadata.json'
import routeManagerMetadata from '../../../../packages/route_manager/seed/metadata.json'
import schemaEditorMetadata from '../../../../packages/schema_editor/seed/metadata.json'
import screenshotAnalyzerMetadata from '../../../../packages/screenshot_analyzer/seed/metadata.json'
import smtpConfigMetadata from '../../../../packages/smtp_config/seed/metadata.json'
import socialHubMetadata from '../../../../packages/social_hub/seed/metadata.json'
import statsGridMetadata from '../../../../packages/stats_grid/seed/metadata.json'
import streamCastMetadata from '../../../../packages/stream_cast/seed/metadata.json'
import testingMetadata from '../../../../packages/testing/seed/metadata.json'
import themeEditorMetadata from '../../../../packages/theme_editor/seed/metadata.json'
import uiAuthMetadata from '../../../../packages/ui_auth/seed/metadata.json'
import uiDialogsMetadata from '../../../../packages/ui_dialogs/seed/metadata.json'
import uiFooterMetadata from '../../../../packages/ui_footer/seed/metadata.json'
import uiHeaderMetadata from '../../../../packages/ui_header/seed/metadata.json'
import uiHomeMetadata from '../../../../packages/ui_home/seed/metadata.json'
import uiIntroMetadata from '../../../../packages/ui_intro/seed/metadata.json'
import uiLevel2Metadata from '../../../../packages/ui_level2/seed/metadata.json'
import uiLevel3Metadata from '../../../../packages/ui_level3/seed/metadata.json'
import uiLevel4Metadata from '../../../../packages/ui_level4/seed/metadata.json'
import uiLevel5Metadata from '../../../../packages/ui_level5/seed/metadata.json'
import uiLevel6Metadata from '../../../../packages/ui_level6/seed/metadata.json'
import uiLoginMetadata from '../../../../packages/ui_login/seed/metadata.json'
import uiPagesMetadata from '../../../../packages/ui_pages/seed/metadata.json'
import uiPermissionsMetadata from '../../../../packages/ui_permissions/seed/metadata.json'
import userManagerMetadata from '../../../../packages/user_manager/seed/metadata.json'
import workflowEditorMetadata from '../../../../packages/workflow_editor/seed/metadata.json'
const packages = [
adminDialogMetadata,
arcadeLobbyMetadata,
auditLogMetadata,
codeEditorMetadata,
codegenStudioMetadata,
componentEditorMetadata,
configSummaryMetadata,
cssDesignerMetadata,
dashboardMetadata,
dataTableMetadata,
databaseManagerMetadata,
dbalDemoMetadata,
dropdownManagerMetadata,
formBuilderMetadata,
forumForgeMetadata,
githubToolsMetadata,
ircWebchatMetadata,
jsonScriptExampleMetadata,
mediaCenterMetadata,
navMenuMetadata,
nerdModeIdeMetadata,
notificationCenterMetadata,
packageManagerMetadata,
packageValidatorMetadata,
quickGuideMetadata,
roleEditorMetadata,
routeManagerMetadata,
schemaEditorMetadata,
screenshotAnalyzerMetadata,
smtpConfigMetadata,
socialHubMetadata,
statsGridMetadata,
streamCastMetadata,
testingMetadata,
themeEditorMetadata,
uiAuthMetadata,
uiDialogsMetadata,
uiFooterMetadata,
uiHeaderMetadata,
uiHomeMetadata,
uiIntroMetadata,
uiLevel2Metadata,
uiLevel3Metadata,
uiLevel4Metadata,
uiLevel5Metadata,
uiLevel6Metadata,
uiLoginMetadata,
uiPagesMetadata,
uiPermissionsMetadata,
userManagerMetadata,
workflowEditorMetadata,
]
describe('Package System Integration', () => {
@@ -129,7 +43,7 @@ describe('Package System Integration', () => {
})
it('should have all packages with valid categories', () => {
const validCategories = ['ui', 'utility', 'editor', 'management', 'media', 'testing', 'database', 'components', 'auth', 'data', 'system', 'integration']
const validCategories = ['ui', 'data', 'utility', 'system', 'integration']
packages.forEach(pkg => {
expect(validCategories).toContain(pkg.category)
})

View File

@@ -1,12 +0,0 @@
{
"packageId": "arcade_lobby",
"name": "Arcade Lobby",
"version": "0.1.0",
"description": "Package arcade_lobby",
"author": "MetaBuilder Team",
"category": "media",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "audit_log",
"name": "Audit Log",
"version": "0.1.0",
"description": "Package audit_log",
"author": "MetaBuilder Team",
"category": "utility",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "code_editor",
"name": "Code Editor",
"version": "0.1.0",
"description": "Package code_editor",
"author": "MetaBuilder Team",
"category": "editor",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "codegen_studio",
"name": "Codegen Studio",
"version": "0.1.0",
"description": "Package codegen_studio",
"author": "MetaBuilder Team",
"category": "utility",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "component_editor",
"name": "Component Editor",
"version": "0.1.0",
"description": "Package component_editor",
"author": "MetaBuilder Team",
"category": "editor",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "config_summary",
"name": "Config Summary",
"version": "0.1.0",
"description": "Package config_summary",
"author": "MetaBuilder Team",
"category": "utility",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "css_designer",
"name": "Css Designer",
"version": "0.1.0",
"description": "Package css_designer",
"author": "MetaBuilder Team",
"category": "utility",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "database_manager",
"name": "Database Manager",
"version": "0.1.0",
"description": "Package database_manager",
"author": "MetaBuilder Team",
"category": "management",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "dbal_demo",
"name": "Dbal Demo",
"version": "0.1.0",
"description": "Package dbal_demo",
"author": "MetaBuilder Team",
"category": "database",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "dropdown_manager",
"name": "Dropdown Manager",
"version": "0.1.0",
"description": "Package dropdown_manager",
"author": "MetaBuilder Team",
"category": "management",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "forum_forge",
"name": "Forum Forge",
"version": "0.1.0",
"description": "Package forum_forge",
"author": "MetaBuilder Team",
"category": "utility",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "github_tools",
"name": "Github Tools",
"version": "0.1.0",
"description": "Package github_tools",
"author": "MetaBuilder Team",
"category": "utility",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "irc_webchat",
"name": "Irc Webchat",
"version": "0.1.0",
"description": "Package irc_webchat",
"author": "MetaBuilder Team",
"category": "media",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "json_script_example",
"name": "Json Script Example",
"version": "0.1.0",
"description": "Package json_script_example",
"author": "MetaBuilder Team",
"category": "utility",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "media_center",
"name": "Media Center",
"version": "0.1.0",
"description": "Package media_center",
"author": "MetaBuilder Team",
"category": "media",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "nerd_mode_ide",
"name": "Nerd Mode Ide",
"version": "0.1.0",
"description": "Package nerd_mode_ide",
"author": "MetaBuilder Team",
"category": "utility",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "package_manager",
"name": "Package Manager",
"version": "0.1.0",
"description": "Package package_manager",
"author": "MetaBuilder Team",
"category": "management",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "package_validator",
"name": "Package Validator",
"version": "0.1.0",
"description": "Package package_validator",
"author": "MetaBuilder Team",
"category": "utility",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "quick_guide",
"name": "Quick Guide",
"version": "0.1.0",
"description": "Package quick_guide",
"author": "MetaBuilder Team",
"category": "utility",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "role_editor",
"name": "Role Editor",
"version": "0.1.0",
"description": "Package role_editor",
"author": "MetaBuilder Team",
"category": "editor",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "route_manager",
"name": "Route Manager",
"version": "0.1.0",
"description": "Package route_manager",
"author": "MetaBuilder Team",
"category": "management",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "schema_editor",
"name": "Schema Editor",
"version": "0.1.0",
"description": "Package schema_editor",
"author": "MetaBuilder Team",
"category": "editor",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "screenshot_analyzer",
"name": "Screenshot Analyzer",
"version": "0.1.0",
"description": "Package screenshot_analyzer",
"author": "MetaBuilder Team",
"category": "utility",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "smtp_config",
"name": "Smtp Config",
"version": "0.1.0",
"description": "Package smtp_config",
"author": "MetaBuilder Team",
"category": "utility",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "social_hub",
"name": "Social Hub",
"version": "0.1.0",
"description": "Package social_hub",
"author": "MetaBuilder Team",
"category": "utility",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "stats_grid",
"name": "Stats Grid",
"version": "0.1.0",
"description": "Package stats_grid",
"author": "MetaBuilder Team",
"category": "utility",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "stream_cast",
"name": "Stream Cast",
"version": "0.1.0",
"description": "Package stream_cast",
"author": "MetaBuilder Team",
"category": "utility",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "testing",
"name": "Testing",
"version": "0.1.0",
"description": "Package testing",
"author": "MetaBuilder Team",
"category": "testing",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "theme_editor",
"name": "Theme Editor",
"version": "0.1.0",
"description": "Package theme_editor",
"author": "MetaBuilder Team",
"category": "editor",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "ui_auth",
"name": "Ui Auth",
"version": "0.1.0",
"description": "Package ui_auth",
"author": "MetaBuilder Team",
"category": "ui",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "ui_footer",
"name": "Ui Footer",
"version": "0.1.0",
"description": "Package ui_footer",
"author": "MetaBuilder Team",
"category": "ui",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "ui_header",
"name": "Ui Header",
"version": "0.1.0",
"description": "Package ui_header",
"author": "MetaBuilder Team",
"category": "ui",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "ui_home",
"name": "Ui Home",
"version": "0.1.0",
"description": "Package ui_home",
"author": "MetaBuilder Team",
"category": "ui",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "ui_intro",
"name": "Ui Intro",
"version": "0.1.0",
"description": "Package ui_intro",
"author": "MetaBuilder Team",
"category": "ui",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "ui_level2",
"name": "Ui Level2",
"version": "0.1.0",
"description": "Package ui_level2",
"author": "MetaBuilder Team",
"category": "ui",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "ui_level3",
"name": "Ui Level3",
"version": "0.1.0",
"description": "Package ui_level3",
"author": "MetaBuilder Team",
"category": "ui",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "ui_level4",
"name": "Ui Level4",
"version": "0.1.0",
"description": "Package ui_level4",
"author": "MetaBuilder Team",
"category": "ui",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "ui_level5",
"name": "Ui Level5",
"version": "0.1.0",
"description": "Package ui_level5",
"author": "MetaBuilder Team",
"category": "ui",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "ui_level6",
"name": "Ui Level6",
"version": "0.1.0",
"description": "Package ui_level6",
"author": "MetaBuilder Team",
"category": "ui",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "ui_login",
"name": "Ui Login",
"version": "0.1.0",
"description": "Package ui_login",
"author": "MetaBuilder Team",
"category": "ui",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "ui_pages",
"name": "Ui Pages",
"version": "0.1.0",
"description": "Package ui_pages",
"author": "MetaBuilder Team",
"category": "ui",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "user_manager",
"name": "User Manager",
"version": "0.1.0",
"description": "Package user_manager",
"author": "MetaBuilder Team",
"category": "management",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -1,12 +0,0 @@
{
"packageId": "workflow_editor",
"name": "Workflow Editor",
"version": "0.1.0",
"description": "Package workflow_editor",
"author": "MetaBuilder Team",
"category": "editor",
"exports": {
"components": []
},
"dependencies": []
}

View File

@@ -4,98 +4,7 @@ This directory contains utility scripts for the MetaBuilder project.
## Scripts
### Package Metadata Management
#### `generate-package-metadata.js`
**Purpose:** Automatically generates `seed/metadata.json` files for all packages that don't have them.
**Features:**
- 🔍 Scans all packages in `/packages/` directory
- 📁 Creates `seed/` directories where missing
- 🤖 Generates metadata with intelligent defaults:
- Converts package_id to "Package Name" format
- Auto-categorizes based on package name patterns (ui, editor, management, etc.)
- Sets standard fields (version 0.1.0, author, etc.)
- ⏭️ Skips packages that already have metadata
- 📊 Reports detailed progress and summary
**Usage:**
```bash
node scripts/generate-package-metadata.js
```
**Example output:**
```
🔍 Scanning packages directory...
📦 Found 51 packages
⏭️ admin_dialog: metadata.json already exists
📁 arcade_lobby: created seed/ directory
✅ arcade_lobby: created metadata.json
...
============================================================
📊 Summary:
✅ Created: 43
⏭️ Skipped: 8
❌ Errors: 0
📦 Total: 51
============================================================
```
**Related Documentation:**
- [MVP Package Metadata Migration](../docs/MVP_PACKAGE_METADATA_MIGRATION.md)
- [Package Metadata Schema](../schemas/package-schemas/metadata_schema.json)
---
#### `validate-package-metadata.js`
**Purpose:** Validates all package metadata files against schema requirements.
**Features:**
- ✅ Validates required fields (packageId, name, version, description)
- 🔤 Checks packageId format (snake_case/kebab-case)
- 📋 Validates version format (semver)
- 🔍 Ensures packageId matches directory name
- 🎯 Verifies correct field types
- 🛡️ Validates JSON syntax
**Usage:**
```bash
node scripts/validate-package-metadata.js
```
**Example output:**
```
🔍 Validating package metadata files...
✅ admin_dialog: Valid
✅ arcade_lobby: Valid
✅ dashboard: Valid
...
============================================================
📊 Validation Summary:
✅ Valid: 51
❌ Invalid: 0
🚫 Missing: 0
📦 Total: 51
============================================================
✅ All metadata files are valid!
```
**Related Documentation:**
- [MVP Package Metadata Migration](../docs/MVP_PACKAGE_METADATA_MIGRATION.md)
- [Package Metadata Schema](../schemas/package-schemas/metadata_schema.json)
---
### GitHub Issue Management
#### `triage-duplicate-issues.sh`
### `triage-duplicate-issues.sh`
**Purpose:** Automatically finds and closes duplicate GitHub issues while keeping the most recent one open.
@@ -154,9 +63,7 @@ export SEARCH_TITLE="Your custom issue title"
---
### Testing Scripts
#### `test-triage-logic.sh`
### `test-triage-logic.sh`
**Purpose:** Comprehensive test suite for the triage script logic.
@@ -192,9 +99,7 @@ Test 1: Multiple duplicate issues (should close all except most recent)
---
### Other Utilities
#### `generate_mod.py`
### `generate_mod.py`
**Purpose:** Python script for generating module files.

View File

@@ -1,131 +0,0 @@
#!/usr/bin/env node
/**
* Generate metadata.json files for all packages
* This script ensures all packages have proper seed/metadata.json files
* conforming to the metadata_schema.json in schemas/package-schemas/
*/
const fs = require('fs');
const path = require('path');
const PACKAGES_DIR = path.join(__dirname, '..', 'packages');
const METADATA_SCHEMA = 'https://metabuilder.dev/schemas/package-metadata.schema.json';
/**
* Convert package directory name to human-readable name
* e.g., "ui_auth" -> "UI Auth", "package_manager" -> "Package Manager"
*/
function toHumanReadableName(packageId) {
return packageId
.split(/[_-]/)
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
.join(' ');
}
/**
* Determine package category based on package ID
*/
function determineCategory(packageId) {
if (packageId.startsWith('ui_')) return 'ui';
if (packageId.includes('editor')) return 'editor';
if (packageId.includes('manager')) return 'management';
if (packageId.includes('database') || packageId.includes('dbal')) return 'database';
if (packageId.includes('auth') || packageId.includes('login')) return 'auth';
if (packageId.includes('test')) return 'testing';
if (packageId.includes('media') || packageId.includes('irc') || packageId.includes('arcade')) return 'media';
if (packageId.includes('form') || packageId.includes('component')) return 'components';
return 'utility';
}
/**
* Generate metadata object for a package
*/
function generateMetadata(packageId) {
const name = toHumanReadableName(packageId);
const category = determineCategory(packageId);
return {
packageId,
name,
version: '0.1.0',
description: `Package ${packageId}`,
author: 'MetaBuilder Team',
category,
exports: {
components: []
},
dependencies: []
};
}
/**
* Main function
*/
function main() {
console.log('🔍 Scanning packages directory...');
// Get all package directories
const packageDirs = fs.readdirSync(PACKAGES_DIR, { withFileTypes: true })
.filter(dirent => dirent.isDirectory())
.map(dirent => dirent.name)
.sort();
console.log(`📦 Found ${packageDirs.length} packages\n`);
let created = 0;
let skipped = 0;
let errors = 0;
for (const packageId of packageDirs) {
const packagePath = path.join(PACKAGES_DIR, packageId);
const seedDir = path.join(packagePath, 'seed');
const metadataPath = path.join(seedDir, 'metadata.json');
// Check if metadata.json already exists
if (fs.existsSync(metadataPath)) {
console.log(`⏭️ ${packageId}: metadata.json already exists`);
skipped++;
continue;
}
try {
// Create seed directory if it doesn't exist
if (!fs.existsSync(seedDir)) {
fs.mkdirSync(seedDir, { recursive: true });
console.log(`📁 ${packageId}: created seed/ directory`);
}
// Generate metadata
const metadata = generateMetadata(packageId);
// Write metadata.json
fs.writeFileSync(
metadataPath,
JSON.stringify(metadata, null, 2) + '\n',
'utf-8'
);
console.log(`${packageId}: created metadata.json`);
created++;
} catch (error) {
console.error(`${packageId}: Error - ${error.message}`);
errors++;
}
}
console.log('\n' + '='.repeat(60));
console.log('📊 Summary:');
console.log(` ✅ Created: ${created}`);
console.log(` ⏭️ Skipped: ${skipped}`);
console.log(` ❌ Errors: ${errors}`);
console.log(` 📦 Total: ${packageDirs.length}`);
console.log('='.repeat(60));
if (errors > 0) {
process.exit(1);
}
}
// Run the script
main();

View File

@@ -1,140 +0,0 @@
#!/usr/bin/env node
/**
* Validate all package metadata.json files against the schema
* This performs basic validation without external dependencies
*/
const fs = require('fs');
const path = require('path');
const PACKAGES_DIR = path.join(__dirname, '..', 'packages');
// Required fields from metadata_schema.json
const REQUIRED_FIELDS = ['packageId', 'name', 'version', 'description'];
// Version regex from schema (semver pattern)
const VERSION_REGEX = /^\d+\.\d+\.\d+(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$/;
// PackageId regex from schema (snake_case or kebab-case)
const PACKAGE_ID_REGEX = /^[a-z][a-z0-9_-]*$/;
/**
* Validate a single metadata object
*/
function validateMetadata(packageId, metadata, filePath) {
const errors = [];
// Check required fields
for (const field of REQUIRED_FIELDS) {
if (!metadata[field]) {
errors.push(`Missing required field: ${field}`);
}
}
// Validate packageId format
if (metadata.packageId && !PACKAGE_ID_REGEX.test(metadata.packageId)) {
errors.push(`Invalid packageId format: "${metadata.packageId}" (must be snake_case or kebab-case)`);
}
// Validate packageId matches directory name
if (metadata.packageId && metadata.packageId !== packageId) {
errors.push(`PackageId mismatch: metadata says "${metadata.packageId}" but directory is "${packageId}"`);
}
// Validate version format (semver)
if (metadata.version && !VERSION_REGEX.test(metadata.version)) {
errors.push(`Invalid version format: "${metadata.version}" (must be semver like "1.0.0")`);
}
// Check field types
if (metadata.name && typeof metadata.name !== 'string') {
errors.push(`Field "name" must be a string`);
}
if (metadata.description && typeof metadata.description !== 'string') {
errors.push(`Field "description" must be a string`);
}
if (metadata.dependencies && !Array.isArray(metadata.dependencies)) {
errors.push(`Field "dependencies" must be an array`);
}
return errors;
}
/**
* Main function
*/
function main() {
console.log('🔍 Validating package metadata files...\n');
// Get all package directories
const packageDirs = fs.readdirSync(PACKAGES_DIR, { withFileTypes: true })
.filter(dirent => dirent.isDirectory())
.map(dirent => dirent.name)
.sort();
let valid = 0;
let invalid = 0;
let missing = 0;
const allErrors = [];
for (const packageId of packageDirs) {
const metadataPath = path.join(PACKAGES_DIR, packageId, 'seed', 'metadata.json');
// Check if metadata.json exists
if (!fs.existsSync(metadataPath)) {
console.log(`${packageId}: metadata.json not found`);
missing++;
allErrors.push({ packageId, errors: ['File not found'] });
continue;
}
try {
// Read and parse metadata
const content = fs.readFileSync(metadataPath, 'utf-8');
const metadata = JSON.parse(content);
// Validate
const errors = validateMetadata(packageId, metadata, metadataPath);
if (errors.length === 0) {
console.log(`${packageId}: Valid`);
valid++;
} else {
console.log(`${packageId}: ${errors.length} error(s)`);
errors.forEach(err => console.log(` - ${err}`));
invalid++;
allErrors.push({ packageId, errors });
}
} catch (error) {
console.log(`${packageId}: Parse error - ${error.message}`);
invalid++;
allErrors.push({ packageId, errors: [error.message] });
}
}
console.log('\n' + '='.repeat(60));
console.log('📊 Validation Summary:');
console.log(` ✅ Valid: ${valid}`);
console.log(` ❌ Invalid: ${invalid}`);
console.log(` 🚫 Missing: ${missing}`);
console.log(` 📦 Total: ${packageDirs.length}`);
console.log('='.repeat(60));
if (invalid > 0 || missing > 0) {
console.log('\n❌ Validation failed!');
console.log(`\nPackages with errors (${allErrors.length}):`);
allErrors.forEach(({ packageId, errors }) => {
console.log(`\n${packageId}:`);
errors.forEach(err => console.log(` - ${err}`));
});
process.exit(1);
} else {
console.log('\n✅ All metadata files are valid!');
}
}
// Run the script
main();