icdev 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1105) hide show
  1. icdev/__init__.py +18 -0
  2. icdev/_paths.py +85 -0
  3. icdev/_version.py +3 -0
  4. icdev/data/__init__.py +1 -0
  5. icdev/data/args/__init__.py +1 -0
  6. icdev/data/args/agent_authority.yaml +61 -0
  7. icdev/data/args/agent_config.yaml +355 -0
  8. icdev/data/args/agentic_fitness.yaml +31 -0
  9. icdev/data/args/ai_governance_config.yaml +137 -0
  10. icdev/data/args/atlas_critique_config.yaml +66 -0
  11. icdev/data/args/bedrock_models.yaml +63 -0
  12. icdev/data/args/cicd_config.yaml +82 -0
  13. icdev/data/args/classification_config.yaml +232 -0
  14. icdev/data/args/cli_config.yaml +154 -0
  15. icdev/data/args/cloud_config.yaml +63 -0
  16. icdev/data/args/code_pattern_config.yaml +151 -0
  17. icdev/data/args/code_quality_config.yaml +47 -0
  18. icdev/data/args/companion_registry.yaml +202 -0
  19. icdev/data/args/context_config.yaml +82 -0
  20. icdev/data/args/csp_monitor_config.yaml +268 -0
  21. icdev/data/args/cui_markings.yaml +35 -0
  22. icdev/data/args/db_config.yaml +40 -0
  23. icdev/data/args/deployment_profiles.yaml +248 -0
  24. icdev/data/args/dev_profile_config.yaml +144 -0
  25. icdev/data/args/devsecops_config.yaml +286 -0
  26. icdev/data/args/endpoint_security_config.yaml +137 -0
  27. icdev/data/args/extension_config.yaml +79 -0
  28. icdev/data/args/file_access_tiers.yaml +88 -0
  29. icdev/data/args/framework_registry.yaml +415 -0
  30. icdev/data/args/innovation_config.yaml +431 -0
  31. icdev/data/args/installation_manifest.yaml +1087 -0
  32. icdev/data/args/llm_config.yaml +495 -0
  33. icdev/data/args/maintenance_config.yaml +55 -0
  34. icdev/data/args/memory_config.yaml +83 -0
  35. icdev/data/args/monitoring_config.yaml +127 -0
  36. icdev/data/args/mosa_config.yaml +190 -0
  37. icdev/data/args/nlq_config.yaml +35 -0
  38. icdev/data/args/observability_config.yaml +39 -0
  39. icdev/data/args/observability_tracing_config.yaml +170 -0
  40. icdev/data/args/oscal_tools_config.yaml +43 -0
  41. icdev/data/args/owasp_agentic_config.yaml +171 -0
  42. icdev/data/args/phase_registry.yaml +618 -0
  43. icdev/data/args/project_defaults.yaml +235 -0
  44. icdev/data/args/prompt_chains.yaml +163 -0
  45. icdev/data/args/resilience_config.yaml +50 -0
  46. icdev/data/args/ricoas_config.yaml +191 -0
  47. icdev/data/args/role_personas.yaml +362 -0
  48. icdev/data/args/scaling_config.yaml +176 -0
  49. icdev/data/args/security_gates.yaml +685 -0
  50. icdev/data/args/skill_injection_config.yaml +322 -0
  51. icdev/data/args/spec_config.yaml +53 -0
  52. icdev/data/args/supply_chain_config.yaml +76 -0
  53. icdev/data/args/translation_config.yaml +228 -0
  54. icdev/data/args/workflow_templates/ato_acceleration.yaml +54 -0
  55. icdev/data/args/workflow_templates/build_deploy.yaml +63 -0
  56. icdev/data/args/workflow_templates/full_compliance.yaml +43 -0
  57. icdev/data/args/workflow_templates/security_hardening.yaml +55 -0
  58. icdev/data/args/worktree_config.yaml +34 -0
  59. icdev/data/args/zta_config.yaml +247 -0
  60. icdev/data/context/__init__.py +1 -0
  61. icdev/data/context/agent/__init__.py +1 -0
  62. icdev/data/context/agent/response_schemas/__init__.py +1 -0
  63. icdev/data/context/agent/response_schemas/debate_position.json +46 -0
  64. icdev/data/context/agent/response_schemas/fitness_scorecard.json +74 -0
  65. icdev/data/context/agent/response_schemas/review_decision.json +39 -0
  66. icdev/data/context/agent/response_schemas/task_decomposition.json +82 -0
  67. icdev/data/context/agent/response_schemas/veto_decision.json +40 -0
  68. icdev/data/context/agentic/__init__.py +1 -0
  69. icdev/data/context/agentic/architecture_patterns.md +269 -0
  70. icdev/data/context/agentic/capability_registry.yaml +202 -0
  71. icdev/data/context/agentic/csp_mcp_registry.yaml +280 -0
  72. icdev/data/context/agentic/fitness_rubric.md +56 -0
  73. icdev/data/context/agentic/governance_baseline.md +205 -0
  74. icdev/data/context/ci/__init__.py +1 -0
  75. icdev/data/context/ci/worktree_templates.json +44 -0
  76. icdev/data/context/cloud/__init__.py +1 -0
  77. icdev/data/context/cloud/csp_service_registry.json +739 -0
  78. icdev/data/context/compliance/__init__.py +1 -0
  79. icdev/data/context/compliance/atlas_mitigations.json +293 -0
  80. icdev/data/context/compliance/atlas_techniques.json +833 -0
  81. icdev/data/context/compliance/cisa_sbd_requirements.json +432 -0
  82. icdev/data/context/compliance/cjis_security_policy.json +522 -0
  83. icdev/data/context/compliance/cmmc_practices.json +2494 -0
  84. icdev/data/context/compliance/cmmc_report_template.md +142 -0
  85. icdev/data/context/compliance/cnssi_1253_overlay.json +109 -0
  86. icdev/data/context/compliance/control_crosswalk.json +1914 -0
  87. icdev/data/context/compliance/control_families/__init__.py +1 -0
  88. icdev/data/context/compliance/csp_certifications.json +251 -0
  89. icdev/data/context/compliance/cssp_report_template.md +193 -0
  90. icdev/data/context/compliance/cui_templates/__init__.py +1 -0
  91. icdev/data/context/compliance/cui_templates/banner_block.txt +4 -0
  92. icdev/data/context/compliance/cui_templates/code_header.txt +8 -0
  93. icdev/data/context/compliance/cui_templates/document_template.md +35 -0
  94. icdev/data/context/compliance/data_type_framework_map.json +321 -0
  95. icdev/data/context/compliance/data_type_registry.json +147 -0
  96. icdev/data/context/compliance/dod_cssp_8530.json +463 -0
  97. icdev/data/context/compliance/eu_ai_act_annex_iii.json +108 -0
  98. icdev/data/context/compliance/export_templates/__init__.py +1 -0
  99. icdev/data/context/compliance/export_templates/emass_controls.csv.j2 +4 -0
  100. icdev/data/context/compliance/export_templates/evidence_package.md.j2 +39 -0
  101. icdev/data/context/compliance/export_templates/executive_summary.md.j2 +55 -0
  102. icdev/data/context/compliance/export_templates/poam_tracking.csv.j2 +4 -0
  103. icdev/data/context/compliance/fedramp_20x_ksi_schemas.json +133 -0
  104. icdev/data/context/compliance/fedramp_high_baseline.json +4370 -0
  105. icdev/data/context/compliance/fedramp_moderate_baseline.json +2183 -0
  106. icdev/data/context/compliance/fedramp_report_template.md +181 -0
  107. icdev/data/context/compliance/fips_200_areas.json +362 -0
  108. icdev/data/context/compliance/gao_ai_accountability.json +262 -0
  109. icdev/data/context/compliance/hipaa_security_rule.json +720 -0
  110. icdev/data/context/compliance/hitrust_csf_v11.json +930 -0
  111. icdev/data/context/compliance/impact_level_profiles.json +251 -0
  112. icdev/data/context/compliance/incident_response_template.md +1110 -0
  113. icdev/data/context/compliance/iso27001_2022_controls.json +750 -0
  114. icdev/data/context/compliance/iso27001_nist_bridge.json +382 -0
  115. icdev/data/context/compliance/iso42001_controls.json +254 -0
  116. icdev/data/context/compliance/ivv_checklist_template.md +80 -0
  117. icdev/data/context/compliance/ivv_report_template.md +116 -0
  118. icdev/data/context/compliance/ivv_requirements.json +372 -0
  119. icdev/data/context/compliance/mosa_crosswalk.json +327 -0
  120. icdev/data/context/compliance/mosa_framework.json +250 -0
  121. icdev/data/context/compliance/narrative_templates/AC.md.j2 +101 -0
  122. icdev/data/context/compliance/narrative_templates/AU.md.j2 +106 -0
  123. icdev/data/context/compliance/narrative_templates/IA.md.j2 +104 -0
  124. icdev/data/context/compliance/narrative_templates/SC.md.j2 +102 -0
  125. icdev/data/context/compliance/narrative_templates/SI.md.j2 +111 -0
  126. icdev/data/context/compliance/narrative_templates/__init__.py +1 -0
  127. icdev/data/context/compliance/narrative_templates/default.md.j2 +50 -0
  128. icdev/data/context/compliance/narrative_templates/executive_summary.j2 +27 -0
  129. icdev/data/context/compliance/narrative_templates/poam_milestone.j2 +19 -0
  130. icdev/data/context/compliance/narrative_templates/ssp_section.j2 +11 -0
  131. icdev/data/context/compliance/nist_800_171_controls.json +1552 -0
  132. icdev/data/context/compliance/nist_800_207_crosswalk.json +399 -0
  133. icdev/data/context/compliance/nist_800_207_zta.json +258 -0
  134. icdev/data/context/compliance/nist_800_53.json +324 -0
  135. icdev/data/context/compliance/nist_ai_600_1_genai.json +326 -0
  136. icdev/data/context/compliance/nist_ai_rmf.json +206 -0
  137. icdev/data/context/compliance/nist_sp_800_60_types.json +1667 -0
  138. icdev/data/context/compliance/omb_m25_21_high_impact_ai.json +248 -0
  139. icdev/data/context/compliance/omb_m26_04_unbiased_ai.json +262 -0
  140. icdev/data/context/compliance/owasp_agentic_asi.json +133 -0
  141. icdev/data/context/compliance/owasp_agentic_threats.json +285 -0
  142. icdev/data/context/compliance/owasp_llm_top10.json +274 -0
  143. icdev/data/context/compliance/pci_dss_v4.json +510 -0
  144. icdev/data/context/compliance/poam_template.md +117 -0
  145. icdev/data/context/compliance/safeai_controls.json +512 -0
  146. icdev/data/context/compliance/sbd_report_template.md +77 -0
  147. icdev/data/context/compliance/siem_config_templates/__init__.py +1 -0
  148. icdev/data/context/compliance/siem_config_templates/filebeat.yml +213 -0
  149. icdev/data/context/compliance/siem_config_templates/log_sources.json +208 -0
  150. icdev/data/context/compliance/soc2_trust_criteria.json +661 -0
  151. icdev/data/context/compliance/ssp_template.md +432 -0
  152. icdev/data/context/compliance/stig_templates/__init__.py +1 -0
  153. icdev/data/context/compliance/stig_templates/webapp_stig.json +139 -0
  154. icdev/data/context/compliance/xai_requirements.json +108 -0
  155. icdev/data/context/dashboard/__init__.py +1 -0
  156. icdev/data/context/dashboard/nlq_examples.json +50 -0
  157. icdev/data/context/dashboard/schema_descriptions.json +23 -0
  158. icdev/data/context/integration/__init__.py +1 -0
  159. icdev/data/context/integration/approval_workflows.json +32 -0
  160. icdev/data/context/integration/gitlab_field_mappings.json +33 -0
  161. icdev/data/context/integration/jira_field_mappings.json +32 -0
  162. icdev/data/context/integration/reqif_export_schema.json +23 -0
  163. icdev/data/context/integration/servicenow_field_mappings.json +22 -0
  164. icdev/data/context/languages/__init__.py +1 -0
  165. icdev/data/context/languages/framework_patterns.json +205 -0
  166. icdev/data/context/languages/language_registry.json +279 -0
  167. icdev/data/context/llm/__init__.py +1 -0
  168. icdev/data/context/llm/example_provider.py +86 -0
  169. icdev/data/context/mbse/__init__.py +1 -0
  170. icdev/data/context/mbse/des_report_template.md +162 -0
  171. icdev/data/context/mbse/des_requirements.json +411 -0
  172. icdev/data/context/mbse/digital_thread_patterns.json +403 -0
  173. icdev/data/context/mbse/reqif_schema.json +280 -0
  174. icdev/data/context/mbse/sysml_element_types.json +432 -0
  175. icdev/data/context/modernization/__init__.py +1 -0
  176. icdev/data/context/modernization/db_type_mappings.json +148 -0
  177. icdev/data/context/modernization/decomposition_patterns.json +284 -0
  178. icdev/data/context/modernization/framework_migration_patterns.json +359 -0
  179. icdev/data/context/modernization/migration_report_template.md +168 -0
  180. icdev/data/context/modernization/seven_rs_catalog.json +369 -0
  181. icdev/data/context/modernization/version_upgrade_rules.json +279 -0
  182. icdev/data/context/oscal/NIST_SP-800-53_rev5_catalog.json +254987 -0
  183. icdev/data/context/oscal/README.md +43 -0
  184. icdev/data/context/patterns/__init__.py +1 -0
  185. icdev/data/context/profiles/__init__.py +1 -0
  186. icdev/data/context/profiles/dod_baseline_v1.yaml +145 -0
  187. icdev/data/context/profiles/fedramp_baseline_v1.yaml +143 -0
  188. icdev/data/context/profiles/financial_baseline_v1.yaml +142 -0
  189. icdev/data/context/profiles/healthcare_baseline_v1.yaml +135 -0
  190. icdev/data/context/profiles/law_enforcement_v1.yaml +129 -0
  191. icdev/data/context/profiles/startup_v1.yaml +134 -0
  192. icdev/data/context/requirements/__init__.py +1 -0
  193. icdev/data/context/requirements/ambiguity_patterns.json +97 -0
  194. icdev/data/context/requirements/boundary_impact_rules.json +123 -0
  195. icdev/data/context/requirements/default_constitutions.json +67 -0
  196. icdev/data/context/requirements/document_extraction_rules.json +58 -0
  197. icdev/data/context/requirements/gap_patterns.json +108 -0
  198. icdev/data/context/requirements/readiness_rubric.json +78 -0
  199. icdev/data/context/requirements/red_alternative_patterns.json +210 -0
  200. icdev/data/context/requirements/safe_templates.json +72 -0
  201. icdev/data/context/requirements/spec_quality_checklist.json +122 -0
  202. icdev/data/context/simulation/__init__.py +1 -0
  203. icdev/data/context/simulation/architecture_patterns.json +36 -0
  204. icdev/data/context/simulation/coa_templates.json +38 -0
  205. icdev/data/context/simulation/cost_models.json +23 -0
  206. icdev/data/context/simulation/risk_categories.json +46 -0
  207. icdev/data/context/supply_chain/__init__.py +1 -0
  208. icdev/data/context/supply_chain/isa_templates.json +129 -0
  209. icdev/data/context/supply_chain/nist_800_161_controls.json +247 -0
  210. icdev/data/context/supply_chain/scrm_risk_matrix.json +147 -0
  211. icdev/data/context/templates/__init__.py +1 -0
  212. icdev/data/context/templates/ansible/__init__.py +1 -0
  213. icdev/data/context/templates/ansible/playbooks/__init__.py +1 -0
  214. icdev/data/context/templates/ansible/roles/__init__.py +1 -0
  215. icdev/data/context/templates/gitlab_ci/__init__.py +1 -0
  216. icdev/data/context/templates/grafana/__init__.py +1 -0
  217. icdev/data/context/templates/kubernetes/__init__.py +1 -0
  218. icdev/data/context/templates/project/__init__.py +1 -0
  219. icdev/data/context/templates/project/api/__init__.py +1 -0
  220. icdev/data/context/templates/project/cli/__init__.py +1 -0
  221. icdev/data/context/templates/project/data_pipeline/__init__.py +1 -0
  222. icdev/data/context/templates/project/iac/__init__.py +1 -0
  223. icdev/data/context/templates/project/javascript_frontend/__init__.py +1 -0
  224. icdev/data/context/templates/project/javascript_frontend/src/__init__.py +1 -0
  225. icdev/data/context/templates/project/javascript_frontend/tests/__init__.py +1 -0
  226. icdev/data/context/templates/project/microservice/__init__.py +1 -0
  227. icdev/data/context/templates/project/python_backend/__init__.py +1 -0
  228. icdev/data/context/templates/project/python_backend/src/__init__.py +1 -0
  229. icdev/data/context/templates/project/python_backend/tests/__init__.py +1 -0
  230. icdev/data/context/templates/project/python_backend/tests/features/__init__.py +1 -0
  231. icdev/data/context/templates/project/python_backend/tests/steps/__init__.py +1 -0
  232. icdev/data/context/templates/terraform/__init__.py +1 -0
  233. icdev/data/context/templates/terraform/govcloud_base/__init__.py +1 -0
  234. icdev/data/context/templates/terraform/modules/__init__.py +1 -0
  235. icdev/data/context/tone/__init__.py +1 -0
  236. icdev/data/context/translation/dependency_mappings.json +186 -0
  237. icdev/data/context/translation/type_mappings.json +149 -0
  238. icdev/data/docs/README.md +187 -0
  239. icdev/data/docs/__init__.py +1 -0
  240. icdev/data/docs/admin/gateway-guide.md +338 -0
  241. icdev/data/docs/admin/marketplace-guide.md +396 -0
  242. icdev/data/docs/admin/monitoring-guide.md +509 -0
  243. icdev/data/docs/architecture/compliance-framework.md +764 -0
  244. icdev/data/docs/architecture/database-schema.md +689 -0
  245. icdev/data/docs/architecture/gotcha-framework.md +518 -0
  246. icdev/data/docs/architecture/multi-agent-system.md +603 -0
  247. icdev/data/docs/dx/README.md +106 -0
  248. icdev/data/docs/dx/__init__.py +1 -0
  249. icdev/data/docs/dx/ci-cd-integration.md +378 -0
  250. icdev/data/docs/dx/claude-code-guide.md +213 -0
  251. icdev/data/docs/dx/companion-guide.md +232 -0
  252. icdev/data/docs/dx/dev-profiles.md +309 -0
  253. icdev/data/docs/dx/icdev-yaml-spec.md +219 -0
  254. icdev/data/docs/dx/integration-tiers.md +279 -0
  255. icdev/data/docs/dx/llm-routing-guide.md +456 -0
  256. icdev/data/docs/dx/quickstart.md +192 -0
  257. icdev/data/docs/dx/sdk-reference.md +356 -0
  258. icdev/data/docs/dx/unified-mcp-setup.md +525 -0
  259. icdev/data/docs/features/__init__.py +1 -0
  260. icdev/data/docs/features/phase-01-gotcha-framework.md +249 -0
  261. icdev/data/docs/features/phase-02-atlas-build-workflow.md +223 -0
  262. icdev/data/docs/features/phase-03-tdd-bdd-testing.md +261 -0
  263. icdev/data/docs/features/phase-04-nist-compliance.md +255 -0
  264. icdev/data/docs/features/phase-05-security-scanning.md +229 -0
  265. icdev/data/docs/features/phase-06-infrastructure-deployment.md +288 -0
  266. icdev/data/docs/features/phase-07-code-review-gates.md +276 -0
  267. icdev/data/docs/features/phase-08-self-healing.md +223 -0
  268. icdev/data/docs/features/phase-09-monitoring-observability.md +230 -0
  269. icdev/data/docs/features/phase-10-dashboard-web-ui.md +218 -0
  270. icdev/data/docs/features/phase-11-multi-agent-architecture.md +272 -0
  271. icdev/data/docs/features/phase-12-integration-testing.md +228 -0
  272. icdev/data/docs/features/phase-13-cicd-integration.md +257 -0
  273. icdev/data/docs/features/phase-14-secure-by-design-ivv.md +240 -0
  274. icdev/data/docs/features/phase-15-maintenance-audit.md +192 -0
  275. icdev/data/docs/features/phase-16-ato-acceleration.md +228 -0
  276. icdev/data/docs/features/phase-17-multi-framework-compliance.md +223 -0
  277. icdev/data/docs/features/phase-18-mbse-integration.md +242 -0
  278. icdev/data/docs/features/phase-19-agentic-generation.md +202 -0
  279. icdev/data/docs/features/phase-20-fips-security-categorization.md +198 -0
  280. icdev/data/docs/features/phase-21-saas-multi-tenancy.md +273 -0
  281. icdev/data/docs/features/phase-22-federated-gotcha-marketplace.md +242 -0
  282. icdev/data/docs/features/phase-23-universal-compliance-platform.md +238 -0
  283. icdev/data/docs/features/phase-24-devsecops-pipeline-security.md +198 -0
  284. icdev/data/docs/features/phase-25-zero-trust-architecture.md +220 -0
  285. icdev/data/docs/features/phase-26-dod-mosa.md +205 -0
  286. icdev/data/docs/features/phase-27-cli-capabilities.md +222 -0
  287. icdev/data/docs/features/phase-28-remote-command-gateway.md +235 -0
  288. icdev/data/docs/features/phase-29-proactive-monitoring.md +212 -0
  289. icdev/data/docs/features/phase-30-dashboard-auth.md +215 -0
  290. icdev/data/docs/features/phase-31-dashboard-ux-low-impact.md +188 -0
  291. icdev/data/docs/features/phase-32-dashboard-ux-medium-impact.md +223 -0
  292. icdev/data/docs/features/phase-33-modular-installation.md +218 -0
  293. icdev/data/docs/features/phase-34-dev-profiles.md +239 -0
  294. icdev/data/docs/features/phase-35-innovation-engine.md +257 -0
  295. icdev/data/docs/features/phase-36-evolutionary-intelligence.md +351 -0
  296. icdev/data/docs/features/phase-37-mitre-atlas-integration.md +485 -0
  297. icdev/data/docs/features/phase-38-cloud-agnostic-architecture.md +1033 -0
  298. icdev/data/docs/features/phase-39-observability-operations.md +178 -0
  299. icdev/data/docs/features/phase-40-nlq-compliance-queries.md +176 -0
  300. icdev/data/docs/features/phase-41-parallel-cicd.md +169 -0
  301. icdev/data/docs/features/phase-42-framework-planning.md +177 -0
  302. icdev/data/docs/features/phase-43-cross-language-translation.md +225 -0
  303. icdev/data/docs/features/phase-44-innovation-adaptation.md +227 -0
  304. icdev/data/docs/features/phase-45-owasp-agentic-security.md +239 -0
  305. icdev/data/docs/features/phase-46-observability-traceability-xai.md +240 -0
  306. icdev/data/docs/features/phase-47-unified-mcp-gateway.md +257 -0
  307. icdev/data/docs/features/phase-48-ai-transparency.md +203 -0
  308. icdev/data/docs/features/phase-49-ai-accountability.md +243 -0
  309. icdev/data/docs/features/phase-50-ai-governance-intake-chat.md +195 -0
  310. icdev/data/docs/features/phase-51-unified-chat-dashboard.md +240 -0
  311. icdev/data/docs/features/phase-52-code-intelligence.md +244 -0
  312. icdev/data/docs/features/phase-53-fedramp-20x-owasp-asi.md +359 -0
  313. icdev/data/docs/features/phase-54-slsa-swft-orchestration.md +379 -0
  314. icdev/data/docs/features/phase-55-a2a-v03-mcp-oauth.md +322 -0
  315. icdev/data/docs/features/phase-56-evidence-lineage.md +352 -0
  316. icdev/data/docs/features/phase-57-eu-ai-act-iron-bank.md +319 -0
  317. icdev/data/docs/features/phase-58-creative-engine.md +370 -0
  318. icdev/data/docs/features/phase-59-govcon-intelligence.md +535 -0
  319. icdev/data/docs/features/phase-60-cpmp.md +528 -0
  320. icdev/data/docs/features/phase-61-orchestration-improvements.md +534 -0
  321. icdev/data/docs/operations/dashboard-guide.md +354 -0
  322. icdev/data/docs/operations/deployment-guide.md +556 -0
  323. icdev/data/docs/operations/saas-admin-guide.md +439 -0
  324. icdev/data/docs/operations/security-operations-guide.md +733 -0
  325. icdev/data/docs/runbooks/backup-restore.md +412 -0
  326. icdev/data/docs/runbooks/troubleshooting.md +499 -0
  327. icdev/data/features/__init__.py +1 -0
  328. icdev/data/features/cicd_integration.feature +41 -0
  329. icdev/data/features/compliance_gates.feature +46 -0
  330. icdev/data/features/dashboard.feature +72 -0
  331. icdev/data/features/environment.py +25 -0
  332. icdev/data/features/project_management.feature +32 -0
  333. icdev/data/features/requirements_intake.feature +42 -0
  334. icdev/data/features/saas_platform.feature +53 -0
  335. icdev/data/features/security_scanning.feature +36 -0
  336. icdev/data/features/steps/__init__.py +1 -0
  337. icdev/data/features/steps/cicd_steps.py +465 -0
  338. icdev/data/features/steps/compliance_steps.py +308 -0
  339. icdev/data/features/steps/dashboard_steps.py +88 -0
  340. icdev/data/features/steps/project_steps.py +126 -0
  341. icdev/data/features/steps/requirements_intake_steps.py +689 -0
  342. icdev/data/features/steps/saas_platform_steps.py +572 -0
  343. icdev/data/features/steps/security_steps.py +236 -0
  344. icdev/data/features/steps/testing_steps.py +226 -0
  345. icdev/data/features/testing_pipeline.feature +42 -0
  346. icdev/data/goals/__init__.py +1 -0
  347. icdev/data/goals/agent_management.md +144 -0
  348. icdev/data/goals/agentic_generation.md +345 -0
  349. icdev/data/goals/agentic_threat_model.md +309 -0
  350. icdev/data/goals/ai_accountability.md +90 -0
  351. icdev/data/goals/ai_governance_intake.md +132 -0
  352. icdev/data/goals/ai_transparency.md +76 -0
  353. icdev/data/goals/atlas_integration.md +405 -0
  354. icdev/data/goals/ato_acceleration.md +139 -0
  355. icdev/data/goals/boundary_supply_chain.md +206 -0
  356. icdev/data/goals/build_app.md +544 -0
  357. icdev/data/goals/cicd_integration.md +86 -0
  358. icdev/data/goals/claude_dir_maintenance.md +77 -0
  359. icdev/data/goals/cli_capabilities.md +340 -0
  360. icdev/data/goals/cloud_agnostic.md +312 -0
  361. icdev/data/goals/code_intelligence.md +197 -0
  362. icdev/data/goals/code_review.md +94 -0
  363. icdev/data/goals/compliance_workflow.md +858 -0
  364. icdev/data/goals/continuous_harmonization.md +140 -0
  365. icdev/data/goals/cross_language_translation.md +171 -0
  366. icdev/data/goals/dashboard.md +142 -0
  367. icdev/data/goals/deploy_workflow.md +390 -0
  368. icdev/data/goals/devsecops_workflow.md +408 -0
  369. icdev/data/goals/evolutionary_intelligence.md +305 -0
  370. icdev/data/goals/external_integration.md +113 -0
  371. icdev/data/goals/framework_planning.md +63 -0
  372. icdev/data/goals/init_project.md +235 -0
  373. icdev/data/goals/innovation_engine.md +199 -0
  374. icdev/data/goals/integration_testing.md +189 -0
  375. icdev/data/goals/maintenance_audit.md +196 -0
  376. icdev/data/goals/manifest.md +56 -0
  377. icdev/data/goals/mbse_integration.md +504 -0
  378. icdev/data/goals/modernization_workflow.md +618 -0
  379. icdev/data/goals/monitoring.md +126 -0
  380. icdev/data/goals/mosa_workflow.md +463 -0
  381. icdev/data/goals/multi_agent_orchestration.md +68 -0
  382. icdev/data/goals/nlq_compliance.md +63 -0
  383. icdev/data/goals/observability.md +64 -0
  384. icdev/data/goals/observability_traceability_xai.md +154 -0
  385. icdev/data/goals/owasp_agentic_security.md +395 -0
  386. icdev/data/goals/parallel_cicd.md +61 -0
  387. icdev/data/goals/requirements_intake.md +213 -0
  388. icdev/data/goals/sbd_ivv_workflow.md +195 -0
  389. icdev/data/goals/security_categorization.md +133 -0
  390. icdev/data/goals/security_scan.md +381 -0
  391. icdev/data/goals/self_healing.md +120 -0
  392. icdev/data/goals/simulation_engine.md +111 -0
  393. icdev/data/goals/tdd_workflow.md +403 -0
  394. icdev/data/goals/zero_trust_architecture.md +403 -0
  395. icdev/data/hardprompts/__init__.py +1 -0
  396. icdev/data/hardprompts/agent/__init__.py +1 -0
  397. icdev/data/hardprompts/agent/agentic_architect.md +100 -0
  398. icdev/data/hardprompts/agent/debate_prompt.md +32 -0
  399. icdev/data/hardprompts/agent/fitness_evaluation.md +48 -0
  400. icdev/data/hardprompts/agent/governance_review.md +214 -0
  401. icdev/data/hardprompts/agent/reviewer_prompt.md +34 -0
  402. icdev/data/hardprompts/agent/skill_design.md +172 -0
  403. icdev/data/hardprompts/agent/task_decomposition.md +275 -0
  404. icdev/data/hardprompts/agent/veto_check_prompt.md +33 -0
  405. icdev/data/hardprompts/architect/__init__.py +1 -0
  406. icdev/data/hardprompts/architect/api_design.md +283 -0
  407. icdev/data/hardprompts/architect/data_model.md +277 -0
  408. icdev/data/hardprompts/architect/system_design.md +180 -0
  409. icdev/data/hardprompts/builder/__init__.py +1 -0
  410. icdev/data/hardprompts/builder/code_generation.md +59 -0
  411. icdev/data/hardprompts/builder/refactor.md +58 -0
  412. icdev/data/hardprompts/builder/scaffold_project.md +69 -0
  413. icdev/data/hardprompts/builder/test_generation.md +87 -0
  414. icdev/data/hardprompts/ci/__init__.py +1 -0
  415. icdev/data/hardprompts/ci/worktree_setup.md +35 -0
  416. icdev/data/hardprompts/compliance/__init__.py +1 -0
  417. icdev/data/hardprompts/compliance/cmmc_assessment.md +63 -0
  418. icdev/data/hardprompts/compliance/cssp_assessment.md +75 -0
  419. icdev/data/hardprompts/compliance/cui_marking.md +86 -0
  420. icdev/data/hardprompts/compliance/fedramp_assessment.md +55 -0
  421. icdev/data/hardprompts/compliance/ivv_assessment.md +96 -0
  422. icdev/data/hardprompts/compliance/poam_generation.md +57 -0
  423. icdev/data/hardprompts/compliance/sbd_assessment.md +101 -0
  424. icdev/data/hardprompts/compliance/security_categorization.md +74 -0
  425. icdev/data/hardprompts/compliance/ssp_generation.md +56 -0
  426. icdev/data/hardprompts/compliance/stig_evaluation.md +63 -0
  427. icdev/data/hardprompts/dashboard/__init__.py +1 -0
  428. icdev/data/hardprompts/dashboard/nlq_system_prompt.md +26 -0
  429. icdev/data/hardprompts/infra/__init__.py +1 -0
  430. icdev/data/hardprompts/infra/k8s_manifests.md +118 -0
  431. icdev/data/hardprompts/infra/pipeline_generation.md +160 -0
  432. icdev/data/hardprompts/infra/terraform_generation.md +92 -0
  433. icdev/data/hardprompts/integration/__init__.py +1 -0
  434. icdev/data/hardprompts/integration/approval_review.md +17 -0
  435. icdev/data/hardprompts/integration/jira_mapping.md +25 -0
  436. icdev/data/hardprompts/integration/servicenow_mapping.md +14 -0
  437. icdev/data/hardprompts/knowledge/__init__.py +1 -0
  438. icdev/data/hardprompts/knowledge/pattern_detection.md +73 -0
  439. icdev/data/hardprompts/knowledge/recommendation_engine.md +90 -0
  440. icdev/data/hardprompts/knowledge/root_cause_analysis.md +91 -0
  441. icdev/data/hardprompts/maintenance/__init__.py +1 -0
  442. icdev/data/hardprompts/maintenance/maintenance_assessment.md +82 -0
  443. icdev/data/hardprompts/mbse/__init__.py +1 -0
  444. icdev/data/hardprompts/mbse/digital_thread.md +67 -0
  445. icdev/data/hardprompts/mbse/model_import.md +62 -0
  446. icdev/data/hardprompts/mbse/model_to_code.md +65 -0
  447. icdev/data/hardprompts/modernization/__init__.py +1 -0
  448. icdev/data/hardprompts/modernization/legacy_analysis.md +93 -0
  449. icdev/data/hardprompts/modernization/migration_planning.md +150 -0
  450. icdev/data/hardprompts/modernization/seven_r_assessment.md +107 -0
  451. icdev/data/hardprompts/requirements/__init__.py +1 -0
  452. icdev/data/hardprompts/requirements/bdd_generation.md +35 -0
  453. icdev/data/hardprompts/requirements/clarification_prioritization.md +29 -0
  454. icdev/data/hardprompts/requirements/decomposition.md +60 -0
  455. icdev/data/hardprompts/requirements/document_extraction.md +45 -0
  456. icdev/data/hardprompts/requirements/gap_detection.md +70 -0
  457. icdev/data/hardprompts/requirements/intake_conversation.md +101 -0
  458. icdev/data/hardprompts/requirements/readiness_assessment.md +39 -0
  459. icdev/data/hardprompts/requirements/spec_quality.md +33 -0
  460. icdev/data/hardprompts/requirements/traceability_analysis.md +23 -0
  461. icdev/data/hardprompts/security/__init__.py +1 -0
  462. icdev/data/hardprompts/security/endpoint_security.md +78 -0
  463. icdev/data/hardprompts/security/threat_model.md +70 -0
  464. icdev/data/hardprompts/security/vulnerability_assessment.md +81 -0
  465. icdev/data/hardprompts/simulation/__init__.py +1 -0
  466. icdev/data/hardprompts/simulation/architecture_impact.md +27 -0
  467. icdev/data/hardprompts/simulation/coa_alternative.md +27 -0
  468. icdev/data/hardprompts/simulation/coa_generation.md +25 -0
  469. icdev/data/hardprompts/simulation/compliance_impact.md +28 -0
  470. icdev/data/hardprompts/simulation/cost_estimation.md +33 -0
  471. icdev/data/hardprompts/simulation/risk_assessment.md +28 -0
  472. icdev/data/hardprompts/translation/code_translation.md +68 -0
  473. icdev/data/hardprompts/translation/dependency_suggestion.md +44 -0
  474. icdev/data/hardprompts/translation/test_translation.md +64 -0
  475. icdev/data/hardprompts/translation/translation_repair.md +59 -0
  476. icdev/py.typed +0 -0
  477. icdev/tools/__init__.py +1 -0
  478. icdev/tools/_gen_formatter.py +12 -0
  479. icdev/tools/a2a/__init__.py +1 -0
  480. icdev/tools/a2a/agent_cards/architect.json +43 -0
  481. icdev/tools/a2a/agent_cards/builder.json +50 -0
  482. icdev/tools/a2a/agent_cards/compliance.json +57 -0
  483. icdev/tools/a2a/agent_cards/devsecops.json +71 -0
  484. icdev/tools/a2a/agent_cards/infra.json +57 -0
  485. icdev/tools/a2a/agent_cards/integration.json +57 -0
  486. icdev/tools/a2a/agent_cards/knowledge.json +43 -0
  487. icdev/tools/a2a/agent_cards/mbse.json +57 -0
  488. icdev/tools/a2a/agent_cards/modernization.json +50 -0
  489. icdev/tools/a2a/agent_cards/monitor.json +43 -0
  490. icdev/tools/a2a/agent_cards/orchestrator.json +36 -0
  491. icdev/tools/a2a/agent_cards/requirements_analyst.json +64 -0
  492. icdev/tools/a2a/agent_cards/security.json +50 -0
  493. icdev/tools/a2a/agent_cards/simulation.json +57 -0
  494. icdev/tools/a2a/agent_cards/supply_chain.json +50 -0
  495. icdev/tools/a2a/agent_client.py +349 -0
  496. icdev/tools/a2a/agent_registry.py +412 -0
  497. icdev/tools/a2a/agent_server.py +579 -0
  498. icdev/tools/a2a/task.py +200 -0
  499. icdev/tools/agent/__init__.py +2 -0
  500. icdev/tools/agent/a2a_agent_card_generator.py +285 -0
  501. icdev/tools/agent/a2a_discovery_server.py +250 -0
  502. icdev/tools/agent/agent_executor.py +529 -0
  503. icdev/tools/agent/agent_memory.py +557 -0
  504. icdev/tools/agent/agent_models.py +51 -0
  505. icdev/tools/agent/atlas_critique.py +908 -0
  506. icdev/tools/agent/authority.py +443 -0
  507. icdev/tools/agent/bedrock_client.py +1075 -0
  508. icdev/tools/agent/collaboration.py +871 -0
  509. icdev/tools/agent/dispatcher_mode.py +665 -0
  510. icdev/tools/agent/mailbox.py +575 -0
  511. icdev/tools/agent/prompt_chain_executor.py +1064 -0
  512. icdev/tools/agent/session_purpose.py +350 -0
  513. icdev/tools/agent/skill_router.py +638 -0
  514. icdev/tools/agent/skill_selector.py +486 -0
  515. icdev/tools/agent/team_orchestrator.py +1108 -0
  516. icdev/tools/agent/token_tracker.py +290 -0
  517. icdev/tools/analysis/__init__.py +1 -0
  518. icdev/tools/analysis/code_analyzer.py +780 -0
  519. icdev/tools/analysis/runtime_feedback.py +389 -0
  520. icdev/tools/audit/__init__.py +1 -0
  521. icdev/tools/audit/audit_logger.py +196 -0
  522. icdev/tools/audit/audit_query.py +157 -0
  523. icdev/tools/audit/decision_recorder.py +72 -0
  524. icdev/tools/builder/__init__.py +1 -0
  525. icdev/tools/builder/agentic_fitness.py +534 -0
  526. icdev/tools/builder/agentic_test_templates/test_a2a_callback.py +117 -0
  527. icdev/tools/builder/agentic_test_templates/test_a2a_lifecycle.feature +52 -0
  528. icdev/tools/builder/agentic_test_templates/test_agent_card.feature +37 -0
  529. icdev/tools/builder/agentic_test_templates/test_agent_health.py +128 -0
  530. icdev/tools/builder/agentic_test_templates/test_memory_system.feature +50 -0
  531. icdev/tools/builder/agentic_test_templates/test_skill_execution.feature +40 -0
  532. icdev/tools/builder/app_blueprint.py +1583 -0
  533. icdev/tools/builder/child_app_generator.py +2852 -0
  534. icdev/tools/builder/claude_md_generator.py +1734 -0
  535. icdev/tools/builder/code_generator.py +3703 -0
  536. icdev/tools/builder/db_init_generator.py +1709 -0
  537. icdev/tools/builder/dev_profile_manager.py +954 -0
  538. icdev/tools/builder/formatter.py +768 -0
  539. icdev/tools/builder/goal_adapter.py +592 -0
  540. icdev/tools/builder/gotcha_validator.py +812 -0
  541. icdev/tools/builder/language_support.py +441 -0
  542. icdev/tools/builder/linter.py +976 -0
  543. icdev/tools/builder/profile_detector.py +657 -0
  544. icdev/tools/builder/profile_md_generator.py +723 -0
  545. icdev/tools/builder/scaffolder.py +1590 -0
  546. icdev/tools/builder/scaffolder_extended.py +1771 -0
  547. icdev/tools/builder/test_writer.py +950 -0
  548. icdev/tools/ci/__init__.py +2 -0
  549. icdev/tools/ci/connectors/__init__.py +2 -0
  550. icdev/tools/ci/connectors/base_connector.py +80 -0
  551. icdev/tools/ci/connectors/connector_registry.py +188 -0
  552. icdev/tools/ci/connectors/mattermost_connector.py +159 -0
  553. icdev/tools/ci/connectors/slack_connector.py +197 -0
  554. icdev/tools/ci/core/__init__.py +2 -0
  555. icdev/tools/ci/core/air_gap_detector.py +115 -0
  556. icdev/tools/ci/core/comment_handler.py +192 -0
  557. icdev/tools/ci/core/conversation_manager.py +479 -0
  558. icdev/tools/ci/core/event_envelope.py +500 -0
  559. icdev/tools/ci/core/event_router.py +443 -0
  560. icdev/tools/ci/core/failure_parser.py +397 -0
  561. icdev/tools/ci/core/recovery_engine.py +527 -0
  562. icdev/tools/ci/modules/__init__.py +2 -0
  563. icdev/tools/ci/modules/agent.py +271 -0
  564. icdev/tools/ci/modules/git_ops.py +175 -0
  565. icdev/tools/ci/modules/state.py +117 -0
  566. icdev/tools/ci/modules/vcs.py +303 -0
  567. icdev/tools/ci/modules/workflow_ops.py +295 -0
  568. icdev/tools/ci/modules/worktree.py +340 -0
  569. icdev/tools/ci/pipeline_config_generator.py +558 -0
  570. icdev/tools/ci/triggers/__init__.py +2 -0
  571. icdev/tools/ci/triggers/gitlab_task_monitor.py +330 -0
  572. icdev/tools/ci/triggers/poll_trigger.py +237 -0
  573. icdev/tools/ci/triggers/webhook_server.py +356 -0
  574. icdev/tools/ci/workflows/__init__.py +2 -0
  575. icdev/tools/ci/workflows/icdev_build.py +140 -0
  576. icdev/tools/ci/workflows/icdev_comply.py +284 -0
  577. icdev/tools/ci/workflows/icdev_document.py +152 -0
  578. icdev/tools/ci/workflows/icdev_e2e.py +188 -0
  579. icdev/tools/ci/workflows/icdev_patch.py +186 -0
  580. icdev/tools/ci/workflows/icdev_plan.py +202 -0
  581. icdev/tools/ci/workflows/icdev_plan_build.py +41 -0
  582. icdev/tools/ci/workflows/icdev_plan_build_test.py +46 -0
  583. icdev/tools/ci/workflows/icdev_plan_build_test_review.py +47 -0
  584. icdev/tools/ci/workflows/icdev_review.py +126 -0
  585. icdev/tools/ci/workflows/icdev_sdlc.py +261 -0
  586. icdev/tools/ci/workflows/icdev_test.py +240 -0
  587. icdev/tools/cli/__init__.py +1 -0
  588. icdev/tools/cli/output_formatter.py +756 -0
  589. icdev/tools/cli_formatter.py +42 -0
  590. icdev/tools/cloud/__init__.py +11 -0
  591. icdev/tools/cloud/cloud_mode_manager.py +364 -0
  592. icdev/tools/cloud/csp_changelog.py +383 -0
  593. icdev/tools/cloud/csp_health_checker.py +268 -0
  594. icdev/tools/cloud/csp_monitor.py +951 -0
  595. icdev/tools/cloud/iam_provider.py +593 -0
  596. icdev/tools/cloud/kms_provider.py +346 -0
  597. icdev/tools/cloud/monitoring_provider.py +628 -0
  598. icdev/tools/cloud/provider_factory.py +376 -0
  599. icdev/tools/cloud/region_validator.py +345 -0
  600. icdev/tools/cloud/registry_provider.py +563 -0
  601. icdev/tools/cloud/secrets_provider.py +486 -0
  602. icdev/tools/cloud/storage_provider.py +446 -0
  603. icdev/tools/compat/__init__.py +21 -0
  604. icdev/tools/compat/cli_harmonizer.py +251 -0
  605. icdev/tools/compat/datetime_utils.py +18 -0
  606. icdev/tools/compat/db_utils.py +160 -0
  607. icdev/tools/compat/platform_utils.py +123 -0
  608. icdev/tools/compliance/__init__.py +1 -0
  609. icdev/tools/compliance/accountability_manager.py +397 -0
  610. icdev/tools/compliance/ai_accountability_audit.py +294 -0
  611. icdev/tools/compliance/ai_impact_assessor.py +273 -0
  612. icdev/tools/compliance/ai_incident_response.py +301 -0
  613. icdev/tools/compliance/ai_inventory_manager.py +239 -0
  614. icdev/tools/compliance/ai_reassessment_scheduler.py +256 -0
  615. icdev/tools/compliance/ai_transparency_audit.py +248 -0
  616. icdev/tools/compliance/atlas_assessor.py +278 -0
  617. icdev/tools/compliance/atlas_report_generator.py +1211 -0
  618. icdev/tools/compliance/base_assessor.py +597 -0
  619. icdev/tools/compliance/cato_monitor.py +1385 -0
  620. icdev/tools/compliance/cato_scheduler.py +699 -0
  621. icdev/tools/compliance/cjis_assessor.py +76 -0
  622. icdev/tools/compliance/classification_manager.py +1353 -0
  623. icdev/tools/compliance/cmmc_assessor.py +1491 -0
  624. icdev/tools/compliance/cmmc_report_generator.py +1100 -0
  625. icdev/tools/compliance/compliance_detector.py +463 -0
  626. icdev/tools/compliance/compliance_exporter.py +427 -0
  627. icdev/tools/compliance/compliance_status.py +825 -0
  628. icdev/tools/compliance/control_mapper.py +505 -0
  629. icdev/tools/compliance/crosswalk_engine.py +1203 -0
  630. icdev/tools/compliance/cssp_assessor.py +1045 -0
  631. icdev/tools/compliance/cssp_evidence_collector.py +729 -0
  632. icdev/tools/compliance/cssp_report_generator.py +1116 -0
  633. icdev/tools/compliance/cui_marker.py +388 -0
  634. icdev/tools/compliance/diagram_validator.py +600 -0
  635. icdev/tools/compliance/emass/__init__.py +2 -0
  636. icdev/tools/compliance/emass/emass_client.py +840 -0
  637. icdev/tools/compliance/emass/emass_export.py +777 -0
  638. icdev/tools/compliance/emass/emass_sync.py +826 -0
  639. icdev/tools/compliance/eu_ai_act_classifier.py +194 -0
  640. icdev/tools/compliance/evidence_collector.py +468 -0
  641. icdev/tools/compliance/fairness_assessor.py +316 -0
  642. icdev/tools/compliance/fedramp_assessor.py +1808 -0
  643. icdev/tools/compliance/fedramp_authorization_packager.py +137 -0
  644. icdev/tools/compliance/fedramp_ksi_generator.py +355 -0
  645. icdev/tools/compliance/fedramp_report_generator.py +1128 -0
  646. icdev/tools/compliance/fips199_categorizer.py +881 -0
  647. icdev/tools/compliance/fips200_validator.py +315 -0
  648. icdev/tools/compliance/gao_ai_assessor.py +231 -0
  649. icdev/tools/compliance/gao_evidence_builder.py +308 -0
  650. icdev/tools/compliance/hipaa_assessor.py +78 -0
  651. icdev/tools/compliance/hitrust_assessor.py +49 -0
  652. icdev/tools/compliance/incident_response_plan.py +718 -0
  653. icdev/tools/compliance/iso27001_assessor.py +92 -0
  654. icdev/tools/compliance/iso42001_assessor.py +114 -0
  655. icdev/tools/compliance/ivv_assessor.py +2327 -0
  656. icdev/tools/compliance/ivv_report_generator.py +1662 -0
  657. icdev/tools/compliance/model_card_generator.py +297 -0
  658. icdev/tools/compliance/mosa_assessor.py +117 -0
  659. icdev/tools/compliance/multi_regime_assessor.py +451 -0
  660. icdev/tools/compliance/narrative_generator.py +1013 -0
  661. icdev/tools/compliance/nist_800_207_assessor.py +191 -0
  662. icdev/tools/compliance/nist_ai_600_1_assessor.py +188 -0
  663. icdev/tools/compliance/nist_ai_rmf_assessor.py +110 -0
  664. icdev/tools/compliance/nist_lookup.py +245 -0
  665. icdev/tools/compliance/omb_m25_21_assessor.py +228 -0
  666. icdev/tools/compliance/omb_m26_04_assessor.py +188 -0
  667. icdev/tools/compliance/oscal_catalog_adapter.py +395 -0
  668. icdev/tools/compliance/oscal_generator.py +2170 -0
  669. icdev/tools/compliance/oscal_tools.py +1182 -0
  670. icdev/tools/compliance/owasp_agentic_assessor.py +226 -0
  671. icdev/tools/compliance/owasp_asi_assessor.py +200 -0
  672. icdev/tools/compliance/owasp_llm_assessor.py +244 -0
  673. icdev/tools/compliance/pci_dss_assessor.py +80 -0
  674. icdev/tools/compliance/pi_compliance_tracker.py +1461 -0
  675. icdev/tools/compliance/poam_generator.py +405 -0
  676. icdev/tools/compliance/resolve_marking.py +283 -0
  677. icdev/tools/compliance/sbd_assessor.py +2068 -0
  678. icdev/tools/compliance/sbd_report_generator.py +1236 -0
  679. icdev/tools/compliance/sbom_generator.py +1008 -0
  680. icdev/tools/compliance/siem_config_generator.py +674 -0
  681. icdev/tools/compliance/slsa_attestation_generator.py +490 -0
  682. icdev/tools/compliance/soc2_assessor.py +77 -0
  683. icdev/tools/compliance/ssp_generator.py +573 -0
  684. icdev/tools/compliance/stig_checker.py +727 -0
  685. icdev/tools/compliance/swft_evidence_bundler.py +337 -0
  686. icdev/tools/compliance/system_card_generator.py +309 -0
  687. icdev/tools/compliance/traceability_matrix.py +1281 -0
  688. icdev/tools/compliance/universal_classification_manager.py +1172 -0
  689. icdev/tools/compliance/xacta/__init__.py +2 -0
  690. icdev/tools/compliance/xacta/xacta_client.py +449 -0
  691. icdev/tools/compliance/xacta/xacta_export.py +557 -0
  692. icdev/tools/compliance/xacta/xacta_sync.py +333 -0
  693. icdev/tools/compliance/xai_assessor.py +231 -0
  694. icdev/tools/dashboard/__init__.py +1 -0
  695. icdev/tools/dashboard/api/__init__.py +1 -0
  696. icdev/tools/dashboard/api/_pipeline_state.py +17 -0
  697. icdev/tools/dashboard/api/activity.py +206 -0
  698. icdev/tools/dashboard/api/admin.py +176 -0
  699. icdev/tools/dashboard/api/agents.py +53 -0
  700. icdev/tools/dashboard/api/ai_accountability.py +163 -0
  701. icdev/tools/dashboard/api/ai_transparency.py +198 -0
  702. icdev/tools/dashboard/api/audit.py +58 -0
  703. icdev/tools/dashboard/api/batch.py +666 -0
  704. icdev/tools/dashboard/api/chat.py +241 -0
  705. icdev/tools/dashboard/api/cicd.py +219 -0
  706. icdev/tools/dashboard/api/code_quality.py +223 -0
  707. icdev/tools/dashboard/api/compliance.py +171 -0
  708. icdev/tools/dashboard/api/cpmp.py +915 -0
  709. icdev/tools/dashboard/api/diagrams.py +65 -0
  710. icdev/tools/dashboard/api/events.py +250 -0
  711. icdev/tools/dashboard/api/evidence.py +99 -0
  712. icdev/tools/dashboard/api/fedramp_20x.py +77 -0
  713. icdev/tools/dashboard/api/govcon.py +1095 -0
  714. icdev/tools/dashboard/api/intake.py +1171 -0
  715. icdev/tools/dashboard/api/lineage.py +163 -0
  716. icdev/tools/dashboard/api/metrics.py +155 -0
  717. icdev/tools/dashboard/api/nlq.py +72 -0
  718. icdev/tools/dashboard/api/orchestration.py +472 -0
  719. icdev/tools/dashboard/api/oscal.py +183 -0
  720. icdev/tools/dashboard/api/prod_audit.py +183 -0
  721. icdev/tools/dashboard/api/projects.py +191 -0
  722. icdev/tools/dashboard/api/proposals.py +1084 -0
  723. icdev/tools/dashboard/api/traces.py +363 -0
  724. icdev/tools/dashboard/api/usage.py +234 -0
  725. icdev/tools/dashboard/app.py +1986 -0
  726. icdev/tools/dashboard/auth.py +500 -0
  727. icdev/tools/dashboard/byok.py +245 -0
  728. icdev/tools/dashboard/chat_manager.py +675 -0
  729. icdev/tools/dashboard/config.py +116 -0
  730. icdev/tools/dashboard/diagram_definitions.py +642 -0
  731. icdev/tools/dashboard/nlq_processor.py +323 -0
  732. icdev/tools/dashboard/phase_loader.py +136 -0
  733. icdev/tools/dashboard/sse_manager.py +89 -0
  734. icdev/tools/dashboard/state_tracker.py +267 -0
  735. icdev/tools/dashboard/static/css/style.css +706 -0
  736. icdev/tools/dashboard/static/css/ux.css +2047 -0
  737. icdev/tools/dashboard/static/js/activity.js +322 -0
  738. icdev/tools/dashboard/static/js/api.js +161 -0
  739. icdev/tools/dashboard/static/js/batch.js +814 -0
  740. icdev/tools/dashboard/static/js/charts.js +618 -0
  741. icdev/tools/dashboard/static/js/chat.js +1514 -0
  742. icdev/tools/dashboard/static/js/kanban.js +113 -0
  743. icdev/tools/dashboard/static/js/live.js +569 -0
  744. icdev/tools/dashboard/static/js/mermaid-icdev.js +332 -0
  745. icdev/tools/dashboard/static/js/proposals.js +588 -0
  746. icdev/tools/dashboard/static/js/shortcuts.js +544 -0
  747. icdev/tools/dashboard/static/js/tables.js +652 -0
  748. icdev/tools/dashboard/static/js/tour.js +524 -0
  749. icdev/tools/dashboard/static/js/ux.js +942 -0
  750. icdev/tools/dashboard/templates/404.html +10 -0
  751. icdev/tools/dashboard/templates/activity.html +80 -0
  752. icdev/tools/dashboard/templates/admin/users.html +144 -0
  753. icdev/tools/dashboard/templates/ai_accountability.html +235 -0
  754. icdev/tools/dashboard/templates/ai_transparency.html +263 -0
  755. icdev/tools/dashboard/templates/base.html +104 -0
  756. icdev/tools/dashboard/templates/batch.html +23 -0
  757. icdev/tools/dashboard/templates/chat.html +332 -0
  758. icdev/tools/dashboard/templates/children.html +149 -0
  759. icdev/tools/dashboard/templates/cicd.html +253 -0
  760. icdev/tools/dashboard/templates/code_quality.html +214 -0
  761. icdev/tools/dashboard/templates/cpmp/cor_detail.html +220 -0
  762. icdev/tools/dashboard/templates/cpmp/cor_portal.html +91 -0
  763. icdev/tools/dashboard/templates/cpmp/deliverable_detail.html +197 -0
  764. icdev/tools/dashboard/templates/cpmp/detail.html +578 -0
  765. icdev/tools/dashboard/templates/cpmp/portfolio.html +202 -0
  766. icdev/tools/dashboard/templates/dev_profiles.html +304 -0
  767. icdev/tools/dashboard/templates/diagrams.html +224 -0
  768. icdev/tools/dashboard/templates/events/timeline.html +232 -0
  769. icdev/tools/dashboard/templates/evidence.html +134 -0
  770. icdev/tools/dashboard/templates/fedramp_20x.html +207 -0
  771. icdev/tools/dashboard/templates/gateway.html +244 -0
  772. icdev/tools/dashboard/templates/govcon/capabilities.html +135 -0
  773. icdev/tools/dashboard/templates/govcon/pipeline.html +214 -0
  774. icdev/tools/dashboard/templates/govcon/requirements.html +120 -0
  775. icdev/tools/dashboard/templates/index.html +254 -0
  776. icdev/tools/dashboard/templates/lineage.html +141 -0
  777. icdev/tools/dashboard/templates/login.html +51 -0
  778. icdev/tools/dashboard/templates/monitoring/overview.html +193 -0
  779. icdev/tools/dashboard/templates/orchestration/dashboard.html +545 -0
  780. icdev/tools/dashboard/templates/oscal.html +263 -0
  781. icdev/tools/dashboard/templates/phases.html +150 -0
  782. icdev/tools/dashboard/templates/prod_audit.html +280 -0
  783. icdev/tools/dashboard/templates/profile.html +183 -0
  784. icdev/tools/dashboard/templates/projects/detail.html +583 -0
  785. icdev/tools/dashboard/templates/projects/list.html +47 -0
  786. icdev/tools/dashboard/templates/proposals/detail.html +1253 -0
  787. icdev/tools/dashboard/templates/proposals/list.html +179 -0
  788. icdev/tools/dashboard/templates/proposals/section_detail.html +193 -0
  789. icdev/tools/dashboard/templates/provenance.html +181 -0
  790. icdev/tools/dashboard/templates/query/nlq.html +234 -0
  791. icdev/tools/dashboard/templates/quick_paths.html +69 -0
  792. icdev/tools/dashboard/templates/traces.html +155 -0
  793. icdev/tools/dashboard/templates/translation_detail.html +199 -0
  794. icdev/tools/dashboard/templates/translations.html +162 -0
  795. icdev/tools/dashboard/templates/usage.html +225 -0
  796. icdev/tools/dashboard/templates/wizard.html +539 -0
  797. icdev/tools/dashboard/templates/xai.html +208 -0
  798. icdev/tools/dashboard/ux_helpers.py +962 -0
  799. icdev/tools/dashboard/websocket.py +81 -0
  800. icdev/tools/db/__init__.py +1 -0
  801. icdev/tools/db/backup.py +312 -0
  802. icdev/tools/db/backup_manager.py +832 -0
  803. icdev/tools/db/init_icdev_db.py +5900 -0
  804. icdev/tools/db/migrate.py +178 -0
  805. icdev/tools/db/migration_runner.py +549 -0
  806. icdev/tools/db/migrations/001_baseline/meta.json +9 -0
  807. icdev/tools/db/migrations/001_baseline/up.py +68 -0
  808. icdev/tools/db/migrations/002_memory_enhancements/down.sql +8 -0
  809. icdev/tools/db/migrations/002_memory_enhancements/meta.json +9 -0
  810. icdev/tools/db/migrations/002_memory_enhancements/up.py +118 -0
  811. icdev/tools/db/migrations/003_dev_profiles/meta.json +8 -0
  812. icdev/tools/db/migrations/003_dev_profiles/up.py +93 -0
  813. icdev/tools/db/migrations/004_innovation_engine/down.py +19 -0
  814. icdev/tools/db/migrations/004_innovation_engine/up.py +227 -0
  815. icdev/tools/db/migrations/005_phase_37_ai_security/down.py +19 -0
  816. icdev/tools/db/migrations/005_phase_37_ai_security/up.py +258 -0
  817. icdev/tools/db/migrations/006_phase_36_evolution/down.py +21 -0
  818. icdev/tools/db/migrations/006_phase_36_evolution/up.py +323 -0
  819. icdev/tools/db/migrations/007_phase_38_cloud/down.py +14 -0
  820. icdev/tools/db/migrations/007_phase_38_cloud/up.py +110 -0
  821. icdev/tools/db/migrations/008_phase36_37_integration/up.py +55 -0
  822. icdev/tools/db/migrations/__init__.py +2 -0
  823. icdev/tools/devsecops/__init__.py +2 -0
  824. icdev/tools/devsecops/attestation_manager.py +458 -0
  825. icdev/tools/devsecops/network_segmentation_generator.py +614 -0
  826. icdev/tools/devsecops/pdp_config_generator.py +1256 -0
  827. icdev/tools/devsecops/pipeline_security_generator.py +484 -0
  828. icdev/tools/devsecops/policy_generator.py +653 -0
  829. icdev/tools/devsecops/profile_manager.py +388 -0
  830. icdev/tools/devsecops/service_mesh_generator.py +1073 -0
  831. icdev/tools/devsecops/zta_maturity_scorer.py +368 -0
  832. icdev/tools/devsecops/zta_terraform_generator.py +1303 -0
  833. icdev/tools/dx/__init__.py +3 -0
  834. icdev/tools/dx/companion.py +266 -0
  835. icdev/tools/dx/instruction_generator.py +753 -0
  836. icdev/tools/dx/mcp_config_generator.py +282 -0
  837. icdev/tools/dx/skill_translator.py +425 -0
  838. icdev/tools/dx/tool_detector.py +144 -0
  839. icdev/tools/extensions/__init__.py +21 -0
  840. icdev/tools/extensions/builtins/010_ai_governance_chat.py +277 -0
  841. icdev/tools/extensions/builtins/__init__.py +2 -0
  842. icdev/tools/extensions/extension_manager.py +455 -0
  843. icdev/tools/infra/__init__.py +1 -0
  844. icdev/tools/infra/ansible_generator.py +869 -0
  845. icdev/tools/infra/dockerfile_generator.py +361 -0
  846. icdev/tools/infra/infra_status.py +393 -0
  847. icdev/tools/infra/ironbank_metadata_generator.py +411 -0
  848. icdev/tools/infra/k8s_generator.py +1002 -0
  849. icdev/tools/infra/pipeline_generator.py +832 -0
  850. icdev/tools/infra/rollback.py +400 -0
  851. icdev/tools/infra/terraform_generator.py +1142 -0
  852. icdev/tools/infra/terraform_generator_azure.py +1254 -0
  853. icdev/tools/infra/terraform_generator_gcp.py +953 -0
  854. icdev/tools/infra/terraform_generator_ibm.py +360 -0
  855. icdev/tools/infra/terraform_generator_oci.py +919 -0
  856. icdev/tools/infra/terraform_generator_onprem.py +319 -0
  857. icdev/tools/innovation/__init__.py +8 -0
  858. icdev/tools/innovation/competitive_intel.py +492 -0
  859. icdev/tools/innovation/innovation_manager.py +681 -0
  860. icdev/tools/innovation/introspective_analyzer.py +774 -0
  861. icdev/tools/innovation/register_external_patterns.py +440 -0
  862. icdev/tools/innovation/signal_ranker.py +1038 -0
  863. icdev/tools/innovation/solution_generator.py +697 -0
  864. icdev/tools/innovation/standards_monitor.py +466 -0
  865. icdev/tools/innovation/trend_detector.py +1046 -0
  866. icdev/tools/innovation/triage_engine.py +1149 -0
  867. icdev/tools/innovation/web_scanner.py +894 -0
  868. icdev/tools/installer/__init__.py +1 -0
  869. icdev/tools/installer/compliance_configurator.py +637 -0
  870. icdev/tools/installer/installer.py +1711 -0
  871. icdev/tools/installer/module_registry.py +805 -0
  872. icdev/tools/installer/platform_setup.py +961 -0
  873. icdev/tools/integration/__init__.py +2 -0
  874. icdev/tools/integration/approval_manager.py +561 -0
  875. icdev/tools/integration/doors_exporter.py +627 -0
  876. icdev/tools/integration/gitlab_connector.py +784 -0
  877. icdev/tools/integration/jira_connector.py +774 -0
  878. icdev/tools/integration/servicenow_connector.py +693 -0
  879. icdev/tools/knowledge/__init__.py +1 -0
  880. icdev/tools/knowledge/knowledge_ingest.py +293 -0
  881. icdev/tools/knowledge/pattern_detector.py +693 -0
  882. icdev/tools/knowledge/recommendation_engine.py +461 -0
  883. icdev/tools/knowledge/self_heal_analyzer.py +504 -0
  884. icdev/tools/llm/__init__.py +72 -0
  885. icdev/tools/llm/anthropic_provider.py +170 -0
  886. icdev/tools/llm/azure_openai_provider.py +338 -0
  887. icdev/tools/llm/bedrock_provider.py +315 -0
  888. icdev/tools/llm/embedding_provider.py +438 -0
  889. icdev/tools/llm/gemini_provider.py +381 -0
  890. icdev/tools/llm/ibm_watsonx_provider.py +232 -0
  891. icdev/tools/llm/oci_genai_provider.py +462 -0
  892. icdev/tools/llm/ollama_provider.py +340 -0
  893. icdev/tools/llm/openai_provider.py +225 -0
  894. icdev/tools/llm/provider.py +355 -0
  895. icdev/tools/llm/provider_sdk.py +175 -0
  896. icdev/tools/llm/router.py +780 -0
  897. icdev/tools/llm/vertex_ai_provider.py +374 -0
  898. icdev/tools/maintenance/__init__.py +2 -0
  899. icdev/tools/maintenance/dependency_scanner.py +1030 -0
  900. icdev/tools/maintenance/maintenance_auditor.py +815 -0
  901. icdev/tools/maintenance/remediation_engine.py +966 -0
  902. icdev/tools/maintenance/vulnerability_checker.py +987 -0
  903. icdev/tools/mbse/__init__.py +3 -0
  904. icdev/tools/mbse/des_assessor.py +1186 -0
  905. icdev/tools/mbse/des_report_generator.py +800 -0
  906. icdev/tools/mbse/diagram_extractor.py +811 -0
  907. icdev/tools/mbse/digital_thread.py +1665 -0
  908. icdev/tools/mbse/model_code_generator.py +1122 -0
  909. icdev/tools/mbse/model_control_mapper.py +420 -0
  910. icdev/tools/mbse/pi_model_tracker.py +1093 -0
  911. icdev/tools/mbse/reqif_parser.py +1483 -0
  912. icdev/tools/mbse/sync_engine.py +1805 -0
  913. icdev/tools/mbse/xmi_parser.py +1573 -0
  914. icdev/tools/mcp/__init__.py +1 -0
  915. icdev/tools/mcp/base_server.py +535 -0
  916. icdev/tools/mcp/builder_server.py +725 -0
  917. icdev/tools/mcp/compliance_server.py +1407 -0
  918. icdev/tools/mcp/context_indexer.py +199 -0
  919. icdev/tools/mcp/context_server.py +305 -0
  920. icdev/tools/mcp/core_server.py +679 -0
  921. icdev/tools/mcp/devsecops_server.py +432 -0
  922. icdev/tools/mcp/gap_handlers.py +1079 -0
  923. icdev/tools/mcp/gateway_server.py +339 -0
  924. icdev/tools/mcp/generate_registry.py +623 -0
  925. icdev/tools/mcp/infra_server.py +264 -0
  926. icdev/tools/mcp/innovation_server.py +316 -0
  927. icdev/tools/mcp/integration_server.py +527 -0
  928. icdev/tools/mcp/knowledge_server.py +429 -0
  929. icdev/tools/mcp/maintenance_server.py +248 -0
  930. icdev/tools/mcp/marketplace_server.py +499 -0
  931. icdev/tools/mcp/mbse_server.py +398 -0
  932. icdev/tools/mcp/modernization_server.py +496 -0
  933. icdev/tools/mcp/observability_server.py +354 -0
  934. icdev/tools/mcp/requirements_server.py +415 -0
  935. icdev/tools/mcp/simulation_server.py +468 -0
  936. icdev/tools/mcp/standalone/__init__.py +2 -0
  937. icdev/tools/mcp/standalone/builder.py +59 -0
  938. icdev/tools/mcp/standalone/compliance.py +59 -0
  939. icdev/tools/mcp/standalone/core.py +59 -0
  940. icdev/tools/mcp/standalone/knowledge.py +59 -0
  941. icdev/tools/mcp/standalone/maintenance.py +59 -0
  942. icdev/tools/mcp/supply_chain_server.py +476 -0
  943. icdev/tools/mcp/tool_registry.py +2008 -0
  944. icdev/tools/mcp/unified_server.py +158 -0
  945. icdev/tools/memory/__init__.py +2 -0
  946. icdev/tools/memory/auto_capture.py +347 -0
  947. icdev/tools/memory/embed_memory.py +158 -0
  948. icdev/tools/memory/history_compressor.py +334 -0
  949. icdev/tools/memory/hybrid_search.py +236 -0
  950. icdev/tools/memory/maintenance_cron.py +289 -0
  951. icdev/tools/memory/memory_consolidation.py +444 -0
  952. icdev/tools/memory/memory_db.py +133 -0
  953. icdev/tools/memory/memory_read.py +102 -0
  954. icdev/tools/memory/memory_write.py +222 -0
  955. icdev/tools/memory/semantic_search.py +139 -0
  956. icdev/tools/memory/time_decay.py +435 -0
  957. icdev/tools/modernization/__init__.py +3 -0
  958. icdev/tools/modernization/architecture_extractor.py +734 -0
  959. icdev/tools/modernization/compliance_bridge.py +1499 -0
  960. icdev/tools/modernization/db_migration_planner.py +1385 -0
  961. icdev/tools/modernization/doc_generator.py +1428 -0
  962. icdev/tools/modernization/framework_migrator.py +1525 -0
  963. icdev/tools/modernization/legacy_analyzer.py +1948 -0
  964. icdev/tools/modernization/migration_code_generator.py +1639 -0
  965. icdev/tools/modernization/migration_report_generator.py +1653 -0
  966. icdev/tools/modernization/migration_tracker.py +1726 -0
  967. icdev/tools/modernization/monolith_decomposer.py +1508 -0
  968. icdev/tools/modernization/seven_r_assessor.py +1658 -0
  969. icdev/tools/modernization/strangler_fig_manager.py +1705 -0
  970. icdev/tools/modernization/ui_analyzer.py +771 -0
  971. icdev/tools/modernization/version_migrator.py +1392 -0
  972. icdev/tools/monitor/__init__.py +1 -0
  973. icdev/tools/monitor/alert_correlator.py +495 -0
  974. icdev/tools/monitor/auto_resolver.py +612 -0
  975. icdev/tools/monitor/health_checker.py +509 -0
  976. icdev/tools/monitor/heartbeat_daemon.py +792 -0
  977. icdev/tools/monitor/log_analyzer.py +516 -0
  978. icdev/tools/monitor/metric_collector.py +496 -0
  979. icdev/tools/mosa/__init__.py +10 -0
  980. icdev/tools/mosa/icd_generator.py +370 -0
  981. icdev/tools/mosa/modular_design_analyzer.py +683 -0
  982. icdev/tools/mosa/mosa_code_enforcer.py +349 -0
  983. icdev/tools/mosa/tsp_generator.py +265 -0
  984. icdev/tools/observability/__init__.py +100 -0
  985. icdev/tools/observability/genai_attributes.py +88 -0
  986. icdev/tools/observability/instrumentation.py +140 -0
  987. icdev/tools/observability/mlflow_exporter.py +194 -0
  988. icdev/tools/observability/otel_tracer.py +168 -0
  989. icdev/tools/observability/provenance/__init__.py +3 -0
  990. icdev/tools/observability/provenance/prov_recorder.py +324 -0
  991. icdev/tools/observability/shap/__init__.py +3 -0
  992. icdev/tools/observability/shap/agent_shap.py +275 -0
  993. icdev/tools/observability/sqlite_tracer.py +361 -0
  994. icdev/tools/observability/trace_context.py +205 -0
  995. icdev/tools/observability/tracer.py +230 -0
  996. icdev/tools/orchestration/__init__.py +2 -0
  997. icdev/tools/orchestration/workflow_composer.py +361 -0
  998. icdev/tools/project/__init__.py +1 -0
  999. icdev/tools/project/manifest_loader.py +418 -0
  1000. icdev/tools/project/project_create.py +350 -0
  1001. icdev/tools/project/project_list.py +174 -0
  1002. icdev/tools/project/project_scaffold.py +1715 -0
  1003. icdev/tools/project/project_status.py +479 -0
  1004. icdev/tools/project/session_context_builder.py +757 -0
  1005. icdev/tools/project/validate_manifest.py +55 -0
  1006. icdev/tools/registry/__init__.py +10 -0
  1007. icdev/tools/registry/absorption_engine.py +832 -0
  1008. icdev/tools/registry/capability_evaluator.py +668 -0
  1009. icdev/tools/registry/child_registry.py +617 -0
  1010. icdev/tools/registry/cross_pollinator.py +1065 -0
  1011. icdev/tools/registry/genome_manager.py +671 -0
  1012. icdev/tools/registry/learning_collector.py +912 -0
  1013. icdev/tools/registry/propagation_manager.py +942 -0
  1014. icdev/tools/registry/staging_manager.py +742 -0
  1015. icdev/tools/registry/telemetry_collector.py +423 -0
  1016. icdev/tools/requirements/__init__.py +1 -0
  1017. icdev/tools/requirements/ai_governance_scorer.py +208 -0
  1018. icdev/tools/requirements/boundary_analyzer.py +1293 -0
  1019. icdev/tools/requirements/clarification_engine.py +618 -0
  1020. icdev/tools/requirements/complexity_scorer.py +387 -0
  1021. icdev/tools/requirements/consistency_analyzer.py +803 -0
  1022. icdev/tools/requirements/constitution_manager.py +605 -0
  1023. icdev/tools/requirements/decomposition_engine.py +778 -0
  1024. icdev/tools/requirements/document_extractor.py +1016 -0
  1025. icdev/tools/requirements/elicitation_techniques.py +519 -0
  1026. icdev/tools/requirements/gap_detector.py +271 -0
  1027. icdev/tools/requirements/intake_engine.py +2188 -0
  1028. icdev/tools/requirements/prd_generator.py +847 -0
  1029. icdev/tools/requirements/prd_validator.py +595 -0
  1030. icdev/tools/requirements/readiness_scorer.py +313 -0
  1031. icdev/tools/requirements/spec_organizer.py +1029 -0
  1032. icdev/tools/requirements/spec_quality_checker.py +1097 -0
  1033. icdev/tools/requirements/traceability_builder.py +579 -0
  1034. icdev/tools/resilience/__init__.py +34 -0
  1035. icdev/tools/resilience/circuit_breaker.py +340 -0
  1036. icdev/tools/resilience/correlation.py +150 -0
  1037. icdev/tools/resilience/errors.py +81 -0
  1038. icdev/tools/resilience/retry.py +95 -0
  1039. icdev/tools/schemas/__init__.py +27 -0
  1040. icdev/tools/schemas/chat.py +61 -0
  1041. icdev/tools/schemas/compliance.py +56 -0
  1042. icdev/tools/schemas/core.py +85 -0
  1043. icdev/tools/schemas/innovation.py +37 -0
  1044. icdev/tools/schemas/validation.py +109 -0
  1045. icdev/tools/sdk/__init__.py +3 -0
  1046. icdev/tools/sdk/icdev_client.py +218 -0
  1047. icdev/tools/security/__init__.py +1 -0
  1048. icdev/tools/security/agent_output_validator.py +330 -0
  1049. icdev/tools/security/agent_trust_scorer.py +466 -0
  1050. icdev/tools/security/ai_bom_generator.py +725 -0
  1051. icdev/tools/security/ai_telemetry_logger.py +469 -0
  1052. icdev/tools/security/atlas_red_team.py +543 -0
  1053. icdev/tools/security/code_pattern_scanner.py +378 -0
  1054. icdev/tools/security/confabulation_detector.py +271 -0
  1055. icdev/tools/security/container_scanner.py +491 -0
  1056. icdev/tools/security/dependency_auditor.py +944 -0
  1057. icdev/tools/security/endpoint_security_scanner.py +579 -0
  1058. icdev/tools/security/mcp_tool_authorizer.py +243 -0
  1059. icdev/tools/security/prompt_injection_detector.py +737 -0
  1060. icdev/tools/security/sast_runner.py +948 -0
  1061. icdev/tools/security/secret_detector.py +378 -0
  1062. icdev/tools/security/tool_chain_validator.py +357 -0
  1063. icdev/tools/security/vuln_scanner.py +539 -0
  1064. icdev/tools/simulation/__init__.py +2 -0
  1065. icdev/tools/simulation/coa_generator.py +1552 -0
  1066. icdev/tools/simulation/monte_carlo.py +758 -0
  1067. icdev/tools/simulation/scenario_manager.py +1073 -0
  1068. icdev/tools/simulation/simulation_engine.py +1104 -0
  1069. icdev/tools/supply_chain/__init__.py +2 -0
  1070. icdev/tools/supply_chain/cve_triager.py +705 -0
  1071. icdev/tools/supply_chain/dependency_graph.py +645 -0
  1072. icdev/tools/supply_chain/isa_manager.py +540 -0
  1073. icdev/tools/supply_chain/scrm_assessor.py +546 -0
  1074. icdev/tools/testing/__init__.py +2 -0
  1075. icdev/tools/testing/acceptance_validator.py +411 -0
  1076. icdev/tools/testing/claude_dir_validator.py +831 -0
  1077. icdev/tools/testing/data_types.py +199 -0
  1078. icdev/tools/testing/e2e_runner.py +715 -0
  1079. icdev/tools/testing/fuzz_cli.py +306 -0
  1080. icdev/tools/testing/health_check.py +483 -0
  1081. icdev/tools/testing/platform_check.py +143 -0
  1082. icdev/tools/testing/production_audit.py +1862 -0
  1083. icdev/tools/testing/production_remediate.py +804 -0
  1084. icdev/tools/testing/screenshot_validator.py +539 -0
  1085. icdev/tools/testing/smoke_test.py +283 -0
  1086. icdev/tools/testing/test_agent_models.py +117 -0
  1087. icdev/tools/testing/test_orchestrator.py +957 -0
  1088. icdev/tools/testing/utils.py +229 -0
  1089. icdev/tools/translation/__init__.py +17 -0
  1090. icdev/tools/translation/code_translator.py +550 -0
  1091. icdev/tools/translation/dependency_mapper.py +277 -0
  1092. icdev/tools/translation/feature_map.py +395 -0
  1093. icdev/tools/translation/project_assembler.py +439 -0
  1094. icdev/tools/translation/source_extractor.py +609 -0
  1095. icdev/tools/translation/test_translator.py +333 -0
  1096. icdev/tools/translation/translation_manager.py +582 -0
  1097. icdev/tools/translation/translation_validator.py +662 -0
  1098. icdev/tools/translation/type_checker.py +371 -0
  1099. icdev-1.0.0.dist-info/METADATA +868 -0
  1100. icdev-1.0.0.dist-info/RECORD +1105 -0
  1101. icdev-1.0.0.dist-info/WHEEL +5 -0
  1102. icdev-1.0.0.dist-info/entry_points.txt +9 -0
  1103. icdev-1.0.0.dist-info/licenses/LICENSE +254 -0
  1104. icdev-1.0.0.dist-info/licenses/NOTICE +268 -0
  1105. icdev-1.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1639 @@
1
+ # [TEMPLATE: CUI // SP-CTI]
2
+ #!/usr/bin/env python3
3
+ """Migration Code Generator — ICDEV DoD Modernization System.
4
+
5
+ Produces adapters, facades, microservice scaffolds, data access layers,
6
+ migration tests, and rollback scripts from migration plans stored in
7
+ icdev.db. All generated source files carry CUI // SP-CTI banners.
8
+
9
+ Usage:
10
+ # Generate everything for a migration plan
11
+ python tools/modernization/migration_code_generator.py \\
12
+ --plan-id mplan-001 --output .tmp/migration --generate all
13
+
14
+ # Generate only adapters in Java
15
+ python tools/modernization/migration_code_generator.py \\
16
+ --plan-id mplan-001 --output .tmp/migration --generate adapters --language java
17
+
18
+ # Generate a single service scaffold
19
+ python tools/modernization/migration_code_generator.py \\
20
+ --plan-id mplan-001 --output .tmp/migration --generate scaffolds \\
21
+ --service-name user-service --language python --framework flask
22
+
23
+ # JSON output
24
+ python tools/modernization/migration_code_generator.py \\
25
+ --plan-id mplan-001 --output .tmp/migration --generate all --json
26
+
27
+ Classification: CUI // SP-CTI
28
+ """
29
+
30
+ import argparse
31
+ import collections
32
+ import hashlib
33
+ import json
34
+ import os
35
+ import sqlite3
36
+ import textwrap
37
+ from datetime import datetime, timezone
38
+ from pathlib import Path
39
+ from icdev._paths import get_project_root
40
+
41
+ # ---------------------------------------------------------------------------
42
+ # Configuration
43
+ # ---------------------------------------------------------------------------
44
+
45
+ BASE_DIR = get_project_root()
46
+ DB_PATH = BASE_DIR / "data" / "icdev.db"
47
+
48
+ CUI_BANNER = "CUI // SP-CTI"
49
+
50
+ # Language-specific comment banners
51
+ _COMMENT_BANNERS = {
52
+ "python": (f"# {CUI_BANNER}", f"# {CUI_BANNER}"),
53
+ "java": (f"// {CUI_BANNER}", f"// {CUI_BANNER}"),
54
+ "csharp": (f"// {CUI_BANNER}", f"// {CUI_BANNER}"),
55
+ }
56
+
57
+ # File extensions per language
58
+ _EXTENSIONS = {"python": ".py", "java": ".java", "csharp": ".cs"}
59
+
60
+ # Framework defaults per language
61
+ _DEFAULT_FRAMEWORK = {
62
+ "python": "flask",
63
+ "java": "spring-boot",
64
+ "csharp": "aspnet-core",
65
+ }
66
+
67
+
68
+ # ---------------------------------------------------------------------------
69
+ # Database helpers
70
+ # ---------------------------------------------------------------------------
71
+
72
+ def _get_db():
73
+ """Return a sqlite3 connection with Row factory."""
74
+ conn = sqlite3.connect(str(DB_PATH))
75
+ conn.row_factory = sqlite3.Row
76
+ return conn
77
+
78
+
79
+ def _record_artifact(plan_id, task_id, artifact_type, file_path, description):
80
+ """Insert a row into migration_artifacts and compute file_hash."""
81
+ file_path_str = str(file_path)
82
+ file_hash = ""
83
+ if os.path.isfile(file_path_str):
84
+ with open(file_path_str, "rb") as fh:
85
+ file_hash = hashlib.sha256(fh.read()).hexdigest()
86
+ conn = _get_db()
87
+ conn.execute(
88
+ "INSERT INTO migration_artifacts "
89
+ "(plan_id, task_id, artifact_type, file_path, file_hash, description, created_at) "
90
+ "VALUES (?, ?, ?, ?, ?, ?, ?)",
91
+ (plan_id, task_id, artifact_type, file_path_str, file_hash, description,
92
+ datetime.now(timezone.utc).isoformat()),
93
+ )
94
+ conn.commit()
95
+ conn.close()
96
+
97
+
98
+ def _write_file(path, content):
99
+ """Write *content* to *path*, creating parent dirs as needed."""
100
+ path = Path(path)
101
+ path.parent.mkdir(parents=True, exist_ok=True)
102
+ path.write_text(content, encoding="utf-8")
103
+ return path
104
+
105
+
106
+ def _banner_top(language):
107
+ return _COMMENT_BANNERS.get(language, ("# " + CUI_BANNER,))[0]
108
+
109
+
110
+ def _banner_bottom(language):
111
+ pair = _COMMENT_BANNERS.get(language, ("# " + CUI_BANNER, "# " + CUI_BANNER))
112
+ return pair[1]
113
+
114
+
115
+ def _ext(language):
116
+ return _EXTENSIONS.get(language, ".py")
117
+
118
+
119
+ def _safe_class_name(name):
120
+ """Convert an arbitrary string into a PascalCase class-safe name."""
121
+ parts = name.replace("-", "_").replace(".", "_").split("_")
122
+ return "".join(p.capitalize() for p in parts if p)
123
+
124
+
125
+ def _safe_var_name(name):
126
+ """Convert to a snake_case variable-safe name."""
127
+ return name.replace("-", "_").replace(".", "_").replace(" ", "_").lower()
128
+
129
+
130
+ # ---------------------------------------------------------------------------
131
+ # 1. generate_adapter
132
+ # ---------------------------------------------------------------------------
133
+
134
+ def generate_adapter(plan_id, legacy_component_id, language="python", output_dir="."):
135
+ """Generate an adapter-pattern wrapper for a legacy component."""
136
+ conn = _get_db()
137
+
138
+ comp = conn.execute(
139
+ "SELECT * FROM legacy_components WHERE id = ?", (legacy_component_id,)
140
+ ).fetchone()
141
+ if not comp:
142
+ conn.close()
143
+ raise ValueError(f"Legacy component {legacy_component_id} not found")
144
+
145
+ comp_name = comp["name"]
146
+ qualified = comp["qualified_name"] or comp_name
147
+ props_json = comp["properties"] or "{}"
148
+ props = json.loads(props_json) if isinstance(props_json, str) else {}
149
+
150
+ # Derive method list from properties or fall back to placeholder
151
+ methods = props.get("methods", [])
152
+ if not methods:
153
+ methods = [{"name": "execute", "params": [], "return_type": "object"}]
154
+
155
+ class_name = _safe_class_name(comp_name)
156
+ adapter_class = f"Legacy{class_name}Adapter"
157
+ modern_iface = f"Modern{class_name}Interface"
158
+
159
+ # Look for a matching migration task
160
+ task = conn.execute(
161
+ "SELECT id FROM migration_tasks WHERE plan_id = ? AND legacy_component_id = ? "
162
+ "AND task_type = 'generate_adapter' LIMIT 1",
163
+ (plan_id, legacy_component_id),
164
+ ).fetchone()
165
+ task_id = task["id"] if task else None
166
+ conn.close()
167
+
168
+ ext = _ext(language)
169
+ out_path = Path(output_dir) / "adapters" / f"{_safe_var_name(comp_name)}_adapter{ext}"
170
+
171
+ if language == "python":
172
+ method_defs = []
173
+ for m in methods:
174
+ params_str = ", ".join(m.get("params", []))
175
+ sig = f"self, {params_str}" if params_str else "self"
176
+ method_defs.append(textwrap.dedent(f"""\
177
+ def {m['name']}({sig}):
178
+ \"\"\"Delegate to legacy {qualified}.{m['name']}.\"\"\"
179
+ return self._legacy.{m['name']}({params_str})
180
+ """))
181
+ body = "\n ".join("\n".join(method_defs).split("\n"))
182
+ code = textwrap.dedent(f"""\
183
+ {_banner_top(language)}
184
+ \"\"\"Adapter for legacy component: {qualified}.
185
+
186
+ Wraps the legacy interface and exposes a modern interface.
187
+ Classification: {CUI_BANNER}
188
+ \"\"\"
189
+
190
+
191
+ class {adapter_class}:
192
+ \"\"\"Adapts {qualified} to the modern interface.\"\"\"
193
+
194
+ def __init__(self, legacy_instance):
195
+ self._legacy = legacy_instance
196
+
197
+ {body}
198
+
199
+ def health_check(self):
200
+ \"\"\"Return adapter health status.\"\"\"
201
+ return {{"status": "healthy", "component": "{comp_name}", "adapter": True}}
202
+ {_banner_bottom(language)}
203
+ """)
204
+ elif language == "java":
205
+ method_defs = []
206
+ for m in methods:
207
+ ret = m.get("return_type", "Object")
208
+ params_str = ", ".join(f"Object {p}" for p in m.get("params", []))
209
+ call_args = ", ".join(m.get("params", []))
210
+ method_defs.append(
211
+ f" public {ret} {m['name']}({params_str}) {{\n"
212
+ f" return this.legacy.{m['name']}({call_args});\n"
213
+ f" }}"
214
+ )
215
+ methods_block = "\n\n".join(method_defs)
216
+ code = textwrap.dedent(f"""\
217
+ {_banner_top(language)}
218
+ /**
219
+ * Adapter for legacy component: {qualified}.
220
+ * Classification: {CUI_BANNER}
221
+ */
222
+ public class {adapter_class} implements {modern_iface} {{
223
+
224
+ private final Object legacy;
225
+
226
+ public {adapter_class}(Object legacyInstance) {{
227
+ this.legacy = legacyInstance;
228
+ }}
229
+
230
+ {methods_block}
231
+
232
+ public java.util.Map<String, Object> healthCheck() {{
233
+ java.util.Map<String, Object> status = new java.util.HashMap<>();
234
+ status.put("status", "healthy");
235
+ status.put("component", "{comp_name}");
236
+ status.put("adapter", true);
237
+ return status;
238
+ }}
239
+ }}
240
+ {_banner_bottom(language)}
241
+ """)
242
+ elif language == "csharp":
243
+ method_defs = []
244
+ for m in methods:
245
+ ret = m.get("return_type", "object")
246
+ params_str = ", ".join(f"object {p}" for p in m.get("params", []))
247
+ call_args = ", ".join(m.get("params", []))
248
+ method_defs.append(
249
+ f" public {ret} {_safe_class_name(m['name'])}({params_str})\n"
250
+ f" {{\n"
251
+ f" return _legacy.{m['name']}({call_args});\n"
252
+ f" }}"
253
+ )
254
+ methods_block = "\n\n".join(method_defs)
255
+ code = textwrap.dedent(f"""\
256
+ {_banner_top(language)}
257
+ /// <summary>
258
+ /// Adapter for legacy component: {qualified}.
259
+ /// Classification: {CUI_BANNER}
260
+ /// </summary>
261
+ public class {adapter_class} : IModern{class_name}
262
+ {{
263
+ private readonly dynamic _legacy;
264
+
265
+ public {adapter_class}(object legacyInstance)
266
+ {{
267
+ _legacy = legacyInstance;
268
+ }}
269
+
270
+ {methods_block}
271
+
272
+ public object HealthCheck()
273
+ {{
274
+ return new {{ Status = "healthy", Component = "{comp_name}", Adapter = true }};
275
+ }}
276
+ }}
277
+ {_banner_bottom(language)}
278
+ """)
279
+ else:
280
+ raise ValueError(f"Unsupported language: {language}")
281
+
282
+ _write_file(out_path, code)
283
+ _record_artifact(plan_id, task_id, "adapter_code", out_path, f"Adapter for {comp_name}")
284
+ return str(out_path)
285
+
286
+
287
+ # ---------------------------------------------------------------------------
288
+ # 2. generate_facade
289
+ # ---------------------------------------------------------------------------
290
+
291
+ def generate_facade(plan_id, language="python", output_dir="."):
292
+ """Generate an API facade with routing for all legacy endpoints."""
293
+ conn = _get_db()
294
+
295
+ plan = conn.execute("SELECT * FROM migration_plans WHERE id = ?", (plan_id,)).fetchone()
296
+ if not plan:
297
+ conn.close()
298
+ raise ValueError(f"Migration plan {plan_id} not found")
299
+
300
+ app_id = plan["legacy_app_id"]
301
+ apis = conn.execute(
302
+ "SELECT * FROM legacy_apis WHERE legacy_app_id = ? ORDER BY path", (app_id,)
303
+ ).fetchall()
304
+
305
+ # Group by service boundary from extract_service tasks
306
+ service_tasks = conn.execute(
307
+ "SELECT mt.id, mt.title, mt.legacy_component_id FROM migration_tasks mt "
308
+ "WHERE mt.plan_id = ? AND mt.task_type = 'extract_service'", (plan_id,)
309
+ ).fetchall()
310
+
311
+ # Map component_id -> service name
312
+ comp_to_service = {}
313
+ for st in service_tasks:
314
+ comp_to_service[st["legacy_component_id"]] = st["title"]
315
+
316
+ task = conn.execute(
317
+ "SELECT id FROM migration_tasks WHERE plan_id = ? AND task_type = 'generate_facade' LIMIT 1",
318
+ (plan_id,),
319
+ ).fetchone()
320
+ task_id = task["id"] if task else None
321
+ conn.close()
322
+
323
+ ext = _ext(language)
324
+ out_path = Path(output_dir) / "facade" / f"api_facade{ext}"
325
+
326
+ if language == "python":
327
+ route_blocks = []
328
+ for api in apis:
329
+ method = (api["method"] or "GET").lower()
330
+ path = api["path"] or "/"
331
+ handler = api["handler_function"] or "handler"
332
+ svc = comp_to_service.get(api["component_id"], "legacy")
333
+ func_name = _safe_var_name(f"{method}_{path.replace('/', '_')}")
334
+ route_blocks.append(textwrap.dedent(f"""\
335
+ @app.route("{path}", methods=["{method.upper()}"])
336
+ def {func_name}():
337
+ \"\"\"Proxy to {svc} service (legacy: {handler}).\"\"\"
338
+ backend = BACKENDS.get("{svc}", BACKENDS["legacy"])
339
+ resp = requests.request("{method}", backend + "{path}", json=request.get_json(), headers=dict(request.headers))
340
+ return (resp.content, resp.status_code, dict(resp.headers))
341
+ """))
342
+ routes_code = "\n\n".join(route_blocks) if route_blocks else "# No legacy APIs found\npass\n"
343
+ code = textwrap.dedent(f"""\
344
+ {_banner_top(language)}
345
+ \"\"\"API Facade — routes traffic between legacy and modern services.
346
+
347
+ Generated by ICDEV Migration Code Generator.
348
+ Classification: {CUI_BANNER}
349
+ \"\"\"
350
+ import os
351
+ import requests
352
+ from flask import Flask, request
353
+
354
+ app = Flask(__name__)
355
+
356
+ # Backend URLs (override via environment variables)
357
+ BACKENDS = {{
358
+ "legacy": os.environ.get("LEGACY_BACKEND", "http://localhost:8000"),
359
+ }}
360
+
361
+ {routes_code}
362
+
363
+ @app.route("/health")
364
+ def health():
365
+ return {{"status": "healthy", "service": "api-facade"}}
366
+
367
+
368
+ if __name__ == "__main__":
369
+ app.run(host="0.0.0.0", port=5050)
370
+ {_banner_bottom(language)}
371
+ """)
372
+ elif language == "java":
373
+ mappings = []
374
+ for api in apis:
375
+ method = (api["method"] or "GET").upper()
376
+ path = api["path"] or "/"
377
+ handler = api["handler_function"] or "handler"
378
+ svc = comp_to_service.get(api["component_id"], "legacy")
379
+ method_name = _safe_var_name(f"{method.lower()}_{path.replace('/', '_')}")
380
+ annotation = f"@RequestMapping(value = \"{path}\", method = RequestMethod.{method})"
381
+ mappings.append(
382
+ f" {annotation}\n"
383
+ f" public ResponseEntity<String> {method_name}(HttpServletRequest req) {{\n"
384
+ f" // Proxy to {svc} service (legacy: {handler})\n"
385
+ f" String backend = backends.getOrDefault(\"{svc}\", backends.get(\"legacy\"));\n"
386
+ f" return proxyRequest(req, backend + \"{path}\");\n"
387
+ f" }}"
388
+ )
389
+ mappings_block = "\n\n".join(mappings) if mappings else " // No legacy APIs found"
390
+ code = textwrap.dedent(f"""\
391
+ {_banner_top(language)}
392
+ /**
393
+ * API Facade - routes traffic between legacy and modern services.
394
+ * Generated by ICDEV Migration Code Generator.
395
+ * Classification: {CUI_BANNER}
396
+ */
397
+ import org.springframework.web.bind.annotation.*;
398
+ import org.springframework.http.ResponseEntity;
399
+ import javax.servlet.http.HttpServletRequest;
400
+ import java.util.*;
401
+
402
+ @RestController
403
+ public class ApiFacade {{
404
+
405
+ private final Map<String, String> backends = new HashMap<>() {{{{
406
+ put("legacy", System.getenv().getOrDefault("LEGACY_BACKEND", "http://localhost:8000"));
407
+ }}}};
408
+
409
+ {mappings_block}
410
+
411
+ @GetMapping("/health")
412
+ public Map<String, Object> health() {{
413
+ Map<String, Object> status = new HashMap<>();
414
+ status.put("status", "healthy");
415
+ status.put("service", "api-facade");
416
+ return status;
417
+ }}
418
+
419
+ private ResponseEntity<String> proxyRequest(HttpServletRequest req, String targetUrl) {{
420
+ // TODO: implement HTTP proxying with RestTemplate or WebClient
421
+ return ResponseEntity.ok("proxy-stub");
422
+ }}
423
+ }}
424
+ {_banner_bottom(language)}
425
+ """)
426
+ elif language == "csharp":
427
+ actions = []
428
+ for api in apis:
429
+ method = (api["method"] or "GET").upper()
430
+ path = api["path"] or "/"
431
+ handler = api["handler_function"] or "handler"
432
+ svc = comp_to_service.get(api["component_id"], "legacy")
433
+ attr = {"GET": "HttpGet", "POST": "HttpPost", "PUT": "HttpPut",
434
+ "DELETE": "HttpDelete", "PATCH": "HttpPatch"}.get(method, "HttpGet")
435
+ method_name = _safe_class_name(f"{method.lower()}_{path.replace('/', '_')}")
436
+ actions.append(
437
+ f" [{attr}(\"{path}\")]\n"
438
+ f" public async Task<IActionResult> {method_name}()\n"
439
+ f" {{\n"
440
+ f" // Proxy to {svc} service (legacy: {handler})\n"
441
+ f" var backend = _backends.GetValueOrDefault(\"{svc}\", _backends[\"legacy\"]);\n"
442
+ f" return await ProxyRequest(backend + \"{path}\");\n"
443
+ f" }}"
444
+ )
445
+ actions_block = "\n\n".join(actions) if actions else " // No legacy APIs found"
446
+ code = textwrap.dedent(f"""\
447
+ {_banner_top(language)}
448
+ /// <summary>
449
+ /// API Facade - routes traffic between legacy and modern services.
450
+ /// Generated by ICDEV Migration Code Generator.
451
+ /// Classification: {CUI_BANNER}
452
+ /// </summary>
453
+ using Microsoft.AspNetCore.Mvc;
454
+ using System.Collections.Generic;
455
+ using System.Threading.Tasks;
456
+
457
+ [ApiController]
458
+ [Route("/")]
459
+ public class ApiFacadeController : ControllerBase
460
+ {{
461
+ private readonly Dictionary<string, string> _backends = new()
462
+ {{
463
+ ["legacy"] = Environment.GetEnvironmentVariable("LEGACY_BACKEND") ?? "http://localhost:8000"
464
+ }};
465
+
466
+ {actions_block}
467
+
468
+ [HttpGet("health")]
469
+ public IActionResult Health()
470
+ {{
471
+ return Ok(new {{ Status = "healthy", Service = "api-facade" }});
472
+ }}
473
+
474
+ private async Task<IActionResult> ProxyRequest(string targetUrl)
475
+ {{
476
+ // TODO: implement HTTP proxying with HttpClient
477
+ await Task.CompletedTask;
478
+ return Ok("proxy-stub");
479
+ }}
480
+ }}
481
+ {_banner_bottom(language)}
482
+ """)
483
+ else:
484
+ raise ValueError(f"Unsupported language: {language}")
485
+
486
+ _write_file(out_path, code)
487
+ _record_artifact(plan_id, task_id, "facade_code", out_path, "API facade for migration plan")
488
+ return str(out_path)
489
+
490
+
491
+ # ---------------------------------------------------------------------------
492
+ # 3. generate_service_scaffold
493
+ # ---------------------------------------------------------------------------
494
+
495
+ def generate_service_scaffold(plan_id, service_name, language="python",
496
+ framework=None, output_dir="."):
497
+ """Generate a microservice skeleton for the given service name."""
498
+ framework = framework or _DEFAULT_FRAMEWORK.get(language, "flask")
499
+ svc_dir = Path(output_dir) / "services" / service_name
500
+ svc_class = _safe_class_name(service_name)
501
+ svc_var = _safe_var_name(service_name)
502
+ ban_top = _banner_top(language)
503
+ ban_bot = _banner_bottom(language)
504
+
505
+ conn = _get_db()
506
+ task = conn.execute(
507
+ "SELECT id FROM migration_tasks WHERE plan_id = ? AND task_type = 'extract_service' "
508
+ "AND title LIKE ? LIMIT 1",
509
+ (plan_id, f"%{service_name}%"),
510
+ ).fetchone()
511
+ task_id = task["id"] if task else None
512
+ conn.close()
513
+
514
+
515
+ # -- Python / Flask -------------------------------------------------
516
+ if language == "python" and framework in ("flask", "flask"):
517
+ _write_file(svc_dir / "app.py", textwrap.dedent(f"""\
518
+ {ban_top}
519
+ \"\"\"Flask application for {service_name}. Classification: {CUI_BANNER}\"\"\"
520
+ from flask import Flask
521
+ from routes import register_routes
522
+
523
+ app = Flask(__name__)
524
+
525
+ register_routes(app)
526
+
527
+ @app.route("/health")
528
+ def health():
529
+ return {{"status": "healthy", "service": "{service_name}"}}
530
+
531
+ if __name__ == "__main__":
532
+ app.run(host="0.0.0.0", port=8080)
533
+ {ban_bot}
534
+ """))
535
+ _write_file(svc_dir / "config.py", textwrap.dedent(f"""\
536
+ {ban_top}
537
+ \"\"\"Configuration for {service_name}. Classification: {CUI_BANNER}\"\"\"
538
+ import os
539
+
540
+ DATABASE_URL = os.environ.get("DATABASE_URL", "sqlite:///data.db")
541
+ SECRET_KEY = os.environ.get("SECRET_KEY", "change-me")
542
+ DEBUG = os.environ.get("DEBUG", "false").lower() == "true"
543
+ {ban_bot}
544
+ """))
545
+ _write_file(svc_dir / "routes" / "__init__.py", textwrap.dedent(f"""\
546
+ {ban_top}
547
+ \"\"\"Route registration for {service_name}. Classification: {CUI_BANNER}\"\"\"
548
+ from flask import Flask, jsonify
549
+
550
+ def register_routes(app: Flask):
551
+ @app.route("/api/v1/{svc_var}", methods=["GET"])
552
+ def list_{svc_var}():
553
+ return jsonify([])
554
+
555
+ @app.route("/api/v1/{svc_var}/<item_id>", methods=["GET"])
556
+ def get_{svc_var}(item_id):
557
+ return jsonify({{"id": item_id}})
558
+ {ban_bot}
559
+ """))
560
+ _write_file(svc_dir / "models" / "__init__.py", f"{ban_top}\n# Models for {service_name}\n{ban_bot}\n")
561
+ _write_file(svc_dir / "tests" / "__init__.py", f"{ban_top}\n# Tests for {service_name}\n{ban_bot}\n")
562
+ _write_file(svc_dir / "tests" / "test_health.py", textwrap.dedent(f"""\
563
+ {ban_top}
564
+ \"\"\"Health check tests for {service_name}. Classification: {CUI_BANNER}\"\"\"
565
+ import pytest
566
+ from app import app
567
+
568
+ @pytest.fixture
569
+ def client():
570
+ app.config["TESTING"] = True
571
+ with app.test_client() as c:
572
+ yield c
573
+
574
+ def test_health_endpoint(client):
575
+ rv = client.get("/health")
576
+ assert rv.status_code == 200
577
+ data = rv.get_json()
578
+ assert data["status"] == "healthy"
579
+ {ban_bot}
580
+ """))
581
+ _write_file(svc_dir / "requirements.txt", "flask>=3.0\npytest>=7.0\nSQLAlchemy>=2.0\n")
582
+ _write_file(svc_dir / "Dockerfile", textwrap.dedent(f"""\
583
+ # {CUI_BANNER}
584
+ FROM python:3.11-slim
585
+ RUN useradd -r -u 1000 appuser
586
+ WORKDIR /app
587
+ COPY requirements.txt .
588
+ RUN pip install --no-cache-dir -r requirements.txt
589
+ COPY . .
590
+ USER appuser
591
+ EXPOSE 8080
592
+ CMD ["python", "app.py"]
593
+ # {CUI_BANNER}
594
+ """))
595
+
596
+ # -- Python / FastAPI -----------------------------------------------
597
+ elif language == "python" and framework == "fastapi":
598
+ _write_file(svc_dir / "main.py", textwrap.dedent(f"""\
599
+ {ban_top}
600
+ \"\"\"FastAPI application for {service_name}. Classification: {CUI_BANNER}\"\"\"
601
+ from fastapi import FastAPI
602
+ from routers import {svc_var}_router
603
+
604
+ app = FastAPI(title="{service_name}")
605
+ app.include_router({svc_var}_router.router, prefix="/api/v1")
606
+
607
+ @app.get("/health")
608
+ def health():
609
+ return {{"status": "healthy", "service": "{service_name}"}}
610
+ {ban_bot}
611
+ """))
612
+ _write_file(svc_dir / "config.py", textwrap.dedent(f"""\
613
+ {ban_top}
614
+ \"\"\"Configuration for {service_name}. Classification: {CUI_BANNER}\"\"\"
615
+ import os
616
+ DATABASE_URL = os.environ.get("DATABASE_URL", "sqlite:///data.db")
617
+ SECRET_KEY = os.environ.get("SECRET_KEY", "change-me")
618
+ {ban_bot}
619
+ """))
620
+ _write_file(svc_dir / "routers" / f"{svc_var}_router.py", textwrap.dedent(f"""\
621
+ {ban_top}
622
+ \"\"\"Router for {service_name}. Classification: {CUI_BANNER}\"\"\"
623
+ from fastapi import APIRouter
624
+ router = APIRouter()
625
+
626
+ @router.get("/{svc_var}")
627
+ def list_items():
628
+ return []
629
+
630
+ @router.get("/{svc_var}/{{item_id}}")
631
+ def get_item(item_id: str):
632
+ return {{"id": item_id}}
633
+ {ban_bot}
634
+ """))
635
+ _write_file(svc_dir / "models" / "__init__.py", f"{ban_top}\n# Models for {service_name}\n{ban_bot}\n")
636
+ _write_file(svc_dir / "tests" / "__init__.py", f"{ban_top}\n# Tests for {service_name}\n{ban_bot}\n")
637
+ _write_file(svc_dir / "tests" / "test_health.py", textwrap.dedent(f"""\
638
+ {ban_top}
639
+ \"\"\"Health tests for {service_name}. Classification: {CUI_BANNER}\"\"\"
640
+ from fastapi.testclient import TestClient
641
+ from main import app
642
+
643
+ client = TestClient(app)
644
+
645
+ def test_health():
646
+ resp = client.get("/health")
647
+ assert resp.status_code == 200
648
+ assert resp.json()["status"] == "healthy"
649
+ {ban_bot}
650
+ """))
651
+ _write_file(svc_dir / "requirements.txt", "fastapi>=0.110\nuvicorn>=0.29\npytest>=7.0\nSQLAlchemy>=2.0\nhttpx>=0.27\n")
652
+ _write_file(svc_dir / "Dockerfile", textwrap.dedent(f"""\
653
+ # {CUI_BANNER}
654
+ FROM python:3.11-slim
655
+ RUN useradd -r -u 1000 appuser
656
+ WORKDIR /app
657
+ COPY requirements.txt .
658
+ RUN pip install --no-cache-dir -r requirements.txt
659
+ COPY . .
660
+ USER appuser
661
+ EXPOSE 8080
662
+ CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]
663
+ # {CUI_BANNER}
664
+ """))
665
+
666
+ # -- Java / Spring Boot ---------------------------------------------
667
+ elif language == "java" and framework == "spring-boot":
668
+ pkg = f"com.icdev.{svc_var}"
669
+ pkg_path = pkg.replace(".", "/")
670
+ _write_file(svc_dir / f"src/main/java/{pkg_path}/{svc_class}Application.java", textwrap.dedent(f"""\
671
+ {ban_top}
672
+ package {pkg};
673
+ import org.springframework.boot.SpringApplication;
674
+ import org.springframework.boot.autoconfigure.SpringBootApplication;
675
+ /** Classification: {CUI_BANNER} */
676
+ @SpringBootApplication
677
+ public class {svc_class}Application {{
678
+ public static void main(String[] args) {{
679
+ SpringApplication.run({svc_class}Application.class, args);
680
+ }}
681
+ }}
682
+ {ban_bot}
683
+ """))
684
+ _write_file(svc_dir / f"src/main/java/{pkg_path}/controller/{svc_class}Controller.java", textwrap.dedent(f"""\
685
+ {ban_top}
686
+ package {pkg}.controller;
687
+ import org.springframework.web.bind.annotation.*;
688
+ import java.util.*;
689
+ /** Classification: {CUI_BANNER} */
690
+ @RestController
691
+ @RequestMapping("/api/v1/{svc_var}")
692
+ public class {svc_class}Controller {{
693
+ @GetMapping
694
+ public List<Map<String, Object>> list() {{ return List.of(); }}
695
+ @GetMapping("/health")
696
+ public Map<String, Object> health() {{
697
+ return Map.of("status", "healthy", "service", "{service_name}");
698
+ }}
699
+ }}
700
+ {ban_bot}
701
+ """))
702
+ for sub in ("service", "repository", "model"):
703
+ _write_file(svc_dir / f"src/main/java/{pkg_path}/{sub}/.gitkeep", "")
704
+ _write_file(svc_dir / "pom.xml", textwrap.dedent(f"""\
705
+ <?xml version="1.0" encoding="UTF-8"?>
706
+ <!-- {CUI_BANNER} -->
707
+ <project xmlns="http://maven.apache.org/POM/4.0.0">
708
+ <modelVersion>4.0.0</modelVersion>
709
+ <groupId>com.icdev</groupId>
710
+ <artifactId>{svc_var}</artifactId>
711
+ <version>0.1.0</version>
712
+ <parent>
713
+ <groupId>org.springframework.boot</groupId>
714
+ <artifactId>spring-boot-starter-parent</artifactId>
715
+ <version>3.2.0</version>
716
+ </parent>
717
+ <dependencies>
718
+ <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
719
+ <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency>
720
+ <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
721
+ </dependencies>
722
+ </project>
723
+ <!-- {CUI_BANNER} -->
724
+ """))
725
+ _write_file(svc_dir / "Dockerfile", textwrap.dedent(f"""\
726
+ # {CUI_BANNER}
727
+ FROM eclipse-temurin:17-jre-alpine
728
+ RUN adduser -D -u 1000 appuser
729
+ WORKDIR /app
730
+ COPY target/*.jar app.jar
731
+ USER appuser
732
+ EXPOSE 8080
733
+ CMD ["java", "-jar", "app.jar"]
734
+ # {CUI_BANNER}
735
+ """))
736
+
737
+ # -- C# / ASP.NET Core ---------------------------------------------
738
+ elif language == "csharp" and framework == "aspnet-core":
739
+ _write_file(svc_dir / "Program.cs", textwrap.dedent(f"""\
740
+ {ban_top}
741
+ // Classification: {CUI_BANNER}
742
+ var builder = WebApplication.CreateBuilder(args);
743
+ builder.Services.AddControllers();
744
+ var app = builder.Build();
745
+ app.MapControllers();
746
+ app.MapGet("/health", () => Results.Ok(new {{ Status = "healthy", Service = "{service_name}" }}));
747
+ app.Run();
748
+ {ban_bot}
749
+ """))
750
+ _write_file(svc_dir / f"Controllers/{svc_class}Controller.cs", textwrap.dedent(f"""\
751
+ {ban_top}
752
+ using Microsoft.AspNetCore.Mvc;
753
+ // Classification: {CUI_BANNER}
754
+ [ApiController]
755
+ [Route("api/v1/{svc_var}")]
756
+ public class {svc_class}Controller : ControllerBase
757
+ {{
758
+ [HttpGet]
759
+ public IActionResult List() => Ok(new object[] {{}});
760
+
761
+ [HttpGet("{{id}}")]
762
+ public IActionResult Get(string id) => Ok(new {{ Id = id }});
763
+ }}
764
+ {ban_bot}
765
+ """))
766
+ for sub in ("Services", "Models"):
767
+ _write_file(svc_dir / sub / ".gitkeep", "")
768
+ _write_file(svc_dir / f"{svc_var}.csproj", textwrap.dedent(f"""\
769
+ <!-- {CUI_BANNER} -->
770
+ <Project Sdk="Microsoft.NET.Sdk.Web">
771
+ <PropertyGroup>
772
+ <TargetFramework>net8.0</TargetFramework>
773
+ </PropertyGroup>
774
+ </Project>
775
+ <!-- {CUI_BANNER} -->
776
+ """))
777
+ _write_file(svc_dir / "Dockerfile", textwrap.dedent(f"""\
778
+ # {CUI_BANNER}
779
+ FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine
780
+ RUN adduser -D -u 1000 appuser
781
+ WORKDIR /app
782
+ COPY publish/ .
783
+ USER appuser
784
+ EXPOSE 8080
785
+ CMD ["dotnet", "{svc_var}.dll"]
786
+ # {CUI_BANNER}
787
+ """))
788
+ else:
789
+ raise ValueError(f"Unsupported language/framework: {language}/{framework}")
790
+
791
+ _record_artifact(plan_id, task_id, "scaffold_code", svc_dir,
792
+ f"Service scaffold for {service_name} ({language}/{framework})")
793
+ return str(svc_dir)
794
+
795
+
796
+ # ---------------------------------------------------------------------------
797
+ # 4. generate_data_access_layer
798
+ # ---------------------------------------------------------------------------
799
+
800
+ def generate_data_access_layer(plan_id, service_name, tables, language="python",
801
+ output_dir="."):
802
+ """Generate repository/DAO code from legacy DB schema definitions."""
803
+ conn = _get_db()
804
+ plan = conn.execute("SELECT * FROM migration_plans WHERE id = ?", (plan_id,)).fetchone()
805
+ if not plan:
806
+ conn.close()
807
+ raise ValueError(f"Migration plan {plan_id} not found")
808
+ app_id = plan["legacy_app_id"]
809
+
810
+ all_paths = []
811
+ ban_top = _banner_top(language)
812
+ ban_bot = _banner_bottom(language)
813
+
814
+ for table in tables:
815
+ columns = conn.execute(
816
+ "SELECT * FROM legacy_db_schemas WHERE legacy_app_id = ? AND table_name = ? "
817
+ "ORDER BY column_name",
818
+ (app_id, table),
819
+ ).fetchall()
820
+ if not columns:
821
+ continue
822
+
823
+ model_class = _safe_class_name(table)
824
+ model_var = _safe_var_name(table)
825
+ svc_dir = Path(output_dir) / "services" / service_name
826
+
827
+ if language == "python":
828
+ # Model file
829
+ field_defs = []
830
+ pk_cols = []
831
+ for col in columns:
832
+ sa_type = {"integer": "Integer", "varchar": "String", "text": "Text",
833
+ "boolean": "Boolean", "date": "Date", "timestamp": "DateTime",
834
+ "real": "Float", "float": "Float", "double": "Float",
835
+ "bigint": "BigInteger", "smallint": "SmallInteger",
836
+ }.get(col["data_type"].lower(), "String")
837
+ pk = ", primary_key=True" if col["is_primary_key"] else ""
838
+ fk = ""
839
+ if col["is_foreign_key"] and col["foreign_table"] and col["foreign_column"]:
840
+ fk = f", ForeignKey('{col['foreign_table']}.{col['foreign_column']}')"
841
+ nullable = "" if col["is_primary_key"] else f", nullable={bool(col['is_nullable'])}"
842
+ field_defs.append(
843
+ f" {col['column_name']} = Column({sa_type}{pk}{fk}{nullable})"
844
+ )
845
+ if col["is_primary_key"]:
846
+ pk_cols.append(col["column_name"])
847
+
848
+ fields_block = "\n".join(field_defs)
849
+ model_path = svc_dir / "models" / f"{model_var}.py"
850
+ _write_file(model_path, textwrap.dedent(f"""\
851
+ {ban_top}
852
+ \"\"\"SQLAlchemy model for {table}. Classification: {CUI_BANNER}\"\"\"
853
+ from sqlalchemy import Column, Integer, String, Text, Boolean, Date, DateTime, Float
854
+ from sqlalchemy import BigInteger, SmallInteger, ForeignKey
855
+ from sqlalchemy.orm import declarative_base
856
+
857
+ Base = declarative_base()
858
+
859
+ class {model_class}(Base):
860
+ __tablename__ = "{table}"
861
+
862
+ {fields_block}
863
+
864
+ def to_dict(self):
865
+ return {{c.name: getattr(self, c.name) for c in self.__table__.columns}}
866
+ {ban_bot}
867
+ """))
868
+ all_paths.append(str(model_path))
869
+
870
+ # Repository file
871
+ pk_param = pk_cols[0] if pk_cols else "id"
872
+ repo_path = svc_dir / "repository" / f"{model_var}_repository.py"
873
+ _write_file(repo_path, textwrap.dedent(f"""\
874
+ {ban_top}
875
+ \"\"\"Repository for {table}. Classification: {CUI_BANNER}\"\"\"
876
+ from models.{model_var} import {model_class}
877
+
878
+ class {model_class}Repository:
879
+ def __init__(self, session):
880
+ self.session = session
881
+
882
+ def get_by_id(self, {pk_param}):
883
+ return self.session.query({model_class}).get({pk_param})
884
+
885
+ def list_all(self, limit=100, offset=0):
886
+ return self.session.query({model_class}).limit(limit).offset(offset).all()
887
+
888
+ def create(self, entity):
889
+ self.session.add(entity)
890
+ self.session.commit()
891
+ return entity
892
+
893
+ def update(self, entity):
894
+ self.session.merge(entity)
895
+ self.session.commit()
896
+ return entity
897
+
898
+ def delete(self, {pk_param}):
899
+ obj = self.get_by_id({pk_param})
900
+ if obj:
901
+ self.session.delete(obj)
902
+ self.session.commit()
903
+ return obj
904
+ {ban_bot}
905
+ """))
906
+ all_paths.append(str(repo_path))
907
+
908
+ elif language == "java":
909
+ pkg = f"com.icdev.{_safe_var_name(service_name)}"
910
+ pkg_path = pkg.replace(".", "/")
911
+ svc_dir_java = svc_dir / f"src/main/java/{pkg_path}"
912
+
913
+ field_defs = []
914
+ for col in columns:
915
+ jtype = {"integer": "Integer", "varchar": "String", "text": "String",
916
+ "boolean": "Boolean", "date": "java.time.LocalDate",
917
+ "timestamp": "java.time.LocalDateTime", "real": "Double",
918
+ "float": "Double", "bigint": "Long",
919
+ }.get(col["data_type"].lower(), "String")
920
+ annotations = []
921
+ if col["is_primary_key"]:
922
+ annotations.append(" @Id")
923
+ field_defs.append("\n".join(annotations + [f" private {jtype} {col['column_name']};"]))
924
+ fields_block = "\n".join(field_defs)
925
+ model_path = svc_dir_java / "model" / f"{model_class}.java"
926
+ _write_file(model_path, textwrap.dedent(f"""\
927
+ {ban_top}
928
+ package {pkg}.model;
929
+ import javax.persistence.*;
930
+ /** Entity for {table}. Classification: {CUI_BANNER} */
931
+ @Entity
932
+ @Table(name = "{table}")
933
+ public class {model_class} {{
934
+ {fields_block}
935
+ }}
936
+ {ban_bot}
937
+ """))
938
+ all_paths.append(str(model_path))
939
+
940
+ repo_path = svc_dir_java / "repository" / f"{model_class}Repository.java"
941
+ _write_file(repo_path, textwrap.dedent(f"""\
942
+ {ban_top}
943
+ package {pkg}.repository;
944
+ import {pkg}.model.{model_class};
945
+ import org.springframework.data.jpa.repository.JpaRepository;
946
+ /** Repository for {table}. Classification: {CUI_BANNER} */
947
+ public interface {model_class}Repository extends JpaRepository<{model_class}, Long> {{
948
+ }}
949
+ {ban_bot}
950
+ """))
951
+ all_paths.append(str(repo_path))
952
+
953
+ elif language == "csharp":
954
+ field_defs = []
955
+ for col in columns:
956
+ cstype = {"integer": "int", "varchar": "string", "text": "string",
957
+ "boolean": "bool", "date": "DateTime", "timestamp": "DateTime",
958
+ "real": "double", "float": "double", "bigint": "long",
959
+ }.get(col["data_type"].lower(), "string")
960
+ nullable_q = "?" if (not col["is_primary_key"] and col["is_nullable"]) and cstype != "string" else ""
961
+ field_defs.append(f" public {cstype}{nullable_q} {_safe_class_name(col['column_name'])} {{ get; set; }}")
962
+ fields_block = "\n".join(field_defs)
963
+ model_path = svc_dir / "Models" / f"{model_class}.cs"
964
+ _write_file(model_path, textwrap.dedent(f"""\
965
+ {ban_top}
966
+ // Entity for {table}. Classification: {CUI_BANNER}
967
+ using System.ComponentModel.DataAnnotations;
968
+ using System.ComponentModel.DataAnnotations.Schema;
969
+
970
+ [Table("{table}")]
971
+ public class {model_class}
972
+ {{
973
+ {fields_block}
974
+ }}
975
+ {ban_bot}
976
+ """))
977
+ all_paths.append(str(model_path))
978
+
979
+ ctx_path = svc_dir / "Models" / f"{_safe_class_name(service_name)}DbContext.cs"
980
+ _write_file(ctx_path, textwrap.dedent(f"""\
981
+ {ban_top}
982
+ // EF Core DbContext for {service_name}. Classification: {CUI_BANNER}
983
+ using Microsoft.EntityFrameworkCore;
984
+
985
+ public class {_safe_class_name(service_name)}DbContext : DbContext
986
+ {{
987
+ public {_safe_class_name(service_name)}DbContext(DbContextOptions options) : base(options) {{ }}
988
+ public DbSet<{model_class}> {model_class}s {{ get; set; }}
989
+ }}
990
+ {ban_bot}
991
+ """))
992
+ all_paths.append(str(ctx_path))
993
+
994
+ task = conn.execute(
995
+ "SELECT id FROM migration_tasks WHERE plan_id = ? AND task_type = 'migrate_schema' LIMIT 1",
996
+ (plan_id,),
997
+ ).fetchone()
998
+ task_id = task["id"] if task else None
999
+ conn.close()
1000
+
1001
+ for p in all_paths:
1002
+ _record_artifact(plan_id, task_id, "scaffold_code", p,
1003
+ f"DAL file for {service_name}")
1004
+ return all_paths
1005
+
1006
+
1007
+ # ---------------------------------------------------------------------------
1008
+ # 5. generate_migration_tests
1009
+ # ---------------------------------------------------------------------------
1010
+
1011
+ def generate_migration_tests(plan_id, output_dir="."):
1012
+ """Generate API compatibility, data integrity, and functional equivalence tests."""
1013
+ conn = _get_db()
1014
+ plan = conn.execute("SELECT * FROM migration_plans WHERE id = ?", (plan_id,)).fetchone()
1015
+ if not plan:
1016
+ conn.close()
1017
+ raise ValueError(f"Migration plan {plan_id} not found")
1018
+
1019
+ app_id = plan["legacy_app_id"]
1020
+ language = (plan["target_language"] or "python").lower()
1021
+ ban_top = _banner_top(language)
1022
+ ban_bot = _banner_bottom(language)
1023
+
1024
+ apis = conn.execute(
1025
+ "SELECT * FROM legacy_apis WHERE legacy_app_id = ?", (app_id,)
1026
+ ).fetchall()
1027
+
1028
+ tables = conn.execute(
1029
+ "SELECT DISTINCT table_name FROM legacy_db_schemas WHERE legacy_app_id = ?",
1030
+ (app_id,),
1031
+ ).fetchall()
1032
+
1033
+ components = conn.execute(
1034
+ "SELECT lc.* FROM legacy_components lc "
1035
+ "JOIN migration_tasks mt ON mt.legacy_component_id = lc.id "
1036
+ "WHERE mt.plan_id = ?", (plan_id,)
1037
+ ).fetchall()
1038
+
1039
+ task = conn.execute(
1040
+ "SELECT id FROM migration_tasks WHERE plan_id = ? AND task_type = 'generate_test' LIMIT 1",
1041
+ (plan_id,),
1042
+ ).fetchone()
1043
+ task_id = task["id"] if task else None
1044
+ conn.close()
1045
+
1046
+ test_dir = Path(output_dir) / "tests"
1047
+ all_paths = []
1048
+
1049
+ # --- API compatibility tests ---
1050
+ if language == "python":
1051
+ api_tests = []
1052
+ for api in apis:
1053
+ method = (api["method"] or "GET").lower()
1054
+ path = api["path"] or "/"
1055
+ func = _safe_var_name(f"test_api_{method}_{path.replace('/', '_')}")
1056
+ api_tests.append(textwrap.dedent(f"""\
1057
+ def {func}(legacy_base, modern_base):
1058
+ \"\"\"Compare legacy and modern responses for {method.upper()} {path}.\"\"\"
1059
+ legacy_resp = requests.{method}(legacy_base + "{path}")
1060
+ modern_resp = requests.{method}(modern_base + "{path}")
1061
+ assert legacy_resp.status_code == modern_resp.status_code, (
1062
+ f"Status mismatch: {{legacy_resp.status_code}} vs {{modern_resp.status_code}}"
1063
+ )
1064
+ assert legacy_resp.json() == modern_resp.json(), "Response body mismatch"
1065
+ """))
1066
+ api_block = "\n\n".join(api_tests) if api_tests else "# No legacy APIs to test\npass\n"
1067
+ api_path = test_dir / "test_api_compatibility.py"
1068
+ _write_file(api_path, textwrap.dedent(f"""\
1069
+ {ban_top}
1070
+ \"\"\"API compatibility tests — compares legacy vs modern responses.
1071
+
1072
+ Classification: {CUI_BANNER}
1073
+ \"\"\"
1074
+ import pytest
1075
+ import requests
1076
+
1077
+ LEGACY_BASE = "http://localhost:8000"
1078
+ MODERN_BASE = "http://localhost:8080"
1079
+
1080
+ @pytest.fixture
1081
+ def legacy_base():
1082
+ return LEGACY_BASE
1083
+
1084
+ @pytest.fixture
1085
+ def modern_base():
1086
+ return MODERN_BASE
1087
+
1088
+ {api_block}
1089
+ {ban_bot}
1090
+ """))
1091
+ all_paths.append(str(api_path))
1092
+
1093
+ # --- Data integrity tests ---
1094
+ data_tests = []
1095
+ for trow in tables:
1096
+ tname = trow["table_name"]
1097
+ func = _safe_var_name(f"test_data_{tname}")
1098
+ data_tests.append(textwrap.dedent(f"""\
1099
+ def {func}(legacy_conn, modern_conn):
1100
+ \"\"\"Verify row counts match for table {tname}.\"\"\"
1101
+ legacy_count = legacy_conn.execute("SELECT COUNT(*) FROM {tname}").fetchone()[0]
1102
+ modern_count = modern_conn.execute("SELECT COUNT(*) FROM {tname}").fetchone()[0]
1103
+ assert legacy_count == modern_count, (
1104
+ f"Row count mismatch for {tname}: {{legacy_count}} vs {{modern_count}}"
1105
+ )
1106
+ """))
1107
+ data_block = "\n\n".join(data_tests) if data_tests else "# No tables to test\npass\n"
1108
+ data_path = test_dir / "test_data_integrity.py"
1109
+ _write_file(data_path, textwrap.dedent(f"""\
1110
+ {ban_top}
1111
+ \"\"\"Data integrity tests — compares legacy vs modern row counts.
1112
+
1113
+ Classification: {CUI_BANNER}
1114
+ \"\"\"
1115
+ import pytest
1116
+ import sqlite3
1117
+
1118
+ @pytest.fixture
1119
+ def legacy_conn():
1120
+ conn = sqlite3.connect("legacy.db")
1121
+ yield conn
1122
+ conn.close()
1123
+
1124
+ @pytest.fixture
1125
+ def modern_conn():
1126
+ conn = sqlite3.connect("modern.db")
1127
+ yield conn
1128
+ conn.close()
1129
+
1130
+ {data_block}
1131
+ {ban_bot}
1132
+ """))
1133
+ all_paths.append(str(data_path))
1134
+
1135
+ # --- Functional equivalence tests ---
1136
+ func_tests = []
1137
+ for comp in components:
1138
+ cname = comp["name"]
1139
+ func = _safe_var_name(f"test_equivalence_{cname}")
1140
+ func_tests.append(textwrap.dedent(f"""\
1141
+ def {func}():
1142
+ \"\"\"Functional equivalence test for {cname}.\"\"\"
1143
+ # TODO: implement test that exercises both legacy and modern {cname}
1144
+ # and compares outputs for identical inputs.
1145
+ legacy_result = None # call legacy {cname}
1146
+ modern_result = None # call modern {cname}
1147
+ assert legacy_result == modern_result, "Functional equivalence failed for {cname}"
1148
+ """))
1149
+ func_block = "\n\n".join(func_tests) if func_tests else "# No components to test\npass\n"
1150
+ func_path = test_dir / "test_functional_equivalence.py"
1151
+ _write_file(func_path, textwrap.dedent(f"""\
1152
+ {ban_top}
1153
+ \"\"\"Functional equivalence tests — skeleton with TODO markers.
1154
+
1155
+ Classification: {CUI_BANNER}
1156
+ \"\"\"
1157
+ import pytest
1158
+
1159
+ {func_block}
1160
+ {ban_bot}
1161
+ """))
1162
+ all_paths.append(str(func_path))
1163
+
1164
+ elif language == "java":
1165
+ api_path = test_dir / "ApiCompatibilityTest.java"
1166
+ api_methods = []
1167
+ for api in apis:
1168
+ method = (api["method"] or "GET").upper()
1169
+ path = api["path"] or "/"
1170
+ mname = _safe_var_name(f"test_{method.lower()}_{path.replace('/', '_')}")
1171
+ api_methods.append(
1172
+ f" @Test\n public void {mname}() {{\n"
1173
+ f" // TODO: compare legacy and modern responses for {method} {path}\n"
1174
+ f" }}"
1175
+ )
1176
+ api_block = "\n\n".join(api_methods) if api_methods else " // No legacy APIs to test"
1177
+ _write_file(api_path, textwrap.dedent(f"""\
1178
+ {ban_top}
1179
+ /** API compatibility tests. Classification: {CUI_BANNER} */
1180
+ import org.junit.jupiter.api.Test;
1181
+ import static org.junit.jupiter.api.Assertions.*;
1182
+
1183
+ public class ApiCompatibilityTest {{
1184
+ {api_block}
1185
+ }}
1186
+ {ban_bot}
1187
+ """))
1188
+ all_paths.append(str(api_path))
1189
+
1190
+ elif language == "csharp":
1191
+ api_path = test_dir / "ApiCompatibilityTests.cs"
1192
+ api_methods = []
1193
+ for api in apis:
1194
+ method = (api["method"] or "GET").upper()
1195
+ path = api["path"] or "/"
1196
+ mname = _safe_class_name(f"test_{method.lower()}_{path.replace('/', '_')}")
1197
+ api_methods.append(
1198
+ f" [Fact]\n public async Task {mname}()\n"
1199
+ f" {{\n"
1200
+ f" // TODO: compare legacy and modern responses for {method} {path}\n"
1201
+ f" }}"
1202
+ )
1203
+ api_block = "\n\n".join(api_methods) if api_methods else " // No legacy APIs to test"
1204
+ _write_file(api_path, textwrap.dedent(f"""\
1205
+ {ban_top}
1206
+ // API compatibility tests. Classification: {CUI_BANNER}
1207
+ using Xunit;
1208
+ using System.Threading.Tasks;
1209
+
1210
+ public class ApiCompatibilityTests
1211
+ {{
1212
+ {api_block}
1213
+ }}
1214
+ {ban_bot}
1215
+ """))
1216
+ all_paths.append(str(api_path))
1217
+
1218
+ for p in all_paths:
1219
+ _record_artifact(plan_id, task_id, "test_code", p, "Migration validation test")
1220
+ return all_paths
1221
+
1222
+
1223
+ # ---------------------------------------------------------------------------
1224
+ # 6. generate_rollback_scripts
1225
+ # ---------------------------------------------------------------------------
1226
+
1227
+ def generate_rollback_scripts(plan_id, output_dir="."):
1228
+ """Generate rollback scripts for completed/in-progress migration tasks."""
1229
+ conn = _get_db()
1230
+ plan = conn.execute("SELECT * FROM migration_plans WHERE id = ?", (plan_id,)).fetchone()
1231
+ if not plan:
1232
+ conn.close()
1233
+ raise ValueError(f"Migration plan {plan_id} not found")
1234
+
1235
+ app_id = plan["legacy_app_id"]
1236
+ language = (plan["target_language"] or "python").lower()
1237
+ ban_top = _banner_top(language)
1238
+ ban_bot = _banner_bottom(language)
1239
+
1240
+ tasks = conn.execute(
1241
+ "SELECT * FROM migration_tasks WHERE plan_id = ? AND status IN ('completed', 'in_progress') "
1242
+ "ORDER BY created_at",
1243
+ (plan_id,),
1244
+ ).fetchall()
1245
+
1246
+ apis = conn.execute(
1247
+ "SELECT * FROM legacy_apis WHERE legacy_app_id = ?", (app_id,)
1248
+ ).fetchall()
1249
+
1250
+ schema_cols = conn.execute(
1251
+ "SELECT DISTINCT table_name FROM legacy_db_schemas WHERE legacy_app_id = ?",
1252
+ (app_id,),
1253
+ ).fetchall()
1254
+
1255
+ task_for_artifact = conn.execute(
1256
+ "SELECT id FROM migration_tasks WHERE plan_id = ? AND task_type = 'cutover' LIMIT 1",
1257
+ (plan_id,),
1258
+ ).fetchone()
1259
+ task_id = task_for_artifact["id"] if task_for_artifact else None
1260
+ conn.close()
1261
+
1262
+ rb_dir = Path(output_dir) / "rollback"
1263
+ all_paths = []
1264
+
1265
+ # Reverse routing script
1266
+ if apis:
1267
+ if language == "python":
1268
+ route_entries = []
1269
+ for api in apis:
1270
+ m = (api["method"] or "GET").upper()
1271
+ p = api["path"] or "/"
1272
+ route_entries.append(f' ("{m}", "{p}"),')
1273
+ routes_block = "\n".join(route_entries)
1274
+ code = textwrap.dedent(f"""\
1275
+ {ban_top}
1276
+ \"\"\"Rollback: revert all routes to legacy backend.
1277
+
1278
+ Classification: {CUI_BANNER}
1279
+ \"\"\"
1280
+ import os
1281
+ import requests
1282
+
1283
+ LEGACY_BACKEND = os.environ.get("LEGACY_BACKEND", "http://localhost:8000")
1284
+ FACADE_ADMIN = os.environ.get("FACADE_ADMIN", "http://localhost:5050/admin")
1285
+
1286
+ ROUTES_TO_REVERT = [
1287
+ {routes_block}
1288
+ ]
1289
+
1290
+
1291
+ def rollback_routes():
1292
+ \"\"\"Switch all routes back to the legacy backend.\"\"\"
1293
+ results = []
1294
+ for method, path in ROUTES_TO_REVERT:
1295
+ # TODO: call facade admin API to switch route target
1296
+ results.append({{"method": method, "path": path, "target": LEGACY_BACKEND, "status": "reverted"}})
1297
+ return results
1298
+
1299
+
1300
+ if __name__ == "__main__":
1301
+ for r in rollback_routes():
1302
+ print(f"Reverted {{r['method']}} {{r['path']}} -> {{r['target']}}")
1303
+ {ban_bot}
1304
+ """)
1305
+ else:
1306
+ code = textwrap.dedent(f"""\
1307
+ {ban_top}
1308
+ // Rollback: revert routes to legacy. Classification: {CUI_BANNER}
1309
+ // TODO: Implement route rollback for {language}
1310
+ {ban_bot}
1311
+ """)
1312
+ rr_path = rb_dir / f"rollback_routes{_ext(language)}"
1313
+ _write_file(rr_path, code)
1314
+ all_paths.append(str(rr_path))
1315
+
1316
+ # DB rollback script (reverse DDL)
1317
+ if schema_cols:
1318
+ ddl_stmts = []
1319
+ for trow in schema_cols:
1320
+ tname = trow["table_name"]
1321
+ ddl_stmts.append(f"-- Rollback: drop migrated table {tname}_new if it exists")
1322
+ ddl_stmts.append(f"DROP TABLE IF EXISTS {tname}_new;")
1323
+ ddl_stmts.append("-- Restore: rename legacy backup back if it exists")
1324
+ ddl_stmts.append(f"-- ALTER TABLE {tname}_legacy_backup RENAME TO {tname};")
1325
+ ddl_stmts.append("")
1326
+ ddl_block = "\n".join(ddl_stmts)
1327
+ sql_path = rb_dir / "rollback_schema.sql"
1328
+ _write_file(sql_path, textwrap.dedent(f"""\
1329
+ -- {CUI_BANNER}
1330
+ -- Schema Rollback Script
1331
+ -- Generated by ICDEV Migration Code Generator
1332
+ -- Plan: {plan_id}
1333
+ -- Classification: {CUI_BANNER}
1334
+ --
1335
+ -- WARNING: Review each statement before executing.
1336
+ -- This script is auto-generated and may need manual adjustment.
1337
+
1338
+ BEGIN;
1339
+
1340
+ {ddl_block}
1341
+
1342
+ COMMIT;
1343
+ -- {CUI_BANNER}
1344
+ """))
1345
+ all_paths.append(str(sql_path))
1346
+
1347
+ # Per-task rollback summaries
1348
+ for t in tasks:
1349
+ t_type = t["task_type"]
1350
+ t_title = t["title"]
1351
+ t_id = t["id"]
1352
+ note_path = rb_dir / f"rollback_{_safe_var_name(t_title)}.txt"
1353
+ _write_file(note_path, textwrap.dedent(f"""\
1354
+ {CUI_BANNER}
1355
+ Rollback Procedure for: {t_title}
1356
+ Task ID: {t_id}
1357
+ Task Type: {t_type}
1358
+ Status: {t['status']}
1359
+
1360
+ Steps:
1361
+ 1. Verify the current deployment state.
1362
+ 2. Switch traffic back to the legacy endpoint.
1363
+ 3. If schema was migrated, execute rollback_schema.sql.
1364
+ 4. Confirm legacy application is handling traffic.
1365
+ 5. Update migration_tasks status to 'pending'.
1366
+
1367
+ Classification: {CUI_BANNER}
1368
+ """))
1369
+ all_paths.append(str(note_path))
1370
+
1371
+ for p in all_paths:
1372
+ _record_artifact(plan_id, task_id, "rollback_script", p, "Rollback artifact")
1373
+ return all_paths
1374
+
1375
+
1376
+ # ---------------------------------------------------------------------------
1377
+ # 7. generate_all
1378
+ # ---------------------------------------------------------------------------
1379
+
1380
+ def generate_all(plan_id, output_dir="."):
1381
+ """Orchestrate all code generation for a migration plan."""
1382
+ conn = _get_db()
1383
+ plan = conn.execute("SELECT * FROM migration_plans WHERE id = ?", (plan_id,)).fetchone()
1384
+ if not plan:
1385
+ conn.close()
1386
+ raise ValueError(f"Migration plan {plan_id} not found")
1387
+
1388
+ app_id = plan["legacy_app_id"]
1389
+ language = (plan["target_language"] or "python").lower()
1390
+ framework = plan["target_framework"] or _DEFAULT_FRAMEWORK.get(language, "flask")
1391
+
1392
+ # Components with cross-boundary dependencies (adapter candidates)
1393
+ adapter_comps = conn.execute(
1394
+ "SELECT DISTINCT lc.id, lc.name FROM legacy_components lc "
1395
+ "JOIN migration_tasks mt ON mt.legacy_component_id = lc.id "
1396
+ "WHERE mt.plan_id = ? AND mt.task_type IN ('generate_adapter', 'create_acl')",
1397
+ (plan_id,),
1398
+ ).fetchall()
1399
+
1400
+ # Service extraction tasks
1401
+ service_tasks = conn.execute(
1402
+ "SELECT * FROM migration_tasks WHERE plan_id = ? AND task_type = 'extract_service'",
1403
+ (plan_id,),
1404
+ ).fetchall()
1405
+
1406
+ # Tables by service
1407
+ tables = conn.execute(
1408
+ "SELECT DISTINCT table_name FROM legacy_db_schemas WHERE legacy_app_id = ?",
1409
+ (app_id,),
1410
+ ).fetchall()
1411
+ table_names = [t["table_name"] for t in tables]
1412
+
1413
+ conn.close()
1414
+
1415
+ summary = {
1416
+ "plan_id": plan_id,
1417
+ "language": language,
1418
+ "framework": framework,
1419
+ "adapters": [],
1420
+ "facade": None,
1421
+ "scaffolds": [],
1422
+ "data_access": [],
1423
+ "tests": [],
1424
+ "rollback": [],
1425
+ }
1426
+
1427
+ # 1. Adapters
1428
+ for comp in adapter_comps:
1429
+ path = generate_adapter(plan_id, comp["id"], language, output_dir)
1430
+ summary["adapters"].append(path)
1431
+
1432
+ # 2. Facade
1433
+ try:
1434
+ summary["facade"] = generate_facade(plan_id, language, output_dir)
1435
+ except Exception as exc:
1436
+ summary["facade"] = f"ERROR: {exc}"
1437
+
1438
+ # 3. Service scaffolds
1439
+ for st in service_tasks:
1440
+ svc_name = _safe_var_name(st["title"])
1441
+ path = generate_service_scaffold(plan_id, svc_name, language, framework, output_dir)
1442
+ summary["scaffolds"].append(path)
1443
+
1444
+ # 4. DAL for each service (distribute tables evenly if no better mapping)
1445
+ if service_tasks and table_names:
1446
+ svc_names = [_safe_var_name(st["title"]) for st in service_tasks]
1447
+ # Simple round-robin assignment of tables to services
1448
+ svc_tables = collections.defaultdict(list)
1449
+ for idx, tname in enumerate(table_names):
1450
+ svc_tables[svc_names[idx % len(svc_names)]].append(tname)
1451
+ for svc_name, tbls in svc_tables.items():
1452
+ paths = generate_data_access_layer(plan_id, svc_name, tbls, language, output_dir)
1453
+ summary["data_access"].extend(paths)
1454
+ elif table_names:
1455
+ paths = generate_data_access_layer(plan_id, "default", table_names, language, output_dir)
1456
+ summary["data_access"].extend(paths)
1457
+
1458
+ # 5. Tests
1459
+ summary["tests"] = generate_migration_tests(plan_id, output_dir)
1460
+
1461
+ # 6. Rollback
1462
+ summary["rollback"] = generate_rollback_scripts(plan_id, output_dir)
1463
+
1464
+ # 7. Index document
1465
+ index_lines = [
1466
+ f"<!-- {CUI_BANNER} -->",
1467
+ f"# Migration Code Generation — Plan {plan_id}",
1468
+ "",
1469
+ f"Generated: {datetime.now(timezone.utc).isoformat()}",
1470
+ f"Language: {language} | Framework: {framework}",
1471
+ "",
1472
+ "## Adapters",
1473
+ ]
1474
+ for a in summary["adapters"]:
1475
+ index_lines.append(f"- `{a}`")
1476
+ index_lines += ["", "## Facade", f"- `{summary['facade']}`", "", "## Service Scaffolds"]
1477
+ for s in summary["scaffolds"]:
1478
+ index_lines.append(f"- `{s}`")
1479
+ index_lines += ["", "## Data Access Layer"]
1480
+ for d in summary["data_access"]:
1481
+ index_lines.append(f"- `{d}`")
1482
+ index_lines += ["", "## Tests"]
1483
+ for t in summary["tests"]:
1484
+ index_lines.append(f"- `{t}`")
1485
+ index_lines += ["", "## Rollback Scripts"]
1486
+ for r in summary["rollback"]:
1487
+ index_lines.append(f"- `{r}`")
1488
+ index_lines += ["", f"<!-- {CUI_BANNER} -->"]
1489
+ _write_file(Path(output_dir) / "index.md", "\n".join(index_lines) + "\n")
1490
+
1491
+ # 8. Update migration_tasks output_path
1492
+ conn = _get_db()
1493
+ conn.execute(
1494
+ "UPDATE migration_tasks SET output_path = ? WHERE plan_id = ? AND task_type = 'generate_adapter'",
1495
+ (str(Path(output_dir) / "adapters"), plan_id),
1496
+ )
1497
+ conn.execute(
1498
+ "UPDATE migration_tasks SET output_path = ? WHERE plan_id = ? AND task_type = 'generate_facade'",
1499
+ (str(Path(output_dir) / "facade"), plan_id),
1500
+ )
1501
+ conn.execute(
1502
+ "UPDATE migration_tasks SET output_path = ? WHERE plan_id = ? AND task_type = 'extract_service'",
1503
+ (str(Path(output_dir) / "services"), plan_id),
1504
+ )
1505
+ conn.execute(
1506
+ "UPDATE migration_tasks SET output_path = ? WHERE plan_id = ? AND task_type = 'generate_test'",
1507
+ (str(Path(output_dir) / "tests"), plan_id),
1508
+ )
1509
+ conn.commit()
1510
+ conn.close()
1511
+
1512
+ return summary
1513
+
1514
+
1515
+ # ---------------------------------------------------------------------------
1516
+ # CLI
1517
+ # ---------------------------------------------------------------------------
1518
+
1519
+ def main():
1520
+ parser = argparse.ArgumentParser(
1521
+ description="ICDEV Migration Code Generator — produce adapters, facades, scaffolds, "
1522
+ "DAL, tests, and rollback scripts from a migration plan.",
1523
+ )
1524
+ parser.add_argument("--plan-id", required=True, help="Migration plan ID (from migration_plans table)")
1525
+ parser.add_argument("--output", required=True, help="Output directory for generated code")
1526
+ parser.add_argument(
1527
+ "--generate",
1528
+ choices=["adapters", "facade", "scaffolds", "dal", "tests", "rollback", "all"],
1529
+ default="all",
1530
+ help="What to generate (default: all)",
1531
+ )
1532
+ parser.add_argument(
1533
+ "--language",
1534
+ choices=["python", "java", "csharp"],
1535
+ default=None,
1536
+ help="Target language (overrides plan setting)",
1537
+ )
1538
+ parser.add_argument(
1539
+ "--framework",
1540
+ choices=["flask", "fastapi", "spring-boot", "aspnet-core"],
1541
+ default=None,
1542
+ help="Target framework (overrides plan setting)",
1543
+ )
1544
+ parser.add_argument("--service-name", default=None, help="Service name for single scaffold generation")
1545
+ parser.add_argument("--json", dest="json_output", action="store_true", help="Output results as JSON")
1546
+
1547
+ args = parser.parse_args()
1548
+
1549
+ # Resolve language from plan if not specified
1550
+ conn = _get_db()
1551
+ plan = conn.execute("SELECT * FROM migration_plans WHERE id = ?", (args.plan_id,)).fetchone()
1552
+ if not plan:
1553
+ conn.close()
1554
+ msg = f"Migration plan {args.plan_id} not found"
1555
+ if args.json_output:
1556
+ print(json.dumps({"error": msg}))
1557
+ else:
1558
+ print(f"ERROR: {msg}")
1559
+ return
1560
+ conn.close()
1561
+
1562
+ language = args.language or (plan["target_language"] or "python").lower()
1563
+ framework = args.framework or plan["target_framework"] or _DEFAULT_FRAMEWORK.get(language, "flask")
1564
+ output_dir = args.output
1565
+
1566
+ result = None
1567
+
1568
+ if args.generate == "all":
1569
+ result = generate_all(args.plan_id, output_dir)
1570
+ elif args.generate == "adapters":
1571
+ conn = _get_db()
1572
+ comps = conn.execute(
1573
+ "SELECT DISTINCT lc.id FROM legacy_components lc "
1574
+ "JOIN migration_tasks mt ON mt.legacy_component_id = lc.id "
1575
+ "WHERE mt.plan_id = ?", (args.plan_id,)
1576
+ ).fetchall()
1577
+ conn.close()
1578
+ result = []
1579
+ for c in comps:
1580
+ result.append(generate_adapter(args.plan_id, c["id"], language, output_dir))
1581
+ elif args.generate == "facade":
1582
+ result = generate_facade(args.plan_id, language, output_dir)
1583
+ elif args.generate == "scaffolds":
1584
+ if args.service_name:
1585
+ result = generate_service_scaffold(args.plan_id, args.service_name,
1586
+ language, framework, output_dir)
1587
+ else:
1588
+ conn = _get_db()
1589
+ svc_tasks = conn.execute(
1590
+ "SELECT title FROM migration_tasks WHERE plan_id = ? AND task_type = 'extract_service'",
1591
+ (args.plan_id,),
1592
+ ).fetchall()
1593
+ conn.close()
1594
+ result = []
1595
+ for st in svc_tasks:
1596
+ result.append(generate_service_scaffold(
1597
+ args.plan_id, _safe_var_name(st["title"]),
1598
+ language, framework, output_dir))
1599
+ elif args.generate == "dal":
1600
+ conn = _get_db()
1601
+ app_id = plan["legacy_app_id"]
1602
+ tbls = conn.execute(
1603
+ "SELECT DISTINCT table_name FROM legacy_db_schemas WHERE legacy_app_id = ?",
1604
+ (app_id,),
1605
+ ).fetchall()
1606
+ conn.close()
1607
+ table_names = [t["table_name"] for t in tbls]
1608
+ svc = args.service_name or "default"
1609
+ result = generate_data_access_layer(args.plan_id, svc, table_names, language, output_dir)
1610
+ elif args.generate == "tests":
1611
+ result = generate_migration_tests(args.plan_id, output_dir)
1612
+ elif args.generate == "rollback":
1613
+ result = generate_rollback_scripts(args.plan_id, output_dir)
1614
+
1615
+ if args.json_output:
1616
+ print(json.dumps({"plan_id": args.plan_id, "generate": args.generate, "result": result}, indent=2))
1617
+ else:
1618
+ print(f"Migration code generation complete for plan {args.plan_id}")
1619
+ print(f" Mode: {args.generate}")
1620
+ print(f" Language: {language}")
1621
+ print(f" Framework: {framework}")
1622
+ print(f" Output: {output_dir}")
1623
+ if isinstance(result, dict):
1624
+ for key, val in result.items():
1625
+ if isinstance(val, list):
1626
+ print(f" {key}: {len(val)} files")
1627
+ else:
1628
+ print(f" {key}: {val}")
1629
+ elif isinstance(result, list):
1630
+ print(f" Files generated: {len(result)}")
1631
+ for p in result:
1632
+ print(f" - {p}")
1633
+ else:
1634
+ print(f" Result: {result}")
1635
+
1636
+
1637
+ if __name__ == "__main__":
1638
+ main()
1639
+ # [TEMPLATE: CUI // SP-CTI]