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,1573 @@
1
+ # [TEMPLATE: CUI // SP-CTI]
2
+ #!/usr/bin/env python3
3
+ """SysML v1.6 XMI Parser for Cameo Systems Modeler exports.
4
+
5
+ Parses MagicDraw/Cameo XMI files using Python stdlib xml.etree.ElementTree
6
+ (no lxml — air-gapped environment). Extracts SysML blocks, interface blocks,
7
+ activities, requirements, state machines, use cases, and all relationship types
8
+ (structural + SysML dependency stereotypes).
9
+
10
+ Stores parsed elements into the ICDEV SQLite database (sysml_elements,
11
+ sysml_relationships, model_imports tables) and records an immutable audit
12
+ trail entry.
13
+
14
+ CLI usage:
15
+ python tools/mbse/xmi_parser.py --project-id proj-123 --file model.xmi
16
+ python tools/mbse/xmi_parser.py --project-id proj-123 --file model.xmi --validate-only
17
+ python tools/mbse/xmi_parser.py --project-id proj-123 --file model.xmi --json
18
+ """
19
+
20
+ import argparse
21
+ import hashlib
22
+ import json
23
+ import sqlite3
24
+ import sys
25
+ import uuid
26
+ import xml.etree.ElementTree as ET
27
+ from datetime import datetime
28
+ from pathlib import Path
29
+ from typing import Any, Dict, List, Optional, Tuple
30
+ from icdev._paths import get_project_root
31
+
32
+ # ---------------------------------------------------------------------------
33
+ # Path constants
34
+ # ---------------------------------------------------------------------------
35
+ BASE_DIR = get_project_root()
36
+ DB_PATH = BASE_DIR / "data" / "icdev.db"
37
+
38
+ # ---------------------------------------------------------------------------
39
+ # Audit logger — graceful fallback for standalone execution
40
+ # ---------------------------------------------------------------------------
41
+ try:
42
+ from icdev.tools.audit.audit_logger import log_event # type: ignore
43
+ _HAS_AUDIT = True
44
+ except ImportError:
45
+ _HAS_AUDIT = False
46
+
47
+ def log_event(**kwargs) -> int: # noqa: D103 – stub
48
+ return -1
49
+
50
+ # ---------------------------------------------------------------------------
51
+ # Well-known XMI / UML / SysML / MagicDraw namespace URIs
52
+ # ---------------------------------------------------------------------------
53
+ KNOWN_NAMESPACES: Dict[str, str] = {
54
+ "xmi": "http://www.omg.org/spec/XMI/20131001",
55
+ "uml": "http://www.omg.org/spec/UML/20131001",
56
+ "sysml": "http://www.omg.org/spec/SysML/20181001",
57
+ "md": "http://www.nomagic.com/magicdraw/UML/2.5.1",
58
+ }
59
+
60
+ # Older namespace variants that Cameo may emit
61
+ NAMESPACE_ALTERNATIVES: Dict[str, List[str]] = {
62
+ "xmi": [
63
+ "http://www.omg.org/spec/XMI/20131001",
64
+ "http://www.omg.org/spec/XMI/20110701",
65
+ "http://www.omg.org/spec/XMI/2.5.1",
66
+ "http://www.omg.org/XMI",
67
+ ],
68
+ "uml": [
69
+ "http://www.omg.org/spec/UML/20131001",
70
+ "http://www.omg.org/spec/UML/20110701",
71
+ "http://www.eclipse.org/uml2/5.0.0/UML",
72
+ "http://schema.omg.org/spec/UML/2.1",
73
+ ],
74
+ "sysml": [
75
+ "http://www.omg.org/spec/SysML/20181001",
76
+ "http://www.omg.org/spec/SysML/20150709",
77
+ "http://www.omg.org/spec/SysML/20120401",
78
+ ],
79
+ "md": [
80
+ "http://www.nomagic.com/magicdraw/UML/2.5.1",
81
+ "http://www.nomagic.com/magicdraw/UML/2.5",
82
+ "http://www.nomagic.com/magicdraw/UML/2.4.1",
83
+ ],
84
+ }
85
+
86
+ # SysML relationship stereotype keywords (lower-cased for matching)
87
+ SYSML_REL_STEREOTYPES = {
88
+ "satisfy", "derive", "verify", "refine", "trace", "allocate", "copy",
89
+ }
90
+
91
+ # ---------------------------------------------------------------------------
92
+ # Helpers
93
+ # ---------------------------------------------------------------------------
94
+
95
+ def _new_id() -> str:
96
+ """Generate a prefixed UUID for a SysML element."""
97
+ return f"sysml-{uuid.uuid4()}"
98
+
99
+
100
+ def _file_hash(file_path: str) -> str:
101
+ """Compute SHA-256 hex digest of a file."""
102
+ h = hashlib.sha256()
103
+ with open(file_path, "rb") as fh:
104
+ for chunk in iter(lambda: fh.read(65536), b""):
105
+ h.update(chunk)
106
+ return h.hexdigest()
107
+
108
+
109
+ def _ts() -> str:
110
+ """Current ISO-8601 timestamp."""
111
+ return datetime.now().isoformat()
112
+
113
+
114
+ def _attr(element: ET.Element, local_name: str, ns: Dict[str, str]) -> Optional[str]:
115
+ """Retrieve an attribute by namespace-qualified or plain local name.
116
+
117
+ Tries ``{xmi_ns}local_name``, ``xmi:local_name``, and bare ``local_name``.
118
+ """
119
+ xmi_ns = ns.get("xmi", "")
120
+ # Fully qualified
121
+ val = element.get(f"{{{xmi_ns}}}{local_name}") if xmi_ns else None
122
+ if val is not None:
123
+ return val
124
+ # Prefixed (sometimes kept literally in attribute names)
125
+ val = element.get(f"xmi:{local_name}")
126
+ if val is not None:
127
+ return val
128
+ # Bare
129
+ return element.get(local_name)
130
+
131
+
132
+ def _xmi_id(element: ET.Element, ns: Dict[str, str]) -> Optional[str]:
133
+ """Extract the ``xmi:id`` attribute from *element*."""
134
+ return _attr(element, "id", ns)
135
+
136
+
137
+ def _xmi_type(element: ET.Element, ns: Dict[str, str]) -> Optional[str]:
138
+ """Extract the ``xmi:type`` attribute from *element*."""
139
+ return _attr(element, "type", ns)
140
+
141
+
142
+ def _qualified_name(element: ET.Element, root: ET.Element) -> str:
143
+ """Build a colon-separated qualified name by walking up parent map."""
144
+ # ElementTree doesn't maintain parent references natively, so we build
145
+ # one if not yet cached on the root element.
146
+ parent_map = getattr(root, "_parent_map", None)
147
+ if parent_map is None:
148
+ parent_map = {c: p for p in root.iter() for c in p}
149
+ root._parent_map = parent_map # type: ignore[attr-defined]
150
+ parts: List[str] = []
151
+ cur = element
152
+ while cur is not None:
153
+ name = cur.get("name")
154
+ if name:
155
+ parts.append(name)
156
+ cur = parent_map.get(cur)
157
+ parts.reverse()
158
+ return "::".join(parts) if parts else ""
159
+
160
+
161
+ def _find_all_ns(root: ET.Element, tag_local: str, ns: Dict[str, str],
162
+ ns_key: str = "uml") -> List[ET.Element]:
163
+ """Find all descendant elements matching *tag_local* under any known
164
+ namespace variant for *ns_key*.
165
+ """
166
+ results: List[ET.Element] = []
167
+ uri = ns.get(ns_key, "")
168
+ if uri:
169
+ results.extend(root.iter(f"{{{uri}}}{tag_local}"))
170
+ # Also try without namespace (some exports omit it)
171
+ results.extend(e for e in root.iter(tag_local) if e not in results)
172
+ return results
173
+
174
+
175
+ def _get_description(element: ET.Element, ns: Dict[str, str]) -> str:
176
+ """Extract the description / body / documentation from an element.
177
+
178
+ Cameo stores documentation in ``ownedComment`` children with a ``body``
179
+ sub-element, or as a ``body`` attribute directly.
180
+ """
181
+ # ownedComment → body
182
+ for comment in element.iter("ownedComment"):
183
+ body_el = comment.find("body")
184
+ if body_el is not None and body_el.text:
185
+ return body_el.text.strip()
186
+ body_attr = comment.get("body")
187
+ if body_attr:
188
+ return body_attr.strip()
189
+ # Direct body attribute (rare)
190
+ body = element.get("body")
191
+ if body:
192
+ return body.strip()
193
+ return ""
194
+
195
+
196
+ # ---------------------------------------------------------------------------
197
+ # Namespace detection
198
+ # ---------------------------------------------------------------------------
199
+
200
+ def _detect_namespaces(root: ET.Element) -> Dict[str, str]:
201
+ """Detect XMI/UML/SysML/MagicDraw namespaces from the root element.
202
+
203
+ Inspects the root tag, registered namespace map, and tag prefixes across
204
+ all children. Returns a dict mapping short keys ('xmi', 'uml', 'sysml',
205
+ 'md') to their detected namespace URIs.
206
+ """
207
+ detected: Dict[str, str] = {}
208
+
209
+ # 1. Collect all namespace URIs declared in the document.
210
+ # ElementTree exposes them through iterparse or the tag itself.
211
+ declared_uris: set = set()
212
+
213
+ # Root tag may carry a namespace: {uri}LocalName
214
+ root_tag = root.tag
215
+ if root_tag.startswith("{"):
216
+ uri = root_tag[1:root_tag.index("}")]
217
+ declared_uris.add(uri)
218
+
219
+ # Walk all elements for additional namespace URIs
220
+ for elem in root.iter():
221
+ tag = elem.tag
222
+ if tag.startswith("{"):
223
+ declared_uris.add(tag[1:tag.index("}")])
224
+ # Attributes may also carry namespace URIs
225
+ for attr_name in elem.attrib:
226
+ if attr_name.startswith("{"):
227
+ declared_uris.add(attr_name[1:attr_name.index("}")])
228
+
229
+ # 2. Match declared URIs to known namespace keys
230
+ for key, alternatives in NAMESPACE_ALTERNATIVES.items():
231
+ for alt_uri in alternatives:
232
+ if alt_uri in declared_uris:
233
+ detected[key] = alt_uri
234
+ break
235
+
236
+ # 3. Fallback: use well-known defaults for anything not detected
237
+ for key, default_uri in KNOWN_NAMESPACES.items():
238
+ if key not in detected:
239
+ detected[key] = default_uri
240
+
241
+ return detected
242
+
243
+
244
+ # ---------------------------------------------------------------------------
245
+ # Stereotype resolution
246
+ # ---------------------------------------------------------------------------
247
+
248
+ def _build_stereotype_map(root: ET.Element, ns: Dict[str, str]) -> Dict[str, str]:
249
+ """Build a mapping from xmi:id → stereotype name.
250
+
251
+ Cameo XMI exports stereotype applications as top-level elements whose tag
252
+ contains the stereotype name and whose ``base_Class`` (or similar
253
+ ``base_*``) attribute references the model element xmi:id.
254
+
255
+ Returns mapping ``{element_xmi_id: stereotype_name}``.
256
+ """
257
+ stereo_map: Dict[str, str] = {}
258
+
259
+ ns.get("sysml", "")
260
+ ns.get("md", "")
261
+
262
+ # Iterate top-level children of root looking for stereotype applications
263
+ for child in root:
264
+ tag = child.tag
265
+ # Strip namespace to get local name
266
+ if "}" in tag:
267
+ local = tag.split("}", 1)[1]
268
+ else:
269
+ local = tag
270
+
271
+ # Common SysML stereotypes in Cameo exports
272
+ local.lower()
273
+ target_xmi_id: Optional[str] = None
274
+
275
+ # Look for base_Class, base_NamedElement, base_Abstraction, etc.
276
+ for attr_name, attr_val in child.attrib.items():
277
+ clean_attr = attr_name
278
+ if "}" in clean_attr:
279
+ clean_attr = clean_attr.split("}", 1)[1]
280
+ if clean_attr.startswith("base_"):
281
+ target_xmi_id = attr_val
282
+ break
283
+
284
+ if target_xmi_id:
285
+ stereo_map[target_xmi_id] = local
286
+
287
+ return stereo_map
288
+
289
+
290
+ # ---------------------------------------------------------------------------
291
+ # Element extraction functions
292
+ # ---------------------------------------------------------------------------
293
+
294
+ def _extract_blocks(root: ET.Element, ns: Dict[str, str]) -> List[Dict[str, Any]]:
295
+ """Extract <<Block>> stereotyped classes from XMI.
296
+
297
+ Looks for ``packagedElement`` nodes with ``xmi:type="uml:Class"`` and
298
+ matches them against the stereotype map for 'Block'.
299
+ """
300
+ stereo_map = _build_stereotype_map(root, ns)
301
+ blocks: List[Dict[str, Any]] = []
302
+
303
+ for elem in root.iter("packagedElement"):
304
+ xmi_t = _xmi_type(elem, ns)
305
+ if xmi_t not in ("uml:Class", "Class"):
306
+ continue
307
+ xid = _xmi_id(elem, ns)
308
+ if not xid:
309
+ continue
310
+
311
+ stereo = stereo_map.get(xid, "")
312
+ if stereo.lower() not in ("block", "sysml::block", "sysml::blocks::block"):
313
+ # Also accept if no explicit stereotype but tag hints at block
314
+ if stereo:
315
+ continue # Has a different stereotype
316
+
317
+ name = elem.get("name", "")
318
+ if not name:
319
+ continue
320
+
321
+ # Collect owned attributes (properties / value properties)
322
+ properties: List[Dict[str, str]] = []
323
+ for attr in elem.iter("ownedAttribute"):
324
+ prop_name = attr.get("name", "")
325
+ prop_type = _xmi_type(attr, ns) or ""
326
+ prop_id = _xmi_id(attr, ns) or ""
327
+ if prop_name:
328
+ properties.append({
329
+ "name": prop_name,
330
+ "type": prop_type,
331
+ "xmi_id": prop_id,
332
+ "visibility": attr.get("visibility", "public"),
333
+ })
334
+
335
+ # Collect ports
336
+ ports: List[Dict[str, str]] = []
337
+ for port in elem.iter("ownedPort"):
338
+ port_name = port.get("name", "")
339
+ port_id = _xmi_id(port, ns) or ""
340
+ if port_name or port_id:
341
+ ports.append({
342
+ "name": port_name,
343
+ "xmi_id": port_id,
344
+ "type": _xmi_type(port, ns) or "port",
345
+ })
346
+
347
+ blocks.append({
348
+ "id": _new_id(),
349
+ "xmi_id": xid,
350
+ "element_type": "block",
351
+ "name": name,
352
+ "qualified_name": _qualified_name(elem, root),
353
+ "stereotype": stereo or "Block",
354
+ "description": _get_description(elem, ns),
355
+ "properties": json.dumps({
356
+ "attributes": properties,
357
+ "ports": ports,
358
+ }),
359
+ "diagram_type": "bdd",
360
+ })
361
+
362
+ return blocks
363
+
364
+
365
+ def _extract_interface_blocks(root: ET.Element, ns: Dict[str, str]) -> List[Dict[str, Any]]:
366
+ """Extract <<InterfaceBlock>> stereotyped classes from XMI."""
367
+ stereo_map = _build_stereotype_map(root, ns)
368
+ iblocks: List[Dict[str, Any]] = []
369
+
370
+ for elem in root.iter("packagedElement"):
371
+ xmi_t = _xmi_type(elem, ns)
372
+ if xmi_t not in ("uml:Class", "Class", "uml:Interface", "Interface"):
373
+ continue
374
+ xid = _xmi_id(elem, ns)
375
+ if not xid:
376
+ continue
377
+
378
+ stereo = stereo_map.get(xid, "")
379
+ if "interfaceblock" not in stereo.lower() and "interface_block" not in stereo.lower():
380
+ continue
381
+
382
+ name = elem.get("name", "")
383
+ if not name:
384
+ continue
385
+
386
+ # Collect flow properties
387
+ flow_props: List[Dict[str, str]] = []
388
+ for attr in elem.iter("ownedAttribute"):
389
+ prop_name = attr.get("name", "")
390
+ if prop_name:
391
+ flow_props.append({
392
+ "name": prop_name,
393
+ "type": _xmi_type(attr, ns) or "",
394
+ "xmi_id": _xmi_id(attr, ns) or "",
395
+ "direction": attr.get("direction", "inout"),
396
+ })
397
+
398
+ iblocks.append({
399
+ "id": _new_id(),
400
+ "xmi_id": xid,
401
+ "element_type": "interface_block",
402
+ "name": name,
403
+ "qualified_name": _qualified_name(elem, root),
404
+ "stereotype": stereo or "InterfaceBlock",
405
+ "description": _get_description(elem, ns),
406
+ "properties": json.dumps({"flow_properties": flow_props}),
407
+ "diagram_type": "bdd",
408
+ })
409
+
410
+ return iblocks
411
+
412
+
413
+ def _extract_activities(root: ET.Element, ns: Dict[str, str]) -> List[Dict[str, Any]]:
414
+ """Extract Activity elements with actions, control flows, and object flows."""
415
+ activities: List[Dict[str, Any]] = []
416
+
417
+ for elem in root.iter("packagedElement"):
418
+ xmi_t = _xmi_type(elem, ns)
419
+ if xmi_t not in ("uml:Activity", "Activity"):
420
+ continue
421
+ xid = _xmi_id(elem, ns)
422
+ if not xid:
423
+ continue
424
+
425
+ name = elem.get("name", "")
426
+ if not name:
427
+ name = f"Activity_{xid[:8]}"
428
+
429
+ # Collect actions
430
+ actions: List[Dict[str, str]] = []
431
+ for node_tag in ("node", "ownedNode", "group"):
432
+ for node in elem.iter(node_tag):
433
+ node_type = _xmi_type(node, ns) or ""
434
+ node_name = node.get("name", "")
435
+ node_id = _xmi_id(node, ns) or ""
436
+ if node_name or node_id:
437
+ actions.append({
438
+ "name": node_name,
439
+ "type": node_type,
440
+ "xmi_id": node_id,
441
+ })
442
+
443
+ # Also look for OpaqueAction, CallBehaviorAction, etc.
444
+ for action_tag in ("ownedAction",):
445
+ for act in elem.iter(action_tag):
446
+ actions.append({
447
+ "name": act.get("name", ""),
448
+ "type": _xmi_type(act, ns) or "action",
449
+ "xmi_id": _xmi_id(act, ns) or "",
450
+ })
451
+
452
+ # Collect edges (control flow / object flow)
453
+ control_flows: List[Dict[str, str]] = []
454
+ object_flows: List[Dict[str, str]] = []
455
+ for edge_tag in ("edge", "ownedEdge"):
456
+ for edge in elem.iter(edge_tag):
457
+ edge_type = _xmi_type(edge, ns) or ""
458
+ edge_data = {
459
+ "name": edge.get("name", ""),
460
+ "xmi_id": _xmi_id(edge, ns) or "",
461
+ "source": edge.get("source", ""),
462
+ "target": edge.get("target", ""),
463
+ }
464
+ if "ObjectFlow" in edge_type:
465
+ object_flows.append(edge_data)
466
+ else:
467
+ control_flows.append(edge_data)
468
+
469
+ activities.append({
470
+ "id": _new_id(),
471
+ "xmi_id": xid,
472
+ "element_type": "activity",
473
+ "name": name,
474
+ "qualified_name": _qualified_name(elem, root),
475
+ "stereotype": "",
476
+ "description": _get_description(elem, ns),
477
+ "properties": json.dumps({
478
+ "actions": actions,
479
+ "control_flows": control_flows,
480
+ "object_flows": object_flows,
481
+ }),
482
+ "diagram_type": "act",
483
+ })
484
+
485
+ return activities
486
+
487
+
488
+ def _extract_requirements(root: ET.Element, ns: Dict[str, str]) -> List[Dict[str, Any]]:
489
+ """Extract <<Requirement>> stereotyped elements with text and ID.
490
+
491
+ SysML requirements may appear as stereotyped uml:Class elements or as
492
+ dedicated ``Requirement`` elements under the SysML namespace.
493
+ """
494
+ stereo_map = _build_stereotype_map(root, ns)
495
+ requirements: List[Dict[str, Any]] = []
496
+
497
+ # Strategy 1: stereotyped classes
498
+ for elem in root.iter("packagedElement"):
499
+ xmi_t = _xmi_type(elem, ns)
500
+ if xmi_t not in ("uml:Class", "Class"):
501
+ continue
502
+ xid = _xmi_id(elem, ns)
503
+ if not xid:
504
+ continue
505
+
506
+ stereo = stereo_map.get(xid, "")
507
+ if "requirement" not in stereo.lower():
508
+ continue
509
+
510
+ name = elem.get("name", "")
511
+ req_id = ""
512
+ req_text = ""
513
+
514
+ # Requirement ID and text may be in the stereotype application
515
+ for child in root:
516
+ tag_local = child.tag.split("}", 1)[-1] if "}" in child.tag else child.tag
517
+ if "requirement" not in tag_local.lower():
518
+ continue
519
+ for attr_name, attr_val in child.attrib.items():
520
+ clean = attr_name.split("}", 1)[-1] if "}" in attr_name else attr_name
521
+ if clean.startswith("base_") and attr_val == xid:
522
+ req_id = child.get("id", child.get("Id", ""))
523
+ req_text = child.get("text", child.get("Text", ""))
524
+ break
525
+
526
+ if not req_text:
527
+ req_text = _get_description(elem, ns)
528
+
529
+ requirements.append({
530
+ "id": _new_id(),
531
+ "xmi_id": xid,
532
+ "element_type": "requirement",
533
+ "name": name or f"REQ-{xid[:8]}",
534
+ "qualified_name": _qualified_name(elem, root),
535
+ "stereotype": stereo or "Requirement",
536
+ "description": req_text,
537
+ "properties": json.dumps({
538
+ "requirement_id": req_id,
539
+ "text": req_text,
540
+ }),
541
+ "diagram_type": "req",
542
+ })
543
+
544
+ # Strategy 2: SysML namespace Requirement elements
545
+ sysml_uri = ns.get("sysml", "")
546
+ if sysml_uri:
547
+ for elem in root.iter(f"{{{sysml_uri}}}Requirement"):
548
+ xid = _xmi_id(elem, ns) or elem.get("base_Class", "")
549
+ if not xid:
550
+ continue
551
+ # Avoid duplicates
552
+ if any(r["xmi_id"] == xid for r in requirements):
553
+ continue
554
+ name = elem.get("name", "")
555
+ req_id = elem.get("id", elem.get("Id", ""))
556
+ req_text = elem.get("text", elem.get("Text", ""))
557
+ requirements.append({
558
+ "id": _new_id(),
559
+ "xmi_id": xid,
560
+ "element_type": "requirement",
561
+ "name": name or f"REQ-{xid[:8]}",
562
+ "qualified_name": "",
563
+ "stereotype": "Requirement",
564
+ "description": req_text or "",
565
+ "properties": json.dumps({
566
+ "requirement_id": req_id,
567
+ "text": req_text or "",
568
+ }),
569
+ "diagram_type": "req",
570
+ })
571
+
572
+ return requirements
573
+
574
+
575
+ def _extract_state_machines(root: ET.Element, ns: Dict[str, str]) -> List[Dict[str, Any]]:
576
+ """Extract StateMachine elements with states and transitions."""
577
+ machines: List[Dict[str, Any]] = []
578
+
579
+ for elem in root.iter("packagedElement"):
580
+ xmi_t = _xmi_type(elem, ns)
581
+ if xmi_t not in ("uml:StateMachine", "StateMachine"):
582
+ continue
583
+ xid = _xmi_id(elem, ns)
584
+ if not xid:
585
+ continue
586
+
587
+ name = elem.get("name", "")
588
+ if not name:
589
+ name = f"StateMachine_{xid[:8]}"
590
+
591
+ # Collect states
592
+ states: List[Dict[str, str]] = []
593
+ for region in elem.iter("region"):
594
+ for subvertex_tag in ("subvertex", "ownedState"):
595
+ for state in region.iter(subvertex_tag):
596
+ state_type = _xmi_type(state, ns) or ""
597
+ state_name = state.get("name", "")
598
+ state_id = _xmi_id(state, ns) or ""
599
+ kind = state.get("kind", "")
600
+ if state_name or state_id:
601
+ states.append({
602
+ "name": state_name,
603
+ "type": state_type,
604
+ "xmi_id": state_id,
605
+ "kind": kind,
606
+ })
607
+ # Fallback: look for State elements directly under StateMachine
608
+ if not states:
609
+ for state in elem.iter("subvertex"):
610
+ states.append({
611
+ "name": state.get("name", ""),
612
+ "type": _xmi_type(state, ns) or "",
613
+ "xmi_id": _xmi_id(state, ns) or "",
614
+ "kind": state.get("kind", ""),
615
+ })
616
+
617
+ # Collect transitions
618
+ transitions: List[Dict[str, str]] = []
619
+ for region in elem.iter("region"):
620
+ for trans in region.iter("transition"):
621
+ transitions.append({
622
+ "name": trans.get("name", ""),
623
+ "xmi_id": _xmi_id(trans, ns) or "",
624
+ "source": trans.get("source", ""),
625
+ "target": trans.get("target", ""),
626
+ "guard": _get_guard_text(trans),
627
+ "trigger": _get_trigger_name(trans),
628
+ })
629
+ # Fallback
630
+ if not transitions:
631
+ for trans in elem.iter("transition"):
632
+ transitions.append({
633
+ "name": trans.get("name", ""),
634
+ "xmi_id": _xmi_id(trans, ns) or "",
635
+ "source": trans.get("source", ""),
636
+ "target": trans.get("target", ""),
637
+ "guard": _get_guard_text(trans),
638
+ "trigger": _get_trigger_name(trans),
639
+ })
640
+
641
+ machines.append({
642
+ "id": _new_id(),
643
+ "xmi_id": xid,
644
+ "element_type": "state_machine",
645
+ "name": name,
646
+ "qualified_name": _qualified_name(elem, root),
647
+ "stereotype": "",
648
+ "description": _get_description(elem, ns),
649
+ "properties": json.dumps({
650
+ "states": states,
651
+ "transitions": transitions,
652
+ }),
653
+ "diagram_type": "stm",
654
+ })
655
+
656
+ return machines
657
+
658
+
659
+ def _get_guard_text(transition: ET.Element) -> str:
660
+ """Extract guard condition text from a transition element."""
661
+ guard = transition.find("guard")
662
+ if guard is not None:
663
+ spec = guard.find("specification")
664
+ if spec is not None:
665
+ body = spec.get("body") or spec.get("value") or ""
666
+ if body:
667
+ return body
668
+ if spec.text:
669
+ return spec.text.strip()
670
+ body_attr = guard.get("body")
671
+ if body_attr:
672
+ return body_attr
673
+ return ""
674
+
675
+
676
+ def _get_trigger_name(transition: ET.Element) -> str:
677
+ """Extract trigger name from a transition element."""
678
+ for trigger in transition.iter("trigger"):
679
+ name = trigger.get("name", "")
680
+ if name:
681
+ return name
682
+ event = trigger.get("event", "")
683
+ if event:
684
+ return event
685
+ return ""
686
+
687
+
688
+ def _extract_use_cases(root: ET.Element, ns: Dict[str, str]) -> List[Dict[str, Any]]:
689
+ """Extract UseCase and Actor elements from XMI."""
690
+ use_cases: List[Dict[str, Any]] = []
691
+
692
+ for elem in root.iter("packagedElement"):
693
+ xmi_t = _xmi_type(elem, ns)
694
+ if xmi_t not in ("uml:UseCase", "UseCase", "uml:Actor", "Actor"):
695
+ continue
696
+ xid = _xmi_id(elem, ns)
697
+ if not xid:
698
+ continue
699
+
700
+ name = elem.get("name", "")
701
+ if not name:
702
+ continue
703
+
704
+ is_actor = "Actor" in (xmi_t or "")
705
+ element_type = "actor" if is_actor else "use_case"
706
+
707
+ # Collect extension points for use cases
708
+ ext_points: List[Dict[str, str]] = []
709
+ if not is_actor:
710
+ for ep in elem.iter("extensionPoint"):
711
+ ext_points.append({
712
+ "name": ep.get("name", ""),
713
+ "xmi_id": _xmi_id(ep, ns) or "",
714
+ })
715
+
716
+ # Collect included use cases
717
+ includes: List[str] = []
718
+ for inc in elem.iter("include"):
719
+ addition = inc.get("addition", "")
720
+ if addition:
721
+ includes.append(addition)
722
+
723
+ use_cases.append({
724
+ "id": _new_id(),
725
+ "xmi_id": xid,
726
+ "element_type": element_type,
727
+ "name": name,
728
+ "qualified_name": _qualified_name(elem, root),
729
+ "stereotype": "Actor" if is_actor else "",
730
+ "description": _get_description(elem, ns),
731
+ "properties": json.dumps({
732
+ "extension_points": ext_points,
733
+ "includes": includes,
734
+ }) if not is_actor else json.dumps({}),
735
+ "diagram_type": "uc",
736
+ })
737
+
738
+ return use_cases
739
+
740
+
741
+ # ---------------------------------------------------------------------------
742
+ # Relationship extraction
743
+ # ---------------------------------------------------------------------------
744
+
745
+ def _extract_relationships(root: ET.Element, ns: Dict[str, str]) -> List[Dict[str, Any]]:
746
+ """Extract all relationships from XMI.
747
+
748
+ Covers:
749
+ - Associations (including aggregation/composition)
750
+ - Generalizations
751
+ - Dependencies
752
+ - Realizations
753
+ - Usages
754
+ - SysML stereotype links: satisfy, derive, verify, refine, trace, allocate
755
+ """
756
+ relationships: List[Dict[str, Any]] = []
757
+
758
+ # --- Structural relationships inside packagedElements ---
759
+ for elem in root.iter("packagedElement"):
760
+ xmi_t = _xmi_type(elem, ns)
761
+
762
+ # Associations
763
+ if xmi_t in ("uml:Association", "Association"):
764
+ _parse_association(elem, ns, relationships)
765
+
766
+ # Dependencies
767
+ elif xmi_t in ("uml:Dependency", "Dependency"):
768
+ _parse_simple_rel(elem, ns, "dependency", relationships)
769
+
770
+ # Realizations
771
+ elif xmi_t in ("uml:Realization", "Realization",
772
+ "uml:InterfaceRealization", "InterfaceRealization"):
773
+ _parse_simple_rel(elem, ns, "realization", relationships)
774
+
775
+ # Usages
776
+ elif xmi_t in ("uml:Usage", "Usage"):
777
+ _parse_simple_rel(elem, ns, "usage", relationships)
778
+
779
+ # Abstractions (may carry SysML stereotypes like «satisfy»)
780
+ elif xmi_t in ("uml:Abstraction", "Abstraction"):
781
+ _parse_abstraction(elem, ns, root, relationships)
782
+
783
+ # --- Generalizations (nested inside classes) ---
784
+ for gen in root.iter("generalization"):
785
+ general = gen.get("general", "")
786
+ if not general:
787
+ # May be a child element
788
+ gen_ref = gen.find("general")
789
+ if gen_ref is not None:
790
+ general = gen_ref.get("href", "") or _xmi_id(gen_ref, ns) or ""
791
+ # Parent class xmi:id
792
+ parent = gen.getparent() if hasattr(gen, "getparent") else None
793
+ source_id = ""
794
+ if parent is not None:
795
+ source_id = _xmi_id(parent, ns) or ""
796
+ if not source_id:
797
+ # Walk up via parent map
798
+ parent_map = getattr(root, "_parent_map", None)
799
+ if parent_map is None:
800
+ parent_map = {c: p for p in root.iter() for c in p}
801
+ root._parent_map = parent_map # type: ignore[attr-defined]
802
+ p = parent_map.get(gen)
803
+ if p is not None:
804
+ source_id = _xmi_id(p, ns) or ""
805
+
806
+ if source_id and general:
807
+ relationships.append({
808
+ "source_xmi_id": source_id,
809
+ "target_xmi_id": general,
810
+ "relationship_type": "generalization",
811
+ "name": gen.get("name", ""),
812
+ "properties": json.dumps({}),
813
+ })
814
+
815
+ # --- SysML stereotype relationships (top-level in profile application) ---
816
+ _parse_sysml_stereo_rels(root, ns, relationships)
817
+
818
+ return relationships
819
+
820
+
821
+ def _parse_association(elem: ET.Element, ns: Dict[str, str],
822
+ rels: List[Dict[str, Any]]) -> None:
823
+ """Parse a UML Association into one or more relationship records."""
824
+ name = elem.get("name", "")
825
+ member_ends: List[str] = []
826
+ aggregation = ""
827
+
828
+ # memberEnd attribute (space-separated xmi:idrefs)
829
+ member_end_attr = elem.get("memberEnd", "")
830
+ if member_end_attr:
831
+ member_ends = member_end_attr.split()
832
+
833
+ # ownedEnd elements
834
+ owned_ends: List[ET.Element] = list(elem.iter("ownedEnd"))
835
+ for oe in owned_ends:
836
+ agg = oe.get("aggregation", "none")
837
+ if agg in ("composite", "shared"):
838
+ aggregation = agg
839
+
840
+ # Determine source and target from memberEnd / ownedEnd
841
+ source_id = ""
842
+ target_id = ""
843
+
844
+ if len(owned_ends) >= 2:
845
+ source_id = owned_ends[0].get("type", "") or _xmi_id(owned_ends[0], ns) or ""
846
+ target_id = owned_ends[1].get("type", "") or _xmi_id(owned_ends[1], ns) or ""
847
+ elif len(member_ends) >= 2:
848
+ source_id = member_ends[0]
849
+ target_id = member_ends[1]
850
+ elif len(owned_ends) == 1:
851
+ target_id = owned_ends[0].get("type", "") or _xmi_id(owned_ends[0], ns) or ""
852
+ if member_ends:
853
+ source_id = member_ends[0] if member_ends[0] != target_id else (
854
+ member_ends[1] if len(member_ends) > 1 else ""
855
+ )
856
+
857
+ if not source_id or not target_id:
858
+ return
859
+
860
+ if aggregation == "composite":
861
+ rel_type = "composition"
862
+ elif aggregation == "shared":
863
+ rel_type = "aggregation"
864
+ else:
865
+ rel_type = "association"
866
+
867
+ rels.append({
868
+ "source_xmi_id": source_id,
869
+ "target_xmi_id": target_id,
870
+ "relationship_type": rel_type,
871
+ "name": name,
872
+ "properties": json.dumps({"aggregation": aggregation}),
873
+ })
874
+
875
+
876
+ def _parse_simple_rel(elem: ET.Element, ns: Dict[str, str],
877
+ rel_type: str, rels: List[Dict[str, Any]]) -> None:
878
+ """Parse a simple directed relationship (Dependency, Realization, Usage)."""
879
+ name = elem.get("name", "")
880
+
881
+ # client → source, supplier → target
882
+ client = elem.get("client", "")
883
+ supplier = elem.get("supplier", "")
884
+
885
+ # May also be nested elements
886
+ if not client:
887
+ client_el = elem.find("client")
888
+ if client_el is not None:
889
+ client = client_el.get("href", "") or _xmi_id(client_el, ns) or ""
890
+ if not supplier:
891
+ supplier_el = elem.find("supplier")
892
+ if supplier_el is not None:
893
+ supplier = supplier_el.get("href", "") or _xmi_id(supplier_el, ns) or ""
894
+
895
+ if client and supplier:
896
+ rels.append({
897
+ "source_xmi_id": client,
898
+ "target_xmi_id": supplier,
899
+ "relationship_type": rel_type,
900
+ "name": name,
901
+ "properties": json.dumps({}),
902
+ })
903
+
904
+
905
+ def _parse_abstraction(elem: ET.Element, ns: Dict[str, str],
906
+ root: ET.Element, rels: List[Dict[str, Any]]) -> None:
907
+ """Parse a UML Abstraction, checking for SysML stereotype overlay."""
908
+ name = elem.get("name", "")
909
+ xid = _xmi_id(elem, ns)
910
+
911
+ client = elem.get("client", "")
912
+ supplier = elem.get("supplier", "")
913
+ if not client:
914
+ c = elem.find("client")
915
+ if c is not None:
916
+ client = c.get("href", "") or _xmi_id(c, ns) or ""
917
+ if not supplier:
918
+ s = elem.find("supplier")
919
+ if s is not None:
920
+ supplier = s.get("href", "") or _xmi_id(s, ns) or ""
921
+
922
+ if not client or not supplier:
923
+ return
924
+
925
+ # Check if a SysML stereotype (satisfy, derive, etc.) applies to this Abstraction
926
+ rel_type = "dependency"
927
+ if xid:
928
+ stereo_map = _build_stereotype_map(root, ns)
929
+ stereo = stereo_map.get(xid, "").lower()
930
+ for kw in SYSML_REL_STEREOTYPES:
931
+ if kw in stereo:
932
+ rel_type = kw
933
+ break
934
+
935
+ rels.append({
936
+ "source_xmi_id": client,
937
+ "target_xmi_id": supplier,
938
+ "relationship_type": rel_type,
939
+ "name": name,
940
+ "properties": json.dumps({}),
941
+ })
942
+
943
+
944
+ def _parse_sysml_stereo_rels(root: ET.Element, ns: Dict[str, str],
945
+ rels: List[Dict[str, Any]]) -> None:
946
+ """Parse SysML stereotype relationship applications at the top level.
947
+
948
+ Cameo exports «satisfy», «derive», «verify», «refine», «trace», «allocate»
949
+ as top-level elements under the SysML profile namespace. Each carries
950
+ ``base_Abstraction`` (or ``base_Dependency``) plus ``client``/``supplier``
951
+ attributes or nested sub-elements referencing the related model elements.
952
+ """
953
+ ns.get("sysml", "")
954
+
955
+ for child in root:
956
+ tag = child.tag
957
+ if "}" in tag:
958
+ local = tag.split("}", 1)[1]
959
+ else:
960
+ local = tag
961
+
962
+ local_lower = local.lower()
963
+ matched_type: Optional[str] = None
964
+ for kw in SYSML_REL_STEREOTYPES:
965
+ if kw == local_lower or local_lower.endswith(kw):
966
+ matched_type = kw
967
+ break
968
+
969
+ if not matched_type:
970
+ continue
971
+
972
+ # Resolve the Abstraction/Dependency this stereotype applies to
973
+ base_ref = ""
974
+ for attr_name, attr_val in child.attrib.items():
975
+ clean = attr_name.split("}", 1)[-1] if "}" in attr_name else attr_name
976
+ if clean.startswith("base_"):
977
+ base_ref = attr_val
978
+ break
979
+
980
+ # The actual source/target must come from the referenced Abstraction
981
+ # element, which we've already parsed. Mark this relationship type
982
+ # override so we can merge later.
983
+ if base_ref:
984
+ # Try to find matching dependency/abstraction already in rels
985
+ found = False
986
+ for r in rels:
987
+ if r.get("_base_xmi_id") == base_ref or r.get("source_xmi_id") == base_ref:
988
+ r["relationship_type"] = matched_type
989
+ found = True
990
+ break
991
+ if not found:
992
+ # Store as unresolved — will attempt resolution in _resolve step
993
+ rels.append({
994
+ "source_xmi_id": base_ref,
995
+ "target_xmi_id": "",
996
+ "relationship_type": matched_type,
997
+ "name": child.get("name", ""),
998
+ "properties": json.dumps({"base_ref": base_ref}),
999
+ "_unresolved": True,
1000
+ })
1001
+
1002
+
1003
+ # ---------------------------------------------------------------------------
1004
+ # Cross-reference resolution
1005
+ # ---------------------------------------------------------------------------
1006
+
1007
+ def _resolve_xmi_refs(elements: List[Dict[str, Any]],
1008
+ relationships: List[Dict[str, Any]]) -> Tuple[
1009
+ List[Dict[str, Any]], List[Dict[str, Any]]]:
1010
+ """Resolve xmi:idref cross-references between elements.
1011
+
1012
+ Builds a lookup from xmi_id → generated id so that relationship
1013
+ source_element_id / target_element_id can be set correctly for DB
1014
+ insertion. Also resolves parent_id for nested elements.
1015
+
1016
+ Drops relationships whose source or target could not be resolved.
1017
+ """
1018
+ # Build xmi_id → element dict
1019
+ xmi_lookup: Dict[str, Dict[str, Any]] = {}
1020
+ for el in elements:
1021
+ xmi_lookup[el["xmi_id"]] = el
1022
+
1023
+ # Resolve parent_id (based on qualified_name nesting if present)
1024
+ for el in elements:
1025
+ qn = el.get("qualified_name", "")
1026
+ if "::" in qn:
1027
+ parent_qn = "::".join(qn.split("::")[:-1])
1028
+ for candidate in elements:
1029
+ if candidate.get("qualified_name", "") == parent_qn and candidate["id"] != el["id"]:
1030
+ el["parent_id"] = candidate["id"]
1031
+ break
1032
+
1033
+ # Resolve relationships
1034
+ resolved_rels: List[Dict[str, Any]] = []
1035
+ for rel in relationships:
1036
+ # Skip unresolved SysML stereo links with empty targets
1037
+ if rel.get("_unresolved") and not rel.get("target_xmi_id"):
1038
+ continue
1039
+
1040
+ src_xmi = rel.get("source_xmi_id", "")
1041
+ tgt_xmi = rel.get("target_xmi_id", "")
1042
+
1043
+ src_el = xmi_lookup.get(src_xmi)
1044
+ tgt_el = xmi_lookup.get(tgt_xmi)
1045
+
1046
+ if src_el and tgt_el:
1047
+ resolved_rels.append({
1048
+ "source_element_id": src_el["id"],
1049
+ "target_element_id": tgt_el["id"],
1050
+ "relationship_type": rel["relationship_type"],
1051
+ "name": rel.get("name", ""),
1052
+ "properties": rel.get("properties", "{}"),
1053
+ })
1054
+ # If only one side resolved, still keep with xmi_id as fallback
1055
+ elif src_el or tgt_el:
1056
+ resolved_rels.append({
1057
+ "source_element_id": src_el["id"] if src_el else src_xmi,
1058
+ "target_element_id": tgt_el["id"] if tgt_el else tgt_xmi,
1059
+ "relationship_type": rel["relationship_type"],
1060
+ "name": rel.get("name", ""),
1061
+ "properties": rel.get("properties", "{}"),
1062
+ })
1063
+
1064
+ # Clean internal keys from relationships
1065
+ for rel in resolved_rels:
1066
+ rel.pop("_unresolved", None)
1067
+ rel.pop("_base_xmi_id", None)
1068
+
1069
+ return elements, resolved_rels
1070
+
1071
+
1072
+ # ---------------------------------------------------------------------------
1073
+ # Validation
1074
+ # ---------------------------------------------------------------------------
1075
+
1076
+ def validate_xmi(file_path: str) -> Dict[str, Any]:
1077
+ """Validate XMI structure before import.
1078
+
1079
+ Returns::
1080
+
1081
+ {
1082
+ "valid": bool,
1083
+ "errors": [...],
1084
+ "namespaces": {...},
1085
+ "element_count": int,
1086
+ }
1087
+ """
1088
+ errors: List[str] = []
1089
+ namespaces: Dict[str, str] = {}
1090
+ element_count = 0
1091
+
1092
+ fpath = Path(file_path)
1093
+ if not fpath.exists():
1094
+ return {
1095
+ "valid": False,
1096
+ "errors": [f"File not found: {file_path}"],
1097
+ "namespaces": {},
1098
+ "element_count": 0,
1099
+ }
1100
+
1101
+ if fpath.suffix.lower() not in (".xmi", ".xml", ".uml"):
1102
+ errors.append(f"Unexpected file extension: {fpath.suffix} (expected .xmi, .xml, or .uml)")
1103
+
1104
+ # Attempt parse
1105
+ try:
1106
+ tree = ET.parse(str(fpath))
1107
+ root = tree.getroot()
1108
+ except ET.ParseError as exc:
1109
+ return {
1110
+ "valid": False,
1111
+ "errors": [f"XML parse error: {exc}"],
1112
+ "namespaces": {},
1113
+ "element_count": 0,
1114
+ }
1115
+
1116
+ # Detect namespaces
1117
+ namespaces = _detect_namespaces(root)
1118
+
1119
+ # Verify root element is XMI
1120
+ root_local = root.tag.split("}", 1)[-1] if "}" in root.tag else root.tag
1121
+ if root_local.upper() != "XMI" and root_local != "Model":
1122
+ errors.append(
1123
+ f"Root element is <{root_local}>, expected <xmi:XMI> or <XMI>. "
1124
+ "File may not be a valid XMI export."
1125
+ )
1126
+
1127
+ # Check for XMI version attribute
1128
+ xmi_version = None
1129
+ xmi_ns = namespaces.get("xmi", "")
1130
+ for attr_name in (f"{{{xmi_ns}}}version", "xmi:version", "version"):
1131
+ val = root.get(attr_name)
1132
+ if val:
1133
+ xmi_version = val
1134
+ break
1135
+ if not xmi_version:
1136
+ errors.append("Missing xmi:version attribute on root element.")
1137
+
1138
+ # Count packagedElements
1139
+ element_count = sum(1 for _ in root.iter("packagedElement"))
1140
+ if element_count == 0:
1141
+ errors.append("No <packagedElement> nodes found. File may be empty or use non-standard structure.")
1142
+
1143
+ # Check for at least one recognized UML type
1144
+ found_uml = False
1145
+ for pe in root.iter("packagedElement"):
1146
+ xmi_t = _xmi_type(pe, namespaces)
1147
+ if xmi_t and ("uml:" in str(xmi_t) or xmi_t in (
1148
+ "Class", "Activity", "StateMachine", "UseCase", "Actor",
1149
+ "Association", "Package", "Interface"
1150
+ )):
1151
+ found_uml = True
1152
+ break
1153
+ if not found_uml and element_count > 0:
1154
+ errors.append("No recognized UML-typed packagedElements found.")
1155
+
1156
+ return {
1157
+ "valid": len(errors) == 0,
1158
+ "errors": errors,
1159
+ "namespaces": namespaces,
1160
+ "element_count": element_count,
1161
+ }
1162
+
1163
+
1164
+ # ---------------------------------------------------------------------------
1165
+ # Full parse
1166
+ # ---------------------------------------------------------------------------
1167
+
1168
+ def parse_xmi(file_path: str) -> Dict[str, Any]:
1169
+ """Parse an XMI file and return structured data.
1170
+
1171
+ Returns::
1172
+
1173
+ {
1174
+ "elements": [...],
1175
+ "relationships": [...],
1176
+ "metadata": {
1177
+ "file": str,
1178
+ "file_hash": str,
1179
+ "namespaces": {...},
1180
+ "element_count": int,
1181
+ "relationship_count": int,
1182
+ "parsed_at": str,
1183
+ },
1184
+ }
1185
+ """
1186
+ fpath = Path(file_path)
1187
+ if not fpath.exists():
1188
+ raise FileNotFoundError(f"XMI file not found: {file_path}")
1189
+
1190
+ tree = ET.parse(str(fpath))
1191
+ root = tree.getroot()
1192
+ ns = _detect_namespaces(root)
1193
+ source_hash = _file_hash(file_path)
1194
+
1195
+ # Extract all element types
1196
+ elements: List[Dict[str, Any]] = []
1197
+ elements.extend(_extract_blocks(root, ns))
1198
+ elements.extend(_extract_interface_blocks(root, ns))
1199
+ elements.extend(_extract_activities(root, ns))
1200
+ elements.extend(_extract_requirements(root, ns))
1201
+ elements.extend(_extract_state_machines(root, ns))
1202
+ elements.extend(_extract_use_cases(root, ns))
1203
+
1204
+ # Tag every element with source info
1205
+ for el in elements:
1206
+ el["source_file"] = str(fpath.name)
1207
+ el["source_hash"] = source_hash
1208
+ el.setdefault("parent_id", None)
1209
+
1210
+ # Extract relationships
1211
+ relationships = _extract_relationships(root, ns)
1212
+
1213
+ # Tag every relationship with source info
1214
+ for rel in relationships:
1215
+ rel["source_file"] = str(fpath.name)
1216
+
1217
+ # Resolve cross-references
1218
+ elements, relationships = _resolve_xmi_refs(elements, relationships)
1219
+
1220
+ return {
1221
+ "elements": elements,
1222
+ "relationships": relationships,
1223
+ "metadata": {
1224
+ "file": str(fpath),
1225
+ "file_hash": source_hash,
1226
+ "namespaces": ns,
1227
+ "element_count": len(elements),
1228
+ "relationship_count": len(relationships),
1229
+ "parsed_at": _ts(),
1230
+ },
1231
+ }
1232
+
1233
+
1234
+ # ---------------------------------------------------------------------------
1235
+ # Database import
1236
+ # ---------------------------------------------------------------------------
1237
+
1238
+ def _get_connection(db_path: Optional[str] = None) -> sqlite3.Connection:
1239
+ """Open a connection to the ICDEV database."""
1240
+ path = Path(db_path) if db_path else DB_PATH
1241
+ if not path.exists():
1242
+ raise FileNotFoundError(
1243
+ f"Database not found: {path}\n"
1244
+ "Run: python tools/db/init_icdev_db.py"
1245
+ )
1246
+ conn = sqlite3.connect(str(path))
1247
+ conn.row_factory = sqlite3.Row
1248
+ conn.execute("PRAGMA journal_mode=WAL")
1249
+ conn.execute("PRAGMA foreign_keys=ON")
1250
+ return conn
1251
+
1252
+
1253
+ def import_xmi(project_id: str, file_path: str,
1254
+ db_path: str = None) -> Dict[str, Any]:
1255
+ """Full import pipeline: validate -> parse -> store in DB -> audit trail.
1256
+
1257
+ Steps:
1258
+ 1. Validate XMI structure
1259
+ 2. Compute file hash (SHA-256)
1260
+ 3. Parse all elements and relationships
1261
+ 4. Insert into sysml_elements and sysml_relationships tables
1262
+ 5. Record in model_imports table
1263
+ 6. Log audit trail event (xmi_imported)
1264
+ 7. Return summary
1265
+
1266
+ Returns::
1267
+
1268
+ {
1269
+ "import_id": int,
1270
+ "elements_imported": int,
1271
+ "relationships_imported": int,
1272
+ "errors": int,
1273
+ "status": str,
1274
+ }
1275
+ """
1276
+ timestamp = _ts()
1277
+ error_details: List[str] = []
1278
+
1279
+ # Step 1 — Validate
1280
+ validation = validate_xmi(file_path)
1281
+ if not validation["valid"]:
1282
+ # Record failed import
1283
+ try:
1284
+ conn = _get_connection(db_path)
1285
+ c = conn.cursor()
1286
+ c.execute(
1287
+ """INSERT INTO model_imports
1288
+ (project_id, import_type, source_file, source_hash,
1289
+ elements_imported, relationships_imported, errors,
1290
+ error_details, status, imported_by, imported_at)
1291
+ VALUES (?, ?, ?, ?, 0, 0, ?, ?, 'failed', 'icdev-mbse-engine', ?)""",
1292
+ (
1293
+ project_id,
1294
+ "xmi",
1295
+ str(Path(file_path).name),
1296
+ "",
1297
+ len(validation["errors"]),
1298
+ json.dumps(validation["errors"]),
1299
+ timestamp,
1300
+ ),
1301
+ )
1302
+ conn.commit()
1303
+ import_id = c.lastrowid
1304
+ conn.close()
1305
+ except Exception:
1306
+ import_id = -1
1307
+
1308
+ return {
1309
+ "import_id": import_id,
1310
+ "elements_imported": 0,
1311
+ "relationships_imported": 0,
1312
+ "errors": len(validation["errors"]),
1313
+ "error_details": validation["errors"],
1314
+ "status": "failed",
1315
+ }
1316
+
1317
+ # Step 2–3 — Parse
1318
+ try:
1319
+ parsed = parse_xmi(file_path)
1320
+ except Exception as exc:
1321
+ return {
1322
+ "import_id": -1,
1323
+ "elements_imported": 0,
1324
+ "relationships_imported": 0,
1325
+ "errors": 1,
1326
+ "error_details": [f"Parse error: {exc}"],
1327
+ "status": "failed",
1328
+ }
1329
+
1330
+ elements = parsed["elements"]
1331
+ relationships = parsed["relationships"]
1332
+ source_hash = parsed["metadata"]["file_hash"]
1333
+ parsed["metadata"]["file"]
1334
+
1335
+ # Step 4 — Store in DB
1336
+ conn = _get_connection(db_path)
1337
+ cursor = conn.cursor()
1338
+
1339
+ elements_inserted = 0
1340
+ rels_inserted = 0
1341
+
1342
+ # Insert elements
1343
+ for el in elements:
1344
+ try:
1345
+ cursor.execute(
1346
+ """INSERT OR REPLACE INTO sysml_elements
1347
+ (id, project_id, xmi_id, element_type, name, qualified_name,
1348
+ parent_id, stereotype, description, properties,
1349
+ diagram_type, source_file, source_hash, imported_at, updated_at)
1350
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
1351
+ (
1352
+ el["id"],
1353
+ project_id,
1354
+ el["xmi_id"],
1355
+ el["element_type"],
1356
+ el["name"],
1357
+ el.get("qualified_name", ""),
1358
+ el.get("parent_id"),
1359
+ el.get("stereotype", ""),
1360
+ el.get("description", ""),
1361
+ el.get("properties", "{}"),
1362
+ el.get("diagram_type"),
1363
+ el.get("source_file", ""),
1364
+ el.get("source_hash", source_hash),
1365
+ timestamp,
1366
+ timestamp,
1367
+ ),
1368
+ )
1369
+ elements_inserted += 1
1370
+ except sqlite3.Error as exc:
1371
+ error_details.append(f"Element '{el.get('name', '')}': {exc}")
1372
+
1373
+ # Insert relationships
1374
+ for rel in relationships:
1375
+ try:
1376
+ cursor.execute(
1377
+ """INSERT OR REPLACE INTO sysml_relationships
1378
+ (project_id, source_element_id, target_element_id,
1379
+ relationship_type, name, properties, source_file)
1380
+ VALUES (?, ?, ?, ?, ?, ?, ?)""",
1381
+ (
1382
+ project_id,
1383
+ rel["source_element_id"],
1384
+ rel["target_element_id"],
1385
+ rel["relationship_type"],
1386
+ rel.get("name", ""),
1387
+ rel.get("properties", "{}"),
1388
+ rel.get("source_file", str(Path(file_path).name)),
1389
+ ),
1390
+ )
1391
+ rels_inserted += 1
1392
+ except sqlite3.Error as exc:
1393
+ error_details.append(f"Relationship '{rel.get('name', '')}': {exc}")
1394
+
1395
+ # Step 5 — Record import
1396
+ status = "completed" if not error_details else "partial"
1397
+ cursor.execute(
1398
+ """INSERT INTO model_imports
1399
+ (project_id, import_type, source_file, source_hash,
1400
+ elements_imported, relationships_imported, errors,
1401
+ error_details, status, imported_by, imported_at)
1402
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'icdev-mbse-engine', ?)""",
1403
+ (
1404
+ project_id,
1405
+ "xmi",
1406
+ str(Path(file_path).name),
1407
+ source_hash,
1408
+ elements_inserted,
1409
+ rels_inserted,
1410
+ len(error_details),
1411
+ json.dumps(error_details) if error_details else None,
1412
+ status,
1413
+ timestamp,
1414
+ ),
1415
+ )
1416
+ import_id = cursor.lastrowid
1417
+
1418
+ conn.commit()
1419
+ conn.close()
1420
+
1421
+ # Step 6 — Audit trail
1422
+ if _HAS_AUDIT:
1423
+ try:
1424
+ log_event(
1425
+ event_type="xmi_imported",
1426
+ actor="icdev-mbse-engine",
1427
+ action=f"Imported XMI file '{Path(file_path).name}' for project {project_id}",
1428
+ project_id=project_id,
1429
+ details={
1430
+ "import_id": import_id,
1431
+ "elements_imported": elements_inserted,
1432
+ "relationships_imported": rels_inserted,
1433
+ "errors": len(error_details),
1434
+ "source_hash": source_hash,
1435
+ "status": status,
1436
+ },
1437
+ affected_files=[str(file_path)],
1438
+ classification="CUI",
1439
+ db_path=Path(db_path) if db_path else None,
1440
+ )
1441
+ except Exception:
1442
+ pass # Audit failure should not block import
1443
+
1444
+ # Step 7 — Return summary
1445
+ return {
1446
+ "import_id": import_id,
1447
+ "elements_imported": elements_inserted,
1448
+ "relationships_imported": rels_inserted,
1449
+ "errors": len(error_details),
1450
+ "error_details": error_details if error_details else [],
1451
+ "status": status,
1452
+ }
1453
+
1454
+
1455
+ # ---------------------------------------------------------------------------
1456
+ # Import summary
1457
+ # ---------------------------------------------------------------------------
1458
+
1459
+ def get_import_summary(import_id: int, db_path: str = None) -> Dict[str, Any]:
1460
+ """Return import details from the model_imports table.
1461
+
1462
+ Returns the full row as a dict, or an error dict if not found.
1463
+ """
1464
+ conn = _get_connection(db_path)
1465
+ row = conn.execute(
1466
+ "SELECT * FROM model_imports WHERE id = ?", (import_id,)
1467
+ ).fetchone()
1468
+ conn.close()
1469
+
1470
+ if not row:
1471
+ return {"error": f"Import #{import_id} not found.", "import_id": import_id}
1472
+
1473
+ result = dict(row)
1474
+ # Parse JSON fields for convenience
1475
+ if result.get("error_details"):
1476
+ try:
1477
+ result["error_details"] = json.loads(result["error_details"])
1478
+ except (json.JSONDecodeError, TypeError):
1479
+ pass
1480
+
1481
+ return result
1482
+
1483
+
1484
+ # ---------------------------------------------------------------------------
1485
+ # CLI entry point
1486
+ # ---------------------------------------------------------------------------
1487
+
1488
+ def main() -> None:
1489
+ """Command-line interface for XMI parsing and import."""
1490
+ parser = argparse.ArgumentParser(
1491
+ description="Import SysML XMI from Cameo Systems Modeler"
1492
+ )
1493
+ parser.add_argument(
1494
+ "--project-id", required=True,
1495
+ help="ICDEV project identifier (e.g. proj-123)",
1496
+ )
1497
+ parser.add_argument(
1498
+ "--file", required=True,
1499
+ help="Path to XMI file exported from Cameo/MagicDraw",
1500
+ )
1501
+ parser.add_argument(
1502
+ "--validate-only", action="store_true",
1503
+ help="Validate XMI structure without importing",
1504
+ )
1505
+ parser.add_argument(
1506
+ "--json", action="store_true", dest="json_output",
1507
+ help="Output results as JSON",
1508
+ )
1509
+ parser.add_argument(
1510
+ "--db-path", type=Path, default=None,
1511
+ help="Override database path (default: data/icdev.db)",
1512
+ )
1513
+ args = parser.parse_args()
1514
+
1515
+ file_path = str(Path(args.file).resolve())
1516
+
1517
+ # ---- Validate-only mode ----
1518
+ if args.validate_only:
1519
+ result = validate_xmi(file_path)
1520
+ if args.json_output:
1521
+ print("CUI // SP-CTI")
1522
+ print(json.dumps(result, indent=2))
1523
+ print("CUI // SP-CTI")
1524
+ else:
1525
+ print("CUI // SP-CTI")
1526
+ print(f"XMI Validation: {'PASS' if result['valid'] else 'FAIL'}")
1527
+ print(f" File: {file_path}")
1528
+ print(f" Elements: {result['element_count']}")
1529
+ print(f" Namespaces: {len(result['namespaces'])}")
1530
+ for key, uri in result["namespaces"].items():
1531
+ print(f" {key}: {uri}")
1532
+ if result["errors"]:
1533
+ print(f" Errors ({len(result['errors'])}):")
1534
+ for err in result["errors"]:
1535
+ print(f" - {err}")
1536
+ print("CUI // SP-CTI")
1537
+ sys.exit(0 if result["valid"] else 1)
1538
+
1539
+ # ---- Full import mode ----
1540
+ db_path_str = str(args.db_path) if args.db_path else None
1541
+
1542
+ result = import_xmi(
1543
+ project_id=args.project_id,
1544
+ file_path=file_path,
1545
+ db_path=db_path_str,
1546
+ )
1547
+
1548
+ if args.json_output:
1549
+ print("CUI // SP-CTI")
1550
+ print(json.dumps(result, indent=2))
1551
+ print("CUI // SP-CTI")
1552
+ else:
1553
+ print("CUI // SP-CTI")
1554
+ print(f"XMI Import {'Complete' if result['status'] in ('completed', 'partial') else 'Failed'}")
1555
+ print(f" Project: {args.project_id}")
1556
+ print(f" File: {Path(file_path).name}")
1557
+ print(f" Import ID: {result['import_id']}")
1558
+ print(f" Elements: {result['elements_imported']}")
1559
+ print(f" Relationships: {result['relationships_imported']}")
1560
+ print(f" Errors: {result['errors']}")
1561
+ print(f" Status: {result['status']}")
1562
+ if result.get("error_details"):
1563
+ print(" Error Details:")
1564
+ for err in result["error_details"]:
1565
+ print(f" - {err}")
1566
+ print("CUI // SP-CTI")
1567
+
1568
+ sys.exit(0 if result["status"] in ("completed", "partial") else 1)
1569
+
1570
+
1571
+ if __name__ == "__main__":
1572
+ main()
1573
+ # [TEMPLATE: CUI // SP-CTI]