icdev 0.0.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1214) hide show
  1. args/agent_config.yaml +113 -0
  2. args/audit_regimes/cisa_sbd.json +381 -0
  3. args/audit_regimes/cmmc_l2.json +906 -0
  4. args/audit_regimes/dod_cssp.json +393 -0
  5. args/audit_regimes/dodi_5000_87.json +297 -0
  6. args/audit_regimes/fedramp_moderate.json +650 -0
  7. args/audit_regimes/ieee_1012.json +373 -0
  8. args/audit_regimes/nist_800_171.json +624 -0
  9. args/audit_regimes/nist_800_53.json +907 -0
  10. args/cloudforge_blueprints/aws_commercial.yaml +29 -0
  11. args/cloudforge_blueprints/aws_govcloud_il4.yaml +34 -0
  12. args/cloudforge_blueprints/aws_govcloud_il5.yaml +38 -0
  13. args/cloudforge_blueprints/azure_commercial.yaml +28 -0
  14. args/cloudforge_blueprints/azure_gov_il4.yaml +32 -0
  15. args/cloudforge_blueprints/azure_gov_il5.yaml +36 -0
  16. args/cloudforge_blueprints/gcp_commercial.yaml +28 -0
  17. args/cloudforge_blueprints/oci_commercial.yaml +28 -0
  18. args/cloudforge_config.yaml +231 -0
  19. args/cloudforge_runbook_templates/backup_verify.yaml +98 -0
  20. args/cloudforge_runbook_templates/dr_failover.yaml +107 -0
  21. args/cloudforge_runbook_templates/health_check.yaml +97 -0
  22. args/cloudforge_runbook_templates/incident_response.yaml +101 -0
  23. args/cloudforge_runbook_templates/migration_cutover.yaml +105 -0
  24. args/cloudforge_runbook_templates/patch_rollout.yaml +92 -0
  25. args/cloudforge_runbook_templates/zone_provision.yaml +93 -0
  26. args/code_pattern_config.yaml +151 -0
  27. args/code_quality_config.yaml +47 -0
  28. args/compliance_config.yaml +17 -0
  29. args/control_inheritance.yaml +177 -0
  30. args/csp_mcp_config.yaml +41 -0
  31. args/cui_markings.yaml +35 -0
  32. args/databridge_config.yaml +232 -0
  33. args/db_config.yaml +116 -0
  34. args/decision_tables/agent_trust_decision.yaml +143 -0
  35. args/decision_tables/ato_boundary_impact.yaml +132 -0
  36. args/decision_tables/deployment_approval.yaml +152 -0
  37. args/degradation_matrix.yaml +163 -0
  38. args/devsecops_config.yaml +286 -0
  39. args/endpoint_security_config.yaml +207 -0
  40. args/exit_criteria.yaml +102 -0
  41. args/feature_flags.yaml +235 -0
  42. args/file_access_tiers.yaml +88 -0
  43. args/forge_studio/blueprint_config.yaml +27 -0
  44. args/forge_studio/component_catalog.json +411 -0
  45. args/forge_studio/workflow_templates.yaml +103 -0
  46. args/govcon_config.yaml +41 -0
  47. args/harness_config.yaml +67 -0
  48. args/innovation_config.yaml +321 -0
  49. args/knowledge_graph_config.yaml +113 -0
  50. args/llm_config.yaml +222 -0
  51. args/marketplace_config.yaml +260 -0
  52. args/monitoring_config.yaml +127 -0
  53. args/mosa_config.yaml +190 -0
  54. args/observability_tracing_config.yaml +170 -0
  55. args/owasp_agentic_config.yaml +171 -0
  56. args/pipeline_gates.yaml +197 -0
  57. args/project_defaults.yaml +235 -0
  58. args/prompt_chains.yaml +163 -0
  59. args/rag_config.yaml +167 -0
  60. args/research_config.yaml +89 -0
  61. args/resilience_config.yaml +197 -0
  62. args/ricoas_config.yaml +191 -0
  63. args/security_gates.yaml +763 -0
  64. args/storage_config.yaml +63 -0
  65. args/writeguard_config.yaml +131 -0
  66. args/zta_config.yaml +247 -0
  67. context/__init__.py +6 -0
  68. context/agent/__init__.py +6 -0
  69. context/agent/response_schemas/__init__.py +6 -0
  70. context/agent/response_schemas/debate_position.json +46 -0
  71. context/agent/response_schemas/fitness_scorecard.json +74 -0
  72. context/agent/response_schemas/review_decision.json +39 -0
  73. context/agent/response_schemas/task_decomposition.json +82 -0
  74. context/agent/response_schemas/veto_decision.json +40 -0
  75. context/agentic/__init__.py +6 -0
  76. context/agentic/architecture_patterns.md +269 -0
  77. context/agentic/capability_registry.yaml +223 -0
  78. context/agentic/csp_integration.md +30 -0
  79. context/agentic/csp_mcp_registry.yaml +280 -0
  80. context/agentic/fitness_rubric.md +56 -0
  81. context/agentic/governance_baseline.md +205 -0
  82. context/ci/__init__.py +6 -0
  83. context/ci/worktree_templates.json +44 -0
  84. context/cloud/__init__.py +6 -0
  85. context/cloud/csp_service_registry.json +739 -0
  86. context/compliance/__init__.py +6 -0
  87. context/compliance/ai_rmf_crosswalk.yaml +226 -0
  88. context/compliance/atlas_mitigations.json +293 -0
  89. context/compliance/atlas_techniques.json +833 -0
  90. context/compliance/cisa_sbd_requirements.json +477 -0
  91. context/compliance/cjis_security_policy.json +522 -0
  92. context/compliance/cmmc_practices.json +2494 -0
  93. context/compliance/cmmc_report_template.md +142 -0
  94. context/compliance/cnssi_1253_overlay.json +109 -0
  95. context/compliance/control_crosswalk.json +1914 -0
  96. context/compliance/control_families/__init__.py +6 -0
  97. context/compliance/csp_certifications.json +251 -0
  98. context/compliance/cssp_report_template.md +193 -0
  99. context/compliance/cui_templates/__init__.py +6 -0
  100. context/compliance/cui_templates/banner_block.txt +4 -0
  101. context/compliance/cui_templates/code_header.txt +8 -0
  102. context/compliance/cui_templates/document_template.md +35 -0
  103. context/compliance/data_type_framework_map.json +321 -0
  104. context/compliance/data_type_registry.json +147 -0
  105. context/compliance/dod_cssp_8530.json +463 -0
  106. context/compliance/eu_ai_act_annex_iii.json +108 -0
  107. context/compliance/export_templates/__init__.py +6 -0
  108. context/compliance/export_templates/emass_controls.csv.j2 +4 -0
  109. context/compliance/export_templates/evidence_package.md.j2 +39 -0
  110. context/compliance/export_templates/executive_summary.md.j2 +55 -0
  111. context/compliance/export_templates/poam_tracking.csv.j2 +4 -0
  112. context/compliance/fedramp_20x_ksi_schemas.json +133 -0
  113. context/compliance/fedramp_high_baseline.json +4370 -0
  114. context/compliance/fedramp_moderate_baseline.json +2183 -0
  115. context/compliance/fedramp_report_template.md +181 -0
  116. context/compliance/fips_200_areas.json +362 -0
  117. context/compliance/gao_ai_accountability.json +262 -0
  118. context/compliance/hipaa_security_rule.json +720 -0
  119. context/compliance/hitrust_csf_v11.json +930 -0
  120. context/compliance/impact_level_profiles.json +251 -0
  121. context/compliance/incident_response_template.md +1110 -0
  122. context/compliance/iso27001_2022_controls.json +750 -0
  123. context/compliance/iso27001_nist_bridge.json +382 -0
  124. context/compliance/iso42001_controls.json +254 -0
  125. context/compliance/ivv_checklist_template.md +80 -0
  126. context/compliance/ivv_report_template.md +116 -0
  127. context/compliance/ivv_requirements.json +372 -0
  128. context/compliance/mosa_crosswalk.json +327 -0
  129. context/compliance/mosa_framework.json +250 -0
  130. context/compliance/narrative_templates/AC.md.j2 +101 -0
  131. context/compliance/narrative_templates/AU.md.j2 +106 -0
  132. context/compliance/narrative_templates/IA.md.j2 +104 -0
  133. context/compliance/narrative_templates/SC.md.j2 +102 -0
  134. context/compliance/narrative_templates/SI.md.j2 +111 -0
  135. context/compliance/narrative_templates/__init__.py +6 -0
  136. context/compliance/narrative_templates/default.md.j2 +50 -0
  137. context/compliance/narrative_templates/executive_summary.j2 +27 -0
  138. context/compliance/narrative_templates/poam_milestone.j2 +19 -0
  139. context/compliance/narrative_templates/ssp_section.j2 +11 -0
  140. context/compliance/nist_800_171_controls.json +1552 -0
  141. context/compliance/nist_800_207_crosswalk.json +399 -0
  142. context/compliance/nist_800_207_zta.json +258 -0
  143. context/compliance/nist_800_53.json +324 -0
  144. context/compliance/nist_ai_600_1_genai.json +326 -0
  145. context/compliance/nist_ai_rmf.json +206 -0
  146. context/compliance/nist_sp_800_60_types.json +1667 -0
  147. context/compliance/omb_m25_21_high_impact_ai.json +248 -0
  148. context/compliance/omb_m26_04_unbiased_ai.json +262 -0
  149. context/compliance/owasp_agentic_asi.json +133 -0
  150. context/compliance/owasp_agentic_threats.json +285 -0
  151. context/compliance/owasp_llm_top10.json +274 -0
  152. context/compliance/pci_dss_v4.json +510 -0
  153. context/compliance/poam_template.md +117 -0
  154. context/compliance/safeai_controls.json +512 -0
  155. context/compliance/sbd_report_template.md +77 -0
  156. context/compliance/siem_config_templates/__init__.py +6 -0
  157. context/compliance/siem_config_templates/filebeat.yml +213 -0
  158. context/compliance/siem_config_templates/log_sources.json +208 -0
  159. context/compliance/soc2_trust_criteria.json +661 -0
  160. context/compliance/ssp_template.md +432 -0
  161. context/compliance/stig_templates/__init__.py +6 -0
  162. context/compliance/stig_templates/webapp_stig.json +139 -0
  163. context/compliance/xai_requirements.json +108 -0
  164. context/dashboard/__init__.py +6 -0
  165. context/dashboard/nlq_examples.json +50 -0
  166. context/dashboard/schema_descriptions.json +23 -0
  167. context/icdev_methodology.md +100 -0
  168. context/integration/__init__.py +6 -0
  169. context/integration/approval_workflows.json +32 -0
  170. context/integration/gitlab_field_mappings.json +33 -0
  171. context/integration/jira_field_mappings.json +32 -0
  172. context/integration/reqif_export_schema.json +23 -0
  173. context/integration/servicenow_field_mappings.json +22 -0
  174. context/languages/__init__.py +6 -0
  175. context/languages/framework_patterns.json +205 -0
  176. context/languages/language_registry.json +279 -0
  177. context/llm/__init__.py +6 -0
  178. context/llm/example_provider.py +89 -0
  179. context/marketplace/assets/writeguard-core.yaml +100 -0
  180. context/marketplace/assets/writeguard-govcon.yaml +45 -0
  181. context/marketplace/assets/writeguard-style-guides.yaml +44 -0
  182. context/mbse/__init__.py +6 -0
  183. context/mbse/des_report_template.md +162 -0
  184. context/mbse/des_requirements.json +411 -0
  185. context/mbse/digital_thread_patterns.json +403 -0
  186. context/mbse/reqif_schema.json +280 -0
  187. context/mbse/sysml_element_types.json +432 -0
  188. context/oscal/NIST_SP-800-53_rev5_catalog.json +254987 -0
  189. context/oscal/README.md +43 -0
  190. context/patterns/__init__.py +6 -0
  191. context/profiles/__init__.py +6 -0
  192. context/profiles/dod_baseline_v1.yaml +145 -0
  193. context/profiles/fedramp_baseline_v1.yaml +143 -0
  194. context/profiles/financial_baseline_v1.yaml +142 -0
  195. context/profiles/healthcare_baseline_v1.yaml +135 -0
  196. context/profiles/law_enforcement_v1.yaml +129 -0
  197. context/profiles/startup_v1.yaml +134 -0
  198. context/rag/source_mappings.json +42 -0
  199. context/requirements/__init__.py +6 -0
  200. context/requirements/ambiguity_patterns.json +97 -0
  201. context/requirements/boundary_impact_rules.json +123 -0
  202. context/requirements/default_constitutions.json +67 -0
  203. context/requirements/document_extraction_rules.json +58 -0
  204. context/requirements/gap_patterns.json +108 -0
  205. context/requirements/readiness_rubric.json +78 -0
  206. context/requirements/red_alternative_patterns.json +210 -0
  207. context/requirements/safe_templates.json +72 -0
  208. context/requirements/spec_quality_checklist.json +122 -0
  209. context/research/regulatory_registry.json +114 -0
  210. context/research/verticals/cybersecurity.json +127 -0
  211. context/research/verticals/defense.json +104 -0
  212. context/research/verticals/fintech.json +125 -0
  213. context/research/verticals/healthcare.json +118 -0
  214. context/research/verticals/logistics.json +117 -0
  215. context/research/verticals/trading.json +145 -0
  216. context/simulation/__init__.py +6 -0
  217. context/simulation/architecture_patterns.json +36 -0
  218. context/simulation/coa_templates.json +38 -0
  219. context/simulation/cost_models.json +23 -0
  220. context/simulation/risk_categories.json +46 -0
  221. context/supply_chain/__init__.py +6 -0
  222. context/supply_chain/isa_templates.json +129 -0
  223. context/supply_chain/nist_800_161_controls.json +247 -0
  224. context/supply_chain/scrm_risk_matrix.json +147 -0
  225. context/templates/__init__.py +6 -0
  226. context/templates/ansible/__init__.py +6 -0
  227. context/templates/ansible/playbooks/__init__.py +6 -0
  228. context/templates/ansible/roles/__init__.py +6 -0
  229. context/templates/gitlab_ci/__init__.py +6 -0
  230. context/templates/grafana/__init__.py +6 -0
  231. context/templates/kubernetes/__init__.py +6 -0
  232. context/templates/project/__init__.py +6 -0
  233. context/templates/project/api/__init__.py +6 -0
  234. context/templates/project/cli/__init__.py +6 -0
  235. context/templates/project/data_pipeline/__init__.py +6 -0
  236. context/templates/project/iac/__init__.py +6 -0
  237. context/templates/project/javascript_frontend/__init__.py +6 -0
  238. context/templates/project/javascript_frontend/src/__init__.py +6 -0
  239. context/templates/project/javascript_frontend/tests/__init__.py +6 -0
  240. context/templates/project/microservice/__init__.py +6 -0
  241. context/templates/project/python_backend/__init__.py +6 -0
  242. context/templates/project/python_backend/src/__init__.py +6 -0
  243. context/templates/project/python_backend/tests/__init__.py +6 -0
  244. context/templates/project/python_backend/tests/features/__init__.py +6 -0
  245. context/templates/project/python_backend/tests/steps/__init__.py +6 -0
  246. context/templates/terraform/__init__.py +6 -0
  247. context/templates/terraform/govcloud_base/__init__.py +6 -0
  248. context/templates/terraform/modules/__init__.py +6 -0
  249. context/tone/__init__.py +6 -0
  250. context/writing/grammar_rules/common_errors.json +306 -0
  251. context/writing/grammar_rules/govcon_vocabulary.json +113 -0
  252. context/writing/style_guides/academic.yaml +43 -0
  253. context/writing/style_guides/business.yaml +42 -0
  254. context/writing/style_guides/government.yaml +59 -0
  255. context/writing/style_guides/proposal.yaml +58 -0
  256. context/writing/style_guides/technical.yaml +43 -0
  257. docs/adr/README.md +66 -0
  258. docs/adr/connector-forge-decisions.md +318 -0
  259. docs/adr/core-decisions.md +289 -0
  260. docs/adr/db-decisions.md +94 -0
  261. docs/adr/harness-decisions.md +122 -0
  262. docs/adr/innovation-decisions.md +262 -0
  263. docs/adr/marketplace-decisions.md +109 -0
  264. docs/adr/sbd-decisions.md +109 -0
  265. docs/adr/scale-engine-decisions.md +108 -0
  266. docs/adr/writeguard-decisions.md +136 -0
  267. docs/architecture/bounded-contexts.md +1032 -0
  268. docs/features/phase-65-writeguard.md +139 -0
  269. docs/features/phase-66-marketplace-commerce.md +79 -0
  270. docs/features/phase-67-knowledge-ingestion-rag-autodraft.md +97 -0
  271. docs/features/phase-68-enhanced-autodraft-pipeline.md +109 -0
  272. docs/features/phase-69-proposalai-marketplace-module.md +131 -0
  273. docs/features/phase-70-databridge.md +214 -0
  274. docs/features/phase-71-databridge-messaging.md +102 -0
  275. docs/implementation-plan-architecture-evolution.md +614 -0
  276. docs/marketplace/CONTRIBUTING.md +124 -0
  277. docs/marketplace/module_manifest_schema.yaml +83 -0
  278. docs/research/ai-architecture-patterns-2024-2026.md +1236 -0
  279. docs/research/app-builder-platform-analysis.md +582 -0
  280. docs/research/architecture-patterns-c4-ddd-agentic.md +871 -0
  281. docs/research/flowable-boat-competitive-analysis.md +426 -0
  282. docs/research/modern-dev-practices-2024-2026.md +1615 -0
  283. docs/research/secure-by-design-cloudyrion-adaptation.md +270 -0
  284. goals/agent_management.md +144 -0
  285. goals/ai_accountability.md +90 -0
  286. goals/ai_narratives.md +79 -0
  287. goals/ai_transparency.md +76 -0
  288. goals/ato_simulator.md +78 -0
  289. goals/audit_engine.md +177 -0
  290. goals/bite_sized_plans.md +225 -0
  291. goals/boundary_supply_chain.md +206 -0
  292. goals/brainstorming_gate.md +186 -0
  293. goals/build_app.md +604 -0
  294. goals/cato_live_evidence.md +77 -0
  295. goals/cloudforge.md +106 -0
  296. goals/code_intelligence.md +197 -0
  297. goals/compliance_workflow.md +858 -0
  298. goals/connector_forge.md +133 -0
  299. goals/databridge.md +128 -0
  300. goals/deploy_workflow.md +390 -0
  301. goals/developer_scorecard.md +78 -0
  302. goals/devsecops_workflow.md +408 -0
  303. goals/firmware_sbom.md +79 -0
  304. goals/forge_hub.md +78 -0
  305. goals/golden_path.md +77 -0
  306. goals/harness_engineering.md +91 -0
  307. goals/integration_testing.md +189 -0
  308. goals/knowledge_graph.md +128 -0
  309. goals/maintenance_audit.md +196 -0
  310. goals/manifest.md +50 -0
  311. goals/monitoring.md +126 -0
  312. goals/mosa_workflow.md +463 -0
  313. goals/multi_agent_orchestration.md +68 -0
  314. goals/observability_traceability_xai.md +154 -0
  315. goals/owasp_agentic_security.md +395 -0
  316. goals/pr_intelligence.md +78 -0
  317. goals/requirements_intake.md +213 -0
  318. goals/secure_by_design.md +135 -0
  319. goals/security_scan.md +381 -0
  320. goals/self_healing.md +120 -0
  321. goals/simulation_engine.md +111 -0
  322. goals/subagent_review.md +205 -0
  323. goals/systematic_debugging.md +257 -0
  324. goals/tdd_workflow.md +403 -0
  325. goals/template_exchange.md +77 -0
  326. goals/thread_heatmap.md +77 -0
  327. goals/threat_modeler.md +77 -0
  328. goals/verification_iron_law.md +192 -0
  329. goals/vsm_dashboard.md +76 -0
  330. goals/writeguard.md +89 -0
  331. goals/zero_trust_architecture.md +403 -0
  332. hardprompts/__init__.py +6 -0
  333. hardprompts/agent/__init__.py +6 -0
  334. hardprompts/agent/agentic_architect.md +100 -0
  335. hardprompts/agent/debate_prompt.md +32 -0
  336. hardprompts/agent/fitness_evaluation.md +48 -0
  337. hardprompts/agent/governance_review.md +214 -0
  338. hardprompts/agent/reviewer_prompt.md +34 -0
  339. hardprompts/agent/skill_design.md +172 -0
  340. hardprompts/agent/task_decomposition.md +275 -0
  341. hardprompts/agent/veto_check_prompt.md +33 -0
  342. hardprompts/architect/__init__.py +6 -0
  343. hardprompts/architect/api_design.md +283 -0
  344. hardprompts/architect/data_model.md +277 -0
  345. hardprompts/architect/system_design.md +180 -0
  346. hardprompts/builder/__init__.py +6 -0
  347. hardprompts/builder/code_generation.md +59 -0
  348. hardprompts/builder/refactor.md +58 -0
  349. hardprompts/builder/scaffold_project.md +69 -0
  350. hardprompts/builder/test_generation.md +87 -0
  351. hardprompts/ci/__init__.py +6 -0
  352. hardprompts/ci/worktree_setup.md +35 -0
  353. hardprompts/compliance/__init__.py +6 -0
  354. hardprompts/compliance/cmmc_assessment.md +63 -0
  355. hardprompts/compliance/cssp_assessment.md +75 -0
  356. hardprompts/compliance/cui_marking.md +86 -0
  357. hardprompts/compliance/fedramp_assessment.md +55 -0
  358. hardprompts/compliance/ivv_assessment.md +96 -0
  359. hardprompts/compliance/poam_generation.md +57 -0
  360. hardprompts/compliance/sbd_assessment.md +101 -0
  361. hardprompts/compliance/security_categorization.md +74 -0
  362. hardprompts/compliance/ssp_generation.md +56 -0
  363. hardprompts/compliance/stig_evaluation.md +63 -0
  364. hardprompts/dashboard/__init__.py +6 -0
  365. hardprompts/dashboard/nlq_system_prompt.md +26 -0
  366. hardprompts/infra/__init__.py +6 -0
  367. hardprompts/infra/k8s_manifests.md +118 -0
  368. hardprompts/infra/pipeline_generation.md +160 -0
  369. hardprompts/infra/terraform_generation.md +92 -0
  370. hardprompts/integration/__init__.py +6 -0
  371. hardprompts/integration/approval_review.md +17 -0
  372. hardprompts/integration/jira_mapping.md +25 -0
  373. hardprompts/integration/servicenow_mapping.md +14 -0
  374. hardprompts/knowledge/__init__.py +6 -0
  375. hardprompts/knowledge/pattern_detection.md +73 -0
  376. hardprompts/knowledge/recommendation_engine.md +90 -0
  377. hardprompts/knowledge/root_cause_analysis.md +91 -0
  378. hardprompts/maintenance/__init__.py +6 -0
  379. hardprompts/maintenance/maintenance_assessment.md +82 -0
  380. hardprompts/mbse/__init__.py +6 -0
  381. hardprompts/mbse/digital_thread.md +67 -0
  382. hardprompts/mbse/model_import.md +62 -0
  383. hardprompts/mbse/model_to_code.md +65 -0
  384. hardprompts/modernization/__init__.py +6 -0
  385. hardprompts/modernization/legacy_analysis.md +93 -0
  386. hardprompts/modernization/migration_planning.md +150 -0
  387. hardprompts/modernization/seven_r_assessment.md +107 -0
  388. hardprompts/proposal_draft.md +53 -0
  389. hardprompts/rag_citation.md +12 -0
  390. hardprompts/rag_rerank.md +31 -0
  391. hardprompts/requirements/__init__.py +6 -0
  392. hardprompts/requirements/bdd_generation.md +35 -0
  393. hardprompts/requirements/clarification_prioritization.md +29 -0
  394. hardprompts/requirements/decomposition.md +60 -0
  395. hardprompts/requirements/document_extraction.md +45 -0
  396. hardprompts/requirements/gap_detection.md +70 -0
  397. hardprompts/requirements/intake_conversation.md +101 -0
  398. hardprompts/requirements/readiness_assessment.md +39 -0
  399. hardprompts/requirements/spec_quality.md +33 -0
  400. hardprompts/requirements/traceability_analysis.md +23 -0
  401. hardprompts/security/__init__.py +6 -0
  402. hardprompts/security/endpoint_security.md +78 -0
  403. hardprompts/security/threat_model.md +70 -0
  404. hardprompts/security/vulnerability_assessment.md +81 -0
  405. hardprompts/simulation/__init__.py +6 -0
  406. hardprompts/simulation/architecture_impact.md +27 -0
  407. hardprompts/simulation/coa_alternative.md +27 -0
  408. hardprompts/simulation/coa_generation.md +25 -0
  409. hardprompts/simulation/compliance_impact.md +28 -0
  410. hardprompts/simulation/cost_estimation.md +33 -0
  411. hardprompts/simulation/risk_assessment.md +28 -0
  412. hardprompts/translation/code_translation.md +68 -0
  413. hardprompts/translation/dependency_suggestion.md +44 -0
  414. hardprompts/translation/test_translation.md +64 -0
  415. hardprompts/translation/translation_repair.md +59 -0
  416. icdev-0.0.3.dist-info/METADATA +909 -0
  417. icdev-0.0.3.dist-info/RECORD +1214 -0
  418. icdev-0.0.3.dist-info/WHEEL +5 -0
  419. icdev-0.0.3.dist-info/entry_points.txt +9 -0
  420. icdev-0.0.3.dist-info/licenses/LICENSE +201 -0
  421. icdev-0.0.3.dist-info/licenses/NOTICE +11 -0
  422. icdev-0.0.3.dist-info/top_level.txt +7 -0
  423. memory/MEMORY.md +52 -0
  424. memory/logs/2026-02-14.md +17 -0
  425. memory/logs/2026-03-03.md +2 -0
  426. memory/logs/__init__.py +1 -0
  427. tools/a2a/icdev_callback_client.py +210 -0
  428. tools/agent/cards/architect_card.json +29 -0
  429. tools/agent/cards/builder_card.json +34 -0
  430. tools/agent/cards/compliance_card.json +29 -0
  431. tools/agent/cards/connector_forge_card.json +49 -0
  432. tools/agent/cards/devsecops_zta_card.json +24 -0
  433. tools/agent/cards/knowledge_card.json +29 -0
  434. tools/agent/cards/monitor_card.json +29 -0
  435. tools/agent/cards/orchestrator_card.json +29 -0
  436. tools/agent/cards/requirements_analyst_card.json +24 -0
  437. tools/agent/cards/security_card.json +29 -0
  438. tools/agent/cards/simulation_card.json +24 -0
  439. tools/agent/cards/supply_chain_card.json +24 -0
  440. tools/analysis/__init__.py +1 -0
  441. tools/analysis/code_analyzer.py +770 -0
  442. tools/analysis/runtime_feedback.py +379 -0
  443. tools/analytics/__init__.py +2 -0
  444. tools/analytics/scorecard.py +538 -0
  445. tools/analytics/vsm_engine.py +612 -0
  446. tools/architecture/__init__.py +2 -0
  447. tools/architecture/adr_extractor.py +393 -0
  448. tools/audit/__init__.py +1 -0
  449. tools/audit/audit_logger.py +199 -0
  450. tools/audit/audit_query.py +153 -0
  451. tools/audit/decision_recorder.py +73 -0
  452. tools/audit_engine/__init__.py +12 -0
  453. tools/audit_engine/ai_advisor.py +906 -0
  454. tools/audit_engine/cli.py +286 -0
  455. tools/audit_engine/comparator.py +305 -0
  456. tools/audit_engine/eject_scaffolder.py +399 -0
  457. tools/audit_engine/engine.py +614 -0
  458. tools/audit_engine/git_fetcher.py +341 -0
  459. tools/audit_engine/regime_loader.py +200 -0
  460. tools/audit_engine/regime_updater.py +325 -0
  461. tools/audit_engine/report_card.py +289 -0
  462. tools/audit_engine/scanner.py +684 -0
  463. tools/audit_engine/self_heal.py +1042 -0
  464. tools/ci/__init__.py +2 -0
  465. tools/ci/connectors/__init__.py +2 -0
  466. tools/ci/connectors/base_connector.py +80 -0
  467. tools/ci/connectors/connector_registry.py +188 -0
  468. tools/ci/connectors/mattermost_connector.py +159 -0
  469. tools/ci/connectors/slack_connector.py +197 -0
  470. tools/ci/core/__init__.py +2 -0
  471. tools/ci/core/air_gap_detector.py +115 -0
  472. tools/ci/core/comment_handler.py +192 -0
  473. tools/ci/core/conversation_manager.py +480 -0
  474. tools/ci/core/event_envelope.py +500 -0
  475. tools/ci/core/event_router.py +444 -0
  476. tools/ci/core/failure_parser.py +397 -0
  477. tools/ci/core/recovery_engine.py +527 -0
  478. tools/ci/gate_enforcer.py +361 -0
  479. tools/ci/modules/__init__.py +2 -0
  480. tools/ci/modules/agent.py +271 -0
  481. tools/ci/modules/git_ops.py +175 -0
  482. tools/ci/modules/state.py +117 -0
  483. tools/ci/modules/vcs.py +303 -0
  484. tools/ci/modules/workflow_ops.py +295 -0
  485. tools/ci/modules/worktree.py +337 -0
  486. tools/ci/pipeline_config_generator.py +558 -0
  487. tools/ci/pr_intelligence.py +485 -0
  488. tools/ci/triggers/__init__.py +2 -0
  489. tools/ci/triggers/gitlab_task_monitor.py +327 -0
  490. tools/ci/triggers/poll_trigger.py +237 -0
  491. tools/ci/triggers/webhook_server.py +356 -0
  492. tools/ci/workflows/__init__.py +2 -0
  493. tools/ci/workflows/icdev_build.py +140 -0
  494. tools/ci/workflows/icdev_comply.py +284 -0
  495. tools/ci/workflows/icdev_document.py +152 -0
  496. tools/ci/workflows/icdev_e2e.py +188 -0
  497. tools/ci/workflows/icdev_patch.py +186 -0
  498. tools/ci/workflows/icdev_plan.py +202 -0
  499. tools/ci/workflows/icdev_plan_build.py +41 -0
  500. tools/ci/workflows/icdev_plan_build_test.py +46 -0
  501. tools/ci/workflows/icdev_plan_build_test_review.py +47 -0
  502. tools/ci/workflows/icdev_review.py +126 -0
  503. tools/ci/workflows/icdev_sdlc.py +261 -0
  504. tools/ci/workflows/icdev_test.py +240 -0
  505. tools/cli/__init__.py +1 -0
  506. tools/cli/output_formatter.py +756 -0
  507. tools/cloudforge/__init__.py +12 -0
  508. tools/cloudforge/airgap/__init__.py +2 -0
  509. tools/cloudforge/airgap/il_classifier.py +70 -0
  510. tools/cloudforge/airgap/offline_validator.py +42 -0
  511. tools/cloudforge/airgap/shift_emulator.py +155 -0
  512. tools/cloudforge/airgap/sneakernet.py +91 -0
  513. tools/cloudforge/cd_hub/__init__.py +2 -0
  514. tools/cloudforge/cd_hub/canary_deployer.py +88 -0
  515. tools/cloudforge/cd_hub/gitops_renderer.py +123 -0
  516. tools/cloudforge/cd_hub/hub_controller.py +143 -0
  517. tools/cloudforge/cd_hub/pipeline_bridge.py +30 -0
  518. tools/cloudforge/cd_hub/rollback_engine.py +29 -0
  519. tools/cloudforge/cd_hub/spoke_agent.py +51 -0
  520. tools/cloudforge/compliance/__init__.py +2 -0
  521. tools/cloudforge/compliance/ato_accelerator.py +272 -0
  522. tools/cloudforge/compliance/control_inheritor.py +127 -0
  523. tools/cloudforge/compliance/evidence_generator.py +129 -0
  524. tools/cloudforge/compliance/poam_bridge.py +41 -0
  525. tools/cloudforge/compliance/ssp_bridge.py +52 -0
  526. tools/cloudforge/compliance/stig_bridge.py +41 -0
  527. tools/cloudforge/container_forge/__init__.py +2 -0
  528. tools/cloudforge/container_forge/bigbang_renderer.py +85 -0
  529. tools/cloudforge/container_forge/hardener.py +169 -0
  530. tools/cloudforge/container_forge/image_scanner_bridge.py +33 -0
  531. tools/cloudforge/container_forge/runtime_policy.py +87 -0
  532. tools/cloudforge/container_forge/sbom_bridge.py +42 -0
  533. tools/cloudforge/finops/__init__.py +2 -0
  534. tools/cloudforge/finops/anomaly_detector.py +78 -0
  535. tools/cloudforge/finops/budget_tracker.py +96 -0
  536. tools/cloudforge/finops/chargeback.py +69 -0
  537. tools/cloudforge/finops/cost_collector.py +141 -0
  538. tools/cloudforge/finops/optimizer.py +55 -0
  539. tools/cloudforge/hybrid/__init__.py +2 -0
  540. tools/cloudforge/hybrid/connection_manager.py +141 -0
  541. tools/cloudforge/hybrid/dns_federator.py +56 -0
  542. tools/cloudforge/hybrid/health_monitor.py +108 -0
  543. tools/cloudforge/hybrid/identity_federator.py +53 -0
  544. tools/cloudforge/hybrid/network_bridge.py +68 -0
  545. tools/cloudforge/hybrid/topology_manager.py +147 -0
  546. tools/cloudforge/hybrid/workload_abstractor.py +92 -0
  547. tools/cloudforge/iac/__init__.py +2 -0
  548. tools/cloudforge/iac/drift_detector.py +154 -0
  549. tools/cloudforge/iac/module_library.py +265 -0
  550. tools/cloudforge/iac/opentofu_adapter.py +89 -0
  551. tools/cloudforge/iac/pulumi_renderer.py +292 -0
  552. tools/cloudforge/iac/state_backend.py +146 -0
  553. tools/cloudforge/iac/terraform_renderer.py +626 -0
  554. tools/cloudforge/landing_zone/__init__.py +2 -0
  555. tools/cloudforge/landing_zone/blueprint_loader.py +98 -0
  556. tools/cloudforge/landing_zone/blueprint_validator.py +113 -0
  557. tools/cloudforge/landing_zone/zone_provisioner.py +306 -0
  558. tools/cloudforge/landing_zone/zone_state.py +143 -0
  559. tools/cloudforge/mbse_thread/__init__.py +2 -0
  560. tools/cloudforge/mbse_thread/ato_thread_weaver.py +111 -0
  561. tools/cloudforge/mbse_thread/control_tracer.py +68 -0
  562. tools/cloudforge/mbse_thread/system_boundary.py +83 -0
  563. tools/cloudforge/metastore/__init__.py +2 -0
  564. tools/cloudforge/metastore/dependency_graph.py +202 -0
  565. tools/cloudforge/metastore/discovery.py +192 -0
  566. tools/cloudforge/metastore/registry.py +185 -0
  567. tools/cloudforge/metastore/rto_tracker.py +92 -0
  568. tools/cloudforge/metastore/runbook_linker.py +82 -0
  569. tools/cloudforge/migration/__init__.py +2 -0
  570. tools/cloudforge/migration/assessor.py +187 -0
  571. tools/cloudforge/migration/cutover_orchestrator.py +117 -0
  572. tools/cloudforge/migration/databridge_bridge.py +92 -0
  573. tools/cloudforge/migration/planner.py +98 -0
  574. tools/cloudforge/migration/risk_scorer.py +97 -0
  575. tools/cloudforge/migration/validation_runner.py +45 -0
  576. tools/cloudforge/migration/workload_inventory.py +107 -0
  577. tools/cloudforge/provider.py +319 -0
  578. tools/cloudforge/providers/__init__.py +2 -0
  579. tools/cloudforge/providers/aws_commercial.py +92 -0
  580. tools/cloudforge/providers/aws_govcloud.py +229 -0
  581. tools/cloudforge/providers/aws_secret.py +83 -0
  582. tools/cloudforge/providers/azure_commercial.py +80 -0
  583. tools/cloudforge/providers/azure_gov.py +91 -0
  584. tools/cloudforge/providers/azure_secret.py +71 -0
  585. tools/cloudforge/providers/gcp.py +102 -0
  586. tools/cloudforge/providers/oci.py +102 -0
  587. tools/cloudforge/registry.py +140 -0
  588. tools/cloudforge/runbooks/__init__.py +2 -0
  589. tools/cloudforge/runbooks/ai_generator.py +119 -0
  590. tools/cloudforge/runbooks/dag_validator.py +219 -0
  591. tools/cloudforge/runbooks/engine.py +470 -0
  592. tools/cloudforge/runbooks/models.py +99 -0
  593. tools/cloudforge/runbooks/snippet_library.py +158 -0
  594. tools/cloudforge/runbooks/template_loader.py +122 -0
  595. tools/cloudforge/runbooks/visualization.py +108 -0
  596. tools/cloudforge/siem/__init__.py +2 -0
  597. tools/cloudforge/siem/alert_rules.py +86 -0
  598. tools/cloudforge/siem/correlation_engine.py +61 -0
  599. tools/cloudforge/siem/log_aggregator.py +113 -0
  600. tools/cloudforge/siem/siem_dashboard_data.py +28 -0
  601. tools/cloudforge/supply_chain/__init__.py +2 -0
  602. tools/cloudforge/supply_chain/bridge.py +33 -0
  603. tools/cloudforge/supply_chain/iac_dependency_scanner.py +36 -0
  604. tools/cloudforge/supply_chain/provider_trust_scorer.py +54 -0
  605. tools/compat/__init__.py +21 -0
  606. tools/compat/cli_harmonizer.py +251 -0
  607. tools/compat/datetime_utils.py +18 -0
  608. tools/compat/db_utils.py +190 -0
  609. tools/compat/platform_utils.py +123 -0
  610. tools/compliance/__init__.py +1 -0
  611. tools/compliance/accountability_manager.py +391 -0
  612. tools/compliance/ai_accountability_audit.py +287 -0
  613. tools/compliance/ai_impact_assessor.py +267 -0
  614. tools/compliance/ai_incident_response.py +295 -0
  615. tools/compliance/ai_inventory_manager.py +233 -0
  616. tools/compliance/ai_reassessment_scheduler.py +250 -0
  617. tools/compliance/ai_transparency_audit.py +247 -0
  618. tools/compliance/atlas_assessor.py +276 -0
  619. tools/compliance/atlas_report_generator.py +1199 -0
  620. tools/compliance/base_assessor.py +591 -0
  621. tools/compliance/cato_live_engine.py +607 -0
  622. tools/compliance/cato_monitor.py +1371 -0
  623. tools/compliance/cato_scheduler.py +698 -0
  624. tools/compliance/cjis_assessor.py +76 -0
  625. tools/compliance/classification_manager.py +1340 -0
  626. tools/compliance/cmmc_assessor.py +1478 -0
  627. tools/compliance/cmmc_report_generator.py +1087 -0
  628. tools/compliance/compliance_detector.py +452 -0
  629. tools/compliance/compliance_exporter.py +418 -0
  630. tools/compliance/compliance_status.py +810 -0
  631. tools/compliance/control_mapper.py +488 -0
  632. tools/compliance/crosswalk_engine.py +1208 -0
  633. tools/compliance/cssp_assessor.py +1032 -0
  634. tools/compliance/cssp_evidence_collector.py +716 -0
  635. tools/compliance/cssp_report_generator.py +1103 -0
  636. tools/compliance/cui_marker.py +387 -0
  637. tools/compliance/diagram_validator.py +599 -0
  638. tools/compliance/emass/__init__.py +2 -0
  639. tools/compliance/emass/emass_client.py +822 -0
  640. tools/compliance/emass/emass_export.py +758 -0
  641. tools/compliance/emass/emass_sync.py +807 -0
  642. tools/compliance/eu_ai_act_classifier.py +193 -0
  643. tools/compliance/evidence_collector.py +459 -0
  644. tools/compliance/fairness_assessor.py +310 -0
  645. tools/compliance/fedramp_20x_ksi_emitter.py +692 -0
  646. tools/compliance/fedramp_assessor.py +1795 -0
  647. tools/compliance/fedramp_authorization_packager.py +137 -0
  648. tools/compliance/fedramp_ksi_generator.py +349 -0
  649. tools/compliance/fedramp_report_generator.py +1115 -0
  650. tools/compliance/fips199_categorizer.py +869 -0
  651. tools/compliance/fips200_validator.py +304 -0
  652. tools/compliance/firmware_sbom.py +646 -0
  653. tools/compliance/gao_ai_assessor.py +228 -0
  654. tools/compliance/gao_evidence_builder.py +302 -0
  655. tools/compliance/hipaa_assessor.py +78 -0
  656. tools/compliance/hitrust_assessor.py +49 -0
  657. tools/compliance/incident_response_plan.py +705 -0
  658. tools/compliance/inheritance_engine.py +693 -0
  659. tools/compliance/iso27001_assessor.py +92 -0
  660. tools/compliance/iso42001_assessor.py +114 -0
  661. tools/compliance/ivv_assessor.py +2314 -0
  662. tools/compliance/ivv_report_generator.py +1649 -0
  663. tools/compliance/model_card_generator.py +291 -0
  664. tools/compliance/mosa_assessor.py +117 -0
  665. tools/compliance/multi_regime_assessor.py +441 -0
  666. tools/compliance/narrative_generator.py +1012 -0
  667. tools/compliance/narrative_quality_gate.py +701 -0
  668. tools/compliance/narrative_workflow.py +814 -0
  669. tools/compliance/nist_800_207_assessor.py +191 -0
  670. tools/compliance/nist_ai_600_1_assessor.py +185 -0
  671. tools/compliance/nist_ai_rmf_assessor.py +110 -0
  672. tools/compliance/nist_lookup.py +244 -0
  673. tools/compliance/omb_m25_21_assessor.py +225 -0
  674. tools/compliance/omb_m26_04_assessor.py +185 -0
  675. tools/compliance/oscal_catalog_adapter.py +395 -0
  676. tools/compliance/oscal_generator.py +2157 -0
  677. tools/compliance/oscal_tools.py +1182 -0
  678. tools/compliance/oscal_validator.py +692 -0
  679. tools/compliance/owasp_agentic_assessor.py +227 -0
  680. tools/compliance/owasp_asi_assessor.py +197 -0
  681. tools/compliance/owasp_llm_assessor.py +245 -0
  682. tools/compliance/pci_dss_assessor.py +80 -0
  683. tools/compliance/pi_compliance_tracker.py +1447 -0
  684. tools/compliance/poam_generator.py +388 -0
  685. tools/compliance/resolve_marking.py +272 -0
  686. tools/compliance/sbd_assessor.py +2070 -0
  687. tools/compliance/sbd_report_generator.py +1223 -0
  688. tools/compliance/sbom_generator.py +993 -0
  689. tools/compliance/siem_config_generator.py +661 -0
  690. tools/compliance/slsa_attestation_generator.py +479 -0
  691. tools/compliance/soc2_assessor.py +77 -0
  692. tools/compliance/ssp_generator.py +556 -0
  693. tools/compliance/stig_checker.py +712 -0
  694. tools/compliance/swft_evidence_bundler.py +326 -0
  695. tools/compliance/system_card_generator.py +303 -0
  696. tools/compliance/template_exchange.py +513 -0
  697. tools/compliance/traceability_matrix.py +1268 -0
  698. tools/compliance/universal_classification_manager.py +1159 -0
  699. tools/compliance/xacta/__init__.py +2 -0
  700. tools/compliance/xacta/xacta_client.py +438 -0
  701. tools/compliance/xacta/xacta_export.py +546 -0
  702. tools/compliance/xacta/xacta_sync.py +322 -0
  703. tools/compliance/xai_assessor.py +231 -0
  704. tools/core/__init__.py +2 -0
  705. tools/core/circuit_breaker.py +353 -0
  706. tools/core/compliance_sidecar.py +344 -0
  707. tools/core/container.py +110 -0
  708. tools/core/errors.py +256 -0
  709. tools/core/feature_flags.py +311 -0
  710. tools/core/task_dlq.py +350 -0
  711. tools/dashboard/__init__.py +2 -0
  712. tools/dashboard/app.py +6288 -0
  713. tools/dashboard/templates/agent_evolution.html +287 -0
  714. tools/dashboard/templates/agents/list.html +71 -0
  715. tools/dashboard/templates/agents.html +132 -0
  716. tools/dashboard/templates/architecture.html +289 -0
  717. tools/dashboard/templates/ato_simulator.html +170 -0
  718. tools/dashboard/templates/audit_engine.html +844 -0
  719. tools/dashboard/templates/base.html +236 -0
  720. tools/dashboard/templates/cato_live.html +116 -0
  721. tools/dashboard/templates/cloudforge.html +195 -0
  722. tools/dashboard/templates/cloudforge_finops.html +111 -0
  723. tools/dashboard/templates/cloudforge_hybrid.html +122 -0
  724. tools/dashboard/templates/cloudforge_metastore.html +234 -0
  725. tools/dashboard/templates/cloudforge_migration.html +87 -0
  726. tools/dashboard/templates/cloudforge_runbooks.html +201 -0
  727. tools/dashboard/templates/cloudforge_siem.html +94 -0
  728. tools/dashboard/templates/compliance_accel.html +292 -0
  729. tools/dashboard/templates/crashes.html +122 -0
  730. tools/dashboard/templates/databridge.html +305 -0
  731. tools/dashboard/templates/databridge_analytics.html +195 -0
  732. tools/dashboard/templates/databridge_mapping.html +345 -0
  733. tools/dashboard/templates/databridge_messaging.html +321 -0
  734. tools/dashboard/templates/decisions.html +258 -0
  735. tools/dashboard/templates/devices.html +151 -0
  736. tools/dashboard/templates/devsecops_maturity.html +278 -0
  737. tools/dashboard/templates/edge_ai.html +128 -0
  738. tools/dashboard/templates/firmware.html +120 -0
  739. tools/dashboard/templates/firmware_sbom.html +193 -0
  740. tools/dashboard/templates/forge_hub.html +196 -0
  741. tools/dashboard/templates/forge_studio.html +379 -0
  742. tools/dashboard/templates/forge_studio_analytics.html +360 -0
  743. tools/dashboard/templates/forge_studio_builder.html +1637 -0
  744. tools/dashboard/templates/forge_studio_compliance.html +310 -0
  745. tools/dashboard/templates/forge_studio_deploy.html +573 -0
  746. tools/dashboard/templates/forge_studio_enterprise.html +888 -0
  747. tools/dashboard/templates/forge_studio_marketplace.html +502 -0
  748. tools/dashboard/templates/forge_studio_workflow.html +696 -0
  749. tools/dashboard/templates/golden_path.html +175 -0
  750. tools/dashboard/templates/govcon.html +280 -0
  751. tools/dashboard/templates/harness.html +148 -0
  752. tools/dashboard/templates/index.html +207 -0
  753. tools/dashboard/templates/intelligence.html +336 -0
  754. tools/dashboard/templates/knowledge/index.html +190 -0
  755. tools/dashboard/templates/knowledge_graph.html +739 -0
  756. tools/dashboard/templates/login.html +51 -0
  757. tools/dashboard/templates/marketplace.html +336 -0
  758. tools/dashboard/templates/marketplace_admin.html +247 -0
  759. tools/dashboard/templates/missions.html +403 -0
  760. tools/dashboard/templates/narratives.html +154 -0
  761. tools/dashboard/templates/pr_intelligence.html +151 -0
  762. tools/dashboard/templates/proposals/detail.html +300 -0
  763. tools/dashboard/templates/proposals/list.html +52 -0
  764. tools/dashboard/templates/proposals/sam_detail.html +132 -0
  765. tools/dashboard/templates/proposals/section_detail.html +375 -0
  766. tools/dashboard/templates/research.html +222 -0
  767. tools/dashboard/templates/resilience.html +300 -0
  768. tools/dashboard/templates/scorecard.html +162 -0
  769. tools/dashboard/templates/simulator.html +131 -0
  770. tools/dashboard/templates/template_exchange.html +147 -0
  771. tools/dashboard/templates/thread_heatmap.html +151 -0
  772. tools/dashboard/templates/threat_model.html +195 -0
  773. tools/dashboard/templates/vsm.html +141 -0
  774. tools/dashboard/templates/writeguard.html +277 -0
  775. tools/databridge/__init__.py +5 -0
  776. tools/databridge/agent/__init__.py +2 -0
  777. tools/databridge/agent/daemon.py +227 -0
  778. tools/databridge/agent/tunnel.py +101 -0
  779. tools/databridge/agent/ws_relay.py +91 -0
  780. tools/databridge/analytics.py +167 -0
  781. tools/databridge/arrow_pipeline.py +327 -0
  782. tools/databridge/connection_manager.py +424 -0
  783. tools/databridge/connector.py +331 -0
  784. tools/databridge/connectors/__init__.py +2 -0
  785. tools/databridge/connectors/argocd_connector.py +160 -0
  786. tools/databridge/connectors/avro_connector.py +203 -0
  787. tools/databridge/connectors/azure_blob.py +63 -0
  788. tools/databridge/connectors/cdc_connector.py +205 -0
  789. tools/databridge/connectors/csv_connector.py +172 -0
  790. tools/databridge/connectors/datadog_connector.py +153 -0
  791. tools/databridge/connectors/discord_messaging.py +215 -0
  792. tools/databridge/connectors/dynamics365.py +151 -0
  793. tools/databridge/connectors/elasticsearch_connector.py +145 -0
  794. tools/databridge/connectors/email_base.py +114 -0
  795. tools/databridge/connectors/excel_connector.py +175 -0
  796. tools/databridge/connectors/fsspec_base.py +300 -0
  797. tools/databridge/connectors/gcs.py +53 -0
  798. tools/databridge/connectors/github_connector.py +138 -0
  799. tools/databridge/connectors/gitlab_connector.py +132 -0
  800. tools/databridge/connectors/gmail_connector.py +182 -0
  801. tools/databridge/connectors/hdfs.py +57 -0
  802. tools/databridge/connectors/health_base.py +401 -0
  803. tools/databridge/connectors/hubspot.py +124 -0
  804. tools/databridge/connectors/imap_connector.py +171 -0
  805. tools/databridge/connectors/jenkins_connector.py +138 -0
  806. tools/databridge/connectors/jira_connector.py +86 -0
  807. tools/databridge/connectors/json_connector.py +184 -0
  808. tools/databridge/connectors/kafka_connector.py +246 -0
  809. tools/databridge/connectors/kinesis_connector.py +238 -0
  810. tools/databridge/connectors/local_fs.py +30 -0
  811. tools/databridge/connectors/matrix.py +197 -0
  812. tools/databridge/connectors/mattermost_messaging.py +184 -0
  813. tools/databridge/connectors/messaging_base.py +172 -0
  814. tools/databridge/connectors/mssql.py +63 -0
  815. tools/databridge/connectors/mysql.py +57 -0
  816. tools/databridge/connectors/netsuite.py +170 -0
  817. tools/databridge/connectors/o365_mail.py +196 -0
  818. tools/databridge/connectors/oracle.py +65 -0
  819. tools/databridge/connectors/pagerduty_connector.py +162 -0
  820. tools/databridge/connectors/parquet_connector.py +131 -0
  821. tools/databridge/connectors/postgresql.py +58 -0
  822. tools/databridge/connectors/s3.py +65 -0
  823. tools/databridge/connectors/saas_base.py +198 -0
  824. tools/databridge/connectors/salesforce.py +126 -0
  825. tools/databridge/connectors/sap.py +89 -0
  826. tools/databridge/connectors/servicenow.py +60 -0
  827. tools/databridge/connectors/signal_messaging.py +150 -0
  828. tools/databridge/connectors/slack_messaging.py +203 -0
  829. tools/databridge/connectors/smtp_connector.py +126 -0
  830. tools/databridge/connectors/soap_base.py +258 -0
  831. tools/databridge/connectors/splunk_connector.py +171 -0
  832. tools/databridge/connectors/sql_base.py +310 -0
  833. tools/databridge/connectors/sqlite_connector.py +76 -0
  834. tools/databridge/connectors/teams.py +148 -0
  835. tools/databridge/connectors/telegram.py +192 -0
  836. tools/databridge/connectors/whatsapp.py +137 -0
  837. tools/databridge/data_profiler.py +99 -0
  838. tools/databridge/forge/__init__.py +6 -0
  839. tools/databridge/forge/base_selector.py +150 -0
  840. tools/databridge/forge/code_generator.py +206 -0
  841. tools/databridge/forge/community_hub.py +539 -0
  842. tools/databridge/forge/forge_agent.py +306 -0
  843. tools/databridge/forge/import_handler.py +133 -0
  844. tools/databridge/forge/integration_tester.py +127 -0
  845. tools/databridge/forge/marketplace_publisher.py +164 -0
  846. tools/databridge/forge/promoter.py +159 -0
  847. tools/databridge/forge/sandbox_manager.py +257 -0
  848. tools/databridge/forge/spec_parser.py +358 -0
  849. tools/databridge/forge/static_validator.py +363 -0
  850. tools/databridge/forge/templates/__init__.py +591 -0
  851. tools/databridge/format_converter.py +188 -0
  852. tools/databridge/mapping_engine.py +348 -0
  853. tools/databridge/messaging/__init__.py +5 -0
  854. tools/databridge/messaging/agent_bridge.py +254 -0
  855. tools/databridge/messaging/message_envelope.py +111 -0
  856. tools/databridge/messaging/message_logger.py +204 -0
  857. tools/databridge/messaging/messaging_daemon.py +326 -0
  858. tools/databridge/messaging/oauth2_manager.py +411 -0
  859. tools/databridge/pii_detector.py +221 -0
  860. tools/databridge/registry.py +352 -0
  861. tools/databridge/relay_server.py +105 -0
  862. tools/databridge/scale/__init__.py +16 -0
  863. tools/databridge/scale/backpressure.py +134 -0
  864. tools/databridge/scale/chunked_pipeline.py +169 -0
  865. tools/databridge/scale/connection_pool.py +293 -0
  866. tools/databridge/scale/engine.py +492 -0
  867. tools/databridge/scale/worker_pool.py +140 -0
  868. tools/databridge/scale/write_batcher.py +250 -0
  869. tools/databridge/schema_engine.py +324 -0
  870. tools/databridge/stream_manager.py +225 -0
  871. tools/databridge/sync_engine.py +411 -0
  872. tools/databridge/transforms.py +302 -0
  873. tools/db/__init__.py +1 -0
  874. tools/db/backup.py +312 -0
  875. tools/db/backup_manager.py +832 -0
  876. tools/db/init_icdev_db.py +7753 -0
  877. tools/db/init_sparkpilot_db.py +431 -0
  878. tools/db/migrate.py +177 -0
  879. tools/db/migrate_innovation_audit.py +165 -0
  880. tools/db/migration_runner.py +548 -0
  881. tools/db/migrations/001_baseline/meta.json +9 -0
  882. tools/db/migrations/001_baseline/up.py +67 -0
  883. tools/db/migrations/002_memory_enhancements/down.sql +8 -0
  884. tools/db/migrations/002_memory_enhancements/meta.json +9 -0
  885. tools/db/migrations/002_memory_enhancements/up.py +119 -0
  886. tools/db/migrations/003_dev_profiles/meta.json +8 -0
  887. tools/db/migrations/003_dev_profiles/up.py +93 -0
  888. tools/db/migrations/004_innovation_engine/down.py +19 -0
  889. tools/db/migrations/004_innovation_engine/up.py +227 -0
  890. tools/db/migrations/005_phase_37_ai_security/down.py +19 -0
  891. tools/db/migrations/005_phase_37_ai_security/up.py +257 -0
  892. tools/db/migrations/006_phase_36_evolution/down.py +21 -0
  893. tools/db/migrations/006_phase_36_evolution/up.py +323 -0
  894. tools/db/migrations/007_phase_38_cloud/down.py +14 -0
  895. tools/db/migrations/007_phase_38_cloud/up.py +110 -0
  896. tools/db/migrations/008_phase36_37_integration/up.py +55 -0
  897. tools/db/migrations/__init__.py +2 -0
  898. tools/db/pg_migrate.py +642 -0
  899. tools/db/storage.py +1080 -0
  900. tools/decisions/__init__.py +2 -0
  901. tools/decisions/dmn_engine.py +695 -0
  902. tools/devsecops/__init__.py +2 -0
  903. tools/devsecops/attestation_manager.py +449 -0
  904. tools/devsecops/network_segmentation_generator.py +604 -0
  905. tools/devsecops/pdp_config_generator.py +1246 -0
  906. tools/devsecops/pipeline_security_generator.py +475 -0
  907. tools/devsecops/policy_generator.py +644 -0
  908. tools/devsecops/profile_manager.py +374 -0
  909. tools/devsecops/service_mesh_generator.py +1063 -0
  910. tools/devsecops/zta_maturity_scorer.py +355 -0
  911. tools/devsecops/zta_terraform_generator.py +1301 -0
  912. tools/edge_ai/__init__.py +2 -0
  913. tools/edge_ai/model_manager.py +200 -0
  914. tools/embedded/__init__.py +2 -0
  915. tools/embedded/cmake_generator.py +318 -0
  916. tools/embedded/crash_analyzer.py +191 -0
  917. tools/embedded/nl_to_firmware.py +277 -0
  918. tools/events/__init__.py +1 -0
  919. tools/events/event_bus.py +199 -0
  920. tools/finetune/pair_generator.py +832 -0
  921. tools/fleet/__init__.py +2 -0
  922. tools/fleet/device_registry.py +148 -0
  923. tools/fleet/ota_manager.py +153 -0
  924. tools/forge_studio/__init__.py +13 -0
  925. tools/forge_studio/analytics/__init__.py +0 -0
  926. tools/forge_studio/analytics/process_miner.py +383 -0
  927. tools/forge_studio/audit.py +183 -0
  928. tools/forge_studio/blueprint/__init__.py +2 -0
  929. tools/forge_studio/blueprint/build_tracker.py +317 -0
  930. tools/forge_studio/blueprint/export_engine.py +441 -0
  931. tools/forge_studio/blueprint/parent_client.py +335 -0
  932. tools/forge_studio/catalog/__init__.py +2 -0
  933. tools/forge_studio/catalog/component_registry.py +176 -0
  934. tools/forge_studio/catalog/schema_validator.py +193 -0
  935. tools/forge_studio/compliance/__init__.py +1 -0
  936. tools/forge_studio/compliance/compliance_wiring.py +554 -0
  937. tools/forge_studio/deploy/__init__.py +1 -0
  938. tools/forge_studio/deploy/airgap_packager.py +466 -0
  939. tools/forge_studio/deploy/deploy_engine.py +1792 -0
  940. tools/forge_studio/deploy/env_manager.py +431 -0
  941. tools/forge_studio/eject/__init__.py +2 -0
  942. tools/forge_studio/eject/docker_compose_generator.py +237 -0
  943. tools/forge_studio/eject/eject_engine.py +230 -0
  944. tools/forge_studio/eject/expo_scaffolder.py +303 -0
  945. tools/forge_studio/eject/nextjs_scaffolder.py +338 -0
  946. tools/forge_studio/enterprise/__init__.py +0 -0
  947. tools/forge_studio/enterprise/custom_frameworks.py +826 -0
  948. tools/forge_studio/enterprise/hardening_engine.py +1530 -0
  949. tools/forge_studio/enterprise/sso_manager.py +718 -0
  950. tools/forge_studio/enterprise/whitelabel_engine.py +887 -0
  951. tools/forge_studio/formula/__init__.py +0 -0
  952. tools/forge_studio/formula/expression_engine.py +562 -0
  953. tools/forge_studio/formula/formula_registry.py +265 -0
  954. tools/forge_studio/generator/__init__.py +2 -0
  955. tools/forge_studio/generator/app_generator.py +584 -0
  956. tools/forge_studio/generator/complexity_detector.py +368 -0
  957. tools/forge_studio/generator/prompt_templates.py +104 -0
  958. tools/forge_studio/generator/spec_builder.py +192 -0
  959. tools/forge_studio/intake_bridge.py +898 -0
  960. tools/forge_studio/marketplace/__init__.py +0 -0
  961. tools/forge_studio/marketplace/component_hub.py +428 -0
  962. tools/forge_studio/models.py +369 -0
  963. tools/forge_studio/renderer/__init__.py +2 -0
  964. tools/forge_studio/renderer/json_render_engine.py +623 -0
  965. tools/forge_studio/renderer/layout_engine.py +214 -0
  966. tools/forge_studio/renderer/rn_component_map.py +182 -0
  967. tools/forge_studio/supabase/__init__.py +2 -0
  968. tools/forge_studio/supabase/auth_generator.py +283 -0
  969. tools/forge_studio/supabase/migration_generator.py +93 -0
  970. tools/forge_studio/supabase/schema_generator.py +281 -0
  971. tools/forge_studio/tenant_manager.py +387 -0
  972. tools/forge_studio/workflow/__init__.py +2 -0
  973. tools/forge_studio/workflow/bpmn_adapter.py +489 -0
  974. tools/govcon/draft_orchestrator.py +1151 -0
  975. tools/govcon/engine_enrichment.py +373 -0
  976. tools/govcon/knowledge_base.py +487 -0
  977. tools/govcon/knowledge_ingestion.py +510 -0
  978. tools/govcon/sam_scanner.py +754 -0
  979. tools/harness/__init__.py +6 -0
  980. tools/harness/exit_criteria_evaluator.py +231 -0
  981. tools/harness/maturity_assessor.py +347 -0
  982. tools/harness/scaffold_harness.py +416 -0
  983. tools/harness/trace_analyzer.py +281 -0
  984. tools/infra/__init__.py +1 -0
  985. tools/infra/ansible_generator.py +867 -0
  986. tools/infra/dockerfile_generator.py +359 -0
  987. tools/infra/infra_status.py +384 -0
  988. tools/infra/ironbank_metadata_generator.py +403 -0
  989. tools/infra/k8s_generator.py +1000 -0
  990. tools/infra/pipeline_generator.py +830 -0
  991. tools/infra/rollback.py +389 -0
  992. tools/infra/terraform_generator.py +1140 -0
  993. tools/infra/terraform_generator_azure.py +1252 -0
  994. tools/infra/terraform_generator_gcp.py +951 -0
  995. tools/infra/terraform_generator_ibm.py +359 -0
  996. tools/infra/terraform_generator_oci.py +918 -0
  997. tools/infra/terraform_generator_onprem.py +318 -0
  998. tools/knowledge/__init__.py +1 -0
  999. tools/knowledge/knowledge_ingest.py +281 -0
  1000. tools/knowledge/pattern_detector.py +681 -0
  1001. tools/knowledge/recommendation_engine.py +449 -0
  1002. tools/knowledge/self_heal_analyzer.py +492 -0
  1003. tools/knowledge_graph/__init__.py +2 -0
  1004. tools/knowledge_graph/graph_rag.py +498 -0
  1005. tools/knowledge_graph/ingester.py +406 -0
  1006. tools/knowledge_graph/insight_generator.py +369 -0
  1007. tools/knowledge_graph/text_network.py +832 -0
  1008. tools/llm/__init__.py +72 -0
  1009. tools/llm/anthropic_provider.py +170 -0
  1010. tools/llm/azure_openai_provider.py +338 -0
  1011. tools/llm/bedrock_provider.py +315 -0
  1012. tools/llm/embedding_provider.py +438 -0
  1013. tools/llm/gemini_provider.py +381 -0
  1014. tools/llm/ibm_watsonx_provider.py +231 -0
  1015. tools/llm/oci_genai_provider.py +462 -0
  1016. tools/llm/ollama_provider.py +350 -0
  1017. tools/llm/openai_provider.py +225 -0
  1018. tools/llm/prompt_registry.py +447 -0
  1019. tools/llm/provider.py +355 -0
  1020. tools/llm/provider_sdk.py +175 -0
  1021. tools/llm/router.py +1124 -0
  1022. tools/llm/semantic_cache.py +394 -0
  1023. tools/llm/vertex_ai_provider.py +374 -0
  1024. tools/maintenance/__init__.py +2 -0
  1025. tools/maintenance/dependency_scanner.py +1016 -0
  1026. tools/maintenance/maintenance_auditor.py +804 -0
  1027. tools/maintenance/remediation_engine.py +957 -0
  1028. tools/maintenance/vulnerability_checker.py +978 -0
  1029. tools/manifest.md +1066 -0
  1030. tools/marketplace/asset_installer.py +639 -0
  1031. tools/marketplace/feedback_validator.py +359 -0
  1032. tools/marketplace/license_client.py +458 -0
  1033. tools/marketplace/module_crypto.py +544 -0
  1034. tools/marketplace/module_runtime.py +236 -0
  1035. tools/marketplace/token_store.py +264 -0
  1036. tools/mbse/__init__.py +3 -0
  1037. tools/mbse/des_assessor.py +1173 -0
  1038. tools/mbse/des_report_generator.py +787 -0
  1039. tools/mbse/diagram_extractor.py +792 -0
  1040. tools/mbse/digital_thread.py +1650 -0
  1041. tools/mbse/model_code_generator.py +1115 -0
  1042. tools/mbse/model_control_mapper.py +410 -0
  1043. tools/mbse/pi_model_tracker.py +1079 -0
  1044. tools/mbse/reqif_parser.py +1468 -0
  1045. tools/mbse/sync_engine.py +1789 -0
  1046. tools/mbse/thread_heatmap.py +445 -0
  1047. tools/mbse/xmi_parser.py +1558 -0
  1048. tools/mcp/builder_server.py +64 -0
  1049. tools/mcp/compliance_server.py +64 -0
  1050. tools/mcp/connector_forge_server.py +155 -0
  1051. tools/mcp/core_server.py +64 -0
  1052. tools/mcp/devsecops_server.py +11 -0
  1053. tools/mcp/devsecops_zta_server.py +64 -0
  1054. tools/mcp/knowledge_server.py +64 -0
  1055. tools/mcp/monitor_server.py +64 -0
  1056. tools/mcp/ops_server.py +300 -0
  1057. tools/mcp/requirements_analyst_server.py +64 -0
  1058. tools/mcp/requirements_server.py +11 -0
  1059. tools/mcp/security_server.py +64 -0
  1060. tools/mcp/simulation_server.py +64 -0
  1061. tools/mcp/supply_chain_server.py +64 -0
  1062. tools/mcp/tool_registry.py +299 -0
  1063. tools/memory/__init__.py +2 -0
  1064. tools/memory/auto_capture.py +346 -0
  1065. tools/memory/embed_memory.py +157 -0
  1066. tools/memory/history_compressor.py +334 -0
  1067. tools/memory/hybrid_search.py +235 -0
  1068. tools/memory/maintenance_cron.py +288 -0
  1069. tools/memory/memory_consolidation.py +439 -0
  1070. tools/memory/memory_db.py +132 -0
  1071. tools/memory/memory_read.py +101 -0
  1072. tools/memory/memory_write.py +221 -0
  1073. tools/memory/semantic_search.py +138 -0
  1074. tools/memory/time_decay.py +434 -0
  1075. tools/missions/__init__.py +2 -0
  1076. tools/missions/mission_engine.py +459 -0
  1077. tools/monitor/__init__.py +1 -0
  1078. tools/monitor/alert_correlator.py +486 -0
  1079. tools/monitor/auto_resolver.py +603 -0
  1080. tools/monitor/health_checker.py +507 -0
  1081. tools/monitor/heartbeat_daemon.py +779 -0
  1082. tools/monitor/log_analyzer.py +507 -0
  1083. tools/monitor/metric_collector.py +484 -0
  1084. tools/mosa/__init__.py +10 -0
  1085. tools/mosa/icd_generator.py +358 -0
  1086. tools/mosa/modular_design_analyzer.py +682 -0
  1087. tools/mosa/mosa_code_enforcer.py +348 -0
  1088. tools/mosa/tsp_generator.py +265 -0
  1089. tools/observability/__init__.py +100 -0
  1090. tools/observability/genai_attributes.py +88 -0
  1091. tools/observability/instrumentation.py +140 -0
  1092. tools/observability/mlflow_exporter.py +193 -0
  1093. tools/observability/otel_tracer.py +168 -0
  1094. tools/observability/provenance/__init__.py +3 -0
  1095. tools/observability/provenance/prov_recorder.py +322 -0
  1096. tools/observability/shap/__init__.py +3 -0
  1097. tools/observability/shap/agent_shap.py +274 -0
  1098. tools/observability/sqlite_tracer.py +360 -0
  1099. tools/observability/trace_context.py +205 -0
  1100. tools/observability/tracer.py +230 -0
  1101. tools/orchestration/__init__.py +1 -0
  1102. tools/orchestration/peer_channels.py +254 -0
  1103. tools/orchestration/saga_coordinator.py +390 -0
  1104. tools/project/__init__.py +1 -0
  1105. tools/project/manifest_loader.py +418 -0
  1106. tools/project/project_create.py +350 -0
  1107. tools/project/project_list.py +171 -0
  1108. tools/project/project_scaffold.py +1715 -0
  1109. tools/project/project_status.py +478 -0
  1110. tools/project/session_context_builder.py +752 -0
  1111. tools/project/validate_manifest.py +54 -0
  1112. tools/rag/corrective_rag.py +582 -0
  1113. tools/rag/source_registry.py +482 -0
  1114. tools/requirements/__init__.py +1 -0
  1115. tools/requirements/ai_governance_scorer.py +207 -0
  1116. tools/requirements/boundary_analyzer.py +1281 -0
  1117. tools/requirements/clarification_engine.py +605 -0
  1118. tools/requirements/complexity_scorer.py +369 -0
  1119. tools/requirements/consistency_analyzer.py +789 -0
  1120. tools/requirements/constitution_manager.py +592 -0
  1121. tools/requirements/decomposition_engine.py +764 -0
  1122. tools/requirements/document_extractor.py +1002 -0
  1123. tools/requirements/elicitation_techniques.py +508 -0
  1124. tools/requirements/gap_detector.py +260 -0
  1125. tools/requirements/intake_engine.py +2175 -0
  1126. tools/requirements/prd_generator.py +839 -0
  1127. tools/requirements/prd_validator.py +584 -0
  1128. tools/requirements/readiness_scorer.py +302 -0
  1129. tools/requirements/spec_organizer.py +1015 -0
  1130. tools/requirements/spec_quality_checker.py +1083 -0
  1131. tools/requirements/traceability_builder.py +566 -0
  1132. tools/research/__init__.py +3 -0
  1133. tools/research/academic_scanner.py +130 -0
  1134. tools/research/build_buy_analyzer.py +229 -0
  1135. tools/research/challenge_scorer.py +280 -0
  1136. tools/research/community_scanner.py +174 -0
  1137. tools/research/cross_engine_bridge.py +124 -0
  1138. tools/research/dossier_generator.py +305 -0
  1139. tools/research/landscape_scanner.py +315 -0
  1140. tools/research/regulatory_scanner.py +248 -0
  1141. tools/research/research_manager.py +469 -0
  1142. tools/research/source_scanner.py +150 -0
  1143. tools/research/vertical_loader.py +118 -0
  1144. tools/saas/__init__.py +0 -0
  1145. tools/saas/licensing/__init__.py +0 -0
  1146. tools/saas/licensing/license_validator.py +345 -0
  1147. tools/scaffold/__init__.py +2 -0
  1148. tools/scaffold/golden_path.py +504 -0
  1149. tools/security/__init__.py +1 -0
  1150. tools/security/agent_output_validator.py +330 -0
  1151. tools/security/agent_trust_scorer.py +652 -0
  1152. tools/security/ai_bom_generator.py +718 -0
  1153. tools/security/ai_telemetry_logger.py +469 -0
  1154. tools/security/atlas_red_team.py +541 -0
  1155. tools/security/code_pattern_scanner.py +382 -0
  1156. tools/security/confabulation_detector.py +265 -0
  1157. tools/security/container_scanner.py +489 -0
  1158. tools/security/dependency_auditor.py +942 -0
  1159. tools/security/endpoint_security_scanner.py +626 -0
  1160. tools/security/mcp_tool_authorizer.py +242 -0
  1161. tools/security/output_verifier.py +427 -0
  1162. tools/security/prompt_injection_detector.py +737 -0
  1163. tools/security/sast_runner.py +946 -0
  1164. tools/security/secret_detector.py +376 -0
  1165. tools/security/threat_modeler.py +678 -0
  1166. tools/security/tool_chain_validator.py +357 -0
  1167. tools/security/vuln_scanner.py +536 -0
  1168. tools/simulation/__init__.py +2 -0
  1169. tools/simulation/ato_simulator.py +517 -0
  1170. tools/simulation/coa_generator.py +1539 -0
  1171. tools/simulation/monte_carlo.py +745 -0
  1172. tools/simulation/scenario_manager.py +1060 -0
  1173. tools/simulation/simulation_engine.py +1091 -0
  1174. tools/simulator/__init__.py +2 -0
  1175. tools/simulator/sim_runner.py +272 -0
  1176. tools/supply_chain/__init__.py +2 -0
  1177. tools/supply_chain/cve_triager.py +690 -0
  1178. tools/supply_chain/dependency_graph.py +630 -0
  1179. tools/supply_chain/isa_manager.py +526 -0
  1180. tools/supply_chain/scrm_assessor.py +531 -0
  1181. tools/supply_chain/slsa_verifier.py +473 -0
  1182. tools/testing/__init__.py +2 -0
  1183. tools/testing/acceptance_validator.py +411 -0
  1184. tools/testing/api_surface_extractor.py +749 -0
  1185. tools/testing/claude_dir_validator.py +831 -0
  1186. tools/testing/data_types.py +199 -0
  1187. tools/testing/e2e_runner.py +715 -0
  1188. tools/testing/fuzz_cli.py +306 -0
  1189. tools/testing/health_check.py +483 -0
  1190. tools/testing/platform_check.py +143 -0
  1191. tools/testing/production_audit.py +1836 -0
  1192. tools/testing/production_remediate.py +803 -0
  1193. tools/testing/screenshot_validator.py +538 -0
  1194. tools/testing/smoke_test.py +283 -0
  1195. tools/testing/test_agent_models.py +117 -0
  1196. tools/testing/test_orchestrator.py +957 -0
  1197. tools/testing/utils.py +229 -0
  1198. tools/writeguard/__init__.py +1 -0
  1199. tools/writeguard/main.py +1 -0
  1200. tools/writing/__init__.py +7 -0
  1201. tools/writing/ai_content_detector.py +316 -0
  1202. tools/writing/analysis_engine.py +454 -0
  1203. tools/writing/batch_analyzer.py +276 -0
  1204. tools/writing/coherence_analyzer.py +221 -0
  1205. tools/writing/govcon_bridge.py +509 -0
  1206. tools/writing/grammar_checker.py +270 -0
  1207. tools/writing/plagiarism_detector.py +106 -0
  1208. tools/writing/readability_scorer.py +201 -0
  1209. tools/writing/rewriter.py +96 -0
  1210. tools/writing/signal_registrar.py +167 -0
  1211. tools/writing/snippet_manager.py +276 -0
  1212. tools/writing/style_enforcer.py +220 -0
  1213. tools/writing/style_guide_manager.py +438 -0
  1214. tools/writing/tone_profiler.py +168 -0
@@ -0,0 +1,1558 @@
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 tools.db.storage import get_connection
31
+
32
+ # ---------------------------------------------------------------------------
33
+ # Path constants
34
+ # ---------------------------------------------------------------------------
35
+ BASE_DIR = Path(__file__).resolve().parent.parent.parent
36
+
37
+ # ---------------------------------------------------------------------------
38
+ # Audit logger — graceful fallback for standalone execution
39
+ # ---------------------------------------------------------------------------
40
+ try:
41
+ from tools.audit.audit_logger import log_event # type: ignore
42
+ _HAS_AUDIT = True
43
+ except ImportError:
44
+ _HAS_AUDIT = False
45
+
46
+ def log_event(**kwargs) -> int: # noqa: D103 – stub
47
+ return -1
48
+
49
+ # ---------------------------------------------------------------------------
50
+ # Well-known XMI / UML / SysML / MagicDraw namespace URIs
51
+ # ---------------------------------------------------------------------------
52
+ KNOWN_NAMESPACES: Dict[str, str] = {
53
+ "xmi": "http://www.omg.org/spec/XMI/20131001",
54
+ "uml": "http://www.omg.org/spec/UML/20131001",
55
+ "sysml": "http://www.omg.org/spec/SysML/20181001",
56
+ "md": "http://www.nomagic.com/magicdraw/UML/2.5.1",
57
+ }
58
+
59
+ # Older namespace variants that Cameo may emit
60
+ NAMESPACE_ALTERNATIVES: Dict[str, List[str]] = {
61
+ "xmi": [
62
+ "http://www.omg.org/spec/XMI/20131001",
63
+ "http://www.omg.org/spec/XMI/20110701",
64
+ "http://www.omg.org/spec/XMI/2.5.1",
65
+ "http://www.omg.org/XMI",
66
+ ],
67
+ "uml": [
68
+ "http://www.omg.org/spec/UML/20131001",
69
+ "http://www.omg.org/spec/UML/20110701",
70
+ "http://www.eclipse.org/uml2/5.0.0/UML",
71
+ "http://schema.omg.org/spec/UML/2.1",
72
+ ],
73
+ "sysml": [
74
+ "http://www.omg.org/spec/SysML/20181001",
75
+ "http://www.omg.org/spec/SysML/20150709",
76
+ "http://www.omg.org/spec/SysML/20120401",
77
+ ],
78
+ "md": [
79
+ "http://www.nomagic.com/magicdraw/UML/2.5.1",
80
+ "http://www.nomagic.com/magicdraw/UML/2.5",
81
+ "http://www.nomagic.com/magicdraw/UML/2.4.1",
82
+ ],
83
+ }
84
+
85
+ # SysML relationship stereotype keywords (lower-cased for matching)
86
+ SYSML_REL_STEREOTYPES = {
87
+ "satisfy", "derive", "verify", "refine", "trace", "allocate", "copy",
88
+ }
89
+
90
+ # ---------------------------------------------------------------------------
91
+ # Helpers
92
+ # ---------------------------------------------------------------------------
93
+
94
+ def _new_id() -> str:
95
+ """Generate a prefixed UUID for a SysML element."""
96
+ return f"sysml-{uuid.uuid4()}"
97
+
98
+
99
+ def _file_hash(file_path: str) -> str:
100
+ """Compute SHA-256 hex digest of a file."""
101
+ h = hashlib.sha256()
102
+ with open(file_path, "rb") as fh:
103
+ for chunk in iter(lambda: fh.read(65536), b""):
104
+ h.update(chunk)
105
+ return h.hexdigest()
106
+
107
+
108
+ def _ts() -> str:
109
+ """Current ISO-8601 timestamp."""
110
+ return datetime.now().isoformat()
111
+
112
+
113
+ def _attr(element: ET.Element, local_name: str, ns: Dict[str, str]) -> Optional[str]:
114
+ """Retrieve an attribute by namespace-qualified or plain local name.
115
+
116
+ Tries ``{xmi_ns}local_name``, ``xmi:local_name``, and bare ``local_name``.
117
+ """
118
+ xmi_ns = ns.get("xmi", "")
119
+ # Fully qualified
120
+ val = element.get(f"{{{xmi_ns}}}{local_name}") if xmi_ns else None
121
+ if val is not None:
122
+ return val
123
+ # Prefixed (sometimes kept literally in attribute names)
124
+ val = element.get(f"xmi:{local_name}")
125
+ if val is not None:
126
+ return val
127
+ # Bare
128
+ return element.get(local_name)
129
+
130
+
131
+ def _xmi_id(element: ET.Element, ns: Dict[str, str]) -> Optional[str]:
132
+ """Extract the ``xmi:id`` attribute from *element*."""
133
+ return _attr(element, "id", ns)
134
+
135
+
136
+ def _xmi_type(element: ET.Element, ns: Dict[str, str]) -> Optional[str]:
137
+ """Extract the ``xmi:type`` attribute from *element*."""
138
+ return _attr(element, "type", ns)
139
+
140
+
141
+ def _qualified_name(element: ET.Element, root: ET.Element) -> str:
142
+ """Build a colon-separated qualified name by walking up parent map."""
143
+ # ElementTree doesn't maintain parent references natively, so we build
144
+ # one if not yet cached on the root element.
145
+ parent_map = getattr(root, "_parent_map", None)
146
+ if parent_map is None:
147
+ parent_map = {c: p for p in root.iter() for c in p}
148
+ root._parent_map = parent_map # type: ignore[attr-defined]
149
+ parts: List[str] = []
150
+ cur = element
151
+ while cur is not None:
152
+ name = cur.get("name")
153
+ if name:
154
+ parts.append(name)
155
+ cur = parent_map.get(cur)
156
+ parts.reverse()
157
+ return "::".join(parts) if parts else ""
158
+
159
+
160
+ def _find_all_ns(root: ET.Element, tag_local: str, ns: Dict[str, str],
161
+ ns_key: str = "uml") -> List[ET.Element]:
162
+ """Find all descendant elements matching *tag_local* under any known
163
+ namespace variant for *ns_key*.
164
+ """
165
+ results: List[ET.Element] = []
166
+ uri = ns.get(ns_key, "")
167
+ if uri:
168
+ results.extend(root.iter(f"{{{uri}}}{tag_local}"))
169
+ # Also try without namespace (some exports omit it)
170
+ results.extend(e for e in root.iter(tag_local) if e not in results)
171
+ return results
172
+
173
+
174
+ def _get_description(element: ET.Element, ns: Dict[str, str]) -> str:
175
+ """Extract the description / body / documentation from an element.
176
+
177
+ Cameo stores documentation in ``ownedComment`` children with a ``body``
178
+ sub-element, or as a ``body`` attribute directly.
179
+ """
180
+ # ownedComment → body
181
+ for comment in element.iter("ownedComment"):
182
+ body_el = comment.find("body")
183
+ if body_el is not None and body_el.text:
184
+ return body_el.text.strip()
185
+ body_attr = comment.get("body")
186
+ if body_attr:
187
+ return body_attr.strip()
188
+ # Direct body attribute (rare)
189
+ body = element.get("body")
190
+ if body:
191
+ return body.strip()
192
+ return ""
193
+
194
+
195
+ # ---------------------------------------------------------------------------
196
+ # Namespace detection
197
+ # ---------------------------------------------------------------------------
198
+
199
+ def _detect_namespaces(root: ET.Element) -> Dict[str, str]:
200
+ """Detect XMI/UML/SysML/MagicDraw namespaces from the root element.
201
+
202
+ Inspects the root tag, registered namespace map, and tag prefixes across
203
+ all children. Returns a dict mapping short keys ('xmi', 'uml', 'sysml',
204
+ 'md') to their detected namespace URIs.
205
+ """
206
+ detected: Dict[str, str] = {}
207
+
208
+ # 1. Collect all namespace URIs declared in the document.
209
+ # ElementTree exposes them through iterparse or the tag itself.
210
+ declared_uris: set = set()
211
+
212
+ # Root tag may carry a namespace: {uri}LocalName
213
+ root_tag = root.tag
214
+ if root_tag.startswith("{"):
215
+ uri = root_tag[1:root_tag.index("}")]
216
+ declared_uris.add(uri)
217
+
218
+ # Walk all elements for additional namespace URIs
219
+ for elem in root.iter():
220
+ tag = elem.tag
221
+ if tag.startswith("{"):
222
+ declared_uris.add(tag[1:tag.index("}")])
223
+ # Attributes may also carry namespace URIs
224
+ for attr_name in elem.attrib:
225
+ if attr_name.startswith("{"):
226
+ declared_uris.add(attr_name[1:attr_name.index("}")])
227
+
228
+ # 2. Match declared URIs to known namespace keys
229
+ for key, alternatives in NAMESPACE_ALTERNATIVES.items():
230
+ for alt_uri in alternatives:
231
+ if alt_uri in declared_uris:
232
+ detected[key] = alt_uri
233
+ break
234
+
235
+ # 3. Fallback: use well-known defaults for anything not detected
236
+ for key, default_uri in KNOWN_NAMESPACES.items():
237
+ if key not in detected:
238
+ detected[key] = default_uri
239
+
240
+ return detected
241
+
242
+
243
+ # ---------------------------------------------------------------------------
244
+ # Stereotype resolution
245
+ # ---------------------------------------------------------------------------
246
+
247
+ def _build_stereotype_map(root: ET.Element, ns: Dict[str, str]) -> Dict[str, str]:
248
+ """Build a mapping from xmi:id → stereotype name.
249
+
250
+ Cameo XMI exports stereotype applications as top-level elements whose tag
251
+ contains the stereotype name and whose ``base_Class`` (or similar
252
+ ``base_*``) attribute references the model element xmi:id.
253
+
254
+ Returns mapping ``{element_xmi_id: stereotype_name}``.
255
+ """
256
+ stereo_map: Dict[str, str] = {}
257
+
258
+ ns.get("sysml", "")
259
+ ns.get("md", "")
260
+
261
+ # Iterate top-level children of root looking for stereotype applications
262
+ for child in root:
263
+ tag = child.tag
264
+ # Strip namespace to get local name
265
+ if "}" in tag:
266
+ local = tag.split("}", 1)[1]
267
+ else:
268
+ local = tag
269
+
270
+ # Common SysML stereotypes in Cameo exports
271
+ local.lower()
272
+ target_xmi_id: Optional[str] = None
273
+
274
+ # Look for base_Class, base_NamedElement, base_Abstraction, etc.
275
+ for attr_name, attr_val in child.attrib.items():
276
+ clean_attr = attr_name
277
+ if "}" in clean_attr:
278
+ clean_attr = clean_attr.split("}", 1)[1]
279
+ if clean_attr.startswith("base_"):
280
+ target_xmi_id = attr_val
281
+ break
282
+
283
+ if target_xmi_id:
284
+ stereo_map[target_xmi_id] = local
285
+
286
+ return stereo_map
287
+
288
+
289
+ # ---------------------------------------------------------------------------
290
+ # Element extraction functions
291
+ # ---------------------------------------------------------------------------
292
+
293
+ def _extract_blocks(root: ET.Element, ns: Dict[str, str]) -> List[Dict[str, Any]]:
294
+ """Extract <<Block>> stereotyped classes from XMI.
295
+
296
+ Looks for ``packagedElement`` nodes with ``xmi:type="uml:Class"`` and
297
+ matches them against the stereotype map for 'Block'.
298
+ """
299
+ stereo_map = _build_stereotype_map(root, ns)
300
+ blocks: List[Dict[str, Any]] = []
301
+
302
+ for elem in root.iter("packagedElement"):
303
+ xmi_t = _xmi_type(elem, ns)
304
+ if xmi_t not in ("uml:Class", "Class"):
305
+ continue
306
+ xid = _xmi_id(elem, ns)
307
+ if not xid:
308
+ continue
309
+
310
+ stereo = stereo_map.get(xid, "")
311
+ if stereo.lower() not in ("block", "sysml::block", "sysml::blocks::block"):
312
+ # Also accept if no explicit stereotype but tag hints at block
313
+ if stereo:
314
+ continue # Has a different stereotype
315
+
316
+ name = elem.get("name", "")
317
+ if not name:
318
+ continue
319
+
320
+ # Collect owned attributes (properties / value properties)
321
+ properties: List[Dict[str, str]] = []
322
+ for attr in elem.iter("ownedAttribute"):
323
+ prop_name = attr.get("name", "")
324
+ prop_type = _xmi_type(attr, ns) or ""
325
+ prop_id = _xmi_id(attr, ns) or ""
326
+ if prop_name:
327
+ properties.append({
328
+ "name": prop_name,
329
+ "type": prop_type,
330
+ "xmi_id": prop_id,
331
+ "visibility": attr.get("visibility", "public"),
332
+ })
333
+
334
+ # Collect ports
335
+ ports: List[Dict[str, str]] = []
336
+ for port in elem.iter("ownedPort"):
337
+ port_name = port.get("name", "")
338
+ port_id = _xmi_id(port, ns) or ""
339
+ if port_name or port_id:
340
+ ports.append({
341
+ "name": port_name,
342
+ "xmi_id": port_id,
343
+ "type": _xmi_type(port, ns) or "port",
344
+ })
345
+
346
+ blocks.append({
347
+ "id": _new_id(),
348
+ "xmi_id": xid,
349
+ "element_type": "block",
350
+ "name": name,
351
+ "qualified_name": _qualified_name(elem, root),
352
+ "stereotype": stereo or "Block",
353
+ "description": _get_description(elem, ns),
354
+ "properties": json.dumps({
355
+ "attributes": properties,
356
+ "ports": ports,
357
+ }),
358
+ "diagram_type": "bdd",
359
+ })
360
+
361
+ return blocks
362
+
363
+
364
+ def _extract_interface_blocks(root: ET.Element, ns: Dict[str, str]) -> List[Dict[str, Any]]:
365
+ """Extract <<InterfaceBlock>> stereotyped classes from XMI."""
366
+ stereo_map = _build_stereotype_map(root, ns)
367
+ iblocks: List[Dict[str, Any]] = []
368
+
369
+ for elem in root.iter("packagedElement"):
370
+ xmi_t = _xmi_type(elem, ns)
371
+ if xmi_t not in ("uml:Class", "Class", "uml:Interface", "Interface"):
372
+ continue
373
+ xid = _xmi_id(elem, ns)
374
+ if not xid:
375
+ continue
376
+
377
+ stereo = stereo_map.get(xid, "")
378
+ if "interfaceblock" not in stereo.lower() and "interface_block" not in stereo.lower():
379
+ continue
380
+
381
+ name = elem.get("name", "")
382
+ if not name:
383
+ continue
384
+
385
+ # Collect flow properties
386
+ flow_props: List[Dict[str, str]] = []
387
+ for attr in elem.iter("ownedAttribute"):
388
+ prop_name = attr.get("name", "")
389
+ if prop_name:
390
+ flow_props.append({
391
+ "name": prop_name,
392
+ "type": _xmi_type(attr, ns) or "",
393
+ "xmi_id": _xmi_id(attr, ns) or "",
394
+ "direction": attr.get("direction", "inout"),
395
+ })
396
+
397
+ iblocks.append({
398
+ "id": _new_id(),
399
+ "xmi_id": xid,
400
+ "element_type": "interface_block",
401
+ "name": name,
402
+ "qualified_name": _qualified_name(elem, root),
403
+ "stereotype": stereo or "InterfaceBlock",
404
+ "description": _get_description(elem, ns),
405
+ "properties": json.dumps({"flow_properties": flow_props}),
406
+ "diagram_type": "bdd",
407
+ })
408
+
409
+ return iblocks
410
+
411
+
412
+ def _extract_activities(root: ET.Element, ns: Dict[str, str]) -> List[Dict[str, Any]]:
413
+ """Extract Activity elements with actions, control flows, and object flows."""
414
+ activities: List[Dict[str, Any]] = []
415
+
416
+ for elem in root.iter("packagedElement"):
417
+ xmi_t = _xmi_type(elem, ns)
418
+ if xmi_t not in ("uml:Activity", "Activity"):
419
+ continue
420
+ xid = _xmi_id(elem, ns)
421
+ if not xid:
422
+ continue
423
+
424
+ name = elem.get("name", "")
425
+ if not name:
426
+ name = f"Activity_{xid[:8]}"
427
+
428
+ # Collect actions
429
+ actions: List[Dict[str, str]] = []
430
+ for node_tag in ("node", "ownedNode", "group"):
431
+ for node in elem.iter(node_tag):
432
+ node_type = _xmi_type(node, ns) or ""
433
+ node_name = node.get("name", "")
434
+ node_id = _xmi_id(node, ns) or ""
435
+ if node_name or node_id:
436
+ actions.append({
437
+ "name": node_name,
438
+ "type": node_type,
439
+ "xmi_id": node_id,
440
+ })
441
+
442
+ # Also look for OpaqueAction, CallBehaviorAction, etc.
443
+ for action_tag in ("ownedAction",):
444
+ for act in elem.iter(action_tag):
445
+ actions.append({
446
+ "name": act.get("name", ""),
447
+ "type": _xmi_type(act, ns) or "action",
448
+ "xmi_id": _xmi_id(act, ns) or "",
449
+ })
450
+
451
+ # Collect edges (control flow / object flow)
452
+ control_flows: List[Dict[str, str]] = []
453
+ object_flows: List[Dict[str, str]] = []
454
+ for edge_tag in ("edge", "ownedEdge"):
455
+ for edge in elem.iter(edge_tag):
456
+ edge_type = _xmi_type(edge, ns) or ""
457
+ edge_data = {
458
+ "name": edge.get("name", ""),
459
+ "xmi_id": _xmi_id(edge, ns) or "",
460
+ "source": edge.get("source", ""),
461
+ "target": edge.get("target", ""),
462
+ }
463
+ if "ObjectFlow" in edge_type:
464
+ object_flows.append(edge_data)
465
+ else:
466
+ control_flows.append(edge_data)
467
+
468
+ activities.append({
469
+ "id": _new_id(),
470
+ "xmi_id": xid,
471
+ "element_type": "activity",
472
+ "name": name,
473
+ "qualified_name": _qualified_name(elem, root),
474
+ "stereotype": "",
475
+ "description": _get_description(elem, ns),
476
+ "properties": json.dumps({
477
+ "actions": actions,
478
+ "control_flows": control_flows,
479
+ "object_flows": object_flows,
480
+ }),
481
+ "diagram_type": "act",
482
+ })
483
+
484
+ return activities
485
+
486
+
487
+ def _extract_requirements(root: ET.Element, ns: Dict[str, str]) -> List[Dict[str, Any]]:
488
+ """Extract <<Requirement>> stereotyped elements with text and ID.
489
+
490
+ SysML requirements may appear as stereotyped uml:Class elements or as
491
+ dedicated ``Requirement`` elements under the SysML namespace.
492
+ """
493
+ stereo_map = _build_stereotype_map(root, ns)
494
+ requirements: List[Dict[str, Any]] = []
495
+
496
+ # Strategy 1: stereotyped classes
497
+ for elem in root.iter("packagedElement"):
498
+ xmi_t = _xmi_type(elem, ns)
499
+ if xmi_t not in ("uml:Class", "Class"):
500
+ continue
501
+ xid = _xmi_id(elem, ns)
502
+ if not xid:
503
+ continue
504
+
505
+ stereo = stereo_map.get(xid, "")
506
+ if "requirement" not in stereo.lower():
507
+ continue
508
+
509
+ name = elem.get("name", "")
510
+ req_id = ""
511
+ req_text = ""
512
+
513
+ # Requirement ID and text may be in the stereotype application
514
+ for child in root:
515
+ tag_local = child.tag.split("}", 1)[-1] if "}" in child.tag else child.tag
516
+ if "requirement" not in tag_local.lower():
517
+ continue
518
+ for attr_name, attr_val in child.attrib.items():
519
+ clean = attr_name.split("}", 1)[-1] if "}" in attr_name else attr_name
520
+ if clean.startswith("base_") and attr_val == xid:
521
+ req_id = child.get("id", child.get("Id", ""))
522
+ req_text = child.get("text", child.get("Text", ""))
523
+ break
524
+
525
+ if not req_text:
526
+ req_text = _get_description(elem, ns)
527
+
528
+ requirements.append({
529
+ "id": _new_id(),
530
+ "xmi_id": xid,
531
+ "element_type": "requirement",
532
+ "name": name or f"REQ-{xid[:8]}",
533
+ "qualified_name": _qualified_name(elem, root),
534
+ "stereotype": stereo or "Requirement",
535
+ "description": req_text,
536
+ "properties": json.dumps({
537
+ "requirement_id": req_id,
538
+ "text": req_text,
539
+ }),
540
+ "diagram_type": "req",
541
+ })
542
+
543
+ # Strategy 2: SysML namespace Requirement elements
544
+ sysml_uri = ns.get("sysml", "")
545
+ if sysml_uri:
546
+ for elem in root.iter(f"{{{sysml_uri}}}Requirement"):
547
+ xid = _xmi_id(elem, ns) or elem.get("base_Class", "")
548
+ if not xid:
549
+ continue
550
+ # Avoid duplicates
551
+ if any(r["xmi_id"] == xid for r in requirements):
552
+ continue
553
+ name = elem.get("name", "")
554
+ req_id = elem.get("id", elem.get("Id", ""))
555
+ req_text = elem.get("text", elem.get("Text", ""))
556
+ requirements.append({
557
+ "id": _new_id(),
558
+ "xmi_id": xid,
559
+ "element_type": "requirement",
560
+ "name": name or f"REQ-{xid[:8]}",
561
+ "qualified_name": "",
562
+ "stereotype": "Requirement",
563
+ "description": req_text or "",
564
+ "properties": json.dumps({
565
+ "requirement_id": req_id,
566
+ "text": req_text or "",
567
+ }),
568
+ "diagram_type": "req",
569
+ })
570
+
571
+ return requirements
572
+
573
+
574
+ def _extract_state_machines(root: ET.Element, ns: Dict[str, str]) -> List[Dict[str, Any]]:
575
+ """Extract StateMachine elements with states and transitions."""
576
+ machines: List[Dict[str, Any]] = []
577
+
578
+ for elem in root.iter("packagedElement"):
579
+ xmi_t = _xmi_type(elem, ns)
580
+ if xmi_t not in ("uml:StateMachine", "StateMachine"):
581
+ continue
582
+ xid = _xmi_id(elem, ns)
583
+ if not xid:
584
+ continue
585
+
586
+ name = elem.get("name", "")
587
+ if not name:
588
+ name = f"StateMachine_{xid[:8]}"
589
+
590
+ # Collect states
591
+ states: List[Dict[str, str]] = []
592
+ for region in elem.iter("region"):
593
+ for subvertex_tag in ("subvertex", "ownedState"):
594
+ for state in region.iter(subvertex_tag):
595
+ state_type = _xmi_type(state, ns) or ""
596
+ state_name = state.get("name", "")
597
+ state_id = _xmi_id(state, ns) or ""
598
+ kind = state.get("kind", "")
599
+ if state_name or state_id:
600
+ states.append({
601
+ "name": state_name,
602
+ "type": state_type,
603
+ "xmi_id": state_id,
604
+ "kind": kind,
605
+ })
606
+ # Fallback: look for State elements directly under StateMachine
607
+ if not states:
608
+ for state in elem.iter("subvertex"):
609
+ states.append({
610
+ "name": state.get("name", ""),
611
+ "type": _xmi_type(state, ns) or "",
612
+ "xmi_id": _xmi_id(state, ns) or "",
613
+ "kind": state.get("kind", ""),
614
+ })
615
+
616
+ # Collect transitions
617
+ transitions: List[Dict[str, str]] = []
618
+ for region in elem.iter("region"):
619
+ for trans in region.iter("transition"):
620
+ transitions.append({
621
+ "name": trans.get("name", ""),
622
+ "xmi_id": _xmi_id(trans, ns) or "",
623
+ "source": trans.get("source", ""),
624
+ "target": trans.get("target", ""),
625
+ "guard": _get_guard_text(trans),
626
+ "trigger": _get_trigger_name(trans),
627
+ })
628
+ # Fallback
629
+ if not transitions:
630
+ for trans in elem.iter("transition"):
631
+ transitions.append({
632
+ "name": trans.get("name", ""),
633
+ "xmi_id": _xmi_id(trans, ns) or "",
634
+ "source": trans.get("source", ""),
635
+ "target": trans.get("target", ""),
636
+ "guard": _get_guard_text(trans),
637
+ "trigger": _get_trigger_name(trans),
638
+ })
639
+
640
+ machines.append({
641
+ "id": _new_id(),
642
+ "xmi_id": xid,
643
+ "element_type": "state_machine",
644
+ "name": name,
645
+ "qualified_name": _qualified_name(elem, root),
646
+ "stereotype": "",
647
+ "description": _get_description(elem, ns),
648
+ "properties": json.dumps({
649
+ "states": states,
650
+ "transitions": transitions,
651
+ }),
652
+ "diagram_type": "stm",
653
+ })
654
+
655
+ return machines
656
+
657
+
658
+ def _get_guard_text(transition: ET.Element) -> str:
659
+ """Extract guard condition text from a transition element."""
660
+ guard = transition.find("guard")
661
+ if guard is not None:
662
+ spec = guard.find("specification")
663
+ if spec is not None:
664
+ body = spec.get("body") or spec.get("value") or ""
665
+ if body:
666
+ return body
667
+ if spec.text:
668
+ return spec.text.strip()
669
+ body_attr = guard.get("body")
670
+ if body_attr:
671
+ return body_attr
672
+ return ""
673
+
674
+
675
+ def _get_trigger_name(transition: ET.Element) -> str:
676
+ """Extract trigger name from a transition element."""
677
+ for trigger in transition.iter("trigger"):
678
+ name = trigger.get("name", "")
679
+ if name:
680
+ return name
681
+ event = trigger.get("event", "")
682
+ if event:
683
+ return event
684
+ return ""
685
+
686
+
687
+ def _extract_use_cases(root: ET.Element, ns: Dict[str, str]) -> List[Dict[str, Any]]:
688
+ """Extract UseCase and Actor elements from XMI."""
689
+ use_cases: List[Dict[str, Any]] = []
690
+
691
+ for elem in root.iter("packagedElement"):
692
+ xmi_t = _xmi_type(elem, ns)
693
+ if xmi_t not in ("uml:UseCase", "UseCase", "uml:Actor", "Actor"):
694
+ continue
695
+ xid = _xmi_id(elem, ns)
696
+ if not xid:
697
+ continue
698
+
699
+ name = elem.get("name", "")
700
+ if not name:
701
+ continue
702
+
703
+ is_actor = "Actor" in (xmi_t or "")
704
+ element_type = "actor" if is_actor else "use_case"
705
+
706
+ # Collect extension points for use cases
707
+ ext_points: List[Dict[str, str]] = []
708
+ if not is_actor:
709
+ for ep in elem.iter("extensionPoint"):
710
+ ext_points.append({
711
+ "name": ep.get("name", ""),
712
+ "xmi_id": _xmi_id(ep, ns) or "",
713
+ })
714
+
715
+ # Collect included use cases
716
+ includes: List[str] = []
717
+ for inc in elem.iter("include"):
718
+ addition = inc.get("addition", "")
719
+ if addition:
720
+ includes.append(addition)
721
+
722
+ use_cases.append({
723
+ "id": _new_id(),
724
+ "xmi_id": xid,
725
+ "element_type": element_type,
726
+ "name": name,
727
+ "qualified_name": _qualified_name(elem, root),
728
+ "stereotype": "Actor" if is_actor else "",
729
+ "description": _get_description(elem, ns),
730
+ "properties": json.dumps({
731
+ "extension_points": ext_points,
732
+ "includes": includes,
733
+ }) if not is_actor else json.dumps({}),
734
+ "diagram_type": "uc",
735
+ })
736
+
737
+ return use_cases
738
+
739
+
740
+ # ---------------------------------------------------------------------------
741
+ # Relationship extraction
742
+ # ---------------------------------------------------------------------------
743
+
744
+ def _extract_relationships(root: ET.Element, ns: Dict[str, str]) -> List[Dict[str, Any]]:
745
+ """Extract all relationships from XMI.
746
+
747
+ Covers:
748
+ - Associations (including aggregation/composition)
749
+ - Generalizations
750
+ - Dependencies
751
+ - Realizations
752
+ - Usages
753
+ - SysML stereotype links: satisfy, derive, verify, refine, trace, allocate
754
+ """
755
+ relationships: List[Dict[str, Any]] = []
756
+
757
+ # --- Structural relationships inside packagedElements ---
758
+ for elem in root.iter("packagedElement"):
759
+ xmi_t = _xmi_type(elem, ns)
760
+
761
+ # Associations
762
+ if xmi_t in ("uml:Association", "Association"):
763
+ _parse_association(elem, ns, relationships)
764
+
765
+ # Dependencies
766
+ elif xmi_t in ("uml:Dependency", "Dependency"):
767
+ _parse_simple_rel(elem, ns, "dependency", relationships)
768
+
769
+ # Realizations
770
+ elif xmi_t in ("uml:Realization", "Realization",
771
+ "uml:InterfaceRealization", "InterfaceRealization"):
772
+ _parse_simple_rel(elem, ns, "realization", relationships)
773
+
774
+ # Usages
775
+ elif xmi_t in ("uml:Usage", "Usage"):
776
+ _parse_simple_rel(elem, ns, "usage", relationships)
777
+
778
+ # Abstractions (may carry SysML stereotypes like «satisfy»)
779
+ elif xmi_t in ("uml:Abstraction", "Abstraction"):
780
+ _parse_abstraction(elem, ns, root, relationships)
781
+
782
+ # --- Generalizations (nested inside classes) ---
783
+ for gen in root.iter("generalization"):
784
+ general = gen.get("general", "")
785
+ if not general:
786
+ # May be a child element
787
+ gen_ref = gen.find("general")
788
+ if gen_ref is not None:
789
+ general = gen_ref.get("href", "") or _xmi_id(gen_ref, ns) or ""
790
+ # Parent class xmi:id
791
+ parent = gen.getparent() if hasattr(gen, "getparent") else None
792
+ source_id = ""
793
+ if parent is not None:
794
+ source_id = _xmi_id(parent, ns) or ""
795
+ if not source_id:
796
+ # Walk up via parent map
797
+ parent_map = getattr(root, "_parent_map", None)
798
+ if parent_map is None:
799
+ parent_map = {c: p for p in root.iter() for c in p}
800
+ root._parent_map = parent_map # type: ignore[attr-defined]
801
+ p = parent_map.get(gen)
802
+ if p is not None:
803
+ source_id = _xmi_id(p, ns) or ""
804
+
805
+ if source_id and general:
806
+ relationships.append({
807
+ "source_xmi_id": source_id,
808
+ "target_xmi_id": general,
809
+ "relationship_type": "generalization",
810
+ "name": gen.get("name", ""),
811
+ "properties": json.dumps({}),
812
+ })
813
+
814
+ # --- SysML stereotype relationships (top-level in profile application) ---
815
+ _parse_sysml_stereo_rels(root, ns, relationships)
816
+
817
+ return relationships
818
+
819
+
820
+ def _parse_association(elem: ET.Element, ns: Dict[str, str],
821
+ rels: List[Dict[str, Any]]) -> None:
822
+ """Parse a UML Association into one or more relationship records."""
823
+ name = elem.get("name", "")
824
+ member_ends: List[str] = []
825
+ aggregation = ""
826
+
827
+ # memberEnd attribute (space-separated xmi:idrefs)
828
+ member_end_attr = elem.get("memberEnd", "")
829
+ if member_end_attr:
830
+ member_ends = member_end_attr.split()
831
+
832
+ # ownedEnd elements
833
+ owned_ends: List[ET.Element] = list(elem.iter("ownedEnd"))
834
+ for oe in owned_ends:
835
+ agg = oe.get("aggregation", "none")
836
+ if agg in ("composite", "shared"):
837
+ aggregation = agg
838
+
839
+ # Determine source and target from memberEnd / ownedEnd
840
+ source_id = ""
841
+ target_id = ""
842
+
843
+ if len(owned_ends) >= 2:
844
+ source_id = owned_ends[0].get("type", "") or _xmi_id(owned_ends[0], ns) or ""
845
+ target_id = owned_ends[1].get("type", "") or _xmi_id(owned_ends[1], ns) or ""
846
+ elif len(member_ends) >= 2:
847
+ source_id = member_ends[0]
848
+ target_id = member_ends[1]
849
+ elif len(owned_ends) == 1:
850
+ target_id = owned_ends[0].get("type", "") or _xmi_id(owned_ends[0], ns) or ""
851
+ if member_ends:
852
+ source_id = member_ends[0] if member_ends[0] != target_id else (
853
+ member_ends[1] if len(member_ends) > 1 else ""
854
+ )
855
+
856
+ if not source_id or not target_id:
857
+ return
858
+
859
+ if aggregation == "composite":
860
+ rel_type = "composition"
861
+ elif aggregation == "shared":
862
+ rel_type = "aggregation"
863
+ else:
864
+ rel_type = "association"
865
+
866
+ rels.append({
867
+ "source_xmi_id": source_id,
868
+ "target_xmi_id": target_id,
869
+ "relationship_type": rel_type,
870
+ "name": name,
871
+ "properties": json.dumps({"aggregation": aggregation}),
872
+ })
873
+
874
+
875
+ def _parse_simple_rel(elem: ET.Element, ns: Dict[str, str],
876
+ rel_type: str, rels: List[Dict[str, Any]]) -> None:
877
+ """Parse a simple directed relationship (Dependency, Realization, Usage)."""
878
+ name = elem.get("name", "")
879
+
880
+ # client → source, supplier → target
881
+ client = elem.get("client", "")
882
+ supplier = elem.get("supplier", "")
883
+
884
+ # May also be nested elements
885
+ if not client:
886
+ client_el = elem.find("client")
887
+ if client_el is not None:
888
+ client = client_el.get("href", "") or _xmi_id(client_el, ns) or ""
889
+ if not supplier:
890
+ supplier_el = elem.find("supplier")
891
+ if supplier_el is not None:
892
+ supplier = supplier_el.get("href", "") or _xmi_id(supplier_el, ns) or ""
893
+
894
+ if client and supplier:
895
+ rels.append({
896
+ "source_xmi_id": client,
897
+ "target_xmi_id": supplier,
898
+ "relationship_type": rel_type,
899
+ "name": name,
900
+ "properties": json.dumps({}),
901
+ })
902
+
903
+
904
+ def _parse_abstraction(elem: ET.Element, ns: Dict[str, str],
905
+ root: ET.Element, rels: List[Dict[str, Any]]) -> None:
906
+ """Parse a UML Abstraction, checking for SysML stereotype overlay."""
907
+ name = elem.get("name", "")
908
+ xid = _xmi_id(elem, ns)
909
+
910
+ client = elem.get("client", "")
911
+ supplier = elem.get("supplier", "")
912
+ if not client:
913
+ c = elem.find("client")
914
+ if c is not None:
915
+ client = c.get("href", "") or _xmi_id(c, ns) or ""
916
+ if not supplier:
917
+ s = elem.find("supplier")
918
+ if s is not None:
919
+ supplier = s.get("href", "") or _xmi_id(s, ns) or ""
920
+
921
+ if not client or not supplier:
922
+ return
923
+
924
+ # Check if a SysML stereotype (satisfy, derive, etc.) applies to this Abstraction
925
+ rel_type = "dependency"
926
+ if xid:
927
+ stereo_map = _build_stereotype_map(root, ns)
928
+ stereo = stereo_map.get(xid, "").lower()
929
+ for kw in SYSML_REL_STEREOTYPES:
930
+ if kw in stereo:
931
+ rel_type = kw
932
+ break
933
+
934
+ rels.append({
935
+ "source_xmi_id": client,
936
+ "target_xmi_id": supplier,
937
+ "relationship_type": rel_type,
938
+ "name": name,
939
+ "properties": json.dumps({}),
940
+ })
941
+
942
+
943
+ def _parse_sysml_stereo_rels(root: ET.Element, ns: Dict[str, str],
944
+ rels: List[Dict[str, Any]]) -> None:
945
+ """Parse SysML stereotype relationship applications at the top level.
946
+
947
+ Cameo exports «satisfy», «derive», «verify», «refine», «trace», «allocate»
948
+ as top-level elements under the SysML profile namespace. Each carries
949
+ ``base_Abstraction`` (or ``base_Dependency``) plus ``client``/``supplier``
950
+ attributes or nested sub-elements referencing the related model elements.
951
+ """
952
+ ns.get("sysml", "")
953
+
954
+ for child in root:
955
+ tag = child.tag
956
+ if "}" in tag:
957
+ local = tag.split("}", 1)[1]
958
+ else:
959
+ local = tag
960
+
961
+ local_lower = local.lower()
962
+ matched_type: Optional[str] = None
963
+ for kw in SYSML_REL_STEREOTYPES:
964
+ if kw == local_lower or local_lower.endswith(kw):
965
+ matched_type = kw
966
+ break
967
+
968
+ if not matched_type:
969
+ continue
970
+
971
+ # Resolve the Abstraction/Dependency this stereotype applies to
972
+ base_ref = ""
973
+ for attr_name, attr_val in child.attrib.items():
974
+ clean = attr_name.split("}", 1)[-1] if "}" in attr_name else attr_name
975
+ if clean.startswith("base_"):
976
+ base_ref = attr_val
977
+ break
978
+
979
+ # The actual source/target must come from the referenced Abstraction
980
+ # element, which we've already parsed. Mark this relationship type
981
+ # override so we can merge later.
982
+ if base_ref:
983
+ # Try to find matching dependency/abstraction already in rels
984
+ found = False
985
+ for r in rels:
986
+ if r.get("_base_xmi_id") == base_ref or r.get("source_xmi_id") == base_ref:
987
+ r["relationship_type"] = matched_type
988
+ found = True
989
+ break
990
+ if not found:
991
+ # Store as unresolved — will attempt resolution in _resolve step
992
+ rels.append({
993
+ "source_xmi_id": base_ref,
994
+ "target_xmi_id": "",
995
+ "relationship_type": matched_type,
996
+ "name": child.get("name", ""),
997
+ "properties": json.dumps({"base_ref": base_ref}),
998
+ "_unresolved": True,
999
+ })
1000
+
1001
+
1002
+ # ---------------------------------------------------------------------------
1003
+ # Cross-reference resolution
1004
+ # ---------------------------------------------------------------------------
1005
+
1006
+ def _resolve_xmi_refs(elements: List[Dict[str, Any]],
1007
+ relationships: List[Dict[str, Any]]) -> Tuple[
1008
+ List[Dict[str, Any]], List[Dict[str, Any]]]:
1009
+ """Resolve xmi:idref cross-references between elements.
1010
+
1011
+ Builds a lookup from xmi_id → generated id so that relationship
1012
+ source_element_id / target_element_id can be set correctly for DB
1013
+ insertion. Also resolves parent_id for nested elements.
1014
+
1015
+ Drops relationships whose source or target could not be resolved.
1016
+ """
1017
+ # Build xmi_id → element dict
1018
+ xmi_lookup: Dict[str, Dict[str, Any]] = {}
1019
+ for el in elements:
1020
+ xmi_lookup[el["xmi_id"]] = el
1021
+
1022
+ # Resolve parent_id (based on qualified_name nesting if present)
1023
+ for el in elements:
1024
+ qn = el.get("qualified_name", "")
1025
+ if "::" in qn:
1026
+ parent_qn = "::".join(qn.split("::")[:-1])
1027
+ for candidate in elements:
1028
+ if candidate.get("qualified_name", "") == parent_qn and candidate["id"] != el["id"]:
1029
+ el["parent_id"] = candidate["id"]
1030
+ break
1031
+
1032
+ # Resolve relationships
1033
+ resolved_rels: List[Dict[str, Any]] = []
1034
+ for rel in relationships:
1035
+ # Skip unresolved SysML stereo links with empty targets
1036
+ if rel.get("_unresolved") and not rel.get("target_xmi_id"):
1037
+ continue
1038
+
1039
+ src_xmi = rel.get("source_xmi_id", "")
1040
+ tgt_xmi = rel.get("target_xmi_id", "")
1041
+
1042
+ src_el = xmi_lookup.get(src_xmi)
1043
+ tgt_el = xmi_lookup.get(tgt_xmi)
1044
+
1045
+ if src_el and tgt_el:
1046
+ resolved_rels.append({
1047
+ "source_element_id": src_el["id"],
1048
+ "target_element_id": tgt_el["id"],
1049
+ "relationship_type": rel["relationship_type"],
1050
+ "name": rel.get("name", ""),
1051
+ "properties": rel.get("properties", "{}"),
1052
+ })
1053
+ # If only one side resolved, still keep with xmi_id as fallback
1054
+ elif src_el or tgt_el:
1055
+ resolved_rels.append({
1056
+ "source_element_id": src_el["id"] if src_el else src_xmi,
1057
+ "target_element_id": tgt_el["id"] if tgt_el else tgt_xmi,
1058
+ "relationship_type": rel["relationship_type"],
1059
+ "name": rel.get("name", ""),
1060
+ "properties": rel.get("properties", "{}"),
1061
+ })
1062
+
1063
+ # Clean internal keys from relationships
1064
+ for rel in resolved_rels:
1065
+ rel.pop("_unresolved", None)
1066
+ rel.pop("_base_xmi_id", None)
1067
+
1068
+ return elements, resolved_rels
1069
+
1070
+
1071
+ # ---------------------------------------------------------------------------
1072
+ # Validation
1073
+ # ---------------------------------------------------------------------------
1074
+
1075
+ def validate_xmi(file_path: str) -> Dict[str, Any]:
1076
+ """Validate XMI structure before import.
1077
+
1078
+ Returns::
1079
+
1080
+ {
1081
+ "valid": bool,
1082
+ "errors": [...],
1083
+ "namespaces": {...},
1084
+ "element_count": int,
1085
+ }
1086
+ """
1087
+ errors: List[str] = []
1088
+ namespaces: Dict[str, str] = {}
1089
+ element_count = 0
1090
+
1091
+ fpath = Path(file_path)
1092
+ if not fpath.exists():
1093
+ return {
1094
+ "valid": False,
1095
+ "errors": [f"File not found: {file_path}"],
1096
+ "namespaces": {},
1097
+ "element_count": 0,
1098
+ }
1099
+
1100
+ if fpath.suffix.lower() not in (".xmi", ".xml", ".uml"):
1101
+ errors.append(f"Unexpected file extension: {fpath.suffix} (expected .xmi, .xml, or .uml)")
1102
+
1103
+ # Attempt parse
1104
+ try:
1105
+ tree = ET.parse(str(fpath))
1106
+ root = tree.getroot()
1107
+ except ET.ParseError as exc:
1108
+ return {
1109
+ "valid": False,
1110
+ "errors": [f"XML parse error: {exc}"],
1111
+ "namespaces": {},
1112
+ "element_count": 0,
1113
+ }
1114
+
1115
+ # Detect namespaces
1116
+ namespaces = _detect_namespaces(root)
1117
+
1118
+ # Verify root element is XMI
1119
+ root_local = root.tag.split("}", 1)[-1] if "}" in root.tag else root.tag
1120
+ if root_local.upper() != "XMI" and root_local != "Model":
1121
+ errors.append(
1122
+ f"Root element is <{root_local}>, expected <xmi:XMI> or <XMI>. "
1123
+ "File may not be a valid XMI export."
1124
+ )
1125
+
1126
+ # Check for XMI version attribute
1127
+ xmi_version = None
1128
+ xmi_ns = namespaces.get("xmi", "")
1129
+ for attr_name in (f"{{{xmi_ns}}}version", "xmi:version", "version"):
1130
+ val = root.get(attr_name)
1131
+ if val:
1132
+ xmi_version = val
1133
+ break
1134
+ if not xmi_version:
1135
+ errors.append("Missing xmi:version attribute on root element.")
1136
+
1137
+ # Count packagedElements
1138
+ element_count = sum(1 for _ in root.iter("packagedElement"))
1139
+ if element_count == 0:
1140
+ errors.append("No <packagedElement> nodes found. File may be empty or use non-standard structure.")
1141
+
1142
+ # Check for at least one recognized UML type
1143
+ found_uml = False
1144
+ for pe in root.iter("packagedElement"):
1145
+ xmi_t = _xmi_type(pe, namespaces)
1146
+ if xmi_t and ("uml:" in str(xmi_t) or xmi_t in (
1147
+ "Class", "Activity", "StateMachine", "UseCase", "Actor",
1148
+ "Association", "Package", "Interface"
1149
+ )):
1150
+ found_uml = True
1151
+ break
1152
+ if not found_uml and element_count > 0:
1153
+ errors.append("No recognized UML-typed packagedElements found.")
1154
+
1155
+ return {
1156
+ "valid": len(errors) == 0,
1157
+ "errors": errors,
1158
+ "namespaces": namespaces,
1159
+ "element_count": element_count,
1160
+ }
1161
+
1162
+
1163
+ # ---------------------------------------------------------------------------
1164
+ # Full parse
1165
+ # ---------------------------------------------------------------------------
1166
+
1167
+ def parse_xmi(file_path: str) -> Dict[str, Any]:
1168
+ """Parse an XMI file and return structured data.
1169
+
1170
+ Returns::
1171
+
1172
+ {
1173
+ "elements": [...],
1174
+ "relationships": [...],
1175
+ "metadata": {
1176
+ "file": str,
1177
+ "file_hash": str,
1178
+ "namespaces": {...},
1179
+ "element_count": int,
1180
+ "relationship_count": int,
1181
+ "parsed_at": str,
1182
+ },
1183
+ }
1184
+ """
1185
+ fpath = Path(file_path)
1186
+ if not fpath.exists():
1187
+ raise FileNotFoundError(f"XMI file not found: {file_path}")
1188
+
1189
+ tree = ET.parse(str(fpath))
1190
+ root = tree.getroot()
1191
+ ns = _detect_namespaces(root)
1192
+ source_hash = _file_hash(file_path)
1193
+
1194
+ # Extract all element types
1195
+ elements: List[Dict[str, Any]] = []
1196
+ elements.extend(_extract_blocks(root, ns))
1197
+ elements.extend(_extract_interface_blocks(root, ns))
1198
+ elements.extend(_extract_activities(root, ns))
1199
+ elements.extend(_extract_requirements(root, ns))
1200
+ elements.extend(_extract_state_machines(root, ns))
1201
+ elements.extend(_extract_use_cases(root, ns))
1202
+
1203
+ # Tag every element with source info
1204
+ for el in elements:
1205
+ el["source_file"] = str(fpath.name)
1206
+ el["source_hash"] = source_hash
1207
+ el.setdefault("parent_id", None)
1208
+
1209
+ # Extract relationships
1210
+ relationships = _extract_relationships(root, ns)
1211
+
1212
+ # Tag every relationship with source info
1213
+ for rel in relationships:
1214
+ rel["source_file"] = str(fpath.name)
1215
+
1216
+ # Resolve cross-references
1217
+ elements, relationships = _resolve_xmi_refs(elements, relationships)
1218
+
1219
+ return {
1220
+ "elements": elements,
1221
+ "relationships": relationships,
1222
+ "metadata": {
1223
+ "file": str(fpath),
1224
+ "file_hash": source_hash,
1225
+ "namespaces": ns,
1226
+ "element_count": len(elements),
1227
+ "relationship_count": len(relationships),
1228
+ "parsed_at": _ts(),
1229
+ },
1230
+ }
1231
+
1232
+
1233
+ # ---------------------------------------------------------------------------
1234
+ # Database import
1235
+ # ---------------------------------------------------------------------------
1236
+
1237
+
1238
+ def import_xmi(project_id: str, file_path: str,
1239
+ db_path: str = None) -> Dict[str, Any]:
1240
+ """Full import pipeline: validate -> parse -> store in DB -> audit trail.
1241
+
1242
+ Steps:
1243
+ 1. Validate XMI structure
1244
+ 2. Compute file hash (SHA-256)
1245
+ 3. Parse all elements and relationships
1246
+ 4. Insert into sysml_elements and sysml_relationships tables
1247
+ 5. Record in model_imports table
1248
+ 6. Log audit trail event (xmi_imported)
1249
+ 7. Return summary
1250
+
1251
+ Returns::
1252
+
1253
+ {
1254
+ "import_id": int,
1255
+ "elements_imported": int,
1256
+ "relationships_imported": int,
1257
+ "errors": int,
1258
+ "status": str,
1259
+ }
1260
+ """
1261
+ timestamp = _ts()
1262
+ error_details: List[str] = []
1263
+
1264
+ # Step 1 — Validate
1265
+ validation = validate_xmi(file_path)
1266
+ if not validation["valid"]:
1267
+ # Record failed import
1268
+ try:
1269
+ conn = get_connection(db_path=db_path)
1270
+ c = conn.cursor()
1271
+ c.execute(
1272
+ """INSERT INTO model_imports
1273
+ (project_id, import_type, source_file, source_hash,
1274
+ elements_imported, relationships_imported, errors,
1275
+ error_details, status, imported_by, imported_at)
1276
+ VALUES (?, ?, ?, ?, 0, 0, ?, ?, 'failed', 'icdev-mbse-engine', ?)""",
1277
+ (
1278
+ project_id,
1279
+ "xmi",
1280
+ str(Path(file_path).name),
1281
+ "",
1282
+ len(validation["errors"]),
1283
+ json.dumps(validation["errors"]),
1284
+ timestamp,
1285
+ ),
1286
+ )
1287
+ conn.commit()
1288
+ import_id = c.lastrowid
1289
+ conn.close()
1290
+ except Exception:
1291
+ import_id = -1
1292
+
1293
+ return {
1294
+ "import_id": import_id,
1295
+ "elements_imported": 0,
1296
+ "relationships_imported": 0,
1297
+ "errors": len(validation["errors"]),
1298
+ "error_details": validation["errors"],
1299
+ "status": "failed",
1300
+ }
1301
+
1302
+ # Step 2–3 — Parse
1303
+ try:
1304
+ parsed = parse_xmi(file_path)
1305
+ except Exception as exc:
1306
+ return {
1307
+ "import_id": -1,
1308
+ "elements_imported": 0,
1309
+ "relationships_imported": 0,
1310
+ "errors": 1,
1311
+ "error_details": [f"Parse error: {exc}"],
1312
+ "status": "failed",
1313
+ }
1314
+
1315
+ elements = parsed["elements"]
1316
+ relationships = parsed["relationships"]
1317
+ source_hash = parsed["metadata"]["file_hash"]
1318
+ parsed["metadata"]["file"]
1319
+
1320
+ # Step 4 — Store in DB
1321
+ conn = get_connection(db_path=db_path)
1322
+ cursor = conn.cursor()
1323
+
1324
+ elements_inserted = 0
1325
+ rels_inserted = 0
1326
+
1327
+ # Insert elements
1328
+ for el in elements:
1329
+ try:
1330
+ cursor.execute(
1331
+ """INSERT OR REPLACE INTO sysml_elements
1332
+ (id, project_id, xmi_id, element_type, name, qualified_name,
1333
+ parent_id, stereotype, description, properties,
1334
+ diagram_type, source_file, source_hash, imported_at, updated_at)
1335
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
1336
+ (
1337
+ el["id"],
1338
+ project_id,
1339
+ el["xmi_id"],
1340
+ el["element_type"],
1341
+ el["name"],
1342
+ el.get("qualified_name", ""),
1343
+ el.get("parent_id"),
1344
+ el.get("stereotype", ""),
1345
+ el.get("description", ""),
1346
+ el.get("properties", "{}"),
1347
+ el.get("diagram_type"),
1348
+ el.get("source_file", ""),
1349
+ el.get("source_hash", source_hash),
1350
+ timestamp,
1351
+ timestamp,
1352
+ ),
1353
+ )
1354
+ elements_inserted += 1
1355
+ except sqlite3.Error as exc:
1356
+ error_details.append(f"Element '{el.get('name', '')}': {exc}")
1357
+
1358
+ # Insert relationships
1359
+ for rel in relationships:
1360
+ try:
1361
+ cursor.execute(
1362
+ """INSERT OR REPLACE INTO sysml_relationships
1363
+ (project_id, source_element_id, target_element_id,
1364
+ relationship_type, name, properties, source_file)
1365
+ VALUES (?, ?, ?, ?, ?, ?, ?)""",
1366
+ (
1367
+ project_id,
1368
+ rel["source_element_id"],
1369
+ rel["target_element_id"],
1370
+ rel["relationship_type"],
1371
+ rel.get("name", ""),
1372
+ rel.get("properties", "{}"),
1373
+ rel.get("source_file", str(Path(file_path).name)),
1374
+ ),
1375
+ )
1376
+ rels_inserted += 1
1377
+ except sqlite3.Error as exc:
1378
+ error_details.append(f"Relationship '{rel.get('name', '')}': {exc}")
1379
+
1380
+ # Step 5 — Record import
1381
+ status = "completed" if not error_details else "partial"
1382
+ cursor.execute(
1383
+ """INSERT INTO model_imports
1384
+ (project_id, import_type, source_file, source_hash,
1385
+ elements_imported, relationships_imported, errors,
1386
+ error_details, status, imported_by, imported_at)
1387
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'icdev-mbse-engine', ?)""",
1388
+ (
1389
+ project_id,
1390
+ "xmi",
1391
+ str(Path(file_path).name),
1392
+ source_hash,
1393
+ elements_inserted,
1394
+ rels_inserted,
1395
+ len(error_details),
1396
+ json.dumps(error_details) if error_details else None,
1397
+ status,
1398
+ timestamp,
1399
+ ),
1400
+ )
1401
+ import_id = cursor.lastrowid
1402
+
1403
+ conn.commit()
1404
+ conn.close()
1405
+
1406
+ # Step 6 — Audit trail
1407
+ if _HAS_AUDIT:
1408
+ try:
1409
+ log_event(
1410
+ event_type="xmi_imported",
1411
+ actor="icdev-mbse-engine",
1412
+ action=f"Imported XMI file '{Path(file_path).name}' for project {project_id}",
1413
+ project_id=project_id,
1414
+ details={
1415
+ "import_id": import_id,
1416
+ "elements_imported": elements_inserted,
1417
+ "relationships_imported": rels_inserted,
1418
+ "errors": len(error_details),
1419
+ "source_hash": source_hash,
1420
+ "status": status,
1421
+ },
1422
+ affected_files=[str(file_path)],
1423
+ classification="CUI",
1424
+ db_path=Path(db_path) if db_path else None,
1425
+ )
1426
+ except Exception:
1427
+ pass # Audit failure should not block import
1428
+
1429
+ # Step 7 — Return summary
1430
+ return {
1431
+ "import_id": import_id,
1432
+ "elements_imported": elements_inserted,
1433
+ "relationships_imported": rels_inserted,
1434
+ "errors": len(error_details),
1435
+ "error_details": error_details if error_details else [],
1436
+ "status": status,
1437
+ }
1438
+
1439
+
1440
+ # ---------------------------------------------------------------------------
1441
+ # Import summary
1442
+ # ---------------------------------------------------------------------------
1443
+
1444
+ def get_import_summary(import_id: int, db_path: str = None) -> Dict[str, Any]:
1445
+ """Return import details from the model_imports table.
1446
+
1447
+ Returns the full row as a dict, or an error dict if not found.
1448
+ """
1449
+ conn = get_connection(db_path=db_path)
1450
+ row = conn.execute(
1451
+ "SELECT * FROM model_imports WHERE id = ?", (import_id,)
1452
+ ).fetchone()
1453
+ conn.close()
1454
+
1455
+ if not row:
1456
+ return {"error": f"Import #{import_id} not found.", "import_id": import_id}
1457
+
1458
+ result = dict(row)
1459
+ # Parse JSON fields for convenience
1460
+ if result.get("error_details"):
1461
+ try:
1462
+ result["error_details"] = json.loads(result["error_details"])
1463
+ except (json.JSONDecodeError, TypeError):
1464
+ pass
1465
+
1466
+ return result
1467
+
1468
+
1469
+ # ---------------------------------------------------------------------------
1470
+ # CLI entry point
1471
+ # ---------------------------------------------------------------------------
1472
+
1473
+ def main() -> None:
1474
+ """Command-line interface for XMI parsing and import."""
1475
+ parser = argparse.ArgumentParser(
1476
+ description="Import SysML XMI from Cameo Systems Modeler"
1477
+ )
1478
+ parser.add_argument(
1479
+ "--project-id", required=True,
1480
+ help="ICDEV project identifier (e.g. proj-123)",
1481
+ )
1482
+ parser.add_argument(
1483
+ "--file", required=True,
1484
+ help="Path to XMI file exported from Cameo/MagicDraw",
1485
+ )
1486
+ parser.add_argument(
1487
+ "--validate-only", action="store_true",
1488
+ help="Validate XMI structure without importing",
1489
+ )
1490
+ parser.add_argument(
1491
+ "--json", action="store_true", dest="json_output",
1492
+ help="Output results as JSON",
1493
+ )
1494
+ parser.add_argument(
1495
+ "--db-path", type=Path, default=None,
1496
+ help="Override database path (default: data/icdev.db)",
1497
+ )
1498
+ args = parser.parse_args()
1499
+
1500
+ file_path = str(Path(args.file).resolve())
1501
+
1502
+ # ---- Validate-only mode ----
1503
+ if args.validate_only:
1504
+ result = validate_xmi(file_path)
1505
+ if args.json_output:
1506
+ print("CUI // SP-CTI")
1507
+ print(json.dumps(result, indent=2))
1508
+ print("CUI // SP-CTI")
1509
+ else:
1510
+ print("CUI // SP-CTI")
1511
+ print(f"XMI Validation: {'PASS' if result['valid'] else 'FAIL'}")
1512
+ print(f" File: {file_path}")
1513
+ print(f" Elements: {result['element_count']}")
1514
+ print(f" Namespaces: {len(result['namespaces'])}")
1515
+ for key, uri in result["namespaces"].items():
1516
+ print(f" {key}: {uri}")
1517
+ if result["errors"]:
1518
+ print(f" Errors ({len(result['errors'])}):")
1519
+ for err in result["errors"]:
1520
+ print(f" - {err}")
1521
+ print("CUI // SP-CTI")
1522
+ sys.exit(0 if result["valid"] else 1)
1523
+
1524
+ # ---- Full import mode ----
1525
+ db_path_str = str(args.db_path) if args.db_path else None
1526
+
1527
+ result = import_xmi(
1528
+ project_id=args.project_id,
1529
+ file_path=file_path,
1530
+ db_path=db_path_str,
1531
+ )
1532
+
1533
+ if args.json_output:
1534
+ print("CUI // SP-CTI")
1535
+ print(json.dumps(result, indent=2))
1536
+ print("CUI // SP-CTI")
1537
+ else:
1538
+ print("CUI // SP-CTI")
1539
+ print(f"XMI Import {'Complete' if result['status'] in ('completed', 'partial') else 'Failed'}")
1540
+ print(f" Project: {args.project_id}")
1541
+ print(f" File: {Path(file_path).name}")
1542
+ print(f" Import ID: {result['import_id']}")
1543
+ print(f" Elements: {result['elements_imported']}")
1544
+ print(f" Relationships: {result['relationships_imported']}")
1545
+ print(f" Errors: {result['errors']}")
1546
+ print(f" Status: {result['status']}")
1547
+ if result.get("error_details"):
1548
+ print(" Error Details:")
1549
+ for err in result["error_details"]:
1550
+ print(f" - {err}")
1551
+ print("CUI // SP-CTI")
1552
+
1553
+ sys.exit(0 if result["status"] in ("completed", "partial") else 1)
1554
+
1555
+
1556
+ if __name__ == "__main__":
1557
+ main()
1558
+ # [TEMPLATE: CUI // SP-CTI]