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,1665 @@
1
+ # [TEMPLATE: CUI // SP-CTI]
2
+ #!/usr/bin/env python3
3
+ """ICDEV Digital Thread Engine — end-to-end traceability across the MBSE lifecycle.
4
+
5
+ Manages N:M links between: DOORS requirements -> SysML elements -> code modules
6
+ -> test files -> NIST controls -> STIG rules -> compliance artifacts.
7
+
8
+ Supports forward/backward trace, coverage analysis, orphan/gap detection,
9
+ heuristic auto-linking, and CUI-marked traceability reports.
10
+ """
11
+
12
+ import argparse
13
+ import json
14
+ import re
15
+ import sqlite3
16
+ import sys
17
+ from collections import deque
18
+ from datetime import datetime
19
+ from pathlib import Path
20
+ from icdev._paths import get_project_root
21
+
22
+ BASE_DIR = get_project_root()
23
+ DB_PATH = BASE_DIR / "data" / "icdev.db"
24
+
25
+ # Audit trail integration (graceful fallback for standalone use)
26
+ try:
27
+ sys.path.insert(0, str(BASE_DIR))
28
+ from icdev.tools.audit.audit_logger import log_event
29
+ except ImportError:
30
+ def log_event(**kwargs):
31
+ pass
32
+
33
+ # Valid artifact types in the digital thread
34
+ VALID_TYPES = (
35
+ "doors_requirement", "sysml_element", "code_module",
36
+ "test_file", "nist_control", "stig_rule", "compliance_artifact",
37
+ "interface_spec", # Phase 26: MOSA interface specifications
38
+ )
39
+
40
+ # Valid link relationship types
41
+ VALID_LINK_TYPES = (
42
+ "satisfies", "derives_from", "implements", "verifies",
43
+ "traces_to", "allocates", "refines", "maps_to",
44
+ "defines_interface", # Phase 26: MOSA interface definition link
45
+ )
46
+
47
+ # Expected chain order for completeness analysis
48
+ THREAD_CHAIN = [
49
+ "doors_requirement", "sysml_element", "code_module",
50
+ "test_file", "nist_control",
51
+ ]
52
+
53
+ # Keyword-to-NIST-control-family mapping for auto-linking
54
+ CONTROL_KEYWORD_MAP = {
55
+ "AC": ["auth", "access", "login", "permission", "role", "rbac", "authorization"],
56
+ "AU": ["audit", "log", "logging", "trail", "monitor", "event"],
57
+ "SC": ["encrypt", "crypto", "tls", "ssl", "certificate", "cipher", "hash"],
58
+ "IA": ["identity", "authenticate", "credential", "password", "mfa", "token"],
59
+ "CM": ["config", "configuration", "baseline", "change_management"],
60
+ "SI": ["integrity", "validation", "sanitize", "input_check", "patch"],
61
+ }
62
+
63
+
64
+ # ---------------------------------------------------------------------------
65
+ # Helper: resolve human-readable name for an element
66
+ # ---------------------------------------------------------------------------
67
+ def _resolve_element_name(element_type: str, element_id: str, conn) -> str:
68
+ """Resolve human-readable name for an element by type.
69
+
70
+ doors_requirement -> doors_requirements.title
71
+ sysml_element -> sysml_elements.name
72
+ code_module -> just the path string
73
+ test_file -> just the path string
74
+ nist_control -> compliance_controls.title
75
+ stig_rule -> stig_findings.title
76
+ compliance_artifact -> 'artifact: ' + element_id
77
+ """
78
+ c = conn.cursor()
79
+ try:
80
+ if element_type == "doors_requirement":
81
+ c.execute("SELECT title FROM doors_requirements WHERE id = ?", (element_id,))
82
+ row = c.fetchone()
83
+ return row[0] if row else element_id
84
+ elif element_type == "sysml_element":
85
+ c.execute("SELECT name FROM sysml_elements WHERE id = ?", (element_id,))
86
+ row = c.fetchone()
87
+ return row[0] if row else element_id
88
+ elif element_type == "code_module":
89
+ return element_id
90
+ elif element_type == "test_file":
91
+ return element_id
92
+ elif element_type == "nist_control":
93
+ c.execute("SELECT title FROM compliance_controls WHERE id = ?", (element_id,))
94
+ row = c.fetchone()
95
+ return row[0] if row else element_id
96
+ elif element_type == "stig_rule":
97
+ c.execute("SELECT title FROM stig_findings WHERE rule_id = ?", (element_id,))
98
+ row = c.fetchone()
99
+ return row[0] if row else element_id
100
+ elif element_type == "compliance_artifact":
101
+ return f"artifact: {element_id}"
102
+ else:
103
+ return element_id
104
+ except sqlite3.OperationalError:
105
+ return element_id
106
+
107
+
108
+ # ---------------------------------------------------------------------------
109
+ # Core: create_link
110
+ # ---------------------------------------------------------------------------
111
+ def create_link(project_id: str, source_type: str, source_id: str,
112
+ target_type: str, target_id: str, link_type: str,
113
+ evidence: str = None, confidence: float = 1.0,
114
+ created_by: str = "icdev-mbse-engine", db_path=None) -> dict:
115
+ """Create a digital thread link. Returns {"id": int, "created": bool} or error.
116
+
117
+ Uses INSERT OR REPLACE for idempotency.
118
+ """
119
+ if source_type not in VALID_TYPES:
120
+ return {"error": f"Invalid source_type '{source_type}'. Valid: {VALID_TYPES}"}
121
+ if target_type not in VALID_TYPES:
122
+ return {"error": f"Invalid target_type '{target_type}'. Valid: {VALID_TYPES}"}
123
+ if link_type not in VALID_LINK_TYPES:
124
+ return {"error": f"Invalid link_type '{link_type}'. Valid: {VALID_LINK_TYPES}"}
125
+ if not (0.0 <= confidence <= 1.0):
126
+ return {"error": "Confidence must be between 0.0 and 1.0"}
127
+
128
+ path = db_path or DB_PATH
129
+ conn = sqlite3.connect(str(path))
130
+ c = conn.cursor()
131
+ try:
132
+ c.execute(
133
+ """INSERT OR REPLACE INTO digital_thread_links
134
+ (project_id, source_type, source_id, target_type, target_id,
135
+ link_type, confidence, evidence, created_by, created_at)
136
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
137
+ (project_id, source_type, source_id, target_type, target_id,
138
+ link_type, confidence, evidence, created_by,
139
+ datetime.now().isoformat()),
140
+ )
141
+ conn.commit()
142
+ link_id = c.lastrowid
143
+ created = True
144
+
145
+ # Audit trail
146
+ try:
147
+ log_event(
148
+ event_type="digital_thread_linked",
149
+ actor=created_by,
150
+ action=f"Linked {source_type}:{source_id} -> {target_type}:{target_id} ({link_type})",
151
+ project_id=project_id,
152
+ details={
153
+ "link_id": link_id,
154
+ "source_type": source_type,
155
+ "source_id": source_id,
156
+ "target_type": target_type,
157
+ "target_id": target_id,
158
+ "link_type": link_type,
159
+ "confidence": confidence,
160
+ },
161
+ db_path=path,
162
+ )
163
+ except Exception:
164
+ pass # Audit failure should not block link creation
165
+
166
+ return {"id": link_id, "created": created}
167
+ except sqlite3.Error as e:
168
+ return {"error": str(e)}
169
+ finally:
170
+ conn.close()
171
+
172
+
173
+ # ---------------------------------------------------------------------------
174
+ # Core: delete_link
175
+ # ---------------------------------------------------------------------------
176
+ def delete_link(project_id: str, link_id: int, db_path=None) -> bool:
177
+ """Delete a specific link by ID. Returns True if deleted, False otherwise."""
178
+ path = db_path or DB_PATH
179
+ conn = sqlite3.connect(str(path))
180
+ c = conn.cursor()
181
+ try:
182
+ c.execute(
183
+ "DELETE FROM digital_thread_links WHERE id = ? AND project_id = ?",
184
+ (link_id, project_id),
185
+ )
186
+ conn.commit()
187
+ deleted = c.rowcount > 0
188
+ return deleted
189
+ except sqlite3.Error:
190
+ return False
191
+ finally:
192
+ conn.close()
193
+
194
+
195
+ # ---------------------------------------------------------------------------
196
+ # Trace: forward (BFS)
197
+ # ---------------------------------------------------------------------------
198
+ def get_forward_trace(project_id: str, source_type: str, source_id: str,
199
+ max_depth: int = 10, db_path=None) -> dict:
200
+ """Trace forward from a source element through the digital thread.
201
+
202
+ Uses BFS traversal. Returns tree structure:
203
+ {"source": {"type": str, "id": str, "name": str}, "links": [
204
+ {"link_type": str, "target": {"type": str, "id": str, "name": str},
205
+ "confidence": float, "children": [...]}
206
+ ]}
207
+ """
208
+ path = db_path or DB_PATH
209
+ conn = sqlite3.connect(str(path))
210
+ conn.row_factory = sqlite3.Row
211
+
212
+ source_name = _resolve_element_name(source_type, source_id, conn)
213
+ result = {
214
+ "source": {"type": source_type, "id": source_id, "name": source_name},
215
+ "links": [],
216
+ }
217
+
218
+ # BFS traversal
219
+ visited = set()
220
+ visited.add((source_type, source_id))
221
+ queue = deque()
222
+ queue.append((source_type, source_id, result["links"], 0))
223
+
224
+ c = conn.cursor()
225
+ while queue:
226
+ curr_type, curr_id, parent_links, depth = queue.popleft()
227
+ if depth >= max_depth:
228
+ continue
229
+
230
+ c.execute(
231
+ """SELECT target_type, target_id, link_type, confidence, evidence
232
+ FROM digital_thread_links
233
+ WHERE project_id = ? AND source_type = ? AND source_id = ?""",
234
+ (project_id, curr_type, curr_id),
235
+ )
236
+ rows = c.fetchall()
237
+ for row in rows:
238
+ t_type = row["target_type"]
239
+ t_id = row["target_id"]
240
+ key = (t_type, t_id)
241
+
242
+ t_name = _resolve_element_name(t_type, t_id, conn)
243
+ child_links = []
244
+ node = {
245
+ "link_type": row["link_type"],
246
+ "confidence": row["confidence"],
247
+ "target": {"type": t_type, "id": t_id, "name": t_name},
248
+ "children": child_links,
249
+ }
250
+ parent_links.append(node)
251
+
252
+ if key not in visited:
253
+ visited.add(key)
254
+ queue.append((t_type, t_id, child_links, depth + 1))
255
+
256
+ conn.close()
257
+ return result
258
+
259
+
260
+ # ---------------------------------------------------------------------------
261
+ # Trace: backward (BFS)
262
+ # ---------------------------------------------------------------------------
263
+ def get_backward_trace(project_id: str, target_type: str, target_id: str,
264
+ max_depth: int = 10, db_path=None) -> dict:
265
+ """Trace backward from a target element. Same tree structure but reversed."""
266
+ path = db_path or DB_PATH
267
+ conn = sqlite3.connect(str(path))
268
+ conn.row_factory = sqlite3.Row
269
+
270
+ target_name = _resolve_element_name(target_type, target_id, conn)
271
+ result = {
272
+ "target": {"type": target_type, "id": target_id, "name": target_name},
273
+ "links": [],
274
+ }
275
+
276
+ # BFS traversal backward
277
+ visited = set()
278
+ visited.add((target_type, target_id))
279
+ queue = deque()
280
+ queue.append((target_type, target_id, result["links"], 0))
281
+
282
+ c = conn.cursor()
283
+ while queue:
284
+ curr_type, curr_id, parent_links, depth = queue.popleft()
285
+ if depth >= max_depth:
286
+ continue
287
+
288
+ c.execute(
289
+ """SELECT source_type, source_id, link_type, confidence, evidence
290
+ FROM digital_thread_links
291
+ WHERE project_id = ? AND target_type = ? AND target_id = ?""",
292
+ (project_id, curr_type, curr_id),
293
+ )
294
+ rows = c.fetchall()
295
+ for row in rows:
296
+ s_type = row["source_type"]
297
+ s_id = row["source_id"]
298
+ key = (s_type, s_id)
299
+
300
+ s_name = _resolve_element_name(s_type, s_id, conn)
301
+ child_links = []
302
+ node = {
303
+ "link_type": row["link_type"],
304
+ "confidence": row["confidence"],
305
+ "source": {"type": s_type, "id": s_id, "name": s_name},
306
+ "children": child_links,
307
+ }
308
+ parent_links.append(node)
309
+
310
+ if key not in visited:
311
+ visited.add(key)
312
+ queue.append((s_type, s_id, child_links, depth + 1))
313
+
314
+ conn.close()
315
+ return result
316
+
317
+
318
+ # ---------------------------------------------------------------------------
319
+ # Trace: full bidirectional
320
+ # ---------------------------------------------------------------------------
321
+ def get_full_thread(project_id: str, element_type: str, element_id: str,
322
+ db_path=None) -> dict:
323
+ """Complete bidirectional trace from any point. Returns both forward and backward."""
324
+ path = db_path or DB_PATH
325
+ forward = get_forward_trace(project_id, element_type, element_id, db_path=path)
326
+ backward = get_backward_trace(project_id, element_type, element_id, db_path=path)
327
+ conn = sqlite3.connect(str(path))
328
+ name = _resolve_element_name(element_type, element_id, conn)
329
+ conn.close()
330
+ return {
331
+ "element": {"type": element_type, "id": element_id, "name": name},
332
+ "forward": forward.get("links", []),
333
+ "backward": backward.get("links", []),
334
+ }
335
+
336
+
337
+ # ---------------------------------------------------------------------------
338
+ # Coverage analysis
339
+ # ---------------------------------------------------------------------------
340
+ def compute_coverage(project_id: str, db_path=None) -> dict:
341
+ """Coverage metrics across the digital thread.
342
+
343
+ - requirement_coverage: % of doors_requirements linked to sysml_elements
344
+ - model_coverage: % of sysml_elements (blocks only) linked to code_modules
345
+ - test_coverage: % of code_modules linked to test_files
346
+ - control_coverage: % of project_controls linked to any thread element
347
+ - overall_thread_completeness: % of requirements with full chain
348
+ (req -> model -> code -> test -> control)
349
+ """
350
+ path = db_path or DB_PATH
351
+ conn = sqlite3.connect(str(path))
352
+ c = conn.cursor()
353
+
354
+ # Total DOORS requirements for this project
355
+ c.execute("SELECT COUNT(*) FROM doors_requirements WHERE project_id = ?", (project_id,))
356
+ total_reqs = c.fetchone()[0]
357
+
358
+ # Requirements linked to sysml_elements
359
+ c.execute(
360
+ """SELECT COUNT(DISTINCT source_id) FROM digital_thread_links
361
+ WHERE project_id = ? AND source_type = 'doors_requirement'
362
+ AND target_type = 'sysml_element'""",
363
+ (project_id,),
364
+ )
365
+ linked_reqs = c.fetchone()[0]
366
+
367
+ # Total SysML blocks for this project
368
+ c.execute(
369
+ "SELECT COUNT(*) FROM sysml_elements WHERE project_id = ? AND element_type = 'block'",
370
+ (project_id,),
371
+ )
372
+ total_blocks = c.fetchone()[0]
373
+
374
+ # Blocks linked to code_modules
375
+ c.execute(
376
+ """SELECT COUNT(DISTINCT source_id) FROM digital_thread_links
377
+ WHERE project_id = ? AND source_type = 'sysml_element'
378
+ AND target_type = 'code_module'""",
379
+ (project_id,),
380
+ )
381
+ linked_blocks = c.fetchone()[0]
382
+
383
+ # Unique code_modules that are link sources or targets
384
+ c.execute(
385
+ """SELECT COUNT(DISTINCT cm) FROM (
386
+ SELECT source_id AS cm FROM digital_thread_links
387
+ WHERE project_id = ? AND source_type = 'code_module'
388
+ UNION
389
+ SELECT target_id AS cm FROM digital_thread_links
390
+ WHERE project_id = ? AND target_type = 'code_module'
391
+ )""",
392
+ (project_id, project_id),
393
+ )
394
+ total_code = c.fetchone()[0]
395
+
396
+ # Code modules linked to test_files
397
+ c.execute(
398
+ """SELECT COUNT(DISTINCT source_id) FROM digital_thread_links
399
+ WHERE project_id = ? AND source_type = 'code_module'
400
+ AND target_type = 'test_file'""",
401
+ (project_id,),
402
+ )
403
+ code_with_tests = c.fetchone()[0]
404
+
405
+ # Total project_controls
406
+ c.execute("SELECT COUNT(*) FROM project_controls WHERE project_id = ?", (project_id,))
407
+ total_controls = c.fetchone()[0]
408
+
409
+ # Controls linked to any thread element
410
+ c.execute(
411
+ """SELECT COUNT(DISTINCT pc.control_id) FROM project_controls pc
412
+ WHERE pc.project_id = ?
413
+ AND (EXISTS (
414
+ SELECT 1 FROM digital_thread_links dtl
415
+ WHERE dtl.project_id = pc.project_id
416
+ AND ((dtl.source_type = 'nist_control' AND dtl.source_id = pc.control_id)
417
+ OR (dtl.target_type = 'nist_control' AND dtl.target_id = pc.control_id))
418
+ ))""",
419
+ (project_id,),
420
+ )
421
+ linked_controls = c.fetchone()[0]
422
+
423
+ # Full chain completeness: requirement -> model -> code -> test -> control
424
+ # For each requirement, check if a full chain exists
425
+ c.execute("SELECT id FROM doors_requirements WHERE project_id = ?", (project_id,))
426
+ req_ids = [row[0] for row in c.fetchall()]
427
+ full_chain_count = 0
428
+
429
+ for req_id in req_ids:
430
+ # req -> sysml_element
431
+ c.execute(
432
+ """SELECT target_id FROM digital_thread_links
433
+ WHERE project_id = ? AND source_type = 'doors_requirement'
434
+ AND source_id = ? AND target_type = 'sysml_element'""",
435
+ (project_id, req_id),
436
+ )
437
+ model_ids = [row[0] for row in c.fetchall()]
438
+ if not model_ids:
439
+ continue
440
+
441
+ has_full_chain = False
442
+ for model_id in model_ids:
443
+ # sysml_element -> code_module
444
+ c.execute(
445
+ """SELECT target_id FROM digital_thread_links
446
+ WHERE project_id = ? AND source_type = 'sysml_element'
447
+ AND source_id = ? AND target_type = 'code_module'""",
448
+ (project_id, model_id),
449
+ )
450
+ code_ids = [row[0] for row in c.fetchall()]
451
+ if not code_ids:
452
+ continue
453
+
454
+ for code_id in code_ids:
455
+ # code_module -> test_file
456
+ c.execute(
457
+ """SELECT target_id FROM digital_thread_links
458
+ WHERE project_id = ? AND source_type = 'code_module'
459
+ AND source_id = ? AND target_type = 'test_file'""",
460
+ (project_id, code_id),
461
+ )
462
+ test_ids = [row[0] for row in c.fetchall()]
463
+ if not test_ids:
464
+ continue
465
+
466
+ # Any element in chain -> nist_control
467
+ c.execute(
468
+ """SELECT 1 FROM digital_thread_links
469
+ WHERE project_id = ?
470
+ AND target_type = 'nist_control'
471
+ AND (
472
+ (source_type = 'doors_requirement' AND source_id = ?)
473
+ OR (source_type = 'sysml_element' AND source_id = ?)
474
+ OR (source_type = 'code_module' AND source_id = ?)
475
+ OR (source_type = 'test_file' AND source_id IN ({}))
476
+ )
477
+ LIMIT 1""".format(",".join("?" * len(test_ids))),
478
+ (project_id, req_id, model_id, code_id, *test_ids),
479
+ )
480
+ if c.fetchone():
481
+ has_full_chain = True
482
+ break
483
+ break # Only need one path
484
+ if has_full_chain:
485
+ break
486
+
487
+ if has_full_chain:
488
+ full_chain_count += 1
489
+
490
+ def pct(num, denom):
491
+ return round((num / denom) * 100, 2) if denom > 0 else 0.0
492
+
493
+ conn.close()
494
+ return {
495
+ "requirement_coverage": pct(linked_reqs, total_reqs),
496
+ "model_coverage": pct(linked_blocks, total_blocks),
497
+ "test_coverage": pct(code_with_tests, total_code),
498
+ "control_coverage": pct(linked_controls, total_controls),
499
+ "overall_thread_completeness": pct(full_chain_count, total_reqs),
500
+ "details": {
501
+ "total_requirements": total_reqs,
502
+ "requirements_linked": linked_reqs,
503
+ "total_blocks": total_blocks,
504
+ "blocks_linked": linked_blocks,
505
+ "total_code_modules": total_code,
506
+ "code_with_tests": code_with_tests,
507
+ "total_controls": total_controls,
508
+ "controls_linked": linked_controls,
509
+ "full_chain_requirements": full_chain_count,
510
+ },
511
+ }
512
+
513
+
514
+ # ---------------------------------------------------------------------------
515
+ # Orphan detection
516
+ # ---------------------------------------------------------------------------
517
+ def find_orphans(project_id: str, db_path=None) -> dict:
518
+ """Find elements with no links in either direction.
519
+
520
+ - requirements_without_model: DOORS requirements not linked to any sysml_element
521
+ - blocks_without_code: SysML blocks not linked to any code_module
522
+ - code_without_tests: code_modules not linked to any test_file
523
+ - controls_without_evidence: NIST controls not linked to any thread element
524
+ """
525
+ path = db_path or DB_PATH
526
+ conn = sqlite3.connect(str(path))
527
+ c = conn.cursor()
528
+
529
+ # Requirements without model links
530
+ c.execute(
531
+ """SELECT dr.id, dr.doors_id, dr.title FROM doors_requirements dr
532
+ WHERE dr.project_id = ?
533
+ AND dr.id NOT IN (
534
+ SELECT source_id FROM digital_thread_links
535
+ WHERE project_id = ? AND source_type = 'doors_requirement'
536
+ AND target_type = 'sysml_element'
537
+ )
538
+ AND dr.id NOT IN (
539
+ SELECT target_id FROM digital_thread_links
540
+ WHERE project_id = ? AND target_type = 'doors_requirement'
541
+ AND source_type = 'sysml_element'
542
+ )""",
543
+ (project_id, project_id, project_id),
544
+ )
545
+ reqs_orphans = [{"id": r[0], "doors_id": r[1], "title": r[2]} for r in c.fetchall()]
546
+
547
+ # SysML blocks without code links
548
+ c.execute(
549
+ """SELECT se.id, se.name FROM sysml_elements se
550
+ WHERE se.project_id = ? AND se.element_type = 'block'
551
+ AND se.id NOT IN (
552
+ SELECT source_id FROM digital_thread_links
553
+ WHERE project_id = ? AND source_type = 'sysml_element'
554
+ AND target_type = 'code_module'
555
+ )
556
+ AND se.id NOT IN (
557
+ SELECT target_id FROM digital_thread_links
558
+ WHERE project_id = ? AND target_type = 'sysml_element'
559
+ AND source_type = 'code_module'
560
+ )""",
561
+ (project_id, project_id, project_id),
562
+ )
563
+ blocks_orphans = [{"id": r[0], "name": r[1]} for r in c.fetchall()]
564
+
565
+ # Code modules without test links
566
+ # Gather all code_modules that appear in links for this project
567
+ c.execute(
568
+ """SELECT DISTINCT cm FROM (
569
+ SELECT source_id AS cm FROM digital_thread_links
570
+ WHERE project_id = ? AND source_type = 'code_module'
571
+ UNION
572
+ SELECT target_id AS cm FROM digital_thread_links
573
+ WHERE project_id = ? AND target_type = 'code_module'
574
+ )""",
575
+ (project_id, project_id),
576
+ )
577
+ all_code = [row[0] for row in c.fetchall()]
578
+
579
+ code_orphans = []
580
+ for code_id in all_code:
581
+ c.execute(
582
+ """SELECT 1 FROM digital_thread_links
583
+ WHERE project_id = ?
584
+ AND ((source_type = 'code_module' AND source_id = ? AND target_type = 'test_file')
585
+ OR (target_type = 'code_module' AND target_id = ? AND source_type = 'test_file'))
586
+ LIMIT 1""",
587
+ (project_id, code_id, code_id),
588
+ )
589
+ if not c.fetchone():
590
+ code_orphans.append({"id": code_id})
591
+
592
+ # NIST controls without evidence (no links at all)
593
+ c.execute(
594
+ """SELECT pc.control_id FROM project_controls pc
595
+ WHERE pc.project_id = ?
596
+ AND NOT EXISTS (
597
+ SELECT 1 FROM digital_thread_links dtl
598
+ WHERE dtl.project_id = pc.project_id
599
+ AND ((dtl.source_type = 'nist_control' AND dtl.source_id = pc.control_id)
600
+ OR (dtl.target_type = 'nist_control' AND dtl.target_id = pc.control_id))
601
+ )""",
602
+ (project_id,),
603
+ )
604
+ control_orphans = [{"control_id": r[0]} for r in c.fetchall()]
605
+
606
+ conn.close()
607
+ return {
608
+ "requirements_without_model": {
609
+ "count": len(reqs_orphans),
610
+ "items": reqs_orphans,
611
+ },
612
+ "blocks_without_code": {
613
+ "count": len(blocks_orphans),
614
+ "items": blocks_orphans,
615
+ },
616
+ "code_without_tests": {
617
+ "count": len(code_orphans),
618
+ "items": code_orphans,
619
+ },
620
+ "controls_without_evidence": {
621
+ "count": len(control_orphans),
622
+ "items": control_orphans,
623
+ },
624
+ }
625
+
626
+
627
+ # ---------------------------------------------------------------------------
628
+ # Gap detection
629
+ # ---------------------------------------------------------------------------
630
+ def find_gaps(project_id: str, db_path=None) -> dict:
631
+ """Find missing links in expected chains.
632
+
633
+ - requirement has model link but model has no code link
634
+ - model has code link but code has no test link
635
+ - code has test link but no control link
636
+ """
637
+ path = db_path or DB_PATH
638
+ conn = sqlite3.connect(str(path))
639
+ c = conn.cursor()
640
+ gaps = []
641
+
642
+ # Gap 1: requirement -> model exists, but model -> code missing
643
+ c.execute(
644
+ """SELECT dtl.source_id, dtl.target_id
645
+ FROM digital_thread_links dtl
646
+ WHERE dtl.project_id = ?
647
+ AND dtl.source_type = 'doors_requirement'
648
+ AND dtl.target_type = 'sysml_element'""",
649
+ (project_id,),
650
+ )
651
+ req_model_links = c.fetchall()
652
+ for req_id, model_id in req_model_links:
653
+ c.execute(
654
+ """SELECT 1 FROM digital_thread_links
655
+ WHERE project_id = ? AND source_type = 'sysml_element'
656
+ AND source_id = ? AND target_type = 'code_module'
657
+ LIMIT 1""",
658
+ (project_id, model_id),
659
+ )
660
+ if not c.fetchone():
661
+ req_name = _resolve_element_name("doors_requirement", req_id, conn)
662
+ model_name = _resolve_element_name("sysml_element", model_id, conn)
663
+ gaps.append({
664
+ "gap_type": "model_without_code",
665
+ "description": (
666
+ f"Requirement '{req_name}' ({req_id}) traces to model "
667
+ f"'{model_name}' ({model_id}), but model has no code link"
668
+ ),
669
+ "requirement_id": req_id,
670
+ "model_id": model_id,
671
+ "missing_link": "sysml_element -> code_module",
672
+ })
673
+
674
+ # Gap 2: model -> code exists, but code -> test missing
675
+ c.execute(
676
+ """SELECT dtl.source_id, dtl.target_id
677
+ FROM digital_thread_links dtl
678
+ WHERE dtl.project_id = ?
679
+ AND dtl.source_type = 'sysml_element'
680
+ AND dtl.target_type = 'code_module'""",
681
+ (project_id,),
682
+ )
683
+ model_code_links = c.fetchall()
684
+ for model_id, code_id in model_code_links:
685
+ c.execute(
686
+ """SELECT 1 FROM digital_thread_links
687
+ WHERE project_id = ? AND source_type = 'code_module'
688
+ AND source_id = ? AND target_type = 'test_file'
689
+ LIMIT 1""",
690
+ (project_id, code_id),
691
+ )
692
+ if not c.fetchone():
693
+ model_name = _resolve_element_name("sysml_element", model_id, conn)
694
+ gaps.append({
695
+ "gap_type": "code_without_test",
696
+ "description": (
697
+ f"Model '{model_name}' ({model_id}) traces to code "
698
+ f"'{code_id}', but code has no test link"
699
+ ),
700
+ "model_id": model_id,
701
+ "code_id": code_id,
702
+ "missing_link": "code_module -> test_file",
703
+ })
704
+
705
+ # Gap 3: code -> test exists, but no control link from any chain element
706
+ c.execute(
707
+ """SELECT dtl.source_id, dtl.target_id
708
+ FROM digital_thread_links dtl
709
+ WHERE dtl.project_id = ?
710
+ AND dtl.source_type = 'code_module'
711
+ AND dtl.target_type = 'test_file'""",
712
+ (project_id,),
713
+ )
714
+ code_test_links = c.fetchall()
715
+ for code_id, test_id in code_test_links:
716
+ c.execute(
717
+ """SELECT 1 FROM digital_thread_links
718
+ WHERE project_id = ?
719
+ AND target_type = 'nist_control'
720
+ AND (
721
+ (source_type = 'code_module' AND source_id = ?)
722
+ OR (source_type = 'test_file' AND source_id = ?)
723
+ )
724
+ LIMIT 1""",
725
+ (project_id, code_id, test_id),
726
+ )
727
+ if not c.fetchone():
728
+ gaps.append({
729
+ "gap_type": "test_without_control",
730
+ "description": (
731
+ f"Code '{code_id}' has test '{test_id}', "
732
+ f"but neither is linked to a NIST control"
733
+ ),
734
+ "code_id": code_id,
735
+ "test_id": test_id,
736
+ "missing_link": "code_module/test_file -> nist_control",
737
+ })
738
+
739
+ conn.close()
740
+ return {
741
+ "total_gaps": len(gaps),
742
+ "gaps": gaps,
743
+ }
744
+
745
+
746
+ # ---------------------------------------------------------------------------
747
+ # Auto-link by name matching
748
+ # ---------------------------------------------------------------------------
749
+ def _camel_to_snake(name: str) -> str:
750
+ """Convert CamelCase to snake_case."""
751
+ s1 = re.sub(r"(.)([A-Z][a-z]+)", r"\1_\2", name)
752
+ return re.sub(r"([a-z0-9])([A-Z])", r"\1_\2", s1).lower()
753
+
754
+
755
+ def _snake_to_camel(name: str) -> str:
756
+ """Convert snake_case to CamelCase."""
757
+ return "".join(word.capitalize() for word in name.split("_"))
758
+
759
+
760
+ def auto_link_by_name(project_id: str, db_path=None) -> dict:
761
+ """Heuristic auto-linking by name matching.
762
+
763
+ 1. Match SysML block names to Python class names (case-insensitive,
764
+ underscore/camel conversion)
765
+ 2. Match SysML block names to file names (snake_case conversion)
766
+ 3. Match requirement IDs found in code comments to DOORS requirements
767
+ 4. Match requirement IDs found in test names to DOORS requirements
768
+
769
+ Creates links with confidence 0.7 and evidence="auto_linked_by_name_match"
770
+ """
771
+ path = db_path or DB_PATH
772
+ conn = sqlite3.connect(str(path))
773
+ c = conn.cursor()
774
+ matches = []
775
+ links_created = 0
776
+
777
+ # 1. Get all SysML blocks for this project
778
+ c.execute(
779
+ """SELECT id, name FROM sysml_elements
780
+ WHERE project_id = ? AND element_type = 'block'""",
781
+ (project_id,),
782
+ )
783
+ blocks = c.fetchall()
784
+
785
+ # 2. Get all code mappings for this project (model_code_mappings)
786
+ c.execute(
787
+ """SELECT code_path, code_type FROM model_code_mappings
788
+ WHERE project_id = ?""",
789
+ (project_id,),
790
+ )
791
+ code_paths = c.fetchall()
792
+
793
+ # 3. Get all DOORS requirements
794
+ c.execute(
795
+ """SELECT id, doors_id, title FROM doors_requirements
796
+ WHERE project_id = ?""",
797
+ (project_id,),
798
+ )
799
+ requirements = c.fetchall()
800
+
801
+ # Strategy 1 & 2: Match SysML block names to code paths
802
+ for block_id, block_name in blocks:
803
+ snake_name = _camel_to_snake(block_name)
804
+ lower_name = block_name.lower()
805
+
806
+ for code_path_row in code_paths:
807
+ code_path = code_path_row[0]
808
+ file_stem = Path(code_path).stem.lower()
809
+ Path(code_path).name.lower()
810
+
811
+ # Match block name (snake_case) to file stem
812
+ if snake_name == file_stem or lower_name == file_stem:
813
+ result = create_link(
814
+ project_id=project_id,
815
+ source_type="sysml_element",
816
+ source_id=block_id,
817
+ target_type="code_module",
818
+ target_id=code_path,
819
+ link_type="implements",
820
+ confidence=0.7,
821
+ evidence="auto_linked_by_name_match",
822
+ created_by="icdev-auto-linker",
823
+ db_path=path,
824
+ )
825
+ if result.get("created") or result.get("id"):
826
+ links_created += 1
827
+ matches.append({
828
+ "type": "block_to_code",
829
+ "block_id": block_id,
830
+ "block_name": block_name,
831
+ "code_path": code_path,
832
+ "match_method": "name_match",
833
+ })
834
+
835
+ # Match CamelCase block name to file name containing it
836
+ camel_lower = block_name.lower().replace("_", "")
837
+ stem_lower = file_stem.replace("_", "")
838
+ if camel_lower == stem_lower and camel_lower:
839
+ result = create_link(
840
+ project_id=project_id,
841
+ source_type="sysml_element",
842
+ source_id=block_id,
843
+ target_type="code_module",
844
+ target_id=code_path,
845
+ link_type="implements",
846
+ confidence=0.7,
847
+ evidence="auto_linked_by_name_match",
848
+ created_by="icdev-auto-linker",
849
+ db_path=path,
850
+ )
851
+ if result.get("created") or result.get("id"):
852
+ links_created += 1
853
+ matches.append({
854
+ "type": "block_to_code_camel",
855
+ "block_id": block_id,
856
+ "block_name": block_name,
857
+ "code_path": code_path,
858
+ "match_method": "camel_case_match",
859
+ })
860
+
861
+ # Strategy 3 & 4: Match requirement IDs in code/test paths
862
+ # Build a lookup of doors_id -> internal id
863
+ req_lookup = {}
864
+ for req_id, doors_id, title in requirements:
865
+ req_lookup[doors_id.lower()] = req_id
866
+ # Also try matching the internal id
867
+ req_lookup[req_id.lower()] = req_id
868
+
869
+ for code_path_row in code_paths:
870
+ code_path = code_path_row[0]
871
+ code_type = code_path_row[1]
872
+ file_str = Path(code_path).name.lower()
873
+
874
+ for doors_id_lower, req_internal_id in req_lookup.items():
875
+ # Normalize doors_id for filename matching (e.g., REQ-001 -> req_001 or req001)
876
+ normalized = doors_id_lower.replace("-", "_").replace(" ", "_")
877
+ normalized_no_sep = doors_id_lower.replace("-", "").replace("_", "").replace(" ", "")
878
+
879
+ if normalized in file_str or normalized_no_sep in file_str:
880
+ if code_type == "test":
881
+ # Test file references requirement
882
+ result = create_link(
883
+ project_id=project_id,
884
+ source_type="test_file",
885
+ source_id=code_path,
886
+ target_type="doors_requirement",
887
+ target_id=req_internal_id,
888
+ link_type="verifies",
889
+ confidence=0.7,
890
+ evidence="auto_linked_by_name_match",
891
+ created_by="icdev-auto-linker",
892
+ db_path=path,
893
+ )
894
+ else:
895
+ # Code module references requirement
896
+ result = create_link(
897
+ project_id=project_id,
898
+ source_type="code_module",
899
+ source_id=code_path,
900
+ target_type="doors_requirement",
901
+ target_id=req_internal_id,
902
+ link_type="implements",
903
+ confidence=0.7,
904
+ evidence="auto_linked_by_name_match",
905
+ created_by="icdev-auto-linker",
906
+ db_path=path,
907
+ )
908
+ if result.get("created") or result.get("id"):
909
+ links_created += 1
910
+ matches.append({
911
+ "type": "req_in_filename",
912
+ "code_path": code_path,
913
+ "requirement_id": req_internal_id,
914
+ "doors_id": doors_id_lower,
915
+ "match_method": "requirement_id_in_filename",
916
+ })
917
+
918
+ conn.close()
919
+ return {
920
+ "links_created": links_created,
921
+ "matches": matches,
922
+ }
923
+
924
+
925
+ # ---------------------------------------------------------------------------
926
+ # Auto-link to NIST controls by keyword
927
+ # ---------------------------------------------------------------------------
928
+ def auto_link_to_controls(project_id: str, db_path=None) -> dict:
929
+ """Auto-map model elements to NIST controls by element type/stereotype.
930
+
931
+ - Elements with 'auth', 'access', 'login' -> AC family
932
+ - Elements with 'audit', 'log' -> AU family
933
+ - Elements with 'encrypt', 'crypto', 'tls' -> SC family
934
+ - Elements with 'identity', 'authenticate' -> IA family
935
+
936
+ Creates links with confidence 0.6 and evidence="auto_linked_by_keyword_match"
937
+ """
938
+ path = db_path or DB_PATH
939
+ conn = sqlite3.connect(str(path))
940
+ c = conn.cursor()
941
+ mappings = []
942
+ links_created = 0
943
+
944
+ # Get all SysML elements for this project
945
+ c.execute(
946
+ """SELECT id, name, element_type, stereotype, description
947
+ FROM sysml_elements WHERE project_id = ?""",
948
+ (project_id,),
949
+ )
950
+ elements = c.fetchall()
951
+
952
+ # Get available NIST controls for this project
953
+ c.execute(
954
+ """SELECT DISTINCT pc.control_id, cc.family, cc.title
955
+ FROM project_controls pc
956
+ JOIN compliance_controls cc ON pc.control_id = cc.id
957
+ WHERE pc.project_id = ?""",
958
+ (project_id,),
959
+ )
960
+ controls = c.fetchall()
961
+
962
+ # Build family -> control_ids lookup
963
+ family_controls = {}
964
+ for ctrl_id, family, title in controls:
965
+ family_controls.setdefault(family, []).append((ctrl_id, title))
966
+
967
+ for elem_id, elem_name, elem_type, stereotype, description in elements:
968
+ # Combine searchable text
969
+ search_text = " ".join(
970
+ s.lower() for s in [elem_name or "", stereotype or "", description or ""]
971
+ )
972
+
973
+ for family, keywords in CONTROL_KEYWORD_MAP.items():
974
+ if family not in family_controls:
975
+ continue
976
+
977
+ matched_keywords = [kw for kw in keywords if kw in search_text]
978
+ if not matched_keywords:
979
+ continue
980
+
981
+ # Link to all controls in the matched family
982
+ for ctrl_id, ctrl_title in family_controls[family]:
983
+ result = create_link(
984
+ project_id=project_id,
985
+ source_type="sysml_element",
986
+ source_id=elem_id,
987
+ target_type="nist_control",
988
+ target_id=ctrl_id,
989
+ link_type="maps_to",
990
+ confidence=0.6,
991
+ evidence="auto_linked_by_keyword_match",
992
+ created_by="icdev-auto-linker",
993
+ db_path=path,
994
+ )
995
+ if result.get("created") or result.get("id"):
996
+ links_created += 1
997
+ mappings.append({
998
+ "element_id": elem_id,
999
+ "element_name": elem_name,
1000
+ "control_id": ctrl_id,
1001
+ "control_title": ctrl_title,
1002
+ "control_family": family,
1003
+ "matched_keywords": matched_keywords,
1004
+ })
1005
+
1006
+ conn.close()
1007
+ return {
1008
+ "links_created": links_created,
1009
+ "mappings": mappings,
1010
+ }
1011
+
1012
+
1013
+ # ---------------------------------------------------------------------------
1014
+ # Traceability report (CUI-marked markdown)
1015
+ # ---------------------------------------------------------------------------
1016
+ def generate_traceability_report(project_id: str, db_path=None) -> str:
1017
+ """Generate full digital thread report as CUI-marked markdown.
1018
+
1019
+ Includes coverage summary, orphan analysis, gap analysis,
1020
+ complete trace chains, and recommendations.
1021
+ """
1022
+ path = db_path or DB_PATH
1023
+ timestamp = datetime.now().isoformat()
1024
+
1025
+ coverage = compute_coverage(project_id, db_path=path)
1026
+ orphans = find_orphans(project_id, db_path=path)
1027
+ gaps = find_gaps(project_id, db_path=path)
1028
+ integrity = validate_thread_integrity(project_id, db_path=path)
1029
+
1030
+ # Collect all trace chains from requirements
1031
+ conn = sqlite3.connect(str(path))
1032
+ c = conn.cursor()
1033
+ c.execute("SELECT id, doors_id, title FROM doors_requirements WHERE project_id = ?",
1034
+ (project_id,))
1035
+ all_reqs = c.fetchall()
1036
+
1037
+ c.execute("SELECT COUNT(*) FROM digital_thread_links WHERE project_id = ?", (project_id,))
1038
+ total_links = c.fetchone()[0]
1039
+ conn.close()
1040
+
1041
+ # Build report
1042
+ lines = [
1043
+ "CUI // SP-CTI",
1044
+ "",
1045
+ "# Digital Thread Traceability Report",
1046
+ "",
1047
+ f"**Project:** {project_id}",
1048
+ f"**Generated:** {timestamp}",
1049
+ "**Classification:** CUI // SP-CTI",
1050
+ "",
1051
+ "---",
1052
+ "",
1053
+ "## 1. Coverage Summary",
1054
+ "",
1055
+ "| Metric | Value |",
1056
+ "|--------|-------|",
1057
+ f"| Requirement Coverage | {coverage['requirement_coverage']}% |",
1058
+ f"| Model Coverage | {coverage['model_coverage']}% |",
1059
+ f"| Test Coverage | {coverage['test_coverage']}% |",
1060
+ f"| Control Coverage | {coverage['control_coverage']}% |",
1061
+ f"| Overall Thread Completeness | {coverage['overall_thread_completeness']}% |",
1062
+ f"| Total Digital Thread Links | {total_links} |",
1063
+ "",
1064
+ "### Coverage Details",
1065
+ "",
1066
+ ]
1067
+
1068
+ details = coverage.get("details", {})
1069
+ lines.append(f"- Requirements: {details.get('requirements_linked', 0)}/{details.get('total_requirements', 0)} linked to models")
1070
+ lines.append(f"- Model Blocks: {details.get('blocks_linked', 0)}/{details.get('total_blocks', 0)} linked to code")
1071
+ lines.append(f"- Code Modules: {details.get('code_with_tests', 0)}/{details.get('total_code_modules', 0)} linked to tests")
1072
+ lines.append(f"- Controls: {details.get('controls_linked', 0)}/{details.get('total_controls', 0)} linked to thread")
1073
+ lines.append(f"- Full Chain (req->model->code->test->control): {details.get('full_chain_requirements', 0)}/{details.get('total_requirements', 0)}")
1074
+ lines.append("")
1075
+
1076
+ # Orphan analysis
1077
+ lines.append("---")
1078
+ lines.append("")
1079
+ lines.append("## 2. Orphan Analysis")
1080
+ lines.append("")
1081
+
1082
+ total_orphans = (
1083
+ orphans["requirements_without_model"]["count"]
1084
+ + orphans["blocks_without_code"]["count"]
1085
+ + orphans["code_without_tests"]["count"]
1086
+ + orphans["controls_without_evidence"]["count"]
1087
+ )
1088
+ lines.append(f"**Total orphaned elements:** {total_orphans}")
1089
+ lines.append("")
1090
+
1091
+ lines.append(f"### Requirements Without Model ({orphans['requirements_without_model']['count']})")
1092
+ if orphans["requirements_without_model"]["items"]:
1093
+ for item in orphans["requirements_without_model"]["items"]:
1094
+ lines.append(f"- `{item.get('doors_id', item['id'])}`: {item.get('title', 'N/A')}")
1095
+ else:
1096
+ lines.append("- None (all requirements traced)")
1097
+ lines.append("")
1098
+
1099
+ lines.append(f"### Blocks Without Code ({orphans['blocks_without_code']['count']})")
1100
+ if orphans["blocks_without_code"]["items"]:
1101
+ for item in orphans["blocks_without_code"]["items"]:
1102
+ lines.append(f"- `{item['id']}`: {item.get('name', 'N/A')}")
1103
+ else:
1104
+ lines.append("- None (all blocks traced)")
1105
+ lines.append("")
1106
+
1107
+ lines.append(f"### Code Without Tests ({orphans['code_without_tests']['count']})")
1108
+ if orphans["code_without_tests"]["items"]:
1109
+ for item in orphans["code_without_tests"]["items"]:
1110
+ lines.append(f"- `{item['id']}`")
1111
+ else:
1112
+ lines.append("- None (all code modules have tests)")
1113
+ lines.append("")
1114
+
1115
+ lines.append(f"### Controls Without Evidence ({orphans['controls_without_evidence']['count']})")
1116
+ if orphans["controls_without_evidence"]["items"]:
1117
+ for item in orphans["controls_without_evidence"]["items"]:
1118
+ lines.append(f"- `{item['control_id']}`")
1119
+ else:
1120
+ lines.append("- None (all controls have thread links)")
1121
+ lines.append("")
1122
+
1123
+ # Gap analysis
1124
+ lines.append("---")
1125
+ lines.append("")
1126
+ lines.append("## 3. Gap Analysis")
1127
+ lines.append("")
1128
+ lines.append(f"**Total gaps found:** {gaps['total_gaps']}")
1129
+ lines.append("")
1130
+
1131
+ if gaps["gaps"]:
1132
+ for i, gap in enumerate(gaps["gaps"], 1):
1133
+ lines.append(f"**Gap {i}** ({gap['gap_type']}): {gap['description']}")
1134
+ lines.append(f" - Missing link: `{gap['missing_link']}`")
1135
+ lines.append("")
1136
+ else:
1137
+ lines.append("No gaps detected. All chains are complete.")
1138
+ lines.append("")
1139
+
1140
+ # Trace chains
1141
+ lines.append("---")
1142
+ lines.append("")
1143
+ lines.append("## 4. Requirement Trace Chains")
1144
+ lines.append("")
1145
+
1146
+ for req_id, doors_id, title in all_reqs[:50]: # Limit to 50 for report size
1147
+ trace = get_forward_trace(project_id, "doors_requirement", req_id, max_depth=5, db_path=path)
1148
+ chain_depth = _count_chain_depth(trace.get("links", []))
1149
+ status = "COMPLETE" if chain_depth >= 4 else f"PARTIAL (depth {chain_depth})"
1150
+ lines.append(f"- **{doors_id}** ({title}): {status}")
1151
+
1152
+ if len(all_reqs) > 50:
1153
+ lines.append(f" - ... and {len(all_reqs) - 50} more requirements")
1154
+ lines.append("")
1155
+
1156
+ # Integrity
1157
+ lines.append("---")
1158
+ lines.append("")
1159
+ lines.append("## 5. Thread Integrity")
1160
+ lines.append("")
1161
+ lines.append(f"**Valid:** {'YES' if integrity['valid'] else 'NO'}")
1162
+ lines.append(f"**Issues found:** {len(integrity['issues'])}")
1163
+ lines.append("")
1164
+
1165
+ if integrity["issues"]:
1166
+ for issue in integrity["issues"][:20]:
1167
+ lines.append(f"- [{issue['severity']}] {issue['description']}")
1168
+ if len(integrity["issues"]) > 20:
1169
+ lines.append(f"- ... and {len(integrity['issues']) - 20} more issues")
1170
+ lines.append("")
1171
+
1172
+ # Recommendations
1173
+ lines.append("---")
1174
+ lines.append("")
1175
+ lines.append("## 6. Recommendations")
1176
+ lines.append("")
1177
+
1178
+ recommendations = []
1179
+ if coverage["requirement_coverage"] < 100:
1180
+ recommendations.append(
1181
+ f"Link remaining {details.get('total_requirements', 0) - details.get('requirements_linked', 0)} "
1182
+ f"requirements to SysML model elements"
1183
+ )
1184
+ if coverage["model_coverage"] < 100:
1185
+ recommendations.append(
1186
+ f"Map remaining {details.get('total_blocks', 0) - details.get('blocks_linked', 0)} "
1187
+ f"SysML blocks to code modules"
1188
+ )
1189
+ if coverage["test_coverage"] < 100:
1190
+ recommendations.append(
1191
+ f"Write tests for {details.get('total_code_modules', 0) - details.get('code_with_tests', 0)} "
1192
+ f"untested code modules"
1193
+ )
1194
+ if coverage["control_coverage"] < 100:
1195
+ recommendations.append(
1196
+ f"Map remaining {details.get('total_controls', 0) - details.get('controls_linked', 0)} "
1197
+ f"NIST controls to thread elements"
1198
+ )
1199
+ if not integrity["valid"]:
1200
+ recommendations.append("Resolve thread integrity issues before ATO submission")
1201
+ if gaps["total_gaps"] > 0:
1202
+ recommendations.append(f"Address {gaps['total_gaps']} chain gaps to improve completeness")
1203
+
1204
+ if recommendations:
1205
+ for i, rec in enumerate(recommendations, 1):
1206
+ lines.append(f"{i}. {rec}")
1207
+ else:
1208
+ lines.append("No recommendations. Digital thread is complete.")
1209
+ lines.append("")
1210
+
1211
+ lines.append("---")
1212
+ lines.append("")
1213
+ lines.append("CUI // SP-CTI")
1214
+
1215
+ return "\n".join(lines)
1216
+
1217
+
1218
+ def _count_chain_depth(links: list, depth: int = 0) -> int:
1219
+ """Count the maximum depth of a trace chain."""
1220
+ if not links:
1221
+ return depth
1222
+ max_d = depth
1223
+ for link in links:
1224
+ child_depth = _count_chain_depth(link.get("children", []), depth + 1)
1225
+ if child_depth > max_d:
1226
+ max_d = child_depth
1227
+ return max_d
1228
+
1229
+
1230
+ # ---------------------------------------------------------------------------
1231
+ # Thread integrity validation
1232
+ # ---------------------------------------------------------------------------
1233
+ def validate_thread_integrity(project_id: str, db_path=None) -> dict:
1234
+ """Check for data integrity issues.
1235
+
1236
+ - Broken links (source/target IDs that don't exist in their tables)
1237
+ - Circular references
1238
+ - Duplicate links
1239
+ - Invalid types
1240
+ """
1241
+ path = db_path or DB_PATH
1242
+ conn = sqlite3.connect(str(path))
1243
+ c = conn.cursor()
1244
+ issues = []
1245
+
1246
+ # Get all links for this project
1247
+ c.execute(
1248
+ """SELECT id, source_type, source_id, target_type, target_id, link_type, confidence
1249
+ FROM digital_thread_links WHERE project_id = ?""",
1250
+ (project_id,),
1251
+ )
1252
+ all_links = c.fetchall()
1253
+
1254
+ # Check 1: Invalid types
1255
+ for link_id, src_type, src_id, tgt_type, tgt_id, ltype, conf in all_links:
1256
+ if src_type not in VALID_TYPES:
1257
+ issues.append({
1258
+ "severity": "error",
1259
+ "type": "invalid_source_type",
1260
+ "link_id": link_id,
1261
+ "description": f"Link {link_id}: invalid source_type '{src_type}'",
1262
+ })
1263
+ if tgt_type not in VALID_TYPES:
1264
+ issues.append({
1265
+ "severity": "error",
1266
+ "type": "invalid_target_type",
1267
+ "link_id": link_id,
1268
+ "description": f"Link {link_id}: invalid target_type '{tgt_type}'",
1269
+ })
1270
+ if ltype not in VALID_LINK_TYPES:
1271
+ issues.append({
1272
+ "severity": "error",
1273
+ "type": "invalid_link_type",
1274
+ "link_id": link_id,
1275
+ "description": f"Link {link_id}: invalid link_type '{ltype}'",
1276
+ })
1277
+
1278
+ # Check 2: Broken links (source/target IDs not in their tables)
1279
+ type_table_map = {
1280
+ "doors_requirement": ("doors_requirements", "id"),
1281
+ "sysml_element": ("sysml_elements", "id"),
1282
+ "nist_control": ("compliance_controls", "id"),
1283
+ "stig_rule": ("stig_findings", "rule_id"),
1284
+ }
1285
+
1286
+ for link_id, src_type, src_id, tgt_type, tgt_id, ltype, conf in all_links:
1287
+ # Check source exists
1288
+ if src_type in type_table_map:
1289
+ table, col = type_table_map[src_type]
1290
+ try:
1291
+ c.execute(f"SELECT 1 FROM {table} WHERE {col} = ? LIMIT 1", (src_id,))
1292
+ if not c.fetchone():
1293
+ issues.append({
1294
+ "severity": "warning",
1295
+ "type": "broken_source_link",
1296
+ "link_id": link_id,
1297
+ "description": (
1298
+ f"Link {link_id}: source {src_type} '{src_id}' "
1299
+ f"not found in {table}"
1300
+ ),
1301
+ })
1302
+ except sqlite3.OperationalError:
1303
+ pass # Table might not exist
1304
+
1305
+ # Check target exists
1306
+ if tgt_type in type_table_map:
1307
+ table, col = type_table_map[tgt_type]
1308
+ try:
1309
+ c.execute(f"SELECT 1 FROM {table} WHERE {col} = ? LIMIT 1", (tgt_id,))
1310
+ if not c.fetchone():
1311
+ issues.append({
1312
+ "severity": "warning",
1313
+ "type": "broken_target_link",
1314
+ "link_id": link_id,
1315
+ "description": (
1316
+ f"Link {link_id}: target {tgt_type} '{tgt_id}' "
1317
+ f"not found in {table}"
1318
+ ),
1319
+ })
1320
+ except sqlite3.OperationalError:
1321
+ pass # Table might not exist
1322
+
1323
+ # Check 3: Circular references (detect cycles using DFS)
1324
+ # Build adjacency list
1325
+ adj = {}
1326
+ for link_id, src_type, src_id, tgt_type, tgt_id, ltype, conf in all_links:
1327
+ src_key = (src_type, src_id)
1328
+ tgt_key = (tgt_type, tgt_id)
1329
+ adj.setdefault(src_key, []).append((tgt_key, link_id))
1330
+
1331
+ visited = set()
1332
+ in_stack = set()
1333
+ cycle_links = set()
1334
+
1335
+ def dfs(node):
1336
+ visited.add(node)
1337
+ in_stack.add(node)
1338
+ for neighbor, lid in adj.get(node, []):
1339
+ if neighbor in in_stack:
1340
+ cycle_links.add(lid)
1341
+ elif neighbor not in visited:
1342
+ dfs(neighbor)
1343
+ in_stack.discard(node)
1344
+
1345
+ for node in adj:
1346
+ if node not in visited:
1347
+ dfs(node)
1348
+
1349
+ for lid in cycle_links:
1350
+ issues.append({
1351
+ "severity": "warning",
1352
+ "type": "circular_reference",
1353
+ "link_id": lid,
1354
+ "description": f"Link {lid}: participates in a circular reference chain",
1355
+ })
1356
+
1357
+ # Check 4: Duplicate links (same source+target+link_type, different IDs)
1358
+ # The UNIQUE constraint should prevent this, but check anyway
1359
+ seen_combos = {}
1360
+ for link_id, src_type, src_id, tgt_type, tgt_id, ltype, conf in all_links:
1361
+ combo = (src_type, src_id, tgt_type, tgt_id, ltype)
1362
+ if combo in seen_combos:
1363
+ issues.append({
1364
+ "severity": "info",
1365
+ "type": "duplicate_link",
1366
+ "link_id": link_id,
1367
+ "description": (
1368
+ f"Link {link_id}: duplicate of link {seen_combos[combo]} "
1369
+ f"({src_type}:{src_id} -> {tgt_type}:{tgt_id} [{ltype}])"
1370
+ ),
1371
+ })
1372
+ else:
1373
+ seen_combos[combo] = link_id
1374
+
1375
+ conn.close()
1376
+ valid = all(issue["severity"] != "error" for issue in issues)
1377
+ return {
1378
+ "valid": valid,
1379
+ "total_links": len(all_links),
1380
+ "issues_count": len(issues),
1381
+ "issues": issues,
1382
+ }
1383
+
1384
+
1385
+ # ---------------------------------------------------------------------------
1386
+ # CLI entry point
1387
+ # ---------------------------------------------------------------------------
1388
+ def main():
1389
+ parser = argparse.ArgumentParser(
1390
+ description="ICDEV Digital Thread Engine -- end-to-end traceability"
1391
+ )
1392
+ parser.add_argument("--project-id", required=True, help="Project identifier")
1393
+ parser.add_argument("--json", action="store_true", help="Output as JSON")
1394
+ parser.add_argument("--db-path", type=Path, help="Override database path")
1395
+
1396
+ sub = parser.add_subparsers(dest="command")
1397
+
1398
+ # create-link
1399
+ link_p = sub.add_parser("create-link", help="Create a digital thread link")
1400
+ link_p.add_argument("--source-type", required=True, choices=VALID_TYPES,
1401
+ help="Source element type")
1402
+ link_p.add_argument("--source-id", required=True, help="Source element ID")
1403
+ link_p.add_argument("--target-type", required=True, choices=VALID_TYPES,
1404
+ help="Target element type")
1405
+ link_p.add_argument("--target-id", required=True, help="Target element ID")
1406
+ link_p.add_argument("--link-type", required=True, choices=VALID_LINK_TYPES,
1407
+ help="Relationship type")
1408
+ link_p.add_argument("--evidence", help="Evidence for the link")
1409
+ link_p.add_argument("--confidence", type=float, default=1.0,
1410
+ help="Confidence score 0.0-1.0 (default: 1.0)")
1411
+
1412
+ # delete-link
1413
+ del_p = sub.add_parser("delete-link", help="Delete a digital thread link by ID")
1414
+ del_p.add_argument("--link-id", required=True, type=int, help="Link ID to delete")
1415
+
1416
+ # trace-forward
1417
+ fwd_p = sub.add_parser("trace-forward", help="Forward trace from an element")
1418
+ fwd_p.add_argument("--source-type", required=True, choices=VALID_TYPES,
1419
+ help="Source element type")
1420
+ fwd_p.add_argument("--source-id", required=True, help="Source element ID")
1421
+ fwd_p.add_argument("--max-depth", type=int, default=10,
1422
+ help="Maximum traversal depth (default: 10)")
1423
+
1424
+ # trace-backward
1425
+ bwd_p = sub.add_parser("trace-backward", help="Backward trace to an element")
1426
+ bwd_p.add_argument("--target-type", required=True, choices=VALID_TYPES,
1427
+ help="Target element type")
1428
+ bwd_p.add_argument("--target-id", required=True, help="Target element ID")
1429
+ bwd_p.add_argument("--max-depth", type=int, default=10,
1430
+ help="Maximum traversal depth (default: 10)")
1431
+
1432
+ # full-thread
1433
+ full_p = sub.add_parser("full-thread", help="Bidirectional trace from an element")
1434
+ full_p.add_argument("--element-type", required=True, choices=VALID_TYPES,
1435
+ help="Element type")
1436
+ full_p.add_argument("--element-id", required=True, help="Element ID")
1437
+
1438
+ # coverage
1439
+ sub.add_parser("coverage", help="Compute digital thread coverage metrics")
1440
+
1441
+ # orphans
1442
+ sub.add_parser("orphans", help="Find elements with no links")
1443
+
1444
+ # gaps
1445
+ sub.add_parser("gaps", help="Find missing links in expected chains")
1446
+
1447
+ # auto-link
1448
+ sub.add_parser("auto-link", help="Auto-link elements by name matching")
1449
+
1450
+ # auto-link-controls
1451
+ sub.add_parser("auto-link-controls",
1452
+ help="Auto-map elements to NIST controls by keyword")
1453
+
1454
+ # report
1455
+ sub.add_parser("report", help="Generate full traceability report")
1456
+
1457
+ # validate
1458
+ sub.add_parser("validate", help="Validate thread integrity")
1459
+
1460
+ args = parser.parse_args()
1461
+ db = args.db_path or DB_PATH
1462
+
1463
+ if not args.command:
1464
+ parser.print_help()
1465
+ sys.exit(1)
1466
+
1467
+ print("CUI // SP-CTI")
1468
+ print("")
1469
+
1470
+ if args.command == "create-link":
1471
+ result = create_link(
1472
+ project_id=args.project_id,
1473
+ source_type=args.source_type,
1474
+ source_id=args.source_id,
1475
+ target_type=args.target_type,
1476
+ target_id=args.target_id,
1477
+ link_type=args.link_type,
1478
+ evidence=args.evidence,
1479
+ confidence=args.confidence,
1480
+ db_path=db,
1481
+ )
1482
+ if args.json:
1483
+ print(json.dumps(result, indent=2))
1484
+ else:
1485
+ if "error" in result:
1486
+ print(f"ERROR: {result['error']}")
1487
+ else:
1488
+ print(f"Link created: ID={result['id']}")
1489
+ print(f" {args.source_type}:{args.source_id} -> {args.target_type}:{args.target_id}")
1490
+ print(f" Type: {args.link_type} | Confidence: {args.confidence}")
1491
+
1492
+ elif args.command == "delete-link":
1493
+ deleted = delete_link(args.project_id, args.link_id, db_path=db)
1494
+ if args.json:
1495
+ print(json.dumps({"deleted": deleted}, indent=2))
1496
+ else:
1497
+ if deleted:
1498
+ print(f"Link {args.link_id} deleted.")
1499
+ else:
1500
+ print(f"Link {args.link_id} not found or could not be deleted.")
1501
+
1502
+ elif args.command == "trace-forward":
1503
+ result = get_forward_trace(
1504
+ project_id=args.project_id,
1505
+ source_type=args.source_type,
1506
+ source_id=args.source_id,
1507
+ max_depth=args.max_depth,
1508
+ db_path=db,
1509
+ )
1510
+ if args.json:
1511
+ print(json.dumps(result, indent=2))
1512
+ else:
1513
+ _print_forward_tree(result)
1514
+
1515
+ elif args.command == "trace-backward":
1516
+ result = get_backward_trace(
1517
+ project_id=args.project_id,
1518
+ target_type=args.target_type,
1519
+ target_id=args.target_id,
1520
+ max_depth=args.max_depth,
1521
+ db_path=db,
1522
+ )
1523
+ if args.json:
1524
+ print(json.dumps(result, indent=2))
1525
+ else:
1526
+ _print_backward_tree(result)
1527
+
1528
+ elif args.command == "full-thread":
1529
+ result = get_full_thread(
1530
+ project_id=args.project_id,
1531
+ element_type=args.element_type,
1532
+ element_id=args.element_id,
1533
+ db_path=db,
1534
+ )
1535
+ if args.json:
1536
+ print(json.dumps(result, indent=2))
1537
+ else:
1538
+ elem = result["element"]
1539
+ print(f"Full Thread: {elem['type']}:{elem['id']} ({elem['name']})")
1540
+ print("")
1541
+ print("--- Forward Trace ---")
1542
+ _print_links(result.get("forward", []), indent=2)
1543
+ print("")
1544
+ print("--- Backward Trace ---")
1545
+ _print_links(result.get("backward", []), indent=2, direction="backward")
1546
+
1547
+ elif args.command == "coverage":
1548
+ result = compute_coverage(args.project_id, db_path=db)
1549
+ if args.json:
1550
+ print(json.dumps(result, indent=2))
1551
+ else:
1552
+ print("Digital Thread Coverage")
1553
+ print("=" * 40)
1554
+ print(f" Requirement Coverage: {result['requirement_coverage']}%")
1555
+ print(f" Model Coverage: {result['model_coverage']}%")
1556
+ print(f" Test Coverage: {result['test_coverage']}%")
1557
+ print(f" Control Coverage: {result['control_coverage']}%")
1558
+ print(f" Overall Completeness: {result['overall_thread_completeness']}%")
1559
+
1560
+ elif args.command == "orphans":
1561
+ result = find_orphans(args.project_id, db_path=db)
1562
+ if args.json:
1563
+ print(json.dumps(result, indent=2))
1564
+ else:
1565
+ print("Orphan Analysis")
1566
+ print("=" * 40)
1567
+ for category, data in result.items():
1568
+ print(f"\n {category}: {data['count']}")
1569
+ for item in data["items"][:10]:
1570
+ label = item.get("title") or item.get("name") or item.get("control_id") or item.get("id")
1571
+ print(f" - {label}")
1572
+ if data["count"] > 10:
1573
+ print(f" ... and {data['count'] - 10} more")
1574
+
1575
+ elif args.command == "gaps":
1576
+ result = find_gaps(args.project_id, db_path=db)
1577
+ if args.json:
1578
+ print(json.dumps(result, indent=2))
1579
+ else:
1580
+ print(f"Gap Analysis: {result['total_gaps']} gaps found")
1581
+ print("=" * 40)
1582
+ for gap in result["gaps"]:
1583
+ print(f"\n [{gap['gap_type']}] {gap['description']}")
1584
+ print(f" Missing: {gap['missing_link']}")
1585
+
1586
+ elif args.command == "auto-link":
1587
+ result = auto_link_by_name(args.project_id, db_path=db)
1588
+ if args.json:
1589
+ print(json.dumps(result, indent=2))
1590
+ else:
1591
+ print(f"Auto-Link by Name: {result['links_created']} links created")
1592
+ for m in result["matches"]:
1593
+ print(f" - [{m.get('match_method', 'unknown')}] {m}")
1594
+
1595
+ elif args.command == "auto-link-controls":
1596
+ result = auto_link_to_controls(args.project_id, db_path=db)
1597
+ if args.json:
1598
+ print(json.dumps(result, indent=2))
1599
+ else:
1600
+ print(f"Auto-Link to Controls: {result['links_created']} links created")
1601
+ for m in result["mappings"]:
1602
+ print(f" - {m['element_name']} -> {m['control_id']} ({m['control_family']})")
1603
+ print(f" Keywords: {', '.join(m['matched_keywords'])}")
1604
+
1605
+ elif args.command == "report":
1606
+ report = generate_traceability_report(args.project_id, db_path=db)
1607
+ print(report)
1608
+
1609
+ elif args.command == "validate":
1610
+ result = validate_thread_integrity(args.project_id, db_path=db)
1611
+ if args.json:
1612
+ print(json.dumps(result, indent=2))
1613
+ else:
1614
+ status = "VALID" if result["valid"] else "INVALID"
1615
+ print(f"Thread Integrity: {status}")
1616
+ print(f" Total links: {result['total_links']}")
1617
+ print(f" Issues: {result['issues_count']}")
1618
+ for issue in result["issues"]:
1619
+ print(f" - [{issue['severity']}] {issue['description']}")
1620
+
1621
+ print("")
1622
+ print("CUI // SP-CTI")
1623
+
1624
+
1625
+ # ---------------------------------------------------------------------------
1626
+ # Pretty-print helpers for CLI
1627
+ # ---------------------------------------------------------------------------
1628
+ def _print_forward_tree(result: dict):
1629
+ """Print a forward trace result as an indented tree."""
1630
+ src = result.get("source", {})
1631
+ print(f"Forward Trace: {src['type']}:{src['id']} ({src.get('name', '')})")
1632
+ print("")
1633
+ _print_links(result.get("links", []), indent=2)
1634
+
1635
+
1636
+ def _print_backward_tree(result: dict):
1637
+ """Print a backward trace result as an indented tree."""
1638
+ tgt = result.get("target", {})
1639
+ print(f"Backward Trace: {tgt['type']}:{tgt['id']} ({tgt.get('name', '')})")
1640
+ print("")
1641
+ _print_links(result.get("links", []), indent=2, direction="backward")
1642
+
1643
+
1644
+ def _print_links(links: list, indent: int = 0, direction: str = "forward"):
1645
+ """Recursively print trace links."""
1646
+ prefix = " " * indent
1647
+ for link in links:
1648
+ lt = link.get("link_type", "?")
1649
+ conf = link.get("confidence", 1.0)
1650
+
1651
+ if direction == "forward":
1652
+ target = link.get("target", {})
1653
+ label = f"{target.get('type', '?')}:{target.get('id', '?')} ({target.get('name', '')})"
1654
+ print(f"{prefix}--[{lt} ({conf})]-> {label}")
1655
+ _print_links(link.get("children", []), indent + 4, direction)
1656
+ else:
1657
+ source = link.get("source", {})
1658
+ label = f"{source.get('type', '?')}:{source.get('id', '?')} ({source.get('name', '')})"
1659
+ print(f"{prefix}<-[{lt} ({conf})]-- {label}")
1660
+ _print_links(link.get("children", []), indent + 4, direction)
1661
+
1662
+
1663
+ if __name__ == "__main__":
1664
+ main()
1665
+ # [TEMPLATE: CUI // SP-CTI]