tractatus/scripts/load-governance-rules.js
TheFlow 2594c0d812 feat: deployment quickstart kit - 30-minute Docker deployment (Task 6)
Complete production-ready deployment package enabling implementers to deploy
Tractatus with all 5 governance services in 30 minutes using Docker Compose.

**Package Contents (15KB):**

1. docker-compose.yml
   - MongoDB 7.0 with authentication
   - Tractatus Node.js application
   - Health checks and volume management
   - Network configuration

2. Dockerfile
   - Multi-stage build (builder + production)
   - Security-hardened (non-root user, minimal image)
   - Health checks integrated
   - Production-optimized

3. .env.example
   - Complete configuration template
   - All 5 governance service toggles
   - Required secrets (MongoDB, JWT, Admin)
   - Feature flags and optional services
   - Rate limiting, CORS, CSP configuration

4. sample-governance-rules.json
   - 10 production-ready governance rules
   - STR-001: BoundaryEnforcer (human approval for values)
   - STR-002: CrossReferenceValidator (port specifications)
   - OPS-001: ContextPressureMonitor (pressure monitoring)
   - OPS-002: InstructionPersistenceClassifier (classification)
   - TAC-001: MetacognitiveVerifier (complex verification)
   - SYS-001/002: Database and project isolation
   - SEC-001: CSP enforcement
   - VAL-001: Te Tiriti commitment
   - QUAL-001: World-class quality

5. verify-deployment.sh
   - Automated verification (40+ checks)
   - 7 test categories: env, Docker, network, DB, services, security, files
   - Color-coded output (pass/fail/warn)
   - CI/CD integration ready

6. TROUBLESHOOTING.md
   - Comprehensive troubleshooting guide
   - 6 major sections covering common deployment issues
   - Docker, database, application, services, performance, security
   - Quick reference commands

7. README.md
   - "Deploy in 30 minutes" guide
   - 6-step quickstart (2+5+10+3+5+5 minutes)
   - Configuration guide (basic + production)
   - Testing procedures and monitoring
   - Architecture diagram
   - Backup/restore procedures

8. scripts/load-governance-rules.js
   - Loads sample rules into MongoDB
   - JSON validation and error handling
   - Creates indexes (rule_id, quadrant, enforced_by)
   - Summary statistics by quadrant and service

**Implementer Page Updates:**

- Added prominent "Deployment Quickstart Kit" section after hero
- Green gradient background with "NEW" badge
- Two-column layout: description + download / file list
- Download button: /downloads/tractatus-quickstart.tar.gz (15KB)
- Professional design matching site aesthetic

**Deliverables:**

 Production-ready Docker Compose configuration
 Complete environment configuration template
 10 sample governance rules (all 5 services)
 Automated deployment verification (40+ tests)
 Comprehensive troubleshooting guide
 Step-by-step deployment guide (30 minutes)
 Database initialization scripts
 Package deployed to production

**Testing:**

- Package structure validated
- File permissions correct (644/755)
- Deployed to https://agenticgovernance.digital/downloads/
- Implementer page updated with download section

**Roadmap Progress:**

Phase 1, Week 2, Task 6: Deployment Quickstart Kit - COMPLETED
Priority: High | Effort: 3-4 days | Status:  Done

Next: Task 8 - Technical Architecture Diagram (Week 3)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-12 07:27:37 +13:00

128 lines
4.2 KiB
JavaScript
Executable file

#!/usr/bin/env node
/**
* Load Governance Rules into Database
*
* Loads governance rules from JSON file into MongoDB
*
* Usage: node scripts/load-governance-rules.js <rules-file.json>
*/
const fs = require('fs');
const path = require('path');
const { MongoClient } = require('mongodb');
require('dotenv').config();
const MONGODB_URI = process.env.MONGODB_URI || 'mongodb://localhost:27017/tractatus_prod';
async function loadGovernanceRules(rulesFile) {
console.log('🔧 Loading Governance Rules...\n');
// Read rules file
const rulesPath = path.resolve(process.cwd(), rulesFile);
if (!fs.existsSync(rulesPath)) {
console.error(`❌ Error: Rules file not found: ${rulesPath}`);
process.exit(1);
}
let rulesData;
try {
const fileContent = fs.readFileSync(rulesPath, 'utf8');
rulesData = JSON.parse(fileContent);
} catch (error) {
console.error(`❌ Error parsing rules file: ${error.message}`);
process.exit(1);
}
if (!rulesData.rules || !Array.isArray(rulesData.rules)) {
console.error('❌ Error: Invalid rules file format (missing "rules" array)');
process.exit(1);
}
console.log(`📄 Found ${rulesData.rules.length} rules in ${path.basename(rulesFile)}`);
// Connect to MongoDB
const client = new MongoClient(MONGODB_URI);
try {
await client.connect();
console.log('✓ Connected to MongoDB\n');
const db = client.db();
const rulesCollection = db.collection('governance_rules');
// Clear existing rules (optional - comment out to append instead)
const deleteResult = await rulesCollection.deleteMany({});
if (deleteResult.deletedCount > 0) {
console.log(`🗑️ Cleared ${deleteResult.deletedCount} existing rules\n`);
}
// Insert rules
const rules = rulesData.rules.map(rule => ({
...rule,
createdAt: new Date(),
updatedAt: new Date(),
active: true,
source: 'manual_load',
version: rulesData.version || '1.0.0'
}));
const insertResult = await rulesCollection.insertMany(rules);
console.log(`✓ Inserted ${insertResult.insertedCount} governance rules\n`);
// Create indexes
await rulesCollection.createIndex({ rule_id: 1 }, { unique: true });
await rulesCollection.createIndex({ quadrant: 1 });
await rulesCollection.createIndex({ persistence: 1 });
await rulesCollection.createIndex({ enforced_by: 1 });
console.log('✓ Created indexes\n');
// Summary
console.log('╔════════════════════════════════════════════════════════════════════╗');
console.log('║ Rules Loaded Successfully ║');
console.log('╚════════════════════════════════════════════════════════════════════╝\n');
// Count by quadrant
const quadrantCounts = await rulesCollection.aggregate([
{ $group: { _id: '$quadrant', count: { $sum: 1 } } },
{ $sort: { _id: 1 } }
]).toArray();
console.log('Rules by Quadrant:');
quadrantCounts.forEach(({ _id, count }) => {
console.log(` ${_id}: ${count}`);
});
console.log('');
// Count by service
const serviceCounts = await rulesCollection.aggregate([
{ $group: { _id: '$enforced_by', count: { $sum: 1 } } },
{ $sort: { count: -1 } }
]).toArray();
console.log('Rules by Service:');
serviceCounts.forEach(({ _id, count }) => {
console.log(` ${_id}: ${count}`);
});
console.log('\n✅ Governance rules successfully loaded!\n');
} catch (error) {
console.error('❌ Error loading rules:', error.message);
process.exit(1);
} finally {
await client.close();
}
}
// Main
if (process.argv.length < 3) {
console.error('Usage: node scripts/load-governance-rules.js <rules-file.json>');
console.error('Example: node scripts/load-governance-rules.js deployment-quickstart/sample-governance-rules.json');
process.exit(1);
}
const rulesFile = process.argv[2];
loadGovernanceRules(rulesFile);