icdev 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- icdev/__init__.py +18 -0
- icdev/_paths.py +85 -0
- icdev/_version.py +3 -0
- icdev/data/__init__.py +1 -0
- icdev/data/args/__init__.py +1 -0
- icdev/data/args/agent_authority.yaml +61 -0
- icdev/data/args/agent_config.yaml +355 -0
- icdev/data/args/agentic_fitness.yaml +31 -0
- icdev/data/args/ai_governance_config.yaml +137 -0
- icdev/data/args/atlas_critique_config.yaml +66 -0
- icdev/data/args/bedrock_models.yaml +63 -0
- icdev/data/args/cicd_config.yaml +82 -0
- icdev/data/args/classification_config.yaml +232 -0
- icdev/data/args/cli_config.yaml +154 -0
- icdev/data/args/cloud_config.yaml +63 -0
- icdev/data/args/code_pattern_config.yaml +151 -0
- icdev/data/args/code_quality_config.yaml +47 -0
- icdev/data/args/companion_registry.yaml +202 -0
- icdev/data/args/context_config.yaml +82 -0
- icdev/data/args/csp_monitor_config.yaml +268 -0
- icdev/data/args/cui_markings.yaml +35 -0
- icdev/data/args/db_config.yaml +40 -0
- icdev/data/args/deployment_profiles.yaml +248 -0
- icdev/data/args/dev_profile_config.yaml +144 -0
- icdev/data/args/devsecops_config.yaml +286 -0
- icdev/data/args/endpoint_security_config.yaml +137 -0
- icdev/data/args/extension_config.yaml +79 -0
- icdev/data/args/file_access_tiers.yaml +88 -0
- icdev/data/args/framework_registry.yaml +415 -0
- icdev/data/args/innovation_config.yaml +431 -0
- icdev/data/args/installation_manifest.yaml +1087 -0
- icdev/data/args/llm_config.yaml +495 -0
- icdev/data/args/maintenance_config.yaml +55 -0
- icdev/data/args/memory_config.yaml +83 -0
- icdev/data/args/monitoring_config.yaml +127 -0
- icdev/data/args/mosa_config.yaml +190 -0
- icdev/data/args/nlq_config.yaml +35 -0
- icdev/data/args/observability_config.yaml +39 -0
- icdev/data/args/observability_tracing_config.yaml +170 -0
- icdev/data/args/oscal_tools_config.yaml +43 -0
- icdev/data/args/owasp_agentic_config.yaml +171 -0
- icdev/data/args/phase_registry.yaml +618 -0
- icdev/data/args/project_defaults.yaml +235 -0
- icdev/data/args/prompt_chains.yaml +163 -0
- icdev/data/args/resilience_config.yaml +50 -0
- icdev/data/args/ricoas_config.yaml +191 -0
- icdev/data/args/role_personas.yaml +362 -0
- icdev/data/args/scaling_config.yaml +176 -0
- icdev/data/args/security_gates.yaml +685 -0
- icdev/data/args/skill_injection_config.yaml +322 -0
- icdev/data/args/spec_config.yaml +53 -0
- icdev/data/args/supply_chain_config.yaml +76 -0
- icdev/data/args/translation_config.yaml +228 -0
- icdev/data/args/workflow_templates/ato_acceleration.yaml +54 -0
- icdev/data/args/workflow_templates/build_deploy.yaml +63 -0
- icdev/data/args/workflow_templates/full_compliance.yaml +43 -0
- icdev/data/args/workflow_templates/security_hardening.yaml +55 -0
- icdev/data/args/worktree_config.yaml +34 -0
- icdev/data/args/zta_config.yaml +247 -0
- icdev/data/context/__init__.py +1 -0
- icdev/data/context/agent/__init__.py +1 -0
- icdev/data/context/agent/response_schemas/__init__.py +1 -0
- icdev/data/context/agent/response_schemas/debate_position.json +46 -0
- icdev/data/context/agent/response_schemas/fitness_scorecard.json +74 -0
- icdev/data/context/agent/response_schemas/review_decision.json +39 -0
- icdev/data/context/agent/response_schemas/task_decomposition.json +82 -0
- icdev/data/context/agent/response_schemas/veto_decision.json +40 -0
- icdev/data/context/agentic/__init__.py +1 -0
- icdev/data/context/agentic/architecture_patterns.md +269 -0
- icdev/data/context/agentic/capability_registry.yaml +202 -0
- icdev/data/context/agentic/csp_mcp_registry.yaml +280 -0
- icdev/data/context/agentic/fitness_rubric.md +56 -0
- icdev/data/context/agentic/governance_baseline.md +205 -0
- icdev/data/context/ci/__init__.py +1 -0
- icdev/data/context/ci/worktree_templates.json +44 -0
- icdev/data/context/cloud/__init__.py +1 -0
- icdev/data/context/cloud/csp_service_registry.json +739 -0
- icdev/data/context/compliance/__init__.py +1 -0
- icdev/data/context/compliance/atlas_mitigations.json +293 -0
- icdev/data/context/compliance/atlas_techniques.json +833 -0
- icdev/data/context/compliance/cisa_sbd_requirements.json +432 -0
- icdev/data/context/compliance/cjis_security_policy.json +522 -0
- icdev/data/context/compliance/cmmc_practices.json +2494 -0
- icdev/data/context/compliance/cmmc_report_template.md +142 -0
- icdev/data/context/compliance/cnssi_1253_overlay.json +109 -0
- icdev/data/context/compliance/control_crosswalk.json +1914 -0
- icdev/data/context/compliance/control_families/__init__.py +1 -0
- icdev/data/context/compliance/csp_certifications.json +251 -0
- icdev/data/context/compliance/cssp_report_template.md +193 -0
- icdev/data/context/compliance/cui_templates/__init__.py +1 -0
- icdev/data/context/compliance/cui_templates/banner_block.txt +4 -0
- icdev/data/context/compliance/cui_templates/code_header.txt +8 -0
- icdev/data/context/compliance/cui_templates/document_template.md +35 -0
- icdev/data/context/compliance/data_type_framework_map.json +321 -0
- icdev/data/context/compliance/data_type_registry.json +147 -0
- icdev/data/context/compliance/dod_cssp_8530.json +463 -0
- icdev/data/context/compliance/eu_ai_act_annex_iii.json +108 -0
- icdev/data/context/compliance/export_templates/__init__.py +1 -0
- icdev/data/context/compliance/export_templates/emass_controls.csv.j2 +4 -0
- icdev/data/context/compliance/export_templates/evidence_package.md.j2 +39 -0
- icdev/data/context/compliance/export_templates/executive_summary.md.j2 +55 -0
- icdev/data/context/compliance/export_templates/poam_tracking.csv.j2 +4 -0
- icdev/data/context/compliance/fedramp_20x_ksi_schemas.json +133 -0
- icdev/data/context/compliance/fedramp_high_baseline.json +4370 -0
- icdev/data/context/compliance/fedramp_moderate_baseline.json +2183 -0
- icdev/data/context/compliance/fedramp_report_template.md +181 -0
- icdev/data/context/compliance/fips_200_areas.json +362 -0
- icdev/data/context/compliance/gao_ai_accountability.json +262 -0
- icdev/data/context/compliance/hipaa_security_rule.json +720 -0
- icdev/data/context/compliance/hitrust_csf_v11.json +930 -0
- icdev/data/context/compliance/impact_level_profiles.json +251 -0
- icdev/data/context/compliance/incident_response_template.md +1110 -0
- icdev/data/context/compliance/iso27001_2022_controls.json +750 -0
- icdev/data/context/compliance/iso27001_nist_bridge.json +382 -0
- icdev/data/context/compliance/iso42001_controls.json +254 -0
- icdev/data/context/compliance/ivv_checklist_template.md +80 -0
- icdev/data/context/compliance/ivv_report_template.md +116 -0
- icdev/data/context/compliance/ivv_requirements.json +372 -0
- icdev/data/context/compliance/mosa_crosswalk.json +327 -0
- icdev/data/context/compliance/mosa_framework.json +250 -0
- icdev/data/context/compliance/narrative_templates/AC.md.j2 +101 -0
- icdev/data/context/compliance/narrative_templates/AU.md.j2 +106 -0
- icdev/data/context/compliance/narrative_templates/IA.md.j2 +104 -0
- icdev/data/context/compliance/narrative_templates/SC.md.j2 +102 -0
- icdev/data/context/compliance/narrative_templates/SI.md.j2 +111 -0
- icdev/data/context/compliance/narrative_templates/__init__.py +1 -0
- icdev/data/context/compliance/narrative_templates/default.md.j2 +50 -0
- icdev/data/context/compliance/narrative_templates/executive_summary.j2 +27 -0
- icdev/data/context/compliance/narrative_templates/poam_milestone.j2 +19 -0
- icdev/data/context/compliance/narrative_templates/ssp_section.j2 +11 -0
- icdev/data/context/compliance/nist_800_171_controls.json +1552 -0
- icdev/data/context/compliance/nist_800_207_crosswalk.json +399 -0
- icdev/data/context/compliance/nist_800_207_zta.json +258 -0
- icdev/data/context/compliance/nist_800_53.json +324 -0
- icdev/data/context/compliance/nist_ai_600_1_genai.json +326 -0
- icdev/data/context/compliance/nist_ai_rmf.json +206 -0
- icdev/data/context/compliance/nist_sp_800_60_types.json +1667 -0
- icdev/data/context/compliance/omb_m25_21_high_impact_ai.json +248 -0
- icdev/data/context/compliance/omb_m26_04_unbiased_ai.json +262 -0
- icdev/data/context/compliance/owasp_agentic_asi.json +133 -0
- icdev/data/context/compliance/owasp_agentic_threats.json +285 -0
- icdev/data/context/compliance/owasp_llm_top10.json +274 -0
- icdev/data/context/compliance/pci_dss_v4.json +510 -0
- icdev/data/context/compliance/poam_template.md +117 -0
- icdev/data/context/compliance/safeai_controls.json +512 -0
- icdev/data/context/compliance/sbd_report_template.md +77 -0
- icdev/data/context/compliance/siem_config_templates/__init__.py +1 -0
- icdev/data/context/compliance/siem_config_templates/filebeat.yml +213 -0
- icdev/data/context/compliance/siem_config_templates/log_sources.json +208 -0
- icdev/data/context/compliance/soc2_trust_criteria.json +661 -0
- icdev/data/context/compliance/ssp_template.md +432 -0
- icdev/data/context/compliance/stig_templates/__init__.py +1 -0
- icdev/data/context/compliance/stig_templates/webapp_stig.json +139 -0
- icdev/data/context/compliance/xai_requirements.json +108 -0
- icdev/data/context/dashboard/__init__.py +1 -0
- icdev/data/context/dashboard/nlq_examples.json +50 -0
- icdev/data/context/dashboard/schema_descriptions.json +23 -0
- icdev/data/context/integration/__init__.py +1 -0
- icdev/data/context/integration/approval_workflows.json +32 -0
- icdev/data/context/integration/gitlab_field_mappings.json +33 -0
- icdev/data/context/integration/jira_field_mappings.json +32 -0
- icdev/data/context/integration/reqif_export_schema.json +23 -0
- icdev/data/context/integration/servicenow_field_mappings.json +22 -0
- icdev/data/context/languages/__init__.py +1 -0
- icdev/data/context/languages/framework_patterns.json +205 -0
- icdev/data/context/languages/language_registry.json +279 -0
- icdev/data/context/llm/__init__.py +1 -0
- icdev/data/context/llm/example_provider.py +86 -0
- icdev/data/context/mbse/__init__.py +1 -0
- icdev/data/context/mbse/des_report_template.md +162 -0
- icdev/data/context/mbse/des_requirements.json +411 -0
- icdev/data/context/mbse/digital_thread_patterns.json +403 -0
- icdev/data/context/mbse/reqif_schema.json +280 -0
- icdev/data/context/mbse/sysml_element_types.json +432 -0
- icdev/data/context/modernization/__init__.py +1 -0
- icdev/data/context/modernization/db_type_mappings.json +148 -0
- icdev/data/context/modernization/decomposition_patterns.json +284 -0
- icdev/data/context/modernization/framework_migration_patterns.json +359 -0
- icdev/data/context/modernization/migration_report_template.md +168 -0
- icdev/data/context/modernization/seven_rs_catalog.json +369 -0
- icdev/data/context/modernization/version_upgrade_rules.json +279 -0
- icdev/data/context/oscal/NIST_SP-800-53_rev5_catalog.json +254987 -0
- icdev/data/context/oscal/README.md +43 -0
- icdev/data/context/patterns/__init__.py +1 -0
- icdev/data/context/profiles/__init__.py +1 -0
- icdev/data/context/profiles/dod_baseline_v1.yaml +145 -0
- icdev/data/context/profiles/fedramp_baseline_v1.yaml +143 -0
- icdev/data/context/profiles/financial_baseline_v1.yaml +142 -0
- icdev/data/context/profiles/healthcare_baseline_v1.yaml +135 -0
- icdev/data/context/profiles/law_enforcement_v1.yaml +129 -0
- icdev/data/context/profiles/startup_v1.yaml +134 -0
- icdev/data/context/requirements/__init__.py +1 -0
- icdev/data/context/requirements/ambiguity_patterns.json +97 -0
- icdev/data/context/requirements/boundary_impact_rules.json +123 -0
- icdev/data/context/requirements/default_constitutions.json +67 -0
- icdev/data/context/requirements/document_extraction_rules.json +58 -0
- icdev/data/context/requirements/gap_patterns.json +108 -0
- icdev/data/context/requirements/readiness_rubric.json +78 -0
- icdev/data/context/requirements/red_alternative_patterns.json +210 -0
- icdev/data/context/requirements/safe_templates.json +72 -0
- icdev/data/context/requirements/spec_quality_checklist.json +122 -0
- icdev/data/context/simulation/__init__.py +1 -0
- icdev/data/context/simulation/architecture_patterns.json +36 -0
- icdev/data/context/simulation/coa_templates.json +38 -0
- icdev/data/context/simulation/cost_models.json +23 -0
- icdev/data/context/simulation/risk_categories.json +46 -0
- icdev/data/context/supply_chain/__init__.py +1 -0
- icdev/data/context/supply_chain/isa_templates.json +129 -0
- icdev/data/context/supply_chain/nist_800_161_controls.json +247 -0
- icdev/data/context/supply_chain/scrm_risk_matrix.json +147 -0
- icdev/data/context/templates/__init__.py +1 -0
- icdev/data/context/templates/ansible/__init__.py +1 -0
- icdev/data/context/templates/ansible/playbooks/__init__.py +1 -0
- icdev/data/context/templates/ansible/roles/__init__.py +1 -0
- icdev/data/context/templates/gitlab_ci/__init__.py +1 -0
- icdev/data/context/templates/grafana/__init__.py +1 -0
- icdev/data/context/templates/kubernetes/__init__.py +1 -0
- icdev/data/context/templates/project/__init__.py +1 -0
- icdev/data/context/templates/project/api/__init__.py +1 -0
- icdev/data/context/templates/project/cli/__init__.py +1 -0
- icdev/data/context/templates/project/data_pipeline/__init__.py +1 -0
- icdev/data/context/templates/project/iac/__init__.py +1 -0
- icdev/data/context/templates/project/javascript_frontend/__init__.py +1 -0
- icdev/data/context/templates/project/javascript_frontend/src/__init__.py +1 -0
- icdev/data/context/templates/project/javascript_frontend/tests/__init__.py +1 -0
- icdev/data/context/templates/project/microservice/__init__.py +1 -0
- icdev/data/context/templates/project/python_backend/__init__.py +1 -0
- icdev/data/context/templates/project/python_backend/src/__init__.py +1 -0
- icdev/data/context/templates/project/python_backend/tests/__init__.py +1 -0
- icdev/data/context/templates/project/python_backend/tests/features/__init__.py +1 -0
- icdev/data/context/templates/project/python_backend/tests/steps/__init__.py +1 -0
- icdev/data/context/templates/terraform/__init__.py +1 -0
- icdev/data/context/templates/terraform/govcloud_base/__init__.py +1 -0
- icdev/data/context/templates/terraform/modules/__init__.py +1 -0
- icdev/data/context/tone/__init__.py +1 -0
- icdev/data/context/translation/dependency_mappings.json +186 -0
- icdev/data/context/translation/type_mappings.json +149 -0
- icdev/data/docs/README.md +187 -0
- icdev/data/docs/__init__.py +1 -0
- icdev/data/docs/admin/gateway-guide.md +338 -0
- icdev/data/docs/admin/marketplace-guide.md +396 -0
- icdev/data/docs/admin/monitoring-guide.md +509 -0
- icdev/data/docs/architecture/compliance-framework.md +764 -0
- icdev/data/docs/architecture/database-schema.md +689 -0
- icdev/data/docs/architecture/gotcha-framework.md +518 -0
- icdev/data/docs/architecture/multi-agent-system.md +603 -0
- icdev/data/docs/dx/README.md +106 -0
- icdev/data/docs/dx/__init__.py +1 -0
- icdev/data/docs/dx/ci-cd-integration.md +378 -0
- icdev/data/docs/dx/claude-code-guide.md +213 -0
- icdev/data/docs/dx/companion-guide.md +232 -0
- icdev/data/docs/dx/dev-profiles.md +309 -0
- icdev/data/docs/dx/icdev-yaml-spec.md +219 -0
- icdev/data/docs/dx/integration-tiers.md +279 -0
- icdev/data/docs/dx/llm-routing-guide.md +456 -0
- icdev/data/docs/dx/quickstart.md +192 -0
- icdev/data/docs/dx/sdk-reference.md +356 -0
- icdev/data/docs/dx/unified-mcp-setup.md +525 -0
- icdev/data/docs/features/__init__.py +1 -0
- icdev/data/docs/features/phase-01-gotcha-framework.md +249 -0
- icdev/data/docs/features/phase-02-atlas-build-workflow.md +223 -0
- icdev/data/docs/features/phase-03-tdd-bdd-testing.md +261 -0
- icdev/data/docs/features/phase-04-nist-compliance.md +255 -0
- icdev/data/docs/features/phase-05-security-scanning.md +229 -0
- icdev/data/docs/features/phase-06-infrastructure-deployment.md +288 -0
- icdev/data/docs/features/phase-07-code-review-gates.md +276 -0
- icdev/data/docs/features/phase-08-self-healing.md +223 -0
- icdev/data/docs/features/phase-09-monitoring-observability.md +230 -0
- icdev/data/docs/features/phase-10-dashboard-web-ui.md +218 -0
- icdev/data/docs/features/phase-11-multi-agent-architecture.md +272 -0
- icdev/data/docs/features/phase-12-integration-testing.md +228 -0
- icdev/data/docs/features/phase-13-cicd-integration.md +257 -0
- icdev/data/docs/features/phase-14-secure-by-design-ivv.md +240 -0
- icdev/data/docs/features/phase-15-maintenance-audit.md +192 -0
- icdev/data/docs/features/phase-16-ato-acceleration.md +228 -0
- icdev/data/docs/features/phase-17-multi-framework-compliance.md +223 -0
- icdev/data/docs/features/phase-18-mbse-integration.md +242 -0
- icdev/data/docs/features/phase-19-agentic-generation.md +202 -0
- icdev/data/docs/features/phase-20-fips-security-categorization.md +198 -0
- icdev/data/docs/features/phase-21-saas-multi-tenancy.md +273 -0
- icdev/data/docs/features/phase-22-federated-gotcha-marketplace.md +242 -0
- icdev/data/docs/features/phase-23-universal-compliance-platform.md +238 -0
- icdev/data/docs/features/phase-24-devsecops-pipeline-security.md +198 -0
- icdev/data/docs/features/phase-25-zero-trust-architecture.md +220 -0
- icdev/data/docs/features/phase-26-dod-mosa.md +205 -0
- icdev/data/docs/features/phase-27-cli-capabilities.md +222 -0
- icdev/data/docs/features/phase-28-remote-command-gateway.md +235 -0
- icdev/data/docs/features/phase-29-proactive-monitoring.md +212 -0
- icdev/data/docs/features/phase-30-dashboard-auth.md +215 -0
- icdev/data/docs/features/phase-31-dashboard-ux-low-impact.md +188 -0
- icdev/data/docs/features/phase-32-dashboard-ux-medium-impact.md +223 -0
- icdev/data/docs/features/phase-33-modular-installation.md +218 -0
- icdev/data/docs/features/phase-34-dev-profiles.md +239 -0
- icdev/data/docs/features/phase-35-innovation-engine.md +257 -0
- icdev/data/docs/features/phase-36-evolutionary-intelligence.md +351 -0
- icdev/data/docs/features/phase-37-mitre-atlas-integration.md +485 -0
- icdev/data/docs/features/phase-38-cloud-agnostic-architecture.md +1033 -0
- icdev/data/docs/features/phase-39-observability-operations.md +178 -0
- icdev/data/docs/features/phase-40-nlq-compliance-queries.md +176 -0
- icdev/data/docs/features/phase-41-parallel-cicd.md +169 -0
- icdev/data/docs/features/phase-42-framework-planning.md +177 -0
- icdev/data/docs/features/phase-43-cross-language-translation.md +225 -0
- icdev/data/docs/features/phase-44-innovation-adaptation.md +227 -0
- icdev/data/docs/features/phase-45-owasp-agentic-security.md +239 -0
- icdev/data/docs/features/phase-46-observability-traceability-xai.md +240 -0
- icdev/data/docs/features/phase-47-unified-mcp-gateway.md +257 -0
- icdev/data/docs/features/phase-48-ai-transparency.md +203 -0
- icdev/data/docs/features/phase-49-ai-accountability.md +243 -0
- icdev/data/docs/features/phase-50-ai-governance-intake-chat.md +195 -0
- icdev/data/docs/features/phase-51-unified-chat-dashboard.md +240 -0
- icdev/data/docs/features/phase-52-code-intelligence.md +244 -0
- icdev/data/docs/features/phase-53-fedramp-20x-owasp-asi.md +359 -0
- icdev/data/docs/features/phase-54-slsa-swft-orchestration.md +379 -0
- icdev/data/docs/features/phase-55-a2a-v03-mcp-oauth.md +322 -0
- icdev/data/docs/features/phase-56-evidence-lineage.md +352 -0
- icdev/data/docs/features/phase-57-eu-ai-act-iron-bank.md +319 -0
- icdev/data/docs/features/phase-58-creative-engine.md +370 -0
- icdev/data/docs/features/phase-59-govcon-intelligence.md +535 -0
- icdev/data/docs/features/phase-60-cpmp.md +528 -0
- icdev/data/docs/features/phase-61-orchestration-improvements.md +534 -0
- icdev/data/docs/operations/dashboard-guide.md +354 -0
- icdev/data/docs/operations/deployment-guide.md +556 -0
- icdev/data/docs/operations/saas-admin-guide.md +439 -0
- icdev/data/docs/operations/security-operations-guide.md +733 -0
- icdev/data/docs/runbooks/backup-restore.md +412 -0
- icdev/data/docs/runbooks/troubleshooting.md +499 -0
- icdev/data/features/__init__.py +1 -0
- icdev/data/features/cicd_integration.feature +41 -0
- icdev/data/features/compliance_gates.feature +46 -0
- icdev/data/features/dashboard.feature +72 -0
- icdev/data/features/environment.py +25 -0
- icdev/data/features/project_management.feature +32 -0
- icdev/data/features/requirements_intake.feature +42 -0
- icdev/data/features/saas_platform.feature +53 -0
- icdev/data/features/security_scanning.feature +36 -0
- icdev/data/features/steps/__init__.py +1 -0
- icdev/data/features/steps/cicd_steps.py +465 -0
- icdev/data/features/steps/compliance_steps.py +308 -0
- icdev/data/features/steps/dashboard_steps.py +88 -0
- icdev/data/features/steps/project_steps.py +126 -0
- icdev/data/features/steps/requirements_intake_steps.py +689 -0
- icdev/data/features/steps/saas_platform_steps.py +572 -0
- icdev/data/features/steps/security_steps.py +236 -0
- icdev/data/features/steps/testing_steps.py +226 -0
- icdev/data/features/testing_pipeline.feature +42 -0
- icdev/data/goals/__init__.py +1 -0
- icdev/data/goals/agent_management.md +144 -0
- icdev/data/goals/agentic_generation.md +345 -0
- icdev/data/goals/agentic_threat_model.md +309 -0
- icdev/data/goals/ai_accountability.md +90 -0
- icdev/data/goals/ai_governance_intake.md +132 -0
- icdev/data/goals/ai_transparency.md +76 -0
- icdev/data/goals/atlas_integration.md +405 -0
- icdev/data/goals/ato_acceleration.md +139 -0
- icdev/data/goals/boundary_supply_chain.md +206 -0
- icdev/data/goals/build_app.md +544 -0
- icdev/data/goals/cicd_integration.md +86 -0
- icdev/data/goals/claude_dir_maintenance.md +77 -0
- icdev/data/goals/cli_capabilities.md +340 -0
- icdev/data/goals/cloud_agnostic.md +312 -0
- icdev/data/goals/code_intelligence.md +197 -0
- icdev/data/goals/code_review.md +94 -0
- icdev/data/goals/compliance_workflow.md +858 -0
- icdev/data/goals/continuous_harmonization.md +140 -0
- icdev/data/goals/cross_language_translation.md +171 -0
- icdev/data/goals/dashboard.md +142 -0
- icdev/data/goals/deploy_workflow.md +390 -0
- icdev/data/goals/devsecops_workflow.md +408 -0
- icdev/data/goals/evolutionary_intelligence.md +305 -0
- icdev/data/goals/external_integration.md +113 -0
- icdev/data/goals/framework_planning.md +63 -0
- icdev/data/goals/init_project.md +235 -0
- icdev/data/goals/innovation_engine.md +199 -0
- icdev/data/goals/integration_testing.md +189 -0
- icdev/data/goals/maintenance_audit.md +196 -0
- icdev/data/goals/manifest.md +56 -0
- icdev/data/goals/mbse_integration.md +504 -0
- icdev/data/goals/modernization_workflow.md +618 -0
- icdev/data/goals/monitoring.md +126 -0
- icdev/data/goals/mosa_workflow.md +463 -0
- icdev/data/goals/multi_agent_orchestration.md +68 -0
- icdev/data/goals/nlq_compliance.md +63 -0
- icdev/data/goals/observability.md +64 -0
- icdev/data/goals/observability_traceability_xai.md +154 -0
- icdev/data/goals/owasp_agentic_security.md +395 -0
- icdev/data/goals/parallel_cicd.md +61 -0
- icdev/data/goals/requirements_intake.md +213 -0
- icdev/data/goals/sbd_ivv_workflow.md +195 -0
- icdev/data/goals/security_categorization.md +133 -0
- icdev/data/goals/security_scan.md +381 -0
- icdev/data/goals/self_healing.md +120 -0
- icdev/data/goals/simulation_engine.md +111 -0
- icdev/data/goals/tdd_workflow.md +403 -0
- icdev/data/goals/zero_trust_architecture.md +403 -0
- icdev/data/hardprompts/__init__.py +1 -0
- icdev/data/hardprompts/agent/__init__.py +1 -0
- icdev/data/hardprompts/agent/agentic_architect.md +100 -0
- icdev/data/hardprompts/agent/debate_prompt.md +32 -0
- icdev/data/hardprompts/agent/fitness_evaluation.md +48 -0
- icdev/data/hardprompts/agent/governance_review.md +214 -0
- icdev/data/hardprompts/agent/reviewer_prompt.md +34 -0
- icdev/data/hardprompts/agent/skill_design.md +172 -0
- icdev/data/hardprompts/agent/task_decomposition.md +275 -0
- icdev/data/hardprompts/agent/veto_check_prompt.md +33 -0
- icdev/data/hardprompts/architect/__init__.py +1 -0
- icdev/data/hardprompts/architect/api_design.md +283 -0
- icdev/data/hardprompts/architect/data_model.md +277 -0
- icdev/data/hardprompts/architect/system_design.md +180 -0
- icdev/data/hardprompts/builder/__init__.py +1 -0
- icdev/data/hardprompts/builder/code_generation.md +59 -0
- icdev/data/hardprompts/builder/refactor.md +58 -0
- icdev/data/hardprompts/builder/scaffold_project.md +69 -0
- icdev/data/hardprompts/builder/test_generation.md +87 -0
- icdev/data/hardprompts/ci/__init__.py +1 -0
- icdev/data/hardprompts/ci/worktree_setup.md +35 -0
- icdev/data/hardprompts/compliance/__init__.py +1 -0
- icdev/data/hardprompts/compliance/cmmc_assessment.md +63 -0
- icdev/data/hardprompts/compliance/cssp_assessment.md +75 -0
- icdev/data/hardprompts/compliance/cui_marking.md +86 -0
- icdev/data/hardprompts/compliance/fedramp_assessment.md +55 -0
- icdev/data/hardprompts/compliance/ivv_assessment.md +96 -0
- icdev/data/hardprompts/compliance/poam_generation.md +57 -0
- icdev/data/hardprompts/compliance/sbd_assessment.md +101 -0
- icdev/data/hardprompts/compliance/security_categorization.md +74 -0
- icdev/data/hardprompts/compliance/ssp_generation.md +56 -0
- icdev/data/hardprompts/compliance/stig_evaluation.md +63 -0
- icdev/data/hardprompts/dashboard/__init__.py +1 -0
- icdev/data/hardprompts/dashboard/nlq_system_prompt.md +26 -0
- icdev/data/hardprompts/infra/__init__.py +1 -0
- icdev/data/hardprompts/infra/k8s_manifests.md +118 -0
- icdev/data/hardprompts/infra/pipeline_generation.md +160 -0
- icdev/data/hardprompts/infra/terraform_generation.md +92 -0
- icdev/data/hardprompts/integration/__init__.py +1 -0
- icdev/data/hardprompts/integration/approval_review.md +17 -0
- icdev/data/hardprompts/integration/jira_mapping.md +25 -0
- icdev/data/hardprompts/integration/servicenow_mapping.md +14 -0
- icdev/data/hardprompts/knowledge/__init__.py +1 -0
- icdev/data/hardprompts/knowledge/pattern_detection.md +73 -0
- icdev/data/hardprompts/knowledge/recommendation_engine.md +90 -0
- icdev/data/hardprompts/knowledge/root_cause_analysis.md +91 -0
- icdev/data/hardprompts/maintenance/__init__.py +1 -0
- icdev/data/hardprompts/maintenance/maintenance_assessment.md +82 -0
- icdev/data/hardprompts/mbse/__init__.py +1 -0
- icdev/data/hardprompts/mbse/digital_thread.md +67 -0
- icdev/data/hardprompts/mbse/model_import.md +62 -0
- icdev/data/hardprompts/mbse/model_to_code.md +65 -0
- icdev/data/hardprompts/modernization/__init__.py +1 -0
- icdev/data/hardprompts/modernization/legacy_analysis.md +93 -0
- icdev/data/hardprompts/modernization/migration_planning.md +150 -0
- icdev/data/hardprompts/modernization/seven_r_assessment.md +107 -0
- icdev/data/hardprompts/requirements/__init__.py +1 -0
- icdev/data/hardprompts/requirements/bdd_generation.md +35 -0
- icdev/data/hardprompts/requirements/clarification_prioritization.md +29 -0
- icdev/data/hardprompts/requirements/decomposition.md +60 -0
- icdev/data/hardprompts/requirements/document_extraction.md +45 -0
- icdev/data/hardprompts/requirements/gap_detection.md +70 -0
- icdev/data/hardprompts/requirements/intake_conversation.md +101 -0
- icdev/data/hardprompts/requirements/readiness_assessment.md +39 -0
- icdev/data/hardprompts/requirements/spec_quality.md +33 -0
- icdev/data/hardprompts/requirements/traceability_analysis.md +23 -0
- icdev/data/hardprompts/security/__init__.py +1 -0
- icdev/data/hardprompts/security/endpoint_security.md +78 -0
- icdev/data/hardprompts/security/threat_model.md +70 -0
- icdev/data/hardprompts/security/vulnerability_assessment.md +81 -0
- icdev/data/hardprompts/simulation/__init__.py +1 -0
- icdev/data/hardprompts/simulation/architecture_impact.md +27 -0
- icdev/data/hardprompts/simulation/coa_alternative.md +27 -0
- icdev/data/hardprompts/simulation/coa_generation.md +25 -0
- icdev/data/hardprompts/simulation/compliance_impact.md +28 -0
- icdev/data/hardprompts/simulation/cost_estimation.md +33 -0
- icdev/data/hardprompts/simulation/risk_assessment.md +28 -0
- icdev/data/hardprompts/translation/code_translation.md +68 -0
- icdev/data/hardprompts/translation/dependency_suggestion.md +44 -0
- icdev/data/hardprompts/translation/test_translation.md +64 -0
- icdev/data/hardprompts/translation/translation_repair.md +59 -0
- icdev/py.typed +0 -0
- icdev/tools/__init__.py +1 -0
- icdev/tools/_gen_formatter.py +12 -0
- icdev/tools/a2a/__init__.py +1 -0
- icdev/tools/a2a/agent_cards/architect.json +43 -0
- icdev/tools/a2a/agent_cards/builder.json +50 -0
- icdev/tools/a2a/agent_cards/compliance.json +57 -0
- icdev/tools/a2a/agent_cards/devsecops.json +71 -0
- icdev/tools/a2a/agent_cards/infra.json +57 -0
- icdev/tools/a2a/agent_cards/integration.json +57 -0
- icdev/tools/a2a/agent_cards/knowledge.json +43 -0
- icdev/tools/a2a/agent_cards/mbse.json +57 -0
- icdev/tools/a2a/agent_cards/modernization.json +50 -0
- icdev/tools/a2a/agent_cards/monitor.json +43 -0
- icdev/tools/a2a/agent_cards/orchestrator.json +36 -0
- icdev/tools/a2a/agent_cards/requirements_analyst.json +64 -0
- icdev/tools/a2a/agent_cards/security.json +50 -0
- icdev/tools/a2a/agent_cards/simulation.json +57 -0
- icdev/tools/a2a/agent_cards/supply_chain.json +50 -0
- icdev/tools/a2a/agent_client.py +349 -0
- icdev/tools/a2a/agent_registry.py +412 -0
- icdev/tools/a2a/agent_server.py +579 -0
- icdev/tools/a2a/task.py +200 -0
- icdev/tools/agent/__init__.py +2 -0
- icdev/tools/agent/a2a_agent_card_generator.py +285 -0
- icdev/tools/agent/a2a_discovery_server.py +250 -0
- icdev/tools/agent/agent_executor.py +529 -0
- icdev/tools/agent/agent_memory.py +557 -0
- icdev/tools/agent/agent_models.py +51 -0
- icdev/tools/agent/atlas_critique.py +908 -0
- icdev/tools/agent/authority.py +443 -0
- icdev/tools/agent/bedrock_client.py +1075 -0
- icdev/tools/agent/collaboration.py +871 -0
- icdev/tools/agent/dispatcher_mode.py +665 -0
- icdev/tools/agent/mailbox.py +575 -0
- icdev/tools/agent/prompt_chain_executor.py +1064 -0
- icdev/tools/agent/session_purpose.py +350 -0
- icdev/tools/agent/skill_router.py +638 -0
- icdev/tools/agent/skill_selector.py +486 -0
- icdev/tools/agent/team_orchestrator.py +1108 -0
- icdev/tools/agent/token_tracker.py +290 -0
- icdev/tools/analysis/__init__.py +1 -0
- icdev/tools/analysis/code_analyzer.py +780 -0
- icdev/tools/analysis/runtime_feedback.py +389 -0
- icdev/tools/audit/__init__.py +1 -0
- icdev/tools/audit/audit_logger.py +196 -0
- icdev/tools/audit/audit_query.py +157 -0
- icdev/tools/audit/decision_recorder.py +72 -0
- icdev/tools/builder/__init__.py +1 -0
- icdev/tools/builder/agentic_fitness.py +534 -0
- icdev/tools/builder/agentic_test_templates/test_a2a_callback.py +117 -0
- icdev/tools/builder/agentic_test_templates/test_a2a_lifecycle.feature +52 -0
- icdev/tools/builder/agentic_test_templates/test_agent_card.feature +37 -0
- icdev/tools/builder/agentic_test_templates/test_agent_health.py +128 -0
- icdev/tools/builder/agentic_test_templates/test_memory_system.feature +50 -0
- icdev/tools/builder/agentic_test_templates/test_skill_execution.feature +40 -0
- icdev/tools/builder/app_blueprint.py +1583 -0
- icdev/tools/builder/child_app_generator.py +2852 -0
- icdev/tools/builder/claude_md_generator.py +1734 -0
- icdev/tools/builder/code_generator.py +3703 -0
- icdev/tools/builder/db_init_generator.py +1709 -0
- icdev/tools/builder/dev_profile_manager.py +954 -0
- icdev/tools/builder/formatter.py +768 -0
- icdev/tools/builder/goal_adapter.py +592 -0
- icdev/tools/builder/gotcha_validator.py +812 -0
- icdev/tools/builder/language_support.py +441 -0
- icdev/tools/builder/linter.py +976 -0
- icdev/tools/builder/profile_detector.py +657 -0
- icdev/tools/builder/profile_md_generator.py +723 -0
- icdev/tools/builder/scaffolder.py +1590 -0
- icdev/tools/builder/scaffolder_extended.py +1771 -0
- icdev/tools/builder/test_writer.py +950 -0
- icdev/tools/ci/__init__.py +2 -0
- icdev/tools/ci/connectors/__init__.py +2 -0
- icdev/tools/ci/connectors/base_connector.py +80 -0
- icdev/tools/ci/connectors/connector_registry.py +188 -0
- icdev/tools/ci/connectors/mattermost_connector.py +159 -0
- icdev/tools/ci/connectors/slack_connector.py +197 -0
- icdev/tools/ci/core/__init__.py +2 -0
- icdev/tools/ci/core/air_gap_detector.py +115 -0
- icdev/tools/ci/core/comment_handler.py +192 -0
- icdev/tools/ci/core/conversation_manager.py +479 -0
- icdev/tools/ci/core/event_envelope.py +500 -0
- icdev/tools/ci/core/event_router.py +443 -0
- icdev/tools/ci/core/failure_parser.py +397 -0
- icdev/tools/ci/core/recovery_engine.py +527 -0
- icdev/tools/ci/modules/__init__.py +2 -0
- icdev/tools/ci/modules/agent.py +271 -0
- icdev/tools/ci/modules/git_ops.py +175 -0
- icdev/tools/ci/modules/state.py +117 -0
- icdev/tools/ci/modules/vcs.py +303 -0
- icdev/tools/ci/modules/workflow_ops.py +295 -0
- icdev/tools/ci/modules/worktree.py +340 -0
- icdev/tools/ci/pipeline_config_generator.py +558 -0
- icdev/tools/ci/triggers/__init__.py +2 -0
- icdev/tools/ci/triggers/gitlab_task_monitor.py +330 -0
- icdev/tools/ci/triggers/poll_trigger.py +237 -0
- icdev/tools/ci/triggers/webhook_server.py +356 -0
- icdev/tools/ci/workflows/__init__.py +2 -0
- icdev/tools/ci/workflows/icdev_build.py +140 -0
- icdev/tools/ci/workflows/icdev_comply.py +284 -0
- icdev/tools/ci/workflows/icdev_document.py +152 -0
- icdev/tools/ci/workflows/icdev_e2e.py +188 -0
- icdev/tools/ci/workflows/icdev_patch.py +186 -0
- icdev/tools/ci/workflows/icdev_plan.py +202 -0
- icdev/tools/ci/workflows/icdev_plan_build.py +41 -0
- icdev/tools/ci/workflows/icdev_plan_build_test.py +46 -0
- icdev/tools/ci/workflows/icdev_plan_build_test_review.py +47 -0
- icdev/tools/ci/workflows/icdev_review.py +126 -0
- icdev/tools/ci/workflows/icdev_sdlc.py +261 -0
- icdev/tools/ci/workflows/icdev_test.py +240 -0
- icdev/tools/cli/__init__.py +1 -0
- icdev/tools/cli/output_formatter.py +756 -0
- icdev/tools/cli_formatter.py +42 -0
- icdev/tools/cloud/__init__.py +11 -0
- icdev/tools/cloud/cloud_mode_manager.py +364 -0
- icdev/tools/cloud/csp_changelog.py +383 -0
- icdev/tools/cloud/csp_health_checker.py +268 -0
- icdev/tools/cloud/csp_monitor.py +951 -0
- icdev/tools/cloud/iam_provider.py +593 -0
- icdev/tools/cloud/kms_provider.py +346 -0
- icdev/tools/cloud/monitoring_provider.py +628 -0
- icdev/tools/cloud/provider_factory.py +376 -0
- icdev/tools/cloud/region_validator.py +345 -0
- icdev/tools/cloud/registry_provider.py +563 -0
- icdev/tools/cloud/secrets_provider.py +486 -0
- icdev/tools/cloud/storage_provider.py +446 -0
- icdev/tools/compat/__init__.py +21 -0
- icdev/tools/compat/cli_harmonizer.py +251 -0
- icdev/tools/compat/datetime_utils.py +18 -0
- icdev/tools/compat/db_utils.py +160 -0
- icdev/tools/compat/platform_utils.py +123 -0
- icdev/tools/compliance/__init__.py +1 -0
- icdev/tools/compliance/accountability_manager.py +397 -0
- icdev/tools/compliance/ai_accountability_audit.py +294 -0
- icdev/tools/compliance/ai_impact_assessor.py +273 -0
- icdev/tools/compliance/ai_incident_response.py +301 -0
- icdev/tools/compliance/ai_inventory_manager.py +239 -0
- icdev/tools/compliance/ai_reassessment_scheduler.py +256 -0
- icdev/tools/compliance/ai_transparency_audit.py +248 -0
- icdev/tools/compliance/atlas_assessor.py +278 -0
- icdev/tools/compliance/atlas_report_generator.py +1211 -0
- icdev/tools/compliance/base_assessor.py +597 -0
- icdev/tools/compliance/cato_monitor.py +1385 -0
- icdev/tools/compliance/cato_scheduler.py +699 -0
- icdev/tools/compliance/cjis_assessor.py +76 -0
- icdev/tools/compliance/classification_manager.py +1353 -0
- icdev/tools/compliance/cmmc_assessor.py +1491 -0
- icdev/tools/compliance/cmmc_report_generator.py +1100 -0
- icdev/tools/compliance/compliance_detector.py +463 -0
- icdev/tools/compliance/compliance_exporter.py +427 -0
- icdev/tools/compliance/compliance_status.py +825 -0
- icdev/tools/compliance/control_mapper.py +505 -0
- icdev/tools/compliance/crosswalk_engine.py +1203 -0
- icdev/tools/compliance/cssp_assessor.py +1045 -0
- icdev/tools/compliance/cssp_evidence_collector.py +729 -0
- icdev/tools/compliance/cssp_report_generator.py +1116 -0
- icdev/tools/compliance/cui_marker.py +388 -0
- icdev/tools/compliance/diagram_validator.py +600 -0
- icdev/tools/compliance/emass/__init__.py +2 -0
- icdev/tools/compliance/emass/emass_client.py +840 -0
- icdev/tools/compliance/emass/emass_export.py +777 -0
- icdev/tools/compliance/emass/emass_sync.py +826 -0
- icdev/tools/compliance/eu_ai_act_classifier.py +194 -0
- icdev/tools/compliance/evidence_collector.py +468 -0
- icdev/tools/compliance/fairness_assessor.py +316 -0
- icdev/tools/compliance/fedramp_assessor.py +1808 -0
- icdev/tools/compliance/fedramp_authorization_packager.py +137 -0
- icdev/tools/compliance/fedramp_ksi_generator.py +355 -0
- icdev/tools/compliance/fedramp_report_generator.py +1128 -0
- icdev/tools/compliance/fips199_categorizer.py +881 -0
- icdev/tools/compliance/fips200_validator.py +315 -0
- icdev/tools/compliance/gao_ai_assessor.py +231 -0
- icdev/tools/compliance/gao_evidence_builder.py +308 -0
- icdev/tools/compliance/hipaa_assessor.py +78 -0
- icdev/tools/compliance/hitrust_assessor.py +49 -0
- icdev/tools/compliance/incident_response_plan.py +718 -0
- icdev/tools/compliance/iso27001_assessor.py +92 -0
- icdev/tools/compliance/iso42001_assessor.py +114 -0
- icdev/tools/compliance/ivv_assessor.py +2327 -0
- icdev/tools/compliance/ivv_report_generator.py +1662 -0
- icdev/tools/compliance/model_card_generator.py +297 -0
- icdev/tools/compliance/mosa_assessor.py +117 -0
- icdev/tools/compliance/multi_regime_assessor.py +451 -0
- icdev/tools/compliance/narrative_generator.py +1013 -0
- icdev/tools/compliance/nist_800_207_assessor.py +191 -0
- icdev/tools/compliance/nist_ai_600_1_assessor.py +188 -0
- icdev/tools/compliance/nist_ai_rmf_assessor.py +110 -0
- icdev/tools/compliance/nist_lookup.py +245 -0
- icdev/tools/compliance/omb_m25_21_assessor.py +228 -0
- icdev/tools/compliance/omb_m26_04_assessor.py +188 -0
- icdev/tools/compliance/oscal_catalog_adapter.py +395 -0
- icdev/tools/compliance/oscal_generator.py +2170 -0
- icdev/tools/compliance/oscal_tools.py +1182 -0
- icdev/tools/compliance/owasp_agentic_assessor.py +226 -0
- icdev/tools/compliance/owasp_asi_assessor.py +200 -0
- icdev/tools/compliance/owasp_llm_assessor.py +244 -0
- icdev/tools/compliance/pci_dss_assessor.py +80 -0
- icdev/tools/compliance/pi_compliance_tracker.py +1461 -0
- icdev/tools/compliance/poam_generator.py +405 -0
- icdev/tools/compliance/resolve_marking.py +283 -0
- icdev/tools/compliance/sbd_assessor.py +2068 -0
- icdev/tools/compliance/sbd_report_generator.py +1236 -0
- icdev/tools/compliance/sbom_generator.py +1008 -0
- icdev/tools/compliance/siem_config_generator.py +674 -0
- icdev/tools/compliance/slsa_attestation_generator.py +490 -0
- icdev/tools/compliance/soc2_assessor.py +77 -0
- icdev/tools/compliance/ssp_generator.py +573 -0
- icdev/tools/compliance/stig_checker.py +727 -0
- icdev/tools/compliance/swft_evidence_bundler.py +337 -0
- icdev/tools/compliance/system_card_generator.py +309 -0
- icdev/tools/compliance/traceability_matrix.py +1281 -0
- icdev/tools/compliance/universal_classification_manager.py +1172 -0
- icdev/tools/compliance/xacta/__init__.py +2 -0
- icdev/tools/compliance/xacta/xacta_client.py +449 -0
- icdev/tools/compliance/xacta/xacta_export.py +557 -0
- icdev/tools/compliance/xacta/xacta_sync.py +333 -0
- icdev/tools/compliance/xai_assessor.py +231 -0
- icdev/tools/dashboard/__init__.py +1 -0
- icdev/tools/dashboard/api/__init__.py +1 -0
- icdev/tools/dashboard/api/_pipeline_state.py +17 -0
- icdev/tools/dashboard/api/activity.py +206 -0
- icdev/tools/dashboard/api/admin.py +176 -0
- icdev/tools/dashboard/api/agents.py +53 -0
- icdev/tools/dashboard/api/ai_accountability.py +163 -0
- icdev/tools/dashboard/api/ai_transparency.py +198 -0
- icdev/tools/dashboard/api/audit.py +58 -0
- icdev/tools/dashboard/api/batch.py +666 -0
- icdev/tools/dashboard/api/chat.py +241 -0
- icdev/tools/dashboard/api/cicd.py +219 -0
- icdev/tools/dashboard/api/code_quality.py +223 -0
- icdev/tools/dashboard/api/compliance.py +171 -0
- icdev/tools/dashboard/api/cpmp.py +915 -0
- icdev/tools/dashboard/api/diagrams.py +65 -0
- icdev/tools/dashboard/api/events.py +250 -0
- icdev/tools/dashboard/api/evidence.py +99 -0
- icdev/tools/dashboard/api/fedramp_20x.py +77 -0
- icdev/tools/dashboard/api/govcon.py +1095 -0
- icdev/tools/dashboard/api/intake.py +1171 -0
- icdev/tools/dashboard/api/lineage.py +163 -0
- icdev/tools/dashboard/api/metrics.py +155 -0
- icdev/tools/dashboard/api/nlq.py +72 -0
- icdev/tools/dashboard/api/orchestration.py +472 -0
- icdev/tools/dashboard/api/oscal.py +183 -0
- icdev/tools/dashboard/api/prod_audit.py +183 -0
- icdev/tools/dashboard/api/projects.py +191 -0
- icdev/tools/dashboard/api/proposals.py +1084 -0
- icdev/tools/dashboard/api/traces.py +363 -0
- icdev/tools/dashboard/api/usage.py +234 -0
- icdev/tools/dashboard/app.py +1986 -0
- icdev/tools/dashboard/auth.py +500 -0
- icdev/tools/dashboard/byok.py +245 -0
- icdev/tools/dashboard/chat_manager.py +675 -0
- icdev/tools/dashboard/config.py +116 -0
- icdev/tools/dashboard/diagram_definitions.py +642 -0
- icdev/tools/dashboard/nlq_processor.py +323 -0
- icdev/tools/dashboard/phase_loader.py +136 -0
- icdev/tools/dashboard/sse_manager.py +89 -0
- icdev/tools/dashboard/state_tracker.py +267 -0
- icdev/tools/dashboard/static/css/style.css +706 -0
- icdev/tools/dashboard/static/css/ux.css +2047 -0
- icdev/tools/dashboard/static/js/activity.js +322 -0
- icdev/tools/dashboard/static/js/api.js +161 -0
- icdev/tools/dashboard/static/js/batch.js +814 -0
- icdev/tools/dashboard/static/js/charts.js +618 -0
- icdev/tools/dashboard/static/js/chat.js +1514 -0
- icdev/tools/dashboard/static/js/kanban.js +113 -0
- icdev/tools/dashboard/static/js/live.js +569 -0
- icdev/tools/dashboard/static/js/mermaid-icdev.js +332 -0
- icdev/tools/dashboard/static/js/proposals.js +588 -0
- icdev/tools/dashboard/static/js/shortcuts.js +544 -0
- icdev/tools/dashboard/static/js/tables.js +652 -0
- icdev/tools/dashboard/static/js/tour.js +524 -0
- icdev/tools/dashboard/static/js/ux.js +942 -0
- icdev/tools/dashboard/templates/404.html +10 -0
- icdev/tools/dashboard/templates/activity.html +80 -0
- icdev/tools/dashboard/templates/admin/users.html +144 -0
- icdev/tools/dashboard/templates/ai_accountability.html +235 -0
- icdev/tools/dashboard/templates/ai_transparency.html +263 -0
- icdev/tools/dashboard/templates/base.html +104 -0
- icdev/tools/dashboard/templates/batch.html +23 -0
- icdev/tools/dashboard/templates/chat.html +332 -0
- icdev/tools/dashboard/templates/children.html +149 -0
- icdev/tools/dashboard/templates/cicd.html +253 -0
- icdev/tools/dashboard/templates/code_quality.html +214 -0
- icdev/tools/dashboard/templates/cpmp/cor_detail.html +220 -0
- icdev/tools/dashboard/templates/cpmp/cor_portal.html +91 -0
- icdev/tools/dashboard/templates/cpmp/deliverable_detail.html +197 -0
- icdev/tools/dashboard/templates/cpmp/detail.html +578 -0
- icdev/tools/dashboard/templates/cpmp/portfolio.html +202 -0
- icdev/tools/dashboard/templates/dev_profiles.html +304 -0
- icdev/tools/dashboard/templates/diagrams.html +224 -0
- icdev/tools/dashboard/templates/events/timeline.html +232 -0
- icdev/tools/dashboard/templates/evidence.html +134 -0
- icdev/tools/dashboard/templates/fedramp_20x.html +207 -0
- icdev/tools/dashboard/templates/gateway.html +244 -0
- icdev/tools/dashboard/templates/govcon/capabilities.html +135 -0
- icdev/tools/dashboard/templates/govcon/pipeline.html +214 -0
- icdev/tools/dashboard/templates/govcon/requirements.html +120 -0
- icdev/tools/dashboard/templates/index.html +254 -0
- icdev/tools/dashboard/templates/lineage.html +141 -0
- icdev/tools/dashboard/templates/login.html +51 -0
- icdev/tools/dashboard/templates/monitoring/overview.html +193 -0
- icdev/tools/dashboard/templates/orchestration/dashboard.html +545 -0
- icdev/tools/dashboard/templates/oscal.html +263 -0
- icdev/tools/dashboard/templates/phases.html +150 -0
- icdev/tools/dashboard/templates/prod_audit.html +280 -0
- icdev/tools/dashboard/templates/profile.html +183 -0
- icdev/tools/dashboard/templates/projects/detail.html +583 -0
- icdev/tools/dashboard/templates/projects/list.html +47 -0
- icdev/tools/dashboard/templates/proposals/detail.html +1253 -0
- icdev/tools/dashboard/templates/proposals/list.html +179 -0
- icdev/tools/dashboard/templates/proposals/section_detail.html +193 -0
- icdev/tools/dashboard/templates/provenance.html +181 -0
- icdev/tools/dashboard/templates/query/nlq.html +234 -0
- icdev/tools/dashboard/templates/quick_paths.html +69 -0
- icdev/tools/dashboard/templates/traces.html +155 -0
- icdev/tools/dashboard/templates/translation_detail.html +199 -0
- icdev/tools/dashboard/templates/translations.html +162 -0
- icdev/tools/dashboard/templates/usage.html +225 -0
- icdev/tools/dashboard/templates/wizard.html +539 -0
- icdev/tools/dashboard/templates/xai.html +208 -0
- icdev/tools/dashboard/ux_helpers.py +962 -0
- icdev/tools/dashboard/websocket.py +81 -0
- icdev/tools/db/__init__.py +1 -0
- icdev/tools/db/backup.py +312 -0
- icdev/tools/db/backup_manager.py +832 -0
- icdev/tools/db/init_icdev_db.py +5900 -0
- icdev/tools/db/migrate.py +178 -0
- icdev/tools/db/migration_runner.py +549 -0
- icdev/tools/db/migrations/001_baseline/meta.json +9 -0
- icdev/tools/db/migrations/001_baseline/up.py +68 -0
- icdev/tools/db/migrations/002_memory_enhancements/down.sql +8 -0
- icdev/tools/db/migrations/002_memory_enhancements/meta.json +9 -0
- icdev/tools/db/migrations/002_memory_enhancements/up.py +118 -0
- icdev/tools/db/migrations/003_dev_profiles/meta.json +8 -0
- icdev/tools/db/migrations/003_dev_profiles/up.py +93 -0
- icdev/tools/db/migrations/004_innovation_engine/down.py +19 -0
- icdev/tools/db/migrations/004_innovation_engine/up.py +227 -0
- icdev/tools/db/migrations/005_phase_37_ai_security/down.py +19 -0
- icdev/tools/db/migrations/005_phase_37_ai_security/up.py +258 -0
- icdev/tools/db/migrations/006_phase_36_evolution/down.py +21 -0
- icdev/tools/db/migrations/006_phase_36_evolution/up.py +323 -0
- icdev/tools/db/migrations/007_phase_38_cloud/down.py +14 -0
- icdev/tools/db/migrations/007_phase_38_cloud/up.py +110 -0
- icdev/tools/db/migrations/008_phase36_37_integration/up.py +55 -0
- icdev/tools/db/migrations/__init__.py +2 -0
- icdev/tools/devsecops/__init__.py +2 -0
- icdev/tools/devsecops/attestation_manager.py +458 -0
- icdev/tools/devsecops/network_segmentation_generator.py +614 -0
- icdev/tools/devsecops/pdp_config_generator.py +1256 -0
- icdev/tools/devsecops/pipeline_security_generator.py +484 -0
- icdev/tools/devsecops/policy_generator.py +653 -0
- icdev/tools/devsecops/profile_manager.py +388 -0
- icdev/tools/devsecops/service_mesh_generator.py +1073 -0
- icdev/tools/devsecops/zta_maturity_scorer.py +368 -0
- icdev/tools/devsecops/zta_terraform_generator.py +1303 -0
- icdev/tools/dx/__init__.py +3 -0
- icdev/tools/dx/companion.py +266 -0
- icdev/tools/dx/instruction_generator.py +753 -0
- icdev/tools/dx/mcp_config_generator.py +282 -0
- icdev/tools/dx/skill_translator.py +425 -0
- icdev/tools/dx/tool_detector.py +144 -0
- icdev/tools/extensions/__init__.py +21 -0
- icdev/tools/extensions/builtins/010_ai_governance_chat.py +277 -0
- icdev/tools/extensions/builtins/__init__.py +2 -0
- icdev/tools/extensions/extension_manager.py +455 -0
- icdev/tools/infra/__init__.py +1 -0
- icdev/tools/infra/ansible_generator.py +869 -0
- icdev/tools/infra/dockerfile_generator.py +361 -0
- icdev/tools/infra/infra_status.py +393 -0
- icdev/tools/infra/ironbank_metadata_generator.py +411 -0
- icdev/tools/infra/k8s_generator.py +1002 -0
- icdev/tools/infra/pipeline_generator.py +832 -0
- icdev/tools/infra/rollback.py +400 -0
- icdev/tools/infra/terraform_generator.py +1142 -0
- icdev/tools/infra/terraform_generator_azure.py +1254 -0
- icdev/tools/infra/terraform_generator_gcp.py +953 -0
- icdev/tools/infra/terraform_generator_ibm.py +360 -0
- icdev/tools/infra/terraform_generator_oci.py +919 -0
- icdev/tools/infra/terraform_generator_onprem.py +319 -0
- icdev/tools/innovation/__init__.py +8 -0
- icdev/tools/innovation/competitive_intel.py +492 -0
- icdev/tools/innovation/innovation_manager.py +681 -0
- icdev/tools/innovation/introspective_analyzer.py +774 -0
- icdev/tools/innovation/register_external_patterns.py +440 -0
- icdev/tools/innovation/signal_ranker.py +1038 -0
- icdev/tools/innovation/solution_generator.py +697 -0
- icdev/tools/innovation/standards_monitor.py +466 -0
- icdev/tools/innovation/trend_detector.py +1046 -0
- icdev/tools/innovation/triage_engine.py +1149 -0
- icdev/tools/innovation/web_scanner.py +894 -0
- icdev/tools/installer/__init__.py +1 -0
- icdev/tools/installer/compliance_configurator.py +637 -0
- icdev/tools/installer/installer.py +1711 -0
- icdev/tools/installer/module_registry.py +805 -0
- icdev/tools/installer/platform_setup.py +961 -0
- icdev/tools/integration/__init__.py +2 -0
- icdev/tools/integration/approval_manager.py +561 -0
- icdev/tools/integration/doors_exporter.py +627 -0
- icdev/tools/integration/gitlab_connector.py +784 -0
- icdev/tools/integration/jira_connector.py +774 -0
- icdev/tools/integration/servicenow_connector.py +693 -0
- icdev/tools/knowledge/__init__.py +1 -0
- icdev/tools/knowledge/knowledge_ingest.py +293 -0
- icdev/tools/knowledge/pattern_detector.py +693 -0
- icdev/tools/knowledge/recommendation_engine.py +461 -0
- icdev/tools/knowledge/self_heal_analyzer.py +504 -0
- icdev/tools/llm/__init__.py +72 -0
- icdev/tools/llm/anthropic_provider.py +170 -0
- icdev/tools/llm/azure_openai_provider.py +338 -0
- icdev/tools/llm/bedrock_provider.py +315 -0
- icdev/tools/llm/embedding_provider.py +438 -0
- icdev/tools/llm/gemini_provider.py +381 -0
- icdev/tools/llm/ibm_watsonx_provider.py +232 -0
- icdev/tools/llm/oci_genai_provider.py +462 -0
- icdev/tools/llm/ollama_provider.py +340 -0
- icdev/tools/llm/openai_provider.py +225 -0
- icdev/tools/llm/provider.py +355 -0
- icdev/tools/llm/provider_sdk.py +175 -0
- icdev/tools/llm/router.py +780 -0
- icdev/tools/llm/vertex_ai_provider.py +374 -0
- icdev/tools/maintenance/__init__.py +2 -0
- icdev/tools/maintenance/dependency_scanner.py +1030 -0
- icdev/tools/maintenance/maintenance_auditor.py +815 -0
- icdev/tools/maintenance/remediation_engine.py +966 -0
- icdev/tools/maintenance/vulnerability_checker.py +987 -0
- icdev/tools/mbse/__init__.py +3 -0
- icdev/tools/mbse/des_assessor.py +1186 -0
- icdev/tools/mbse/des_report_generator.py +800 -0
- icdev/tools/mbse/diagram_extractor.py +811 -0
- icdev/tools/mbse/digital_thread.py +1665 -0
- icdev/tools/mbse/model_code_generator.py +1122 -0
- icdev/tools/mbse/model_control_mapper.py +420 -0
- icdev/tools/mbse/pi_model_tracker.py +1093 -0
- icdev/tools/mbse/reqif_parser.py +1483 -0
- icdev/tools/mbse/sync_engine.py +1805 -0
- icdev/tools/mbse/xmi_parser.py +1573 -0
- icdev/tools/mcp/__init__.py +1 -0
- icdev/tools/mcp/base_server.py +535 -0
- icdev/tools/mcp/builder_server.py +725 -0
- icdev/tools/mcp/compliance_server.py +1407 -0
- icdev/tools/mcp/context_indexer.py +199 -0
- icdev/tools/mcp/context_server.py +305 -0
- icdev/tools/mcp/core_server.py +679 -0
- icdev/tools/mcp/devsecops_server.py +432 -0
- icdev/tools/mcp/gap_handlers.py +1079 -0
- icdev/tools/mcp/gateway_server.py +339 -0
- icdev/tools/mcp/generate_registry.py +623 -0
- icdev/tools/mcp/infra_server.py +264 -0
- icdev/tools/mcp/innovation_server.py +316 -0
- icdev/tools/mcp/integration_server.py +527 -0
- icdev/tools/mcp/knowledge_server.py +429 -0
- icdev/tools/mcp/maintenance_server.py +248 -0
- icdev/tools/mcp/marketplace_server.py +499 -0
- icdev/tools/mcp/mbse_server.py +398 -0
- icdev/tools/mcp/modernization_server.py +496 -0
- icdev/tools/mcp/observability_server.py +354 -0
- icdev/tools/mcp/requirements_server.py +415 -0
- icdev/tools/mcp/simulation_server.py +468 -0
- icdev/tools/mcp/standalone/__init__.py +2 -0
- icdev/tools/mcp/standalone/builder.py +59 -0
- icdev/tools/mcp/standalone/compliance.py +59 -0
- icdev/tools/mcp/standalone/core.py +59 -0
- icdev/tools/mcp/standalone/knowledge.py +59 -0
- icdev/tools/mcp/standalone/maintenance.py +59 -0
- icdev/tools/mcp/supply_chain_server.py +476 -0
- icdev/tools/mcp/tool_registry.py +2008 -0
- icdev/tools/mcp/unified_server.py +158 -0
- icdev/tools/memory/__init__.py +2 -0
- icdev/tools/memory/auto_capture.py +347 -0
- icdev/tools/memory/embed_memory.py +158 -0
- icdev/tools/memory/history_compressor.py +334 -0
- icdev/tools/memory/hybrid_search.py +236 -0
- icdev/tools/memory/maintenance_cron.py +289 -0
- icdev/tools/memory/memory_consolidation.py +444 -0
- icdev/tools/memory/memory_db.py +133 -0
- icdev/tools/memory/memory_read.py +102 -0
- icdev/tools/memory/memory_write.py +222 -0
- icdev/tools/memory/semantic_search.py +139 -0
- icdev/tools/memory/time_decay.py +435 -0
- icdev/tools/modernization/__init__.py +3 -0
- icdev/tools/modernization/architecture_extractor.py +734 -0
- icdev/tools/modernization/compliance_bridge.py +1499 -0
- icdev/tools/modernization/db_migration_planner.py +1385 -0
- icdev/tools/modernization/doc_generator.py +1428 -0
- icdev/tools/modernization/framework_migrator.py +1525 -0
- icdev/tools/modernization/legacy_analyzer.py +1948 -0
- icdev/tools/modernization/migration_code_generator.py +1639 -0
- icdev/tools/modernization/migration_report_generator.py +1653 -0
- icdev/tools/modernization/migration_tracker.py +1726 -0
- icdev/tools/modernization/monolith_decomposer.py +1508 -0
- icdev/tools/modernization/seven_r_assessor.py +1658 -0
- icdev/tools/modernization/strangler_fig_manager.py +1705 -0
- icdev/tools/modernization/ui_analyzer.py +771 -0
- icdev/tools/modernization/version_migrator.py +1392 -0
- icdev/tools/monitor/__init__.py +1 -0
- icdev/tools/monitor/alert_correlator.py +495 -0
- icdev/tools/monitor/auto_resolver.py +612 -0
- icdev/tools/monitor/health_checker.py +509 -0
- icdev/tools/monitor/heartbeat_daemon.py +792 -0
- icdev/tools/monitor/log_analyzer.py +516 -0
- icdev/tools/monitor/metric_collector.py +496 -0
- icdev/tools/mosa/__init__.py +10 -0
- icdev/tools/mosa/icd_generator.py +370 -0
- icdev/tools/mosa/modular_design_analyzer.py +683 -0
- icdev/tools/mosa/mosa_code_enforcer.py +349 -0
- icdev/tools/mosa/tsp_generator.py +265 -0
- icdev/tools/observability/__init__.py +100 -0
- icdev/tools/observability/genai_attributes.py +88 -0
- icdev/tools/observability/instrumentation.py +140 -0
- icdev/tools/observability/mlflow_exporter.py +194 -0
- icdev/tools/observability/otel_tracer.py +168 -0
- icdev/tools/observability/provenance/__init__.py +3 -0
- icdev/tools/observability/provenance/prov_recorder.py +324 -0
- icdev/tools/observability/shap/__init__.py +3 -0
- icdev/tools/observability/shap/agent_shap.py +275 -0
- icdev/tools/observability/sqlite_tracer.py +361 -0
- icdev/tools/observability/trace_context.py +205 -0
- icdev/tools/observability/tracer.py +230 -0
- icdev/tools/orchestration/__init__.py +2 -0
- icdev/tools/orchestration/workflow_composer.py +361 -0
- icdev/tools/project/__init__.py +1 -0
- icdev/tools/project/manifest_loader.py +418 -0
- icdev/tools/project/project_create.py +350 -0
- icdev/tools/project/project_list.py +174 -0
- icdev/tools/project/project_scaffold.py +1715 -0
- icdev/tools/project/project_status.py +479 -0
- icdev/tools/project/session_context_builder.py +757 -0
- icdev/tools/project/validate_manifest.py +55 -0
- icdev/tools/registry/__init__.py +10 -0
- icdev/tools/registry/absorption_engine.py +832 -0
- icdev/tools/registry/capability_evaluator.py +668 -0
- icdev/tools/registry/child_registry.py +617 -0
- icdev/tools/registry/cross_pollinator.py +1065 -0
- icdev/tools/registry/genome_manager.py +671 -0
- icdev/tools/registry/learning_collector.py +912 -0
- icdev/tools/registry/propagation_manager.py +942 -0
- icdev/tools/registry/staging_manager.py +742 -0
- icdev/tools/registry/telemetry_collector.py +423 -0
- icdev/tools/requirements/__init__.py +1 -0
- icdev/tools/requirements/ai_governance_scorer.py +208 -0
- icdev/tools/requirements/boundary_analyzer.py +1293 -0
- icdev/tools/requirements/clarification_engine.py +618 -0
- icdev/tools/requirements/complexity_scorer.py +387 -0
- icdev/tools/requirements/consistency_analyzer.py +803 -0
- icdev/tools/requirements/constitution_manager.py +605 -0
- icdev/tools/requirements/decomposition_engine.py +778 -0
- icdev/tools/requirements/document_extractor.py +1016 -0
- icdev/tools/requirements/elicitation_techniques.py +519 -0
- icdev/tools/requirements/gap_detector.py +271 -0
- icdev/tools/requirements/intake_engine.py +2188 -0
- icdev/tools/requirements/prd_generator.py +847 -0
- icdev/tools/requirements/prd_validator.py +595 -0
- icdev/tools/requirements/readiness_scorer.py +313 -0
- icdev/tools/requirements/spec_organizer.py +1029 -0
- icdev/tools/requirements/spec_quality_checker.py +1097 -0
- icdev/tools/requirements/traceability_builder.py +579 -0
- icdev/tools/resilience/__init__.py +34 -0
- icdev/tools/resilience/circuit_breaker.py +340 -0
- icdev/tools/resilience/correlation.py +150 -0
- icdev/tools/resilience/errors.py +81 -0
- icdev/tools/resilience/retry.py +95 -0
- icdev/tools/schemas/__init__.py +27 -0
- icdev/tools/schemas/chat.py +61 -0
- icdev/tools/schemas/compliance.py +56 -0
- icdev/tools/schemas/core.py +85 -0
- icdev/tools/schemas/innovation.py +37 -0
- icdev/tools/schemas/validation.py +109 -0
- icdev/tools/sdk/__init__.py +3 -0
- icdev/tools/sdk/icdev_client.py +218 -0
- icdev/tools/security/__init__.py +1 -0
- icdev/tools/security/agent_output_validator.py +330 -0
- icdev/tools/security/agent_trust_scorer.py +466 -0
- icdev/tools/security/ai_bom_generator.py +725 -0
- icdev/tools/security/ai_telemetry_logger.py +469 -0
- icdev/tools/security/atlas_red_team.py +543 -0
- icdev/tools/security/code_pattern_scanner.py +378 -0
- icdev/tools/security/confabulation_detector.py +271 -0
- icdev/tools/security/container_scanner.py +491 -0
- icdev/tools/security/dependency_auditor.py +944 -0
- icdev/tools/security/endpoint_security_scanner.py +579 -0
- icdev/tools/security/mcp_tool_authorizer.py +243 -0
- icdev/tools/security/prompt_injection_detector.py +737 -0
- icdev/tools/security/sast_runner.py +948 -0
- icdev/tools/security/secret_detector.py +378 -0
- icdev/tools/security/tool_chain_validator.py +357 -0
- icdev/tools/security/vuln_scanner.py +539 -0
- icdev/tools/simulation/__init__.py +2 -0
- icdev/tools/simulation/coa_generator.py +1552 -0
- icdev/tools/simulation/monte_carlo.py +758 -0
- icdev/tools/simulation/scenario_manager.py +1073 -0
- icdev/tools/simulation/simulation_engine.py +1104 -0
- icdev/tools/supply_chain/__init__.py +2 -0
- icdev/tools/supply_chain/cve_triager.py +705 -0
- icdev/tools/supply_chain/dependency_graph.py +645 -0
- icdev/tools/supply_chain/isa_manager.py +540 -0
- icdev/tools/supply_chain/scrm_assessor.py +546 -0
- icdev/tools/testing/__init__.py +2 -0
- icdev/tools/testing/acceptance_validator.py +411 -0
- icdev/tools/testing/claude_dir_validator.py +831 -0
- icdev/tools/testing/data_types.py +199 -0
- icdev/tools/testing/e2e_runner.py +715 -0
- icdev/tools/testing/fuzz_cli.py +306 -0
- icdev/tools/testing/health_check.py +483 -0
- icdev/tools/testing/platform_check.py +143 -0
- icdev/tools/testing/production_audit.py +1862 -0
- icdev/tools/testing/production_remediate.py +804 -0
- icdev/tools/testing/screenshot_validator.py +539 -0
- icdev/tools/testing/smoke_test.py +283 -0
- icdev/tools/testing/test_agent_models.py +117 -0
- icdev/tools/testing/test_orchestrator.py +957 -0
- icdev/tools/testing/utils.py +229 -0
- icdev/tools/translation/__init__.py +17 -0
- icdev/tools/translation/code_translator.py +550 -0
- icdev/tools/translation/dependency_mapper.py +277 -0
- icdev/tools/translation/feature_map.py +395 -0
- icdev/tools/translation/project_assembler.py +439 -0
- icdev/tools/translation/source_extractor.py +609 -0
- icdev/tools/translation/test_translator.py +333 -0
- icdev/tools/translation/translation_manager.py +582 -0
- icdev/tools/translation/translation_validator.py +662 -0
- icdev/tools/translation/type_checker.py +371 -0
- icdev-1.0.0.dist-info/METADATA +868 -0
- icdev-1.0.0.dist-info/RECORD +1105 -0
- icdev-1.0.0.dist-info/WHEEL +5 -0
- icdev-1.0.0.dist-info/entry_points.txt +9 -0
- icdev-1.0.0.dist-info/licenses/LICENSE +254 -0
- icdev-1.0.0.dist-info/licenses/NOTICE +268 -0
- icdev-1.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,1491 @@
|
|
|
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
|
+
"""CMMC Level 2/3 assessment engine for ICDEV.
|
|
8
|
+
|
|
9
|
+
Loads CMMC practices from cmmc_practices.json, performs automated domain checks,
|
|
10
|
+
inherits NIST 800-53/800-171 implementations via the crosswalk engine, stores
|
|
11
|
+
results in the cmmc_assessments table, computes per-domain and overall scores,
|
|
12
|
+
evaluates CMMC gates, and logs audit events.
|
|
13
|
+
|
|
14
|
+
Usage:
|
|
15
|
+
python tools/compliance/cmmc_assessor.py --project-id proj-123 --level 2
|
|
16
|
+
python tools/compliance/cmmc_assessor.py --project-id proj-123 --level 3 \\
|
|
17
|
+
--project-dir /path/to/project --gate
|
|
18
|
+
python tools/compliance/cmmc_assessor.py --project-id proj-123 --level 2 \\
|
|
19
|
+
--domain AC --json
|
|
20
|
+
|
|
21
|
+
Databases:
|
|
22
|
+
- data/icdev.db: cmmc_assessments, project_controls, audit_trail
|
|
23
|
+
|
|
24
|
+
See also:
|
|
25
|
+
- tools/compliance/crosswalk_engine.py (inherit NIST implementations)
|
|
26
|
+
- tools/compliance/classification_manager.py (CUI markings)
|
|
27
|
+
- tools/compliance/cmmc_report_generator.py (report generation)
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
import argparse
|
|
31
|
+
import json
|
|
32
|
+
import os
|
|
33
|
+
import re
|
|
34
|
+
import sqlite3
|
|
35
|
+
import sys
|
|
36
|
+
from datetime import datetime, timezone
|
|
37
|
+
from pathlib import Path
|
|
38
|
+
from icdev._paths import get_project_root
|
|
39
|
+
|
|
40
|
+
BASE_DIR = get_project_root()
|
|
41
|
+
DB_PATH = BASE_DIR / "data" / "icdev.db"
|
|
42
|
+
CMMC_PRACTICES_PATH = BASE_DIR / "context" / "compliance" / "cmmc_practices.json"
|
|
43
|
+
|
|
44
|
+
# CMMC domain codes and names
|
|
45
|
+
CMMC_DOMAINS = [
|
|
46
|
+
("AC", "Access Control"),
|
|
47
|
+
("AT", "Awareness & Training"),
|
|
48
|
+
("AU", "Audit & Accountability"),
|
|
49
|
+
("CM", "Configuration Management"),
|
|
50
|
+
("IA", "Identification & Authentication"),
|
|
51
|
+
("IR", "Incident Response"),
|
|
52
|
+
("MA", "Maintenance"),
|
|
53
|
+
("MP", "Media Protection"),
|
|
54
|
+
("PE", "Physical Protection"),
|
|
55
|
+
("PS", "Personnel Security"),
|
|
56
|
+
("RA", "Risk Assessment"),
|
|
57
|
+
("CA", "Security Assessment"),
|
|
58
|
+
("SC", "System & Communications Protection"),
|
|
59
|
+
("SI", "System & Information Integrity"),
|
|
60
|
+
]
|
|
61
|
+
|
|
62
|
+
DOMAIN_CODE_TO_NAME = {code: name for code, name in CMMC_DOMAINS}
|
|
63
|
+
DOMAIN_NAME_TO_CODE = {name: code for code, name in CMMC_DOMAINS}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
# -----------------------------------------------------------------
|
|
67
|
+
# Database helpers
|
|
68
|
+
# -----------------------------------------------------------------
|
|
69
|
+
|
|
70
|
+
def _get_connection(db_path=None):
|
|
71
|
+
"""Get a database connection with Row factory."""
|
|
72
|
+
path = db_path or DB_PATH
|
|
73
|
+
if not path.exists():
|
|
74
|
+
raise FileNotFoundError(
|
|
75
|
+
f"Database not found: {path}\n"
|
|
76
|
+
"Run: python tools/db/init_icdev_db.py"
|
|
77
|
+
)
|
|
78
|
+
conn = sqlite3.connect(str(path))
|
|
79
|
+
conn.row_factory = sqlite3.Row
|
|
80
|
+
return conn
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _get_project(conn, project_id):
|
|
84
|
+
"""Load project data from the projects table."""
|
|
85
|
+
row = conn.execute(
|
|
86
|
+
"SELECT * FROM projects WHERE id = ?", (project_id,)
|
|
87
|
+
).fetchone()
|
|
88
|
+
if not row:
|
|
89
|
+
raise ValueError(f"Project '{project_id}' not found.")
|
|
90
|
+
return dict(row)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _log_audit_event(conn, project_id, action, details, file_path=None):
|
|
94
|
+
"""Log an audit trail event (append-only, NIST AU compliant)."""
|
|
95
|
+
try:
|
|
96
|
+
conn.execute(
|
|
97
|
+
"""INSERT INTO audit_trail
|
|
98
|
+
(project_id, event_type, actor, action, details,
|
|
99
|
+
affected_files, classification)
|
|
100
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)""",
|
|
101
|
+
(
|
|
102
|
+
project_id,
|
|
103
|
+
"cmmc_assessed",
|
|
104
|
+
"icdev-compliance-engine",
|
|
105
|
+
action,
|
|
106
|
+
json.dumps(details),
|
|
107
|
+
json.dumps([str(file_path)] if file_path else []),
|
|
108
|
+
"CUI",
|
|
109
|
+
),
|
|
110
|
+
)
|
|
111
|
+
conn.commit()
|
|
112
|
+
except Exception as e:
|
|
113
|
+
print(f"Warning: Could not log audit event: {e}", file=sys.stderr)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
# -----------------------------------------------------------------
|
|
117
|
+
# CUI config helper
|
|
118
|
+
# -----------------------------------------------------------------
|
|
119
|
+
|
|
120
|
+
def _load_cui_config():
|
|
121
|
+
"""Load CUI marking configuration."""
|
|
122
|
+
try:
|
|
123
|
+
sys.path.insert(0, str(BASE_DIR / "tools" / "compliance"))
|
|
124
|
+
from cui_marker import load_cui_config
|
|
125
|
+
return load_cui_config()
|
|
126
|
+
except ImportError:
|
|
127
|
+
return {
|
|
128
|
+
"document_header": (
|
|
129
|
+
"////////////////////////////////////////////////////////////////////\n"
|
|
130
|
+
"CONTROLLED UNCLASSIFIED INFORMATION (CUI) // SP-CTI\n"
|
|
131
|
+
"Distribution: Distribution D -- Authorized DoD Personnel Only\n"
|
|
132
|
+
"////////////////////////////////////////////////////////////////////"
|
|
133
|
+
),
|
|
134
|
+
"document_footer": (
|
|
135
|
+
"////////////////////////////////////////////////////////////////////\n"
|
|
136
|
+
"CUI // SP-CTI | Department of Defense\n"
|
|
137
|
+
"////////////////////////////////////////////////////////////////////"
|
|
138
|
+
),
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
# -----------------------------------------------------------------
|
|
143
|
+
# CMMC catalog loader
|
|
144
|
+
# -----------------------------------------------------------------
|
|
145
|
+
|
|
146
|
+
def load_cmmc_practices(level=2):
|
|
147
|
+
"""Load CMMC practice catalog for Level 2 or 3.
|
|
148
|
+
|
|
149
|
+
Args:
|
|
150
|
+
level: CMMC level (2 or 3).
|
|
151
|
+
|
|
152
|
+
Returns:
|
|
153
|
+
dict with metadata, domains, and filtered practices list.
|
|
154
|
+
"""
|
|
155
|
+
if not CMMC_PRACTICES_PATH.exists():
|
|
156
|
+
print(
|
|
157
|
+
f"Warning: CMMC practices catalog not found: {CMMC_PRACTICES_PATH}",
|
|
158
|
+
file=sys.stderr,
|
|
159
|
+
)
|
|
160
|
+
return {"metadata": {}, "domains": [], "practices": []}
|
|
161
|
+
|
|
162
|
+
with open(CMMC_PRACTICES_PATH, "r", encoding="utf-8") as f:
|
|
163
|
+
data = json.load(f)
|
|
164
|
+
|
|
165
|
+
practices = data.get("practices", [])
|
|
166
|
+
# Level 2 includes only level-2 practices
|
|
167
|
+
# Level 3 includes level-2 AND level-3 practices
|
|
168
|
+
filtered = [p for p in practices if p.get("level", 2) <= level]
|
|
169
|
+
|
|
170
|
+
return {
|
|
171
|
+
"metadata": data.get("metadata", {}),
|
|
172
|
+
"domains": data.get("domains", []),
|
|
173
|
+
"practices": filtered,
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
# -----------------------------------------------------------------
|
|
178
|
+
# Crosswalk inheritance helper
|
|
179
|
+
# -----------------------------------------------------------------
|
|
180
|
+
|
|
181
|
+
def _inherit_nist_implementations(project_id, practices, db_path=None):
|
|
182
|
+
"""Use the crosswalk engine to inherit NIST 800-53/800-171 implementations.
|
|
183
|
+
|
|
184
|
+
For each CMMC practice that maps to NIST 800-53 controls, checks if those
|
|
185
|
+
controls are already implemented in the project_controls table. If all
|
|
186
|
+
mapped controls are implemented, the practice is considered inherited.
|
|
187
|
+
|
|
188
|
+
Args:
|
|
189
|
+
project_id: The project identifier.
|
|
190
|
+
practices: List of CMMC practice dicts from the catalog.
|
|
191
|
+
db_path: Optional database path override.
|
|
192
|
+
|
|
193
|
+
Returns:
|
|
194
|
+
dict mapping practice_id -> {"inherited": bool, "controls_implemented": [...],
|
|
195
|
+
"controls_missing": [...]}
|
|
196
|
+
"""
|
|
197
|
+
conn = _get_connection(db_path)
|
|
198
|
+
try:
|
|
199
|
+
rows = conn.execute(
|
|
200
|
+
"""SELECT control_id, implementation_status
|
|
201
|
+
FROM project_controls
|
|
202
|
+
WHERE project_id = ?""",
|
|
203
|
+
(project_id,),
|
|
204
|
+
).fetchall()
|
|
205
|
+
|
|
206
|
+
implemented_ids = set()
|
|
207
|
+
for row in rows:
|
|
208
|
+
if row["implementation_status"] in ("implemented", "partially_implemented"):
|
|
209
|
+
implemented_ids.add(row["control_id"].upper())
|
|
210
|
+
|
|
211
|
+
inheritance = {}
|
|
212
|
+
for practice in practices:
|
|
213
|
+
pid = practice["id"]
|
|
214
|
+
nist_controls = practice.get("nist_800_53_controls", [])
|
|
215
|
+
|
|
216
|
+
if not nist_controls:
|
|
217
|
+
inheritance[pid] = {
|
|
218
|
+
"inherited": False,
|
|
219
|
+
"controls_implemented": [],
|
|
220
|
+
"controls_missing": [],
|
|
221
|
+
}
|
|
222
|
+
continue
|
|
223
|
+
|
|
224
|
+
controls_impl = [c for c in nist_controls if c.upper() in implemented_ids]
|
|
225
|
+
controls_miss = [c for c in nist_controls if c.upper() not in implemented_ids]
|
|
226
|
+
|
|
227
|
+
inheritance[pid] = {
|
|
228
|
+
"inherited": len(controls_miss) == 0 and len(controls_impl) > 0,
|
|
229
|
+
"controls_implemented": controls_impl,
|
|
230
|
+
"controls_missing": controls_miss,
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return inheritance
|
|
234
|
+
except Exception:
|
|
235
|
+
# If project_controls table doesn't exist or other error, return empty
|
|
236
|
+
return {}
|
|
237
|
+
finally:
|
|
238
|
+
conn.close()
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
# -----------------------------------------------------------------
|
|
242
|
+
# Auto-check helper: walk project files matching extensions
|
|
243
|
+
# -----------------------------------------------------------------
|
|
244
|
+
|
|
245
|
+
def _scan_files(project_dir, extensions, patterns, threshold=1):
|
|
246
|
+
"""Scan project files for regex patterns.
|
|
247
|
+
|
|
248
|
+
Args:
|
|
249
|
+
project_dir: Root directory to walk.
|
|
250
|
+
extensions: Tuple of file extensions to include.
|
|
251
|
+
patterns: List of regex patterns to search for.
|
|
252
|
+
threshold: Minimum number of files with matches to consider satisfied.
|
|
253
|
+
|
|
254
|
+
Returns:
|
|
255
|
+
Tuple of (matched_files, total_scanned).
|
|
256
|
+
"""
|
|
257
|
+
matched_files = []
|
|
258
|
+
total_scanned = 0
|
|
259
|
+
for root, _, files in os.walk(project_dir):
|
|
260
|
+
for fname in files:
|
|
261
|
+
if not fname.endswith(extensions):
|
|
262
|
+
continue
|
|
263
|
+
fpath = os.path.join(root, fname)
|
|
264
|
+
total_scanned += 1
|
|
265
|
+
try:
|
|
266
|
+
with open(fpath, "r", encoding="utf-8", errors="ignore") as f:
|
|
267
|
+
content = f.read()
|
|
268
|
+
for pattern in patterns:
|
|
269
|
+
if re.search(pattern, content, re.IGNORECASE):
|
|
270
|
+
matched_files.append(fpath)
|
|
271
|
+
break
|
|
272
|
+
except Exception:
|
|
273
|
+
continue
|
|
274
|
+
return matched_files, total_scanned
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def _dir_or_file_exists(project_dir, dir_names=None, glob_patterns=None):
|
|
278
|
+
"""Check if specific directories or file globs exist under project_dir."""
|
|
279
|
+
found = []
|
|
280
|
+
project_path = Path(project_dir)
|
|
281
|
+
|
|
282
|
+
if dir_names:
|
|
283
|
+
for dname in dir_names:
|
|
284
|
+
candidate = project_path / dname
|
|
285
|
+
if candidate.is_dir():
|
|
286
|
+
found.append(str(candidate))
|
|
287
|
+
for child in project_path.rglob(dname):
|
|
288
|
+
if child.is_dir() and str(child) not in found:
|
|
289
|
+
found.append(str(child))
|
|
290
|
+
|
|
291
|
+
if glob_patterns:
|
|
292
|
+
for gp in glob_patterns:
|
|
293
|
+
for match in project_path.rglob(gp):
|
|
294
|
+
if str(match) not in found:
|
|
295
|
+
found.append(str(match))
|
|
296
|
+
|
|
297
|
+
return found
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
# -----------------------------------------------------------------
|
|
301
|
+
# Auto-check functions (14 -- one per CMMC domain)
|
|
302
|
+
# Each returns:
|
|
303
|
+
# {"status": "met"|"not_met"|"partially_met"|"not_applicable",
|
|
304
|
+
# "evidence": "description",
|
|
305
|
+
# "details": "specifics"}
|
|
306
|
+
# -----------------------------------------------------------------
|
|
307
|
+
|
|
308
|
+
def _check_ac_domain(project_dir):
|
|
309
|
+
"""Access Control: RBAC, least privilege, session mgmt, remote access, wireless."""
|
|
310
|
+
patterns = [
|
|
311
|
+
r"@login_required|@permission_required|@requires_auth",
|
|
312
|
+
r"@Secured|@PreAuthorize|@RolesAllowed",
|
|
313
|
+
r"role_required|check_permission|has_permission",
|
|
314
|
+
r"\bRBAC\b|role.based.access",
|
|
315
|
+
r"RoleBinding|ClusterRole|ClusterRoleBinding",
|
|
316
|
+
r"least.privilege|minimum.privilege",
|
|
317
|
+
r"session.timeout|session_expiry|SESSION_TIMEOUT",
|
|
318
|
+
r"remote.access|VPN|vpn_config",
|
|
319
|
+
]
|
|
320
|
+
extensions = (".py", ".yaml", ".yml", ".js", ".ts", ".java", ".go", ".rs")
|
|
321
|
+
matched, total = _scan_files(project_dir, extensions, patterns)
|
|
322
|
+
|
|
323
|
+
if total == 0:
|
|
324
|
+
return {
|
|
325
|
+
"status": "not_met",
|
|
326
|
+
"evidence": "No source files found to assess for access control.",
|
|
327
|
+
"details": "Project directory lacks applicable source files.",
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
if len(matched) >= 3:
|
|
331
|
+
return {
|
|
332
|
+
"status": "met",
|
|
333
|
+
"evidence": (
|
|
334
|
+
f"Access control patterns found in {len(matched)} file(s) "
|
|
335
|
+
f"including RBAC, session management, and privilege controls."
|
|
336
|
+
),
|
|
337
|
+
"details": "; ".join(os.path.basename(f) for f in matched[:5]),
|
|
338
|
+
}
|
|
339
|
+
elif matched:
|
|
340
|
+
return {
|
|
341
|
+
"status": "partially_met",
|
|
342
|
+
"evidence": (
|
|
343
|
+
f"Partial access control patterns found in {len(matched)} file(s). "
|
|
344
|
+
"Expecting RBAC, least privilege, session management, and remote access controls."
|
|
345
|
+
),
|
|
346
|
+
"details": "; ".join(os.path.basename(f) for f in matched[:5]),
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
return {
|
|
350
|
+
"status": "not_met",
|
|
351
|
+
"evidence": "No access control patterns detected.",
|
|
352
|
+
"details": (
|
|
353
|
+
"Expected: RBAC, @login_required, role_required, session management, "
|
|
354
|
+
"remote access controls, wireless access restrictions."
|
|
355
|
+
),
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
def _check_at_domain(project_dir):
|
|
360
|
+
"""Awareness & Training: security training docs, onboarding docs."""
|
|
361
|
+
found = _dir_or_file_exists(
|
|
362
|
+
project_dir,
|
|
363
|
+
glob_patterns=[
|
|
364
|
+
"SECURITY*.md", "security-training*", "security_training*",
|
|
365
|
+
"onboarding*", "training*", "awareness*",
|
|
366
|
+
"docs/security*", "docs/training*",
|
|
367
|
+
],
|
|
368
|
+
)
|
|
369
|
+
found_dirs = _dir_or_file_exists(
|
|
370
|
+
project_dir,
|
|
371
|
+
dir_names=["training", "onboarding", "security-awareness"],
|
|
372
|
+
)
|
|
373
|
+
all_found = list(set(found + found_dirs))
|
|
374
|
+
|
|
375
|
+
if all_found:
|
|
376
|
+
return {
|
|
377
|
+
"status": "met",
|
|
378
|
+
"evidence": (
|
|
379
|
+
f"Security awareness/training artifacts found: "
|
|
380
|
+
f"{len(all_found)} item(s)."
|
|
381
|
+
),
|
|
382
|
+
"details": "; ".join(os.path.basename(f) for f in all_found[:5]),
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
# Check for security policy references in code
|
|
386
|
+
patterns = [r"security.training|security.awareness|onboarding.security"]
|
|
387
|
+
extensions = (".md", ".txt", ".rst", ".yaml", ".yml")
|
|
388
|
+
matched, total = _scan_files(project_dir, extensions, patterns)
|
|
389
|
+
if matched:
|
|
390
|
+
return {
|
|
391
|
+
"status": "partially_met",
|
|
392
|
+
"evidence": f"Security training references in {len(matched)} file(s).",
|
|
393
|
+
"details": "; ".join(os.path.basename(f) for f in matched[:5]),
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
return {
|
|
397
|
+
"status": "not_met",
|
|
398
|
+
"evidence": "No security awareness or training documentation detected.",
|
|
399
|
+
"details": (
|
|
400
|
+
"Expected: SECURITY.md, training docs, onboarding procedures, "
|
|
401
|
+
"security awareness materials."
|
|
402
|
+
),
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
def _check_au_domain(project_dir):
|
|
407
|
+
"""Audit & Accountability: logging config, audit trail, log protection, timestamps."""
|
|
408
|
+
event_type_patterns = [
|
|
409
|
+
(r"login|auth.*log|authentication.*log", "authentication_logging"),
|
|
410
|
+
(r"access.*log|access_log|request.*log", "access_logging"),
|
|
411
|
+
(r"change.*log|change_log|modification.*log|update.*log", "change_logging"),
|
|
412
|
+
(r"error.*log|error_log|exception.*log", "error_logging"),
|
|
413
|
+
(r"security.*event|security.*log|security_event", "security_logging"),
|
|
414
|
+
(r"audit_trail|AuditTrail|audit\.log", "audit_trail"),
|
|
415
|
+
]
|
|
416
|
+
extensions = (".py", ".js", ".ts", ".java", ".yaml", ".yml", ".go", ".rs")
|
|
417
|
+
found_types = set()
|
|
418
|
+
evidence_files = []
|
|
419
|
+
|
|
420
|
+
for root, _, files in os.walk(project_dir):
|
|
421
|
+
for fname in files:
|
|
422
|
+
if not fname.endswith(extensions):
|
|
423
|
+
continue
|
|
424
|
+
fpath = os.path.join(root, fname)
|
|
425
|
+
try:
|
|
426
|
+
with open(fpath, "r", encoding="utf-8", errors="ignore") as f:
|
|
427
|
+
content = f.read()
|
|
428
|
+
for pattern, event_type in event_type_patterns:
|
|
429
|
+
if re.search(pattern, content, re.IGNORECASE):
|
|
430
|
+
found_types.add(event_type)
|
|
431
|
+
if fpath not in evidence_files:
|
|
432
|
+
evidence_files.append(fpath)
|
|
433
|
+
except Exception:
|
|
434
|
+
continue
|
|
435
|
+
|
|
436
|
+
# Also check for structured logging
|
|
437
|
+
struct_patterns = [r"logging\.getLogger|getLogger|structlog|log\.info|log\.warn"]
|
|
438
|
+
struct_matched, _ = _scan_files(project_dir, extensions, struct_patterns)
|
|
439
|
+
if struct_matched:
|
|
440
|
+
found_types.add("structured_logging")
|
|
441
|
+
|
|
442
|
+
count = len(found_types)
|
|
443
|
+
if count >= 4:
|
|
444
|
+
return {
|
|
445
|
+
"status": "met",
|
|
446
|
+
"evidence": (
|
|
447
|
+
f"Comprehensive audit logging: {count} distinct log types "
|
|
448
|
+
f"across {len(evidence_files)} file(s)."
|
|
449
|
+
),
|
|
450
|
+
"details": f"Types: {', '.join(sorted(found_types))}",
|
|
451
|
+
}
|
|
452
|
+
elif count >= 2:
|
|
453
|
+
return {
|
|
454
|
+
"status": "partially_met",
|
|
455
|
+
"evidence": (
|
|
456
|
+
f"Partial audit logging: {count} log type(s) found. "
|
|
457
|
+
"CMMC requires comprehensive logging with protection and timestamps."
|
|
458
|
+
),
|
|
459
|
+
"details": f"Types: {', '.join(sorted(found_types))}",
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
return {
|
|
463
|
+
"status": "not_met",
|
|
464
|
+
"evidence": "Insufficient audit logging detected.",
|
|
465
|
+
"details": (
|
|
466
|
+
"Expected: authentication, access, change, error, security "
|
|
467
|
+
"logging with timestamps and audit trail protection."
|
|
468
|
+
),
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
|
|
472
|
+
def _check_cm_domain(project_dir):
|
|
473
|
+
"""Configuration Management: baseline configs, change control, IaC, least functionality."""
|
|
474
|
+
found_configs = _dir_or_file_exists(
|
|
475
|
+
project_dir,
|
|
476
|
+
glob_patterns=[
|
|
477
|
+
"*.tf", "*.tfvars", "Dockerfile*", "docker-compose*",
|
|
478
|
+
"*.yaml", "*.yml", "ansible*", "playbook*",
|
|
479
|
+
".gitlab-ci.yml", ".github/workflows/*",
|
|
480
|
+
],
|
|
481
|
+
)
|
|
482
|
+
found_dirs = _dir_or_file_exists(
|
|
483
|
+
project_dir,
|
|
484
|
+
dir_names=["terraform", "ansible", "k8s", "kubernetes", "infra"],
|
|
485
|
+
)
|
|
486
|
+
|
|
487
|
+
# Check for version control and change control
|
|
488
|
+
patterns = [
|
|
489
|
+
r"baseline|configuration.management|config.baseline",
|
|
490
|
+
r"change.control|change.request|change.management",
|
|
491
|
+
r"least.functionality|minimal.install|hardened",
|
|
492
|
+
]
|
|
493
|
+
extensions = (".py", ".yaml", ".yml", ".md", ".tf", ".json")
|
|
494
|
+
matched, total = _scan_files(project_dir, extensions, patterns)
|
|
495
|
+
|
|
496
|
+
all_found = list(set(found_configs + found_dirs + matched))
|
|
497
|
+
|
|
498
|
+
if len(all_found) >= 5:
|
|
499
|
+
return {
|
|
500
|
+
"status": "met",
|
|
501
|
+
"evidence": (
|
|
502
|
+
f"Configuration management artifacts found: {len(all_found)} item(s) "
|
|
503
|
+
"including IaC, Dockerfiles, and config baselines."
|
|
504
|
+
),
|
|
505
|
+
"details": "; ".join(os.path.basename(f) for f in all_found[:5]),
|
|
506
|
+
}
|
|
507
|
+
elif all_found:
|
|
508
|
+
return {
|
|
509
|
+
"status": "partially_met",
|
|
510
|
+
"evidence": (
|
|
511
|
+
f"Partial configuration management: {len(all_found)} artifact(s). "
|
|
512
|
+
"Missing some of: IaC, change control, baseline configs, least functionality."
|
|
513
|
+
),
|
|
514
|
+
"details": "; ".join(os.path.basename(f) for f in all_found[:5]),
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
return {
|
|
518
|
+
"status": "not_met",
|
|
519
|
+
"evidence": "No configuration management artifacts detected.",
|
|
520
|
+
"details": (
|
|
521
|
+
"Expected: Terraform/Ansible files, Dockerfiles, baseline configs, "
|
|
522
|
+
"change control documentation, least functionality enforcement."
|
|
523
|
+
),
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
|
|
527
|
+
def _check_ia_domain(project_dir):
|
|
528
|
+
"""Identification & Authentication: MFA, password policy, authenticator mgmt, PKI/CAC."""
|
|
529
|
+
patterns = [
|
|
530
|
+
r"\bMFA\b|multi.factor|MultiFactor|2FA|TOTP|FIDO",
|
|
531
|
+
r"password.policy|password.complexity|min.password",
|
|
532
|
+
r"\bPKI\b|pki_cert|certificate.auth|CAC",
|
|
533
|
+
r"authenticator|authentication.mechanism",
|
|
534
|
+
r"password.*expir|credential.*rotat|key.*rotation",
|
|
535
|
+
]
|
|
536
|
+
extensions = (".py", ".yaml", ".yml", ".js", ".ts", ".java", ".conf")
|
|
537
|
+
matched, total = _scan_files(project_dir, extensions, patterns)
|
|
538
|
+
|
|
539
|
+
if total == 0:
|
|
540
|
+
return {
|
|
541
|
+
"status": "not_met",
|
|
542
|
+
"evidence": "No source files found to assess for identification & authentication.",
|
|
543
|
+
"details": "Project directory lacks applicable files.",
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
if len(matched) >= 3:
|
|
547
|
+
return {
|
|
548
|
+
"status": "met",
|
|
549
|
+
"evidence": (
|
|
550
|
+
f"Identification & authentication patterns found in "
|
|
551
|
+
f"{len(matched)} file(s) including MFA, password policy, and PKI."
|
|
552
|
+
),
|
|
553
|
+
"details": "; ".join(os.path.basename(f) for f in matched[:5]),
|
|
554
|
+
}
|
|
555
|
+
elif matched:
|
|
556
|
+
return {
|
|
557
|
+
"status": "partially_met",
|
|
558
|
+
"evidence": (
|
|
559
|
+
f"Partial I&A patterns in {len(matched)} file(s). "
|
|
560
|
+
"Expecting MFA, password policy, authenticator management, and PKI/CAC."
|
|
561
|
+
),
|
|
562
|
+
"details": "; ".join(os.path.basename(f) for f in matched[:5]),
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
return {
|
|
566
|
+
"status": "not_met",
|
|
567
|
+
"evidence": "No identification & authentication patterns detected.",
|
|
568
|
+
"details": (
|
|
569
|
+
"Expected: MFA/2FA, password complexity policy, PKI/CAC support, "
|
|
570
|
+
"authenticator management, credential rotation."
|
|
571
|
+
),
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
|
|
575
|
+
def _check_ir_domain(project_dir):
|
|
576
|
+
"""Incident Response: IR plan, IR testing, reporting procedures."""
|
|
577
|
+
found = _dir_or_file_exists(
|
|
578
|
+
project_dir,
|
|
579
|
+
glob_patterns=[
|
|
580
|
+
"incident-response*", "incident_response*", "ir-plan*", "ir_plan*",
|
|
581
|
+
"docs/incident*", "security/incident*",
|
|
582
|
+
],
|
|
583
|
+
)
|
|
584
|
+
found_dirs = _dir_or_file_exists(
|
|
585
|
+
project_dir,
|
|
586
|
+
dir_names=["incident-response", "incident_response", "ir"],
|
|
587
|
+
)
|
|
588
|
+
|
|
589
|
+
patterns = [
|
|
590
|
+
r"incident.response|incident.handling|ir.plan|ir.procedure",
|
|
591
|
+
r"incident.report|incident.detection|incident.containment",
|
|
592
|
+
]
|
|
593
|
+
extensions = (".md", ".txt", ".yaml", ".yml", ".py", ".json")
|
|
594
|
+
matched, total = _scan_files(project_dir, extensions, patterns)
|
|
595
|
+
|
|
596
|
+
all_found = list(set(found + found_dirs + matched))
|
|
597
|
+
if len(all_found) >= 2:
|
|
598
|
+
return {
|
|
599
|
+
"status": "met",
|
|
600
|
+
"evidence": (
|
|
601
|
+
f"Incident response artifacts found: {len(all_found)} item(s)."
|
|
602
|
+
),
|
|
603
|
+
"details": "; ".join(os.path.basename(f) for f in all_found[:5]),
|
|
604
|
+
}
|
|
605
|
+
elif all_found:
|
|
606
|
+
return {
|
|
607
|
+
"status": "partially_met",
|
|
608
|
+
"evidence": (
|
|
609
|
+
f"Partial incident response: {len(all_found)} artifact(s). "
|
|
610
|
+
"Need IR plan, testing evidence, and reporting procedures."
|
|
611
|
+
),
|
|
612
|
+
"details": "; ".join(os.path.basename(f) for f in all_found[:5]),
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
return {
|
|
616
|
+
"status": "not_met",
|
|
617
|
+
"evidence": "No incident response artifacts detected.",
|
|
618
|
+
"details": (
|
|
619
|
+
"Expected: IR plan documents, IR testing records, "
|
|
620
|
+
"incident reporting procedures, containment/recovery docs."
|
|
621
|
+
),
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
|
|
625
|
+
def _check_ma_domain(project_dir):
|
|
626
|
+
"""Maintenance: maintenance procedures, non-local maintenance controls."""
|
|
627
|
+
found = _dir_or_file_exists(
|
|
628
|
+
project_dir,
|
|
629
|
+
glob_patterns=[
|
|
630
|
+
"maintenance*", "MAINTENANCE*", "docs/maintenance*",
|
|
631
|
+
"runbook*", "playbook*", "ops/*",
|
|
632
|
+
],
|
|
633
|
+
)
|
|
634
|
+
patterns = [
|
|
635
|
+
r"maintenance.procedure|maintenance.policy|maintenance.window",
|
|
636
|
+
r"non.local.maintenance|remote.maintenance",
|
|
637
|
+
r"patch.management|update.procedure",
|
|
638
|
+
]
|
|
639
|
+
extensions = (".md", ".txt", ".yaml", ".yml", ".json")
|
|
640
|
+
matched, total = _scan_files(project_dir, extensions, patterns)
|
|
641
|
+
|
|
642
|
+
all_found = list(set(found + matched))
|
|
643
|
+
if all_found:
|
|
644
|
+
return {
|
|
645
|
+
"status": "met",
|
|
646
|
+
"evidence": (
|
|
647
|
+
f"Maintenance procedure artifacts found: {len(all_found)} item(s)."
|
|
648
|
+
),
|
|
649
|
+
"details": "; ".join(os.path.basename(f) for f in all_found[:5]),
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
return {
|
|
653
|
+
"status": "not_met",
|
|
654
|
+
"evidence": "No maintenance procedure documentation detected.",
|
|
655
|
+
"details": (
|
|
656
|
+
"Expected: maintenance procedures, non-local maintenance controls, "
|
|
657
|
+
"patch management docs, runbooks."
|
|
658
|
+
),
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
|
|
662
|
+
def _check_mp_domain(project_dir):
|
|
663
|
+
"""Media Protection: media access, marking, storage, transport, sanitization."""
|
|
664
|
+
patterns = [
|
|
665
|
+
r"media.protection|media.sanitization|media.disposal",
|
|
666
|
+
r"encryption.at.rest|encrypt_at_rest|storage_encrypted",
|
|
667
|
+
r"\bKMS\b|kms_key|aws_kms|key_management",
|
|
668
|
+
r"CUI.*mark|classification.*mark|media.*marking",
|
|
669
|
+
r"data.at.rest|data.in.transit|data.protection",
|
|
670
|
+
]
|
|
671
|
+
extensions = (".py", ".yaml", ".yml", ".tf", ".json", ".md", ".conf")
|
|
672
|
+
matched, total = _scan_files(project_dir, extensions, patterns)
|
|
673
|
+
|
|
674
|
+
if total == 0:
|
|
675
|
+
return {
|
|
676
|
+
"status": "not_met",
|
|
677
|
+
"evidence": "No files found to assess media protection.",
|
|
678
|
+
"details": "Project directory lacks applicable files.",
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
if len(matched) >= 2:
|
|
682
|
+
return {
|
|
683
|
+
"status": "met",
|
|
684
|
+
"evidence": (
|
|
685
|
+
f"Media protection patterns found in {len(matched)} file(s) "
|
|
686
|
+
"including encryption, KMS, and marking controls."
|
|
687
|
+
),
|
|
688
|
+
"details": "; ".join(os.path.basename(f) for f in matched[:5]),
|
|
689
|
+
}
|
|
690
|
+
elif matched:
|
|
691
|
+
return {
|
|
692
|
+
"status": "partially_met",
|
|
693
|
+
"evidence": (
|
|
694
|
+
f"Partial media protection in {len(matched)} file(s). "
|
|
695
|
+
"Need encryption-at-rest, CUI marking, transport encryption."
|
|
696
|
+
),
|
|
697
|
+
"details": "; ".join(os.path.basename(f) for f in matched[:5]),
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
return {
|
|
701
|
+
"status": "not_met",
|
|
702
|
+
"evidence": "No media protection patterns detected.",
|
|
703
|
+
"details": (
|
|
704
|
+
"Expected: encryption-at-rest, KMS, media marking, "
|
|
705
|
+
"data protection, sanitization procedures."
|
|
706
|
+
),
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
|
|
710
|
+
def _check_pe_domain(project_dir):
|
|
711
|
+
"""Physical Protection: physical access, visitor logs, monitoring."""
|
|
712
|
+
patterns = [
|
|
713
|
+
r"physical.access|physical.security|physical.protection",
|
|
714
|
+
r"visitor.log|visitor.control|badge|access.card",
|
|
715
|
+
r"surveillance|CCTV|physical.monitoring",
|
|
716
|
+
]
|
|
717
|
+
extensions = (".md", ".txt", ".yaml", ".yml", ".json")
|
|
718
|
+
matched, total = _scan_files(project_dir, extensions, patterns)
|
|
719
|
+
|
|
720
|
+
found = _dir_or_file_exists(
|
|
721
|
+
project_dir,
|
|
722
|
+
glob_patterns=[
|
|
723
|
+
"physical-security*", "physical_security*",
|
|
724
|
+
"docs/physical*", "security/physical*",
|
|
725
|
+
],
|
|
726
|
+
)
|
|
727
|
+
all_found = list(set(matched + found))
|
|
728
|
+
|
|
729
|
+
if all_found:
|
|
730
|
+
return {
|
|
731
|
+
"status": "met",
|
|
732
|
+
"evidence": (
|
|
733
|
+
f"Physical protection documentation found: {len(all_found)} item(s)."
|
|
734
|
+
),
|
|
735
|
+
"details": "; ".join(os.path.basename(f) for f in all_found[:5]),
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
# Physical security is often documented outside the codebase
|
|
739
|
+
return {
|
|
740
|
+
"status": "not_applicable",
|
|
741
|
+
"evidence": (
|
|
742
|
+
"Physical security controls are typically managed outside the "
|
|
743
|
+
"software codebase (facility management, physical access systems)."
|
|
744
|
+
),
|
|
745
|
+
"details": "Manual verification of physical protection controls recommended.",
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
|
|
749
|
+
def _check_ps_domain(project_dir):
|
|
750
|
+
"""Personnel Security: screening, termination procedures."""
|
|
751
|
+
patterns = [
|
|
752
|
+
r"personnel.security|background.check|screening",
|
|
753
|
+
r"termination.procedure|offboarding|access.revocation",
|
|
754
|
+
r"personnel.action|separation.procedure",
|
|
755
|
+
]
|
|
756
|
+
extensions = (".md", ".txt", ".yaml", ".yml", ".json")
|
|
757
|
+
matched, total = _scan_files(project_dir, extensions, patterns)
|
|
758
|
+
|
|
759
|
+
found = _dir_or_file_exists(
|
|
760
|
+
project_dir,
|
|
761
|
+
glob_patterns=[
|
|
762
|
+
"personnel-security*", "personnel_security*",
|
|
763
|
+
"hr-security*", "docs/personnel*",
|
|
764
|
+
],
|
|
765
|
+
)
|
|
766
|
+
all_found = list(set(matched + found))
|
|
767
|
+
|
|
768
|
+
if all_found:
|
|
769
|
+
return {
|
|
770
|
+
"status": "met",
|
|
771
|
+
"evidence": (
|
|
772
|
+
f"Personnel security documentation found: {len(all_found)} item(s)."
|
|
773
|
+
),
|
|
774
|
+
"details": "; ".join(os.path.basename(f) for f in all_found[:5]),
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
return {
|
|
778
|
+
"status": "not_applicable",
|
|
779
|
+
"evidence": (
|
|
780
|
+
"Personnel security controls are typically managed outside "
|
|
781
|
+
"the software codebase (HR processes, background check systems)."
|
|
782
|
+
),
|
|
783
|
+
"details": "Manual verification of personnel security procedures recommended.",
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
|
|
787
|
+
def _check_ra_domain(project_dir):
|
|
788
|
+
"""Risk Assessment: risk assessment, vulnerability scanning."""
|
|
789
|
+
found = _dir_or_file_exists(
|
|
790
|
+
project_dir,
|
|
791
|
+
glob_patterns=[
|
|
792
|
+
"risk-assessment*", "risk_assessment*", "threat-model*",
|
|
793
|
+
"threat_model*", "vulnerability-scan*", "vuln-report*",
|
|
794
|
+
".snyk", ".safety", "audit-report*", "pip-audit-report*",
|
|
795
|
+
],
|
|
796
|
+
)
|
|
797
|
+
found_dirs = _dir_or_file_exists(
|
|
798
|
+
project_dir,
|
|
799
|
+
dir_names=["risk-assessment", "threat-model", "vulnerability-scans"],
|
|
800
|
+
)
|
|
801
|
+
patterns = [
|
|
802
|
+
r"risk.assessment|risk.analysis|risk.register",
|
|
803
|
+
r"vulnerability.scan|vuln.scan|security.scan",
|
|
804
|
+
r"threat.model|STRIDE|PASTA|attack.tree",
|
|
805
|
+
]
|
|
806
|
+
extensions = (".md", ".txt", ".yaml", ".yml", ".json", ".py")
|
|
807
|
+
matched, total = _scan_files(project_dir, extensions, patterns)
|
|
808
|
+
|
|
809
|
+
all_found = list(set(found + found_dirs + matched))
|
|
810
|
+
if len(all_found) >= 2:
|
|
811
|
+
return {
|
|
812
|
+
"status": "met",
|
|
813
|
+
"evidence": (
|
|
814
|
+
f"Risk assessment artifacts found: {len(all_found)} item(s) "
|
|
815
|
+
"including risk analysis, vulnerability scanning, and/or threat modeling."
|
|
816
|
+
),
|
|
817
|
+
"details": "; ".join(os.path.basename(f) for f in all_found[:5]),
|
|
818
|
+
}
|
|
819
|
+
elif all_found:
|
|
820
|
+
return {
|
|
821
|
+
"status": "partially_met",
|
|
822
|
+
"evidence": (
|
|
823
|
+
f"Partial risk assessment: {len(all_found)} artifact(s). "
|
|
824
|
+
"Need both risk assessment and vulnerability scanning."
|
|
825
|
+
),
|
|
826
|
+
"details": "; ".join(os.path.basename(f) for f in all_found[:5]),
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
return {
|
|
830
|
+
"status": "not_met",
|
|
831
|
+
"evidence": "No risk assessment or vulnerability scanning artifacts detected.",
|
|
832
|
+
"details": (
|
|
833
|
+
"Expected: risk assessment documents, vulnerability scan reports, "
|
|
834
|
+
"threat model artifacts."
|
|
835
|
+
),
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
|
|
839
|
+
def _check_ca_domain(project_dir):
|
|
840
|
+
"""Security Assessment: security assessments, system connections, monitoring."""
|
|
841
|
+
found = _dir_or_file_exists(
|
|
842
|
+
project_dir,
|
|
843
|
+
glob_patterns=[
|
|
844
|
+
"security-assessment*", "security_assessment*",
|
|
845
|
+
"compliance/*", "ato/*", "authorization*",
|
|
846
|
+
"system-connection*", "interconnection*",
|
|
847
|
+
],
|
|
848
|
+
)
|
|
849
|
+
patterns = [
|
|
850
|
+
r"security.assessment|security.evaluation|compliance.assessment",
|
|
851
|
+
r"plan.of.action|POA.M|POAM|poam",
|
|
852
|
+
r"system.connection|interconnection.agreement|ISA|MOU",
|
|
853
|
+
r"continuous.monitoring|conmon|ongoing.assessment",
|
|
854
|
+
]
|
|
855
|
+
extensions = (".md", ".txt", ".yaml", ".yml", ".json")
|
|
856
|
+
matched, total = _scan_files(project_dir, extensions, patterns)
|
|
857
|
+
|
|
858
|
+
all_found = list(set(found + matched))
|
|
859
|
+
if len(all_found) >= 2:
|
|
860
|
+
return {
|
|
861
|
+
"status": "met",
|
|
862
|
+
"evidence": (
|
|
863
|
+
f"Security assessment artifacts found: {len(all_found)} item(s) "
|
|
864
|
+
"including assessments, POA&M, and/or continuous monitoring."
|
|
865
|
+
),
|
|
866
|
+
"details": "; ".join(os.path.basename(f) for f in all_found[:5]),
|
|
867
|
+
}
|
|
868
|
+
elif all_found:
|
|
869
|
+
return {
|
|
870
|
+
"status": "partially_met",
|
|
871
|
+
"evidence": (
|
|
872
|
+
f"Partial security assessment: {len(all_found)} artifact(s)."
|
|
873
|
+
),
|
|
874
|
+
"details": "; ".join(os.path.basename(f) for f in all_found[:5]),
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
return {
|
|
878
|
+
"status": "not_met",
|
|
879
|
+
"evidence": "No security assessment artifacts detected.",
|
|
880
|
+
"details": (
|
|
881
|
+
"Expected: security assessments, POA&M, system interconnection "
|
|
882
|
+
"agreements, continuous monitoring documentation."
|
|
883
|
+
),
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
|
|
887
|
+
def _check_sc_domain(project_dir):
|
|
888
|
+
"""System & Comms Protection: boundary protection, CUI encryption, crypto, network segmentation."""
|
|
889
|
+
patterns = [
|
|
890
|
+
r"TLS\s*1\.[23]|TLSv1_[23]|PROTOCOL_TLS",
|
|
891
|
+
r"\bHTTPS\b|https://|ssl_context|SSLContext",
|
|
892
|
+
r"mTLS|mutual.TLS|mutual_tls",
|
|
893
|
+
r"\bFIPS\b|fips_mode|FIPS.140",
|
|
894
|
+
r"AES.256|AES_256|aes256",
|
|
895
|
+
r"\bKMS\b|kms_key|aws_kms|key_management",
|
|
896
|
+
r"network.segmentation|network.boundary|firewall",
|
|
897
|
+
r"CUI.*encrypt|encrypt.*CUI|data.protection",
|
|
898
|
+
r"NetworkPolicy|security.group|ingress.rule",
|
|
899
|
+
]
|
|
900
|
+
extensions = (".py", ".yaml", ".yml", ".tf", ".json", ".conf", ".go", ".rs")
|
|
901
|
+
matched, total = _scan_files(project_dir, extensions, patterns)
|
|
902
|
+
|
|
903
|
+
if total == 0:
|
|
904
|
+
return {
|
|
905
|
+
"status": "not_met",
|
|
906
|
+
"evidence": "No files found to assess system & communications protection.",
|
|
907
|
+
"details": "Project directory lacks applicable files.",
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
if len(matched) >= 4:
|
|
911
|
+
return {
|
|
912
|
+
"status": "met",
|
|
913
|
+
"evidence": (
|
|
914
|
+
f"System & communications protection patterns found in "
|
|
915
|
+
f"{len(matched)} file(s) including TLS, encryption, "
|
|
916
|
+
"FIPS, and network controls."
|
|
917
|
+
),
|
|
918
|
+
"details": "; ".join(os.path.basename(f) for f in matched[:5]),
|
|
919
|
+
}
|
|
920
|
+
elif len(matched) >= 2:
|
|
921
|
+
return {
|
|
922
|
+
"status": "partially_met",
|
|
923
|
+
"evidence": (
|
|
924
|
+
f"Partial SC protection in {len(matched)} file(s). "
|
|
925
|
+
"Expecting TLS 1.2+, FIPS encryption, network segmentation, "
|
|
926
|
+
"and CUI data protection."
|
|
927
|
+
),
|
|
928
|
+
"details": "; ".join(os.path.basename(f) for f in matched[:5]),
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
return {
|
|
932
|
+
"status": "not_met",
|
|
933
|
+
"evidence": "Insufficient system & communications protection detected.",
|
|
934
|
+
"details": (
|
|
935
|
+
"Expected: TLS 1.2+, FIPS-validated encryption, AES-256, KMS, "
|
|
936
|
+
"network segmentation, boundary protection, CUI encryption."
|
|
937
|
+
),
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
|
|
941
|
+
def _check_si_domain(project_dir):
|
|
942
|
+
"""System & Info Integrity: flaw remediation, malicious code, monitoring, alerting."""
|
|
943
|
+
patterns = [
|
|
944
|
+
r"pip.audit|npm\s+audit|safety.*check|snyk|dependency.check",
|
|
945
|
+
r"bandit|semgrep|sonar|SAST|sast_runner",
|
|
946
|
+
r"\bantivirus\b|\bantimalware\b|malware.scan",
|
|
947
|
+
r"security.monitoring|intrusion.detect|IDS|IPS",
|
|
948
|
+
r"alert|notification|webhook.*security",
|
|
949
|
+
r"patch.management|flaw.remediation|vuln.fix",
|
|
950
|
+
]
|
|
951
|
+
extensions = (".py", ".yaml", ".yml", ".json", ".sh", ".conf")
|
|
952
|
+
matched, total = _scan_files(project_dir, extensions, patterns)
|
|
953
|
+
|
|
954
|
+
if total == 0:
|
|
955
|
+
return {
|
|
956
|
+
"status": "not_met",
|
|
957
|
+
"evidence": "No files found to assess system & information integrity.",
|
|
958
|
+
"details": "Project directory lacks applicable files.",
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
if len(matched) >= 3:
|
|
962
|
+
return {
|
|
963
|
+
"status": "met",
|
|
964
|
+
"evidence": (
|
|
965
|
+
f"System & information integrity patterns found in "
|
|
966
|
+
f"{len(matched)} file(s) including SAST, dependency auditing, "
|
|
967
|
+
"and security monitoring."
|
|
968
|
+
),
|
|
969
|
+
"details": "; ".join(os.path.basename(f) for f in matched[:5]),
|
|
970
|
+
}
|
|
971
|
+
elif matched:
|
|
972
|
+
return {
|
|
973
|
+
"status": "partially_met",
|
|
974
|
+
"evidence": (
|
|
975
|
+
f"Partial SI integrity in {len(matched)} file(s). "
|
|
976
|
+
"Expecting flaw remediation, malicious code protection, "
|
|
977
|
+
"monitoring, and alerting."
|
|
978
|
+
),
|
|
979
|
+
"details": "; ".join(os.path.basename(f) for f in matched[:5]),
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
return {
|
|
983
|
+
"status": "not_met",
|
|
984
|
+
"evidence": "No system & information integrity patterns detected.",
|
|
985
|
+
"details": (
|
|
986
|
+
"Expected: SAST, dependency auditing, malicious code protection, "
|
|
987
|
+
"security monitoring, alerting, flaw remediation processes."
|
|
988
|
+
),
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
|
|
992
|
+
# -----------------------------------------------------------------
|
|
993
|
+
# Domain-to-check mapping
|
|
994
|
+
# -----------------------------------------------------------------
|
|
995
|
+
|
|
996
|
+
DOMAIN_AUTO_CHECKS = {
|
|
997
|
+
"AC": _check_ac_domain,
|
|
998
|
+
"AT": _check_at_domain,
|
|
999
|
+
"AU": _check_au_domain,
|
|
1000
|
+
"CM": _check_cm_domain,
|
|
1001
|
+
"IA": _check_ia_domain,
|
|
1002
|
+
"IR": _check_ir_domain,
|
|
1003
|
+
"MA": _check_ma_domain,
|
|
1004
|
+
"MP": _check_mp_domain,
|
|
1005
|
+
"PE": _check_pe_domain,
|
|
1006
|
+
"PS": _check_ps_domain,
|
|
1007
|
+
"RA": _check_ra_domain,
|
|
1008
|
+
"CA": _check_ca_domain,
|
|
1009
|
+
"SC": _check_sc_domain,
|
|
1010
|
+
"SI": _check_si_domain,
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
|
|
1014
|
+
# -----------------------------------------------------------------
|
|
1015
|
+
# Core assessment function
|
|
1016
|
+
# -----------------------------------------------------------------
|
|
1017
|
+
|
|
1018
|
+
def run_cmmc_assessment(
|
|
1019
|
+
project_id,
|
|
1020
|
+
level=2,
|
|
1021
|
+
project_dir=None,
|
|
1022
|
+
gate=False,
|
|
1023
|
+
output_path=None,
|
|
1024
|
+
db_path=None,
|
|
1025
|
+
):
|
|
1026
|
+
"""Run CMMC Level 2/3 assessment for a project.
|
|
1027
|
+
|
|
1028
|
+
Args:
|
|
1029
|
+
project_id: The project identifier.
|
|
1030
|
+
level: CMMC level (2 or 3).
|
|
1031
|
+
project_dir: Project directory for automated file-based checks.
|
|
1032
|
+
gate: If True, evaluate the CMMC gate.
|
|
1033
|
+
output_path: Override output directory for the assessment report.
|
|
1034
|
+
db_path: Override database path.
|
|
1035
|
+
|
|
1036
|
+
Returns:
|
|
1037
|
+
Dict with domain_scores, overall_score, gate_status,
|
|
1038
|
+
practices_met/not_met/partial, and output file path.
|
|
1039
|
+
"""
|
|
1040
|
+
if level not in (2, 3):
|
|
1041
|
+
raise ValueError(f"Invalid CMMC level: {level}. Must be 2 or 3.")
|
|
1042
|
+
|
|
1043
|
+
conn = _get_connection(db_path)
|
|
1044
|
+
try:
|
|
1045
|
+
project = _get_project(conn, project_id)
|
|
1046
|
+
|
|
1047
|
+
# 1. Load CMMC practice catalog
|
|
1048
|
+
catalog = load_cmmc_practices(level)
|
|
1049
|
+
practices = catalog.get("practices", [])
|
|
1050
|
+
catalog.get("metadata", {})
|
|
1051
|
+
|
|
1052
|
+
if not practices:
|
|
1053
|
+
raise ValueError(
|
|
1054
|
+
"No CMMC practices loaded. Ensure "
|
|
1055
|
+
"context/compliance/cmmc_practices.json exists."
|
|
1056
|
+
)
|
|
1057
|
+
|
|
1058
|
+
# 2. Inherit NIST 800-53/800-171 implementations via crosswalk
|
|
1059
|
+
inheritance = _inherit_nist_implementations(
|
|
1060
|
+
project_id, practices, db_path=db_path
|
|
1061
|
+
)
|
|
1062
|
+
|
|
1063
|
+
# 3. Resolve project directory for auto-checks
|
|
1064
|
+
if project_dir and Path(project_dir).is_dir():
|
|
1065
|
+
can_auto_check = True
|
|
1066
|
+
elif (
|
|
1067
|
+
project.get("directory_path")
|
|
1068
|
+
and Path(project["directory_path"]).is_dir()
|
|
1069
|
+
):
|
|
1070
|
+
project_dir = project["directory_path"]
|
|
1071
|
+
can_auto_check = True
|
|
1072
|
+
else:
|
|
1073
|
+
can_auto_check = False
|
|
1074
|
+
|
|
1075
|
+
# 4. Run domain auto-checks
|
|
1076
|
+
domain_check_results = {}
|
|
1077
|
+
if can_auto_check:
|
|
1078
|
+
for domain_code, domain_name in CMMC_DOMAINS:
|
|
1079
|
+
if domain_code in DOMAIN_AUTO_CHECKS:
|
|
1080
|
+
try:
|
|
1081
|
+
domain_check_results[domain_code] = (
|
|
1082
|
+
DOMAIN_AUTO_CHECKS[domain_code](project_dir)
|
|
1083
|
+
)
|
|
1084
|
+
except Exception as e:
|
|
1085
|
+
domain_check_results[domain_code] = {
|
|
1086
|
+
"status": "not_met",
|
|
1087
|
+
"evidence": f"Auto-check error: {e}",
|
|
1088
|
+
"details": "Domain auto-check failed; manual review required.",
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
now = datetime.now(timezone.utc)
|
|
1092
|
+
results = []
|
|
1093
|
+
|
|
1094
|
+
# 5. Assess each practice
|
|
1095
|
+
for practice in practices:
|
|
1096
|
+
pid = practice["id"]
|
|
1097
|
+
domain_code = practice.get("domain_code", "")
|
|
1098
|
+
automation_level = practice.get("automation_level", "manual")
|
|
1099
|
+
status = "not_assessed"
|
|
1100
|
+
evidence = ""
|
|
1101
|
+
details = ""
|
|
1102
|
+
notes = ""
|
|
1103
|
+
|
|
1104
|
+
# Check if inherited from NIST implementation
|
|
1105
|
+
inh = inheritance.get(pid, {})
|
|
1106
|
+
if inh.get("inherited"):
|
|
1107
|
+
status = "met"
|
|
1108
|
+
evidence = (
|
|
1109
|
+
f"Inherited from NIST 800-53 implementation. "
|
|
1110
|
+
f"Controls implemented: {', '.join(inh['controls_implemented'])}."
|
|
1111
|
+
)
|
|
1112
|
+
details = "Practice satisfied via crosswalk inheritance."
|
|
1113
|
+
notes = "Verified via crosswalk engine."
|
|
1114
|
+
|
|
1115
|
+
elif automation_level == "auto" and can_auto_check:
|
|
1116
|
+
# Use domain-level auto-check result
|
|
1117
|
+
domain_result = domain_check_results.get(domain_code, {})
|
|
1118
|
+
if domain_result:
|
|
1119
|
+
status = domain_result.get("status", "not_assessed")
|
|
1120
|
+
evidence = domain_result.get("evidence", "")
|
|
1121
|
+
details = domain_result.get("details", "")
|
|
1122
|
+
notes = "Auto-checked via domain scan."
|
|
1123
|
+
else:
|
|
1124
|
+
status = "not_assessed"
|
|
1125
|
+
evidence = "No auto-check available for this domain."
|
|
1126
|
+
notes = "Manual review required."
|
|
1127
|
+
|
|
1128
|
+
elif automation_level == "semi" and can_auto_check:
|
|
1129
|
+
domain_result = domain_check_results.get(domain_code, {})
|
|
1130
|
+
if domain_result:
|
|
1131
|
+
status = domain_result.get("status", "not_assessed")
|
|
1132
|
+
evidence = domain_result.get("evidence", "")
|
|
1133
|
+
details = domain_result.get("details", "")
|
|
1134
|
+
notes = (
|
|
1135
|
+
"Semi-automated check. Manual review required to "
|
|
1136
|
+
"verify full compliance with this specific practice."
|
|
1137
|
+
)
|
|
1138
|
+
else:
|
|
1139
|
+
status = "not_assessed"
|
|
1140
|
+
evidence = "Semi-automated: no auto component available."
|
|
1141
|
+
notes = (
|
|
1142
|
+
f"Manual review required. Evidence needed: "
|
|
1143
|
+
f"{practice.get('evidence_required', 'See practice description.')}"
|
|
1144
|
+
)
|
|
1145
|
+
|
|
1146
|
+
elif automation_level in ("auto", "semi") and not can_auto_check:
|
|
1147
|
+
status = "not_assessed"
|
|
1148
|
+
evidence = "No project directory available for automated scanning."
|
|
1149
|
+
notes = "Provide --project-dir to enable auto-checks."
|
|
1150
|
+
|
|
1151
|
+
else:
|
|
1152
|
+
# Manual
|
|
1153
|
+
status = "not_assessed"
|
|
1154
|
+
evidence = "Manual assessment required."
|
|
1155
|
+
notes = (
|
|
1156
|
+
f"Evidence needed: "
|
|
1157
|
+
f"{practice.get('evidence_required', 'See practice description.')}"
|
|
1158
|
+
)
|
|
1159
|
+
|
|
1160
|
+
# Add partial credit if some NIST controls are implemented
|
|
1161
|
+
if status == "not_assessed" and inh.get("controls_implemented"):
|
|
1162
|
+
status = "partially_met"
|
|
1163
|
+
evidence = (
|
|
1164
|
+
f"Partial NIST 800-53 implementation. "
|
|
1165
|
+
f"Implemented: {', '.join(inh['controls_implemented'])}. "
|
|
1166
|
+
f"Missing: {', '.join(inh.get('controls_missing', []))}."
|
|
1167
|
+
)
|
|
1168
|
+
notes = "Complete remaining NIST control implementations."
|
|
1169
|
+
|
|
1170
|
+
result_entry = {
|
|
1171
|
+
"practice_id": pid,
|
|
1172
|
+
"domain": practice.get("domain", ""),
|
|
1173
|
+
"domain_code": domain_code,
|
|
1174
|
+
"level": practice.get("level", 2),
|
|
1175
|
+
"title": practice.get("title", ""),
|
|
1176
|
+
"description": practice.get("description", ""),
|
|
1177
|
+
"priority": practice.get("priority", "medium"),
|
|
1178
|
+
"automation_level": automation_level,
|
|
1179
|
+
"nist_800_53_controls": practice.get("nist_800_53_controls", []),
|
|
1180
|
+
"nist_800_171_id": practice.get("nist_800_171_id", ""),
|
|
1181
|
+
"status": status,
|
|
1182
|
+
"evidence": evidence,
|
|
1183
|
+
"details": details,
|
|
1184
|
+
"notes": notes,
|
|
1185
|
+
}
|
|
1186
|
+
results.append(result_entry)
|
|
1187
|
+
|
|
1188
|
+
# 6. Store in cmmc_assessments table
|
|
1189
|
+
try:
|
|
1190
|
+
conn.execute(
|
|
1191
|
+
"""INSERT OR REPLACE INTO cmmc_assessments
|
|
1192
|
+
(project_id, assessment_date, assessor, level,
|
|
1193
|
+
practice_id, domain, status, evidence_description,
|
|
1194
|
+
evidence_path, automation_result, nist_171_id,
|
|
1195
|
+
notes, updated_at)
|
|
1196
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
|
|
1197
|
+
(
|
|
1198
|
+
project_id,
|
|
1199
|
+
now.isoformat(),
|
|
1200
|
+
"icdev-compliance-engine",
|
|
1201
|
+
level,
|
|
1202
|
+
pid,
|
|
1203
|
+
practice.get("domain", ""),
|
|
1204
|
+
status,
|
|
1205
|
+
evidence,
|
|
1206
|
+
details if details else None,
|
|
1207
|
+
json.dumps({
|
|
1208
|
+
"automation_level": automation_level,
|
|
1209
|
+
"inherited": inh.get("inherited", False),
|
|
1210
|
+
}),
|
|
1211
|
+
practice.get("nist_800_171_id", ""),
|
|
1212
|
+
notes if notes else None,
|
|
1213
|
+
now.isoformat(),
|
|
1214
|
+
),
|
|
1215
|
+
)
|
|
1216
|
+
except Exception as e:
|
|
1217
|
+
print(
|
|
1218
|
+
f"Warning: Could not upsert assessment for {pid}: {e}",
|
|
1219
|
+
file=sys.stderr,
|
|
1220
|
+
)
|
|
1221
|
+
|
|
1222
|
+
conn.commit()
|
|
1223
|
+
|
|
1224
|
+
# 7. Compute per-domain and overall scores
|
|
1225
|
+
domain_scores = {}
|
|
1226
|
+
for domain_code, domain_name in CMMC_DOMAINS:
|
|
1227
|
+
domain_practices = [
|
|
1228
|
+
r for r in results if r["domain_code"] == domain_code
|
|
1229
|
+
]
|
|
1230
|
+
total = len(domain_practices)
|
|
1231
|
+
if total == 0:
|
|
1232
|
+
domain_scores[domain_code] = {
|
|
1233
|
+
"name": domain_name,
|
|
1234
|
+
"score": 0.0,
|
|
1235
|
+
"total": 0,
|
|
1236
|
+
"met": 0,
|
|
1237
|
+
"partially_met": 0,
|
|
1238
|
+
"not_met": 0,
|
|
1239
|
+
"not_assessed": 0,
|
|
1240
|
+
"not_applicable": 0,
|
|
1241
|
+
}
|
|
1242
|
+
continue
|
|
1243
|
+
|
|
1244
|
+
met = sum(1 for p in domain_practices if p["status"] == "met")
|
|
1245
|
+
partial = sum(1 for p in domain_practices if p["status"] == "partially_met")
|
|
1246
|
+
not_met = sum(1 for p in domain_practices if p["status"] == "not_met")
|
|
1247
|
+
na = sum(1 for p in domain_practices if p["status"] == "not_applicable")
|
|
1248
|
+
not_assessed = sum(1 for p in domain_practices if p["status"] == "not_assessed")
|
|
1249
|
+
|
|
1250
|
+
scoreable = total - na
|
|
1251
|
+
if scoreable > 0:
|
|
1252
|
+
score = 100.0 * (met + partial * 0.5) / scoreable
|
|
1253
|
+
else:
|
|
1254
|
+
score = 100.0 # All N/A
|
|
1255
|
+
|
|
1256
|
+
domain_scores[domain_code] = {
|
|
1257
|
+
"name": domain_name,
|
|
1258
|
+
"score": round(score, 1),
|
|
1259
|
+
"total": total,
|
|
1260
|
+
"met": met,
|
|
1261
|
+
"partially_met": partial,
|
|
1262
|
+
"not_met": not_met,
|
|
1263
|
+
"not_assessed": not_assessed,
|
|
1264
|
+
"not_applicable": na,
|
|
1265
|
+
}
|
|
1266
|
+
|
|
1267
|
+
# Overall: weighted average across 14 domains
|
|
1268
|
+
scoreable_domains = [
|
|
1269
|
+
s for s in domain_scores.values() if s["total"] > 0
|
|
1270
|
+
]
|
|
1271
|
+
if scoreable_domains:
|
|
1272
|
+
# Weight by number of practices
|
|
1273
|
+
total_practices = sum(s["total"] - s["not_applicable"] for s in scoreable_domains)
|
|
1274
|
+
if total_practices > 0:
|
|
1275
|
+
weighted_sum = sum(
|
|
1276
|
+
s["score"] * (s["total"] - s["not_applicable"])
|
|
1277
|
+
for s in scoreable_domains
|
|
1278
|
+
)
|
|
1279
|
+
overall_score = round(weighted_sum / total_practices, 1)
|
|
1280
|
+
else:
|
|
1281
|
+
overall_score = 100.0
|
|
1282
|
+
else:
|
|
1283
|
+
overall_score = 0.0
|
|
1284
|
+
|
|
1285
|
+
# Spill score: count of "not_met" practices
|
|
1286
|
+
spill_score = sum(1 for r in results if r["status"] == "not_met")
|
|
1287
|
+
|
|
1288
|
+
# 8. Gate evaluation
|
|
1289
|
+
# Level 2: 0 "not_met" critical practices
|
|
1290
|
+
# Level 3: same + additional 800-172 checks
|
|
1291
|
+
critical_not_met = []
|
|
1292
|
+
for r in results:
|
|
1293
|
+
if r["priority"] == "critical" and r["status"] == "not_met":
|
|
1294
|
+
critical_not_met.append(f"{r['practice_id']}: {r['title']}")
|
|
1295
|
+
|
|
1296
|
+
gate_passed = len(critical_not_met) == 0
|
|
1297
|
+
gate_result = {
|
|
1298
|
+
"evaluated": gate,
|
|
1299
|
+
"level": level,
|
|
1300
|
+
"passed": gate_passed,
|
|
1301
|
+
"critical_not_met": len(critical_not_met),
|
|
1302
|
+
"critical_failures": critical_not_met,
|
|
1303
|
+
"spill_score": spill_score,
|
|
1304
|
+
"reason": (
|
|
1305
|
+
f"PASS: 0 critical practices not_met for Level {level}"
|
|
1306
|
+
if gate_passed
|
|
1307
|
+
else (
|
|
1308
|
+
f"FAIL: {len(critical_not_met)} critical practice(s) not_met: "
|
|
1309
|
+
f"{', '.join(critical_not_met[:5])}"
|
|
1310
|
+
)
|
|
1311
|
+
),
|
|
1312
|
+
}
|
|
1313
|
+
|
|
1314
|
+
# Compute SPRS score estimate (DFARS 252.204-7019/7020)
|
|
1315
|
+
# SPRS = 110 - (5 * critical_not_met) - (3 * high_not_met) - (1 * other_not_met)
|
|
1316
|
+
high_not_met = sum(
|
|
1317
|
+
1 for r in results
|
|
1318
|
+
if r["priority"] == "high" and r["status"] == "not_met"
|
|
1319
|
+
)
|
|
1320
|
+
other_not_met = sum(
|
|
1321
|
+
1 for r in results
|
|
1322
|
+
if r["priority"] not in ("critical", "high") and r["status"] == "not_met"
|
|
1323
|
+
)
|
|
1324
|
+
sprs_score = max(
|
|
1325
|
+
-203,
|
|
1326
|
+
110 - (5 * len(critical_not_met)) - (3 * high_not_met) - (1 * other_not_met)
|
|
1327
|
+
)
|
|
1328
|
+
|
|
1329
|
+
# 9. Log audit event
|
|
1330
|
+
_log_audit_event(
|
|
1331
|
+
conn,
|
|
1332
|
+
project_id,
|
|
1333
|
+
f"CMMC Level {level} assessment completed",
|
|
1334
|
+
{
|
|
1335
|
+
"level": level,
|
|
1336
|
+
"practices_assessed": len(results),
|
|
1337
|
+
"overall_score": overall_score,
|
|
1338
|
+
"spill_score": spill_score,
|
|
1339
|
+
"sprs_score": sprs_score,
|
|
1340
|
+
"gate_result": gate_result,
|
|
1341
|
+
"domain_scores": {
|
|
1342
|
+
k: v["score"] for k, v in domain_scores.items()
|
|
1343
|
+
if v["total"] > 0
|
|
1344
|
+
},
|
|
1345
|
+
},
|
|
1346
|
+
)
|
|
1347
|
+
|
|
1348
|
+
# Summary counts
|
|
1349
|
+
total_met = sum(1 for r in results if r["status"] == "met")
|
|
1350
|
+
total_not_met = sum(1 for r in results if r["status"] == "not_met")
|
|
1351
|
+
total_partial = sum(1 for r in results if r["status"] == "partially_met")
|
|
1352
|
+
total_na = sum(1 for r in results if r["status"] == "not_applicable")
|
|
1353
|
+
total_not_assessed = sum(1 for r in results if r["status"] == "not_assessed")
|
|
1354
|
+
|
|
1355
|
+
# Console output
|
|
1356
|
+
print(f"CMMC Level {level} assessment completed:")
|
|
1357
|
+
print(f" Project: {project.get('name', project_id)}")
|
|
1358
|
+
print(f" Practices assessed: {len(results)}")
|
|
1359
|
+
print(f" Overall score: {overall_score}%")
|
|
1360
|
+
print(f" SPRS score estimate: {sprs_score}")
|
|
1361
|
+
for domain_code, domain_name in CMMC_DOMAINS:
|
|
1362
|
+
s = domain_scores.get(domain_code, {})
|
|
1363
|
+
if s.get("total", 0) == 0:
|
|
1364
|
+
continue
|
|
1365
|
+
print(
|
|
1366
|
+
f" {domain_code} ({domain_name}): "
|
|
1367
|
+
f"MET={s['met']} PARTIAL={s['partially_met']} "
|
|
1368
|
+
f"NOT_MET={s['not_met']} N/A={s['not_applicable']}"
|
|
1369
|
+
)
|
|
1370
|
+
|
|
1371
|
+
if gate:
|
|
1372
|
+
print(f"\n Gate: {gate_result['reason']}")
|
|
1373
|
+
|
|
1374
|
+
return {
|
|
1375
|
+
"project_id": project_id,
|
|
1376
|
+
"level": level,
|
|
1377
|
+
"practices_assessed": len(results),
|
|
1378
|
+
"overall_score": overall_score,
|
|
1379
|
+
"spill_score": spill_score,
|
|
1380
|
+
"sprs_score": sprs_score,
|
|
1381
|
+
"domain_scores": domain_scores,
|
|
1382
|
+
"gate_result": gate_result,
|
|
1383
|
+
"practices_met": total_met,
|
|
1384
|
+
"practices_not_met": total_not_met,
|
|
1385
|
+
"practices_partial": total_partial,
|
|
1386
|
+
"practices_na": total_na,
|
|
1387
|
+
"practices_not_assessed": total_not_assessed,
|
|
1388
|
+
"results": results,
|
|
1389
|
+
}
|
|
1390
|
+
|
|
1391
|
+
finally:
|
|
1392
|
+
conn.close()
|
|
1393
|
+
|
|
1394
|
+
|
|
1395
|
+
def assess_project(
|
|
1396
|
+
project_id,
|
|
1397
|
+
level=2,
|
|
1398
|
+
project_dir=None,
|
|
1399
|
+
gate=False,
|
|
1400
|
+
output_path=None,
|
|
1401
|
+
db_path=None,
|
|
1402
|
+
):
|
|
1403
|
+
"""Alias for run_cmmc_assessment (MCP compatibility)."""
|
|
1404
|
+
return run_cmmc_assessment(
|
|
1405
|
+
project_id,
|
|
1406
|
+
level=level,
|
|
1407
|
+
project_dir=project_dir,
|
|
1408
|
+
gate=gate,
|
|
1409
|
+
output_path=output_path,
|
|
1410
|
+
db_path=db_path,
|
|
1411
|
+
)
|
|
1412
|
+
|
|
1413
|
+
|
|
1414
|
+
# -----------------------------------------------------------------
|
|
1415
|
+
# CLI entrypoint
|
|
1416
|
+
# -----------------------------------------------------------------
|
|
1417
|
+
|
|
1418
|
+
if __name__ == "__main__":
|
|
1419
|
+
parser = argparse.ArgumentParser(
|
|
1420
|
+
description="Run CMMC Level 2/3 assessment"
|
|
1421
|
+
)
|
|
1422
|
+
parser.add_argument(
|
|
1423
|
+
"--project-id", required=True, help="Project ID"
|
|
1424
|
+
)
|
|
1425
|
+
parser.add_argument(
|
|
1426
|
+
"--level", type=int, default=2, choices=[2, 3],
|
|
1427
|
+
help="CMMC level (2 or 3, default: 2)",
|
|
1428
|
+
)
|
|
1429
|
+
parser.add_argument(
|
|
1430
|
+
"--domain",
|
|
1431
|
+
choices=[code for code, _ in CMMC_DOMAINS],
|
|
1432
|
+
help="Assess only a specific domain (default: all)",
|
|
1433
|
+
)
|
|
1434
|
+
parser.add_argument(
|
|
1435
|
+
"--project-dir",
|
|
1436
|
+
help="Project directory for automated file-based checks",
|
|
1437
|
+
)
|
|
1438
|
+
parser.add_argument(
|
|
1439
|
+
"--gate", action="store_true",
|
|
1440
|
+
help="Evaluate CMMC gate (0 critical not_met = pass)",
|
|
1441
|
+
)
|
|
1442
|
+
parser.add_argument(
|
|
1443
|
+
"--output-dir",
|
|
1444
|
+
help="Output directory for the assessment report",
|
|
1445
|
+
)
|
|
1446
|
+
parser.add_argument(
|
|
1447
|
+
"--db-path", type=Path, default=DB_PATH,
|
|
1448
|
+
help="Override database path",
|
|
1449
|
+
)
|
|
1450
|
+
parser.add_argument(
|
|
1451
|
+
"--json", action="store_true",
|
|
1452
|
+
help="Output results as JSON",
|
|
1453
|
+
)
|
|
1454
|
+
args = parser.parse_args()
|
|
1455
|
+
|
|
1456
|
+
try:
|
|
1457
|
+
result = run_cmmc_assessment(
|
|
1458
|
+
project_id=args.project_id,
|
|
1459
|
+
level=args.level,
|
|
1460
|
+
project_dir=args.project_dir,
|
|
1461
|
+
gate=args.gate,
|
|
1462
|
+
output_path=args.output_dir,
|
|
1463
|
+
db_path=args.db_path,
|
|
1464
|
+
)
|
|
1465
|
+
|
|
1466
|
+
if args.json:
|
|
1467
|
+
# Remove full results list for cleaner JSON output
|
|
1468
|
+
output = {
|
|
1469
|
+
k: v for k, v in result.items() if k != "results"
|
|
1470
|
+
}
|
|
1471
|
+
print(json.dumps(output, indent=2))
|
|
1472
|
+
else:
|
|
1473
|
+
print(
|
|
1474
|
+
json.dumps(
|
|
1475
|
+
{
|
|
1476
|
+
"overall_score": result.get("overall_score"),
|
|
1477
|
+
"sprs_score": result.get("sprs_score"),
|
|
1478
|
+
"gate_result": result.get("gate_result"),
|
|
1479
|
+
"practices_met": result.get("practices_met"),
|
|
1480
|
+
"practices_not_met": result.get("practices_not_met"),
|
|
1481
|
+
},
|
|
1482
|
+
indent=2,
|
|
1483
|
+
)
|
|
1484
|
+
)
|
|
1485
|
+
|
|
1486
|
+
if args.gate and not result["gate_result"]["passed"]:
|
|
1487
|
+
sys.exit(1)
|
|
1488
|
+
|
|
1489
|
+
except (FileNotFoundError, ValueError) as e:
|
|
1490
|
+
print(f"ERROR: {e}", file=sys.stderr)
|
|
1491
|
+
sys.exit(1)
|