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.
- icdev/__init__.py +18 -0
- icdev/_paths.py +85 -0
- icdev/_version.py +3 -0
- icdev/data/__init__.py +1 -0
- icdev/data/args/__init__.py +1 -0
- icdev/data/args/agent_authority.yaml +61 -0
- icdev/data/args/agent_config.yaml +355 -0
- icdev/data/args/agentic_fitness.yaml +31 -0
- icdev/data/args/ai_governance_config.yaml +137 -0
- icdev/data/args/atlas_critique_config.yaml +66 -0
- icdev/data/args/bedrock_models.yaml +63 -0
- icdev/data/args/cicd_config.yaml +82 -0
- icdev/data/args/classification_config.yaml +232 -0
- icdev/data/args/cli_config.yaml +154 -0
- icdev/data/args/cloud_config.yaml +63 -0
- icdev/data/args/code_pattern_config.yaml +151 -0
- icdev/data/args/code_quality_config.yaml +47 -0
- icdev/data/args/companion_registry.yaml +202 -0
- icdev/data/args/context_config.yaml +82 -0
- icdev/data/args/csp_monitor_config.yaml +268 -0
- icdev/data/args/cui_markings.yaml +35 -0
- icdev/data/args/db_config.yaml +40 -0
- icdev/data/args/deployment_profiles.yaml +248 -0
- icdev/data/args/dev_profile_config.yaml +144 -0
- icdev/data/args/devsecops_config.yaml +286 -0
- icdev/data/args/endpoint_security_config.yaml +137 -0
- icdev/data/args/extension_config.yaml +79 -0
- icdev/data/args/file_access_tiers.yaml +88 -0
- icdev/data/args/framework_registry.yaml +415 -0
- icdev/data/args/innovation_config.yaml +431 -0
- icdev/data/args/installation_manifest.yaml +1087 -0
- icdev/data/args/llm_config.yaml +495 -0
- icdev/data/args/maintenance_config.yaml +55 -0
- icdev/data/args/memory_config.yaml +83 -0
- icdev/data/args/monitoring_config.yaml +127 -0
- icdev/data/args/mosa_config.yaml +190 -0
- icdev/data/args/nlq_config.yaml +35 -0
- icdev/data/args/observability_config.yaml +39 -0
- icdev/data/args/observability_tracing_config.yaml +170 -0
- icdev/data/args/oscal_tools_config.yaml +43 -0
- icdev/data/args/owasp_agentic_config.yaml +171 -0
- icdev/data/args/phase_registry.yaml +618 -0
- icdev/data/args/project_defaults.yaml +235 -0
- icdev/data/args/prompt_chains.yaml +163 -0
- icdev/data/args/resilience_config.yaml +50 -0
- icdev/data/args/ricoas_config.yaml +191 -0
- icdev/data/args/role_personas.yaml +362 -0
- icdev/data/args/scaling_config.yaml +176 -0
- icdev/data/args/security_gates.yaml +685 -0
- icdev/data/args/skill_injection_config.yaml +322 -0
- icdev/data/args/spec_config.yaml +53 -0
- icdev/data/args/supply_chain_config.yaml +76 -0
- icdev/data/args/translation_config.yaml +228 -0
- icdev/data/args/workflow_templates/ato_acceleration.yaml +54 -0
- icdev/data/args/workflow_templates/build_deploy.yaml +63 -0
- icdev/data/args/workflow_templates/full_compliance.yaml +43 -0
- icdev/data/args/workflow_templates/security_hardening.yaml +55 -0
- icdev/data/args/worktree_config.yaml +34 -0
- icdev/data/args/zta_config.yaml +247 -0
- icdev/data/context/__init__.py +1 -0
- icdev/data/context/agent/__init__.py +1 -0
- icdev/data/context/agent/response_schemas/__init__.py +1 -0
- icdev/data/context/agent/response_schemas/debate_position.json +46 -0
- icdev/data/context/agent/response_schemas/fitness_scorecard.json +74 -0
- icdev/data/context/agent/response_schemas/review_decision.json +39 -0
- icdev/data/context/agent/response_schemas/task_decomposition.json +82 -0
- icdev/data/context/agent/response_schemas/veto_decision.json +40 -0
- icdev/data/context/agentic/__init__.py +1 -0
- icdev/data/context/agentic/architecture_patterns.md +269 -0
- icdev/data/context/agentic/capability_registry.yaml +202 -0
- icdev/data/context/agentic/csp_mcp_registry.yaml +280 -0
- icdev/data/context/agentic/fitness_rubric.md +56 -0
- icdev/data/context/agentic/governance_baseline.md +205 -0
- icdev/data/context/ci/__init__.py +1 -0
- icdev/data/context/ci/worktree_templates.json +44 -0
- icdev/data/context/cloud/__init__.py +1 -0
- icdev/data/context/cloud/csp_service_registry.json +739 -0
- icdev/data/context/compliance/__init__.py +1 -0
- icdev/data/context/compliance/atlas_mitigations.json +293 -0
- icdev/data/context/compliance/atlas_techniques.json +833 -0
- icdev/data/context/compliance/cisa_sbd_requirements.json +432 -0
- icdev/data/context/compliance/cjis_security_policy.json +522 -0
- icdev/data/context/compliance/cmmc_practices.json +2494 -0
- icdev/data/context/compliance/cmmc_report_template.md +142 -0
- icdev/data/context/compliance/cnssi_1253_overlay.json +109 -0
- icdev/data/context/compliance/control_crosswalk.json +1914 -0
- icdev/data/context/compliance/control_families/__init__.py +1 -0
- icdev/data/context/compliance/csp_certifications.json +251 -0
- icdev/data/context/compliance/cssp_report_template.md +193 -0
- icdev/data/context/compliance/cui_templates/__init__.py +1 -0
- icdev/data/context/compliance/cui_templates/banner_block.txt +4 -0
- icdev/data/context/compliance/cui_templates/code_header.txt +8 -0
- icdev/data/context/compliance/cui_templates/document_template.md +35 -0
- icdev/data/context/compliance/data_type_framework_map.json +321 -0
- icdev/data/context/compliance/data_type_registry.json +147 -0
- icdev/data/context/compliance/dod_cssp_8530.json +463 -0
- icdev/data/context/compliance/eu_ai_act_annex_iii.json +108 -0
- icdev/data/context/compliance/export_templates/__init__.py +1 -0
- icdev/data/context/compliance/export_templates/emass_controls.csv.j2 +4 -0
- icdev/data/context/compliance/export_templates/evidence_package.md.j2 +39 -0
- icdev/data/context/compliance/export_templates/executive_summary.md.j2 +55 -0
- icdev/data/context/compliance/export_templates/poam_tracking.csv.j2 +4 -0
- icdev/data/context/compliance/fedramp_20x_ksi_schemas.json +133 -0
- icdev/data/context/compliance/fedramp_high_baseline.json +4370 -0
- icdev/data/context/compliance/fedramp_moderate_baseline.json +2183 -0
- icdev/data/context/compliance/fedramp_report_template.md +181 -0
- icdev/data/context/compliance/fips_200_areas.json +362 -0
- icdev/data/context/compliance/gao_ai_accountability.json +262 -0
- icdev/data/context/compliance/hipaa_security_rule.json +720 -0
- icdev/data/context/compliance/hitrust_csf_v11.json +930 -0
- icdev/data/context/compliance/impact_level_profiles.json +251 -0
- icdev/data/context/compliance/incident_response_template.md +1110 -0
- icdev/data/context/compliance/iso27001_2022_controls.json +750 -0
- icdev/data/context/compliance/iso27001_nist_bridge.json +382 -0
- icdev/data/context/compliance/iso42001_controls.json +254 -0
- icdev/data/context/compliance/ivv_checklist_template.md +80 -0
- icdev/data/context/compliance/ivv_report_template.md +116 -0
- icdev/data/context/compliance/ivv_requirements.json +372 -0
- icdev/data/context/compliance/mosa_crosswalk.json +327 -0
- icdev/data/context/compliance/mosa_framework.json +250 -0
- icdev/data/context/compliance/narrative_templates/AC.md.j2 +101 -0
- icdev/data/context/compliance/narrative_templates/AU.md.j2 +106 -0
- icdev/data/context/compliance/narrative_templates/IA.md.j2 +104 -0
- icdev/data/context/compliance/narrative_templates/SC.md.j2 +102 -0
- icdev/data/context/compliance/narrative_templates/SI.md.j2 +111 -0
- icdev/data/context/compliance/narrative_templates/__init__.py +1 -0
- icdev/data/context/compliance/narrative_templates/default.md.j2 +50 -0
- icdev/data/context/compliance/narrative_templates/executive_summary.j2 +27 -0
- icdev/data/context/compliance/narrative_templates/poam_milestone.j2 +19 -0
- icdev/data/context/compliance/narrative_templates/ssp_section.j2 +11 -0
- icdev/data/context/compliance/nist_800_171_controls.json +1552 -0
- icdev/data/context/compliance/nist_800_207_crosswalk.json +399 -0
- icdev/data/context/compliance/nist_800_207_zta.json +258 -0
- icdev/data/context/compliance/nist_800_53.json +324 -0
- icdev/data/context/compliance/nist_ai_600_1_genai.json +326 -0
- icdev/data/context/compliance/nist_ai_rmf.json +206 -0
- icdev/data/context/compliance/nist_sp_800_60_types.json +1667 -0
- icdev/data/context/compliance/omb_m25_21_high_impact_ai.json +248 -0
- icdev/data/context/compliance/omb_m26_04_unbiased_ai.json +262 -0
- icdev/data/context/compliance/owasp_agentic_asi.json +133 -0
- icdev/data/context/compliance/owasp_agentic_threats.json +285 -0
- icdev/data/context/compliance/owasp_llm_top10.json +274 -0
- icdev/data/context/compliance/pci_dss_v4.json +510 -0
- icdev/data/context/compliance/poam_template.md +117 -0
- icdev/data/context/compliance/safeai_controls.json +512 -0
- icdev/data/context/compliance/sbd_report_template.md +77 -0
- icdev/data/context/compliance/siem_config_templates/__init__.py +1 -0
- icdev/data/context/compliance/siem_config_templates/filebeat.yml +213 -0
- icdev/data/context/compliance/siem_config_templates/log_sources.json +208 -0
- icdev/data/context/compliance/soc2_trust_criteria.json +661 -0
- icdev/data/context/compliance/ssp_template.md +432 -0
- icdev/data/context/compliance/stig_templates/__init__.py +1 -0
- icdev/data/context/compliance/stig_templates/webapp_stig.json +139 -0
- icdev/data/context/compliance/xai_requirements.json +108 -0
- icdev/data/context/dashboard/__init__.py +1 -0
- icdev/data/context/dashboard/nlq_examples.json +50 -0
- icdev/data/context/dashboard/schema_descriptions.json +23 -0
- icdev/data/context/integration/__init__.py +1 -0
- icdev/data/context/integration/approval_workflows.json +32 -0
- icdev/data/context/integration/gitlab_field_mappings.json +33 -0
- icdev/data/context/integration/jira_field_mappings.json +32 -0
- icdev/data/context/integration/reqif_export_schema.json +23 -0
- icdev/data/context/integration/servicenow_field_mappings.json +22 -0
- icdev/data/context/languages/__init__.py +1 -0
- icdev/data/context/languages/framework_patterns.json +205 -0
- icdev/data/context/languages/language_registry.json +279 -0
- icdev/data/context/llm/__init__.py +1 -0
- icdev/data/context/llm/example_provider.py +86 -0
- icdev/data/context/mbse/__init__.py +1 -0
- icdev/data/context/mbse/des_report_template.md +162 -0
- icdev/data/context/mbse/des_requirements.json +411 -0
- icdev/data/context/mbse/digital_thread_patterns.json +403 -0
- icdev/data/context/mbse/reqif_schema.json +280 -0
- icdev/data/context/mbse/sysml_element_types.json +432 -0
- icdev/data/context/modernization/__init__.py +1 -0
- icdev/data/context/modernization/db_type_mappings.json +148 -0
- icdev/data/context/modernization/decomposition_patterns.json +284 -0
- icdev/data/context/modernization/framework_migration_patterns.json +359 -0
- icdev/data/context/modernization/migration_report_template.md +168 -0
- icdev/data/context/modernization/seven_rs_catalog.json +369 -0
- icdev/data/context/modernization/version_upgrade_rules.json +279 -0
- icdev/data/context/oscal/NIST_SP-800-53_rev5_catalog.json +254987 -0
- icdev/data/context/oscal/README.md +43 -0
- icdev/data/context/patterns/__init__.py +1 -0
- icdev/data/context/profiles/__init__.py +1 -0
- icdev/data/context/profiles/dod_baseline_v1.yaml +145 -0
- icdev/data/context/profiles/fedramp_baseline_v1.yaml +143 -0
- icdev/data/context/profiles/financial_baseline_v1.yaml +142 -0
- icdev/data/context/profiles/healthcare_baseline_v1.yaml +135 -0
- icdev/data/context/profiles/law_enforcement_v1.yaml +129 -0
- icdev/data/context/profiles/startup_v1.yaml +134 -0
- icdev/data/context/requirements/__init__.py +1 -0
- icdev/data/context/requirements/ambiguity_patterns.json +97 -0
- icdev/data/context/requirements/boundary_impact_rules.json +123 -0
- icdev/data/context/requirements/default_constitutions.json +67 -0
- icdev/data/context/requirements/document_extraction_rules.json +58 -0
- icdev/data/context/requirements/gap_patterns.json +108 -0
- icdev/data/context/requirements/readiness_rubric.json +78 -0
- icdev/data/context/requirements/red_alternative_patterns.json +210 -0
- icdev/data/context/requirements/safe_templates.json +72 -0
- icdev/data/context/requirements/spec_quality_checklist.json +122 -0
- icdev/data/context/simulation/__init__.py +1 -0
- icdev/data/context/simulation/architecture_patterns.json +36 -0
- icdev/data/context/simulation/coa_templates.json +38 -0
- icdev/data/context/simulation/cost_models.json +23 -0
- icdev/data/context/simulation/risk_categories.json +46 -0
- icdev/data/context/supply_chain/__init__.py +1 -0
- icdev/data/context/supply_chain/isa_templates.json +129 -0
- icdev/data/context/supply_chain/nist_800_161_controls.json +247 -0
- icdev/data/context/supply_chain/scrm_risk_matrix.json +147 -0
- icdev/data/context/templates/__init__.py +1 -0
- icdev/data/context/templates/ansible/__init__.py +1 -0
- icdev/data/context/templates/ansible/playbooks/__init__.py +1 -0
- icdev/data/context/templates/ansible/roles/__init__.py +1 -0
- icdev/data/context/templates/gitlab_ci/__init__.py +1 -0
- icdev/data/context/templates/grafana/__init__.py +1 -0
- icdev/data/context/templates/kubernetes/__init__.py +1 -0
- icdev/data/context/templates/project/__init__.py +1 -0
- icdev/data/context/templates/project/api/__init__.py +1 -0
- icdev/data/context/templates/project/cli/__init__.py +1 -0
- icdev/data/context/templates/project/data_pipeline/__init__.py +1 -0
- icdev/data/context/templates/project/iac/__init__.py +1 -0
- icdev/data/context/templates/project/javascript_frontend/__init__.py +1 -0
- icdev/data/context/templates/project/javascript_frontend/src/__init__.py +1 -0
- icdev/data/context/templates/project/javascript_frontend/tests/__init__.py +1 -0
- icdev/data/context/templates/project/microservice/__init__.py +1 -0
- icdev/data/context/templates/project/python_backend/__init__.py +1 -0
- icdev/data/context/templates/project/python_backend/src/__init__.py +1 -0
- icdev/data/context/templates/project/python_backend/tests/__init__.py +1 -0
- icdev/data/context/templates/project/python_backend/tests/features/__init__.py +1 -0
- icdev/data/context/templates/project/python_backend/tests/steps/__init__.py +1 -0
- icdev/data/context/templates/terraform/__init__.py +1 -0
- icdev/data/context/templates/terraform/govcloud_base/__init__.py +1 -0
- icdev/data/context/templates/terraform/modules/__init__.py +1 -0
- icdev/data/context/tone/__init__.py +1 -0
- icdev/data/context/translation/dependency_mappings.json +186 -0
- icdev/data/context/translation/type_mappings.json +149 -0
- icdev/data/docs/README.md +187 -0
- icdev/data/docs/__init__.py +1 -0
- icdev/data/docs/admin/gateway-guide.md +338 -0
- icdev/data/docs/admin/marketplace-guide.md +396 -0
- icdev/data/docs/admin/monitoring-guide.md +509 -0
- icdev/data/docs/architecture/compliance-framework.md +764 -0
- icdev/data/docs/architecture/database-schema.md +689 -0
- icdev/data/docs/architecture/gotcha-framework.md +518 -0
- icdev/data/docs/architecture/multi-agent-system.md +603 -0
- icdev/data/docs/dx/README.md +106 -0
- icdev/data/docs/dx/__init__.py +1 -0
- icdev/data/docs/dx/ci-cd-integration.md +378 -0
- icdev/data/docs/dx/claude-code-guide.md +213 -0
- icdev/data/docs/dx/companion-guide.md +232 -0
- icdev/data/docs/dx/dev-profiles.md +309 -0
- icdev/data/docs/dx/icdev-yaml-spec.md +219 -0
- icdev/data/docs/dx/integration-tiers.md +279 -0
- icdev/data/docs/dx/llm-routing-guide.md +456 -0
- icdev/data/docs/dx/quickstart.md +192 -0
- icdev/data/docs/dx/sdk-reference.md +356 -0
- icdev/data/docs/dx/unified-mcp-setup.md +525 -0
- icdev/data/docs/features/__init__.py +1 -0
- icdev/data/docs/features/phase-01-gotcha-framework.md +249 -0
- icdev/data/docs/features/phase-02-atlas-build-workflow.md +223 -0
- icdev/data/docs/features/phase-03-tdd-bdd-testing.md +261 -0
- icdev/data/docs/features/phase-04-nist-compliance.md +255 -0
- icdev/data/docs/features/phase-05-security-scanning.md +229 -0
- icdev/data/docs/features/phase-06-infrastructure-deployment.md +288 -0
- icdev/data/docs/features/phase-07-code-review-gates.md +276 -0
- icdev/data/docs/features/phase-08-self-healing.md +223 -0
- icdev/data/docs/features/phase-09-monitoring-observability.md +230 -0
- icdev/data/docs/features/phase-10-dashboard-web-ui.md +218 -0
- icdev/data/docs/features/phase-11-multi-agent-architecture.md +272 -0
- icdev/data/docs/features/phase-12-integration-testing.md +228 -0
- icdev/data/docs/features/phase-13-cicd-integration.md +257 -0
- icdev/data/docs/features/phase-14-secure-by-design-ivv.md +240 -0
- icdev/data/docs/features/phase-15-maintenance-audit.md +192 -0
- icdev/data/docs/features/phase-16-ato-acceleration.md +228 -0
- icdev/data/docs/features/phase-17-multi-framework-compliance.md +223 -0
- icdev/data/docs/features/phase-18-mbse-integration.md +242 -0
- icdev/data/docs/features/phase-19-agentic-generation.md +202 -0
- icdev/data/docs/features/phase-20-fips-security-categorization.md +198 -0
- icdev/data/docs/features/phase-21-saas-multi-tenancy.md +273 -0
- icdev/data/docs/features/phase-22-federated-gotcha-marketplace.md +242 -0
- icdev/data/docs/features/phase-23-universal-compliance-platform.md +238 -0
- icdev/data/docs/features/phase-24-devsecops-pipeline-security.md +198 -0
- icdev/data/docs/features/phase-25-zero-trust-architecture.md +220 -0
- icdev/data/docs/features/phase-26-dod-mosa.md +205 -0
- icdev/data/docs/features/phase-27-cli-capabilities.md +222 -0
- icdev/data/docs/features/phase-28-remote-command-gateway.md +235 -0
- icdev/data/docs/features/phase-29-proactive-monitoring.md +212 -0
- icdev/data/docs/features/phase-30-dashboard-auth.md +215 -0
- icdev/data/docs/features/phase-31-dashboard-ux-low-impact.md +188 -0
- icdev/data/docs/features/phase-32-dashboard-ux-medium-impact.md +223 -0
- icdev/data/docs/features/phase-33-modular-installation.md +218 -0
- icdev/data/docs/features/phase-34-dev-profiles.md +239 -0
- icdev/data/docs/features/phase-35-innovation-engine.md +257 -0
- icdev/data/docs/features/phase-36-evolutionary-intelligence.md +351 -0
- icdev/data/docs/features/phase-37-mitre-atlas-integration.md +485 -0
- icdev/data/docs/features/phase-38-cloud-agnostic-architecture.md +1033 -0
- icdev/data/docs/features/phase-39-observability-operations.md +178 -0
- icdev/data/docs/features/phase-40-nlq-compliance-queries.md +176 -0
- icdev/data/docs/features/phase-41-parallel-cicd.md +169 -0
- icdev/data/docs/features/phase-42-framework-planning.md +177 -0
- icdev/data/docs/features/phase-43-cross-language-translation.md +225 -0
- icdev/data/docs/features/phase-44-innovation-adaptation.md +227 -0
- icdev/data/docs/features/phase-45-owasp-agentic-security.md +239 -0
- icdev/data/docs/features/phase-46-observability-traceability-xai.md +240 -0
- icdev/data/docs/features/phase-47-unified-mcp-gateway.md +257 -0
- icdev/data/docs/features/phase-48-ai-transparency.md +203 -0
- icdev/data/docs/features/phase-49-ai-accountability.md +243 -0
- icdev/data/docs/features/phase-50-ai-governance-intake-chat.md +195 -0
- icdev/data/docs/features/phase-51-unified-chat-dashboard.md +240 -0
- icdev/data/docs/features/phase-52-code-intelligence.md +244 -0
- icdev/data/docs/features/phase-53-fedramp-20x-owasp-asi.md +359 -0
- icdev/data/docs/features/phase-54-slsa-swft-orchestration.md +379 -0
- icdev/data/docs/features/phase-55-a2a-v03-mcp-oauth.md +322 -0
- icdev/data/docs/features/phase-56-evidence-lineage.md +352 -0
- icdev/data/docs/features/phase-57-eu-ai-act-iron-bank.md +319 -0
- icdev/data/docs/features/phase-58-creative-engine.md +370 -0
- icdev/data/docs/features/phase-59-govcon-intelligence.md +535 -0
- icdev/data/docs/features/phase-60-cpmp.md +528 -0
- icdev/data/docs/features/phase-61-orchestration-improvements.md +534 -0
- icdev/data/docs/operations/dashboard-guide.md +354 -0
- icdev/data/docs/operations/deployment-guide.md +556 -0
- icdev/data/docs/operations/saas-admin-guide.md +439 -0
- icdev/data/docs/operations/security-operations-guide.md +733 -0
- icdev/data/docs/runbooks/backup-restore.md +412 -0
- icdev/data/docs/runbooks/troubleshooting.md +499 -0
- icdev/data/features/__init__.py +1 -0
- icdev/data/features/cicd_integration.feature +41 -0
- icdev/data/features/compliance_gates.feature +46 -0
- icdev/data/features/dashboard.feature +72 -0
- icdev/data/features/environment.py +25 -0
- icdev/data/features/project_management.feature +32 -0
- icdev/data/features/requirements_intake.feature +42 -0
- icdev/data/features/saas_platform.feature +53 -0
- icdev/data/features/security_scanning.feature +36 -0
- icdev/data/features/steps/__init__.py +1 -0
- icdev/data/features/steps/cicd_steps.py +465 -0
- icdev/data/features/steps/compliance_steps.py +308 -0
- icdev/data/features/steps/dashboard_steps.py +88 -0
- icdev/data/features/steps/project_steps.py +126 -0
- icdev/data/features/steps/requirements_intake_steps.py +689 -0
- icdev/data/features/steps/saas_platform_steps.py +572 -0
- icdev/data/features/steps/security_steps.py +236 -0
- icdev/data/features/steps/testing_steps.py +226 -0
- icdev/data/features/testing_pipeline.feature +42 -0
- icdev/data/goals/__init__.py +1 -0
- icdev/data/goals/agent_management.md +144 -0
- icdev/data/goals/agentic_generation.md +345 -0
- icdev/data/goals/agentic_threat_model.md +309 -0
- icdev/data/goals/ai_accountability.md +90 -0
- icdev/data/goals/ai_governance_intake.md +132 -0
- icdev/data/goals/ai_transparency.md +76 -0
- icdev/data/goals/atlas_integration.md +405 -0
- icdev/data/goals/ato_acceleration.md +139 -0
- icdev/data/goals/boundary_supply_chain.md +206 -0
- icdev/data/goals/build_app.md +544 -0
- icdev/data/goals/cicd_integration.md +86 -0
- icdev/data/goals/claude_dir_maintenance.md +77 -0
- icdev/data/goals/cli_capabilities.md +340 -0
- icdev/data/goals/cloud_agnostic.md +312 -0
- icdev/data/goals/code_intelligence.md +197 -0
- icdev/data/goals/code_review.md +94 -0
- icdev/data/goals/compliance_workflow.md +858 -0
- icdev/data/goals/continuous_harmonization.md +140 -0
- icdev/data/goals/cross_language_translation.md +171 -0
- icdev/data/goals/dashboard.md +142 -0
- icdev/data/goals/deploy_workflow.md +390 -0
- icdev/data/goals/devsecops_workflow.md +408 -0
- icdev/data/goals/evolutionary_intelligence.md +305 -0
- icdev/data/goals/external_integration.md +113 -0
- icdev/data/goals/framework_planning.md +63 -0
- icdev/data/goals/init_project.md +235 -0
- icdev/data/goals/innovation_engine.md +199 -0
- icdev/data/goals/integration_testing.md +189 -0
- icdev/data/goals/maintenance_audit.md +196 -0
- icdev/data/goals/manifest.md +56 -0
- icdev/data/goals/mbse_integration.md +504 -0
- icdev/data/goals/modernization_workflow.md +618 -0
- icdev/data/goals/monitoring.md +126 -0
- icdev/data/goals/mosa_workflow.md +463 -0
- icdev/data/goals/multi_agent_orchestration.md +68 -0
- icdev/data/goals/nlq_compliance.md +63 -0
- icdev/data/goals/observability.md +64 -0
- icdev/data/goals/observability_traceability_xai.md +154 -0
- icdev/data/goals/owasp_agentic_security.md +395 -0
- icdev/data/goals/parallel_cicd.md +61 -0
- icdev/data/goals/requirements_intake.md +213 -0
- icdev/data/goals/sbd_ivv_workflow.md +195 -0
- icdev/data/goals/security_categorization.md +133 -0
- icdev/data/goals/security_scan.md +381 -0
- icdev/data/goals/self_healing.md +120 -0
- icdev/data/goals/simulation_engine.md +111 -0
- icdev/data/goals/tdd_workflow.md +403 -0
- icdev/data/goals/zero_trust_architecture.md +403 -0
- icdev/data/hardprompts/__init__.py +1 -0
- icdev/data/hardprompts/agent/__init__.py +1 -0
- icdev/data/hardprompts/agent/agentic_architect.md +100 -0
- icdev/data/hardprompts/agent/debate_prompt.md +32 -0
- icdev/data/hardprompts/agent/fitness_evaluation.md +48 -0
- icdev/data/hardprompts/agent/governance_review.md +214 -0
- icdev/data/hardprompts/agent/reviewer_prompt.md +34 -0
- icdev/data/hardprompts/agent/skill_design.md +172 -0
- icdev/data/hardprompts/agent/task_decomposition.md +275 -0
- icdev/data/hardprompts/agent/veto_check_prompt.md +33 -0
- icdev/data/hardprompts/architect/__init__.py +1 -0
- icdev/data/hardprompts/architect/api_design.md +283 -0
- icdev/data/hardprompts/architect/data_model.md +277 -0
- icdev/data/hardprompts/architect/system_design.md +180 -0
- icdev/data/hardprompts/builder/__init__.py +1 -0
- icdev/data/hardprompts/builder/code_generation.md +59 -0
- icdev/data/hardprompts/builder/refactor.md +58 -0
- icdev/data/hardprompts/builder/scaffold_project.md +69 -0
- icdev/data/hardprompts/builder/test_generation.md +87 -0
- icdev/data/hardprompts/ci/__init__.py +1 -0
- icdev/data/hardprompts/ci/worktree_setup.md +35 -0
- icdev/data/hardprompts/compliance/__init__.py +1 -0
- icdev/data/hardprompts/compliance/cmmc_assessment.md +63 -0
- icdev/data/hardprompts/compliance/cssp_assessment.md +75 -0
- icdev/data/hardprompts/compliance/cui_marking.md +86 -0
- icdev/data/hardprompts/compliance/fedramp_assessment.md +55 -0
- icdev/data/hardprompts/compliance/ivv_assessment.md +96 -0
- icdev/data/hardprompts/compliance/poam_generation.md +57 -0
- icdev/data/hardprompts/compliance/sbd_assessment.md +101 -0
- icdev/data/hardprompts/compliance/security_categorization.md +74 -0
- icdev/data/hardprompts/compliance/ssp_generation.md +56 -0
- icdev/data/hardprompts/compliance/stig_evaluation.md +63 -0
- icdev/data/hardprompts/dashboard/__init__.py +1 -0
- icdev/data/hardprompts/dashboard/nlq_system_prompt.md +26 -0
- icdev/data/hardprompts/infra/__init__.py +1 -0
- icdev/data/hardprompts/infra/k8s_manifests.md +118 -0
- icdev/data/hardprompts/infra/pipeline_generation.md +160 -0
- icdev/data/hardprompts/infra/terraform_generation.md +92 -0
- icdev/data/hardprompts/integration/__init__.py +1 -0
- icdev/data/hardprompts/integration/approval_review.md +17 -0
- icdev/data/hardprompts/integration/jira_mapping.md +25 -0
- icdev/data/hardprompts/integration/servicenow_mapping.md +14 -0
- icdev/data/hardprompts/knowledge/__init__.py +1 -0
- icdev/data/hardprompts/knowledge/pattern_detection.md +73 -0
- icdev/data/hardprompts/knowledge/recommendation_engine.md +90 -0
- icdev/data/hardprompts/knowledge/root_cause_analysis.md +91 -0
- icdev/data/hardprompts/maintenance/__init__.py +1 -0
- icdev/data/hardprompts/maintenance/maintenance_assessment.md +82 -0
- icdev/data/hardprompts/mbse/__init__.py +1 -0
- icdev/data/hardprompts/mbse/digital_thread.md +67 -0
- icdev/data/hardprompts/mbse/model_import.md +62 -0
- icdev/data/hardprompts/mbse/model_to_code.md +65 -0
- icdev/data/hardprompts/modernization/__init__.py +1 -0
- icdev/data/hardprompts/modernization/legacy_analysis.md +93 -0
- icdev/data/hardprompts/modernization/migration_planning.md +150 -0
- icdev/data/hardprompts/modernization/seven_r_assessment.md +107 -0
- icdev/data/hardprompts/requirements/__init__.py +1 -0
- icdev/data/hardprompts/requirements/bdd_generation.md +35 -0
- icdev/data/hardprompts/requirements/clarification_prioritization.md +29 -0
- icdev/data/hardprompts/requirements/decomposition.md +60 -0
- icdev/data/hardprompts/requirements/document_extraction.md +45 -0
- icdev/data/hardprompts/requirements/gap_detection.md +70 -0
- icdev/data/hardprompts/requirements/intake_conversation.md +101 -0
- icdev/data/hardprompts/requirements/readiness_assessment.md +39 -0
- icdev/data/hardprompts/requirements/spec_quality.md +33 -0
- icdev/data/hardprompts/requirements/traceability_analysis.md +23 -0
- icdev/data/hardprompts/security/__init__.py +1 -0
- icdev/data/hardprompts/security/endpoint_security.md +78 -0
- icdev/data/hardprompts/security/threat_model.md +70 -0
- icdev/data/hardprompts/security/vulnerability_assessment.md +81 -0
- icdev/data/hardprompts/simulation/__init__.py +1 -0
- icdev/data/hardprompts/simulation/architecture_impact.md +27 -0
- icdev/data/hardprompts/simulation/coa_alternative.md +27 -0
- icdev/data/hardprompts/simulation/coa_generation.md +25 -0
- icdev/data/hardprompts/simulation/compliance_impact.md +28 -0
- icdev/data/hardprompts/simulation/cost_estimation.md +33 -0
- icdev/data/hardprompts/simulation/risk_assessment.md +28 -0
- icdev/data/hardprompts/translation/code_translation.md +68 -0
- icdev/data/hardprompts/translation/dependency_suggestion.md +44 -0
- icdev/data/hardprompts/translation/test_translation.md +64 -0
- icdev/data/hardprompts/translation/translation_repair.md +59 -0
- icdev/py.typed +0 -0
- icdev/tools/__init__.py +1 -0
- icdev/tools/_gen_formatter.py +12 -0
- icdev/tools/a2a/__init__.py +1 -0
- icdev/tools/a2a/agent_cards/architect.json +43 -0
- icdev/tools/a2a/agent_cards/builder.json +50 -0
- icdev/tools/a2a/agent_cards/compliance.json +57 -0
- icdev/tools/a2a/agent_cards/devsecops.json +71 -0
- icdev/tools/a2a/agent_cards/infra.json +57 -0
- icdev/tools/a2a/agent_cards/integration.json +57 -0
- icdev/tools/a2a/agent_cards/knowledge.json +43 -0
- icdev/tools/a2a/agent_cards/mbse.json +57 -0
- icdev/tools/a2a/agent_cards/modernization.json +50 -0
- icdev/tools/a2a/agent_cards/monitor.json +43 -0
- icdev/tools/a2a/agent_cards/orchestrator.json +36 -0
- icdev/tools/a2a/agent_cards/requirements_analyst.json +64 -0
- icdev/tools/a2a/agent_cards/security.json +50 -0
- icdev/tools/a2a/agent_cards/simulation.json +57 -0
- icdev/tools/a2a/agent_cards/supply_chain.json +50 -0
- icdev/tools/a2a/agent_client.py +349 -0
- icdev/tools/a2a/agent_registry.py +412 -0
- icdev/tools/a2a/agent_server.py +579 -0
- icdev/tools/a2a/task.py +200 -0
- icdev/tools/agent/__init__.py +2 -0
- icdev/tools/agent/a2a_agent_card_generator.py +285 -0
- icdev/tools/agent/a2a_discovery_server.py +250 -0
- icdev/tools/agent/agent_executor.py +529 -0
- icdev/tools/agent/agent_memory.py +557 -0
- icdev/tools/agent/agent_models.py +51 -0
- icdev/tools/agent/atlas_critique.py +908 -0
- icdev/tools/agent/authority.py +443 -0
- icdev/tools/agent/bedrock_client.py +1075 -0
- icdev/tools/agent/collaboration.py +871 -0
- icdev/tools/agent/dispatcher_mode.py +665 -0
- icdev/tools/agent/mailbox.py +575 -0
- icdev/tools/agent/prompt_chain_executor.py +1064 -0
- icdev/tools/agent/session_purpose.py +350 -0
- icdev/tools/agent/skill_router.py +638 -0
- icdev/tools/agent/skill_selector.py +486 -0
- icdev/tools/agent/team_orchestrator.py +1108 -0
- icdev/tools/agent/token_tracker.py +290 -0
- icdev/tools/analysis/__init__.py +1 -0
- icdev/tools/analysis/code_analyzer.py +780 -0
- icdev/tools/analysis/runtime_feedback.py +389 -0
- icdev/tools/audit/__init__.py +1 -0
- icdev/tools/audit/audit_logger.py +196 -0
- icdev/tools/audit/audit_query.py +157 -0
- icdev/tools/audit/decision_recorder.py +72 -0
- icdev/tools/builder/__init__.py +1 -0
- icdev/tools/builder/agentic_fitness.py +534 -0
- icdev/tools/builder/agentic_test_templates/test_a2a_callback.py +117 -0
- icdev/tools/builder/agentic_test_templates/test_a2a_lifecycle.feature +52 -0
- icdev/tools/builder/agentic_test_templates/test_agent_card.feature +37 -0
- icdev/tools/builder/agentic_test_templates/test_agent_health.py +128 -0
- icdev/tools/builder/agentic_test_templates/test_memory_system.feature +50 -0
- icdev/tools/builder/agentic_test_templates/test_skill_execution.feature +40 -0
- icdev/tools/builder/app_blueprint.py +1583 -0
- icdev/tools/builder/child_app_generator.py +2852 -0
- icdev/tools/builder/claude_md_generator.py +1734 -0
- icdev/tools/builder/code_generator.py +3703 -0
- icdev/tools/builder/db_init_generator.py +1709 -0
- icdev/tools/builder/dev_profile_manager.py +954 -0
- icdev/tools/builder/formatter.py +768 -0
- icdev/tools/builder/goal_adapter.py +592 -0
- icdev/tools/builder/gotcha_validator.py +812 -0
- icdev/tools/builder/language_support.py +441 -0
- icdev/tools/builder/linter.py +976 -0
- icdev/tools/builder/profile_detector.py +657 -0
- icdev/tools/builder/profile_md_generator.py +723 -0
- icdev/tools/builder/scaffolder.py +1590 -0
- icdev/tools/builder/scaffolder_extended.py +1771 -0
- icdev/tools/builder/test_writer.py +950 -0
- icdev/tools/ci/__init__.py +2 -0
- icdev/tools/ci/connectors/__init__.py +2 -0
- icdev/tools/ci/connectors/base_connector.py +80 -0
- icdev/tools/ci/connectors/connector_registry.py +188 -0
- icdev/tools/ci/connectors/mattermost_connector.py +159 -0
- icdev/tools/ci/connectors/slack_connector.py +197 -0
- icdev/tools/ci/core/__init__.py +2 -0
- icdev/tools/ci/core/air_gap_detector.py +115 -0
- icdev/tools/ci/core/comment_handler.py +192 -0
- icdev/tools/ci/core/conversation_manager.py +479 -0
- icdev/tools/ci/core/event_envelope.py +500 -0
- icdev/tools/ci/core/event_router.py +443 -0
- icdev/tools/ci/core/failure_parser.py +397 -0
- icdev/tools/ci/core/recovery_engine.py +527 -0
- icdev/tools/ci/modules/__init__.py +2 -0
- icdev/tools/ci/modules/agent.py +271 -0
- icdev/tools/ci/modules/git_ops.py +175 -0
- icdev/tools/ci/modules/state.py +117 -0
- icdev/tools/ci/modules/vcs.py +303 -0
- icdev/tools/ci/modules/workflow_ops.py +295 -0
- icdev/tools/ci/modules/worktree.py +340 -0
- icdev/tools/ci/pipeline_config_generator.py +558 -0
- icdev/tools/ci/triggers/__init__.py +2 -0
- icdev/tools/ci/triggers/gitlab_task_monitor.py +330 -0
- icdev/tools/ci/triggers/poll_trigger.py +237 -0
- icdev/tools/ci/triggers/webhook_server.py +356 -0
- icdev/tools/ci/workflows/__init__.py +2 -0
- icdev/tools/ci/workflows/icdev_build.py +140 -0
- icdev/tools/ci/workflows/icdev_comply.py +284 -0
- icdev/tools/ci/workflows/icdev_document.py +152 -0
- icdev/tools/ci/workflows/icdev_e2e.py +188 -0
- icdev/tools/ci/workflows/icdev_patch.py +186 -0
- icdev/tools/ci/workflows/icdev_plan.py +202 -0
- icdev/tools/ci/workflows/icdev_plan_build.py +41 -0
- icdev/tools/ci/workflows/icdev_plan_build_test.py +46 -0
- icdev/tools/ci/workflows/icdev_plan_build_test_review.py +47 -0
- icdev/tools/ci/workflows/icdev_review.py +126 -0
- icdev/tools/ci/workflows/icdev_sdlc.py +261 -0
- icdev/tools/ci/workflows/icdev_test.py +240 -0
- icdev/tools/cli/__init__.py +1 -0
- icdev/tools/cli/output_formatter.py +756 -0
- icdev/tools/cli_formatter.py +42 -0
- icdev/tools/cloud/__init__.py +11 -0
- icdev/tools/cloud/cloud_mode_manager.py +364 -0
- icdev/tools/cloud/csp_changelog.py +383 -0
- icdev/tools/cloud/csp_health_checker.py +268 -0
- icdev/tools/cloud/csp_monitor.py +951 -0
- icdev/tools/cloud/iam_provider.py +593 -0
- icdev/tools/cloud/kms_provider.py +346 -0
- icdev/tools/cloud/monitoring_provider.py +628 -0
- icdev/tools/cloud/provider_factory.py +376 -0
- icdev/tools/cloud/region_validator.py +345 -0
- icdev/tools/cloud/registry_provider.py +563 -0
- icdev/tools/cloud/secrets_provider.py +486 -0
- icdev/tools/cloud/storage_provider.py +446 -0
- icdev/tools/compat/__init__.py +21 -0
- icdev/tools/compat/cli_harmonizer.py +251 -0
- icdev/tools/compat/datetime_utils.py +18 -0
- icdev/tools/compat/db_utils.py +160 -0
- icdev/tools/compat/platform_utils.py +123 -0
- icdev/tools/compliance/__init__.py +1 -0
- icdev/tools/compliance/accountability_manager.py +397 -0
- icdev/tools/compliance/ai_accountability_audit.py +294 -0
- icdev/tools/compliance/ai_impact_assessor.py +273 -0
- icdev/tools/compliance/ai_incident_response.py +301 -0
- icdev/tools/compliance/ai_inventory_manager.py +239 -0
- icdev/tools/compliance/ai_reassessment_scheduler.py +256 -0
- icdev/tools/compliance/ai_transparency_audit.py +248 -0
- icdev/tools/compliance/atlas_assessor.py +278 -0
- icdev/tools/compliance/atlas_report_generator.py +1211 -0
- icdev/tools/compliance/base_assessor.py +597 -0
- icdev/tools/compliance/cato_monitor.py +1385 -0
- icdev/tools/compliance/cato_scheduler.py +699 -0
- icdev/tools/compliance/cjis_assessor.py +76 -0
- icdev/tools/compliance/classification_manager.py +1353 -0
- icdev/tools/compliance/cmmc_assessor.py +1491 -0
- icdev/tools/compliance/cmmc_report_generator.py +1100 -0
- icdev/tools/compliance/compliance_detector.py +463 -0
- icdev/tools/compliance/compliance_exporter.py +427 -0
- icdev/tools/compliance/compliance_status.py +825 -0
- icdev/tools/compliance/control_mapper.py +505 -0
- icdev/tools/compliance/crosswalk_engine.py +1203 -0
- icdev/tools/compliance/cssp_assessor.py +1045 -0
- icdev/tools/compliance/cssp_evidence_collector.py +729 -0
- icdev/tools/compliance/cssp_report_generator.py +1116 -0
- icdev/tools/compliance/cui_marker.py +388 -0
- icdev/tools/compliance/diagram_validator.py +600 -0
- icdev/tools/compliance/emass/__init__.py +2 -0
- icdev/tools/compliance/emass/emass_client.py +840 -0
- icdev/tools/compliance/emass/emass_export.py +777 -0
- icdev/tools/compliance/emass/emass_sync.py +826 -0
- icdev/tools/compliance/eu_ai_act_classifier.py +194 -0
- icdev/tools/compliance/evidence_collector.py +468 -0
- icdev/tools/compliance/fairness_assessor.py +316 -0
- icdev/tools/compliance/fedramp_assessor.py +1808 -0
- icdev/tools/compliance/fedramp_authorization_packager.py +137 -0
- icdev/tools/compliance/fedramp_ksi_generator.py +355 -0
- icdev/tools/compliance/fedramp_report_generator.py +1128 -0
- icdev/tools/compliance/fips199_categorizer.py +881 -0
- icdev/tools/compliance/fips200_validator.py +315 -0
- icdev/tools/compliance/gao_ai_assessor.py +231 -0
- icdev/tools/compliance/gao_evidence_builder.py +308 -0
- icdev/tools/compliance/hipaa_assessor.py +78 -0
- icdev/tools/compliance/hitrust_assessor.py +49 -0
- icdev/tools/compliance/incident_response_plan.py +718 -0
- icdev/tools/compliance/iso27001_assessor.py +92 -0
- icdev/tools/compliance/iso42001_assessor.py +114 -0
- icdev/tools/compliance/ivv_assessor.py +2327 -0
- icdev/tools/compliance/ivv_report_generator.py +1662 -0
- icdev/tools/compliance/model_card_generator.py +297 -0
- icdev/tools/compliance/mosa_assessor.py +117 -0
- icdev/tools/compliance/multi_regime_assessor.py +451 -0
- icdev/tools/compliance/narrative_generator.py +1013 -0
- icdev/tools/compliance/nist_800_207_assessor.py +191 -0
- icdev/tools/compliance/nist_ai_600_1_assessor.py +188 -0
- icdev/tools/compliance/nist_ai_rmf_assessor.py +110 -0
- icdev/tools/compliance/nist_lookup.py +245 -0
- icdev/tools/compliance/omb_m25_21_assessor.py +228 -0
- icdev/tools/compliance/omb_m26_04_assessor.py +188 -0
- icdev/tools/compliance/oscal_catalog_adapter.py +395 -0
- icdev/tools/compliance/oscal_generator.py +2170 -0
- icdev/tools/compliance/oscal_tools.py +1182 -0
- icdev/tools/compliance/owasp_agentic_assessor.py +226 -0
- icdev/tools/compliance/owasp_asi_assessor.py +200 -0
- icdev/tools/compliance/owasp_llm_assessor.py +244 -0
- icdev/tools/compliance/pci_dss_assessor.py +80 -0
- icdev/tools/compliance/pi_compliance_tracker.py +1461 -0
- icdev/tools/compliance/poam_generator.py +405 -0
- icdev/tools/compliance/resolve_marking.py +283 -0
- icdev/tools/compliance/sbd_assessor.py +2068 -0
- icdev/tools/compliance/sbd_report_generator.py +1236 -0
- icdev/tools/compliance/sbom_generator.py +1008 -0
- icdev/tools/compliance/siem_config_generator.py +674 -0
- icdev/tools/compliance/slsa_attestation_generator.py +490 -0
- icdev/tools/compliance/soc2_assessor.py +77 -0
- icdev/tools/compliance/ssp_generator.py +573 -0
- icdev/tools/compliance/stig_checker.py +727 -0
- icdev/tools/compliance/swft_evidence_bundler.py +337 -0
- icdev/tools/compliance/system_card_generator.py +309 -0
- icdev/tools/compliance/traceability_matrix.py +1281 -0
- icdev/tools/compliance/universal_classification_manager.py +1172 -0
- icdev/tools/compliance/xacta/__init__.py +2 -0
- icdev/tools/compliance/xacta/xacta_client.py +449 -0
- icdev/tools/compliance/xacta/xacta_export.py +557 -0
- icdev/tools/compliance/xacta/xacta_sync.py +333 -0
- icdev/tools/compliance/xai_assessor.py +231 -0
- icdev/tools/dashboard/__init__.py +1 -0
- icdev/tools/dashboard/api/__init__.py +1 -0
- icdev/tools/dashboard/api/_pipeline_state.py +17 -0
- icdev/tools/dashboard/api/activity.py +206 -0
- icdev/tools/dashboard/api/admin.py +176 -0
- icdev/tools/dashboard/api/agents.py +53 -0
- icdev/tools/dashboard/api/ai_accountability.py +163 -0
- icdev/tools/dashboard/api/ai_transparency.py +198 -0
- icdev/tools/dashboard/api/audit.py +58 -0
- icdev/tools/dashboard/api/batch.py +666 -0
- icdev/tools/dashboard/api/chat.py +241 -0
- icdev/tools/dashboard/api/cicd.py +219 -0
- icdev/tools/dashboard/api/code_quality.py +223 -0
- icdev/tools/dashboard/api/compliance.py +171 -0
- icdev/tools/dashboard/api/cpmp.py +915 -0
- icdev/tools/dashboard/api/diagrams.py +65 -0
- icdev/tools/dashboard/api/events.py +250 -0
- icdev/tools/dashboard/api/evidence.py +99 -0
- icdev/tools/dashboard/api/fedramp_20x.py +77 -0
- icdev/tools/dashboard/api/govcon.py +1095 -0
- icdev/tools/dashboard/api/intake.py +1171 -0
- icdev/tools/dashboard/api/lineage.py +163 -0
- icdev/tools/dashboard/api/metrics.py +155 -0
- icdev/tools/dashboard/api/nlq.py +72 -0
- icdev/tools/dashboard/api/orchestration.py +472 -0
- icdev/tools/dashboard/api/oscal.py +183 -0
- icdev/tools/dashboard/api/prod_audit.py +183 -0
- icdev/tools/dashboard/api/projects.py +191 -0
- icdev/tools/dashboard/api/proposals.py +1084 -0
- icdev/tools/dashboard/api/traces.py +363 -0
- icdev/tools/dashboard/api/usage.py +234 -0
- icdev/tools/dashboard/app.py +1986 -0
- icdev/tools/dashboard/auth.py +500 -0
- icdev/tools/dashboard/byok.py +245 -0
- icdev/tools/dashboard/chat_manager.py +675 -0
- icdev/tools/dashboard/config.py +116 -0
- icdev/tools/dashboard/diagram_definitions.py +642 -0
- icdev/tools/dashboard/nlq_processor.py +323 -0
- icdev/tools/dashboard/phase_loader.py +136 -0
- icdev/tools/dashboard/sse_manager.py +89 -0
- icdev/tools/dashboard/state_tracker.py +267 -0
- icdev/tools/dashboard/static/css/style.css +706 -0
- icdev/tools/dashboard/static/css/ux.css +2047 -0
- icdev/tools/dashboard/static/js/activity.js +322 -0
- icdev/tools/dashboard/static/js/api.js +161 -0
- icdev/tools/dashboard/static/js/batch.js +814 -0
- icdev/tools/dashboard/static/js/charts.js +618 -0
- icdev/tools/dashboard/static/js/chat.js +1514 -0
- icdev/tools/dashboard/static/js/kanban.js +113 -0
- icdev/tools/dashboard/static/js/live.js +569 -0
- icdev/tools/dashboard/static/js/mermaid-icdev.js +332 -0
- icdev/tools/dashboard/static/js/proposals.js +588 -0
- icdev/tools/dashboard/static/js/shortcuts.js +544 -0
- icdev/tools/dashboard/static/js/tables.js +652 -0
- icdev/tools/dashboard/static/js/tour.js +524 -0
- icdev/tools/dashboard/static/js/ux.js +942 -0
- icdev/tools/dashboard/templates/404.html +10 -0
- icdev/tools/dashboard/templates/activity.html +80 -0
- icdev/tools/dashboard/templates/admin/users.html +144 -0
- icdev/tools/dashboard/templates/ai_accountability.html +235 -0
- icdev/tools/dashboard/templates/ai_transparency.html +263 -0
- icdev/tools/dashboard/templates/base.html +104 -0
- icdev/tools/dashboard/templates/batch.html +23 -0
- icdev/tools/dashboard/templates/chat.html +332 -0
- icdev/tools/dashboard/templates/children.html +149 -0
- icdev/tools/dashboard/templates/cicd.html +253 -0
- icdev/tools/dashboard/templates/code_quality.html +214 -0
- icdev/tools/dashboard/templates/cpmp/cor_detail.html +220 -0
- icdev/tools/dashboard/templates/cpmp/cor_portal.html +91 -0
- icdev/tools/dashboard/templates/cpmp/deliverable_detail.html +197 -0
- icdev/tools/dashboard/templates/cpmp/detail.html +578 -0
- icdev/tools/dashboard/templates/cpmp/portfolio.html +202 -0
- icdev/tools/dashboard/templates/dev_profiles.html +304 -0
- icdev/tools/dashboard/templates/diagrams.html +224 -0
- icdev/tools/dashboard/templates/events/timeline.html +232 -0
- icdev/tools/dashboard/templates/evidence.html +134 -0
- icdev/tools/dashboard/templates/fedramp_20x.html +207 -0
- icdev/tools/dashboard/templates/gateway.html +244 -0
- icdev/tools/dashboard/templates/govcon/capabilities.html +135 -0
- icdev/tools/dashboard/templates/govcon/pipeline.html +214 -0
- icdev/tools/dashboard/templates/govcon/requirements.html +120 -0
- icdev/tools/dashboard/templates/index.html +254 -0
- icdev/tools/dashboard/templates/lineage.html +141 -0
- icdev/tools/dashboard/templates/login.html +51 -0
- icdev/tools/dashboard/templates/monitoring/overview.html +193 -0
- icdev/tools/dashboard/templates/orchestration/dashboard.html +545 -0
- icdev/tools/dashboard/templates/oscal.html +263 -0
- icdev/tools/dashboard/templates/phases.html +150 -0
- icdev/tools/dashboard/templates/prod_audit.html +280 -0
- icdev/tools/dashboard/templates/profile.html +183 -0
- icdev/tools/dashboard/templates/projects/detail.html +583 -0
- icdev/tools/dashboard/templates/projects/list.html +47 -0
- icdev/tools/dashboard/templates/proposals/detail.html +1253 -0
- icdev/tools/dashboard/templates/proposals/list.html +179 -0
- icdev/tools/dashboard/templates/proposals/section_detail.html +193 -0
- icdev/tools/dashboard/templates/provenance.html +181 -0
- icdev/tools/dashboard/templates/query/nlq.html +234 -0
- icdev/tools/dashboard/templates/quick_paths.html +69 -0
- icdev/tools/dashboard/templates/traces.html +155 -0
- icdev/tools/dashboard/templates/translation_detail.html +199 -0
- icdev/tools/dashboard/templates/translations.html +162 -0
- icdev/tools/dashboard/templates/usage.html +225 -0
- icdev/tools/dashboard/templates/wizard.html +539 -0
- icdev/tools/dashboard/templates/xai.html +208 -0
- icdev/tools/dashboard/ux_helpers.py +962 -0
- icdev/tools/dashboard/websocket.py +81 -0
- icdev/tools/db/__init__.py +1 -0
- icdev/tools/db/backup.py +312 -0
- icdev/tools/db/backup_manager.py +832 -0
- icdev/tools/db/init_icdev_db.py +5900 -0
- icdev/tools/db/migrate.py +178 -0
- icdev/tools/db/migration_runner.py +549 -0
- icdev/tools/db/migrations/001_baseline/meta.json +9 -0
- icdev/tools/db/migrations/001_baseline/up.py +68 -0
- icdev/tools/db/migrations/002_memory_enhancements/down.sql +8 -0
- icdev/tools/db/migrations/002_memory_enhancements/meta.json +9 -0
- icdev/tools/db/migrations/002_memory_enhancements/up.py +118 -0
- icdev/tools/db/migrations/003_dev_profiles/meta.json +8 -0
- icdev/tools/db/migrations/003_dev_profiles/up.py +93 -0
- icdev/tools/db/migrations/004_innovation_engine/down.py +19 -0
- icdev/tools/db/migrations/004_innovation_engine/up.py +227 -0
- icdev/tools/db/migrations/005_phase_37_ai_security/down.py +19 -0
- icdev/tools/db/migrations/005_phase_37_ai_security/up.py +258 -0
- icdev/tools/db/migrations/006_phase_36_evolution/down.py +21 -0
- icdev/tools/db/migrations/006_phase_36_evolution/up.py +323 -0
- icdev/tools/db/migrations/007_phase_38_cloud/down.py +14 -0
- icdev/tools/db/migrations/007_phase_38_cloud/up.py +110 -0
- icdev/tools/db/migrations/008_phase36_37_integration/up.py +55 -0
- icdev/tools/db/migrations/__init__.py +2 -0
- icdev/tools/devsecops/__init__.py +2 -0
- icdev/tools/devsecops/attestation_manager.py +458 -0
- icdev/tools/devsecops/network_segmentation_generator.py +614 -0
- icdev/tools/devsecops/pdp_config_generator.py +1256 -0
- icdev/tools/devsecops/pipeline_security_generator.py +484 -0
- icdev/tools/devsecops/policy_generator.py +653 -0
- icdev/tools/devsecops/profile_manager.py +388 -0
- icdev/tools/devsecops/service_mesh_generator.py +1073 -0
- icdev/tools/devsecops/zta_maturity_scorer.py +368 -0
- icdev/tools/devsecops/zta_terraform_generator.py +1303 -0
- icdev/tools/dx/__init__.py +3 -0
- icdev/tools/dx/companion.py +266 -0
- icdev/tools/dx/instruction_generator.py +753 -0
- icdev/tools/dx/mcp_config_generator.py +282 -0
- icdev/tools/dx/skill_translator.py +425 -0
- icdev/tools/dx/tool_detector.py +144 -0
- icdev/tools/extensions/__init__.py +21 -0
- icdev/tools/extensions/builtins/010_ai_governance_chat.py +277 -0
- icdev/tools/extensions/builtins/__init__.py +2 -0
- icdev/tools/extensions/extension_manager.py +455 -0
- icdev/tools/infra/__init__.py +1 -0
- icdev/tools/infra/ansible_generator.py +869 -0
- icdev/tools/infra/dockerfile_generator.py +361 -0
- icdev/tools/infra/infra_status.py +393 -0
- icdev/tools/infra/ironbank_metadata_generator.py +411 -0
- icdev/tools/infra/k8s_generator.py +1002 -0
- icdev/tools/infra/pipeline_generator.py +832 -0
- icdev/tools/infra/rollback.py +400 -0
- icdev/tools/infra/terraform_generator.py +1142 -0
- icdev/tools/infra/terraform_generator_azure.py +1254 -0
- icdev/tools/infra/terraform_generator_gcp.py +953 -0
- icdev/tools/infra/terraform_generator_ibm.py +360 -0
- icdev/tools/infra/terraform_generator_oci.py +919 -0
- icdev/tools/infra/terraform_generator_onprem.py +319 -0
- icdev/tools/innovation/__init__.py +8 -0
- icdev/tools/innovation/competitive_intel.py +492 -0
- icdev/tools/innovation/innovation_manager.py +681 -0
- icdev/tools/innovation/introspective_analyzer.py +774 -0
- icdev/tools/innovation/register_external_patterns.py +440 -0
- icdev/tools/innovation/signal_ranker.py +1038 -0
- icdev/tools/innovation/solution_generator.py +697 -0
- icdev/tools/innovation/standards_monitor.py +466 -0
- icdev/tools/innovation/trend_detector.py +1046 -0
- icdev/tools/innovation/triage_engine.py +1149 -0
- icdev/tools/innovation/web_scanner.py +894 -0
- icdev/tools/installer/__init__.py +1 -0
- icdev/tools/installer/compliance_configurator.py +637 -0
- icdev/tools/installer/installer.py +1711 -0
- icdev/tools/installer/module_registry.py +805 -0
- icdev/tools/installer/platform_setup.py +961 -0
- icdev/tools/integration/__init__.py +2 -0
- icdev/tools/integration/approval_manager.py +561 -0
- icdev/tools/integration/doors_exporter.py +627 -0
- icdev/tools/integration/gitlab_connector.py +784 -0
- icdev/tools/integration/jira_connector.py +774 -0
- icdev/tools/integration/servicenow_connector.py +693 -0
- icdev/tools/knowledge/__init__.py +1 -0
- icdev/tools/knowledge/knowledge_ingest.py +293 -0
- icdev/tools/knowledge/pattern_detector.py +693 -0
- icdev/tools/knowledge/recommendation_engine.py +461 -0
- icdev/tools/knowledge/self_heal_analyzer.py +504 -0
- icdev/tools/llm/__init__.py +72 -0
- icdev/tools/llm/anthropic_provider.py +170 -0
- icdev/tools/llm/azure_openai_provider.py +338 -0
- icdev/tools/llm/bedrock_provider.py +315 -0
- icdev/tools/llm/embedding_provider.py +438 -0
- icdev/tools/llm/gemini_provider.py +381 -0
- icdev/tools/llm/ibm_watsonx_provider.py +232 -0
- icdev/tools/llm/oci_genai_provider.py +462 -0
- icdev/tools/llm/ollama_provider.py +340 -0
- icdev/tools/llm/openai_provider.py +225 -0
- icdev/tools/llm/provider.py +355 -0
- icdev/tools/llm/provider_sdk.py +175 -0
- icdev/tools/llm/router.py +780 -0
- icdev/tools/llm/vertex_ai_provider.py +374 -0
- icdev/tools/maintenance/__init__.py +2 -0
- icdev/tools/maintenance/dependency_scanner.py +1030 -0
- icdev/tools/maintenance/maintenance_auditor.py +815 -0
- icdev/tools/maintenance/remediation_engine.py +966 -0
- icdev/tools/maintenance/vulnerability_checker.py +987 -0
- icdev/tools/mbse/__init__.py +3 -0
- icdev/tools/mbse/des_assessor.py +1186 -0
- icdev/tools/mbse/des_report_generator.py +800 -0
- icdev/tools/mbse/diagram_extractor.py +811 -0
- icdev/tools/mbse/digital_thread.py +1665 -0
- icdev/tools/mbse/model_code_generator.py +1122 -0
- icdev/tools/mbse/model_control_mapper.py +420 -0
- icdev/tools/mbse/pi_model_tracker.py +1093 -0
- icdev/tools/mbse/reqif_parser.py +1483 -0
- icdev/tools/mbse/sync_engine.py +1805 -0
- icdev/tools/mbse/xmi_parser.py +1573 -0
- icdev/tools/mcp/__init__.py +1 -0
- icdev/tools/mcp/base_server.py +535 -0
- icdev/tools/mcp/builder_server.py +725 -0
- icdev/tools/mcp/compliance_server.py +1407 -0
- icdev/tools/mcp/context_indexer.py +199 -0
- icdev/tools/mcp/context_server.py +305 -0
- icdev/tools/mcp/core_server.py +679 -0
- icdev/tools/mcp/devsecops_server.py +432 -0
- icdev/tools/mcp/gap_handlers.py +1079 -0
- icdev/tools/mcp/gateway_server.py +339 -0
- icdev/tools/mcp/generate_registry.py +623 -0
- icdev/tools/mcp/infra_server.py +264 -0
- icdev/tools/mcp/innovation_server.py +316 -0
- icdev/tools/mcp/integration_server.py +527 -0
- icdev/tools/mcp/knowledge_server.py +429 -0
- icdev/tools/mcp/maintenance_server.py +248 -0
- icdev/tools/mcp/marketplace_server.py +499 -0
- icdev/tools/mcp/mbse_server.py +398 -0
- icdev/tools/mcp/modernization_server.py +496 -0
- icdev/tools/mcp/observability_server.py +354 -0
- icdev/tools/mcp/requirements_server.py +415 -0
- icdev/tools/mcp/simulation_server.py +468 -0
- icdev/tools/mcp/standalone/__init__.py +2 -0
- icdev/tools/mcp/standalone/builder.py +59 -0
- icdev/tools/mcp/standalone/compliance.py +59 -0
- icdev/tools/mcp/standalone/core.py +59 -0
- icdev/tools/mcp/standalone/knowledge.py +59 -0
- icdev/tools/mcp/standalone/maintenance.py +59 -0
- icdev/tools/mcp/supply_chain_server.py +476 -0
- icdev/tools/mcp/tool_registry.py +2008 -0
- icdev/tools/mcp/unified_server.py +158 -0
- icdev/tools/memory/__init__.py +2 -0
- icdev/tools/memory/auto_capture.py +347 -0
- icdev/tools/memory/embed_memory.py +158 -0
- icdev/tools/memory/history_compressor.py +334 -0
- icdev/tools/memory/hybrid_search.py +236 -0
- icdev/tools/memory/maintenance_cron.py +289 -0
- icdev/tools/memory/memory_consolidation.py +444 -0
- icdev/tools/memory/memory_db.py +133 -0
- icdev/tools/memory/memory_read.py +102 -0
- icdev/tools/memory/memory_write.py +222 -0
- icdev/tools/memory/semantic_search.py +139 -0
- icdev/tools/memory/time_decay.py +435 -0
- icdev/tools/modernization/__init__.py +3 -0
- icdev/tools/modernization/architecture_extractor.py +734 -0
- icdev/tools/modernization/compliance_bridge.py +1499 -0
- icdev/tools/modernization/db_migration_planner.py +1385 -0
- icdev/tools/modernization/doc_generator.py +1428 -0
- icdev/tools/modernization/framework_migrator.py +1525 -0
- icdev/tools/modernization/legacy_analyzer.py +1948 -0
- icdev/tools/modernization/migration_code_generator.py +1639 -0
- icdev/tools/modernization/migration_report_generator.py +1653 -0
- icdev/tools/modernization/migration_tracker.py +1726 -0
- icdev/tools/modernization/monolith_decomposer.py +1508 -0
- icdev/tools/modernization/seven_r_assessor.py +1658 -0
- icdev/tools/modernization/strangler_fig_manager.py +1705 -0
- icdev/tools/modernization/ui_analyzer.py +771 -0
- icdev/tools/modernization/version_migrator.py +1392 -0
- icdev/tools/monitor/__init__.py +1 -0
- icdev/tools/monitor/alert_correlator.py +495 -0
- icdev/tools/monitor/auto_resolver.py +612 -0
- icdev/tools/monitor/health_checker.py +509 -0
- icdev/tools/monitor/heartbeat_daemon.py +792 -0
- icdev/tools/monitor/log_analyzer.py +516 -0
- icdev/tools/monitor/metric_collector.py +496 -0
- icdev/tools/mosa/__init__.py +10 -0
- icdev/tools/mosa/icd_generator.py +370 -0
- icdev/tools/mosa/modular_design_analyzer.py +683 -0
- icdev/tools/mosa/mosa_code_enforcer.py +349 -0
- icdev/tools/mosa/tsp_generator.py +265 -0
- icdev/tools/observability/__init__.py +100 -0
- icdev/tools/observability/genai_attributes.py +88 -0
- icdev/tools/observability/instrumentation.py +140 -0
- icdev/tools/observability/mlflow_exporter.py +194 -0
- icdev/tools/observability/otel_tracer.py +168 -0
- icdev/tools/observability/provenance/__init__.py +3 -0
- icdev/tools/observability/provenance/prov_recorder.py +324 -0
- icdev/tools/observability/shap/__init__.py +3 -0
- icdev/tools/observability/shap/agent_shap.py +275 -0
- icdev/tools/observability/sqlite_tracer.py +361 -0
- icdev/tools/observability/trace_context.py +205 -0
- icdev/tools/observability/tracer.py +230 -0
- icdev/tools/orchestration/__init__.py +2 -0
- icdev/tools/orchestration/workflow_composer.py +361 -0
- icdev/tools/project/__init__.py +1 -0
- icdev/tools/project/manifest_loader.py +418 -0
- icdev/tools/project/project_create.py +350 -0
- icdev/tools/project/project_list.py +174 -0
- icdev/tools/project/project_scaffold.py +1715 -0
- icdev/tools/project/project_status.py +479 -0
- icdev/tools/project/session_context_builder.py +757 -0
- icdev/tools/project/validate_manifest.py +55 -0
- icdev/tools/registry/__init__.py +10 -0
- icdev/tools/registry/absorption_engine.py +832 -0
- icdev/tools/registry/capability_evaluator.py +668 -0
- icdev/tools/registry/child_registry.py +617 -0
- icdev/tools/registry/cross_pollinator.py +1065 -0
- icdev/tools/registry/genome_manager.py +671 -0
- icdev/tools/registry/learning_collector.py +912 -0
- icdev/tools/registry/propagation_manager.py +942 -0
- icdev/tools/registry/staging_manager.py +742 -0
- icdev/tools/registry/telemetry_collector.py +423 -0
- icdev/tools/requirements/__init__.py +1 -0
- icdev/tools/requirements/ai_governance_scorer.py +208 -0
- icdev/tools/requirements/boundary_analyzer.py +1293 -0
- icdev/tools/requirements/clarification_engine.py +618 -0
- icdev/tools/requirements/complexity_scorer.py +387 -0
- icdev/tools/requirements/consistency_analyzer.py +803 -0
- icdev/tools/requirements/constitution_manager.py +605 -0
- icdev/tools/requirements/decomposition_engine.py +778 -0
- icdev/tools/requirements/document_extractor.py +1016 -0
- icdev/tools/requirements/elicitation_techniques.py +519 -0
- icdev/tools/requirements/gap_detector.py +271 -0
- icdev/tools/requirements/intake_engine.py +2188 -0
- icdev/tools/requirements/prd_generator.py +847 -0
- icdev/tools/requirements/prd_validator.py +595 -0
- icdev/tools/requirements/readiness_scorer.py +313 -0
- icdev/tools/requirements/spec_organizer.py +1029 -0
- icdev/tools/requirements/spec_quality_checker.py +1097 -0
- icdev/tools/requirements/traceability_builder.py +579 -0
- icdev/tools/resilience/__init__.py +34 -0
- icdev/tools/resilience/circuit_breaker.py +340 -0
- icdev/tools/resilience/correlation.py +150 -0
- icdev/tools/resilience/errors.py +81 -0
- icdev/tools/resilience/retry.py +95 -0
- icdev/tools/schemas/__init__.py +27 -0
- icdev/tools/schemas/chat.py +61 -0
- icdev/tools/schemas/compliance.py +56 -0
- icdev/tools/schemas/core.py +85 -0
- icdev/tools/schemas/innovation.py +37 -0
- icdev/tools/schemas/validation.py +109 -0
- icdev/tools/sdk/__init__.py +3 -0
- icdev/tools/sdk/icdev_client.py +218 -0
- icdev/tools/security/__init__.py +1 -0
- icdev/tools/security/agent_output_validator.py +330 -0
- icdev/tools/security/agent_trust_scorer.py +466 -0
- icdev/tools/security/ai_bom_generator.py +725 -0
- icdev/tools/security/ai_telemetry_logger.py +469 -0
- icdev/tools/security/atlas_red_team.py +543 -0
- icdev/tools/security/code_pattern_scanner.py +378 -0
- icdev/tools/security/confabulation_detector.py +271 -0
- icdev/tools/security/container_scanner.py +491 -0
- icdev/tools/security/dependency_auditor.py +944 -0
- icdev/tools/security/endpoint_security_scanner.py +579 -0
- icdev/tools/security/mcp_tool_authorizer.py +243 -0
- icdev/tools/security/prompt_injection_detector.py +737 -0
- icdev/tools/security/sast_runner.py +948 -0
- icdev/tools/security/secret_detector.py +378 -0
- icdev/tools/security/tool_chain_validator.py +357 -0
- icdev/tools/security/vuln_scanner.py +539 -0
- icdev/tools/simulation/__init__.py +2 -0
- icdev/tools/simulation/coa_generator.py +1552 -0
- icdev/tools/simulation/monte_carlo.py +758 -0
- icdev/tools/simulation/scenario_manager.py +1073 -0
- icdev/tools/simulation/simulation_engine.py +1104 -0
- icdev/tools/supply_chain/__init__.py +2 -0
- icdev/tools/supply_chain/cve_triager.py +705 -0
- icdev/tools/supply_chain/dependency_graph.py +645 -0
- icdev/tools/supply_chain/isa_manager.py +540 -0
- icdev/tools/supply_chain/scrm_assessor.py +546 -0
- icdev/tools/testing/__init__.py +2 -0
- icdev/tools/testing/acceptance_validator.py +411 -0
- icdev/tools/testing/claude_dir_validator.py +831 -0
- icdev/tools/testing/data_types.py +199 -0
- icdev/tools/testing/e2e_runner.py +715 -0
- icdev/tools/testing/fuzz_cli.py +306 -0
- icdev/tools/testing/health_check.py +483 -0
- icdev/tools/testing/platform_check.py +143 -0
- icdev/tools/testing/production_audit.py +1862 -0
- icdev/tools/testing/production_remediate.py +804 -0
- icdev/tools/testing/screenshot_validator.py +539 -0
- icdev/tools/testing/smoke_test.py +283 -0
- icdev/tools/testing/test_agent_models.py +117 -0
- icdev/tools/testing/test_orchestrator.py +957 -0
- icdev/tools/testing/utils.py +229 -0
- icdev/tools/translation/__init__.py +17 -0
- icdev/tools/translation/code_translator.py +550 -0
- icdev/tools/translation/dependency_mapper.py +277 -0
- icdev/tools/translation/feature_map.py +395 -0
- icdev/tools/translation/project_assembler.py +439 -0
- icdev/tools/translation/source_extractor.py +609 -0
- icdev/tools/translation/test_translator.py +333 -0
- icdev/tools/translation/translation_manager.py +582 -0
- icdev/tools/translation/translation_validator.py +662 -0
- icdev/tools/translation/type_checker.py +371 -0
- icdev-1.0.0.dist-info/METADATA +868 -0
- icdev-1.0.0.dist-info/RECORD +1105 -0
- icdev-1.0.0.dist-info/WHEEL +5 -0
- icdev-1.0.0.dist-info/entry_points.txt +9 -0
- icdev-1.0.0.dist-info/licenses/LICENSE +254 -0
- icdev-1.0.0.dist-info/licenses/NOTICE +268 -0
- icdev-1.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,1499 @@
|
|
|
1
|
+
# [TEMPLATE: CUI // SP-CTI]
|
|
2
|
+
#!/usr/bin/env python3
|
|
3
|
+
"""ATO-Aware Compliance Bridge for ICDEV DoD Modernization.
|
|
4
|
+
|
|
5
|
+
Maintains NIST 800-53 control coverage during monolith-to-microservice migration.
|
|
6
|
+
Provides control inheritance, distribution across extracted services, gap analysis,
|
|
7
|
+
ATO impact reporting, digital thread creation, and coverage validation.
|
|
8
|
+
|
|
9
|
+
Ensures that decomposing a monolith into microservices does not degrade the
|
|
10
|
+
security posture tracked by the Authority to Operate (ATO) package.
|
|
11
|
+
|
|
12
|
+
Usage:
|
|
13
|
+
# Inherit controls from legacy monolith into migration plan
|
|
14
|
+
python tools/modernization/compliance_bridge.py \\
|
|
15
|
+
--plan-id mplan-abc123 --inherit
|
|
16
|
+
|
|
17
|
+
# Distribute inherited controls across extracted services
|
|
18
|
+
python tools/modernization/compliance_bridge.py \\
|
|
19
|
+
--plan-id mplan-abc123 --distribute --service-map /path/to/map.json
|
|
20
|
+
|
|
21
|
+
# Identify ATO coverage gaps
|
|
22
|
+
python tools/modernization/compliance_bridge.py \\
|
|
23
|
+
--plan-id mplan-abc123 --gaps
|
|
24
|
+
|
|
25
|
+
# Generate ATO impact report
|
|
26
|
+
python tools/modernization/compliance_bridge.py \\
|
|
27
|
+
--plan-id mplan-abc123 --report --output-dir /path/to/output
|
|
28
|
+
|
|
29
|
+
# Create full compliance digital thread
|
|
30
|
+
python tools/modernization/compliance_bridge.py \\
|
|
31
|
+
--plan-id mplan-abc123 --thread
|
|
32
|
+
|
|
33
|
+
# Validate ATO coverage post-migration
|
|
34
|
+
python tools/modernization/compliance_bridge.py \\
|
|
35
|
+
--plan-id mplan-abc123 --validate
|
|
36
|
+
|
|
37
|
+
# Show compliance dashboard
|
|
38
|
+
python tools/modernization/compliance_bridge.py \\
|
|
39
|
+
--plan-id mplan-abc123 --dashboard
|
|
40
|
+
|
|
41
|
+
Classification: CUI // SP-CTI
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
import argparse
|
|
45
|
+
import collections
|
|
46
|
+
import json
|
|
47
|
+
import sqlite3
|
|
48
|
+
import textwrap
|
|
49
|
+
from datetime import datetime, timezone
|
|
50
|
+
from pathlib import Path
|
|
51
|
+
from icdev._paths import get_project_root
|
|
52
|
+
|
|
53
|
+
# ---------------------------------------------------------------------------
|
|
54
|
+
# Configuration
|
|
55
|
+
# ---------------------------------------------------------------------------
|
|
56
|
+
|
|
57
|
+
BASE_DIR = get_project_root()
|
|
58
|
+
DB_PATH = BASE_DIR / "data" / "icdev.db"
|
|
59
|
+
|
|
60
|
+
# CUI banner text for generated documents
|
|
61
|
+
CUI_BANNER = (
|
|
62
|
+
"////////////////////////////////////////////////////////////////////\n"
|
|
63
|
+
"CONTROLLED UNCLASSIFIED INFORMATION (CUI) // SP-CTI\n"
|
|
64
|
+
"Distribution: Distribution D -- Authorized DoD Personnel Only\n"
|
|
65
|
+
"////////////////////////////////////////////////////////////////////"
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
CUI_FOOTER = (
|
|
69
|
+
"////////////////////////////////////////////////////////////////////\n"
|
|
70
|
+
"CUI // SP-CTI | Department of Defense\n"
|
|
71
|
+
"////////////////////////////////////////////////////////////////////"
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
# NIST 800-53 control family descriptions for mapping logic
|
|
75
|
+
CONTROL_FAMILY_DESCRIPTIONS = {
|
|
76
|
+
"AC": "Access Control",
|
|
77
|
+
"AU": "Audit and Accountability",
|
|
78
|
+
"AT": "Awareness and Training",
|
|
79
|
+
"CM": "Configuration Management",
|
|
80
|
+
"CP": "Contingency Planning",
|
|
81
|
+
"IA": "Identification and Authentication",
|
|
82
|
+
"IR": "Incident Response",
|
|
83
|
+
"MA": "Maintenance",
|
|
84
|
+
"MP": "Media Protection",
|
|
85
|
+
"PE": "Physical and Environmental Protection",
|
|
86
|
+
"PL": "Planning",
|
|
87
|
+
"PM": "Program Management",
|
|
88
|
+
"PS": "Personnel Security",
|
|
89
|
+
"PT": "PII Processing and Transparency",
|
|
90
|
+
"RA": "Risk Assessment",
|
|
91
|
+
"SA": "System and Services Acquisition",
|
|
92
|
+
"SC": "System and Communications Protection",
|
|
93
|
+
"SI": "System and Information Integrity",
|
|
94
|
+
"SR": "Supply Chain Risk Management",
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
# Control families that apply universally to ALL microservices
|
|
98
|
+
UNIVERSAL_FAMILIES = {"AC", "AU", "CM", "IR", "PL", "PM", "PS", "AT", "MA",
|
|
99
|
+
"MP", "PE", "RA", "SR", "CP"}
|
|
100
|
+
|
|
101
|
+
# Control families with component-type-specific applicability
|
|
102
|
+
TARGETED_FAMILY_RULES = {
|
|
103
|
+
"SC": {"applies_to_types": ["controller", "api_endpoint", "service",
|
|
104
|
+
"interface", "servlet"]},
|
|
105
|
+
"IA": {"applies_to_types": ["controller", "api_endpoint", "service",
|
|
106
|
+
"servlet", "module"]},
|
|
107
|
+
"SI": {"applies_to_types": ["service", "repository", "model", "entity",
|
|
108
|
+
"stored_procedure", "function", "module"]},
|
|
109
|
+
"SA": {"applies_to_types": ["class", "module", "service", "package"]},
|
|
110
|
+
"PT": {"applies_to_types": ["model", "entity", "repository",
|
|
111
|
+
"stored_procedure"]},
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
# Risk weights for gap severity scoring by control family
|
|
115
|
+
FAMILY_RISK_WEIGHTS = {
|
|
116
|
+
"AC": 9, "AU": 8, "IA": 9, "SC": 9, "SI": 8,
|
|
117
|
+
"CM": 7, "SA": 7, "RA": 7, "IR": 6, "CP": 6,
|
|
118
|
+
"SR": 5, "MA": 4, "MP": 4, "PE": 3, "PS": 3,
|
|
119
|
+
"PL": 3, "PM": 3, "AT": 2, "PT": 5,
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
# Estimated remediation weeks per gap by family criticality
|
|
123
|
+
REMEDIATION_WEEKS = {
|
|
124
|
+
"critical": 6, # AC, IA, SC
|
|
125
|
+
"high": 4, # AU, SI, CM, SA, RA
|
|
126
|
+
"medium": 2, # IR, CP, SR, PT
|
|
127
|
+
"low": 1, # MA, MP, PE, PS, PL, PM, AT
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
# ---------------------------------------------------------------------------
|
|
132
|
+
# Database helper
|
|
133
|
+
# ---------------------------------------------------------------------------
|
|
134
|
+
|
|
135
|
+
def _get_db():
|
|
136
|
+
"""Return a sqlite3 connection to the ICDEV operational database.
|
|
137
|
+
|
|
138
|
+
The database file must already exist (created by tools/db/init_icdev_db.py).
|
|
139
|
+
Uses row_factory = sqlite3.Row for dict-like access.
|
|
140
|
+
"""
|
|
141
|
+
if not DB_PATH.exists():
|
|
142
|
+
raise FileNotFoundError(
|
|
143
|
+
f"ICDEV database not found at {DB_PATH}. "
|
|
144
|
+
"Run 'python tools/db/init_icdev_db.py' first."
|
|
145
|
+
)
|
|
146
|
+
conn = sqlite3.connect(str(DB_PATH))
|
|
147
|
+
conn.row_factory = sqlite3.Row
|
|
148
|
+
conn.execute("PRAGMA journal_mode=WAL")
|
|
149
|
+
conn.execute("PRAGMA foreign_keys=ON")
|
|
150
|
+
return conn
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def _get_plan_info(conn, plan_id):
|
|
154
|
+
"""Fetch migration plan record and validate it exists."""
|
|
155
|
+
row = conn.execute(
|
|
156
|
+
"SELECT * FROM migration_plans WHERE id = ?", (plan_id,)
|
|
157
|
+
).fetchone()
|
|
158
|
+
if not row:
|
|
159
|
+
raise ValueError(f"Migration plan '{plan_id}' not found in database.")
|
|
160
|
+
return dict(row)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def _get_legacy_app_project_id(conn, legacy_app_id):
|
|
164
|
+
"""Get the project_id for a legacy application."""
|
|
165
|
+
row = conn.execute(
|
|
166
|
+
"SELECT project_id FROM legacy_applications WHERE id = ?",
|
|
167
|
+
(legacy_app_id,)
|
|
168
|
+
).fetchone()
|
|
169
|
+
if not row:
|
|
170
|
+
raise ValueError(
|
|
171
|
+
f"Legacy application '{legacy_app_id}' not found in database."
|
|
172
|
+
)
|
|
173
|
+
return row["project_id"]
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def _get_control_family(control_id):
|
|
177
|
+
"""Extract the family prefix from a NIST control ID (e.g., 'AC-2' -> 'AC')."""
|
|
178
|
+
if "-" in control_id:
|
|
179
|
+
return control_id.split("-")[0]
|
|
180
|
+
return control_id[:2]
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def _log_audit(conn, project_id, event_type, action, details=None):
|
|
184
|
+
"""Write an audit trail entry (append-only, NIST AU compliant)."""
|
|
185
|
+
conn.execute(
|
|
186
|
+
"""INSERT INTO audit_trail
|
|
187
|
+
(project_id, event_type, actor, action, details, classification)
|
|
188
|
+
VALUES (?, ?, ?, ?, ?, ?)""",
|
|
189
|
+
(
|
|
190
|
+
project_id,
|
|
191
|
+
event_type,
|
|
192
|
+
"compliance-bridge",
|
|
193
|
+
action,
|
|
194
|
+
json.dumps(details) if details else None,
|
|
195
|
+
"CUI",
|
|
196
|
+
),
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def _get_family_criticality(family):
|
|
201
|
+
"""Map a control family to a criticality tier for remediation estimation."""
|
|
202
|
+
weight = FAMILY_RISK_WEIGHTS.get(family, 3)
|
|
203
|
+
if weight >= 9:
|
|
204
|
+
return "critical"
|
|
205
|
+
elif weight >= 7:
|
|
206
|
+
return "high"
|
|
207
|
+
elif weight >= 5:
|
|
208
|
+
return "medium"
|
|
209
|
+
return "low"
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
# ---------------------------------------------------------------------------
|
|
213
|
+
# 1. Inherit controls from monolith to migration plan
|
|
214
|
+
# ---------------------------------------------------------------------------
|
|
215
|
+
|
|
216
|
+
def inherit_controls(legacy_app_id, plan_id):
|
|
217
|
+
"""Copy NIST control mappings from the legacy monolith to a migration plan.
|
|
218
|
+
|
|
219
|
+
For each implemented or partially_implemented control on the legacy app's
|
|
220
|
+
project, creates a digital_thread_link tracing the control to the
|
|
221
|
+
migration plan. This establishes the baseline ATO posture that must be
|
|
222
|
+
maintained through decomposition.
|
|
223
|
+
|
|
224
|
+
Args:
|
|
225
|
+
legacy_app_id: ID of the legacy application being migrated.
|
|
226
|
+
plan_id: ID of the migration plan receiving inherited controls.
|
|
227
|
+
|
|
228
|
+
Returns:
|
|
229
|
+
dict with keys:
|
|
230
|
+
controls_inherited: int total count
|
|
231
|
+
by_family: dict of {family_code: count}
|
|
232
|
+
"""
|
|
233
|
+
conn = _get_db()
|
|
234
|
+
try:
|
|
235
|
+
# Validate plan exists
|
|
236
|
+
_get_plan_info(conn, plan_id)
|
|
237
|
+
|
|
238
|
+
# Get the project_id for the legacy application
|
|
239
|
+
project_id = _get_legacy_app_project_id(conn, legacy_app_id)
|
|
240
|
+
|
|
241
|
+
# Query all implemented / partially_implemented controls
|
|
242
|
+
rows = conn.execute(
|
|
243
|
+
"""SELECT pc.control_id, pc.implementation_status,
|
|
244
|
+
pc.implementation_description, pc.evidence_path,
|
|
245
|
+
cc.family, cc.title
|
|
246
|
+
FROM project_controls pc
|
|
247
|
+
LEFT JOIN compliance_controls cc ON pc.control_id = cc.id
|
|
248
|
+
WHERE pc.project_id = ?
|
|
249
|
+
AND pc.implementation_status IN ('implemented', 'partially_implemented')
|
|
250
|
+
ORDER BY pc.control_id""",
|
|
251
|
+
(project_id,),
|
|
252
|
+
).fetchall()
|
|
253
|
+
|
|
254
|
+
inherited_count = 0
|
|
255
|
+
by_family = collections.Counter()
|
|
256
|
+
|
|
257
|
+
for row in rows:
|
|
258
|
+
control_id = row["control_id"]
|
|
259
|
+
family = row["family"] or _get_control_family(control_id)
|
|
260
|
+
|
|
261
|
+
# Create digital thread link: nist_control -> migration_task (plan)
|
|
262
|
+
try:
|
|
263
|
+
conn.execute(
|
|
264
|
+
"""INSERT OR IGNORE INTO digital_thread_links
|
|
265
|
+
(project_id, source_type, source_id,
|
|
266
|
+
target_type, target_id, link_type,
|
|
267
|
+
confidence, evidence, created_by, created_at)
|
|
268
|
+
VALUES (?, 'nist_control', ?,
|
|
269
|
+
'migration_task', ?, 'traces_to',
|
|
270
|
+
?, ?, 'compliance-bridge', ?)""",
|
|
271
|
+
(
|
|
272
|
+
project_id,
|
|
273
|
+
control_id,
|
|
274
|
+
plan_id,
|
|
275
|
+
1.0 if row["implementation_status"] == "implemented" else 0.7,
|
|
276
|
+
json.dumps({
|
|
277
|
+
"source": "control_inheritance",
|
|
278
|
+
"legacy_app_id": legacy_app_id,
|
|
279
|
+
"original_status": row["implementation_status"],
|
|
280
|
+
"description": row["implementation_description"],
|
|
281
|
+
}),
|
|
282
|
+
datetime.now(timezone.utc).isoformat(),
|
|
283
|
+
),
|
|
284
|
+
)
|
|
285
|
+
inherited_count += 1
|
|
286
|
+
by_family[family] += 1
|
|
287
|
+
except sqlite3.IntegrityError:
|
|
288
|
+
# Link already exists -- count it anyway for reporting
|
|
289
|
+
inherited_count += 1
|
|
290
|
+
by_family[family] += 1
|
|
291
|
+
|
|
292
|
+
# Audit trail
|
|
293
|
+
_log_audit(conn, project_id, "compliance_check",
|
|
294
|
+
f"Inherited {inherited_count} controls from {legacy_app_id} to plan {plan_id}",
|
|
295
|
+
{"controls_inherited": inherited_count, "by_family": dict(by_family)})
|
|
296
|
+
|
|
297
|
+
conn.commit()
|
|
298
|
+
|
|
299
|
+
result = {
|
|
300
|
+
"controls_inherited": inherited_count,
|
|
301
|
+
"by_family": dict(by_family),
|
|
302
|
+
}
|
|
303
|
+
print(f"[INFO] Inherited {inherited_count} controls from {legacy_app_id} to plan {plan_id}")
|
|
304
|
+
for fam, cnt in sorted(by_family.items()):
|
|
305
|
+
print(f" {fam} ({CONTROL_FAMILY_DESCRIPTIONS.get(fam, 'Unknown')}): {cnt}")
|
|
306
|
+
return result
|
|
307
|
+
|
|
308
|
+
finally:
|
|
309
|
+
conn.close()
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
# ---------------------------------------------------------------------------
|
|
313
|
+
# 2. Distribute controls across extracted services
|
|
314
|
+
# ---------------------------------------------------------------------------
|
|
315
|
+
|
|
316
|
+
def distribute_controls(plan_id, service_map):
|
|
317
|
+
"""Distribute inherited NIST controls across extracted microservices.
|
|
318
|
+
|
|
319
|
+
Uses control family semantics to determine which services should own
|
|
320
|
+
each control:
|
|
321
|
+
- AC, AU, CM, IR, etc. (universal) -> all services
|
|
322
|
+
- SC (System Communications) -> services with API/network components
|
|
323
|
+
- IA (Identification/Auth) -> services with auth components
|
|
324
|
+
- SI (System Integrity) -> services with data processing components
|
|
325
|
+
|
|
326
|
+
Args:
|
|
327
|
+
plan_id: Migration plan ID.
|
|
328
|
+
service_map: dict of {service_name: [component_ids]} mapping service
|
|
329
|
+
names to the legacy component IDs they absorb.
|
|
330
|
+
|
|
331
|
+
Returns:
|
|
332
|
+
Distribution matrix: {service_name: {control_family: [control_ids]}}
|
|
333
|
+
"""
|
|
334
|
+
conn = _get_db()
|
|
335
|
+
try:
|
|
336
|
+
plan = _get_plan_info(conn, plan_id)
|
|
337
|
+
legacy_app_id = plan["legacy_app_id"]
|
|
338
|
+
project_id = _get_legacy_app_project_id(conn, legacy_app_id)
|
|
339
|
+
|
|
340
|
+
# Fetch all inherited controls for this plan
|
|
341
|
+
inherited_rows = conn.execute(
|
|
342
|
+
"""SELECT source_id AS control_id
|
|
343
|
+
FROM digital_thread_links
|
|
344
|
+
WHERE project_id = ?
|
|
345
|
+
AND source_type = 'nist_control'
|
|
346
|
+
AND target_type = 'migration_task'
|
|
347
|
+
AND target_id = ?
|
|
348
|
+
AND link_type = 'traces_to'""",
|
|
349
|
+
(project_id, plan_id),
|
|
350
|
+
).fetchall()
|
|
351
|
+
|
|
352
|
+
if not inherited_rows:
|
|
353
|
+
print("[WARN] No inherited controls found. Run --inherit first.")
|
|
354
|
+
return {}
|
|
355
|
+
|
|
356
|
+
inherited_controls = [r["control_id"] for r in inherited_rows]
|
|
357
|
+
|
|
358
|
+
# Build component-type lookup for each service
|
|
359
|
+
service_component_types = {}
|
|
360
|
+
for svc_name, comp_ids in service_map.items():
|
|
361
|
+
types_set = set()
|
|
362
|
+
for comp_id in comp_ids:
|
|
363
|
+
row = conn.execute(
|
|
364
|
+
"SELECT component_type FROM legacy_components WHERE id = ?",
|
|
365
|
+
(comp_id,),
|
|
366
|
+
).fetchone()
|
|
367
|
+
if row:
|
|
368
|
+
types_set.add(row["component_type"])
|
|
369
|
+
service_component_types[svc_name] = types_set
|
|
370
|
+
|
|
371
|
+
# Distribute controls
|
|
372
|
+
distribution = {svc: collections.defaultdict(list) for svc in service_map}
|
|
373
|
+
links_created = 0
|
|
374
|
+
|
|
375
|
+
for control_id in inherited_controls:
|
|
376
|
+
family = _get_control_family(control_id)
|
|
377
|
+
|
|
378
|
+
# Determine target services for this control
|
|
379
|
+
target_services = []
|
|
380
|
+
|
|
381
|
+
if family in UNIVERSAL_FAMILIES:
|
|
382
|
+
# Universal controls apply to all services
|
|
383
|
+
target_services = list(service_map.keys())
|
|
384
|
+
|
|
385
|
+
elif family in TARGETED_FAMILY_RULES:
|
|
386
|
+
# Targeted controls apply only to services with matching types
|
|
387
|
+
rule = TARGETED_FAMILY_RULES[family]
|
|
388
|
+
applies_to = set(rule["applies_to_types"])
|
|
389
|
+
for svc_name, comp_types in service_component_types.items():
|
|
390
|
+
if comp_types & applies_to:
|
|
391
|
+
target_services.append(svc_name)
|
|
392
|
+
# Fallback: if no service matches, assign to all (safety net)
|
|
393
|
+
if not target_services:
|
|
394
|
+
target_services = list(service_map.keys())
|
|
395
|
+
|
|
396
|
+
else:
|
|
397
|
+
# Unknown family: assign to all services as safety measure
|
|
398
|
+
target_services = list(service_map.keys())
|
|
399
|
+
|
|
400
|
+
# Create digital thread links for each service-control pairing
|
|
401
|
+
for svc_name in target_services:
|
|
402
|
+
distribution[svc_name][family].append(control_id)
|
|
403
|
+
try:
|
|
404
|
+
conn.execute(
|
|
405
|
+
"""INSERT OR IGNORE INTO digital_thread_links
|
|
406
|
+
(project_id, source_type, source_id,
|
|
407
|
+
target_type, target_id, link_type,
|
|
408
|
+
confidence, evidence, created_by, created_at)
|
|
409
|
+
VALUES (?, 'nist_control', ?,
|
|
410
|
+
'migration_task', ?, 'traces_to',
|
|
411
|
+
?, ?, 'compliance-bridge', ?)""",
|
|
412
|
+
(
|
|
413
|
+
project_id,
|
|
414
|
+
control_id,
|
|
415
|
+
f"{plan_id}::{svc_name}",
|
|
416
|
+
0.9,
|
|
417
|
+
json.dumps({
|
|
418
|
+
"source": "control_distribution",
|
|
419
|
+
"service": svc_name,
|
|
420
|
+
"family": family,
|
|
421
|
+
"distribution_rule": "universal" if family in UNIVERSAL_FAMILIES else "targeted",
|
|
422
|
+
}),
|
|
423
|
+
datetime.now(timezone.utc).isoformat(),
|
|
424
|
+
),
|
|
425
|
+
)
|
|
426
|
+
links_created += 1
|
|
427
|
+
except sqlite3.IntegrityError:
|
|
428
|
+
pass
|
|
429
|
+
|
|
430
|
+
# Convert defaultdicts to regular dicts for serialization
|
|
431
|
+
result = {}
|
|
432
|
+
for svc_name, families in distribution.items():
|
|
433
|
+
result[svc_name] = {fam: ctrls for fam, ctrls in families.items()}
|
|
434
|
+
|
|
435
|
+
_log_audit(conn, project_id, "compliance_check",
|
|
436
|
+
f"Distributed controls across {len(service_map)} services for plan {plan_id}",
|
|
437
|
+
{"services": list(service_map.keys()), "links_created": links_created})
|
|
438
|
+
|
|
439
|
+
conn.commit()
|
|
440
|
+
|
|
441
|
+
print(f"[INFO] Distributed controls across {len(service_map)} services")
|
|
442
|
+
for svc_name in sorted(result.keys()):
|
|
443
|
+
total = sum(len(ctrls) for ctrls in result[svc_name].values())
|
|
444
|
+
families_str = ", ".join(sorted(result[svc_name].keys()))
|
|
445
|
+
print(f" {svc_name}: {total} controls [{families_str}]")
|
|
446
|
+
|
|
447
|
+
return result
|
|
448
|
+
|
|
449
|
+
finally:
|
|
450
|
+
conn.close()
|
|
451
|
+
|
|
452
|
+
|
|
453
|
+
# ---------------------------------------------------------------------------
|
|
454
|
+
# 3. Identify ATO gaps
|
|
455
|
+
# ---------------------------------------------------------------------------
|
|
456
|
+
|
|
457
|
+
def identify_ato_gaps(plan_id):
|
|
458
|
+
"""Find NIST controls that lose coverage during service decomposition.
|
|
459
|
+
|
|
460
|
+
Compares inherited controls (from the monolith) against distributed
|
|
461
|
+
controls (assigned to microservices). Controls with no distribution
|
|
462
|
+
target are ATO gaps. Also flags controls whose implementation
|
|
463
|
+
description references monolith-specific architecture.
|
|
464
|
+
|
|
465
|
+
Args:
|
|
466
|
+
plan_id: Migration plan ID.
|
|
467
|
+
|
|
468
|
+
Returns:
|
|
469
|
+
dict with keys:
|
|
470
|
+
gaps: list of {control_id, family, title, reason}
|
|
471
|
+
gap_count: int
|
|
472
|
+
total_controls: int
|
|
473
|
+
coverage_pct: float (0-100)
|
|
474
|
+
"""
|
|
475
|
+
conn = _get_db()
|
|
476
|
+
try:
|
|
477
|
+
plan = _get_plan_info(conn, plan_id)
|
|
478
|
+
legacy_app_id = plan["legacy_app_id"]
|
|
479
|
+
project_id = _get_legacy_app_project_id(conn, legacy_app_id)
|
|
480
|
+
|
|
481
|
+
# All inherited controls
|
|
482
|
+
inherited_rows = conn.execute(
|
|
483
|
+
"""SELECT source_id AS control_id
|
|
484
|
+
FROM digital_thread_links
|
|
485
|
+
WHERE project_id = ?
|
|
486
|
+
AND source_type = 'nist_control'
|
|
487
|
+
AND target_type = 'migration_task'
|
|
488
|
+
AND target_id = ?
|
|
489
|
+
AND link_type = 'traces_to'""",
|
|
490
|
+
(project_id, plan_id),
|
|
491
|
+
).fetchall()
|
|
492
|
+
inherited_set = {r["control_id"] for r in inherited_rows}
|
|
493
|
+
|
|
494
|
+
# All distributed controls (target_id has '::' separator for service assignments)
|
|
495
|
+
distributed_rows = conn.execute(
|
|
496
|
+
"""SELECT source_id AS control_id
|
|
497
|
+
FROM digital_thread_links
|
|
498
|
+
WHERE project_id = ?
|
|
499
|
+
AND source_type = 'nist_control'
|
|
500
|
+
AND target_type = 'migration_task'
|
|
501
|
+
AND target_id LIKE ?
|
|
502
|
+
AND link_type = 'traces_to'""",
|
|
503
|
+
(project_id, f"{plan_id}::%"),
|
|
504
|
+
).fetchall()
|
|
505
|
+
distributed_set = {r["control_id"] for r in distributed_rows}
|
|
506
|
+
|
|
507
|
+
# Monolith-specific keywords that indicate architecture coupling
|
|
508
|
+
monolith_keywords = [
|
|
509
|
+
"monolith", "single deployment", "shared database",
|
|
510
|
+
"in-process", "same server", "single instance",
|
|
511
|
+
"tightly coupled", "single codebase", "co-located",
|
|
512
|
+
]
|
|
513
|
+
|
|
514
|
+
gaps = []
|
|
515
|
+
|
|
516
|
+
for control_id in sorted(inherited_set):
|
|
517
|
+
family = _get_control_family(control_id)
|
|
518
|
+
|
|
519
|
+
# Get control metadata
|
|
520
|
+
ctrl_row = conn.execute(
|
|
521
|
+
"SELECT title, description FROM compliance_controls WHERE id = ?",
|
|
522
|
+
(control_id,),
|
|
523
|
+
).fetchone()
|
|
524
|
+
title = ctrl_row["title"] if ctrl_row else "Unknown"
|
|
525
|
+
|
|
526
|
+
# Gap type 1: no distribution target at all
|
|
527
|
+
if control_id not in distributed_set:
|
|
528
|
+
gaps.append({
|
|
529
|
+
"control_id": control_id,
|
|
530
|
+
"family": family,
|
|
531
|
+
"title": title,
|
|
532
|
+
"reason": "No microservice assigned to this control",
|
|
533
|
+
})
|
|
534
|
+
continue
|
|
535
|
+
|
|
536
|
+
# Gap type 2: implementation references monolith architecture
|
|
537
|
+
impl_row = conn.execute(
|
|
538
|
+
"""SELECT implementation_description
|
|
539
|
+
FROM project_controls
|
|
540
|
+
WHERE project_id = ? AND control_id = ?""",
|
|
541
|
+
(project_id, control_id),
|
|
542
|
+
).fetchone()
|
|
543
|
+
|
|
544
|
+
if impl_row and impl_row["implementation_description"]:
|
|
545
|
+
desc_lower = impl_row["implementation_description"].lower()
|
|
546
|
+
for keyword in monolith_keywords:
|
|
547
|
+
if keyword in desc_lower:
|
|
548
|
+
gaps.append({
|
|
549
|
+
"control_id": control_id,
|
|
550
|
+
"family": family,
|
|
551
|
+
"title": title,
|
|
552
|
+
"reason": f"Implementation references monolith architecture: '{keyword}'",
|
|
553
|
+
})
|
|
554
|
+
break
|
|
555
|
+
|
|
556
|
+
total_controls = len(inherited_set)
|
|
557
|
+
gap_count = len(gaps)
|
|
558
|
+
coverage_pct = round(
|
|
559
|
+
((total_controls - gap_count) / total_controls * 100)
|
|
560
|
+
if total_controls > 0 else 0.0, 2
|
|
561
|
+
)
|
|
562
|
+
|
|
563
|
+
result = {
|
|
564
|
+
"gaps": gaps,
|
|
565
|
+
"gap_count": gap_count,
|
|
566
|
+
"total_controls": total_controls,
|
|
567
|
+
"coverage_pct": coverage_pct,
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
print(f"[INFO] ATO gap analysis for plan {plan_id}")
|
|
571
|
+
print(f" Total controls: {total_controls}")
|
|
572
|
+
print(f" Gaps found: {gap_count}")
|
|
573
|
+
print(f" Coverage: {coverage_pct}%")
|
|
574
|
+
if gaps:
|
|
575
|
+
print(" Gap details:")
|
|
576
|
+
for g in gaps:
|
|
577
|
+
print(f" {g['control_id']} ({g['family']}): {g['reason']}")
|
|
578
|
+
|
|
579
|
+
return result
|
|
580
|
+
|
|
581
|
+
finally:
|
|
582
|
+
conn.close()
|
|
583
|
+
|
|
584
|
+
|
|
585
|
+
# ---------------------------------------------------------------------------
|
|
586
|
+
# 4. Generate ATO impact report
|
|
587
|
+
# ---------------------------------------------------------------------------
|
|
588
|
+
|
|
589
|
+
def generate_ato_impact_report(plan_id, output_dir=None):
|
|
590
|
+
"""Generate a comprehensive ATO impact analysis report in CUI-marked markdown.
|
|
591
|
+
|
|
592
|
+
Calls inherit analysis, distribution analysis, and gap identification to
|
|
593
|
+
produce an executive-level report covering:
|
|
594
|
+
- Executive summary with totals
|
|
595
|
+
- Per-family breakdown table
|
|
596
|
+
- Gap analysis with remediation recommendations
|
|
597
|
+
- Risk assessment with severity scoring
|
|
598
|
+
- Timeline impact estimation
|
|
599
|
+
|
|
600
|
+
Args:
|
|
601
|
+
plan_id: Migration plan ID.
|
|
602
|
+
output_dir: Optional directory path to write the report file.
|
|
603
|
+
If None, returns report content as string.
|
|
604
|
+
|
|
605
|
+
Returns:
|
|
606
|
+
File path (str) if output_dir provided, else report content (str).
|
|
607
|
+
"""
|
|
608
|
+
conn = _get_db()
|
|
609
|
+
try:
|
|
610
|
+
plan = _get_plan_info(conn, plan_id)
|
|
611
|
+
legacy_app_id = plan["legacy_app_id"]
|
|
612
|
+
project_id = _get_legacy_app_project_id(conn, legacy_app_id)
|
|
613
|
+
|
|
614
|
+
# Gather legacy app info
|
|
615
|
+
app_row = conn.execute(
|
|
616
|
+
"SELECT name FROM legacy_applications WHERE id = ?",
|
|
617
|
+
(legacy_app_id,),
|
|
618
|
+
).fetchone()
|
|
619
|
+
app_name = app_row["name"] if app_row else legacy_app_id
|
|
620
|
+
|
|
621
|
+
# Gather inherited controls count by family
|
|
622
|
+
inherited_rows = conn.execute(
|
|
623
|
+
"""SELECT source_id AS control_id
|
|
624
|
+
FROM digital_thread_links
|
|
625
|
+
WHERE project_id = ?
|
|
626
|
+
AND source_type = 'nist_control'
|
|
627
|
+
AND target_type = 'migration_task'
|
|
628
|
+
AND target_id = ?
|
|
629
|
+
AND link_type = 'traces_to'""",
|
|
630
|
+
(project_id, plan_id),
|
|
631
|
+
).fetchall()
|
|
632
|
+
inherited_by_family = collections.Counter()
|
|
633
|
+
for r in inherited_rows:
|
|
634
|
+
inherited_by_family[_get_control_family(r["control_id"])] += 1
|
|
635
|
+
total_inherited = len(inherited_rows)
|
|
636
|
+
|
|
637
|
+
# Gather distributed controls by family
|
|
638
|
+
distributed_rows = conn.execute(
|
|
639
|
+
"""SELECT DISTINCT source_id AS control_id
|
|
640
|
+
FROM digital_thread_links
|
|
641
|
+
WHERE project_id = ?
|
|
642
|
+
AND source_type = 'nist_control'
|
|
643
|
+
AND target_type = 'migration_task'
|
|
644
|
+
AND target_id LIKE ?
|
|
645
|
+
AND link_type = 'traces_to'""",
|
|
646
|
+
(project_id, f"{plan_id}::%"),
|
|
647
|
+
).fetchall()
|
|
648
|
+
distributed_by_family = collections.Counter()
|
|
649
|
+
for r in distributed_rows:
|
|
650
|
+
distributed_by_family[_get_control_family(r["control_id"])] += 1
|
|
651
|
+
total_distributed = len(distributed_rows)
|
|
652
|
+
|
|
653
|
+
finally:
|
|
654
|
+
conn.close()
|
|
655
|
+
|
|
656
|
+
# Identify gaps (uses its own connection)
|
|
657
|
+
gap_result = identify_ato_gaps(plan_id)
|
|
658
|
+
gaps = gap_result["gaps"]
|
|
659
|
+
gap_count = gap_result["gap_count"]
|
|
660
|
+
coverage_pct = gap_result["coverage_pct"]
|
|
661
|
+
|
|
662
|
+
# Compute risk scores and timeline impact
|
|
663
|
+
gap_by_family = collections.Counter()
|
|
664
|
+
for g in gaps:
|
|
665
|
+
gap_by_family[g["family"]] += 1
|
|
666
|
+
|
|
667
|
+
total_risk_score = 0
|
|
668
|
+
total_remediation_weeks = 0
|
|
669
|
+
family_risk_details = []
|
|
670
|
+
for family, count in sorted(gap_by_family.items()):
|
|
671
|
+
weight = FAMILY_RISK_WEIGHTS.get(family, 3)
|
|
672
|
+
risk = weight * count
|
|
673
|
+
total_risk_score += risk
|
|
674
|
+
criticality = _get_family_criticality(family)
|
|
675
|
+
weeks = REMEDIATION_WEEKS.get(criticality, 1) * count
|
|
676
|
+
total_remediation_weeks += weeks
|
|
677
|
+
family_risk_details.append({
|
|
678
|
+
"family": family,
|
|
679
|
+
"gap_count": count,
|
|
680
|
+
"risk_weight": weight,
|
|
681
|
+
"risk_score": risk,
|
|
682
|
+
"criticality": criticality,
|
|
683
|
+
"remediation_weeks": weeks,
|
|
684
|
+
})
|
|
685
|
+
|
|
686
|
+
# Determine overall risk level
|
|
687
|
+
if total_risk_score == 0:
|
|
688
|
+
overall_risk = "LOW"
|
|
689
|
+
elif total_risk_score <= 20:
|
|
690
|
+
overall_risk = "MODERATE"
|
|
691
|
+
elif total_risk_score <= 50:
|
|
692
|
+
overall_risk = "HIGH"
|
|
693
|
+
else:
|
|
694
|
+
overall_risk = "CRITICAL"
|
|
695
|
+
|
|
696
|
+
now = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M UTC")
|
|
697
|
+
|
|
698
|
+
# Build report
|
|
699
|
+
lines = [
|
|
700
|
+
CUI_BANNER,
|
|
701
|
+
"",
|
|
702
|
+
"# ATO Impact Analysis Report",
|
|
703
|
+
"",
|
|
704
|
+
f"**Plan ID:** {plan_id}",
|
|
705
|
+
f"**Legacy Application:** {app_name} ({legacy_app_id})",
|
|
706
|
+
f"**Migration Strategy:** {plan.get('strategy', 'N/A')}",
|
|
707
|
+
f"**Target Architecture:** {plan.get('target_architecture', 'N/A')}",
|
|
708
|
+
f"**Generated:** {now}",
|
|
709
|
+
"**Classification:** CUI // SP-CTI",
|
|
710
|
+
"",
|
|
711
|
+
"---",
|
|
712
|
+
"",
|
|
713
|
+
"## Executive Summary",
|
|
714
|
+
"",
|
|
715
|
+
"| Metric | Value |",
|
|
716
|
+
"|--------|-------|",
|
|
717
|
+
f"| Total Controls in ATO Baseline | {total_inherited} |",
|
|
718
|
+
f"| Controls Inherited | {total_inherited} |",
|
|
719
|
+
f"| Controls Distributed to Services | {total_distributed} |",
|
|
720
|
+
f"| ATO Gaps Identified | {gap_count} |",
|
|
721
|
+
f"| Coverage Percentage | {coverage_pct}% |",
|
|
722
|
+
f"| Overall Risk Level | **{overall_risk}** |",
|
|
723
|
+
f"| Estimated Remediation | {total_remediation_weeks} additional weeks |",
|
|
724
|
+
"",
|
|
725
|
+
]
|
|
726
|
+
|
|
727
|
+
# Compliance gate status
|
|
728
|
+
gate_status = "PASS" if coverage_pct >= 95.0 else "FAIL"
|
|
729
|
+
lines.append(f"**Compliance Migration Gate:** {gate_status}")
|
|
730
|
+
if gate_status == "FAIL":
|
|
731
|
+
lines.append(f" - Coverage must be >= 95% to proceed. Current: {coverage_pct}%")
|
|
732
|
+
lines.append("")
|
|
733
|
+
|
|
734
|
+
# Per-family breakdown
|
|
735
|
+
lines.extend([
|
|
736
|
+
"---",
|
|
737
|
+
"",
|
|
738
|
+
"## Per-Family Breakdown",
|
|
739
|
+
"",
|
|
740
|
+
"| Family | Description | Inherited | Distributed | Gaps | Coverage |",
|
|
741
|
+
"|--------|-------------|-----------|-------------|------|----------|",
|
|
742
|
+
])
|
|
743
|
+
|
|
744
|
+
all_families = sorted(set(
|
|
745
|
+
list(inherited_by_family.keys()) +
|
|
746
|
+
list(distributed_by_family.keys()) +
|
|
747
|
+
list(gap_by_family.keys())
|
|
748
|
+
))
|
|
749
|
+
|
|
750
|
+
for fam in all_families:
|
|
751
|
+
desc = CONTROL_FAMILY_DESCRIPTIONS.get(fam, "Unknown")
|
|
752
|
+
inh = inherited_by_family.get(fam, 0)
|
|
753
|
+
dist = distributed_by_family.get(fam, 0)
|
|
754
|
+
gps = gap_by_family.get(fam, 0)
|
|
755
|
+
cov = round(((inh - gps) / inh * 100) if inh > 0 else 100.0, 1)
|
|
756
|
+
lines.append(f"| {fam} | {desc} | {inh} | {dist} | {gps} | {cov}% |")
|
|
757
|
+
|
|
758
|
+
lines.append("")
|
|
759
|
+
|
|
760
|
+
# Gap analysis
|
|
761
|
+
lines.extend([
|
|
762
|
+
"---",
|
|
763
|
+
"",
|
|
764
|
+
"## Gap Analysis",
|
|
765
|
+
"",
|
|
766
|
+
])
|
|
767
|
+
|
|
768
|
+
if not gaps:
|
|
769
|
+
lines.append("**No ATO gaps identified.** All controls have been distributed "
|
|
770
|
+
"to target microservices with adequate coverage.")
|
|
771
|
+
else:
|
|
772
|
+
lines.extend([
|
|
773
|
+
"| # | Control | Family | Title | Reason | Recommended Action |",
|
|
774
|
+
"|---|---------|--------|-------|--------|--------------------|",
|
|
775
|
+
])
|
|
776
|
+
for i, g in enumerate(gaps, 1):
|
|
777
|
+
family = g["family"]
|
|
778
|
+
# Generate remediation recommendation based on gap reason
|
|
779
|
+
if "No microservice assigned" in g["reason"]:
|
|
780
|
+
rec = f"Assign {g['control_id']} to appropriate service(s) or create a shared security service"
|
|
781
|
+
else:
|
|
782
|
+
rec = f"Update implementation to reflect distributed architecture for {g['control_id']}"
|
|
783
|
+
lines.append(
|
|
784
|
+
f"| {i} | {g['control_id']} | {family} | {g['title']} | "
|
|
785
|
+
f"{g['reason']} | {rec} |"
|
|
786
|
+
)
|
|
787
|
+
lines.append("")
|
|
788
|
+
|
|
789
|
+
# Risk assessment
|
|
790
|
+
lines.extend([
|
|
791
|
+
"---",
|
|
792
|
+
"",
|
|
793
|
+
"## Risk Assessment",
|
|
794
|
+
"",
|
|
795
|
+
])
|
|
796
|
+
|
|
797
|
+
if family_risk_details:
|
|
798
|
+
lines.extend([
|
|
799
|
+
"| Family | Gaps | Risk Weight | Risk Score | Criticality | Remediation (weeks) |",
|
|
800
|
+
"|--------|------|-------------|------------|-------------|---------------------|",
|
|
801
|
+
])
|
|
802
|
+
for frd in sorted(family_risk_details, key=lambda x: x["risk_score"], reverse=True):
|
|
803
|
+
lines.append(
|
|
804
|
+
f"| {frd['family']} | {frd['gap_count']} | {frd['risk_weight']} | "
|
|
805
|
+
f"{frd['risk_score']} | {frd['criticality'].upper()} | {frd['remediation_weeks']} |"
|
|
806
|
+
)
|
|
807
|
+
lines.extend([
|
|
808
|
+
"",
|
|
809
|
+
f"**Total Risk Score:** {total_risk_score}",
|
|
810
|
+
f"**Overall Risk Level:** {overall_risk}",
|
|
811
|
+
"",
|
|
812
|
+
])
|
|
813
|
+
else:
|
|
814
|
+
lines.append("No risks identified -- all controls have adequate coverage.")
|
|
815
|
+
lines.append("")
|
|
816
|
+
|
|
817
|
+
# Timeline impact
|
|
818
|
+
lines.extend([
|
|
819
|
+
"---",
|
|
820
|
+
"",
|
|
821
|
+
"## Timeline Impact",
|
|
822
|
+
"",
|
|
823
|
+
f"Based on gap analysis, an estimated **{total_remediation_weeks} additional weeks** "
|
|
824
|
+
"may be required for compliance remediation before the migrated system can achieve ATO.",
|
|
825
|
+
"",
|
|
826
|
+
"Breakdown by criticality tier:",
|
|
827
|
+
"",
|
|
828
|
+
])
|
|
829
|
+
|
|
830
|
+
tier_weeks = collections.Counter()
|
|
831
|
+
for frd in family_risk_details:
|
|
832
|
+
tier_weeks[frd["criticality"]] += frd["remediation_weeks"]
|
|
833
|
+
|
|
834
|
+
for tier in ["critical", "high", "medium", "low"]:
|
|
835
|
+
if tier_weeks.get(tier, 0) > 0:
|
|
836
|
+
lines.append(f"- **{tier.upper()}:** {tier_weeks[tier]} weeks")
|
|
837
|
+
|
|
838
|
+
if total_remediation_weeks == 0:
|
|
839
|
+
lines.append("- No additional time required -- compliance posture is maintained.")
|
|
840
|
+
|
|
841
|
+
lines.extend([
|
|
842
|
+
"",
|
|
843
|
+
"---",
|
|
844
|
+
"",
|
|
845
|
+
"## Recommendations",
|
|
846
|
+
"",
|
|
847
|
+
"1. Address all CRITICAL and HIGH risk gaps before proceeding with production cutover.",
|
|
848
|
+
"2. Create a shared security service to host cross-cutting controls (AC, AU, IA).",
|
|
849
|
+
"3. Implement centralized audit logging to maintain AU family coverage across all services.",
|
|
850
|
+
"4. Update System Security Plan (SSP) to reflect the new distributed architecture.",
|
|
851
|
+
"5. Schedule an incremental ATO assessment for each migrated service boundary.",
|
|
852
|
+
"",
|
|
853
|
+
"---",
|
|
854
|
+
"",
|
|
855
|
+
CUI_FOOTER,
|
|
856
|
+
"",
|
|
857
|
+
])
|
|
858
|
+
|
|
859
|
+
content = "\n".join(lines)
|
|
860
|
+
|
|
861
|
+
if output_dir:
|
|
862
|
+
output_path = Path(output_dir)
|
|
863
|
+
output_path.mkdir(parents=True, exist_ok=True)
|
|
864
|
+
filename = f"ato_impact_report_{plan_id}_{datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S')}.md"
|
|
865
|
+
file_path = output_path / filename
|
|
866
|
+
with open(str(file_path), "w", encoding="utf-8") as f:
|
|
867
|
+
f.write(content)
|
|
868
|
+
print(f"[INFO] ATO impact report written to {file_path}")
|
|
869
|
+
return str(file_path)
|
|
870
|
+
|
|
871
|
+
return content
|
|
872
|
+
|
|
873
|
+
|
|
874
|
+
# ---------------------------------------------------------------------------
|
|
875
|
+
# 5. Create compliance digital thread
|
|
876
|
+
# ---------------------------------------------------------------------------
|
|
877
|
+
|
|
878
|
+
def create_compliance_thread(plan_id):
|
|
879
|
+
"""Create a full digital thread linking legacy components through migration
|
|
880
|
+
tasks to NIST controls for end-to-end compliance traceability.
|
|
881
|
+
|
|
882
|
+
For each migration task in the plan:
|
|
883
|
+
1. Link legacy_component -> migration_task (migrates_to)
|
|
884
|
+
2. If task has output code: link migration_task -> code_module (implements)
|
|
885
|
+
3. Link code_module -> nist_control (satisfies) based on distributed controls
|
|
886
|
+
|
|
887
|
+
Args:
|
|
888
|
+
plan_id: Migration plan ID.
|
|
889
|
+
|
|
890
|
+
Returns:
|
|
891
|
+
dict with keys:
|
|
892
|
+
links_created: int total new links
|
|
893
|
+
coverage_pct: float percentage of controls with thread links
|
|
894
|
+
"""
|
|
895
|
+
conn = _get_db()
|
|
896
|
+
try:
|
|
897
|
+
plan = _get_plan_info(conn, plan_id)
|
|
898
|
+
legacy_app_id = plan["legacy_app_id"]
|
|
899
|
+
project_id = _get_legacy_app_project_id(conn, legacy_app_id)
|
|
900
|
+
|
|
901
|
+
# Get all migration tasks for this plan
|
|
902
|
+
tasks = conn.execute(
|
|
903
|
+
"SELECT * FROM migration_tasks WHERE plan_id = ?",
|
|
904
|
+
(plan_id,),
|
|
905
|
+
).fetchall()
|
|
906
|
+
|
|
907
|
+
links_created = 0
|
|
908
|
+
now = datetime.now(timezone.utc).isoformat()
|
|
909
|
+
|
|
910
|
+
for task in tasks:
|
|
911
|
+
task_id = task["id"]
|
|
912
|
+
comp_id = task["legacy_component_id"]
|
|
913
|
+
|
|
914
|
+
# 1. Link legacy_component -> migration_task
|
|
915
|
+
if comp_id:
|
|
916
|
+
try:
|
|
917
|
+
conn.execute(
|
|
918
|
+
"""INSERT OR IGNORE INTO digital_thread_links
|
|
919
|
+
(project_id, source_type, source_id,
|
|
920
|
+
target_type, target_id, link_type,
|
|
921
|
+
confidence, evidence, created_by, created_at)
|
|
922
|
+
VALUES (?, 'legacy_component', ?,
|
|
923
|
+
'migration_task', ?, 'migrates_to',
|
|
924
|
+
1.0, ?, 'compliance-bridge', ?)""",
|
|
925
|
+
(
|
|
926
|
+
project_id, comp_id, task_id,
|
|
927
|
+
json.dumps({"task_type": task["task_type"],
|
|
928
|
+
"title": task["title"]}),
|
|
929
|
+
now,
|
|
930
|
+
),
|
|
931
|
+
)
|
|
932
|
+
links_created += 1
|
|
933
|
+
except sqlite3.IntegrityError:
|
|
934
|
+
pass
|
|
935
|
+
|
|
936
|
+
# 2. If task has output code, link migration_task -> code_module
|
|
937
|
+
output_path = task["output_path"]
|
|
938
|
+
if output_path:
|
|
939
|
+
code_module_id = f"{task_id}::output"
|
|
940
|
+
try:
|
|
941
|
+
conn.execute(
|
|
942
|
+
"""INSERT OR IGNORE INTO digital_thread_links
|
|
943
|
+
(project_id, source_type, source_id,
|
|
944
|
+
target_type, target_id, link_type,
|
|
945
|
+
confidence, evidence, created_by, created_at)
|
|
946
|
+
VALUES (?, 'migration_task', ?,
|
|
947
|
+
'code_module', ?, 'implements',
|
|
948
|
+
0.9, ?, 'compliance-bridge', ?)""",
|
|
949
|
+
(
|
|
950
|
+
project_id, task_id, code_module_id,
|
|
951
|
+
json.dumps({"output_path": output_path}),
|
|
952
|
+
now,
|
|
953
|
+
),
|
|
954
|
+
)
|
|
955
|
+
links_created += 1
|
|
956
|
+
except sqlite3.IntegrityError:
|
|
957
|
+
pass
|
|
958
|
+
|
|
959
|
+
# 3. Link code_module -> nist_control (satisfies)
|
|
960
|
+
# Find distributed controls relevant to this task's service context
|
|
961
|
+
distributed = conn.execute(
|
|
962
|
+
"""SELECT source_id AS control_id
|
|
963
|
+
FROM digital_thread_links
|
|
964
|
+
WHERE project_id = ?
|
|
965
|
+
AND source_type = 'nist_control'
|
|
966
|
+
AND target_type = 'migration_task'
|
|
967
|
+
AND target_id LIKE ?
|
|
968
|
+
AND link_type = 'traces_to'""",
|
|
969
|
+
(project_id, f"{plan_id}::%"),
|
|
970
|
+
).fetchall()
|
|
971
|
+
|
|
972
|
+
for d_row in distributed:
|
|
973
|
+
try:
|
|
974
|
+
conn.execute(
|
|
975
|
+
"""INSERT OR IGNORE INTO digital_thread_links
|
|
976
|
+
(project_id, source_type, source_id,
|
|
977
|
+
target_type, target_id, link_type,
|
|
978
|
+
confidence, evidence, created_by, created_at)
|
|
979
|
+
VALUES (?, 'code_module', ?,
|
|
980
|
+
'nist_control', ?, 'satisfies',
|
|
981
|
+
0.8, ?, 'compliance-bridge', ?)""",
|
|
982
|
+
(
|
|
983
|
+
project_id, code_module_id,
|
|
984
|
+
d_row["control_id"],
|
|
985
|
+
json.dumps({"source_task": task_id}),
|
|
986
|
+
now,
|
|
987
|
+
),
|
|
988
|
+
)
|
|
989
|
+
links_created += 1
|
|
990
|
+
except sqlite3.IntegrityError:
|
|
991
|
+
pass
|
|
992
|
+
|
|
993
|
+
# Calculate coverage: how many inherited controls have a satisfies link?
|
|
994
|
+
inherited_rows = conn.execute(
|
|
995
|
+
"""SELECT source_id AS control_id
|
|
996
|
+
FROM digital_thread_links
|
|
997
|
+
WHERE project_id = ?
|
|
998
|
+
AND source_type = 'nist_control'
|
|
999
|
+
AND target_type = 'migration_task'
|
|
1000
|
+
AND target_id = ?
|
|
1001
|
+
AND link_type = 'traces_to'""",
|
|
1002
|
+
(project_id, plan_id),
|
|
1003
|
+
).fetchall()
|
|
1004
|
+
inherited_set = {r["control_id"] for r in inherited_rows}
|
|
1005
|
+
|
|
1006
|
+
satisfied_rows = conn.execute(
|
|
1007
|
+
"""SELECT target_id AS control_id
|
|
1008
|
+
FROM digital_thread_links
|
|
1009
|
+
WHERE project_id = ?
|
|
1010
|
+
AND source_type = 'code_module'
|
|
1011
|
+
AND target_type = 'nist_control'
|
|
1012
|
+
AND link_type = 'satisfies'""",
|
|
1013
|
+
(project_id,),
|
|
1014
|
+
).fetchall()
|
|
1015
|
+
satisfied_set = {r["control_id"] for r in satisfied_rows}
|
|
1016
|
+
|
|
1017
|
+
covered = inherited_set & satisfied_set
|
|
1018
|
+
coverage_pct = round(
|
|
1019
|
+
(len(covered) / len(inherited_set) * 100)
|
|
1020
|
+
if inherited_set else 0.0, 2
|
|
1021
|
+
)
|
|
1022
|
+
|
|
1023
|
+
_log_audit(conn, project_id, "digital_thread_linked",
|
|
1024
|
+
f"Created compliance thread for plan {plan_id}",
|
|
1025
|
+
{"links_created": links_created, "coverage_pct": coverage_pct})
|
|
1026
|
+
|
|
1027
|
+
conn.commit()
|
|
1028
|
+
|
|
1029
|
+
result = {
|
|
1030
|
+
"links_created": links_created,
|
|
1031
|
+
"coverage_pct": coverage_pct,
|
|
1032
|
+
}
|
|
1033
|
+
print(f"[INFO] Compliance thread created for plan {plan_id}")
|
|
1034
|
+
print(f" Links created: {links_created}")
|
|
1035
|
+
print(f" Coverage: {coverage_pct}%")
|
|
1036
|
+
return result
|
|
1037
|
+
|
|
1038
|
+
finally:
|
|
1039
|
+
conn.close()
|
|
1040
|
+
|
|
1041
|
+
|
|
1042
|
+
# ---------------------------------------------------------------------------
|
|
1043
|
+
# 6. Validate ATO coverage
|
|
1044
|
+
# ---------------------------------------------------------------------------
|
|
1045
|
+
|
|
1046
|
+
def validate_ato_coverage(plan_id):
|
|
1047
|
+
"""Verify that no NIST control coverage is lost after migration.
|
|
1048
|
+
|
|
1049
|
+
Compares the pre-migration control count (from project_controls) against
|
|
1050
|
+
the post-migration coverage (from digital_thread_links). Ensures each
|
|
1051
|
+
control family retains at least the same level of coverage.
|
|
1052
|
+
|
|
1053
|
+
Args:
|
|
1054
|
+
plan_id: Migration plan ID.
|
|
1055
|
+
|
|
1056
|
+
Returns:
|
|
1057
|
+
dict with keys:
|
|
1058
|
+
valid: bool (True if no coverage lost)
|
|
1059
|
+
pre_count: int controls before migration
|
|
1060
|
+
post_count: int controls with post-migration coverage
|
|
1061
|
+
coverage_delta: int (post - pre, 0 or positive is good)
|
|
1062
|
+
failures: list of {control_id, reason}
|
|
1063
|
+
"""
|
|
1064
|
+
conn = _get_db()
|
|
1065
|
+
try:
|
|
1066
|
+
plan = _get_plan_info(conn, plan_id)
|
|
1067
|
+
legacy_app_id = plan["legacy_app_id"]
|
|
1068
|
+
project_id = _get_legacy_app_project_id(conn, legacy_app_id)
|
|
1069
|
+
|
|
1070
|
+
# Pre-migration: all implemented/partially_implemented controls
|
|
1071
|
+
pre_rows = conn.execute(
|
|
1072
|
+
"""SELECT control_id, implementation_status
|
|
1073
|
+
FROM project_controls
|
|
1074
|
+
WHERE project_id = ?
|
|
1075
|
+
AND implementation_status IN ('implemented', 'partially_implemented')
|
|
1076
|
+
ORDER BY control_id""",
|
|
1077
|
+
(project_id,),
|
|
1078
|
+
).fetchall()
|
|
1079
|
+
pre_controls = {r["control_id"] for r in pre_rows}
|
|
1080
|
+
pre_by_family = collections.Counter()
|
|
1081
|
+
for r in pre_rows:
|
|
1082
|
+
pre_by_family[_get_control_family(r["control_id"])] += 1
|
|
1083
|
+
|
|
1084
|
+
# Post-migration: controls linked via digital thread
|
|
1085
|
+
# A control is "covered" if it has a traces_to link to the plan
|
|
1086
|
+
# AND either a distribution link or a satisfies link
|
|
1087
|
+
post_distributed = conn.execute(
|
|
1088
|
+
"""SELECT DISTINCT source_id AS control_id
|
|
1089
|
+
FROM digital_thread_links
|
|
1090
|
+
WHERE project_id = ?
|
|
1091
|
+
AND source_type = 'nist_control'
|
|
1092
|
+
AND target_type = 'migration_task'
|
|
1093
|
+
AND (target_id = ? OR target_id LIKE ?)
|
|
1094
|
+
AND link_type = 'traces_to'""",
|
|
1095
|
+
(project_id, plan_id, f"{plan_id}::%"),
|
|
1096
|
+
).fetchall()
|
|
1097
|
+
post_controls = {r["control_id"] for r in post_distributed}
|
|
1098
|
+
post_by_family = collections.Counter()
|
|
1099
|
+
for r in post_distributed:
|
|
1100
|
+
post_by_family[_get_control_family(r["control_id"])] += 1
|
|
1101
|
+
|
|
1102
|
+
# Validation: check each pre-migration control has post coverage
|
|
1103
|
+
failures = []
|
|
1104
|
+
|
|
1105
|
+
for control_id in sorted(pre_controls):
|
|
1106
|
+
if control_id not in post_controls:
|
|
1107
|
+
failures.append({
|
|
1108
|
+
"control_id": control_id,
|
|
1109
|
+
"reason": "Control not found in post-migration digital thread",
|
|
1110
|
+
})
|
|
1111
|
+
|
|
1112
|
+
# Check family-level coverage
|
|
1113
|
+
for family, pre_count in sorted(pre_by_family.items()):
|
|
1114
|
+
post_count = post_by_family.get(family, 0)
|
|
1115
|
+
if post_count < pre_count:
|
|
1116
|
+
delta = pre_count - post_count
|
|
1117
|
+
failures.append({
|
|
1118
|
+
"control_id": f"{family}-*",
|
|
1119
|
+
"reason": (f"Family {family} lost coverage: "
|
|
1120
|
+
f"{pre_count} pre-migration vs {post_count} post-migration "
|
|
1121
|
+
f"({delta} controls lost)"),
|
|
1122
|
+
})
|
|
1123
|
+
|
|
1124
|
+
valid = len(failures) == 0
|
|
1125
|
+
pre_total = len(pre_controls)
|
|
1126
|
+
post_total = len(post_controls)
|
|
1127
|
+
coverage_delta = post_total - pre_total
|
|
1128
|
+
|
|
1129
|
+
result = {
|
|
1130
|
+
"valid": valid,
|
|
1131
|
+
"pre_count": pre_total,
|
|
1132
|
+
"post_count": post_total,
|
|
1133
|
+
"coverage_delta": coverage_delta,
|
|
1134
|
+
"failures": failures,
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
_log_audit(conn, project_id, "compliance_check",
|
|
1138
|
+
f"ATO coverage validation: {'PASS' if valid else 'FAIL'} for plan {plan_id}",
|
|
1139
|
+
result)
|
|
1140
|
+
|
|
1141
|
+
conn.commit()
|
|
1142
|
+
|
|
1143
|
+
status_str = "PASS" if valid else "FAIL"
|
|
1144
|
+
print(f"[INFO] ATO coverage validation: {status_str}")
|
|
1145
|
+
print(f" Pre-migration controls: {pre_total}")
|
|
1146
|
+
print(f" Post-migration controls: {post_total}")
|
|
1147
|
+
print(f" Coverage delta: {coverage_delta:+d}")
|
|
1148
|
+
if failures:
|
|
1149
|
+
print(f" Failures ({len(failures)}):")
|
|
1150
|
+
for f in failures:
|
|
1151
|
+
print(f" {f['control_id']}: {f['reason']}")
|
|
1152
|
+
|
|
1153
|
+
return result
|
|
1154
|
+
|
|
1155
|
+
finally:
|
|
1156
|
+
conn.close()
|
|
1157
|
+
|
|
1158
|
+
|
|
1159
|
+
# ---------------------------------------------------------------------------
|
|
1160
|
+
# 7. Compliance dashboard
|
|
1161
|
+
# ---------------------------------------------------------------------------
|
|
1162
|
+
|
|
1163
|
+
def get_compliance_dashboard(plan_id):
|
|
1164
|
+
"""Generate a summary compliance dashboard for the migration plan.
|
|
1165
|
+
|
|
1166
|
+
Returns a comprehensive status view including:
|
|
1167
|
+
- Total controls in scope and coverage percentages
|
|
1168
|
+
- Controls at risk with details
|
|
1169
|
+
- Per-family status breakdown
|
|
1170
|
+
- Migration compliance gate (PASS/FAIL at 95% threshold)
|
|
1171
|
+
|
|
1172
|
+
Args:
|
|
1173
|
+
plan_id: Migration plan ID.
|
|
1174
|
+
|
|
1175
|
+
Returns:
|
|
1176
|
+
Dashboard dict with full status information.
|
|
1177
|
+
"""
|
|
1178
|
+
conn = _get_db()
|
|
1179
|
+
try:
|
|
1180
|
+
plan = _get_plan_info(conn, plan_id)
|
|
1181
|
+
legacy_app_id = plan["legacy_app_id"]
|
|
1182
|
+
project_id = _get_legacy_app_project_id(conn, legacy_app_id)
|
|
1183
|
+
|
|
1184
|
+
# Total controls in scope (inherited)
|
|
1185
|
+
inherited_rows = conn.execute(
|
|
1186
|
+
"""SELECT source_id AS control_id
|
|
1187
|
+
FROM digital_thread_links
|
|
1188
|
+
WHERE project_id = ?
|
|
1189
|
+
AND source_type = 'nist_control'
|
|
1190
|
+
AND target_type = 'migration_task'
|
|
1191
|
+
AND target_id = ?
|
|
1192
|
+
AND link_type = 'traces_to'""",
|
|
1193
|
+
(project_id, plan_id),
|
|
1194
|
+
).fetchall()
|
|
1195
|
+
total_in_scope = len(inherited_rows)
|
|
1196
|
+
inherited_set = {r["control_id"] for r in inherited_rows}
|
|
1197
|
+
|
|
1198
|
+
# Distributed controls
|
|
1199
|
+
distributed_rows = conn.execute(
|
|
1200
|
+
"""SELECT DISTINCT source_id AS control_id
|
|
1201
|
+
FROM digital_thread_links
|
|
1202
|
+
WHERE project_id = ?
|
|
1203
|
+
AND source_type = 'nist_control'
|
|
1204
|
+
AND target_type = 'migration_task'
|
|
1205
|
+
AND target_id LIKE ?
|
|
1206
|
+
AND link_type = 'traces_to'""",
|
|
1207
|
+
(project_id, f"{plan_id}::%"),
|
|
1208
|
+
).fetchall()
|
|
1209
|
+
{r["control_id"] for r in distributed_rows}
|
|
1210
|
+
|
|
1211
|
+
finally:
|
|
1212
|
+
conn.close()
|
|
1213
|
+
|
|
1214
|
+
# Run gap analysis (uses its own connection)
|
|
1215
|
+
gap_result = identify_ato_gaps(plan_id)
|
|
1216
|
+
gap_controls = {g["control_id"] for g in gap_result["gaps"]}
|
|
1217
|
+
|
|
1218
|
+
# Compute covered vs at-risk
|
|
1219
|
+
covered_set = inherited_set - gap_controls
|
|
1220
|
+
covered_count = len(covered_set)
|
|
1221
|
+
at_risk_count = len(gap_controls)
|
|
1222
|
+
coverage_pct = round(
|
|
1223
|
+
(covered_count / total_in_scope * 100) if total_in_scope > 0 else 0.0, 2
|
|
1224
|
+
)
|
|
1225
|
+
|
|
1226
|
+
# Per-family status
|
|
1227
|
+
family_status = {}
|
|
1228
|
+
for control_id in inherited_set:
|
|
1229
|
+
family = _get_control_family(control_id)
|
|
1230
|
+
if family not in family_status:
|
|
1231
|
+
family_status[family] = {"total": 0, "covered": 0, "at_risk": 0}
|
|
1232
|
+
family_status[family]["total"] += 1
|
|
1233
|
+
if control_id in gap_controls:
|
|
1234
|
+
family_status[family]["at_risk"] += 1
|
|
1235
|
+
else:
|
|
1236
|
+
family_status[family]["covered"] += 1
|
|
1237
|
+
|
|
1238
|
+
# Migration compliance gate
|
|
1239
|
+
gate = "PASS" if coverage_pct >= 95.0 else "FAIL"
|
|
1240
|
+
|
|
1241
|
+
dashboard = {
|
|
1242
|
+
"plan_id": plan_id,
|
|
1243
|
+
"legacy_app_id": legacy_app_id,
|
|
1244
|
+
"strategy": plan.get("strategy", "N/A"),
|
|
1245
|
+
"target_architecture": plan.get("target_architecture", "N/A"),
|
|
1246
|
+
"plan_status": plan.get("status", "N/A"),
|
|
1247
|
+
"total_controls_in_scope": total_in_scope,
|
|
1248
|
+
"controls_with_coverage": covered_count,
|
|
1249
|
+
"controls_with_coverage_pct": coverage_pct,
|
|
1250
|
+
"controls_at_risk": at_risk_count,
|
|
1251
|
+
"controls_at_risk_list": sorted(gap_controls),
|
|
1252
|
+
"per_family_status": {
|
|
1253
|
+
fam: family_status[fam]
|
|
1254
|
+
for fam in sorted(family_status.keys())
|
|
1255
|
+
},
|
|
1256
|
+
"migration_compliance_gate": gate,
|
|
1257
|
+
"gate_threshold_pct": 95.0,
|
|
1258
|
+
"generated_at": datetime.now(timezone.utc).isoformat(),
|
|
1259
|
+
}
|
|
1260
|
+
|
|
1261
|
+
return dashboard
|
|
1262
|
+
|
|
1263
|
+
|
|
1264
|
+
def _format_dashboard(dashboard):
|
|
1265
|
+
"""Format dashboard dict as human-readable console output."""
|
|
1266
|
+
lines = [
|
|
1267
|
+
"",
|
|
1268
|
+
"=" * 65,
|
|
1269
|
+
" COMPLIANCE MIGRATION DASHBOARD",
|
|
1270
|
+
"=" * 65,
|
|
1271
|
+
f" Plan: {dashboard['plan_id']}",
|
|
1272
|
+
f" Legacy App: {dashboard['legacy_app_id']}",
|
|
1273
|
+
f" Strategy: {dashboard['strategy']}",
|
|
1274
|
+
f" Architecture: {dashboard['target_architecture']}",
|
|
1275
|
+
f" Plan Status: {dashboard['plan_status']}",
|
|
1276
|
+
f" Generated: {dashboard['generated_at']}",
|
|
1277
|
+
"",
|
|
1278
|
+
"-" * 65,
|
|
1279
|
+
" CONTROL COVERAGE",
|
|
1280
|
+
"-" * 65,
|
|
1281
|
+
f" Total in scope: {dashboard['total_controls_in_scope']}",
|
|
1282
|
+
f" With coverage: {dashboard['controls_with_coverage']} "
|
|
1283
|
+
f"({dashboard['controls_with_coverage_pct']}%)",
|
|
1284
|
+
f" At risk: {dashboard['controls_at_risk']}",
|
|
1285
|
+
"",
|
|
1286
|
+
]
|
|
1287
|
+
|
|
1288
|
+
if dashboard["controls_at_risk_list"]:
|
|
1289
|
+
lines.append(" At-risk controls:")
|
|
1290
|
+
for ctrl in dashboard["controls_at_risk_list"]:
|
|
1291
|
+
lines.append(f" - {ctrl}")
|
|
1292
|
+
lines.append("")
|
|
1293
|
+
|
|
1294
|
+
lines.extend([
|
|
1295
|
+
"-" * 65,
|
|
1296
|
+
" PER-FAMILY STATUS",
|
|
1297
|
+
"-" * 65,
|
|
1298
|
+
f" {'Family':<8} {'Total':>6} {'Covered':>8} {'At Risk':>8} Status",
|
|
1299
|
+
f" {'-'*8} {'-'*6} {'-'*8} {'-'*8} {'-'*8}",
|
|
1300
|
+
])
|
|
1301
|
+
|
|
1302
|
+
for fam, info in sorted(dashboard["per_family_status"].items()):
|
|
1303
|
+
status = "OK" if info["at_risk"] == 0 else "AT RISK"
|
|
1304
|
+
lines.append(
|
|
1305
|
+
f" {fam:<8} {info['total']:>6} {info['covered']:>8} "
|
|
1306
|
+
f"{info['at_risk']:>8} {status}"
|
|
1307
|
+
)
|
|
1308
|
+
|
|
1309
|
+
lines.extend([
|
|
1310
|
+
"",
|
|
1311
|
+
"-" * 65,
|
|
1312
|
+
f" MIGRATION COMPLIANCE GATE: {dashboard['migration_compliance_gate']}",
|
|
1313
|
+
f" (Threshold: >= {dashboard['gate_threshold_pct']}% coverage)",
|
|
1314
|
+
"=" * 65,
|
|
1315
|
+
"",
|
|
1316
|
+
])
|
|
1317
|
+
|
|
1318
|
+
return "\n".join(lines)
|
|
1319
|
+
|
|
1320
|
+
|
|
1321
|
+
# ---------------------------------------------------------------------------
|
|
1322
|
+
# CLI interface
|
|
1323
|
+
# ---------------------------------------------------------------------------
|
|
1324
|
+
|
|
1325
|
+
def main():
|
|
1326
|
+
"""Command-line entry point for the ATO-aware compliance bridge."""
|
|
1327
|
+
parser = argparse.ArgumentParser(
|
|
1328
|
+
description="CUI // SP-CTI -- ATO-Aware Compliance Bridge for Migration",
|
|
1329
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
1330
|
+
epilog=textwrap.dedent("""\
|
|
1331
|
+
Examples:
|
|
1332
|
+
# Inherit controls from monolith
|
|
1333
|
+
python tools/modernization/compliance_bridge.py \\
|
|
1334
|
+
--plan-id mplan-abc123 --inherit
|
|
1335
|
+
|
|
1336
|
+
# Distribute controls with service map
|
|
1337
|
+
python tools/modernization/compliance_bridge.py \\
|
|
1338
|
+
--plan-id mplan-abc123 --distribute \\
|
|
1339
|
+
--service-map services.json
|
|
1340
|
+
|
|
1341
|
+
# Full ATO impact report
|
|
1342
|
+
python tools/modernization/compliance_bridge.py \\
|
|
1343
|
+
--plan-id mplan-abc123 --report \\
|
|
1344
|
+
--output-dir /opt/reports
|
|
1345
|
+
|
|
1346
|
+
# Validate coverage
|
|
1347
|
+
python tools/modernization/compliance_bridge.py \\
|
|
1348
|
+
--plan-id mplan-abc123 --validate --json
|
|
1349
|
+
|
|
1350
|
+
Classification: CUI // SP-CTI
|
|
1351
|
+
"""),
|
|
1352
|
+
)
|
|
1353
|
+
|
|
1354
|
+
parser.add_argument(
|
|
1355
|
+
"--plan-id", required=True,
|
|
1356
|
+
help="Migration plan ID (required for all operations)",
|
|
1357
|
+
)
|
|
1358
|
+
|
|
1359
|
+
# Action flags
|
|
1360
|
+
parser.add_argument(
|
|
1361
|
+
"--inherit", action="store_true",
|
|
1362
|
+
help="Inherit NIST control mappings from legacy monolith to plan",
|
|
1363
|
+
)
|
|
1364
|
+
parser.add_argument(
|
|
1365
|
+
"--distribute", action="store_true",
|
|
1366
|
+
help="Distribute inherited controls across extracted services",
|
|
1367
|
+
)
|
|
1368
|
+
parser.add_argument(
|
|
1369
|
+
"--service-map",
|
|
1370
|
+
help="Path to JSON file mapping service names to component IDs "
|
|
1371
|
+
"(required with --distribute)",
|
|
1372
|
+
)
|
|
1373
|
+
parser.add_argument(
|
|
1374
|
+
"--gaps", action="store_true",
|
|
1375
|
+
help="Identify ATO coverage gaps in the migration",
|
|
1376
|
+
)
|
|
1377
|
+
parser.add_argument(
|
|
1378
|
+
"--report", action="store_true",
|
|
1379
|
+
help="Generate ATO impact analysis report",
|
|
1380
|
+
)
|
|
1381
|
+
parser.add_argument(
|
|
1382
|
+
"--output-dir",
|
|
1383
|
+
help="Output directory for report file (used with --report)",
|
|
1384
|
+
)
|
|
1385
|
+
parser.add_argument(
|
|
1386
|
+
"--thread", action="store_true",
|
|
1387
|
+
help="Create full compliance digital thread",
|
|
1388
|
+
)
|
|
1389
|
+
parser.add_argument(
|
|
1390
|
+
"--validate", action="store_true",
|
|
1391
|
+
help="Validate that ATO coverage is maintained post-migration",
|
|
1392
|
+
)
|
|
1393
|
+
parser.add_argument(
|
|
1394
|
+
"--dashboard", action="store_true",
|
|
1395
|
+
help="Show compliance migration dashboard",
|
|
1396
|
+
)
|
|
1397
|
+
parser.add_argument(
|
|
1398
|
+
"--json", action="store_true", dest="json_output",
|
|
1399
|
+
help="Output results as JSON",
|
|
1400
|
+
)
|
|
1401
|
+
|
|
1402
|
+
args = parser.parse_args()
|
|
1403
|
+
|
|
1404
|
+
# Validate at least one action was requested
|
|
1405
|
+
actions = [args.inherit, args.distribute, args.gaps, args.report,
|
|
1406
|
+
args.thread, args.validate, args.dashboard]
|
|
1407
|
+
if not any(actions):
|
|
1408
|
+
parser.error("At least one action flag is required: "
|
|
1409
|
+
"--inherit, --distribute, --gaps, --report, --thread, "
|
|
1410
|
+
"--validate, or --dashboard")
|
|
1411
|
+
|
|
1412
|
+
try:
|
|
1413
|
+
# --- Inherit ---
|
|
1414
|
+
if args.inherit:
|
|
1415
|
+
conn = _get_db()
|
|
1416
|
+
try:
|
|
1417
|
+
plan = _get_plan_info(conn, args.plan_id)
|
|
1418
|
+
legacy_app_id = plan["legacy_app_id"]
|
|
1419
|
+
finally:
|
|
1420
|
+
conn.close()
|
|
1421
|
+
|
|
1422
|
+
result = inherit_controls(legacy_app_id, args.plan_id)
|
|
1423
|
+
if args.json_output:
|
|
1424
|
+
print(json.dumps(result, indent=2))
|
|
1425
|
+
|
|
1426
|
+
# --- Distribute ---
|
|
1427
|
+
if args.distribute:
|
|
1428
|
+
if not args.service_map:
|
|
1429
|
+
parser.error("--service-map is required with --distribute")
|
|
1430
|
+
smap_path = Path(args.service_map)
|
|
1431
|
+
if not smap_path.exists():
|
|
1432
|
+
raise FileNotFoundError(
|
|
1433
|
+
f"Service map file not found: {smap_path}"
|
|
1434
|
+
)
|
|
1435
|
+
with open(str(smap_path), "r", encoding="utf-8") as f:
|
|
1436
|
+
service_map = json.load(f)
|
|
1437
|
+
|
|
1438
|
+
result = distribute_controls(args.plan_id, service_map)
|
|
1439
|
+
if args.json_output:
|
|
1440
|
+
print(json.dumps(result, indent=2))
|
|
1441
|
+
|
|
1442
|
+
# --- Gaps ---
|
|
1443
|
+
if args.gaps:
|
|
1444
|
+
result = identify_ato_gaps(args.plan_id)
|
|
1445
|
+
if args.json_output:
|
|
1446
|
+
print(json.dumps(result, indent=2))
|
|
1447
|
+
|
|
1448
|
+
# --- Report ---
|
|
1449
|
+
if args.report:
|
|
1450
|
+
result = generate_ato_impact_report(
|
|
1451
|
+
args.plan_id,
|
|
1452
|
+
output_dir=args.output_dir,
|
|
1453
|
+
)
|
|
1454
|
+
if args.json_output:
|
|
1455
|
+
if args.output_dir:
|
|
1456
|
+
print(json.dumps({"report_path": result}, indent=2))
|
|
1457
|
+
else:
|
|
1458
|
+
# result is the content string
|
|
1459
|
+
print(json.dumps({"report_content": result}, indent=2))
|
|
1460
|
+
elif not args.output_dir:
|
|
1461
|
+
# Print report to stdout
|
|
1462
|
+
print(result)
|
|
1463
|
+
|
|
1464
|
+
# --- Thread ---
|
|
1465
|
+
if args.thread:
|
|
1466
|
+
result = create_compliance_thread(args.plan_id)
|
|
1467
|
+
if args.json_output:
|
|
1468
|
+
print(json.dumps(result, indent=2))
|
|
1469
|
+
|
|
1470
|
+
# --- Validate ---
|
|
1471
|
+
if args.validate:
|
|
1472
|
+
result = validate_ato_coverage(args.plan_id)
|
|
1473
|
+
if args.json_output:
|
|
1474
|
+
print(json.dumps(result, indent=2))
|
|
1475
|
+
if not result["valid"]:
|
|
1476
|
+
raise SystemExit(1)
|
|
1477
|
+
|
|
1478
|
+
# --- Dashboard ---
|
|
1479
|
+
if args.dashboard:
|
|
1480
|
+
result = get_compliance_dashboard(args.plan_id)
|
|
1481
|
+
if args.json_output:
|
|
1482
|
+
print(json.dumps(result, indent=2))
|
|
1483
|
+
else:
|
|
1484
|
+
print(_format_dashboard(result))
|
|
1485
|
+
|
|
1486
|
+
except FileNotFoundError as exc:
|
|
1487
|
+
print(f"[ERROR] {exc}")
|
|
1488
|
+
raise SystemExit(1)
|
|
1489
|
+
except ValueError as exc:
|
|
1490
|
+
print(f"[ERROR] {exc}")
|
|
1491
|
+
raise SystemExit(1)
|
|
1492
|
+
except sqlite3.Error as exc:
|
|
1493
|
+
print(f"[ERROR] Database error: {exc}")
|
|
1494
|
+
raise SystemExit(1)
|
|
1495
|
+
|
|
1496
|
+
|
|
1497
|
+
if __name__ == "__main__":
|
|
1498
|
+
main()
|
|
1499
|
+
# [TEMPLATE: CUI // SP-CTI]
|