Add CMMI maturity level to compliance controls

Adds an optional CMMI 0-5 maturity level field to Control to support
ISO 27001 clause 9.1 effectiveness measurement and HITRUST CSF maturity
requirements. The field is nullable, framework-agnostic, and exposed
across all four API surfaces (GraphQL, MCP, CLI, n8n) plus the
generated SoA document.

Signed-off-by: Alejandro Juan <alejandrojuan@alejandrojuan.com>
This commit is contained in:
Alejandro Juan
2026-04-20 13:26:19 +02:00
committed by Sacha Al Himdani
parent 98487953b9
commit da91afc2a7
31 changed files with 919 additions and 25 deletions

View File

@@ -69,6 +69,29 @@ export const description: INodeProperties[] = [
default: '',
description: 'The description of the control',
},
{
displayName: 'Maturity Level',
name: 'maturityLevel',
type: 'options',
displayOptions: {
show: {
resource: ['control'],
operation: ['update'],
},
},
options: [
{ name: '(Unchanged)', value: '' },
{ name: '0 - None', value: 'NONE' },
{ name: '1 - Initial', value: 'INITIAL' },
{ name: '2 - Managed', value: 'MANAGED' },
{ name: '3 - Defined', value: 'DEFINED' },
{ name: '4 - Quantitatively Managed', value: 'QUANTITATIVELY_MANAGED' },
{ name: '5 - Optimizing', value: 'OPTIMIZING' },
{ name: 'Not Set', value: '__unset__' },
],
default: '',
description: 'CMMI 0-5 maturity level. Choose "Not set" to clear the value.',
},
];
export async function execute(
@@ -79,6 +102,7 @@ export async function execute(
const sectionTitle = this.getNodeParameter('sectionTitle', itemIndex, '') as string;
const name = this.getNodeParameter('name', itemIndex, '') as string;
const description = this.getNodeParameter('description', itemIndex, '') as string;
const maturityLevel = this.getNodeParameter('maturityLevel', itemIndex, '') as string;
const query = `
mutation UpdateControl($input: UpdateControlInput!) {
@@ -88,6 +112,7 @@ export async function execute(
sectionTitle
name
description
maturityLevel
createdAt
updatedAt
}
@@ -95,10 +120,15 @@ export async function execute(
}
`;
const input: Record<string, string> = { id };
const input: Record<string, string | null> = { id };
if (sectionTitle) input.sectionTitle = sectionTitle;
if (name) input.name = name;
if (description) input.description = description;
if (maturityLevel === '__unset__') {
input.maturityLevel = null;
} else if (maturityLevel) {
input.maturityLevel = maturityLevel;
}
const responseData = await proboApiRequest.call(this, query, { input });