icdev 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1105) hide show
  1. icdev/__init__.py +18 -0
  2. icdev/_paths.py +85 -0
  3. icdev/_version.py +3 -0
  4. icdev/data/__init__.py +1 -0
  5. icdev/data/args/__init__.py +1 -0
  6. icdev/data/args/agent_authority.yaml +61 -0
  7. icdev/data/args/agent_config.yaml +355 -0
  8. icdev/data/args/agentic_fitness.yaml +31 -0
  9. icdev/data/args/ai_governance_config.yaml +137 -0
  10. icdev/data/args/atlas_critique_config.yaml +66 -0
  11. icdev/data/args/bedrock_models.yaml +63 -0
  12. icdev/data/args/cicd_config.yaml +82 -0
  13. icdev/data/args/classification_config.yaml +232 -0
  14. icdev/data/args/cli_config.yaml +154 -0
  15. icdev/data/args/cloud_config.yaml +63 -0
  16. icdev/data/args/code_pattern_config.yaml +151 -0
  17. icdev/data/args/code_quality_config.yaml +47 -0
  18. icdev/data/args/companion_registry.yaml +202 -0
  19. icdev/data/args/context_config.yaml +82 -0
  20. icdev/data/args/csp_monitor_config.yaml +268 -0
  21. icdev/data/args/cui_markings.yaml +35 -0
  22. icdev/data/args/db_config.yaml +40 -0
  23. icdev/data/args/deployment_profiles.yaml +248 -0
  24. icdev/data/args/dev_profile_config.yaml +144 -0
  25. icdev/data/args/devsecops_config.yaml +286 -0
  26. icdev/data/args/endpoint_security_config.yaml +137 -0
  27. icdev/data/args/extension_config.yaml +79 -0
  28. icdev/data/args/file_access_tiers.yaml +88 -0
  29. icdev/data/args/framework_registry.yaml +415 -0
  30. icdev/data/args/innovation_config.yaml +431 -0
  31. icdev/data/args/installation_manifest.yaml +1087 -0
  32. icdev/data/args/llm_config.yaml +495 -0
  33. icdev/data/args/maintenance_config.yaml +55 -0
  34. icdev/data/args/memory_config.yaml +83 -0
  35. icdev/data/args/monitoring_config.yaml +127 -0
  36. icdev/data/args/mosa_config.yaml +190 -0
  37. icdev/data/args/nlq_config.yaml +35 -0
  38. icdev/data/args/observability_config.yaml +39 -0
  39. icdev/data/args/observability_tracing_config.yaml +170 -0
  40. icdev/data/args/oscal_tools_config.yaml +43 -0
  41. icdev/data/args/owasp_agentic_config.yaml +171 -0
  42. icdev/data/args/phase_registry.yaml +618 -0
  43. icdev/data/args/project_defaults.yaml +235 -0
  44. icdev/data/args/prompt_chains.yaml +163 -0
  45. icdev/data/args/resilience_config.yaml +50 -0
  46. icdev/data/args/ricoas_config.yaml +191 -0
  47. icdev/data/args/role_personas.yaml +362 -0
  48. icdev/data/args/scaling_config.yaml +176 -0
  49. icdev/data/args/security_gates.yaml +685 -0
  50. icdev/data/args/skill_injection_config.yaml +322 -0
  51. icdev/data/args/spec_config.yaml +53 -0
  52. icdev/data/args/supply_chain_config.yaml +76 -0
  53. icdev/data/args/translation_config.yaml +228 -0
  54. icdev/data/args/workflow_templates/ato_acceleration.yaml +54 -0
  55. icdev/data/args/workflow_templates/build_deploy.yaml +63 -0
  56. icdev/data/args/workflow_templates/full_compliance.yaml +43 -0
  57. icdev/data/args/workflow_templates/security_hardening.yaml +55 -0
  58. icdev/data/args/worktree_config.yaml +34 -0
  59. icdev/data/args/zta_config.yaml +247 -0
  60. icdev/data/context/__init__.py +1 -0
  61. icdev/data/context/agent/__init__.py +1 -0
  62. icdev/data/context/agent/response_schemas/__init__.py +1 -0
  63. icdev/data/context/agent/response_schemas/debate_position.json +46 -0
  64. icdev/data/context/agent/response_schemas/fitness_scorecard.json +74 -0
  65. icdev/data/context/agent/response_schemas/review_decision.json +39 -0
  66. icdev/data/context/agent/response_schemas/task_decomposition.json +82 -0
  67. icdev/data/context/agent/response_schemas/veto_decision.json +40 -0
  68. icdev/data/context/agentic/__init__.py +1 -0
  69. icdev/data/context/agentic/architecture_patterns.md +269 -0
  70. icdev/data/context/agentic/capability_registry.yaml +202 -0
  71. icdev/data/context/agentic/csp_mcp_registry.yaml +280 -0
  72. icdev/data/context/agentic/fitness_rubric.md +56 -0
  73. icdev/data/context/agentic/governance_baseline.md +205 -0
  74. icdev/data/context/ci/__init__.py +1 -0
  75. icdev/data/context/ci/worktree_templates.json +44 -0
  76. icdev/data/context/cloud/__init__.py +1 -0
  77. icdev/data/context/cloud/csp_service_registry.json +739 -0
  78. icdev/data/context/compliance/__init__.py +1 -0
  79. icdev/data/context/compliance/atlas_mitigations.json +293 -0
  80. icdev/data/context/compliance/atlas_techniques.json +833 -0
  81. icdev/data/context/compliance/cisa_sbd_requirements.json +432 -0
  82. icdev/data/context/compliance/cjis_security_policy.json +522 -0
  83. icdev/data/context/compliance/cmmc_practices.json +2494 -0
  84. icdev/data/context/compliance/cmmc_report_template.md +142 -0
  85. icdev/data/context/compliance/cnssi_1253_overlay.json +109 -0
  86. icdev/data/context/compliance/control_crosswalk.json +1914 -0
  87. icdev/data/context/compliance/control_families/__init__.py +1 -0
  88. icdev/data/context/compliance/csp_certifications.json +251 -0
  89. icdev/data/context/compliance/cssp_report_template.md +193 -0
  90. icdev/data/context/compliance/cui_templates/__init__.py +1 -0
  91. icdev/data/context/compliance/cui_templates/banner_block.txt +4 -0
  92. icdev/data/context/compliance/cui_templates/code_header.txt +8 -0
  93. icdev/data/context/compliance/cui_templates/document_template.md +35 -0
  94. icdev/data/context/compliance/data_type_framework_map.json +321 -0
  95. icdev/data/context/compliance/data_type_registry.json +147 -0
  96. icdev/data/context/compliance/dod_cssp_8530.json +463 -0
  97. icdev/data/context/compliance/eu_ai_act_annex_iii.json +108 -0
  98. icdev/data/context/compliance/export_templates/__init__.py +1 -0
  99. icdev/data/context/compliance/export_templates/emass_controls.csv.j2 +4 -0
  100. icdev/data/context/compliance/export_templates/evidence_package.md.j2 +39 -0
  101. icdev/data/context/compliance/export_templates/executive_summary.md.j2 +55 -0
  102. icdev/data/context/compliance/export_templates/poam_tracking.csv.j2 +4 -0
  103. icdev/data/context/compliance/fedramp_20x_ksi_schemas.json +133 -0
  104. icdev/data/context/compliance/fedramp_high_baseline.json +4370 -0
  105. icdev/data/context/compliance/fedramp_moderate_baseline.json +2183 -0
  106. icdev/data/context/compliance/fedramp_report_template.md +181 -0
  107. icdev/data/context/compliance/fips_200_areas.json +362 -0
  108. icdev/data/context/compliance/gao_ai_accountability.json +262 -0
  109. icdev/data/context/compliance/hipaa_security_rule.json +720 -0
  110. icdev/data/context/compliance/hitrust_csf_v11.json +930 -0
  111. icdev/data/context/compliance/impact_level_profiles.json +251 -0
  112. icdev/data/context/compliance/incident_response_template.md +1110 -0
  113. icdev/data/context/compliance/iso27001_2022_controls.json +750 -0
  114. icdev/data/context/compliance/iso27001_nist_bridge.json +382 -0
  115. icdev/data/context/compliance/iso42001_controls.json +254 -0
  116. icdev/data/context/compliance/ivv_checklist_template.md +80 -0
  117. icdev/data/context/compliance/ivv_report_template.md +116 -0
  118. icdev/data/context/compliance/ivv_requirements.json +372 -0
  119. icdev/data/context/compliance/mosa_crosswalk.json +327 -0
  120. icdev/data/context/compliance/mosa_framework.json +250 -0
  121. icdev/data/context/compliance/narrative_templates/AC.md.j2 +101 -0
  122. icdev/data/context/compliance/narrative_templates/AU.md.j2 +106 -0
  123. icdev/data/context/compliance/narrative_templates/IA.md.j2 +104 -0
  124. icdev/data/context/compliance/narrative_templates/SC.md.j2 +102 -0
  125. icdev/data/context/compliance/narrative_templates/SI.md.j2 +111 -0
  126. icdev/data/context/compliance/narrative_templates/__init__.py +1 -0
  127. icdev/data/context/compliance/narrative_templates/default.md.j2 +50 -0
  128. icdev/data/context/compliance/narrative_templates/executive_summary.j2 +27 -0
  129. icdev/data/context/compliance/narrative_templates/poam_milestone.j2 +19 -0
  130. icdev/data/context/compliance/narrative_templates/ssp_section.j2 +11 -0
  131. icdev/data/context/compliance/nist_800_171_controls.json +1552 -0
  132. icdev/data/context/compliance/nist_800_207_crosswalk.json +399 -0
  133. icdev/data/context/compliance/nist_800_207_zta.json +258 -0
  134. icdev/data/context/compliance/nist_800_53.json +324 -0
  135. icdev/data/context/compliance/nist_ai_600_1_genai.json +326 -0
  136. icdev/data/context/compliance/nist_ai_rmf.json +206 -0
  137. icdev/data/context/compliance/nist_sp_800_60_types.json +1667 -0
  138. icdev/data/context/compliance/omb_m25_21_high_impact_ai.json +248 -0
  139. icdev/data/context/compliance/omb_m26_04_unbiased_ai.json +262 -0
  140. icdev/data/context/compliance/owasp_agentic_asi.json +133 -0
  141. icdev/data/context/compliance/owasp_agentic_threats.json +285 -0
  142. icdev/data/context/compliance/owasp_llm_top10.json +274 -0
  143. icdev/data/context/compliance/pci_dss_v4.json +510 -0
  144. icdev/data/context/compliance/poam_template.md +117 -0
  145. icdev/data/context/compliance/safeai_controls.json +512 -0
  146. icdev/data/context/compliance/sbd_report_template.md +77 -0
  147. icdev/data/context/compliance/siem_config_templates/__init__.py +1 -0
  148. icdev/data/context/compliance/siem_config_templates/filebeat.yml +213 -0
  149. icdev/data/context/compliance/siem_config_templates/log_sources.json +208 -0
  150. icdev/data/context/compliance/soc2_trust_criteria.json +661 -0
  151. icdev/data/context/compliance/ssp_template.md +432 -0
  152. icdev/data/context/compliance/stig_templates/__init__.py +1 -0
  153. icdev/data/context/compliance/stig_templates/webapp_stig.json +139 -0
  154. icdev/data/context/compliance/xai_requirements.json +108 -0
  155. icdev/data/context/dashboard/__init__.py +1 -0
  156. icdev/data/context/dashboard/nlq_examples.json +50 -0
  157. icdev/data/context/dashboard/schema_descriptions.json +23 -0
  158. icdev/data/context/integration/__init__.py +1 -0
  159. icdev/data/context/integration/approval_workflows.json +32 -0
  160. icdev/data/context/integration/gitlab_field_mappings.json +33 -0
  161. icdev/data/context/integration/jira_field_mappings.json +32 -0
  162. icdev/data/context/integration/reqif_export_schema.json +23 -0
  163. icdev/data/context/integration/servicenow_field_mappings.json +22 -0
  164. icdev/data/context/languages/__init__.py +1 -0
  165. icdev/data/context/languages/framework_patterns.json +205 -0
  166. icdev/data/context/languages/language_registry.json +279 -0
  167. icdev/data/context/llm/__init__.py +1 -0
  168. icdev/data/context/llm/example_provider.py +86 -0
  169. icdev/data/context/mbse/__init__.py +1 -0
  170. icdev/data/context/mbse/des_report_template.md +162 -0
  171. icdev/data/context/mbse/des_requirements.json +411 -0
  172. icdev/data/context/mbse/digital_thread_patterns.json +403 -0
  173. icdev/data/context/mbse/reqif_schema.json +280 -0
  174. icdev/data/context/mbse/sysml_element_types.json +432 -0
  175. icdev/data/context/modernization/__init__.py +1 -0
  176. icdev/data/context/modernization/db_type_mappings.json +148 -0
  177. icdev/data/context/modernization/decomposition_patterns.json +284 -0
  178. icdev/data/context/modernization/framework_migration_patterns.json +359 -0
  179. icdev/data/context/modernization/migration_report_template.md +168 -0
  180. icdev/data/context/modernization/seven_rs_catalog.json +369 -0
  181. icdev/data/context/modernization/version_upgrade_rules.json +279 -0
  182. icdev/data/context/oscal/NIST_SP-800-53_rev5_catalog.json +254987 -0
  183. icdev/data/context/oscal/README.md +43 -0
  184. icdev/data/context/patterns/__init__.py +1 -0
  185. icdev/data/context/profiles/__init__.py +1 -0
  186. icdev/data/context/profiles/dod_baseline_v1.yaml +145 -0
  187. icdev/data/context/profiles/fedramp_baseline_v1.yaml +143 -0
  188. icdev/data/context/profiles/financial_baseline_v1.yaml +142 -0
  189. icdev/data/context/profiles/healthcare_baseline_v1.yaml +135 -0
  190. icdev/data/context/profiles/law_enforcement_v1.yaml +129 -0
  191. icdev/data/context/profiles/startup_v1.yaml +134 -0
  192. icdev/data/context/requirements/__init__.py +1 -0
  193. icdev/data/context/requirements/ambiguity_patterns.json +97 -0
  194. icdev/data/context/requirements/boundary_impact_rules.json +123 -0
  195. icdev/data/context/requirements/default_constitutions.json +67 -0
  196. icdev/data/context/requirements/document_extraction_rules.json +58 -0
  197. icdev/data/context/requirements/gap_patterns.json +108 -0
  198. icdev/data/context/requirements/readiness_rubric.json +78 -0
  199. icdev/data/context/requirements/red_alternative_patterns.json +210 -0
  200. icdev/data/context/requirements/safe_templates.json +72 -0
  201. icdev/data/context/requirements/spec_quality_checklist.json +122 -0
  202. icdev/data/context/simulation/__init__.py +1 -0
  203. icdev/data/context/simulation/architecture_patterns.json +36 -0
  204. icdev/data/context/simulation/coa_templates.json +38 -0
  205. icdev/data/context/simulation/cost_models.json +23 -0
  206. icdev/data/context/simulation/risk_categories.json +46 -0
  207. icdev/data/context/supply_chain/__init__.py +1 -0
  208. icdev/data/context/supply_chain/isa_templates.json +129 -0
  209. icdev/data/context/supply_chain/nist_800_161_controls.json +247 -0
  210. icdev/data/context/supply_chain/scrm_risk_matrix.json +147 -0
  211. icdev/data/context/templates/__init__.py +1 -0
  212. icdev/data/context/templates/ansible/__init__.py +1 -0
  213. icdev/data/context/templates/ansible/playbooks/__init__.py +1 -0
  214. icdev/data/context/templates/ansible/roles/__init__.py +1 -0
  215. icdev/data/context/templates/gitlab_ci/__init__.py +1 -0
  216. icdev/data/context/templates/grafana/__init__.py +1 -0
  217. icdev/data/context/templates/kubernetes/__init__.py +1 -0
  218. icdev/data/context/templates/project/__init__.py +1 -0
  219. icdev/data/context/templates/project/api/__init__.py +1 -0
  220. icdev/data/context/templates/project/cli/__init__.py +1 -0
  221. icdev/data/context/templates/project/data_pipeline/__init__.py +1 -0
  222. icdev/data/context/templates/project/iac/__init__.py +1 -0
  223. icdev/data/context/templates/project/javascript_frontend/__init__.py +1 -0
  224. icdev/data/context/templates/project/javascript_frontend/src/__init__.py +1 -0
  225. icdev/data/context/templates/project/javascript_frontend/tests/__init__.py +1 -0
  226. icdev/data/context/templates/project/microservice/__init__.py +1 -0
  227. icdev/data/context/templates/project/python_backend/__init__.py +1 -0
  228. icdev/data/context/templates/project/python_backend/src/__init__.py +1 -0
  229. icdev/data/context/templates/project/python_backend/tests/__init__.py +1 -0
  230. icdev/data/context/templates/project/python_backend/tests/features/__init__.py +1 -0
  231. icdev/data/context/templates/project/python_backend/tests/steps/__init__.py +1 -0
  232. icdev/data/context/templates/terraform/__init__.py +1 -0
  233. icdev/data/context/templates/terraform/govcloud_base/__init__.py +1 -0
  234. icdev/data/context/templates/terraform/modules/__init__.py +1 -0
  235. icdev/data/context/tone/__init__.py +1 -0
  236. icdev/data/context/translation/dependency_mappings.json +186 -0
  237. icdev/data/context/translation/type_mappings.json +149 -0
  238. icdev/data/docs/README.md +187 -0
  239. icdev/data/docs/__init__.py +1 -0
  240. icdev/data/docs/admin/gateway-guide.md +338 -0
  241. icdev/data/docs/admin/marketplace-guide.md +396 -0
  242. icdev/data/docs/admin/monitoring-guide.md +509 -0
  243. icdev/data/docs/architecture/compliance-framework.md +764 -0
  244. icdev/data/docs/architecture/database-schema.md +689 -0
  245. icdev/data/docs/architecture/gotcha-framework.md +518 -0
  246. icdev/data/docs/architecture/multi-agent-system.md +603 -0
  247. icdev/data/docs/dx/README.md +106 -0
  248. icdev/data/docs/dx/__init__.py +1 -0
  249. icdev/data/docs/dx/ci-cd-integration.md +378 -0
  250. icdev/data/docs/dx/claude-code-guide.md +213 -0
  251. icdev/data/docs/dx/companion-guide.md +232 -0
  252. icdev/data/docs/dx/dev-profiles.md +309 -0
  253. icdev/data/docs/dx/icdev-yaml-spec.md +219 -0
  254. icdev/data/docs/dx/integration-tiers.md +279 -0
  255. icdev/data/docs/dx/llm-routing-guide.md +456 -0
  256. icdev/data/docs/dx/quickstart.md +192 -0
  257. icdev/data/docs/dx/sdk-reference.md +356 -0
  258. icdev/data/docs/dx/unified-mcp-setup.md +525 -0
  259. icdev/data/docs/features/__init__.py +1 -0
  260. icdev/data/docs/features/phase-01-gotcha-framework.md +249 -0
  261. icdev/data/docs/features/phase-02-atlas-build-workflow.md +223 -0
  262. icdev/data/docs/features/phase-03-tdd-bdd-testing.md +261 -0
  263. icdev/data/docs/features/phase-04-nist-compliance.md +255 -0
  264. icdev/data/docs/features/phase-05-security-scanning.md +229 -0
  265. icdev/data/docs/features/phase-06-infrastructure-deployment.md +288 -0
  266. icdev/data/docs/features/phase-07-code-review-gates.md +276 -0
  267. icdev/data/docs/features/phase-08-self-healing.md +223 -0
  268. icdev/data/docs/features/phase-09-monitoring-observability.md +230 -0
  269. icdev/data/docs/features/phase-10-dashboard-web-ui.md +218 -0
  270. icdev/data/docs/features/phase-11-multi-agent-architecture.md +272 -0
  271. icdev/data/docs/features/phase-12-integration-testing.md +228 -0
  272. icdev/data/docs/features/phase-13-cicd-integration.md +257 -0
  273. icdev/data/docs/features/phase-14-secure-by-design-ivv.md +240 -0
  274. icdev/data/docs/features/phase-15-maintenance-audit.md +192 -0
  275. icdev/data/docs/features/phase-16-ato-acceleration.md +228 -0
  276. icdev/data/docs/features/phase-17-multi-framework-compliance.md +223 -0
  277. icdev/data/docs/features/phase-18-mbse-integration.md +242 -0
  278. icdev/data/docs/features/phase-19-agentic-generation.md +202 -0
  279. icdev/data/docs/features/phase-20-fips-security-categorization.md +198 -0
  280. icdev/data/docs/features/phase-21-saas-multi-tenancy.md +273 -0
  281. icdev/data/docs/features/phase-22-federated-gotcha-marketplace.md +242 -0
  282. icdev/data/docs/features/phase-23-universal-compliance-platform.md +238 -0
  283. icdev/data/docs/features/phase-24-devsecops-pipeline-security.md +198 -0
  284. icdev/data/docs/features/phase-25-zero-trust-architecture.md +220 -0
  285. icdev/data/docs/features/phase-26-dod-mosa.md +205 -0
  286. icdev/data/docs/features/phase-27-cli-capabilities.md +222 -0
  287. icdev/data/docs/features/phase-28-remote-command-gateway.md +235 -0
  288. icdev/data/docs/features/phase-29-proactive-monitoring.md +212 -0
  289. icdev/data/docs/features/phase-30-dashboard-auth.md +215 -0
  290. icdev/data/docs/features/phase-31-dashboard-ux-low-impact.md +188 -0
  291. icdev/data/docs/features/phase-32-dashboard-ux-medium-impact.md +223 -0
  292. icdev/data/docs/features/phase-33-modular-installation.md +218 -0
  293. icdev/data/docs/features/phase-34-dev-profiles.md +239 -0
  294. icdev/data/docs/features/phase-35-innovation-engine.md +257 -0
  295. icdev/data/docs/features/phase-36-evolutionary-intelligence.md +351 -0
  296. icdev/data/docs/features/phase-37-mitre-atlas-integration.md +485 -0
  297. icdev/data/docs/features/phase-38-cloud-agnostic-architecture.md +1033 -0
  298. icdev/data/docs/features/phase-39-observability-operations.md +178 -0
  299. icdev/data/docs/features/phase-40-nlq-compliance-queries.md +176 -0
  300. icdev/data/docs/features/phase-41-parallel-cicd.md +169 -0
  301. icdev/data/docs/features/phase-42-framework-planning.md +177 -0
  302. icdev/data/docs/features/phase-43-cross-language-translation.md +225 -0
  303. icdev/data/docs/features/phase-44-innovation-adaptation.md +227 -0
  304. icdev/data/docs/features/phase-45-owasp-agentic-security.md +239 -0
  305. icdev/data/docs/features/phase-46-observability-traceability-xai.md +240 -0
  306. icdev/data/docs/features/phase-47-unified-mcp-gateway.md +257 -0
  307. icdev/data/docs/features/phase-48-ai-transparency.md +203 -0
  308. icdev/data/docs/features/phase-49-ai-accountability.md +243 -0
  309. icdev/data/docs/features/phase-50-ai-governance-intake-chat.md +195 -0
  310. icdev/data/docs/features/phase-51-unified-chat-dashboard.md +240 -0
  311. icdev/data/docs/features/phase-52-code-intelligence.md +244 -0
  312. icdev/data/docs/features/phase-53-fedramp-20x-owasp-asi.md +359 -0
  313. icdev/data/docs/features/phase-54-slsa-swft-orchestration.md +379 -0
  314. icdev/data/docs/features/phase-55-a2a-v03-mcp-oauth.md +322 -0
  315. icdev/data/docs/features/phase-56-evidence-lineage.md +352 -0
  316. icdev/data/docs/features/phase-57-eu-ai-act-iron-bank.md +319 -0
  317. icdev/data/docs/features/phase-58-creative-engine.md +370 -0
  318. icdev/data/docs/features/phase-59-govcon-intelligence.md +535 -0
  319. icdev/data/docs/features/phase-60-cpmp.md +528 -0
  320. icdev/data/docs/features/phase-61-orchestration-improvements.md +534 -0
  321. icdev/data/docs/operations/dashboard-guide.md +354 -0
  322. icdev/data/docs/operations/deployment-guide.md +556 -0
  323. icdev/data/docs/operations/saas-admin-guide.md +439 -0
  324. icdev/data/docs/operations/security-operations-guide.md +733 -0
  325. icdev/data/docs/runbooks/backup-restore.md +412 -0
  326. icdev/data/docs/runbooks/troubleshooting.md +499 -0
  327. icdev/data/features/__init__.py +1 -0
  328. icdev/data/features/cicd_integration.feature +41 -0
  329. icdev/data/features/compliance_gates.feature +46 -0
  330. icdev/data/features/dashboard.feature +72 -0
  331. icdev/data/features/environment.py +25 -0
  332. icdev/data/features/project_management.feature +32 -0
  333. icdev/data/features/requirements_intake.feature +42 -0
  334. icdev/data/features/saas_platform.feature +53 -0
  335. icdev/data/features/security_scanning.feature +36 -0
  336. icdev/data/features/steps/__init__.py +1 -0
  337. icdev/data/features/steps/cicd_steps.py +465 -0
  338. icdev/data/features/steps/compliance_steps.py +308 -0
  339. icdev/data/features/steps/dashboard_steps.py +88 -0
  340. icdev/data/features/steps/project_steps.py +126 -0
  341. icdev/data/features/steps/requirements_intake_steps.py +689 -0
  342. icdev/data/features/steps/saas_platform_steps.py +572 -0
  343. icdev/data/features/steps/security_steps.py +236 -0
  344. icdev/data/features/steps/testing_steps.py +226 -0
  345. icdev/data/features/testing_pipeline.feature +42 -0
  346. icdev/data/goals/__init__.py +1 -0
  347. icdev/data/goals/agent_management.md +144 -0
  348. icdev/data/goals/agentic_generation.md +345 -0
  349. icdev/data/goals/agentic_threat_model.md +309 -0
  350. icdev/data/goals/ai_accountability.md +90 -0
  351. icdev/data/goals/ai_governance_intake.md +132 -0
  352. icdev/data/goals/ai_transparency.md +76 -0
  353. icdev/data/goals/atlas_integration.md +405 -0
  354. icdev/data/goals/ato_acceleration.md +139 -0
  355. icdev/data/goals/boundary_supply_chain.md +206 -0
  356. icdev/data/goals/build_app.md +544 -0
  357. icdev/data/goals/cicd_integration.md +86 -0
  358. icdev/data/goals/claude_dir_maintenance.md +77 -0
  359. icdev/data/goals/cli_capabilities.md +340 -0
  360. icdev/data/goals/cloud_agnostic.md +312 -0
  361. icdev/data/goals/code_intelligence.md +197 -0
  362. icdev/data/goals/code_review.md +94 -0
  363. icdev/data/goals/compliance_workflow.md +858 -0
  364. icdev/data/goals/continuous_harmonization.md +140 -0
  365. icdev/data/goals/cross_language_translation.md +171 -0
  366. icdev/data/goals/dashboard.md +142 -0
  367. icdev/data/goals/deploy_workflow.md +390 -0
  368. icdev/data/goals/devsecops_workflow.md +408 -0
  369. icdev/data/goals/evolutionary_intelligence.md +305 -0
  370. icdev/data/goals/external_integration.md +113 -0
  371. icdev/data/goals/framework_planning.md +63 -0
  372. icdev/data/goals/init_project.md +235 -0
  373. icdev/data/goals/innovation_engine.md +199 -0
  374. icdev/data/goals/integration_testing.md +189 -0
  375. icdev/data/goals/maintenance_audit.md +196 -0
  376. icdev/data/goals/manifest.md +56 -0
  377. icdev/data/goals/mbse_integration.md +504 -0
  378. icdev/data/goals/modernization_workflow.md +618 -0
  379. icdev/data/goals/monitoring.md +126 -0
  380. icdev/data/goals/mosa_workflow.md +463 -0
  381. icdev/data/goals/multi_agent_orchestration.md +68 -0
  382. icdev/data/goals/nlq_compliance.md +63 -0
  383. icdev/data/goals/observability.md +64 -0
  384. icdev/data/goals/observability_traceability_xai.md +154 -0
  385. icdev/data/goals/owasp_agentic_security.md +395 -0
  386. icdev/data/goals/parallel_cicd.md +61 -0
  387. icdev/data/goals/requirements_intake.md +213 -0
  388. icdev/data/goals/sbd_ivv_workflow.md +195 -0
  389. icdev/data/goals/security_categorization.md +133 -0
  390. icdev/data/goals/security_scan.md +381 -0
  391. icdev/data/goals/self_healing.md +120 -0
  392. icdev/data/goals/simulation_engine.md +111 -0
  393. icdev/data/goals/tdd_workflow.md +403 -0
  394. icdev/data/goals/zero_trust_architecture.md +403 -0
  395. icdev/data/hardprompts/__init__.py +1 -0
  396. icdev/data/hardprompts/agent/__init__.py +1 -0
  397. icdev/data/hardprompts/agent/agentic_architect.md +100 -0
  398. icdev/data/hardprompts/agent/debate_prompt.md +32 -0
  399. icdev/data/hardprompts/agent/fitness_evaluation.md +48 -0
  400. icdev/data/hardprompts/agent/governance_review.md +214 -0
  401. icdev/data/hardprompts/agent/reviewer_prompt.md +34 -0
  402. icdev/data/hardprompts/agent/skill_design.md +172 -0
  403. icdev/data/hardprompts/agent/task_decomposition.md +275 -0
  404. icdev/data/hardprompts/agent/veto_check_prompt.md +33 -0
  405. icdev/data/hardprompts/architect/__init__.py +1 -0
  406. icdev/data/hardprompts/architect/api_design.md +283 -0
  407. icdev/data/hardprompts/architect/data_model.md +277 -0
  408. icdev/data/hardprompts/architect/system_design.md +180 -0
  409. icdev/data/hardprompts/builder/__init__.py +1 -0
  410. icdev/data/hardprompts/builder/code_generation.md +59 -0
  411. icdev/data/hardprompts/builder/refactor.md +58 -0
  412. icdev/data/hardprompts/builder/scaffold_project.md +69 -0
  413. icdev/data/hardprompts/builder/test_generation.md +87 -0
  414. icdev/data/hardprompts/ci/__init__.py +1 -0
  415. icdev/data/hardprompts/ci/worktree_setup.md +35 -0
  416. icdev/data/hardprompts/compliance/__init__.py +1 -0
  417. icdev/data/hardprompts/compliance/cmmc_assessment.md +63 -0
  418. icdev/data/hardprompts/compliance/cssp_assessment.md +75 -0
  419. icdev/data/hardprompts/compliance/cui_marking.md +86 -0
  420. icdev/data/hardprompts/compliance/fedramp_assessment.md +55 -0
  421. icdev/data/hardprompts/compliance/ivv_assessment.md +96 -0
  422. icdev/data/hardprompts/compliance/poam_generation.md +57 -0
  423. icdev/data/hardprompts/compliance/sbd_assessment.md +101 -0
  424. icdev/data/hardprompts/compliance/security_categorization.md +74 -0
  425. icdev/data/hardprompts/compliance/ssp_generation.md +56 -0
  426. icdev/data/hardprompts/compliance/stig_evaluation.md +63 -0
  427. icdev/data/hardprompts/dashboard/__init__.py +1 -0
  428. icdev/data/hardprompts/dashboard/nlq_system_prompt.md +26 -0
  429. icdev/data/hardprompts/infra/__init__.py +1 -0
  430. icdev/data/hardprompts/infra/k8s_manifests.md +118 -0
  431. icdev/data/hardprompts/infra/pipeline_generation.md +160 -0
  432. icdev/data/hardprompts/infra/terraform_generation.md +92 -0
  433. icdev/data/hardprompts/integration/__init__.py +1 -0
  434. icdev/data/hardprompts/integration/approval_review.md +17 -0
  435. icdev/data/hardprompts/integration/jira_mapping.md +25 -0
  436. icdev/data/hardprompts/integration/servicenow_mapping.md +14 -0
  437. icdev/data/hardprompts/knowledge/__init__.py +1 -0
  438. icdev/data/hardprompts/knowledge/pattern_detection.md +73 -0
  439. icdev/data/hardprompts/knowledge/recommendation_engine.md +90 -0
  440. icdev/data/hardprompts/knowledge/root_cause_analysis.md +91 -0
  441. icdev/data/hardprompts/maintenance/__init__.py +1 -0
  442. icdev/data/hardprompts/maintenance/maintenance_assessment.md +82 -0
  443. icdev/data/hardprompts/mbse/__init__.py +1 -0
  444. icdev/data/hardprompts/mbse/digital_thread.md +67 -0
  445. icdev/data/hardprompts/mbse/model_import.md +62 -0
  446. icdev/data/hardprompts/mbse/model_to_code.md +65 -0
  447. icdev/data/hardprompts/modernization/__init__.py +1 -0
  448. icdev/data/hardprompts/modernization/legacy_analysis.md +93 -0
  449. icdev/data/hardprompts/modernization/migration_planning.md +150 -0
  450. icdev/data/hardprompts/modernization/seven_r_assessment.md +107 -0
  451. icdev/data/hardprompts/requirements/__init__.py +1 -0
  452. icdev/data/hardprompts/requirements/bdd_generation.md +35 -0
  453. icdev/data/hardprompts/requirements/clarification_prioritization.md +29 -0
  454. icdev/data/hardprompts/requirements/decomposition.md +60 -0
  455. icdev/data/hardprompts/requirements/document_extraction.md +45 -0
  456. icdev/data/hardprompts/requirements/gap_detection.md +70 -0
  457. icdev/data/hardprompts/requirements/intake_conversation.md +101 -0
  458. icdev/data/hardprompts/requirements/readiness_assessment.md +39 -0
  459. icdev/data/hardprompts/requirements/spec_quality.md +33 -0
  460. icdev/data/hardprompts/requirements/traceability_analysis.md +23 -0
  461. icdev/data/hardprompts/security/__init__.py +1 -0
  462. icdev/data/hardprompts/security/endpoint_security.md +78 -0
  463. icdev/data/hardprompts/security/threat_model.md +70 -0
  464. icdev/data/hardprompts/security/vulnerability_assessment.md +81 -0
  465. icdev/data/hardprompts/simulation/__init__.py +1 -0
  466. icdev/data/hardprompts/simulation/architecture_impact.md +27 -0
  467. icdev/data/hardprompts/simulation/coa_alternative.md +27 -0
  468. icdev/data/hardprompts/simulation/coa_generation.md +25 -0
  469. icdev/data/hardprompts/simulation/compliance_impact.md +28 -0
  470. icdev/data/hardprompts/simulation/cost_estimation.md +33 -0
  471. icdev/data/hardprompts/simulation/risk_assessment.md +28 -0
  472. icdev/data/hardprompts/translation/code_translation.md +68 -0
  473. icdev/data/hardprompts/translation/dependency_suggestion.md +44 -0
  474. icdev/data/hardprompts/translation/test_translation.md +64 -0
  475. icdev/data/hardprompts/translation/translation_repair.md +59 -0
  476. icdev/py.typed +0 -0
  477. icdev/tools/__init__.py +1 -0
  478. icdev/tools/_gen_formatter.py +12 -0
  479. icdev/tools/a2a/__init__.py +1 -0
  480. icdev/tools/a2a/agent_cards/architect.json +43 -0
  481. icdev/tools/a2a/agent_cards/builder.json +50 -0
  482. icdev/tools/a2a/agent_cards/compliance.json +57 -0
  483. icdev/tools/a2a/agent_cards/devsecops.json +71 -0
  484. icdev/tools/a2a/agent_cards/infra.json +57 -0
  485. icdev/tools/a2a/agent_cards/integration.json +57 -0
  486. icdev/tools/a2a/agent_cards/knowledge.json +43 -0
  487. icdev/tools/a2a/agent_cards/mbse.json +57 -0
  488. icdev/tools/a2a/agent_cards/modernization.json +50 -0
  489. icdev/tools/a2a/agent_cards/monitor.json +43 -0
  490. icdev/tools/a2a/agent_cards/orchestrator.json +36 -0
  491. icdev/tools/a2a/agent_cards/requirements_analyst.json +64 -0
  492. icdev/tools/a2a/agent_cards/security.json +50 -0
  493. icdev/tools/a2a/agent_cards/simulation.json +57 -0
  494. icdev/tools/a2a/agent_cards/supply_chain.json +50 -0
  495. icdev/tools/a2a/agent_client.py +349 -0
  496. icdev/tools/a2a/agent_registry.py +412 -0
  497. icdev/tools/a2a/agent_server.py +579 -0
  498. icdev/tools/a2a/task.py +200 -0
  499. icdev/tools/agent/__init__.py +2 -0
  500. icdev/tools/agent/a2a_agent_card_generator.py +285 -0
  501. icdev/tools/agent/a2a_discovery_server.py +250 -0
  502. icdev/tools/agent/agent_executor.py +529 -0
  503. icdev/tools/agent/agent_memory.py +557 -0
  504. icdev/tools/agent/agent_models.py +51 -0
  505. icdev/tools/agent/atlas_critique.py +908 -0
  506. icdev/tools/agent/authority.py +443 -0
  507. icdev/tools/agent/bedrock_client.py +1075 -0
  508. icdev/tools/agent/collaboration.py +871 -0
  509. icdev/tools/agent/dispatcher_mode.py +665 -0
  510. icdev/tools/agent/mailbox.py +575 -0
  511. icdev/tools/agent/prompt_chain_executor.py +1064 -0
  512. icdev/tools/agent/session_purpose.py +350 -0
  513. icdev/tools/agent/skill_router.py +638 -0
  514. icdev/tools/agent/skill_selector.py +486 -0
  515. icdev/tools/agent/team_orchestrator.py +1108 -0
  516. icdev/tools/agent/token_tracker.py +290 -0
  517. icdev/tools/analysis/__init__.py +1 -0
  518. icdev/tools/analysis/code_analyzer.py +780 -0
  519. icdev/tools/analysis/runtime_feedback.py +389 -0
  520. icdev/tools/audit/__init__.py +1 -0
  521. icdev/tools/audit/audit_logger.py +196 -0
  522. icdev/tools/audit/audit_query.py +157 -0
  523. icdev/tools/audit/decision_recorder.py +72 -0
  524. icdev/tools/builder/__init__.py +1 -0
  525. icdev/tools/builder/agentic_fitness.py +534 -0
  526. icdev/tools/builder/agentic_test_templates/test_a2a_callback.py +117 -0
  527. icdev/tools/builder/agentic_test_templates/test_a2a_lifecycle.feature +52 -0
  528. icdev/tools/builder/agentic_test_templates/test_agent_card.feature +37 -0
  529. icdev/tools/builder/agentic_test_templates/test_agent_health.py +128 -0
  530. icdev/tools/builder/agentic_test_templates/test_memory_system.feature +50 -0
  531. icdev/tools/builder/agentic_test_templates/test_skill_execution.feature +40 -0
  532. icdev/tools/builder/app_blueprint.py +1583 -0
  533. icdev/tools/builder/child_app_generator.py +2852 -0
  534. icdev/tools/builder/claude_md_generator.py +1734 -0
  535. icdev/tools/builder/code_generator.py +3703 -0
  536. icdev/tools/builder/db_init_generator.py +1709 -0
  537. icdev/tools/builder/dev_profile_manager.py +954 -0
  538. icdev/tools/builder/formatter.py +768 -0
  539. icdev/tools/builder/goal_adapter.py +592 -0
  540. icdev/tools/builder/gotcha_validator.py +812 -0
  541. icdev/tools/builder/language_support.py +441 -0
  542. icdev/tools/builder/linter.py +976 -0
  543. icdev/tools/builder/profile_detector.py +657 -0
  544. icdev/tools/builder/profile_md_generator.py +723 -0
  545. icdev/tools/builder/scaffolder.py +1590 -0
  546. icdev/tools/builder/scaffolder_extended.py +1771 -0
  547. icdev/tools/builder/test_writer.py +950 -0
  548. icdev/tools/ci/__init__.py +2 -0
  549. icdev/tools/ci/connectors/__init__.py +2 -0
  550. icdev/tools/ci/connectors/base_connector.py +80 -0
  551. icdev/tools/ci/connectors/connector_registry.py +188 -0
  552. icdev/tools/ci/connectors/mattermost_connector.py +159 -0
  553. icdev/tools/ci/connectors/slack_connector.py +197 -0
  554. icdev/tools/ci/core/__init__.py +2 -0
  555. icdev/tools/ci/core/air_gap_detector.py +115 -0
  556. icdev/tools/ci/core/comment_handler.py +192 -0
  557. icdev/tools/ci/core/conversation_manager.py +479 -0
  558. icdev/tools/ci/core/event_envelope.py +500 -0
  559. icdev/tools/ci/core/event_router.py +443 -0
  560. icdev/tools/ci/core/failure_parser.py +397 -0
  561. icdev/tools/ci/core/recovery_engine.py +527 -0
  562. icdev/tools/ci/modules/__init__.py +2 -0
  563. icdev/tools/ci/modules/agent.py +271 -0
  564. icdev/tools/ci/modules/git_ops.py +175 -0
  565. icdev/tools/ci/modules/state.py +117 -0
  566. icdev/tools/ci/modules/vcs.py +303 -0
  567. icdev/tools/ci/modules/workflow_ops.py +295 -0
  568. icdev/tools/ci/modules/worktree.py +340 -0
  569. icdev/tools/ci/pipeline_config_generator.py +558 -0
  570. icdev/tools/ci/triggers/__init__.py +2 -0
  571. icdev/tools/ci/triggers/gitlab_task_monitor.py +330 -0
  572. icdev/tools/ci/triggers/poll_trigger.py +237 -0
  573. icdev/tools/ci/triggers/webhook_server.py +356 -0
  574. icdev/tools/ci/workflows/__init__.py +2 -0
  575. icdev/tools/ci/workflows/icdev_build.py +140 -0
  576. icdev/tools/ci/workflows/icdev_comply.py +284 -0
  577. icdev/tools/ci/workflows/icdev_document.py +152 -0
  578. icdev/tools/ci/workflows/icdev_e2e.py +188 -0
  579. icdev/tools/ci/workflows/icdev_patch.py +186 -0
  580. icdev/tools/ci/workflows/icdev_plan.py +202 -0
  581. icdev/tools/ci/workflows/icdev_plan_build.py +41 -0
  582. icdev/tools/ci/workflows/icdev_plan_build_test.py +46 -0
  583. icdev/tools/ci/workflows/icdev_plan_build_test_review.py +47 -0
  584. icdev/tools/ci/workflows/icdev_review.py +126 -0
  585. icdev/tools/ci/workflows/icdev_sdlc.py +261 -0
  586. icdev/tools/ci/workflows/icdev_test.py +240 -0
  587. icdev/tools/cli/__init__.py +1 -0
  588. icdev/tools/cli/output_formatter.py +756 -0
  589. icdev/tools/cli_formatter.py +42 -0
  590. icdev/tools/cloud/__init__.py +11 -0
  591. icdev/tools/cloud/cloud_mode_manager.py +364 -0
  592. icdev/tools/cloud/csp_changelog.py +383 -0
  593. icdev/tools/cloud/csp_health_checker.py +268 -0
  594. icdev/tools/cloud/csp_monitor.py +951 -0
  595. icdev/tools/cloud/iam_provider.py +593 -0
  596. icdev/tools/cloud/kms_provider.py +346 -0
  597. icdev/tools/cloud/monitoring_provider.py +628 -0
  598. icdev/tools/cloud/provider_factory.py +376 -0
  599. icdev/tools/cloud/region_validator.py +345 -0
  600. icdev/tools/cloud/registry_provider.py +563 -0
  601. icdev/tools/cloud/secrets_provider.py +486 -0
  602. icdev/tools/cloud/storage_provider.py +446 -0
  603. icdev/tools/compat/__init__.py +21 -0
  604. icdev/tools/compat/cli_harmonizer.py +251 -0
  605. icdev/tools/compat/datetime_utils.py +18 -0
  606. icdev/tools/compat/db_utils.py +160 -0
  607. icdev/tools/compat/platform_utils.py +123 -0
  608. icdev/tools/compliance/__init__.py +1 -0
  609. icdev/tools/compliance/accountability_manager.py +397 -0
  610. icdev/tools/compliance/ai_accountability_audit.py +294 -0
  611. icdev/tools/compliance/ai_impact_assessor.py +273 -0
  612. icdev/tools/compliance/ai_incident_response.py +301 -0
  613. icdev/tools/compliance/ai_inventory_manager.py +239 -0
  614. icdev/tools/compliance/ai_reassessment_scheduler.py +256 -0
  615. icdev/tools/compliance/ai_transparency_audit.py +248 -0
  616. icdev/tools/compliance/atlas_assessor.py +278 -0
  617. icdev/tools/compliance/atlas_report_generator.py +1211 -0
  618. icdev/tools/compliance/base_assessor.py +597 -0
  619. icdev/tools/compliance/cato_monitor.py +1385 -0
  620. icdev/tools/compliance/cato_scheduler.py +699 -0
  621. icdev/tools/compliance/cjis_assessor.py +76 -0
  622. icdev/tools/compliance/classification_manager.py +1353 -0
  623. icdev/tools/compliance/cmmc_assessor.py +1491 -0
  624. icdev/tools/compliance/cmmc_report_generator.py +1100 -0
  625. icdev/tools/compliance/compliance_detector.py +463 -0
  626. icdev/tools/compliance/compliance_exporter.py +427 -0
  627. icdev/tools/compliance/compliance_status.py +825 -0
  628. icdev/tools/compliance/control_mapper.py +505 -0
  629. icdev/tools/compliance/crosswalk_engine.py +1203 -0
  630. icdev/tools/compliance/cssp_assessor.py +1045 -0
  631. icdev/tools/compliance/cssp_evidence_collector.py +729 -0
  632. icdev/tools/compliance/cssp_report_generator.py +1116 -0
  633. icdev/tools/compliance/cui_marker.py +388 -0
  634. icdev/tools/compliance/diagram_validator.py +600 -0
  635. icdev/tools/compliance/emass/__init__.py +2 -0
  636. icdev/tools/compliance/emass/emass_client.py +840 -0
  637. icdev/tools/compliance/emass/emass_export.py +777 -0
  638. icdev/tools/compliance/emass/emass_sync.py +826 -0
  639. icdev/tools/compliance/eu_ai_act_classifier.py +194 -0
  640. icdev/tools/compliance/evidence_collector.py +468 -0
  641. icdev/tools/compliance/fairness_assessor.py +316 -0
  642. icdev/tools/compliance/fedramp_assessor.py +1808 -0
  643. icdev/tools/compliance/fedramp_authorization_packager.py +137 -0
  644. icdev/tools/compliance/fedramp_ksi_generator.py +355 -0
  645. icdev/tools/compliance/fedramp_report_generator.py +1128 -0
  646. icdev/tools/compliance/fips199_categorizer.py +881 -0
  647. icdev/tools/compliance/fips200_validator.py +315 -0
  648. icdev/tools/compliance/gao_ai_assessor.py +231 -0
  649. icdev/tools/compliance/gao_evidence_builder.py +308 -0
  650. icdev/tools/compliance/hipaa_assessor.py +78 -0
  651. icdev/tools/compliance/hitrust_assessor.py +49 -0
  652. icdev/tools/compliance/incident_response_plan.py +718 -0
  653. icdev/tools/compliance/iso27001_assessor.py +92 -0
  654. icdev/tools/compliance/iso42001_assessor.py +114 -0
  655. icdev/tools/compliance/ivv_assessor.py +2327 -0
  656. icdev/tools/compliance/ivv_report_generator.py +1662 -0
  657. icdev/tools/compliance/model_card_generator.py +297 -0
  658. icdev/tools/compliance/mosa_assessor.py +117 -0
  659. icdev/tools/compliance/multi_regime_assessor.py +451 -0
  660. icdev/tools/compliance/narrative_generator.py +1013 -0
  661. icdev/tools/compliance/nist_800_207_assessor.py +191 -0
  662. icdev/tools/compliance/nist_ai_600_1_assessor.py +188 -0
  663. icdev/tools/compliance/nist_ai_rmf_assessor.py +110 -0
  664. icdev/tools/compliance/nist_lookup.py +245 -0
  665. icdev/tools/compliance/omb_m25_21_assessor.py +228 -0
  666. icdev/tools/compliance/omb_m26_04_assessor.py +188 -0
  667. icdev/tools/compliance/oscal_catalog_adapter.py +395 -0
  668. icdev/tools/compliance/oscal_generator.py +2170 -0
  669. icdev/tools/compliance/oscal_tools.py +1182 -0
  670. icdev/tools/compliance/owasp_agentic_assessor.py +226 -0
  671. icdev/tools/compliance/owasp_asi_assessor.py +200 -0
  672. icdev/tools/compliance/owasp_llm_assessor.py +244 -0
  673. icdev/tools/compliance/pci_dss_assessor.py +80 -0
  674. icdev/tools/compliance/pi_compliance_tracker.py +1461 -0
  675. icdev/tools/compliance/poam_generator.py +405 -0
  676. icdev/tools/compliance/resolve_marking.py +283 -0
  677. icdev/tools/compliance/sbd_assessor.py +2068 -0
  678. icdev/tools/compliance/sbd_report_generator.py +1236 -0
  679. icdev/tools/compliance/sbom_generator.py +1008 -0
  680. icdev/tools/compliance/siem_config_generator.py +674 -0
  681. icdev/tools/compliance/slsa_attestation_generator.py +490 -0
  682. icdev/tools/compliance/soc2_assessor.py +77 -0
  683. icdev/tools/compliance/ssp_generator.py +573 -0
  684. icdev/tools/compliance/stig_checker.py +727 -0
  685. icdev/tools/compliance/swft_evidence_bundler.py +337 -0
  686. icdev/tools/compliance/system_card_generator.py +309 -0
  687. icdev/tools/compliance/traceability_matrix.py +1281 -0
  688. icdev/tools/compliance/universal_classification_manager.py +1172 -0
  689. icdev/tools/compliance/xacta/__init__.py +2 -0
  690. icdev/tools/compliance/xacta/xacta_client.py +449 -0
  691. icdev/tools/compliance/xacta/xacta_export.py +557 -0
  692. icdev/tools/compliance/xacta/xacta_sync.py +333 -0
  693. icdev/tools/compliance/xai_assessor.py +231 -0
  694. icdev/tools/dashboard/__init__.py +1 -0
  695. icdev/tools/dashboard/api/__init__.py +1 -0
  696. icdev/tools/dashboard/api/_pipeline_state.py +17 -0
  697. icdev/tools/dashboard/api/activity.py +206 -0
  698. icdev/tools/dashboard/api/admin.py +176 -0
  699. icdev/tools/dashboard/api/agents.py +53 -0
  700. icdev/tools/dashboard/api/ai_accountability.py +163 -0
  701. icdev/tools/dashboard/api/ai_transparency.py +198 -0
  702. icdev/tools/dashboard/api/audit.py +58 -0
  703. icdev/tools/dashboard/api/batch.py +666 -0
  704. icdev/tools/dashboard/api/chat.py +241 -0
  705. icdev/tools/dashboard/api/cicd.py +219 -0
  706. icdev/tools/dashboard/api/code_quality.py +223 -0
  707. icdev/tools/dashboard/api/compliance.py +171 -0
  708. icdev/tools/dashboard/api/cpmp.py +915 -0
  709. icdev/tools/dashboard/api/diagrams.py +65 -0
  710. icdev/tools/dashboard/api/events.py +250 -0
  711. icdev/tools/dashboard/api/evidence.py +99 -0
  712. icdev/tools/dashboard/api/fedramp_20x.py +77 -0
  713. icdev/tools/dashboard/api/govcon.py +1095 -0
  714. icdev/tools/dashboard/api/intake.py +1171 -0
  715. icdev/tools/dashboard/api/lineage.py +163 -0
  716. icdev/tools/dashboard/api/metrics.py +155 -0
  717. icdev/tools/dashboard/api/nlq.py +72 -0
  718. icdev/tools/dashboard/api/orchestration.py +472 -0
  719. icdev/tools/dashboard/api/oscal.py +183 -0
  720. icdev/tools/dashboard/api/prod_audit.py +183 -0
  721. icdev/tools/dashboard/api/projects.py +191 -0
  722. icdev/tools/dashboard/api/proposals.py +1084 -0
  723. icdev/tools/dashboard/api/traces.py +363 -0
  724. icdev/tools/dashboard/api/usage.py +234 -0
  725. icdev/tools/dashboard/app.py +1986 -0
  726. icdev/tools/dashboard/auth.py +500 -0
  727. icdev/tools/dashboard/byok.py +245 -0
  728. icdev/tools/dashboard/chat_manager.py +675 -0
  729. icdev/tools/dashboard/config.py +116 -0
  730. icdev/tools/dashboard/diagram_definitions.py +642 -0
  731. icdev/tools/dashboard/nlq_processor.py +323 -0
  732. icdev/tools/dashboard/phase_loader.py +136 -0
  733. icdev/tools/dashboard/sse_manager.py +89 -0
  734. icdev/tools/dashboard/state_tracker.py +267 -0
  735. icdev/tools/dashboard/static/css/style.css +706 -0
  736. icdev/tools/dashboard/static/css/ux.css +2047 -0
  737. icdev/tools/dashboard/static/js/activity.js +322 -0
  738. icdev/tools/dashboard/static/js/api.js +161 -0
  739. icdev/tools/dashboard/static/js/batch.js +814 -0
  740. icdev/tools/dashboard/static/js/charts.js +618 -0
  741. icdev/tools/dashboard/static/js/chat.js +1514 -0
  742. icdev/tools/dashboard/static/js/kanban.js +113 -0
  743. icdev/tools/dashboard/static/js/live.js +569 -0
  744. icdev/tools/dashboard/static/js/mermaid-icdev.js +332 -0
  745. icdev/tools/dashboard/static/js/proposals.js +588 -0
  746. icdev/tools/dashboard/static/js/shortcuts.js +544 -0
  747. icdev/tools/dashboard/static/js/tables.js +652 -0
  748. icdev/tools/dashboard/static/js/tour.js +524 -0
  749. icdev/tools/dashboard/static/js/ux.js +942 -0
  750. icdev/tools/dashboard/templates/404.html +10 -0
  751. icdev/tools/dashboard/templates/activity.html +80 -0
  752. icdev/tools/dashboard/templates/admin/users.html +144 -0
  753. icdev/tools/dashboard/templates/ai_accountability.html +235 -0
  754. icdev/tools/dashboard/templates/ai_transparency.html +263 -0
  755. icdev/tools/dashboard/templates/base.html +104 -0
  756. icdev/tools/dashboard/templates/batch.html +23 -0
  757. icdev/tools/dashboard/templates/chat.html +332 -0
  758. icdev/tools/dashboard/templates/children.html +149 -0
  759. icdev/tools/dashboard/templates/cicd.html +253 -0
  760. icdev/tools/dashboard/templates/code_quality.html +214 -0
  761. icdev/tools/dashboard/templates/cpmp/cor_detail.html +220 -0
  762. icdev/tools/dashboard/templates/cpmp/cor_portal.html +91 -0
  763. icdev/tools/dashboard/templates/cpmp/deliverable_detail.html +197 -0
  764. icdev/tools/dashboard/templates/cpmp/detail.html +578 -0
  765. icdev/tools/dashboard/templates/cpmp/portfolio.html +202 -0
  766. icdev/tools/dashboard/templates/dev_profiles.html +304 -0
  767. icdev/tools/dashboard/templates/diagrams.html +224 -0
  768. icdev/tools/dashboard/templates/events/timeline.html +232 -0
  769. icdev/tools/dashboard/templates/evidence.html +134 -0
  770. icdev/tools/dashboard/templates/fedramp_20x.html +207 -0
  771. icdev/tools/dashboard/templates/gateway.html +244 -0
  772. icdev/tools/dashboard/templates/govcon/capabilities.html +135 -0
  773. icdev/tools/dashboard/templates/govcon/pipeline.html +214 -0
  774. icdev/tools/dashboard/templates/govcon/requirements.html +120 -0
  775. icdev/tools/dashboard/templates/index.html +254 -0
  776. icdev/tools/dashboard/templates/lineage.html +141 -0
  777. icdev/tools/dashboard/templates/login.html +51 -0
  778. icdev/tools/dashboard/templates/monitoring/overview.html +193 -0
  779. icdev/tools/dashboard/templates/orchestration/dashboard.html +545 -0
  780. icdev/tools/dashboard/templates/oscal.html +263 -0
  781. icdev/tools/dashboard/templates/phases.html +150 -0
  782. icdev/tools/dashboard/templates/prod_audit.html +280 -0
  783. icdev/tools/dashboard/templates/profile.html +183 -0
  784. icdev/tools/dashboard/templates/projects/detail.html +583 -0
  785. icdev/tools/dashboard/templates/projects/list.html +47 -0
  786. icdev/tools/dashboard/templates/proposals/detail.html +1253 -0
  787. icdev/tools/dashboard/templates/proposals/list.html +179 -0
  788. icdev/tools/dashboard/templates/proposals/section_detail.html +193 -0
  789. icdev/tools/dashboard/templates/provenance.html +181 -0
  790. icdev/tools/dashboard/templates/query/nlq.html +234 -0
  791. icdev/tools/dashboard/templates/quick_paths.html +69 -0
  792. icdev/tools/dashboard/templates/traces.html +155 -0
  793. icdev/tools/dashboard/templates/translation_detail.html +199 -0
  794. icdev/tools/dashboard/templates/translations.html +162 -0
  795. icdev/tools/dashboard/templates/usage.html +225 -0
  796. icdev/tools/dashboard/templates/wizard.html +539 -0
  797. icdev/tools/dashboard/templates/xai.html +208 -0
  798. icdev/tools/dashboard/ux_helpers.py +962 -0
  799. icdev/tools/dashboard/websocket.py +81 -0
  800. icdev/tools/db/__init__.py +1 -0
  801. icdev/tools/db/backup.py +312 -0
  802. icdev/tools/db/backup_manager.py +832 -0
  803. icdev/tools/db/init_icdev_db.py +5900 -0
  804. icdev/tools/db/migrate.py +178 -0
  805. icdev/tools/db/migration_runner.py +549 -0
  806. icdev/tools/db/migrations/001_baseline/meta.json +9 -0
  807. icdev/tools/db/migrations/001_baseline/up.py +68 -0
  808. icdev/tools/db/migrations/002_memory_enhancements/down.sql +8 -0
  809. icdev/tools/db/migrations/002_memory_enhancements/meta.json +9 -0
  810. icdev/tools/db/migrations/002_memory_enhancements/up.py +118 -0
  811. icdev/tools/db/migrations/003_dev_profiles/meta.json +8 -0
  812. icdev/tools/db/migrations/003_dev_profiles/up.py +93 -0
  813. icdev/tools/db/migrations/004_innovation_engine/down.py +19 -0
  814. icdev/tools/db/migrations/004_innovation_engine/up.py +227 -0
  815. icdev/tools/db/migrations/005_phase_37_ai_security/down.py +19 -0
  816. icdev/tools/db/migrations/005_phase_37_ai_security/up.py +258 -0
  817. icdev/tools/db/migrations/006_phase_36_evolution/down.py +21 -0
  818. icdev/tools/db/migrations/006_phase_36_evolution/up.py +323 -0
  819. icdev/tools/db/migrations/007_phase_38_cloud/down.py +14 -0
  820. icdev/tools/db/migrations/007_phase_38_cloud/up.py +110 -0
  821. icdev/tools/db/migrations/008_phase36_37_integration/up.py +55 -0
  822. icdev/tools/db/migrations/__init__.py +2 -0
  823. icdev/tools/devsecops/__init__.py +2 -0
  824. icdev/tools/devsecops/attestation_manager.py +458 -0
  825. icdev/tools/devsecops/network_segmentation_generator.py +614 -0
  826. icdev/tools/devsecops/pdp_config_generator.py +1256 -0
  827. icdev/tools/devsecops/pipeline_security_generator.py +484 -0
  828. icdev/tools/devsecops/policy_generator.py +653 -0
  829. icdev/tools/devsecops/profile_manager.py +388 -0
  830. icdev/tools/devsecops/service_mesh_generator.py +1073 -0
  831. icdev/tools/devsecops/zta_maturity_scorer.py +368 -0
  832. icdev/tools/devsecops/zta_terraform_generator.py +1303 -0
  833. icdev/tools/dx/__init__.py +3 -0
  834. icdev/tools/dx/companion.py +266 -0
  835. icdev/tools/dx/instruction_generator.py +753 -0
  836. icdev/tools/dx/mcp_config_generator.py +282 -0
  837. icdev/tools/dx/skill_translator.py +425 -0
  838. icdev/tools/dx/tool_detector.py +144 -0
  839. icdev/tools/extensions/__init__.py +21 -0
  840. icdev/tools/extensions/builtins/010_ai_governance_chat.py +277 -0
  841. icdev/tools/extensions/builtins/__init__.py +2 -0
  842. icdev/tools/extensions/extension_manager.py +455 -0
  843. icdev/tools/infra/__init__.py +1 -0
  844. icdev/tools/infra/ansible_generator.py +869 -0
  845. icdev/tools/infra/dockerfile_generator.py +361 -0
  846. icdev/tools/infra/infra_status.py +393 -0
  847. icdev/tools/infra/ironbank_metadata_generator.py +411 -0
  848. icdev/tools/infra/k8s_generator.py +1002 -0
  849. icdev/tools/infra/pipeline_generator.py +832 -0
  850. icdev/tools/infra/rollback.py +400 -0
  851. icdev/tools/infra/terraform_generator.py +1142 -0
  852. icdev/tools/infra/terraform_generator_azure.py +1254 -0
  853. icdev/tools/infra/terraform_generator_gcp.py +953 -0
  854. icdev/tools/infra/terraform_generator_ibm.py +360 -0
  855. icdev/tools/infra/terraform_generator_oci.py +919 -0
  856. icdev/tools/infra/terraform_generator_onprem.py +319 -0
  857. icdev/tools/innovation/__init__.py +8 -0
  858. icdev/tools/innovation/competitive_intel.py +492 -0
  859. icdev/tools/innovation/innovation_manager.py +681 -0
  860. icdev/tools/innovation/introspective_analyzer.py +774 -0
  861. icdev/tools/innovation/register_external_patterns.py +440 -0
  862. icdev/tools/innovation/signal_ranker.py +1038 -0
  863. icdev/tools/innovation/solution_generator.py +697 -0
  864. icdev/tools/innovation/standards_monitor.py +466 -0
  865. icdev/tools/innovation/trend_detector.py +1046 -0
  866. icdev/tools/innovation/triage_engine.py +1149 -0
  867. icdev/tools/innovation/web_scanner.py +894 -0
  868. icdev/tools/installer/__init__.py +1 -0
  869. icdev/tools/installer/compliance_configurator.py +637 -0
  870. icdev/tools/installer/installer.py +1711 -0
  871. icdev/tools/installer/module_registry.py +805 -0
  872. icdev/tools/installer/platform_setup.py +961 -0
  873. icdev/tools/integration/__init__.py +2 -0
  874. icdev/tools/integration/approval_manager.py +561 -0
  875. icdev/tools/integration/doors_exporter.py +627 -0
  876. icdev/tools/integration/gitlab_connector.py +784 -0
  877. icdev/tools/integration/jira_connector.py +774 -0
  878. icdev/tools/integration/servicenow_connector.py +693 -0
  879. icdev/tools/knowledge/__init__.py +1 -0
  880. icdev/tools/knowledge/knowledge_ingest.py +293 -0
  881. icdev/tools/knowledge/pattern_detector.py +693 -0
  882. icdev/tools/knowledge/recommendation_engine.py +461 -0
  883. icdev/tools/knowledge/self_heal_analyzer.py +504 -0
  884. icdev/tools/llm/__init__.py +72 -0
  885. icdev/tools/llm/anthropic_provider.py +170 -0
  886. icdev/tools/llm/azure_openai_provider.py +338 -0
  887. icdev/tools/llm/bedrock_provider.py +315 -0
  888. icdev/tools/llm/embedding_provider.py +438 -0
  889. icdev/tools/llm/gemini_provider.py +381 -0
  890. icdev/tools/llm/ibm_watsonx_provider.py +232 -0
  891. icdev/tools/llm/oci_genai_provider.py +462 -0
  892. icdev/tools/llm/ollama_provider.py +340 -0
  893. icdev/tools/llm/openai_provider.py +225 -0
  894. icdev/tools/llm/provider.py +355 -0
  895. icdev/tools/llm/provider_sdk.py +175 -0
  896. icdev/tools/llm/router.py +780 -0
  897. icdev/tools/llm/vertex_ai_provider.py +374 -0
  898. icdev/tools/maintenance/__init__.py +2 -0
  899. icdev/tools/maintenance/dependency_scanner.py +1030 -0
  900. icdev/tools/maintenance/maintenance_auditor.py +815 -0
  901. icdev/tools/maintenance/remediation_engine.py +966 -0
  902. icdev/tools/maintenance/vulnerability_checker.py +987 -0
  903. icdev/tools/mbse/__init__.py +3 -0
  904. icdev/tools/mbse/des_assessor.py +1186 -0
  905. icdev/tools/mbse/des_report_generator.py +800 -0
  906. icdev/tools/mbse/diagram_extractor.py +811 -0
  907. icdev/tools/mbse/digital_thread.py +1665 -0
  908. icdev/tools/mbse/model_code_generator.py +1122 -0
  909. icdev/tools/mbse/model_control_mapper.py +420 -0
  910. icdev/tools/mbse/pi_model_tracker.py +1093 -0
  911. icdev/tools/mbse/reqif_parser.py +1483 -0
  912. icdev/tools/mbse/sync_engine.py +1805 -0
  913. icdev/tools/mbse/xmi_parser.py +1573 -0
  914. icdev/tools/mcp/__init__.py +1 -0
  915. icdev/tools/mcp/base_server.py +535 -0
  916. icdev/tools/mcp/builder_server.py +725 -0
  917. icdev/tools/mcp/compliance_server.py +1407 -0
  918. icdev/tools/mcp/context_indexer.py +199 -0
  919. icdev/tools/mcp/context_server.py +305 -0
  920. icdev/tools/mcp/core_server.py +679 -0
  921. icdev/tools/mcp/devsecops_server.py +432 -0
  922. icdev/tools/mcp/gap_handlers.py +1079 -0
  923. icdev/tools/mcp/gateway_server.py +339 -0
  924. icdev/tools/mcp/generate_registry.py +623 -0
  925. icdev/tools/mcp/infra_server.py +264 -0
  926. icdev/tools/mcp/innovation_server.py +316 -0
  927. icdev/tools/mcp/integration_server.py +527 -0
  928. icdev/tools/mcp/knowledge_server.py +429 -0
  929. icdev/tools/mcp/maintenance_server.py +248 -0
  930. icdev/tools/mcp/marketplace_server.py +499 -0
  931. icdev/tools/mcp/mbse_server.py +398 -0
  932. icdev/tools/mcp/modernization_server.py +496 -0
  933. icdev/tools/mcp/observability_server.py +354 -0
  934. icdev/tools/mcp/requirements_server.py +415 -0
  935. icdev/tools/mcp/simulation_server.py +468 -0
  936. icdev/tools/mcp/standalone/__init__.py +2 -0
  937. icdev/tools/mcp/standalone/builder.py +59 -0
  938. icdev/tools/mcp/standalone/compliance.py +59 -0
  939. icdev/tools/mcp/standalone/core.py +59 -0
  940. icdev/tools/mcp/standalone/knowledge.py +59 -0
  941. icdev/tools/mcp/standalone/maintenance.py +59 -0
  942. icdev/tools/mcp/supply_chain_server.py +476 -0
  943. icdev/tools/mcp/tool_registry.py +2008 -0
  944. icdev/tools/mcp/unified_server.py +158 -0
  945. icdev/tools/memory/__init__.py +2 -0
  946. icdev/tools/memory/auto_capture.py +347 -0
  947. icdev/tools/memory/embed_memory.py +158 -0
  948. icdev/tools/memory/history_compressor.py +334 -0
  949. icdev/tools/memory/hybrid_search.py +236 -0
  950. icdev/tools/memory/maintenance_cron.py +289 -0
  951. icdev/tools/memory/memory_consolidation.py +444 -0
  952. icdev/tools/memory/memory_db.py +133 -0
  953. icdev/tools/memory/memory_read.py +102 -0
  954. icdev/tools/memory/memory_write.py +222 -0
  955. icdev/tools/memory/semantic_search.py +139 -0
  956. icdev/tools/memory/time_decay.py +435 -0
  957. icdev/tools/modernization/__init__.py +3 -0
  958. icdev/tools/modernization/architecture_extractor.py +734 -0
  959. icdev/tools/modernization/compliance_bridge.py +1499 -0
  960. icdev/tools/modernization/db_migration_planner.py +1385 -0
  961. icdev/tools/modernization/doc_generator.py +1428 -0
  962. icdev/tools/modernization/framework_migrator.py +1525 -0
  963. icdev/tools/modernization/legacy_analyzer.py +1948 -0
  964. icdev/tools/modernization/migration_code_generator.py +1639 -0
  965. icdev/tools/modernization/migration_report_generator.py +1653 -0
  966. icdev/tools/modernization/migration_tracker.py +1726 -0
  967. icdev/tools/modernization/monolith_decomposer.py +1508 -0
  968. icdev/tools/modernization/seven_r_assessor.py +1658 -0
  969. icdev/tools/modernization/strangler_fig_manager.py +1705 -0
  970. icdev/tools/modernization/ui_analyzer.py +771 -0
  971. icdev/tools/modernization/version_migrator.py +1392 -0
  972. icdev/tools/monitor/__init__.py +1 -0
  973. icdev/tools/monitor/alert_correlator.py +495 -0
  974. icdev/tools/monitor/auto_resolver.py +612 -0
  975. icdev/tools/monitor/health_checker.py +509 -0
  976. icdev/tools/monitor/heartbeat_daemon.py +792 -0
  977. icdev/tools/monitor/log_analyzer.py +516 -0
  978. icdev/tools/monitor/metric_collector.py +496 -0
  979. icdev/tools/mosa/__init__.py +10 -0
  980. icdev/tools/mosa/icd_generator.py +370 -0
  981. icdev/tools/mosa/modular_design_analyzer.py +683 -0
  982. icdev/tools/mosa/mosa_code_enforcer.py +349 -0
  983. icdev/tools/mosa/tsp_generator.py +265 -0
  984. icdev/tools/observability/__init__.py +100 -0
  985. icdev/tools/observability/genai_attributes.py +88 -0
  986. icdev/tools/observability/instrumentation.py +140 -0
  987. icdev/tools/observability/mlflow_exporter.py +194 -0
  988. icdev/tools/observability/otel_tracer.py +168 -0
  989. icdev/tools/observability/provenance/__init__.py +3 -0
  990. icdev/tools/observability/provenance/prov_recorder.py +324 -0
  991. icdev/tools/observability/shap/__init__.py +3 -0
  992. icdev/tools/observability/shap/agent_shap.py +275 -0
  993. icdev/tools/observability/sqlite_tracer.py +361 -0
  994. icdev/tools/observability/trace_context.py +205 -0
  995. icdev/tools/observability/tracer.py +230 -0
  996. icdev/tools/orchestration/__init__.py +2 -0
  997. icdev/tools/orchestration/workflow_composer.py +361 -0
  998. icdev/tools/project/__init__.py +1 -0
  999. icdev/tools/project/manifest_loader.py +418 -0
  1000. icdev/tools/project/project_create.py +350 -0
  1001. icdev/tools/project/project_list.py +174 -0
  1002. icdev/tools/project/project_scaffold.py +1715 -0
  1003. icdev/tools/project/project_status.py +479 -0
  1004. icdev/tools/project/session_context_builder.py +757 -0
  1005. icdev/tools/project/validate_manifest.py +55 -0
  1006. icdev/tools/registry/__init__.py +10 -0
  1007. icdev/tools/registry/absorption_engine.py +832 -0
  1008. icdev/tools/registry/capability_evaluator.py +668 -0
  1009. icdev/tools/registry/child_registry.py +617 -0
  1010. icdev/tools/registry/cross_pollinator.py +1065 -0
  1011. icdev/tools/registry/genome_manager.py +671 -0
  1012. icdev/tools/registry/learning_collector.py +912 -0
  1013. icdev/tools/registry/propagation_manager.py +942 -0
  1014. icdev/tools/registry/staging_manager.py +742 -0
  1015. icdev/tools/registry/telemetry_collector.py +423 -0
  1016. icdev/tools/requirements/__init__.py +1 -0
  1017. icdev/tools/requirements/ai_governance_scorer.py +208 -0
  1018. icdev/tools/requirements/boundary_analyzer.py +1293 -0
  1019. icdev/tools/requirements/clarification_engine.py +618 -0
  1020. icdev/tools/requirements/complexity_scorer.py +387 -0
  1021. icdev/tools/requirements/consistency_analyzer.py +803 -0
  1022. icdev/tools/requirements/constitution_manager.py +605 -0
  1023. icdev/tools/requirements/decomposition_engine.py +778 -0
  1024. icdev/tools/requirements/document_extractor.py +1016 -0
  1025. icdev/tools/requirements/elicitation_techniques.py +519 -0
  1026. icdev/tools/requirements/gap_detector.py +271 -0
  1027. icdev/tools/requirements/intake_engine.py +2188 -0
  1028. icdev/tools/requirements/prd_generator.py +847 -0
  1029. icdev/tools/requirements/prd_validator.py +595 -0
  1030. icdev/tools/requirements/readiness_scorer.py +313 -0
  1031. icdev/tools/requirements/spec_organizer.py +1029 -0
  1032. icdev/tools/requirements/spec_quality_checker.py +1097 -0
  1033. icdev/tools/requirements/traceability_builder.py +579 -0
  1034. icdev/tools/resilience/__init__.py +34 -0
  1035. icdev/tools/resilience/circuit_breaker.py +340 -0
  1036. icdev/tools/resilience/correlation.py +150 -0
  1037. icdev/tools/resilience/errors.py +81 -0
  1038. icdev/tools/resilience/retry.py +95 -0
  1039. icdev/tools/schemas/__init__.py +27 -0
  1040. icdev/tools/schemas/chat.py +61 -0
  1041. icdev/tools/schemas/compliance.py +56 -0
  1042. icdev/tools/schemas/core.py +85 -0
  1043. icdev/tools/schemas/innovation.py +37 -0
  1044. icdev/tools/schemas/validation.py +109 -0
  1045. icdev/tools/sdk/__init__.py +3 -0
  1046. icdev/tools/sdk/icdev_client.py +218 -0
  1047. icdev/tools/security/__init__.py +1 -0
  1048. icdev/tools/security/agent_output_validator.py +330 -0
  1049. icdev/tools/security/agent_trust_scorer.py +466 -0
  1050. icdev/tools/security/ai_bom_generator.py +725 -0
  1051. icdev/tools/security/ai_telemetry_logger.py +469 -0
  1052. icdev/tools/security/atlas_red_team.py +543 -0
  1053. icdev/tools/security/code_pattern_scanner.py +378 -0
  1054. icdev/tools/security/confabulation_detector.py +271 -0
  1055. icdev/tools/security/container_scanner.py +491 -0
  1056. icdev/tools/security/dependency_auditor.py +944 -0
  1057. icdev/tools/security/endpoint_security_scanner.py +579 -0
  1058. icdev/tools/security/mcp_tool_authorizer.py +243 -0
  1059. icdev/tools/security/prompt_injection_detector.py +737 -0
  1060. icdev/tools/security/sast_runner.py +948 -0
  1061. icdev/tools/security/secret_detector.py +378 -0
  1062. icdev/tools/security/tool_chain_validator.py +357 -0
  1063. icdev/tools/security/vuln_scanner.py +539 -0
  1064. icdev/tools/simulation/__init__.py +2 -0
  1065. icdev/tools/simulation/coa_generator.py +1552 -0
  1066. icdev/tools/simulation/monte_carlo.py +758 -0
  1067. icdev/tools/simulation/scenario_manager.py +1073 -0
  1068. icdev/tools/simulation/simulation_engine.py +1104 -0
  1069. icdev/tools/supply_chain/__init__.py +2 -0
  1070. icdev/tools/supply_chain/cve_triager.py +705 -0
  1071. icdev/tools/supply_chain/dependency_graph.py +645 -0
  1072. icdev/tools/supply_chain/isa_manager.py +540 -0
  1073. icdev/tools/supply_chain/scrm_assessor.py +546 -0
  1074. icdev/tools/testing/__init__.py +2 -0
  1075. icdev/tools/testing/acceptance_validator.py +411 -0
  1076. icdev/tools/testing/claude_dir_validator.py +831 -0
  1077. icdev/tools/testing/data_types.py +199 -0
  1078. icdev/tools/testing/e2e_runner.py +715 -0
  1079. icdev/tools/testing/fuzz_cli.py +306 -0
  1080. icdev/tools/testing/health_check.py +483 -0
  1081. icdev/tools/testing/platform_check.py +143 -0
  1082. icdev/tools/testing/production_audit.py +1862 -0
  1083. icdev/tools/testing/production_remediate.py +804 -0
  1084. icdev/tools/testing/screenshot_validator.py +539 -0
  1085. icdev/tools/testing/smoke_test.py +283 -0
  1086. icdev/tools/testing/test_agent_models.py +117 -0
  1087. icdev/tools/testing/test_orchestrator.py +957 -0
  1088. icdev/tools/testing/utils.py +229 -0
  1089. icdev/tools/translation/__init__.py +17 -0
  1090. icdev/tools/translation/code_translator.py +550 -0
  1091. icdev/tools/translation/dependency_mapper.py +277 -0
  1092. icdev/tools/translation/feature_map.py +395 -0
  1093. icdev/tools/translation/project_assembler.py +439 -0
  1094. icdev/tools/translation/source_extractor.py +609 -0
  1095. icdev/tools/translation/test_translator.py +333 -0
  1096. icdev/tools/translation/translation_manager.py +582 -0
  1097. icdev/tools/translation/translation_validator.py +662 -0
  1098. icdev/tools/translation/type_checker.py +371 -0
  1099. icdev-1.0.0.dist-info/METADATA +868 -0
  1100. icdev-1.0.0.dist-info/RECORD +1105 -0
  1101. icdev-1.0.0.dist-info/WHEEL +5 -0
  1102. icdev-1.0.0.dist-info/entry_points.txt +9 -0
  1103. icdev-1.0.0.dist-info/licenses/LICENSE +254 -0
  1104. icdev-1.0.0.dist-info/licenses/NOTICE +268 -0
  1105. icdev-1.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1385 @@
1
+ #!/usr/bin/env python3
2
+ # CUI // SP-CTI
3
+ # ////////////////////////////////////////////////////////////////////
4
+ # CONTROLLED UNCLASSIFIED INFORMATION (CUI) // SP-CTI
5
+ # Distribution: Distribution D -- Authorized DoD Personnel Only
6
+ # ////////////////////////////////////////////////////////////////////
7
+ """Continuous ATO (cATO) monitoring engine.
8
+
9
+ Collects, tracks, and refreshes compliance evidence on a continuous basis
10
+ to support Continuous Authority to Operate workflows. Monitors evidence
11
+ freshness, computes cATO readiness scores, and triggers automatic
12
+ re-assessment of stale or expired evidence items.
13
+
14
+ Evidence is stored in the cato_evidence table of icdev.db and mapped
15
+ to NIST 800-53 controls. Each evidence item has an automation_frequency
16
+ that determines its expiration window and refresh cadence.
17
+
18
+ Database table: cato_evidence
19
+ - id, project_id, control_id, evidence_type, evidence_source
20
+ - evidence_path, evidence_hash, collected_at, expires_at
21
+ - is_fresh, freshness_check_at, status, automation_frequency
22
+ """
23
+
24
+ import argparse
25
+ import hashlib
26
+ import json
27
+ import sqlite3
28
+ import sys
29
+ from datetime import datetime, timedelta, timezone
30
+ from pathlib import Path
31
+ from icdev._paths import get_project_root
32
+
33
+ BASE_DIR = get_project_root()
34
+ DB_PATH = BASE_DIR / "data" / "icdev.db"
35
+
36
+ # Evidence type constants
37
+ EVIDENCE_TYPES = (
38
+ "scan_result", "test_result", "config_check",
39
+ "manual_review", "attestation", "artifact",
40
+ )
41
+
42
+ # Status constants
43
+ EVIDENCE_STATUSES = ("current", "stale", "expired", "superseded")
44
+
45
+ # Automation frequency constants
46
+ AUTOMATION_FREQUENCIES = (
47
+ "continuous", "daily", "weekly", "monthly", "per_change", "manual",
48
+ )
49
+
50
+ # Expiration windows (in days) by automation frequency
51
+ EXPIRY_WINDOWS = {
52
+ "continuous": 1,
53
+ "daily": 2,
54
+ "weekly": 14,
55
+ "monthly": 45,
56
+ "per_change": 30,
57
+ "manual": 90,
58
+ }
59
+
60
+ # Staleness threshold: evidence is stale when 80% of its expiry window has elapsed
61
+ STALENESS_RATIO = 0.80
62
+
63
+
64
+ def _get_connection(db_path=None):
65
+ """Get a database connection with row factory."""
66
+ path = db_path or DB_PATH
67
+ if not Path(path).exists():
68
+ raise FileNotFoundError(
69
+ f"Database not found: {path}\n"
70
+ "Run: python tools/db/init_icdev_db.py"
71
+ )
72
+ conn = sqlite3.connect(str(path))
73
+ conn.row_factory = sqlite3.Row
74
+ return conn
75
+
76
+
77
+ def _hash_file(file_path):
78
+ """Compute SHA-256 hash of a file, reading in 8KB chunks.
79
+
80
+ Returns:
81
+ Hex digest string, or None if the file cannot be read.
82
+ """
83
+ sha256 = hashlib.sha256()
84
+ try:
85
+ with open(file_path, "rb") as f:
86
+ while True:
87
+ chunk = f.read(8192)
88
+ if not chunk:
89
+ break
90
+ sha256.update(chunk)
91
+ return sha256.hexdigest()
92
+ except (OSError, PermissionError):
93
+ return None
94
+
95
+
96
+ def _log_audit_event(conn, project_id, action, details):
97
+ """Log an audit trail event for cATO evidence collection.
98
+
99
+ Appends to the audit_trail table (append-only, NIST AU compliant).
100
+ """
101
+ try:
102
+ conn.execute(
103
+ """INSERT INTO audit_trail
104
+ (project_id, event_type, actor, action, details, classification)
105
+ VALUES (?, ?, ?, ?, ?, ?)""",
106
+ (
107
+ project_id,
108
+ "cato_evidence_collected",
109
+ "icdev-cato-monitor",
110
+ action,
111
+ json.dumps(details, default=str),
112
+ "CUI",
113
+ ),
114
+ )
115
+ conn.commit()
116
+ except Exception as e:
117
+ print(f"Warning: Could not log audit event: {e}", file=sys.stderr)
118
+
119
+
120
+ def _verify_project(conn, project_id):
121
+ """Verify project exists in the database.
122
+
123
+ Returns:
124
+ Dict of project row data.
125
+
126
+ Raises:
127
+ ValueError if project not found.
128
+ """
129
+ row = conn.execute(
130
+ "SELECT * FROM projects WHERE id = ?", (project_id,)
131
+ ).fetchone()
132
+ if not row:
133
+ raise ValueError(f"Project '{project_id}' not found in database.")
134
+ return dict(row)
135
+
136
+
137
+ def _compute_expires_at(collected_at_str, automation_frequency):
138
+ """Compute the expiration datetime for evidence based on its frequency.
139
+
140
+ Args:
141
+ collected_at_str: ISO-format datetime string of collection time.
142
+ automation_frequency: One of AUTOMATION_FREQUENCIES.
143
+
144
+ Returns:
145
+ ISO-format datetime string for expiration.
146
+ """
147
+ try:
148
+ collected_at = datetime.fromisoformat(collected_at_str)
149
+ except (ValueError, TypeError):
150
+ collected_at = datetime.now(timezone.utc)
151
+
152
+ days = EXPIRY_WINDOWS.get(automation_frequency, 90)
153
+ expires_at = collected_at + timedelta(days=days)
154
+ return expires_at.isoformat()
155
+
156
+
157
+ # --------------------------------------------------------------------------
158
+ # Public API functions
159
+ # --------------------------------------------------------------------------
160
+
161
+ def collect_evidence(
162
+ project_id,
163
+ control_id,
164
+ evidence_type,
165
+ evidence_source,
166
+ evidence_path=None,
167
+ automation_frequency="manual",
168
+ db_path=None,
169
+ ):
170
+ """Collect and store evidence for a NIST 800-53 control.
171
+
172
+ Creates or updates a cato_evidence record. If evidence_path points to an
173
+ existing file, its SHA-256 hash is computed and stored. The expires_at
174
+ timestamp is set based on the automation_frequency.
175
+
176
+ Args:
177
+ project_id: Project identifier.
178
+ control_id: NIST 800-53 control ID (e.g. 'AC-2', 'AU-6').
179
+ evidence_type: One of EVIDENCE_TYPES.
180
+ evidence_source: Descriptive source label (e.g. 'bandit_sast', 'pytest').
181
+ evidence_path: Optional filesystem path to evidence artifact.
182
+ automation_frequency: One of AUTOMATION_FREQUENCIES.
183
+ db_path: Optional database path override.
184
+
185
+ Returns:
186
+ Dict with evidence_id, status, collected_at, expires_at, evidence_hash.
187
+ """
188
+ if evidence_type not in EVIDENCE_TYPES:
189
+ raise ValueError(
190
+ f"Invalid evidence_type '{evidence_type}'. "
191
+ f"Valid types: {EVIDENCE_TYPES}"
192
+ )
193
+ if automation_frequency not in AUTOMATION_FREQUENCIES:
194
+ raise ValueError(
195
+ f"Invalid automation_frequency '{automation_frequency}'. "
196
+ f"Valid frequencies: {AUTOMATION_FREQUENCIES}"
197
+ )
198
+
199
+ conn = _get_connection(db_path)
200
+ try:
201
+ _verify_project(conn, project_id)
202
+
203
+ now = datetime.now(timezone.utc)
204
+ collected_at = now.isoformat()
205
+ expires_at = _compute_expires_at(collected_at, automation_frequency)
206
+
207
+ # Compute file hash if path provided and file exists
208
+ evidence_hash = None
209
+ if evidence_path and Path(evidence_path).is_file():
210
+ evidence_hash = _hash_file(evidence_path)
211
+
212
+ # Upsert: the table has UNIQUE(project_id, control_id, evidence_type, evidence_source)
213
+ existing = conn.execute(
214
+ """SELECT id FROM cato_evidence
215
+ WHERE project_id = ? AND control_id = ?
216
+ AND evidence_type = ? AND evidence_source = ?""",
217
+ (project_id, control_id, evidence_type, evidence_source),
218
+ ).fetchone()
219
+
220
+ if existing:
221
+ # Mark old record as superseded if hash changed, else just refresh
222
+ conn.execute(
223
+ "SELECT evidence_hash, status FROM cato_evidence WHERE id = ?",
224
+ (existing["id"],),
225
+ ).fetchone()
226
+
227
+ conn.execute(
228
+ """UPDATE cato_evidence
229
+ SET evidence_path = ?,
230
+ evidence_hash = ?,
231
+ collected_at = ?,
232
+ expires_at = ?,
233
+ is_fresh = 1,
234
+ freshness_check_at = ?,
235
+ status = 'current',
236
+ automation_frequency = ?
237
+ WHERE id = ?""",
238
+ (
239
+ str(evidence_path) if evidence_path else None,
240
+ evidence_hash,
241
+ collected_at,
242
+ expires_at,
243
+ collected_at,
244
+ automation_frequency,
245
+ existing["id"],
246
+ ),
247
+ )
248
+ conn.commit()
249
+ evidence_id = existing["id"]
250
+ action = "Evidence refreshed"
251
+ else:
252
+ cursor = conn.execute(
253
+ """INSERT INTO cato_evidence
254
+ (project_id, control_id, evidence_type, evidence_source,
255
+ evidence_path, evidence_hash, collected_at, expires_at,
256
+ is_fresh, freshness_check_at, status, automation_frequency)
257
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, 1, ?, 'current', ?)""",
258
+ (
259
+ project_id, control_id, evidence_type, evidence_source,
260
+ str(evidence_path) if evidence_path else None,
261
+ evidence_hash, collected_at, expires_at,
262
+ collected_at, automation_frequency,
263
+ ),
264
+ )
265
+ conn.commit()
266
+ evidence_id = cursor.lastrowid
267
+ action = "Evidence collected"
268
+
269
+ # Audit trail
270
+ _log_audit_event(conn, project_id, action, {
271
+ "evidence_id": evidence_id,
272
+ "control_id": control_id,
273
+ "evidence_type": evidence_type,
274
+ "evidence_source": evidence_source,
275
+ "automation_frequency": automation_frequency,
276
+ "expires_at": expires_at,
277
+ })
278
+
279
+ result = {
280
+ "evidence_id": evidence_id,
281
+ "control_id": control_id,
282
+ "evidence_type": evidence_type,
283
+ "evidence_source": evidence_source,
284
+ "status": "current",
285
+ "collected_at": collected_at,
286
+ "expires_at": expires_at,
287
+ "evidence_hash": evidence_hash,
288
+ }
289
+
290
+ print(f"cATO evidence {action.lower()}: {control_id} "
291
+ f"[{evidence_type}] from {evidence_source}")
292
+
293
+ return result
294
+
295
+ finally:
296
+ conn.close()
297
+
298
+
299
+ def check_evidence_freshness(project_id, db_path=None):
300
+ """Check all evidence for staleness and expiration.
301
+
302
+ Iterates over all cato_evidence records for the project and updates
303
+ their status based on the current time relative to expires_at:
304
+ - 'expired' if now >= expires_at
305
+ - 'stale' if now >= collected_at + (STALENESS_RATIO * expiry_window)
306
+ - 'current' otherwise
307
+
308
+ Args:
309
+ project_id: Project identifier.
310
+ db_path: Optional database path override.
311
+
312
+ Returns:
313
+ Dict with total, current, stale, expired counts and by_control breakdown.
314
+ """
315
+ conn = _get_connection(db_path)
316
+ try:
317
+ _verify_project(conn, project_id)
318
+
319
+ rows = conn.execute(
320
+ """SELECT id, control_id, evidence_type, evidence_source,
321
+ collected_at, expires_at, status, automation_frequency
322
+ FROM cato_evidence
323
+ WHERE project_id = ?""",
324
+ (project_id,),
325
+ ).fetchall()
326
+
327
+ now = datetime.now(timezone.utc)
328
+ now_str = now.isoformat()
329
+ summary = {
330
+ "total": len(rows),
331
+ "current": 0,
332
+ "stale": 0,
333
+ "expired": 0,
334
+ "by_control": {},
335
+ }
336
+
337
+ for row in rows:
338
+ row_id = row["id"]
339
+ control_id = row["control_id"]
340
+ collected_at_str = row["collected_at"]
341
+ expires_at_str = row["expires_at"]
342
+ freq = row["automation_frequency"] or "manual"
343
+
344
+ try:
345
+ collected_at = datetime.fromisoformat(collected_at_str)
346
+ except (ValueError, TypeError):
347
+ collected_at = now - timedelta(days=365)
348
+
349
+ try:
350
+ expires_at = datetime.fromisoformat(expires_at_str)
351
+ except (ValueError, TypeError):
352
+ expires_at = now - timedelta(days=1)
353
+
354
+ # Determine new status
355
+ if now >= expires_at:
356
+ new_status = "expired"
357
+ is_fresh = 0
358
+ else:
359
+ # Check staleness: 80% of expiry window elapsed
360
+ window_days = EXPIRY_WINDOWS.get(freq, 90)
361
+ stale_threshold = collected_at + timedelta(
362
+ days=window_days * STALENESS_RATIO
363
+ )
364
+ if now >= stale_threshold:
365
+ new_status = "stale"
366
+ is_fresh = 0
367
+ else:
368
+ new_status = "current"
369
+ is_fresh = 1
370
+
371
+ # Update record
372
+ conn.execute(
373
+ """UPDATE cato_evidence
374
+ SET status = ?, is_fresh = ?, freshness_check_at = ?
375
+ WHERE id = ?""",
376
+ (new_status, is_fresh, now_str, row_id),
377
+ )
378
+
379
+ # Tally
380
+ summary[new_status] = summary.get(new_status, 0) + 1
381
+
382
+ if control_id not in summary["by_control"]:
383
+ summary["by_control"][control_id] = {
384
+ "current": 0, "stale": 0, "expired": 0,
385
+ }
386
+ summary["by_control"][control_id][new_status] += 1
387
+
388
+ conn.commit()
389
+
390
+ # Audit trail
391
+ _log_audit_event(conn, project_id, "Freshness check completed", {
392
+ "total": summary["total"],
393
+ "current": summary["current"],
394
+ "stale": summary["stale"],
395
+ "expired": summary["expired"],
396
+ })
397
+
398
+ print(f"cATO freshness check: {summary['total']} items checked")
399
+ print(f" Current: {summary['current']} Stale: {summary['stale']} "
400
+ f"Expired: {summary['expired']}")
401
+
402
+ return summary
403
+
404
+ finally:
405
+ conn.close()
406
+
407
+
408
+ def auto_reassess(project_id, project_dir=None, db_path=None):
409
+ """Automatically re-assess controls with stale or expired evidence.
410
+
411
+ For each stale/expired evidence item, attempts to re-collect evidence
412
+ by checking for updated artifacts:
413
+ - scan_result: look for SAST scan output files
414
+ - test_result: look for pytest/test result files
415
+ - artifact: look for SBOM files
416
+ - config_check: look for STIG finding records in DB
417
+
418
+ Args:
419
+ project_id: Project identifier.
420
+ project_dir: Optional project directory for file-based checks.
421
+ db_path: Optional database path override.
422
+
423
+ Returns:
424
+ List of dicts describing controls that were re-assessed.
425
+ """
426
+ conn = _get_connection(db_path)
427
+ try:
428
+ project = _verify_project(conn, project_id)
429
+
430
+ # Determine scan directory
431
+ if project_dir:
432
+ scan_dir = Path(project_dir)
433
+ else:
434
+ dir_path = project.get("directory_path", "")
435
+ scan_dir = Path(dir_path) if dir_path else None
436
+
437
+ can_scan = scan_dir is not None and scan_dir.is_dir()
438
+
439
+ # Find stale and expired evidence
440
+ rows = conn.execute(
441
+ """SELECT id, control_id, evidence_type, evidence_source,
442
+ evidence_path, automation_frequency
443
+ FROM cato_evidence
444
+ WHERE project_id = ? AND status IN ('stale', 'expired')
445
+ ORDER BY control_id""",
446
+ (project_id,),
447
+ ).fetchall()
448
+
449
+ reassessed = []
450
+
451
+ for row in rows:
452
+ evidence_id = row["id"]
453
+ control_id = row["control_id"]
454
+ evidence_type = row["evidence_type"]
455
+ evidence_source = row["evidence_source"]
456
+ evidence_path = row["evidence_path"]
457
+ freq = row["automation_frequency"] or "manual"
458
+
459
+ refreshed = False
460
+ new_hash = None
461
+ new_path = evidence_path
462
+
463
+ # Attempt re-collection based on evidence type
464
+ if evidence_type == "scan_result" and can_scan:
465
+ # Look for SAST scan result files
466
+ for pattern_dir in ["security", "compliance", "reports"]:
467
+ check_dir = scan_dir / pattern_dir
468
+ if check_dir.is_dir():
469
+ for f in sorted(check_dir.iterdir(), reverse=True):
470
+ if f.is_file() and "sast" in f.name.lower():
471
+ new_hash = _hash_file(f)
472
+ new_path = str(f)
473
+ refreshed = True
474
+ break
475
+ if refreshed:
476
+ break
477
+
478
+ elif evidence_type == "test_result" and can_scan:
479
+ # Look for test result files (pytest output, junit XML)
480
+ for pattern in ["test-results", "reports", "."]:
481
+ check_dir = scan_dir / pattern if pattern != "." else scan_dir
482
+ if check_dir.is_dir():
483
+ for f in sorted(check_dir.iterdir(), reverse=True):
484
+ if f.is_file() and (
485
+ "test" in f.name.lower() or
486
+ "junit" in f.name.lower()
487
+ ) and f.suffix in (".xml", ".json", ".html"):
488
+ new_hash = _hash_file(f)
489
+ new_path = str(f)
490
+ refreshed = True
491
+ break
492
+ if refreshed:
493
+ break
494
+
495
+ elif evidence_type == "artifact" and can_scan:
496
+ # Look for SBOM or other artifact files
497
+ for pattern_dir in ["compliance", "sbom", "reports", "."]:
498
+ check_dir = scan_dir / pattern_dir if pattern_dir != "." else scan_dir
499
+ if check_dir.is_dir():
500
+ for f in sorted(check_dir.iterdir(), reverse=True):
501
+ if f.is_file() and (
502
+ "sbom" in f.name.lower() or
503
+ "bom" in f.name.lower()
504
+ ):
505
+ new_hash = _hash_file(f)
506
+ new_path = str(f)
507
+ refreshed = True
508
+ break
509
+ if refreshed:
510
+ break
511
+
512
+ elif evidence_type == "config_check":
513
+ # Check DB for recent STIG findings as config evidence
514
+ try:
515
+ stig_row = conn.execute(
516
+ """SELECT COUNT(*) as cnt FROM stig_findings
517
+ WHERE project_id = ?
518
+ AND assessed_at > datetime('now', '-7 days')""",
519
+ (project_id,),
520
+ ).fetchone()
521
+ if stig_row and stig_row["cnt"] > 0:
522
+ refreshed = True
523
+ new_path = None
524
+ new_hash = None
525
+ except sqlite3.OperationalError:
526
+ pass
527
+
528
+ elif evidence_path and Path(evidence_path).is_file():
529
+ # For any evidence type, if the file still exists, re-hash it
530
+ current_hash = _hash_file(evidence_path)
531
+ if current_hash:
532
+ new_hash = current_hash
533
+ refreshed = True
534
+
535
+ if refreshed:
536
+ now = datetime.now(timezone.utc)
537
+ collected_at = now.isoformat()
538
+ expires_at = _compute_expires_at(collected_at, freq)
539
+
540
+ conn.execute(
541
+ """UPDATE cato_evidence
542
+ SET evidence_path = ?,
543
+ evidence_hash = ?,
544
+ collected_at = ?,
545
+ expires_at = ?,
546
+ is_fresh = 1,
547
+ freshness_check_at = ?,
548
+ status = 'current'
549
+ WHERE id = ?""",
550
+ (
551
+ new_path, new_hash,
552
+ collected_at, expires_at,
553
+ collected_at, evidence_id,
554
+ ),
555
+ )
556
+
557
+ reassessed.append({
558
+ "evidence_id": evidence_id,
559
+ "control_id": control_id,
560
+ "evidence_type": evidence_type,
561
+ "evidence_source": evidence_source,
562
+ "new_status": "current",
563
+ "collected_at": collected_at,
564
+ "expires_at": expires_at,
565
+ })
566
+
567
+ conn.commit()
568
+
569
+ # Audit trail
570
+ _log_audit_event(conn, project_id, "Auto-reassessment completed", {
571
+ "stale_expired_checked": len(rows),
572
+ "reassessed": len(reassessed),
573
+ "controls_refreshed": list(set(r["control_id"] for r in reassessed)),
574
+ })
575
+
576
+ print(f"cATO auto-reassess: {len(rows)} stale/expired items checked, "
577
+ f"{len(reassessed)} refreshed")
578
+ for r in reassessed:
579
+ print(f" Refreshed: {r['control_id']} [{r['evidence_type']}] "
580
+ f"from {r['evidence_source']}")
581
+
582
+ return reassessed
583
+
584
+ finally:
585
+ conn.close()
586
+
587
+
588
+ def compute_cato_readiness(project_id, db_path=None):
589
+ """Compute cATO readiness score for a project.
590
+
591
+ Calculates the percentage of controls with fresh, current evidence
592
+ and the percentage of evidence collection that is automated.
593
+
594
+ Args:
595
+ project_id: Project identifier.
596
+ db_path: Optional database path override.
597
+
598
+ Returns:
599
+ Dict with total_controls, controls_with_evidence,
600
+ controls_with_fresh_evidence, readiness_pct, automated_pct,
601
+ and by_frequency breakdown.
602
+ """
603
+ conn = _get_connection(db_path)
604
+ try:
605
+ _verify_project(conn, project_id)
606
+
607
+ # Get all evidence records
608
+ rows = conn.execute(
609
+ """SELECT control_id, evidence_type, status, is_fresh,
610
+ automation_frequency
611
+ FROM cato_evidence
612
+ WHERE project_id = ?""",
613
+ (project_id,),
614
+ ).fetchall()
615
+
616
+ if not rows:
617
+ return {
618
+ "total_controls": 0,
619
+ "controls_with_evidence": 0,
620
+ "controls_with_fresh_evidence": 0,
621
+ "readiness_pct": 0.0,
622
+ "automated_pct": 0.0,
623
+ "total_evidence_items": 0,
624
+ "by_frequency": {},
625
+ }
626
+
627
+ # Gather distinct controls
628
+ all_controls = set()
629
+ controls_with_evidence = set()
630
+ controls_with_fresh = set()
631
+ freq_counts = {}
632
+ automated_count = 0
633
+
634
+ for row in rows:
635
+ control_id = row["control_id"]
636
+ status = row["status"]
637
+ is_fresh = row["is_fresh"]
638
+ freq = row["automation_frequency"] or "manual"
639
+
640
+ all_controls.add(control_id)
641
+ controls_with_evidence.add(control_id)
642
+
643
+ if status == "current" and is_fresh:
644
+ controls_with_fresh.add(control_id)
645
+
646
+ # Track frequency distribution
647
+ freq_counts[freq] = freq_counts.get(freq, 0) + 1
648
+
649
+ # Automated = anything that is not 'manual'
650
+ if freq != "manual":
651
+ automated_count += 1
652
+
653
+ total_controls = len(all_controls)
654
+ total_evidence = len(rows)
655
+
656
+ # Also check project_controls for total mapped controls
657
+ try:
658
+ ctrl_row = conn.execute(
659
+ "SELECT COUNT(DISTINCT control_id) as cnt FROM project_controls WHERE project_id = ?",
660
+ (project_id,),
661
+ ).fetchone()
662
+ mapped_controls = ctrl_row["cnt"] if ctrl_row else 0
663
+ if mapped_controls > total_controls:
664
+ total_controls = mapped_controls
665
+ except sqlite3.OperationalError:
666
+ pass
667
+
668
+ readiness_pct = 0.0
669
+ if total_controls > 0:
670
+ readiness_pct = round(
671
+ len(controls_with_fresh) / total_controls * 100, 1
672
+ )
673
+
674
+ automated_pct = 0.0
675
+ if total_evidence > 0:
676
+ automated_pct = round(automated_count / total_evidence * 100, 1)
677
+
678
+ result = {
679
+ "total_controls": total_controls,
680
+ "controls_with_evidence": len(controls_with_evidence),
681
+ "controls_with_fresh_evidence": len(controls_with_fresh),
682
+ "readiness_pct": readiness_pct,
683
+ "automated_pct": automated_pct,
684
+ "total_evidence_items": total_evidence,
685
+ "by_frequency": freq_counts,
686
+ }
687
+
688
+ print(f"cATO readiness: {readiness_pct}% "
689
+ f"({len(controls_with_fresh)}/{total_controls} controls fresh)")
690
+ print(f" Automation: {automated_pct}% of evidence is automated")
691
+
692
+ return result
693
+
694
+ finally:
695
+ conn.close()
696
+
697
+
698
+ def get_cato_dashboard_data(project_id, db_path=None):
699
+ """Get comprehensive cATO dashboard data for display.
700
+
701
+ Aggregates readiness score, evidence freshness chart data,
702
+ upcoming expirations, controls needing attention, and trend data.
703
+
704
+ Args:
705
+ project_id: Project identifier.
706
+ db_path: Optional database path override.
707
+
708
+ Returns:
709
+ Dict with readiness, freshness_chart, upcoming_expirations,
710
+ controls_needing_attention, and trend sections.
711
+ """
712
+ conn = _get_connection(db_path)
713
+ try:
714
+ _verify_project(conn, project_id)
715
+
716
+ # --- Readiness score ---
717
+ readiness = compute_cato_readiness(project_id, db_path=db_path)
718
+
719
+ # --- Freshness chart data ---
720
+ rows = conn.execute(
721
+ """SELECT status, COUNT(*) as cnt
722
+ FROM cato_evidence
723
+ WHERE project_id = ?
724
+ GROUP BY status""",
725
+ (project_id,),
726
+ ).fetchall()
727
+
728
+ freshness_chart = {
729
+ "current": 0, "stale": 0, "expired": 0, "superseded": 0,
730
+ }
731
+ for row in rows:
732
+ freshness_chart[row["status"]] = row["cnt"]
733
+
734
+ # --- Upcoming expirations (next 30 days) ---
735
+ cutoff = (datetime.now(timezone.utc) + timedelta(days=30)).isoformat()
736
+ now_str = datetime.now(timezone.utc).isoformat()
737
+
738
+ expiring_rows = conn.execute(
739
+ """SELECT id, control_id, evidence_type, evidence_source,
740
+ expires_at, automation_frequency, status
741
+ FROM cato_evidence
742
+ WHERE project_id = ?
743
+ AND expires_at <= ?
744
+ AND expires_at > ?
745
+ AND status != 'expired'
746
+ ORDER BY expires_at ASC""",
747
+ (project_id, cutoff, now_str),
748
+ ).fetchall()
749
+
750
+ upcoming_expirations = []
751
+ for row in expiring_rows:
752
+ try:
753
+ exp_dt = datetime.fromisoformat(row["expires_at"])
754
+ days_until = (exp_dt - datetime.now(timezone.utc)).days
755
+ except (ValueError, TypeError):
756
+ days_until = -1
757
+
758
+ upcoming_expirations.append({
759
+ "evidence_id": row["id"],
760
+ "control_id": row["control_id"],
761
+ "evidence_type": row["evidence_type"],
762
+ "evidence_source": row["evidence_source"],
763
+ "expires_at": row["expires_at"],
764
+ "days_until_expiry": days_until,
765
+ "automation_frequency": row["automation_frequency"],
766
+ "status": row["status"],
767
+ })
768
+
769
+ # --- Controls needing attention ---
770
+ attention_rows = conn.execute(
771
+ """SELECT DISTINCT control_id, status, evidence_type, evidence_source,
772
+ expires_at
773
+ FROM cato_evidence
774
+ WHERE project_id = ? AND status IN ('stale', 'expired')
775
+ ORDER BY status DESC, control_id""",
776
+ (project_id,),
777
+ ).fetchall()
778
+
779
+ controls_needing_attention = []
780
+ for row in attention_rows:
781
+ controls_needing_attention.append({
782
+ "control_id": row["control_id"],
783
+ "status": row["status"],
784
+ "evidence_type": row["evidence_type"],
785
+ "evidence_source": row["evidence_source"],
786
+ "expires_at": row["expires_at"],
787
+ })
788
+
789
+ # --- Trend data: evidence collected per day (last 30 days) ---
790
+ thirty_days_ago = (datetime.now(timezone.utc) - timedelta(days=30)).isoformat()
791
+
792
+ trend_rows = conn.execute(
793
+ """SELECT DATE(collected_at) as day, COUNT(*) as cnt
794
+ FROM cato_evidence
795
+ WHERE project_id = ? AND collected_at >= ?
796
+ GROUP BY DATE(collected_at)
797
+ ORDER BY day""",
798
+ (project_id, thirty_days_ago),
799
+ ).fetchall()
800
+
801
+ trend_data = [
802
+ {"date": row["day"], "evidence_collected": row["cnt"]}
803
+ for row in trend_rows
804
+ ]
805
+
806
+ # --- Evidence by type distribution ---
807
+ type_rows = conn.execute(
808
+ """SELECT evidence_type, COUNT(*) as cnt
809
+ FROM cato_evidence
810
+ WHERE project_id = ?
811
+ GROUP BY evidence_type""",
812
+ (project_id,),
813
+ ).fetchall()
814
+
815
+ evidence_by_type = {row["evidence_type"]: row["cnt"] for row in type_rows}
816
+
817
+ # --- ZTA posture (ADR D123) ---
818
+ zta_posture = check_zta_posture(project_id, db_path=db_path)
819
+
820
+ # --- MOSA evidence (D130, optional) ---
821
+ mosa_evidence = collect_mosa_evidence(project_id, db_path=db_path)
822
+
823
+ result = {
824
+ "project_id": project_id,
825
+ "generated_at": datetime.now(timezone.utc).isoformat(),
826
+ "readiness": readiness,
827
+ "freshness_chart": freshness_chart,
828
+ "upcoming_expirations": upcoming_expirations,
829
+ "controls_needing_attention": controls_needing_attention,
830
+ "trend_data": trend_data,
831
+ "evidence_by_type": evidence_by_type,
832
+ "zta_posture": zta_posture,
833
+ "mosa_evidence": mosa_evidence,
834
+ }
835
+
836
+ print(f"cATO dashboard data generated for project {project_id}")
837
+ print(f" Readiness: {readiness['readiness_pct']}%")
838
+ print(f" Upcoming expirations (30d): {len(upcoming_expirations)}")
839
+ print(f" Controls needing attention: {len(controls_needing_attention)}")
840
+
841
+ return result
842
+
843
+ finally:
844
+ conn.close()
845
+
846
+
847
+ def expire_old_evidence(project_id, db_path=None):
848
+ """Mark all past-due evidence as 'expired'.
849
+
850
+ Scans all non-expired evidence and marks any items where
851
+ the current time has passed their expires_at timestamp.
852
+
853
+ Args:
854
+ project_id: Project identifier.
855
+ db_path: Optional database path override.
856
+
857
+ Returns:
858
+ Dict with expired_count and list of expired evidence IDs.
859
+ """
860
+ conn = _get_connection(db_path)
861
+ try:
862
+ _verify_project(conn, project_id)
863
+
864
+ now = datetime.now(timezone.utc)
865
+ now_str = now.isoformat()
866
+
867
+ # Find all evidence that should be expired
868
+ rows = conn.execute(
869
+ """SELECT id, control_id, evidence_type, evidence_source, expires_at
870
+ FROM cato_evidence
871
+ WHERE project_id = ?
872
+ AND status NOT IN ('expired', 'superseded')
873
+ AND expires_at <= ?""",
874
+ (project_id, now_str),
875
+ ).fetchall()
876
+
877
+ expired_ids = []
878
+ for row in rows:
879
+ conn.execute(
880
+ """UPDATE cato_evidence
881
+ SET status = 'expired', is_fresh = 0, freshness_check_at = ?
882
+ WHERE id = ?""",
883
+ (now_str, row["id"]),
884
+ )
885
+ expired_ids.append(row["id"])
886
+
887
+ conn.commit()
888
+
889
+ # Audit trail
890
+ if expired_ids:
891
+ _log_audit_event(conn, project_id, "Evidence expired", {
892
+ "expired_count": len(expired_ids),
893
+ "expired_ids": expired_ids,
894
+ })
895
+
896
+ print(f"cATO expire: {len(expired_ids)} evidence items marked as expired")
897
+
898
+ return {
899
+ "expired_count": len(expired_ids),
900
+ "expired_ids": expired_ids,
901
+ }
902
+
903
+ finally:
904
+ conn.close()
905
+
906
+
907
+ def check_zta_posture(project_id, db_path=None):
908
+ """Check ZTA posture and include as cATO evidence dimension.
909
+
910
+ Queries the zta_maturity_scores and zta_posture_evidence tables to
911
+ compute a ZTA posture summary. The ZTA maturity score feeds into
912
+ cATO readiness as an additional evidence dimension (ADR D123).
913
+
914
+ Args:
915
+ project_id: Project identifier.
916
+ db_path: Optional database path override.
917
+
918
+ Returns:
919
+ Dict with zta_maturity, pillar_scores, posture_evidence_freshness,
920
+ and cato_contribution.
921
+ """
922
+ conn = _get_connection(db_path)
923
+ try:
924
+ _verify_project(conn, project_id)
925
+
926
+ result = {
927
+ "project_id": project_id,
928
+ "zta_available": False,
929
+ "overall_maturity": "traditional",
930
+ "overall_score": 0.0,
931
+ "pillar_scores": {},
932
+ "posture_evidence": {"total": 0, "current": 0, "stale": 0, "expired": 0},
933
+ "cato_contribution": 0.0,
934
+ }
935
+
936
+ # Query ZTA maturity scores
937
+ try:
938
+ maturity_rows = conn.execute(
939
+ """SELECT pillar, score, maturity_level
940
+ FROM zta_maturity_scores
941
+ WHERE project_id = ?
942
+ ORDER BY created_at DESC""",
943
+ (project_id,),
944
+ ).fetchall()
945
+
946
+ if maturity_rows:
947
+ result["zta_available"] = True
948
+ for row in maturity_rows:
949
+ pillar = row["pillar"]
950
+ if pillar == "overall":
951
+ result["overall_score"] = row["score"] or 0.0
952
+ result["overall_maturity"] = row["maturity_level"] or "traditional"
953
+ else:
954
+ result["pillar_scores"][pillar] = {
955
+ "score": row["score"] or 0.0,
956
+ "maturity_level": row["maturity_level"] or "traditional",
957
+ }
958
+ except sqlite3.OperationalError:
959
+ pass # Table may not exist yet
960
+
961
+ # Query ZTA posture evidence freshness
962
+ try:
963
+ posture_rows = conn.execute(
964
+ """SELECT status, COUNT(*) as cnt
965
+ FROM zta_posture_evidence
966
+ WHERE project_id = ?
967
+ GROUP BY status""",
968
+ (project_id,),
969
+ ).fetchall()
970
+
971
+ for row in posture_rows:
972
+ status = row["status"]
973
+ if status in result["posture_evidence"]:
974
+ result["posture_evidence"][status] = row["cnt"]
975
+ result["posture_evidence"]["total"] += row["cnt"]
976
+ except sqlite3.OperationalError:
977
+ pass # Table may not exist yet
978
+
979
+ # Compute cATO contribution: ZTA maturity score scaled to 0-100
980
+ if result["zta_available"]:
981
+ result["cato_contribution"] = round(result["overall_score"] * 100, 1)
982
+
983
+ print(f"ZTA posture check: maturity={result['overall_maturity']} "
984
+ f"score={result['overall_score']:.2f} "
985
+ f"evidence={result['posture_evidence']['total']} items")
986
+
987
+ return result
988
+
989
+ finally:
990
+ conn.close()
991
+
992
+
993
+ def collect_mosa_evidence(project_id, db_path=None):
994
+ """Collect MOSA architecture review evidence for cATO (D130).
995
+
996
+ Queries mosa_modularity_metrics and mosa_assessments tables to build
997
+ an evidence summary for controls SA-3, SA-8, SA-17. Only runs when
998
+ mosa_config.yaml has cato_integration.enabled = true.
999
+
1000
+ Args:
1001
+ project_id: Project identifier.
1002
+ db_path: Optional database path override.
1003
+
1004
+ Returns:
1005
+ Dict with mosa_available, modularity_score, icd_coverage,
1006
+ tsp_current, mapped_controls, and cato_contribution.
1007
+ """
1008
+ # Check config flag
1009
+ config_path = Path(__file__).resolve().parent.parent.parent / "args" / "mosa_config.yaml"
1010
+ mosa_enabled = False
1011
+ if config_path.exists():
1012
+ try:
1013
+ import yaml
1014
+ with open(config_path) as f:
1015
+ cfg = yaml.safe_load(f) or {}
1016
+ mosa_enabled = cfg.get("mosa", {}).get("cato_integration", {}).get("enabled", False)
1017
+ except Exception:
1018
+ pass
1019
+
1020
+ if not mosa_enabled:
1021
+ return {"project_id": project_id, "mosa_available": False,
1022
+ "reason": "cato_integration.enabled is false in mosa_config.yaml"}
1023
+
1024
+ conn = _get_connection(db_path)
1025
+ try:
1026
+ _verify_project(conn, project_id)
1027
+ result = {
1028
+ "project_id": project_id,
1029
+ "mosa_available": False,
1030
+ "modularity_score": 0.0,
1031
+ "icd_coverage": {"approved": 0, "total_required": 0, "pct": 0.0},
1032
+ "tsp_current": False,
1033
+ "mapped_controls": ["SA-3", "SA-8", "SA-17"],
1034
+ "cato_contribution": 0.0,
1035
+ }
1036
+
1037
+ try:
1038
+ metrics = conn.execute(
1039
+ """SELECT overall_modularity_score, approved_icd_count,
1040
+ total_icd_required, tsp_current
1041
+ FROM mosa_modularity_metrics
1042
+ WHERE project_id = ?
1043
+ ORDER BY assessment_date DESC LIMIT 1""",
1044
+ (project_id,),
1045
+ ).fetchone()
1046
+ if metrics:
1047
+ result["mosa_available"] = True
1048
+ result["modularity_score"] = metrics["overall_modularity_score"] or 0.0
1049
+ result["icd_coverage"]["approved"] = metrics["approved_icd_count"] or 0
1050
+ result["icd_coverage"]["total_required"] = metrics["total_icd_required"] or 0
1051
+ if metrics["total_icd_required"]:
1052
+ result["icd_coverage"]["pct"] = round(
1053
+ (metrics["approved_icd_count"] or 0) / metrics["total_icd_required"] * 100, 1)
1054
+ result["tsp_current"] = bool(metrics["tsp_current"])
1055
+ result["cato_contribution"] = round(result["modularity_score"] * 100, 1)
1056
+ except Exception:
1057
+ pass
1058
+
1059
+ print(f"MOSA evidence check: available={result['mosa_available']} "
1060
+ f"modularity={result['modularity_score']:.2f} "
1061
+ f"ICD={result['icd_coverage']['approved']}/{result['icd_coverage']['total_required']}")
1062
+ return result
1063
+ finally:
1064
+ conn.close()
1065
+
1066
+
1067
+ def get_evidence_for_control(project_id, control_id, db_path=None):
1068
+ """Get all evidence items for a specific control.
1069
+
1070
+ Args:
1071
+ project_id: Project identifier.
1072
+ control_id: NIST 800-53 control ID (e.g. 'AC-2').
1073
+ db_path: Optional database path override.
1074
+
1075
+ Returns:
1076
+ List of dicts with evidence details for the specified control.
1077
+ """
1078
+ conn = _get_connection(db_path)
1079
+ try:
1080
+ _verify_project(conn, project_id)
1081
+
1082
+ rows = conn.execute(
1083
+ """SELECT id, control_id, evidence_type, evidence_source,
1084
+ evidence_path, evidence_hash, collected_at, expires_at,
1085
+ is_fresh, freshness_check_at, status, automation_frequency
1086
+ FROM cato_evidence
1087
+ WHERE project_id = ? AND control_id = ?
1088
+ ORDER BY collected_at DESC""",
1089
+ (project_id, control_id),
1090
+ ).fetchall()
1091
+
1092
+ results = []
1093
+ for row in rows:
1094
+ results.append({
1095
+ "evidence_id": row["id"],
1096
+ "control_id": row["control_id"],
1097
+ "evidence_type": row["evidence_type"],
1098
+ "evidence_source": row["evidence_source"],
1099
+ "evidence_path": row["evidence_path"],
1100
+ "evidence_hash": row["evidence_hash"],
1101
+ "collected_at": row["collected_at"],
1102
+ "expires_at": row["expires_at"],
1103
+ "is_fresh": bool(row["is_fresh"]),
1104
+ "freshness_check_at": row["freshness_check_at"],
1105
+ "status": row["status"],
1106
+ "automation_frequency": row["automation_frequency"],
1107
+ })
1108
+
1109
+ print(f"cATO evidence for {control_id}: {len(results)} items found")
1110
+ return results
1111
+
1112
+ finally:
1113
+ conn.close()
1114
+
1115
+
1116
+ # --------------------------------------------------------------------------
1117
+ # CLI formatting helpers
1118
+ # --------------------------------------------------------------------------
1119
+
1120
+ def _format_readiness_report(readiness):
1121
+ """Format readiness data as a console report."""
1122
+ lines = [
1123
+ "=" * 65,
1124
+ " cATO READINESS REPORT",
1125
+ "=" * 65,
1126
+ "",
1127
+ f" Total controls tracked: {readiness['total_controls']}",
1128
+ f" Controls with evidence: {readiness['controls_with_evidence']}",
1129
+ f" Controls with FRESH evidence: {readiness['controls_with_fresh_evidence']}",
1130
+ "",
1131
+ f" Readiness Score: {readiness['readiness_pct']}%",
1132
+ f" Automation Rate: {readiness['automated_pct']}%",
1133
+ "",
1134
+ " Evidence by Automation Frequency:",
1135
+ ]
1136
+
1137
+ for freq, count in sorted(readiness.get("by_frequency", {}).items()):
1138
+ lines.append(f" {freq:<15} {count} items")
1139
+
1140
+ lines.append("")
1141
+ lines.append("=" * 65)
1142
+ return "\n".join(lines)
1143
+
1144
+
1145
+ def _format_dashboard_report(dashboard):
1146
+ """Format dashboard data as a console report."""
1147
+ readiness = dashboard.get("readiness", {})
1148
+ freshness = dashboard.get("freshness_chart", {})
1149
+ upcoming = dashboard.get("upcoming_expirations", [])
1150
+ attention = dashboard.get("controls_needing_attention", [])
1151
+
1152
+ lines = [
1153
+ "=" * 65,
1154
+ " cATO MONITORING DASHBOARD",
1155
+ "=" * 65,
1156
+ f" Project: {dashboard.get('project_id', 'N/A')}",
1157
+ f" Generated: {dashboard.get('generated_at', 'N/A')}",
1158
+ "",
1159
+ " --- Readiness ---",
1160
+ f" Score: {readiness.get('readiness_pct', 0)}%",
1161
+ f" Automation: {readiness.get('automated_pct', 0)}%",
1162
+ "",
1163
+ " --- Evidence Freshness ---",
1164
+ f" Current: {freshness.get('current', 0)}",
1165
+ f" Stale: {freshness.get('stale', 0)}",
1166
+ f" Expired: {freshness.get('expired', 0)}",
1167
+ f" Superseded: {freshness.get('superseded', 0)}",
1168
+ "",
1169
+ ]
1170
+
1171
+ # Evidence by type
1172
+ by_type = dashboard.get("evidence_by_type", {})
1173
+ if by_type:
1174
+ lines.append(" --- Evidence by Type ---")
1175
+ for etype, cnt in sorted(by_type.items()):
1176
+ lines.append(f" {etype:<18} {cnt}")
1177
+ lines.append("")
1178
+
1179
+ # Upcoming expirations
1180
+ if upcoming:
1181
+ lines.append(f" --- Upcoming Expirations (next 30 days): {len(upcoming)} ---")
1182
+ for item in upcoming[:15]:
1183
+ lines.append(
1184
+ f" {item['control_id']:<10} {item['evidence_type']:<16} "
1185
+ f"expires in {item['days_until_expiry']}d [{item['automation_frequency']}]"
1186
+ )
1187
+ if len(upcoming) > 15:
1188
+ lines.append(f" ... and {len(upcoming) - 15} more")
1189
+ lines.append("")
1190
+
1191
+ # Controls needing attention
1192
+ if attention:
1193
+ lines.append(f" --- Controls Needing Attention: {len(attention)} ---")
1194
+ for item in attention[:15]:
1195
+ lines.append(
1196
+ f" {item['control_id']:<10} {item['evidence_type']:<16} "
1197
+ f"status={item['status']}"
1198
+ )
1199
+ if len(attention) > 15:
1200
+ lines.append(f" ... and {len(attention) - 15} more")
1201
+ lines.append("")
1202
+
1203
+ lines.append("=" * 65)
1204
+ return "\n".join(lines)
1205
+
1206
+
1207
+ # --------------------------------------------------------------------------
1208
+ # CLI entry point
1209
+ # --------------------------------------------------------------------------
1210
+
1211
+ def main():
1212
+ """CLI entry point for cATO monitoring engine."""
1213
+ parser = argparse.ArgumentParser(
1214
+ description="Continuous ATO (cATO) monitoring engine"
1215
+ )
1216
+ parser.add_argument(
1217
+ "--project-id", required=True,
1218
+ help="Project ID in ICDEV database"
1219
+ )
1220
+ parser.add_argument(
1221
+ "--db-path", type=Path, default=None,
1222
+ help="Override database path"
1223
+ )
1224
+ parser.add_argument(
1225
+ "--project-dir", type=Path, default=None,
1226
+ help="Project directory for auto-reassessment file checks"
1227
+ )
1228
+
1229
+ # Action flags (mutually exclusive)
1230
+ group = parser.add_mutually_exclusive_group(required=True)
1231
+ group.add_argument(
1232
+ "--check-freshness", action="store_true",
1233
+ help="Check all evidence for staleness and expiration"
1234
+ )
1235
+ group.add_argument(
1236
+ "--auto-reassess", action="store_true",
1237
+ help="Auto-reassess stale/expired evidence"
1238
+ )
1239
+ group.add_argument(
1240
+ "--readiness", action="store_true",
1241
+ help="Compute cATO readiness score"
1242
+ )
1243
+ group.add_argument(
1244
+ "--dashboard", action="store_true",
1245
+ help="Generate dashboard data"
1246
+ )
1247
+ group.add_argument(
1248
+ "--expire", action="store_true",
1249
+ help="Expire all past-due evidence"
1250
+ )
1251
+ group.add_argument(
1252
+ "--control", type=str, default=None,
1253
+ help="Get evidence for a specific control ID"
1254
+ )
1255
+ group.add_argument(
1256
+ "--zta-posture", action="store_true",
1257
+ help="Check ZTA posture for cATO readiness (ADR D123)"
1258
+ )
1259
+ group.add_argument(
1260
+ "--mosa-evidence", action="store_true",
1261
+ help="Collect MOSA architecture evidence for cATO (D130)"
1262
+ )
1263
+
1264
+ # Output format
1265
+ parser.add_argument(
1266
+ "--json", action="store_true",
1267
+ help="Output as JSON"
1268
+ )
1269
+
1270
+ args = parser.parse_args()
1271
+
1272
+ try:
1273
+ if args.check_freshness:
1274
+ result = check_evidence_freshness(
1275
+ project_id=args.project_id,
1276
+ db_path=args.db_path,
1277
+ )
1278
+ if args.json:
1279
+ print(json.dumps(result, indent=2, default=str))
1280
+
1281
+ elif args.auto_reassess:
1282
+ result = auto_reassess(
1283
+ project_id=args.project_id,
1284
+ project_dir=args.project_dir,
1285
+ db_path=args.db_path,
1286
+ )
1287
+ if args.json:
1288
+ print(json.dumps(result, indent=2, default=str))
1289
+ else:
1290
+ if not result:
1291
+ print("No evidence items could be refreshed.")
1292
+
1293
+ elif args.readiness:
1294
+ result = compute_cato_readiness(
1295
+ project_id=args.project_id,
1296
+ db_path=args.db_path,
1297
+ )
1298
+ if args.json:
1299
+ print(json.dumps(result, indent=2, default=str))
1300
+ else:
1301
+ print(_format_readiness_report(result))
1302
+
1303
+ elif args.dashboard:
1304
+ result = get_cato_dashboard_data(
1305
+ project_id=args.project_id,
1306
+ db_path=args.db_path,
1307
+ )
1308
+ if args.json:
1309
+ print(json.dumps(result, indent=2, default=str))
1310
+ else:
1311
+ print(_format_dashboard_report(result))
1312
+
1313
+ elif args.expire:
1314
+ result = expire_old_evidence(
1315
+ project_id=args.project_id,
1316
+ db_path=args.db_path,
1317
+ )
1318
+ if args.json:
1319
+ print(json.dumps(result, indent=2, default=str))
1320
+
1321
+ elif args.control:
1322
+ result = get_evidence_for_control(
1323
+ project_id=args.project_id,
1324
+ control_id=args.control,
1325
+ db_path=args.db_path,
1326
+ )
1327
+ if args.json:
1328
+ print(json.dumps(result, indent=2, default=str))
1329
+ else:
1330
+ if not result:
1331
+ print(f"No evidence found for control {args.control}")
1332
+ else:
1333
+ for item in result:
1334
+ print(f" [{item['status']}] {item['evidence_type']} "
1335
+ f"from {item['evidence_source']} "
1336
+ f"(collected {item['collected_at']}, "
1337
+ f"expires {item['expires_at']})")
1338
+
1339
+ elif args.zta_posture:
1340
+ result = check_zta_posture(
1341
+ project_id=args.project_id,
1342
+ db_path=args.db_path,
1343
+ )
1344
+ if args.json:
1345
+ print(json.dumps(result, indent=2, default=str))
1346
+ else:
1347
+ print(f"ZTA Posture for {args.project_id}:")
1348
+ print(f" Available: {result['zta_available']}")
1349
+ print(f" Maturity: {result['overall_maturity']}")
1350
+ print(f" Score: {result['overall_score']:.2f}")
1351
+ print(f" Evidence: {result['posture_evidence']['total']} items "
1352
+ f"({result['posture_evidence']['current']} current)")
1353
+ if result['pillar_scores']:
1354
+ print(" Pillar Scores:")
1355
+ for pillar, data in result['pillar_scores'].items():
1356
+ print(f" {pillar:<30} {data['score']:.2f} ({data['maturity_level']})")
1357
+
1358
+ elif args.mosa_evidence:
1359
+ result = collect_mosa_evidence(
1360
+ project_id=args.project_id,
1361
+ db_path=args.db_path,
1362
+ )
1363
+ if args.json:
1364
+ print(json.dumps(result, indent=2, default=str))
1365
+ else:
1366
+ print(f"MOSA Evidence for {args.project_id}:")
1367
+ print(f" Available: {result['mosa_available']}")
1368
+ if result['mosa_available']:
1369
+ print(f" Modularity: {result['modularity_score']:.2f}")
1370
+ print(f" ICD Coverage: {result['icd_coverage']['approved']}"
1371
+ f"/{result['icd_coverage']['total_required']}"
1372
+ f" ({result['icd_coverage']['pct']}%)")
1373
+ print(f" TSP Current: {result['tsp_current']}")
1374
+ print(f" Mapped Controls: {', '.join(result['mapped_controls'])}")
1375
+ print(f" cATO Score: {result['cato_contribution']}")
1376
+ else:
1377
+ print(f" Reason: {result.get('reason', 'No metrics found')}")
1378
+
1379
+ except (FileNotFoundError, ValueError) as e:
1380
+ print(f"ERROR: {e}", file=sys.stderr)
1381
+ sys.exit(1)
1382
+
1383
+
1384
+ if __name__ == "__main__":
1385
+ main()