Major Features:
- Multi-project governance with Rule Manager web UI
- Project Manager for organizing governance across projects
- Variable substitution system (${VAR_NAME} in rules)
- Claude.md analyzer for instruction extraction
- Rule quality scoring and optimization
Admin UI Components:
- /admin/rule-manager.html - Full-featured rule management interface
- /admin/project-manager.html - Multi-project administration
- /admin/claude-md-migrator.html - Import rules from Claude.md files
- Dashboard enhancements for governance analytics
Backend Implementation:
- Controllers: projects, rules, variables
- Models: Project, VariableValue, enhanced GovernanceRule
- Routes: /api/projects, /api/rules with full CRUD
- Services: ClaudeMdAnalyzer, RuleOptimizer, VariableSubstitution
- Utilities: mongoose helpers
Documentation:
- User guides for Rule Manager and Projects
- Complete API documentation (PROJECTS_API, RULES_API)
- Phase 3 planning and architecture diagrams
- Test results and error analysis
- Coding best practices summary
Testing & Scripts:
- Integration tests for projects API
- Unit tests for variable substitution
- Database migration scripts
- Seed data generation
- Test token generator
Key Capabilities:
✅ UNIVERSAL scope rules apply across all projects
✅ PROJECT_SPECIFIC rules override for individual projects
✅ Variable substitution per-project (e.g., ${DB_PORT} → 27017)
✅ Real-time validation and quality scoring
✅ Advanced filtering and search
✅ Import from existing Claude.md files
Technical Details:
- MongoDB-backed governance persistence
- RESTful API with Express
- JWT authentication for admin endpoints
- CSP-compliant frontend (no inline handlers)
- Responsive Tailwind UI
This implements Phase 3 architecture as documented in planning docs.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
73 lines
2 KiB
JavaScript
73 lines
2 KiB
JavaScript
/**
|
|
* Rules Routes
|
|
* Multi-Project Governance Manager - Rule Management API
|
|
*/
|
|
|
|
const express = require('express');
|
|
const router = express.Router();
|
|
|
|
const rulesController = require('../controllers/rules.controller');
|
|
const { authenticateToken, requireRole } = require('../middleware/auth.middleware');
|
|
const { validateRequired } = require('../middleware/validation.middleware');
|
|
const { asyncHandler } = require('../middleware/error.middleware');
|
|
|
|
/**
|
|
* All rule routes require authentication and admin/moderator role
|
|
*/
|
|
router.use(authenticateToken);
|
|
router.use(requireRole('admin', 'moderator'));
|
|
|
|
/**
|
|
* Rules CRUD Operations
|
|
*/
|
|
|
|
// GET /api/admin/rules - List all rules (with filtering, sorting, pagination)
|
|
router.get('/',
|
|
asyncHandler(rulesController.listRules)
|
|
);
|
|
|
|
// GET /api/admin/rules/stats - Get dashboard statistics
|
|
router.get('/stats',
|
|
asyncHandler(rulesController.getRuleStats)
|
|
);
|
|
|
|
// POST /api/admin/rules/analyze-claude-md - Analyze CLAUDE.md content
|
|
router.post('/analyze-claude-md',
|
|
validateRequired(['content']),
|
|
asyncHandler(rulesController.analyzeClaudeMd)
|
|
);
|
|
|
|
// POST /api/admin/rules/migrate-from-claude-md - Create rules from CLAUDE.md analysis
|
|
router.post('/migrate-from-claude-md',
|
|
validateRequired(['selectedCandidates']),
|
|
asyncHandler(rulesController.migrateFromClaudeMd)
|
|
);
|
|
|
|
// GET /api/admin/rules/:id - Get single rule
|
|
router.get('/:id',
|
|
asyncHandler(rulesController.getRule)
|
|
);
|
|
|
|
// POST /api/admin/rules/:id/optimize - Optimize a rule with AI
|
|
router.post('/:id/optimize',
|
|
asyncHandler(rulesController.optimizeRule)
|
|
);
|
|
|
|
// POST /api/admin/rules - Create new rule
|
|
router.post('/',
|
|
validateRequired(['id', 'text', 'quadrant', 'persistence']),
|
|
asyncHandler(rulesController.createRule)
|
|
);
|
|
|
|
// PUT /api/admin/rules/:id - Update rule
|
|
router.put('/:id',
|
|
asyncHandler(rulesController.updateRule)
|
|
);
|
|
|
|
// DELETE /api/admin/rules/:id - Delete rule (soft delete by default)
|
|
router.delete('/:id',
|
|
requireRole('admin'), // Only admins can delete rules
|
|
asyncHandler(rulesController.deleteRule)
|
|
);
|
|
|
|
module.exports = router;
|