Files
2025-11-30 09:02:33 +08:00

326 lines
7.7 KiB
Markdown

# Fluxwing Validator
Deterministic validation for uxscii components and screens.
## Two Modes of Operation
### Interactive Mode (User Invocation)
When users say "Validate my components", the skill:
1. Presents menu (everything/components/screens/custom)
2. Runs appropriate validators
3. Shows minimal summary with optional details
**Example:**
```
✓ 12/14 components valid
✗ 2/14 components failed
Show error details? (yes/no)
```
### Direct Mode (Skill-to-Skill)
Other skills call validator scripts directly:
```bash
node {SKILL_ROOT}/../fluxwing-validator/validate-component.js \
./fluxwing/components/button.uxm \
{SKILL_ROOT}/schemas/uxm-component.schema.json
```
Output: Always verbose (full errors, warnings, stats)
Exit codes: 0 = valid, 1 = errors, 2 = invalid args
---
## Overview
This skill contains validation scripts that can be called from Claude Code skills to validate `.uxm` component files against JSON Schema with additional uxscii-specific checks.
**Key features:**
-**Deterministic** - Locked dependencies via `package-lock.json`
-**Zero setup** - `node_modules` bundled in repository
-**Fast** - ~80ms execution time with ajv
-**Comprehensive** - Schema validation + uxscii-specific rules
-**Structured output** - JSON and human-readable formats
## Installation
This skill is bundled with fluxwing-skills plugin.
**Plugin install:**
```bash
/plugin install fluxwing-skills
```
**Script install (development):**
```bash
./scripts/install.sh
```
No npm install required - dependencies bundled with skill.
## Files
```
skills/fluxwing-validator/
├── SKILL.md # Interactive validation workflow
├── validate-component.js # Component validator
├── validate-screen.js # Screen validator
├── validate-batch.js # Batch validator
├── test-validator.js # Component test suite
├── test-screen-validator.js # Screen test suite
├── package.json # Dependencies (ajv 8.12.0)
├── package-lock.json # Locked versions
├── node_modules/ # Bundled dependencies (~7.4 MB)
└── README.md # This file
```
## Usage
### From Command Line
```bash
# From project root
node skills/fluxwing-validator/validate-component.js \
./fluxwing/components/component.uxm \
skills/fluxwing-component-creator/schemas/uxm-component.schema.json
# JSON output (for programmatic use)
node skills/fluxwing-validator/validate-component.js \
./fluxwing/components/component.uxm \
skills/fluxwing-component-creator/schemas/uxm-component.schema.json \
--json
```
### From Other Skills (using SKILL_ROOT)
```bash
# In SKILL.md - Direct mode validation
node {SKILL_ROOT}/../fluxwing-validator/validate-component.js \
./fluxwing/components/button.uxm \
{SKILL_ROOT}/schemas/uxm-component.schema.json
```
### Exit Codes
- `0` - Component is valid
- `1` - Validation errors found
- `2` - Missing dependencies or invalid arguments
## Validation Checks
### 1. JSON Schema Validation
Validates against `uxm-component.schema.json` using ajv (Draft 7):
- Required fields (id, type, version, metadata, props, ascii)
- Field types and formats
- Enum constraints (type, category, fidelity)
- Pattern matching (id format, version format)
- Array and object structures
### 2. ASCII Template File
- Checks that corresponding `.md` file exists
- Validates path: `component.uxm``component.md`
### 3. Template Variables
- Extracts `{{variables}}` from `.md` template
- Compares against `ascii.variables` in `.uxm`
- Warns if variables in `.md` are not defined in `.uxm`
- Supports both formats:
- Array of strings: `["text", "value"]`
- Array of objects: `[{"name": "text", "type": "string"}]`
### 4. Accessibility
For interactive components (with `behavior.interactions`):
- Warns if missing `behavior.accessibility.role`
- Warns if `focusable` is not set
### 5. ASCII Dimensions
- Warns if `ascii.width` > 120 (terminal width limit)
- Warns if `ascii.height` > 50 (single viewport limit)
### 6. State Properties
- Warns if states exist but have no properties defined
## Output Format
### Human-Readable
```
✓ Valid: primary-button
Type: button
Version: 1.0.0
States: 4
Props: 5
Warnings: 1
1. Interactive component should have ARIA role
Location: behavior → accessibility → role
```
### JSON
```json
{
"valid": true,
"errors": [],
"warnings": [
{
"path": ["behavior", "accessibility", "role"],
"message": "Interactive component should have ARIA role",
"type": "accessibility"
}
],
"stats": {
"id": "primary-button",
"type": "button",
"version": "1.0.0",
"states": 4,
"props": 5,
"interactive": true,
"hasAccessibility": true
}
}
```
## Dependencies
Only 6 packages, 2.7 MB total:
- `ajv@8.12.0` - JSON Schema validator (industry standard)
- `ajv-formats@2.1.1` - Format validation (date-time, etc.)
- Supporting packages (fast-deep-equal, fast-uri, json-schema-traverse, require-from-string)
**All dependencies are bundled in `node_modules/` and checked into git.**
## Node.js Version
- **Minimum:** Node.js 14.0.0
- **Recommended:** Node.js 18+ or 20+ (LTS)
- **Tested:** Node.js 18, 20, 22
## Testing
```bash
# Run test suite against bundled templates
npm test
# Or directly
node test-validator.js
```
Tests validate components from:
- `skills/fluxwing-component-creator/templates/*.uxm`
## Development
### Updating Validation Logic
1. Edit `validate-component.js`
2. Test changes: `npm test`
3. Commit (no build step needed)
### Updating Dependencies
```bash
npm update
npm audit fix
npm test
git add package-lock.json node_modules/
git commit -m "Update dependencies"
```
### Adding New Validators
Create new scripts following the same pattern:
- `validate-screen.js` - For screen validation
- `validate-variable.js` - For variable substitution
## Why Node.js?
Compared to Python or native binaries:
**Advantages:**
- ✅ No build step (unlike Go/Rust/Deno compiled)
- ✅ Readable source code (easier debugging)
- ✅ Small diffs (text, not binaries)
- ✅ Likely installed (most developers have Node.js)
- ✅ Mature ecosystem (ajv is industry standard)
- ✅ Fast enough (~80ms including startup)
**Tradeoffs:**
- ⚠️ Requires Node.js runtime (not zero-dependency)
- ⚠️ Slower than native (~80ms vs ~5ms for Go)
## Integration Examples
### Component Creator Skill
```bash
# After creating component (from SKILL.md)
node {SKILL_ROOT}/../fluxwing-validator/validate-component.js \
./fluxwing/components/${COMPONENT_ID}.uxm \
{SKILL_ROOT}/schemas/uxm-component.schema.json
if [ $? -eq 0 ]; then
echo "✓ Component validated successfully"
else
echo "✗ Validation failed - see errors above"
exit 1
fi
```
### Pre-commit Hook
```bash
# .claude/hooks/pre-commit.sh
for uxm_file in fluxwing/components/*.uxm; do
node skills/fluxwing-validator/validate-component.js \
"$uxm_file" \
skills/fluxwing-component-creator/schemas/uxm-component.schema.json \
|| exit 1
done
```
## Troubleshooting
### "ajv libraries not found"
The validator couldn't find the ajv dependency. This should never happen since `node_modules/` is bundled, but if it does:
```bash
cd skills/fluxwing-validator
npm install
```
### "Component file not found"
Check that the path to the `.uxm` file is correct. Paths are relative to the current working directory.
### "Invalid JSON"
The `.uxm` file has syntax errors. Use a JSON validator to find the issue:
```bash
cat component.uxm | jq .
```
## Future Enhancements
- [x] Screen validation (`validate-screen.js`)
- [x] Batch validation (`validate-batch.js`)
- [ ] Variable substitution validation
- [ ] Watch mode for development
- [ ] Integration with CI/CD pipelines
- [ ] VSCode extension integration
## License
MIT