icdev 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1105) hide show
  1. icdev/__init__.py +18 -0
  2. icdev/_paths.py +85 -0
  3. icdev/_version.py +3 -0
  4. icdev/data/__init__.py +1 -0
  5. icdev/data/args/__init__.py +1 -0
  6. icdev/data/args/agent_authority.yaml +61 -0
  7. icdev/data/args/agent_config.yaml +355 -0
  8. icdev/data/args/agentic_fitness.yaml +31 -0
  9. icdev/data/args/ai_governance_config.yaml +137 -0
  10. icdev/data/args/atlas_critique_config.yaml +66 -0
  11. icdev/data/args/bedrock_models.yaml +63 -0
  12. icdev/data/args/cicd_config.yaml +82 -0
  13. icdev/data/args/classification_config.yaml +232 -0
  14. icdev/data/args/cli_config.yaml +154 -0
  15. icdev/data/args/cloud_config.yaml +63 -0
  16. icdev/data/args/code_pattern_config.yaml +151 -0
  17. icdev/data/args/code_quality_config.yaml +47 -0
  18. icdev/data/args/companion_registry.yaml +202 -0
  19. icdev/data/args/context_config.yaml +82 -0
  20. icdev/data/args/csp_monitor_config.yaml +268 -0
  21. icdev/data/args/cui_markings.yaml +35 -0
  22. icdev/data/args/db_config.yaml +40 -0
  23. icdev/data/args/deployment_profiles.yaml +248 -0
  24. icdev/data/args/dev_profile_config.yaml +144 -0
  25. icdev/data/args/devsecops_config.yaml +286 -0
  26. icdev/data/args/endpoint_security_config.yaml +137 -0
  27. icdev/data/args/extension_config.yaml +79 -0
  28. icdev/data/args/file_access_tiers.yaml +88 -0
  29. icdev/data/args/framework_registry.yaml +415 -0
  30. icdev/data/args/innovation_config.yaml +431 -0
  31. icdev/data/args/installation_manifest.yaml +1087 -0
  32. icdev/data/args/llm_config.yaml +495 -0
  33. icdev/data/args/maintenance_config.yaml +55 -0
  34. icdev/data/args/memory_config.yaml +83 -0
  35. icdev/data/args/monitoring_config.yaml +127 -0
  36. icdev/data/args/mosa_config.yaml +190 -0
  37. icdev/data/args/nlq_config.yaml +35 -0
  38. icdev/data/args/observability_config.yaml +39 -0
  39. icdev/data/args/observability_tracing_config.yaml +170 -0
  40. icdev/data/args/oscal_tools_config.yaml +43 -0
  41. icdev/data/args/owasp_agentic_config.yaml +171 -0
  42. icdev/data/args/phase_registry.yaml +618 -0
  43. icdev/data/args/project_defaults.yaml +235 -0
  44. icdev/data/args/prompt_chains.yaml +163 -0
  45. icdev/data/args/resilience_config.yaml +50 -0
  46. icdev/data/args/ricoas_config.yaml +191 -0
  47. icdev/data/args/role_personas.yaml +362 -0
  48. icdev/data/args/scaling_config.yaml +176 -0
  49. icdev/data/args/security_gates.yaml +685 -0
  50. icdev/data/args/skill_injection_config.yaml +322 -0
  51. icdev/data/args/spec_config.yaml +53 -0
  52. icdev/data/args/supply_chain_config.yaml +76 -0
  53. icdev/data/args/translation_config.yaml +228 -0
  54. icdev/data/args/workflow_templates/ato_acceleration.yaml +54 -0
  55. icdev/data/args/workflow_templates/build_deploy.yaml +63 -0
  56. icdev/data/args/workflow_templates/full_compliance.yaml +43 -0
  57. icdev/data/args/workflow_templates/security_hardening.yaml +55 -0
  58. icdev/data/args/worktree_config.yaml +34 -0
  59. icdev/data/args/zta_config.yaml +247 -0
  60. icdev/data/context/__init__.py +1 -0
  61. icdev/data/context/agent/__init__.py +1 -0
  62. icdev/data/context/agent/response_schemas/__init__.py +1 -0
  63. icdev/data/context/agent/response_schemas/debate_position.json +46 -0
  64. icdev/data/context/agent/response_schemas/fitness_scorecard.json +74 -0
  65. icdev/data/context/agent/response_schemas/review_decision.json +39 -0
  66. icdev/data/context/agent/response_schemas/task_decomposition.json +82 -0
  67. icdev/data/context/agent/response_schemas/veto_decision.json +40 -0
  68. icdev/data/context/agentic/__init__.py +1 -0
  69. icdev/data/context/agentic/architecture_patterns.md +269 -0
  70. icdev/data/context/agentic/capability_registry.yaml +202 -0
  71. icdev/data/context/agentic/csp_mcp_registry.yaml +280 -0
  72. icdev/data/context/agentic/fitness_rubric.md +56 -0
  73. icdev/data/context/agentic/governance_baseline.md +205 -0
  74. icdev/data/context/ci/__init__.py +1 -0
  75. icdev/data/context/ci/worktree_templates.json +44 -0
  76. icdev/data/context/cloud/__init__.py +1 -0
  77. icdev/data/context/cloud/csp_service_registry.json +739 -0
  78. icdev/data/context/compliance/__init__.py +1 -0
  79. icdev/data/context/compliance/atlas_mitigations.json +293 -0
  80. icdev/data/context/compliance/atlas_techniques.json +833 -0
  81. icdev/data/context/compliance/cisa_sbd_requirements.json +432 -0
  82. icdev/data/context/compliance/cjis_security_policy.json +522 -0
  83. icdev/data/context/compliance/cmmc_practices.json +2494 -0
  84. icdev/data/context/compliance/cmmc_report_template.md +142 -0
  85. icdev/data/context/compliance/cnssi_1253_overlay.json +109 -0
  86. icdev/data/context/compliance/control_crosswalk.json +1914 -0
  87. icdev/data/context/compliance/control_families/__init__.py +1 -0
  88. icdev/data/context/compliance/csp_certifications.json +251 -0
  89. icdev/data/context/compliance/cssp_report_template.md +193 -0
  90. icdev/data/context/compliance/cui_templates/__init__.py +1 -0
  91. icdev/data/context/compliance/cui_templates/banner_block.txt +4 -0
  92. icdev/data/context/compliance/cui_templates/code_header.txt +8 -0
  93. icdev/data/context/compliance/cui_templates/document_template.md +35 -0
  94. icdev/data/context/compliance/data_type_framework_map.json +321 -0
  95. icdev/data/context/compliance/data_type_registry.json +147 -0
  96. icdev/data/context/compliance/dod_cssp_8530.json +463 -0
  97. icdev/data/context/compliance/eu_ai_act_annex_iii.json +108 -0
  98. icdev/data/context/compliance/export_templates/__init__.py +1 -0
  99. icdev/data/context/compliance/export_templates/emass_controls.csv.j2 +4 -0
  100. icdev/data/context/compliance/export_templates/evidence_package.md.j2 +39 -0
  101. icdev/data/context/compliance/export_templates/executive_summary.md.j2 +55 -0
  102. icdev/data/context/compliance/export_templates/poam_tracking.csv.j2 +4 -0
  103. icdev/data/context/compliance/fedramp_20x_ksi_schemas.json +133 -0
  104. icdev/data/context/compliance/fedramp_high_baseline.json +4370 -0
  105. icdev/data/context/compliance/fedramp_moderate_baseline.json +2183 -0
  106. icdev/data/context/compliance/fedramp_report_template.md +181 -0
  107. icdev/data/context/compliance/fips_200_areas.json +362 -0
  108. icdev/data/context/compliance/gao_ai_accountability.json +262 -0
  109. icdev/data/context/compliance/hipaa_security_rule.json +720 -0
  110. icdev/data/context/compliance/hitrust_csf_v11.json +930 -0
  111. icdev/data/context/compliance/impact_level_profiles.json +251 -0
  112. icdev/data/context/compliance/incident_response_template.md +1110 -0
  113. icdev/data/context/compliance/iso27001_2022_controls.json +750 -0
  114. icdev/data/context/compliance/iso27001_nist_bridge.json +382 -0
  115. icdev/data/context/compliance/iso42001_controls.json +254 -0
  116. icdev/data/context/compliance/ivv_checklist_template.md +80 -0
  117. icdev/data/context/compliance/ivv_report_template.md +116 -0
  118. icdev/data/context/compliance/ivv_requirements.json +372 -0
  119. icdev/data/context/compliance/mosa_crosswalk.json +327 -0
  120. icdev/data/context/compliance/mosa_framework.json +250 -0
  121. icdev/data/context/compliance/narrative_templates/AC.md.j2 +101 -0
  122. icdev/data/context/compliance/narrative_templates/AU.md.j2 +106 -0
  123. icdev/data/context/compliance/narrative_templates/IA.md.j2 +104 -0
  124. icdev/data/context/compliance/narrative_templates/SC.md.j2 +102 -0
  125. icdev/data/context/compliance/narrative_templates/SI.md.j2 +111 -0
  126. icdev/data/context/compliance/narrative_templates/__init__.py +1 -0
  127. icdev/data/context/compliance/narrative_templates/default.md.j2 +50 -0
  128. icdev/data/context/compliance/narrative_templates/executive_summary.j2 +27 -0
  129. icdev/data/context/compliance/narrative_templates/poam_milestone.j2 +19 -0
  130. icdev/data/context/compliance/narrative_templates/ssp_section.j2 +11 -0
  131. icdev/data/context/compliance/nist_800_171_controls.json +1552 -0
  132. icdev/data/context/compliance/nist_800_207_crosswalk.json +399 -0
  133. icdev/data/context/compliance/nist_800_207_zta.json +258 -0
  134. icdev/data/context/compliance/nist_800_53.json +324 -0
  135. icdev/data/context/compliance/nist_ai_600_1_genai.json +326 -0
  136. icdev/data/context/compliance/nist_ai_rmf.json +206 -0
  137. icdev/data/context/compliance/nist_sp_800_60_types.json +1667 -0
  138. icdev/data/context/compliance/omb_m25_21_high_impact_ai.json +248 -0
  139. icdev/data/context/compliance/omb_m26_04_unbiased_ai.json +262 -0
  140. icdev/data/context/compliance/owasp_agentic_asi.json +133 -0
  141. icdev/data/context/compliance/owasp_agentic_threats.json +285 -0
  142. icdev/data/context/compliance/owasp_llm_top10.json +274 -0
  143. icdev/data/context/compliance/pci_dss_v4.json +510 -0
  144. icdev/data/context/compliance/poam_template.md +117 -0
  145. icdev/data/context/compliance/safeai_controls.json +512 -0
  146. icdev/data/context/compliance/sbd_report_template.md +77 -0
  147. icdev/data/context/compliance/siem_config_templates/__init__.py +1 -0
  148. icdev/data/context/compliance/siem_config_templates/filebeat.yml +213 -0
  149. icdev/data/context/compliance/siem_config_templates/log_sources.json +208 -0
  150. icdev/data/context/compliance/soc2_trust_criteria.json +661 -0
  151. icdev/data/context/compliance/ssp_template.md +432 -0
  152. icdev/data/context/compliance/stig_templates/__init__.py +1 -0
  153. icdev/data/context/compliance/stig_templates/webapp_stig.json +139 -0
  154. icdev/data/context/compliance/xai_requirements.json +108 -0
  155. icdev/data/context/dashboard/__init__.py +1 -0
  156. icdev/data/context/dashboard/nlq_examples.json +50 -0
  157. icdev/data/context/dashboard/schema_descriptions.json +23 -0
  158. icdev/data/context/integration/__init__.py +1 -0
  159. icdev/data/context/integration/approval_workflows.json +32 -0
  160. icdev/data/context/integration/gitlab_field_mappings.json +33 -0
  161. icdev/data/context/integration/jira_field_mappings.json +32 -0
  162. icdev/data/context/integration/reqif_export_schema.json +23 -0
  163. icdev/data/context/integration/servicenow_field_mappings.json +22 -0
  164. icdev/data/context/languages/__init__.py +1 -0
  165. icdev/data/context/languages/framework_patterns.json +205 -0
  166. icdev/data/context/languages/language_registry.json +279 -0
  167. icdev/data/context/llm/__init__.py +1 -0
  168. icdev/data/context/llm/example_provider.py +86 -0
  169. icdev/data/context/mbse/__init__.py +1 -0
  170. icdev/data/context/mbse/des_report_template.md +162 -0
  171. icdev/data/context/mbse/des_requirements.json +411 -0
  172. icdev/data/context/mbse/digital_thread_patterns.json +403 -0
  173. icdev/data/context/mbse/reqif_schema.json +280 -0
  174. icdev/data/context/mbse/sysml_element_types.json +432 -0
  175. icdev/data/context/modernization/__init__.py +1 -0
  176. icdev/data/context/modernization/db_type_mappings.json +148 -0
  177. icdev/data/context/modernization/decomposition_patterns.json +284 -0
  178. icdev/data/context/modernization/framework_migration_patterns.json +359 -0
  179. icdev/data/context/modernization/migration_report_template.md +168 -0
  180. icdev/data/context/modernization/seven_rs_catalog.json +369 -0
  181. icdev/data/context/modernization/version_upgrade_rules.json +279 -0
  182. icdev/data/context/oscal/NIST_SP-800-53_rev5_catalog.json +254987 -0
  183. icdev/data/context/oscal/README.md +43 -0
  184. icdev/data/context/patterns/__init__.py +1 -0
  185. icdev/data/context/profiles/__init__.py +1 -0
  186. icdev/data/context/profiles/dod_baseline_v1.yaml +145 -0
  187. icdev/data/context/profiles/fedramp_baseline_v1.yaml +143 -0
  188. icdev/data/context/profiles/financial_baseline_v1.yaml +142 -0
  189. icdev/data/context/profiles/healthcare_baseline_v1.yaml +135 -0
  190. icdev/data/context/profiles/law_enforcement_v1.yaml +129 -0
  191. icdev/data/context/profiles/startup_v1.yaml +134 -0
  192. icdev/data/context/requirements/__init__.py +1 -0
  193. icdev/data/context/requirements/ambiguity_patterns.json +97 -0
  194. icdev/data/context/requirements/boundary_impact_rules.json +123 -0
  195. icdev/data/context/requirements/default_constitutions.json +67 -0
  196. icdev/data/context/requirements/document_extraction_rules.json +58 -0
  197. icdev/data/context/requirements/gap_patterns.json +108 -0
  198. icdev/data/context/requirements/readiness_rubric.json +78 -0
  199. icdev/data/context/requirements/red_alternative_patterns.json +210 -0
  200. icdev/data/context/requirements/safe_templates.json +72 -0
  201. icdev/data/context/requirements/spec_quality_checklist.json +122 -0
  202. icdev/data/context/simulation/__init__.py +1 -0
  203. icdev/data/context/simulation/architecture_patterns.json +36 -0
  204. icdev/data/context/simulation/coa_templates.json +38 -0
  205. icdev/data/context/simulation/cost_models.json +23 -0
  206. icdev/data/context/simulation/risk_categories.json +46 -0
  207. icdev/data/context/supply_chain/__init__.py +1 -0
  208. icdev/data/context/supply_chain/isa_templates.json +129 -0
  209. icdev/data/context/supply_chain/nist_800_161_controls.json +247 -0
  210. icdev/data/context/supply_chain/scrm_risk_matrix.json +147 -0
  211. icdev/data/context/templates/__init__.py +1 -0
  212. icdev/data/context/templates/ansible/__init__.py +1 -0
  213. icdev/data/context/templates/ansible/playbooks/__init__.py +1 -0
  214. icdev/data/context/templates/ansible/roles/__init__.py +1 -0
  215. icdev/data/context/templates/gitlab_ci/__init__.py +1 -0
  216. icdev/data/context/templates/grafana/__init__.py +1 -0
  217. icdev/data/context/templates/kubernetes/__init__.py +1 -0
  218. icdev/data/context/templates/project/__init__.py +1 -0
  219. icdev/data/context/templates/project/api/__init__.py +1 -0
  220. icdev/data/context/templates/project/cli/__init__.py +1 -0
  221. icdev/data/context/templates/project/data_pipeline/__init__.py +1 -0
  222. icdev/data/context/templates/project/iac/__init__.py +1 -0
  223. icdev/data/context/templates/project/javascript_frontend/__init__.py +1 -0
  224. icdev/data/context/templates/project/javascript_frontend/src/__init__.py +1 -0
  225. icdev/data/context/templates/project/javascript_frontend/tests/__init__.py +1 -0
  226. icdev/data/context/templates/project/microservice/__init__.py +1 -0
  227. icdev/data/context/templates/project/python_backend/__init__.py +1 -0
  228. icdev/data/context/templates/project/python_backend/src/__init__.py +1 -0
  229. icdev/data/context/templates/project/python_backend/tests/__init__.py +1 -0
  230. icdev/data/context/templates/project/python_backend/tests/features/__init__.py +1 -0
  231. icdev/data/context/templates/project/python_backend/tests/steps/__init__.py +1 -0
  232. icdev/data/context/templates/terraform/__init__.py +1 -0
  233. icdev/data/context/templates/terraform/govcloud_base/__init__.py +1 -0
  234. icdev/data/context/templates/terraform/modules/__init__.py +1 -0
  235. icdev/data/context/tone/__init__.py +1 -0
  236. icdev/data/context/translation/dependency_mappings.json +186 -0
  237. icdev/data/context/translation/type_mappings.json +149 -0
  238. icdev/data/docs/README.md +187 -0
  239. icdev/data/docs/__init__.py +1 -0
  240. icdev/data/docs/admin/gateway-guide.md +338 -0
  241. icdev/data/docs/admin/marketplace-guide.md +396 -0
  242. icdev/data/docs/admin/monitoring-guide.md +509 -0
  243. icdev/data/docs/architecture/compliance-framework.md +764 -0
  244. icdev/data/docs/architecture/database-schema.md +689 -0
  245. icdev/data/docs/architecture/gotcha-framework.md +518 -0
  246. icdev/data/docs/architecture/multi-agent-system.md +603 -0
  247. icdev/data/docs/dx/README.md +106 -0
  248. icdev/data/docs/dx/__init__.py +1 -0
  249. icdev/data/docs/dx/ci-cd-integration.md +378 -0
  250. icdev/data/docs/dx/claude-code-guide.md +213 -0
  251. icdev/data/docs/dx/companion-guide.md +232 -0
  252. icdev/data/docs/dx/dev-profiles.md +309 -0
  253. icdev/data/docs/dx/icdev-yaml-spec.md +219 -0
  254. icdev/data/docs/dx/integration-tiers.md +279 -0
  255. icdev/data/docs/dx/llm-routing-guide.md +456 -0
  256. icdev/data/docs/dx/quickstart.md +192 -0
  257. icdev/data/docs/dx/sdk-reference.md +356 -0
  258. icdev/data/docs/dx/unified-mcp-setup.md +525 -0
  259. icdev/data/docs/features/__init__.py +1 -0
  260. icdev/data/docs/features/phase-01-gotcha-framework.md +249 -0
  261. icdev/data/docs/features/phase-02-atlas-build-workflow.md +223 -0
  262. icdev/data/docs/features/phase-03-tdd-bdd-testing.md +261 -0
  263. icdev/data/docs/features/phase-04-nist-compliance.md +255 -0
  264. icdev/data/docs/features/phase-05-security-scanning.md +229 -0
  265. icdev/data/docs/features/phase-06-infrastructure-deployment.md +288 -0
  266. icdev/data/docs/features/phase-07-code-review-gates.md +276 -0
  267. icdev/data/docs/features/phase-08-self-healing.md +223 -0
  268. icdev/data/docs/features/phase-09-monitoring-observability.md +230 -0
  269. icdev/data/docs/features/phase-10-dashboard-web-ui.md +218 -0
  270. icdev/data/docs/features/phase-11-multi-agent-architecture.md +272 -0
  271. icdev/data/docs/features/phase-12-integration-testing.md +228 -0
  272. icdev/data/docs/features/phase-13-cicd-integration.md +257 -0
  273. icdev/data/docs/features/phase-14-secure-by-design-ivv.md +240 -0
  274. icdev/data/docs/features/phase-15-maintenance-audit.md +192 -0
  275. icdev/data/docs/features/phase-16-ato-acceleration.md +228 -0
  276. icdev/data/docs/features/phase-17-multi-framework-compliance.md +223 -0
  277. icdev/data/docs/features/phase-18-mbse-integration.md +242 -0
  278. icdev/data/docs/features/phase-19-agentic-generation.md +202 -0
  279. icdev/data/docs/features/phase-20-fips-security-categorization.md +198 -0
  280. icdev/data/docs/features/phase-21-saas-multi-tenancy.md +273 -0
  281. icdev/data/docs/features/phase-22-federated-gotcha-marketplace.md +242 -0
  282. icdev/data/docs/features/phase-23-universal-compliance-platform.md +238 -0
  283. icdev/data/docs/features/phase-24-devsecops-pipeline-security.md +198 -0
  284. icdev/data/docs/features/phase-25-zero-trust-architecture.md +220 -0
  285. icdev/data/docs/features/phase-26-dod-mosa.md +205 -0
  286. icdev/data/docs/features/phase-27-cli-capabilities.md +222 -0
  287. icdev/data/docs/features/phase-28-remote-command-gateway.md +235 -0
  288. icdev/data/docs/features/phase-29-proactive-monitoring.md +212 -0
  289. icdev/data/docs/features/phase-30-dashboard-auth.md +215 -0
  290. icdev/data/docs/features/phase-31-dashboard-ux-low-impact.md +188 -0
  291. icdev/data/docs/features/phase-32-dashboard-ux-medium-impact.md +223 -0
  292. icdev/data/docs/features/phase-33-modular-installation.md +218 -0
  293. icdev/data/docs/features/phase-34-dev-profiles.md +239 -0
  294. icdev/data/docs/features/phase-35-innovation-engine.md +257 -0
  295. icdev/data/docs/features/phase-36-evolutionary-intelligence.md +351 -0
  296. icdev/data/docs/features/phase-37-mitre-atlas-integration.md +485 -0
  297. icdev/data/docs/features/phase-38-cloud-agnostic-architecture.md +1033 -0
  298. icdev/data/docs/features/phase-39-observability-operations.md +178 -0
  299. icdev/data/docs/features/phase-40-nlq-compliance-queries.md +176 -0
  300. icdev/data/docs/features/phase-41-parallel-cicd.md +169 -0
  301. icdev/data/docs/features/phase-42-framework-planning.md +177 -0
  302. icdev/data/docs/features/phase-43-cross-language-translation.md +225 -0
  303. icdev/data/docs/features/phase-44-innovation-adaptation.md +227 -0
  304. icdev/data/docs/features/phase-45-owasp-agentic-security.md +239 -0
  305. icdev/data/docs/features/phase-46-observability-traceability-xai.md +240 -0
  306. icdev/data/docs/features/phase-47-unified-mcp-gateway.md +257 -0
  307. icdev/data/docs/features/phase-48-ai-transparency.md +203 -0
  308. icdev/data/docs/features/phase-49-ai-accountability.md +243 -0
  309. icdev/data/docs/features/phase-50-ai-governance-intake-chat.md +195 -0
  310. icdev/data/docs/features/phase-51-unified-chat-dashboard.md +240 -0
  311. icdev/data/docs/features/phase-52-code-intelligence.md +244 -0
  312. icdev/data/docs/features/phase-53-fedramp-20x-owasp-asi.md +359 -0
  313. icdev/data/docs/features/phase-54-slsa-swft-orchestration.md +379 -0
  314. icdev/data/docs/features/phase-55-a2a-v03-mcp-oauth.md +322 -0
  315. icdev/data/docs/features/phase-56-evidence-lineage.md +352 -0
  316. icdev/data/docs/features/phase-57-eu-ai-act-iron-bank.md +319 -0
  317. icdev/data/docs/features/phase-58-creative-engine.md +370 -0
  318. icdev/data/docs/features/phase-59-govcon-intelligence.md +535 -0
  319. icdev/data/docs/features/phase-60-cpmp.md +528 -0
  320. icdev/data/docs/features/phase-61-orchestration-improvements.md +534 -0
  321. icdev/data/docs/operations/dashboard-guide.md +354 -0
  322. icdev/data/docs/operations/deployment-guide.md +556 -0
  323. icdev/data/docs/operations/saas-admin-guide.md +439 -0
  324. icdev/data/docs/operations/security-operations-guide.md +733 -0
  325. icdev/data/docs/runbooks/backup-restore.md +412 -0
  326. icdev/data/docs/runbooks/troubleshooting.md +499 -0
  327. icdev/data/features/__init__.py +1 -0
  328. icdev/data/features/cicd_integration.feature +41 -0
  329. icdev/data/features/compliance_gates.feature +46 -0
  330. icdev/data/features/dashboard.feature +72 -0
  331. icdev/data/features/environment.py +25 -0
  332. icdev/data/features/project_management.feature +32 -0
  333. icdev/data/features/requirements_intake.feature +42 -0
  334. icdev/data/features/saas_platform.feature +53 -0
  335. icdev/data/features/security_scanning.feature +36 -0
  336. icdev/data/features/steps/__init__.py +1 -0
  337. icdev/data/features/steps/cicd_steps.py +465 -0
  338. icdev/data/features/steps/compliance_steps.py +308 -0
  339. icdev/data/features/steps/dashboard_steps.py +88 -0
  340. icdev/data/features/steps/project_steps.py +126 -0
  341. icdev/data/features/steps/requirements_intake_steps.py +689 -0
  342. icdev/data/features/steps/saas_platform_steps.py +572 -0
  343. icdev/data/features/steps/security_steps.py +236 -0
  344. icdev/data/features/steps/testing_steps.py +226 -0
  345. icdev/data/features/testing_pipeline.feature +42 -0
  346. icdev/data/goals/__init__.py +1 -0
  347. icdev/data/goals/agent_management.md +144 -0
  348. icdev/data/goals/agentic_generation.md +345 -0
  349. icdev/data/goals/agentic_threat_model.md +309 -0
  350. icdev/data/goals/ai_accountability.md +90 -0
  351. icdev/data/goals/ai_governance_intake.md +132 -0
  352. icdev/data/goals/ai_transparency.md +76 -0
  353. icdev/data/goals/atlas_integration.md +405 -0
  354. icdev/data/goals/ato_acceleration.md +139 -0
  355. icdev/data/goals/boundary_supply_chain.md +206 -0
  356. icdev/data/goals/build_app.md +544 -0
  357. icdev/data/goals/cicd_integration.md +86 -0
  358. icdev/data/goals/claude_dir_maintenance.md +77 -0
  359. icdev/data/goals/cli_capabilities.md +340 -0
  360. icdev/data/goals/cloud_agnostic.md +312 -0
  361. icdev/data/goals/code_intelligence.md +197 -0
  362. icdev/data/goals/code_review.md +94 -0
  363. icdev/data/goals/compliance_workflow.md +858 -0
  364. icdev/data/goals/continuous_harmonization.md +140 -0
  365. icdev/data/goals/cross_language_translation.md +171 -0
  366. icdev/data/goals/dashboard.md +142 -0
  367. icdev/data/goals/deploy_workflow.md +390 -0
  368. icdev/data/goals/devsecops_workflow.md +408 -0
  369. icdev/data/goals/evolutionary_intelligence.md +305 -0
  370. icdev/data/goals/external_integration.md +113 -0
  371. icdev/data/goals/framework_planning.md +63 -0
  372. icdev/data/goals/init_project.md +235 -0
  373. icdev/data/goals/innovation_engine.md +199 -0
  374. icdev/data/goals/integration_testing.md +189 -0
  375. icdev/data/goals/maintenance_audit.md +196 -0
  376. icdev/data/goals/manifest.md +56 -0
  377. icdev/data/goals/mbse_integration.md +504 -0
  378. icdev/data/goals/modernization_workflow.md +618 -0
  379. icdev/data/goals/monitoring.md +126 -0
  380. icdev/data/goals/mosa_workflow.md +463 -0
  381. icdev/data/goals/multi_agent_orchestration.md +68 -0
  382. icdev/data/goals/nlq_compliance.md +63 -0
  383. icdev/data/goals/observability.md +64 -0
  384. icdev/data/goals/observability_traceability_xai.md +154 -0
  385. icdev/data/goals/owasp_agentic_security.md +395 -0
  386. icdev/data/goals/parallel_cicd.md +61 -0
  387. icdev/data/goals/requirements_intake.md +213 -0
  388. icdev/data/goals/sbd_ivv_workflow.md +195 -0
  389. icdev/data/goals/security_categorization.md +133 -0
  390. icdev/data/goals/security_scan.md +381 -0
  391. icdev/data/goals/self_healing.md +120 -0
  392. icdev/data/goals/simulation_engine.md +111 -0
  393. icdev/data/goals/tdd_workflow.md +403 -0
  394. icdev/data/goals/zero_trust_architecture.md +403 -0
  395. icdev/data/hardprompts/__init__.py +1 -0
  396. icdev/data/hardprompts/agent/__init__.py +1 -0
  397. icdev/data/hardprompts/agent/agentic_architect.md +100 -0
  398. icdev/data/hardprompts/agent/debate_prompt.md +32 -0
  399. icdev/data/hardprompts/agent/fitness_evaluation.md +48 -0
  400. icdev/data/hardprompts/agent/governance_review.md +214 -0
  401. icdev/data/hardprompts/agent/reviewer_prompt.md +34 -0
  402. icdev/data/hardprompts/agent/skill_design.md +172 -0
  403. icdev/data/hardprompts/agent/task_decomposition.md +275 -0
  404. icdev/data/hardprompts/agent/veto_check_prompt.md +33 -0
  405. icdev/data/hardprompts/architect/__init__.py +1 -0
  406. icdev/data/hardprompts/architect/api_design.md +283 -0
  407. icdev/data/hardprompts/architect/data_model.md +277 -0
  408. icdev/data/hardprompts/architect/system_design.md +180 -0
  409. icdev/data/hardprompts/builder/__init__.py +1 -0
  410. icdev/data/hardprompts/builder/code_generation.md +59 -0
  411. icdev/data/hardprompts/builder/refactor.md +58 -0
  412. icdev/data/hardprompts/builder/scaffold_project.md +69 -0
  413. icdev/data/hardprompts/builder/test_generation.md +87 -0
  414. icdev/data/hardprompts/ci/__init__.py +1 -0
  415. icdev/data/hardprompts/ci/worktree_setup.md +35 -0
  416. icdev/data/hardprompts/compliance/__init__.py +1 -0
  417. icdev/data/hardprompts/compliance/cmmc_assessment.md +63 -0
  418. icdev/data/hardprompts/compliance/cssp_assessment.md +75 -0
  419. icdev/data/hardprompts/compliance/cui_marking.md +86 -0
  420. icdev/data/hardprompts/compliance/fedramp_assessment.md +55 -0
  421. icdev/data/hardprompts/compliance/ivv_assessment.md +96 -0
  422. icdev/data/hardprompts/compliance/poam_generation.md +57 -0
  423. icdev/data/hardprompts/compliance/sbd_assessment.md +101 -0
  424. icdev/data/hardprompts/compliance/security_categorization.md +74 -0
  425. icdev/data/hardprompts/compliance/ssp_generation.md +56 -0
  426. icdev/data/hardprompts/compliance/stig_evaluation.md +63 -0
  427. icdev/data/hardprompts/dashboard/__init__.py +1 -0
  428. icdev/data/hardprompts/dashboard/nlq_system_prompt.md +26 -0
  429. icdev/data/hardprompts/infra/__init__.py +1 -0
  430. icdev/data/hardprompts/infra/k8s_manifests.md +118 -0
  431. icdev/data/hardprompts/infra/pipeline_generation.md +160 -0
  432. icdev/data/hardprompts/infra/terraform_generation.md +92 -0
  433. icdev/data/hardprompts/integration/__init__.py +1 -0
  434. icdev/data/hardprompts/integration/approval_review.md +17 -0
  435. icdev/data/hardprompts/integration/jira_mapping.md +25 -0
  436. icdev/data/hardprompts/integration/servicenow_mapping.md +14 -0
  437. icdev/data/hardprompts/knowledge/__init__.py +1 -0
  438. icdev/data/hardprompts/knowledge/pattern_detection.md +73 -0
  439. icdev/data/hardprompts/knowledge/recommendation_engine.md +90 -0
  440. icdev/data/hardprompts/knowledge/root_cause_analysis.md +91 -0
  441. icdev/data/hardprompts/maintenance/__init__.py +1 -0
  442. icdev/data/hardprompts/maintenance/maintenance_assessment.md +82 -0
  443. icdev/data/hardprompts/mbse/__init__.py +1 -0
  444. icdev/data/hardprompts/mbse/digital_thread.md +67 -0
  445. icdev/data/hardprompts/mbse/model_import.md +62 -0
  446. icdev/data/hardprompts/mbse/model_to_code.md +65 -0
  447. icdev/data/hardprompts/modernization/__init__.py +1 -0
  448. icdev/data/hardprompts/modernization/legacy_analysis.md +93 -0
  449. icdev/data/hardprompts/modernization/migration_planning.md +150 -0
  450. icdev/data/hardprompts/modernization/seven_r_assessment.md +107 -0
  451. icdev/data/hardprompts/requirements/__init__.py +1 -0
  452. icdev/data/hardprompts/requirements/bdd_generation.md +35 -0
  453. icdev/data/hardprompts/requirements/clarification_prioritization.md +29 -0
  454. icdev/data/hardprompts/requirements/decomposition.md +60 -0
  455. icdev/data/hardprompts/requirements/document_extraction.md +45 -0
  456. icdev/data/hardprompts/requirements/gap_detection.md +70 -0
  457. icdev/data/hardprompts/requirements/intake_conversation.md +101 -0
  458. icdev/data/hardprompts/requirements/readiness_assessment.md +39 -0
  459. icdev/data/hardprompts/requirements/spec_quality.md +33 -0
  460. icdev/data/hardprompts/requirements/traceability_analysis.md +23 -0
  461. icdev/data/hardprompts/security/__init__.py +1 -0
  462. icdev/data/hardprompts/security/endpoint_security.md +78 -0
  463. icdev/data/hardprompts/security/threat_model.md +70 -0
  464. icdev/data/hardprompts/security/vulnerability_assessment.md +81 -0
  465. icdev/data/hardprompts/simulation/__init__.py +1 -0
  466. icdev/data/hardprompts/simulation/architecture_impact.md +27 -0
  467. icdev/data/hardprompts/simulation/coa_alternative.md +27 -0
  468. icdev/data/hardprompts/simulation/coa_generation.md +25 -0
  469. icdev/data/hardprompts/simulation/compliance_impact.md +28 -0
  470. icdev/data/hardprompts/simulation/cost_estimation.md +33 -0
  471. icdev/data/hardprompts/simulation/risk_assessment.md +28 -0
  472. icdev/data/hardprompts/translation/code_translation.md +68 -0
  473. icdev/data/hardprompts/translation/dependency_suggestion.md +44 -0
  474. icdev/data/hardprompts/translation/test_translation.md +64 -0
  475. icdev/data/hardprompts/translation/translation_repair.md +59 -0
  476. icdev/py.typed +0 -0
  477. icdev/tools/__init__.py +1 -0
  478. icdev/tools/_gen_formatter.py +12 -0
  479. icdev/tools/a2a/__init__.py +1 -0
  480. icdev/tools/a2a/agent_cards/architect.json +43 -0
  481. icdev/tools/a2a/agent_cards/builder.json +50 -0
  482. icdev/tools/a2a/agent_cards/compliance.json +57 -0
  483. icdev/tools/a2a/agent_cards/devsecops.json +71 -0
  484. icdev/tools/a2a/agent_cards/infra.json +57 -0
  485. icdev/tools/a2a/agent_cards/integration.json +57 -0
  486. icdev/tools/a2a/agent_cards/knowledge.json +43 -0
  487. icdev/tools/a2a/agent_cards/mbse.json +57 -0
  488. icdev/tools/a2a/agent_cards/modernization.json +50 -0
  489. icdev/tools/a2a/agent_cards/monitor.json +43 -0
  490. icdev/tools/a2a/agent_cards/orchestrator.json +36 -0
  491. icdev/tools/a2a/agent_cards/requirements_analyst.json +64 -0
  492. icdev/tools/a2a/agent_cards/security.json +50 -0
  493. icdev/tools/a2a/agent_cards/simulation.json +57 -0
  494. icdev/tools/a2a/agent_cards/supply_chain.json +50 -0
  495. icdev/tools/a2a/agent_client.py +349 -0
  496. icdev/tools/a2a/agent_registry.py +412 -0
  497. icdev/tools/a2a/agent_server.py +579 -0
  498. icdev/tools/a2a/task.py +200 -0
  499. icdev/tools/agent/__init__.py +2 -0
  500. icdev/tools/agent/a2a_agent_card_generator.py +285 -0
  501. icdev/tools/agent/a2a_discovery_server.py +250 -0
  502. icdev/tools/agent/agent_executor.py +529 -0
  503. icdev/tools/agent/agent_memory.py +557 -0
  504. icdev/tools/agent/agent_models.py +51 -0
  505. icdev/tools/agent/atlas_critique.py +908 -0
  506. icdev/tools/agent/authority.py +443 -0
  507. icdev/tools/agent/bedrock_client.py +1075 -0
  508. icdev/tools/agent/collaboration.py +871 -0
  509. icdev/tools/agent/dispatcher_mode.py +665 -0
  510. icdev/tools/agent/mailbox.py +575 -0
  511. icdev/tools/agent/prompt_chain_executor.py +1064 -0
  512. icdev/tools/agent/session_purpose.py +350 -0
  513. icdev/tools/agent/skill_router.py +638 -0
  514. icdev/tools/agent/skill_selector.py +486 -0
  515. icdev/tools/agent/team_orchestrator.py +1108 -0
  516. icdev/tools/agent/token_tracker.py +290 -0
  517. icdev/tools/analysis/__init__.py +1 -0
  518. icdev/tools/analysis/code_analyzer.py +780 -0
  519. icdev/tools/analysis/runtime_feedback.py +389 -0
  520. icdev/tools/audit/__init__.py +1 -0
  521. icdev/tools/audit/audit_logger.py +196 -0
  522. icdev/tools/audit/audit_query.py +157 -0
  523. icdev/tools/audit/decision_recorder.py +72 -0
  524. icdev/tools/builder/__init__.py +1 -0
  525. icdev/tools/builder/agentic_fitness.py +534 -0
  526. icdev/tools/builder/agentic_test_templates/test_a2a_callback.py +117 -0
  527. icdev/tools/builder/agentic_test_templates/test_a2a_lifecycle.feature +52 -0
  528. icdev/tools/builder/agentic_test_templates/test_agent_card.feature +37 -0
  529. icdev/tools/builder/agentic_test_templates/test_agent_health.py +128 -0
  530. icdev/tools/builder/agentic_test_templates/test_memory_system.feature +50 -0
  531. icdev/tools/builder/agentic_test_templates/test_skill_execution.feature +40 -0
  532. icdev/tools/builder/app_blueprint.py +1583 -0
  533. icdev/tools/builder/child_app_generator.py +2852 -0
  534. icdev/tools/builder/claude_md_generator.py +1734 -0
  535. icdev/tools/builder/code_generator.py +3703 -0
  536. icdev/tools/builder/db_init_generator.py +1709 -0
  537. icdev/tools/builder/dev_profile_manager.py +954 -0
  538. icdev/tools/builder/formatter.py +768 -0
  539. icdev/tools/builder/goal_adapter.py +592 -0
  540. icdev/tools/builder/gotcha_validator.py +812 -0
  541. icdev/tools/builder/language_support.py +441 -0
  542. icdev/tools/builder/linter.py +976 -0
  543. icdev/tools/builder/profile_detector.py +657 -0
  544. icdev/tools/builder/profile_md_generator.py +723 -0
  545. icdev/tools/builder/scaffolder.py +1590 -0
  546. icdev/tools/builder/scaffolder_extended.py +1771 -0
  547. icdev/tools/builder/test_writer.py +950 -0
  548. icdev/tools/ci/__init__.py +2 -0
  549. icdev/tools/ci/connectors/__init__.py +2 -0
  550. icdev/tools/ci/connectors/base_connector.py +80 -0
  551. icdev/tools/ci/connectors/connector_registry.py +188 -0
  552. icdev/tools/ci/connectors/mattermost_connector.py +159 -0
  553. icdev/tools/ci/connectors/slack_connector.py +197 -0
  554. icdev/tools/ci/core/__init__.py +2 -0
  555. icdev/tools/ci/core/air_gap_detector.py +115 -0
  556. icdev/tools/ci/core/comment_handler.py +192 -0
  557. icdev/tools/ci/core/conversation_manager.py +479 -0
  558. icdev/tools/ci/core/event_envelope.py +500 -0
  559. icdev/tools/ci/core/event_router.py +443 -0
  560. icdev/tools/ci/core/failure_parser.py +397 -0
  561. icdev/tools/ci/core/recovery_engine.py +527 -0
  562. icdev/tools/ci/modules/__init__.py +2 -0
  563. icdev/tools/ci/modules/agent.py +271 -0
  564. icdev/tools/ci/modules/git_ops.py +175 -0
  565. icdev/tools/ci/modules/state.py +117 -0
  566. icdev/tools/ci/modules/vcs.py +303 -0
  567. icdev/tools/ci/modules/workflow_ops.py +295 -0
  568. icdev/tools/ci/modules/worktree.py +340 -0
  569. icdev/tools/ci/pipeline_config_generator.py +558 -0
  570. icdev/tools/ci/triggers/__init__.py +2 -0
  571. icdev/tools/ci/triggers/gitlab_task_monitor.py +330 -0
  572. icdev/tools/ci/triggers/poll_trigger.py +237 -0
  573. icdev/tools/ci/triggers/webhook_server.py +356 -0
  574. icdev/tools/ci/workflows/__init__.py +2 -0
  575. icdev/tools/ci/workflows/icdev_build.py +140 -0
  576. icdev/tools/ci/workflows/icdev_comply.py +284 -0
  577. icdev/tools/ci/workflows/icdev_document.py +152 -0
  578. icdev/tools/ci/workflows/icdev_e2e.py +188 -0
  579. icdev/tools/ci/workflows/icdev_patch.py +186 -0
  580. icdev/tools/ci/workflows/icdev_plan.py +202 -0
  581. icdev/tools/ci/workflows/icdev_plan_build.py +41 -0
  582. icdev/tools/ci/workflows/icdev_plan_build_test.py +46 -0
  583. icdev/tools/ci/workflows/icdev_plan_build_test_review.py +47 -0
  584. icdev/tools/ci/workflows/icdev_review.py +126 -0
  585. icdev/tools/ci/workflows/icdev_sdlc.py +261 -0
  586. icdev/tools/ci/workflows/icdev_test.py +240 -0
  587. icdev/tools/cli/__init__.py +1 -0
  588. icdev/tools/cli/output_formatter.py +756 -0
  589. icdev/tools/cli_formatter.py +42 -0
  590. icdev/tools/cloud/__init__.py +11 -0
  591. icdev/tools/cloud/cloud_mode_manager.py +364 -0
  592. icdev/tools/cloud/csp_changelog.py +383 -0
  593. icdev/tools/cloud/csp_health_checker.py +268 -0
  594. icdev/tools/cloud/csp_monitor.py +951 -0
  595. icdev/tools/cloud/iam_provider.py +593 -0
  596. icdev/tools/cloud/kms_provider.py +346 -0
  597. icdev/tools/cloud/monitoring_provider.py +628 -0
  598. icdev/tools/cloud/provider_factory.py +376 -0
  599. icdev/tools/cloud/region_validator.py +345 -0
  600. icdev/tools/cloud/registry_provider.py +563 -0
  601. icdev/tools/cloud/secrets_provider.py +486 -0
  602. icdev/tools/cloud/storage_provider.py +446 -0
  603. icdev/tools/compat/__init__.py +21 -0
  604. icdev/tools/compat/cli_harmonizer.py +251 -0
  605. icdev/tools/compat/datetime_utils.py +18 -0
  606. icdev/tools/compat/db_utils.py +160 -0
  607. icdev/tools/compat/platform_utils.py +123 -0
  608. icdev/tools/compliance/__init__.py +1 -0
  609. icdev/tools/compliance/accountability_manager.py +397 -0
  610. icdev/tools/compliance/ai_accountability_audit.py +294 -0
  611. icdev/tools/compliance/ai_impact_assessor.py +273 -0
  612. icdev/tools/compliance/ai_incident_response.py +301 -0
  613. icdev/tools/compliance/ai_inventory_manager.py +239 -0
  614. icdev/tools/compliance/ai_reassessment_scheduler.py +256 -0
  615. icdev/tools/compliance/ai_transparency_audit.py +248 -0
  616. icdev/tools/compliance/atlas_assessor.py +278 -0
  617. icdev/tools/compliance/atlas_report_generator.py +1211 -0
  618. icdev/tools/compliance/base_assessor.py +597 -0
  619. icdev/tools/compliance/cato_monitor.py +1385 -0
  620. icdev/tools/compliance/cato_scheduler.py +699 -0
  621. icdev/tools/compliance/cjis_assessor.py +76 -0
  622. icdev/tools/compliance/classification_manager.py +1353 -0
  623. icdev/tools/compliance/cmmc_assessor.py +1491 -0
  624. icdev/tools/compliance/cmmc_report_generator.py +1100 -0
  625. icdev/tools/compliance/compliance_detector.py +463 -0
  626. icdev/tools/compliance/compliance_exporter.py +427 -0
  627. icdev/tools/compliance/compliance_status.py +825 -0
  628. icdev/tools/compliance/control_mapper.py +505 -0
  629. icdev/tools/compliance/crosswalk_engine.py +1203 -0
  630. icdev/tools/compliance/cssp_assessor.py +1045 -0
  631. icdev/tools/compliance/cssp_evidence_collector.py +729 -0
  632. icdev/tools/compliance/cssp_report_generator.py +1116 -0
  633. icdev/tools/compliance/cui_marker.py +388 -0
  634. icdev/tools/compliance/diagram_validator.py +600 -0
  635. icdev/tools/compliance/emass/__init__.py +2 -0
  636. icdev/tools/compliance/emass/emass_client.py +840 -0
  637. icdev/tools/compliance/emass/emass_export.py +777 -0
  638. icdev/tools/compliance/emass/emass_sync.py +826 -0
  639. icdev/tools/compliance/eu_ai_act_classifier.py +194 -0
  640. icdev/tools/compliance/evidence_collector.py +468 -0
  641. icdev/tools/compliance/fairness_assessor.py +316 -0
  642. icdev/tools/compliance/fedramp_assessor.py +1808 -0
  643. icdev/tools/compliance/fedramp_authorization_packager.py +137 -0
  644. icdev/tools/compliance/fedramp_ksi_generator.py +355 -0
  645. icdev/tools/compliance/fedramp_report_generator.py +1128 -0
  646. icdev/tools/compliance/fips199_categorizer.py +881 -0
  647. icdev/tools/compliance/fips200_validator.py +315 -0
  648. icdev/tools/compliance/gao_ai_assessor.py +231 -0
  649. icdev/tools/compliance/gao_evidence_builder.py +308 -0
  650. icdev/tools/compliance/hipaa_assessor.py +78 -0
  651. icdev/tools/compliance/hitrust_assessor.py +49 -0
  652. icdev/tools/compliance/incident_response_plan.py +718 -0
  653. icdev/tools/compliance/iso27001_assessor.py +92 -0
  654. icdev/tools/compliance/iso42001_assessor.py +114 -0
  655. icdev/tools/compliance/ivv_assessor.py +2327 -0
  656. icdev/tools/compliance/ivv_report_generator.py +1662 -0
  657. icdev/tools/compliance/model_card_generator.py +297 -0
  658. icdev/tools/compliance/mosa_assessor.py +117 -0
  659. icdev/tools/compliance/multi_regime_assessor.py +451 -0
  660. icdev/tools/compliance/narrative_generator.py +1013 -0
  661. icdev/tools/compliance/nist_800_207_assessor.py +191 -0
  662. icdev/tools/compliance/nist_ai_600_1_assessor.py +188 -0
  663. icdev/tools/compliance/nist_ai_rmf_assessor.py +110 -0
  664. icdev/tools/compliance/nist_lookup.py +245 -0
  665. icdev/tools/compliance/omb_m25_21_assessor.py +228 -0
  666. icdev/tools/compliance/omb_m26_04_assessor.py +188 -0
  667. icdev/tools/compliance/oscal_catalog_adapter.py +395 -0
  668. icdev/tools/compliance/oscal_generator.py +2170 -0
  669. icdev/tools/compliance/oscal_tools.py +1182 -0
  670. icdev/tools/compliance/owasp_agentic_assessor.py +226 -0
  671. icdev/tools/compliance/owasp_asi_assessor.py +200 -0
  672. icdev/tools/compliance/owasp_llm_assessor.py +244 -0
  673. icdev/tools/compliance/pci_dss_assessor.py +80 -0
  674. icdev/tools/compliance/pi_compliance_tracker.py +1461 -0
  675. icdev/tools/compliance/poam_generator.py +405 -0
  676. icdev/tools/compliance/resolve_marking.py +283 -0
  677. icdev/tools/compliance/sbd_assessor.py +2068 -0
  678. icdev/tools/compliance/sbd_report_generator.py +1236 -0
  679. icdev/tools/compliance/sbom_generator.py +1008 -0
  680. icdev/tools/compliance/siem_config_generator.py +674 -0
  681. icdev/tools/compliance/slsa_attestation_generator.py +490 -0
  682. icdev/tools/compliance/soc2_assessor.py +77 -0
  683. icdev/tools/compliance/ssp_generator.py +573 -0
  684. icdev/tools/compliance/stig_checker.py +727 -0
  685. icdev/tools/compliance/swft_evidence_bundler.py +337 -0
  686. icdev/tools/compliance/system_card_generator.py +309 -0
  687. icdev/tools/compliance/traceability_matrix.py +1281 -0
  688. icdev/tools/compliance/universal_classification_manager.py +1172 -0
  689. icdev/tools/compliance/xacta/__init__.py +2 -0
  690. icdev/tools/compliance/xacta/xacta_client.py +449 -0
  691. icdev/tools/compliance/xacta/xacta_export.py +557 -0
  692. icdev/tools/compliance/xacta/xacta_sync.py +333 -0
  693. icdev/tools/compliance/xai_assessor.py +231 -0
  694. icdev/tools/dashboard/__init__.py +1 -0
  695. icdev/tools/dashboard/api/__init__.py +1 -0
  696. icdev/tools/dashboard/api/_pipeline_state.py +17 -0
  697. icdev/tools/dashboard/api/activity.py +206 -0
  698. icdev/tools/dashboard/api/admin.py +176 -0
  699. icdev/tools/dashboard/api/agents.py +53 -0
  700. icdev/tools/dashboard/api/ai_accountability.py +163 -0
  701. icdev/tools/dashboard/api/ai_transparency.py +198 -0
  702. icdev/tools/dashboard/api/audit.py +58 -0
  703. icdev/tools/dashboard/api/batch.py +666 -0
  704. icdev/tools/dashboard/api/chat.py +241 -0
  705. icdev/tools/dashboard/api/cicd.py +219 -0
  706. icdev/tools/dashboard/api/code_quality.py +223 -0
  707. icdev/tools/dashboard/api/compliance.py +171 -0
  708. icdev/tools/dashboard/api/cpmp.py +915 -0
  709. icdev/tools/dashboard/api/diagrams.py +65 -0
  710. icdev/tools/dashboard/api/events.py +250 -0
  711. icdev/tools/dashboard/api/evidence.py +99 -0
  712. icdev/tools/dashboard/api/fedramp_20x.py +77 -0
  713. icdev/tools/dashboard/api/govcon.py +1095 -0
  714. icdev/tools/dashboard/api/intake.py +1171 -0
  715. icdev/tools/dashboard/api/lineage.py +163 -0
  716. icdev/tools/dashboard/api/metrics.py +155 -0
  717. icdev/tools/dashboard/api/nlq.py +72 -0
  718. icdev/tools/dashboard/api/orchestration.py +472 -0
  719. icdev/tools/dashboard/api/oscal.py +183 -0
  720. icdev/tools/dashboard/api/prod_audit.py +183 -0
  721. icdev/tools/dashboard/api/projects.py +191 -0
  722. icdev/tools/dashboard/api/proposals.py +1084 -0
  723. icdev/tools/dashboard/api/traces.py +363 -0
  724. icdev/tools/dashboard/api/usage.py +234 -0
  725. icdev/tools/dashboard/app.py +1986 -0
  726. icdev/tools/dashboard/auth.py +500 -0
  727. icdev/tools/dashboard/byok.py +245 -0
  728. icdev/tools/dashboard/chat_manager.py +675 -0
  729. icdev/tools/dashboard/config.py +116 -0
  730. icdev/tools/dashboard/diagram_definitions.py +642 -0
  731. icdev/tools/dashboard/nlq_processor.py +323 -0
  732. icdev/tools/dashboard/phase_loader.py +136 -0
  733. icdev/tools/dashboard/sse_manager.py +89 -0
  734. icdev/tools/dashboard/state_tracker.py +267 -0
  735. icdev/tools/dashboard/static/css/style.css +706 -0
  736. icdev/tools/dashboard/static/css/ux.css +2047 -0
  737. icdev/tools/dashboard/static/js/activity.js +322 -0
  738. icdev/tools/dashboard/static/js/api.js +161 -0
  739. icdev/tools/dashboard/static/js/batch.js +814 -0
  740. icdev/tools/dashboard/static/js/charts.js +618 -0
  741. icdev/tools/dashboard/static/js/chat.js +1514 -0
  742. icdev/tools/dashboard/static/js/kanban.js +113 -0
  743. icdev/tools/dashboard/static/js/live.js +569 -0
  744. icdev/tools/dashboard/static/js/mermaid-icdev.js +332 -0
  745. icdev/tools/dashboard/static/js/proposals.js +588 -0
  746. icdev/tools/dashboard/static/js/shortcuts.js +544 -0
  747. icdev/tools/dashboard/static/js/tables.js +652 -0
  748. icdev/tools/dashboard/static/js/tour.js +524 -0
  749. icdev/tools/dashboard/static/js/ux.js +942 -0
  750. icdev/tools/dashboard/templates/404.html +10 -0
  751. icdev/tools/dashboard/templates/activity.html +80 -0
  752. icdev/tools/dashboard/templates/admin/users.html +144 -0
  753. icdev/tools/dashboard/templates/ai_accountability.html +235 -0
  754. icdev/tools/dashboard/templates/ai_transparency.html +263 -0
  755. icdev/tools/dashboard/templates/base.html +104 -0
  756. icdev/tools/dashboard/templates/batch.html +23 -0
  757. icdev/tools/dashboard/templates/chat.html +332 -0
  758. icdev/tools/dashboard/templates/children.html +149 -0
  759. icdev/tools/dashboard/templates/cicd.html +253 -0
  760. icdev/tools/dashboard/templates/code_quality.html +214 -0
  761. icdev/tools/dashboard/templates/cpmp/cor_detail.html +220 -0
  762. icdev/tools/dashboard/templates/cpmp/cor_portal.html +91 -0
  763. icdev/tools/dashboard/templates/cpmp/deliverable_detail.html +197 -0
  764. icdev/tools/dashboard/templates/cpmp/detail.html +578 -0
  765. icdev/tools/dashboard/templates/cpmp/portfolio.html +202 -0
  766. icdev/tools/dashboard/templates/dev_profiles.html +304 -0
  767. icdev/tools/dashboard/templates/diagrams.html +224 -0
  768. icdev/tools/dashboard/templates/events/timeline.html +232 -0
  769. icdev/tools/dashboard/templates/evidence.html +134 -0
  770. icdev/tools/dashboard/templates/fedramp_20x.html +207 -0
  771. icdev/tools/dashboard/templates/gateway.html +244 -0
  772. icdev/tools/dashboard/templates/govcon/capabilities.html +135 -0
  773. icdev/tools/dashboard/templates/govcon/pipeline.html +214 -0
  774. icdev/tools/dashboard/templates/govcon/requirements.html +120 -0
  775. icdev/tools/dashboard/templates/index.html +254 -0
  776. icdev/tools/dashboard/templates/lineage.html +141 -0
  777. icdev/tools/dashboard/templates/login.html +51 -0
  778. icdev/tools/dashboard/templates/monitoring/overview.html +193 -0
  779. icdev/tools/dashboard/templates/orchestration/dashboard.html +545 -0
  780. icdev/tools/dashboard/templates/oscal.html +263 -0
  781. icdev/tools/dashboard/templates/phases.html +150 -0
  782. icdev/tools/dashboard/templates/prod_audit.html +280 -0
  783. icdev/tools/dashboard/templates/profile.html +183 -0
  784. icdev/tools/dashboard/templates/projects/detail.html +583 -0
  785. icdev/tools/dashboard/templates/projects/list.html +47 -0
  786. icdev/tools/dashboard/templates/proposals/detail.html +1253 -0
  787. icdev/tools/dashboard/templates/proposals/list.html +179 -0
  788. icdev/tools/dashboard/templates/proposals/section_detail.html +193 -0
  789. icdev/tools/dashboard/templates/provenance.html +181 -0
  790. icdev/tools/dashboard/templates/query/nlq.html +234 -0
  791. icdev/tools/dashboard/templates/quick_paths.html +69 -0
  792. icdev/tools/dashboard/templates/traces.html +155 -0
  793. icdev/tools/dashboard/templates/translation_detail.html +199 -0
  794. icdev/tools/dashboard/templates/translations.html +162 -0
  795. icdev/tools/dashboard/templates/usage.html +225 -0
  796. icdev/tools/dashboard/templates/wizard.html +539 -0
  797. icdev/tools/dashboard/templates/xai.html +208 -0
  798. icdev/tools/dashboard/ux_helpers.py +962 -0
  799. icdev/tools/dashboard/websocket.py +81 -0
  800. icdev/tools/db/__init__.py +1 -0
  801. icdev/tools/db/backup.py +312 -0
  802. icdev/tools/db/backup_manager.py +832 -0
  803. icdev/tools/db/init_icdev_db.py +5900 -0
  804. icdev/tools/db/migrate.py +178 -0
  805. icdev/tools/db/migration_runner.py +549 -0
  806. icdev/tools/db/migrations/001_baseline/meta.json +9 -0
  807. icdev/tools/db/migrations/001_baseline/up.py +68 -0
  808. icdev/tools/db/migrations/002_memory_enhancements/down.sql +8 -0
  809. icdev/tools/db/migrations/002_memory_enhancements/meta.json +9 -0
  810. icdev/tools/db/migrations/002_memory_enhancements/up.py +118 -0
  811. icdev/tools/db/migrations/003_dev_profiles/meta.json +8 -0
  812. icdev/tools/db/migrations/003_dev_profiles/up.py +93 -0
  813. icdev/tools/db/migrations/004_innovation_engine/down.py +19 -0
  814. icdev/tools/db/migrations/004_innovation_engine/up.py +227 -0
  815. icdev/tools/db/migrations/005_phase_37_ai_security/down.py +19 -0
  816. icdev/tools/db/migrations/005_phase_37_ai_security/up.py +258 -0
  817. icdev/tools/db/migrations/006_phase_36_evolution/down.py +21 -0
  818. icdev/tools/db/migrations/006_phase_36_evolution/up.py +323 -0
  819. icdev/tools/db/migrations/007_phase_38_cloud/down.py +14 -0
  820. icdev/tools/db/migrations/007_phase_38_cloud/up.py +110 -0
  821. icdev/tools/db/migrations/008_phase36_37_integration/up.py +55 -0
  822. icdev/tools/db/migrations/__init__.py +2 -0
  823. icdev/tools/devsecops/__init__.py +2 -0
  824. icdev/tools/devsecops/attestation_manager.py +458 -0
  825. icdev/tools/devsecops/network_segmentation_generator.py +614 -0
  826. icdev/tools/devsecops/pdp_config_generator.py +1256 -0
  827. icdev/tools/devsecops/pipeline_security_generator.py +484 -0
  828. icdev/tools/devsecops/policy_generator.py +653 -0
  829. icdev/tools/devsecops/profile_manager.py +388 -0
  830. icdev/tools/devsecops/service_mesh_generator.py +1073 -0
  831. icdev/tools/devsecops/zta_maturity_scorer.py +368 -0
  832. icdev/tools/devsecops/zta_terraform_generator.py +1303 -0
  833. icdev/tools/dx/__init__.py +3 -0
  834. icdev/tools/dx/companion.py +266 -0
  835. icdev/tools/dx/instruction_generator.py +753 -0
  836. icdev/tools/dx/mcp_config_generator.py +282 -0
  837. icdev/tools/dx/skill_translator.py +425 -0
  838. icdev/tools/dx/tool_detector.py +144 -0
  839. icdev/tools/extensions/__init__.py +21 -0
  840. icdev/tools/extensions/builtins/010_ai_governance_chat.py +277 -0
  841. icdev/tools/extensions/builtins/__init__.py +2 -0
  842. icdev/tools/extensions/extension_manager.py +455 -0
  843. icdev/tools/infra/__init__.py +1 -0
  844. icdev/tools/infra/ansible_generator.py +869 -0
  845. icdev/tools/infra/dockerfile_generator.py +361 -0
  846. icdev/tools/infra/infra_status.py +393 -0
  847. icdev/tools/infra/ironbank_metadata_generator.py +411 -0
  848. icdev/tools/infra/k8s_generator.py +1002 -0
  849. icdev/tools/infra/pipeline_generator.py +832 -0
  850. icdev/tools/infra/rollback.py +400 -0
  851. icdev/tools/infra/terraform_generator.py +1142 -0
  852. icdev/tools/infra/terraform_generator_azure.py +1254 -0
  853. icdev/tools/infra/terraform_generator_gcp.py +953 -0
  854. icdev/tools/infra/terraform_generator_ibm.py +360 -0
  855. icdev/tools/infra/terraform_generator_oci.py +919 -0
  856. icdev/tools/infra/terraform_generator_onprem.py +319 -0
  857. icdev/tools/innovation/__init__.py +8 -0
  858. icdev/tools/innovation/competitive_intel.py +492 -0
  859. icdev/tools/innovation/innovation_manager.py +681 -0
  860. icdev/tools/innovation/introspective_analyzer.py +774 -0
  861. icdev/tools/innovation/register_external_patterns.py +440 -0
  862. icdev/tools/innovation/signal_ranker.py +1038 -0
  863. icdev/tools/innovation/solution_generator.py +697 -0
  864. icdev/tools/innovation/standards_monitor.py +466 -0
  865. icdev/tools/innovation/trend_detector.py +1046 -0
  866. icdev/tools/innovation/triage_engine.py +1149 -0
  867. icdev/tools/innovation/web_scanner.py +894 -0
  868. icdev/tools/installer/__init__.py +1 -0
  869. icdev/tools/installer/compliance_configurator.py +637 -0
  870. icdev/tools/installer/installer.py +1711 -0
  871. icdev/tools/installer/module_registry.py +805 -0
  872. icdev/tools/installer/platform_setup.py +961 -0
  873. icdev/tools/integration/__init__.py +2 -0
  874. icdev/tools/integration/approval_manager.py +561 -0
  875. icdev/tools/integration/doors_exporter.py +627 -0
  876. icdev/tools/integration/gitlab_connector.py +784 -0
  877. icdev/tools/integration/jira_connector.py +774 -0
  878. icdev/tools/integration/servicenow_connector.py +693 -0
  879. icdev/tools/knowledge/__init__.py +1 -0
  880. icdev/tools/knowledge/knowledge_ingest.py +293 -0
  881. icdev/tools/knowledge/pattern_detector.py +693 -0
  882. icdev/tools/knowledge/recommendation_engine.py +461 -0
  883. icdev/tools/knowledge/self_heal_analyzer.py +504 -0
  884. icdev/tools/llm/__init__.py +72 -0
  885. icdev/tools/llm/anthropic_provider.py +170 -0
  886. icdev/tools/llm/azure_openai_provider.py +338 -0
  887. icdev/tools/llm/bedrock_provider.py +315 -0
  888. icdev/tools/llm/embedding_provider.py +438 -0
  889. icdev/tools/llm/gemini_provider.py +381 -0
  890. icdev/tools/llm/ibm_watsonx_provider.py +232 -0
  891. icdev/tools/llm/oci_genai_provider.py +462 -0
  892. icdev/tools/llm/ollama_provider.py +340 -0
  893. icdev/tools/llm/openai_provider.py +225 -0
  894. icdev/tools/llm/provider.py +355 -0
  895. icdev/tools/llm/provider_sdk.py +175 -0
  896. icdev/tools/llm/router.py +780 -0
  897. icdev/tools/llm/vertex_ai_provider.py +374 -0
  898. icdev/tools/maintenance/__init__.py +2 -0
  899. icdev/tools/maintenance/dependency_scanner.py +1030 -0
  900. icdev/tools/maintenance/maintenance_auditor.py +815 -0
  901. icdev/tools/maintenance/remediation_engine.py +966 -0
  902. icdev/tools/maintenance/vulnerability_checker.py +987 -0
  903. icdev/tools/mbse/__init__.py +3 -0
  904. icdev/tools/mbse/des_assessor.py +1186 -0
  905. icdev/tools/mbse/des_report_generator.py +800 -0
  906. icdev/tools/mbse/diagram_extractor.py +811 -0
  907. icdev/tools/mbse/digital_thread.py +1665 -0
  908. icdev/tools/mbse/model_code_generator.py +1122 -0
  909. icdev/tools/mbse/model_control_mapper.py +420 -0
  910. icdev/tools/mbse/pi_model_tracker.py +1093 -0
  911. icdev/tools/mbse/reqif_parser.py +1483 -0
  912. icdev/tools/mbse/sync_engine.py +1805 -0
  913. icdev/tools/mbse/xmi_parser.py +1573 -0
  914. icdev/tools/mcp/__init__.py +1 -0
  915. icdev/tools/mcp/base_server.py +535 -0
  916. icdev/tools/mcp/builder_server.py +725 -0
  917. icdev/tools/mcp/compliance_server.py +1407 -0
  918. icdev/tools/mcp/context_indexer.py +199 -0
  919. icdev/tools/mcp/context_server.py +305 -0
  920. icdev/tools/mcp/core_server.py +679 -0
  921. icdev/tools/mcp/devsecops_server.py +432 -0
  922. icdev/tools/mcp/gap_handlers.py +1079 -0
  923. icdev/tools/mcp/gateway_server.py +339 -0
  924. icdev/tools/mcp/generate_registry.py +623 -0
  925. icdev/tools/mcp/infra_server.py +264 -0
  926. icdev/tools/mcp/innovation_server.py +316 -0
  927. icdev/tools/mcp/integration_server.py +527 -0
  928. icdev/tools/mcp/knowledge_server.py +429 -0
  929. icdev/tools/mcp/maintenance_server.py +248 -0
  930. icdev/tools/mcp/marketplace_server.py +499 -0
  931. icdev/tools/mcp/mbse_server.py +398 -0
  932. icdev/tools/mcp/modernization_server.py +496 -0
  933. icdev/tools/mcp/observability_server.py +354 -0
  934. icdev/tools/mcp/requirements_server.py +415 -0
  935. icdev/tools/mcp/simulation_server.py +468 -0
  936. icdev/tools/mcp/standalone/__init__.py +2 -0
  937. icdev/tools/mcp/standalone/builder.py +59 -0
  938. icdev/tools/mcp/standalone/compliance.py +59 -0
  939. icdev/tools/mcp/standalone/core.py +59 -0
  940. icdev/tools/mcp/standalone/knowledge.py +59 -0
  941. icdev/tools/mcp/standalone/maintenance.py +59 -0
  942. icdev/tools/mcp/supply_chain_server.py +476 -0
  943. icdev/tools/mcp/tool_registry.py +2008 -0
  944. icdev/tools/mcp/unified_server.py +158 -0
  945. icdev/tools/memory/__init__.py +2 -0
  946. icdev/tools/memory/auto_capture.py +347 -0
  947. icdev/tools/memory/embed_memory.py +158 -0
  948. icdev/tools/memory/history_compressor.py +334 -0
  949. icdev/tools/memory/hybrid_search.py +236 -0
  950. icdev/tools/memory/maintenance_cron.py +289 -0
  951. icdev/tools/memory/memory_consolidation.py +444 -0
  952. icdev/tools/memory/memory_db.py +133 -0
  953. icdev/tools/memory/memory_read.py +102 -0
  954. icdev/tools/memory/memory_write.py +222 -0
  955. icdev/tools/memory/semantic_search.py +139 -0
  956. icdev/tools/memory/time_decay.py +435 -0
  957. icdev/tools/modernization/__init__.py +3 -0
  958. icdev/tools/modernization/architecture_extractor.py +734 -0
  959. icdev/tools/modernization/compliance_bridge.py +1499 -0
  960. icdev/tools/modernization/db_migration_planner.py +1385 -0
  961. icdev/tools/modernization/doc_generator.py +1428 -0
  962. icdev/tools/modernization/framework_migrator.py +1525 -0
  963. icdev/tools/modernization/legacy_analyzer.py +1948 -0
  964. icdev/tools/modernization/migration_code_generator.py +1639 -0
  965. icdev/tools/modernization/migration_report_generator.py +1653 -0
  966. icdev/tools/modernization/migration_tracker.py +1726 -0
  967. icdev/tools/modernization/monolith_decomposer.py +1508 -0
  968. icdev/tools/modernization/seven_r_assessor.py +1658 -0
  969. icdev/tools/modernization/strangler_fig_manager.py +1705 -0
  970. icdev/tools/modernization/ui_analyzer.py +771 -0
  971. icdev/tools/modernization/version_migrator.py +1392 -0
  972. icdev/tools/monitor/__init__.py +1 -0
  973. icdev/tools/monitor/alert_correlator.py +495 -0
  974. icdev/tools/monitor/auto_resolver.py +612 -0
  975. icdev/tools/monitor/health_checker.py +509 -0
  976. icdev/tools/monitor/heartbeat_daemon.py +792 -0
  977. icdev/tools/monitor/log_analyzer.py +516 -0
  978. icdev/tools/monitor/metric_collector.py +496 -0
  979. icdev/tools/mosa/__init__.py +10 -0
  980. icdev/tools/mosa/icd_generator.py +370 -0
  981. icdev/tools/mosa/modular_design_analyzer.py +683 -0
  982. icdev/tools/mosa/mosa_code_enforcer.py +349 -0
  983. icdev/tools/mosa/tsp_generator.py +265 -0
  984. icdev/tools/observability/__init__.py +100 -0
  985. icdev/tools/observability/genai_attributes.py +88 -0
  986. icdev/tools/observability/instrumentation.py +140 -0
  987. icdev/tools/observability/mlflow_exporter.py +194 -0
  988. icdev/tools/observability/otel_tracer.py +168 -0
  989. icdev/tools/observability/provenance/__init__.py +3 -0
  990. icdev/tools/observability/provenance/prov_recorder.py +324 -0
  991. icdev/tools/observability/shap/__init__.py +3 -0
  992. icdev/tools/observability/shap/agent_shap.py +275 -0
  993. icdev/tools/observability/sqlite_tracer.py +361 -0
  994. icdev/tools/observability/trace_context.py +205 -0
  995. icdev/tools/observability/tracer.py +230 -0
  996. icdev/tools/orchestration/__init__.py +2 -0
  997. icdev/tools/orchestration/workflow_composer.py +361 -0
  998. icdev/tools/project/__init__.py +1 -0
  999. icdev/tools/project/manifest_loader.py +418 -0
  1000. icdev/tools/project/project_create.py +350 -0
  1001. icdev/tools/project/project_list.py +174 -0
  1002. icdev/tools/project/project_scaffold.py +1715 -0
  1003. icdev/tools/project/project_status.py +479 -0
  1004. icdev/tools/project/session_context_builder.py +757 -0
  1005. icdev/tools/project/validate_manifest.py +55 -0
  1006. icdev/tools/registry/__init__.py +10 -0
  1007. icdev/tools/registry/absorption_engine.py +832 -0
  1008. icdev/tools/registry/capability_evaluator.py +668 -0
  1009. icdev/tools/registry/child_registry.py +617 -0
  1010. icdev/tools/registry/cross_pollinator.py +1065 -0
  1011. icdev/tools/registry/genome_manager.py +671 -0
  1012. icdev/tools/registry/learning_collector.py +912 -0
  1013. icdev/tools/registry/propagation_manager.py +942 -0
  1014. icdev/tools/registry/staging_manager.py +742 -0
  1015. icdev/tools/registry/telemetry_collector.py +423 -0
  1016. icdev/tools/requirements/__init__.py +1 -0
  1017. icdev/tools/requirements/ai_governance_scorer.py +208 -0
  1018. icdev/tools/requirements/boundary_analyzer.py +1293 -0
  1019. icdev/tools/requirements/clarification_engine.py +618 -0
  1020. icdev/tools/requirements/complexity_scorer.py +387 -0
  1021. icdev/tools/requirements/consistency_analyzer.py +803 -0
  1022. icdev/tools/requirements/constitution_manager.py +605 -0
  1023. icdev/tools/requirements/decomposition_engine.py +778 -0
  1024. icdev/tools/requirements/document_extractor.py +1016 -0
  1025. icdev/tools/requirements/elicitation_techniques.py +519 -0
  1026. icdev/tools/requirements/gap_detector.py +271 -0
  1027. icdev/tools/requirements/intake_engine.py +2188 -0
  1028. icdev/tools/requirements/prd_generator.py +847 -0
  1029. icdev/tools/requirements/prd_validator.py +595 -0
  1030. icdev/tools/requirements/readiness_scorer.py +313 -0
  1031. icdev/tools/requirements/spec_organizer.py +1029 -0
  1032. icdev/tools/requirements/spec_quality_checker.py +1097 -0
  1033. icdev/tools/requirements/traceability_builder.py +579 -0
  1034. icdev/tools/resilience/__init__.py +34 -0
  1035. icdev/tools/resilience/circuit_breaker.py +340 -0
  1036. icdev/tools/resilience/correlation.py +150 -0
  1037. icdev/tools/resilience/errors.py +81 -0
  1038. icdev/tools/resilience/retry.py +95 -0
  1039. icdev/tools/schemas/__init__.py +27 -0
  1040. icdev/tools/schemas/chat.py +61 -0
  1041. icdev/tools/schemas/compliance.py +56 -0
  1042. icdev/tools/schemas/core.py +85 -0
  1043. icdev/tools/schemas/innovation.py +37 -0
  1044. icdev/tools/schemas/validation.py +109 -0
  1045. icdev/tools/sdk/__init__.py +3 -0
  1046. icdev/tools/sdk/icdev_client.py +218 -0
  1047. icdev/tools/security/__init__.py +1 -0
  1048. icdev/tools/security/agent_output_validator.py +330 -0
  1049. icdev/tools/security/agent_trust_scorer.py +466 -0
  1050. icdev/tools/security/ai_bom_generator.py +725 -0
  1051. icdev/tools/security/ai_telemetry_logger.py +469 -0
  1052. icdev/tools/security/atlas_red_team.py +543 -0
  1053. icdev/tools/security/code_pattern_scanner.py +378 -0
  1054. icdev/tools/security/confabulation_detector.py +271 -0
  1055. icdev/tools/security/container_scanner.py +491 -0
  1056. icdev/tools/security/dependency_auditor.py +944 -0
  1057. icdev/tools/security/endpoint_security_scanner.py +579 -0
  1058. icdev/tools/security/mcp_tool_authorizer.py +243 -0
  1059. icdev/tools/security/prompt_injection_detector.py +737 -0
  1060. icdev/tools/security/sast_runner.py +948 -0
  1061. icdev/tools/security/secret_detector.py +378 -0
  1062. icdev/tools/security/tool_chain_validator.py +357 -0
  1063. icdev/tools/security/vuln_scanner.py +539 -0
  1064. icdev/tools/simulation/__init__.py +2 -0
  1065. icdev/tools/simulation/coa_generator.py +1552 -0
  1066. icdev/tools/simulation/monte_carlo.py +758 -0
  1067. icdev/tools/simulation/scenario_manager.py +1073 -0
  1068. icdev/tools/simulation/simulation_engine.py +1104 -0
  1069. icdev/tools/supply_chain/__init__.py +2 -0
  1070. icdev/tools/supply_chain/cve_triager.py +705 -0
  1071. icdev/tools/supply_chain/dependency_graph.py +645 -0
  1072. icdev/tools/supply_chain/isa_manager.py +540 -0
  1073. icdev/tools/supply_chain/scrm_assessor.py +546 -0
  1074. icdev/tools/testing/__init__.py +2 -0
  1075. icdev/tools/testing/acceptance_validator.py +411 -0
  1076. icdev/tools/testing/claude_dir_validator.py +831 -0
  1077. icdev/tools/testing/data_types.py +199 -0
  1078. icdev/tools/testing/e2e_runner.py +715 -0
  1079. icdev/tools/testing/fuzz_cli.py +306 -0
  1080. icdev/tools/testing/health_check.py +483 -0
  1081. icdev/tools/testing/platform_check.py +143 -0
  1082. icdev/tools/testing/production_audit.py +1862 -0
  1083. icdev/tools/testing/production_remediate.py +804 -0
  1084. icdev/tools/testing/screenshot_validator.py +539 -0
  1085. icdev/tools/testing/smoke_test.py +283 -0
  1086. icdev/tools/testing/test_agent_models.py +117 -0
  1087. icdev/tools/testing/test_orchestrator.py +957 -0
  1088. icdev/tools/testing/utils.py +229 -0
  1089. icdev/tools/translation/__init__.py +17 -0
  1090. icdev/tools/translation/code_translator.py +550 -0
  1091. icdev/tools/translation/dependency_mapper.py +277 -0
  1092. icdev/tools/translation/feature_map.py +395 -0
  1093. icdev/tools/translation/project_assembler.py +439 -0
  1094. icdev/tools/translation/source_extractor.py +609 -0
  1095. icdev/tools/translation/test_translator.py +333 -0
  1096. icdev/tools/translation/translation_manager.py +582 -0
  1097. icdev/tools/translation/translation_validator.py +662 -0
  1098. icdev/tools/translation/type_checker.py +371 -0
  1099. icdev-1.0.0.dist-info/METADATA +868 -0
  1100. icdev-1.0.0.dist-info/RECORD +1105 -0
  1101. icdev-1.0.0.dist-info/WHEEL +5 -0
  1102. icdev-1.0.0.dist-info/entry_points.txt +9 -0
  1103. icdev-1.0.0.dist-info/licenses/LICENSE +254 -0
  1104. icdev-1.0.0.dist-info/licenses/NOTICE +268 -0
  1105. icdev-1.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,2170 @@
1
+ #!/usr/bin/env python3
2
+ # CUI // SP-CTI
3
+ ####################################################################
4
+ # CONTROLLED UNCLASSIFIED INFORMATION (CUI) // SP-CTI
5
+ # Distribution: Distribution D -- Authorized DoD Personnel Only
6
+ ####################################################################
7
+ """NIST OSCAL 1.1.2 artifact generator for ICDEV.
8
+
9
+ Generates four OSCAL JSON artifact types from the ICDEV database:
10
+ - System Security Plan (SSP)
11
+ - Plan of Action & Milestones (POA&M)
12
+ - Assessment Results
13
+ - Component Definition
14
+
15
+ Each artifact conforms to the OSCAL 1.1.2 specification with proper UUIDs,
16
+ ISO 8601 timestamps, and lowercase hyphenated control IDs.
17
+
18
+ Usage:
19
+ python tools/compliance/oscal_generator.py --project-id "proj-123" --artifact all
20
+ python tools/compliance/oscal_generator.py --project-id "proj-123" --artifact ssp
21
+ python tools/compliance/oscal_generator.py --validate "/path/to/ssp.oscal.json"
22
+ """
23
+
24
+ import argparse
25
+ import hashlib
26
+ import json
27
+ import re
28
+ import sqlite3
29
+ import sys
30
+ import uuid
31
+ from datetime import datetime, timezone
32
+ from pathlib import Path
33
+ from icdev._paths import get_project_root
34
+
35
+ # ---------------------------------------------------------------------------
36
+ # Constants
37
+ # ---------------------------------------------------------------------------
38
+
39
+ BASE_DIR = get_project_root()
40
+ DB_PATH = BASE_DIR / "data" / "icdev.db"
41
+ OSCAL_VERSION = "1.1.2"
42
+ OSCAL_NS = "http://csrc.nist.gov/ns/oscal/1.0"
43
+
44
+ # FedRAMP profile URIs by baseline
45
+ FEDRAMP_PROFILE_URIS = {
46
+ "low": "https://raw.githubusercontent.com/GSA/fedramp-automation/master/dist/content/rev5/baselines/json/FedRAMP_rev5_LOW-baseline-resolved-profile_catalog.json",
47
+ "moderate": "https://raw.githubusercontent.com/GSA/fedramp-automation/master/dist/content/rev5/baselines/json/FedRAMP_rev5_MODERATE-baseline-resolved-profile_catalog.json",
48
+ "high": "https://raw.githubusercontent.com/GSA/fedramp-automation/master/dist/content/rev5/baselines/json/FedRAMP_rev5_HIGH-baseline-resolved-profile_catalog.json",
49
+ }
50
+
51
+ # Impact level to FedRAMP baseline mapping
52
+ IL_TO_BASELINE = {
53
+ "IL2": "moderate",
54
+ "IL4": "moderate",
55
+ "IL5": "high",
56
+ "IL6": "high",
57
+ }
58
+
59
+ # NIST 800-53 control family names
60
+ CONTROL_FAMILIES = {
61
+ "ac": "Access Control",
62
+ "at": "Awareness and Training",
63
+ "au": "Audit and Accountability",
64
+ "ca": "Assessment, Authorization, and Monitoring",
65
+ "cm": "Configuration Management",
66
+ "cp": "Contingency Planning",
67
+ "ia": "Identification and Authentication",
68
+ "ir": "Incident Response",
69
+ "ma": "Maintenance",
70
+ "mp": "Media Protection",
71
+ "pe": "Physical and Environmental Protection",
72
+ "pl": "Planning",
73
+ "pm": "Program Management",
74
+ "ps": "Personnel Security",
75
+ "pt": "PII Processing and Transparency",
76
+ "ra": "Risk Assessment",
77
+ "sa": "System and Services Acquisition",
78
+ "sc": "System and Communications Protection",
79
+ "si": "System and Information Integrity",
80
+ "sr": "Supply Chain Risk Management",
81
+ }
82
+
83
+ # UUID pattern for validation
84
+ UUID_PATTERN = re.compile(
85
+ r"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
86
+ )
87
+
88
+ # ISO 8601 timestamp pattern for validation
89
+ ISO_TIMESTAMP_PATTERN = re.compile(
90
+ r"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?Z$"
91
+ )
92
+
93
+ # OSCAL control-id pattern (lowercase, hyphenated)
94
+ CONTROL_ID_PATTERN = re.compile(r"^[a-z]{2}-\d+(\.\d+)?$")
95
+
96
+
97
+ # ---------------------------------------------------------------------------
98
+ # Helper functions
99
+ # ---------------------------------------------------------------------------
100
+
101
+ def _generate_uuid():
102
+ """Generate a UUID4 string for OSCAL identifiers."""
103
+ return str(uuid.uuid4())
104
+
105
+
106
+ def _oscal_timestamp():
107
+ """Generate an ISO 8601 timestamp with Z timezone for OSCAL metadata."""
108
+ return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + "Z"
109
+
110
+
111
+ def _control_id_to_oscal(control_id):
112
+ """Convert a control ID to OSCAL format (lowercase with hyphens).
113
+
114
+ Examples:
115
+ "AC-2" -> "ac-2"
116
+ "AC-2(1)" -> "ac-2.1"
117
+ "ac-2" -> "ac-2"
118
+ "SI-4(4)" -> "si-4.4"
119
+ """
120
+ if not control_id:
121
+ return ""
122
+ cid = control_id.strip().lower()
123
+ # Convert enhancement notation: ac-2(1) -> ac-2.1
124
+ cid = re.sub(r"\((\d+)\)", r".\1", cid)
125
+ return cid
126
+
127
+
128
+ def _compute_file_hash(file_path):
129
+ """Compute SHA-256 hash of a file for integrity verification."""
130
+ sha256 = hashlib.sha256()
131
+ path = Path(file_path)
132
+ if not path.exists():
133
+ return ""
134
+ with open(path, "rb") as f:
135
+ for chunk in iter(lambda: f.read(8192), b""):
136
+ sha256.update(chunk)
137
+ return sha256.hexdigest()
138
+
139
+
140
+ # ---------------------------------------------------------------------------
141
+ # Database helpers
142
+ # ---------------------------------------------------------------------------
143
+
144
+ def _get_connection(db_path=None):
145
+ """Get a database connection with Row factory."""
146
+ path = db_path or DB_PATH
147
+ if not path.exists():
148
+ raise FileNotFoundError(
149
+ f"Database not found: {path}\n"
150
+ "Run: python tools/db/init_icdev_db.py"
151
+ )
152
+ conn = sqlite3.connect(str(path))
153
+ conn.row_factory = sqlite3.Row
154
+ return conn
155
+
156
+
157
+ def _get_project(conn, project_id):
158
+ """Load project record from the projects table."""
159
+ row = conn.execute(
160
+ "SELECT * FROM projects WHERE id = ?", (project_id,)
161
+ ).fetchone()
162
+ if not row:
163
+ raise ValueError(f"Project '{project_id}' not found in database.")
164
+ return dict(row)
165
+
166
+
167
+ def _get_controls(conn, project_id):
168
+ """Load control implementations for a project.
169
+
170
+ Joins project_controls with compliance_controls for full metadata.
171
+ Returns list of dicts with control_id, implementation_status,
172
+ implementation_description, responsible_role, evidence_path, family, title.
173
+ """
174
+ rows = conn.execute(
175
+ """SELECT pc.control_id, pc.implementation_status,
176
+ pc.implementation_description, pc.responsible_role,
177
+ pc.evidence_path, pc.last_assessed,
178
+ cc.family, cc.title AS control_title,
179
+ cc.description AS control_description
180
+ FROM project_controls pc
181
+ LEFT JOIN compliance_controls cc ON pc.control_id = cc.id
182
+ WHERE pc.project_id = ?
183
+ ORDER BY pc.control_id""",
184
+ (project_id,),
185
+ ).fetchall()
186
+ return [dict(r) for r in rows]
187
+
188
+
189
+ def _get_poam_items(conn, project_id):
190
+ """Load POA&M items for a project, ordered by severity."""
191
+ rows = conn.execute(
192
+ """SELECT * FROM poam_items
193
+ WHERE project_id = ?
194
+ ORDER BY
195
+ CASE severity
196
+ WHEN 'critical' THEN 1
197
+ WHEN 'high' THEN 2
198
+ WHEN 'moderate' THEN 3
199
+ WHEN 'low' THEN 4
200
+ END,
201
+ id""",
202
+ (project_id,),
203
+ ).fetchall()
204
+ return [dict(r) for r in rows]
205
+
206
+
207
+ def _get_findings(conn, project_id):
208
+ """Load assessment findings across all compliance frameworks.
209
+
210
+ Pulls from fedramp_assessments, cmmc_assessments, stig_findings,
211
+ cssp_assessments, and sbd_assessments tables.
212
+
213
+ Returns a dict keyed by source framework with lists of finding dicts.
214
+ """
215
+ findings = {}
216
+
217
+ # FedRAMP assessments
218
+ rows = conn.execute(
219
+ """SELECT control_id, baseline, status, implementation_status,
220
+ evidence_description, evidence_path, notes,
221
+ assessment_date, assessor
222
+ FROM fedramp_assessments
223
+ WHERE project_id = ?
224
+ ORDER BY control_id""",
225
+ (project_id,),
226
+ ).fetchall()
227
+ findings["fedramp"] = [dict(r) for r in rows]
228
+
229
+ # CMMC assessments
230
+ rows = conn.execute(
231
+ """SELECT practice_id, domain, level, status,
232
+ evidence_description, evidence_path, notes,
233
+ nist_171_id, assessment_date, assessor
234
+ FROM cmmc_assessments
235
+ WHERE project_id = ?
236
+ ORDER BY practice_id""",
237
+ (project_id,),
238
+ ).fetchall()
239
+ findings["cmmc"] = [dict(r) for r in rows]
240
+
241
+ # STIG findings
242
+ rows = conn.execute(
243
+ """SELECT stig_id, finding_id, rule_id, severity, title,
244
+ description, check_content, fix_text, status,
245
+ comments, target_type, assessed_by, assessed_at
246
+ FROM stig_findings
247
+ WHERE project_id = ?
248
+ ORDER BY severity, finding_id""",
249
+ (project_id,),
250
+ ).fetchall()
251
+ findings["stig"] = [dict(r) for r in rows]
252
+
253
+ # CSSP assessments
254
+ try:
255
+ rows = conn.execute(
256
+ """SELECT functional_area, requirement_id, status,
257
+ evidence_description, evidence_path, notes,
258
+ assessment_date, assessor
259
+ FROM cssp_assessments
260
+ WHERE project_id = ?
261
+ ORDER BY requirement_id""",
262
+ (project_id,),
263
+ ).fetchall()
264
+ findings["cssp"] = [dict(r) for r in rows]
265
+ except sqlite3.OperationalError:
266
+ findings["cssp"] = []
267
+
268
+ # SbD assessments
269
+ try:
270
+ rows = conn.execute(
271
+ """SELECT domain, requirement_id, status,
272
+ evidence_description, evidence_path, notes,
273
+ assessment_date, assessor
274
+ FROM sbd_assessments
275
+ WHERE project_id = ?
276
+ ORDER BY requirement_id""",
277
+ (project_id,),
278
+ ).fetchall()
279
+ findings["sbd"] = [dict(r) for r in rows]
280
+ except sqlite3.OperationalError:
281
+ findings["sbd"] = []
282
+
283
+ return findings
284
+
285
+
286
+ def _get_sbom_records(conn, project_id):
287
+ """Load SBOM records for a project."""
288
+ rows = conn.execute(
289
+ """SELECT * FROM sbom_records
290
+ WHERE project_id = ?
291
+ ORDER BY generated_at DESC""",
292
+ (project_id,),
293
+ ).fetchall()
294
+ return [dict(r) for r in rows]
295
+
296
+
297
+ def _store_oscal_artifact(conn, project_id, artifact_type, file_path,
298
+ file_hash, schema_valid, validation_errors=None):
299
+ """Insert or update an OSCAL artifact record in the oscal_artifacts table.
300
+
301
+ Uses INSERT OR REPLACE on UNIQUE(project_id, artifact_type, format).
302
+ """
303
+ errors_json = json.dumps(validation_errors) if validation_errors else None
304
+ try:
305
+ conn.execute(
306
+ """INSERT OR REPLACE INTO oscal_artifacts
307
+ (project_id, artifact_type, oscal_version, format,
308
+ file_path, file_hash, schema_valid, validation_errors,
309
+ generated_at, classification)
310
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
311
+ (
312
+ project_id,
313
+ artifact_type,
314
+ OSCAL_VERSION,
315
+ "json",
316
+ str(file_path),
317
+ file_hash,
318
+ 1 if schema_valid else 0,
319
+ errors_json,
320
+ _oscal_timestamp(),
321
+ "CUI",
322
+ ),
323
+ )
324
+ conn.commit()
325
+ except Exception as e:
326
+ print(f"Warning: Could not store OSCAL artifact record: {e}",
327
+ file=sys.stderr)
328
+
329
+
330
+ def _log_audit(conn, project_id, action, details):
331
+ """Log an audit trail event for OSCAL generation (append-only, NIST AU)."""
332
+ try:
333
+ conn.execute(
334
+ """INSERT INTO audit_trail
335
+ (project_id, event_type, actor, action, details,
336
+ affected_files, classification)
337
+ VALUES (?, ?, ?, ?, ?, ?, ?)""",
338
+ (
339
+ project_id,
340
+ "oscal_generated",
341
+ "icdev-compliance-engine",
342
+ action,
343
+ json.dumps(details),
344
+ json.dumps(details.get("affected_files", [])),
345
+ "CUI",
346
+ ),
347
+ )
348
+ conn.commit()
349
+ except Exception as e:
350
+ print(f"Warning: Could not log audit event: {e}", file=sys.stderr)
351
+
352
+
353
+ def _resolve_output_dir(project, project_id, output_dir=None):
354
+ """Resolve the output directory for OSCAL artifacts.
355
+
356
+ Priority:
357
+ 1. Explicit output_dir argument
358
+ 2. Project directory_path / compliance / oscal
359
+ 3. BASE_DIR / .tmp / compliance / project_id / oscal
360
+ """
361
+ if output_dir:
362
+ out = Path(output_dir)
363
+ else:
364
+ dir_path = project.get("directory_path", "")
365
+ if dir_path:
366
+ out = Path(dir_path) / "compliance" / "oscal"
367
+ else:
368
+ out = BASE_DIR / ".tmp" / "compliance" / project_id / "oscal"
369
+ out.mkdir(parents=True, exist_ok=True)
370
+ return out
371
+
372
+
373
+ def _determine_baseline(project):
374
+ """Determine FedRAMP baseline from project impact level."""
375
+ il = project.get("impact_level", "IL5")
376
+ return IL_TO_BASELINE.get(il, "moderate")
377
+
378
+
379
+ def _build_metadata(project, title_prefix, extra_roles=None):
380
+ """Build the OSCAL metadata block common to all artifact types."""
381
+ now = _oscal_timestamp()
382
+ roles = [
383
+ {
384
+ "id": "system-owner",
385
+ "title": "System Owner",
386
+ },
387
+ {
388
+ "id": "authorizing-official",
389
+ "title": "Authorizing Official",
390
+ },
391
+ {
392
+ "id": "system-admin",
393
+ "title": "System Administrator",
394
+ },
395
+ {
396
+ "id": "isso",
397
+ "title": "Information System Security Officer",
398
+ },
399
+ {
400
+ "id": "issm",
401
+ "title": "Information System Security Manager",
402
+ },
403
+ ]
404
+ if extra_roles:
405
+ roles.extend(extra_roles)
406
+
407
+ parties = [
408
+ {
409
+ "uuid": _generate_uuid(),
410
+ "type": "organization",
411
+ "name": project.get("created_by", "Organization"),
412
+ "remarks": "System owning organization",
413
+ },
414
+ ]
415
+
416
+ return {
417
+ "title": f"{title_prefix} -- {project.get('name', 'UNNAMED')}",
418
+ "last-modified": now,
419
+ "version": "1.0",
420
+ "oscal-version": OSCAL_VERSION,
421
+ "roles": roles,
422
+ "parties": parties,
423
+ "remarks": (
424
+ f"Generated by ICDEV Compliance Engine. "
425
+ f"Classification: CUI // SP-CTI. "
426
+ f"Impact Level: {project.get('impact_level', 'IL5')}."
427
+ ),
428
+ }
429
+
430
+
431
+ def _build_system_characteristics(project):
432
+ """Build the system-characteristics block for SSP."""
433
+ baseline = _determine_baseline(project)
434
+ sensitivity = "high" if baseline == "high" else "moderate"
435
+
436
+ # Determine security objective levels from impact level
437
+ il = project.get("impact_level", "IL5")
438
+ if il in ("IL5", "IL6"):
439
+ conf = "high"
440
+ integ = "high"
441
+ avail = "moderate"
442
+ else:
443
+ conf = "moderate"
444
+ integ = "moderate"
445
+ avail = "low"
446
+
447
+ return {
448
+ "system-ids": [
449
+ {
450
+ "identifier-type": "https://ietf.org/rfc/rfc4122",
451
+ "id": project.get("id", _generate_uuid()),
452
+ }
453
+ ],
454
+ "system-name": project.get("name", "UNNAMED SYSTEM"),
455
+ "description": project.get("description", "System description pending."),
456
+ "security-sensitivity-level": sensitivity,
457
+ "system-information": {
458
+ "information-types": [
459
+ {
460
+ "uuid": _generate_uuid(),
461
+ "title": "Controlled Technical Information",
462
+ "description": (
463
+ "Technical information with military or space "
464
+ "application that is subject to controls on the access, "
465
+ "use, reproduction, modification, performance, display, "
466
+ "release, disclosure, or dissemination."
467
+ ),
468
+ "categorizations": [
469
+ {
470
+ "system": "https://doi.org/10.6028/NIST.SP.800-60v2r1",
471
+ "information-type-ids": ["C.3.5.8"],
472
+ }
473
+ ],
474
+ "confidentiality-impact": {
475
+ "base": conf,
476
+ },
477
+ "integrity-impact": {
478
+ "base": integ,
479
+ },
480
+ "availability-impact": {
481
+ "base": avail,
482
+ },
483
+ }
484
+ ],
485
+ },
486
+ "security-impact-level": {
487
+ "security-objective-confidentiality": conf,
488
+ "security-objective-integrity": integ,
489
+ "security-objective-availability": avail,
490
+ },
491
+ "status": {
492
+ "state": project.get("status", "under-development"),
493
+ "remarks": (
494
+ f"ATO Status: {project.get('ato_status', 'none')}. "
495
+ f"Classification: {project.get('classification', 'CUI')}."
496
+ ),
497
+ },
498
+ "authorization-boundary": {
499
+ "description": (
500
+ f"The authorization boundary encompasses the "
501
+ f"{project.get('name', 'system')} application, its "
502
+ f"supporting infrastructure within "
503
+ f"{project.get('cloud_environment', 'AWS GovCloud')}, "
504
+ f"and all data flows between components."
505
+ ),
506
+ },
507
+ "network-architecture": {
508
+ "description": (
509
+ f"The system operates within "
510
+ f"{project.get('cloud_environment', 'AWS GovCloud')} "
511
+ f"using a {project.get('type', 'webapp')} architecture. "
512
+ f"All network traffic is encrypted using TLS 1.2+ "
513
+ f"with FIPS 140-2 validated cryptographic modules."
514
+ ),
515
+ },
516
+ "data-flow": {
517
+ "description": (
518
+ "Data flows are restricted to encrypted channels. "
519
+ "All CUI data at rest is encrypted with AES-256. "
520
+ "Data in transit uses TLS 1.2+ with mutual TLS "
521
+ "for inter-service communication."
522
+ ),
523
+ },
524
+ }
525
+
526
+
527
+ def _build_system_implementation(project, controls):
528
+ """Build the system-implementation block for SSP."""
529
+ users = [
530
+ {
531
+ "uuid": _generate_uuid(),
532
+ "role-ids": ["system-owner"],
533
+ "title": "System Owner",
534
+ "description": "Responsible for overall system operation.",
535
+ },
536
+ {
537
+ "uuid": _generate_uuid(),
538
+ "role-ids": ["system-admin"],
539
+ "title": "System Administrator",
540
+ "description": "Manages system configuration and maintenance.",
541
+ },
542
+ {
543
+ "uuid": _generate_uuid(),
544
+ "role-ids": ["isso"],
545
+ "title": "ISSO",
546
+ "description": (
547
+ "Ensures system security controls are implemented "
548
+ "and operating effectively."
549
+ ),
550
+ },
551
+ ]
552
+
553
+ components = [
554
+ {
555
+ "uuid": _generate_uuid(),
556
+ "type": "this-system",
557
+ "title": project.get("name", "Application"),
558
+ "description": project.get("description", "Primary application component."),
559
+ "status": {
560
+ "state": "operational",
561
+ },
562
+ "props": [],
563
+ },
564
+ ]
565
+
566
+ # Add tech stack components if available
567
+ backend = project.get("tech_stack_backend")
568
+ if backend:
569
+ components.append({
570
+ "uuid": _generate_uuid(),
571
+ "type": "software",
572
+ "title": f"Backend: {backend}",
573
+ "description": f"Backend technology stack: {backend}",
574
+ "status": {"state": "operational"},
575
+ })
576
+
577
+ frontend = project.get("tech_stack_frontend")
578
+ if frontend:
579
+ components.append({
580
+ "uuid": _generate_uuid(),
581
+ "type": "software",
582
+ "title": f"Frontend: {frontend}",
583
+ "description": f"Frontend technology stack: {frontend}",
584
+ "status": {"state": "operational"},
585
+ })
586
+
587
+ database = project.get("tech_stack_database")
588
+ if database:
589
+ components.append({
590
+ "uuid": _generate_uuid(),
591
+ "type": "software",
592
+ "title": f"Database: {database}",
593
+ "description": f"Database technology: {database}",
594
+ "status": {"state": "operational"},
595
+ })
596
+
597
+ # Cloud infrastructure component
598
+ cloud_env = project.get("cloud_environment", "aws-govcloud")
599
+ components.append({
600
+ "uuid": _generate_uuid(),
601
+ "type": "leveraged-system",
602
+ "title": f"Cloud Infrastructure: {cloud_env}",
603
+ "description": (
604
+ f"Cloud infrastructure provided by {cloud_env}. "
605
+ f"FedRAMP authorized cloud service provider."
606
+ ),
607
+ "status": {"state": "operational"},
608
+ })
609
+
610
+ return {
611
+ "users": users,
612
+ "components": components,
613
+ }
614
+
615
+
616
+ def _build_control_implementation(controls, system_component_uuid=None):
617
+ """Build the control-implementation block for SSP.
618
+
619
+ Converts each project control into an OSCAL implemented-requirement.
620
+ """
621
+ implemented_requirements = []
622
+
623
+ for ctrl in controls:
624
+ oscal_cid = _control_id_to_oscal(ctrl["control_id"])
625
+ if not oscal_cid:
626
+ continue
627
+
628
+ # Build statement description from implementation details
629
+ description = ctrl.get("implementation_description") or (
630
+ f"Control {oscal_cid} implementation is "
631
+ f"{ctrl.get('implementation_status', 'planned')}."
632
+ )
633
+
634
+ req = {
635
+ "uuid": _generate_uuid(),
636
+ "control-id": oscal_cid,
637
+ "statements": [
638
+ {
639
+ "statement-id": f"{oscal_cid}_smt",
640
+ "uuid": _generate_uuid(),
641
+ "description": description,
642
+ }
643
+ ],
644
+ }
645
+
646
+ # Add props for status and responsible role
647
+ props = [
648
+ {
649
+ "name": "implementation-status",
650
+ "ns": OSCAL_NS,
651
+ "value": ctrl.get("implementation_status", "planned"),
652
+ },
653
+ ]
654
+ if ctrl.get("responsible_role"):
655
+ props.append({
656
+ "name": "responsible-role",
657
+ "ns": OSCAL_NS,
658
+ "value": ctrl["responsible_role"],
659
+ })
660
+ req["props"] = props
661
+
662
+ # Add responsible-roles if available
663
+ if ctrl.get("responsible_role"):
664
+ req["responsible-roles"] = [
665
+ {
666
+ "role-id": ctrl["responsible_role"]
667
+ .lower()
668
+ .replace(" ", "-")
669
+ .replace("_", "-"),
670
+ }
671
+ ]
672
+
673
+ implemented_requirements.append(req)
674
+
675
+ return {
676
+ "description": (
677
+ "This section describes the implementation of each "
678
+ "security control for the system. Controls are mapped to "
679
+ "NIST 800-53 Rev 5 per the applicable FedRAMP baseline."
680
+ ),
681
+ "implemented-requirements": implemented_requirements,
682
+ }
683
+
684
+
685
+ # ---------------------------------------------------------------------------
686
+ # Core generation functions
687
+ # ---------------------------------------------------------------------------
688
+
689
+ def generate_oscal_ssp(project_id, output_dir=None, db_path=None):
690
+ """Generate an OSCAL SSP JSON artifact.
691
+
692
+ Loads project data and control implementations from the database,
693
+ builds a full OSCAL 1.1.2 SSP structure, writes to disk, records
694
+ in oscal_artifacts, and logs an audit event.
695
+
696
+ Args:
697
+ project_id: The project identifier.
698
+ output_dir: Override output directory (default: project compliance/oscal/).
699
+ db_path: Override database path.
700
+
701
+ Returns:
702
+ Dict with file_path, uuid, controls_count, and validation result.
703
+ """
704
+ conn = _get_connection(db_path)
705
+ try:
706
+ project = _get_project(conn, project_id)
707
+ controls = _get_controls(conn, project_id)
708
+ baseline = _determine_baseline(project)
709
+ profile_href = FEDRAMP_PROFILE_URIS.get(baseline, FEDRAMP_PROFILE_URIS["moderate"])
710
+
711
+ ssp_uuid = _generate_uuid()
712
+
713
+ # Build system-implementation first to get component UUIDs
714
+ sys_impl = _build_system_implementation(project, controls)
715
+ primary_component_uuid = (
716
+ sys_impl["components"][0]["uuid"]
717
+ if sys_impl["components"]
718
+ else None
719
+ )
720
+
721
+ ssp = {
722
+ "system-security-plan": {
723
+ "uuid": ssp_uuid,
724
+ "metadata": _build_metadata(project, "System Security Plan"),
725
+ "import-profile": {
726
+ "href": profile_href,
727
+ },
728
+ "system-characteristics": _build_system_characteristics(project),
729
+ "system-implementation": sys_impl,
730
+ "control-implementation": _build_control_implementation(
731
+ controls, primary_component_uuid
732
+ ),
733
+ "back-matter": {
734
+ "resources": [
735
+ {
736
+ "uuid": _generate_uuid(),
737
+ "title": "FedRAMP Profile",
738
+ "description": (
739
+ f"FedRAMP {baseline.capitalize()} baseline profile."
740
+ ),
741
+ "rlinks": [
742
+ {"href": profile_href},
743
+ ],
744
+ },
745
+ {
746
+ "uuid": _generate_uuid(),
747
+ "title": "NIST SP 800-53 Rev 5",
748
+ "description": (
749
+ "Security and Privacy Controls for Information "
750
+ "Systems and Organizations."
751
+ ),
752
+ "rlinks": [
753
+ {
754
+ "href": "https://doi.org/10.6028/NIST.SP.800-53r5",
755
+ },
756
+ ],
757
+ },
758
+ ],
759
+ },
760
+ },
761
+ }
762
+
763
+ # Write to file
764
+ out_dir = _resolve_output_dir(project, project_id, output_dir)
765
+ out_file = out_dir / "ssp.oscal.json"
766
+
767
+ with open(out_file, "w", encoding="utf-8") as f:
768
+ json.dump(ssp, f, indent=2, ensure_ascii=False)
769
+
770
+ file_hash = _compute_file_hash(out_file)
771
+
772
+ # Validate
773
+ validation = validate_oscal(str(out_file), "ssp")
774
+ schema_valid = validation["valid"]
775
+
776
+ # Store artifact record
777
+ _store_oscal_artifact(
778
+ conn, project_id, "ssp", str(out_file),
779
+ file_hash, schema_valid, validation.get("errors")
780
+ )
781
+
782
+ # Audit
783
+ _log_audit(conn, project_id, "OSCAL SSP generated", {
784
+ "artifact_type": "ssp",
785
+ "oscal_version": OSCAL_VERSION,
786
+ "uuid": ssp_uuid,
787
+ "controls_count": len(controls),
788
+ "baseline": baseline,
789
+ "file_hash": file_hash,
790
+ "schema_valid": schema_valid,
791
+ "affected_files": [str(out_file)],
792
+ })
793
+
794
+ print("OSCAL SSP generated:")
795
+ print(f" File: {out_file}")
796
+ print(f" UUID: {ssp_uuid}")
797
+ print(f" Controls: {len(controls)}")
798
+ print(f" Baseline: {baseline}")
799
+ print(f" Valid: {schema_valid}")
800
+
801
+ return {
802
+ "file_path": str(out_file),
803
+ "uuid": ssp_uuid,
804
+ "controls_count": len(controls),
805
+ "baseline": baseline,
806
+ "file_hash": file_hash,
807
+ "validation": validation,
808
+ }
809
+
810
+ finally:
811
+ conn.close()
812
+
813
+
814
+ def generate_oscal_poam(project_id, output_dir=None, db_path=None):
815
+ """Generate an OSCAL POA&M JSON artifact.
816
+
817
+ Pulls items from the poam_items table and builds a full OSCAL 1.1.2
818
+ POA&M structure with poam-items, findings, observations, and risks.
819
+
820
+ Args:
821
+ project_id: The project identifier.
822
+ output_dir: Override output directory.
823
+ db_path: Override database path.
824
+
825
+ Returns:
826
+ Dict with file_path, uuid, items_count, and validation result.
827
+ """
828
+ conn = _get_connection(db_path)
829
+ try:
830
+ project = _get_project(conn, project_id)
831
+ poam_items = _get_poam_items(conn, project_id)
832
+
833
+ poam_uuid = _generate_uuid()
834
+ now = _oscal_timestamp()
835
+
836
+ # Build OSCAL poam-items
837
+ oscal_poam_items = []
838
+ observations = []
839
+ risks = []
840
+
841
+ for item in poam_items:
842
+ item_uuid = _generate_uuid()
843
+ obs_uuid = _generate_uuid()
844
+ risk_uuid = _generate_uuid()
845
+
846
+ # Map severity to risk level
847
+ severity = item.get("severity", "moderate")
848
+ risk_level = {
849
+ "critical": "very-high",
850
+ "high": "high",
851
+ "moderate": "moderate",
852
+ "low": "low",
853
+ }.get(severity, "moderate")
854
+
855
+ # Build observation
856
+ observation = {
857
+ "uuid": obs_uuid,
858
+ "title": f"Observation: {item.get('weakness_id', 'Unknown')}",
859
+ "description": item.get("weakness_description", "No description."),
860
+ "methods": ["EXAMINE", "TEST"],
861
+ "collected": item.get("created_at", now),
862
+ }
863
+ if item.get("source"):
864
+ observation["origins"] = [
865
+ {
866
+ "actors": [
867
+ {
868
+ "type": "tool",
869
+ "actor-uuid": _generate_uuid(),
870
+ }
871
+ ],
872
+ }
873
+ ]
874
+ observations.append(observation)
875
+
876
+ # Build risk
877
+ risk = {
878
+ "uuid": risk_uuid,
879
+ "title": f"Risk: {item.get('weakness_id', 'Unknown')}",
880
+ "description": item.get("weakness_description", "No description."),
881
+ "statement": (
882
+ f"Identified weakness {item.get('weakness_id', '')} "
883
+ f"with severity {severity}. "
884
+ f"Source: {item.get('source', 'Assessment')}."
885
+ ),
886
+ "status": _poam_status_to_oscal(item.get("status", "open")),
887
+ "characterizations": [
888
+ {
889
+ "origin": {
890
+ "actors": [
891
+ {
892
+ "type": "tool",
893
+ "actor-uuid": _generate_uuid(),
894
+ }
895
+ ],
896
+ },
897
+ "facets": [
898
+ {
899
+ "name": "risk-level",
900
+ "system": OSCAL_NS,
901
+ "value": risk_level,
902
+ },
903
+ ],
904
+ }
905
+ ],
906
+ }
907
+ if item.get("corrective_action"):
908
+ risk["mitigating-factors"] = [
909
+ {
910
+ "uuid": _generate_uuid(),
911
+ "description": item["corrective_action"],
912
+ }
913
+ ]
914
+ if item.get("milestone_date"):
915
+ risk["remediations"] = [
916
+ {
917
+ "uuid": _generate_uuid(),
918
+ "lifecycle": "planned",
919
+ "title": f"Remediation for {item.get('weakness_id', '')}",
920
+ "description": item.get("corrective_action", "Pending remediation."),
921
+ }
922
+ ]
923
+ risks.append(risk)
924
+
925
+ # Build POA&M item
926
+ poam_entry = {
927
+ "uuid": item_uuid,
928
+ "title": f"POA&M: {item.get('weakness_id', 'Unknown')}",
929
+ "description": item.get("weakness_description", "No description."),
930
+ "related-observations": [
931
+ {"observation-uuid": obs_uuid},
932
+ ],
933
+ "related-risks": [
934
+ {"risk-uuid": risk_uuid},
935
+ ],
936
+ }
937
+
938
+ # Add props
939
+ props = [
940
+ {
941
+ "name": "severity",
942
+ "ns": OSCAL_NS,
943
+ "value": severity,
944
+ },
945
+ ]
946
+ if item.get("status"):
947
+ props.append({
948
+ "name": "status",
949
+ "ns": OSCAL_NS,
950
+ "value": item["status"],
951
+ })
952
+ if item.get("milestone_date"):
953
+ props.append({
954
+ "name": "milestone-date",
955
+ "ns": OSCAL_NS,
956
+ "value": item["milestone_date"],
957
+ })
958
+ if item.get("responsible_party"):
959
+ props.append({
960
+ "name": "responsible-party",
961
+ "ns": OSCAL_NS,
962
+ "value": item["responsible_party"],
963
+ })
964
+ if item.get("control_id"):
965
+ oscal_cid = _control_id_to_oscal(item["control_id"])
966
+ if oscal_cid:
967
+ props.append({
968
+ "name": "related-control",
969
+ "ns": OSCAL_NS,
970
+ "value": oscal_cid,
971
+ })
972
+ poam_entry["props"] = props
973
+
974
+ oscal_poam_items.append(poam_entry)
975
+
976
+ # Assemble full POA&M document
977
+ poam_doc = {
978
+ "plan-of-action-and-milestones": {
979
+ "uuid": poam_uuid,
980
+ "metadata": _build_metadata(
981
+ project, "Plan of Action and Milestones"
982
+ ),
983
+ "import-ssp": {
984
+ "href": "./ssp.oscal.json",
985
+ },
986
+ "observations": observations,
987
+ "risks": risks,
988
+ "poam-items": oscal_poam_items,
989
+ "back-matter": {
990
+ "resources": [],
991
+ },
992
+ },
993
+ }
994
+
995
+ # Write
996
+ out_dir = _resolve_output_dir(project, project_id, output_dir)
997
+ out_file = out_dir / "poam.oscal.json"
998
+
999
+ with open(out_file, "w", encoding="utf-8") as f:
1000
+ json.dump(poam_doc, f, indent=2, ensure_ascii=False)
1001
+
1002
+ file_hash = _compute_file_hash(out_file)
1003
+
1004
+ # Validate
1005
+ validation = validate_oscal(str(out_file), "poam")
1006
+ schema_valid = validation["valid"]
1007
+
1008
+ # Store record
1009
+ _store_oscal_artifact(
1010
+ conn, project_id, "poam", str(out_file),
1011
+ file_hash, schema_valid, validation.get("errors")
1012
+ )
1013
+
1014
+ # Audit
1015
+ _log_audit(conn, project_id, "OSCAL POA&M generated", {
1016
+ "artifact_type": "poam",
1017
+ "oscal_version": OSCAL_VERSION,
1018
+ "uuid": poam_uuid,
1019
+ "items_count": len(poam_items),
1020
+ "file_hash": file_hash,
1021
+ "schema_valid": schema_valid,
1022
+ "affected_files": [str(out_file)],
1023
+ })
1024
+
1025
+ print("OSCAL POA&M generated:")
1026
+ print(f" File: {out_file}")
1027
+ print(f" UUID: {poam_uuid}")
1028
+ print(f" Items: {len(poam_items)}")
1029
+ print(f" Valid: {schema_valid}")
1030
+
1031
+ return {
1032
+ "file_path": str(out_file),
1033
+ "uuid": poam_uuid,
1034
+ "items_count": len(poam_items),
1035
+ "file_hash": file_hash,
1036
+ "validation": validation,
1037
+ }
1038
+
1039
+ finally:
1040
+ conn.close()
1041
+
1042
+
1043
+ def _poam_status_to_oscal(status):
1044
+ """Map POAM item status to OSCAL risk status."""
1045
+ mapping = {
1046
+ "open": "open",
1047
+ "in_progress": "investigating",
1048
+ "completed": "closed",
1049
+ "accepted_risk": "deviation-approved",
1050
+ }
1051
+ return mapping.get(status, "open")
1052
+
1053
+
1054
+ def generate_oscal_assessment_results(project_id, output_dir=None, db_path=None):
1055
+ """Generate an OSCAL Assessment Results JSON artifact.
1056
+
1057
+ Pulls findings from fedramp_assessments, cmmc_assessments,
1058
+ stig_findings, cssp_assessments, and sbd_assessments tables.
1059
+ Builds assessment-results with findings, observations, and risks
1060
+ organized per control.
1061
+
1062
+ Args:
1063
+ project_id: The project identifier.
1064
+ output_dir: Override output directory.
1065
+ db_path: Override database path.
1066
+
1067
+ Returns:
1068
+ Dict with file_path, uuid, findings_count, and validation result.
1069
+ """
1070
+ conn = _get_connection(db_path)
1071
+ try:
1072
+ project = _get_project(conn, project_id)
1073
+ all_findings = _get_findings(conn, project_id)
1074
+
1075
+ ar_uuid = _generate_uuid()
1076
+ result_uuid = _generate_uuid()
1077
+ now = _oscal_timestamp()
1078
+
1079
+ observations = []
1080
+ findings = []
1081
+ total_finding_count = 0
1082
+
1083
+ # Process FedRAMP assessments
1084
+ for item in all_findings.get("fedramp", []):
1085
+ obs_uuid = _generate_uuid()
1086
+ finding_uuid = _generate_uuid()
1087
+ total_finding_count += 1
1088
+
1089
+ oscal_cid = _control_id_to_oscal(item.get("control_id", ""))
1090
+ status = _assessment_status_to_oscal(item.get("status", "not_assessed"))
1091
+
1092
+ observations.append({
1093
+ "uuid": obs_uuid,
1094
+ "title": f"FedRAMP: {item.get('control_id', 'Unknown')}",
1095
+ "description": item.get("evidence_description", "No evidence description."),
1096
+ "methods": ["EXAMINE", "INTERVIEW", "TEST"],
1097
+ "collected": item.get("assessment_date", now),
1098
+ "props": [
1099
+ {
1100
+ "name": "framework",
1101
+ "ns": OSCAL_NS,
1102
+ "value": "FedRAMP",
1103
+ },
1104
+ {
1105
+ "name": "baseline",
1106
+ "ns": OSCAL_NS,
1107
+ "value": item.get("baseline", "moderate"),
1108
+ },
1109
+ ],
1110
+ })
1111
+
1112
+ finding_entry = {
1113
+ "uuid": finding_uuid,
1114
+ "title": f"FedRAMP Finding: {item.get('control_id', '')}",
1115
+ "description": (
1116
+ f"FedRAMP {item.get('baseline', 'moderate')} assessment "
1117
+ f"for control {item.get('control_id', '')}."
1118
+ ),
1119
+ "target": {
1120
+ "type": "objective-id",
1121
+ "target-id": oscal_cid or "unknown",
1122
+ "status": {
1123
+ "state": status,
1124
+ },
1125
+ },
1126
+ "related-observations": [
1127
+ {"observation-uuid": obs_uuid},
1128
+ ],
1129
+ }
1130
+ if item.get("notes"):
1131
+ finding_entry["remarks"] = item["notes"]
1132
+ findings.append(finding_entry)
1133
+
1134
+ # Process CMMC assessments
1135
+ for item in all_findings.get("cmmc", []):
1136
+ obs_uuid = _generate_uuid()
1137
+ finding_uuid = _generate_uuid()
1138
+ total_finding_count += 1
1139
+
1140
+ status = _cmmc_status_to_oscal(item.get("status", "not_assessed"))
1141
+
1142
+ observations.append({
1143
+ "uuid": obs_uuid,
1144
+ "title": f"CMMC: {item.get('practice_id', 'Unknown')}",
1145
+ "description": item.get("evidence_description", "No evidence description."),
1146
+ "methods": ["EXAMINE", "TEST"],
1147
+ "collected": item.get("assessment_date", now),
1148
+ "props": [
1149
+ {
1150
+ "name": "framework",
1151
+ "ns": OSCAL_NS,
1152
+ "value": "CMMC",
1153
+ },
1154
+ {
1155
+ "name": "level",
1156
+ "ns": OSCAL_NS,
1157
+ "value": str(item.get("level", 2)),
1158
+ },
1159
+ {
1160
+ "name": "domain",
1161
+ "ns": OSCAL_NS,
1162
+ "value": item.get("domain", ""),
1163
+ },
1164
+ ],
1165
+ })
1166
+
1167
+ findings.append({
1168
+ "uuid": finding_uuid,
1169
+ "title": f"CMMC Finding: {item.get('practice_id', '')}",
1170
+ "description": (
1171
+ f"CMMC Level {item.get('level', 2)} assessment for "
1172
+ f"practice {item.get('practice_id', '')} "
1173
+ f"(domain: {item.get('domain', '')})."
1174
+ ),
1175
+ "target": {
1176
+ "type": "objective-id",
1177
+ "target-id": item.get("practice_id", "unknown").lower(),
1178
+ "status": {
1179
+ "state": status,
1180
+ },
1181
+ },
1182
+ "related-observations": [
1183
+ {"observation-uuid": obs_uuid},
1184
+ ],
1185
+ })
1186
+
1187
+ # Process STIG findings
1188
+ for item in all_findings.get("stig", []):
1189
+ obs_uuid = _generate_uuid()
1190
+ finding_uuid = _generate_uuid()
1191
+ total_finding_count += 1
1192
+
1193
+ status = _stig_status_to_oscal(item.get("status", "Open"))
1194
+
1195
+ observations.append({
1196
+ "uuid": obs_uuid,
1197
+ "title": f"STIG: {item.get('stig_id', '')} - {item.get('finding_id', '')}",
1198
+ "description": item.get("description", item.get("title", "No description.")),
1199
+ "methods": ["TEST"],
1200
+ "collected": item.get("assessed_at", now),
1201
+ "props": [
1202
+ {
1203
+ "name": "framework",
1204
+ "ns": OSCAL_NS,
1205
+ "value": "DISA-STIG",
1206
+ },
1207
+ {
1208
+ "name": "severity",
1209
+ "ns": OSCAL_NS,
1210
+ "value": item.get("severity", "CAT2"),
1211
+ },
1212
+ {
1213
+ "name": "rule-id",
1214
+ "ns": OSCAL_NS,
1215
+ "value": item.get("rule_id", ""),
1216
+ },
1217
+ ],
1218
+ })
1219
+
1220
+ finding_entry = {
1221
+ "uuid": finding_uuid,
1222
+ "title": f"STIG Finding: {item.get('title', '')}",
1223
+ "description": item.get("description", "No description."),
1224
+ "target": {
1225
+ "type": "objective-id",
1226
+ "target-id": item.get("rule_id", "unknown"),
1227
+ "status": {
1228
+ "state": status,
1229
+ },
1230
+ },
1231
+ "related-observations": [
1232
+ {"observation-uuid": obs_uuid},
1233
+ ],
1234
+ }
1235
+ if item.get("comments"):
1236
+ finding_entry["remarks"] = item["comments"]
1237
+ findings.append(finding_entry)
1238
+
1239
+ # Process CSSP assessments
1240
+ for item in all_findings.get("cssp", []):
1241
+ obs_uuid = _generate_uuid()
1242
+ finding_uuid = _generate_uuid()
1243
+ total_finding_count += 1
1244
+
1245
+ status = _assessment_status_to_oscal(item.get("status", "not_assessed"))
1246
+
1247
+ observations.append({
1248
+ "uuid": obs_uuid,
1249
+ "title": f"CSSP: {item.get('requirement_id', 'Unknown')}",
1250
+ "description": item.get("evidence_description", "No evidence description."),
1251
+ "methods": ["EXAMINE"],
1252
+ "collected": item.get("assessment_date", now),
1253
+ "props": [
1254
+ {
1255
+ "name": "framework",
1256
+ "ns": OSCAL_NS,
1257
+ "value": "DoDI-8530.01-CSSP",
1258
+ },
1259
+ {
1260
+ "name": "functional-area",
1261
+ "ns": OSCAL_NS,
1262
+ "value": item.get("functional_area", ""),
1263
+ },
1264
+ ],
1265
+ })
1266
+
1267
+ findings.append({
1268
+ "uuid": finding_uuid,
1269
+ "title": f"CSSP Finding: {item.get('requirement_id', '')}",
1270
+ "description": (
1271
+ f"CSSP assessment for requirement "
1272
+ f"{item.get('requirement_id', '')} "
1273
+ f"(area: {item.get('functional_area', '')})."
1274
+ ),
1275
+ "target": {
1276
+ "type": "objective-id",
1277
+ "target-id": item.get("requirement_id", "unknown").lower(),
1278
+ "status": {
1279
+ "state": status,
1280
+ },
1281
+ },
1282
+ "related-observations": [
1283
+ {"observation-uuid": obs_uuid},
1284
+ ],
1285
+ })
1286
+
1287
+ # Process SbD assessments
1288
+ for item in all_findings.get("sbd", []):
1289
+ obs_uuid = _generate_uuid()
1290
+ finding_uuid = _generate_uuid()
1291
+ total_finding_count += 1
1292
+
1293
+ status = _assessment_status_to_oscal(item.get("status", "not_assessed"))
1294
+
1295
+ observations.append({
1296
+ "uuid": obs_uuid,
1297
+ "title": f"SbD: {item.get('requirement_id', 'Unknown')}",
1298
+ "description": item.get("evidence_description", "No evidence description."),
1299
+ "methods": ["EXAMINE", "TEST"],
1300
+ "collected": item.get("assessment_date", now),
1301
+ "props": [
1302
+ {
1303
+ "name": "framework",
1304
+ "ns": OSCAL_NS,
1305
+ "value": "CISA-SbD",
1306
+ },
1307
+ {
1308
+ "name": "domain",
1309
+ "ns": OSCAL_NS,
1310
+ "value": item.get("domain", ""),
1311
+ },
1312
+ ],
1313
+ })
1314
+
1315
+ findings.append({
1316
+ "uuid": finding_uuid,
1317
+ "title": f"SbD Finding: {item.get('requirement_id', '')}",
1318
+ "description": (
1319
+ f"CISA Secure by Design assessment for requirement "
1320
+ f"{item.get('requirement_id', '')} "
1321
+ f"(domain: {item.get('domain', '')})."
1322
+ ),
1323
+ "target": {
1324
+ "type": "objective-id",
1325
+ "target-id": item.get("requirement_id", "unknown").lower(),
1326
+ "status": {
1327
+ "state": status,
1328
+ },
1329
+ },
1330
+ "related-observations": [
1331
+ {"observation-uuid": obs_uuid},
1332
+ ],
1333
+ })
1334
+
1335
+ # Assemble assessment results document
1336
+ ar_doc = {
1337
+ "assessment-results": {
1338
+ "uuid": ar_uuid,
1339
+ "metadata": _build_metadata(
1340
+ project,
1341
+ "Assessment Results",
1342
+ extra_roles=[
1343
+ {
1344
+ "id": "assessor",
1345
+ "title": "Security Assessor",
1346
+ },
1347
+ ],
1348
+ ),
1349
+ "import-ap": {
1350
+ "href": "#assessment-plan-placeholder",
1351
+ "remarks": (
1352
+ "Assessment plan reference. Replace with actual "
1353
+ "assessment plan OSCAL artifact URI."
1354
+ ),
1355
+ },
1356
+ "results": [
1357
+ {
1358
+ "uuid": result_uuid,
1359
+ "title": f"Assessment Results -- {project.get('name', '')}",
1360
+ "description": (
1361
+ f"Consolidated assessment results across "
1362
+ f"FedRAMP, CMMC, DISA STIG, CSSP, and SbD "
1363
+ f"frameworks for project {project_id}."
1364
+ ),
1365
+ "start": now,
1366
+ "observations": observations,
1367
+ "findings": findings,
1368
+ "props": [
1369
+ {
1370
+ "name": "total-findings",
1371
+ "ns": OSCAL_NS,
1372
+ "value": str(total_finding_count),
1373
+ },
1374
+ {
1375
+ "name": "fedramp-findings",
1376
+ "ns": OSCAL_NS,
1377
+ "value": str(len(all_findings.get("fedramp", []))),
1378
+ },
1379
+ {
1380
+ "name": "cmmc-findings",
1381
+ "ns": OSCAL_NS,
1382
+ "value": str(len(all_findings.get("cmmc", []))),
1383
+ },
1384
+ {
1385
+ "name": "stig-findings",
1386
+ "ns": OSCAL_NS,
1387
+ "value": str(len(all_findings.get("stig", []))),
1388
+ },
1389
+ {
1390
+ "name": "cssp-findings",
1391
+ "ns": OSCAL_NS,
1392
+ "value": str(len(all_findings.get("cssp", []))),
1393
+ },
1394
+ {
1395
+ "name": "sbd-findings",
1396
+ "ns": OSCAL_NS,
1397
+ "value": str(len(all_findings.get("sbd", []))),
1398
+ },
1399
+ ],
1400
+ },
1401
+ ],
1402
+ "back-matter": {
1403
+ "resources": [],
1404
+ },
1405
+ },
1406
+ }
1407
+
1408
+ # Write
1409
+ out_dir = _resolve_output_dir(project, project_id, output_dir)
1410
+ out_file = out_dir / "assessment-results.oscal.json"
1411
+
1412
+ with open(out_file, "w", encoding="utf-8") as f:
1413
+ json.dump(ar_doc, f, indent=2, ensure_ascii=False)
1414
+
1415
+ file_hash = _compute_file_hash(out_file)
1416
+
1417
+ # Validate
1418
+ validation = validate_oscal(str(out_file), "assessment_results")
1419
+ schema_valid = validation["valid"]
1420
+
1421
+ # Store record
1422
+ _store_oscal_artifact(
1423
+ conn, project_id, "assessment_results", str(out_file),
1424
+ file_hash, schema_valid, validation.get("errors")
1425
+ )
1426
+
1427
+ # Audit
1428
+ _log_audit(conn, project_id, "OSCAL Assessment Results generated", {
1429
+ "artifact_type": "assessment_results",
1430
+ "oscal_version": OSCAL_VERSION,
1431
+ "uuid": ar_uuid,
1432
+ "total_findings": total_finding_count,
1433
+ "frameworks": {
1434
+ k: len(v) for k, v in all_findings.items()
1435
+ },
1436
+ "file_hash": file_hash,
1437
+ "schema_valid": schema_valid,
1438
+ "affected_files": [str(out_file)],
1439
+ })
1440
+
1441
+ print("OSCAL Assessment Results generated:")
1442
+ print(f" File: {out_file}")
1443
+ print(f" UUID: {ar_uuid}")
1444
+ print(f" Total findings: {total_finding_count}")
1445
+ for fw, items in all_findings.items():
1446
+ if items:
1447
+ print(f" {fw}: {len(items)}")
1448
+ print(f" Valid: {schema_valid}")
1449
+
1450
+ return {
1451
+ "file_path": str(out_file),
1452
+ "uuid": ar_uuid,
1453
+ "total_findings": total_finding_count,
1454
+ "frameworks": {k: len(v) for k, v in all_findings.items()},
1455
+ "file_hash": file_hash,
1456
+ "validation": validation,
1457
+ }
1458
+
1459
+ finally:
1460
+ conn.close()
1461
+
1462
+
1463
+ def _assessment_status_to_oscal(status):
1464
+ """Map assessment status to OSCAL finding status state."""
1465
+ mapping = {
1466
+ "satisfied": "satisfied",
1467
+ "not_satisfied": "not-satisfied",
1468
+ "other_than_satisfied": "not-satisfied",
1469
+ "partially_satisfied": "not-satisfied",
1470
+ "not_assessed": "not-satisfied",
1471
+ "not_applicable": "satisfied",
1472
+ "risk_accepted": "satisfied",
1473
+ }
1474
+ return mapping.get(status, "not-satisfied")
1475
+
1476
+
1477
+ def _cmmc_status_to_oscal(status):
1478
+ """Map CMMC assessment status to OSCAL finding status state."""
1479
+ mapping = {
1480
+ "met": "satisfied",
1481
+ "not_met": "not-satisfied",
1482
+ "partially_met": "not-satisfied",
1483
+ "not_assessed": "not-satisfied",
1484
+ "not_applicable": "satisfied",
1485
+ }
1486
+ return mapping.get(status, "not-satisfied")
1487
+
1488
+
1489
+ def _stig_status_to_oscal(status):
1490
+ """Map STIG finding status to OSCAL finding status state."""
1491
+ mapping = {
1492
+ "Open": "not-satisfied",
1493
+ "NotAFinding": "satisfied",
1494
+ "Not_Applicable": "satisfied",
1495
+ "Not_Reviewed": "not-satisfied",
1496
+ }
1497
+ return mapping.get(status, "not-satisfied")
1498
+
1499
+
1500
+ def generate_oscal_component_definition(project_id, output_dir=None, db_path=None):
1501
+ """Generate an OSCAL Component Definition JSON artifact.
1502
+
1503
+ Creates a reusable component definition with control-implementations
1504
+ pulled from project_controls and SBOM data.
1505
+
1506
+ Args:
1507
+ project_id: The project identifier.
1508
+ output_dir: Override output directory.
1509
+ db_path: Override database path.
1510
+
1511
+ Returns:
1512
+ Dict with file_path, uuid, components_count, and validation result.
1513
+ """
1514
+ conn = _get_connection(db_path)
1515
+ try:
1516
+ project = _get_project(conn, project_id)
1517
+ controls = _get_controls(conn, project_id)
1518
+ sbom_records = _get_sbom_records(conn, project_id)
1519
+ baseline = _determine_baseline(project)
1520
+
1521
+ cd_uuid = _generate_uuid()
1522
+
1523
+ # Build components list
1524
+ components = []
1525
+
1526
+ # Primary application component
1527
+ app_component_uuid = _generate_uuid()
1528
+ app_component = {
1529
+ "uuid": app_component_uuid,
1530
+ "type": "software",
1531
+ "title": project.get("name", "Application"),
1532
+ "description": project.get("description", "Primary application component."),
1533
+ "props": [
1534
+ {
1535
+ "name": "type",
1536
+ "ns": OSCAL_NS,
1537
+ "value": project.get("type", "webapp"),
1538
+ },
1539
+ {
1540
+ "name": "classification",
1541
+ "ns": OSCAL_NS,
1542
+ "value": project.get("classification", "CUI"),
1543
+ },
1544
+ {
1545
+ "name": "impact-level",
1546
+ "ns": OSCAL_NS,
1547
+ "value": project.get("impact_level", "IL5"),
1548
+ },
1549
+ ],
1550
+ "control-implementations": [],
1551
+ }
1552
+
1553
+ # Build control implementation for this component
1554
+ if controls:
1555
+ profile_href = FEDRAMP_PROFILE_URIS.get(
1556
+ baseline, FEDRAMP_PROFILE_URIS["moderate"]
1557
+ )
1558
+ impl_reqs = []
1559
+ for ctrl in controls:
1560
+ oscal_cid = _control_id_to_oscal(ctrl["control_id"])
1561
+ if not oscal_cid:
1562
+ continue
1563
+
1564
+ description = ctrl.get("implementation_description") or (
1565
+ f"Control {oscal_cid} implementation: "
1566
+ f"{ctrl.get('implementation_status', 'planned')}."
1567
+ )
1568
+
1569
+ impl_reqs.append({
1570
+ "uuid": _generate_uuid(),
1571
+ "control-id": oscal_cid,
1572
+ "description": description,
1573
+ "props": [
1574
+ {
1575
+ "name": "implementation-status",
1576
+ "ns": OSCAL_NS,
1577
+ "value": ctrl.get("implementation_status", "planned"),
1578
+ },
1579
+ ],
1580
+ })
1581
+
1582
+ app_component["control-implementations"].append({
1583
+ "uuid": _generate_uuid(),
1584
+ "source": profile_href,
1585
+ "description": (
1586
+ f"Control implementations for "
1587
+ f"{project.get('name', 'application')} aligned to "
1588
+ f"FedRAMP {baseline.capitalize()} baseline."
1589
+ ),
1590
+ "implemented-requirements": impl_reqs,
1591
+ })
1592
+
1593
+ components.append(app_component)
1594
+
1595
+ # Add tech stack components
1596
+ for stack_key, stack_type in [
1597
+ ("tech_stack_backend", "Backend Framework"),
1598
+ ("tech_stack_frontend", "Frontend Framework"),
1599
+ ("tech_stack_database", "Database"),
1600
+ ]:
1601
+ value = project.get(stack_key)
1602
+ if value:
1603
+ components.append({
1604
+ "uuid": _generate_uuid(),
1605
+ "type": "software",
1606
+ "title": f"{stack_type}: {value}",
1607
+ "description": f"{stack_type} component: {value}",
1608
+ "props": [
1609
+ {
1610
+ "name": "stack-layer",
1611
+ "ns": OSCAL_NS,
1612
+ "value": stack_key.replace("tech_stack_", ""),
1613
+ },
1614
+ ],
1615
+ })
1616
+
1617
+ # Add SBOM-derived components
1618
+ for sbom in sbom_records:
1619
+ components.append({
1620
+ "uuid": _generate_uuid(),
1621
+ "type": "software",
1622
+ "title": f"SBOM: {sbom.get('format', 'cyclonedx')} v{sbom.get('version', '1.0')}",
1623
+ "description": (
1624
+ f"Software Bill of Materials ({sbom.get('format', 'CycloneDX')}) "
1625
+ f"with {sbom.get('component_count', 0)} components, "
1626
+ f"{sbom.get('vulnerability_count', 0)} known vulnerabilities."
1627
+ ),
1628
+ "props": [
1629
+ {
1630
+ "name": "sbom-format",
1631
+ "ns": OSCAL_NS,
1632
+ "value": sbom.get("format", "cyclonedx"),
1633
+ },
1634
+ {
1635
+ "name": "component-count",
1636
+ "ns": OSCAL_NS,
1637
+ "value": str(sbom.get("component_count", 0)),
1638
+ },
1639
+ {
1640
+ "name": "vulnerability-count",
1641
+ "ns": OSCAL_NS,
1642
+ "value": str(sbom.get("vulnerability_count", 0)),
1643
+ },
1644
+ ],
1645
+ })
1646
+
1647
+ # Assemble component definition document
1648
+ cd_doc = {
1649
+ "component-definition": {
1650
+ "uuid": cd_uuid,
1651
+ "metadata": _build_metadata(
1652
+ project, "Component Definition"
1653
+ ),
1654
+ "components": components,
1655
+ "back-matter": {
1656
+ "resources": [],
1657
+ },
1658
+ },
1659
+ }
1660
+
1661
+ # Write
1662
+ out_dir = _resolve_output_dir(project, project_id, output_dir)
1663
+ out_file = out_dir / "component-definition.oscal.json"
1664
+
1665
+ with open(out_file, "w", encoding="utf-8") as f:
1666
+ json.dump(cd_doc, f, indent=2, ensure_ascii=False)
1667
+
1668
+ file_hash = _compute_file_hash(out_file)
1669
+
1670
+ # Validate
1671
+ validation = validate_oscal(str(out_file), "component_definition")
1672
+ schema_valid = validation["valid"]
1673
+
1674
+ # Store record
1675
+ _store_oscal_artifact(
1676
+ conn, project_id, "component_definition", str(out_file),
1677
+ file_hash, schema_valid, validation.get("errors")
1678
+ )
1679
+
1680
+ # Audit
1681
+ _log_audit(conn, project_id, "OSCAL Component Definition generated", {
1682
+ "artifact_type": "component_definition",
1683
+ "oscal_version": OSCAL_VERSION,
1684
+ "uuid": cd_uuid,
1685
+ "components_count": len(components),
1686
+ "controls_count": len(controls),
1687
+ "sbom_records": len(sbom_records),
1688
+ "file_hash": file_hash,
1689
+ "schema_valid": schema_valid,
1690
+ "affected_files": [str(out_file)],
1691
+ })
1692
+
1693
+ print("OSCAL Component Definition generated:")
1694
+ print(f" File: {out_file}")
1695
+ print(f" UUID: {cd_uuid}")
1696
+ print(f" Components: {len(components)}")
1697
+ print(f" Controls: {len(controls)}")
1698
+ print(f" Valid: {schema_valid}")
1699
+
1700
+ return {
1701
+ "file_path": str(out_file),
1702
+ "uuid": cd_uuid,
1703
+ "components_count": len(components),
1704
+ "controls_count": len(controls),
1705
+ "file_hash": file_hash,
1706
+ "validation": validation,
1707
+ }
1708
+
1709
+ finally:
1710
+ conn.close()
1711
+
1712
+
1713
+ # ---------------------------------------------------------------------------
1714
+ # Validation
1715
+ # ---------------------------------------------------------------------------
1716
+
1717
+ def validate_oscal(file_path, artifact_type=None):
1718
+ """Validate an OSCAL JSON file for structural correctness.
1719
+
1720
+ Checks:
1721
+ - Valid JSON
1722
+ - Required top-level keys per artifact type
1723
+ - UUID format (RFC 4122 lowercase)
1724
+ - ISO 8601 timestamp format
1725
+ - Control ID format (lowercase with hyphens)
1726
+
1727
+ Args:
1728
+ file_path: Path to the OSCAL JSON file.
1729
+ artifact_type: One of ssp, poam, assessment_results,
1730
+ component_definition. If None, auto-detects.
1731
+
1732
+ Returns:
1733
+ Dict with valid (bool) and errors (list of strings).
1734
+ """
1735
+ errors = []
1736
+ path = Path(file_path)
1737
+
1738
+ # Check file exists
1739
+ if not path.exists():
1740
+ return {"valid": False, "errors": [f"File not found: {file_path}"]}
1741
+
1742
+ # Parse JSON
1743
+ try:
1744
+ with open(path, "r", encoding="utf-8") as f:
1745
+ data = json.load(f)
1746
+ except json.JSONDecodeError as e:
1747
+ return {"valid": False, "errors": [f"Invalid JSON: {e}"]}
1748
+
1749
+ if not isinstance(data, dict):
1750
+ return {"valid": False, "errors": ["Root must be a JSON object."]}
1751
+
1752
+ # Determine artifact type from top-level key
1753
+ top_level_keys = {
1754
+ "ssp": "system-security-plan",
1755
+ "poam": "plan-of-action-and-milestones",
1756
+ "assessment_results": "assessment-results",
1757
+ "component_definition": "component-definition",
1758
+ }
1759
+
1760
+ if artifact_type is None:
1761
+ # Auto-detect
1762
+ for at, key in top_level_keys.items():
1763
+ if key in data:
1764
+ artifact_type = at
1765
+ break
1766
+ if artifact_type is None:
1767
+ return {
1768
+ "valid": False,
1769
+ "errors": [
1770
+ f"No recognized OSCAL top-level key found. "
1771
+ f"Expected one of: {list(top_level_keys.values())}"
1772
+ ],
1773
+ }
1774
+
1775
+ expected_key = top_level_keys.get(artifact_type)
1776
+ if expected_key and expected_key not in data:
1777
+ errors.append(
1778
+ f"Missing required top-level key: '{expected_key}'"
1779
+ )
1780
+
1781
+ if expected_key and expected_key in data:
1782
+ doc = data[expected_key]
1783
+
1784
+ # Check UUID at document level
1785
+ if "uuid" in doc:
1786
+ if not UUID_PATTERN.match(str(doc["uuid"])):
1787
+ errors.append(
1788
+ f"Document UUID format invalid: '{doc['uuid']}'. "
1789
+ f"Expected RFC 4122 lowercase UUID."
1790
+ )
1791
+
1792
+ # Check metadata
1793
+ metadata = doc.get("metadata", {})
1794
+ if not metadata:
1795
+ errors.append("Missing 'metadata' block.")
1796
+ else:
1797
+ # Check last-modified timestamp
1798
+ last_mod = metadata.get("last-modified", "")
1799
+ if last_mod and not ISO_TIMESTAMP_PATTERN.match(last_mod):
1800
+ errors.append(
1801
+ f"Metadata 'last-modified' timestamp format invalid: "
1802
+ f"'{last_mod}'. Expected ISO 8601 with Z suffix."
1803
+ )
1804
+
1805
+ # Check oscal-version
1806
+ oscal_ver = metadata.get("oscal-version", "")
1807
+ if oscal_ver and oscal_ver != OSCAL_VERSION:
1808
+ errors.append(
1809
+ f"OSCAL version mismatch: '{oscal_ver}' "
1810
+ f"(expected '{OSCAL_VERSION}')."
1811
+ )
1812
+
1813
+ # Check required metadata fields
1814
+ for field in ["title", "last-modified", "version", "oscal-version"]:
1815
+ if field not in metadata:
1816
+ errors.append(f"Missing metadata field: '{field}'.")
1817
+
1818
+ # Artifact-specific validation
1819
+ if artifact_type == "ssp":
1820
+ _validate_ssp(doc, errors)
1821
+ elif artifact_type == "poam":
1822
+ _validate_poam(doc, errors)
1823
+ elif artifact_type == "assessment_results":
1824
+ _validate_assessment_results(doc, errors)
1825
+ elif artifact_type == "component_definition":
1826
+ _validate_component_definition(doc, errors)
1827
+
1828
+ # Walk entire document for UUID and control-id validation
1829
+ _validate_uuids_recursive(data, errors, max_errors=20)
1830
+ _validate_control_ids_recursive(data, errors, max_errors=20)
1831
+
1832
+ return {
1833
+ "valid": len(errors) == 0,
1834
+ "errors": errors,
1835
+ }
1836
+
1837
+
1838
+ def _validate_ssp(doc, errors):
1839
+ """Validate SSP-specific structure."""
1840
+ if "import-profile" not in doc:
1841
+ errors.append("SSP missing 'import-profile' block.")
1842
+ elif "href" not in doc.get("import-profile", {}):
1843
+ errors.append("SSP 'import-profile' missing 'href'.")
1844
+
1845
+ if "system-characteristics" not in doc:
1846
+ errors.append("SSP missing 'system-characteristics' block.")
1847
+ else:
1848
+ sc = doc["system-characteristics"]
1849
+ for field in [
1850
+ "system-name", "description", "security-sensitivity-level",
1851
+ "security-impact-level", "status", "authorization-boundary",
1852
+ ]:
1853
+ if field not in sc:
1854
+ errors.append(
1855
+ f"SSP 'system-characteristics' missing '{field}'."
1856
+ )
1857
+
1858
+ if "system-implementation" not in doc:
1859
+ errors.append("SSP missing 'system-implementation' block.")
1860
+
1861
+ if "control-implementation" not in doc:
1862
+ errors.append("SSP missing 'control-implementation' block.")
1863
+ else:
1864
+ ci = doc["control-implementation"]
1865
+ if "implemented-requirements" not in ci:
1866
+ errors.append(
1867
+ "SSP 'control-implementation' missing "
1868
+ "'implemented-requirements'."
1869
+ )
1870
+
1871
+
1872
+ def _validate_poam(doc, errors):
1873
+ """Validate POA&M-specific structure."""
1874
+ if "poam-items" not in doc:
1875
+ errors.append("POA&M missing 'poam-items' array.")
1876
+ elif not isinstance(doc["poam-items"], list):
1877
+ errors.append("POA&M 'poam-items' must be an array.")
1878
+
1879
+
1880
+ def _validate_assessment_results(doc, errors):
1881
+ """Validate Assessment Results-specific structure."""
1882
+ if "results" not in doc:
1883
+ errors.append("Assessment Results missing 'results' array.")
1884
+ elif not isinstance(doc["results"], list):
1885
+ errors.append("Assessment Results 'results' must be an array.")
1886
+ elif len(doc["results"]) == 0:
1887
+ errors.append("Assessment Results 'results' array is empty.")
1888
+
1889
+
1890
+ def _validate_component_definition(doc, errors):
1891
+ """Validate Component Definition-specific structure."""
1892
+ if "components" not in doc:
1893
+ errors.append("Component Definition missing 'components' array.")
1894
+ elif not isinstance(doc["components"], list):
1895
+ errors.append("Component Definition 'components' must be an array.")
1896
+ elif len(doc["components"]) == 0:
1897
+ errors.append("Component Definition 'components' array is empty.")
1898
+
1899
+
1900
+ def _validate_uuids_recursive(obj, errors, path="", max_errors=20):
1901
+ """Recursively validate UUID fields in the document."""
1902
+ if len(errors) >= max_errors:
1903
+ return
1904
+
1905
+ if isinstance(obj, dict):
1906
+ for key, value in obj.items():
1907
+ current_path = f"{path}.{key}" if path else key
1908
+ if key == "uuid" and isinstance(value, str):
1909
+ if not UUID_PATTERN.match(value):
1910
+ errors.append(
1911
+ f"Invalid UUID at '{current_path}': '{value}'."
1912
+ )
1913
+ if len(errors) >= max_errors:
1914
+ return
1915
+ elif key.endswith("-uuid") and isinstance(value, str):
1916
+ if not UUID_PATTERN.match(value):
1917
+ errors.append(
1918
+ f"Invalid UUID reference at '{current_path}': "
1919
+ f"'{value}'."
1920
+ )
1921
+ if len(errors) >= max_errors:
1922
+ return
1923
+ else:
1924
+ _validate_uuids_recursive(
1925
+ value, errors, current_path, max_errors
1926
+ )
1927
+ elif isinstance(obj, list):
1928
+ for i, item in enumerate(obj):
1929
+ _validate_uuids_recursive(
1930
+ item, errors, f"{path}[{i}]", max_errors
1931
+ )
1932
+
1933
+
1934
+ def _validate_control_ids_recursive(obj, errors, path="", max_errors=20):
1935
+ """Recursively validate control-id fields use OSCAL lowercase format."""
1936
+ if len(errors) >= max_errors:
1937
+ return
1938
+
1939
+ if isinstance(obj, dict):
1940
+ for key, value in obj.items():
1941
+ current_path = f"{path}.{key}" if path else key
1942
+ if key == "control-id" and isinstance(value, str):
1943
+ if value != value.lower():
1944
+ errors.append(
1945
+ f"Control ID not lowercase at '{current_path}': "
1946
+ f"'{value}'. OSCAL requires lowercase."
1947
+ )
1948
+ if len(errors) >= max_errors:
1949
+ return
1950
+ else:
1951
+ _validate_control_ids_recursive(
1952
+ value, errors, current_path, max_errors
1953
+ )
1954
+ elif isinstance(obj, list):
1955
+ for i, item in enumerate(obj):
1956
+ _validate_control_ids_recursive(
1957
+ item, errors, f"{path}[{i}]", max_errors
1958
+ )
1959
+
1960
+
1961
+ # ---------------------------------------------------------------------------
1962
+ # Aggregate generation
1963
+ # ---------------------------------------------------------------------------
1964
+
1965
+ def generate_all_oscal(project_id, output_dir=None, db_path=None):
1966
+ """Generate all four OSCAL artifact types for a project.
1967
+
1968
+ Generates SSP, POA&M, Assessment Results, and Component Definition
1969
+ in sequence. Returns a summary dict.
1970
+
1971
+ Args:
1972
+ project_id: The project identifier.
1973
+ output_dir: Override output directory.
1974
+ db_path: Override database path.
1975
+
1976
+ Returns:
1977
+ Dict with results for each artifact type and overall summary.
1978
+ """
1979
+ results = {}
1980
+ artifact_types = [
1981
+ ("ssp", generate_oscal_ssp),
1982
+ ("poam", generate_oscal_poam),
1983
+ ("assessment_results", generate_oscal_assessment_results),
1984
+ ("component_definition", generate_oscal_component_definition),
1985
+ ]
1986
+
1987
+ success_count = 0
1988
+ failure_count = 0
1989
+
1990
+ for artifact_name, generator_fn in artifact_types:
1991
+ try:
1992
+ result = generator_fn(
1993
+ project_id, output_dir=output_dir, db_path=db_path
1994
+ )
1995
+ results[artifact_name] = {
1996
+ "status": "success",
1997
+ "result": result,
1998
+ }
1999
+ success_count += 1
2000
+ except Exception as e:
2001
+ results[artifact_name] = {
2002
+ "status": "error",
2003
+ "error": str(e),
2004
+ }
2005
+ failure_count += 1
2006
+ print(
2007
+ f"Error generating OSCAL {artifact_name}: {e}",
2008
+ file=sys.stderr,
2009
+ )
2010
+
2011
+ summary = {
2012
+ "project_id": project_id,
2013
+ "oscal_version": OSCAL_VERSION,
2014
+ "artifacts_generated": success_count,
2015
+ "artifacts_failed": failure_count,
2016
+ "total": len(artifact_types),
2017
+ "results": results,
2018
+ }
2019
+
2020
+ print("\nOSCAL generation summary:")
2021
+ print(f" Project: {project_id}")
2022
+ print(f" OSCAL Version: {OSCAL_VERSION}")
2023
+ print(f" Generated: {success_count}/{len(artifact_types)}")
2024
+ if failure_count > 0:
2025
+ print(f" Failed: {failure_count}")
2026
+ for name, res in results.items():
2027
+ if res["status"] == "error":
2028
+ print(f" {name}: {res['error']}")
2029
+
2030
+ return summary
2031
+
2032
+
2033
+ # ---------------------------------------------------------------------------
2034
+ # CLI entrypoint
2035
+ # ---------------------------------------------------------------------------
2036
+
2037
+ def main():
2038
+ parser = argparse.ArgumentParser(
2039
+ description=(
2040
+ "NIST OSCAL 1.1.2 Artifact Generator -- "
2041
+ "Generate SSP, POA&M, Assessment Results, and "
2042
+ "Component Definition in OSCAL JSON format."
2043
+ ),
2044
+ )
2045
+ parser.add_argument(
2046
+ "--project-id",
2047
+ required=False,
2048
+ help="Project ID (required for generation)",
2049
+ )
2050
+ parser.add_argument(
2051
+ "--artifact",
2052
+ choices=[
2053
+ "ssp", "poam", "assessment_results",
2054
+ "component_definition", "all",
2055
+ ],
2056
+ default="all",
2057
+ help="Artifact type to generate (default: all)",
2058
+ )
2059
+ parser.add_argument(
2060
+ "--output-dir",
2061
+ help="Output directory for OSCAL artifacts",
2062
+ )
2063
+ parser.add_argument(
2064
+ "--format",
2065
+ choices=["json"],
2066
+ default="json",
2067
+ help="Output format (JSON; XML/YAML available with oscal-cli via oscal_tools.py --convert)",
2068
+ )
2069
+ parser.add_argument(
2070
+ "--validate",
2071
+ help="Validate an existing OSCAL JSON file (no project-id required)",
2072
+ )
2073
+ parser.add_argument(
2074
+ "--deep-validate",
2075
+ help="Deep validate an OSCAL file (structural + pydantic + Metaschema via oscal_tools.py)",
2076
+ )
2077
+ parser.add_argument(
2078
+ "--catalog-source",
2079
+ choices=["official", "icdev", "auto"],
2080
+ default="auto",
2081
+ help="Catalog source: official (NIST OSCAL), icdev (custom 39-control), auto (try official first)",
2082
+ )
2083
+ parser.add_argument(
2084
+ "--json",
2085
+ action="store_true",
2086
+ help="Output results as JSON",
2087
+ )
2088
+ parser.add_argument(
2089
+ "--db-path",
2090
+ type=Path,
2091
+ help="Override database path",
2092
+ )
2093
+
2094
+ args = parser.parse_args()
2095
+
2096
+ # Validation-only mode (structural)
2097
+ if args.validate:
2098
+ result = validate_oscal(args.validate)
2099
+ if args.json:
2100
+ print(json.dumps(result, indent=2))
2101
+ else:
2102
+ if result["valid"]:
2103
+ print(f"VALID: {args.validate}")
2104
+ else:
2105
+ print(f"INVALID: {args.validate}")
2106
+ for err in result["errors"]:
2107
+ print(f" - {err}")
2108
+ sys.exit(0 if result["valid"] else 1)
2109
+
2110
+ # Deep validation mode (structural + pydantic + Metaschema, D302-D305)
2111
+ if args.deep_validate:
2112
+ try:
2113
+ from icdev.tools.compliance.oscal_tools import validate_oscal_deep
2114
+ result = validate_oscal_deep(
2115
+ args.deep_validate,
2116
+ project_id=args.project_id,
2117
+ db_path=str(args.db_path) if args.db_path else None,
2118
+ )
2119
+ except ImportError:
2120
+ result = validate_oscal(args.deep_validate)
2121
+ result["note"] = "oscal_tools not available; ran structural validation only"
2122
+ if args.json:
2123
+ print(json.dumps(result, indent=2, default=str))
2124
+ else:
2125
+ valid = result.get("overall_valid", result.get("valid", False))
2126
+ print(f"{'VALID' if valid else 'INVALID'}: {args.deep_validate}")
2127
+ for layer_name, layer_result in result.get("layers", {}).items():
2128
+ status = "PASS" if layer_result.get("valid") else ("SKIP" if layer_result.get("skipped") else "FAIL")
2129
+ print(f" [{status}] {layer_name}")
2130
+ sys.exit(0 if result.get("overall_valid", result.get("valid", False)) else 1)
2131
+
2132
+ # Generation mode requires project-id
2133
+ if not args.project_id:
2134
+ parser.error("--project-id is required for artifact generation")
2135
+
2136
+ # Dispatch to generator
2137
+ generators = {
2138
+ "ssp": generate_oscal_ssp,
2139
+ "poam": generate_oscal_poam,
2140
+ "assessment_results": generate_oscal_assessment_results,
2141
+ "component_definition": generate_oscal_component_definition,
2142
+ "all": generate_all_oscal,
2143
+ }
2144
+
2145
+ generator_fn = generators[args.artifact]
2146
+
2147
+ try:
2148
+ result = generator_fn(
2149
+ project_id=args.project_id,
2150
+ output_dir=args.output_dir,
2151
+ db_path=args.db_path,
2152
+ )
2153
+
2154
+ if args.json:
2155
+ print(json.dumps(result, indent=2, default=str))
2156
+
2157
+ except (FileNotFoundError, ValueError) as e:
2158
+ print(f"ERROR: {e}", file=sys.stderr)
2159
+ sys.exit(1)
2160
+ except Exception as e:
2161
+ print(f"ERROR: Unexpected error: {e}", file=sys.stderr)
2162
+ sys.exit(1)
2163
+
2164
+
2165
+ if __name__ == "__main__":
2166
+ main()
2167
+
2168
+ ####################################################################
2169
+ # CUI // SP-CTI | Department of Defense
2170
+ ####################################################################