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,1428 @@
1
+ #!/usr/bin/env python3
2
+ # CUI // SP-CTI
3
+ """Documentation Generator for ICDEV Legacy Code Modernization.
4
+
5
+ Generates structured documentation from legacy code analysis data stored in
6
+ icdev.db. Produces Markdown documents with CUI markings for API docs, data
7
+ dictionaries, component documentation, dependency maps, and tech debt reports.
8
+
9
+ All generated documents include CUI // SP-CTI banners at top and bottom as
10
+ required for Controlled Unclassified Information handling.
11
+
12
+ Usage:
13
+ python tools/modernization/doc_generator.py --app-id APP-001 --output-dir .tmp/docs --type all
14
+ python tools/modernization/doc_generator.py --app-id APP-001 --output-dir .tmp/docs --type api
15
+ python tools/modernization/doc_generator.py --app-id APP-001 --output-dir .tmp/docs --type all --json
16
+ """
17
+
18
+ import argparse
19
+ import json
20
+ import sqlite3
21
+ import sys
22
+ import textwrap
23
+ from collections import OrderedDict, defaultdict
24
+ from datetime import datetime, timezone
25
+ from pathlib import Path
26
+ from icdev._paths import get_project_root
27
+
28
+ BASE_DIR = get_project_root()
29
+ DB_PATH = BASE_DIR / "data" / "icdev.db"
30
+
31
+ CUI_BANNER = "CUI // SP-CTI"
32
+ CUI_HEADER = f"<!-- {CUI_BANNER} -->"
33
+ CUI_FOOTER = f"<!-- {CUI_BANNER} -->"
34
+
35
+ # Dependency type abbreviations for the dependency matrix
36
+ DEP_TYPE_ABBREV = {
37
+ "import": "I",
38
+ "inheritance": "H",
39
+ "composition": "C",
40
+ "method_call": "M",
41
+ "injection": "J",
42
+ "aggregation": "A",
43
+ "field_access": "F",
44
+ "annotation": "@",
45
+ "event": "E",
46
+ "database": "D",
47
+ "api_call": "P",
48
+ "file_io": "O",
49
+ "message_queue": "Q",
50
+ "external_service": "X",
51
+ }
52
+
53
+ # Complexity rating thresholds
54
+ COMPLEXITY_RATINGS = [
55
+ (5.0, "Low"),
56
+ (10.0, "Medium"),
57
+ (20.0, "High"),
58
+ (float("inf"), "Very High"),
59
+ ]
60
+
61
+
62
+ # ---------------------------------------------------------------------------
63
+ # Database helpers
64
+ # ---------------------------------------------------------------------------
65
+
66
+ def _get_db(db_path=None):
67
+ """Return a sqlite3 connection with Row factory for dict-like access.
68
+
69
+ Args:
70
+ db_path: Optional override for the database path.
71
+
72
+ Returns:
73
+ sqlite3.Connection with row_factory set to sqlite3.Row.
74
+
75
+ Raises:
76
+ FileNotFoundError: If the database file does not exist.
77
+ """
78
+ path = db_path or DB_PATH
79
+ if not Path(path).exists():
80
+ raise FileNotFoundError(
81
+ f"Database not found: {path}\n"
82
+ "Run: python tools/db/init_icdev_db.py"
83
+ )
84
+ conn = sqlite3.connect(str(path))
85
+ conn.row_factory = sqlite3.Row
86
+ return conn
87
+
88
+
89
+ def _get_app(conn, app_id):
90
+ """Fetch a legacy application record by ID.
91
+
92
+ Args:
93
+ conn: Database connection.
94
+ app_id: The legacy_applications.id value.
95
+
96
+ Returns:
97
+ dict of the application row.
98
+
99
+ Raises:
100
+ ValueError: If the application is not found.
101
+ """
102
+ row = conn.execute(
103
+ "SELECT * FROM legacy_applications WHERE id = ?", (app_id,)
104
+ ).fetchone()
105
+ if not row:
106
+ raise ValueError(
107
+ f"Legacy application '{app_id}' not found in database."
108
+ )
109
+ return dict(row)
110
+
111
+
112
+ def _complexity_rating(score):
113
+ """Return a human-readable complexity rating string.
114
+
115
+ Args:
116
+ score: Cyclomatic complexity score (float).
117
+
118
+ Returns:
119
+ One of 'Low', 'Medium', 'High', 'Very High'.
120
+ """
121
+ for threshold, label in COMPLEXITY_RATINGS:
122
+ if score < threshold:
123
+ return label
124
+ return "Very High"
125
+
126
+
127
+ def _health_indicator(coupling, cohesion, complexity):
128
+ """Compute a health indicator for a component.
129
+
130
+ Health is derived from a weighted combination of coupling (lower is
131
+ better), cohesion (higher is better), and complexity (lower is better).
132
+
133
+ Args:
134
+ coupling: Coupling score (0.0 - 1.0+).
135
+ cohesion: Cohesion score (0.0 - 1.0, higher = better).
136
+ complexity: Cyclomatic complexity score.
137
+
138
+ Returns:
139
+ Tuple of (label, emoji-free symbol) e.g. ('Healthy', '[OK]').
140
+ """
141
+ # Normalize: coupling 0-1 (lower=better), cohesion 0-1 (higher=better),
142
+ # complexity mapped to 0-1 scale (lower=better)
143
+ c_norm = min(coupling, 1.0)
144
+ h_norm = max(min(cohesion, 1.0), 0.0)
145
+ x_norm = min(complexity / 30.0, 1.0)
146
+
147
+ # Score: 0 = worst, 1 = best
148
+ score = (1.0 - c_norm) * 0.3 + h_norm * 0.3 + (1.0 - x_norm) * 0.4
149
+
150
+ if score >= 0.7:
151
+ return "Healthy", "[OK]"
152
+ elif score >= 0.4:
153
+ return "Warning", "[!!]"
154
+ else:
155
+ return "Critical", "[XX]"
156
+
157
+
158
+ def _abbreviate(name, max_len=15):
159
+ """Abbreviate a name to fit within max_len characters.
160
+
161
+ Args:
162
+ name: The full name string.
163
+ max_len: Maximum length (default 15).
164
+
165
+ Returns:
166
+ Truncated name with '..' suffix if it exceeded max_len.
167
+ """
168
+ if not name:
169
+ return ""
170
+ if len(name) <= max_len:
171
+ return name
172
+ return name[: max_len - 2] + ".."
173
+
174
+
175
+ def _ensure_dir(output_dir):
176
+ """Ensure the output directory exists, creating it if necessary.
177
+
178
+ Args:
179
+ output_dir: Path to the output directory.
180
+
181
+ Returns:
182
+ Path object for the directory.
183
+ """
184
+ path = Path(output_dir)
185
+ path.mkdir(parents=True, exist_ok=True)
186
+ return path
187
+
188
+
189
+ def _write_doc(filepath, content):
190
+ """Write a document with CUI banners to the given filepath.
191
+
192
+ Args:
193
+ filepath: Path to write the file.
194
+ content: The markdown content (CUI banners are added automatically).
195
+
196
+ Returns:
197
+ The Path object for the written file.
198
+ """
199
+ path = Path(filepath)
200
+ full_content = f"{CUI_HEADER}\n\n{content}\n\n{CUI_FOOTER}\n"
201
+ with open(path, "w", encoding="utf-8") as f:
202
+ f.write(full_content)
203
+ return path
204
+
205
+
206
+ def _now_iso():
207
+ """Return the current UTC datetime as an ISO-formatted string."""
208
+ return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
209
+
210
+
211
+ # ---------------------------------------------------------------------------
212
+ # 1. API Documentation
213
+ # ---------------------------------------------------------------------------
214
+
215
+ def generate_api_docs(app_id, output_dir, db_path=None):
216
+ """Generate OpenAPI-like API documentation in Markdown.
217
+
218
+ Queries all legacy_apis for the given app_id, groups endpoints by path
219
+ prefix, and produces a comprehensive Markdown document with method,
220
+ path, handler, parameters, request body, response type, and auth info.
221
+
222
+ Args:
223
+ app_id: The legacy application ID.
224
+ output_dir: Directory to write the output file.
225
+ db_path: Optional database path override.
226
+
227
+ Returns:
228
+ str: Path to the generated api_documentation.md file.
229
+ """
230
+ conn = _get_db(db_path)
231
+ try:
232
+ app = _get_app(conn, app_id)
233
+ apis = conn.execute(
234
+ "SELECT * FROM legacy_apis WHERE legacy_app_id = ? ORDER BY path, method",
235
+ (app_id,),
236
+ ).fetchall()
237
+ apis = [dict(r) for r in apis]
238
+ finally:
239
+ conn.close()
240
+
241
+ out_dir = _ensure_dir(output_dir)
242
+
243
+ # Group APIs by path prefix (first two segments: /api/resource)
244
+ grouped = defaultdict(list)
245
+ for api in apis:
246
+ parts = api["path"].strip("/").split("/")
247
+ if len(parts) >= 2:
248
+ prefix = "/" + "/".join(parts[:2])
249
+ elif len(parts) == 1:
250
+ prefix = "/" + parts[0]
251
+ else:
252
+ prefix = "/"
253
+ grouped[prefix].append(api)
254
+
255
+ # Build document
256
+ lines = []
257
+ lines.append(f"# API Documentation: {app['name']}")
258
+ lines.append("")
259
+ lines.append(f"**Application ID:** {app_id}")
260
+ lines.append(f"**Generated:** {_now_iso()}")
261
+ lines.append(f"**Classification:** {CUI_BANNER}")
262
+ lines.append("")
263
+ lines.append("---")
264
+ lines.append("")
265
+
266
+ # Summary
267
+ lines.append("## Summary")
268
+ lines.append("")
269
+ lines.append(f"- **Total Endpoints:** {len(apis)}")
270
+ methods_count = defaultdict(int)
271
+ auth_count = 0
272
+ for api in apis:
273
+ methods_count[api.get("method", "UNKNOWN")] += 1
274
+ if api.get("auth_required"):
275
+ auth_count += 1
276
+ lines.append(f"- **Authenticated Endpoints:** {auth_count}")
277
+ lines.append(f"- **Unauthenticated Endpoints:** {len(apis) - auth_count}")
278
+ lines.append(f"- **API Groups:** {len(grouped)}")
279
+ lines.append("")
280
+ lines.append("### Methods Distribution")
281
+ lines.append("")
282
+ lines.append("| Method | Count |")
283
+ lines.append("|--------|-------|")
284
+ for method in sorted(methods_count.keys()):
285
+ lines.append(f"| {method} | {methods_count[method]} |")
286
+ lines.append("")
287
+ lines.append("---")
288
+ lines.append("")
289
+
290
+ # Endpoint groups
291
+ for prefix in sorted(grouped.keys()):
292
+ endpoints = grouped[prefix]
293
+ lines.append(f"## {prefix}")
294
+ lines.append("")
295
+
296
+ for ep in endpoints:
297
+ method = ep.get("method", "UNKNOWN")
298
+ path = ep.get("path", "")
299
+ handler = ep.get("handler_function", "N/A")
300
+ auth = "Yes" if ep.get("auth_required") else "No"
301
+
302
+ lines.append(f"### `{method} {path}`")
303
+ lines.append("")
304
+ lines.append(f"- **Handler:** `{handler}`")
305
+ lines.append(f"- **Authentication Required:** {auth}")
306
+
307
+ # Response type
308
+ resp = ep.get("response_type")
309
+ if resp:
310
+ lines.append(f"- **Response Type:** `{resp}`")
311
+
312
+ lines.append("")
313
+
314
+ # Parameters
315
+ params_raw = ep.get("parameters")
316
+ if params_raw:
317
+ try:
318
+ params = json.loads(params_raw) if isinstance(params_raw, str) else params_raw
319
+ except (json.JSONDecodeError, TypeError):
320
+ params = None
321
+
322
+ if params and isinstance(params, list):
323
+ lines.append("**Parameters:**")
324
+ lines.append("")
325
+ lines.append("| Name | Type | In | Required | Description |")
326
+ lines.append("|------|------|----|----------|-------------|")
327
+ for p in params:
328
+ if isinstance(p, dict):
329
+ pname = p.get("name", "")
330
+ ptype = p.get("type", "string")
331
+ pin = p.get("in", "query")
332
+ preq = "Yes" if p.get("required") else "No"
333
+ pdesc = p.get("description", "")
334
+ lines.append(f"| `{pname}` | `{ptype}` | {pin} | {preq} | {pdesc} |")
335
+ lines.append("")
336
+ elif params and isinstance(params, dict):
337
+ lines.append("**Parameters:**")
338
+ lines.append("")
339
+ lines.append("| Name | Type | Required | Description |")
340
+ lines.append("|------|------|----------|-------------|")
341
+ for pname, pinfo in params.items():
342
+ if isinstance(pinfo, dict):
343
+ ptype = pinfo.get("type", "string")
344
+ preq = "Yes" if pinfo.get("required") else "No"
345
+ pdesc = pinfo.get("description", "")
346
+ else:
347
+ ptype = str(pinfo)
348
+ preq = "No"
349
+ pdesc = ""
350
+ lines.append(f"| `{pname}` | `{ptype}` | {preq} | {pdesc} |")
351
+ lines.append("")
352
+
353
+ # Request body
354
+ body_raw = ep.get("request_body")
355
+ if body_raw:
356
+ try:
357
+ body = json.loads(body_raw) if isinstance(body_raw, str) else body_raw
358
+ body_str = json.dumps(body, indent=2)
359
+ except (json.JSONDecodeError, TypeError):
360
+ body_str = str(body_raw)
361
+
362
+ lines.append("**Request Body:**")
363
+ lines.append("")
364
+ lines.append("```json")
365
+ lines.append(body_str)
366
+ lines.append("```")
367
+ lines.append("")
368
+
369
+ lines.append("---")
370
+ lines.append("")
371
+
372
+ if not apis:
373
+ lines.append("*No API endpoints discovered for this application.*")
374
+ lines.append("")
375
+
376
+ content = "\n".join(lines)
377
+ filepath = out_dir / "api_documentation.md"
378
+ _write_doc(filepath, content)
379
+ return str(filepath)
380
+
381
+
382
+ # ---------------------------------------------------------------------------
383
+ # 2. Data Dictionary
384
+ # ---------------------------------------------------------------------------
385
+
386
+ def generate_data_dictionary(app_id, output_dir, db_path=None):
387
+ """Generate a data dictionary from discovered database schemas.
388
+
389
+ Queries all legacy_db_schemas for the given app_id, groups by table,
390
+ documents each column, and maps foreign key relationships.
391
+
392
+ Args:
393
+ app_id: The legacy application ID.
394
+ output_dir: Directory to write the output file.
395
+ db_path: Optional database path override.
396
+
397
+ Returns:
398
+ str: Path to the generated data_dictionary.md file.
399
+ """
400
+ conn = _get_db(db_path)
401
+ try:
402
+ app = _get_app(conn, app_id)
403
+ schemas = conn.execute(
404
+ "SELECT * FROM legacy_db_schemas WHERE legacy_app_id = ? "
405
+ "ORDER BY schema_name, table_name, column_name",
406
+ (app_id,),
407
+ ).fetchall()
408
+ schemas = [dict(r) for r in schemas]
409
+ finally:
410
+ conn.close()
411
+
412
+ out_dir = _ensure_dir(output_dir)
413
+
414
+ # Group by schema_name.table_name
415
+ tables = OrderedDict()
416
+ relationships = []
417
+ db_types = set()
418
+
419
+ for col in schemas:
420
+ schema = col.get("schema_name", "public")
421
+ table = col.get("table_name", "unknown")
422
+ key = f"{schema}.{table}"
423
+ db_types.add(col.get("db_type", "unknown"))
424
+
425
+ if key not in tables:
426
+ tables[key] = {
427
+ "schema": schema,
428
+ "table": table,
429
+ "db_type": col.get("db_type", "unknown"),
430
+ "columns": [],
431
+ }
432
+ tables[key]["columns"].append(col)
433
+
434
+ # Track FK relationships
435
+ if col.get("is_foreign_key") and col.get("foreign_table"):
436
+ relationships.append({
437
+ "from_table": table,
438
+ "from_column": col.get("column_name"),
439
+ "to_table": col.get("foreign_table"),
440
+ "to_column": col.get("foreign_column", "id"),
441
+ "schema": schema,
442
+ })
443
+
444
+ # Build document
445
+ lines = []
446
+ lines.append(f"# Data Dictionary: {app['name']}")
447
+ lines.append("")
448
+ lines.append(f"**Application ID:** {app_id}")
449
+ lines.append(f"**Generated:** {_now_iso()}")
450
+ lines.append(f"**Classification:** {CUI_BANNER}")
451
+ lines.append("")
452
+ lines.append("---")
453
+ lines.append("")
454
+
455
+ # Summary
456
+ lines.append("## Summary")
457
+ lines.append("")
458
+ lines.append(f"- **Total Tables:** {len(tables)}")
459
+ total_cols = sum(len(t["columns"]) for t in tables.values())
460
+ lines.append(f"- **Total Columns:** {total_cols}")
461
+ lines.append(f"- **Database Type(s):** {', '.join(sorted(db_types))}")
462
+ lines.append(f"- **Foreign Key Relationships:** {len(relationships)}")
463
+ lines.append("")
464
+ lines.append("---")
465
+ lines.append("")
466
+
467
+ # Table of contents
468
+ lines.append("## Tables")
469
+ lines.append("")
470
+ for idx, (key, tinfo) in enumerate(tables.items(), 1):
471
+ col_count = len(tinfo["columns"])
472
+ pk_count = sum(1 for c in tinfo["columns"] if c.get("is_primary_key"))
473
+ fk_count = sum(1 for c in tinfo["columns"] if c.get("is_foreign_key"))
474
+ lines.append(
475
+ f"{idx}. **{tinfo['table']}** ({tinfo['schema']}) "
476
+ f"- {col_count} columns, {pk_count} PK, {fk_count} FK"
477
+ )
478
+ lines.append("")
479
+ lines.append("---")
480
+ lines.append("")
481
+
482
+ # Table details
483
+ for key, tinfo in tables.items():
484
+ lines.append(f"### {tinfo['table']}")
485
+ lines.append("")
486
+ lines.append(f"- **Schema:** {tinfo['schema']}")
487
+ lines.append(f"- **Database:** {tinfo['db_type']}")
488
+ lines.append("")
489
+ lines.append("| Column | Data Type | Nullable | PK | FK | Default | Constraints |")
490
+ lines.append("|--------|-----------|----------|----|----|---------|-------------|")
491
+
492
+ for col in tinfo["columns"]:
493
+ cname = col.get("column_name", "")
494
+ dtype = col.get("data_type", "")
495
+ nullable = "Yes" if col.get("is_nullable") else "No"
496
+ pk = "PK" if col.get("is_primary_key") else ""
497
+ fk_ref = ""
498
+ if col.get("is_foreign_key") and col.get("foreign_table"):
499
+ fk_col = col.get("foreign_column", "id")
500
+ fk_ref = f"FK -> {col['foreign_table']}.{fk_col}"
501
+ default = col.get("default_value", "") or ""
502
+ constraints = col.get("constraints", "") or ""
503
+ lines.append(
504
+ f"| `{cname}` | `{dtype}` | {nullable} | {pk} | {fk_ref} | {default} | {constraints} |"
505
+ )
506
+
507
+ lines.append("")
508
+ lines.append("---")
509
+ lines.append("")
510
+
511
+ # Relationships section
512
+ if relationships:
513
+ lines.append("## Relationships")
514
+ lines.append("")
515
+ lines.append("| From Table | From Column | To Table | To Column | Schema |")
516
+ lines.append("|------------|-------------|----------|-----------|--------|")
517
+ for rel in relationships:
518
+ lines.append(
519
+ f"| {rel['from_table']} | {rel['from_column']} "
520
+ f"| {rel['to_table']} | {rel['to_column']} | {rel['schema']} |"
521
+ )
522
+ lines.append("")
523
+ else:
524
+ lines.append("## Relationships")
525
+ lines.append("")
526
+ lines.append("*No foreign key relationships discovered.*")
527
+ lines.append("")
528
+
529
+ if not schemas:
530
+ lines.clear()
531
+ lines.append(f"# Data Dictionary: {app['name']}")
532
+ lines.append("")
533
+ lines.append(f"**Application ID:** {app_id}")
534
+ lines.append(f"**Generated:** {_now_iso()}")
535
+ lines.append(f"**Classification:** {CUI_BANNER}")
536
+ lines.append("")
537
+ lines.append("*No database schemas discovered for this application.*")
538
+ lines.append("")
539
+
540
+ content = "\n".join(lines)
541
+ filepath = out_dir / "data_dictionary.md"
542
+ _write_doc(filepath, content)
543
+ return str(filepath)
544
+
545
+
546
+ # ---------------------------------------------------------------------------
547
+ # 3. Component Documentation
548
+ # ---------------------------------------------------------------------------
549
+
550
+ def generate_component_docs(app_id, output_dir, db_path=None):
551
+ """Generate component documentation from legacy analysis.
552
+
553
+ Queries all legacy_components for the given app_id, groups by component
554
+ type, and documents each component with metrics, complexity ratings,
555
+ and health indicators.
556
+
557
+ Args:
558
+ app_id: The legacy application ID.
559
+ output_dir: Directory to write the output file.
560
+ db_path: Optional database path override.
561
+
562
+ Returns:
563
+ str: Path to the generated component_documentation.md file.
564
+ """
565
+ conn = _get_db(db_path)
566
+ try:
567
+ app = _get_app(conn, app_id)
568
+ components = conn.execute(
569
+ "SELECT * FROM legacy_components WHERE legacy_app_id = ? "
570
+ "ORDER BY component_type, name",
571
+ (app_id,),
572
+ ).fetchall()
573
+ components = [dict(r) for r in components]
574
+ finally:
575
+ conn.close()
576
+
577
+ out_dir = _ensure_dir(output_dir)
578
+
579
+ # Group by component_type
580
+ by_type = OrderedDict()
581
+ for comp in components:
582
+ ctype = comp.get("component_type", "unknown")
583
+ if ctype not in by_type:
584
+ by_type[ctype] = []
585
+ by_type[ctype].append(comp)
586
+
587
+ # Build document
588
+ lines = []
589
+ lines.append(f"# Component Documentation: {app['name']}")
590
+ lines.append("")
591
+ lines.append(f"**Application ID:** {app_id}")
592
+ lines.append(f"**Generated:** {_now_iso()}")
593
+ lines.append(f"**Classification:** {CUI_BANNER}")
594
+ lines.append("")
595
+ lines.append("---")
596
+ lines.append("")
597
+
598
+ # Summary statistics
599
+ total_loc = sum(c.get("loc", 0) for c in components)
600
+ avg_complexity = 0.0
601
+ if components:
602
+ avg_complexity = sum(c.get("cyclomatic_complexity", 0) for c in components) / len(components)
603
+
604
+ lines.append("## Summary")
605
+ lines.append("")
606
+ lines.append(f"- **Total Components:** {len(components)}")
607
+ lines.append(f"- **Component Types:** {len(by_type)}")
608
+ lines.append(f"- **Total Lines of Code:** {total_loc:,}")
609
+ lines.append(f"- **Average Complexity:** {avg_complexity:.1f} ({_complexity_rating(avg_complexity)})")
610
+ lines.append("")
611
+
612
+ # Health overview
613
+ health_counts = {"Healthy": 0, "Warning": 0, "Critical": 0}
614
+ for comp in components:
615
+ label, _ = _health_indicator(
616
+ comp.get("coupling_score", 0),
617
+ comp.get("cohesion_score", 0),
618
+ comp.get("cyclomatic_complexity", 0),
619
+ )
620
+ health_counts[label] += 1
621
+
622
+ lines.append("### Health Overview")
623
+ lines.append("")
624
+ lines.append("| Status | Count | Percentage |")
625
+ lines.append("|--------|-------|------------|")
626
+ for status in ["Healthy", "Warning", "Critical"]:
627
+ count = health_counts[status]
628
+ pct = (count / len(components) * 100) if components else 0
629
+ lines.append(f"| {status} | {count} | {pct:.1f}% |")
630
+ lines.append("")
631
+
632
+ # Type distribution
633
+ lines.append("### Component Type Distribution")
634
+ lines.append("")
635
+ lines.append("| Type | Count | Total LOC |")
636
+ lines.append("|------|-------|-----------|")
637
+ for ctype, comps in by_type.items():
638
+ type_loc = sum(c.get("loc", 0) for c in comps)
639
+ lines.append(f"| {ctype} | {len(comps)} | {type_loc:,} |")
640
+ lines.append("")
641
+ lines.append("---")
642
+ lines.append("")
643
+
644
+ # Detailed component tables by type
645
+ for ctype, comps in by_type.items():
646
+ lines.append(f"## {ctype.replace('_', ' ').title()} Components")
647
+ lines.append("")
648
+ lines.append(
649
+ "| Name | File Path | LOC | Complexity | Rating | "
650
+ "Coupling | Cohesion | Deps In | Deps Out | Health |"
651
+ )
652
+ lines.append(
653
+ "|------|-----------|-----|------------|--------|"
654
+ "----------|----------|---------|----------|--------|"
655
+ )
656
+
657
+ for comp in comps:
658
+ name = comp.get("name", "")
659
+ fpath = comp.get("file_path", "")
660
+ loc = comp.get("loc", 0)
661
+ cx = comp.get("cyclomatic_complexity", 0)
662
+ rating = _complexity_rating(cx)
663
+ coupling = comp.get("coupling_score", 0)
664
+ cohesion = comp.get("cohesion_score", 0)
665
+ deps_in = comp.get("dependencies_in", 0)
666
+ deps_out = comp.get("dependencies_out", 0)
667
+ _, symbol = _health_indicator(coupling, cohesion, cx)
668
+
669
+ lines.append(
670
+ f"| `{name}` | `{fpath}` | {loc:,} | {cx:.1f} | {rating} | "
671
+ f"{coupling:.2f} | {cohesion:.2f} | {deps_in} | {deps_out} | {symbol} |"
672
+ )
673
+
674
+ lines.append("")
675
+
676
+ # Per-type summary
677
+ type_avg_cx = sum(c.get("cyclomatic_complexity", 0) for c in comps) / len(comps) if comps else 0
678
+ type_avg_coupling = sum(c.get("coupling_score", 0) for c in comps) / len(comps) if comps else 0
679
+ type_avg_cohesion = sum(c.get("cohesion_score", 0) for c in comps) / len(comps) if comps else 0
680
+
681
+ lines.append(f"**{ctype} Summary:**")
682
+ lines.append(f"- Average Complexity: {type_avg_cx:.1f} ({_complexity_rating(type_avg_cx)})")
683
+ lines.append(f"- Average Coupling: {type_avg_coupling:.2f}")
684
+ lines.append(f"- Average Cohesion: {type_avg_cohesion:.2f}")
685
+ lines.append("")
686
+ lines.append("---")
687
+ lines.append("")
688
+
689
+ # Component details with properties
690
+ has_properties = [c for c in components if c.get("properties")]
691
+ if has_properties:
692
+ lines.append("## Component Properties")
693
+ lines.append("")
694
+ for comp in has_properties:
695
+ name = comp.get("name", "")
696
+ qname = comp.get("qualified_name", name)
697
+ lines.append(f"### {name}")
698
+ lines.append(f"- **Qualified Name:** `{qname}`")
699
+ try:
700
+ props = json.loads(comp["properties"]) if isinstance(comp["properties"], str) else comp["properties"]
701
+ if isinstance(props, dict):
702
+ for pk, pv in props.items():
703
+ lines.append(f"- **{pk}:** {pv}")
704
+ except (json.JSONDecodeError, TypeError):
705
+ lines.append(f"- **Raw Properties:** {comp['properties']}")
706
+ lines.append("")
707
+
708
+ if not components:
709
+ lines.clear()
710
+ lines.append(f"# Component Documentation: {app['name']}")
711
+ lines.append("")
712
+ lines.append(f"**Application ID:** {app_id}")
713
+ lines.append(f"**Generated:** {_now_iso()}")
714
+ lines.append(f"**Classification:** {CUI_BANNER}")
715
+ lines.append("")
716
+ lines.append("*No components discovered for this application.*")
717
+ lines.append("")
718
+
719
+ content = "\n".join(lines)
720
+ filepath = out_dir / "component_documentation.md"
721
+ _write_doc(filepath, content)
722
+ return str(filepath)
723
+
724
+
725
+ # ---------------------------------------------------------------------------
726
+ # 4. Dependency Map
727
+ # ---------------------------------------------------------------------------
728
+
729
+ def generate_dependency_map(app_id, output_dir, db_path=None):
730
+ """Generate a text-based dependency matrix and list view.
731
+
732
+ Queries all legacy_dependencies for the given app_id, builds an
733
+ adjacency matrix using abbreviated component names, and identifies
734
+ dependency hotspots and potential circular dependencies.
735
+
736
+ Args:
737
+ app_id: The legacy application ID.
738
+ output_dir: Directory to write the output file.
739
+ db_path: Optional database path override.
740
+
741
+ Returns:
742
+ str: Path to the generated dependency_map.md file.
743
+ """
744
+ conn = _get_db(db_path)
745
+ try:
746
+ app = _get_app(conn, app_id)
747
+
748
+ deps = conn.execute(
749
+ "SELECT d.*, "
750
+ " sc.name AS source_name, sc.component_type AS source_type, "
751
+ " tc.name AS target_name, tc.component_type AS target_type "
752
+ "FROM legacy_dependencies d "
753
+ "LEFT JOIN legacy_components sc ON d.source_component_id = sc.id "
754
+ "LEFT JOIN legacy_components tc ON d.target_component_id = tc.id "
755
+ "WHERE d.legacy_app_id = ? "
756
+ "ORDER BY sc.name, tc.name",
757
+ (app_id,),
758
+ ).fetchall()
759
+ deps = [dict(r) for r in deps]
760
+
761
+ # Get all component names for the matrix
762
+ components = conn.execute(
763
+ "SELECT id, name FROM legacy_components WHERE legacy_app_id = ? ORDER BY name",
764
+ (app_id,),
765
+ ).fetchall()
766
+ comp_map = {row["id"]: row["name"] for row in components}
767
+ finally:
768
+ conn.close()
769
+
770
+ out_dir = _ensure_dir(output_dir)
771
+
772
+ # Build adjacency data
773
+ # adj[source_id][target_id] = set of dep types
774
+ adj = defaultdict(lambda: defaultdict(set))
775
+ involved_ids = set()
776
+ in_degree = defaultdict(int)
777
+ out_degree = defaultdict(int)
778
+
779
+ for dep in deps:
780
+ src = dep.get("source_component_id", "")
781
+ tgt = dep.get("target_component_id", "")
782
+ dtype = dep.get("dependency_type", "unknown")
783
+ if src and tgt:
784
+ adj[src][tgt].add(dtype)
785
+ involved_ids.add(src)
786
+ involved_ids.add(tgt)
787
+ out_degree[src] += 1
788
+ in_degree[tgt] += 1
789
+
790
+ # Ordered list of component IDs that participate in dependencies
791
+ ordered_ids = sorted(involved_ids, key=lambda cid: comp_map.get(cid, cid))
792
+ abbrev_names = {cid: _abbreviate(comp_map.get(cid, cid)) for cid in ordered_ids}
793
+
794
+ # Detect circular dependencies (simple: A->B and B->A)
795
+ circular = []
796
+ checked = set()
797
+ for src in adj:
798
+ for tgt in adj[src]:
799
+ if tgt in adj and src in adj[tgt]:
800
+ pair = tuple(sorted([src, tgt]))
801
+ if pair not in checked:
802
+ checked.add(pair)
803
+ circular.append((
804
+ comp_map.get(src, src),
805
+ comp_map.get(tgt, tgt),
806
+ ))
807
+
808
+ # Build document
809
+ lines = []
810
+ lines.append(f"# Dependency Map: {app['name']}")
811
+ lines.append("")
812
+ lines.append(f"**Application ID:** {app_id}")
813
+ lines.append(f"**Generated:** {_now_iso()}")
814
+ lines.append(f"**Classification:** {CUI_BANNER}")
815
+ lines.append("")
816
+ lines.append("---")
817
+ lines.append("")
818
+
819
+ # Summary
820
+ lines.append("## Summary")
821
+ lines.append("")
822
+ lines.append(f"- **Total Dependencies:** {len(deps)}")
823
+ lines.append(f"- **Components Involved:** {len(involved_ids)}")
824
+ lines.append(f"- **Circular Dependencies Detected:** {len(circular)}")
825
+ lines.append("")
826
+
827
+ # Dependency type legend
828
+ lines.append("### Dependency Type Legend")
829
+ lines.append("")
830
+ lines.append("| Abbreviation | Type |")
831
+ lines.append("|-------------|------|")
832
+ for dtype, abbr in sorted(DEP_TYPE_ABBREV.items(), key=lambda x: x[1]):
833
+ lines.append(f"| {abbr} | {dtype} |")
834
+ lines.append("")
835
+ lines.append("---")
836
+ lines.append("")
837
+
838
+ # Most coupled components (by total degree)
839
+ total_degree = defaultdict(int)
840
+ for cid in involved_ids:
841
+ total_degree[cid] = in_degree.get(cid, 0) + out_degree.get(cid, 0)
842
+
843
+ top_coupled = sorted(total_degree.items(), key=lambda x: x[1], reverse=True)[:10]
844
+
845
+ if top_coupled:
846
+ lines.append("## Most Coupled Components")
847
+ lines.append("")
848
+ lines.append("| Rank | Component | In | Out | Total |")
849
+ lines.append("|------|-----------|-----|-----|-------|")
850
+ for rank, (cid, total) in enumerate(top_coupled, 1):
851
+ cname = comp_map.get(cid, cid)
852
+ lines.append(
853
+ f"| {rank} | `{cname}` | {in_degree.get(cid, 0)} "
854
+ f"| {out_degree.get(cid, 0)} | {total} |"
855
+ )
856
+ lines.append("")
857
+ lines.append("---")
858
+ lines.append("")
859
+
860
+ # Dependency hotspots (components with high fan-out)
861
+ hotspots = sorted(out_degree.items(), key=lambda x: x[1], reverse=True)[:10]
862
+ if hotspots:
863
+ lines.append("## Dependency Hotspots (High Fan-Out)")
864
+ lines.append("")
865
+ lines.append("| Component | Outgoing Dependencies | Targets |")
866
+ lines.append("|-----------|----------------------|---------|")
867
+ for cid, count in hotspots:
868
+ targets = [comp_map.get(t, t) for t in adj.get(cid, {})]
869
+ target_str = ", ".join(sorted(targets)[:5])
870
+ if len(targets) > 5:
871
+ target_str += f" (+{len(targets) - 5} more)"
872
+ cname = comp_map.get(cid, cid)
873
+ lines.append(f"| `{cname}` | {count} | {target_str} |")
874
+ lines.append("")
875
+ lines.append("---")
876
+ lines.append("")
877
+
878
+ # Circular dependencies
879
+ if circular:
880
+ lines.append("## Circular Dependencies")
881
+ lines.append("")
882
+ lines.append("The following component pairs have bidirectional dependencies:")
883
+ lines.append("")
884
+ lines.append("| Component A | Component B |")
885
+ lines.append("|-------------|-------------|")
886
+ for a, b in circular:
887
+ lines.append(f"| `{a}` | `{b}` |")
888
+ lines.append("")
889
+ lines.append(
890
+ "> Circular dependencies increase coupling and make refactoring "
891
+ "more difficult. Consider introducing interfaces or mediator patterns."
892
+ )
893
+ lines.append("")
894
+ lines.append("---")
895
+ lines.append("")
896
+
897
+ # Dependency Matrix (ASCII table)
898
+ if ordered_ids and len(ordered_ids) <= 30:
899
+ lines.append("## Dependency Matrix")
900
+ lines.append("")
901
+ lines.append(
902
+ "Rows = source components, Columns = target components. "
903
+ "Cell values indicate dependency type abbreviations."
904
+ )
905
+ lines.append("")
906
+
907
+ # Build the matrix as a fixed-width ASCII table
908
+ col_width = 17
909
+ header_pad = " " * col_width
910
+ # Column headers
911
+ header_line = header_pad + " | "
912
+ header_line += " | ".join(
913
+ abbrev_names[cid].ljust(col_width) for cid in ordered_ids
914
+ )
915
+ lines.append("```")
916
+ lines.append(header_line)
917
+ sep = "-" * col_width + "-+-" + "-+-".join(
918
+ "-" * col_width for _ in ordered_ids
919
+ )
920
+ lines.append(sep)
921
+
922
+ for src_id in ordered_ids:
923
+ row_label = abbrev_names[src_id].ljust(col_width)
924
+ cells = []
925
+ for tgt_id in ordered_ids:
926
+ if src_id == tgt_id:
927
+ cells.append(".".center(col_width))
928
+ elif tgt_id in adj.get(src_id, {}):
929
+ types = adj[src_id][tgt_id]
930
+ abbrs = "".join(sorted(
931
+ DEP_TYPE_ABBREV.get(t, "?") for t in types
932
+ ))
933
+ cells.append(abbrs.center(col_width))
934
+ else:
935
+ cells.append(" " * col_width)
936
+ lines.append(row_label + " | " + " | ".join(cells))
937
+
938
+ lines.append("```")
939
+ lines.append("")
940
+ elif ordered_ids:
941
+ lines.append("## Dependency Matrix")
942
+ lines.append("")
943
+ lines.append(
944
+ f"*Matrix view omitted: {len(ordered_ids)} components exceed "
945
+ "the 30-component limit for readable ASCII matrices. "
946
+ "See the list view below.*"
947
+ )
948
+ lines.append("")
949
+
950
+ lines.append("---")
951
+ lines.append("")
952
+
953
+ # List view (always included)
954
+ lines.append("## Dependency List")
955
+ lines.append("")
956
+ if deps:
957
+ lines.append("| Source | Target | Type | Weight |")
958
+ lines.append("|--------|--------|------|--------|")
959
+ for dep in deps:
960
+ src_name = dep.get("source_name", dep.get("source_component_id", "?"))
961
+ tgt_name = dep.get("target_name", dep.get("target_component_id", "?"))
962
+ dtype = dep.get("dependency_type", "unknown")
963
+ weight = dep.get("weight", 1.0)
964
+ lines.append(f"| `{src_name}` | `{tgt_name}` | {dtype} | {weight:.1f} |")
965
+ lines.append("")
966
+ else:
967
+ lines.append("*No dependencies discovered for this application.*")
968
+ lines.append("")
969
+
970
+ content = "\n".join(lines)
971
+ filepath = out_dir / "dependency_map.md"
972
+ _write_doc(filepath, content)
973
+ return str(filepath)
974
+
975
+
976
+ # ---------------------------------------------------------------------------
977
+ # 5. Tech Debt Report
978
+ # ---------------------------------------------------------------------------
979
+
980
+ def generate_tech_debt_report(app_id, output_dir, db_path=None):
981
+ """Generate a technical debt analysis report.
982
+
983
+ Ranks components by tech debt contribution using a composite score of
984
+ complexity * LOC * coupling, identifies debt hotspots, and provides
985
+ estimated remediation hours per category.
986
+
987
+ Args:
988
+ app_id: The legacy application ID.
989
+ output_dir: Directory to write the output file.
990
+ db_path: Optional database path override.
991
+
992
+ Returns:
993
+ str: Path to the generated tech_debt_report.md file.
994
+ """
995
+ conn = _get_db(db_path)
996
+ try:
997
+ app = _get_app(conn, app_id)
998
+ components = conn.execute(
999
+ "SELECT * FROM legacy_components WHERE legacy_app_id = ? ORDER BY name",
1000
+ (app_id,),
1001
+ ).fetchall()
1002
+ components = [dict(r) for r in components]
1003
+ finally:
1004
+ conn.close()
1005
+
1006
+ out_dir = _ensure_dir(output_dir)
1007
+
1008
+ # Calculate tech debt score for each component
1009
+ # Debt = cyclomatic_complexity * LOC * (1 + coupling_score)
1010
+ # This captures complex, large, tightly-coupled components as high debt
1011
+ for comp in components:
1012
+ cx = comp.get("cyclomatic_complexity", 0)
1013
+ loc = comp.get("loc", 0)
1014
+ coupling = comp.get("coupling_score", 0)
1015
+ comp["debt_score"] = cx * loc * (1.0 + coupling)
1016
+
1017
+ # Estimated remediation hours:
1018
+ # Base: 0.5 hours per 100 LOC * complexity_factor
1019
+ complexity_factor = 1.0
1020
+ if cx >= 20:
1021
+ complexity_factor = 3.0
1022
+ elif cx >= 10:
1023
+ complexity_factor = 2.0
1024
+ elif cx >= 5:
1025
+ complexity_factor = 1.5
1026
+ comp["remediation_hours"] = (loc / 100.0) * 0.5 * complexity_factor
1027
+
1028
+ # Sort by debt_score descending
1029
+ ranked = sorted(components, key=lambda c: c.get("debt_score", 0), reverse=True)
1030
+
1031
+ # Build document
1032
+ lines = []
1033
+ lines.append(f"# Technical Debt Report: {app['name']}")
1034
+ lines.append("")
1035
+ lines.append(f"**Application ID:** {app_id}")
1036
+ lines.append(f"**Generated:** {_now_iso()}")
1037
+ lines.append(f"**Classification:** {CUI_BANNER}")
1038
+ lines.append("")
1039
+ lines.append("---")
1040
+ lines.append("")
1041
+
1042
+ # Application-level metrics
1043
+ lines.append("## Application Overview")
1044
+ lines.append("")
1045
+ lines.append(f"- **Application:** {app.get('name', 'N/A')}")
1046
+ lines.append(f"- **Language:** {app.get('primary_language', 'N/A')} {app.get('language_version', '')}")
1047
+ lines.append(f"- **Framework:** {app.get('framework', 'N/A')} {app.get('framework_version', '')}")
1048
+ lines.append(f"- **Total LOC:** {app.get('loc_total', 0):,}")
1049
+ lines.append(f"- **Code LOC:** {app.get('loc_code', 0):,}")
1050
+ lines.append(f"- **File Count:** {app.get('file_count', 0):,}")
1051
+ lines.append(f"- **Complexity Score:** {app.get('complexity_score', 0):.1f}")
1052
+ lines.append(f"- **Maintainability Index:** {app.get('maintainability_index', 0):.1f}")
1053
+ lines.append(f"- **Estimated Tech Debt (app-level):** {app.get('tech_debt_hours', 0):.1f} hours")
1054
+ lines.append("")
1055
+ lines.append("---")
1056
+ lines.append("")
1057
+
1058
+ # Overall debt summary
1059
+ total_debt_hours = sum(c.get("remediation_hours", 0) for c in components)
1060
+ total_debt_score = sum(c.get("debt_score", 0) for c in components)
1061
+
1062
+ lines.append("## Debt Summary")
1063
+ lines.append("")
1064
+ lines.append(f"- **Total Components Analyzed:** {len(components)}")
1065
+ lines.append(f"- **Total Estimated Remediation Hours:** {total_debt_hours:.1f}")
1066
+ lines.append(f"- **Aggregate Debt Score:** {total_debt_score:,.0f}")
1067
+ lines.append("")
1068
+
1069
+ # Debt severity breakdown
1070
+ severity_counts = {"Very High": 0, "High": 0, "Medium": 0, "Low": 0}
1071
+ for comp in components:
1072
+ cx = comp.get("cyclomatic_complexity", 0)
1073
+ severity_counts[_complexity_rating(cx)] += 1
1074
+
1075
+ lines.append("### Complexity Distribution")
1076
+ lines.append("")
1077
+ lines.append("| Complexity | Count | Percentage |")
1078
+ lines.append("|------------|-------|------------|")
1079
+ for sev in ["Very High", "High", "Medium", "Low"]:
1080
+ count = severity_counts[sev]
1081
+ pct = (count / len(components) * 100) if components else 0
1082
+ lines.append(f"| {sev} | {count} | {pct:.1f}% |")
1083
+ lines.append("")
1084
+ lines.append("---")
1085
+ lines.append("")
1086
+
1087
+ # Top 10 debt hotspots
1088
+ top10 = ranked[:10]
1089
+ if top10:
1090
+ lines.append("## Top 10 Debt Hotspots")
1091
+ lines.append("")
1092
+ lines.append(
1093
+ "| Rank | Component | Type | LOC | Complexity | Coupling | "
1094
+ "Debt Score | Est. Hours |"
1095
+ )
1096
+ lines.append(
1097
+ "|------|-----------|------|-----|------------|----------|"
1098
+ "------------|------------|"
1099
+ )
1100
+ for rank, comp in enumerate(top10, 1):
1101
+ lines.append(
1102
+ f"| {rank} | `{comp.get('name', '')}` "
1103
+ f"| {comp.get('component_type', '')} "
1104
+ f"| {comp.get('loc', 0):,} "
1105
+ f"| {comp.get('cyclomatic_complexity', 0):.1f} "
1106
+ f"| {comp.get('coupling_score', 0):.2f} "
1107
+ f"| {comp.get('debt_score', 0):,.0f} "
1108
+ f"| {comp.get('remediation_hours', 0):.1f} |"
1109
+ )
1110
+ lines.append("")
1111
+
1112
+ # Top 10 contributes what %
1113
+ top10_debt = sum(c.get("debt_score", 0) for c in top10)
1114
+ pct = (top10_debt / total_debt_score * 100) if total_debt_score else 0
1115
+ lines.append(
1116
+ f"> The top 10 components account for **{pct:.1f}%** of total "
1117
+ f"technical debt ({top10_debt:,.0f} of {total_debt_score:,.0f})."
1118
+ )
1119
+ lines.append("")
1120
+ lines.append("---")
1121
+ lines.append("")
1122
+
1123
+ # Debt distribution by component type
1124
+ type_debt = defaultdict(lambda: {"count": 0, "debt_score": 0, "hours": 0, "loc": 0})
1125
+ for comp in components:
1126
+ ctype = comp.get("component_type", "unknown")
1127
+ type_debt[ctype]["count"] += 1
1128
+ type_debt[ctype]["debt_score"] += comp.get("debt_score", 0)
1129
+ type_debt[ctype]["hours"] += comp.get("remediation_hours", 0)
1130
+ type_debt[ctype]["loc"] += comp.get("loc", 0)
1131
+
1132
+ if type_debt:
1133
+ lines.append("## Debt Distribution by Component Type")
1134
+ lines.append("")
1135
+ lines.append("| Type | Components | Total LOC | Debt Score | Est. Hours | Avg Debt/Component |")
1136
+ lines.append("|------|------------|-----------|------------|------------|-------------------|")
1137
+ for ctype in sorted(type_debt.keys(), key=lambda t: type_debt[t]["debt_score"], reverse=True):
1138
+ td = type_debt[ctype]
1139
+ avg_debt = td["debt_score"] / td["count"] if td["count"] else 0
1140
+ lines.append(
1141
+ f"| {ctype} | {td['count']} | {td['loc']:,} "
1142
+ f"| {td['debt_score']:,.0f} | {td['hours']:.1f} | {avg_debt:,.0f} |"
1143
+ )
1144
+ lines.append("")
1145
+ lines.append("---")
1146
+ lines.append("")
1147
+
1148
+ # Estimated remediation by category
1149
+ lines.append("## Estimated Remediation by Category")
1150
+ lines.append("")
1151
+ lines.append("| Category | Description | Est. Hours |")
1152
+ lines.append("|----------|-------------|------------|")
1153
+
1154
+ # Break down by complexity rating
1155
+ cat_hours = {"Very High": 0, "High": 0, "Medium": 0, "Low": 0}
1156
+ cat_desc = {
1157
+ "Very High": "Major refactoring or rewrite required",
1158
+ "High": "Significant refactoring needed",
1159
+ "Medium": "Moderate cleanup and simplification",
1160
+ "Low": "Minor improvements and code hygiene",
1161
+ }
1162
+ for comp in components:
1163
+ cx = comp.get("cyclomatic_complexity", 0)
1164
+ rating = _complexity_rating(cx)
1165
+ cat_hours[rating] += comp.get("remediation_hours", 0)
1166
+
1167
+ for cat in ["Very High", "High", "Medium", "Low"]:
1168
+ lines.append(f"| {cat} Complexity | {cat_desc[cat]} | {cat_hours[cat]:.1f} |")
1169
+ lines.append(f"| **Total** | **All categories** | **{total_debt_hours:.1f}** |")
1170
+ lines.append("")
1171
+
1172
+ # Recommendations
1173
+ lines.append("## Recommendations")
1174
+ lines.append("")
1175
+ if severity_counts["Very High"] > 0:
1176
+ lines.append(
1177
+ f"1. **Immediate Attention:** {severity_counts['Very High']} component(s) with "
1178
+ "Very High complexity require prioritized refactoring or decomposition."
1179
+ )
1180
+ if severity_counts["High"] > 0:
1181
+ lines.append(
1182
+ f"2. **Near-Term:** {severity_counts['High']} component(s) with High complexity "
1183
+ "should be scheduled for refactoring in the next sprint cycle."
1184
+ )
1185
+ if top10:
1186
+ top_name = top10[0].get("name", "unknown")
1187
+ lines.append(
1188
+ f"3. **Highest Priority:** `{top_name}` has the highest debt score and "
1189
+ "should be the first target for remediation."
1190
+ )
1191
+ lines.append(
1192
+ f"4. **Total Effort:** Plan for approximately {total_debt_hours:.0f} hours of "
1193
+ "remediation work across all components."
1194
+ )
1195
+ lines.append("")
1196
+
1197
+ if not components:
1198
+ lines.clear()
1199
+ lines.append(f"# Technical Debt Report: {app['name']}")
1200
+ lines.append("")
1201
+ lines.append(f"**Application ID:** {app_id}")
1202
+ lines.append(f"**Generated:** {_now_iso()}")
1203
+ lines.append(f"**Classification:** {CUI_BANNER}")
1204
+ lines.append("")
1205
+ lines.append("*No components analyzed for this application.*")
1206
+ lines.append("")
1207
+
1208
+ content = "\n".join(lines)
1209
+ filepath = out_dir / "tech_debt_report.md"
1210
+ _write_doc(filepath, content)
1211
+ return str(filepath)
1212
+
1213
+
1214
+ # ---------------------------------------------------------------------------
1215
+ # 6. Full Documentation (Orchestrator)
1216
+ # ---------------------------------------------------------------------------
1217
+
1218
+ def generate_full_documentation(app_id, output_dir, db_path=None):
1219
+ """Orchestrate generation of all documentation types.
1220
+
1221
+ Creates the output directory, calls all individual generators, and
1222
+ produces an index.md linking to every generated document.
1223
+
1224
+ Args:
1225
+ app_id: The legacy application ID.
1226
+ output_dir: Directory to write all output files.
1227
+ db_path: Optional database path override.
1228
+
1229
+ Returns:
1230
+ dict with keys:
1231
+ - files: dict mapping doc type to file path
1232
+ - index: path to the generated index.md
1233
+ - app_id: the application ID
1234
+ - generated_at: ISO timestamp
1235
+ """
1236
+ out_dir = _ensure_dir(output_dir)
1237
+
1238
+ # Verify app exists before generating anything
1239
+ conn = _get_db(db_path)
1240
+ try:
1241
+ app = _get_app(conn, app_id)
1242
+ finally:
1243
+ conn.close()
1244
+
1245
+ files = {}
1246
+ errors = {}
1247
+
1248
+ # Generate each document type
1249
+ generators = [
1250
+ ("api", "API Documentation", generate_api_docs),
1251
+ ("data_dictionary", "Data Dictionary", generate_data_dictionary),
1252
+ ("components", "Component Documentation", generate_component_docs),
1253
+ ("dependencies", "Dependency Map", generate_dependency_map),
1254
+ ("tech_debt", "Tech Debt Report", generate_tech_debt_report),
1255
+ ]
1256
+
1257
+ for key, label, func in generators:
1258
+ try:
1259
+ filepath = func(app_id, str(out_dir), db_path)
1260
+ files[key] = filepath
1261
+ except Exception as e:
1262
+ errors[key] = str(e)
1263
+
1264
+ # Generate index.md
1265
+ lines = []
1266
+ lines.append(f"# Documentation Index: {app.get('name', app_id)}")
1267
+ lines.append("")
1268
+ lines.append(f"**Application ID:** {app_id}")
1269
+ lines.append(f"**Generated:** {_now_iso()}")
1270
+ lines.append(f"**Classification:** {CUI_BANNER}")
1271
+ lines.append("")
1272
+ lines.append("---")
1273
+ lines.append("")
1274
+ lines.append("## Generated Documents")
1275
+ lines.append("")
1276
+
1277
+ for key, label, _ in generators:
1278
+ if key in files:
1279
+ filename = Path(files[key]).name
1280
+ lines.append(f"- [{label}]({filename})")
1281
+ elif key in errors:
1282
+ lines.append(f"- {label} -- **FAILED:** {errors[key]}")
1283
+
1284
+ lines.append("")
1285
+ lines.append("---")
1286
+ lines.append("")
1287
+ lines.append("## Application Summary")
1288
+ lines.append("")
1289
+ lines.append(f"- **Name:** {app.get('name', 'N/A')}")
1290
+ lines.append(f"- **Language:** {app.get('primary_language', 'N/A')} {app.get('language_version', '')}")
1291
+ lines.append(f"- **Framework:** {app.get('framework', 'N/A')} {app.get('framework_version', '')}")
1292
+ lines.append(f"- **Total LOC:** {app.get('loc_total', 0):,}")
1293
+ lines.append(f"- **Files:** {app.get('file_count', 0):,}")
1294
+ lines.append(f"- **Complexity:** {app.get('complexity_score', 0):.1f}")
1295
+ lines.append(f"- **Maintainability:** {app.get('maintainability_index', 0):.1f}")
1296
+ lines.append(f"- **Tech Debt (est):** {app.get('tech_debt_hours', 0):.1f} hours")
1297
+ lines.append("")
1298
+
1299
+ if errors:
1300
+ lines.append("## Errors")
1301
+ lines.append("")
1302
+ for key, err in errors.items():
1303
+ lines.append(f"- **{key}:** {err}")
1304
+ lines.append("")
1305
+
1306
+ content = "\n".join(lines)
1307
+ index_path = out_dir / "index.md"
1308
+ _write_doc(index_path, content)
1309
+
1310
+ result = {
1311
+ "files": files,
1312
+ "index": str(index_path),
1313
+ "app_id": app_id,
1314
+ "generated_at": _now_iso(),
1315
+ "document_count": len(files),
1316
+ "error_count": len(errors),
1317
+ }
1318
+ if errors:
1319
+ result["errors"] = errors
1320
+
1321
+ return result
1322
+
1323
+
1324
+ # ---------------------------------------------------------------------------
1325
+ # CLI
1326
+ # ---------------------------------------------------------------------------
1327
+
1328
+ DOC_TYPES = {
1329
+ "api": ("API Documentation", generate_api_docs),
1330
+ "data-dictionary": ("Data Dictionary", generate_data_dictionary),
1331
+ "components": ("Component Documentation", generate_component_docs),
1332
+ "dependencies": ("Dependency Map", generate_dependency_map),
1333
+ "tech-debt": ("Tech Debt Report", generate_tech_debt_report),
1334
+ "all": ("Full Documentation", generate_full_documentation),
1335
+ }
1336
+
1337
+
1338
+ def main():
1339
+ """CLI entry point for the documentation generator."""
1340
+ parser = argparse.ArgumentParser(
1341
+ description="Generate documentation from legacy code analysis data.",
1342
+ epilog=textwrap.dedent("""\
1343
+ Examples:
1344
+ %(prog)s --app-id APP-001 --output-dir ./docs --type all
1345
+ %(prog)s --app-id APP-001 --output-dir ./docs --type api
1346
+ %(prog)s --app-id APP-001 --output-dir ./docs --type tech-debt --json
1347
+ """),
1348
+ formatter_class=argparse.RawDescriptionHelpFormatter,
1349
+ )
1350
+ parser.add_argument(
1351
+ "--app-id",
1352
+ required=True,
1353
+ help="Legacy application ID (from legacy_applications table).",
1354
+ )
1355
+ parser.add_argument(
1356
+ "--output-dir",
1357
+ required=True,
1358
+ help="Directory to write generated documentation files.",
1359
+ )
1360
+ parser.add_argument(
1361
+ "--type",
1362
+ choices=list(DOC_TYPES.keys()),
1363
+ default="all",
1364
+ help="Type of documentation to generate (default: all).",
1365
+ )
1366
+ parser.add_argument(
1367
+ "--json",
1368
+ action="store_true",
1369
+ dest="json_output",
1370
+ help="Output result as JSON (file paths and summary).",
1371
+ )
1372
+ parser.add_argument(
1373
+ "--db-path",
1374
+ default=None,
1375
+ help="Override path to icdev.db database.",
1376
+ )
1377
+
1378
+ args = parser.parse_args()
1379
+
1380
+ try:
1381
+ if args.type == "all":
1382
+ result = generate_full_documentation(
1383
+ args.app_id, args.output_dir, args.db_path
1384
+ )
1385
+ if args.json_output:
1386
+ print(json.dumps(result, indent=2))
1387
+ else:
1388
+ print(f"Documentation generated for application: {args.app_id}")
1389
+ print(f"Output directory: {args.output_dir}")
1390
+ print(f"Documents generated: {result['document_count']}")
1391
+ if result.get("error_count", 0):
1392
+ print(f"Errors: {result['error_count']}")
1393
+ print(f"Index: {result['index']}")
1394
+ for key, path in result.get("files", {}).items():
1395
+ print(f" {key}: {path}")
1396
+ if result.get("errors"):
1397
+ print("\nErrors:")
1398
+ for key, err in result["errors"].items():
1399
+ print(f" {key}: {err}")
1400
+ else:
1401
+ label, func = DOC_TYPES[args.type]
1402
+ filepath = func(args.app_id, args.output_dir, args.db_path)
1403
+ if args.json_output:
1404
+ result = {
1405
+ "type": args.type,
1406
+ "label": label,
1407
+ "file": filepath,
1408
+ "app_id": args.app_id,
1409
+ "generated_at": _now_iso(),
1410
+ }
1411
+ print(json.dumps(result, indent=2))
1412
+ else:
1413
+ print(f"{label} generated: {filepath}")
1414
+
1415
+ except FileNotFoundError as e:
1416
+ print(f"Error: {e}", file=sys.stderr)
1417
+ sys.exit(1)
1418
+ except ValueError as e:
1419
+ print(f"Error: {e}", file=sys.stderr)
1420
+ sys.exit(1)
1421
+ except Exception as e:
1422
+ print(f"Unexpected error: {e}", file=sys.stderr)
1423
+ sys.exit(2)
1424
+
1425
+
1426
+ if __name__ == "__main__":
1427
+ main()
1428
+ # [TEMPLATE: CUI // SP-CTI]