icdev 0.0.3__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 (1214) hide show
  1. args/agent_config.yaml +113 -0
  2. args/audit_regimes/cisa_sbd.json +381 -0
  3. args/audit_regimes/cmmc_l2.json +906 -0
  4. args/audit_regimes/dod_cssp.json +393 -0
  5. args/audit_regimes/dodi_5000_87.json +297 -0
  6. args/audit_regimes/fedramp_moderate.json +650 -0
  7. args/audit_regimes/ieee_1012.json +373 -0
  8. args/audit_regimes/nist_800_171.json +624 -0
  9. args/audit_regimes/nist_800_53.json +907 -0
  10. args/cloudforge_blueprints/aws_commercial.yaml +29 -0
  11. args/cloudforge_blueprints/aws_govcloud_il4.yaml +34 -0
  12. args/cloudforge_blueprints/aws_govcloud_il5.yaml +38 -0
  13. args/cloudforge_blueprints/azure_commercial.yaml +28 -0
  14. args/cloudforge_blueprints/azure_gov_il4.yaml +32 -0
  15. args/cloudforge_blueprints/azure_gov_il5.yaml +36 -0
  16. args/cloudforge_blueprints/gcp_commercial.yaml +28 -0
  17. args/cloudforge_blueprints/oci_commercial.yaml +28 -0
  18. args/cloudforge_config.yaml +231 -0
  19. args/cloudforge_runbook_templates/backup_verify.yaml +98 -0
  20. args/cloudforge_runbook_templates/dr_failover.yaml +107 -0
  21. args/cloudforge_runbook_templates/health_check.yaml +97 -0
  22. args/cloudforge_runbook_templates/incident_response.yaml +101 -0
  23. args/cloudforge_runbook_templates/migration_cutover.yaml +105 -0
  24. args/cloudforge_runbook_templates/patch_rollout.yaml +92 -0
  25. args/cloudforge_runbook_templates/zone_provision.yaml +93 -0
  26. args/code_pattern_config.yaml +151 -0
  27. args/code_quality_config.yaml +47 -0
  28. args/compliance_config.yaml +17 -0
  29. args/control_inheritance.yaml +177 -0
  30. args/csp_mcp_config.yaml +41 -0
  31. args/cui_markings.yaml +35 -0
  32. args/databridge_config.yaml +232 -0
  33. args/db_config.yaml +116 -0
  34. args/decision_tables/agent_trust_decision.yaml +143 -0
  35. args/decision_tables/ato_boundary_impact.yaml +132 -0
  36. args/decision_tables/deployment_approval.yaml +152 -0
  37. args/degradation_matrix.yaml +163 -0
  38. args/devsecops_config.yaml +286 -0
  39. args/endpoint_security_config.yaml +207 -0
  40. args/exit_criteria.yaml +102 -0
  41. args/feature_flags.yaml +235 -0
  42. args/file_access_tiers.yaml +88 -0
  43. args/forge_studio/blueprint_config.yaml +27 -0
  44. args/forge_studio/component_catalog.json +411 -0
  45. args/forge_studio/workflow_templates.yaml +103 -0
  46. args/govcon_config.yaml +41 -0
  47. args/harness_config.yaml +67 -0
  48. args/innovation_config.yaml +321 -0
  49. args/knowledge_graph_config.yaml +113 -0
  50. args/llm_config.yaml +222 -0
  51. args/marketplace_config.yaml +260 -0
  52. args/monitoring_config.yaml +127 -0
  53. args/mosa_config.yaml +190 -0
  54. args/observability_tracing_config.yaml +170 -0
  55. args/owasp_agentic_config.yaml +171 -0
  56. args/pipeline_gates.yaml +197 -0
  57. args/project_defaults.yaml +235 -0
  58. args/prompt_chains.yaml +163 -0
  59. args/rag_config.yaml +167 -0
  60. args/research_config.yaml +89 -0
  61. args/resilience_config.yaml +197 -0
  62. args/ricoas_config.yaml +191 -0
  63. args/security_gates.yaml +763 -0
  64. args/storage_config.yaml +63 -0
  65. args/writeguard_config.yaml +131 -0
  66. args/zta_config.yaml +247 -0
  67. context/__init__.py +6 -0
  68. context/agent/__init__.py +6 -0
  69. context/agent/response_schemas/__init__.py +6 -0
  70. context/agent/response_schemas/debate_position.json +46 -0
  71. context/agent/response_schemas/fitness_scorecard.json +74 -0
  72. context/agent/response_schemas/review_decision.json +39 -0
  73. context/agent/response_schemas/task_decomposition.json +82 -0
  74. context/agent/response_schemas/veto_decision.json +40 -0
  75. context/agentic/__init__.py +6 -0
  76. context/agentic/architecture_patterns.md +269 -0
  77. context/agentic/capability_registry.yaml +223 -0
  78. context/agentic/csp_integration.md +30 -0
  79. context/agentic/csp_mcp_registry.yaml +280 -0
  80. context/agentic/fitness_rubric.md +56 -0
  81. context/agentic/governance_baseline.md +205 -0
  82. context/ci/__init__.py +6 -0
  83. context/ci/worktree_templates.json +44 -0
  84. context/cloud/__init__.py +6 -0
  85. context/cloud/csp_service_registry.json +739 -0
  86. context/compliance/__init__.py +6 -0
  87. context/compliance/ai_rmf_crosswalk.yaml +226 -0
  88. context/compliance/atlas_mitigations.json +293 -0
  89. context/compliance/atlas_techniques.json +833 -0
  90. context/compliance/cisa_sbd_requirements.json +477 -0
  91. context/compliance/cjis_security_policy.json +522 -0
  92. context/compliance/cmmc_practices.json +2494 -0
  93. context/compliance/cmmc_report_template.md +142 -0
  94. context/compliance/cnssi_1253_overlay.json +109 -0
  95. context/compliance/control_crosswalk.json +1914 -0
  96. context/compliance/control_families/__init__.py +6 -0
  97. context/compliance/csp_certifications.json +251 -0
  98. context/compliance/cssp_report_template.md +193 -0
  99. context/compliance/cui_templates/__init__.py +6 -0
  100. context/compliance/cui_templates/banner_block.txt +4 -0
  101. context/compliance/cui_templates/code_header.txt +8 -0
  102. context/compliance/cui_templates/document_template.md +35 -0
  103. context/compliance/data_type_framework_map.json +321 -0
  104. context/compliance/data_type_registry.json +147 -0
  105. context/compliance/dod_cssp_8530.json +463 -0
  106. context/compliance/eu_ai_act_annex_iii.json +108 -0
  107. context/compliance/export_templates/__init__.py +6 -0
  108. context/compliance/export_templates/emass_controls.csv.j2 +4 -0
  109. context/compliance/export_templates/evidence_package.md.j2 +39 -0
  110. context/compliance/export_templates/executive_summary.md.j2 +55 -0
  111. context/compliance/export_templates/poam_tracking.csv.j2 +4 -0
  112. context/compliance/fedramp_20x_ksi_schemas.json +133 -0
  113. context/compliance/fedramp_high_baseline.json +4370 -0
  114. context/compliance/fedramp_moderate_baseline.json +2183 -0
  115. context/compliance/fedramp_report_template.md +181 -0
  116. context/compliance/fips_200_areas.json +362 -0
  117. context/compliance/gao_ai_accountability.json +262 -0
  118. context/compliance/hipaa_security_rule.json +720 -0
  119. context/compliance/hitrust_csf_v11.json +930 -0
  120. context/compliance/impact_level_profiles.json +251 -0
  121. context/compliance/incident_response_template.md +1110 -0
  122. context/compliance/iso27001_2022_controls.json +750 -0
  123. context/compliance/iso27001_nist_bridge.json +382 -0
  124. context/compliance/iso42001_controls.json +254 -0
  125. context/compliance/ivv_checklist_template.md +80 -0
  126. context/compliance/ivv_report_template.md +116 -0
  127. context/compliance/ivv_requirements.json +372 -0
  128. context/compliance/mosa_crosswalk.json +327 -0
  129. context/compliance/mosa_framework.json +250 -0
  130. context/compliance/narrative_templates/AC.md.j2 +101 -0
  131. context/compliance/narrative_templates/AU.md.j2 +106 -0
  132. context/compliance/narrative_templates/IA.md.j2 +104 -0
  133. context/compliance/narrative_templates/SC.md.j2 +102 -0
  134. context/compliance/narrative_templates/SI.md.j2 +111 -0
  135. context/compliance/narrative_templates/__init__.py +6 -0
  136. context/compliance/narrative_templates/default.md.j2 +50 -0
  137. context/compliance/narrative_templates/executive_summary.j2 +27 -0
  138. context/compliance/narrative_templates/poam_milestone.j2 +19 -0
  139. context/compliance/narrative_templates/ssp_section.j2 +11 -0
  140. context/compliance/nist_800_171_controls.json +1552 -0
  141. context/compliance/nist_800_207_crosswalk.json +399 -0
  142. context/compliance/nist_800_207_zta.json +258 -0
  143. context/compliance/nist_800_53.json +324 -0
  144. context/compliance/nist_ai_600_1_genai.json +326 -0
  145. context/compliance/nist_ai_rmf.json +206 -0
  146. context/compliance/nist_sp_800_60_types.json +1667 -0
  147. context/compliance/omb_m25_21_high_impact_ai.json +248 -0
  148. context/compliance/omb_m26_04_unbiased_ai.json +262 -0
  149. context/compliance/owasp_agentic_asi.json +133 -0
  150. context/compliance/owasp_agentic_threats.json +285 -0
  151. context/compliance/owasp_llm_top10.json +274 -0
  152. context/compliance/pci_dss_v4.json +510 -0
  153. context/compliance/poam_template.md +117 -0
  154. context/compliance/safeai_controls.json +512 -0
  155. context/compliance/sbd_report_template.md +77 -0
  156. context/compliance/siem_config_templates/__init__.py +6 -0
  157. context/compliance/siem_config_templates/filebeat.yml +213 -0
  158. context/compliance/siem_config_templates/log_sources.json +208 -0
  159. context/compliance/soc2_trust_criteria.json +661 -0
  160. context/compliance/ssp_template.md +432 -0
  161. context/compliance/stig_templates/__init__.py +6 -0
  162. context/compliance/stig_templates/webapp_stig.json +139 -0
  163. context/compliance/xai_requirements.json +108 -0
  164. context/dashboard/__init__.py +6 -0
  165. context/dashboard/nlq_examples.json +50 -0
  166. context/dashboard/schema_descriptions.json +23 -0
  167. context/icdev_methodology.md +100 -0
  168. context/integration/__init__.py +6 -0
  169. context/integration/approval_workflows.json +32 -0
  170. context/integration/gitlab_field_mappings.json +33 -0
  171. context/integration/jira_field_mappings.json +32 -0
  172. context/integration/reqif_export_schema.json +23 -0
  173. context/integration/servicenow_field_mappings.json +22 -0
  174. context/languages/__init__.py +6 -0
  175. context/languages/framework_patterns.json +205 -0
  176. context/languages/language_registry.json +279 -0
  177. context/llm/__init__.py +6 -0
  178. context/llm/example_provider.py +89 -0
  179. context/marketplace/assets/writeguard-core.yaml +100 -0
  180. context/marketplace/assets/writeguard-govcon.yaml +45 -0
  181. context/marketplace/assets/writeguard-style-guides.yaml +44 -0
  182. context/mbse/__init__.py +6 -0
  183. context/mbse/des_report_template.md +162 -0
  184. context/mbse/des_requirements.json +411 -0
  185. context/mbse/digital_thread_patterns.json +403 -0
  186. context/mbse/reqif_schema.json +280 -0
  187. context/mbse/sysml_element_types.json +432 -0
  188. context/oscal/NIST_SP-800-53_rev5_catalog.json +254987 -0
  189. context/oscal/README.md +43 -0
  190. context/patterns/__init__.py +6 -0
  191. context/profiles/__init__.py +6 -0
  192. context/profiles/dod_baseline_v1.yaml +145 -0
  193. context/profiles/fedramp_baseline_v1.yaml +143 -0
  194. context/profiles/financial_baseline_v1.yaml +142 -0
  195. context/profiles/healthcare_baseline_v1.yaml +135 -0
  196. context/profiles/law_enforcement_v1.yaml +129 -0
  197. context/profiles/startup_v1.yaml +134 -0
  198. context/rag/source_mappings.json +42 -0
  199. context/requirements/__init__.py +6 -0
  200. context/requirements/ambiguity_patterns.json +97 -0
  201. context/requirements/boundary_impact_rules.json +123 -0
  202. context/requirements/default_constitutions.json +67 -0
  203. context/requirements/document_extraction_rules.json +58 -0
  204. context/requirements/gap_patterns.json +108 -0
  205. context/requirements/readiness_rubric.json +78 -0
  206. context/requirements/red_alternative_patterns.json +210 -0
  207. context/requirements/safe_templates.json +72 -0
  208. context/requirements/spec_quality_checklist.json +122 -0
  209. context/research/regulatory_registry.json +114 -0
  210. context/research/verticals/cybersecurity.json +127 -0
  211. context/research/verticals/defense.json +104 -0
  212. context/research/verticals/fintech.json +125 -0
  213. context/research/verticals/healthcare.json +118 -0
  214. context/research/verticals/logistics.json +117 -0
  215. context/research/verticals/trading.json +145 -0
  216. context/simulation/__init__.py +6 -0
  217. context/simulation/architecture_patterns.json +36 -0
  218. context/simulation/coa_templates.json +38 -0
  219. context/simulation/cost_models.json +23 -0
  220. context/simulation/risk_categories.json +46 -0
  221. context/supply_chain/__init__.py +6 -0
  222. context/supply_chain/isa_templates.json +129 -0
  223. context/supply_chain/nist_800_161_controls.json +247 -0
  224. context/supply_chain/scrm_risk_matrix.json +147 -0
  225. context/templates/__init__.py +6 -0
  226. context/templates/ansible/__init__.py +6 -0
  227. context/templates/ansible/playbooks/__init__.py +6 -0
  228. context/templates/ansible/roles/__init__.py +6 -0
  229. context/templates/gitlab_ci/__init__.py +6 -0
  230. context/templates/grafana/__init__.py +6 -0
  231. context/templates/kubernetes/__init__.py +6 -0
  232. context/templates/project/__init__.py +6 -0
  233. context/templates/project/api/__init__.py +6 -0
  234. context/templates/project/cli/__init__.py +6 -0
  235. context/templates/project/data_pipeline/__init__.py +6 -0
  236. context/templates/project/iac/__init__.py +6 -0
  237. context/templates/project/javascript_frontend/__init__.py +6 -0
  238. context/templates/project/javascript_frontend/src/__init__.py +6 -0
  239. context/templates/project/javascript_frontend/tests/__init__.py +6 -0
  240. context/templates/project/microservice/__init__.py +6 -0
  241. context/templates/project/python_backend/__init__.py +6 -0
  242. context/templates/project/python_backend/src/__init__.py +6 -0
  243. context/templates/project/python_backend/tests/__init__.py +6 -0
  244. context/templates/project/python_backend/tests/features/__init__.py +6 -0
  245. context/templates/project/python_backend/tests/steps/__init__.py +6 -0
  246. context/templates/terraform/__init__.py +6 -0
  247. context/templates/terraform/govcloud_base/__init__.py +6 -0
  248. context/templates/terraform/modules/__init__.py +6 -0
  249. context/tone/__init__.py +6 -0
  250. context/writing/grammar_rules/common_errors.json +306 -0
  251. context/writing/grammar_rules/govcon_vocabulary.json +113 -0
  252. context/writing/style_guides/academic.yaml +43 -0
  253. context/writing/style_guides/business.yaml +42 -0
  254. context/writing/style_guides/government.yaml +59 -0
  255. context/writing/style_guides/proposal.yaml +58 -0
  256. context/writing/style_guides/technical.yaml +43 -0
  257. docs/adr/README.md +66 -0
  258. docs/adr/connector-forge-decisions.md +318 -0
  259. docs/adr/core-decisions.md +289 -0
  260. docs/adr/db-decisions.md +94 -0
  261. docs/adr/harness-decisions.md +122 -0
  262. docs/adr/innovation-decisions.md +262 -0
  263. docs/adr/marketplace-decisions.md +109 -0
  264. docs/adr/sbd-decisions.md +109 -0
  265. docs/adr/scale-engine-decisions.md +108 -0
  266. docs/adr/writeguard-decisions.md +136 -0
  267. docs/architecture/bounded-contexts.md +1032 -0
  268. docs/features/phase-65-writeguard.md +139 -0
  269. docs/features/phase-66-marketplace-commerce.md +79 -0
  270. docs/features/phase-67-knowledge-ingestion-rag-autodraft.md +97 -0
  271. docs/features/phase-68-enhanced-autodraft-pipeline.md +109 -0
  272. docs/features/phase-69-proposalai-marketplace-module.md +131 -0
  273. docs/features/phase-70-databridge.md +214 -0
  274. docs/features/phase-71-databridge-messaging.md +102 -0
  275. docs/implementation-plan-architecture-evolution.md +614 -0
  276. docs/marketplace/CONTRIBUTING.md +124 -0
  277. docs/marketplace/module_manifest_schema.yaml +83 -0
  278. docs/research/ai-architecture-patterns-2024-2026.md +1236 -0
  279. docs/research/app-builder-platform-analysis.md +582 -0
  280. docs/research/architecture-patterns-c4-ddd-agentic.md +871 -0
  281. docs/research/flowable-boat-competitive-analysis.md +426 -0
  282. docs/research/modern-dev-practices-2024-2026.md +1615 -0
  283. docs/research/secure-by-design-cloudyrion-adaptation.md +270 -0
  284. goals/agent_management.md +144 -0
  285. goals/ai_accountability.md +90 -0
  286. goals/ai_narratives.md +79 -0
  287. goals/ai_transparency.md +76 -0
  288. goals/ato_simulator.md +78 -0
  289. goals/audit_engine.md +177 -0
  290. goals/bite_sized_plans.md +225 -0
  291. goals/boundary_supply_chain.md +206 -0
  292. goals/brainstorming_gate.md +186 -0
  293. goals/build_app.md +604 -0
  294. goals/cato_live_evidence.md +77 -0
  295. goals/cloudforge.md +106 -0
  296. goals/code_intelligence.md +197 -0
  297. goals/compliance_workflow.md +858 -0
  298. goals/connector_forge.md +133 -0
  299. goals/databridge.md +128 -0
  300. goals/deploy_workflow.md +390 -0
  301. goals/developer_scorecard.md +78 -0
  302. goals/devsecops_workflow.md +408 -0
  303. goals/firmware_sbom.md +79 -0
  304. goals/forge_hub.md +78 -0
  305. goals/golden_path.md +77 -0
  306. goals/harness_engineering.md +91 -0
  307. goals/integration_testing.md +189 -0
  308. goals/knowledge_graph.md +128 -0
  309. goals/maintenance_audit.md +196 -0
  310. goals/manifest.md +50 -0
  311. goals/monitoring.md +126 -0
  312. goals/mosa_workflow.md +463 -0
  313. goals/multi_agent_orchestration.md +68 -0
  314. goals/observability_traceability_xai.md +154 -0
  315. goals/owasp_agentic_security.md +395 -0
  316. goals/pr_intelligence.md +78 -0
  317. goals/requirements_intake.md +213 -0
  318. goals/secure_by_design.md +135 -0
  319. goals/security_scan.md +381 -0
  320. goals/self_healing.md +120 -0
  321. goals/simulation_engine.md +111 -0
  322. goals/subagent_review.md +205 -0
  323. goals/systematic_debugging.md +257 -0
  324. goals/tdd_workflow.md +403 -0
  325. goals/template_exchange.md +77 -0
  326. goals/thread_heatmap.md +77 -0
  327. goals/threat_modeler.md +77 -0
  328. goals/verification_iron_law.md +192 -0
  329. goals/vsm_dashboard.md +76 -0
  330. goals/writeguard.md +89 -0
  331. goals/zero_trust_architecture.md +403 -0
  332. hardprompts/__init__.py +6 -0
  333. hardprompts/agent/__init__.py +6 -0
  334. hardprompts/agent/agentic_architect.md +100 -0
  335. hardprompts/agent/debate_prompt.md +32 -0
  336. hardprompts/agent/fitness_evaluation.md +48 -0
  337. hardprompts/agent/governance_review.md +214 -0
  338. hardprompts/agent/reviewer_prompt.md +34 -0
  339. hardprompts/agent/skill_design.md +172 -0
  340. hardprompts/agent/task_decomposition.md +275 -0
  341. hardprompts/agent/veto_check_prompt.md +33 -0
  342. hardprompts/architect/__init__.py +6 -0
  343. hardprompts/architect/api_design.md +283 -0
  344. hardprompts/architect/data_model.md +277 -0
  345. hardprompts/architect/system_design.md +180 -0
  346. hardprompts/builder/__init__.py +6 -0
  347. hardprompts/builder/code_generation.md +59 -0
  348. hardprompts/builder/refactor.md +58 -0
  349. hardprompts/builder/scaffold_project.md +69 -0
  350. hardprompts/builder/test_generation.md +87 -0
  351. hardprompts/ci/__init__.py +6 -0
  352. hardprompts/ci/worktree_setup.md +35 -0
  353. hardprompts/compliance/__init__.py +6 -0
  354. hardprompts/compliance/cmmc_assessment.md +63 -0
  355. hardprompts/compliance/cssp_assessment.md +75 -0
  356. hardprompts/compliance/cui_marking.md +86 -0
  357. hardprompts/compliance/fedramp_assessment.md +55 -0
  358. hardprompts/compliance/ivv_assessment.md +96 -0
  359. hardprompts/compliance/poam_generation.md +57 -0
  360. hardprompts/compliance/sbd_assessment.md +101 -0
  361. hardprompts/compliance/security_categorization.md +74 -0
  362. hardprompts/compliance/ssp_generation.md +56 -0
  363. hardprompts/compliance/stig_evaluation.md +63 -0
  364. hardprompts/dashboard/__init__.py +6 -0
  365. hardprompts/dashboard/nlq_system_prompt.md +26 -0
  366. hardprompts/infra/__init__.py +6 -0
  367. hardprompts/infra/k8s_manifests.md +118 -0
  368. hardprompts/infra/pipeline_generation.md +160 -0
  369. hardprompts/infra/terraform_generation.md +92 -0
  370. hardprompts/integration/__init__.py +6 -0
  371. hardprompts/integration/approval_review.md +17 -0
  372. hardprompts/integration/jira_mapping.md +25 -0
  373. hardprompts/integration/servicenow_mapping.md +14 -0
  374. hardprompts/knowledge/__init__.py +6 -0
  375. hardprompts/knowledge/pattern_detection.md +73 -0
  376. hardprompts/knowledge/recommendation_engine.md +90 -0
  377. hardprompts/knowledge/root_cause_analysis.md +91 -0
  378. hardprompts/maintenance/__init__.py +6 -0
  379. hardprompts/maintenance/maintenance_assessment.md +82 -0
  380. hardprompts/mbse/__init__.py +6 -0
  381. hardprompts/mbse/digital_thread.md +67 -0
  382. hardprompts/mbse/model_import.md +62 -0
  383. hardprompts/mbse/model_to_code.md +65 -0
  384. hardprompts/modernization/__init__.py +6 -0
  385. hardprompts/modernization/legacy_analysis.md +93 -0
  386. hardprompts/modernization/migration_planning.md +150 -0
  387. hardprompts/modernization/seven_r_assessment.md +107 -0
  388. hardprompts/proposal_draft.md +53 -0
  389. hardprompts/rag_citation.md +12 -0
  390. hardprompts/rag_rerank.md +31 -0
  391. hardprompts/requirements/__init__.py +6 -0
  392. hardprompts/requirements/bdd_generation.md +35 -0
  393. hardprompts/requirements/clarification_prioritization.md +29 -0
  394. hardprompts/requirements/decomposition.md +60 -0
  395. hardprompts/requirements/document_extraction.md +45 -0
  396. hardprompts/requirements/gap_detection.md +70 -0
  397. hardprompts/requirements/intake_conversation.md +101 -0
  398. hardprompts/requirements/readiness_assessment.md +39 -0
  399. hardprompts/requirements/spec_quality.md +33 -0
  400. hardprompts/requirements/traceability_analysis.md +23 -0
  401. hardprompts/security/__init__.py +6 -0
  402. hardprompts/security/endpoint_security.md +78 -0
  403. hardprompts/security/threat_model.md +70 -0
  404. hardprompts/security/vulnerability_assessment.md +81 -0
  405. hardprompts/simulation/__init__.py +6 -0
  406. hardprompts/simulation/architecture_impact.md +27 -0
  407. hardprompts/simulation/coa_alternative.md +27 -0
  408. hardprompts/simulation/coa_generation.md +25 -0
  409. hardprompts/simulation/compliance_impact.md +28 -0
  410. hardprompts/simulation/cost_estimation.md +33 -0
  411. hardprompts/simulation/risk_assessment.md +28 -0
  412. hardprompts/translation/code_translation.md +68 -0
  413. hardprompts/translation/dependency_suggestion.md +44 -0
  414. hardprompts/translation/test_translation.md +64 -0
  415. hardprompts/translation/translation_repair.md +59 -0
  416. icdev-0.0.3.dist-info/METADATA +909 -0
  417. icdev-0.0.3.dist-info/RECORD +1214 -0
  418. icdev-0.0.3.dist-info/WHEEL +5 -0
  419. icdev-0.0.3.dist-info/entry_points.txt +9 -0
  420. icdev-0.0.3.dist-info/licenses/LICENSE +201 -0
  421. icdev-0.0.3.dist-info/licenses/NOTICE +11 -0
  422. icdev-0.0.3.dist-info/top_level.txt +7 -0
  423. memory/MEMORY.md +52 -0
  424. memory/logs/2026-02-14.md +17 -0
  425. memory/logs/2026-03-03.md +2 -0
  426. memory/logs/__init__.py +1 -0
  427. tools/a2a/icdev_callback_client.py +210 -0
  428. tools/agent/cards/architect_card.json +29 -0
  429. tools/agent/cards/builder_card.json +34 -0
  430. tools/agent/cards/compliance_card.json +29 -0
  431. tools/agent/cards/connector_forge_card.json +49 -0
  432. tools/agent/cards/devsecops_zta_card.json +24 -0
  433. tools/agent/cards/knowledge_card.json +29 -0
  434. tools/agent/cards/monitor_card.json +29 -0
  435. tools/agent/cards/orchestrator_card.json +29 -0
  436. tools/agent/cards/requirements_analyst_card.json +24 -0
  437. tools/agent/cards/security_card.json +29 -0
  438. tools/agent/cards/simulation_card.json +24 -0
  439. tools/agent/cards/supply_chain_card.json +24 -0
  440. tools/analysis/__init__.py +1 -0
  441. tools/analysis/code_analyzer.py +770 -0
  442. tools/analysis/runtime_feedback.py +379 -0
  443. tools/analytics/__init__.py +2 -0
  444. tools/analytics/scorecard.py +538 -0
  445. tools/analytics/vsm_engine.py +612 -0
  446. tools/architecture/__init__.py +2 -0
  447. tools/architecture/adr_extractor.py +393 -0
  448. tools/audit/__init__.py +1 -0
  449. tools/audit/audit_logger.py +199 -0
  450. tools/audit/audit_query.py +153 -0
  451. tools/audit/decision_recorder.py +73 -0
  452. tools/audit_engine/__init__.py +12 -0
  453. tools/audit_engine/ai_advisor.py +906 -0
  454. tools/audit_engine/cli.py +286 -0
  455. tools/audit_engine/comparator.py +305 -0
  456. tools/audit_engine/eject_scaffolder.py +399 -0
  457. tools/audit_engine/engine.py +614 -0
  458. tools/audit_engine/git_fetcher.py +341 -0
  459. tools/audit_engine/regime_loader.py +200 -0
  460. tools/audit_engine/regime_updater.py +325 -0
  461. tools/audit_engine/report_card.py +289 -0
  462. tools/audit_engine/scanner.py +684 -0
  463. tools/audit_engine/self_heal.py +1042 -0
  464. tools/ci/__init__.py +2 -0
  465. tools/ci/connectors/__init__.py +2 -0
  466. tools/ci/connectors/base_connector.py +80 -0
  467. tools/ci/connectors/connector_registry.py +188 -0
  468. tools/ci/connectors/mattermost_connector.py +159 -0
  469. tools/ci/connectors/slack_connector.py +197 -0
  470. tools/ci/core/__init__.py +2 -0
  471. tools/ci/core/air_gap_detector.py +115 -0
  472. tools/ci/core/comment_handler.py +192 -0
  473. tools/ci/core/conversation_manager.py +480 -0
  474. tools/ci/core/event_envelope.py +500 -0
  475. tools/ci/core/event_router.py +444 -0
  476. tools/ci/core/failure_parser.py +397 -0
  477. tools/ci/core/recovery_engine.py +527 -0
  478. tools/ci/gate_enforcer.py +361 -0
  479. tools/ci/modules/__init__.py +2 -0
  480. tools/ci/modules/agent.py +271 -0
  481. tools/ci/modules/git_ops.py +175 -0
  482. tools/ci/modules/state.py +117 -0
  483. tools/ci/modules/vcs.py +303 -0
  484. tools/ci/modules/workflow_ops.py +295 -0
  485. tools/ci/modules/worktree.py +337 -0
  486. tools/ci/pipeline_config_generator.py +558 -0
  487. tools/ci/pr_intelligence.py +485 -0
  488. tools/ci/triggers/__init__.py +2 -0
  489. tools/ci/triggers/gitlab_task_monitor.py +327 -0
  490. tools/ci/triggers/poll_trigger.py +237 -0
  491. tools/ci/triggers/webhook_server.py +356 -0
  492. tools/ci/workflows/__init__.py +2 -0
  493. tools/ci/workflows/icdev_build.py +140 -0
  494. tools/ci/workflows/icdev_comply.py +284 -0
  495. tools/ci/workflows/icdev_document.py +152 -0
  496. tools/ci/workflows/icdev_e2e.py +188 -0
  497. tools/ci/workflows/icdev_patch.py +186 -0
  498. tools/ci/workflows/icdev_plan.py +202 -0
  499. tools/ci/workflows/icdev_plan_build.py +41 -0
  500. tools/ci/workflows/icdev_plan_build_test.py +46 -0
  501. tools/ci/workflows/icdev_plan_build_test_review.py +47 -0
  502. tools/ci/workflows/icdev_review.py +126 -0
  503. tools/ci/workflows/icdev_sdlc.py +261 -0
  504. tools/ci/workflows/icdev_test.py +240 -0
  505. tools/cli/__init__.py +1 -0
  506. tools/cli/output_formatter.py +756 -0
  507. tools/cloudforge/__init__.py +12 -0
  508. tools/cloudforge/airgap/__init__.py +2 -0
  509. tools/cloudforge/airgap/il_classifier.py +70 -0
  510. tools/cloudforge/airgap/offline_validator.py +42 -0
  511. tools/cloudforge/airgap/shift_emulator.py +155 -0
  512. tools/cloudforge/airgap/sneakernet.py +91 -0
  513. tools/cloudforge/cd_hub/__init__.py +2 -0
  514. tools/cloudforge/cd_hub/canary_deployer.py +88 -0
  515. tools/cloudforge/cd_hub/gitops_renderer.py +123 -0
  516. tools/cloudforge/cd_hub/hub_controller.py +143 -0
  517. tools/cloudforge/cd_hub/pipeline_bridge.py +30 -0
  518. tools/cloudforge/cd_hub/rollback_engine.py +29 -0
  519. tools/cloudforge/cd_hub/spoke_agent.py +51 -0
  520. tools/cloudforge/compliance/__init__.py +2 -0
  521. tools/cloudforge/compliance/ato_accelerator.py +272 -0
  522. tools/cloudforge/compliance/control_inheritor.py +127 -0
  523. tools/cloudforge/compliance/evidence_generator.py +129 -0
  524. tools/cloudforge/compliance/poam_bridge.py +41 -0
  525. tools/cloudforge/compliance/ssp_bridge.py +52 -0
  526. tools/cloudforge/compliance/stig_bridge.py +41 -0
  527. tools/cloudforge/container_forge/__init__.py +2 -0
  528. tools/cloudforge/container_forge/bigbang_renderer.py +85 -0
  529. tools/cloudforge/container_forge/hardener.py +169 -0
  530. tools/cloudforge/container_forge/image_scanner_bridge.py +33 -0
  531. tools/cloudforge/container_forge/runtime_policy.py +87 -0
  532. tools/cloudforge/container_forge/sbom_bridge.py +42 -0
  533. tools/cloudforge/finops/__init__.py +2 -0
  534. tools/cloudforge/finops/anomaly_detector.py +78 -0
  535. tools/cloudforge/finops/budget_tracker.py +96 -0
  536. tools/cloudforge/finops/chargeback.py +69 -0
  537. tools/cloudforge/finops/cost_collector.py +141 -0
  538. tools/cloudforge/finops/optimizer.py +55 -0
  539. tools/cloudforge/hybrid/__init__.py +2 -0
  540. tools/cloudforge/hybrid/connection_manager.py +141 -0
  541. tools/cloudforge/hybrid/dns_federator.py +56 -0
  542. tools/cloudforge/hybrid/health_monitor.py +108 -0
  543. tools/cloudforge/hybrid/identity_federator.py +53 -0
  544. tools/cloudforge/hybrid/network_bridge.py +68 -0
  545. tools/cloudforge/hybrid/topology_manager.py +147 -0
  546. tools/cloudforge/hybrid/workload_abstractor.py +92 -0
  547. tools/cloudforge/iac/__init__.py +2 -0
  548. tools/cloudforge/iac/drift_detector.py +154 -0
  549. tools/cloudforge/iac/module_library.py +265 -0
  550. tools/cloudforge/iac/opentofu_adapter.py +89 -0
  551. tools/cloudforge/iac/pulumi_renderer.py +292 -0
  552. tools/cloudforge/iac/state_backend.py +146 -0
  553. tools/cloudforge/iac/terraform_renderer.py +626 -0
  554. tools/cloudforge/landing_zone/__init__.py +2 -0
  555. tools/cloudforge/landing_zone/blueprint_loader.py +98 -0
  556. tools/cloudforge/landing_zone/blueprint_validator.py +113 -0
  557. tools/cloudforge/landing_zone/zone_provisioner.py +306 -0
  558. tools/cloudforge/landing_zone/zone_state.py +143 -0
  559. tools/cloudforge/mbse_thread/__init__.py +2 -0
  560. tools/cloudforge/mbse_thread/ato_thread_weaver.py +111 -0
  561. tools/cloudforge/mbse_thread/control_tracer.py +68 -0
  562. tools/cloudforge/mbse_thread/system_boundary.py +83 -0
  563. tools/cloudforge/metastore/__init__.py +2 -0
  564. tools/cloudforge/metastore/dependency_graph.py +202 -0
  565. tools/cloudforge/metastore/discovery.py +192 -0
  566. tools/cloudforge/metastore/registry.py +185 -0
  567. tools/cloudforge/metastore/rto_tracker.py +92 -0
  568. tools/cloudforge/metastore/runbook_linker.py +82 -0
  569. tools/cloudforge/migration/__init__.py +2 -0
  570. tools/cloudforge/migration/assessor.py +187 -0
  571. tools/cloudforge/migration/cutover_orchestrator.py +117 -0
  572. tools/cloudforge/migration/databridge_bridge.py +92 -0
  573. tools/cloudforge/migration/planner.py +98 -0
  574. tools/cloudforge/migration/risk_scorer.py +97 -0
  575. tools/cloudforge/migration/validation_runner.py +45 -0
  576. tools/cloudforge/migration/workload_inventory.py +107 -0
  577. tools/cloudforge/provider.py +319 -0
  578. tools/cloudforge/providers/__init__.py +2 -0
  579. tools/cloudforge/providers/aws_commercial.py +92 -0
  580. tools/cloudforge/providers/aws_govcloud.py +229 -0
  581. tools/cloudforge/providers/aws_secret.py +83 -0
  582. tools/cloudforge/providers/azure_commercial.py +80 -0
  583. tools/cloudforge/providers/azure_gov.py +91 -0
  584. tools/cloudforge/providers/azure_secret.py +71 -0
  585. tools/cloudforge/providers/gcp.py +102 -0
  586. tools/cloudforge/providers/oci.py +102 -0
  587. tools/cloudforge/registry.py +140 -0
  588. tools/cloudforge/runbooks/__init__.py +2 -0
  589. tools/cloudforge/runbooks/ai_generator.py +119 -0
  590. tools/cloudforge/runbooks/dag_validator.py +219 -0
  591. tools/cloudforge/runbooks/engine.py +470 -0
  592. tools/cloudforge/runbooks/models.py +99 -0
  593. tools/cloudforge/runbooks/snippet_library.py +158 -0
  594. tools/cloudforge/runbooks/template_loader.py +122 -0
  595. tools/cloudforge/runbooks/visualization.py +108 -0
  596. tools/cloudforge/siem/__init__.py +2 -0
  597. tools/cloudforge/siem/alert_rules.py +86 -0
  598. tools/cloudforge/siem/correlation_engine.py +61 -0
  599. tools/cloudforge/siem/log_aggregator.py +113 -0
  600. tools/cloudforge/siem/siem_dashboard_data.py +28 -0
  601. tools/cloudforge/supply_chain/__init__.py +2 -0
  602. tools/cloudforge/supply_chain/bridge.py +33 -0
  603. tools/cloudforge/supply_chain/iac_dependency_scanner.py +36 -0
  604. tools/cloudforge/supply_chain/provider_trust_scorer.py +54 -0
  605. tools/compat/__init__.py +21 -0
  606. tools/compat/cli_harmonizer.py +251 -0
  607. tools/compat/datetime_utils.py +18 -0
  608. tools/compat/db_utils.py +190 -0
  609. tools/compat/platform_utils.py +123 -0
  610. tools/compliance/__init__.py +1 -0
  611. tools/compliance/accountability_manager.py +391 -0
  612. tools/compliance/ai_accountability_audit.py +287 -0
  613. tools/compliance/ai_impact_assessor.py +267 -0
  614. tools/compliance/ai_incident_response.py +295 -0
  615. tools/compliance/ai_inventory_manager.py +233 -0
  616. tools/compliance/ai_reassessment_scheduler.py +250 -0
  617. tools/compliance/ai_transparency_audit.py +247 -0
  618. tools/compliance/atlas_assessor.py +276 -0
  619. tools/compliance/atlas_report_generator.py +1199 -0
  620. tools/compliance/base_assessor.py +591 -0
  621. tools/compliance/cato_live_engine.py +607 -0
  622. tools/compliance/cato_monitor.py +1371 -0
  623. tools/compliance/cato_scheduler.py +698 -0
  624. tools/compliance/cjis_assessor.py +76 -0
  625. tools/compliance/classification_manager.py +1340 -0
  626. tools/compliance/cmmc_assessor.py +1478 -0
  627. tools/compliance/cmmc_report_generator.py +1087 -0
  628. tools/compliance/compliance_detector.py +452 -0
  629. tools/compliance/compliance_exporter.py +418 -0
  630. tools/compliance/compliance_status.py +810 -0
  631. tools/compliance/control_mapper.py +488 -0
  632. tools/compliance/crosswalk_engine.py +1208 -0
  633. tools/compliance/cssp_assessor.py +1032 -0
  634. tools/compliance/cssp_evidence_collector.py +716 -0
  635. tools/compliance/cssp_report_generator.py +1103 -0
  636. tools/compliance/cui_marker.py +387 -0
  637. tools/compliance/diagram_validator.py +599 -0
  638. tools/compliance/emass/__init__.py +2 -0
  639. tools/compliance/emass/emass_client.py +822 -0
  640. tools/compliance/emass/emass_export.py +758 -0
  641. tools/compliance/emass/emass_sync.py +807 -0
  642. tools/compliance/eu_ai_act_classifier.py +193 -0
  643. tools/compliance/evidence_collector.py +459 -0
  644. tools/compliance/fairness_assessor.py +310 -0
  645. tools/compliance/fedramp_20x_ksi_emitter.py +692 -0
  646. tools/compliance/fedramp_assessor.py +1795 -0
  647. tools/compliance/fedramp_authorization_packager.py +137 -0
  648. tools/compliance/fedramp_ksi_generator.py +349 -0
  649. tools/compliance/fedramp_report_generator.py +1115 -0
  650. tools/compliance/fips199_categorizer.py +869 -0
  651. tools/compliance/fips200_validator.py +304 -0
  652. tools/compliance/firmware_sbom.py +646 -0
  653. tools/compliance/gao_ai_assessor.py +228 -0
  654. tools/compliance/gao_evidence_builder.py +302 -0
  655. tools/compliance/hipaa_assessor.py +78 -0
  656. tools/compliance/hitrust_assessor.py +49 -0
  657. tools/compliance/incident_response_plan.py +705 -0
  658. tools/compliance/inheritance_engine.py +693 -0
  659. tools/compliance/iso27001_assessor.py +92 -0
  660. tools/compliance/iso42001_assessor.py +114 -0
  661. tools/compliance/ivv_assessor.py +2314 -0
  662. tools/compliance/ivv_report_generator.py +1649 -0
  663. tools/compliance/model_card_generator.py +291 -0
  664. tools/compliance/mosa_assessor.py +117 -0
  665. tools/compliance/multi_regime_assessor.py +441 -0
  666. tools/compliance/narrative_generator.py +1012 -0
  667. tools/compliance/narrative_quality_gate.py +701 -0
  668. tools/compliance/narrative_workflow.py +814 -0
  669. tools/compliance/nist_800_207_assessor.py +191 -0
  670. tools/compliance/nist_ai_600_1_assessor.py +185 -0
  671. tools/compliance/nist_ai_rmf_assessor.py +110 -0
  672. tools/compliance/nist_lookup.py +244 -0
  673. tools/compliance/omb_m25_21_assessor.py +225 -0
  674. tools/compliance/omb_m26_04_assessor.py +185 -0
  675. tools/compliance/oscal_catalog_adapter.py +395 -0
  676. tools/compliance/oscal_generator.py +2157 -0
  677. tools/compliance/oscal_tools.py +1182 -0
  678. tools/compliance/oscal_validator.py +692 -0
  679. tools/compliance/owasp_agentic_assessor.py +227 -0
  680. tools/compliance/owasp_asi_assessor.py +197 -0
  681. tools/compliance/owasp_llm_assessor.py +245 -0
  682. tools/compliance/pci_dss_assessor.py +80 -0
  683. tools/compliance/pi_compliance_tracker.py +1447 -0
  684. tools/compliance/poam_generator.py +388 -0
  685. tools/compliance/resolve_marking.py +272 -0
  686. tools/compliance/sbd_assessor.py +2070 -0
  687. tools/compliance/sbd_report_generator.py +1223 -0
  688. tools/compliance/sbom_generator.py +993 -0
  689. tools/compliance/siem_config_generator.py +661 -0
  690. tools/compliance/slsa_attestation_generator.py +479 -0
  691. tools/compliance/soc2_assessor.py +77 -0
  692. tools/compliance/ssp_generator.py +556 -0
  693. tools/compliance/stig_checker.py +712 -0
  694. tools/compliance/swft_evidence_bundler.py +326 -0
  695. tools/compliance/system_card_generator.py +303 -0
  696. tools/compliance/template_exchange.py +513 -0
  697. tools/compliance/traceability_matrix.py +1268 -0
  698. tools/compliance/universal_classification_manager.py +1159 -0
  699. tools/compliance/xacta/__init__.py +2 -0
  700. tools/compliance/xacta/xacta_client.py +438 -0
  701. tools/compliance/xacta/xacta_export.py +546 -0
  702. tools/compliance/xacta/xacta_sync.py +322 -0
  703. tools/compliance/xai_assessor.py +231 -0
  704. tools/core/__init__.py +2 -0
  705. tools/core/circuit_breaker.py +353 -0
  706. tools/core/compliance_sidecar.py +344 -0
  707. tools/core/container.py +110 -0
  708. tools/core/errors.py +256 -0
  709. tools/core/feature_flags.py +311 -0
  710. tools/core/task_dlq.py +350 -0
  711. tools/dashboard/__init__.py +2 -0
  712. tools/dashboard/app.py +6288 -0
  713. tools/dashboard/templates/agent_evolution.html +287 -0
  714. tools/dashboard/templates/agents/list.html +71 -0
  715. tools/dashboard/templates/agents.html +132 -0
  716. tools/dashboard/templates/architecture.html +289 -0
  717. tools/dashboard/templates/ato_simulator.html +170 -0
  718. tools/dashboard/templates/audit_engine.html +844 -0
  719. tools/dashboard/templates/base.html +236 -0
  720. tools/dashboard/templates/cato_live.html +116 -0
  721. tools/dashboard/templates/cloudforge.html +195 -0
  722. tools/dashboard/templates/cloudforge_finops.html +111 -0
  723. tools/dashboard/templates/cloudforge_hybrid.html +122 -0
  724. tools/dashboard/templates/cloudforge_metastore.html +234 -0
  725. tools/dashboard/templates/cloudforge_migration.html +87 -0
  726. tools/dashboard/templates/cloudforge_runbooks.html +201 -0
  727. tools/dashboard/templates/cloudforge_siem.html +94 -0
  728. tools/dashboard/templates/compliance_accel.html +292 -0
  729. tools/dashboard/templates/crashes.html +122 -0
  730. tools/dashboard/templates/databridge.html +305 -0
  731. tools/dashboard/templates/databridge_analytics.html +195 -0
  732. tools/dashboard/templates/databridge_mapping.html +345 -0
  733. tools/dashboard/templates/databridge_messaging.html +321 -0
  734. tools/dashboard/templates/decisions.html +258 -0
  735. tools/dashboard/templates/devices.html +151 -0
  736. tools/dashboard/templates/devsecops_maturity.html +278 -0
  737. tools/dashboard/templates/edge_ai.html +128 -0
  738. tools/dashboard/templates/firmware.html +120 -0
  739. tools/dashboard/templates/firmware_sbom.html +193 -0
  740. tools/dashboard/templates/forge_hub.html +196 -0
  741. tools/dashboard/templates/forge_studio.html +379 -0
  742. tools/dashboard/templates/forge_studio_analytics.html +360 -0
  743. tools/dashboard/templates/forge_studio_builder.html +1637 -0
  744. tools/dashboard/templates/forge_studio_compliance.html +310 -0
  745. tools/dashboard/templates/forge_studio_deploy.html +573 -0
  746. tools/dashboard/templates/forge_studio_enterprise.html +888 -0
  747. tools/dashboard/templates/forge_studio_marketplace.html +502 -0
  748. tools/dashboard/templates/forge_studio_workflow.html +696 -0
  749. tools/dashboard/templates/golden_path.html +175 -0
  750. tools/dashboard/templates/govcon.html +280 -0
  751. tools/dashboard/templates/harness.html +148 -0
  752. tools/dashboard/templates/index.html +207 -0
  753. tools/dashboard/templates/intelligence.html +336 -0
  754. tools/dashboard/templates/knowledge/index.html +190 -0
  755. tools/dashboard/templates/knowledge_graph.html +739 -0
  756. tools/dashboard/templates/login.html +51 -0
  757. tools/dashboard/templates/marketplace.html +336 -0
  758. tools/dashboard/templates/marketplace_admin.html +247 -0
  759. tools/dashboard/templates/missions.html +403 -0
  760. tools/dashboard/templates/narratives.html +154 -0
  761. tools/dashboard/templates/pr_intelligence.html +151 -0
  762. tools/dashboard/templates/proposals/detail.html +300 -0
  763. tools/dashboard/templates/proposals/list.html +52 -0
  764. tools/dashboard/templates/proposals/sam_detail.html +132 -0
  765. tools/dashboard/templates/proposals/section_detail.html +375 -0
  766. tools/dashboard/templates/research.html +222 -0
  767. tools/dashboard/templates/resilience.html +300 -0
  768. tools/dashboard/templates/scorecard.html +162 -0
  769. tools/dashboard/templates/simulator.html +131 -0
  770. tools/dashboard/templates/template_exchange.html +147 -0
  771. tools/dashboard/templates/thread_heatmap.html +151 -0
  772. tools/dashboard/templates/threat_model.html +195 -0
  773. tools/dashboard/templates/vsm.html +141 -0
  774. tools/dashboard/templates/writeguard.html +277 -0
  775. tools/databridge/__init__.py +5 -0
  776. tools/databridge/agent/__init__.py +2 -0
  777. tools/databridge/agent/daemon.py +227 -0
  778. tools/databridge/agent/tunnel.py +101 -0
  779. tools/databridge/agent/ws_relay.py +91 -0
  780. tools/databridge/analytics.py +167 -0
  781. tools/databridge/arrow_pipeline.py +327 -0
  782. tools/databridge/connection_manager.py +424 -0
  783. tools/databridge/connector.py +331 -0
  784. tools/databridge/connectors/__init__.py +2 -0
  785. tools/databridge/connectors/argocd_connector.py +160 -0
  786. tools/databridge/connectors/avro_connector.py +203 -0
  787. tools/databridge/connectors/azure_blob.py +63 -0
  788. tools/databridge/connectors/cdc_connector.py +205 -0
  789. tools/databridge/connectors/csv_connector.py +172 -0
  790. tools/databridge/connectors/datadog_connector.py +153 -0
  791. tools/databridge/connectors/discord_messaging.py +215 -0
  792. tools/databridge/connectors/dynamics365.py +151 -0
  793. tools/databridge/connectors/elasticsearch_connector.py +145 -0
  794. tools/databridge/connectors/email_base.py +114 -0
  795. tools/databridge/connectors/excel_connector.py +175 -0
  796. tools/databridge/connectors/fsspec_base.py +300 -0
  797. tools/databridge/connectors/gcs.py +53 -0
  798. tools/databridge/connectors/github_connector.py +138 -0
  799. tools/databridge/connectors/gitlab_connector.py +132 -0
  800. tools/databridge/connectors/gmail_connector.py +182 -0
  801. tools/databridge/connectors/hdfs.py +57 -0
  802. tools/databridge/connectors/health_base.py +401 -0
  803. tools/databridge/connectors/hubspot.py +124 -0
  804. tools/databridge/connectors/imap_connector.py +171 -0
  805. tools/databridge/connectors/jenkins_connector.py +138 -0
  806. tools/databridge/connectors/jira_connector.py +86 -0
  807. tools/databridge/connectors/json_connector.py +184 -0
  808. tools/databridge/connectors/kafka_connector.py +246 -0
  809. tools/databridge/connectors/kinesis_connector.py +238 -0
  810. tools/databridge/connectors/local_fs.py +30 -0
  811. tools/databridge/connectors/matrix.py +197 -0
  812. tools/databridge/connectors/mattermost_messaging.py +184 -0
  813. tools/databridge/connectors/messaging_base.py +172 -0
  814. tools/databridge/connectors/mssql.py +63 -0
  815. tools/databridge/connectors/mysql.py +57 -0
  816. tools/databridge/connectors/netsuite.py +170 -0
  817. tools/databridge/connectors/o365_mail.py +196 -0
  818. tools/databridge/connectors/oracle.py +65 -0
  819. tools/databridge/connectors/pagerduty_connector.py +162 -0
  820. tools/databridge/connectors/parquet_connector.py +131 -0
  821. tools/databridge/connectors/postgresql.py +58 -0
  822. tools/databridge/connectors/s3.py +65 -0
  823. tools/databridge/connectors/saas_base.py +198 -0
  824. tools/databridge/connectors/salesforce.py +126 -0
  825. tools/databridge/connectors/sap.py +89 -0
  826. tools/databridge/connectors/servicenow.py +60 -0
  827. tools/databridge/connectors/signal_messaging.py +150 -0
  828. tools/databridge/connectors/slack_messaging.py +203 -0
  829. tools/databridge/connectors/smtp_connector.py +126 -0
  830. tools/databridge/connectors/soap_base.py +258 -0
  831. tools/databridge/connectors/splunk_connector.py +171 -0
  832. tools/databridge/connectors/sql_base.py +310 -0
  833. tools/databridge/connectors/sqlite_connector.py +76 -0
  834. tools/databridge/connectors/teams.py +148 -0
  835. tools/databridge/connectors/telegram.py +192 -0
  836. tools/databridge/connectors/whatsapp.py +137 -0
  837. tools/databridge/data_profiler.py +99 -0
  838. tools/databridge/forge/__init__.py +6 -0
  839. tools/databridge/forge/base_selector.py +150 -0
  840. tools/databridge/forge/code_generator.py +206 -0
  841. tools/databridge/forge/community_hub.py +539 -0
  842. tools/databridge/forge/forge_agent.py +306 -0
  843. tools/databridge/forge/import_handler.py +133 -0
  844. tools/databridge/forge/integration_tester.py +127 -0
  845. tools/databridge/forge/marketplace_publisher.py +164 -0
  846. tools/databridge/forge/promoter.py +159 -0
  847. tools/databridge/forge/sandbox_manager.py +257 -0
  848. tools/databridge/forge/spec_parser.py +358 -0
  849. tools/databridge/forge/static_validator.py +363 -0
  850. tools/databridge/forge/templates/__init__.py +591 -0
  851. tools/databridge/format_converter.py +188 -0
  852. tools/databridge/mapping_engine.py +348 -0
  853. tools/databridge/messaging/__init__.py +5 -0
  854. tools/databridge/messaging/agent_bridge.py +254 -0
  855. tools/databridge/messaging/message_envelope.py +111 -0
  856. tools/databridge/messaging/message_logger.py +204 -0
  857. tools/databridge/messaging/messaging_daemon.py +326 -0
  858. tools/databridge/messaging/oauth2_manager.py +411 -0
  859. tools/databridge/pii_detector.py +221 -0
  860. tools/databridge/registry.py +352 -0
  861. tools/databridge/relay_server.py +105 -0
  862. tools/databridge/scale/__init__.py +16 -0
  863. tools/databridge/scale/backpressure.py +134 -0
  864. tools/databridge/scale/chunked_pipeline.py +169 -0
  865. tools/databridge/scale/connection_pool.py +293 -0
  866. tools/databridge/scale/engine.py +492 -0
  867. tools/databridge/scale/worker_pool.py +140 -0
  868. tools/databridge/scale/write_batcher.py +250 -0
  869. tools/databridge/schema_engine.py +324 -0
  870. tools/databridge/stream_manager.py +225 -0
  871. tools/databridge/sync_engine.py +411 -0
  872. tools/databridge/transforms.py +302 -0
  873. tools/db/__init__.py +1 -0
  874. tools/db/backup.py +312 -0
  875. tools/db/backup_manager.py +832 -0
  876. tools/db/init_icdev_db.py +7753 -0
  877. tools/db/init_sparkpilot_db.py +431 -0
  878. tools/db/migrate.py +177 -0
  879. tools/db/migrate_innovation_audit.py +165 -0
  880. tools/db/migration_runner.py +548 -0
  881. tools/db/migrations/001_baseline/meta.json +9 -0
  882. tools/db/migrations/001_baseline/up.py +67 -0
  883. tools/db/migrations/002_memory_enhancements/down.sql +8 -0
  884. tools/db/migrations/002_memory_enhancements/meta.json +9 -0
  885. tools/db/migrations/002_memory_enhancements/up.py +119 -0
  886. tools/db/migrations/003_dev_profiles/meta.json +8 -0
  887. tools/db/migrations/003_dev_profiles/up.py +93 -0
  888. tools/db/migrations/004_innovation_engine/down.py +19 -0
  889. tools/db/migrations/004_innovation_engine/up.py +227 -0
  890. tools/db/migrations/005_phase_37_ai_security/down.py +19 -0
  891. tools/db/migrations/005_phase_37_ai_security/up.py +257 -0
  892. tools/db/migrations/006_phase_36_evolution/down.py +21 -0
  893. tools/db/migrations/006_phase_36_evolution/up.py +323 -0
  894. tools/db/migrations/007_phase_38_cloud/down.py +14 -0
  895. tools/db/migrations/007_phase_38_cloud/up.py +110 -0
  896. tools/db/migrations/008_phase36_37_integration/up.py +55 -0
  897. tools/db/migrations/__init__.py +2 -0
  898. tools/db/pg_migrate.py +642 -0
  899. tools/db/storage.py +1080 -0
  900. tools/decisions/__init__.py +2 -0
  901. tools/decisions/dmn_engine.py +695 -0
  902. tools/devsecops/__init__.py +2 -0
  903. tools/devsecops/attestation_manager.py +449 -0
  904. tools/devsecops/network_segmentation_generator.py +604 -0
  905. tools/devsecops/pdp_config_generator.py +1246 -0
  906. tools/devsecops/pipeline_security_generator.py +475 -0
  907. tools/devsecops/policy_generator.py +644 -0
  908. tools/devsecops/profile_manager.py +374 -0
  909. tools/devsecops/service_mesh_generator.py +1063 -0
  910. tools/devsecops/zta_maturity_scorer.py +355 -0
  911. tools/devsecops/zta_terraform_generator.py +1301 -0
  912. tools/edge_ai/__init__.py +2 -0
  913. tools/edge_ai/model_manager.py +200 -0
  914. tools/embedded/__init__.py +2 -0
  915. tools/embedded/cmake_generator.py +318 -0
  916. tools/embedded/crash_analyzer.py +191 -0
  917. tools/embedded/nl_to_firmware.py +277 -0
  918. tools/events/__init__.py +1 -0
  919. tools/events/event_bus.py +199 -0
  920. tools/finetune/pair_generator.py +832 -0
  921. tools/fleet/__init__.py +2 -0
  922. tools/fleet/device_registry.py +148 -0
  923. tools/fleet/ota_manager.py +153 -0
  924. tools/forge_studio/__init__.py +13 -0
  925. tools/forge_studio/analytics/__init__.py +0 -0
  926. tools/forge_studio/analytics/process_miner.py +383 -0
  927. tools/forge_studio/audit.py +183 -0
  928. tools/forge_studio/blueprint/__init__.py +2 -0
  929. tools/forge_studio/blueprint/build_tracker.py +317 -0
  930. tools/forge_studio/blueprint/export_engine.py +441 -0
  931. tools/forge_studio/blueprint/parent_client.py +335 -0
  932. tools/forge_studio/catalog/__init__.py +2 -0
  933. tools/forge_studio/catalog/component_registry.py +176 -0
  934. tools/forge_studio/catalog/schema_validator.py +193 -0
  935. tools/forge_studio/compliance/__init__.py +1 -0
  936. tools/forge_studio/compliance/compliance_wiring.py +554 -0
  937. tools/forge_studio/deploy/__init__.py +1 -0
  938. tools/forge_studio/deploy/airgap_packager.py +466 -0
  939. tools/forge_studio/deploy/deploy_engine.py +1792 -0
  940. tools/forge_studio/deploy/env_manager.py +431 -0
  941. tools/forge_studio/eject/__init__.py +2 -0
  942. tools/forge_studio/eject/docker_compose_generator.py +237 -0
  943. tools/forge_studio/eject/eject_engine.py +230 -0
  944. tools/forge_studio/eject/expo_scaffolder.py +303 -0
  945. tools/forge_studio/eject/nextjs_scaffolder.py +338 -0
  946. tools/forge_studio/enterprise/__init__.py +0 -0
  947. tools/forge_studio/enterprise/custom_frameworks.py +826 -0
  948. tools/forge_studio/enterprise/hardening_engine.py +1530 -0
  949. tools/forge_studio/enterprise/sso_manager.py +718 -0
  950. tools/forge_studio/enterprise/whitelabel_engine.py +887 -0
  951. tools/forge_studio/formula/__init__.py +0 -0
  952. tools/forge_studio/formula/expression_engine.py +562 -0
  953. tools/forge_studio/formula/formula_registry.py +265 -0
  954. tools/forge_studio/generator/__init__.py +2 -0
  955. tools/forge_studio/generator/app_generator.py +584 -0
  956. tools/forge_studio/generator/complexity_detector.py +368 -0
  957. tools/forge_studio/generator/prompt_templates.py +104 -0
  958. tools/forge_studio/generator/spec_builder.py +192 -0
  959. tools/forge_studio/intake_bridge.py +898 -0
  960. tools/forge_studio/marketplace/__init__.py +0 -0
  961. tools/forge_studio/marketplace/component_hub.py +428 -0
  962. tools/forge_studio/models.py +369 -0
  963. tools/forge_studio/renderer/__init__.py +2 -0
  964. tools/forge_studio/renderer/json_render_engine.py +623 -0
  965. tools/forge_studio/renderer/layout_engine.py +214 -0
  966. tools/forge_studio/renderer/rn_component_map.py +182 -0
  967. tools/forge_studio/supabase/__init__.py +2 -0
  968. tools/forge_studio/supabase/auth_generator.py +283 -0
  969. tools/forge_studio/supabase/migration_generator.py +93 -0
  970. tools/forge_studio/supabase/schema_generator.py +281 -0
  971. tools/forge_studio/tenant_manager.py +387 -0
  972. tools/forge_studio/workflow/__init__.py +2 -0
  973. tools/forge_studio/workflow/bpmn_adapter.py +489 -0
  974. tools/govcon/draft_orchestrator.py +1151 -0
  975. tools/govcon/engine_enrichment.py +373 -0
  976. tools/govcon/knowledge_base.py +487 -0
  977. tools/govcon/knowledge_ingestion.py +510 -0
  978. tools/govcon/sam_scanner.py +754 -0
  979. tools/harness/__init__.py +6 -0
  980. tools/harness/exit_criteria_evaluator.py +231 -0
  981. tools/harness/maturity_assessor.py +347 -0
  982. tools/harness/scaffold_harness.py +416 -0
  983. tools/harness/trace_analyzer.py +281 -0
  984. tools/infra/__init__.py +1 -0
  985. tools/infra/ansible_generator.py +867 -0
  986. tools/infra/dockerfile_generator.py +359 -0
  987. tools/infra/infra_status.py +384 -0
  988. tools/infra/ironbank_metadata_generator.py +403 -0
  989. tools/infra/k8s_generator.py +1000 -0
  990. tools/infra/pipeline_generator.py +830 -0
  991. tools/infra/rollback.py +389 -0
  992. tools/infra/terraform_generator.py +1140 -0
  993. tools/infra/terraform_generator_azure.py +1252 -0
  994. tools/infra/terraform_generator_gcp.py +951 -0
  995. tools/infra/terraform_generator_ibm.py +359 -0
  996. tools/infra/terraform_generator_oci.py +918 -0
  997. tools/infra/terraform_generator_onprem.py +318 -0
  998. tools/knowledge/__init__.py +1 -0
  999. tools/knowledge/knowledge_ingest.py +281 -0
  1000. tools/knowledge/pattern_detector.py +681 -0
  1001. tools/knowledge/recommendation_engine.py +449 -0
  1002. tools/knowledge/self_heal_analyzer.py +492 -0
  1003. tools/knowledge_graph/__init__.py +2 -0
  1004. tools/knowledge_graph/graph_rag.py +498 -0
  1005. tools/knowledge_graph/ingester.py +406 -0
  1006. tools/knowledge_graph/insight_generator.py +369 -0
  1007. tools/knowledge_graph/text_network.py +832 -0
  1008. tools/llm/__init__.py +72 -0
  1009. tools/llm/anthropic_provider.py +170 -0
  1010. tools/llm/azure_openai_provider.py +338 -0
  1011. tools/llm/bedrock_provider.py +315 -0
  1012. tools/llm/embedding_provider.py +438 -0
  1013. tools/llm/gemini_provider.py +381 -0
  1014. tools/llm/ibm_watsonx_provider.py +231 -0
  1015. tools/llm/oci_genai_provider.py +462 -0
  1016. tools/llm/ollama_provider.py +350 -0
  1017. tools/llm/openai_provider.py +225 -0
  1018. tools/llm/prompt_registry.py +447 -0
  1019. tools/llm/provider.py +355 -0
  1020. tools/llm/provider_sdk.py +175 -0
  1021. tools/llm/router.py +1124 -0
  1022. tools/llm/semantic_cache.py +394 -0
  1023. tools/llm/vertex_ai_provider.py +374 -0
  1024. tools/maintenance/__init__.py +2 -0
  1025. tools/maintenance/dependency_scanner.py +1016 -0
  1026. tools/maintenance/maintenance_auditor.py +804 -0
  1027. tools/maintenance/remediation_engine.py +957 -0
  1028. tools/maintenance/vulnerability_checker.py +978 -0
  1029. tools/manifest.md +1066 -0
  1030. tools/marketplace/asset_installer.py +639 -0
  1031. tools/marketplace/feedback_validator.py +359 -0
  1032. tools/marketplace/license_client.py +458 -0
  1033. tools/marketplace/module_crypto.py +544 -0
  1034. tools/marketplace/module_runtime.py +236 -0
  1035. tools/marketplace/token_store.py +264 -0
  1036. tools/mbse/__init__.py +3 -0
  1037. tools/mbse/des_assessor.py +1173 -0
  1038. tools/mbse/des_report_generator.py +787 -0
  1039. tools/mbse/diagram_extractor.py +792 -0
  1040. tools/mbse/digital_thread.py +1650 -0
  1041. tools/mbse/model_code_generator.py +1115 -0
  1042. tools/mbse/model_control_mapper.py +410 -0
  1043. tools/mbse/pi_model_tracker.py +1079 -0
  1044. tools/mbse/reqif_parser.py +1468 -0
  1045. tools/mbse/sync_engine.py +1789 -0
  1046. tools/mbse/thread_heatmap.py +445 -0
  1047. tools/mbse/xmi_parser.py +1558 -0
  1048. tools/mcp/builder_server.py +64 -0
  1049. tools/mcp/compliance_server.py +64 -0
  1050. tools/mcp/connector_forge_server.py +155 -0
  1051. tools/mcp/core_server.py +64 -0
  1052. tools/mcp/devsecops_server.py +11 -0
  1053. tools/mcp/devsecops_zta_server.py +64 -0
  1054. tools/mcp/knowledge_server.py +64 -0
  1055. tools/mcp/monitor_server.py +64 -0
  1056. tools/mcp/ops_server.py +300 -0
  1057. tools/mcp/requirements_analyst_server.py +64 -0
  1058. tools/mcp/requirements_server.py +11 -0
  1059. tools/mcp/security_server.py +64 -0
  1060. tools/mcp/simulation_server.py +64 -0
  1061. tools/mcp/supply_chain_server.py +64 -0
  1062. tools/mcp/tool_registry.py +299 -0
  1063. tools/memory/__init__.py +2 -0
  1064. tools/memory/auto_capture.py +346 -0
  1065. tools/memory/embed_memory.py +157 -0
  1066. tools/memory/history_compressor.py +334 -0
  1067. tools/memory/hybrid_search.py +235 -0
  1068. tools/memory/maintenance_cron.py +288 -0
  1069. tools/memory/memory_consolidation.py +439 -0
  1070. tools/memory/memory_db.py +132 -0
  1071. tools/memory/memory_read.py +101 -0
  1072. tools/memory/memory_write.py +221 -0
  1073. tools/memory/semantic_search.py +138 -0
  1074. tools/memory/time_decay.py +434 -0
  1075. tools/missions/__init__.py +2 -0
  1076. tools/missions/mission_engine.py +459 -0
  1077. tools/monitor/__init__.py +1 -0
  1078. tools/monitor/alert_correlator.py +486 -0
  1079. tools/monitor/auto_resolver.py +603 -0
  1080. tools/monitor/health_checker.py +507 -0
  1081. tools/monitor/heartbeat_daemon.py +779 -0
  1082. tools/monitor/log_analyzer.py +507 -0
  1083. tools/monitor/metric_collector.py +484 -0
  1084. tools/mosa/__init__.py +10 -0
  1085. tools/mosa/icd_generator.py +358 -0
  1086. tools/mosa/modular_design_analyzer.py +682 -0
  1087. tools/mosa/mosa_code_enforcer.py +348 -0
  1088. tools/mosa/tsp_generator.py +265 -0
  1089. tools/observability/__init__.py +100 -0
  1090. tools/observability/genai_attributes.py +88 -0
  1091. tools/observability/instrumentation.py +140 -0
  1092. tools/observability/mlflow_exporter.py +193 -0
  1093. tools/observability/otel_tracer.py +168 -0
  1094. tools/observability/provenance/__init__.py +3 -0
  1095. tools/observability/provenance/prov_recorder.py +322 -0
  1096. tools/observability/shap/__init__.py +3 -0
  1097. tools/observability/shap/agent_shap.py +274 -0
  1098. tools/observability/sqlite_tracer.py +360 -0
  1099. tools/observability/trace_context.py +205 -0
  1100. tools/observability/tracer.py +230 -0
  1101. tools/orchestration/__init__.py +1 -0
  1102. tools/orchestration/peer_channels.py +254 -0
  1103. tools/orchestration/saga_coordinator.py +390 -0
  1104. tools/project/__init__.py +1 -0
  1105. tools/project/manifest_loader.py +418 -0
  1106. tools/project/project_create.py +350 -0
  1107. tools/project/project_list.py +171 -0
  1108. tools/project/project_scaffold.py +1715 -0
  1109. tools/project/project_status.py +478 -0
  1110. tools/project/session_context_builder.py +752 -0
  1111. tools/project/validate_manifest.py +54 -0
  1112. tools/rag/corrective_rag.py +582 -0
  1113. tools/rag/source_registry.py +482 -0
  1114. tools/requirements/__init__.py +1 -0
  1115. tools/requirements/ai_governance_scorer.py +207 -0
  1116. tools/requirements/boundary_analyzer.py +1281 -0
  1117. tools/requirements/clarification_engine.py +605 -0
  1118. tools/requirements/complexity_scorer.py +369 -0
  1119. tools/requirements/consistency_analyzer.py +789 -0
  1120. tools/requirements/constitution_manager.py +592 -0
  1121. tools/requirements/decomposition_engine.py +764 -0
  1122. tools/requirements/document_extractor.py +1002 -0
  1123. tools/requirements/elicitation_techniques.py +508 -0
  1124. tools/requirements/gap_detector.py +260 -0
  1125. tools/requirements/intake_engine.py +2175 -0
  1126. tools/requirements/prd_generator.py +839 -0
  1127. tools/requirements/prd_validator.py +584 -0
  1128. tools/requirements/readiness_scorer.py +302 -0
  1129. tools/requirements/spec_organizer.py +1015 -0
  1130. tools/requirements/spec_quality_checker.py +1083 -0
  1131. tools/requirements/traceability_builder.py +566 -0
  1132. tools/research/__init__.py +3 -0
  1133. tools/research/academic_scanner.py +130 -0
  1134. tools/research/build_buy_analyzer.py +229 -0
  1135. tools/research/challenge_scorer.py +280 -0
  1136. tools/research/community_scanner.py +174 -0
  1137. tools/research/cross_engine_bridge.py +124 -0
  1138. tools/research/dossier_generator.py +305 -0
  1139. tools/research/landscape_scanner.py +315 -0
  1140. tools/research/regulatory_scanner.py +248 -0
  1141. tools/research/research_manager.py +469 -0
  1142. tools/research/source_scanner.py +150 -0
  1143. tools/research/vertical_loader.py +118 -0
  1144. tools/saas/__init__.py +0 -0
  1145. tools/saas/licensing/__init__.py +0 -0
  1146. tools/saas/licensing/license_validator.py +345 -0
  1147. tools/scaffold/__init__.py +2 -0
  1148. tools/scaffold/golden_path.py +504 -0
  1149. tools/security/__init__.py +1 -0
  1150. tools/security/agent_output_validator.py +330 -0
  1151. tools/security/agent_trust_scorer.py +652 -0
  1152. tools/security/ai_bom_generator.py +718 -0
  1153. tools/security/ai_telemetry_logger.py +469 -0
  1154. tools/security/atlas_red_team.py +541 -0
  1155. tools/security/code_pattern_scanner.py +382 -0
  1156. tools/security/confabulation_detector.py +265 -0
  1157. tools/security/container_scanner.py +489 -0
  1158. tools/security/dependency_auditor.py +942 -0
  1159. tools/security/endpoint_security_scanner.py +626 -0
  1160. tools/security/mcp_tool_authorizer.py +242 -0
  1161. tools/security/output_verifier.py +427 -0
  1162. tools/security/prompt_injection_detector.py +737 -0
  1163. tools/security/sast_runner.py +946 -0
  1164. tools/security/secret_detector.py +376 -0
  1165. tools/security/threat_modeler.py +678 -0
  1166. tools/security/tool_chain_validator.py +357 -0
  1167. tools/security/vuln_scanner.py +536 -0
  1168. tools/simulation/__init__.py +2 -0
  1169. tools/simulation/ato_simulator.py +517 -0
  1170. tools/simulation/coa_generator.py +1539 -0
  1171. tools/simulation/monte_carlo.py +745 -0
  1172. tools/simulation/scenario_manager.py +1060 -0
  1173. tools/simulation/simulation_engine.py +1091 -0
  1174. tools/simulator/__init__.py +2 -0
  1175. tools/simulator/sim_runner.py +272 -0
  1176. tools/supply_chain/__init__.py +2 -0
  1177. tools/supply_chain/cve_triager.py +690 -0
  1178. tools/supply_chain/dependency_graph.py +630 -0
  1179. tools/supply_chain/isa_manager.py +526 -0
  1180. tools/supply_chain/scrm_assessor.py +531 -0
  1181. tools/supply_chain/slsa_verifier.py +473 -0
  1182. tools/testing/__init__.py +2 -0
  1183. tools/testing/acceptance_validator.py +411 -0
  1184. tools/testing/api_surface_extractor.py +749 -0
  1185. tools/testing/claude_dir_validator.py +831 -0
  1186. tools/testing/data_types.py +199 -0
  1187. tools/testing/e2e_runner.py +715 -0
  1188. tools/testing/fuzz_cli.py +306 -0
  1189. tools/testing/health_check.py +483 -0
  1190. tools/testing/platform_check.py +143 -0
  1191. tools/testing/production_audit.py +1836 -0
  1192. tools/testing/production_remediate.py +803 -0
  1193. tools/testing/screenshot_validator.py +538 -0
  1194. tools/testing/smoke_test.py +283 -0
  1195. tools/testing/test_agent_models.py +117 -0
  1196. tools/testing/test_orchestrator.py +957 -0
  1197. tools/testing/utils.py +229 -0
  1198. tools/writeguard/__init__.py +1 -0
  1199. tools/writeguard/main.py +1 -0
  1200. tools/writing/__init__.py +7 -0
  1201. tools/writing/ai_content_detector.py +316 -0
  1202. tools/writing/analysis_engine.py +454 -0
  1203. tools/writing/batch_analyzer.py +276 -0
  1204. tools/writing/coherence_analyzer.py +221 -0
  1205. tools/writing/govcon_bridge.py +509 -0
  1206. tools/writing/grammar_checker.py +270 -0
  1207. tools/writing/plagiarism_detector.py +106 -0
  1208. tools/writing/readability_scorer.py +201 -0
  1209. tools/writing/rewriter.py +96 -0
  1210. tools/writing/signal_registrar.py +167 -0
  1211. tools/writing/snippet_manager.py +276 -0
  1212. tools/writing/style_enforcer.py +220 -0
  1213. tools/writing/style_guide_manager.py +438 -0
  1214. tools/writing/tone_profiler.py +168 -0
@@ -0,0 +1,1478 @@
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 sys
35
+ from datetime import datetime, timezone
36
+ from pathlib import Path
37
+ from tools.db.storage import get_connection
38
+ DB_PATH = None # Storage layer handles path resolution (D-DB-20)
39
+
40
+ BASE_DIR = Path(__file__).resolve().parent.parent.parent
41
+ CMMC_PRACTICES_PATH = BASE_DIR / "context" / "compliance" / "cmmc_practices.json"
42
+
43
+ # CMMC domain codes and names
44
+ CMMC_DOMAINS = [
45
+ ("AC", "Access Control"),
46
+ ("AT", "Awareness & Training"),
47
+ ("AU", "Audit & Accountability"),
48
+ ("CM", "Configuration Management"),
49
+ ("IA", "Identification & Authentication"),
50
+ ("IR", "Incident Response"),
51
+ ("MA", "Maintenance"),
52
+ ("MP", "Media Protection"),
53
+ ("PE", "Physical Protection"),
54
+ ("PS", "Personnel Security"),
55
+ ("RA", "Risk Assessment"),
56
+ ("CA", "Security Assessment"),
57
+ ("SC", "System & Communications Protection"),
58
+ ("SI", "System & Information Integrity"),
59
+ ]
60
+
61
+ DOMAIN_CODE_TO_NAME = {code: name for code, name in CMMC_DOMAINS}
62
+ DOMAIN_NAME_TO_CODE = {name: code for code, name in CMMC_DOMAINS}
63
+
64
+
65
+ # -----------------------------------------------------------------
66
+ # Database helpers
67
+ # -----------------------------------------------------------------
68
+
69
+
70
+ def _get_project(conn, project_id):
71
+ """Load project data from the projects table."""
72
+ row = conn.execute(
73
+ "SELECT * FROM projects WHERE id = ?", (project_id,)
74
+ ).fetchone()
75
+ if not row:
76
+ raise ValueError(f"Project '{project_id}' not found.")
77
+ return dict(row)
78
+
79
+
80
+ def _log_audit_event(conn, project_id, action, details, file_path=None):
81
+ """Log an audit trail event (append-only, NIST AU compliant)."""
82
+ try:
83
+ conn.execute(
84
+ """INSERT INTO audit_trail
85
+ (project_id, event_type, actor, action, details,
86
+ affected_files, classification)
87
+ VALUES (?, ?, ?, ?, ?, ?, ?)""",
88
+ (
89
+ project_id,
90
+ "cmmc_assessed",
91
+ "icdev-compliance-engine",
92
+ action,
93
+ json.dumps(details),
94
+ json.dumps([str(file_path)] if file_path else []),
95
+ "CUI",
96
+ ),
97
+ )
98
+ conn.commit()
99
+ except Exception as e:
100
+ print(f"Warning: Could not log audit event: {e}", file=sys.stderr)
101
+
102
+
103
+ # -----------------------------------------------------------------
104
+ # CUI config helper
105
+ # -----------------------------------------------------------------
106
+
107
+ def _load_cui_config():
108
+ """Load CUI marking configuration."""
109
+ try:
110
+ sys.path.insert(0, str(BASE_DIR / "tools" / "compliance"))
111
+ from cui_marker import load_cui_config
112
+ return load_cui_config()
113
+ except ImportError:
114
+ return {
115
+ "document_header": (
116
+ "////////////////////////////////////////////////////////////////////\n"
117
+ "CONTROLLED UNCLASSIFIED INFORMATION (CUI) // SP-CTI\n"
118
+ "Distribution: Distribution D -- Authorized DoD Personnel Only\n"
119
+ "////////////////////////////////////////////////////////////////////"
120
+ ),
121
+ "document_footer": (
122
+ "////////////////////////////////////////////////////////////////////\n"
123
+ "CUI // SP-CTI | Department of Defense\n"
124
+ "////////////////////////////////////////////////////////////////////"
125
+ ),
126
+ }
127
+
128
+
129
+ # -----------------------------------------------------------------
130
+ # CMMC catalog loader
131
+ # -----------------------------------------------------------------
132
+
133
+ def load_cmmc_practices(level=2):
134
+ """Load CMMC practice catalog for Level 2 or 3.
135
+
136
+ Args:
137
+ level: CMMC level (2 or 3).
138
+
139
+ Returns:
140
+ dict with metadata, domains, and filtered practices list.
141
+ """
142
+ if not CMMC_PRACTICES_PATH.exists():
143
+ print(
144
+ f"Warning: CMMC practices catalog not found: {CMMC_PRACTICES_PATH}",
145
+ file=sys.stderr,
146
+ )
147
+ return {"metadata": {}, "domains": [], "practices": []}
148
+
149
+ with open(CMMC_PRACTICES_PATH, "r", encoding="utf-8") as f:
150
+ data = json.load(f)
151
+
152
+ practices = data.get("practices", [])
153
+ # Level 2 includes only level-2 practices
154
+ # Level 3 includes level-2 AND level-3 practices
155
+ filtered = [p for p in practices if p.get("level", 2) <= level]
156
+
157
+ return {
158
+ "metadata": data.get("metadata", {}),
159
+ "domains": data.get("domains", []),
160
+ "practices": filtered,
161
+ }
162
+
163
+
164
+ # -----------------------------------------------------------------
165
+ # Crosswalk inheritance helper
166
+ # -----------------------------------------------------------------
167
+
168
+ def _inherit_nist_implementations(project_id, practices, db_path=None):
169
+ """Use the crosswalk engine to inherit NIST 800-53/800-171 implementations.
170
+
171
+ For each CMMC practice that maps to NIST 800-53 controls, checks if those
172
+ controls are already implemented in the project_controls table. If all
173
+ mapped controls are implemented, the practice is considered inherited.
174
+
175
+ Args:
176
+ project_id: The project identifier.
177
+ practices: List of CMMC practice dicts from the catalog.
178
+ db_path: Optional database path override.
179
+
180
+ Returns:
181
+ dict mapping practice_id -> {"inherited": bool, "controls_implemented": [...],
182
+ "controls_missing": [...]}
183
+ """
184
+ conn = get_connection(db_path=db_path)
185
+ try:
186
+ rows = conn.execute(
187
+ """SELECT control_id, implementation_status
188
+ FROM project_controls
189
+ WHERE project_id = ?""",
190
+ (project_id,),
191
+ ).fetchall()
192
+
193
+ implemented_ids = set()
194
+ for row in rows:
195
+ if row["implementation_status"] in ("implemented", "partially_implemented"):
196
+ implemented_ids.add(row["control_id"].upper())
197
+
198
+ inheritance = {}
199
+ for practice in practices:
200
+ pid = practice["id"]
201
+ nist_controls = practice.get("nist_800_53_controls", [])
202
+
203
+ if not nist_controls:
204
+ inheritance[pid] = {
205
+ "inherited": False,
206
+ "controls_implemented": [],
207
+ "controls_missing": [],
208
+ }
209
+ continue
210
+
211
+ controls_impl = [c for c in nist_controls if c.upper() in implemented_ids]
212
+ controls_miss = [c for c in nist_controls if c.upper() not in implemented_ids]
213
+
214
+ inheritance[pid] = {
215
+ "inherited": len(controls_miss) == 0 and len(controls_impl) > 0,
216
+ "controls_implemented": controls_impl,
217
+ "controls_missing": controls_miss,
218
+ }
219
+
220
+ return inheritance
221
+ except Exception:
222
+ # If project_controls table doesn't exist or other error, return empty
223
+ return {}
224
+ finally:
225
+ conn.close()
226
+
227
+
228
+ # -----------------------------------------------------------------
229
+ # Auto-check helper: walk project files matching extensions
230
+ # -----------------------------------------------------------------
231
+
232
+ def _scan_files(project_dir, extensions, patterns, threshold=1):
233
+ """Scan project files for regex patterns.
234
+
235
+ Args:
236
+ project_dir: Root directory to walk.
237
+ extensions: Tuple of file extensions to include.
238
+ patterns: List of regex patterns to search for.
239
+ threshold: Minimum number of files with matches to consider satisfied.
240
+
241
+ Returns:
242
+ Tuple of (matched_files, total_scanned).
243
+ """
244
+ matched_files = []
245
+ total_scanned = 0
246
+ for root, _, files in os.walk(project_dir):
247
+ for fname in files:
248
+ if not fname.endswith(extensions):
249
+ continue
250
+ fpath = os.path.join(root, fname)
251
+ total_scanned += 1
252
+ try:
253
+ with open(fpath, "r", encoding="utf-8", errors="ignore") as f:
254
+ content = f.read()
255
+ for pattern in patterns:
256
+ if re.search(pattern, content, re.IGNORECASE):
257
+ matched_files.append(fpath)
258
+ break
259
+ except Exception:
260
+ continue
261
+ return matched_files, total_scanned
262
+
263
+
264
+ def _dir_or_file_exists(project_dir, dir_names=None, glob_patterns=None):
265
+ """Check if specific directories or file globs exist under project_dir."""
266
+ found = []
267
+ project_path = Path(project_dir)
268
+
269
+ if dir_names:
270
+ for dname in dir_names:
271
+ candidate = project_path / dname
272
+ if candidate.is_dir():
273
+ found.append(str(candidate))
274
+ for child in project_path.rglob(dname):
275
+ if child.is_dir() and str(child) not in found:
276
+ found.append(str(child))
277
+
278
+ if glob_patterns:
279
+ for gp in glob_patterns:
280
+ for match in project_path.rglob(gp):
281
+ if str(match) not in found:
282
+ found.append(str(match))
283
+
284
+ return found
285
+
286
+
287
+ # -----------------------------------------------------------------
288
+ # Auto-check functions (14 -- one per CMMC domain)
289
+ # Each returns:
290
+ # {"status": "met"|"not_met"|"partially_met"|"not_applicable",
291
+ # "evidence": "description",
292
+ # "details": "specifics"}
293
+ # -----------------------------------------------------------------
294
+
295
+ def _check_ac_domain(project_dir):
296
+ """Access Control: RBAC, least privilege, session mgmt, remote access, wireless."""
297
+ patterns = [
298
+ r"@login_required|@permission_required|@requires_auth",
299
+ r"@Secured|@PreAuthorize|@RolesAllowed",
300
+ r"role_required|check_permission|has_permission",
301
+ r"\bRBAC\b|role.based.access",
302
+ r"RoleBinding|ClusterRole|ClusterRoleBinding",
303
+ r"least.privilege|minimum.privilege",
304
+ r"session.timeout|session_expiry|SESSION_TIMEOUT",
305
+ r"remote.access|VPN|vpn_config",
306
+ ]
307
+ extensions = (".py", ".yaml", ".yml", ".js", ".ts", ".java", ".go", ".rs")
308
+ matched, total = _scan_files(project_dir, extensions, patterns)
309
+
310
+ if total == 0:
311
+ return {
312
+ "status": "not_met",
313
+ "evidence": "No source files found to assess for access control.",
314
+ "details": "Project directory lacks applicable source files.",
315
+ }
316
+
317
+ if len(matched) >= 3:
318
+ return {
319
+ "status": "met",
320
+ "evidence": (
321
+ f"Access control patterns found in {len(matched)} file(s) "
322
+ f"including RBAC, session management, and privilege controls."
323
+ ),
324
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
325
+ }
326
+ elif matched:
327
+ return {
328
+ "status": "partially_met",
329
+ "evidence": (
330
+ f"Partial access control patterns found in {len(matched)} file(s). "
331
+ "Expecting RBAC, least privilege, session management, and remote access controls."
332
+ ),
333
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
334
+ }
335
+
336
+ return {
337
+ "status": "not_met",
338
+ "evidence": "No access control patterns detected.",
339
+ "details": (
340
+ "Expected: RBAC, @login_required, role_required, session management, "
341
+ "remote access controls, wireless access restrictions."
342
+ ),
343
+ }
344
+
345
+
346
+ def _check_at_domain(project_dir):
347
+ """Awareness & Training: security training docs, onboarding docs."""
348
+ found = _dir_or_file_exists(
349
+ project_dir,
350
+ glob_patterns=[
351
+ "SECURITY*.md", "security-training*", "security_training*",
352
+ "onboarding*", "training*", "awareness*",
353
+ "docs/security*", "docs/training*",
354
+ ],
355
+ )
356
+ found_dirs = _dir_or_file_exists(
357
+ project_dir,
358
+ dir_names=["training", "onboarding", "security-awareness"],
359
+ )
360
+ all_found = list(set(found + found_dirs))
361
+
362
+ if all_found:
363
+ return {
364
+ "status": "met",
365
+ "evidence": (
366
+ f"Security awareness/training artifacts found: "
367
+ f"{len(all_found)} item(s)."
368
+ ),
369
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
370
+ }
371
+
372
+ # Check for security policy references in code
373
+ patterns = [r"security.training|security.awareness|onboarding.security"]
374
+ extensions = (".md", ".txt", ".rst", ".yaml", ".yml")
375
+ matched, total = _scan_files(project_dir, extensions, patterns)
376
+ if matched:
377
+ return {
378
+ "status": "partially_met",
379
+ "evidence": f"Security training references in {len(matched)} file(s).",
380
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
381
+ }
382
+
383
+ return {
384
+ "status": "not_met",
385
+ "evidence": "No security awareness or training documentation detected.",
386
+ "details": (
387
+ "Expected: SECURITY.md, training docs, onboarding procedures, "
388
+ "security awareness materials."
389
+ ),
390
+ }
391
+
392
+
393
+ def _check_au_domain(project_dir):
394
+ """Audit & Accountability: logging config, audit trail, log protection, timestamps."""
395
+ event_type_patterns = [
396
+ (r"login|auth.*log|authentication.*log", "authentication_logging"),
397
+ (r"access.*log|access_log|request.*log", "access_logging"),
398
+ (r"change.*log|change_log|modification.*log|update.*log", "change_logging"),
399
+ (r"error.*log|error_log|exception.*log", "error_logging"),
400
+ (r"security.*event|security.*log|security_event", "security_logging"),
401
+ (r"audit_trail|AuditTrail|audit\.log", "audit_trail"),
402
+ ]
403
+ extensions = (".py", ".js", ".ts", ".java", ".yaml", ".yml", ".go", ".rs")
404
+ found_types = set()
405
+ evidence_files = []
406
+
407
+ for root, _, files in os.walk(project_dir):
408
+ for fname in files:
409
+ if not fname.endswith(extensions):
410
+ continue
411
+ fpath = os.path.join(root, fname)
412
+ try:
413
+ with open(fpath, "r", encoding="utf-8", errors="ignore") as f:
414
+ content = f.read()
415
+ for pattern, event_type in event_type_patterns:
416
+ if re.search(pattern, content, re.IGNORECASE):
417
+ found_types.add(event_type)
418
+ if fpath not in evidence_files:
419
+ evidence_files.append(fpath)
420
+ except Exception:
421
+ continue
422
+
423
+ # Also check for structured logging
424
+ struct_patterns = [r"logging\.getLogger|getLogger|structlog|log\.info|log\.warn"]
425
+ struct_matched, _ = _scan_files(project_dir, extensions, struct_patterns)
426
+ if struct_matched:
427
+ found_types.add("structured_logging")
428
+
429
+ count = len(found_types)
430
+ if count >= 4:
431
+ return {
432
+ "status": "met",
433
+ "evidence": (
434
+ f"Comprehensive audit logging: {count} distinct log types "
435
+ f"across {len(evidence_files)} file(s)."
436
+ ),
437
+ "details": f"Types: {', '.join(sorted(found_types))}",
438
+ }
439
+ elif count >= 2:
440
+ return {
441
+ "status": "partially_met",
442
+ "evidence": (
443
+ f"Partial audit logging: {count} log type(s) found. "
444
+ "CMMC requires comprehensive logging with protection and timestamps."
445
+ ),
446
+ "details": f"Types: {', '.join(sorted(found_types))}",
447
+ }
448
+
449
+ return {
450
+ "status": "not_met",
451
+ "evidence": "Insufficient audit logging detected.",
452
+ "details": (
453
+ "Expected: authentication, access, change, error, security "
454
+ "logging with timestamps and audit trail protection."
455
+ ),
456
+ }
457
+
458
+
459
+ def _check_cm_domain(project_dir):
460
+ """Configuration Management: baseline configs, change control, IaC, least functionality."""
461
+ found_configs = _dir_or_file_exists(
462
+ project_dir,
463
+ glob_patterns=[
464
+ "*.tf", "*.tfvars", "Dockerfile*", "docker-compose*",
465
+ "*.yaml", "*.yml", "ansible*", "playbook*",
466
+ ".gitlab-ci.yml", ".github/workflows/*",
467
+ ],
468
+ )
469
+ found_dirs = _dir_or_file_exists(
470
+ project_dir,
471
+ dir_names=["terraform", "ansible", "k8s", "kubernetes", "infra"],
472
+ )
473
+
474
+ # Check for version control and change control
475
+ patterns = [
476
+ r"baseline|configuration.management|config.baseline",
477
+ r"change.control|change.request|change.management",
478
+ r"least.functionality|minimal.install|hardened",
479
+ ]
480
+ extensions = (".py", ".yaml", ".yml", ".md", ".tf", ".json")
481
+ matched, total = _scan_files(project_dir, extensions, patterns)
482
+
483
+ all_found = list(set(found_configs + found_dirs + matched))
484
+
485
+ if len(all_found) >= 5:
486
+ return {
487
+ "status": "met",
488
+ "evidence": (
489
+ f"Configuration management artifacts found: {len(all_found)} item(s) "
490
+ "including IaC, Dockerfiles, and config baselines."
491
+ ),
492
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
493
+ }
494
+ elif all_found:
495
+ return {
496
+ "status": "partially_met",
497
+ "evidence": (
498
+ f"Partial configuration management: {len(all_found)} artifact(s). "
499
+ "Missing some of: IaC, change control, baseline configs, least functionality."
500
+ ),
501
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
502
+ }
503
+
504
+ return {
505
+ "status": "not_met",
506
+ "evidence": "No configuration management artifacts detected.",
507
+ "details": (
508
+ "Expected: Terraform/Ansible files, Dockerfiles, baseline configs, "
509
+ "change control documentation, least functionality enforcement."
510
+ ),
511
+ }
512
+
513
+
514
+ def _check_ia_domain(project_dir):
515
+ """Identification & Authentication: MFA, password policy, authenticator mgmt, PKI/CAC."""
516
+ patterns = [
517
+ r"\bMFA\b|multi.factor|MultiFactor|2FA|TOTP|FIDO",
518
+ r"password.policy|password.complexity|min.password",
519
+ r"\bPKI\b|pki_cert|certificate.auth|CAC",
520
+ r"authenticator|authentication.mechanism",
521
+ r"password.*expir|credential.*rotat|key.*rotation",
522
+ ]
523
+ extensions = (".py", ".yaml", ".yml", ".js", ".ts", ".java", ".conf")
524
+ matched, total = _scan_files(project_dir, extensions, patterns)
525
+
526
+ if total == 0:
527
+ return {
528
+ "status": "not_met",
529
+ "evidence": "No source files found to assess for identification & authentication.",
530
+ "details": "Project directory lacks applicable files.",
531
+ }
532
+
533
+ if len(matched) >= 3:
534
+ return {
535
+ "status": "met",
536
+ "evidence": (
537
+ f"Identification & authentication patterns found in "
538
+ f"{len(matched)} file(s) including MFA, password policy, and PKI."
539
+ ),
540
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
541
+ }
542
+ elif matched:
543
+ return {
544
+ "status": "partially_met",
545
+ "evidence": (
546
+ f"Partial I&A patterns in {len(matched)} file(s). "
547
+ "Expecting MFA, password policy, authenticator management, and PKI/CAC."
548
+ ),
549
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
550
+ }
551
+
552
+ return {
553
+ "status": "not_met",
554
+ "evidence": "No identification & authentication patterns detected.",
555
+ "details": (
556
+ "Expected: MFA/2FA, password complexity policy, PKI/CAC support, "
557
+ "authenticator management, credential rotation."
558
+ ),
559
+ }
560
+
561
+
562
+ def _check_ir_domain(project_dir):
563
+ """Incident Response: IR plan, IR testing, reporting procedures."""
564
+ found = _dir_or_file_exists(
565
+ project_dir,
566
+ glob_patterns=[
567
+ "incident-response*", "incident_response*", "ir-plan*", "ir_plan*",
568
+ "docs/incident*", "security/incident*",
569
+ ],
570
+ )
571
+ found_dirs = _dir_or_file_exists(
572
+ project_dir,
573
+ dir_names=["incident-response", "incident_response", "ir"],
574
+ )
575
+
576
+ patterns = [
577
+ r"incident.response|incident.handling|ir.plan|ir.procedure",
578
+ r"incident.report|incident.detection|incident.containment",
579
+ ]
580
+ extensions = (".md", ".txt", ".yaml", ".yml", ".py", ".json")
581
+ matched, total = _scan_files(project_dir, extensions, patterns)
582
+
583
+ all_found = list(set(found + found_dirs + matched))
584
+ if len(all_found) >= 2:
585
+ return {
586
+ "status": "met",
587
+ "evidence": (
588
+ f"Incident response artifacts found: {len(all_found)} item(s)."
589
+ ),
590
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
591
+ }
592
+ elif all_found:
593
+ return {
594
+ "status": "partially_met",
595
+ "evidence": (
596
+ f"Partial incident response: {len(all_found)} artifact(s). "
597
+ "Need IR plan, testing evidence, and reporting procedures."
598
+ ),
599
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
600
+ }
601
+
602
+ return {
603
+ "status": "not_met",
604
+ "evidence": "No incident response artifacts detected.",
605
+ "details": (
606
+ "Expected: IR plan documents, IR testing records, "
607
+ "incident reporting procedures, containment/recovery docs."
608
+ ),
609
+ }
610
+
611
+
612
+ def _check_ma_domain(project_dir):
613
+ """Maintenance: maintenance procedures, non-local maintenance controls."""
614
+ found = _dir_or_file_exists(
615
+ project_dir,
616
+ glob_patterns=[
617
+ "maintenance*", "MAINTENANCE*", "docs/maintenance*",
618
+ "runbook*", "playbook*", "ops/*",
619
+ ],
620
+ )
621
+ patterns = [
622
+ r"maintenance.procedure|maintenance.policy|maintenance.window",
623
+ r"non.local.maintenance|remote.maintenance",
624
+ r"patch.management|update.procedure",
625
+ ]
626
+ extensions = (".md", ".txt", ".yaml", ".yml", ".json")
627
+ matched, total = _scan_files(project_dir, extensions, patterns)
628
+
629
+ all_found = list(set(found + matched))
630
+ if all_found:
631
+ return {
632
+ "status": "met",
633
+ "evidence": (
634
+ f"Maintenance procedure artifacts found: {len(all_found)} item(s)."
635
+ ),
636
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
637
+ }
638
+
639
+ return {
640
+ "status": "not_met",
641
+ "evidence": "No maintenance procedure documentation detected.",
642
+ "details": (
643
+ "Expected: maintenance procedures, non-local maintenance controls, "
644
+ "patch management docs, runbooks."
645
+ ),
646
+ }
647
+
648
+
649
+ def _check_mp_domain(project_dir):
650
+ """Media Protection: media access, marking, storage, transport, sanitization."""
651
+ patterns = [
652
+ r"media.protection|media.sanitization|media.disposal",
653
+ r"encryption.at.rest|encrypt_at_rest|storage_encrypted",
654
+ r"\bKMS\b|kms_key|aws_kms|key_management",
655
+ r"CUI.*mark|classification.*mark|media.*marking",
656
+ r"data.at.rest|data.in.transit|data.protection",
657
+ ]
658
+ extensions = (".py", ".yaml", ".yml", ".tf", ".json", ".md", ".conf")
659
+ matched, total = _scan_files(project_dir, extensions, patterns)
660
+
661
+ if total == 0:
662
+ return {
663
+ "status": "not_met",
664
+ "evidence": "No files found to assess media protection.",
665
+ "details": "Project directory lacks applicable files.",
666
+ }
667
+
668
+ if len(matched) >= 2:
669
+ return {
670
+ "status": "met",
671
+ "evidence": (
672
+ f"Media protection patterns found in {len(matched)} file(s) "
673
+ "including encryption, KMS, and marking controls."
674
+ ),
675
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
676
+ }
677
+ elif matched:
678
+ return {
679
+ "status": "partially_met",
680
+ "evidence": (
681
+ f"Partial media protection in {len(matched)} file(s). "
682
+ "Need encryption-at-rest, CUI marking, transport encryption."
683
+ ),
684
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
685
+ }
686
+
687
+ return {
688
+ "status": "not_met",
689
+ "evidence": "No media protection patterns detected.",
690
+ "details": (
691
+ "Expected: encryption-at-rest, KMS, media marking, "
692
+ "data protection, sanitization procedures."
693
+ ),
694
+ }
695
+
696
+
697
+ def _check_pe_domain(project_dir):
698
+ """Physical Protection: physical access, visitor logs, monitoring."""
699
+ patterns = [
700
+ r"physical.access|physical.security|physical.protection",
701
+ r"visitor.log|visitor.control|badge|access.card",
702
+ r"surveillance|CCTV|physical.monitoring",
703
+ ]
704
+ extensions = (".md", ".txt", ".yaml", ".yml", ".json")
705
+ matched, total = _scan_files(project_dir, extensions, patterns)
706
+
707
+ found = _dir_or_file_exists(
708
+ project_dir,
709
+ glob_patterns=[
710
+ "physical-security*", "physical_security*",
711
+ "docs/physical*", "security/physical*",
712
+ ],
713
+ )
714
+ all_found = list(set(matched + found))
715
+
716
+ if all_found:
717
+ return {
718
+ "status": "met",
719
+ "evidence": (
720
+ f"Physical protection documentation found: {len(all_found)} item(s)."
721
+ ),
722
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
723
+ }
724
+
725
+ # Physical security is often documented outside the codebase
726
+ return {
727
+ "status": "not_applicable",
728
+ "evidence": (
729
+ "Physical security controls are typically managed outside the "
730
+ "software codebase (facility management, physical access systems)."
731
+ ),
732
+ "details": "Manual verification of physical protection controls recommended.",
733
+ }
734
+
735
+
736
+ def _check_ps_domain(project_dir):
737
+ """Personnel Security: screening, termination procedures."""
738
+ patterns = [
739
+ r"personnel.security|background.check|screening",
740
+ r"termination.procedure|offboarding|access.revocation",
741
+ r"personnel.action|separation.procedure",
742
+ ]
743
+ extensions = (".md", ".txt", ".yaml", ".yml", ".json")
744
+ matched, total = _scan_files(project_dir, extensions, patterns)
745
+
746
+ found = _dir_or_file_exists(
747
+ project_dir,
748
+ glob_patterns=[
749
+ "personnel-security*", "personnel_security*",
750
+ "hr-security*", "docs/personnel*",
751
+ ],
752
+ )
753
+ all_found = list(set(matched + found))
754
+
755
+ if all_found:
756
+ return {
757
+ "status": "met",
758
+ "evidence": (
759
+ f"Personnel security documentation found: {len(all_found)} item(s)."
760
+ ),
761
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
762
+ }
763
+
764
+ return {
765
+ "status": "not_applicable",
766
+ "evidence": (
767
+ "Personnel security controls are typically managed outside "
768
+ "the software codebase (HR processes, background check systems)."
769
+ ),
770
+ "details": "Manual verification of personnel security procedures recommended.",
771
+ }
772
+
773
+
774
+ def _check_ra_domain(project_dir):
775
+ """Risk Assessment: risk assessment, vulnerability scanning."""
776
+ found = _dir_or_file_exists(
777
+ project_dir,
778
+ glob_patterns=[
779
+ "risk-assessment*", "risk_assessment*", "threat-model*",
780
+ "threat_model*", "vulnerability-scan*", "vuln-report*",
781
+ ".snyk", ".safety", "audit-report*", "pip-audit-report*",
782
+ ],
783
+ )
784
+ found_dirs = _dir_or_file_exists(
785
+ project_dir,
786
+ dir_names=["risk-assessment", "threat-model", "vulnerability-scans"],
787
+ )
788
+ patterns = [
789
+ r"risk.assessment|risk.analysis|risk.register",
790
+ r"vulnerability.scan|vuln.scan|security.scan",
791
+ r"threat.model|STRIDE|PASTA|attack.tree",
792
+ ]
793
+ extensions = (".md", ".txt", ".yaml", ".yml", ".json", ".py")
794
+ matched, total = _scan_files(project_dir, extensions, patterns)
795
+
796
+ all_found = list(set(found + found_dirs + matched))
797
+ if len(all_found) >= 2:
798
+ return {
799
+ "status": "met",
800
+ "evidence": (
801
+ f"Risk assessment artifacts found: {len(all_found)} item(s) "
802
+ "including risk analysis, vulnerability scanning, and/or threat modeling."
803
+ ),
804
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
805
+ }
806
+ elif all_found:
807
+ return {
808
+ "status": "partially_met",
809
+ "evidence": (
810
+ f"Partial risk assessment: {len(all_found)} artifact(s). "
811
+ "Need both risk assessment and vulnerability scanning."
812
+ ),
813
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
814
+ }
815
+
816
+ return {
817
+ "status": "not_met",
818
+ "evidence": "No risk assessment or vulnerability scanning artifacts detected.",
819
+ "details": (
820
+ "Expected: risk assessment documents, vulnerability scan reports, "
821
+ "threat model artifacts."
822
+ ),
823
+ }
824
+
825
+
826
+ def _check_ca_domain(project_dir):
827
+ """Security Assessment: security assessments, system connections, monitoring."""
828
+ found = _dir_or_file_exists(
829
+ project_dir,
830
+ glob_patterns=[
831
+ "security-assessment*", "security_assessment*",
832
+ "compliance/*", "ato/*", "authorization*",
833
+ "system-connection*", "interconnection*",
834
+ ],
835
+ )
836
+ patterns = [
837
+ r"security.assessment|security.evaluation|compliance.assessment",
838
+ r"plan.of.action|POA.M|POAM|poam",
839
+ r"system.connection|interconnection.agreement|ISA|MOU",
840
+ r"continuous.monitoring|conmon|ongoing.assessment",
841
+ ]
842
+ extensions = (".md", ".txt", ".yaml", ".yml", ".json")
843
+ matched, total = _scan_files(project_dir, extensions, patterns)
844
+
845
+ all_found = list(set(found + matched))
846
+ if len(all_found) >= 2:
847
+ return {
848
+ "status": "met",
849
+ "evidence": (
850
+ f"Security assessment artifacts found: {len(all_found)} item(s) "
851
+ "including assessments, POA&M, and/or continuous monitoring."
852
+ ),
853
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
854
+ }
855
+ elif all_found:
856
+ return {
857
+ "status": "partially_met",
858
+ "evidence": (
859
+ f"Partial security assessment: {len(all_found)} artifact(s)."
860
+ ),
861
+ "details": "; ".join(os.path.basename(f) for f in all_found[:5]),
862
+ }
863
+
864
+ return {
865
+ "status": "not_met",
866
+ "evidence": "No security assessment artifacts detected.",
867
+ "details": (
868
+ "Expected: security assessments, POA&M, system interconnection "
869
+ "agreements, continuous monitoring documentation."
870
+ ),
871
+ }
872
+
873
+
874
+ def _check_sc_domain(project_dir):
875
+ """System & Comms Protection: boundary protection, CUI encryption, crypto, network segmentation."""
876
+ patterns = [
877
+ r"TLS\s*1\.[23]|TLSv1_[23]|PROTOCOL_TLS",
878
+ r"\bHTTPS\b|https://|ssl_context|SSLContext",
879
+ r"mTLS|mutual.TLS|mutual_tls",
880
+ r"\bFIPS\b|fips_mode|FIPS.140",
881
+ r"AES.256|AES_256|aes256",
882
+ r"\bKMS\b|kms_key|aws_kms|key_management",
883
+ r"network.segmentation|network.boundary|firewall",
884
+ r"CUI.*encrypt|encrypt.*CUI|data.protection",
885
+ r"NetworkPolicy|security.group|ingress.rule",
886
+ ]
887
+ extensions = (".py", ".yaml", ".yml", ".tf", ".json", ".conf", ".go", ".rs")
888
+ matched, total = _scan_files(project_dir, extensions, patterns)
889
+
890
+ if total == 0:
891
+ return {
892
+ "status": "not_met",
893
+ "evidence": "No files found to assess system & communications protection.",
894
+ "details": "Project directory lacks applicable files.",
895
+ }
896
+
897
+ if len(matched) >= 4:
898
+ return {
899
+ "status": "met",
900
+ "evidence": (
901
+ f"System & communications protection patterns found in "
902
+ f"{len(matched)} file(s) including TLS, encryption, "
903
+ "FIPS, and network controls."
904
+ ),
905
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
906
+ }
907
+ elif len(matched) >= 2:
908
+ return {
909
+ "status": "partially_met",
910
+ "evidence": (
911
+ f"Partial SC protection in {len(matched)} file(s). "
912
+ "Expecting TLS 1.2+, FIPS encryption, network segmentation, "
913
+ "and CUI data protection."
914
+ ),
915
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
916
+ }
917
+
918
+ return {
919
+ "status": "not_met",
920
+ "evidence": "Insufficient system & communications protection detected.",
921
+ "details": (
922
+ "Expected: TLS 1.2+, FIPS-validated encryption, AES-256, KMS, "
923
+ "network segmentation, boundary protection, CUI encryption."
924
+ ),
925
+ }
926
+
927
+
928
+ def _check_si_domain(project_dir):
929
+ """System & Info Integrity: flaw remediation, malicious code, monitoring, alerting."""
930
+ patterns = [
931
+ r"pip.audit|npm\s+audit|safety.*check|snyk|dependency.check",
932
+ r"bandit|semgrep|sonar|SAST|sast_runner",
933
+ r"\bantivirus\b|\bantimalware\b|malware.scan",
934
+ r"security.monitoring|intrusion.detect|IDS|IPS",
935
+ r"alert|notification|webhook.*security",
936
+ r"patch.management|flaw.remediation|vuln.fix",
937
+ ]
938
+ extensions = (".py", ".yaml", ".yml", ".json", ".sh", ".conf")
939
+ matched, total = _scan_files(project_dir, extensions, patterns)
940
+
941
+ if total == 0:
942
+ return {
943
+ "status": "not_met",
944
+ "evidence": "No files found to assess system & information integrity.",
945
+ "details": "Project directory lacks applicable files.",
946
+ }
947
+
948
+ if len(matched) >= 3:
949
+ return {
950
+ "status": "met",
951
+ "evidence": (
952
+ f"System & information integrity patterns found in "
953
+ f"{len(matched)} file(s) including SAST, dependency auditing, "
954
+ "and security monitoring."
955
+ ),
956
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
957
+ }
958
+ elif matched:
959
+ return {
960
+ "status": "partially_met",
961
+ "evidence": (
962
+ f"Partial SI integrity in {len(matched)} file(s). "
963
+ "Expecting flaw remediation, malicious code protection, "
964
+ "monitoring, and alerting."
965
+ ),
966
+ "details": "; ".join(os.path.basename(f) for f in matched[:5]),
967
+ }
968
+
969
+ return {
970
+ "status": "not_met",
971
+ "evidence": "No system & information integrity patterns detected.",
972
+ "details": (
973
+ "Expected: SAST, dependency auditing, malicious code protection, "
974
+ "security monitoring, alerting, flaw remediation processes."
975
+ ),
976
+ }
977
+
978
+
979
+ # -----------------------------------------------------------------
980
+ # Domain-to-check mapping
981
+ # -----------------------------------------------------------------
982
+
983
+ DOMAIN_AUTO_CHECKS = {
984
+ "AC": _check_ac_domain,
985
+ "AT": _check_at_domain,
986
+ "AU": _check_au_domain,
987
+ "CM": _check_cm_domain,
988
+ "IA": _check_ia_domain,
989
+ "IR": _check_ir_domain,
990
+ "MA": _check_ma_domain,
991
+ "MP": _check_mp_domain,
992
+ "PE": _check_pe_domain,
993
+ "PS": _check_ps_domain,
994
+ "RA": _check_ra_domain,
995
+ "CA": _check_ca_domain,
996
+ "SC": _check_sc_domain,
997
+ "SI": _check_si_domain,
998
+ }
999
+
1000
+
1001
+ # -----------------------------------------------------------------
1002
+ # Core assessment function
1003
+ # -----------------------------------------------------------------
1004
+
1005
+ def run_cmmc_assessment(
1006
+ project_id,
1007
+ level=2,
1008
+ project_dir=None,
1009
+ gate=False,
1010
+ output_path=None,
1011
+ db_path=None,
1012
+ ):
1013
+ """Run CMMC Level 2/3 assessment for a project.
1014
+
1015
+ Args:
1016
+ project_id: The project identifier.
1017
+ level: CMMC level (2 or 3).
1018
+ project_dir: Project directory for automated file-based checks.
1019
+ gate: If True, evaluate the CMMC gate.
1020
+ output_path: Override output directory for the assessment report.
1021
+ db_path: Override database path.
1022
+
1023
+ Returns:
1024
+ Dict with domain_scores, overall_score, gate_status,
1025
+ practices_met/not_met/partial, and output file path.
1026
+ """
1027
+ if level not in (2, 3):
1028
+ raise ValueError(f"Invalid CMMC level: {level}. Must be 2 or 3.")
1029
+
1030
+ conn = get_connection(db_path=db_path)
1031
+ try:
1032
+ project = _get_project(conn, project_id)
1033
+
1034
+ # 1. Load CMMC practice catalog
1035
+ catalog = load_cmmc_practices(level)
1036
+ practices = catalog.get("practices", [])
1037
+ catalog.get("metadata", {})
1038
+
1039
+ if not practices:
1040
+ raise ValueError(
1041
+ "No CMMC practices loaded. Ensure "
1042
+ "context/compliance/cmmc_practices.json exists."
1043
+ )
1044
+
1045
+ # 2. Inherit NIST 800-53/800-171 implementations via crosswalk
1046
+ inheritance = _inherit_nist_implementations(
1047
+ project_id, practices, db_path=db_path
1048
+ )
1049
+
1050
+ # 3. Resolve project directory for auto-checks
1051
+ if project_dir and Path(project_dir).is_dir():
1052
+ can_auto_check = True
1053
+ elif (
1054
+ project.get("directory_path")
1055
+ and Path(project["directory_path"]).is_dir()
1056
+ ):
1057
+ project_dir = project["directory_path"]
1058
+ can_auto_check = True
1059
+ else:
1060
+ can_auto_check = False
1061
+
1062
+ # 4. Run domain auto-checks
1063
+ domain_check_results = {}
1064
+ if can_auto_check:
1065
+ for domain_code, domain_name in CMMC_DOMAINS:
1066
+ if domain_code in DOMAIN_AUTO_CHECKS:
1067
+ try:
1068
+ domain_check_results[domain_code] = (
1069
+ DOMAIN_AUTO_CHECKS[domain_code](project_dir)
1070
+ )
1071
+ except Exception as e:
1072
+ domain_check_results[domain_code] = {
1073
+ "status": "not_met",
1074
+ "evidence": f"Auto-check error: {e}",
1075
+ "details": "Domain auto-check failed; manual review required.",
1076
+ }
1077
+
1078
+ now = datetime.now(timezone.utc)
1079
+ results = []
1080
+
1081
+ # 5. Assess each practice
1082
+ for practice in practices:
1083
+ pid = practice["id"]
1084
+ domain_code = practice.get("domain_code", "")
1085
+ automation_level = practice.get("automation_level", "manual")
1086
+ status = "not_assessed"
1087
+ evidence = ""
1088
+ details = ""
1089
+ notes = ""
1090
+
1091
+ # Check if inherited from NIST implementation
1092
+ inh = inheritance.get(pid, {})
1093
+ if inh.get("inherited"):
1094
+ status = "met"
1095
+ evidence = (
1096
+ f"Inherited from NIST 800-53 implementation. "
1097
+ f"Controls implemented: {', '.join(inh['controls_implemented'])}."
1098
+ )
1099
+ details = "Practice satisfied via crosswalk inheritance."
1100
+ notes = "Verified via crosswalk engine."
1101
+
1102
+ elif automation_level == "auto" and can_auto_check:
1103
+ # Use domain-level auto-check result
1104
+ domain_result = domain_check_results.get(domain_code, {})
1105
+ if domain_result:
1106
+ status = domain_result.get("status", "not_assessed")
1107
+ evidence = domain_result.get("evidence", "")
1108
+ details = domain_result.get("details", "")
1109
+ notes = "Auto-checked via domain scan."
1110
+ else:
1111
+ status = "not_assessed"
1112
+ evidence = "No auto-check available for this domain."
1113
+ notes = "Manual review required."
1114
+
1115
+ elif automation_level == "semi" and can_auto_check:
1116
+ domain_result = domain_check_results.get(domain_code, {})
1117
+ if domain_result:
1118
+ status = domain_result.get("status", "not_assessed")
1119
+ evidence = domain_result.get("evidence", "")
1120
+ details = domain_result.get("details", "")
1121
+ notes = (
1122
+ "Semi-automated check. Manual review required to "
1123
+ "verify full compliance with this specific practice."
1124
+ )
1125
+ else:
1126
+ status = "not_assessed"
1127
+ evidence = "Semi-automated: no auto component available."
1128
+ notes = (
1129
+ f"Manual review required. Evidence needed: "
1130
+ f"{practice.get('evidence_required', 'See practice description.')}"
1131
+ )
1132
+
1133
+ elif automation_level in ("auto", "semi") and not can_auto_check:
1134
+ status = "not_assessed"
1135
+ evidence = "No project directory available for automated scanning."
1136
+ notes = "Provide --project-dir to enable auto-checks."
1137
+
1138
+ else:
1139
+ # Manual
1140
+ status = "not_assessed"
1141
+ evidence = "Manual assessment required."
1142
+ notes = (
1143
+ f"Evidence needed: "
1144
+ f"{practice.get('evidence_required', 'See practice description.')}"
1145
+ )
1146
+
1147
+ # Add partial credit if some NIST controls are implemented
1148
+ if status == "not_assessed" and inh.get("controls_implemented"):
1149
+ status = "partially_met"
1150
+ evidence = (
1151
+ f"Partial NIST 800-53 implementation. "
1152
+ f"Implemented: {', '.join(inh['controls_implemented'])}. "
1153
+ f"Missing: {', '.join(inh.get('controls_missing', []))}."
1154
+ )
1155
+ notes = "Complete remaining NIST control implementations."
1156
+
1157
+ result_entry = {
1158
+ "practice_id": pid,
1159
+ "domain": practice.get("domain", ""),
1160
+ "domain_code": domain_code,
1161
+ "level": practice.get("level", 2),
1162
+ "title": practice.get("title", ""),
1163
+ "description": practice.get("description", ""),
1164
+ "priority": practice.get("priority", "medium"),
1165
+ "automation_level": automation_level,
1166
+ "nist_800_53_controls": practice.get("nist_800_53_controls", []),
1167
+ "nist_800_171_id": practice.get("nist_800_171_id", ""),
1168
+ "status": status,
1169
+ "evidence": evidence,
1170
+ "details": details,
1171
+ "notes": notes,
1172
+ }
1173
+ results.append(result_entry)
1174
+
1175
+ # 6. Store in cmmc_assessments table
1176
+ try:
1177
+ conn.execute(
1178
+ """INSERT OR REPLACE INTO cmmc_assessments
1179
+ (project_id, assessment_date, assessor, level,
1180
+ practice_id, domain, status, evidence_description,
1181
+ evidence_path, automation_result, nist_171_id,
1182
+ notes, updated_at)
1183
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
1184
+ (
1185
+ project_id,
1186
+ now.isoformat(),
1187
+ "icdev-compliance-engine",
1188
+ level,
1189
+ pid,
1190
+ practice.get("domain", ""),
1191
+ status,
1192
+ evidence,
1193
+ details if details else None,
1194
+ json.dumps({
1195
+ "automation_level": automation_level,
1196
+ "inherited": inh.get("inherited", False),
1197
+ }),
1198
+ practice.get("nist_800_171_id", ""),
1199
+ notes if notes else None,
1200
+ now.isoformat(),
1201
+ ),
1202
+ )
1203
+ except Exception as e:
1204
+ print(
1205
+ f"Warning: Could not upsert assessment for {pid}: {e}",
1206
+ file=sys.stderr,
1207
+ )
1208
+
1209
+ conn.commit()
1210
+
1211
+ # 7. Compute per-domain and overall scores
1212
+ domain_scores = {}
1213
+ for domain_code, domain_name in CMMC_DOMAINS:
1214
+ domain_practices = [
1215
+ r for r in results if r["domain_code"] == domain_code
1216
+ ]
1217
+ total = len(domain_practices)
1218
+ if total == 0:
1219
+ domain_scores[domain_code] = {
1220
+ "name": domain_name,
1221
+ "score": 0.0,
1222
+ "total": 0,
1223
+ "met": 0,
1224
+ "partially_met": 0,
1225
+ "not_met": 0,
1226
+ "not_assessed": 0,
1227
+ "not_applicable": 0,
1228
+ }
1229
+ continue
1230
+
1231
+ met = sum(1 for p in domain_practices if p["status"] == "met")
1232
+ partial = sum(1 for p in domain_practices if p["status"] == "partially_met")
1233
+ not_met = sum(1 for p in domain_practices if p["status"] == "not_met")
1234
+ na = sum(1 for p in domain_practices if p["status"] == "not_applicable")
1235
+ not_assessed = sum(1 for p in domain_practices if p["status"] == "not_assessed")
1236
+
1237
+ scoreable = total - na
1238
+ if scoreable > 0:
1239
+ score = 100.0 * (met + partial * 0.5) / scoreable
1240
+ else:
1241
+ score = 100.0 # All N/A
1242
+
1243
+ domain_scores[domain_code] = {
1244
+ "name": domain_name,
1245
+ "score": round(score, 1),
1246
+ "total": total,
1247
+ "met": met,
1248
+ "partially_met": partial,
1249
+ "not_met": not_met,
1250
+ "not_assessed": not_assessed,
1251
+ "not_applicable": na,
1252
+ }
1253
+
1254
+ # Overall: weighted average across 14 domains
1255
+ scoreable_domains = [
1256
+ s for s in domain_scores.values() if s["total"] > 0
1257
+ ]
1258
+ if scoreable_domains:
1259
+ # Weight by number of practices
1260
+ total_practices = sum(s["total"] - s["not_applicable"] for s in scoreable_domains)
1261
+ if total_practices > 0:
1262
+ weighted_sum = sum(
1263
+ s["score"] * (s["total"] - s["not_applicable"])
1264
+ for s in scoreable_domains
1265
+ )
1266
+ overall_score = round(weighted_sum / total_practices, 1)
1267
+ else:
1268
+ overall_score = 100.0
1269
+ else:
1270
+ overall_score = 0.0
1271
+
1272
+ # Spill score: count of "not_met" practices
1273
+ spill_score = sum(1 for r in results if r["status"] == "not_met")
1274
+
1275
+ # 8. Gate evaluation
1276
+ # Level 2: 0 "not_met" critical practices
1277
+ # Level 3: same + additional 800-172 checks
1278
+ critical_not_met = []
1279
+ for r in results:
1280
+ if r["priority"] == "critical" and r["status"] == "not_met":
1281
+ critical_not_met.append(f"{r['practice_id']}: {r['title']}")
1282
+
1283
+ gate_passed = len(critical_not_met) == 0
1284
+ gate_result = {
1285
+ "evaluated": gate,
1286
+ "level": level,
1287
+ "passed": gate_passed,
1288
+ "critical_not_met": len(critical_not_met),
1289
+ "critical_failures": critical_not_met,
1290
+ "spill_score": spill_score,
1291
+ "reason": (
1292
+ f"PASS: 0 critical practices not_met for Level {level}"
1293
+ if gate_passed
1294
+ else (
1295
+ f"FAIL: {len(critical_not_met)} critical practice(s) not_met: "
1296
+ f"{', '.join(critical_not_met[:5])}"
1297
+ )
1298
+ ),
1299
+ }
1300
+
1301
+ # Compute SPRS score estimate (DFARS 252.204-7019/7020)
1302
+ # SPRS = 110 - (5 * critical_not_met) - (3 * high_not_met) - (1 * other_not_met)
1303
+ high_not_met = sum(
1304
+ 1 for r in results
1305
+ if r["priority"] == "high" and r["status"] == "not_met"
1306
+ )
1307
+ other_not_met = sum(
1308
+ 1 for r in results
1309
+ if r["priority"] not in ("critical", "high") and r["status"] == "not_met"
1310
+ )
1311
+ sprs_score = max(
1312
+ -203,
1313
+ 110 - (5 * len(critical_not_met)) - (3 * high_not_met) - (1 * other_not_met)
1314
+ )
1315
+
1316
+ # 9. Log audit event
1317
+ _log_audit_event(
1318
+ conn,
1319
+ project_id,
1320
+ f"CMMC Level {level} assessment completed",
1321
+ {
1322
+ "level": level,
1323
+ "practices_assessed": len(results),
1324
+ "overall_score": overall_score,
1325
+ "spill_score": spill_score,
1326
+ "sprs_score": sprs_score,
1327
+ "gate_result": gate_result,
1328
+ "domain_scores": {
1329
+ k: v["score"] for k, v in domain_scores.items()
1330
+ if v["total"] > 0
1331
+ },
1332
+ },
1333
+ )
1334
+
1335
+ # Summary counts
1336
+ total_met = sum(1 for r in results if r["status"] == "met")
1337
+ total_not_met = sum(1 for r in results if r["status"] == "not_met")
1338
+ total_partial = sum(1 for r in results if r["status"] == "partially_met")
1339
+ total_na = sum(1 for r in results if r["status"] == "not_applicable")
1340
+ total_not_assessed = sum(1 for r in results if r["status"] == "not_assessed")
1341
+
1342
+ # Console output
1343
+ print(f"CMMC Level {level} assessment completed:")
1344
+ print(f" Project: {project.get('name', project_id)}")
1345
+ print(f" Practices assessed: {len(results)}")
1346
+ print(f" Overall score: {overall_score}%")
1347
+ print(f" SPRS score estimate: {sprs_score}")
1348
+ for domain_code, domain_name in CMMC_DOMAINS:
1349
+ s = domain_scores.get(domain_code, {})
1350
+ if s.get("total", 0) == 0:
1351
+ continue
1352
+ print(
1353
+ f" {domain_code} ({domain_name}): "
1354
+ f"MET={s['met']} PARTIAL={s['partially_met']} "
1355
+ f"NOT_MET={s['not_met']} N/A={s['not_applicable']}"
1356
+ )
1357
+
1358
+ if gate:
1359
+ print(f"\n Gate: {gate_result['reason']}")
1360
+
1361
+ return {
1362
+ "project_id": project_id,
1363
+ "level": level,
1364
+ "practices_assessed": len(results),
1365
+ "overall_score": overall_score,
1366
+ "spill_score": spill_score,
1367
+ "sprs_score": sprs_score,
1368
+ "domain_scores": domain_scores,
1369
+ "gate_result": gate_result,
1370
+ "practices_met": total_met,
1371
+ "practices_not_met": total_not_met,
1372
+ "practices_partial": total_partial,
1373
+ "practices_na": total_na,
1374
+ "practices_not_assessed": total_not_assessed,
1375
+ "results": results,
1376
+ }
1377
+
1378
+ finally:
1379
+ conn.close()
1380
+
1381
+
1382
+ def assess_project(
1383
+ project_id,
1384
+ level=2,
1385
+ project_dir=None,
1386
+ gate=False,
1387
+ output_path=None,
1388
+ db_path=None,
1389
+ ):
1390
+ """Alias for run_cmmc_assessment (MCP compatibility)."""
1391
+ return run_cmmc_assessment(
1392
+ project_id,
1393
+ level=level,
1394
+ project_dir=project_dir,
1395
+ gate=gate,
1396
+ output_path=output_path,
1397
+ db_path=db_path,
1398
+ )
1399
+
1400
+
1401
+ # -----------------------------------------------------------------
1402
+ # CLI entrypoint
1403
+ # -----------------------------------------------------------------
1404
+
1405
+ if __name__ == "__main__":
1406
+ parser = argparse.ArgumentParser(
1407
+ description="Run CMMC Level 2/3 assessment"
1408
+ )
1409
+ parser.add_argument(
1410
+ "--project-id", required=True, help="Project ID"
1411
+ )
1412
+ parser.add_argument(
1413
+ "--level", type=int, default=2, choices=[2, 3],
1414
+ help="CMMC level (2 or 3, default: 2)",
1415
+ )
1416
+ parser.add_argument(
1417
+ "--domain",
1418
+ choices=[code for code, _ in CMMC_DOMAINS],
1419
+ help="Assess only a specific domain (default: all)",
1420
+ )
1421
+ parser.add_argument(
1422
+ "--project-dir",
1423
+ help="Project directory for automated file-based checks",
1424
+ )
1425
+ parser.add_argument(
1426
+ "--gate", action="store_true",
1427
+ help="Evaluate CMMC gate (0 critical not_met = pass)",
1428
+ )
1429
+ parser.add_argument(
1430
+ "--output-dir",
1431
+ help="Output directory for the assessment report",
1432
+ )
1433
+ parser.add_argument(
1434
+ "--db-path", type=Path, default=DB_PATH,
1435
+ help="Override database path",
1436
+ )
1437
+ parser.add_argument(
1438
+ "--json", action="store_true",
1439
+ help="Output results as JSON",
1440
+ )
1441
+ args = parser.parse_args()
1442
+
1443
+ try:
1444
+ result = run_cmmc_assessment(
1445
+ project_id=args.project_id,
1446
+ level=args.level,
1447
+ project_dir=args.project_dir,
1448
+ gate=args.gate,
1449
+ output_path=args.output_dir,
1450
+ db_path=args.db_path,
1451
+ )
1452
+
1453
+ if args.json:
1454
+ # Remove full results list for cleaner JSON output
1455
+ output = {
1456
+ k: v for k, v in result.items() if k != "results"
1457
+ }
1458
+ print(json.dumps(output, indent=2))
1459
+ else:
1460
+ print(
1461
+ json.dumps(
1462
+ {
1463
+ "overall_score": result.get("overall_score"),
1464
+ "sprs_score": result.get("sprs_score"),
1465
+ "gate_result": result.get("gate_result"),
1466
+ "practices_met": result.get("practices_met"),
1467
+ "practices_not_met": result.get("practices_not_met"),
1468
+ },
1469
+ indent=2,
1470
+ )
1471
+ )
1472
+
1473
+ if args.gate and not result["gate_result"]["passed"]:
1474
+ sys.exit(1)
1475
+
1476
+ except (FileNotFoundError, ValueError) as e:
1477
+ print(f"ERROR: {e}", file=sys.stderr)
1478
+ sys.exit(1)