404 lines
12 KiB
JavaScript
Executable File
404 lines
12 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
|
|
/**
|
|
* Wolf Governance Compliance Check Script
|
|
* Validates compliance requirements for different types of work
|
|
*
|
|
* Usage:
|
|
* node check.js --type "feature" --risk "medium"
|
|
* node check.js --type "bug" --labels "security,hotfix"
|
|
* node check.js --type "architecture" --scope "major"
|
|
* node check.js --checklist # Full compliance checklist
|
|
*/
|
|
|
|
import { fileURLToPath } from 'url';
|
|
import { dirname } from 'path';
|
|
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = dirname(__filename);
|
|
|
|
// Compliance requirements by work type
|
|
const complianceMatrix = {
|
|
'bug': {
|
|
required: {
|
|
approvals: ['code-review'],
|
|
evidence: ['tests', 'root-cause-analysis'],
|
|
gates: ['ci-pass', 'tests-pass'],
|
|
documentation: ['journal-entry']
|
|
},
|
|
optional: {
|
|
approvals: [],
|
|
evidence: ['performance-impact'],
|
|
gates: ['security-scan']
|
|
}
|
|
},
|
|
'feature': {
|
|
required: {
|
|
approvals: ['pm-approval', 'code-review'],
|
|
evidence: ['acceptance-criteria-met', 'tests', 'documentation'],
|
|
gates: ['dod-complete', 'ci-pass', 'tests-pass'],
|
|
documentation: ['journal-entry', 'user-docs']
|
|
},
|
|
optional: {
|
|
approvals: ['ux-review'],
|
|
evidence: ['performance-benchmarks'],
|
|
gates: ['accessibility-check']
|
|
}
|
|
},
|
|
'security': {
|
|
required: {
|
|
approvals: ['security-review', 'code-review'],
|
|
evidence: ['threat-model', 'security-scan', 'penetration-test'],
|
|
gates: ['security-gates', 'ci-pass', 'tests-pass'],
|
|
documentation: ['journal-entry', 'security-docs', 'adr']
|
|
},
|
|
optional: {
|
|
approvals: ['ciso-approval'],
|
|
evidence: ['third-party-audit'],
|
|
gates: ['compliance-check']
|
|
}
|
|
},
|
|
'architecture': {
|
|
required: {
|
|
approvals: ['architect-approval', 'code-review'],
|
|
evidence: ['adr', 'impact-analysis', 'migration-plan'],
|
|
gates: ['full-suite', 'ci-pass', 'backward-compatibility'],
|
|
documentation: ['adr', 'journal-entry', 'architecture-docs']
|
|
},
|
|
optional: {
|
|
approvals: ['cto-approval'],
|
|
evidence: ['performance-analysis', 'cost-analysis'],
|
|
gates: ['load-testing']
|
|
}
|
|
},
|
|
'refactor': {
|
|
required: {
|
|
approvals: ['code-review'],
|
|
evidence: ['tests', 'behavior-unchanged', 'complexity-metrics'],
|
|
gates: ['ci-pass', 'tests-pass', 'coverage-maintained'],
|
|
documentation: ['journal-entry']
|
|
},
|
|
optional: {
|
|
approvals: ['architect-review'],
|
|
evidence: ['performance-improvement'],
|
|
gates: ['mutation-testing']
|
|
}
|
|
},
|
|
'process': {
|
|
required: {
|
|
approvals: ['pm-approval', 'architect-approval'],
|
|
evidence: ['adr', 'stakeholder-review', 'impact-assessment'],
|
|
gates: ['governance-check'],
|
|
documentation: ['adr', 'process-docs', 'communication-plan']
|
|
},
|
|
optional: {
|
|
approvals: ['executive-approval'],
|
|
evidence: ['pilot-results'],
|
|
gates: []
|
|
}
|
|
},
|
|
'hotfix': {
|
|
required: {
|
|
approvals: ['code-review', 'emergency-approval'],
|
|
evidence: ['incident-report', 'fix-validation'],
|
|
gates: ['smoke-tests', 'critical-paths'],
|
|
documentation: ['incident-journal', 'post-mortem']
|
|
},
|
|
optional: {
|
|
approvals: [],
|
|
evidence: [],
|
|
gates: []
|
|
}
|
|
}
|
|
};
|
|
|
|
// Risk modifiers
|
|
const riskModifiers = {
|
|
'low': {
|
|
additional_approvals: [],
|
|
additional_evidence: [],
|
|
additional_gates: []
|
|
},
|
|
'medium': {
|
|
additional_approvals: ['second-reviewer'],
|
|
additional_evidence: ['extended-testing'],
|
|
additional_gates: ['extended-tests']
|
|
},
|
|
'high': {
|
|
additional_approvals: ['security-review', 'second-reviewer'],
|
|
additional_evidence: ['rollback-plan', 'monitoring-plan'],
|
|
additional_gates: ['security-scan', 'performance-tests']
|
|
},
|
|
'critical': {
|
|
additional_approvals: ['executive-approval', 'security-review', 'architect-approval'],
|
|
additional_evidence: ['staged-rollout-plan', 'incident-response-plan', 'communication-plan'],
|
|
additional_gates: ['full-suite', 'security-audit', 'load-testing']
|
|
}
|
|
};
|
|
|
|
// Quality gates definitions
|
|
const qualityGates = {
|
|
'ci-pass': {
|
|
name: 'CI Pipeline Pass',
|
|
requirements: ['All CI checks green', 'No failing builds'],
|
|
blocking: true
|
|
},
|
|
'tests-pass': {
|
|
name: 'Tests Passing',
|
|
requirements: ['Unit tests pass', 'Integration tests pass'],
|
|
blocking: true
|
|
},
|
|
'dod-complete': {
|
|
name: 'Definition of Done',
|
|
requirements: ['All DoD criteria met', 'Documentation updated', 'Tests written'],
|
|
blocking: true
|
|
},
|
|
'security-gates': {
|
|
name: 'Security Gates',
|
|
requirements: ['Security scan clean', '0 critical vulnerabilities', '≤5 high vulnerabilities'],
|
|
blocking: true
|
|
},
|
|
'full-suite': {
|
|
name: 'Full Test Suite',
|
|
requirements: ['E2E tests pass (90%)', 'Performance score ≥70', 'Security score ≥80'],
|
|
blocking: true
|
|
},
|
|
'governance-check': {
|
|
name: 'Governance Validation',
|
|
requirements: ['Process compliance', 'Documentation complete', 'Approvals obtained'],
|
|
blocking: true
|
|
},
|
|
'smoke-tests': {
|
|
name: 'Smoke Tests',
|
|
requirements: ['Core functionality works', 'No regressions in critical paths'],
|
|
blocking: true
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Get compliance requirements for a work type
|
|
*/
|
|
function getCompliance(type, risk = 'low', labels = []) {
|
|
const baseCompliance = complianceMatrix[type.toLowerCase()];
|
|
|
|
if (!baseCompliance) {
|
|
return {
|
|
error: `Unknown work type: ${type}`,
|
|
available_types: Object.keys(complianceMatrix)
|
|
};
|
|
}
|
|
|
|
const riskMod = riskModifiers[risk.toLowerCase()] || riskModifiers.low;
|
|
|
|
// Build complete requirements
|
|
const requirements = {
|
|
type: type,
|
|
risk: risk,
|
|
labels: labels,
|
|
required: {
|
|
approvals: [...baseCompliance.required.approvals, ...riskMod.additional_approvals],
|
|
evidence: [...baseCompliance.required.evidence, ...riskMod.additional_evidence],
|
|
gates: [...baseCompliance.required.gates, ...riskMod.additional_gates],
|
|
documentation: baseCompliance.required.documentation
|
|
},
|
|
optional: baseCompliance.optional,
|
|
checklist: []
|
|
};
|
|
|
|
// Generate checklist
|
|
requirements.checklist = generateChecklist(requirements);
|
|
|
|
// Add special requirements based on labels
|
|
if (labels.includes('security')) {
|
|
requirements.required.approvals.push('security-review');
|
|
requirements.required.gates.push('security-scan');
|
|
}
|
|
|
|
if (labels.includes('breaking-change')) {
|
|
requirements.required.evidence.push('migration-guide');
|
|
requirements.required.documentation.push('breaking-change-notice');
|
|
}
|
|
|
|
if (labels.includes('performance')) {
|
|
requirements.required.evidence.push('performance-benchmarks');
|
|
requirements.required.gates.push('performance-tests');
|
|
}
|
|
|
|
// Remove duplicates
|
|
requirements.required.approvals = [...new Set(requirements.required.approvals)];
|
|
requirements.required.evidence = [...new Set(requirements.required.evidence)];
|
|
requirements.required.gates = [...new Set(requirements.required.gates)];
|
|
|
|
return requirements;
|
|
}
|
|
|
|
/**
|
|
* Generate compliance checklist
|
|
*/
|
|
function generateChecklist(requirements) {
|
|
const checklist = [];
|
|
|
|
// Approvals checklist
|
|
requirements.required.approvals.forEach(approval => {
|
|
checklist.push({
|
|
category: 'Approval',
|
|
item: approval.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()),
|
|
required: true,
|
|
status: 'pending'
|
|
});
|
|
});
|
|
|
|
// Evidence checklist
|
|
requirements.required.evidence.forEach(evidence => {
|
|
checklist.push({
|
|
category: 'Evidence',
|
|
item: evidence.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()),
|
|
required: true,
|
|
status: 'pending'
|
|
});
|
|
});
|
|
|
|
// Gates checklist
|
|
requirements.required.gates.forEach(gate => {
|
|
const gateInfo = qualityGates[gate];
|
|
checklist.push({
|
|
category: 'Quality Gate',
|
|
item: gateInfo ? gateInfo.name : gate.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()),
|
|
required: true,
|
|
blocking: gateInfo ? gateInfo.blocking : true,
|
|
status: 'pending'
|
|
});
|
|
});
|
|
|
|
// Documentation checklist
|
|
requirements.required.documentation.forEach(doc => {
|
|
checklist.push({
|
|
category: 'Documentation',
|
|
item: doc.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()),
|
|
required: true,
|
|
status: 'pending'
|
|
});
|
|
});
|
|
|
|
return checklist;
|
|
}
|
|
|
|
/**
|
|
* Get full compliance checklist
|
|
*/
|
|
function getFullChecklist() {
|
|
return {
|
|
pre_work: [
|
|
{ item: 'Review relevant Wolf principles', required: true },
|
|
{ item: 'Determine behavioral archetype', required: true },
|
|
{ item: 'Check role responsibilities', required: true },
|
|
{ item: 'Verify governance requirements', required: true }
|
|
],
|
|
during_work: [
|
|
{ item: 'Follow test-driven development', required: false },
|
|
{ item: 'Write tests for new code', required: true },
|
|
{ item: 'Update documentation', required: true },
|
|
{ item: 'Create journal entries', required: true },
|
|
{ item: 'Run linting and formatting', required: true }
|
|
],
|
|
pre_commit: [
|
|
{ item: 'Run fast-lane tests', required: true },
|
|
{ item: 'Fix linting errors', required: true },
|
|
{ item: 'Update journal with decisions', required: true },
|
|
{ item: 'Verify CI will pass', required: true }
|
|
],
|
|
pre_merge: [
|
|
{ item: 'Code review approved', required: true },
|
|
{ item: 'CI/CD pipeline green', required: true },
|
|
{ item: 'Documentation updated', required: true },
|
|
{ item: 'Quality gates passed', required: true },
|
|
{ item: 'No security vulnerabilities', required: true }
|
|
],
|
|
post_merge: [
|
|
{ item: 'Verify deployment successful', required: true },
|
|
{ item: 'Monitor for issues', required: true },
|
|
{ item: 'Update release notes', required: false },
|
|
{ item: 'Conduct retrospective', required: false }
|
|
]
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Get escalation path for issues
|
|
*/
|
|
function getEscalationPath(domain) {
|
|
const paths = {
|
|
technical: ['Developer', 'Code Reviewer', 'Architect', 'CTO'],
|
|
process: ['Agent', 'PM', 'Orchestrator', 'Product Owner'],
|
|
security: ['ANY', 'Security Agent', 'CISO', 'Executive'],
|
|
quality: ['QA', 'QA Lead', 'Release Manager', 'VP Engineering'],
|
|
business: ['PM', 'Product Owner', 'VP Product', 'Executive']
|
|
};
|
|
|
|
return paths[domain.toLowerCase()] || paths.process;
|
|
}
|
|
|
|
// Parse command line arguments
|
|
function parseArgs() {
|
|
const args = process.argv.slice(2);
|
|
const options = {};
|
|
|
|
for (let i = 0; i < args.length; i++) {
|
|
if (args[i] === '--type' && args[i + 1]) {
|
|
options.type = args[i + 1];
|
|
i++;
|
|
} else if (args[i] === '--risk' && args[i + 1]) {
|
|
options.risk = args[i + 1];
|
|
i++;
|
|
} else if (args[i] === '--labels' && args[i + 1]) {
|
|
options.labels = args[i + 1].split(',').map(l => l.trim());
|
|
i++;
|
|
} else if (args[i] === '--checklist') {
|
|
options.checklist = true;
|
|
} else if (args[i] === '--escalation' && args[i + 1]) {
|
|
options.escalation = args[i + 1];
|
|
i++;
|
|
}
|
|
}
|
|
|
|
return options;
|
|
}
|
|
|
|
// Main execution
|
|
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
const options = parseArgs();
|
|
let result;
|
|
|
|
if (options.checklist) {
|
|
result = getFullChecklist();
|
|
} else if (options.escalation) {
|
|
result = {
|
|
domain: options.escalation,
|
|
path: getEscalationPath(options.escalation)
|
|
};
|
|
} else if (options.type) {
|
|
result = getCompliance(
|
|
options.type,
|
|
options.risk || 'low',
|
|
options.labels || []
|
|
);
|
|
} else {
|
|
result = {
|
|
error: "Please specify --type, --checklist, or --escalation",
|
|
usage: "node check.js --type feature [--risk medium] [--labels security,performance]",
|
|
available_types: Object.keys(complianceMatrix),
|
|
risk_levels: Object.keys(riskModifiers)
|
|
};
|
|
}
|
|
|
|
console.log(JSON.stringify(result, null, 2));
|
|
}
|
|
|
|
// Export for use as module
|
|
export {
|
|
getCompliance,
|
|
getFullChecklist,
|
|
getEscalationPath,
|
|
complianceMatrix,
|
|
qualityGates
|
|
}; |