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>
128 lines
4.2 KiB
JavaScript
Executable file
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);
|