293 lines
7.6 KiB
JSON
293 lines
7.6 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://toolctrl.local/docs/feature-manifests/schema.json",
|
|
"title": "ToolCTRL Feature Manifest",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"schemaVersion",
|
|
"id",
|
|
"title",
|
|
"classification",
|
|
"status",
|
|
"owner",
|
|
"description",
|
|
"rationale",
|
|
"codeAreas",
|
|
"dependencies",
|
|
"consumers",
|
|
"integration",
|
|
"boundaries",
|
|
"pruning",
|
|
"validation"
|
|
],
|
|
"properties": {
|
|
"schemaVersion": {
|
|
"type": "string",
|
|
"const": "1.0"
|
|
},
|
|
"id": {
|
|
"type": "string",
|
|
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"classification": {
|
|
"type": "string",
|
|
"enum": ["core", "plugin-candidate", "remove-candidate", "mixed"]
|
|
},
|
|
"status": {
|
|
"type": "string",
|
|
"enum": ["active", "proposed", "review-needed"]
|
|
},
|
|
"owner": {
|
|
"type": "string",
|
|
"description": "Planning owner or broad ownership area, not a code owner assignment."
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"rationale": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"codeAreas": {
|
|
"type": "array",
|
|
"description": "Likely source locations. Paths may be globs or package/module names.",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"dependencies": {
|
|
"type": "array",
|
|
"description": "Feature manifest IDs this feature needs to function.",
|
|
"items": {
|
|
"type": "string",
|
|
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
}
|
|
},
|
|
"consumers": {
|
|
"type": "array",
|
|
"description": "Feature manifest IDs or feature surfaces that depend on this one.",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"components": {
|
|
"type": "array",
|
|
"description": "Optional list for bundle manifests such as plugin or removal candidates.",
|
|
"items": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["id", "title", "rationale", "codeAreas"],
|
|
"properties": {
|
|
"id": {
|
|
"type": "string",
|
|
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
},
|
|
"title": {
|
|
"type": "string"
|
|
},
|
|
"rationale": {
|
|
"type": "string"
|
|
},
|
|
"codeAreas": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"notes": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"integration": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"ownership",
|
|
"surfaces",
|
|
"configuration",
|
|
"workers",
|
|
"externalProviders",
|
|
"permissions",
|
|
"auditEvents",
|
|
"billingImpacts",
|
|
"uat"
|
|
],
|
|
"properties": {
|
|
"ownership": {
|
|
"type": "string",
|
|
"enum": ["tenant-owned", "admin-managed", "hybrid", "system-only"]
|
|
},
|
|
"surfaces": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["adminRoutes", "tenantRoutes", "publicRoutes", "apiRoutes"],
|
|
"properties": {
|
|
"adminRoutes": {
|
|
"type": "array",
|
|
"items": { "type": "string" }
|
|
},
|
|
"tenantRoutes": {
|
|
"type": "array",
|
|
"items": { "type": "string" }
|
|
},
|
|
"publicRoutes": {
|
|
"type": "array",
|
|
"items": { "type": "string" }
|
|
},
|
|
"apiRoutes": {
|
|
"type": "array",
|
|
"items": { "type": "string" }
|
|
}
|
|
}
|
|
},
|
|
"configuration": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["admin", "tenant", "environment", "secrets"],
|
|
"properties": {
|
|
"admin": {
|
|
"type": "array",
|
|
"description": "Admin-owned settings, provider credentials, policy, and defaults.",
|
|
"items": { "type": "string" }
|
|
},
|
|
"tenant": {
|
|
"type": "array",
|
|
"description": "Tenant-owned settings visible or editable in tenant surfaces.",
|
|
"items": { "type": "string" }
|
|
},
|
|
"environment": {
|
|
"type": "array",
|
|
"description": "Required environment variables or deployment configuration.",
|
|
"items": { "type": "string" }
|
|
},
|
|
"secrets": {
|
|
"type": "array",
|
|
"description": "Secret values and where they are owned. Do not store secret values here.",
|
|
"items": { "type": "string" }
|
|
}
|
|
}
|
|
},
|
|
"workers": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["required", "queues", "jobs", "notes"],
|
|
"properties": {
|
|
"required": { "type": "boolean" },
|
|
"queues": {
|
|
"type": "array",
|
|
"items": { "type": "string" }
|
|
},
|
|
"jobs": {
|
|
"type": "array",
|
|
"items": { "type": "string" }
|
|
},
|
|
"notes": {
|
|
"type": "array",
|
|
"items": { "type": "string" }
|
|
}
|
|
}
|
|
},
|
|
"externalProviders": {
|
|
"type": "array",
|
|
"items": { "type": "string" }
|
|
},
|
|
"permissions": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"pattern": "^[a-z][A-Za-z0-9]*(\\.(?:[A-Za-z][A-Za-z0-9]*|\\*))+$"
|
|
}
|
|
},
|
|
"auditEvents": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"pattern": "^[a-z][a-z0-9_]*(\\.[a-z][a-z0-9_]*)+$"
|
|
}
|
|
},
|
|
"billingImpacts": {
|
|
"type": "array",
|
|
"items": { "type": "string" }
|
|
},
|
|
"uat": {
|
|
"type": "array",
|
|
"description": "Operator-verifiable acceptance checks for planning and implementation.",
|
|
"items": { "type": "string" }
|
|
}
|
|
}
|
|
},
|
|
"boundaries": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["mustKeep", "mayMoveToPlugin", "mustNotTouch"],
|
|
"properties": {
|
|
"mustKeep": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"mayMoveToPlugin": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"mustNotTouch": {
|
|
"type": "array",
|
|
"description": "Areas excluded from the current phase or known to be owned by parallel work.",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"pruning": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["phase", "action", "notes"],
|
|
"properties": {
|
|
"phase": {
|
|
"type": "string"
|
|
},
|
|
"action": {
|
|
"type": "string",
|
|
"enum": ["keep", "extract-plugin", "remove", "review"]
|
|
},
|
|
"notes": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"validation": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["source", "lastReviewed"],
|
|
"properties": {
|
|
"source": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"lastReviewed": {
|
|
"type": "string",
|
|
"format": "date"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|