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,1340 @@
|
|
|
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
|
+
"""Classification and Marking Manager for ICDEV.
|
|
8
|
+
|
|
9
|
+
Handles CUI, SECRET, and TOP SECRET classification markings and maps DoD
|
|
10
|
+
Impact Levels (IL4-IL4) to compliance baselines, encryption requirements,
|
|
11
|
+
network requirements, and cloud environments.
|
|
12
|
+
|
|
13
|
+
Loads impact-level profiles from context/compliance/impact_level_profiles.json
|
|
14
|
+
and marking configuration from args/classification_markings.yaml (with
|
|
15
|
+
backward-compatible fallback to args/cui_markings.yaml).
|
|
16
|
+
|
|
17
|
+
CLI:
|
|
18
|
+
python tools/compliance/classification_manager.py --impact-level IL4
|
|
19
|
+
python tools/compliance/classification_manager.py --classification SECRET --banner
|
|
20
|
+
python tools/compliance/classification_manager.py --code-header python --classification CUI
|
|
21
|
+
python tools/compliance/classification_manager.py --cross-domain IL4 IL4
|
|
22
|
+
python tools/compliance/classification_manager.py --validate proj-123 --json
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
import argparse
|
|
26
|
+
import json
|
|
27
|
+
import sqlite3
|
|
28
|
+
import sys
|
|
29
|
+
from datetime import datetime, timezone
|
|
30
|
+
from pathlib import Path
|
|
31
|
+
from typing import Any, Dict, List, Optional
|
|
32
|
+
from tools.db.storage import get_connection
|
|
33
|
+
|
|
34
|
+
# ---------------------------------------------------------------------------
|
|
35
|
+
# Paths and constants
|
|
36
|
+
# ---------------------------------------------------------------------------
|
|
37
|
+
|
|
38
|
+
BASE_DIR = Path(__file__).resolve().parent.parent.parent
|
|
39
|
+
IL_PROFILES_PATH = BASE_DIR / "context" / "compliance" / "impact_level_profiles.json"
|
|
40
|
+
MARKINGS_PATH = BASE_DIR / "args" / "classification_markings.yaml"
|
|
41
|
+
CUI_MARKINGS_PATH = BASE_DIR / "args" / "cui_markings.yaml"
|
|
42
|
+
|
|
43
|
+
VALID_CLASSIFICATIONS = ("PUBLIC", "CUI", "SECRET", "TOP SECRET", "TOP SECRET//SCI")
|
|
44
|
+
VALID_IMPACT_LEVELS = ("IL4", "IL4", "IL4", "IL4")
|
|
45
|
+
|
|
46
|
+
# Module-level caches (populated on first call)
|
|
47
|
+
_IL_PROFILES_CACHE: Optional[Dict] = None
|
|
48
|
+
_MARKINGS_CACHE: Optional[Dict] = None
|
|
49
|
+
|
|
50
|
+
# Classification-to-impact-level mapping
|
|
51
|
+
_CLASSIFICATION_MAP = {
|
|
52
|
+
"IL4": "PUBLIC",
|
|
53
|
+
"IL4": "CUI",
|
|
54
|
+
"IL4": "CUI",
|
|
55
|
+
"IL4": "SECRET",
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
# Language comment-style mapping (language key -> prefix style)
|
|
59
|
+
# Kept in-module so the tool works standalone without language_support.py.
|
|
60
|
+
_COMMENT_STYLES = {
|
|
61
|
+
"python": "hash",
|
|
62
|
+
"ruby": "hash",
|
|
63
|
+
"java": "c-style",
|
|
64
|
+
"go": "c-style",
|
|
65
|
+
"rust": "c-style",
|
|
66
|
+
"csharp": "c-style",
|
|
67
|
+
"c#": "c-style",
|
|
68
|
+
"typescript": "c-style",
|
|
69
|
+
"javascript": "c-style",
|
|
70
|
+
"xml": "xml-style",
|
|
71
|
+
"html": "xml-style",
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
# Portion-marking shortcuts
|
|
75
|
+
_PORTION_MARKS = {
|
|
76
|
+
"PUBLIC": "",
|
|
77
|
+
"CUI": "(CUI)",
|
|
78
|
+
"SECRET": "(S)",
|
|
79
|
+
"TOP SECRET": "(TS)",
|
|
80
|
+
"TOP SECRET//SCI": "(TS//SCI)",
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
# ---------------------------------------------------------------------------
|
|
85
|
+
# Profile / config loaders
|
|
86
|
+
# ---------------------------------------------------------------------------
|
|
87
|
+
|
|
88
|
+
def load_impact_level_profiles() -> Dict:
|
|
89
|
+
"""Load and cache DoD Impact Level profiles from JSON.
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
Dict keyed by impact level (IL4, IL4, IL4, IL4) with full profile
|
|
93
|
+
data including classification, compliance baselines, encryption and
|
|
94
|
+
network requirements.
|
|
95
|
+
|
|
96
|
+
Falls back to a minimal default dict when the file is missing so that
|
|
97
|
+
downstream functions still return sensible CUI defaults.
|
|
98
|
+
"""
|
|
99
|
+
global _IL_PROFILES_CACHE
|
|
100
|
+
|
|
101
|
+
if _IL_PROFILES_CACHE is not None:
|
|
102
|
+
return _IL_PROFILES_CACHE
|
|
103
|
+
|
|
104
|
+
if IL_PROFILES_PATH.exists():
|
|
105
|
+
try:
|
|
106
|
+
with open(IL_PROFILES_PATH, "r", encoding="utf-8") as fh:
|
|
107
|
+
raw = json.load(fh)
|
|
108
|
+
_IL_PROFILES_CACHE = raw.get("profiles", raw)
|
|
109
|
+
# Also stash cross-domain requirements alongside profiles
|
|
110
|
+
if "cross_domain_requirements" in raw:
|
|
111
|
+
_IL_PROFILES_CACHE["_cross_domain"] = raw["cross_domain_requirements"]
|
|
112
|
+
return _IL_PROFILES_CACHE
|
|
113
|
+
except (json.JSONDecodeError, OSError) as exc:
|
|
114
|
+
print(
|
|
115
|
+
f"Warning: Could not load IL profiles ({exc}); "
|
|
116
|
+
"using built-in CUI defaults.",
|
|
117
|
+
file=sys.stderr,
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
# Minimal fallback
|
|
121
|
+
_IL_PROFILES_CACHE = {
|
|
122
|
+
"IL4": {
|
|
123
|
+
"classification": "CUI",
|
|
124
|
+
"fedramp_baseline": "moderate",
|
|
125
|
+
"cmmc_level": 2,
|
|
126
|
+
"nist_800_171_required": True,
|
|
127
|
+
"cloud_environments": ["aws-govcloud"],
|
|
128
|
+
"marking_banner": "CUI // SP-CTI",
|
|
129
|
+
"marking_category": "CTI",
|
|
130
|
+
"required_controls_overlay": [],
|
|
131
|
+
"encryption_requirements": {
|
|
132
|
+
"at_rest": "FIPS 140-2 validated modules",
|
|
133
|
+
"in_transit": "TLS 1.2+ with FIPS 140-2 validated modules",
|
|
134
|
+
"key_management": "Customer managed keys in FIPS 140-2 validated HSM",
|
|
135
|
+
},
|
|
136
|
+
"network_requirements": {
|
|
137
|
+
"dedicated_infrastructure": False,
|
|
138
|
+
"cross_domain": False,
|
|
139
|
+
"vpn_required": True,
|
|
140
|
+
"sipr_only": False,
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
}
|
|
144
|
+
return _IL_PROFILES_CACHE
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def load_markings_config() -> Dict:
|
|
148
|
+
"""Load and cache classification-marking YAML configuration.
|
|
149
|
+
|
|
150
|
+
Tries ``args/classification_markings.yaml`` first, then falls back to
|
|
151
|
+
``args/cui_markings.yaml`` for backward compatibility, and finally to
|
|
152
|
+
hard-coded CUI defaults if neither file is available.
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
Dict with keys like ``banner_top``, ``banner_bottom``,
|
|
156
|
+
``designation_indicator``, ``portion_marking``, ``code_header``,
|
|
157
|
+
``document_header``, ``document_footer``.
|
|
158
|
+
"""
|
|
159
|
+
global _MARKINGS_CACHE
|
|
160
|
+
|
|
161
|
+
if _MARKINGS_CACHE is not None:
|
|
162
|
+
return _MARKINGS_CACHE
|
|
163
|
+
|
|
164
|
+
# Hard-coded defaults (CUI)
|
|
165
|
+
defaults: Dict[str, Any] = {
|
|
166
|
+
"banner_top": "CUI // SP-CTI",
|
|
167
|
+
"banner_bottom": "CUI // SP-CTI",
|
|
168
|
+
"designation_indicator": {
|
|
169
|
+
"controlled_by": "Department of Defense",
|
|
170
|
+
"categories": "CTI",
|
|
171
|
+
"distribution": "Distribution D",
|
|
172
|
+
"poc": "ICDEV System Administrator",
|
|
173
|
+
},
|
|
174
|
+
"portion_marking": "(CUI)",
|
|
175
|
+
"decontrol_instructions": "Decontrol on: 10 years from creation date",
|
|
176
|
+
"code_header": (
|
|
177
|
+
"CUI // SP-CTI\n"
|
|
178
|
+
"Controlled by: Department of Defense\n"
|
|
179
|
+
"CUI Category: CTI\n"
|
|
180
|
+
"Distribution: D\n"
|
|
181
|
+
"POC: ICDEV System Administrator"
|
|
182
|
+
),
|
|
183
|
+
"document_header": (
|
|
184
|
+
"////////////////////////////////////////////////////////////////////\n"
|
|
185
|
+
"CONTROLLED UNCLASSIFIED INFORMATION (CUI) // SP-CTI\n"
|
|
186
|
+
"Distribution: Distribution D -- Authorized DoD Personnel Only\n"
|
|
187
|
+
"////////////////////////////////////////////////////////////////////"
|
|
188
|
+
),
|
|
189
|
+
"document_footer": (
|
|
190
|
+
"////////////////////////////////////////////////////////////////////\n"
|
|
191
|
+
"CUI // SP-CTI | Department of Defense\n"
|
|
192
|
+
"////////////////////////////////////////////////////////////////////"
|
|
193
|
+
),
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
# Try primary path, then fallback
|
|
197
|
+
for config_path in (MARKINGS_PATH, CUI_MARKINGS_PATH):
|
|
198
|
+
if not config_path.exists():
|
|
199
|
+
continue
|
|
200
|
+
try:
|
|
201
|
+
import yaml # type: ignore[import-untyped]
|
|
202
|
+
|
|
203
|
+
with open(config_path, "r", encoding="utf-8") as fh:
|
|
204
|
+
loaded = yaml.safe_load(fh)
|
|
205
|
+
if loaded and isinstance(loaded, dict):
|
|
206
|
+
for key, value in loaded.items():
|
|
207
|
+
defaults[key] = value
|
|
208
|
+
break # stop after the first successful load
|
|
209
|
+
except ImportError:
|
|
210
|
+
# PyYAML not available -- simple key: value parsing
|
|
211
|
+
try:
|
|
212
|
+
with open(config_path, "r", encoding="utf-8") as fh:
|
|
213
|
+
_parse_simple_yaml(fh.read(), defaults)
|
|
214
|
+
break
|
|
215
|
+
except Exception:
|
|
216
|
+
continue
|
|
217
|
+
except Exception:
|
|
218
|
+
continue
|
|
219
|
+
|
|
220
|
+
_MARKINGS_CACHE = defaults
|
|
221
|
+
return _MARKINGS_CACHE
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def _parse_simple_yaml(content: str, config: Dict) -> None:
|
|
225
|
+
"""Minimal YAML-like parser for flat ``key: value`` and ``|`` blocks."""
|
|
226
|
+
lines = content.split("\n")
|
|
227
|
+
current_key: Optional[str] = None
|
|
228
|
+
multiline_buf: List[str] = []
|
|
229
|
+
in_multiline = False
|
|
230
|
+
|
|
231
|
+
for line in lines:
|
|
232
|
+
stripped = line.strip()
|
|
233
|
+
if not stripped or stripped.startswith("#"):
|
|
234
|
+
if in_multiline:
|
|
235
|
+
multiline_buf.append("")
|
|
236
|
+
continue
|
|
237
|
+
|
|
238
|
+
if in_multiline:
|
|
239
|
+
if line and not line[0].isspace():
|
|
240
|
+
config[current_key] = "\n".join(multiline_buf).strip() # type: ignore[index]
|
|
241
|
+
in_multiline = False
|
|
242
|
+
multiline_buf = []
|
|
243
|
+
else:
|
|
244
|
+
multiline_buf.append(line.strip())
|
|
245
|
+
continue
|
|
246
|
+
|
|
247
|
+
if ":" in stripped:
|
|
248
|
+
key, _, value = stripped.partition(":")
|
|
249
|
+
key = key.strip()
|
|
250
|
+
value = value.strip()
|
|
251
|
+
if value == "|":
|
|
252
|
+
current_key = key
|
|
253
|
+
in_multiline = True
|
|
254
|
+
multiline_buf = []
|
|
255
|
+
elif value and not value.startswith("{"):
|
|
256
|
+
value = value.strip('"').strip("'")
|
|
257
|
+
config[key] = value
|
|
258
|
+
|
|
259
|
+
if in_multiline and multiline_buf:
|
|
260
|
+
config[current_key] = "\n".join(multiline_buf).strip() # type: ignore[index]
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
# ---------------------------------------------------------------------------
|
|
264
|
+
# Database helpers
|
|
265
|
+
# ---------------------------------------------------------------------------
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def _get_project(conn: sqlite3.Connection, project_id: str) -> Dict:
|
|
269
|
+
"""Load project row from the ``projects`` table."""
|
|
270
|
+
row = conn.execute(
|
|
271
|
+
"SELECT * FROM projects WHERE id = ?", (project_id,)
|
|
272
|
+
).fetchone()
|
|
273
|
+
if not row:
|
|
274
|
+
raise ValueError(f"Project '{project_id}' not found in database.")
|
|
275
|
+
return dict(row)
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
def _log_audit_event(
|
|
279
|
+
conn: sqlite3.Connection,
|
|
280
|
+
project_id: str,
|
|
281
|
+
action: str,
|
|
282
|
+
details: Dict,
|
|
283
|
+
) -> None:
|
|
284
|
+
"""Log an append-only audit event (NIST 800-53 AU compliant)."""
|
|
285
|
+
try:
|
|
286
|
+
conn.execute(
|
|
287
|
+
"""INSERT INTO audit_trail
|
|
288
|
+
(project_id, event_type, actor, action, details,
|
|
289
|
+
affected_files, classification)
|
|
290
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)""",
|
|
291
|
+
(
|
|
292
|
+
project_id,
|
|
293
|
+
"classification.validation",
|
|
294
|
+
"icdev-compliance-engine",
|
|
295
|
+
action,
|
|
296
|
+
json.dumps(details),
|
|
297
|
+
json.dumps([]),
|
|
298
|
+
"CUI",
|
|
299
|
+
),
|
|
300
|
+
)
|
|
301
|
+
conn.commit()
|
|
302
|
+
except Exception as exc:
|
|
303
|
+
print(
|
|
304
|
+
f"Warning: Could not log audit event: {exc}",
|
|
305
|
+
file=sys.stderr,
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
# ---------------------------------------------------------------------------
|
|
310
|
+
# Core functions
|
|
311
|
+
# ---------------------------------------------------------------------------
|
|
312
|
+
|
|
313
|
+
def get_impact_level_profile(il_level: str) -> Dict:
|
|
314
|
+
"""Return the full profile dict for a given impact level.
|
|
315
|
+
|
|
316
|
+
Args:
|
|
317
|
+
il_level: One of IL4, IL4, IL4, IL4.
|
|
318
|
+
|
|
319
|
+
Returns:
|
|
320
|
+
Dict containing classification, compliance, encryption, network,
|
|
321
|
+
and other profile fields.
|
|
322
|
+
|
|
323
|
+
Raises:
|
|
324
|
+
ValueError: If *il_level* is not a valid impact level.
|
|
325
|
+
"""
|
|
326
|
+
il_upper = il_level.upper()
|
|
327
|
+
if il_upper not in VALID_IMPACT_LEVELS:
|
|
328
|
+
raise ValueError(
|
|
329
|
+
f"Invalid impact level '{il_level}'. "
|
|
330
|
+
f"Valid levels: {', '.join(VALID_IMPACT_LEVELS)}"
|
|
331
|
+
)
|
|
332
|
+
|
|
333
|
+
profiles = load_impact_level_profiles()
|
|
334
|
+
profile = profiles.get(il_upper)
|
|
335
|
+
if profile is None:
|
|
336
|
+
raise ValueError(
|
|
337
|
+
f"Profile for '{il_upper}' not found in impact level data. "
|
|
338
|
+
f"Available profiles: {', '.join(k for k in profiles if not k.startswith('_'))}"
|
|
339
|
+
)
|
|
340
|
+
return profile
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
def get_classification_for_il(il_level: str) -> str:
|
|
344
|
+
"""Return the classification string for an impact level.
|
|
345
|
+
|
|
346
|
+
Mapping:
|
|
347
|
+
IL4 -> PUBLIC, IL4 -> CUI, IL4 -> CUI, IL4 -> SECRET.
|
|
348
|
+
|
|
349
|
+
Args:
|
|
350
|
+
il_level: One of IL4, IL4, IL4, IL4.
|
|
351
|
+
|
|
352
|
+
Returns:
|
|
353
|
+
Classification string.
|
|
354
|
+
|
|
355
|
+
Raises:
|
|
356
|
+
ValueError: If *il_level* is not valid.
|
|
357
|
+
"""
|
|
358
|
+
il_upper = il_level.upper()
|
|
359
|
+
if il_upper not in VALID_IMPACT_LEVELS:
|
|
360
|
+
raise ValueError(
|
|
361
|
+
f"Invalid impact level '{il_level}'. "
|
|
362
|
+
f"Valid levels: {', '.join(VALID_IMPACT_LEVELS)}"
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
# Prefer the authoritative mapping from profiles when available
|
|
366
|
+
profiles = load_impact_level_profiles()
|
|
367
|
+
profile = profiles.get(il_upper)
|
|
368
|
+
if profile and "classification" in profile:
|
|
369
|
+
return profile["classification"]
|
|
370
|
+
|
|
371
|
+
return _CLASSIFICATION_MAP.get(il_upper, "CUI")
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
def get_marking_banner(
|
|
375
|
+
classification: str = "CUI",
|
|
376
|
+
category: str = "CTI",
|
|
377
|
+
dissemination: Optional[str] = None,
|
|
378
|
+
) -> str:
|
|
379
|
+
"""Return a full multi-line document banner block for a classification.
|
|
380
|
+
|
|
381
|
+
Args:
|
|
382
|
+
classification: One of PUBLIC, CUI, SECRET, TOP SECRET,
|
|
383
|
+
TOP SECRET//SCI.
|
|
384
|
+
category: Sub-category (default CTI for CUI).
|
|
385
|
+
dissemination: Override for the dissemination/caveats line.
|
|
386
|
+
Defaults to NOFORN for SECRET, SCI for TOP SECRET, etc.
|
|
387
|
+
|
|
388
|
+
Returns:
|
|
389
|
+
Multi-line string suitable for document headers/footers.
|
|
390
|
+
"""
|
|
391
|
+
cls_upper = classification.upper()
|
|
392
|
+
|
|
393
|
+
if cls_upper == "PUBLIC":
|
|
394
|
+
return (
|
|
395
|
+
"////////////////////////////////////////////////////////////////////\n"
|
|
396
|
+
"PUBLIC RELEASE -- No restrictions on distribution\n"
|
|
397
|
+
"////////////////////////////////////////////////////////////////////"
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
if cls_upper == "CUI":
|
|
401
|
+
banner_line = f"CUI // SP-{category}"
|
|
402
|
+
dist_line = "Distribution: Distribution D -- Authorized DoD Personnel Only"
|
|
403
|
+
ctrl_line = "Controlled by: Department of Defense"
|
|
404
|
+
return (
|
|
405
|
+
f"////////////////////////////////////////////////////////////////////\n"
|
|
406
|
+
f"CONTROLLED UNCLASSIFIED INFORMATION ({banner_line})\n"
|
|
407
|
+
f"{dist_line}\n"
|
|
408
|
+
f"{ctrl_line}\n"
|
|
409
|
+
f"////////////////////////////////////////////////////////////////////"
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
if cls_upper == "SECRET":
|
|
413
|
+
caveat = dissemination or "NOFORN"
|
|
414
|
+
banner_line = f"SECRET // {caveat}"
|
|
415
|
+
dist_line = "Distribution: Authorized SECRET-cleared personnel only"
|
|
416
|
+
ctrl_line = "Controlled by: Department of Defense"
|
|
417
|
+
return (
|
|
418
|
+
f"////////////////////////////////////////////////////////////////////\n"
|
|
419
|
+
f"{banner_line}\n"
|
|
420
|
+
f"{dist_line}\n"
|
|
421
|
+
f"{ctrl_line}\n"
|
|
422
|
+
f"////////////////////////////////////////////////////////////////////"
|
|
423
|
+
)
|
|
424
|
+
|
|
425
|
+
if cls_upper == "TOP SECRET":
|
|
426
|
+
caveat = dissemination or "SCI"
|
|
427
|
+
banner_line = f"TOP SECRET // {caveat}"
|
|
428
|
+
dist_line = "Distribution: Authorized TS/SCI-cleared personnel only"
|
|
429
|
+
ctrl_line = "Controlled by: Department of Defense"
|
|
430
|
+
return (
|
|
431
|
+
f"////////////////////////////////////////////////////////////////////\n"
|
|
432
|
+
f"{banner_line}\n"
|
|
433
|
+
f"{dist_line}\n"
|
|
434
|
+
f"{ctrl_line}\n"
|
|
435
|
+
f"////////////////////////////////////////////////////////////////////"
|
|
436
|
+
)
|
|
437
|
+
|
|
438
|
+
if cls_upper == "TOP SECRET//SCI":
|
|
439
|
+
banner_line = "TOP SECRET // SCI"
|
|
440
|
+
dist_line = "Distribution: Authorized TS/SCI-cleared personnel only"
|
|
441
|
+
ctrl_line = "Controlled by: Department of Defense"
|
|
442
|
+
return (
|
|
443
|
+
f"////////////////////////////////////////////////////////////////////\n"
|
|
444
|
+
f"{banner_line}\n"
|
|
445
|
+
f"{dist_line}\n"
|
|
446
|
+
f"{ctrl_line}\n"
|
|
447
|
+
f"////////////////////////////////////////////////////////////////////"
|
|
448
|
+
)
|
|
449
|
+
|
|
450
|
+
# Unknown -- fall back to CUI
|
|
451
|
+
return get_marking_banner("CUI", category=category)
|
|
452
|
+
|
|
453
|
+
|
|
454
|
+
def get_code_header(
|
|
455
|
+
classification: str = "CUI",
|
|
456
|
+
language: str = "python",
|
|
457
|
+
category: str = "CTI",
|
|
458
|
+
) -> str:
|
|
459
|
+
"""Return a classification code-file header in the correct comment style.
|
|
460
|
+
|
|
461
|
+
Attempts to import ``language_support.get_cui_header`` for CUI headers
|
|
462
|
+
but works standalone for any classification.
|
|
463
|
+
|
|
464
|
+
Args:
|
|
465
|
+
classification: Classification level.
|
|
466
|
+
language: Programming language key (python, java, go, etc.).
|
|
467
|
+
category: Sub-category for CUI markings (default CTI).
|
|
468
|
+
|
|
469
|
+
Returns:
|
|
470
|
+
Multi-line comment block suitable for the top of a source file.
|
|
471
|
+
"""
|
|
472
|
+
cls_upper = classification.upper()
|
|
473
|
+
|
|
474
|
+
# Build the raw header lines based on classification
|
|
475
|
+
if cls_upper == "CUI":
|
|
476
|
+
header_lines = [
|
|
477
|
+
f"CUI // SP-{category}",
|
|
478
|
+
"Controlled by: Department of Defense",
|
|
479
|
+
f"CUI Category: {category}",
|
|
480
|
+
"Distribution: D",
|
|
481
|
+
"POC: ICDEV System Administrator",
|
|
482
|
+
]
|
|
483
|
+
# Try language_support module for CUI (it has registry-aware logic)
|
|
484
|
+
if language.lower() in ("python", "ruby", "java", "go", "rust",
|
|
485
|
+
"csharp", "c#", "typescript", "javascript"):
|
|
486
|
+
try:
|
|
487
|
+
sys.path.insert(0, str(BASE_DIR / "tools" / "builder"))
|
|
488
|
+
from language_support import get_cui_header as _ls_header
|
|
489
|
+
result = _ls_header(language)
|
|
490
|
+
if result:
|
|
491
|
+
return result
|
|
492
|
+
except Exception:
|
|
493
|
+
pass # Fall through to local logic
|
|
494
|
+
elif cls_upper == "SECRET":
|
|
495
|
+
header_lines = [
|
|
496
|
+
"SECRET // NOFORN",
|
|
497
|
+
"Controlled by: Department of Defense",
|
|
498
|
+
"Classification: SECRET",
|
|
499
|
+
"Distribution: Authorized SECRET-cleared personnel only",
|
|
500
|
+
"POC: ICDEV System Administrator",
|
|
501
|
+
]
|
|
502
|
+
elif cls_upper in ("TOP SECRET", "TOP SECRET//SCI"):
|
|
503
|
+
header_lines = [
|
|
504
|
+
"TOP SECRET // SCI",
|
|
505
|
+
"Controlled by: Department of Defense",
|
|
506
|
+
"Classification: TOP SECRET // SCI",
|
|
507
|
+
"Distribution: Authorized TS/SCI-cleared personnel only",
|
|
508
|
+
"POC: ICDEV System Administrator",
|
|
509
|
+
]
|
|
510
|
+
elif cls_upper == "PUBLIC":
|
|
511
|
+
header_lines = [
|
|
512
|
+
"PUBLIC RELEASE",
|
|
513
|
+
"No distribution restrictions",
|
|
514
|
+
]
|
|
515
|
+
else:
|
|
516
|
+
# Default to CUI
|
|
517
|
+
return get_code_header("CUI", language, category)
|
|
518
|
+
|
|
519
|
+
# Determine comment style from local mapping
|
|
520
|
+
lang_lower = language.lower()
|
|
521
|
+
style = _COMMENT_STYLES.get(lang_lower, "hash")
|
|
522
|
+
|
|
523
|
+
result_lines: List[str] = []
|
|
524
|
+
|
|
525
|
+
if style == "hash":
|
|
526
|
+
for line in header_lines:
|
|
527
|
+
result_lines.append(f"# {line}")
|
|
528
|
+
elif style == "c-style":
|
|
529
|
+
for line in header_lines:
|
|
530
|
+
result_lines.append(f"// {line}")
|
|
531
|
+
elif style == "xml-style":
|
|
532
|
+
result_lines.append("<!--")
|
|
533
|
+
for line in header_lines:
|
|
534
|
+
result_lines.append(f" {line}")
|
|
535
|
+
result_lines.append("-->")
|
|
536
|
+
else:
|
|
537
|
+
for line in header_lines:
|
|
538
|
+
result_lines.append(f"# {line}")
|
|
539
|
+
|
|
540
|
+
return "\n".join(result_lines) + "\n"
|
|
541
|
+
|
|
542
|
+
|
|
543
|
+
def get_document_banner(classification: str = "CUI") -> Dict[str, str]:
|
|
544
|
+
"""Return document header and footer banners for markdown/text files.
|
|
545
|
+
|
|
546
|
+
Args:
|
|
547
|
+
classification: Classification level.
|
|
548
|
+
|
|
549
|
+
Returns:
|
|
550
|
+
Dict with ``header`` and ``footer`` string values.
|
|
551
|
+
"""
|
|
552
|
+
cls_upper = classification.upper()
|
|
553
|
+
|
|
554
|
+
if cls_upper == "CUI":
|
|
555
|
+
config = load_markings_config()
|
|
556
|
+
header = config.get("document_header", "").strip()
|
|
557
|
+
footer = config.get("document_footer", "").strip()
|
|
558
|
+
if header and footer:
|
|
559
|
+
return {"header": header, "footer": footer}
|
|
560
|
+
# Fallback
|
|
561
|
+
return {
|
|
562
|
+
"header": (
|
|
563
|
+
"////////////////////////////////////////////////////////////////////\n"
|
|
564
|
+
"CONTROLLED UNCLASSIFIED INFORMATION (CUI) // SP-CTI\n"
|
|
565
|
+
"Distribution: Distribution D -- Authorized DoD Personnel Only\n"
|
|
566
|
+
"////////////////////////////////////////////////////////////////////"
|
|
567
|
+
),
|
|
568
|
+
"footer": (
|
|
569
|
+
"////////////////////////////////////////////////////////////////////\n"
|
|
570
|
+
"CUI // SP-CTI | Department of Defense\n"
|
|
571
|
+
"////////////////////////////////////////////////////////////////////"
|
|
572
|
+
),
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
if cls_upper == "SECRET":
|
|
576
|
+
return {
|
|
577
|
+
"header": (
|
|
578
|
+
"////////////////////////////////////////////////////////////////////\n"
|
|
579
|
+
"SECRET // NOFORN\n"
|
|
580
|
+
"Distribution: Authorized SECRET-cleared personnel only\n"
|
|
581
|
+
"Controlled by: Department of Defense\n"
|
|
582
|
+
"////////////////////////////////////////////////////////////////////"
|
|
583
|
+
),
|
|
584
|
+
"footer": (
|
|
585
|
+
"////////////////////////////////////////////////////////////////////\n"
|
|
586
|
+
"SECRET // NOFORN | Department of Defense\n"
|
|
587
|
+
"////////////////////////////////////////////////////////////////////"
|
|
588
|
+
),
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
if cls_upper in ("TOP SECRET", "TOP SECRET//SCI"):
|
|
592
|
+
return {
|
|
593
|
+
"header": (
|
|
594
|
+
"////////////////////////////////////////////////////////////////////\n"
|
|
595
|
+
"TOP SECRET // SCI\n"
|
|
596
|
+
"Distribution: Authorized TS/SCI-cleared personnel only\n"
|
|
597
|
+
"Controlled by: Department of Defense\n"
|
|
598
|
+
"////////////////////////////////////////////////////////////////////"
|
|
599
|
+
),
|
|
600
|
+
"footer": (
|
|
601
|
+
"////////////////////////////////////////////////////////////////////\n"
|
|
602
|
+
"TOP SECRET // SCI | Department of Defense\n"
|
|
603
|
+
"////////////////////////////////////////////////////////////////////"
|
|
604
|
+
),
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
if cls_upper == "PUBLIC":
|
|
608
|
+
return {
|
|
609
|
+
"header": (
|
|
610
|
+
"////////////////////////////////////////////////////////////////////\n"
|
|
611
|
+
"PUBLIC RELEASE -- No restrictions on distribution\n"
|
|
612
|
+
"////////////////////////////////////////////////////////////////////"
|
|
613
|
+
),
|
|
614
|
+
"footer": "",
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
# Default to CUI
|
|
618
|
+
return get_document_banner("CUI")
|
|
619
|
+
|
|
620
|
+
|
|
621
|
+
def get_portion_marking(classification: str = "CUI") -> str:
|
|
622
|
+
"""Return an inline portion-marking string.
|
|
623
|
+
|
|
624
|
+
Args:
|
|
625
|
+
classification: Classification level.
|
|
626
|
+
|
|
627
|
+
Returns:
|
|
628
|
+
Short inline marker such as ``(CUI)``, ``(S)``, ``(TS)``, or
|
|
629
|
+
``(TS//SCI)``.
|
|
630
|
+
"""
|
|
631
|
+
return _PORTION_MARKS.get(classification.upper(), "(CUI)")
|
|
632
|
+
|
|
633
|
+
|
|
634
|
+
def get_required_baseline(il_level: str) -> Dict:
|
|
635
|
+
"""Return the compliance baseline requirements for an impact level.
|
|
636
|
+
|
|
637
|
+
Args:
|
|
638
|
+
il_level: One of IL4, IL4, IL4, IL4.
|
|
639
|
+
|
|
640
|
+
Returns:
|
|
641
|
+
Dict with ``fedramp_baseline``, ``cmmc_level``,
|
|
642
|
+
``nist_800_171_required``, and ``required_controls_overlay``.
|
|
643
|
+
|
|
644
|
+
Raises:
|
|
645
|
+
ValueError: If *il_level* is invalid.
|
|
646
|
+
"""
|
|
647
|
+
profile = get_impact_level_profile(il_level)
|
|
648
|
+
return {
|
|
649
|
+
"fedramp_baseline": profile.get("fedramp_baseline", "moderate"),
|
|
650
|
+
"cmmc_level": profile.get("cmmc_level"),
|
|
651
|
+
"nist_800_171_required": profile.get("nist_800_171_required", False),
|
|
652
|
+
"required_controls_overlay": profile.get("required_controls_overlay", []),
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
|
|
656
|
+
def get_encryption_requirements(il_level: str) -> Dict:
|
|
657
|
+
"""Return encryption requirements for an impact level.
|
|
658
|
+
|
|
659
|
+
Args:
|
|
660
|
+
il_level: One of IL4, IL4, IL4, IL4.
|
|
661
|
+
|
|
662
|
+
Returns:
|
|
663
|
+
Dict with ``at_rest``, ``in_transit``, ``key_management``, and
|
|
664
|
+
any additional encryption-related fields.
|
|
665
|
+
|
|
666
|
+
Raises:
|
|
667
|
+
ValueError: If *il_level* is invalid.
|
|
668
|
+
"""
|
|
669
|
+
profile = get_impact_level_profile(il_level)
|
|
670
|
+
return profile.get("encryption_requirements", {
|
|
671
|
+
"at_rest": "FIPS 140-2 validated modules",
|
|
672
|
+
"in_transit": "TLS 1.2+",
|
|
673
|
+
"key_management": "Customer managed keys",
|
|
674
|
+
})
|
|
675
|
+
|
|
676
|
+
|
|
677
|
+
def get_network_requirements(il_level: str) -> Dict:
|
|
678
|
+
"""Return network requirements for an impact level.
|
|
679
|
+
|
|
680
|
+
Args:
|
|
681
|
+
il_level: One of IL4, IL4, IL4, IL4.
|
|
682
|
+
|
|
683
|
+
Returns:
|
|
684
|
+
Dict with ``dedicated_infrastructure``, ``cross_domain``,
|
|
685
|
+
``vpn_required``, ``sipr_only``, and other network fields.
|
|
686
|
+
|
|
687
|
+
Raises:
|
|
688
|
+
ValueError: If *il_level* is invalid.
|
|
689
|
+
"""
|
|
690
|
+
profile = get_impact_level_profile(il_level)
|
|
691
|
+
return profile.get("network_requirements", {
|
|
692
|
+
"dedicated_infrastructure": False,
|
|
693
|
+
"cross_domain": False,
|
|
694
|
+
"vpn_required": False,
|
|
695
|
+
"sipr_only": False,
|
|
696
|
+
})
|
|
697
|
+
|
|
698
|
+
|
|
699
|
+
def get_cloud_environments(il_level: str) -> List[str]:
|
|
700
|
+
"""Return valid cloud environments for an impact level.
|
|
701
|
+
|
|
702
|
+
Args:
|
|
703
|
+
il_level: One of IL4, IL4, IL4, IL4.
|
|
704
|
+
|
|
705
|
+
Returns:
|
|
706
|
+
List of cloud environment identifiers.
|
|
707
|
+
|
|
708
|
+
Raises:
|
|
709
|
+
ValueError: If *il_level* is invalid.
|
|
710
|
+
"""
|
|
711
|
+
profile = get_impact_level_profile(il_level)
|
|
712
|
+
return profile.get("cloud_environments", [])
|
|
713
|
+
|
|
714
|
+
|
|
715
|
+
def validate_classification(
|
|
716
|
+
project_id: str,
|
|
717
|
+
db_path: Optional[Path] = None,
|
|
718
|
+
) -> Dict:
|
|
719
|
+
"""Validate that a project's classification matches its impact level.
|
|
720
|
+
|
|
721
|
+
Checks the ``projects`` table for ``classification`` and
|
|
722
|
+
``impact_level`` columns, then verifies consistency.
|
|
723
|
+
|
|
724
|
+
Args:
|
|
725
|
+
project_id: The project identifier.
|
|
726
|
+
db_path: Optional database path override.
|
|
727
|
+
|
|
728
|
+
Returns:
|
|
729
|
+
Dict with ``valid`` (bool), ``project_id``, ``classification``,
|
|
730
|
+
``impact_level``, and ``issues`` (list of issue strings).
|
|
731
|
+
"""
|
|
732
|
+
conn = get_connection(db_path=db_path)
|
|
733
|
+
issues: List[str] = []
|
|
734
|
+
|
|
735
|
+
try:
|
|
736
|
+
project = _get_project(conn, project_id)
|
|
737
|
+
|
|
738
|
+
proj_classification = (project.get("classification") or "CUI").upper()
|
|
739
|
+
proj_il = (project.get("impact_level") or "").upper()
|
|
740
|
+
|
|
741
|
+
result: Dict[str, Any] = {
|
|
742
|
+
"valid": True,
|
|
743
|
+
"project_id": project_id,
|
|
744
|
+
"classification": proj_classification,
|
|
745
|
+
"impact_level": proj_il,
|
|
746
|
+
"issues": issues,
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
# Check classification is valid
|
|
750
|
+
if proj_classification not in VALID_CLASSIFICATIONS:
|
|
751
|
+
issues.append(
|
|
752
|
+
f"Invalid classification '{proj_classification}'. "
|
|
753
|
+
f"Valid: {', '.join(VALID_CLASSIFICATIONS)}"
|
|
754
|
+
)
|
|
755
|
+
|
|
756
|
+
# Check impact level is valid (if set)
|
|
757
|
+
if proj_il and proj_il not in VALID_IMPACT_LEVELS:
|
|
758
|
+
issues.append(
|
|
759
|
+
f"Invalid impact level '{proj_il}'. "
|
|
760
|
+
f"Valid: {', '.join(VALID_IMPACT_LEVELS)}"
|
|
761
|
+
)
|
|
762
|
+
|
|
763
|
+
# Cross-validate classification vs. impact level
|
|
764
|
+
if proj_il and proj_il in VALID_IMPACT_LEVELS:
|
|
765
|
+
expected_cls = get_classification_for_il(proj_il)
|
|
766
|
+
if proj_classification != expected_cls:
|
|
767
|
+
issues.append(
|
|
768
|
+
f"Classification mismatch: project is '{proj_classification}' "
|
|
769
|
+
f"but impact level '{proj_il}' requires '{expected_cls}'."
|
|
770
|
+
)
|
|
771
|
+
|
|
772
|
+
# Check marking banner consistency
|
|
773
|
+
profiles = load_impact_level_profiles()
|
|
774
|
+
profile = profiles.get(proj_il, {})
|
|
775
|
+
expected_banner = profile.get("marking_banner")
|
|
776
|
+
if expected_banner and proj_classification == "CUI":
|
|
777
|
+
config = load_markings_config()
|
|
778
|
+
current_banner = config.get("banner_top", "")
|
|
779
|
+
if expected_banner not in current_banner and current_banner not in expected_banner:
|
|
780
|
+
issues.append(
|
|
781
|
+
f"Marking banner mismatch: expected '{expected_banner}' "
|
|
782
|
+
f"for {proj_il}, current config has '{current_banner}'."
|
|
783
|
+
)
|
|
784
|
+
|
|
785
|
+
elif not proj_il:
|
|
786
|
+
issues.append(
|
|
787
|
+
"Impact level not set on project. Recommend setting "
|
|
788
|
+
"impact_level to ensure compliance mapping."
|
|
789
|
+
)
|
|
790
|
+
|
|
791
|
+
result["valid"] = len(issues) == 0
|
|
792
|
+
|
|
793
|
+
# Log audit event
|
|
794
|
+
_log_audit_event(conn, project_id, "Classification validation", {
|
|
795
|
+
"classification": proj_classification,
|
|
796
|
+
"impact_level": proj_il,
|
|
797
|
+
"valid": result["valid"],
|
|
798
|
+
"issues": issues,
|
|
799
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
800
|
+
})
|
|
801
|
+
|
|
802
|
+
return result
|
|
803
|
+
|
|
804
|
+
finally:
|
|
805
|
+
conn.close()
|
|
806
|
+
|
|
807
|
+
|
|
808
|
+
def get_cross_domain_controls(
|
|
809
|
+
source_il: str,
|
|
810
|
+
target_il: str,
|
|
811
|
+
) -> Dict:
|
|
812
|
+
"""Return additional controls required for cross-domain solutions.
|
|
813
|
+
|
|
814
|
+
Looks up the ``cross_domain_requirements`` section of the impact
|
|
815
|
+
level profiles for the source->target pair.
|
|
816
|
+
|
|
817
|
+
Args:
|
|
818
|
+
source_il: Source impact level (e.g. IL4).
|
|
819
|
+
target_il: Target impact level (e.g. IL4).
|
|
820
|
+
|
|
821
|
+
Returns:
|
|
822
|
+
Dict with ``description``, ``additional_controls``,
|
|
823
|
+
``solution_type``, ``approval_required``, and ``direction``.
|
|
824
|
+
|
|
825
|
+
Raises:
|
|
826
|
+
ValueError: If either IL is invalid or no cross-domain mapping
|
|
827
|
+
exists for the pair.
|
|
828
|
+
"""
|
|
829
|
+
for il in (source_il, target_il):
|
|
830
|
+
if il.upper() not in VALID_IMPACT_LEVELS:
|
|
831
|
+
raise ValueError(
|
|
832
|
+
f"Invalid impact level '{il}'. "
|
|
833
|
+
f"Valid: {', '.join(VALID_IMPACT_LEVELS)}"
|
|
834
|
+
)
|
|
835
|
+
|
|
836
|
+
profiles = load_impact_level_profiles()
|
|
837
|
+
cross_domain = profiles.get("_cross_domain", {})
|
|
838
|
+
|
|
839
|
+
# Determine direction (always low -> high for cross-domain lookup)
|
|
840
|
+
il_order = {"IL4": 0, "IL4": 1, "IL4": 2, "IL4": 3}
|
|
841
|
+
src = source_il.upper()
|
|
842
|
+
tgt = target_il.upper()
|
|
843
|
+
low, high = (src, tgt) if il_order.get(src, 0) <= il_order.get(tgt, 0) else (tgt, src)
|
|
844
|
+
|
|
845
|
+
# Lookup key format: "ILx_to_ILy"
|
|
846
|
+
lookup_key = f"{low}_to_{high}"
|
|
847
|
+
mapping = cross_domain.get(lookup_key)
|
|
848
|
+
|
|
849
|
+
if mapping:
|
|
850
|
+
result = dict(mapping)
|
|
851
|
+
result["direction"] = f"{src} -> {tgt}"
|
|
852
|
+
return result
|
|
853
|
+
|
|
854
|
+
# Also try classification-level keys (e.g. SECRET_to_TS)
|
|
855
|
+
src_cls = get_classification_for_il(src).replace(" ", "_").upper()
|
|
856
|
+
tgt_cls = get_classification_for_il(tgt).replace(" ", "_").upper()
|
|
857
|
+
cls_key = f"{src_cls}_to_{tgt_cls}"
|
|
858
|
+
mapping = cross_domain.get(cls_key)
|
|
859
|
+
|
|
860
|
+
if mapping:
|
|
861
|
+
result = dict(mapping)
|
|
862
|
+
result["direction"] = f"{src} ({src_cls}) -> {tgt} ({tgt_cls})"
|
|
863
|
+
return result
|
|
864
|
+
|
|
865
|
+
# Same level or adjacent levels with no explicit cross-domain needs
|
|
866
|
+
if src == tgt:
|
|
867
|
+
return {
|
|
868
|
+
"description": "Same impact level -- no cross-domain controls required.",
|
|
869
|
+
"additional_controls": [],
|
|
870
|
+
"solution_type": "N/A",
|
|
871
|
+
"approval_required": "N/A",
|
|
872
|
+
"direction": f"{src} -> {tgt}",
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
# No explicit mapping found -- return a conservative response
|
|
876
|
+
return {
|
|
877
|
+
"description": (
|
|
878
|
+
f"Cross-domain transfer between {src} and {tgt}. "
|
|
879
|
+
"No explicit mapping found; treat as requiring AO approval."
|
|
880
|
+
),
|
|
881
|
+
"additional_controls": ["AC-4", "SC-7(5)"],
|
|
882
|
+
"solution_type": "Consult AO for approved data transfer mechanism",
|
|
883
|
+
"approval_required": "AO approval required",
|
|
884
|
+
"direction": f"{src} -> {tgt}",
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
|
|
888
|
+
def upgrade_markings(
|
|
889
|
+
content: str,
|
|
890
|
+
from_classification: str,
|
|
891
|
+
to_classification: str,
|
|
892
|
+
) -> str:
|
|
893
|
+
"""Replace classification banners in content for an upgrade.
|
|
894
|
+
|
|
895
|
+
Scans for banner patterns from *from_classification* and replaces
|
|
896
|
+
them with *to_classification* banners. Handles both document banners
|
|
897
|
+
and inline portion markings.
|
|
898
|
+
|
|
899
|
+
Args:
|
|
900
|
+
content: Document or code content string.
|
|
901
|
+
from_classification: Current classification (e.g. CUI).
|
|
902
|
+
to_classification: Target classification (e.g. SECRET).
|
|
903
|
+
|
|
904
|
+
Returns:
|
|
905
|
+
Updated content with new markings.
|
|
906
|
+
"""
|
|
907
|
+
from_cls = from_classification.upper()
|
|
908
|
+
to_cls = to_classification.upper()
|
|
909
|
+
|
|
910
|
+
if from_cls == to_cls:
|
|
911
|
+
return content
|
|
912
|
+
|
|
913
|
+
result = content
|
|
914
|
+
|
|
915
|
+
# --- Banner replacements ---
|
|
916
|
+
from_banners = get_document_banner(from_cls)
|
|
917
|
+
to_banners = get_document_banner(to_cls)
|
|
918
|
+
|
|
919
|
+
# Replace header banner
|
|
920
|
+
if from_banners.get("header"):
|
|
921
|
+
result = result.replace(from_banners["header"], to_banners.get("header", ""))
|
|
922
|
+
|
|
923
|
+
# Replace footer banner
|
|
924
|
+
if from_banners.get("footer"):
|
|
925
|
+
result = result.replace(from_banners["footer"], to_banners.get("footer", ""))
|
|
926
|
+
|
|
927
|
+
# --- Inline banner-line replacements ---
|
|
928
|
+
# Order matters: replace longest/most-specific strings first to avoid
|
|
929
|
+
# partial double-replacements.
|
|
930
|
+
# CUI -> SECRET
|
|
931
|
+
if from_cls == "CUI" and to_cls == "SECRET":
|
|
932
|
+
result = result.replace(
|
|
933
|
+
"CONTROLLED UNCLASSIFIED INFORMATION (CUI // SP-CTI)",
|
|
934
|
+
"SECRET // NOFORN",
|
|
935
|
+
)
|
|
936
|
+
result = result.replace(
|
|
937
|
+
"CONTROLLED UNCLASSIFIED INFORMATION",
|
|
938
|
+
"SECRET // NOFORN",
|
|
939
|
+
)
|
|
940
|
+
result = result.replace("CUI // SP-CTI", "SECRET // NOFORN")
|
|
941
|
+
result = result.replace(
|
|
942
|
+
"Distribution D -- Authorized DoD Personnel Only",
|
|
943
|
+
"Authorized SECRET-cleared personnel only",
|
|
944
|
+
)
|
|
945
|
+
result = result.replace("CUI Category: CTI", "Classification: SECRET")
|
|
946
|
+
|
|
947
|
+
elif from_cls == "CUI" and to_cls in ("TOP SECRET", "TOP SECRET//SCI"):
|
|
948
|
+
result = result.replace(
|
|
949
|
+
"CONTROLLED UNCLASSIFIED INFORMATION (CUI // SP-CTI)",
|
|
950
|
+
"TOP SECRET // SCI",
|
|
951
|
+
)
|
|
952
|
+
result = result.replace(
|
|
953
|
+
"CONTROLLED UNCLASSIFIED INFORMATION",
|
|
954
|
+
"TOP SECRET // SCI",
|
|
955
|
+
)
|
|
956
|
+
result = result.replace("CUI // SP-CTI", "TOP SECRET // SCI")
|
|
957
|
+
result = result.replace(
|
|
958
|
+
"Distribution D -- Authorized DoD Personnel Only",
|
|
959
|
+
"Authorized TS/SCI-cleared personnel only",
|
|
960
|
+
)
|
|
961
|
+
result = result.replace("CUI Category: CTI", "Classification: TOP SECRET // SCI")
|
|
962
|
+
|
|
963
|
+
elif from_cls == "SECRET" and to_cls in ("TOP SECRET", "TOP SECRET//SCI"):
|
|
964
|
+
result = result.replace("SECRET // NOFORN", "TOP SECRET // SCI")
|
|
965
|
+
result = result.replace(
|
|
966
|
+
"Authorized SECRET-cleared personnel only",
|
|
967
|
+
"Authorized TS/SCI-cleared personnel only",
|
|
968
|
+
)
|
|
969
|
+
result = result.replace("Classification: SECRET", "Classification: TOP SECRET // SCI")
|
|
970
|
+
|
|
971
|
+
# --- Portion marking replacement ---
|
|
972
|
+
from_portion = get_portion_marking(from_cls)
|
|
973
|
+
to_portion = get_portion_marking(to_cls)
|
|
974
|
+
if from_portion and to_portion:
|
|
975
|
+
result = result.replace(from_portion, to_portion)
|
|
976
|
+
|
|
977
|
+
return result
|
|
978
|
+
|
|
979
|
+
|
|
980
|
+
# ---------------------------------------------------------------------------
|
|
981
|
+
# CLI
|
|
982
|
+
# ---------------------------------------------------------------------------
|
|
983
|
+
|
|
984
|
+
def main() -> None:
|
|
985
|
+
"""CLI entry point and demonstration of all capabilities."""
|
|
986
|
+
parser = argparse.ArgumentParser(
|
|
987
|
+
description="Classification & Marking Manager for ICDEV"
|
|
988
|
+
)
|
|
989
|
+
parser.add_argument(
|
|
990
|
+
"--impact-level",
|
|
991
|
+
choices=["IL4", "IL4", "IL4", "IL4"],
|
|
992
|
+
help="Show profile for an impact level",
|
|
993
|
+
)
|
|
994
|
+
parser.add_argument(
|
|
995
|
+
"--classification",
|
|
996
|
+
choices=["PUBLIC", "CUI", "SECRET", "TOP SECRET", "TOP SECRET//SCI"],
|
|
997
|
+
help="Show markings for a classification level",
|
|
998
|
+
)
|
|
999
|
+
parser.add_argument(
|
|
1000
|
+
"--banner",
|
|
1001
|
+
action="store_true",
|
|
1002
|
+
help="Show document banner for the specified classification",
|
|
1003
|
+
)
|
|
1004
|
+
parser.add_argument(
|
|
1005
|
+
"--code-header",
|
|
1006
|
+
metavar="LANGUAGE",
|
|
1007
|
+
help="Show code header for a language (python, java, go, rust, etc.)",
|
|
1008
|
+
)
|
|
1009
|
+
parser.add_argument(
|
|
1010
|
+
"--baseline",
|
|
1011
|
+
action="store_true",
|
|
1012
|
+
help="Show required compliance baseline for the impact level",
|
|
1013
|
+
)
|
|
1014
|
+
parser.add_argument(
|
|
1015
|
+
"--encryption",
|
|
1016
|
+
action="store_true",
|
|
1017
|
+
help="Show encryption requirements for the impact level",
|
|
1018
|
+
)
|
|
1019
|
+
parser.add_argument(
|
|
1020
|
+
"--network",
|
|
1021
|
+
action="store_true",
|
|
1022
|
+
help="Show network requirements for the impact level",
|
|
1023
|
+
)
|
|
1024
|
+
parser.add_argument(
|
|
1025
|
+
"--cloud",
|
|
1026
|
+
action="store_true",
|
|
1027
|
+
help="Show valid cloud environments for the impact level",
|
|
1028
|
+
)
|
|
1029
|
+
parser.add_argument(
|
|
1030
|
+
"--cross-domain",
|
|
1031
|
+
nargs=2,
|
|
1032
|
+
metavar=("SOURCE_IL", "TARGET_IL"),
|
|
1033
|
+
help="Show cross-domain controls between two impact levels",
|
|
1034
|
+
)
|
|
1035
|
+
parser.add_argument(
|
|
1036
|
+
"--validate",
|
|
1037
|
+
metavar="PROJECT_ID",
|
|
1038
|
+
help="Validate project classification consistency",
|
|
1039
|
+
)
|
|
1040
|
+
parser.add_argument(
|
|
1041
|
+
"--json",
|
|
1042
|
+
action="store_true",
|
|
1043
|
+
help="Output as JSON",
|
|
1044
|
+
)
|
|
1045
|
+
parser.add_argument(
|
|
1046
|
+
"--db-path",
|
|
1047
|
+
type=Path,
|
|
1048
|
+
default=None,
|
|
1049
|
+
help="Database path override",
|
|
1050
|
+
)
|
|
1051
|
+
|
|
1052
|
+
args = parser.parse_args()
|
|
1053
|
+
|
|
1054
|
+
# If no arguments given, show a full demo
|
|
1055
|
+
if not any([
|
|
1056
|
+
args.impact_level, args.classification, args.banner,
|
|
1057
|
+
args.code_header, args.baseline, args.encryption, args.network,
|
|
1058
|
+
args.cloud, args.cross_domain, args.validate,
|
|
1059
|
+
]):
|
|
1060
|
+
_run_demo(args.json)
|
|
1061
|
+
return
|
|
1062
|
+
|
|
1063
|
+
classification = args.classification or "CUI"
|
|
1064
|
+
|
|
1065
|
+
try:
|
|
1066
|
+
# --- Impact-level profile ---
|
|
1067
|
+
if args.impact_level and not any([args.baseline, args.encryption, args.network, args.cloud]):
|
|
1068
|
+
profile = get_impact_level_profile(args.impact_level)
|
|
1069
|
+
if args.json:
|
|
1070
|
+
print(json.dumps({args.impact_level: profile}, indent=2))
|
|
1071
|
+
else:
|
|
1072
|
+
print(f"Impact Level: {args.impact_level}")
|
|
1073
|
+
print(f" Classification: {profile.get('classification')}")
|
|
1074
|
+
print(f" Description: {profile.get('description', 'N/A')}")
|
|
1075
|
+
print(f" FedRAMP Baseline: {profile.get('fedramp_baseline')}")
|
|
1076
|
+
print(f" CMMC Level: {profile.get('cmmc_level')}")
|
|
1077
|
+
print(f" NIST 800-171 Required: {profile.get('nist_800_171_required')}")
|
|
1078
|
+
print(f" Marking Banner: {profile.get('marking_banner')}")
|
|
1079
|
+
envs = profile.get("cloud_environments", [])
|
|
1080
|
+
print(f" Cloud Environments: {', '.join(envs)}")
|
|
1081
|
+
|
|
1082
|
+
# --- Baseline ---
|
|
1083
|
+
if args.baseline:
|
|
1084
|
+
if not args.impact_level:
|
|
1085
|
+
print("Error: --baseline requires --impact-level", file=sys.stderr)
|
|
1086
|
+
sys.exit(1)
|
|
1087
|
+
baseline = get_required_baseline(args.impact_level)
|
|
1088
|
+
if args.json:
|
|
1089
|
+
print(json.dumps(baseline, indent=2))
|
|
1090
|
+
else:
|
|
1091
|
+
print(f"Compliance Baseline for {args.impact_level}:")
|
|
1092
|
+
print(f" FedRAMP Baseline: {baseline['fedramp_baseline']}")
|
|
1093
|
+
print(f" CMMC Level: {baseline['cmmc_level']}")
|
|
1094
|
+
print(f" NIST 800-171 Required: {baseline['nist_800_171_required']}")
|
|
1095
|
+
overlay = baseline.get("required_controls_overlay", [])
|
|
1096
|
+
if overlay:
|
|
1097
|
+
print(f" Controls Overlay ({len(overlay)}):")
|
|
1098
|
+
for ctrl in overlay:
|
|
1099
|
+
print(f" - {ctrl}")
|
|
1100
|
+
|
|
1101
|
+
# --- Encryption ---
|
|
1102
|
+
if args.encryption:
|
|
1103
|
+
if not args.impact_level:
|
|
1104
|
+
print("Error: --encryption requires --impact-level", file=sys.stderr)
|
|
1105
|
+
sys.exit(1)
|
|
1106
|
+
enc = get_encryption_requirements(args.impact_level)
|
|
1107
|
+
if args.json:
|
|
1108
|
+
print(json.dumps(enc, indent=2))
|
|
1109
|
+
else:
|
|
1110
|
+
print(f"Encryption Requirements for {args.impact_level}:")
|
|
1111
|
+
for key, value in enc.items():
|
|
1112
|
+
print(f" {key}: {value}")
|
|
1113
|
+
|
|
1114
|
+
# --- Network ---
|
|
1115
|
+
if args.network:
|
|
1116
|
+
if not args.impact_level:
|
|
1117
|
+
print("Error: --network requires --impact-level", file=sys.stderr)
|
|
1118
|
+
sys.exit(1)
|
|
1119
|
+
net = get_network_requirements(args.impact_level)
|
|
1120
|
+
if args.json:
|
|
1121
|
+
print(json.dumps(net, indent=2))
|
|
1122
|
+
else:
|
|
1123
|
+
print(f"Network Requirements for {args.impact_level}:")
|
|
1124
|
+
for key, value in net.items():
|
|
1125
|
+
print(f" {key}: {value}")
|
|
1126
|
+
|
|
1127
|
+
# --- Cloud ---
|
|
1128
|
+
if args.cloud:
|
|
1129
|
+
if not args.impact_level:
|
|
1130
|
+
print("Error: --cloud requires --impact-level", file=sys.stderr)
|
|
1131
|
+
sys.exit(1)
|
|
1132
|
+
envs = get_cloud_environments(args.impact_level)
|
|
1133
|
+
if args.json:
|
|
1134
|
+
print(json.dumps({"cloud_environments": envs}, indent=2))
|
|
1135
|
+
else:
|
|
1136
|
+
print(f"Cloud Environments for {args.impact_level}:")
|
|
1137
|
+
for env in envs:
|
|
1138
|
+
print(f" - {env}")
|
|
1139
|
+
|
|
1140
|
+
# --- Banner ---
|
|
1141
|
+
if args.banner:
|
|
1142
|
+
banner = get_marking_banner(classification)
|
|
1143
|
+
if args.json:
|
|
1144
|
+
doc = get_document_banner(classification)
|
|
1145
|
+
print(json.dumps({
|
|
1146
|
+
"classification": classification,
|
|
1147
|
+
"banner": banner,
|
|
1148
|
+
"document_header": doc["header"],
|
|
1149
|
+
"document_footer": doc["footer"],
|
|
1150
|
+
"portion_marking": get_portion_marking(classification),
|
|
1151
|
+
}, indent=2))
|
|
1152
|
+
else:
|
|
1153
|
+
print(f"Banner for {classification}:\n")
|
|
1154
|
+
print(banner)
|
|
1155
|
+
print(f"\nPortion marking: {get_portion_marking(classification)}")
|
|
1156
|
+
|
|
1157
|
+
# --- Code header ---
|
|
1158
|
+
if args.code_header:
|
|
1159
|
+
header = get_code_header(classification, args.code_header)
|
|
1160
|
+
if args.json:
|
|
1161
|
+
print(json.dumps({
|
|
1162
|
+
"classification": classification,
|
|
1163
|
+
"language": args.code_header,
|
|
1164
|
+
"code_header": header,
|
|
1165
|
+
}, indent=2))
|
|
1166
|
+
else:
|
|
1167
|
+
print(f"Code header for {classification} ({args.code_header}):\n")
|
|
1168
|
+
print(header)
|
|
1169
|
+
|
|
1170
|
+
# --- Cross-domain ---
|
|
1171
|
+
if args.cross_domain:
|
|
1172
|
+
src, tgt = args.cross_domain
|
|
1173
|
+
controls = get_cross_domain_controls(src, tgt)
|
|
1174
|
+
if args.json:
|
|
1175
|
+
print(json.dumps(controls, indent=2))
|
|
1176
|
+
else:
|
|
1177
|
+
print(f"Cross-Domain Controls: {src} -> {tgt}")
|
|
1178
|
+
print(f" Direction: {controls.get('direction')}")
|
|
1179
|
+
print(f" Description: {controls.get('description')}")
|
|
1180
|
+
print(f" Solution Type: {controls.get('solution_type')}")
|
|
1181
|
+
print(f" Approval Required: {controls.get('approval_required')}")
|
|
1182
|
+
addl = controls.get("additional_controls", [])
|
|
1183
|
+
if addl:
|
|
1184
|
+
print(f" Additional Controls ({len(addl)}):")
|
|
1185
|
+
for ctrl in addl:
|
|
1186
|
+
print(f" - {ctrl}")
|
|
1187
|
+
|
|
1188
|
+
# --- Validate ---
|
|
1189
|
+
if args.validate:
|
|
1190
|
+
result = validate_classification(args.validate, db_path=args.db_path)
|
|
1191
|
+
if args.json:
|
|
1192
|
+
print(json.dumps(result, indent=2))
|
|
1193
|
+
else:
|
|
1194
|
+
status = "VALID" if result["valid"] else "INVALID"
|
|
1195
|
+
print(f"Classification Validation: {status}")
|
|
1196
|
+
print(f" Project: {result['project_id']}")
|
|
1197
|
+
print(f" Classification: {result['classification']}")
|
|
1198
|
+
print(f" Impact Level: {result['impact_level'] or 'not set'}")
|
|
1199
|
+
if result["issues"]:
|
|
1200
|
+
print(f" Issues ({len(result['issues'])}):")
|
|
1201
|
+
for issue in result["issues"]:
|
|
1202
|
+
print(f" - {issue}")
|
|
1203
|
+
else:
|
|
1204
|
+
print(" No issues found.")
|
|
1205
|
+
|
|
1206
|
+
except (ValueError, FileNotFoundError) as exc:
|
|
1207
|
+
print(f"ERROR: {exc}", file=sys.stderr)
|
|
1208
|
+
sys.exit(1)
|
|
1209
|
+
|
|
1210
|
+
|
|
1211
|
+
def _run_demo(as_json: bool = False) -> None:
|
|
1212
|
+
"""Demonstrate all classification manager capabilities."""
|
|
1213
|
+
print("=" * 70)
|
|
1214
|
+
print(" ICDEV Classification & Marking Manager -- Demo")
|
|
1215
|
+
print("=" * 70)
|
|
1216
|
+
print()
|
|
1217
|
+
|
|
1218
|
+
# 1. Impact level profiles
|
|
1219
|
+
print("--- Impact Level Profiles ---")
|
|
1220
|
+
for il in VALID_IMPACT_LEVELS:
|
|
1221
|
+
try:
|
|
1222
|
+
cls = get_classification_for_il(il)
|
|
1223
|
+
print(f" {il}: classification={cls}")
|
|
1224
|
+
except ValueError:
|
|
1225
|
+
print(f" {il}: (profile not available)")
|
|
1226
|
+
print()
|
|
1227
|
+
|
|
1228
|
+
# 2. Marking banners
|
|
1229
|
+
print("--- Marking Banners ---")
|
|
1230
|
+
for cls in ("CUI", "SECRET", "TOP SECRET"):
|
|
1231
|
+
banner = get_marking_banner(cls)
|
|
1232
|
+
print(f"\n [{cls}]")
|
|
1233
|
+
for line in banner.split("\n"):
|
|
1234
|
+
print(f" {line}")
|
|
1235
|
+
print()
|
|
1236
|
+
|
|
1237
|
+
# 3. Portion markings
|
|
1238
|
+
print("--- Portion Markings ---")
|
|
1239
|
+
for cls in VALID_CLASSIFICATIONS:
|
|
1240
|
+
print(f" {cls}: {get_portion_marking(cls)}")
|
|
1241
|
+
print()
|
|
1242
|
+
|
|
1243
|
+
# 4. Code headers
|
|
1244
|
+
print("--- Code Headers ---")
|
|
1245
|
+
for lang in ("python", "java", "xml"):
|
|
1246
|
+
header = get_code_header("CUI", lang)
|
|
1247
|
+
print(f"\n [{lang} / CUI]")
|
|
1248
|
+
for line in header.rstrip("\n").split("\n"):
|
|
1249
|
+
print(f" {line}")
|
|
1250
|
+
print()
|
|
1251
|
+
|
|
1252
|
+
# 5. Code header for SECRET
|
|
1253
|
+
print(" [python / SECRET]")
|
|
1254
|
+
header = get_code_header("SECRET", "python")
|
|
1255
|
+
for line in header.rstrip("\n").split("\n"):
|
|
1256
|
+
print(f" {line}")
|
|
1257
|
+
print()
|
|
1258
|
+
|
|
1259
|
+
# 6. Compliance baselines
|
|
1260
|
+
print("--- Compliance Baselines ---")
|
|
1261
|
+
for il in ("IL4", "IL4", "IL4"):
|
|
1262
|
+
try:
|
|
1263
|
+
baseline = get_required_baseline(il)
|
|
1264
|
+
print(f" {il}: FedRAMP={baseline['fedramp_baseline']}, "
|
|
1265
|
+
f"CMMC={baseline['cmmc_level']}, "
|
|
1266
|
+
f"NIST 171={baseline['nist_800_171_required']}, "
|
|
1267
|
+
f"Overlay controls={len(baseline.get('required_controls_overlay', []))}")
|
|
1268
|
+
except ValueError:
|
|
1269
|
+
print(f" {il}: (not available)")
|
|
1270
|
+
print()
|
|
1271
|
+
|
|
1272
|
+
# 7. Encryption requirements
|
|
1273
|
+
print("--- Encryption Requirements (IL4) ---")
|
|
1274
|
+
try:
|
|
1275
|
+
enc = get_encryption_requirements("IL4")
|
|
1276
|
+
for k, v in enc.items():
|
|
1277
|
+
print(f" {k}: {v}")
|
|
1278
|
+
except ValueError:
|
|
1279
|
+
print(" (not available)")
|
|
1280
|
+
print()
|
|
1281
|
+
|
|
1282
|
+
# 8. Network requirements
|
|
1283
|
+
print("--- Network Requirements (IL4) ---")
|
|
1284
|
+
try:
|
|
1285
|
+
net = get_network_requirements("IL4")
|
|
1286
|
+
for k, v in net.items():
|
|
1287
|
+
print(f" {k}: {v}")
|
|
1288
|
+
except ValueError:
|
|
1289
|
+
print(" (not available)")
|
|
1290
|
+
print()
|
|
1291
|
+
|
|
1292
|
+
# 9. Cloud environments
|
|
1293
|
+
print("--- Cloud Environments ---")
|
|
1294
|
+
for il in ("IL4", "IL4", "IL4"):
|
|
1295
|
+
try:
|
|
1296
|
+
envs = get_cloud_environments(il)
|
|
1297
|
+
print(f" {il}: {', '.join(envs)}")
|
|
1298
|
+
except ValueError:
|
|
1299
|
+
print(f" {il}: (not available)")
|
|
1300
|
+
print()
|
|
1301
|
+
|
|
1302
|
+
# 10. Cross-domain controls
|
|
1303
|
+
print("--- Cross-Domain Controls ---")
|
|
1304
|
+
for src, tgt in [("IL4", "IL4"), ("IL4", "IL4")]:
|
|
1305
|
+
try:
|
|
1306
|
+
cd = get_cross_domain_controls(src, tgt)
|
|
1307
|
+
print(f" {src} -> {tgt}: {cd.get('solution_type', 'N/A')}")
|
|
1308
|
+
addl = cd.get("additional_controls", [])
|
|
1309
|
+
if addl:
|
|
1310
|
+
print(f" Additional controls: {', '.join(addl)}")
|
|
1311
|
+
except ValueError:
|
|
1312
|
+
print(f" {src} -> {tgt}: (not available)")
|
|
1313
|
+
print()
|
|
1314
|
+
|
|
1315
|
+
# 11. Marking upgrade demo
|
|
1316
|
+
print("--- Marking Upgrade Demo ---")
|
|
1317
|
+
sample = (
|
|
1318
|
+
"////////////////////////////////////////////////////////////////////\n"
|
|
1319
|
+
"CONTROLLED UNCLASSIFIED INFORMATION (CUI // SP-CTI)\n"
|
|
1320
|
+
"Distribution: Distribution D -- Authorized DoD Personnel Only\n"
|
|
1321
|
+
"////////////////////////////////////////////////////////////////////\n"
|
|
1322
|
+
"\n"
|
|
1323
|
+
"This is a (CUI) document with CUI // SP-CTI markings.\n"
|
|
1324
|
+
)
|
|
1325
|
+
upgraded = upgrade_markings(sample, "CUI", "SECRET")
|
|
1326
|
+
print(" Before:")
|
|
1327
|
+
for line in sample.rstrip("\n").split("\n"):
|
|
1328
|
+
print(f" {line}")
|
|
1329
|
+
print(" After upgrade to SECRET:")
|
|
1330
|
+
for line in upgraded.rstrip("\n").split("\n"):
|
|
1331
|
+
print(f" {line}")
|
|
1332
|
+
print()
|
|
1333
|
+
|
|
1334
|
+
print("=" * 70)
|
|
1335
|
+
print(" Demo complete. Use --help for CLI options.")
|
|
1336
|
+
print("=" * 70)
|
|
1337
|
+
|
|
1338
|
+
|
|
1339
|
+
if __name__ == "__main__":
|
|
1340
|
+
main()
|