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,1491 @@
1
+ #!/usr/bin/env python3
2
+ # CUI // SP-CTI
3
+ # Controlled by: Department of Defense
4
+ # CUI Category: CTI
5
+ # Distribution: D
6
+ # POC: ICDEV System Administrator
7
+ """CMMC Level 2/3 assessment engine for ICDEV.
8
+
9
+ Loads CMMC practices from cmmc_practices.json, performs automated domain checks,
10
+ inherits NIST 800-53/800-171 implementations via the crosswalk engine, stores
11
+ results in the cmmc_assessments table, computes per-domain and overall scores,
12
+ evaluates CMMC gates, and logs audit events.
13
+
14
+ Usage:
15
+ python tools/compliance/cmmc_assessor.py --project-id proj-123 --level 2
16
+ python tools/compliance/cmmc_assessor.py --project-id proj-123 --level 3 \\
17
+ --project-dir /path/to/project --gate
18
+ python tools/compliance/cmmc_assessor.py --project-id proj-123 --level 2 \\
19
+ --domain AC --json
20
+
21
+ Databases:
22
+ - data/icdev.db: cmmc_assessments, project_controls, audit_trail
23
+
24
+ See also:
25
+ - tools/compliance/crosswalk_engine.py (inherit NIST implementations)
26
+ - tools/compliance/classification_manager.py (CUI markings)
27
+ - tools/compliance/cmmc_report_generator.py (report generation)
28
+ """
29
+
30
+ import argparse
31
+ import json
32
+ import os
33
+ import re
34
+ import sqlite3
35
+ import sys
36
+ from datetime import datetime, timezone
37
+ from pathlib import Path
38
+ from icdev._paths import get_project_root
39
+
40
+ BASE_DIR = get_project_root()
41
+ DB_PATH = BASE_DIR / "data" / "icdev.db"
42
+ CMMC_PRACTICES_PATH = BASE_DIR / "context" / "compliance" / "cmmc_practices.json"
43
+
44
+ # CMMC domain codes and names
45
+ CMMC_DOMAINS = [
46
+ ("AC", "Access Control"),
47
+ ("AT", "Awareness & Training"),
48
+ ("AU", "Audit & Accountability"),
49
+ ("CM", "Configuration Management"),
50
+ ("IA", "Identification & Authentication"),
51
+ ("IR", "Incident Response"),
52
+ ("MA", "Maintenance"),
53
+ ("MP", "Media Protection"),
54
+ ("PE", "Physical Protection"),
55
+ ("PS", "Personnel Security"),
56
+ ("RA", "Risk Assessment"),
57
+ ("CA", "Security Assessment"),
58
+ ("SC", "System & Communications Protection"),
59
+ ("SI", "System & Information Integrity"),
60
+ ]
61
+
62
+ DOMAIN_CODE_TO_NAME = {code: name for code, name in CMMC_DOMAINS}
63
+ DOMAIN_NAME_TO_CODE = {name: code for code, name in CMMC_DOMAINS}
64
+
65
+
66
+ # -----------------------------------------------------------------
67
+ # Database helpers
68
+ # -----------------------------------------------------------------
69
+
70
+ def _get_connection(db_path=None):
71
+ """Get a database connection with Row factory."""
72
+ path = db_path or DB_PATH
73
+ if not path.exists():
74
+ raise FileNotFoundError(
75
+ f"Database not found: {path}\n"
76
+ "Run: python tools/db/init_icdev_db.py"
77
+ )
78
+ conn = sqlite3.connect(str(path))
79
+ conn.row_factory = sqlite3.Row
80
+ return conn
81
+
82
+
83
+ def _get_project(conn, project_id):
84
+ """Load project data from the projects table."""
85
+ row = conn.execute(
86
+ "SELECT * FROM projects WHERE id = ?", (project_id,)
87
+ ).fetchone()
88
+ if not row:
89
+ raise ValueError(f"Project '{project_id}' not found.")
90
+ return dict(row)
91
+
92
+
93
+ def _log_audit_event(conn, project_id, action, details, file_path=None):
94
+ """Log an audit trail event (append-only, NIST AU compliant)."""
95
+ try:
96
+ conn.execute(
97
+ """INSERT INTO audit_trail
98
+ (project_id, event_type, actor, action, details,
99
+ affected_files, classification)
100
+ VALUES (?, ?, ?, ?, ?, ?, ?)""",
101
+ (
102
+ project_id,
103
+ "cmmc_assessed",
104
+ "icdev-compliance-engine",
105
+ action,
106
+ json.dumps(details),
107
+ json.dumps([str(file_path)] if file_path else []),
108
+ "CUI",
109
+ ),
110
+ )
111
+ conn.commit()
112
+ except Exception as e:
113
+ print(f"Warning: Could not log audit event: {e}", file=sys.stderr)
114
+
115
+
116
+ # -----------------------------------------------------------------
117
+ # CUI config helper
118
+ # -----------------------------------------------------------------
119
+
120
+ def _load_cui_config():
121
+ """Load CUI marking configuration."""
122
+ try:
123
+ sys.path.insert(0, str(BASE_DIR / "tools" / "compliance"))
124
+ from cui_marker import load_cui_config
125
+ return load_cui_config()
126
+ except ImportError:
127
+ return {
128
+ "document_header": (
129
+ "////////////////////////////////////////////////////////////////////\n"
130
+ "CONTROLLED UNCLASSIFIED INFORMATION (CUI) // SP-CTI\n"
131
+ "Distribution: Distribution D -- Authorized DoD Personnel Only\n"
132
+ "////////////////////////////////////////////////////////////////////"
133
+ ),
134
+ "document_footer": (
135
+ "////////////////////////////////////////////////////////////////////\n"
136
+ "CUI // SP-CTI | Department of Defense\n"
137
+ "////////////////////////////////////////////////////////////////////"
138
+ ),
139
+ }
140
+
141
+
142
+ # -----------------------------------------------------------------
143
+ # CMMC catalog loader
144
+ # -----------------------------------------------------------------
145
+
146
+ def load_cmmc_practices(level=2):
147
+ """Load CMMC practice catalog for Level 2 or 3.
148
+
149
+ Args:
150
+ level: CMMC level (2 or 3).
151
+
152
+ Returns:
153
+ dict with metadata, domains, and filtered practices list.
154
+ """
155
+ if not CMMC_PRACTICES_PATH.exists():
156
+ print(
157
+ f"Warning: CMMC practices catalog not found: {CMMC_PRACTICES_PATH}",
158
+ file=sys.stderr,
159
+ )
160
+ return {"metadata": {}, "domains": [], "practices": []}
161
+
162
+ with open(CMMC_PRACTICES_PATH, "r", encoding="utf-8") as f:
163
+ data = json.load(f)
164
+
165
+ practices = data.get("practices", [])
166
+ # Level 2 includes only level-2 practices
167
+ # Level 3 includes level-2 AND level-3 practices
168
+ filtered = [p for p in practices if p.get("level", 2) <= level]
169
+
170
+ return {
171
+ "metadata": data.get("metadata", {}),
172
+ "domains": data.get("domains", []),
173
+ "practices": filtered,
174
+ }
175
+
176
+
177
+ # -----------------------------------------------------------------
178
+ # Crosswalk inheritance helper
179
+ # -----------------------------------------------------------------
180
+
181
+ def _inherit_nist_implementations(project_id, practices, db_path=None):
182
+ """Use the crosswalk engine to inherit NIST 800-53/800-171 implementations.
183
+
184
+ For each CMMC practice that maps to NIST 800-53 controls, checks if those
185
+ controls are already implemented in the project_controls table. If all
186
+ mapped controls are implemented, the practice is considered inherited.
187
+
188
+ Args:
189
+ project_id: The project identifier.
190
+ practices: List of CMMC practice dicts from the catalog.
191
+ db_path: Optional database path override.
192
+
193
+ Returns:
194
+ dict mapping practice_id -> {"inherited": bool, "controls_implemented": [...],
195
+ "controls_missing": [...]}
196
+ """
197
+ conn = _get_connection(db_path)
198
+ try:
199
+ rows = conn.execute(
200
+ """SELECT control_id, implementation_status
201
+ FROM project_controls
202
+ WHERE project_id = ?""",
203
+ (project_id,),
204
+ ).fetchall()
205
+
206
+ implemented_ids = set()
207
+ for row in rows:
208
+ if row["implementation_status"] in ("implemented", "partially_implemented"):
209
+ implemented_ids.add(row["control_id"].upper())
210
+
211
+ inheritance = {}
212
+ for practice in practices:
213
+ pid = practice["id"]
214
+ nist_controls = practice.get("nist_800_53_controls", [])
215
+
216
+ if not nist_controls:
217
+ inheritance[pid] = {
218
+ "inherited": False,
219
+ "controls_implemented": [],
220
+ "controls_missing": [],
221
+ }
222
+ continue
223
+
224
+ controls_impl = [c for c in nist_controls if c.upper() in implemented_ids]
225
+ controls_miss = [c for c in nist_controls if c.upper() not in implemented_ids]
226
+
227
+ inheritance[pid] = {
228
+ "inherited": len(controls_miss) == 0 and len(controls_impl) > 0,
229
+ "controls_implemented": controls_impl,
230
+ "controls_missing": controls_miss,
231
+ }
232
+
233
+ return inheritance
234
+ except Exception:
235
+ # If project_controls table doesn't exist or other error, return empty
236
+ return {}
237
+ finally:
238
+ conn.close()
239
+
240
+
241
+ # -----------------------------------------------------------------
242
+ # Auto-check helper: walk project files matching extensions
243
+ # -----------------------------------------------------------------
244
+
245
+ def _scan_files(project_dir, extensions, patterns, threshold=1):
246
+ """Scan project files for regex patterns.
247
+
248
+ Args:
249
+ project_dir: Root directory to walk.
250
+ extensions: Tuple of file extensions to include.
251
+ patterns: List of regex patterns to search for.
252
+ threshold: Minimum number of files with matches to consider satisfied.
253
+
254
+ Returns:
255
+ Tuple of (matched_files, total_scanned).
256
+ """
257
+ matched_files = []
258
+ total_scanned = 0
259
+ for root, _, files in os.walk(project_dir):
260
+ for fname in files:
261
+ if not fname.endswith(extensions):
262
+ continue
263
+ fpath = os.path.join(root, fname)
264
+ total_scanned += 1
265
+ try:
266
+ with open(fpath, "r", encoding="utf-8", errors="ignore") as f:
267
+ content = f.read()
268
+ for pattern in patterns:
269
+ if re.search(pattern, content, re.IGNORECASE):
270
+ matched_files.append(fpath)
271
+ break
272
+ except Exception:
273
+ continue
274
+ return matched_files, total_scanned
275
+
276
+
277
+ def _dir_or_file_exists(project_dir, dir_names=None, glob_patterns=None):
278
+ """Check if specific directories or file globs exist under project_dir."""
279
+ found = []
280
+ project_path = Path(project_dir)
281
+
282
+ if dir_names:
283
+ for dname in dir_names:
284
+ candidate = project_path / dname
285
+ if candidate.is_dir():
286
+ found.append(str(candidate))
287
+ for child in project_path.rglob(dname):
288
+ if child.is_dir() and str(child) not in found:
289
+ found.append(str(child))
290
+
291
+ if glob_patterns:
292
+ for gp in glob_patterns:
293
+ for match in project_path.rglob(gp):
294
+ if str(match) not in found:
295
+ found.append(str(match))
296
+
297
+ return found
298
+
299
+
300
+ # -----------------------------------------------------------------
301
+ # Auto-check functions (14 -- one per CMMC domain)
302
+ # Each returns:
303
+ # {"status": "met"|"not_met"|"partially_met"|"not_applicable",
304
+ # "evidence": "description",
305
+ # "details": "specifics"}
306
+ # -----------------------------------------------------------------
307
+
308
+ def _check_ac_domain(project_dir):
309
+ """Access Control: RBAC, least privilege, session mgmt, remote access, wireless."""
310
+ patterns = [
311
+ r"@login_required|@permission_required|@requires_auth",
312
+ r"@Secured|@PreAuthorize|@RolesAllowed",
313
+ r"role_required|check_permission|has_permission",
314
+ r"\bRBAC\b|role.based.access",
315
+ r"RoleBinding|ClusterRole|ClusterRoleBinding",
316
+ r"least.privilege|minimum.privilege",
317
+ r"session.timeout|session_expiry|SESSION_TIMEOUT",
318
+ r"remote.access|VPN|vpn_config",
319
+ ]
320
+ extensions = (".py", ".yaml", ".yml", ".js", ".ts", ".java", ".go", ".rs")
321
+ matched, total = _scan_files(project_dir, extensions, patterns)
322
+
323
+ if total == 0:
324
+ return {
325
+ "status": "not_met",
326
+ "evidence": "No source files found to assess for access control.",
327
+ "details": "Project directory lacks applicable source files.",
328
+ }
329
+
330
+ if len(matched) >= 3:
331
+ return {
332
+ "status": "met",
333
+ "evidence": (
334
+ f"Access control patterns found in {len(matched)} file(s) "
335
+ f"including RBAC, session management, and privilege controls."
336
+ ),
337
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
338
+ }
339
+ elif matched:
340
+ return {
341
+ "status": "partially_met",
342
+ "evidence": (
343
+ f"Partial access control patterns found in {len(matched)} file(s). "
344
+ "Expecting RBAC, least privilege, session management, and remote access controls."
345
+ ),
346
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
347
+ }
348
+
349
+ return {
350
+ "status": "not_met",
351
+ "evidence": "No access control patterns detected.",
352
+ "details": (
353
+ "Expected: RBAC, @login_required, role_required, session management, "
354
+ "remote access controls, wireless access restrictions."
355
+ ),
356
+ }
357
+
358
+
359
+ def _check_at_domain(project_dir):
360
+ """Awareness & Training: security training docs, onboarding docs."""
361
+ found = _dir_or_file_exists(
362
+ project_dir,
363
+ glob_patterns=[
364
+ "SECURITY*.md", "security-training*", "security_training*",
365
+ "onboarding*", "training*", "awareness*",
366
+ "docs/security*", "docs/training*",
367
+ ],
368
+ )
369
+ found_dirs = _dir_or_file_exists(
370
+ project_dir,
371
+ dir_names=["training", "onboarding", "security-awareness"],
372
+ )
373
+ all_found = list(set(found + found_dirs))
374
+
375
+ if all_found:
376
+ return {
377
+ "status": "met",
378
+ "evidence": (
379
+ f"Security awareness/training artifacts found: "
380
+ f"{len(all_found)} item(s)."
381
+ ),
382
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
383
+ }
384
+
385
+ # Check for security policy references in code
386
+ patterns = [r"security.training|security.awareness|onboarding.security"]
387
+ extensions = (".md", ".txt", ".rst", ".yaml", ".yml")
388
+ matched, total = _scan_files(project_dir, extensions, patterns)
389
+ if matched:
390
+ return {
391
+ "status": "partially_met",
392
+ "evidence": f"Security training references in {len(matched)} file(s).",
393
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
394
+ }
395
+
396
+ return {
397
+ "status": "not_met",
398
+ "evidence": "No security awareness or training documentation detected.",
399
+ "details": (
400
+ "Expected: SECURITY.md, training docs, onboarding procedures, "
401
+ "security awareness materials."
402
+ ),
403
+ }
404
+
405
+
406
+ def _check_au_domain(project_dir):
407
+ """Audit & Accountability: logging config, audit trail, log protection, timestamps."""
408
+ event_type_patterns = [
409
+ (r"login|auth.*log|authentication.*log", "authentication_logging"),
410
+ (r"access.*log|access_log|request.*log", "access_logging"),
411
+ (r"change.*log|change_log|modification.*log|update.*log", "change_logging"),
412
+ (r"error.*log|error_log|exception.*log", "error_logging"),
413
+ (r"security.*event|security.*log|security_event", "security_logging"),
414
+ (r"audit_trail|AuditTrail|audit\.log", "audit_trail"),
415
+ ]
416
+ extensions = (".py", ".js", ".ts", ".java", ".yaml", ".yml", ".go", ".rs")
417
+ found_types = set()
418
+ evidence_files = []
419
+
420
+ for root, _, files in os.walk(project_dir):
421
+ for fname in files:
422
+ if not fname.endswith(extensions):
423
+ continue
424
+ fpath = os.path.join(root, fname)
425
+ try:
426
+ with open(fpath, "r", encoding="utf-8", errors="ignore") as f:
427
+ content = f.read()
428
+ for pattern, event_type in event_type_patterns:
429
+ if re.search(pattern, content, re.IGNORECASE):
430
+ found_types.add(event_type)
431
+ if fpath not in evidence_files:
432
+ evidence_files.append(fpath)
433
+ except Exception:
434
+ continue
435
+
436
+ # Also check for structured logging
437
+ struct_patterns = [r"logging\.getLogger|getLogger|structlog|log\.info|log\.warn"]
438
+ struct_matched, _ = _scan_files(project_dir, extensions, struct_patterns)
439
+ if struct_matched:
440
+ found_types.add("structured_logging")
441
+
442
+ count = len(found_types)
443
+ if count >= 4:
444
+ return {
445
+ "status": "met",
446
+ "evidence": (
447
+ f"Comprehensive audit logging: {count} distinct log types "
448
+ f"across {len(evidence_files)} file(s)."
449
+ ),
450
+ "details": f"Types: {', '.join(sorted(found_types))}",
451
+ }
452
+ elif count >= 2:
453
+ return {
454
+ "status": "partially_met",
455
+ "evidence": (
456
+ f"Partial audit logging: {count} log type(s) found. "
457
+ "CMMC requires comprehensive logging with protection and timestamps."
458
+ ),
459
+ "details": f"Types: {', '.join(sorted(found_types))}",
460
+ }
461
+
462
+ return {
463
+ "status": "not_met",
464
+ "evidence": "Insufficient audit logging detected.",
465
+ "details": (
466
+ "Expected: authentication, access, change, error, security "
467
+ "logging with timestamps and audit trail protection."
468
+ ),
469
+ }
470
+
471
+
472
+ def _check_cm_domain(project_dir):
473
+ """Configuration Management: baseline configs, change control, IaC, least functionality."""
474
+ found_configs = _dir_or_file_exists(
475
+ project_dir,
476
+ glob_patterns=[
477
+ "*.tf", "*.tfvars", "Dockerfile*", "docker-compose*",
478
+ "*.yaml", "*.yml", "ansible*", "playbook*",
479
+ ".gitlab-ci.yml", ".github/workflows/*",
480
+ ],
481
+ )
482
+ found_dirs = _dir_or_file_exists(
483
+ project_dir,
484
+ dir_names=["terraform", "ansible", "k8s", "kubernetes", "infra"],
485
+ )
486
+
487
+ # Check for version control and change control
488
+ patterns = [
489
+ r"baseline|configuration.management|config.baseline",
490
+ r"change.control|change.request|change.management",
491
+ r"least.functionality|minimal.install|hardened",
492
+ ]
493
+ extensions = (".py", ".yaml", ".yml", ".md", ".tf", ".json")
494
+ matched, total = _scan_files(project_dir, extensions, patterns)
495
+
496
+ all_found = list(set(found_configs + found_dirs + matched))
497
+
498
+ if len(all_found) >= 5:
499
+ return {
500
+ "status": "met",
501
+ "evidence": (
502
+ f"Configuration management artifacts found: {len(all_found)} item(s) "
503
+ "including IaC, Dockerfiles, and config baselines."
504
+ ),
505
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
506
+ }
507
+ elif all_found:
508
+ return {
509
+ "status": "partially_met",
510
+ "evidence": (
511
+ f"Partial configuration management: {len(all_found)} artifact(s). "
512
+ "Missing some of: IaC, change control, baseline configs, least functionality."
513
+ ),
514
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
515
+ }
516
+
517
+ return {
518
+ "status": "not_met",
519
+ "evidence": "No configuration management artifacts detected.",
520
+ "details": (
521
+ "Expected: Terraform/Ansible files, Dockerfiles, baseline configs, "
522
+ "change control documentation, least functionality enforcement."
523
+ ),
524
+ }
525
+
526
+
527
+ def _check_ia_domain(project_dir):
528
+ """Identification & Authentication: MFA, password policy, authenticator mgmt, PKI/CAC."""
529
+ patterns = [
530
+ r"\bMFA\b|multi.factor|MultiFactor|2FA|TOTP|FIDO",
531
+ r"password.policy|password.complexity|min.password",
532
+ r"\bPKI\b|pki_cert|certificate.auth|CAC",
533
+ r"authenticator|authentication.mechanism",
534
+ r"password.*expir|credential.*rotat|key.*rotation",
535
+ ]
536
+ extensions = (".py", ".yaml", ".yml", ".js", ".ts", ".java", ".conf")
537
+ matched, total = _scan_files(project_dir, extensions, patterns)
538
+
539
+ if total == 0:
540
+ return {
541
+ "status": "not_met",
542
+ "evidence": "No source files found to assess for identification & authentication.",
543
+ "details": "Project directory lacks applicable files.",
544
+ }
545
+
546
+ if len(matched) >= 3:
547
+ return {
548
+ "status": "met",
549
+ "evidence": (
550
+ f"Identification & authentication patterns found in "
551
+ f"{len(matched)} file(s) including MFA, password policy, and PKI."
552
+ ),
553
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
554
+ }
555
+ elif matched:
556
+ return {
557
+ "status": "partially_met",
558
+ "evidence": (
559
+ f"Partial I&A patterns in {len(matched)} file(s). "
560
+ "Expecting MFA, password policy, authenticator management, and PKI/CAC."
561
+ ),
562
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
563
+ }
564
+
565
+ return {
566
+ "status": "not_met",
567
+ "evidence": "No identification & authentication patterns detected.",
568
+ "details": (
569
+ "Expected: MFA/2FA, password complexity policy, PKI/CAC support, "
570
+ "authenticator management, credential rotation."
571
+ ),
572
+ }
573
+
574
+
575
+ def _check_ir_domain(project_dir):
576
+ """Incident Response: IR plan, IR testing, reporting procedures."""
577
+ found = _dir_or_file_exists(
578
+ project_dir,
579
+ glob_patterns=[
580
+ "incident-response*", "incident_response*", "ir-plan*", "ir_plan*",
581
+ "docs/incident*", "security/incident*",
582
+ ],
583
+ )
584
+ found_dirs = _dir_or_file_exists(
585
+ project_dir,
586
+ dir_names=["incident-response", "incident_response", "ir"],
587
+ )
588
+
589
+ patterns = [
590
+ r"incident.response|incident.handling|ir.plan|ir.procedure",
591
+ r"incident.report|incident.detection|incident.containment",
592
+ ]
593
+ extensions = (".md", ".txt", ".yaml", ".yml", ".py", ".json")
594
+ matched, total = _scan_files(project_dir, extensions, patterns)
595
+
596
+ all_found = list(set(found + found_dirs + matched))
597
+ if len(all_found) >= 2:
598
+ return {
599
+ "status": "met",
600
+ "evidence": (
601
+ f"Incident response artifacts found: {len(all_found)} item(s)."
602
+ ),
603
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
604
+ }
605
+ elif all_found:
606
+ return {
607
+ "status": "partially_met",
608
+ "evidence": (
609
+ f"Partial incident response: {len(all_found)} artifact(s). "
610
+ "Need IR plan, testing evidence, and reporting procedures."
611
+ ),
612
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
613
+ }
614
+
615
+ return {
616
+ "status": "not_met",
617
+ "evidence": "No incident response artifacts detected.",
618
+ "details": (
619
+ "Expected: IR plan documents, IR testing records, "
620
+ "incident reporting procedures, containment/recovery docs."
621
+ ),
622
+ }
623
+
624
+
625
+ def _check_ma_domain(project_dir):
626
+ """Maintenance: maintenance procedures, non-local maintenance controls."""
627
+ found = _dir_or_file_exists(
628
+ project_dir,
629
+ glob_patterns=[
630
+ "maintenance*", "MAINTENANCE*", "docs/maintenance*",
631
+ "runbook*", "playbook*", "ops/*",
632
+ ],
633
+ )
634
+ patterns = [
635
+ r"maintenance.procedure|maintenance.policy|maintenance.window",
636
+ r"non.local.maintenance|remote.maintenance",
637
+ r"patch.management|update.procedure",
638
+ ]
639
+ extensions = (".md", ".txt", ".yaml", ".yml", ".json")
640
+ matched, total = _scan_files(project_dir, extensions, patterns)
641
+
642
+ all_found = list(set(found + matched))
643
+ if all_found:
644
+ return {
645
+ "status": "met",
646
+ "evidence": (
647
+ f"Maintenance procedure artifacts found: {len(all_found)} item(s)."
648
+ ),
649
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
650
+ }
651
+
652
+ return {
653
+ "status": "not_met",
654
+ "evidence": "No maintenance procedure documentation detected.",
655
+ "details": (
656
+ "Expected: maintenance procedures, non-local maintenance controls, "
657
+ "patch management docs, runbooks."
658
+ ),
659
+ }
660
+
661
+
662
+ def _check_mp_domain(project_dir):
663
+ """Media Protection: media access, marking, storage, transport, sanitization."""
664
+ patterns = [
665
+ r"media.protection|media.sanitization|media.disposal",
666
+ r"encryption.at.rest|encrypt_at_rest|storage_encrypted",
667
+ r"\bKMS\b|kms_key|aws_kms|key_management",
668
+ r"CUI.*mark|classification.*mark|media.*marking",
669
+ r"data.at.rest|data.in.transit|data.protection",
670
+ ]
671
+ extensions = (".py", ".yaml", ".yml", ".tf", ".json", ".md", ".conf")
672
+ matched, total = _scan_files(project_dir, extensions, patterns)
673
+
674
+ if total == 0:
675
+ return {
676
+ "status": "not_met",
677
+ "evidence": "No files found to assess media protection.",
678
+ "details": "Project directory lacks applicable files.",
679
+ }
680
+
681
+ if len(matched) >= 2:
682
+ return {
683
+ "status": "met",
684
+ "evidence": (
685
+ f"Media protection patterns found in {len(matched)} file(s) "
686
+ "including encryption, KMS, and marking controls."
687
+ ),
688
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
689
+ }
690
+ elif matched:
691
+ return {
692
+ "status": "partially_met",
693
+ "evidence": (
694
+ f"Partial media protection in {len(matched)} file(s). "
695
+ "Need encryption-at-rest, CUI marking, transport encryption."
696
+ ),
697
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
698
+ }
699
+
700
+ return {
701
+ "status": "not_met",
702
+ "evidence": "No media protection patterns detected.",
703
+ "details": (
704
+ "Expected: encryption-at-rest, KMS, media marking, "
705
+ "data protection, sanitization procedures."
706
+ ),
707
+ }
708
+
709
+
710
+ def _check_pe_domain(project_dir):
711
+ """Physical Protection: physical access, visitor logs, monitoring."""
712
+ patterns = [
713
+ r"physical.access|physical.security|physical.protection",
714
+ r"visitor.log|visitor.control|badge|access.card",
715
+ r"surveillance|CCTV|physical.monitoring",
716
+ ]
717
+ extensions = (".md", ".txt", ".yaml", ".yml", ".json")
718
+ matched, total = _scan_files(project_dir, extensions, patterns)
719
+
720
+ found = _dir_or_file_exists(
721
+ project_dir,
722
+ glob_patterns=[
723
+ "physical-security*", "physical_security*",
724
+ "docs/physical*", "security/physical*",
725
+ ],
726
+ )
727
+ all_found = list(set(matched + found))
728
+
729
+ if all_found:
730
+ return {
731
+ "status": "met",
732
+ "evidence": (
733
+ f"Physical protection documentation found: {len(all_found)} item(s)."
734
+ ),
735
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
736
+ }
737
+
738
+ # Physical security is often documented outside the codebase
739
+ return {
740
+ "status": "not_applicable",
741
+ "evidence": (
742
+ "Physical security controls are typically managed outside the "
743
+ "software codebase (facility management, physical access systems)."
744
+ ),
745
+ "details": "Manual verification of physical protection controls recommended.",
746
+ }
747
+
748
+
749
+ def _check_ps_domain(project_dir):
750
+ """Personnel Security: screening, termination procedures."""
751
+ patterns = [
752
+ r"personnel.security|background.check|screening",
753
+ r"termination.procedure|offboarding|access.revocation",
754
+ r"personnel.action|separation.procedure",
755
+ ]
756
+ extensions = (".md", ".txt", ".yaml", ".yml", ".json")
757
+ matched, total = _scan_files(project_dir, extensions, patterns)
758
+
759
+ found = _dir_or_file_exists(
760
+ project_dir,
761
+ glob_patterns=[
762
+ "personnel-security*", "personnel_security*",
763
+ "hr-security*", "docs/personnel*",
764
+ ],
765
+ )
766
+ all_found = list(set(matched + found))
767
+
768
+ if all_found:
769
+ return {
770
+ "status": "met",
771
+ "evidence": (
772
+ f"Personnel security documentation found: {len(all_found)} item(s)."
773
+ ),
774
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
775
+ }
776
+
777
+ return {
778
+ "status": "not_applicable",
779
+ "evidence": (
780
+ "Personnel security controls are typically managed outside "
781
+ "the software codebase (HR processes, background check systems)."
782
+ ),
783
+ "details": "Manual verification of personnel security procedures recommended.",
784
+ }
785
+
786
+
787
+ def _check_ra_domain(project_dir):
788
+ """Risk Assessment: risk assessment, vulnerability scanning."""
789
+ found = _dir_or_file_exists(
790
+ project_dir,
791
+ glob_patterns=[
792
+ "risk-assessment*", "risk_assessment*", "threat-model*",
793
+ "threat_model*", "vulnerability-scan*", "vuln-report*",
794
+ ".snyk", ".safety", "audit-report*", "pip-audit-report*",
795
+ ],
796
+ )
797
+ found_dirs = _dir_or_file_exists(
798
+ project_dir,
799
+ dir_names=["risk-assessment", "threat-model", "vulnerability-scans"],
800
+ )
801
+ patterns = [
802
+ r"risk.assessment|risk.analysis|risk.register",
803
+ r"vulnerability.scan|vuln.scan|security.scan",
804
+ r"threat.model|STRIDE|PASTA|attack.tree",
805
+ ]
806
+ extensions = (".md", ".txt", ".yaml", ".yml", ".json", ".py")
807
+ matched, total = _scan_files(project_dir, extensions, patterns)
808
+
809
+ all_found = list(set(found + found_dirs + matched))
810
+ if len(all_found) >= 2:
811
+ return {
812
+ "status": "met",
813
+ "evidence": (
814
+ f"Risk assessment artifacts found: {len(all_found)} item(s) "
815
+ "including risk analysis, vulnerability scanning, and/or threat modeling."
816
+ ),
817
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
818
+ }
819
+ elif all_found:
820
+ return {
821
+ "status": "partially_met",
822
+ "evidence": (
823
+ f"Partial risk assessment: {len(all_found)} artifact(s). "
824
+ "Need both risk assessment and vulnerability scanning."
825
+ ),
826
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
827
+ }
828
+
829
+ return {
830
+ "status": "not_met",
831
+ "evidence": "No risk assessment or vulnerability scanning artifacts detected.",
832
+ "details": (
833
+ "Expected: risk assessment documents, vulnerability scan reports, "
834
+ "threat model artifacts."
835
+ ),
836
+ }
837
+
838
+
839
+ def _check_ca_domain(project_dir):
840
+ """Security Assessment: security assessments, system connections, monitoring."""
841
+ found = _dir_or_file_exists(
842
+ project_dir,
843
+ glob_patterns=[
844
+ "security-assessment*", "security_assessment*",
845
+ "compliance/*", "ato/*", "authorization*",
846
+ "system-connection*", "interconnection*",
847
+ ],
848
+ )
849
+ patterns = [
850
+ r"security.assessment|security.evaluation|compliance.assessment",
851
+ r"plan.of.action|POA.M|POAM|poam",
852
+ r"system.connection|interconnection.agreement|ISA|MOU",
853
+ r"continuous.monitoring|conmon|ongoing.assessment",
854
+ ]
855
+ extensions = (".md", ".txt", ".yaml", ".yml", ".json")
856
+ matched, total = _scan_files(project_dir, extensions, patterns)
857
+
858
+ all_found = list(set(found + matched))
859
+ if len(all_found) >= 2:
860
+ return {
861
+ "status": "met",
862
+ "evidence": (
863
+ f"Security assessment artifacts found: {len(all_found)} item(s) "
864
+ "including assessments, POA&M, and/or continuous monitoring."
865
+ ),
866
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
867
+ }
868
+ elif all_found:
869
+ return {
870
+ "status": "partially_met",
871
+ "evidence": (
872
+ f"Partial security assessment: {len(all_found)} artifact(s)."
873
+ ),
874
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
875
+ }
876
+
877
+ return {
878
+ "status": "not_met",
879
+ "evidence": "No security assessment artifacts detected.",
880
+ "details": (
881
+ "Expected: security assessments, POA&M, system interconnection "
882
+ "agreements, continuous monitoring documentation."
883
+ ),
884
+ }
885
+
886
+
887
+ def _check_sc_domain(project_dir):
888
+ """System & Comms Protection: boundary protection, CUI encryption, crypto, network segmentation."""
889
+ patterns = [
890
+ r"TLS\s*1\.[23]|TLSv1_[23]|PROTOCOL_TLS",
891
+ r"\bHTTPS\b|https://|ssl_context|SSLContext",
892
+ r"mTLS|mutual.TLS|mutual_tls",
893
+ r"\bFIPS\b|fips_mode|FIPS.140",
894
+ r"AES.256|AES_256|aes256",
895
+ r"\bKMS\b|kms_key|aws_kms|key_management",
896
+ r"network.segmentation|network.boundary|firewall",
897
+ r"CUI.*encrypt|encrypt.*CUI|data.protection",
898
+ r"NetworkPolicy|security.group|ingress.rule",
899
+ ]
900
+ extensions = (".py", ".yaml", ".yml", ".tf", ".json", ".conf", ".go", ".rs")
901
+ matched, total = _scan_files(project_dir, extensions, patterns)
902
+
903
+ if total == 0:
904
+ return {
905
+ "status": "not_met",
906
+ "evidence": "No files found to assess system & communications protection.",
907
+ "details": "Project directory lacks applicable files.",
908
+ }
909
+
910
+ if len(matched) >= 4:
911
+ return {
912
+ "status": "met",
913
+ "evidence": (
914
+ f"System & communications protection patterns found in "
915
+ f"{len(matched)} file(s) including TLS, encryption, "
916
+ "FIPS, and network controls."
917
+ ),
918
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
919
+ }
920
+ elif len(matched) >= 2:
921
+ return {
922
+ "status": "partially_met",
923
+ "evidence": (
924
+ f"Partial SC protection in {len(matched)} file(s). "
925
+ "Expecting TLS 1.2+, FIPS encryption, network segmentation, "
926
+ "and CUI data protection."
927
+ ),
928
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
929
+ }
930
+
931
+ return {
932
+ "status": "not_met",
933
+ "evidence": "Insufficient system & communications protection detected.",
934
+ "details": (
935
+ "Expected: TLS 1.2+, FIPS-validated encryption, AES-256, KMS, "
936
+ "network segmentation, boundary protection, CUI encryption."
937
+ ),
938
+ }
939
+
940
+
941
+ def _check_si_domain(project_dir):
942
+ """System & Info Integrity: flaw remediation, malicious code, monitoring, alerting."""
943
+ patterns = [
944
+ r"pip.audit|npm\s+audit|safety.*check|snyk|dependency.check",
945
+ r"bandit|semgrep|sonar|SAST|sast_runner",
946
+ r"\bantivirus\b|\bantimalware\b|malware.scan",
947
+ r"security.monitoring|intrusion.detect|IDS|IPS",
948
+ r"alert|notification|webhook.*security",
949
+ r"patch.management|flaw.remediation|vuln.fix",
950
+ ]
951
+ extensions = (".py", ".yaml", ".yml", ".json", ".sh", ".conf")
952
+ matched, total = _scan_files(project_dir, extensions, patterns)
953
+
954
+ if total == 0:
955
+ return {
956
+ "status": "not_met",
957
+ "evidence": "No files found to assess system & information integrity.",
958
+ "details": "Project directory lacks applicable files.",
959
+ }
960
+
961
+ if len(matched) >= 3:
962
+ return {
963
+ "status": "met",
964
+ "evidence": (
965
+ f"System & information integrity patterns found in "
966
+ f"{len(matched)} file(s) including SAST, dependency auditing, "
967
+ "and security monitoring."
968
+ ),
969
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
970
+ }
971
+ elif matched:
972
+ return {
973
+ "status": "partially_met",
974
+ "evidence": (
975
+ f"Partial SI integrity in {len(matched)} file(s). "
976
+ "Expecting flaw remediation, malicious code protection, "
977
+ "monitoring, and alerting."
978
+ ),
979
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
980
+ }
981
+
982
+ return {
983
+ "status": "not_met",
984
+ "evidence": "No system & information integrity patterns detected.",
985
+ "details": (
986
+ "Expected: SAST, dependency auditing, malicious code protection, "
987
+ "security monitoring, alerting, flaw remediation processes."
988
+ ),
989
+ }
990
+
991
+
992
+ # -----------------------------------------------------------------
993
+ # Domain-to-check mapping
994
+ # -----------------------------------------------------------------
995
+
996
+ DOMAIN_AUTO_CHECKS = {
997
+ "AC": _check_ac_domain,
998
+ "AT": _check_at_domain,
999
+ "AU": _check_au_domain,
1000
+ "CM": _check_cm_domain,
1001
+ "IA": _check_ia_domain,
1002
+ "IR": _check_ir_domain,
1003
+ "MA": _check_ma_domain,
1004
+ "MP": _check_mp_domain,
1005
+ "PE": _check_pe_domain,
1006
+ "PS": _check_ps_domain,
1007
+ "RA": _check_ra_domain,
1008
+ "CA": _check_ca_domain,
1009
+ "SC": _check_sc_domain,
1010
+ "SI": _check_si_domain,
1011
+ }
1012
+
1013
+
1014
+ # -----------------------------------------------------------------
1015
+ # Core assessment function
1016
+ # -----------------------------------------------------------------
1017
+
1018
+ def run_cmmc_assessment(
1019
+ project_id,
1020
+ level=2,
1021
+ project_dir=None,
1022
+ gate=False,
1023
+ output_path=None,
1024
+ db_path=None,
1025
+ ):
1026
+ """Run CMMC Level 2/3 assessment for a project.
1027
+
1028
+ Args:
1029
+ project_id: The project identifier.
1030
+ level: CMMC level (2 or 3).
1031
+ project_dir: Project directory for automated file-based checks.
1032
+ gate: If True, evaluate the CMMC gate.
1033
+ output_path: Override output directory for the assessment report.
1034
+ db_path: Override database path.
1035
+
1036
+ Returns:
1037
+ Dict with domain_scores, overall_score, gate_status,
1038
+ practices_met/not_met/partial, and output file path.
1039
+ """
1040
+ if level not in (2, 3):
1041
+ raise ValueError(f"Invalid CMMC level: {level}. Must be 2 or 3.")
1042
+
1043
+ conn = _get_connection(db_path)
1044
+ try:
1045
+ project = _get_project(conn, project_id)
1046
+
1047
+ # 1. Load CMMC practice catalog
1048
+ catalog = load_cmmc_practices(level)
1049
+ practices = catalog.get("practices", [])
1050
+ catalog.get("metadata", {})
1051
+
1052
+ if not practices:
1053
+ raise ValueError(
1054
+ "No CMMC practices loaded. Ensure "
1055
+ "context/compliance/cmmc_practices.json exists."
1056
+ )
1057
+
1058
+ # 2. Inherit NIST 800-53/800-171 implementations via crosswalk
1059
+ inheritance = _inherit_nist_implementations(
1060
+ project_id, practices, db_path=db_path
1061
+ )
1062
+
1063
+ # 3. Resolve project directory for auto-checks
1064
+ if project_dir and Path(project_dir).is_dir():
1065
+ can_auto_check = True
1066
+ elif (
1067
+ project.get("directory_path")
1068
+ and Path(project["directory_path"]).is_dir()
1069
+ ):
1070
+ project_dir = project["directory_path"]
1071
+ can_auto_check = True
1072
+ else:
1073
+ can_auto_check = False
1074
+
1075
+ # 4. Run domain auto-checks
1076
+ domain_check_results = {}
1077
+ if can_auto_check:
1078
+ for domain_code, domain_name in CMMC_DOMAINS:
1079
+ if domain_code in DOMAIN_AUTO_CHECKS:
1080
+ try:
1081
+ domain_check_results[domain_code] = (
1082
+ DOMAIN_AUTO_CHECKS[domain_code](project_dir)
1083
+ )
1084
+ except Exception as e:
1085
+ domain_check_results[domain_code] = {
1086
+ "status": "not_met",
1087
+ "evidence": f"Auto-check error: {e}",
1088
+ "details": "Domain auto-check failed; manual review required.",
1089
+ }
1090
+
1091
+ now = datetime.now(timezone.utc)
1092
+ results = []
1093
+
1094
+ # 5. Assess each practice
1095
+ for practice in practices:
1096
+ pid = practice["id"]
1097
+ domain_code = practice.get("domain_code", "")
1098
+ automation_level = practice.get("automation_level", "manual")
1099
+ status = "not_assessed"
1100
+ evidence = ""
1101
+ details = ""
1102
+ notes = ""
1103
+
1104
+ # Check if inherited from NIST implementation
1105
+ inh = inheritance.get(pid, {})
1106
+ if inh.get("inherited"):
1107
+ status = "met"
1108
+ evidence = (
1109
+ f"Inherited from NIST 800-53 implementation. "
1110
+ f"Controls implemented: {', '.join(inh['controls_implemented'])}."
1111
+ )
1112
+ details = "Practice satisfied via crosswalk inheritance."
1113
+ notes = "Verified via crosswalk engine."
1114
+
1115
+ elif automation_level == "auto" and can_auto_check:
1116
+ # Use domain-level auto-check result
1117
+ domain_result = domain_check_results.get(domain_code, {})
1118
+ if domain_result:
1119
+ status = domain_result.get("status", "not_assessed")
1120
+ evidence = domain_result.get("evidence", "")
1121
+ details = domain_result.get("details", "")
1122
+ notes = "Auto-checked via domain scan."
1123
+ else:
1124
+ status = "not_assessed"
1125
+ evidence = "No auto-check available for this domain."
1126
+ notes = "Manual review required."
1127
+
1128
+ elif automation_level == "semi" and can_auto_check:
1129
+ domain_result = domain_check_results.get(domain_code, {})
1130
+ if domain_result:
1131
+ status = domain_result.get("status", "not_assessed")
1132
+ evidence = domain_result.get("evidence", "")
1133
+ details = domain_result.get("details", "")
1134
+ notes = (
1135
+ "Semi-automated check. Manual review required to "
1136
+ "verify full compliance with this specific practice."
1137
+ )
1138
+ else:
1139
+ status = "not_assessed"
1140
+ evidence = "Semi-automated: no auto component available."
1141
+ notes = (
1142
+ f"Manual review required. Evidence needed: "
1143
+ f"{practice.get('evidence_required', 'See practice description.')}"
1144
+ )
1145
+
1146
+ elif automation_level in ("auto", "semi") and not can_auto_check:
1147
+ status = "not_assessed"
1148
+ evidence = "No project directory available for automated scanning."
1149
+ notes = "Provide --project-dir to enable auto-checks."
1150
+
1151
+ else:
1152
+ # Manual
1153
+ status = "not_assessed"
1154
+ evidence = "Manual assessment required."
1155
+ notes = (
1156
+ f"Evidence needed: "
1157
+ f"{practice.get('evidence_required', 'See practice description.')}"
1158
+ )
1159
+
1160
+ # Add partial credit if some NIST controls are implemented
1161
+ if status == "not_assessed" and inh.get("controls_implemented"):
1162
+ status = "partially_met"
1163
+ evidence = (
1164
+ f"Partial NIST 800-53 implementation. "
1165
+ f"Implemented: {', '.join(inh['controls_implemented'])}. "
1166
+ f"Missing: {', '.join(inh.get('controls_missing', []))}."
1167
+ )
1168
+ notes = "Complete remaining NIST control implementations."
1169
+
1170
+ result_entry = {
1171
+ "practice_id": pid,
1172
+ "domain": practice.get("domain", ""),
1173
+ "domain_code": domain_code,
1174
+ "level": practice.get("level", 2),
1175
+ "title": practice.get("title", ""),
1176
+ "description": practice.get("description", ""),
1177
+ "priority": practice.get("priority", "medium"),
1178
+ "automation_level": automation_level,
1179
+ "nist_800_53_controls": practice.get("nist_800_53_controls", []),
1180
+ "nist_800_171_id": practice.get("nist_800_171_id", ""),
1181
+ "status": status,
1182
+ "evidence": evidence,
1183
+ "details": details,
1184
+ "notes": notes,
1185
+ }
1186
+ results.append(result_entry)
1187
+
1188
+ # 6. Store in cmmc_assessments table
1189
+ try:
1190
+ conn.execute(
1191
+ """INSERT OR REPLACE INTO cmmc_assessments
1192
+ (project_id, assessment_date, assessor, level,
1193
+ practice_id, domain, status, evidence_description,
1194
+ evidence_path, automation_result, nist_171_id,
1195
+ notes, updated_at)
1196
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
1197
+ (
1198
+ project_id,
1199
+ now.isoformat(),
1200
+ "icdev-compliance-engine",
1201
+ level,
1202
+ pid,
1203
+ practice.get("domain", ""),
1204
+ status,
1205
+ evidence,
1206
+ details if details else None,
1207
+ json.dumps({
1208
+ "automation_level": automation_level,
1209
+ "inherited": inh.get("inherited", False),
1210
+ }),
1211
+ practice.get("nist_800_171_id", ""),
1212
+ notes if notes else None,
1213
+ now.isoformat(),
1214
+ ),
1215
+ )
1216
+ except Exception as e:
1217
+ print(
1218
+ f"Warning: Could not upsert assessment for {pid}: {e}",
1219
+ file=sys.stderr,
1220
+ )
1221
+
1222
+ conn.commit()
1223
+
1224
+ # 7. Compute per-domain and overall scores
1225
+ domain_scores = {}
1226
+ for domain_code, domain_name in CMMC_DOMAINS:
1227
+ domain_practices = [
1228
+ r for r in results if r["domain_code"] == domain_code
1229
+ ]
1230
+ total = len(domain_practices)
1231
+ if total == 0:
1232
+ domain_scores[domain_code] = {
1233
+ "name": domain_name,
1234
+ "score": 0.0,
1235
+ "total": 0,
1236
+ "met": 0,
1237
+ "partially_met": 0,
1238
+ "not_met": 0,
1239
+ "not_assessed": 0,
1240
+ "not_applicable": 0,
1241
+ }
1242
+ continue
1243
+
1244
+ met = sum(1 for p in domain_practices if p["status"] == "met")
1245
+ partial = sum(1 for p in domain_practices if p["status"] == "partially_met")
1246
+ not_met = sum(1 for p in domain_practices if p["status"] == "not_met")
1247
+ na = sum(1 for p in domain_practices if p["status"] == "not_applicable")
1248
+ not_assessed = sum(1 for p in domain_practices if p["status"] == "not_assessed")
1249
+
1250
+ scoreable = total - na
1251
+ if scoreable > 0:
1252
+ score = 100.0 * (met + partial * 0.5) / scoreable
1253
+ else:
1254
+ score = 100.0 # All N/A
1255
+
1256
+ domain_scores[domain_code] = {
1257
+ "name": domain_name,
1258
+ "score": round(score, 1),
1259
+ "total": total,
1260
+ "met": met,
1261
+ "partially_met": partial,
1262
+ "not_met": not_met,
1263
+ "not_assessed": not_assessed,
1264
+ "not_applicable": na,
1265
+ }
1266
+
1267
+ # Overall: weighted average across 14 domains
1268
+ scoreable_domains = [
1269
+ s for s in domain_scores.values() if s["total"] > 0
1270
+ ]
1271
+ if scoreable_domains:
1272
+ # Weight by number of practices
1273
+ total_practices = sum(s["total"] - s["not_applicable"] for s in scoreable_domains)
1274
+ if total_practices > 0:
1275
+ weighted_sum = sum(
1276
+ s["score"] * (s["total"] - s["not_applicable"])
1277
+ for s in scoreable_domains
1278
+ )
1279
+ overall_score = round(weighted_sum / total_practices, 1)
1280
+ else:
1281
+ overall_score = 100.0
1282
+ else:
1283
+ overall_score = 0.0
1284
+
1285
+ # Spill score: count of "not_met" practices
1286
+ spill_score = sum(1 for r in results if r["status"] == "not_met")
1287
+
1288
+ # 8. Gate evaluation
1289
+ # Level 2: 0 "not_met" critical practices
1290
+ # Level 3: same + additional 800-172 checks
1291
+ critical_not_met = []
1292
+ for r in results:
1293
+ if r["priority"] == "critical" and r["status"] == "not_met":
1294
+ critical_not_met.append(f"{r['practice_id']}: {r['title']}")
1295
+
1296
+ gate_passed = len(critical_not_met) == 0
1297
+ gate_result = {
1298
+ "evaluated": gate,
1299
+ "level": level,
1300
+ "passed": gate_passed,
1301
+ "critical_not_met": len(critical_not_met),
1302
+ "critical_failures": critical_not_met,
1303
+ "spill_score": spill_score,
1304
+ "reason": (
1305
+ f"PASS: 0 critical practices not_met for Level {level}"
1306
+ if gate_passed
1307
+ else (
1308
+ f"FAIL: {len(critical_not_met)} critical practice(s) not_met: "
1309
+ f"{', '.join(critical_not_met[:5])}"
1310
+ )
1311
+ ),
1312
+ }
1313
+
1314
+ # Compute SPRS score estimate (DFARS 252.204-7019/7020)
1315
+ # SPRS = 110 - (5 * critical_not_met) - (3 * high_not_met) - (1 * other_not_met)
1316
+ high_not_met = sum(
1317
+ 1 for r in results
1318
+ if r["priority"] == "high" and r["status"] == "not_met"
1319
+ )
1320
+ other_not_met = sum(
1321
+ 1 for r in results
1322
+ if r["priority"] not in ("critical", "high") and r["status"] == "not_met"
1323
+ )
1324
+ sprs_score = max(
1325
+ -203,
1326
+ 110 - (5 * len(critical_not_met)) - (3 * high_not_met) - (1 * other_not_met)
1327
+ )
1328
+
1329
+ # 9. Log audit event
1330
+ _log_audit_event(
1331
+ conn,
1332
+ project_id,
1333
+ f"CMMC Level {level} assessment completed",
1334
+ {
1335
+ "level": level,
1336
+ "practices_assessed": len(results),
1337
+ "overall_score": overall_score,
1338
+ "spill_score": spill_score,
1339
+ "sprs_score": sprs_score,
1340
+ "gate_result": gate_result,
1341
+ "domain_scores": {
1342
+ k: v["score"] for k, v in domain_scores.items()
1343
+ if v["total"] > 0
1344
+ },
1345
+ },
1346
+ )
1347
+
1348
+ # Summary counts
1349
+ total_met = sum(1 for r in results if r["status"] == "met")
1350
+ total_not_met = sum(1 for r in results if r["status"] == "not_met")
1351
+ total_partial = sum(1 for r in results if r["status"] == "partially_met")
1352
+ total_na = sum(1 for r in results if r["status"] == "not_applicable")
1353
+ total_not_assessed = sum(1 for r in results if r["status"] == "not_assessed")
1354
+
1355
+ # Console output
1356
+ print(f"CMMC Level {level} assessment completed:")
1357
+ print(f" Project: {project.get('name', project_id)}")
1358
+ print(f" Practices assessed: {len(results)}")
1359
+ print(f" Overall score: {overall_score}%")
1360
+ print(f" SPRS score estimate: {sprs_score}")
1361
+ for domain_code, domain_name in CMMC_DOMAINS:
1362
+ s = domain_scores.get(domain_code, {})
1363
+ if s.get("total", 0) == 0:
1364
+ continue
1365
+ print(
1366
+ f" {domain_code} ({domain_name}): "
1367
+ f"MET={s['met']} PARTIAL={s['partially_met']} "
1368
+ f"NOT_MET={s['not_met']} N/A={s['not_applicable']}"
1369
+ )
1370
+
1371
+ if gate:
1372
+ print(f"\n Gate: {gate_result['reason']}")
1373
+
1374
+ return {
1375
+ "project_id": project_id,
1376
+ "level": level,
1377
+ "practices_assessed": len(results),
1378
+ "overall_score": overall_score,
1379
+ "spill_score": spill_score,
1380
+ "sprs_score": sprs_score,
1381
+ "domain_scores": domain_scores,
1382
+ "gate_result": gate_result,
1383
+ "practices_met": total_met,
1384
+ "practices_not_met": total_not_met,
1385
+ "practices_partial": total_partial,
1386
+ "practices_na": total_na,
1387
+ "practices_not_assessed": total_not_assessed,
1388
+ "results": results,
1389
+ }
1390
+
1391
+ finally:
1392
+ conn.close()
1393
+
1394
+
1395
+ def assess_project(
1396
+ project_id,
1397
+ level=2,
1398
+ project_dir=None,
1399
+ gate=False,
1400
+ output_path=None,
1401
+ db_path=None,
1402
+ ):
1403
+ """Alias for run_cmmc_assessment (MCP compatibility)."""
1404
+ return run_cmmc_assessment(
1405
+ project_id,
1406
+ level=level,
1407
+ project_dir=project_dir,
1408
+ gate=gate,
1409
+ output_path=output_path,
1410
+ db_path=db_path,
1411
+ )
1412
+
1413
+
1414
+ # -----------------------------------------------------------------
1415
+ # CLI entrypoint
1416
+ # -----------------------------------------------------------------
1417
+
1418
+ if __name__ == "__main__":
1419
+ parser = argparse.ArgumentParser(
1420
+ description="Run CMMC Level 2/3 assessment"
1421
+ )
1422
+ parser.add_argument(
1423
+ "--project-id", required=True, help="Project ID"
1424
+ )
1425
+ parser.add_argument(
1426
+ "--level", type=int, default=2, choices=[2, 3],
1427
+ help="CMMC level (2 or 3, default: 2)",
1428
+ )
1429
+ parser.add_argument(
1430
+ "--domain",
1431
+ choices=[code for code, _ in CMMC_DOMAINS],
1432
+ help="Assess only a specific domain (default: all)",
1433
+ )
1434
+ parser.add_argument(
1435
+ "--project-dir",
1436
+ help="Project directory for automated file-based checks",
1437
+ )
1438
+ parser.add_argument(
1439
+ "--gate", action="store_true",
1440
+ help="Evaluate CMMC gate (0 critical not_met = pass)",
1441
+ )
1442
+ parser.add_argument(
1443
+ "--output-dir",
1444
+ help="Output directory for the assessment report",
1445
+ )
1446
+ parser.add_argument(
1447
+ "--db-path", type=Path, default=DB_PATH,
1448
+ help="Override database path",
1449
+ )
1450
+ parser.add_argument(
1451
+ "--json", action="store_true",
1452
+ help="Output results as JSON",
1453
+ )
1454
+ args = parser.parse_args()
1455
+
1456
+ try:
1457
+ result = run_cmmc_assessment(
1458
+ project_id=args.project_id,
1459
+ level=args.level,
1460
+ project_dir=args.project_dir,
1461
+ gate=args.gate,
1462
+ output_path=args.output_dir,
1463
+ db_path=args.db_path,
1464
+ )
1465
+
1466
+ if args.json:
1467
+ # Remove full results list for cleaner JSON output
1468
+ output = {
1469
+ k: v for k, v in result.items() if k != "results"
1470
+ }
1471
+ print(json.dumps(output, indent=2))
1472
+ else:
1473
+ print(
1474
+ json.dumps(
1475
+ {
1476
+ "overall_score": result.get("overall_score"),
1477
+ "sprs_score": result.get("sprs_score"),
1478
+ "gate_result": result.get("gate_result"),
1479
+ "practices_met": result.get("practices_met"),
1480
+ "practices_not_met": result.get("practices_not_met"),
1481
+ },
1482
+ indent=2,
1483
+ )
1484
+ )
1485
+
1486
+ if args.gate and not result["gate_result"]["passed"]:
1487
+ sys.exit(1)
1488
+
1489
+ except (FileNotFoundError, ValueError) as e:
1490
+ print(f"ERROR: {e}", file=sys.stderr)
1491
+ sys.exit(1)