mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-24 13:54:57 +00:00
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:
@@ -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**
|
||||
@@ -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)
|
||||
})
|
||||
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"packageId": "testing",
|
||||
"name": "Testing",
|
||||
"version": "0.1.0",
|
||||
"description": "Package testing",
|
||||
"author": "MetaBuilder Team",
|
||||
"category": "testing",
|
||||
"exports": {
|
||||
"components": []
|
||||
},
|
||||
"dependencies": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
Reference in New Issue
Block a user