icdev 0.0.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- args/agent_config.yaml +113 -0
- args/audit_regimes/cisa_sbd.json +381 -0
- args/audit_regimes/cmmc_l2.json +906 -0
- args/audit_regimes/dod_cssp.json +393 -0
- args/audit_regimes/dodi_5000_87.json +297 -0
- args/audit_regimes/fedramp_moderate.json +650 -0
- args/audit_regimes/ieee_1012.json +373 -0
- args/audit_regimes/nist_800_171.json +624 -0
- args/audit_regimes/nist_800_53.json +907 -0
- args/cloudforge_blueprints/aws_commercial.yaml +29 -0
- args/cloudforge_blueprints/aws_govcloud_il4.yaml +34 -0
- args/cloudforge_blueprints/aws_govcloud_il5.yaml +38 -0
- args/cloudforge_blueprints/azure_commercial.yaml +28 -0
- args/cloudforge_blueprints/azure_gov_il4.yaml +32 -0
- args/cloudforge_blueprints/azure_gov_il5.yaml +36 -0
- args/cloudforge_blueprints/gcp_commercial.yaml +28 -0
- args/cloudforge_blueprints/oci_commercial.yaml +28 -0
- args/cloudforge_config.yaml +231 -0
- args/cloudforge_runbook_templates/backup_verify.yaml +98 -0
- args/cloudforge_runbook_templates/dr_failover.yaml +107 -0
- args/cloudforge_runbook_templates/health_check.yaml +97 -0
- args/cloudforge_runbook_templates/incident_response.yaml +101 -0
- args/cloudforge_runbook_templates/migration_cutover.yaml +105 -0
- args/cloudforge_runbook_templates/patch_rollout.yaml +92 -0
- args/cloudforge_runbook_templates/zone_provision.yaml +93 -0
- args/code_pattern_config.yaml +151 -0
- args/code_quality_config.yaml +47 -0
- args/compliance_config.yaml +17 -0
- args/control_inheritance.yaml +177 -0
- args/csp_mcp_config.yaml +41 -0
- args/cui_markings.yaml +35 -0
- args/databridge_config.yaml +232 -0
- args/db_config.yaml +116 -0
- args/decision_tables/agent_trust_decision.yaml +143 -0
- args/decision_tables/ato_boundary_impact.yaml +132 -0
- args/decision_tables/deployment_approval.yaml +152 -0
- args/degradation_matrix.yaml +163 -0
- args/devsecops_config.yaml +286 -0
- args/endpoint_security_config.yaml +207 -0
- args/exit_criteria.yaml +102 -0
- args/feature_flags.yaml +235 -0
- args/file_access_tiers.yaml +88 -0
- args/forge_studio/blueprint_config.yaml +27 -0
- args/forge_studio/component_catalog.json +411 -0
- args/forge_studio/workflow_templates.yaml +103 -0
- args/govcon_config.yaml +41 -0
- args/harness_config.yaml +67 -0
- args/innovation_config.yaml +321 -0
- args/knowledge_graph_config.yaml +113 -0
- args/llm_config.yaml +222 -0
- args/marketplace_config.yaml +260 -0
- args/monitoring_config.yaml +127 -0
- args/mosa_config.yaml +190 -0
- args/observability_tracing_config.yaml +170 -0
- args/owasp_agentic_config.yaml +171 -0
- args/pipeline_gates.yaml +197 -0
- args/project_defaults.yaml +235 -0
- args/prompt_chains.yaml +163 -0
- args/rag_config.yaml +167 -0
- args/research_config.yaml +89 -0
- args/resilience_config.yaml +197 -0
- args/ricoas_config.yaml +191 -0
- args/security_gates.yaml +763 -0
- args/storage_config.yaml +63 -0
- args/writeguard_config.yaml +131 -0
- args/zta_config.yaml +247 -0
- context/__init__.py +6 -0
- context/agent/__init__.py +6 -0
- context/agent/response_schemas/__init__.py +6 -0
- context/agent/response_schemas/debate_position.json +46 -0
- context/agent/response_schemas/fitness_scorecard.json +74 -0
- context/agent/response_schemas/review_decision.json +39 -0
- context/agent/response_schemas/task_decomposition.json +82 -0
- context/agent/response_schemas/veto_decision.json +40 -0
- context/agentic/__init__.py +6 -0
- context/agentic/architecture_patterns.md +269 -0
- context/agentic/capability_registry.yaml +223 -0
- context/agentic/csp_integration.md +30 -0
- context/agentic/csp_mcp_registry.yaml +280 -0
- context/agentic/fitness_rubric.md +56 -0
- context/agentic/governance_baseline.md +205 -0
- context/ci/__init__.py +6 -0
- context/ci/worktree_templates.json +44 -0
- context/cloud/__init__.py +6 -0
- context/cloud/csp_service_registry.json +739 -0
- context/compliance/__init__.py +6 -0
- context/compliance/ai_rmf_crosswalk.yaml +226 -0
- context/compliance/atlas_mitigations.json +293 -0
- context/compliance/atlas_techniques.json +833 -0
- context/compliance/cisa_sbd_requirements.json +477 -0
- context/compliance/cjis_security_policy.json +522 -0
- context/compliance/cmmc_practices.json +2494 -0
- context/compliance/cmmc_report_template.md +142 -0
- context/compliance/cnssi_1253_overlay.json +109 -0
- context/compliance/control_crosswalk.json +1914 -0
- context/compliance/control_families/__init__.py +6 -0
- context/compliance/csp_certifications.json +251 -0
- context/compliance/cssp_report_template.md +193 -0
- context/compliance/cui_templates/__init__.py +6 -0
- context/compliance/cui_templates/banner_block.txt +4 -0
- context/compliance/cui_templates/code_header.txt +8 -0
- context/compliance/cui_templates/document_template.md +35 -0
- context/compliance/data_type_framework_map.json +321 -0
- context/compliance/data_type_registry.json +147 -0
- context/compliance/dod_cssp_8530.json +463 -0
- context/compliance/eu_ai_act_annex_iii.json +108 -0
- context/compliance/export_templates/__init__.py +6 -0
- context/compliance/export_templates/emass_controls.csv.j2 +4 -0
- context/compliance/export_templates/evidence_package.md.j2 +39 -0
- context/compliance/export_templates/executive_summary.md.j2 +55 -0
- context/compliance/export_templates/poam_tracking.csv.j2 +4 -0
- context/compliance/fedramp_20x_ksi_schemas.json +133 -0
- context/compliance/fedramp_high_baseline.json +4370 -0
- context/compliance/fedramp_moderate_baseline.json +2183 -0
- context/compliance/fedramp_report_template.md +181 -0
- context/compliance/fips_200_areas.json +362 -0
- context/compliance/gao_ai_accountability.json +262 -0
- context/compliance/hipaa_security_rule.json +720 -0
- context/compliance/hitrust_csf_v11.json +930 -0
- context/compliance/impact_level_profiles.json +251 -0
- context/compliance/incident_response_template.md +1110 -0
- context/compliance/iso27001_2022_controls.json +750 -0
- context/compliance/iso27001_nist_bridge.json +382 -0
- context/compliance/iso42001_controls.json +254 -0
- context/compliance/ivv_checklist_template.md +80 -0
- context/compliance/ivv_report_template.md +116 -0
- context/compliance/ivv_requirements.json +372 -0
- context/compliance/mosa_crosswalk.json +327 -0
- context/compliance/mosa_framework.json +250 -0
- context/compliance/narrative_templates/AC.md.j2 +101 -0
- context/compliance/narrative_templates/AU.md.j2 +106 -0
- context/compliance/narrative_templates/IA.md.j2 +104 -0
- context/compliance/narrative_templates/SC.md.j2 +102 -0
- context/compliance/narrative_templates/SI.md.j2 +111 -0
- context/compliance/narrative_templates/__init__.py +6 -0
- context/compliance/narrative_templates/default.md.j2 +50 -0
- context/compliance/narrative_templates/executive_summary.j2 +27 -0
- context/compliance/narrative_templates/poam_milestone.j2 +19 -0
- context/compliance/narrative_templates/ssp_section.j2 +11 -0
- context/compliance/nist_800_171_controls.json +1552 -0
- context/compliance/nist_800_207_crosswalk.json +399 -0
- context/compliance/nist_800_207_zta.json +258 -0
- context/compliance/nist_800_53.json +324 -0
- context/compliance/nist_ai_600_1_genai.json +326 -0
- context/compliance/nist_ai_rmf.json +206 -0
- context/compliance/nist_sp_800_60_types.json +1667 -0
- context/compliance/omb_m25_21_high_impact_ai.json +248 -0
- context/compliance/omb_m26_04_unbiased_ai.json +262 -0
- context/compliance/owasp_agentic_asi.json +133 -0
- context/compliance/owasp_agentic_threats.json +285 -0
- context/compliance/owasp_llm_top10.json +274 -0
- context/compliance/pci_dss_v4.json +510 -0
- context/compliance/poam_template.md +117 -0
- context/compliance/safeai_controls.json +512 -0
- context/compliance/sbd_report_template.md +77 -0
- context/compliance/siem_config_templates/__init__.py +6 -0
- context/compliance/siem_config_templates/filebeat.yml +213 -0
- context/compliance/siem_config_templates/log_sources.json +208 -0
- context/compliance/soc2_trust_criteria.json +661 -0
- context/compliance/ssp_template.md +432 -0
- context/compliance/stig_templates/__init__.py +6 -0
- context/compliance/stig_templates/webapp_stig.json +139 -0
- context/compliance/xai_requirements.json +108 -0
- context/dashboard/__init__.py +6 -0
- context/dashboard/nlq_examples.json +50 -0
- context/dashboard/schema_descriptions.json +23 -0
- context/icdev_methodology.md +100 -0
- context/integration/__init__.py +6 -0
- context/integration/approval_workflows.json +32 -0
- context/integration/gitlab_field_mappings.json +33 -0
- context/integration/jira_field_mappings.json +32 -0
- context/integration/reqif_export_schema.json +23 -0
- context/integration/servicenow_field_mappings.json +22 -0
- context/languages/__init__.py +6 -0
- context/languages/framework_patterns.json +205 -0
- context/languages/language_registry.json +279 -0
- context/llm/__init__.py +6 -0
- context/llm/example_provider.py +89 -0
- context/marketplace/assets/writeguard-core.yaml +100 -0
- context/marketplace/assets/writeguard-govcon.yaml +45 -0
- context/marketplace/assets/writeguard-style-guides.yaml +44 -0
- context/mbse/__init__.py +6 -0
- context/mbse/des_report_template.md +162 -0
- context/mbse/des_requirements.json +411 -0
- context/mbse/digital_thread_patterns.json +403 -0
- context/mbse/reqif_schema.json +280 -0
- context/mbse/sysml_element_types.json +432 -0
- context/oscal/NIST_SP-800-53_rev5_catalog.json +254987 -0
- context/oscal/README.md +43 -0
- context/patterns/__init__.py +6 -0
- context/profiles/__init__.py +6 -0
- context/profiles/dod_baseline_v1.yaml +145 -0
- context/profiles/fedramp_baseline_v1.yaml +143 -0
- context/profiles/financial_baseline_v1.yaml +142 -0
- context/profiles/healthcare_baseline_v1.yaml +135 -0
- context/profiles/law_enforcement_v1.yaml +129 -0
- context/profiles/startup_v1.yaml +134 -0
- context/rag/source_mappings.json +42 -0
- context/requirements/__init__.py +6 -0
- context/requirements/ambiguity_patterns.json +97 -0
- context/requirements/boundary_impact_rules.json +123 -0
- context/requirements/default_constitutions.json +67 -0
- context/requirements/document_extraction_rules.json +58 -0
- context/requirements/gap_patterns.json +108 -0
- context/requirements/readiness_rubric.json +78 -0
- context/requirements/red_alternative_patterns.json +210 -0
- context/requirements/safe_templates.json +72 -0
- context/requirements/spec_quality_checklist.json +122 -0
- context/research/regulatory_registry.json +114 -0
- context/research/verticals/cybersecurity.json +127 -0
- context/research/verticals/defense.json +104 -0
- context/research/verticals/fintech.json +125 -0
- context/research/verticals/healthcare.json +118 -0
- context/research/verticals/logistics.json +117 -0
- context/research/verticals/trading.json +145 -0
- context/simulation/__init__.py +6 -0
- context/simulation/architecture_patterns.json +36 -0
- context/simulation/coa_templates.json +38 -0
- context/simulation/cost_models.json +23 -0
- context/simulation/risk_categories.json +46 -0
- context/supply_chain/__init__.py +6 -0
- context/supply_chain/isa_templates.json +129 -0
- context/supply_chain/nist_800_161_controls.json +247 -0
- context/supply_chain/scrm_risk_matrix.json +147 -0
- context/templates/__init__.py +6 -0
- context/templates/ansible/__init__.py +6 -0
- context/templates/ansible/playbooks/__init__.py +6 -0
- context/templates/ansible/roles/__init__.py +6 -0
- context/templates/gitlab_ci/__init__.py +6 -0
- context/templates/grafana/__init__.py +6 -0
- context/templates/kubernetes/__init__.py +6 -0
- context/templates/project/__init__.py +6 -0
- context/templates/project/api/__init__.py +6 -0
- context/templates/project/cli/__init__.py +6 -0
- context/templates/project/data_pipeline/__init__.py +6 -0
- context/templates/project/iac/__init__.py +6 -0
- context/templates/project/javascript_frontend/__init__.py +6 -0
- context/templates/project/javascript_frontend/src/__init__.py +6 -0
- context/templates/project/javascript_frontend/tests/__init__.py +6 -0
- context/templates/project/microservice/__init__.py +6 -0
- context/templates/project/python_backend/__init__.py +6 -0
- context/templates/project/python_backend/src/__init__.py +6 -0
- context/templates/project/python_backend/tests/__init__.py +6 -0
- context/templates/project/python_backend/tests/features/__init__.py +6 -0
- context/templates/project/python_backend/tests/steps/__init__.py +6 -0
- context/templates/terraform/__init__.py +6 -0
- context/templates/terraform/govcloud_base/__init__.py +6 -0
- context/templates/terraform/modules/__init__.py +6 -0
- context/tone/__init__.py +6 -0
- context/writing/grammar_rules/common_errors.json +306 -0
- context/writing/grammar_rules/govcon_vocabulary.json +113 -0
- context/writing/style_guides/academic.yaml +43 -0
- context/writing/style_guides/business.yaml +42 -0
- context/writing/style_guides/government.yaml +59 -0
- context/writing/style_guides/proposal.yaml +58 -0
- context/writing/style_guides/technical.yaml +43 -0
- docs/adr/README.md +66 -0
- docs/adr/connector-forge-decisions.md +318 -0
- docs/adr/core-decisions.md +289 -0
- docs/adr/db-decisions.md +94 -0
- docs/adr/harness-decisions.md +122 -0
- docs/adr/innovation-decisions.md +262 -0
- docs/adr/marketplace-decisions.md +109 -0
- docs/adr/sbd-decisions.md +109 -0
- docs/adr/scale-engine-decisions.md +108 -0
- docs/adr/writeguard-decisions.md +136 -0
- docs/architecture/bounded-contexts.md +1032 -0
- docs/features/phase-65-writeguard.md +139 -0
- docs/features/phase-66-marketplace-commerce.md +79 -0
- docs/features/phase-67-knowledge-ingestion-rag-autodraft.md +97 -0
- docs/features/phase-68-enhanced-autodraft-pipeline.md +109 -0
- docs/features/phase-69-proposalai-marketplace-module.md +131 -0
- docs/features/phase-70-databridge.md +214 -0
- docs/features/phase-71-databridge-messaging.md +102 -0
- docs/implementation-plan-architecture-evolution.md +614 -0
- docs/marketplace/CONTRIBUTING.md +124 -0
- docs/marketplace/module_manifest_schema.yaml +83 -0
- docs/research/ai-architecture-patterns-2024-2026.md +1236 -0
- docs/research/app-builder-platform-analysis.md +582 -0
- docs/research/architecture-patterns-c4-ddd-agentic.md +871 -0
- docs/research/flowable-boat-competitive-analysis.md +426 -0
- docs/research/modern-dev-practices-2024-2026.md +1615 -0
- docs/research/secure-by-design-cloudyrion-adaptation.md +270 -0
- goals/agent_management.md +144 -0
- goals/ai_accountability.md +90 -0
- goals/ai_narratives.md +79 -0
- goals/ai_transparency.md +76 -0
- goals/ato_simulator.md +78 -0
- goals/audit_engine.md +177 -0
- goals/bite_sized_plans.md +225 -0
- goals/boundary_supply_chain.md +206 -0
- goals/brainstorming_gate.md +186 -0
- goals/build_app.md +604 -0
- goals/cato_live_evidence.md +77 -0
- goals/cloudforge.md +106 -0
- goals/code_intelligence.md +197 -0
- goals/compliance_workflow.md +858 -0
- goals/connector_forge.md +133 -0
- goals/databridge.md +128 -0
- goals/deploy_workflow.md +390 -0
- goals/developer_scorecard.md +78 -0
- goals/devsecops_workflow.md +408 -0
- goals/firmware_sbom.md +79 -0
- goals/forge_hub.md +78 -0
- goals/golden_path.md +77 -0
- goals/harness_engineering.md +91 -0
- goals/integration_testing.md +189 -0
- goals/knowledge_graph.md +128 -0
- goals/maintenance_audit.md +196 -0
- goals/manifest.md +50 -0
- goals/monitoring.md +126 -0
- goals/mosa_workflow.md +463 -0
- goals/multi_agent_orchestration.md +68 -0
- goals/observability_traceability_xai.md +154 -0
- goals/owasp_agentic_security.md +395 -0
- goals/pr_intelligence.md +78 -0
- goals/requirements_intake.md +213 -0
- goals/secure_by_design.md +135 -0
- goals/security_scan.md +381 -0
- goals/self_healing.md +120 -0
- goals/simulation_engine.md +111 -0
- goals/subagent_review.md +205 -0
- goals/systematic_debugging.md +257 -0
- goals/tdd_workflow.md +403 -0
- goals/template_exchange.md +77 -0
- goals/thread_heatmap.md +77 -0
- goals/threat_modeler.md +77 -0
- goals/verification_iron_law.md +192 -0
- goals/vsm_dashboard.md +76 -0
- goals/writeguard.md +89 -0
- goals/zero_trust_architecture.md +403 -0
- hardprompts/__init__.py +6 -0
- hardprompts/agent/__init__.py +6 -0
- hardprompts/agent/agentic_architect.md +100 -0
- hardprompts/agent/debate_prompt.md +32 -0
- hardprompts/agent/fitness_evaluation.md +48 -0
- hardprompts/agent/governance_review.md +214 -0
- hardprompts/agent/reviewer_prompt.md +34 -0
- hardprompts/agent/skill_design.md +172 -0
- hardprompts/agent/task_decomposition.md +275 -0
- hardprompts/agent/veto_check_prompt.md +33 -0
- hardprompts/architect/__init__.py +6 -0
- hardprompts/architect/api_design.md +283 -0
- hardprompts/architect/data_model.md +277 -0
- hardprompts/architect/system_design.md +180 -0
- hardprompts/builder/__init__.py +6 -0
- hardprompts/builder/code_generation.md +59 -0
- hardprompts/builder/refactor.md +58 -0
- hardprompts/builder/scaffold_project.md +69 -0
- hardprompts/builder/test_generation.md +87 -0
- hardprompts/ci/__init__.py +6 -0
- hardprompts/ci/worktree_setup.md +35 -0
- hardprompts/compliance/__init__.py +6 -0
- hardprompts/compliance/cmmc_assessment.md +63 -0
- hardprompts/compliance/cssp_assessment.md +75 -0
- hardprompts/compliance/cui_marking.md +86 -0
- hardprompts/compliance/fedramp_assessment.md +55 -0
- hardprompts/compliance/ivv_assessment.md +96 -0
- hardprompts/compliance/poam_generation.md +57 -0
- hardprompts/compliance/sbd_assessment.md +101 -0
- hardprompts/compliance/security_categorization.md +74 -0
- hardprompts/compliance/ssp_generation.md +56 -0
- hardprompts/compliance/stig_evaluation.md +63 -0
- hardprompts/dashboard/__init__.py +6 -0
- hardprompts/dashboard/nlq_system_prompt.md +26 -0
- hardprompts/infra/__init__.py +6 -0
- hardprompts/infra/k8s_manifests.md +118 -0
- hardprompts/infra/pipeline_generation.md +160 -0
- hardprompts/infra/terraform_generation.md +92 -0
- hardprompts/integration/__init__.py +6 -0
- hardprompts/integration/approval_review.md +17 -0
- hardprompts/integration/jira_mapping.md +25 -0
- hardprompts/integration/servicenow_mapping.md +14 -0
- hardprompts/knowledge/__init__.py +6 -0
- hardprompts/knowledge/pattern_detection.md +73 -0
- hardprompts/knowledge/recommendation_engine.md +90 -0
- hardprompts/knowledge/root_cause_analysis.md +91 -0
- hardprompts/maintenance/__init__.py +6 -0
- hardprompts/maintenance/maintenance_assessment.md +82 -0
- hardprompts/mbse/__init__.py +6 -0
- hardprompts/mbse/digital_thread.md +67 -0
- hardprompts/mbse/model_import.md +62 -0
- hardprompts/mbse/model_to_code.md +65 -0
- hardprompts/modernization/__init__.py +6 -0
- hardprompts/modernization/legacy_analysis.md +93 -0
- hardprompts/modernization/migration_planning.md +150 -0
- hardprompts/modernization/seven_r_assessment.md +107 -0
- hardprompts/proposal_draft.md +53 -0
- hardprompts/rag_citation.md +12 -0
- hardprompts/rag_rerank.md +31 -0
- hardprompts/requirements/__init__.py +6 -0
- hardprompts/requirements/bdd_generation.md +35 -0
- hardprompts/requirements/clarification_prioritization.md +29 -0
- hardprompts/requirements/decomposition.md +60 -0
- hardprompts/requirements/document_extraction.md +45 -0
- hardprompts/requirements/gap_detection.md +70 -0
- hardprompts/requirements/intake_conversation.md +101 -0
- hardprompts/requirements/readiness_assessment.md +39 -0
- hardprompts/requirements/spec_quality.md +33 -0
- hardprompts/requirements/traceability_analysis.md +23 -0
- hardprompts/security/__init__.py +6 -0
- hardprompts/security/endpoint_security.md +78 -0
- hardprompts/security/threat_model.md +70 -0
- hardprompts/security/vulnerability_assessment.md +81 -0
- hardprompts/simulation/__init__.py +6 -0
- hardprompts/simulation/architecture_impact.md +27 -0
- hardprompts/simulation/coa_alternative.md +27 -0
- hardprompts/simulation/coa_generation.md +25 -0
- hardprompts/simulation/compliance_impact.md +28 -0
- hardprompts/simulation/cost_estimation.md +33 -0
- hardprompts/simulation/risk_assessment.md +28 -0
- hardprompts/translation/code_translation.md +68 -0
- hardprompts/translation/dependency_suggestion.md +44 -0
- hardprompts/translation/test_translation.md +64 -0
- hardprompts/translation/translation_repair.md +59 -0
- icdev-0.0.3.dist-info/METADATA +909 -0
- icdev-0.0.3.dist-info/RECORD +1214 -0
- icdev-0.0.3.dist-info/WHEEL +5 -0
- icdev-0.0.3.dist-info/entry_points.txt +9 -0
- icdev-0.0.3.dist-info/licenses/LICENSE +201 -0
- icdev-0.0.3.dist-info/licenses/NOTICE +11 -0
- icdev-0.0.3.dist-info/top_level.txt +7 -0
- memory/MEMORY.md +52 -0
- memory/logs/2026-02-14.md +17 -0
- memory/logs/2026-03-03.md +2 -0
- memory/logs/__init__.py +1 -0
- tools/a2a/icdev_callback_client.py +210 -0
- tools/agent/cards/architect_card.json +29 -0
- tools/agent/cards/builder_card.json +34 -0
- tools/agent/cards/compliance_card.json +29 -0
- tools/agent/cards/connector_forge_card.json +49 -0
- tools/agent/cards/devsecops_zta_card.json +24 -0
- tools/agent/cards/knowledge_card.json +29 -0
- tools/agent/cards/monitor_card.json +29 -0
- tools/agent/cards/orchestrator_card.json +29 -0
- tools/agent/cards/requirements_analyst_card.json +24 -0
- tools/agent/cards/security_card.json +29 -0
- tools/agent/cards/simulation_card.json +24 -0
- tools/agent/cards/supply_chain_card.json +24 -0
- tools/analysis/__init__.py +1 -0
- tools/analysis/code_analyzer.py +770 -0
- tools/analysis/runtime_feedback.py +379 -0
- tools/analytics/__init__.py +2 -0
- tools/analytics/scorecard.py +538 -0
- tools/analytics/vsm_engine.py +612 -0
- tools/architecture/__init__.py +2 -0
- tools/architecture/adr_extractor.py +393 -0
- tools/audit/__init__.py +1 -0
- tools/audit/audit_logger.py +199 -0
- tools/audit/audit_query.py +153 -0
- tools/audit/decision_recorder.py +73 -0
- tools/audit_engine/__init__.py +12 -0
- tools/audit_engine/ai_advisor.py +906 -0
- tools/audit_engine/cli.py +286 -0
- tools/audit_engine/comparator.py +305 -0
- tools/audit_engine/eject_scaffolder.py +399 -0
- tools/audit_engine/engine.py +614 -0
- tools/audit_engine/git_fetcher.py +341 -0
- tools/audit_engine/regime_loader.py +200 -0
- tools/audit_engine/regime_updater.py +325 -0
- tools/audit_engine/report_card.py +289 -0
- tools/audit_engine/scanner.py +684 -0
- tools/audit_engine/self_heal.py +1042 -0
- tools/ci/__init__.py +2 -0
- tools/ci/connectors/__init__.py +2 -0
- tools/ci/connectors/base_connector.py +80 -0
- tools/ci/connectors/connector_registry.py +188 -0
- tools/ci/connectors/mattermost_connector.py +159 -0
- tools/ci/connectors/slack_connector.py +197 -0
- tools/ci/core/__init__.py +2 -0
- tools/ci/core/air_gap_detector.py +115 -0
- tools/ci/core/comment_handler.py +192 -0
- tools/ci/core/conversation_manager.py +480 -0
- tools/ci/core/event_envelope.py +500 -0
- tools/ci/core/event_router.py +444 -0
- tools/ci/core/failure_parser.py +397 -0
- tools/ci/core/recovery_engine.py +527 -0
- tools/ci/gate_enforcer.py +361 -0
- tools/ci/modules/__init__.py +2 -0
- tools/ci/modules/agent.py +271 -0
- tools/ci/modules/git_ops.py +175 -0
- tools/ci/modules/state.py +117 -0
- tools/ci/modules/vcs.py +303 -0
- tools/ci/modules/workflow_ops.py +295 -0
- tools/ci/modules/worktree.py +337 -0
- tools/ci/pipeline_config_generator.py +558 -0
- tools/ci/pr_intelligence.py +485 -0
- tools/ci/triggers/__init__.py +2 -0
- tools/ci/triggers/gitlab_task_monitor.py +327 -0
- tools/ci/triggers/poll_trigger.py +237 -0
- tools/ci/triggers/webhook_server.py +356 -0
- tools/ci/workflows/__init__.py +2 -0
- tools/ci/workflows/icdev_build.py +140 -0
- tools/ci/workflows/icdev_comply.py +284 -0
- tools/ci/workflows/icdev_document.py +152 -0
- tools/ci/workflows/icdev_e2e.py +188 -0
- tools/ci/workflows/icdev_patch.py +186 -0
- tools/ci/workflows/icdev_plan.py +202 -0
- tools/ci/workflows/icdev_plan_build.py +41 -0
- tools/ci/workflows/icdev_plan_build_test.py +46 -0
- tools/ci/workflows/icdev_plan_build_test_review.py +47 -0
- tools/ci/workflows/icdev_review.py +126 -0
- tools/ci/workflows/icdev_sdlc.py +261 -0
- tools/ci/workflows/icdev_test.py +240 -0
- tools/cli/__init__.py +1 -0
- tools/cli/output_formatter.py +756 -0
- tools/cloudforge/__init__.py +12 -0
- tools/cloudforge/airgap/__init__.py +2 -0
- tools/cloudforge/airgap/il_classifier.py +70 -0
- tools/cloudforge/airgap/offline_validator.py +42 -0
- tools/cloudforge/airgap/shift_emulator.py +155 -0
- tools/cloudforge/airgap/sneakernet.py +91 -0
- tools/cloudforge/cd_hub/__init__.py +2 -0
- tools/cloudforge/cd_hub/canary_deployer.py +88 -0
- tools/cloudforge/cd_hub/gitops_renderer.py +123 -0
- tools/cloudforge/cd_hub/hub_controller.py +143 -0
- tools/cloudforge/cd_hub/pipeline_bridge.py +30 -0
- tools/cloudforge/cd_hub/rollback_engine.py +29 -0
- tools/cloudforge/cd_hub/spoke_agent.py +51 -0
- tools/cloudforge/compliance/__init__.py +2 -0
- tools/cloudforge/compliance/ato_accelerator.py +272 -0
- tools/cloudforge/compliance/control_inheritor.py +127 -0
- tools/cloudforge/compliance/evidence_generator.py +129 -0
- tools/cloudforge/compliance/poam_bridge.py +41 -0
- tools/cloudforge/compliance/ssp_bridge.py +52 -0
- tools/cloudforge/compliance/stig_bridge.py +41 -0
- tools/cloudforge/container_forge/__init__.py +2 -0
- tools/cloudforge/container_forge/bigbang_renderer.py +85 -0
- tools/cloudforge/container_forge/hardener.py +169 -0
- tools/cloudforge/container_forge/image_scanner_bridge.py +33 -0
- tools/cloudforge/container_forge/runtime_policy.py +87 -0
- tools/cloudforge/container_forge/sbom_bridge.py +42 -0
- tools/cloudforge/finops/__init__.py +2 -0
- tools/cloudforge/finops/anomaly_detector.py +78 -0
- tools/cloudforge/finops/budget_tracker.py +96 -0
- tools/cloudforge/finops/chargeback.py +69 -0
- tools/cloudforge/finops/cost_collector.py +141 -0
- tools/cloudforge/finops/optimizer.py +55 -0
- tools/cloudforge/hybrid/__init__.py +2 -0
- tools/cloudforge/hybrid/connection_manager.py +141 -0
- tools/cloudforge/hybrid/dns_federator.py +56 -0
- tools/cloudforge/hybrid/health_monitor.py +108 -0
- tools/cloudforge/hybrid/identity_federator.py +53 -0
- tools/cloudforge/hybrid/network_bridge.py +68 -0
- tools/cloudforge/hybrid/topology_manager.py +147 -0
- tools/cloudforge/hybrid/workload_abstractor.py +92 -0
- tools/cloudforge/iac/__init__.py +2 -0
- tools/cloudforge/iac/drift_detector.py +154 -0
- tools/cloudforge/iac/module_library.py +265 -0
- tools/cloudforge/iac/opentofu_adapter.py +89 -0
- tools/cloudforge/iac/pulumi_renderer.py +292 -0
- tools/cloudforge/iac/state_backend.py +146 -0
- tools/cloudforge/iac/terraform_renderer.py +626 -0
- tools/cloudforge/landing_zone/__init__.py +2 -0
- tools/cloudforge/landing_zone/blueprint_loader.py +98 -0
- tools/cloudforge/landing_zone/blueprint_validator.py +113 -0
- tools/cloudforge/landing_zone/zone_provisioner.py +306 -0
- tools/cloudforge/landing_zone/zone_state.py +143 -0
- tools/cloudforge/mbse_thread/__init__.py +2 -0
- tools/cloudforge/mbse_thread/ato_thread_weaver.py +111 -0
- tools/cloudforge/mbse_thread/control_tracer.py +68 -0
- tools/cloudforge/mbse_thread/system_boundary.py +83 -0
- tools/cloudforge/metastore/__init__.py +2 -0
- tools/cloudforge/metastore/dependency_graph.py +202 -0
- tools/cloudforge/metastore/discovery.py +192 -0
- tools/cloudforge/metastore/registry.py +185 -0
- tools/cloudforge/metastore/rto_tracker.py +92 -0
- tools/cloudforge/metastore/runbook_linker.py +82 -0
- tools/cloudforge/migration/__init__.py +2 -0
- tools/cloudforge/migration/assessor.py +187 -0
- tools/cloudforge/migration/cutover_orchestrator.py +117 -0
- tools/cloudforge/migration/databridge_bridge.py +92 -0
- tools/cloudforge/migration/planner.py +98 -0
- tools/cloudforge/migration/risk_scorer.py +97 -0
- tools/cloudforge/migration/validation_runner.py +45 -0
- tools/cloudforge/migration/workload_inventory.py +107 -0
- tools/cloudforge/provider.py +319 -0
- tools/cloudforge/providers/__init__.py +2 -0
- tools/cloudforge/providers/aws_commercial.py +92 -0
- tools/cloudforge/providers/aws_govcloud.py +229 -0
- tools/cloudforge/providers/aws_secret.py +83 -0
- tools/cloudforge/providers/azure_commercial.py +80 -0
- tools/cloudforge/providers/azure_gov.py +91 -0
- tools/cloudforge/providers/azure_secret.py +71 -0
- tools/cloudforge/providers/gcp.py +102 -0
- tools/cloudforge/providers/oci.py +102 -0
- tools/cloudforge/registry.py +140 -0
- tools/cloudforge/runbooks/__init__.py +2 -0
- tools/cloudforge/runbooks/ai_generator.py +119 -0
- tools/cloudforge/runbooks/dag_validator.py +219 -0
- tools/cloudforge/runbooks/engine.py +470 -0
- tools/cloudforge/runbooks/models.py +99 -0
- tools/cloudforge/runbooks/snippet_library.py +158 -0
- tools/cloudforge/runbooks/template_loader.py +122 -0
- tools/cloudforge/runbooks/visualization.py +108 -0
- tools/cloudforge/siem/__init__.py +2 -0
- tools/cloudforge/siem/alert_rules.py +86 -0
- tools/cloudforge/siem/correlation_engine.py +61 -0
- tools/cloudforge/siem/log_aggregator.py +113 -0
- tools/cloudforge/siem/siem_dashboard_data.py +28 -0
- tools/cloudforge/supply_chain/__init__.py +2 -0
- tools/cloudforge/supply_chain/bridge.py +33 -0
- tools/cloudforge/supply_chain/iac_dependency_scanner.py +36 -0
- tools/cloudforge/supply_chain/provider_trust_scorer.py +54 -0
- tools/compat/__init__.py +21 -0
- tools/compat/cli_harmonizer.py +251 -0
- tools/compat/datetime_utils.py +18 -0
- tools/compat/db_utils.py +190 -0
- tools/compat/platform_utils.py +123 -0
- tools/compliance/__init__.py +1 -0
- tools/compliance/accountability_manager.py +391 -0
- tools/compliance/ai_accountability_audit.py +287 -0
- tools/compliance/ai_impact_assessor.py +267 -0
- tools/compliance/ai_incident_response.py +295 -0
- tools/compliance/ai_inventory_manager.py +233 -0
- tools/compliance/ai_reassessment_scheduler.py +250 -0
- tools/compliance/ai_transparency_audit.py +247 -0
- tools/compliance/atlas_assessor.py +276 -0
- tools/compliance/atlas_report_generator.py +1199 -0
- tools/compliance/base_assessor.py +591 -0
- tools/compliance/cato_live_engine.py +607 -0
- tools/compliance/cato_monitor.py +1371 -0
- tools/compliance/cato_scheduler.py +698 -0
- tools/compliance/cjis_assessor.py +76 -0
- tools/compliance/classification_manager.py +1340 -0
- tools/compliance/cmmc_assessor.py +1478 -0
- tools/compliance/cmmc_report_generator.py +1087 -0
- tools/compliance/compliance_detector.py +452 -0
- tools/compliance/compliance_exporter.py +418 -0
- tools/compliance/compliance_status.py +810 -0
- tools/compliance/control_mapper.py +488 -0
- tools/compliance/crosswalk_engine.py +1208 -0
- tools/compliance/cssp_assessor.py +1032 -0
- tools/compliance/cssp_evidence_collector.py +716 -0
- tools/compliance/cssp_report_generator.py +1103 -0
- tools/compliance/cui_marker.py +387 -0
- tools/compliance/diagram_validator.py +599 -0
- tools/compliance/emass/__init__.py +2 -0
- tools/compliance/emass/emass_client.py +822 -0
- tools/compliance/emass/emass_export.py +758 -0
- tools/compliance/emass/emass_sync.py +807 -0
- tools/compliance/eu_ai_act_classifier.py +193 -0
- tools/compliance/evidence_collector.py +459 -0
- tools/compliance/fairness_assessor.py +310 -0
- tools/compliance/fedramp_20x_ksi_emitter.py +692 -0
- tools/compliance/fedramp_assessor.py +1795 -0
- tools/compliance/fedramp_authorization_packager.py +137 -0
- tools/compliance/fedramp_ksi_generator.py +349 -0
- tools/compliance/fedramp_report_generator.py +1115 -0
- tools/compliance/fips199_categorizer.py +869 -0
- tools/compliance/fips200_validator.py +304 -0
- tools/compliance/firmware_sbom.py +646 -0
- tools/compliance/gao_ai_assessor.py +228 -0
- tools/compliance/gao_evidence_builder.py +302 -0
- tools/compliance/hipaa_assessor.py +78 -0
- tools/compliance/hitrust_assessor.py +49 -0
- tools/compliance/incident_response_plan.py +705 -0
- tools/compliance/inheritance_engine.py +693 -0
- tools/compliance/iso27001_assessor.py +92 -0
- tools/compliance/iso42001_assessor.py +114 -0
- tools/compliance/ivv_assessor.py +2314 -0
- tools/compliance/ivv_report_generator.py +1649 -0
- tools/compliance/model_card_generator.py +291 -0
- tools/compliance/mosa_assessor.py +117 -0
- tools/compliance/multi_regime_assessor.py +441 -0
- tools/compliance/narrative_generator.py +1012 -0
- tools/compliance/narrative_quality_gate.py +701 -0
- tools/compliance/narrative_workflow.py +814 -0
- tools/compliance/nist_800_207_assessor.py +191 -0
- tools/compliance/nist_ai_600_1_assessor.py +185 -0
- tools/compliance/nist_ai_rmf_assessor.py +110 -0
- tools/compliance/nist_lookup.py +244 -0
- tools/compliance/omb_m25_21_assessor.py +225 -0
- tools/compliance/omb_m26_04_assessor.py +185 -0
- tools/compliance/oscal_catalog_adapter.py +395 -0
- tools/compliance/oscal_generator.py +2157 -0
- tools/compliance/oscal_tools.py +1182 -0
- tools/compliance/oscal_validator.py +692 -0
- tools/compliance/owasp_agentic_assessor.py +227 -0
- tools/compliance/owasp_asi_assessor.py +197 -0
- tools/compliance/owasp_llm_assessor.py +245 -0
- tools/compliance/pci_dss_assessor.py +80 -0
- tools/compliance/pi_compliance_tracker.py +1447 -0
- tools/compliance/poam_generator.py +388 -0
- tools/compliance/resolve_marking.py +272 -0
- tools/compliance/sbd_assessor.py +2070 -0
- tools/compliance/sbd_report_generator.py +1223 -0
- tools/compliance/sbom_generator.py +993 -0
- tools/compliance/siem_config_generator.py +661 -0
- tools/compliance/slsa_attestation_generator.py +479 -0
- tools/compliance/soc2_assessor.py +77 -0
- tools/compliance/ssp_generator.py +556 -0
- tools/compliance/stig_checker.py +712 -0
- tools/compliance/swft_evidence_bundler.py +326 -0
- tools/compliance/system_card_generator.py +303 -0
- tools/compliance/template_exchange.py +513 -0
- tools/compliance/traceability_matrix.py +1268 -0
- tools/compliance/universal_classification_manager.py +1159 -0
- tools/compliance/xacta/__init__.py +2 -0
- tools/compliance/xacta/xacta_client.py +438 -0
- tools/compliance/xacta/xacta_export.py +546 -0
- tools/compliance/xacta/xacta_sync.py +322 -0
- tools/compliance/xai_assessor.py +231 -0
- tools/core/__init__.py +2 -0
- tools/core/circuit_breaker.py +353 -0
- tools/core/compliance_sidecar.py +344 -0
- tools/core/container.py +110 -0
- tools/core/errors.py +256 -0
- tools/core/feature_flags.py +311 -0
- tools/core/task_dlq.py +350 -0
- tools/dashboard/__init__.py +2 -0
- tools/dashboard/app.py +6288 -0
- tools/dashboard/templates/agent_evolution.html +287 -0
- tools/dashboard/templates/agents/list.html +71 -0
- tools/dashboard/templates/agents.html +132 -0
- tools/dashboard/templates/architecture.html +289 -0
- tools/dashboard/templates/ato_simulator.html +170 -0
- tools/dashboard/templates/audit_engine.html +844 -0
- tools/dashboard/templates/base.html +236 -0
- tools/dashboard/templates/cato_live.html +116 -0
- tools/dashboard/templates/cloudforge.html +195 -0
- tools/dashboard/templates/cloudforge_finops.html +111 -0
- tools/dashboard/templates/cloudforge_hybrid.html +122 -0
- tools/dashboard/templates/cloudforge_metastore.html +234 -0
- tools/dashboard/templates/cloudforge_migration.html +87 -0
- tools/dashboard/templates/cloudforge_runbooks.html +201 -0
- tools/dashboard/templates/cloudforge_siem.html +94 -0
- tools/dashboard/templates/compliance_accel.html +292 -0
- tools/dashboard/templates/crashes.html +122 -0
- tools/dashboard/templates/databridge.html +305 -0
- tools/dashboard/templates/databridge_analytics.html +195 -0
- tools/dashboard/templates/databridge_mapping.html +345 -0
- tools/dashboard/templates/databridge_messaging.html +321 -0
- tools/dashboard/templates/decisions.html +258 -0
- tools/dashboard/templates/devices.html +151 -0
- tools/dashboard/templates/devsecops_maturity.html +278 -0
- tools/dashboard/templates/edge_ai.html +128 -0
- tools/dashboard/templates/firmware.html +120 -0
- tools/dashboard/templates/firmware_sbom.html +193 -0
- tools/dashboard/templates/forge_hub.html +196 -0
- tools/dashboard/templates/forge_studio.html +379 -0
- tools/dashboard/templates/forge_studio_analytics.html +360 -0
- tools/dashboard/templates/forge_studio_builder.html +1637 -0
- tools/dashboard/templates/forge_studio_compliance.html +310 -0
- tools/dashboard/templates/forge_studio_deploy.html +573 -0
- tools/dashboard/templates/forge_studio_enterprise.html +888 -0
- tools/dashboard/templates/forge_studio_marketplace.html +502 -0
- tools/dashboard/templates/forge_studio_workflow.html +696 -0
- tools/dashboard/templates/golden_path.html +175 -0
- tools/dashboard/templates/govcon.html +280 -0
- tools/dashboard/templates/harness.html +148 -0
- tools/dashboard/templates/index.html +207 -0
- tools/dashboard/templates/intelligence.html +336 -0
- tools/dashboard/templates/knowledge/index.html +190 -0
- tools/dashboard/templates/knowledge_graph.html +739 -0
- tools/dashboard/templates/login.html +51 -0
- tools/dashboard/templates/marketplace.html +336 -0
- tools/dashboard/templates/marketplace_admin.html +247 -0
- tools/dashboard/templates/missions.html +403 -0
- tools/dashboard/templates/narratives.html +154 -0
- tools/dashboard/templates/pr_intelligence.html +151 -0
- tools/dashboard/templates/proposals/detail.html +300 -0
- tools/dashboard/templates/proposals/list.html +52 -0
- tools/dashboard/templates/proposals/sam_detail.html +132 -0
- tools/dashboard/templates/proposals/section_detail.html +375 -0
- tools/dashboard/templates/research.html +222 -0
- tools/dashboard/templates/resilience.html +300 -0
- tools/dashboard/templates/scorecard.html +162 -0
- tools/dashboard/templates/simulator.html +131 -0
- tools/dashboard/templates/template_exchange.html +147 -0
- tools/dashboard/templates/thread_heatmap.html +151 -0
- tools/dashboard/templates/threat_model.html +195 -0
- tools/dashboard/templates/vsm.html +141 -0
- tools/dashboard/templates/writeguard.html +277 -0
- tools/databridge/__init__.py +5 -0
- tools/databridge/agent/__init__.py +2 -0
- tools/databridge/agent/daemon.py +227 -0
- tools/databridge/agent/tunnel.py +101 -0
- tools/databridge/agent/ws_relay.py +91 -0
- tools/databridge/analytics.py +167 -0
- tools/databridge/arrow_pipeline.py +327 -0
- tools/databridge/connection_manager.py +424 -0
- tools/databridge/connector.py +331 -0
- tools/databridge/connectors/__init__.py +2 -0
- tools/databridge/connectors/argocd_connector.py +160 -0
- tools/databridge/connectors/avro_connector.py +203 -0
- tools/databridge/connectors/azure_blob.py +63 -0
- tools/databridge/connectors/cdc_connector.py +205 -0
- tools/databridge/connectors/csv_connector.py +172 -0
- tools/databridge/connectors/datadog_connector.py +153 -0
- tools/databridge/connectors/discord_messaging.py +215 -0
- tools/databridge/connectors/dynamics365.py +151 -0
- tools/databridge/connectors/elasticsearch_connector.py +145 -0
- tools/databridge/connectors/email_base.py +114 -0
- tools/databridge/connectors/excel_connector.py +175 -0
- tools/databridge/connectors/fsspec_base.py +300 -0
- tools/databridge/connectors/gcs.py +53 -0
- tools/databridge/connectors/github_connector.py +138 -0
- tools/databridge/connectors/gitlab_connector.py +132 -0
- tools/databridge/connectors/gmail_connector.py +182 -0
- tools/databridge/connectors/hdfs.py +57 -0
- tools/databridge/connectors/health_base.py +401 -0
- tools/databridge/connectors/hubspot.py +124 -0
- tools/databridge/connectors/imap_connector.py +171 -0
- tools/databridge/connectors/jenkins_connector.py +138 -0
- tools/databridge/connectors/jira_connector.py +86 -0
- tools/databridge/connectors/json_connector.py +184 -0
- tools/databridge/connectors/kafka_connector.py +246 -0
- tools/databridge/connectors/kinesis_connector.py +238 -0
- tools/databridge/connectors/local_fs.py +30 -0
- tools/databridge/connectors/matrix.py +197 -0
- tools/databridge/connectors/mattermost_messaging.py +184 -0
- tools/databridge/connectors/messaging_base.py +172 -0
- tools/databridge/connectors/mssql.py +63 -0
- tools/databridge/connectors/mysql.py +57 -0
- tools/databridge/connectors/netsuite.py +170 -0
- tools/databridge/connectors/o365_mail.py +196 -0
- tools/databridge/connectors/oracle.py +65 -0
- tools/databridge/connectors/pagerduty_connector.py +162 -0
- tools/databridge/connectors/parquet_connector.py +131 -0
- tools/databridge/connectors/postgresql.py +58 -0
- tools/databridge/connectors/s3.py +65 -0
- tools/databridge/connectors/saas_base.py +198 -0
- tools/databridge/connectors/salesforce.py +126 -0
- tools/databridge/connectors/sap.py +89 -0
- tools/databridge/connectors/servicenow.py +60 -0
- tools/databridge/connectors/signal_messaging.py +150 -0
- tools/databridge/connectors/slack_messaging.py +203 -0
- tools/databridge/connectors/smtp_connector.py +126 -0
- tools/databridge/connectors/soap_base.py +258 -0
- tools/databridge/connectors/splunk_connector.py +171 -0
- tools/databridge/connectors/sql_base.py +310 -0
- tools/databridge/connectors/sqlite_connector.py +76 -0
- tools/databridge/connectors/teams.py +148 -0
- tools/databridge/connectors/telegram.py +192 -0
- tools/databridge/connectors/whatsapp.py +137 -0
- tools/databridge/data_profiler.py +99 -0
- tools/databridge/forge/__init__.py +6 -0
- tools/databridge/forge/base_selector.py +150 -0
- tools/databridge/forge/code_generator.py +206 -0
- tools/databridge/forge/community_hub.py +539 -0
- tools/databridge/forge/forge_agent.py +306 -0
- tools/databridge/forge/import_handler.py +133 -0
- tools/databridge/forge/integration_tester.py +127 -0
- tools/databridge/forge/marketplace_publisher.py +164 -0
- tools/databridge/forge/promoter.py +159 -0
- tools/databridge/forge/sandbox_manager.py +257 -0
- tools/databridge/forge/spec_parser.py +358 -0
- tools/databridge/forge/static_validator.py +363 -0
- tools/databridge/forge/templates/__init__.py +591 -0
- tools/databridge/format_converter.py +188 -0
- tools/databridge/mapping_engine.py +348 -0
- tools/databridge/messaging/__init__.py +5 -0
- tools/databridge/messaging/agent_bridge.py +254 -0
- tools/databridge/messaging/message_envelope.py +111 -0
- tools/databridge/messaging/message_logger.py +204 -0
- tools/databridge/messaging/messaging_daemon.py +326 -0
- tools/databridge/messaging/oauth2_manager.py +411 -0
- tools/databridge/pii_detector.py +221 -0
- tools/databridge/registry.py +352 -0
- tools/databridge/relay_server.py +105 -0
- tools/databridge/scale/__init__.py +16 -0
- tools/databridge/scale/backpressure.py +134 -0
- tools/databridge/scale/chunked_pipeline.py +169 -0
- tools/databridge/scale/connection_pool.py +293 -0
- tools/databridge/scale/engine.py +492 -0
- tools/databridge/scale/worker_pool.py +140 -0
- tools/databridge/scale/write_batcher.py +250 -0
- tools/databridge/schema_engine.py +324 -0
- tools/databridge/stream_manager.py +225 -0
- tools/databridge/sync_engine.py +411 -0
- tools/databridge/transforms.py +302 -0
- tools/db/__init__.py +1 -0
- tools/db/backup.py +312 -0
- tools/db/backup_manager.py +832 -0
- tools/db/init_icdev_db.py +7753 -0
- tools/db/init_sparkpilot_db.py +431 -0
- tools/db/migrate.py +177 -0
- tools/db/migrate_innovation_audit.py +165 -0
- tools/db/migration_runner.py +548 -0
- tools/db/migrations/001_baseline/meta.json +9 -0
- tools/db/migrations/001_baseline/up.py +67 -0
- tools/db/migrations/002_memory_enhancements/down.sql +8 -0
- tools/db/migrations/002_memory_enhancements/meta.json +9 -0
- tools/db/migrations/002_memory_enhancements/up.py +119 -0
- tools/db/migrations/003_dev_profiles/meta.json +8 -0
- tools/db/migrations/003_dev_profiles/up.py +93 -0
- tools/db/migrations/004_innovation_engine/down.py +19 -0
- tools/db/migrations/004_innovation_engine/up.py +227 -0
- tools/db/migrations/005_phase_37_ai_security/down.py +19 -0
- tools/db/migrations/005_phase_37_ai_security/up.py +257 -0
- tools/db/migrations/006_phase_36_evolution/down.py +21 -0
- tools/db/migrations/006_phase_36_evolution/up.py +323 -0
- tools/db/migrations/007_phase_38_cloud/down.py +14 -0
- tools/db/migrations/007_phase_38_cloud/up.py +110 -0
- tools/db/migrations/008_phase36_37_integration/up.py +55 -0
- tools/db/migrations/__init__.py +2 -0
- tools/db/pg_migrate.py +642 -0
- tools/db/storage.py +1080 -0
- tools/decisions/__init__.py +2 -0
- tools/decisions/dmn_engine.py +695 -0
- tools/devsecops/__init__.py +2 -0
- tools/devsecops/attestation_manager.py +449 -0
- tools/devsecops/network_segmentation_generator.py +604 -0
- tools/devsecops/pdp_config_generator.py +1246 -0
- tools/devsecops/pipeline_security_generator.py +475 -0
- tools/devsecops/policy_generator.py +644 -0
- tools/devsecops/profile_manager.py +374 -0
- tools/devsecops/service_mesh_generator.py +1063 -0
- tools/devsecops/zta_maturity_scorer.py +355 -0
- tools/devsecops/zta_terraform_generator.py +1301 -0
- tools/edge_ai/__init__.py +2 -0
- tools/edge_ai/model_manager.py +200 -0
- tools/embedded/__init__.py +2 -0
- tools/embedded/cmake_generator.py +318 -0
- tools/embedded/crash_analyzer.py +191 -0
- tools/embedded/nl_to_firmware.py +277 -0
- tools/events/__init__.py +1 -0
- tools/events/event_bus.py +199 -0
- tools/finetune/pair_generator.py +832 -0
- tools/fleet/__init__.py +2 -0
- tools/fleet/device_registry.py +148 -0
- tools/fleet/ota_manager.py +153 -0
- tools/forge_studio/__init__.py +13 -0
- tools/forge_studio/analytics/__init__.py +0 -0
- tools/forge_studio/analytics/process_miner.py +383 -0
- tools/forge_studio/audit.py +183 -0
- tools/forge_studio/blueprint/__init__.py +2 -0
- tools/forge_studio/blueprint/build_tracker.py +317 -0
- tools/forge_studio/blueprint/export_engine.py +441 -0
- tools/forge_studio/blueprint/parent_client.py +335 -0
- tools/forge_studio/catalog/__init__.py +2 -0
- tools/forge_studio/catalog/component_registry.py +176 -0
- tools/forge_studio/catalog/schema_validator.py +193 -0
- tools/forge_studio/compliance/__init__.py +1 -0
- tools/forge_studio/compliance/compliance_wiring.py +554 -0
- tools/forge_studio/deploy/__init__.py +1 -0
- tools/forge_studio/deploy/airgap_packager.py +466 -0
- tools/forge_studio/deploy/deploy_engine.py +1792 -0
- tools/forge_studio/deploy/env_manager.py +431 -0
- tools/forge_studio/eject/__init__.py +2 -0
- tools/forge_studio/eject/docker_compose_generator.py +237 -0
- tools/forge_studio/eject/eject_engine.py +230 -0
- tools/forge_studio/eject/expo_scaffolder.py +303 -0
- tools/forge_studio/eject/nextjs_scaffolder.py +338 -0
- tools/forge_studio/enterprise/__init__.py +0 -0
- tools/forge_studio/enterprise/custom_frameworks.py +826 -0
- tools/forge_studio/enterprise/hardening_engine.py +1530 -0
- tools/forge_studio/enterprise/sso_manager.py +718 -0
- tools/forge_studio/enterprise/whitelabel_engine.py +887 -0
- tools/forge_studio/formula/__init__.py +0 -0
- tools/forge_studio/formula/expression_engine.py +562 -0
- tools/forge_studio/formula/formula_registry.py +265 -0
- tools/forge_studio/generator/__init__.py +2 -0
- tools/forge_studio/generator/app_generator.py +584 -0
- tools/forge_studio/generator/complexity_detector.py +368 -0
- tools/forge_studio/generator/prompt_templates.py +104 -0
- tools/forge_studio/generator/spec_builder.py +192 -0
- tools/forge_studio/intake_bridge.py +898 -0
- tools/forge_studio/marketplace/__init__.py +0 -0
- tools/forge_studio/marketplace/component_hub.py +428 -0
- tools/forge_studio/models.py +369 -0
- tools/forge_studio/renderer/__init__.py +2 -0
- tools/forge_studio/renderer/json_render_engine.py +623 -0
- tools/forge_studio/renderer/layout_engine.py +214 -0
- tools/forge_studio/renderer/rn_component_map.py +182 -0
- tools/forge_studio/supabase/__init__.py +2 -0
- tools/forge_studio/supabase/auth_generator.py +283 -0
- tools/forge_studio/supabase/migration_generator.py +93 -0
- tools/forge_studio/supabase/schema_generator.py +281 -0
- tools/forge_studio/tenant_manager.py +387 -0
- tools/forge_studio/workflow/__init__.py +2 -0
- tools/forge_studio/workflow/bpmn_adapter.py +489 -0
- tools/govcon/draft_orchestrator.py +1151 -0
- tools/govcon/engine_enrichment.py +373 -0
- tools/govcon/knowledge_base.py +487 -0
- tools/govcon/knowledge_ingestion.py +510 -0
- tools/govcon/sam_scanner.py +754 -0
- tools/harness/__init__.py +6 -0
- tools/harness/exit_criteria_evaluator.py +231 -0
- tools/harness/maturity_assessor.py +347 -0
- tools/harness/scaffold_harness.py +416 -0
- tools/harness/trace_analyzer.py +281 -0
- tools/infra/__init__.py +1 -0
- tools/infra/ansible_generator.py +867 -0
- tools/infra/dockerfile_generator.py +359 -0
- tools/infra/infra_status.py +384 -0
- tools/infra/ironbank_metadata_generator.py +403 -0
- tools/infra/k8s_generator.py +1000 -0
- tools/infra/pipeline_generator.py +830 -0
- tools/infra/rollback.py +389 -0
- tools/infra/terraform_generator.py +1140 -0
- tools/infra/terraform_generator_azure.py +1252 -0
- tools/infra/terraform_generator_gcp.py +951 -0
- tools/infra/terraform_generator_ibm.py +359 -0
- tools/infra/terraform_generator_oci.py +918 -0
- tools/infra/terraform_generator_onprem.py +318 -0
- tools/knowledge/__init__.py +1 -0
- tools/knowledge/knowledge_ingest.py +281 -0
- tools/knowledge/pattern_detector.py +681 -0
- tools/knowledge/recommendation_engine.py +449 -0
- tools/knowledge/self_heal_analyzer.py +492 -0
- tools/knowledge_graph/__init__.py +2 -0
- tools/knowledge_graph/graph_rag.py +498 -0
- tools/knowledge_graph/ingester.py +406 -0
- tools/knowledge_graph/insight_generator.py +369 -0
- tools/knowledge_graph/text_network.py +832 -0
- tools/llm/__init__.py +72 -0
- tools/llm/anthropic_provider.py +170 -0
- tools/llm/azure_openai_provider.py +338 -0
- tools/llm/bedrock_provider.py +315 -0
- tools/llm/embedding_provider.py +438 -0
- tools/llm/gemini_provider.py +381 -0
- tools/llm/ibm_watsonx_provider.py +231 -0
- tools/llm/oci_genai_provider.py +462 -0
- tools/llm/ollama_provider.py +350 -0
- tools/llm/openai_provider.py +225 -0
- tools/llm/prompt_registry.py +447 -0
- tools/llm/provider.py +355 -0
- tools/llm/provider_sdk.py +175 -0
- tools/llm/router.py +1124 -0
- tools/llm/semantic_cache.py +394 -0
- tools/llm/vertex_ai_provider.py +374 -0
- tools/maintenance/__init__.py +2 -0
- tools/maintenance/dependency_scanner.py +1016 -0
- tools/maintenance/maintenance_auditor.py +804 -0
- tools/maintenance/remediation_engine.py +957 -0
- tools/maintenance/vulnerability_checker.py +978 -0
- tools/manifest.md +1066 -0
- tools/marketplace/asset_installer.py +639 -0
- tools/marketplace/feedback_validator.py +359 -0
- tools/marketplace/license_client.py +458 -0
- tools/marketplace/module_crypto.py +544 -0
- tools/marketplace/module_runtime.py +236 -0
- tools/marketplace/token_store.py +264 -0
- tools/mbse/__init__.py +3 -0
- tools/mbse/des_assessor.py +1173 -0
- tools/mbse/des_report_generator.py +787 -0
- tools/mbse/diagram_extractor.py +792 -0
- tools/mbse/digital_thread.py +1650 -0
- tools/mbse/model_code_generator.py +1115 -0
- tools/mbse/model_control_mapper.py +410 -0
- tools/mbse/pi_model_tracker.py +1079 -0
- tools/mbse/reqif_parser.py +1468 -0
- tools/mbse/sync_engine.py +1789 -0
- tools/mbse/thread_heatmap.py +445 -0
- tools/mbse/xmi_parser.py +1558 -0
- tools/mcp/builder_server.py +64 -0
- tools/mcp/compliance_server.py +64 -0
- tools/mcp/connector_forge_server.py +155 -0
- tools/mcp/core_server.py +64 -0
- tools/mcp/devsecops_server.py +11 -0
- tools/mcp/devsecops_zta_server.py +64 -0
- tools/mcp/knowledge_server.py +64 -0
- tools/mcp/monitor_server.py +64 -0
- tools/mcp/ops_server.py +300 -0
- tools/mcp/requirements_analyst_server.py +64 -0
- tools/mcp/requirements_server.py +11 -0
- tools/mcp/security_server.py +64 -0
- tools/mcp/simulation_server.py +64 -0
- tools/mcp/supply_chain_server.py +64 -0
- tools/mcp/tool_registry.py +299 -0
- tools/memory/__init__.py +2 -0
- tools/memory/auto_capture.py +346 -0
- tools/memory/embed_memory.py +157 -0
- tools/memory/history_compressor.py +334 -0
- tools/memory/hybrid_search.py +235 -0
- tools/memory/maintenance_cron.py +288 -0
- tools/memory/memory_consolidation.py +439 -0
- tools/memory/memory_db.py +132 -0
- tools/memory/memory_read.py +101 -0
- tools/memory/memory_write.py +221 -0
- tools/memory/semantic_search.py +138 -0
- tools/memory/time_decay.py +434 -0
- tools/missions/__init__.py +2 -0
- tools/missions/mission_engine.py +459 -0
- tools/monitor/__init__.py +1 -0
- tools/monitor/alert_correlator.py +486 -0
- tools/monitor/auto_resolver.py +603 -0
- tools/monitor/health_checker.py +507 -0
- tools/monitor/heartbeat_daemon.py +779 -0
- tools/monitor/log_analyzer.py +507 -0
- tools/monitor/metric_collector.py +484 -0
- tools/mosa/__init__.py +10 -0
- tools/mosa/icd_generator.py +358 -0
- tools/mosa/modular_design_analyzer.py +682 -0
- tools/mosa/mosa_code_enforcer.py +348 -0
- tools/mosa/tsp_generator.py +265 -0
- tools/observability/__init__.py +100 -0
- tools/observability/genai_attributes.py +88 -0
- tools/observability/instrumentation.py +140 -0
- tools/observability/mlflow_exporter.py +193 -0
- tools/observability/otel_tracer.py +168 -0
- tools/observability/provenance/__init__.py +3 -0
- tools/observability/provenance/prov_recorder.py +322 -0
- tools/observability/shap/__init__.py +3 -0
- tools/observability/shap/agent_shap.py +274 -0
- tools/observability/sqlite_tracer.py +360 -0
- tools/observability/trace_context.py +205 -0
- tools/observability/tracer.py +230 -0
- tools/orchestration/__init__.py +1 -0
- tools/orchestration/peer_channels.py +254 -0
- tools/orchestration/saga_coordinator.py +390 -0
- tools/project/__init__.py +1 -0
- tools/project/manifest_loader.py +418 -0
- tools/project/project_create.py +350 -0
- tools/project/project_list.py +171 -0
- tools/project/project_scaffold.py +1715 -0
- tools/project/project_status.py +478 -0
- tools/project/session_context_builder.py +752 -0
- tools/project/validate_manifest.py +54 -0
- tools/rag/corrective_rag.py +582 -0
- tools/rag/source_registry.py +482 -0
- tools/requirements/__init__.py +1 -0
- tools/requirements/ai_governance_scorer.py +207 -0
- tools/requirements/boundary_analyzer.py +1281 -0
- tools/requirements/clarification_engine.py +605 -0
- tools/requirements/complexity_scorer.py +369 -0
- tools/requirements/consistency_analyzer.py +789 -0
- tools/requirements/constitution_manager.py +592 -0
- tools/requirements/decomposition_engine.py +764 -0
- tools/requirements/document_extractor.py +1002 -0
- tools/requirements/elicitation_techniques.py +508 -0
- tools/requirements/gap_detector.py +260 -0
- tools/requirements/intake_engine.py +2175 -0
- tools/requirements/prd_generator.py +839 -0
- tools/requirements/prd_validator.py +584 -0
- tools/requirements/readiness_scorer.py +302 -0
- tools/requirements/spec_organizer.py +1015 -0
- tools/requirements/spec_quality_checker.py +1083 -0
- tools/requirements/traceability_builder.py +566 -0
- tools/research/__init__.py +3 -0
- tools/research/academic_scanner.py +130 -0
- tools/research/build_buy_analyzer.py +229 -0
- tools/research/challenge_scorer.py +280 -0
- tools/research/community_scanner.py +174 -0
- tools/research/cross_engine_bridge.py +124 -0
- tools/research/dossier_generator.py +305 -0
- tools/research/landscape_scanner.py +315 -0
- tools/research/regulatory_scanner.py +248 -0
- tools/research/research_manager.py +469 -0
- tools/research/source_scanner.py +150 -0
- tools/research/vertical_loader.py +118 -0
- tools/saas/__init__.py +0 -0
- tools/saas/licensing/__init__.py +0 -0
- tools/saas/licensing/license_validator.py +345 -0
- tools/scaffold/__init__.py +2 -0
- tools/scaffold/golden_path.py +504 -0
- tools/security/__init__.py +1 -0
- tools/security/agent_output_validator.py +330 -0
- tools/security/agent_trust_scorer.py +652 -0
- tools/security/ai_bom_generator.py +718 -0
- tools/security/ai_telemetry_logger.py +469 -0
- tools/security/atlas_red_team.py +541 -0
- tools/security/code_pattern_scanner.py +382 -0
- tools/security/confabulation_detector.py +265 -0
- tools/security/container_scanner.py +489 -0
- tools/security/dependency_auditor.py +942 -0
- tools/security/endpoint_security_scanner.py +626 -0
- tools/security/mcp_tool_authorizer.py +242 -0
- tools/security/output_verifier.py +427 -0
- tools/security/prompt_injection_detector.py +737 -0
- tools/security/sast_runner.py +946 -0
- tools/security/secret_detector.py +376 -0
- tools/security/threat_modeler.py +678 -0
- tools/security/tool_chain_validator.py +357 -0
- tools/security/vuln_scanner.py +536 -0
- tools/simulation/__init__.py +2 -0
- tools/simulation/ato_simulator.py +517 -0
- tools/simulation/coa_generator.py +1539 -0
- tools/simulation/monte_carlo.py +745 -0
- tools/simulation/scenario_manager.py +1060 -0
- tools/simulation/simulation_engine.py +1091 -0
- tools/simulator/__init__.py +2 -0
- tools/simulator/sim_runner.py +272 -0
- tools/supply_chain/__init__.py +2 -0
- tools/supply_chain/cve_triager.py +690 -0
- tools/supply_chain/dependency_graph.py +630 -0
- tools/supply_chain/isa_manager.py +526 -0
- tools/supply_chain/scrm_assessor.py +531 -0
- tools/supply_chain/slsa_verifier.py +473 -0
- tools/testing/__init__.py +2 -0
- tools/testing/acceptance_validator.py +411 -0
- tools/testing/api_surface_extractor.py +749 -0
- tools/testing/claude_dir_validator.py +831 -0
- tools/testing/data_types.py +199 -0
- tools/testing/e2e_runner.py +715 -0
- tools/testing/fuzz_cli.py +306 -0
- tools/testing/health_check.py +483 -0
- tools/testing/platform_check.py +143 -0
- tools/testing/production_audit.py +1836 -0
- tools/testing/production_remediate.py +803 -0
- tools/testing/screenshot_validator.py +538 -0
- tools/testing/smoke_test.py +283 -0
- tools/testing/test_agent_models.py +117 -0
- tools/testing/test_orchestrator.py +957 -0
- tools/testing/utils.py +229 -0
- tools/writeguard/__init__.py +1 -0
- tools/writeguard/main.py +1 -0
- tools/writing/__init__.py +7 -0
- tools/writing/ai_content_detector.py +316 -0
- tools/writing/analysis_engine.py +454 -0
- tools/writing/batch_analyzer.py +276 -0
- tools/writing/coherence_analyzer.py +221 -0
- tools/writing/govcon_bridge.py +509 -0
- tools/writing/grammar_checker.py +270 -0
- tools/writing/plagiarism_detector.py +106 -0
- tools/writing/readability_scorer.py +201 -0
- tools/writing/rewriter.py +96 -0
- tools/writing/signal_registrar.py +167 -0
- tools/writing/snippet_manager.py +276 -0
- tools/writing/style_enforcer.py +220 -0
- tools/writing/style_guide_manager.py +438 -0
- tools/writing/tone_profiler.py +168 -0
|
@@ -0,0 +1,1208 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# CUI // SP-CTI
|
|
3
|
+
# Controlled by: Department of Defense
|
|
4
|
+
# CUI Category: CTI
|
|
5
|
+
# Distribution: D
|
|
6
|
+
# POC: ICDEV System Administrator
|
|
7
|
+
"""Control Framework Crosswalk Engine for ICDEV.
|
|
8
|
+
|
|
9
|
+
Maps NIST SP 800-53 Rev 5 control implementations across multiple compliance
|
|
10
|
+
frameworks (FedRAMP Moderate/High, NIST 800-171, CMMC Level 2/3, DoD IL4/5/6,
|
|
11
|
+
CJIS, HIPAA, HITRUST, SOC 2, PCI DSS, ISO 27001).
|
|
12
|
+
|
|
13
|
+
Dual-hub crosswalk model (ADR D111):
|
|
14
|
+
- US Hub: NIST 800-53 Rev 5 (domestic frameworks map directly)
|
|
15
|
+
- International Hub: ISO 27001:2022 (international frameworks map via bridge)
|
|
16
|
+
- Bridge: iso27001_nist_bridge.json connects the two hubs bidirectionally
|
|
17
|
+
|
|
18
|
+
Enables "implement once, satisfy many" by computing per-framework coverage,
|
|
19
|
+
performing gap analysis, and auto-updating framework status when controls are
|
|
20
|
+
marked as implemented.
|
|
21
|
+
|
|
22
|
+
Usage:
|
|
23
|
+
# Look up frameworks for a NIST control
|
|
24
|
+
python tools/compliance/crosswalk_engine.py --control AC-2
|
|
25
|
+
|
|
26
|
+
# List controls required by a framework
|
|
27
|
+
python tools/compliance/crosswalk_engine.py --framework fedramp --baseline moderate
|
|
28
|
+
|
|
29
|
+
# Controls for an impact level
|
|
30
|
+
python tools/compliance/crosswalk_engine.py --impact-level IL4
|
|
31
|
+
|
|
32
|
+
# Coverage report for a project
|
|
33
|
+
python tools/compliance/crosswalk_engine.py --project-id proj-123 --coverage
|
|
34
|
+
|
|
35
|
+
# Gap analysis for a target framework
|
|
36
|
+
python tools/compliance/crosswalk_engine.py --project-id proj-123 --framework fedramp \\
|
|
37
|
+
--baseline moderate --gap-analysis
|
|
38
|
+
|
|
39
|
+
# Crosswalk summary stats
|
|
40
|
+
python tools/compliance/crosswalk_engine.py --summary
|
|
41
|
+
|
|
42
|
+
Databases:
|
|
43
|
+
- data/icdev.db: project_controls, control_crosswalk, project_framework_status
|
|
44
|
+
- context/compliance/control_crosswalk.json: static crosswalk mapping data
|
|
45
|
+
|
|
46
|
+
See also:
|
|
47
|
+
- tools/compliance/control_mapper.py (NIST 800-53 project mapping)
|
|
48
|
+
- tools/compliance/nist_lookup.py (NIST control reference lookup)
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
import argparse
|
|
52
|
+
import json
|
|
53
|
+
import sys
|
|
54
|
+
from datetime import datetime, timezone
|
|
55
|
+
from pathlib import Path
|
|
56
|
+
from tools.db.storage import get_connection
|
|
57
|
+
|
|
58
|
+
BASE_DIR = Path(__file__).resolve().parent.parent.parent
|
|
59
|
+
CROSSWALK_PATH = BASE_DIR / "context" / "compliance" / "control_crosswalk.json"
|
|
60
|
+
ISO_BRIDGE_PATH = BASE_DIR / "context" / "compliance" / "iso27001_nist_bridge.json"
|
|
61
|
+
|
|
62
|
+
# Module-level caches for crosswalk data
|
|
63
|
+
_CROSSWALK_CACHE = None
|
|
64
|
+
_ISO_BRIDGE_CACHE = None
|
|
65
|
+
|
|
66
|
+
# Framework key mappings for human-friendly names
|
|
67
|
+
# Phase 23: Extended with dual-hub frameworks (ADR D111)
|
|
68
|
+
FRAMEWORK_KEYS = {
|
|
69
|
+
# ── US Hub: NIST 800-53 direct mappings ──
|
|
70
|
+
"fedramp_moderate": "FedRAMP Moderate",
|
|
71
|
+
"fedramp_high": "FedRAMP High",
|
|
72
|
+
"nist_800_171": "NIST 800-171",
|
|
73
|
+
"cmmc_level_2": "CMMC Level 2",
|
|
74
|
+
"cmmc_level_3": "CMMC Level 3",
|
|
75
|
+
"il4": "DoD IL4",
|
|
76
|
+
"il5": "DoD IL4",
|
|
77
|
+
"il6": "DoD IL4",
|
|
78
|
+
"fips_199": "FIPS 199",
|
|
79
|
+
"fips_200": "FIPS 200",
|
|
80
|
+
"cnssi_1253": "CNSSI 1253",
|
|
81
|
+
# ── Phase 23 Wave 1: Sector-specific frameworks ──
|
|
82
|
+
"cjis": "CJIS Security Policy",
|
|
83
|
+
"hipaa": "HIPAA Security Rule",
|
|
84
|
+
"hitrust": "HITRUST CSF v11",
|
|
85
|
+
"soc2": "SOC 2 Type II",
|
|
86
|
+
"pci_dss": "PCI DSS v4.0",
|
|
87
|
+
# ── Phase 25: Zero Trust Architecture ──
|
|
88
|
+
"nist_800_207": "NIST SP 800-207 (ZTA)",
|
|
89
|
+
# ── Phase 26: DoD MOSA ──
|
|
90
|
+
"mosa": "DoD MOSA (10 U.S.C. §4401)",
|
|
91
|
+
# ── Phase 37: AI Security Frameworks ──
|
|
92
|
+
"atlas": "MITRE ATLAS v5.4.0",
|
|
93
|
+
"owasp_llm": "OWASP LLM Top 10",
|
|
94
|
+
"nist_ai_rmf": "NIST AI RMF 1.0",
|
|
95
|
+
# ── International Hub: ISO 27001 + ISO 42001 ──
|
|
96
|
+
"iso_42001": "ISO/IEC 42001:2023",
|
|
97
|
+
"iso_27001": "ISO/IEC 27001:2022",
|
|
98
|
+
# -- CISA Secure by Design (Cloudyrion SbD adaptation) --
|
|
99
|
+
"cisa_sbd": "CISA Secure by Design",
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
# Mapping from CLI framework names to crosswalk keys
|
|
103
|
+
FRAMEWORK_ALIASES = {
|
|
104
|
+
"fedramp": {"moderate": "fedramp_moderate", "high": "fedramp_high"},
|
|
105
|
+
"fedramp_moderate": {"moderate": "fedramp_moderate", None: "fedramp_moderate"},
|
|
106
|
+
"fedramp_high": {"high": "fedramp_high", None: "fedramp_high"},
|
|
107
|
+
"cmmc": {"l2": "cmmc_level_2", "l3": "cmmc_level_3", "level_2": "cmmc_level_2", "level_3": "cmmc_level_3"},
|
|
108
|
+
"cmmc_level_2": {"l2": "cmmc_level_2", None: "cmmc_level_2"},
|
|
109
|
+
"cmmc_level_3": {"l3": "cmmc_level_3", None: "cmmc_level_3"},
|
|
110
|
+
"800-171": {None: "nist_800_171"},
|
|
111
|
+
"nist_800_171": {None: "nist_800_171"},
|
|
112
|
+
"nist-800-171": {None: "nist_800_171"},
|
|
113
|
+
# Phase 23 Wave 1 aliases
|
|
114
|
+
"cjis": {None: "cjis"},
|
|
115
|
+
"hipaa": {None: "hipaa"},
|
|
116
|
+
"hitrust": {None: "hitrust"},
|
|
117
|
+
"hitrust_csf": {None: "hitrust"},
|
|
118
|
+
"soc2": {None: "soc2"},
|
|
119
|
+
"soc_2": {None: "soc2"},
|
|
120
|
+
"pci": {None: "pci_dss"},
|
|
121
|
+
"pci_dss": {None: "pci_dss"},
|
|
122
|
+
"pci-dss": {None: "pci_dss"},
|
|
123
|
+
"iso_27001": {None: "iso_27001"},
|
|
124
|
+
# Phase 26 MOSA aliases
|
|
125
|
+
"mosa": {None: "mosa"},
|
|
126
|
+
"dod_mosa": {None: "mosa"},
|
|
127
|
+
"modular_open_systems": {None: "mosa"},
|
|
128
|
+
"iso27001": {None: "iso_27001"},
|
|
129
|
+
"iso-27001": {None: "iso_27001"},
|
|
130
|
+
# Phase 25: ZTA aliases
|
|
131
|
+
"nist_800_207": {None: "nist_800_207"},
|
|
132
|
+
"800-207": {None: "nist_800_207"},
|
|
133
|
+
"zta": {None: "nist_800_207"},
|
|
134
|
+
"zero_trust": {None: "nist_800_207"},
|
|
135
|
+
# CISA Secure by Design aliases
|
|
136
|
+
"cisa_sbd": {None: "cisa_sbd"},
|
|
137
|
+
"sbd": {None: "cisa_sbd"},
|
|
138
|
+
"secure_by_design": {None: "cisa_sbd"},
|
|
139
|
+
"secure-by-design": {None: "cisa_sbd"},
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
# Impact level to crosswalk key mapping
|
|
143
|
+
IL_KEYS = {
|
|
144
|
+
"IL4": "il4",
|
|
145
|
+
"IL4": "il5",
|
|
146
|
+
"IL4": "il6",
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
# Impact level to NIST 800-53 baseline mapping (via FIPS 199)
|
|
151
|
+
IL_BASELINE_MAP = {"IL4": "Low", "IL4": "Moderate", "IL4": "High", "IL4": "High"}
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
# -----------------------------------------------------------------
|
|
155
|
+
# FIPS 199 baseline integration
|
|
156
|
+
# -----------------------------------------------------------------
|
|
157
|
+
|
|
158
|
+
def get_baseline_from_categorization(project_id, db_path=None):
|
|
159
|
+
"""Get the NIST 800-53 baseline from the project's FIPS 199 categorization.
|
|
160
|
+
|
|
161
|
+
Priority:
|
|
162
|
+
1. fips199_categorizations table (approved, then draft).
|
|
163
|
+
2. projects.fips199_overall column.
|
|
164
|
+
3. Impact level mapping via IL_BASELINE_MAP.
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
{"baseline": "Moderate", "source": "fips199_categorization",
|
|
168
|
+
"categorization": {"C": "Moderate", "I": "Moderate", "A": "Low", "overall": "Moderate"}}
|
|
169
|
+
"""
|
|
170
|
+
conn = get_connection(db_path=db_path)
|
|
171
|
+
try:
|
|
172
|
+
# Try fips199_categorizations table
|
|
173
|
+
try:
|
|
174
|
+
row = conn.execute(
|
|
175
|
+
"""SELECT confidentiality_impact, integrity_impact, availability_impact,
|
|
176
|
+
overall_categorization, baseline_selected, status
|
|
177
|
+
FROM fips199_categorizations
|
|
178
|
+
WHERE project_id = ? AND status IN ('approved', 'draft')
|
|
179
|
+
ORDER BY CASE status WHEN 'approved' THEN 1 ELSE 2 END,
|
|
180
|
+
categorization_date DESC
|
|
181
|
+
LIMIT 1""",
|
|
182
|
+
(project_id,),
|
|
183
|
+
).fetchone()
|
|
184
|
+
if row:
|
|
185
|
+
baseline = row["baseline_selected"] or row["overall_categorization"]
|
|
186
|
+
return {
|
|
187
|
+
"baseline": baseline,
|
|
188
|
+
"source": "fips199_categorization",
|
|
189
|
+
"categorization": {
|
|
190
|
+
"C": row["confidentiality_impact"],
|
|
191
|
+
"I": row["integrity_impact"],
|
|
192
|
+
"A": row["availability_impact"],
|
|
193
|
+
"overall": row["overall_categorization"],
|
|
194
|
+
},
|
|
195
|
+
}
|
|
196
|
+
except Exception:
|
|
197
|
+
pass # Table may not exist yet
|
|
198
|
+
|
|
199
|
+
# Try projects.fips199_overall
|
|
200
|
+
proj = conn.execute(
|
|
201
|
+
"SELECT fips199_overall, impact_level FROM projects WHERE id = ?",
|
|
202
|
+
(project_id,),
|
|
203
|
+
).fetchone()
|
|
204
|
+
if proj:
|
|
205
|
+
if proj["fips199_overall"]:
|
|
206
|
+
return {
|
|
207
|
+
"baseline": proj["fips199_overall"],
|
|
208
|
+
"source": "projects_table",
|
|
209
|
+
"categorization": None,
|
|
210
|
+
}
|
|
211
|
+
il = proj["impact_level"] or "IL4"
|
|
212
|
+
return {
|
|
213
|
+
"baseline": IL_BASELINE_MAP.get(il, "Moderate"),
|
|
214
|
+
"source": f"impact_level_{il}",
|
|
215
|
+
"categorization": None,
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return {"baseline": "Moderate", "source": "default", "categorization": None}
|
|
219
|
+
finally:
|
|
220
|
+
conn.close()
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
# -----------------------------------------------------------------
|
|
224
|
+
# Database helpers
|
|
225
|
+
# -----------------------------------------------------------------
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
def _log_audit_event(conn, project_id, action, details):
|
|
229
|
+
"""Log an audit trail event (append-only, NIST AU compliant).
|
|
230
|
+
|
|
231
|
+
Uses event_type 'compliance_check' which is an allowed value in the
|
|
232
|
+
audit_trail CHECK constraint.
|
|
233
|
+
"""
|
|
234
|
+
try:
|
|
235
|
+
conn.execute(
|
|
236
|
+
"""INSERT INTO audit_trail
|
|
237
|
+
(project_id, event_type, actor, action, details,
|
|
238
|
+
affected_files, classification)
|
|
239
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)""",
|
|
240
|
+
(
|
|
241
|
+
project_id,
|
|
242
|
+
"compliance_check",
|
|
243
|
+
"icdev-crosswalk-engine",
|
|
244
|
+
action,
|
|
245
|
+
json.dumps(details) if isinstance(details, dict) else str(details),
|
|
246
|
+
json.dumps([]),
|
|
247
|
+
"CUI",
|
|
248
|
+
),
|
|
249
|
+
)
|
|
250
|
+
conn.commit()
|
|
251
|
+
except Exception as e:
|
|
252
|
+
print(f"Warning: Could not log audit event: {e}", file=sys.stderr)
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
def _ensure_crosswalk_tables(conn):
|
|
256
|
+
"""Ensure crosswalk-specific tables exist in the database.
|
|
257
|
+
|
|
258
|
+
Creates control_crosswalk and project_framework_status tables if they
|
|
259
|
+
do not already exist. These supplement the existing project_controls table.
|
|
260
|
+
"""
|
|
261
|
+
conn.executescript("""
|
|
262
|
+
CREATE TABLE IF NOT EXISTS control_crosswalk (
|
|
263
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
264
|
+
nist_800_53_id TEXT NOT NULL,
|
|
265
|
+
framework_id TEXT NOT NULL,
|
|
266
|
+
framework_control_id TEXT,
|
|
267
|
+
mapping_type TEXT DEFAULT 'equivalent'
|
|
268
|
+
CHECK(mapping_type IN ('equivalent', 'partial', 'superset', 'subset')),
|
|
269
|
+
notes TEXT,
|
|
270
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
271
|
+
UNIQUE(nist_800_53_id, framework_id)
|
|
272
|
+
);
|
|
273
|
+
|
|
274
|
+
CREATE INDEX IF NOT EXISTS idx_crosswalk_nist
|
|
275
|
+
ON control_crosswalk(nist_800_53_id);
|
|
276
|
+
CREATE INDEX IF NOT EXISTS idx_crosswalk_framework
|
|
277
|
+
ON control_crosswalk(framework_id);
|
|
278
|
+
|
|
279
|
+
CREATE TABLE IF NOT EXISTS project_framework_status (
|
|
280
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
281
|
+
project_id TEXT NOT NULL,
|
|
282
|
+
framework_id TEXT NOT NULL,
|
|
283
|
+
total_controls INTEGER DEFAULT 0,
|
|
284
|
+
implemented_count INTEGER DEFAULT 0,
|
|
285
|
+
coverage_pct REAL DEFAULT 0.0,
|
|
286
|
+
gate_status TEXT DEFAULT 'not_started'
|
|
287
|
+
CHECK(gate_status IN ('not_started', 'in_progress', 'compliant', 'non_compliant')),
|
|
288
|
+
last_assessed TIMESTAMP,
|
|
289
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
290
|
+
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
291
|
+
UNIQUE(project_id, framework_id)
|
|
292
|
+
);
|
|
293
|
+
|
|
294
|
+
CREATE INDEX IF NOT EXISTS idx_pfs_project
|
|
295
|
+
ON project_framework_status(project_id);
|
|
296
|
+
""")
|
|
297
|
+
conn.commit()
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
# -----------------------------------------------------------------
|
|
301
|
+
# Core functions
|
|
302
|
+
# -----------------------------------------------------------------
|
|
303
|
+
|
|
304
|
+
def load_crosswalk():
|
|
305
|
+
"""Load and cache the crosswalk JSON data.
|
|
306
|
+
|
|
307
|
+
Returns the crosswalk array from control_crosswalk.json. Caches the
|
|
308
|
+
result in the module-level _CROSSWALK_CACHE to avoid repeated disk I/O.
|
|
309
|
+
|
|
310
|
+
Returns:
|
|
311
|
+
list: Array of crosswalk mapping dicts from the JSON file.
|
|
312
|
+
|
|
313
|
+
Raises:
|
|
314
|
+
FileNotFoundError: If the crosswalk JSON file does not exist.
|
|
315
|
+
"""
|
|
316
|
+
global _CROSSWALK_CACHE
|
|
317
|
+
if _CROSSWALK_CACHE is not None:
|
|
318
|
+
return _CROSSWALK_CACHE
|
|
319
|
+
|
|
320
|
+
if not CROSSWALK_PATH.exists():
|
|
321
|
+
raise FileNotFoundError(
|
|
322
|
+
f"Crosswalk data file not found: {CROSSWALK_PATH}\n"
|
|
323
|
+
"Expected: context/compliance/control_crosswalk.json"
|
|
324
|
+
)
|
|
325
|
+
with open(CROSSWALK_PATH, "r", encoding="utf-8") as f:
|
|
326
|
+
data = json.load(f)
|
|
327
|
+
|
|
328
|
+
_CROSSWALK_CACHE = data.get("crosswalk", [])
|
|
329
|
+
return _CROSSWALK_CACHE
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def load_iso_bridge():
|
|
333
|
+
"""Load and cache the ISO 27001 ↔ NIST 800-53 bridge data (ADR D111).
|
|
334
|
+
|
|
335
|
+
Returns:
|
|
336
|
+
list: Array of bridge mapping dicts from iso27001_nist_bridge.json.
|
|
337
|
+
"""
|
|
338
|
+
global _ISO_BRIDGE_CACHE
|
|
339
|
+
if _ISO_BRIDGE_CACHE is not None:
|
|
340
|
+
return _ISO_BRIDGE_CACHE
|
|
341
|
+
|
|
342
|
+
if not ISO_BRIDGE_PATH.exists():
|
|
343
|
+
_ISO_BRIDGE_CACHE = []
|
|
344
|
+
return _ISO_BRIDGE_CACHE
|
|
345
|
+
|
|
346
|
+
with open(ISO_BRIDGE_PATH, "r", encoding="utf-8") as f:
|
|
347
|
+
data = json.load(f)
|
|
348
|
+
|
|
349
|
+
_ISO_BRIDGE_CACHE = data.get("mappings", [])
|
|
350
|
+
return _ISO_BRIDGE_CACHE
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
def get_nist_for_iso_control(iso_id):
|
|
354
|
+
"""Given an ISO 27001 control ID, return mapped NIST 800-53 controls.
|
|
355
|
+
|
|
356
|
+
Args:
|
|
357
|
+
iso_id: ISO 27001 Annex A control ID (e.g., "A.5.1").
|
|
358
|
+
|
|
359
|
+
Returns:
|
|
360
|
+
list: List of NIST 800-53 control IDs that map to this ISO control.
|
|
361
|
+
"""
|
|
362
|
+
bridge = load_iso_bridge()
|
|
363
|
+
iso_upper = iso_id.upper()
|
|
364
|
+
|
|
365
|
+
for entry in bridge:
|
|
366
|
+
if entry.get("iso_27001", "").upper() == iso_upper:
|
|
367
|
+
return entry.get("nist_800_53", [])
|
|
368
|
+
|
|
369
|
+
return []
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
def get_iso_for_nist_control(nist_id):
|
|
373
|
+
"""Given a NIST 800-53 control ID, return mapped ISO 27001 controls.
|
|
374
|
+
|
|
375
|
+
Args:
|
|
376
|
+
nist_id: NIST 800-53 control ID (e.g., "AC-1").
|
|
377
|
+
|
|
378
|
+
Returns:
|
|
379
|
+
list: List of dicts with iso_27001, iso_title, mapping_type for each
|
|
380
|
+
ISO control that maps to this NIST control.
|
|
381
|
+
"""
|
|
382
|
+
bridge = load_iso_bridge()
|
|
383
|
+
nist_upper = nist_id.upper()
|
|
384
|
+
|
|
385
|
+
results = []
|
|
386
|
+
for entry in bridge:
|
|
387
|
+
nist_refs = entry.get("nist_800_53", [])
|
|
388
|
+
if nist_upper in [r.upper() for r in nist_refs]:
|
|
389
|
+
results.append({
|
|
390
|
+
"iso_27001": entry.get("iso_27001"),
|
|
391
|
+
"iso_title": entry.get("iso_title"),
|
|
392
|
+
"mapping_type": entry.get("mapping_type", "equivalent"),
|
|
393
|
+
})
|
|
394
|
+
|
|
395
|
+
return results
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
def get_frameworks_for_control(nist_id):
|
|
399
|
+
"""Given a NIST 800-53 control ID, return all frameworks it satisfies.
|
|
400
|
+
|
|
401
|
+
Args:
|
|
402
|
+
nist_id: NIST 800-53 control ID (e.g., "AC-2").
|
|
403
|
+
|
|
404
|
+
Returns:
|
|
405
|
+
dict: Mapping of framework keys to their values. Boolean True for
|
|
406
|
+
frameworks where the control applies, or a string identifier
|
|
407
|
+
for frameworks with distinct control IDs (e.g., CMMC practice IDs).
|
|
408
|
+
Returns empty dict if control not found.
|
|
409
|
+
|
|
410
|
+
Example:
|
|
411
|
+
>>> get_frameworks_for_control("AC-2")
|
|
412
|
+
{
|
|
413
|
+
"fedramp_moderate": True,
|
|
414
|
+
"fedramp_high": True,
|
|
415
|
+
"nist_800_171": "3.1.1",
|
|
416
|
+
"cmmc_level_2": "AC.L2-3.1.1",
|
|
417
|
+
...
|
|
418
|
+
}
|
|
419
|
+
"""
|
|
420
|
+
crosswalk = load_crosswalk()
|
|
421
|
+
nist_upper = nist_id.upper()
|
|
422
|
+
|
|
423
|
+
for entry in crosswalk:
|
|
424
|
+
entry_nist = entry.get("nist_id", entry.get("nist_800_53", ""))
|
|
425
|
+
if entry_nist.upper() == nist_upper:
|
|
426
|
+
result = {}
|
|
427
|
+
for fw_key in FRAMEWORK_KEYS:
|
|
428
|
+
val = entry.get(fw_key)
|
|
429
|
+
if val is not None and val is not False:
|
|
430
|
+
result[fw_key] = val
|
|
431
|
+
# Also check ISO 27001 bridge (ADR D111)
|
|
432
|
+
if "iso_27001" not in result:
|
|
433
|
+
iso_mappings = get_iso_for_nist_control(nist_upper)
|
|
434
|
+
if iso_mappings:
|
|
435
|
+
result["iso_27001"] = [m["iso_27001"] for m in iso_mappings]
|
|
436
|
+
return result
|
|
437
|
+
|
|
438
|
+
return {}
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
def get_controls_for_framework(framework, baseline=None):
|
|
442
|
+
"""Return all NIST 800-53 controls required for a specific framework.
|
|
443
|
+
|
|
444
|
+
Args:
|
|
445
|
+
framework: Framework name (e.g., "fedramp", "cmmc", "800-171").
|
|
446
|
+
baseline: Optional baseline level (e.g., "moderate", "high", "l2", "l3").
|
|
447
|
+
|
|
448
|
+
Returns:
|
|
449
|
+
list: List of crosswalk entry dicts for controls in the framework.
|
|
450
|
+
Each dict contains nist_id, title, family, priority, and
|
|
451
|
+
framework-specific mapping values.
|
|
452
|
+
|
|
453
|
+
Example:
|
|
454
|
+
>>> controls = get_controls_for_framework("fedramp", "moderate")
|
|
455
|
+
>>> len(controls) # Number of controls in FedRAMP Moderate
|
|
456
|
+
39
|
|
457
|
+
"""
|
|
458
|
+
crosswalk = load_crosswalk()
|
|
459
|
+
|
|
460
|
+
# Resolve framework + baseline to a crosswalk key
|
|
461
|
+
fw_lower = framework.lower().replace("-", "_").replace(" ", "_")
|
|
462
|
+
crosswalk_key = None
|
|
463
|
+
|
|
464
|
+
if fw_lower in FRAMEWORK_ALIASES:
|
|
465
|
+
baseline_map = FRAMEWORK_ALIASES[fw_lower]
|
|
466
|
+
if baseline:
|
|
467
|
+
bl = baseline.lower().replace("-", "_").replace(" ", "_")
|
|
468
|
+
crosswalk_key = baseline_map.get(bl)
|
|
469
|
+
if crosswalk_key is None:
|
|
470
|
+
crosswalk_key = baseline_map.get(None)
|
|
471
|
+
elif fw_lower in FRAMEWORK_KEYS:
|
|
472
|
+
crosswalk_key = fw_lower
|
|
473
|
+
elif f"{fw_lower}_{baseline}" in FRAMEWORK_KEYS if baseline else False:
|
|
474
|
+
crosswalk_key = f"{fw_lower}_{baseline}"
|
|
475
|
+
|
|
476
|
+
if crosswalk_key is None:
|
|
477
|
+
# Try direct key match as fallback
|
|
478
|
+
for key in FRAMEWORK_KEYS:
|
|
479
|
+
if fw_lower in key or key in fw_lower:
|
|
480
|
+
crosswalk_key = key
|
|
481
|
+
break
|
|
482
|
+
|
|
483
|
+
if crosswalk_key is None:
|
|
484
|
+
return []
|
|
485
|
+
|
|
486
|
+
results = []
|
|
487
|
+
for entry in crosswalk:
|
|
488
|
+
val = entry.get(crosswalk_key)
|
|
489
|
+
if val is not None and val is not False:
|
|
490
|
+
results.append(entry)
|
|
491
|
+
|
|
492
|
+
return results
|
|
493
|
+
|
|
494
|
+
|
|
495
|
+
def get_controls_for_impact_level(il_level):
|
|
496
|
+
"""Return required NIST 800-53 controls for a DoD Impact Level.
|
|
497
|
+
|
|
498
|
+
Args:
|
|
499
|
+
il_level: Impact level string ("IL4", "IL4", or "IL4").
|
|
500
|
+
|
|
501
|
+
Returns:
|
|
502
|
+
list: List of crosswalk entry dicts for controls required at
|
|
503
|
+
the specified impact level.
|
|
504
|
+
|
|
505
|
+
Raises:
|
|
506
|
+
ValueError: If il_level is not IL4, IL4, or IL4.
|
|
507
|
+
"""
|
|
508
|
+
il_upper = il_level.upper()
|
|
509
|
+
if il_upper not in IL_KEYS:
|
|
510
|
+
raise ValueError(
|
|
511
|
+
f"Invalid impact level '{il_level}'. Valid: IL4, IL4, IL4"
|
|
512
|
+
)
|
|
513
|
+
|
|
514
|
+
crosswalk_key = IL_KEYS[il_upper]
|
|
515
|
+
crosswalk = load_crosswalk()
|
|
516
|
+
|
|
517
|
+
results = []
|
|
518
|
+
for entry in crosswalk:
|
|
519
|
+
val = entry.get(crosswalk_key)
|
|
520
|
+
if val is not None and val is not False:
|
|
521
|
+
results.append(entry)
|
|
522
|
+
|
|
523
|
+
return results
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
def compute_crosswalk_coverage(project_id, db_path=None):
|
|
527
|
+
"""Query project_controls for implemented controls and compute per-framework coverage.
|
|
528
|
+
|
|
529
|
+
Cross-references the project's implemented controls against the crosswalk
|
|
530
|
+
data to determine coverage percentage for each framework.
|
|
531
|
+
|
|
532
|
+
Args:
|
|
533
|
+
project_id: The project identifier.
|
|
534
|
+
db_path: Optional database path override.
|
|
535
|
+
|
|
536
|
+
Returns:
|
|
537
|
+
dict: Per-framework coverage data:
|
|
538
|
+
{
|
|
539
|
+
"fedramp_moderate": {
|
|
540
|
+
"total": 39, "implemented": 15, "coverage_pct": 38.5
|
|
541
|
+
},
|
|
542
|
+
...
|
|
543
|
+
}
|
|
544
|
+
"""
|
|
545
|
+
conn = get_connection(db_path=db_path)
|
|
546
|
+
try:
|
|
547
|
+
_ensure_crosswalk_tables(conn)
|
|
548
|
+
|
|
549
|
+
# Get all implemented/partially-implemented control IDs for this project
|
|
550
|
+
rows = conn.execute(
|
|
551
|
+
"""SELECT control_id, implementation_status
|
|
552
|
+
FROM project_controls
|
|
553
|
+
WHERE project_id = ?""",
|
|
554
|
+
(project_id,),
|
|
555
|
+
).fetchall()
|
|
556
|
+
|
|
557
|
+
implemented_ids = set()
|
|
558
|
+
for row in rows:
|
|
559
|
+
status = row["implementation_status"]
|
|
560
|
+
if status in ("implemented", "partially_implemented"):
|
|
561
|
+
implemented_ids.add(row["control_id"].upper())
|
|
562
|
+
|
|
563
|
+
crosswalk = load_crosswalk()
|
|
564
|
+
|
|
565
|
+
# Compute per-framework coverage
|
|
566
|
+
coverage = {}
|
|
567
|
+
for fw_key, fw_name in FRAMEWORK_KEYS.items():
|
|
568
|
+
total = 0
|
|
569
|
+
implemented = 0
|
|
570
|
+
for entry in crosswalk:
|
|
571
|
+
val = entry.get(fw_key)
|
|
572
|
+
if val is not None and val is not False:
|
|
573
|
+
total += 1
|
|
574
|
+
nist = entry.get("nist_id", entry.get("nist_800_53", ""))
|
|
575
|
+
if nist.upper() in implemented_ids:
|
|
576
|
+
implemented += 1
|
|
577
|
+
|
|
578
|
+
pct = round((implemented / total * 100), 1) if total > 0 else 0.0
|
|
579
|
+
coverage[fw_key] = {
|
|
580
|
+
"total": total,
|
|
581
|
+
"implemented": implemented,
|
|
582
|
+
"coverage_pct": pct,
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
# Update project_framework_status table
|
|
586
|
+
now = datetime.now(timezone.utc).isoformat()
|
|
587
|
+
for fw_key, data in coverage.items():
|
|
588
|
+
gate = "not_started"
|
|
589
|
+
if data["coverage_pct"] >= 100.0:
|
|
590
|
+
gate = "compliant"
|
|
591
|
+
elif data["coverage_pct"] > 0:
|
|
592
|
+
gate = "in_progress"
|
|
593
|
+
|
|
594
|
+
# Map gate status to schema CHECK values
|
|
595
|
+
db_gate = {"not_started": "incomplete", "in_progress": "incomplete",
|
|
596
|
+
"compliant": "pass", "non_compliant": "fail"}.get(gate, "incomplete")
|
|
597
|
+
conn.execute(
|
|
598
|
+
"""INSERT INTO project_framework_status
|
|
599
|
+
(project_id, framework_id, total_controls,
|
|
600
|
+
implemented_count, coverage_pct, gate_status,
|
|
601
|
+
last_assessed, updated_at)
|
|
602
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
603
|
+
ON CONFLICT (project_id, framework_id) DO UPDATE SET
|
|
604
|
+
total_controls = ?,
|
|
605
|
+
implemented_count = ?,
|
|
606
|
+
coverage_pct = ?,
|
|
607
|
+
gate_status = ?,
|
|
608
|
+
last_assessed = ?,
|
|
609
|
+
updated_at = ?""",
|
|
610
|
+
(
|
|
611
|
+
project_id, fw_key, data["total"],
|
|
612
|
+
data["implemented"], data["coverage_pct"],
|
|
613
|
+
db_gate, now, now,
|
|
614
|
+
data["total"], data["implemented"],
|
|
615
|
+
data["coverage_pct"], db_gate, now, now,
|
|
616
|
+
),
|
|
617
|
+
)
|
|
618
|
+
conn.commit()
|
|
619
|
+
|
|
620
|
+
# Log audit event
|
|
621
|
+
_log_audit_event(
|
|
622
|
+
conn, project_id,
|
|
623
|
+
"Crosswalk coverage computed",
|
|
624
|
+
{
|
|
625
|
+
"frameworks_assessed": len(coverage),
|
|
626
|
+
"implemented_controls": len(implemented_ids),
|
|
627
|
+
"coverage_summary": {
|
|
628
|
+
k: v["coverage_pct"] for k, v in coverage.items()
|
|
629
|
+
},
|
|
630
|
+
},
|
|
631
|
+
)
|
|
632
|
+
|
|
633
|
+
return coverage
|
|
634
|
+
finally:
|
|
635
|
+
conn.close()
|
|
636
|
+
|
|
637
|
+
|
|
638
|
+
def get_gap_analysis(project_id, target_framework, baseline=None, db_path=None):
|
|
639
|
+
"""Return unimplemented controls for a target framework with priority ordering.
|
|
640
|
+
|
|
641
|
+
Args:
|
|
642
|
+
project_id: The project identifier.
|
|
643
|
+
target_framework: Target framework name (e.g., "fedramp", "cmmc").
|
|
644
|
+
baseline: Optional baseline level (e.g., "moderate", "high").
|
|
645
|
+
db_path: Optional database path override.
|
|
646
|
+
|
|
647
|
+
Returns:
|
|
648
|
+
list: List of gap dicts sorted by priority (P1 first), each containing:
|
|
649
|
+
{
|
|
650
|
+
"nist_id": "AC-3",
|
|
651
|
+
"title": "Access Enforcement",
|
|
652
|
+
"priority": "P1",
|
|
653
|
+
"family": "AC",
|
|
654
|
+
"framework_id": "FedRAMP Moderate",
|
|
655
|
+
"framework_control_id": True,
|
|
656
|
+
"status": "planned"
|
|
657
|
+
}
|
|
658
|
+
"""
|
|
659
|
+
conn = get_connection(db_path=db_path)
|
|
660
|
+
try:
|
|
661
|
+
# Get all control IDs and statuses for this project
|
|
662
|
+
rows = conn.execute(
|
|
663
|
+
"""SELECT control_id, implementation_status
|
|
664
|
+
FROM project_controls
|
|
665
|
+
WHERE project_id = ?""",
|
|
666
|
+
(project_id,),
|
|
667
|
+
).fetchall()
|
|
668
|
+
|
|
669
|
+
project_controls = {}
|
|
670
|
+
for row in rows:
|
|
671
|
+
project_controls[row["control_id"].upper()] = row["implementation_status"]
|
|
672
|
+
|
|
673
|
+
# Get all controls required by the target framework
|
|
674
|
+
required = get_controls_for_framework(target_framework, baseline)
|
|
675
|
+
|
|
676
|
+
# Resolve framework key for display
|
|
677
|
+
fw_lower = target_framework.lower().replace("-", "_").replace(" ", "_")
|
|
678
|
+
crosswalk_key = None
|
|
679
|
+
if fw_lower in FRAMEWORK_ALIASES:
|
|
680
|
+
baseline_map = FRAMEWORK_ALIASES[fw_lower]
|
|
681
|
+
if baseline:
|
|
682
|
+
bl = baseline.lower().replace("-", "_").replace(" ", "_")
|
|
683
|
+
crosswalk_key = baseline_map.get(bl)
|
|
684
|
+
if crosswalk_key is None:
|
|
685
|
+
crosswalk_key = baseline_map.get(None)
|
|
686
|
+
elif fw_lower in FRAMEWORK_KEYS:
|
|
687
|
+
crosswalk_key = fw_lower
|
|
688
|
+
|
|
689
|
+
fw_display = FRAMEWORK_KEYS.get(crosswalk_key, target_framework)
|
|
690
|
+
|
|
691
|
+
# Find gaps: controls that are not 'implemented'
|
|
692
|
+
gaps = []
|
|
693
|
+
for entry in required:
|
|
694
|
+
nist_id = entry.get("nist_id", entry.get("nist_800_53", "")).upper()
|
|
695
|
+
status = project_controls.get(nist_id, "not_mapped")
|
|
696
|
+
|
|
697
|
+
if status != "implemented":
|
|
698
|
+
gap = {
|
|
699
|
+
"nist_id": entry.get("nist_id", entry.get("nist_800_53", "")),
|
|
700
|
+
"title": entry.get("title", ""),
|
|
701
|
+
"priority": entry.get("priority", "P3"),
|
|
702
|
+
"family": entry.get("family", ""),
|
|
703
|
+
"framework_id": fw_display,
|
|
704
|
+
"framework_control_id": entry.get(crosswalk_key, ""),
|
|
705
|
+
"status": status,
|
|
706
|
+
}
|
|
707
|
+
gaps.append(gap)
|
|
708
|
+
|
|
709
|
+
# Sort by priority (P1 > P2 > P3), then by nist_id
|
|
710
|
+
priority_order = {"P1": 0, "P2": 1, "P3": 2}
|
|
711
|
+
gaps.sort(key=lambda g: (
|
|
712
|
+
priority_order.get(g["priority"], 99),
|
|
713
|
+
g["nist_id"],
|
|
714
|
+
))
|
|
715
|
+
|
|
716
|
+
return gaps
|
|
717
|
+
finally:
|
|
718
|
+
conn.close()
|
|
719
|
+
|
|
720
|
+
|
|
721
|
+
def map_implementation_across_frameworks(project_id, control_id, db_path=None):
|
|
722
|
+
"""Auto-update framework status when a NIST 800-53 control is implemented.
|
|
723
|
+
|
|
724
|
+
This is the key function enabling "implement once, satisfy many." When a
|
|
725
|
+
control is marked as implemented in project_controls, this function:
|
|
726
|
+
1. Looks up all frameworks the control satisfies via the crosswalk.
|
|
727
|
+
2. Populates/updates the control_crosswalk table with DB-level mappings.
|
|
728
|
+
3. Recomputes coverage for each affected framework.
|
|
729
|
+
4. Updates the project_framework_status table.
|
|
730
|
+
5. Logs the crosswalk mapping in the audit trail.
|
|
731
|
+
|
|
732
|
+
Args:
|
|
733
|
+
project_id: The project identifier.
|
|
734
|
+
control_id: The NIST 800-53 control ID (e.g., "AC-2").
|
|
735
|
+
db_path: Optional database path override.
|
|
736
|
+
|
|
737
|
+
Returns:
|
|
738
|
+
dict: Summary of frameworks updated:
|
|
739
|
+
{
|
|
740
|
+
"control_id": "AC-2",
|
|
741
|
+
"frameworks_satisfied": ["fedramp_moderate", "fedramp_high", ...],
|
|
742
|
+
"coverage_updated": {
|
|
743
|
+
"fedramp_moderate": {"coverage_pct": 38.5},
|
|
744
|
+
...
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
"""
|
|
748
|
+
conn = get_connection(db_path=db_path)
|
|
749
|
+
try:
|
|
750
|
+
_ensure_crosswalk_tables(conn)
|
|
751
|
+
control_upper = control_id.upper()
|
|
752
|
+
|
|
753
|
+
# Verify the control is actually implemented for this project
|
|
754
|
+
row = conn.execute(
|
|
755
|
+
"""SELECT implementation_status
|
|
756
|
+
FROM project_controls
|
|
757
|
+
WHERE project_id = ? AND control_id = ?""",
|
|
758
|
+
(project_id, control_upper),
|
|
759
|
+
).fetchone()
|
|
760
|
+
|
|
761
|
+
if not row:
|
|
762
|
+
raise ValueError(
|
|
763
|
+
f"Control '{control_id}' not found in project_controls "
|
|
764
|
+
f"for project '{project_id}'."
|
|
765
|
+
)
|
|
766
|
+
|
|
767
|
+
# Look up all frameworks this control satisfies
|
|
768
|
+
frameworks = get_frameworks_for_control(control_upper)
|
|
769
|
+
if not frameworks:
|
|
770
|
+
return {
|
|
771
|
+
"control_id": control_upper,
|
|
772
|
+
"frameworks_satisfied": [],
|
|
773
|
+
"coverage_updated": {},
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
satisfied = list(frameworks.keys())
|
|
777
|
+
|
|
778
|
+
# Populate control_crosswalk table
|
|
779
|
+
now = datetime.now(timezone.utc).isoformat()
|
|
780
|
+
for fw_key, fw_val in frameworks.items():
|
|
781
|
+
fw_control_id = str(fw_val) if fw_val is not True else None
|
|
782
|
+
try:
|
|
783
|
+
conn.execute(
|
|
784
|
+
"""INSERT OR REPLACE INTO control_crosswalk
|
|
785
|
+
(nist_800_53_id, framework_id, framework_control_id,
|
|
786
|
+
mapping_type, created_at)
|
|
787
|
+
VALUES (?, ?, ?, ?, ?)""",
|
|
788
|
+
(
|
|
789
|
+
control_upper, fw_key, fw_control_id,
|
|
790
|
+
"equivalent", now,
|
|
791
|
+
),
|
|
792
|
+
)
|
|
793
|
+
except Exception as e:
|
|
794
|
+
print(
|
|
795
|
+
f"Warning: Could not upsert crosswalk for "
|
|
796
|
+
f"{control_upper} -> {fw_key}: {e}",
|
|
797
|
+
file=sys.stderr,
|
|
798
|
+
)
|
|
799
|
+
conn.commit()
|
|
800
|
+
|
|
801
|
+
# Recompute coverage (this also updates project_framework_status)
|
|
802
|
+
# Close and reopen to avoid lock issues with compute_crosswalk_coverage
|
|
803
|
+
conn.close()
|
|
804
|
+
coverage = compute_crosswalk_coverage(project_id, db_path=db_path)
|
|
805
|
+
|
|
806
|
+
# Reopen for final audit log
|
|
807
|
+
conn = get_connection(db_path=db_path)
|
|
808
|
+
coverage_summary = {
|
|
809
|
+
k: {"coverage_pct": v["coverage_pct"]}
|
|
810
|
+
for k, v in coverage.items()
|
|
811
|
+
if k in satisfied
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
_log_audit_event(
|
|
815
|
+
conn, project_id,
|
|
816
|
+
f"Crosswalk mapped: {control_upper} -> {len(satisfied)} frameworks",
|
|
817
|
+
{
|
|
818
|
+
"control_id": control_upper,
|
|
819
|
+
"implementation_status": row["implementation_status"],
|
|
820
|
+
"frameworks_satisfied": satisfied,
|
|
821
|
+
"coverage_summary": coverage_summary,
|
|
822
|
+
},
|
|
823
|
+
)
|
|
824
|
+
|
|
825
|
+
return {
|
|
826
|
+
"control_id": control_upper,
|
|
827
|
+
"frameworks_satisfied": satisfied,
|
|
828
|
+
"coverage_updated": coverage_summary,
|
|
829
|
+
}
|
|
830
|
+
finally:
|
|
831
|
+
conn.close()
|
|
832
|
+
|
|
833
|
+
|
|
834
|
+
def get_crosswalk_summary():
|
|
835
|
+
"""Return summary statistics for the crosswalk dataset.
|
|
836
|
+
|
|
837
|
+
Returns:
|
|
838
|
+
dict: Summary containing:
|
|
839
|
+
{
|
|
840
|
+
"total_controls": 39,
|
|
841
|
+
"frameworks": {
|
|
842
|
+
"fedramp_moderate": {"count": 39, "name": "FedRAMP Moderate"},
|
|
843
|
+
...
|
|
844
|
+
},
|
|
845
|
+
"impact_levels": {
|
|
846
|
+
"IL4": 39, "IL4": 39, "IL4": 39
|
|
847
|
+
},
|
|
848
|
+
"families": {
|
|
849
|
+
"AC": 5, "AU": 5, "CM": 5, ...
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
"""
|
|
853
|
+
crosswalk = load_crosswalk()
|
|
854
|
+
|
|
855
|
+
# Per-framework counts
|
|
856
|
+
fw_counts = {}
|
|
857
|
+
for fw_key, fw_name in FRAMEWORK_KEYS.items():
|
|
858
|
+
count = 0
|
|
859
|
+
for entry in crosswalk:
|
|
860
|
+
val = entry.get(fw_key)
|
|
861
|
+
if val is not None and val is not False:
|
|
862
|
+
count += 1
|
|
863
|
+
fw_counts[fw_key] = {"count": count, "name": fw_name}
|
|
864
|
+
|
|
865
|
+
# Per-IL counts
|
|
866
|
+
il_counts = {}
|
|
867
|
+
for il_name, il_key in IL_KEYS.items():
|
|
868
|
+
count = 0
|
|
869
|
+
for entry in crosswalk:
|
|
870
|
+
val = entry.get(il_key)
|
|
871
|
+
if val is not None and val is not False:
|
|
872
|
+
count += 1
|
|
873
|
+
il_counts[il_name] = count
|
|
874
|
+
|
|
875
|
+
# Per-family counts
|
|
876
|
+
family_counts = {}
|
|
877
|
+
for entry in crosswalk:
|
|
878
|
+
fam = entry.get("family", "??")
|
|
879
|
+
family_counts[fam] = family_counts.get(fam, 0) + 1
|
|
880
|
+
|
|
881
|
+
return {
|
|
882
|
+
"total_controls": len(crosswalk),
|
|
883
|
+
"frameworks": fw_counts,
|
|
884
|
+
"impact_levels": il_counts,
|
|
885
|
+
"families": dict(sorted(family_counts.items())),
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
|
|
889
|
+
# -----------------------------------------------------------------
|
|
890
|
+
# Formatting helpers
|
|
891
|
+
# -----------------------------------------------------------------
|
|
892
|
+
|
|
893
|
+
def _resolve_framework_key(framework, baseline=None):
|
|
894
|
+
"""Resolve a CLI framework name + baseline to a crosswalk key."""
|
|
895
|
+
fw_lower = framework.lower().replace("-", "_").replace(" ", "_")
|
|
896
|
+
crosswalk_key = None
|
|
897
|
+
|
|
898
|
+
if fw_lower in FRAMEWORK_ALIASES:
|
|
899
|
+
baseline_map = FRAMEWORK_ALIASES[fw_lower]
|
|
900
|
+
if baseline:
|
|
901
|
+
bl = baseline.lower().replace("-", "_").replace(" ", "_")
|
|
902
|
+
crosswalk_key = baseline_map.get(bl)
|
|
903
|
+
if crosswalk_key is None:
|
|
904
|
+
crosswalk_key = baseline_map.get(None)
|
|
905
|
+
elif fw_lower in FRAMEWORK_KEYS:
|
|
906
|
+
crosswalk_key = fw_lower
|
|
907
|
+
|
|
908
|
+
return crosswalk_key
|
|
909
|
+
|
|
910
|
+
|
|
911
|
+
def _format_control_lookup(nist_id, frameworks, as_json=False):
|
|
912
|
+
"""Format the output of a control lookup."""
|
|
913
|
+
if as_json:
|
|
914
|
+
return json.dumps(
|
|
915
|
+
{"nist_id": nist_id, "frameworks": frameworks},
|
|
916
|
+
indent=2,
|
|
917
|
+
)
|
|
918
|
+
|
|
919
|
+
if not frameworks:
|
|
920
|
+
return f"Control '{nist_id}' not found in crosswalk data."
|
|
921
|
+
|
|
922
|
+
lines = [
|
|
923
|
+
f"{'=' * 60}",
|
|
924
|
+
f" Crosswalk: {nist_id}",
|
|
925
|
+
f"{'=' * 60}",
|
|
926
|
+
]
|
|
927
|
+
for fw_key, fw_val in sorted(frameworks.items()):
|
|
928
|
+
fw_name = FRAMEWORK_KEYS.get(fw_key, fw_key)
|
|
929
|
+
if fw_val is True:
|
|
930
|
+
lines.append(f" {fw_name:<25} Required")
|
|
931
|
+
else:
|
|
932
|
+
lines.append(f" {fw_name:<25} {fw_val}")
|
|
933
|
+
lines.append(f"{'=' * 60}")
|
|
934
|
+
return "\n".join(lines)
|
|
935
|
+
|
|
936
|
+
|
|
937
|
+
def _format_framework_controls(framework, baseline, controls, as_json=False):
|
|
938
|
+
"""Format the list of controls for a framework."""
|
|
939
|
+
if as_json:
|
|
940
|
+
return json.dumps(
|
|
941
|
+
{
|
|
942
|
+
"framework": framework,
|
|
943
|
+
"baseline": baseline,
|
|
944
|
+
"total_controls": len(controls),
|
|
945
|
+
"controls": [
|
|
946
|
+
{
|
|
947
|
+
"nist_id": c["nist_id"],
|
|
948
|
+
"title": c.get("title", ""),
|
|
949
|
+
"family": c.get("family", ""),
|
|
950
|
+
"priority": c.get("priority", ""),
|
|
951
|
+
}
|
|
952
|
+
for c in controls
|
|
953
|
+
],
|
|
954
|
+
},
|
|
955
|
+
indent=2,
|
|
956
|
+
)
|
|
957
|
+
|
|
958
|
+
if not controls:
|
|
959
|
+
return f"No controls found for framework '{framework}' (baseline: {baseline or 'any'})."
|
|
960
|
+
|
|
961
|
+
label = f"{framework}"
|
|
962
|
+
if baseline:
|
|
963
|
+
label += f" ({baseline})"
|
|
964
|
+
|
|
965
|
+
lines = [
|
|
966
|
+
f"Controls required for {label}: {len(controls)}",
|
|
967
|
+
f"{'=' * 70}",
|
|
968
|
+
f"{'NIST ID':<10} {'Family':<8} {'Priority':<10} {'Title'}",
|
|
969
|
+
f"{'-' * 70}",
|
|
970
|
+
]
|
|
971
|
+
for c in sorted(controls, key=lambda x: x["nist_id"]):
|
|
972
|
+
lines.append(
|
|
973
|
+
f"{c['nist_id']:<10} {c.get('family', ''):<8} "
|
|
974
|
+
f"{c.get('priority', ''):<10} {c.get('title', '')}"
|
|
975
|
+
)
|
|
976
|
+
lines.append(f"{'=' * 70}")
|
|
977
|
+
lines.append(f"Total: {len(controls)} controls")
|
|
978
|
+
return "\n".join(lines)
|
|
979
|
+
|
|
980
|
+
|
|
981
|
+
def _format_coverage(project_id, coverage, as_json=False):
|
|
982
|
+
"""Format crosswalk coverage data."""
|
|
983
|
+
if as_json:
|
|
984
|
+
return json.dumps(
|
|
985
|
+
{"project_id": project_id, "coverage": coverage},
|
|
986
|
+
indent=2,
|
|
987
|
+
)
|
|
988
|
+
|
|
989
|
+
lines = [
|
|
990
|
+
f"{'=' * 65}",
|
|
991
|
+
f" Crosswalk Coverage: {project_id}",
|
|
992
|
+
f"{'=' * 65}",
|
|
993
|
+
f" {'Framework':<25} {'Implemented':<15} {'Total':<10} {'Coverage'}",
|
|
994
|
+
f" {'-' * 60}",
|
|
995
|
+
]
|
|
996
|
+
for fw_key in FRAMEWORK_KEYS:
|
|
997
|
+
if fw_key in coverage:
|
|
998
|
+
data = coverage[fw_key]
|
|
999
|
+
fw_name = FRAMEWORK_KEYS[fw_key]
|
|
1000
|
+
pct_str = f"{data['coverage_pct']:.1f}%"
|
|
1001
|
+
bar_len = int(data["coverage_pct"] / 5)
|
|
1002
|
+
bar = "#" * bar_len + "." * (20 - bar_len)
|
|
1003
|
+
lines.append(
|
|
1004
|
+
f" {fw_name:<25} {data['implemented']:<15} "
|
|
1005
|
+
f"{data['total']:<10} {pct_str:<8} [{bar}]"
|
|
1006
|
+
)
|
|
1007
|
+
lines.append(f"{'=' * 65}")
|
|
1008
|
+
return "\n".join(lines)
|
|
1009
|
+
|
|
1010
|
+
|
|
1011
|
+
def _format_gap_analysis(project_id, framework, gaps, as_json=False):
|
|
1012
|
+
"""Format gap analysis results."""
|
|
1013
|
+
if as_json:
|
|
1014
|
+
return json.dumps(
|
|
1015
|
+
{
|
|
1016
|
+
"project_id": project_id,
|
|
1017
|
+
"framework": framework,
|
|
1018
|
+
"total_gaps": len(gaps),
|
|
1019
|
+
"gaps": gaps,
|
|
1020
|
+
},
|
|
1021
|
+
indent=2,
|
|
1022
|
+
)
|
|
1023
|
+
|
|
1024
|
+
if not gaps:
|
|
1025
|
+
return f"No gaps found for project '{project_id}' against {framework}. Full coverage achieved."
|
|
1026
|
+
|
|
1027
|
+
lines = [
|
|
1028
|
+
f"{'=' * 75}",
|
|
1029
|
+
f" Gap Analysis: {project_id} -> {framework}",
|
|
1030
|
+
f" Total Gaps: {len(gaps)}",
|
|
1031
|
+
f"{'=' * 75}",
|
|
1032
|
+
f" {'NIST ID':<10} {'Priority':<10} {'Status':<22} {'Title'}",
|
|
1033
|
+
f" {'-' * 70}",
|
|
1034
|
+
]
|
|
1035
|
+
for gap in gaps:
|
|
1036
|
+
status_display = gap["status"].replace("_", " ")
|
|
1037
|
+
lines.append(
|
|
1038
|
+
f" {gap['nist_id']:<10} {gap['priority']:<10} "
|
|
1039
|
+
f"{status_display:<22} {gap['title']}"
|
|
1040
|
+
)
|
|
1041
|
+
lines.append(f"{'=' * 75}")
|
|
1042
|
+
|
|
1043
|
+
# Priority breakdown
|
|
1044
|
+
p1_count = sum(1 for g in gaps if g["priority"] == "P1")
|
|
1045
|
+
p2_count = sum(1 for g in gaps if g["priority"] == "P2")
|
|
1046
|
+
p3_count = sum(1 for g in gaps if g["priority"] == "P3")
|
|
1047
|
+
lines.append(f" Priority breakdown: P1={p1_count} P2={p2_count} P3={p3_count}")
|
|
1048
|
+
return "\n".join(lines)
|
|
1049
|
+
|
|
1050
|
+
|
|
1051
|
+
def _format_summary(summary, as_json=False):
|
|
1052
|
+
"""Format crosswalk summary statistics."""
|
|
1053
|
+
if as_json:
|
|
1054
|
+
return json.dumps(summary, indent=2)
|
|
1055
|
+
|
|
1056
|
+
lines = [
|
|
1057
|
+
f"{'=' * 60}",
|
|
1058
|
+
" Control Framework Crosswalk Summary",
|
|
1059
|
+
f"{'=' * 60}",
|
|
1060
|
+
f" Total NIST 800-53 controls mapped: {summary['total_controls']}",
|
|
1061
|
+
"",
|
|
1062
|
+
" Framework Coverage:",
|
|
1063
|
+
]
|
|
1064
|
+
for fw_key, fw_data in sorted(summary["frameworks"].items()):
|
|
1065
|
+
lines.append(f" {fw_data['name']:<25} {fw_data['count']} controls")
|
|
1066
|
+
|
|
1067
|
+
lines.append("")
|
|
1068
|
+
lines.append(" Impact Level Coverage:")
|
|
1069
|
+
for il_name, il_count in sorted(summary["impact_levels"].items()):
|
|
1070
|
+
lines.append(f" {il_name:<10} {il_count} controls")
|
|
1071
|
+
|
|
1072
|
+
lines.append("")
|
|
1073
|
+
lines.append(" Controls by Family:")
|
|
1074
|
+
for fam, count in summary["families"].items():
|
|
1075
|
+
lines.append(f" {fam:<8} {count} controls")
|
|
1076
|
+
|
|
1077
|
+
lines.append(f"{'=' * 60}")
|
|
1078
|
+
return "\n".join(lines)
|
|
1079
|
+
|
|
1080
|
+
|
|
1081
|
+
# -----------------------------------------------------------------
|
|
1082
|
+
# CLI entrypoint
|
|
1083
|
+
# -----------------------------------------------------------------
|
|
1084
|
+
|
|
1085
|
+
def main():
|
|
1086
|
+
parser = argparse.ArgumentParser(
|
|
1087
|
+
description="Control Framework Crosswalk Engine"
|
|
1088
|
+
)
|
|
1089
|
+
parser.add_argument(
|
|
1090
|
+
"--control",
|
|
1091
|
+
help="Look up frameworks for a NIST 800-53 control (e.g., AC-2)",
|
|
1092
|
+
)
|
|
1093
|
+
parser.add_argument(
|
|
1094
|
+
"--framework",
|
|
1095
|
+
help="List controls for a framework (fedramp, cmmc, 800-171)",
|
|
1096
|
+
)
|
|
1097
|
+
parser.add_argument(
|
|
1098
|
+
"--baseline",
|
|
1099
|
+
help="Framework baseline (moderate, high, l2, l3)",
|
|
1100
|
+
)
|
|
1101
|
+
parser.add_argument(
|
|
1102
|
+
"--impact-level",
|
|
1103
|
+
choices=["IL4", "IL4", "IL4"],
|
|
1104
|
+
help="Controls for impact level",
|
|
1105
|
+
)
|
|
1106
|
+
parser.add_argument(
|
|
1107
|
+
"--project-id",
|
|
1108
|
+
help="Project ID for coverage/gap analysis",
|
|
1109
|
+
)
|
|
1110
|
+
parser.add_argument(
|
|
1111
|
+
"--gap-analysis",
|
|
1112
|
+
action="store_true",
|
|
1113
|
+
help="Show gap analysis for target framework",
|
|
1114
|
+
)
|
|
1115
|
+
parser.add_argument(
|
|
1116
|
+
"--coverage",
|
|
1117
|
+
action="store_true",
|
|
1118
|
+
help="Show crosswalk coverage",
|
|
1119
|
+
)
|
|
1120
|
+
parser.add_argument(
|
|
1121
|
+
"--map-control",
|
|
1122
|
+
help="Map a control implementation across frameworks (requires --project-id)",
|
|
1123
|
+
)
|
|
1124
|
+
parser.add_argument(
|
|
1125
|
+
"--summary",
|
|
1126
|
+
action="store_true",
|
|
1127
|
+
help="Show crosswalk summary stats",
|
|
1128
|
+
)
|
|
1129
|
+
parser.add_argument(
|
|
1130
|
+
"--json",
|
|
1131
|
+
action="store_true",
|
|
1132
|
+
help="JSON output",
|
|
1133
|
+
)
|
|
1134
|
+
parser.add_argument(
|
|
1135
|
+
"--db-path",
|
|
1136
|
+
type=Path,
|
|
1137
|
+
help="Database path override",
|
|
1138
|
+
)
|
|
1139
|
+
args = parser.parse_args()
|
|
1140
|
+
|
|
1141
|
+
try:
|
|
1142
|
+
db_path = args.db_path if args.db_path else None
|
|
1143
|
+
|
|
1144
|
+
# --control: Look up frameworks for a NIST control
|
|
1145
|
+
if args.control:
|
|
1146
|
+
frameworks = get_frameworks_for_control(args.control)
|
|
1147
|
+
print(_format_control_lookup(args.control.upper(), frameworks, args.json))
|
|
1148
|
+
|
|
1149
|
+
# --framework (without --project-id): List controls for a framework
|
|
1150
|
+
elif args.framework and not args.project_id and not args.gap_analysis:
|
|
1151
|
+
controls = get_controls_for_framework(args.framework, args.baseline)
|
|
1152
|
+
print(_format_framework_controls(
|
|
1153
|
+
args.framework, args.baseline, controls, args.json
|
|
1154
|
+
))
|
|
1155
|
+
|
|
1156
|
+
# --impact-level: Controls for an impact level
|
|
1157
|
+
elif args.impact_level:
|
|
1158
|
+
controls = get_controls_for_impact_level(args.impact_level)
|
|
1159
|
+
print(_format_framework_controls(
|
|
1160
|
+
args.impact_level, None, controls, args.json
|
|
1161
|
+
))
|
|
1162
|
+
|
|
1163
|
+
# --project-id --coverage: Coverage report
|
|
1164
|
+
elif args.project_id and args.coverage:
|
|
1165
|
+
coverage = compute_crosswalk_coverage(args.project_id, db_path=db_path)
|
|
1166
|
+
print(_format_coverage(args.project_id, coverage, args.json))
|
|
1167
|
+
|
|
1168
|
+
# --project-id --framework --gap-analysis: Gap analysis
|
|
1169
|
+
elif args.project_id and args.framework and args.gap_analysis:
|
|
1170
|
+
gaps = get_gap_analysis(
|
|
1171
|
+
args.project_id, args.framework,
|
|
1172
|
+
baseline=args.baseline, db_path=db_path,
|
|
1173
|
+
)
|
|
1174
|
+
print(_format_gap_analysis(
|
|
1175
|
+
args.project_id, args.framework, gaps, args.json
|
|
1176
|
+
))
|
|
1177
|
+
|
|
1178
|
+
# --project-id --map-control: Map implementation across frameworks
|
|
1179
|
+
elif args.project_id and args.map_control:
|
|
1180
|
+
result = map_implementation_across_frameworks(
|
|
1181
|
+
args.project_id, args.map_control, db_path=db_path,
|
|
1182
|
+
)
|
|
1183
|
+
if args.json:
|
|
1184
|
+
print(json.dumps(result, indent=2))
|
|
1185
|
+
else:
|
|
1186
|
+
print(f"Mapped {result['control_id']} across "
|
|
1187
|
+
f"{len(result['frameworks_satisfied'])} frameworks:")
|
|
1188
|
+
for fw in result["frameworks_satisfied"]:
|
|
1189
|
+
fw_name = FRAMEWORK_KEYS.get(fw, fw)
|
|
1190
|
+
pct = result["coverage_updated"].get(fw, {}).get("coverage_pct", "N/A")
|
|
1191
|
+
print(f" {fw_name}: coverage now {pct}%")
|
|
1192
|
+
|
|
1193
|
+
# --summary: Crosswalk summary stats
|
|
1194
|
+
elif args.summary:
|
|
1195
|
+
summary = get_crosswalk_summary()
|
|
1196
|
+
print(_format_summary(summary, args.json))
|
|
1197
|
+
|
|
1198
|
+
else:
|
|
1199
|
+
parser.print_help()
|
|
1200
|
+
sys.exit(1)
|
|
1201
|
+
|
|
1202
|
+
except (FileNotFoundError, ValueError) as e:
|
|
1203
|
+
print(f"ERROR: {e}", file=sys.stderr)
|
|
1204
|
+
sys.exit(1)
|
|
1205
|
+
|
|
1206
|
+
|
|
1207
|
+
if __name__ == "__main__":
|
|
1208
|
+
main()
|