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,1653 @@
|
|
|
1
|
+
# [TEMPLATE: CUI // SP-CTI]
|
|
2
|
+
#!/usr/bin/env python3
|
|
3
|
+
"""Migration Report Generator for ICDEV DoD Modernization.
|
|
4
|
+
|
|
5
|
+
Generates CUI-marked reports for migration assessments, progress tracking,
|
|
6
|
+
ATO impact analysis, and executive summaries. Reads legacy application data,
|
|
7
|
+
7R assessment scores, migration plans, tasks, and progress snapshots from
|
|
8
|
+
icdev.db and produces structured Markdown documents with CUI // SP-CTI
|
|
9
|
+
banners and Distribution D statements.
|
|
10
|
+
|
|
11
|
+
All generated reports include:
|
|
12
|
+
- CUI // SP-CTI banners at top and bottom
|
|
13
|
+
- Distribution D: Authorized DoD Personnel Only
|
|
14
|
+
- ISO-formatted generation timestamps
|
|
15
|
+
- ICDEV report engine attribution
|
|
16
|
+
|
|
17
|
+
Usage:
|
|
18
|
+
python tools/modernization/migration_report_generator.py --app-id A-001 --type assessment
|
|
19
|
+
python tools/modernization/migration_report_generator.py --plan-id MP-001 --type progress --pi PI-3
|
|
20
|
+
python tools/modernization/migration_report_generator.py --plan-id MP-001 --type ato-impact
|
|
21
|
+
python tools/modernization/migration_report_generator.py --app-id A-001 --type executive
|
|
22
|
+
python tools/modernization/migration_report_generator.py --app-id A-001 --plan-id MP-001 --type all
|
|
23
|
+
python tools/modernization/migration_report_generator.py --app-id A-001 --type assessment --json
|
|
24
|
+
|
|
25
|
+
Classification: CUI // SP-CTI
|
|
26
|
+
Environment: AWS GovCloud (us-gov-west-1)
|
|
27
|
+
Compliance: NIST 800-53 Rev 5 / RMF
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
import argparse
|
|
31
|
+
import json
|
|
32
|
+
import sqlite3
|
|
33
|
+
import sys
|
|
34
|
+
import textwrap
|
|
35
|
+
from collections import defaultdict
|
|
36
|
+
from datetime import datetime, timezone
|
|
37
|
+
from pathlib import Path
|
|
38
|
+
from icdev._paths import get_project_root
|
|
39
|
+
|
|
40
|
+
# ---------------------------------------------------------------------------
|
|
41
|
+
# Paths
|
|
42
|
+
# ---------------------------------------------------------------------------
|
|
43
|
+
BASE_DIR = get_project_root()
|
|
44
|
+
DB_PATH = BASE_DIR / "data" / "icdev.db"
|
|
45
|
+
TEMPLATE_PATH = BASE_DIR / "context" / "modernization" / "migration_report_template.md"
|
|
46
|
+
|
|
47
|
+
# ---------------------------------------------------------------------------
|
|
48
|
+
# CUI marking constants
|
|
49
|
+
# ---------------------------------------------------------------------------
|
|
50
|
+
CUI_BANNER_TEXT = "CUI // SP-CTI"
|
|
51
|
+
DISTRIBUTION_STMT = "Distribution D: Authorized DoD Personnel Only"
|
|
52
|
+
|
|
53
|
+
# ATO impact descriptions by level
|
|
54
|
+
ATO_IMPACT_DESCRIPTIONS = {
|
|
55
|
+
"none": "No impact to existing ATO boundary. Existing authorization remains valid.",
|
|
56
|
+
"low": "Minor infrastructure changes. Update System Security Plan (SSP) appendices. "
|
|
57
|
+
"No new ATO required; submit a Significant Change Request (SCR).",
|
|
58
|
+
"medium": "Version and framework changes affect the technology baseline. "
|
|
59
|
+
"Update SSP, SAR, and POAM. ATO addendum or reassessment likely required.",
|
|
60
|
+
"high": "New architecture introduces new authorization boundary. Full ATO "
|
|
61
|
+
"reassessment required including updated SSP, SAR, POAM, and STIG review.",
|
|
62
|
+
"critical": "Complete system replacement. New ATO package required from scratch. "
|
|
63
|
+
"Coordinate with ISSM/AO for timeline and interim ATO.",
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
# NIST 800-53 control families commonly affected by migration strategies
|
|
67
|
+
STRATEGY_CONTROL_FAMILIES = {
|
|
68
|
+
"rehost": ["CM-2", "CM-3", "CM-8", "SA-10"],
|
|
69
|
+
"replatform": ["CM-2", "CM-3", "CM-8", "SA-10", "SC-7", "SI-2"],
|
|
70
|
+
"refactor": ["CM-2", "CM-3", "CM-8", "SA-10", "SA-11", "SI-2", "SI-7"],
|
|
71
|
+
"rearchitect": [
|
|
72
|
+
"AC-2", "AC-3", "AU-2", "AU-3", "CM-2", "CM-3", "CM-8",
|
|
73
|
+
"IA-2", "SA-10", "SA-11", "SC-7", "SC-8", "SI-2", "SI-7",
|
|
74
|
+
],
|
|
75
|
+
"repurchase": [
|
|
76
|
+
"AC-2", "AC-3", "AU-2", "AU-3", "CA-2", "CM-2", "CM-3", "CM-8",
|
|
77
|
+
"IA-2", "IA-5", "SA-4", "SA-10", "SA-11", "SC-7", "SC-8",
|
|
78
|
+
"SI-2", "SI-7",
|
|
79
|
+
],
|
|
80
|
+
"retire": ["CM-8", "MP-6", "SI-12"],
|
|
81
|
+
"retain": ["CM-2", "SI-2"],
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
# Risk level labels
|
|
85
|
+
RISK_LABELS = {
|
|
86
|
+
(0.0, 0.2): "LOW",
|
|
87
|
+
(0.2, 0.4): "MODERATE",
|
|
88
|
+
(0.4, 0.6): "SIGNIFICANT",
|
|
89
|
+
(0.6, 0.8): "HIGH",
|
|
90
|
+
(0.8, 1.01): "CRITICAL",
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
# Strategy-to-ATO compliance weeks overhead
|
|
94
|
+
STRATEGY_ATO_WEEKS = {
|
|
95
|
+
"rehost": 0,
|
|
96
|
+
"replatform": 2,
|
|
97
|
+
"refactor": 4,
|
|
98
|
+
"rearchitect": 8,
|
|
99
|
+
"repurchase": 12,
|
|
100
|
+
"retire": 1,
|
|
101
|
+
"retain": 0,
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
# ============================================================================
|
|
106
|
+
# Database helper
|
|
107
|
+
# ============================================================================
|
|
108
|
+
|
|
109
|
+
def _get_db(db_path=None):
|
|
110
|
+
"""Return a sqlite3 connection with Row factory for dict-like access.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
db_path: Optional override path to the SQLite database.
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
sqlite3.Connection with row_factory set to sqlite3.Row.
|
|
117
|
+
|
|
118
|
+
Raises:
|
|
119
|
+
FileNotFoundError: If the database file does not exist.
|
|
120
|
+
"""
|
|
121
|
+
path = Path(db_path) if db_path else DB_PATH
|
|
122
|
+
if not path.exists():
|
|
123
|
+
raise FileNotFoundError(
|
|
124
|
+
f"Database not found: {path}\n"
|
|
125
|
+
"Run: python tools/db/init_icdev_db.py"
|
|
126
|
+
)
|
|
127
|
+
conn = sqlite3.connect(str(path))
|
|
128
|
+
conn.row_factory = sqlite3.Row
|
|
129
|
+
return conn
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
# ============================================================================
|
|
133
|
+
# CUI banner helper
|
|
134
|
+
# ============================================================================
|
|
135
|
+
|
|
136
|
+
def _cui_banner():
|
|
137
|
+
"""Return the standard CUI banner string with distribution statement.
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
str: Multi-line CUI banner for inclusion in reports.
|
|
141
|
+
"""
|
|
142
|
+
return f"{CUI_BANNER_TEXT}\n{DISTRIBUTION_STMT}"
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
# ============================================================================
|
|
146
|
+
# Template loader
|
|
147
|
+
# ============================================================================
|
|
148
|
+
|
|
149
|
+
def _load_template():
|
|
150
|
+
"""Load the migration report Markdown template from the context directory.
|
|
151
|
+
|
|
152
|
+
If the template file is not found, returns a minimal built-in default
|
|
153
|
+
template string that can be used for simple variable substitution.
|
|
154
|
+
|
|
155
|
+
Returns:
|
|
156
|
+
str: The template content.
|
|
157
|
+
"""
|
|
158
|
+
if TEMPLATE_PATH.exists():
|
|
159
|
+
with open(TEMPLATE_PATH, "r", encoding="utf-8") as fh:
|
|
160
|
+
return fh.read()
|
|
161
|
+
# Built-in fallback template
|
|
162
|
+
return textwrap.dedent("""\
|
|
163
|
+
CUI // SP-CTI
|
|
164
|
+
Distribution D: Authorized DoD Personnel Only
|
|
165
|
+
|
|
166
|
+
# Migration Assessment Report: {{ app_name }}
|
|
167
|
+
|
|
168
|
+
**Report Date:** {{ report_date }}
|
|
169
|
+
**Classification:** CUI // SP-CTI
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Executive Summary
|
|
174
|
+
|
|
175
|
+
Application **{{ app_name }}** recommended strategy: **{{ recommended_strategy }}**.
|
|
176
|
+
Estimated effort: **{{ estimated_hours }} hours**. Risk level: **{{ risk_level }}**.
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
*Generated by ICDEV Migration Report Engine*
|
|
181
|
+
|
|
182
|
+
CUI // SP-CTI
|
|
183
|
+
Distribution D: Authorized DoD Personnel Only
|
|
184
|
+
""")
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
# ============================================================================
|
|
188
|
+
# Utility helpers
|
|
189
|
+
# ============================================================================
|
|
190
|
+
|
|
191
|
+
def _now_iso():
|
|
192
|
+
"""Return the current UTC datetime as an ISO-formatted string."""
|
|
193
|
+
return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def _ensure_dir(output_dir):
|
|
197
|
+
"""Ensure the output directory exists, creating it if necessary.
|
|
198
|
+
|
|
199
|
+
Args:
|
|
200
|
+
output_dir: Path string or Path object for the output directory.
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
Path object for the directory.
|
|
204
|
+
"""
|
|
205
|
+
path = Path(output_dir)
|
|
206
|
+
path.mkdir(parents=True, exist_ok=True)
|
|
207
|
+
return path
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def _risk_label(score):
|
|
211
|
+
"""Convert a numeric risk score (0.0-1.0) to a human-readable label.
|
|
212
|
+
|
|
213
|
+
Args:
|
|
214
|
+
score: Float risk score.
|
|
215
|
+
|
|
216
|
+
Returns:
|
|
217
|
+
str: Risk label such as 'LOW', 'MODERATE', 'HIGH', etc.
|
|
218
|
+
"""
|
|
219
|
+
for (lo, hi), label in RISK_LABELS.items():
|
|
220
|
+
if lo <= score < hi:
|
|
221
|
+
return label
|
|
222
|
+
return "UNKNOWN"
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def _format_number(value):
|
|
226
|
+
"""Format a number with comma separators, handling None gracefully.
|
|
227
|
+
|
|
228
|
+
Args:
|
|
229
|
+
value: Numeric value or None.
|
|
230
|
+
|
|
231
|
+
Returns:
|
|
232
|
+
str: Formatted number string, or 'N/A' if value is None.
|
|
233
|
+
"""
|
|
234
|
+
if value is None:
|
|
235
|
+
return "N/A"
|
|
236
|
+
if isinstance(value, float):
|
|
237
|
+
return f"{value:,.1f}"
|
|
238
|
+
return f"{value:,}"
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def _write_report(filepath, content):
|
|
242
|
+
"""Write a CUI-marked report to the given filepath.
|
|
243
|
+
|
|
244
|
+
The report is wrapped with CUI banners at top and bottom, plus the
|
|
245
|
+
Distribution D statement.
|
|
246
|
+
|
|
247
|
+
Args:
|
|
248
|
+
filepath: Path to write the file.
|
|
249
|
+
content: The markdown content body.
|
|
250
|
+
|
|
251
|
+
Returns:
|
|
252
|
+
str: Absolute path to the written file.
|
|
253
|
+
"""
|
|
254
|
+
path = Path(filepath)
|
|
255
|
+
banner = _cui_banner()
|
|
256
|
+
full_content = f"{banner}\n\n{content}\n\n---\n\n*Generated by ICDEV Migration Report Engine — {_now_iso()}*\n\n{banner}\n"
|
|
257
|
+
with open(path, "w", encoding="utf-8") as fh:
|
|
258
|
+
fh.write(full_content)
|
|
259
|
+
return str(path.resolve())
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
def _safe_json_loads(raw, default=None):
|
|
263
|
+
"""Safely parse a JSON string, returning default on failure.
|
|
264
|
+
|
|
265
|
+
Args:
|
|
266
|
+
raw: A JSON string or already-parsed object.
|
|
267
|
+
default: Value to return if parsing fails.
|
|
268
|
+
|
|
269
|
+
Returns:
|
|
270
|
+
Parsed object or default.
|
|
271
|
+
"""
|
|
272
|
+
if raw is None:
|
|
273
|
+
return default if default is not None else {}
|
|
274
|
+
if isinstance(raw, (dict, list)):
|
|
275
|
+
return raw
|
|
276
|
+
try:
|
|
277
|
+
return json.loads(raw)
|
|
278
|
+
except (json.JSONDecodeError, TypeError):
|
|
279
|
+
return default if default is not None else {}
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
# ============================================================================
|
|
283
|
+
# 1. Assessment Report
|
|
284
|
+
# ============================================================================
|
|
285
|
+
|
|
286
|
+
def generate_assessment_report(app_id, output_dir=None, db_path=None):
|
|
287
|
+
"""Generate a CUI-marked 7R assessment report for a legacy application.
|
|
288
|
+
|
|
289
|
+
Queries legacy_applications, migration_assessments, legacy_components,
|
|
290
|
+
legacy_apis, and legacy_db_schemas to build a comprehensive assessment
|
|
291
|
+
report covering all 7 migration strategies with scoring, risk analysis,
|
|
292
|
+
ATO impact, and resource estimates.
|
|
293
|
+
|
|
294
|
+
Args:
|
|
295
|
+
app_id: Legacy application ID.
|
|
296
|
+
output_dir: Directory to write the report (default: current dir).
|
|
297
|
+
db_path: Optional database path override.
|
|
298
|
+
|
|
299
|
+
Returns:
|
|
300
|
+
str: Absolute path to the generated assessment report file.
|
|
301
|
+
|
|
302
|
+
Raises:
|
|
303
|
+
ValueError: If the application or assessment is not found.
|
|
304
|
+
FileNotFoundError: If the database does not exist.
|
|
305
|
+
"""
|
|
306
|
+
out_dir = _ensure_dir(output_dir or ".")
|
|
307
|
+
conn = _get_db(db_path)
|
|
308
|
+
|
|
309
|
+
try:
|
|
310
|
+
# --- Fetch application ---
|
|
311
|
+
app_row = conn.execute(
|
|
312
|
+
"SELECT * FROM legacy_applications WHERE id = ?", (app_id,)
|
|
313
|
+
).fetchone()
|
|
314
|
+
if app_row is None:
|
|
315
|
+
raise ValueError(f"Application '{app_id}' not found in legacy_applications.")
|
|
316
|
+
app = dict(app_row)
|
|
317
|
+
|
|
318
|
+
# --- Fetch latest assessment ---
|
|
319
|
+
assess_row = conn.execute(
|
|
320
|
+
"SELECT * FROM migration_assessments WHERE legacy_app_id = ? "
|
|
321
|
+
"ORDER BY rowid DESC LIMIT 1", (app_id,)
|
|
322
|
+
).fetchone()
|
|
323
|
+
if assess_row is None:
|
|
324
|
+
raise ValueError(
|
|
325
|
+
f"No assessment found for application '{app_id}'. "
|
|
326
|
+
"Run: python tools/modernization/seven_r_assessor.py --app-id <ID>"
|
|
327
|
+
)
|
|
328
|
+
assessment = dict(assess_row)
|
|
329
|
+
|
|
330
|
+
# --- Fetch components (top 20 by complexity) ---
|
|
331
|
+
comp_rows = conn.execute(
|
|
332
|
+
"SELECT * FROM legacy_components WHERE legacy_app_id = ? "
|
|
333
|
+
"ORDER BY cyclomatic_complexity DESC LIMIT 20", (app_id,)
|
|
334
|
+
).fetchall()
|
|
335
|
+
components = [dict(r) for r in comp_rows]
|
|
336
|
+
|
|
337
|
+
total_components_row = conn.execute(
|
|
338
|
+
"SELECT COUNT(*) AS cnt FROM legacy_components WHERE legacy_app_id = ?",
|
|
339
|
+
(app_id,),
|
|
340
|
+
).fetchone()
|
|
341
|
+
total_components = total_components_row["cnt"] if total_components_row else 0
|
|
342
|
+
|
|
343
|
+
# --- Fetch APIs ---
|
|
344
|
+
api_rows = conn.execute(
|
|
345
|
+
"SELECT * FROM legacy_apis WHERE legacy_app_id = ? ORDER BY path, method",
|
|
346
|
+
(app_id,),
|
|
347
|
+
).fetchall()
|
|
348
|
+
apis = [dict(r) for r in api_rows]
|
|
349
|
+
|
|
350
|
+
# --- Fetch DB schemas (grouped by table) ---
|
|
351
|
+
schema_rows = conn.execute(
|
|
352
|
+
"SELECT * FROM legacy_db_schemas WHERE legacy_app_id = ? "
|
|
353
|
+
"ORDER BY table_name, column_name", (app_id,)
|
|
354
|
+
).fetchall()
|
|
355
|
+
db_schemas = [dict(r) for r in schema_rows]
|
|
356
|
+
|
|
357
|
+
finally:
|
|
358
|
+
conn.close()
|
|
359
|
+
|
|
360
|
+
# --- Derived values ---
|
|
361
|
+
risk_score = assessment.get("risk_score", 0.0) or 0.0
|
|
362
|
+
risk_level = _risk_label(risk_score)
|
|
363
|
+
recommended = assessment.get("recommended_strategy", "N/A")
|
|
364
|
+
cost_hours = assessment.get("cost_estimate_hours", 0) or 0
|
|
365
|
+
timeline_weeks = assessment.get("timeline_weeks", 0) or 0
|
|
366
|
+
ato_impact = assessment.get("ato_impact", "N/A")
|
|
367
|
+
evidence = _safe_json_loads(assessment.get("evidence"))
|
|
368
|
+
|
|
369
|
+
# Group DB schemas by table for column counts
|
|
370
|
+
table_columns = defaultdict(int)
|
|
371
|
+
table_db_type = {}
|
|
372
|
+
for col in db_schemas:
|
|
373
|
+
tbl = col.get("table_name", "unknown")
|
|
374
|
+
table_columns[tbl] += 1
|
|
375
|
+
if tbl not in table_db_type:
|
|
376
|
+
table_db_type[tbl] = col.get("db_type", "unknown")
|
|
377
|
+
|
|
378
|
+
# --- Build report sections ---
|
|
379
|
+
lines = []
|
|
380
|
+
|
|
381
|
+
# Title
|
|
382
|
+
lines.append(f"# Migration Assessment Report: {app.get('name', app_id)}")
|
|
383
|
+
lines.append("")
|
|
384
|
+
lines.append(f"**Report Date:** {_now_iso()}")
|
|
385
|
+
lines.append(f"**Classification:** {CUI_BANNER_TEXT}")
|
|
386
|
+
lines.append(f"**Application ID:** {app_id}")
|
|
387
|
+
lines.append(f"**Project ID:** {app.get('project_id', 'N/A')}")
|
|
388
|
+
lines.append("")
|
|
389
|
+
lines.append("---")
|
|
390
|
+
lines.append("")
|
|
391
|
+
|
|
392
|
+
# --- Section 1: Executive Summary ---
|
|
393
|
+
lines.append("## 1. Executive Summary")
|
|
394
|
+
lines.append("")
|
|
395
|
+
lines.append(
|
|
396
|
+
f"Application **{app.get('name', app_id)}** has been assessed for modernization "
|
|
397
|
+
f"using the 7R framework. The recommended migration strategy is "
|
|
398
|
+
f"**{recommended.upper()}** based on analysis of **{total_components}** components, "
|
|
399
|
+
f"**{len(apis)}** API endpoints, and **{len(table_columns)}** database tables."
|
|
400
|
+
)
|
|
401
|
+
lines.append("")
|
|
402
|
+
lines.append(f"- **Recommended Strategy:** {recommended.upper()}")
|
|
403
|
+
lines.append(f"- **Estimated Effort:** {_format_number(cost_hours)} hours")
|
|
404
|
+
lines.append(f"- **Timeline:** {timeline_weeks} weeks")
|
|
405
|
+
lines.append(f"- **Risk Level:** {risk_level} ({risk_score:.2f})")
|
|
406
|
+
lines.append(f"- **ATO Impact:** {ato_impact.upper()}")
|
|
407
|
+
lines.append(f"- **Total Components:** {total_components}")
|
|
408
|
+
lines.append("")
|
|
409
|
+
lines.append("---")
|
|
410
|
+
lines.append("")
|
|
411
|
+
|
|
412
|
+
# --- Section 2: Legacy Application Profile ---
|
|
413
|
+
lines.append("## 2. Legacy Application Profile")
|
|
414
|
+
lines.append("")
|
|
415
|
+
lines.append("| Attribute | Value |")
|
|
416
|
+
lines.append("|-------------------|---------------------------------------------|")
|
|
417
|
+
lines.append(f"| Language | {app.get('primary_language', 'N/A')} {app.get('language_version', '')} |")
|
|
418
|
+
lines.append(f"| Framework | {app.get('framework', 'N/A')} {app.get('framework_version', '')} |")
|
|
419
|
+
lines.append(f"| Application Type | {app.get('app_type', 'N/A')} |")
|
|
420
|
+
lines.append(f"| Lines of Code | {_format_number(app.get('loc_total'))} |")
|
|
421
|
+
lines.append(f"| Code Lines | {_format_number(app.get('loc_code'))} |")
|
|
422
|
+
lines.append(f"| File Count | {_format_number(app.get('file_count'))} |")
|
|
423
|
+
lines.append(f"| Complexity Score | {_format_number(app.get('complexity_score'))} |")
|
|
424
|
+
lines.append(f"| Tech Debt | {_format_number(app.get('tech_debt_hours'))} hours |")
|
|
425
|
+
lines.append(f"| Maintainability | {_format_number(app.get('maintainability_index'))} |")
|
|
426
|
+
lines.append("")
|
|
427
|
+
lines.append("---")
|
|
428
|
+
lines.append("")
|
|
429
|
+
|
|
430
|
+
# --- Section 3: Component Analysis ---
|
|
431
|
+
lines.append("## 3. Component Analysis")
|
|
432
|
+
lines.append("")
|
|
433
|
+
lines.append(f"Showing top {len(components)} components by cyclomatic complexity "
|
|
434
|
+
f"(out of {total_components} total).")
|
|
435
|
+
lines.append("")
|
|
436
|
+
lines.append("| Component | Type | LOC | Complexity | Coupling | Cohesion |")
|
|
437
|
+
lines.append("|-----------|------|-----|------------|----------|----------|")
|
|
438
|
+
for comp in components:
|
|
439
|
+
cname = comp.get("name", "N/A")
|
|
440
|
+
ctype = comp.get("component_type", "N/A")
|
|
441
|
+
cloc = comp.get("loc", 0) or 0
|
|
442
|
+
ccx = comp.get("cyclomatic_complexity", 0) or 0
|
|
443
|
+
ccoup = comp.get("coupling_score", 0) or 0
|
|
444
|
+
ccoh = comp.get("cohesion_score", 0) or 0
|
|
445
|
+
lines.append(f"| {cname} | {ctype} | {cloc:,} | {ccx:.1f} | {ccoup:.2f} | {ccoh:.2f} |")
|
|
446
|
+
lines.append("")
|
|
447
|
+
lines.append(f"**Total Components:** {total_components}")
|
|
448
|
+
lines.append("")
|
|
449
|
+
lines.append("---")
|
|
450
|
+
lines.append("")
|
|
451
|
+
|
|
452
|
+
# --- Section 4: API Inventory ---
|
|
453
|
+
lines.append("## 4. API Inventory")
|
|
454
|
+
lines.append("")
|
|
455
|
+
if apis:
|
|
456
|
+
lines.append("| Method | Path | Handler | Auth Required |")
|
|
457
|
+
lines.append("|--------|------|---------|---------------|")
|
|
458
|
+
for api in apis:
|
|
459
|
+
method = api.get("method", "N/A")
|
|
460
|
+
path = api.get("path", "N/A")
|
|
461
|
+
handler = api.get("handler_function", "N/A")
|
|
462
|
+
auth = "Yes" if api.get("auth_required") else "No"
|
|
463
|
+
lines.append(f"| {method} | {path} | {handler} | {auth} |")
|
|
464
|
+
lines.append("")
|
|
465
|
+
lines.append(f"**Total Endpoints:** {len(apis)}")
|
|
466
|
+
else:
|
|
467
|
+
lines.append("*No API endpoints discovered for this application.*")
|
|
468
|
+
lines.append("")
|
|
469
|
+
lines.append("---")
|
|
470
|
+
lines.append("")
|
|
471
|
+
|
|
472
|
+
# --- Section 5: Database Schema ---
|
|
473
|
+
lines.append("## 5. Database Schema")
|
|
474
|
+
lines.append("")
|
|
475
|
+
if table_columns:
|
|
476
|
+
lines.append("| Table | DB Type | Column Count |")
|
|
477
|
+
lines.append("|-------|---------|--------------|")
|
|
478
|
+
for tbl_name in sorted(table_columns.keys()):
|
|
479
|
+
col_count = table_columns[tbl_name]
|
|
480
|
+
db_type = table_db_type.get(tbl_name, "unknown")
|
|
481
|
+
lines.append(f"| {tbl_name} | {db_type} | {col_count} |")
|
|
482
|
+
lines.append("")
|
|
483
|
+
lines.append(f"**Total Tables:** {len(table_columns)}")
|
|
484
|
+
lines.append(f"**Total Columns:** {len(db_schemas)}")
|
|
485
|
+
else:
|
|
486
|
+
lines.append("*No database schemas discovered for this application.*")
|
|
487
|
+
lines.append("")
|
|
488
|
+
lines.append("---")
|
|
489
|
+
lines.append("")
|
|
490
|
+
|
|
491
|
+
# --- Section 6: 7R Scoring Matrix ---
|
|
492
|
+
lines.append("## 6. 7R Scoring Matrix")
|
|
493
|
+
lines.append("")
|
|
494
|
+
strategy_names = [
|
|
495
|
+
("rehost", "Rehost"),
|
|
496
|
+
("replatform", "Replatform"),
|
|
497
|
+
("refactor", "Refactor"),
|
|
498
|
+
("rearchitect", "Rearchitect"),
|
|
499
|
+
("repurchase", "Repurchase"),
|
|
500
|
+
("retire", "Retire"),
|
|
501
|
+
("retain", "Retain"),
|
|
502
|
+
]
|
|
503
|
+
lines.append("| Strategy | Score | Recommended |")
|
|
504
|
+
lines.append("|--------------|--------|-------------|")
|
|
505
|
+
for sid, sname in strategy_names:
|
|
506
|
+
score_key = f"{sid}_score"
|
|
507
|
+
score_val = assessment.get(score_key, 0.0) or 0.0
|
|
508
|
+
marker = ">> YES <<" if sid == recommended else ""
|
|
509
|
+
lines.append(f"| {sname:<12} | {score_val:.4f} | {marker} |")
|
|
510
|
+
lines.append("")
|
|
511
|
+
lines.append(f"**Recommended Strategy:** **{recommended.upper()}** "
|
|
512
|
+
f"(Score: {assessment.get(recommended + '_score', 0.0):.4f})")
|
|
513
|
+
lines.append("")
|
|
514
|
+
lines.append("---")
|
|
515
|
+
lines.append("")
|
|
516
|
+
|
|
517
|
+
# --- Section 7: Risk Assessment ---
|
|
518
|
+
lines.append("## 7. Risk Assessment")
|
|
519
|
+
lines.append("")
|
|
520
|
+
lines.append(f"**Overall Risk Score:** {risk_score:.4f} ({risk_level})")
|
|
521
|
+
lines.append("")
|
|
522
|
+
lines.append("Risk score combines strategy inherent risk (40%), application "
|
|
523
|
+
"health (30%), ATO impact (20%), and dependency complexity (10%).")
|
|
524
|
+
lines.append("")
|
|
525
|
+
# Risk factor breakdown from evidence if available
|
|
526
|
+
profile_summary = evidence.get("profile_summary", {})
|
|
527
|
+
maint = profile_summary.get("maintainability_index", app.get("maintainability_index", 0))
|
|
528
|
+
if maint is not None:
|
|
529
|
+
health_risk = max(0.0, min(1.0, 1.0 - (float(maint or 0) / 100.0)))
|
|
530
|
+
lines.append(f"- **Application Health Risk:** {health_risk:.2f} "
|
|
531
|
+
f"(maintainability index: {_format_number(maint)})")
|
|
532
|
+
lines.append(f"- **ATO Impact Risk:** {ato_impact}")
|
|
533
|
+
lines.append(f"- **Component Count:** {total_components}")
|
|
534
|
+
lines.append(f"- **Tech Debt:** {_format_number(app.get('tech_debt_hours'))} hours")
|
|
535
|
+
lines.append("")
|
|
536
|
+
lines.append("---")
|
|
537
|
+
lines.append("")
|
|
538
|
+
|
|
539
|
+
# --- Section 8: ATO Impact Analysis ---
|
|
540
|
+
lines.append("## 8. ATO Impact Analysis")
|
|
541
|
+
lines.append("")
|
|
542
|
+
ato_desc = ATO_IMPACT_DESCRIPTIONS.get(ato_impact, "Impact level not determined.")
|
|
543
|
+
ato_weeks = STRATEGY_ATO_WEEKS.get(recommended, 0)
|
|
544
|
+
controls = STRATEGY_CONTROL_FAMILIES.get(recommended, [])
|
|
545
|
+
lines.append("| Attribute | Value |")
|
|
546
|
+
lines.append("|----------------------|------------------------------|")
|
|
547
|
+
lines.append(f"| Impact Level | {ato_impact.upper()} |")
|
|
548
|
+
lines.append(f"| Controls Affected | {len(controls)} control families |")
|
|
549
|
+
lines.append(f"| Estimated ATO Delay | {ato_weeks} weeks |")
|
|
550
|
+
lines.append("")
|
|
551
|
+
lines.append(f"**Assessment:** {ato_desc}")
|
|
552
|
+
lines.append("")
|
|
553
|
+
if controls:
|
|
554
|
+
lines.append("**Affected Control Families:**")
|
|
555
|
+
for ctrl in controls:
|
|
556
|
+
lines.append(f"- {ctrl}")
|
|
557
|
+
lines.append("")
|
|
558
|
+
lines.append("---")
|
|
559
|
+
lines.append("")
|
|
560
|
+
|
|
561
|
+
# --- Section 9: Timeline & Resources ---
|
|
562
|
+
lines.append("## 9. Timeline & Resources")
|
|
563
|
+
lines.append("")
|
|
564
|
+
fte_estimate = max(1, round(cost_hours / max(timeline_weeks * 40, 1)))
|
|
565
|
+
lines.append("| Attribute | Value |")
|
|
566
|
+
lines.append("|------------------|--------------------------------|")
|
|
567
|
+
lines.append(f"| Estimated Hours | {_format_number(cost_hours)} |")
|
|
568
|
+
lines.append(f"| Timeline | {timeline_weeks} weeks |")
|
|
569
|
+
lines.append(f"| Estimated FTEs | {fte_estimate} |")
|
|
570
|
+
lines.append(f"| ATO Overhead | +{ato_weeks} weeks |")
|
|
571
|
+
lines.append(f"| Total Timeline | {timeline_weeks + ato_weeks} weeks |")
|
|
572
|
+
lines.append("")
|
|
573
|
+
|
|
574
|
+
content = "\n".join(lines)
|
|
575
|
+
filepath = out_dir / f"assessment_report_{app_id}.md"
|
|
576
|
+
return _write_report(filepath, content)
|
|
577
|
+
|
|
578
|
+
|
|
579
|
+
# ============================================================================
|
|
580
|
+
# 2. Progress Report
|
|
581
|
+
# ============================================================================
|
|
582
|
+
|
|
583
|
+
def generate_progress_report(plan_id, pi_number=None, output_dir=None, db_path=None):
|
|
584
|
+
"""Generate a migration progress report for a specific plan and PI.
|
|
585
|
+
|
|
586
|
+
Queries migration_plans, migration_tasks, and migration_progress to
|
|
587
|
+
build a report showing task status, velocity, hours tracking, blockers,
|
|
588
|
+
and component migration progress.
|
|
589
|
+
|
|
590
|
+
Args:
|
|
591
|
+
plan_id: Migration plan ID.
|
|
592
|
+
pi_number: Optional PI number for focused snapshot.
|
|
593
|
+
output_dir: Directory to write the report (default: current dir).
|
|
594
|
+
db_path: Optional database path override.
|
|
595
|
+
|
|
596
|
+
Returns:
|
|
597
|
+
str: Absolute path to the generated progress report file.
|
|
598
|
+
|
|
599
|
+
Raises:
|
|
600
|
+
ValueError: If the migration plan is not found.
|
|
601
|
+
FileNotFoundError: If the database does not exist.
|
|
602
|
+
"""
|
|
603
|
+
out_dir = _ensure_dir(output_dir or ".")
|
|
604
|
+
conn = _get_db(db_path)
|
|
605
|
+
|
|
606
|
+
try:
|
|
607
|
+
# --- Fetch plan ---
|
|
608
|
+
plan_row = conn.execute(
|
|
609
|
+
"SELECT * FROM migration_plans WHERE id = ?", (plan_id,)
|
|
610
|
+
).fetchone()
|
|
611
|
+
if plan_row is None:
|
|
612
|
+
raise ValueError(f"Migration plan '{plan_id}' not found in migration_plans.")
|
|
613
|
+
plan = dict(plan_row)
|
|
614
|
+
|
|
615
|
+
# --- Fetch all tasks for this plan ---
|
|
616
|
+
task_rows = conn.execute(
|
|
617
|
+
"SELECT * FROM migration_tasks WHERE plan_id = ? ORDER BY priority, title",
|
|
618
|
+
(plan_id,),
|
|
619
|
+
).fetchall()
|
|
620
|
+
tasks = [dict(r) for r in task_rows]
|
|
621
|
+
|
|
622
|
+
# --- Fetch progress snapshots ---
|
|
623
|
+
if pi_number:
|
|
624
|
+
progress_rows = conn.execute(
|
|
625
|
+
"SELECT * FROM migration_progress WHERE plan_id = ? AND pi_number = ? "
|
|
626
|
+
"ORDER BY rowid DESC",
|
|
627
|
+
(plan_id, pi_number),
|
|
628
|
+
).fetchall()
|
|
629
|
+
else:
|
|
630
|
+
progress_rows = conn.execute(
|
|
631
|
+
"SELECT * FROM migration_progress WHERE plan_id = ? ORDER BY pi_number",
|
|
632
|
+
(plan_id,),
|
|
633
|
+
).fetchall()
|
|
634
|
+
progress = [dict(r) for r in progress_rows]
|
|
635
|
+
|
|
636
|
+
finally:
|
|
637
|
+
conn.close()
|
|
638
|
+
|
|
639
|
+
# --- Compute task status counts ---
|
|
640
|
+
status_counts = defaultdict(int)
|
|
641
|
+
for task in tasks:
|
|
642
|
+
st = (task.get("status") or "pending").lower()
|
|
643
|
+
status_counts[st] += 1
|
|
644
|
+
|
|
645
|
+
total_tasks = len(tasks)
|
|
646
|
+
completed = status_counts.get("completed", 0) + status_counts.get("done", 0)
|
|
647
|
+
in_progress = status_counts.get("in_progress", 0) + status_counts.get("in-progress", 0)
|
|
648
|
+
blocked = status_counts.get("blocked", 0)
|
|
649
|
+
pending = total_tasks - completed - in_progress - blocked
|
|
650
|
+
|
|
651
|
+
# Filter blocked and high-priority pending tasks
|
|
652
|
+
blocked_tasks = [t for t in tasks if (t.get("status") or "").lower() == "blocked"]
|
|
653
|
+
high_priority_pending = [
|
|
654
|
+
t for t in tasks
|
|
655
|
+
if (t.get("status") or "").lower() in ("pending", "todo", "backlog")
|
|
656
|
+
and (t.get("priority") or "").lower() in ("high", "critical", "1", "2")
|
|
657
|
+
]
|
|
658
|
+
|
|
659
|
+
# --- Build report ---
|
|
660
|
+
lines = []
|
|
661
|
+
|
|
662
|
+
# Title
|
|
663
|
+
plan_name = plan.get("plan_name", plan_id)
|
|
664
|
+
lines.append(f"# Migration Progress Report: {plan_name}")
|
|
665
|
+
lines.append("")
|
|
666
|
+
lines.append(f"**Report Date:** {_now_iso()}")
|
|
667
|
+
lines.append(f"**Classification:** {CUI_BANNER_TEXT}")
|
|
668
|
+
lines.append(f"**Plan ID:** {plan_id}")
|
|
669
|
+
if pi_number:
|
|
670
|
+
lines.append(f"**Program Increment:** {pi_number}")
|
|
671
|
+
lines.append("")
|
|
672
|
+
lines.append("---")
|
|
673
|
+
lines.append("")
|
|
674
|
+
|
|
675
|
+
# --- Plan Summary ---
|
|
676
|
+
lines.append("## 1. Plan Summary")
|
|
677
|
+
lines.append("")
|
|
678
|
+
lines.append("| Attribute | Value |")
|
|
679
|
+
lines.append("|--------------------|------------------------------------------------|")
|
|
680
|
+
lines.append(f"| Strategy | {plan.get('strategy', 'N/A')} |")
|
|
681
|
+
lines.append(f"| Migration Approach | {plan.get('migration_approach', 'N/A')} |")
|
|
682
|
+
lines.append(f"| Target Language | {plan.get('target_language', 'N/A')} |")
|
|
683
|
+
lines.append(f"| Target Framework | {plan.get('target_framework', 'N/A')} |")
|
|
684
|
+
lines.append(f"| Target Architecture| {plan.get('target_architecture', 'N/A')} |")
|
|
685
|
+
lines.append(f"| Status | {plan.get('status', 'N/A')} |")
|
|
686
|
+
lines.append(f"| Estimated Hours | {_format_number(plan.get('estimated_hours'))} |")
|
|
687
|
+
lines.append(f"| Actual Hours | {_format_number(plan.get('actual_hours'))} |")
|
|
688
|
+
lines.append("")
|
|
689
|
+
lines.append("---")
|
|
690
|
+
lines.append("")
|
|
691
|
+
|
|
692
|
+
# --- Task Status ---
|
|
693
|
+
lines.append("## 2. Task Status")
|
|
694
|
+
lines.append("")
|
|
695
|
+
completion_pct = (completed / total_tasks * 100) if total_tasks > 0 else 0
|
|
696
|
+
lines.append(f"**Overall Completion:** {completion_pct:.1f}% "
|
|
697
|
+
f"({completed}/{total_tasks} tasks)")
|
|
698
|
+
lines.append("")
|
|
699
|
+
lines.append("| Status | Count | Percentage |")
|
|
700
|
+
lines.append("|-------------|-------|------------|")
|
|
701
|
+
for label, count in [("Completed", completed), ("In Progress", in_progress),
|
|
702
|
+
("Blocked", blocked), ("Pending", pending)]:
|
|
703
|
+
pct = (count / total_tasks * 100) if total_tasks > 0 else 0
|
|
704
|
+
lines.append(f"| {label} | {count} | {pct:.1f}% |")
|
|
705
|
+
lines.append(f"| **Total** | **{total_tasks}** | **100%** |")
|
|
706
|
+
lines.append("")
|
|
707
|
+
lines.append("---")
|
|
708
|
+
lines.append("")
|
|
709
|
+
|
|
710
|
+
# --- PI Progress (if pi_number specified) ---
|
|
711
|
+
if pi_number and progress:
|
|
712
|
+
lines.append(f"## 3. PI Progress: {pi_number}")
|
|
713
|
+
lines.append("")
|
|
714
|
+
snapshot = progress[0] # Most recent snapshot for this PI
|
|
715
|
+
snap_tasks_total = snapshot.get("tasks_total", 0) or 0
|
|
716
|
+
snap_completed = snapshot.get("tasks_completed", 0) or 0
|
|
717
|
+
snap_in_progress = snapshot.get("tasks_in_progress", 0) or 0
|
|
718
|
+
snap_blocked = snapshot.get("tasks_blocked", 0) or 0
|
|
719
|
+
snap_comps_migrated = snapshot.get("components_migrated", 0) or 0
|
|
720
|
+
snap_comps_remaining = snapshot.get("components_remaining", 0) or 0
|
|
721
|
+
snap_coverage = snapshot.get("test_coverage", 0) or 0
|
|
722
|
+
snap_compliance = snapshot.get("compliance_score", 0) or 0
|
|
723
|
+
snap_hours = snapshot.get("hours_spent", 0) or 0
|
|
724
|
+
|
|
725
|
+
lines.append("| Metric | Value |")
|
|
726
|
+
lines.append("|-----------------------|-------------|")
|
|
727
|
+
lines.append(f"| PI Tasks Total | {snap_tasks_total} |")
|
|
728
|
+
lines.append(f"| PI Tasks Completed | {snap_completed} |")
|
|
729
|
+
lines.append(f"| PI Tasks In Progress | {snap_in_progress} |")
|
|
730
|
+
lines.append(f"| PI Tasks Blocked | {snap_blocked} |")
|
|
731
|
+
lines.append(f"| Components Migrated | {snap_comps_migrated} |")
|
|
732
|
+
lines.append(f"| Components Remaining | {snap_comps_remaining} |")
|
|
733
|
+
lines.append(f"| Test Coverage | {snap_coverage:.1f}% |")
|
|
734
|
+
lines.append(f"| Compliance Score | {snap_compliance:.1f}% |")
|
|
735
|
+
lines.append(f"| Hours Spent (PI) | {_format_number(snap_hours)} |")
|
|
736
|
+
lines.append("")
|
|
737
|
+
|
|
738
|
+
# Velocity: tasks completed per PI
|
|
739
|
+
if snap_tasks_total > 0:
|
|
740
|
+
velocity = snap_completed
|
|
741
|
+
lines.append(f"**PI Velocity:** {velocity} tasks completed")
|
|
742
|
+
remaining_tasks = total_tasks - completed
|
|
743
|
+
if velocity > 0:
|
|
744
|
+
estimated_pis = remaining_tasks / velocity
|
|
745
|
+
lines.append(f"**Estimated PIs Remaining:** {estimated_pis:.1f}")
|
|
746
|
+
lines.append("")
|
|
747
|
+
lines.append("---")
|
|
748
|
+
lines.append("")
|
|
749
|
+
elif progress:
|
|
750
|
+
# Show all PI snapshots as trend
|
|
751
|
+
lines.append("## 3. PI Progress Trend")
|
|
752
|
+
lines.append("")
|
|
753
|
+
lines.append("| PI | Tasks Total | Completed | In Progress | Blocked | "
|
|
754
|
+
"Components Migrated | Test Coverage | Hours |")
|
|
755
|
+
lines.append("|-----|-------------|-----------|-------------|---------|"
|
|
756
|
+
"--------------------|---------------|-------|")
|
|
757
|
+
for snap in progress:
|
|
758
|
+
pi = snap.get("pi_number", "N/A")
|
|
759
|
+
lines.append(
|
|
760
|
+
f"| {pi} "
|
|
761
|
+
f"| {snap.get('tasks_total', 0)} "
|
|
762
|
+
f"| {snap.get('tasks_completed', 0)} "
|
|
763
|
+
f"| {snap.get('tasks_in_progress', 0)} "
|
|
764
|
+
f"| {snap.get('tasks_blocked', 0)} "
|
|
765
|
+
f"| {snap.get('components_migrated', 0)} "
|
|
766
|
+
f"| {(snap.get('test_coverage', 0) or 0):.1f}% "
|
|
767
|
+
f"| {_format_number(snap.get('hours_spent', 0))} |"
|
|
768
|
+
)
|
|
769
|
+
lines.append("")
|
|
770
|
+
lines.append("---")
|
|
771
|
+
lines.append("")
|
|
772
|
+
|
|
773
|
+
# --- Hours Tracking ---
|
|
774
|
+
lines.append("## 4. Hours Tracking")
|
|
775
|
+
lines.append("")
|
|
776
|
+
estimated_hours = plan.get("estimated_hours", 0) or 0
|
|
777
|
+
actual_hours = plan.get("actual_hours", 0) or 0
|
|
778
|
+
variance = actual_hours - estimated_hours
|
|
779
|
+
burn_rate = (actual_hours / estimated_hours * 100) if estimated_hours > 0 else 0
|
|
780
|
+
|
|
781
|
+
lines.append("| Metric | Value |")
|
|
782
|
+
lines.append("|-----------------|-------------------|")
|
|
783
|
+
lines.append(f"| Estimated Hours | {_format_number(estimated_hours)} |")
|
|
784
|
+
lines.append(f"| Actual Hours | {_format_number(actual_hours)} |")
|
|
785
|
+
lines.append(f"| Variance | {_format_number(variance)} |")
|
|
786
|
+
lines.append(f"| Burn Rate | {burn_rate:.1f}% |")
|
|
787
|
+
lines.append("")
|
|
788
|
+
if burn_rate > 100:
|
|
789
|
+
lines.append(f"> **WARNING:** Actual hours exceed estimate by "
|
|
790
|
+
f"{burn_rate - 100:.1f}%. Review scope and resource allocation.")
|
|
791
|
+
elif burn_rate > 80 and completion_pct < 80:
|
|
792
|
+
lines.append(f"> **CAUTION:** {burn_rate:.0f}% of hours consumed but only "
|
|
793
|
+
f"{completion_pct:.0f}% tasks complete. Monitor burn rate closely.")
|
|
794
|
+
lines.append("")
|
|
795
|
+
lines.append("---")
|
|
796
|
+
lines.append("")
|
|
797
|
+
|
|
798
|
+
# --- Blockers ---
|
|
799
|
+
lines.append("## 5. Blockers")
|
|
800
|
+
lines.append("")
|
|
801
|
+
if blocked_tasks:
|
|
802
|
+
lines.append("| Task | Type | Priority | PI | Est. Hours |")
|
|
803
|
+
lines.append("|------|------|----------|----|------------|")
|
|
804
|
+
for bt in blocked_tasks:
|
|
805
|
+
lines.append(
|
|
806
|
+
f"| {bt.get('title', 'N/A')} "
|
|
807
|
+
f"| {bt.get('task_type', 'N/A')} "
|
|
808
|
+
f"| {bt.get('priority', 'N/A')} "
|
|
809
|
+
f"| {bt.get('pi_number', 'N/A')} "
|
|
810
|
+
f"| {_format_number(bt.get('estimated_hours'))} |"
|
|
811
|
+
)
|
|
812
|
+
lines.append("")
|
|
813
|
+
lines.append(f"**Total Blocked Tasks:** {len(blocked_tasks)}")
|
|
814
|
+
else:
|
|
815
|
+
lines.append("*No blocked tasks at this time.*")
|
|
816
|
+
lines.append("")
|
|
817
|
+
lines.append("---")
|
|
818
|
+
lines.append("")
|
|
819
|
+
|
|
820
|
+
# --- Next Steps ---
|
|
821
|
+
lines.append("## 6. Next Steps")
|
|
822
|
+
lines.append("")
|
|
823
|
+
if high_priority_pending:
|
|
824
|
+
lines.append("**High-priority pending tasks:**")
|
|
825
|
+
lines.append("")
|
|
826
|
+
for idx, task in enumerate(high_priority_pending[:10], 1):
|
|
827
|
+
lines.append(f"{idx}. **{task.get('title', 'N/A')}** "
|
|
828
|
+
f"(Type: {task.get('task_type', 'N/A')}, "
|
|
829
|
+
f"Priority: {task.get('priority', 'N/A')}, "
|
|
830
|
+
f"Est: {_format_number(task.get('estimated_hours'))} hrs)")
|
|
831
|
+
if len(high_priority_pending) > 10:
|
|
832
|
+
lines.append(f"\n*...and {len(high_priority_pending) - 10} more high-priority tasks.*")
|
|
833
|
+
else:
|
|
834
|
+
lines.append("*No high-priority pending tasks identified.*")
|
|
835
|
+
lines.append("")
|
|
836
|
+
|
|
837
|
+
content = "\n".join(lines)
|
|
838
|
+
filepath = out_dir / f"progress_report_{plan_id}.md"
|
|
839
|
+
return _write_report(filepath, content)
|
|
840
|
+
|
|
841
|
+
|
|
842
|
+
# ============================================================================
|
|
843
|
+
# 3. ATO Impact Report
|
|
844
|
+
# ============================================================================
|
|
845
|
+
|
|
846
|
+
def generate_ato_impact_report(plan_id, output_dir=None, db_path=None):
|
|
847
|
+
"""Generate a compliance and ATO impact analysis report for a migration plan.
|
|
848
|
+
|
|
849
|
+
Analyzes the migration strategy's impact on the existing ATO boundary,
|
|
850
|
+
identifies affected NIST 800-53 control families, evaluates compliance
|
|
851
|
+
coverage, and lists remediation actions required.
|
|
852
|
+
|
|
853
|
+
Args:
|
|
854
|
+
plan_id: Migration plan ID.
|
|
855
|
+
output_dir: Directory to write the report (default: current dir).
|
|
856
|
+
db_path: Optional database path override.
|
|
857
|
+
|
|
858
|
+
Returns:
|
|
859
|
+
str: Absolute path to the generated ATO impact report file.
|
|
860
|
+
|
|
861
|
+
Raises:
|
|
862
|
+
ValueError: If the migration plan is not found.
|
|
863
|
+
FileNotFoundError: If the database does not exist.
|
|
864
|
+
"""
|
|
865
|
+
out_dir = _ensure_dir(output_dir or ".")
|
|
866
|
+
conn = _get_db(db_path)
|
|
867
|
+
|
|
868
|
+
try:
|
|
869
|
+
# --- Fetch plan ---
|
|
870
|
+
plan_row = conn.execute(
|
|
871
|
+
"SELECT * FROM migration_plans WHERE id = ?", (plan_id,)
|
|
872
|
+
).fetchone()
|
|
873
|
+
if plan_row is None:
|
|
874
|
+
raise ValueError(f"Migration plan '{plan_id}' not found.")
|
|
875
|
+
plan = dict(plan_row)
|
|
876
|
+
|
|
877
|
+
# --- Fetch assessment for the app ---
|
|
878
|
+
app_id = plan.get("legacy_app_id")
|
|
879
|
+
assessment = None
|
|
880
|
+
if app_id:
|
|
881
|
+
assess_row = conn.execute(
|
|
882
|
+
"SELECT * FROM migration_assessments WHERE legacy_app_id = ? "
|
|
883
|
+
"ORDER BY rowid DESC LIMIT 1", (app_id,)
|
|
884
|
+
).fetchone()
|
|
885
|
+
if assess_row:
|
|
886
|
+
assessment = dict(assess_row)
|
|
887
|
+
|
|
888
|
+
# --- Attempt to fetch digital thread links for compliance coverage ---
|
|
889
|
+
compliance_links = []
|
|
890
|
+
try:
|
|
891
|
+
link_rows = conn.execute(
|
|
892
|
+
"SELECT * FROM digital_thread_links WHERE project_id = ? "
|
|
893
|
+
"AND link_type LIKE '%compliance%'",
|
|
894
|
+
(plan.get("legacy_app_id", ""),),
|
|
895
|
+
).fetchall()
|
|
896
|
+
compliance_links = [dict(r) for r in link_rows]
|
|
897
|
+
except sqlite3.OperationalError:
|
|
898
|
+
# Table may not exist; proceed without compliance links
|
|
899
|
+
pass
|
|
900
|
+
|
|
901
|
+
finally:
|
|
902
|
+
conn.close()
|
|
903
|
+
|
|
904
|
+
# --- Determine strategy and impact ---
|
|
905
|
+
strategy = (plan.get("strategy") or "unknown").lower()
|
|
906
|
+
ato_impact = "medium" # default
|
|
907
|
+
if assessment:
|
|
908
|
+
ato_impact = assessment.get("ato_impact", "medium") or "medium"
|
|
909
|
+
else:
|
|
910
|
+
# Derive from strategy directly
|
|
911
|
+
impact_map = {
|
|
912
|
+
"rehost": "none", "replatform": "low", "refactor": "medium",
|
|
913
|
+
"rearchitect": "high", "repurchase": "critical",
|
|
914
|
+
"retire": "none", "retain": "none",
|
|
915
|
+
}
|
|
916
|
+
ato_impact = impact_map.get(strategy, "medium")
|
|
917
|
+
|
|
918
|
+
controls = STRATEGY_CONTROL_FAMILIES.get(strategy, [])
|
|
919
|
+
ato_desc = ATO_IMPACT_DESCRIPTIONS.get(ato_impact, "Impact assessment pending.")
|
|
920
|
+
ato_weeks = STRATEGY_ATO_WEEKS.get(strategy, 0)
|
|
921
|
+
|
|
922
|
+
# --- Build report ---
|
|
923
|
+
lines = []
|
|
924
|
+
|
|
925
|
+
plan_name = plan.get("plan_name", plan_id)
|
|
926
|
+
lines.append(f"# ATO Impact Report: {plan_name}")
|
|
927
|
+
lines.append("")
|
|
928
|
+
lines.append(f"**Report Date:** {_now_iso()}")
|
|
929
|
+
lines.append(f"**Classification:** {CUI_BANNER_TEXT}")
|
|
930
|
+
lines.append(f"**Plan ID:** {plan_id}")
|
|
931
|
+
lines.append(f"**Migration Strategy:** {strategy.upper()}")
|
|
932
|
+
lines.append("")
|
|
933
|
+
lines.append("---")
|
|
934
|
+
lines.append("")
|
|
935
|
+
|
|
936
|
+
# --- Section 1: Impact Level ---
|
|
937
|
+
lines.append("## 1. Impact Level")
|
|
938
|
+
lines.append("")
|
|
939
|
+
lines.append(f"**ATO Impact Level:** {ato_impact.upper()}")
|
|
940
|
+
lines.append("")
|
|
941
|
+
lines.append(f"{ato_desc}")
|
|
942
|
+
lines.append("")
|
|
943
|
+
|
|
944
|
+
# Impact level guidance table
|
|
945
|
+
lines.append("### Impact Level Reference")
|
|
946
|
+
lines.append("")
|
|
947
|
+
lines.append("| Level | Description | Action Required |")
|
|
948
|
+
lines.append("|----------|-------------|-----------------|")
|
|
949
|
+
lines.append("| NONE | No boundary change | No action |")
|
|
950
|
+
lines.append("| LOW | Minor infra changes | SCR submission |")
|
|
951
|
+
lines.append("| MEDIUM | Tech baseline change | ATO addendum |")
|
|
952
|
+
lines.append("| HIGH | New boundary | Full reassessment |")
|
|
953
|
+
lines.append("| CRITICAL | System replacement | New ATO package |")
|
|
954
|
+
lines.append("")
|
|
955
|
+
lines.append("---")
|
|
956
|
+
lines.append("")
|
|
957
|
+
|
|
958
|
+
# --- Section 2: Controls Affected ---
|
|
959
|
+
lines.append("## 2. Controls Affected")
|
|
960
|
+
lines.append("")
|
|
961
|
+
if controls:
|
|
962
|
+
lines.append(f"The **{strategy.upper()}** strategy impacts **{len(controls)}** "
|
|
963
|
+
"NIST 800-53 control families:")
|
|
964
|
+
lines.append("")
|
|
965
|
+
lines.append("| Control ID | Family Description |")
|
|
966
|
+
lines.append("|------------|-------------------|")
|
|
967
|
+
control_descriptions = {
|
|
968
|
+
"AC-2": "Account Management",
|
|
969
|
+
"AC-3": "Access Enforcement",
|
|
970
|
+
"AU-2": "Event Logging",
|
|
971
|
+
"AU-3": "Content of Audit Records",
|
|
972
|
+
"CA-2": "Control Assessments",
|
|
973
|
+
"CM-2": "Baseline Configuration",
|
|
974
|
+
"CM-3": "Configuration Change Control",
|
|
975
|
+
"CM-8": "System Component Inventory",
|
|
976
|
+
"IA-2": "Identification and Authentication",
|
|
977
|
+
"IA-5": "Authenticator Management",
|
|
978
|
+
"MP-6": "Media Sanitization",
|
|
979
|
+
"SA-4": "Acquisition Process",
|
|
980
|
+
"SA-10": "Developer Configuration Management",
|
|
981
|
+
"SA-11": "Developer Testing and Evaluation",
|
|
982
|
+
"SC-7": "Boundary Protection",
|
|
983
|
+
"SC-8": "Transmission Confidentiality and Integrity",
|
|
984
|
+
"SI-2": "Flaw Remediation",
|
|
985
|
+
"SI-7": "Software, Firmware, and Information Integrity",
|
|
986
|
+
"SI-12": "Information Management and Retention",
|
|
987
|
+
}
|
|
988
|
+
for ctrl in controls:
|
|
989
|
+
desc = control_descriptions.get(ctrl, "See NIST 800-53 Rev 5")
|
|
990
|
+
lines.append(f"| {ctrl} | {desc} |")
|
|
991
|
+
else:
|
|
992
|
+
lines.append("*No specific control families identified as impacted.*")
|
|
993
|
+
lines.append("")
|
|
994
|
+
lines.append("---")
|
|
995
|
+
lines.append("")
|
|
996
|
+
|
|
997
|
+
# --- Section 3: Coverage Analysis ---
|
|
998
|
+
lines.append("## 3. Coverage Analysis")
|
|
999
|
+
lines.append("")
|
|
1000
|
+
if compliance_links:
|
|
1001
|
+
covered_controls = set()
|
|
1002
|
+
for link in compliance_links:
|
|
1003
|
+
ctrl = link.get("target_id", "")
|
|
1004
|
+
if ctrl:
|
|
1005
|
+
covered_controls.add(ctrl)
|
|
1006
|
+
pre_coverage = len(covered_controls)
|
|
1007
|
+
affected_set = set(controls)
|
|
1008
|
+
gap_controls = affected_set - covered_controls
|
|
1009
|
+
pre_coverage - len(affected_set & covered_controls)
|
|
1010
|
+
|
|
1011
|
+
lines.append(f"- **Pre-Migration Controls Documented:** {pre_coverage}")
|
|
1012
|
+
lines.append(f"- **Controls Requiring Update:** {len(affected_set)}")
|
|
1013
|
+
lines.append(f"- **Coverage Gaps Identified:** {len(gap_controls)}")
|
|
1014
|
+
lines.append("")
|
|
1015
|
+
if gap_controls:
|
|
1016
|
+
lines.append("**Control Gaps:**")
|
|
1017
|
+
for gap in sorted(gap_controls):
|
|
1018
|
+
desc = control_descriptions.get(gap, "")
|
|
1019
|
+
lines.append(f"- {gap}: {desc}")
|
|
1020
|
+
lines.append("")
|
|
1021
|
+
else:
|
|
1022
|
+
lines.append("*No existing compliance mapping data available. "
|
|
1023
|
+
"Manual compliance assessment recommended.*")
|
|
1024
|
+
lines.append("")
|
|
1025
|
+
lines.append(f"Based on the **{strategy.upper()}** strategy, the following "
|
|
1026
|
+
f"{len(controls)} control families will need documentation:")
|
|
1027
|
+
lines.append("")
|
|
1028
|
+
for ctrl in controls:
|
|
1029
|
+
lines.append(f"- {ctrl}")
|
|
1030
|
+
lines.append("")
|
|
1031
|
+
lines.append("---")
|
|
1032
|
+
lines.append("")
|
|
1033
|
+
|
|
1034
|
+
# --- Section 4: Remediation Required ---
|
|
1035
|
+
lines.append("## 4. Remediation Required")
|
|
1036
|
+
lines.append("")
|
|
1037
|
+
|
|
1038
|
+
remediation_actions = {
|
|
1039
|
+
"none": [
|
|
1040
|
+
"No compliance remediation required.",
|
|
1041
|
+
],
|
|
1042
|
+
"low": [
|
|
1043
|
+
"Update SSP Appendix A (System Boundary Diagram) with new infrastructure.",
|
|
1044
|
+
"Submit Significant Change Request (SCR) to ISSM.",
|
|
1045
|
+
"Update CM-8 system component inventory.",
|
|
1046
|
+
"Verify SI-2 patch management covers new platform.",
|
|
1047
|
+
],
|
|
1048
|
+
"medium": [
|
|
1049
|
+
"Update SSP Sections 1-3 (System Identification and Description).",
|
|
1050
|
+
"Revise SSP Section 13 (System and Communications Protection).",
|
|
1051
|
+
"Update SAR (Security Assessment Report) with new technology baseline.",
|
|
1052
|
+
"Review and update POAM for any new findings.",
|
|
1053
|
+
"Conduct developer testing per SA-11.",
|
|
1054
|
+
"Update STIG checklists for new framework version.",
|
|
1055
|
+
"Submit ATO addendum package to AO.",
|
|
1056
|
+
],
|
|
1057
|
+
"high": [
|
|
1058
|
+
"Draft new SSP or major SSP revision for new architecture.",
|
|
1059
|
+
"Conduct full Security Control Assessment (SCA).",
|
|
1060
|
+
"Update all STIG benchmarks for new technology stack.",
|
|
1061
|
+
"Revise SAR with comprehensive findings.",
|
|
1062
|
+
"Create/update POAM with all open findings.",
|
|
1063
|
+
"Update network diagrams and data flow diagrams.",
|
|
1064
|
+
"Conduct penetration testing on new architecture.",
|
|
1065
|
+
"Submit full ATO reassessment package to AO.",
|
|
1066
|
+
"Plan for Interim ATO (IATO) during transition.",
|
|
1067
|
+
],
|
|
1068
|
+
"critical": [
|
|
1069
|
+
"Develop complete new SSP for replacement system.",
|
|
1070
|
+
"Conduct full SCA against all applicable NIST controls.",
|
|
1071
|
+
"Complete STIG evaluation for all new system components.",
|
|
1072
|
+
"Develop new SAR documenting all assessment results.",
|
|
1073
|
+
"Create comprehensive POAM for any findings.",
|
|
1074
|
+
"Generate SBOM for all new system components.",
|
|
1075
|
+
"Conduct thorough penetration testing.",
|
|
1076
|
+
"Develop data migration security plan.",
|
|
1077
|
+
"Plan decommission security procedures for legacy system.",
|
|
1078
|
+
"Coordinate with ISSM/AO for new ATO timeline.",
|
|
1079
|
+
"Apply for IATO to cover migration transition period.",
|
|
1080
|
+
"Conduct independent verification and validation (IV&V).",
|
|
1081
|
+
],
|
|
1082
|
+
}
|
|
1083
|
+
|
|
1084
|
+
actions = remediation_actions.get(ato_impact, remediation_actions["medium"])
|
|
1085
|
+
for idx, action in enumerate(actions, 1):
|
|
1086
|
+
lines.append(f"{idx}. {action}")
|
|
1087
|
+
lines.append("")
|
|
1088
|
+
lines.append("---")
|
|
1089
|
+
lines.append("")
|
|
1090
|
+
|
|
1091
|
+
# --- Section 5: Timeline Impact ---
|
|
1092
|
+
lines.append("## 5. Timeline Impact")
|
|
1093
|
+
lines.append("")
|
|
1094
|
+
lines.append(f"The **{strategy.upper()}** migration strategy adds an estimated "
|
|
1095
|
+
f"**{ato_weeks} weeks** to the project timeline for compliance activities.")
|
|
1096
|
+
lines.append("")
|
|
1097
|
+
plan_timeline = plan.get("estimated_hours", 0) or 0
|
|
1098
|
+
if plan_timeline:
|
|
1099
|
+
plan_weeks = max(1, round(plan_timeline / 40))
|
|
1100
|
+
total_weeks = plan_weeks + ato_weeks
|
|
1101
|
+
lines.append("| Phase | Duration (weeks) |")
|
|
1102
|
+
lines.append("|---------------------|-----------------|")
|
|
1103
|
+
lines.append(f"| Migration Execution | {plan_weeks} |")
|
|
1104
|
+
lines.append(f"| Compliance Work | {ato_weeks} |")
|
|
1105
|
+
lines.append(f"| **Total** | **{total_weeks}** |")
|
|
1106
|
+
else:
|
|
1107
|
+
lines.append(f"Additional compliance overhead: **{ato_weeks} weeks**")
|
|
1108
|
+
lines.append("")
|
|
1109
|
+
|
|
1110
|
+
content = "\n".join(lines)
|
|
1111
|
+
filepath = out_dir / f"ato_impact_report_{plan_id}.md"
|
|
1112
|
+
return _write_report(filepath, content)
|
|
1113
|
+
|
|
1114
|
+
|
|
1115
|
+
# ============================================================================
|
|
1116
|
+
# 4. Executive Summary
|
|
1117
|
+
# ============================================================================
|
|
1118
|
+
|
|
1119
|
+
def generate_executive_summary(app_id, output_dir=None, db_path=None):
|
|
1120
|
+
"""Generate a one-page executive summary for leadership review.
|
|
1121
|
+
|
|
1122
|
+
Provides a high-level overview of the migration assessment including
|
|
1123
|
+
the recommended strategy, cost, timeline, risk, ATO impact, a compact
|
|
1124
|
+
decision matrix, and key findings.
|
|
1125
|
+
|
|
1126
|
+
Args:
|
|
1127
|
+
app_id: Legacy application ID.
|
|
1128
|
+
output_dir: Directory to write the report (default: current dir).
|
|
1129
|
+
db_path: Optional database path override.
|
|
1130
|
+
|
|
1131
|
+
Returns:
|
|
1132
|
+
str: Absolute path to the generated executive summary file.
|
|
1133
|
+
|
|
1134
|
+
Raises:
|
|
1135
|
+
ValueError: If the application or assessment is not found.
|
|
1136
|
+
FileNotFoundError: If the database does not exist.
|
|
1137
|
+
"""
|
|
1138
|
+
out_dir = _ensure_dir(output_dir or ".")
|
|
1139
|
+
conn = _get_db(db_path)
|
|
1140
|
+
|
|
1141
|
+
try:
|
|
1142
|
+
# --- Fetch application ---
|
|
1143
|
+
app_row = conn.execute(
|
|
1144
|
+
"SELECT * FROM legacy_applications WHERE id = ?", (app_id,)
|
|
1145
|
+
).fetchone()
|
|
1146
|
+
if app_row is None:
|
|
1147
|
+
raise ValueError(f"Application '{app_id}' not found.")
|
|
1148
|
+
app = dict(app_row)
|
|
1149
|
+
|
|
1150
|
+
# --- Fetch latest assessment ---
|
|
1151
|
+
assess_row = conn.execute(
|
|
1152
|
+
"SELECT * FROM migration_assessments WHERE legacy_app_id = ? "
|
|
1153
|
+
"ORDER BY rowid DESC LIMIT 1", (app_id,)
|
|
1154
|
+
).fetchone()
|
|
1155
|
+
if assess_row is None:
|
|
1156
|
+
raise ValueError(
|
|
1157
|
+
f"No assessment found for '{app_id}'. Run seven_r_assessor.py first."
|
|
1158
|
+
)
|
|
1159
|
+
assessment = dict(assess_row)
|
|
1160
|
+
|
|
1161
|
+
# --- Component count ---
|
|
1162
|
+
comp_count_row = conn.execute(
|
|
1163
|
+
"SELECT COUNT(*) AS cnt FROM legacy_components WHERE legacy_app_id = ?",
|
|
1164
|
+
(app_id,),
|
|
1165
|
+
).fetchone()
|
|
1166
|
+
comp_count = comp_count_row["cnt"] if comp_count_row else 0
|
|
1167
|
+
|
|
1168
|
+
finally:
|
|
1169
|
+
conn.close()
|
|
1170
|
+
|
|
1171
|
+
# --- Derived values ---
|
|
1172
|
+
recommended = assessment.get("recommended_strategy", "N/A")
|
|
1173
|
+
risk_score = assessment.get("risk_score", 0.0) or 0.0
|
|
1174
|
+
risk_level = _risk_label(risk_score)
|
|
1175
|
+
cost_hours = assessment.get("cost_estimate_hours", 0) or 0
|
|
1176
|
+
timeline_weeks = assessment.get("timeline_weeks", 0) or 0
|
|
1177
|
+
ato_impact = assessment.get("ato_impact", "N/A")
|
|
1178
|
+
ato_weeks = STRATEGY_ATO_WEEKS.get(recommended, 0)
|
|
1179
|
+
|
|
1180
|
+
evidence = _safe_json_loads(assessment.get("evidence"))
|
|
1181
|
+
strategy_scores = evidence.get("strategy_scores", {})
|
|
1182
|
+
fitness_results = evidence.get("fitness_results", {})
|
|
1183
|
+
|
|
1184
|
+
# --- Build report ---
|
|
1185
|
+
lines = []
|
|
1186
|
+
|
|
1187
|
+
lines.append(f"# Executive Summary: {app.get('name', app_id)}")
|
|
1188
|
+
lines.append("")
|
|
1189
|
+
lines.append(f"**Report Date:** {_now_iso()}")
|
|
1190
|
+
lines.append(f"**Classification:** {CUI_BANNER_TEXT}")
|
|
1191
|
+
lines.append(f"**Application ID:** {app_id}")
|
|
1192
|
+
lines.append("")
|
|
1193
|
+
lines.append("---")
|
|
1194
|
+
lines.append("")
|
|
1195
|
+
|
|
1196
|
+
# --- High-Level Overview ---
|
|
1197
|
+
lines.append("## Overview")
|
|
1198
|
+
lines.append("")
|
|
1199
|
+
lines.append(
|
|
1200
|
+
f"**{app.get('name', app_id)}** is a {app.get('app_type', 'N/A')} application "
|
|
1201
|
+
f"built with {app.get('primary_language', 'N/A')} "
|
|
1202
|
+
f"{app.get('language_version', '')} / {app.get('framework', 'N/A')} "
|
|
1203
|
+
f"{app.get('framework_version', '')}. "
|
|
1204
|
+
f"It comprises {_format_number(app.get('loc_total'))} lines of code across "
|
|
1205
|
+
f"{_format_number(app.get('file_count'))} files with {comp_count} components."
|
|
1206
|
+
)
|
|
1207
|
+
lines.append("")
|
|
1208
|
+
lines.append("| Metric | Value |")
|
|
1209
|
+
lines.append("|---------------------|--------------------|")
|
|
1210
|
+
lines.append(f"| Recommended Strategy| **{recommended.upper()}** |")
|
|
1211
|
+
lines.append(f"| Estimated Cost | {_format_number(cost_hours)} hours |")
|
|
1212
|
+
lines.append(f"| Timeline | {timeline_weeks} weeks (+{ato_weeks} ATO) |")
|
|
1213
|
+
lines.append(f"| Risk Level | {risk_level} ({risk_score:.2f}) |")
|
|
1214
|
+
lines.append(f"| ATO Impact | {ato_impact.upper()} |")
|
|
1215
|
+
lines.append(f"| Maintainability | {_format_number(app.get('maintainability_index'))} |")
|
|
1216
|
+
lines.append(f"| Tech Debt | {_format_number(app.get('tech_debt_hours'))} hours |")
|
|
1217
|
+
lines.append("")
|
|
1218
|
+
lines.append("---")
|
|
1219
|
+
lines.append("")
|
|
1220
|
+
|
|
1221
|
+
# --- Decision Matrix (compact) ---
|
|
1222
|
+
lines.append("## Decision Matrix")
|
|
1223
|
+
lines.append("")
|
|
1224
|
+
lines.append("| Strategy | Score | Cost (hrs) | Time (wks) | Risk |")
|
|
1225
|
+
lines.append("|--------------|--------|------------|------------|---------|")
|
|
1226
|
+
|
|
1227
|
+
strategy_names = [
|
|
1228
|
+
("rehost", "Rehost"), ("replatform", "Replatform"),
|
|
1229
|
+
("refactor", "Refactor"), ("rearchitect", "Rearchitect"),
|
|
1230
|
+
("repurchase", "Repurchase"), ("retire", "Retire"),
|
|
1231
|
+
("retain", "Retain"),
|
|
1232
|
+
]
|
|
1233
|
+
for sid, sname in strategy_names:
|
|
1234
|
+
score_key = f"{sid}_score"
|
|
1235
|
+
score_val = assessment.get(score_key, 0.0) or 0.0
|
|
1236
|
+
# Approximate cost scaling for each strategy relative to recommended
|
|
1237
|
+
if sid == recommended:
|
|
1238
|
+
s_cost = cost_hours
|
|
1239
|
+
s_time = timeline_weeks
|
|
1240
|
+
else:
|
|
1241
|
+
ratio = (score_val / max(assessment.get(f"{recommended}_score", 0.0) or 1.0, 0.01))
|
|
1242
|
+
s_cost = int(cost_hours * max(0.5, 2.0 - ratio))
|
|
1243
|
+
s_time = max(2, int(timeline_weeks * max(0.5, 2.0 - ratio)))
|
|
1244
|
+
s_risk = _risk_label(risk_score * max(0.5, 2.0 - score_val))
|
|
1245
|
+
marker = " **" if sid == recommended else ""
|
|
1246
|
+
end_marker = "**" if sid == recommended else ""
|
|
1247
|
+
lines.append(
|
|
1248
|
+
f"| {marker}{sname}{end_marker} | {score_val:.4f} | "
|
|
1249
|
+
f"{_format_number(s_cost)} | {s_time} | {s_risk} |"
|
|
1250
|
+
)
|
|
1251
|
+
lines.append("")
|
|
1252
|
+
lines.append("---")
|
|
1253
|
+
lines.append("")
|
|
1254
|
+
|
|
1255
|
+
# --- Key Findings ---
|
|
1256
|
+
lines.append("## Key Findings")
|
|
1257
|
+
lines.append("")
|
|
1258
|
+
|
|
1259
|
+
findings = []
|
|
1260
|
+
|
|
1261
|
+
# Finding 1: Strategy recommendation
|
|
1262
|
+
findings.append(
|
|
1263
|
+
f"The **{recommended.upper()}** strategy scored highest at "
|
|
1264
|
+
f"{assessment.get(recommended + '_score', 0.0):.4f}, "
|
|
1265
|
+
f"indicating the best fit for this application's profile and constraints."
|
|
1266
|
+
)
|
|
1267
|
+
|
|
1268
|
+
# Finding 2: Complexity / maintainability
|
|
1269
|
+
maint = app.get("maintainability_index", 0) or 0
|
|
1270
|
+
app.get("complexity_score", 0) or 0
|
|
1271
|
+
if maint < 30:
|
|
1272
|
+
findings.append(
|
|
1273
|
+
f"Maintainability index is **{maint:.1f}** (poor). The codebase presents "
|
|
1274
|
+
"significant technical debt that will increase migration effort and risk."
|
|
1275
|
+
)
|
|
1276
|
+
elif maint > 60:
|
|
1277
|
+
findings.append(
|
|
1278
|
+
f"Maintainability index is **{maint:.1f}** (good). The codebase is "
|
|
1279
|
+
"well-structured, which reduces migration risk and effort."
|
|
1280
|
+
)
|
|
1281
|
+
else:
|
|
1282
|
+
findings.append(
|
|
1283
|
+
f"Maintainability index is **{maint:.1f}** (moderate). Some refactoring "
|
|
1284
|
+
"of high-complexity components is advisable before or during migration."
|
|
1285
|
+
)
|
|
1286
|
+
|
|
1287
|
+
# Finding 3: ATO impact
|
|
1288
|
+
if ato_impact in ("high", "critical"):
|
|
1289
|
+
findings.append(
|
|
1290
|
+
f"ATO impact is **{ato_impact.upper()}**, adding approximately "
|
|
1291
|
+
f"{ato_weeks} weeks for compliance work. Coordinate with ISSM early."
|
|
1292
|
+
)
|
|
1293
|
+
elif ato_impact == "none":
|
|
1294
|
+
findings.append(
|
|
1295
|
+
"ATO impact is **NONE**. The existing authorization boundary "
|
|
1296
|
+
"is unaffected by this migration strategy."
|
|
1297
|
+
)
|
|
1298
|
+
|
|
1299
|
+
# Finding 4: Tech debt
|
|
1300
|
+
tech_debt = app.get("tech_debt_hours", 0) or 0
|
|
1301
|
+
if tech_debt > 500:
|
|
1302
|
+
findings.append(
|
|
1303
|
+
f"Technical debt is estimated at **{tech_debt:.0f} hours**. "
|
|
1304
|
+
"Consider allocating dedicated sprints for debt reduction."
|
|
1305
|
+
)
|
|
1306
|
+
|
|
1307
|
+
# Finding 5: Close scores
|
|
1308
|
+
if strategy_scores:
|
|
1309
|
+
sorted_scores = sorted(strategy_scores.items(), key=lambda x: x[1], reverse=True)
|
|
1310
|
+
if len(sorted_scores) >= 2:
|
|
1311
|
+
top_score = sorted_scores[0][1]
|
|
1312
|
+
second_score = sorted_scores[1][1]
|
|
1313
|
+
delta = top_score - second_score
|
|
1314
|
+
if delta < 0.05:
|
|
1315
|
+
findings.append(
|
|
1316
|
+
f"The margin between top strategies is narrow ({delta:.4f}). "
|
|
1317
|
+
"Manual review of business context and team capacity is recommended "
|
|
1318
|
+
"before finalizing the strategy."
|
|
1319
|
+
)
|
|
1320
|
+
|
|
1321
|
+
for idx, finding in enumerate(findings[:5], 1):
|
|
1322
|
+
lines.append(f"{idx}. {finding}")
|
|
1323
|
+
lines.append("")
|
|
1324
|
+
lines.append("---")
|
|
1325
|
+
lines.append("")
|
|
1326
|
+
|
|
1327
|
+
# --- Recommendation ---
|
|
1328
|
+
lines.append("## Recommendation")
|
|
1329
|
+
lines.append("")
|
|
1330
|
+
|
|
1331
|
+
rec_fitness = fitness_results.get(recommended, {})
|
|
1332
|
+
strengths = [k for k, v in rec_fitness.items() if v >= 0.8]
|
|
1333
|
+
weaknesses = [k for k, v in rec_fitness.items() if v <= 0.2]
|
|
1334
|
+
|
|
1335
|
+
lines.append(
|
|
1336
|
+
f"We recommend proceeding with the **{recommended.upper()}** strategy for "
|
|
1337
|
+
f"**{app.get('name', app_id)}**. This strategy provides the optimal balance "
|
|
1338
|
+
f"of cost ({_format_number(cost_hours)} hours), timeline ({timeline_weeks} weeks), "
|
|
1339
|
+
f"and risk ({risk_level}) given the application's technical profile."
|
|
1340
|
+
)
|
|
1341
|
+
lines.append("")
|
|
1342
|
+
if strengths:
|
|
1343
|
+
lines.append(
|
|
1344
|
+
f"The application demonstrates strong fitness in: "
|
|
1345
|
+
f"{', '.join(s.replace('_', ' ') for s in strengths)}."
|
|
1346
|
+
)
|
|
1347
|
+
if weaknesses:
|
|
1348
|
+
lines.append(
|
|
1349
|
+
f"Areas requiring attention: "
|
|
1350
|
+
f"{', '.join(w.replace('_', ' ') for w in weaknesses)}."
|
|
1351
|
+
)
|
|
1352
|
+
lines.append("")
|
|
1353
|
+
|
|
1354
|
+
content = "\n".join(lines)
|
|
1355
|
+
filepath = out_dir / f"executive_summary_{app_id}.md"
|
|
1356
|
+
return _write_report(filepath, content)
|
|
1357
|
+
|
|
1358
|
+
|
|
1359
|
+
# ============================================================================
|
|
1360
|
+
# 5. Generate All Reports
|
|
1361
|
+
# ============================================================================
|
|
1362
|
+
|
|
1363
|
+
def generate_all_reports(app_id, plan_id=None, pi_number=None,
|
|
1364
|
+
output_dir=".", db_path=None):
|
|
1365
|
+
"""Generate all applicable migration reports.
|
|
1366
|
+
|
|
1367
|
+
Always generates: assessment report, executive summary.
|
|
1368
|
+
If plan_id is provided: also generates progress report and ATO impact report.
|
|
1369
|
+
Finally generates a report_index.md linking all generated reports.
|
|
1370
|
+
|
|
1371
|
+
Args:
|
|
1372
|
+
app_id: Legacy application ID.
|
|
1373
|
+
plan_id: Optional migration plan ID.
|
|
1374
|
+
pi_number: Optional PI number for progress report.
|
|
1375
|
+
output_dir: Directory to write reports (default: current dir).
|
|
1376
|
+
db_path: Optional database path override.
|
|
1377
|
+
|
|
1378
|
+
Returns:
|
|
1379
|
+
dict: Mapping of report type to absolute file path, plus 'index' key.
|
|
1380
|
+
"""
|
|
1381
|
+
out_dir = _ensure_dir(output_dir)
|
|
1382
|
+
results = {}
|
|
1383
|
+
errors = {}
|
|
1384
|
+
|
|
1385
|
+
# --- Always generate assessment and executive summary ---
|
|
1386
|
+
try:
|
|
1387
|
+
results["assessment"] = generate_assessment_report(
|
|
1388
|
+
app_id, output_dir=str(out_dir), db_path=db_path
|
|
1389
|
+
)
|
|
1390
|
+
except Exception as exc:
|
|
1391
|
+
errors["assessment"] = str(exc)
|
|
1392
|
+
|
|
1393
|
+
try:
|
|
1394
|
+
results["executive"] = generate_executive_summary(
|
|
1395
|
+
app_id, output_dir=str(out_dir), db_path=db_path
|
|
1396
|
+
)
|
|
1397
|
+
except Exception as exc:
|
|
1398
|
+
errors["executive"] = str(exc)
|
|
1399
|
+
|
|
1400
|
+
# --- Conditionally generate plan-based reports ---
|
|
1401
|
+
if plan_id:
|
|
1402
|
+
try:
|
|
1403
|
+
results["progress"] = generate_progress_report(
|
|
1404
|
+
plan_id, pi_number=pi_number, output_dir=str(out_dir),
|
|
1405
|
+
db_path=db_path
|
|
1406
|
+
)
|
|
1407
|
+
except Exception as exc:
|
|
1408
|
+
errors["progress"] = str(exc)
|
|
1409
|
+
|
|
1410
|
+
try:
|
|
1411
|
+
results["ato_impact"] = generate_ato_impact_report(
|
|
1412
|
+
plan_id, output_dir=str(out_dir), db_path=db_path
|
|
1413
|
+
)
|
|
1414
|
+
except Exception as exc:
|
|
1415
|
+
errors["ato_impact"] = str(exc)
|
|
1416
|
+
|
|
1417
|
+
# --- Generate report index ---
|
|
1418
|
+
index_lines = []
|
|
1419
|
+
index_lines.append("# Migration Report Index")
|
|
1420
|
+
index_lines.append("")
|
|
1421
|
+
index_lines.append(f"**Application ID:** {app_id}")
|
|
1422
|
+
if plan_id:
|
|
1423
|
+
index_lines.append(f"**Plan ID:** {plan_id}")
|
|
1424
|
+
if pi_number:
|
|
1425
|
+
index_lines.append(f"**Program Increment:** {pi_number}")
|
|
1426
|
+
index_lines.append(f"**Generated:** {_now_iso()}")
|
|
1427
|
+
index_lines.append(f"**Classification:** {CUI_BANNER_TEXT}")
|
|
1428
|
+
index_lines.append("")
|
|
1429
|
+
index_lines.append("---")
|
|
1430
|
+
index_lines.append("")
|
|
1431
|
+
index_lines.append("## Reports")
|
|
1432
|
+
index_lines.append("")
|
|
1433
|
+
|
|
1434
|
+
report_labels = {
|
|
1435
|
+
"assessment": "7R Assessment Report",
|
|
1436
|
+
"executive": "Executive Summary",
|
|
1437
|
+
"progress": "Migration Progress Report",
|
|
1438
|
+
"ato_impact": "ATO Impact Report",
|
|
1439
|
+
}
|
|
1440
|
+
|
|
1441
|
+
for key in ["assessment", "executive", "progress", "ato_impact"]:
|
|
1442
|
+
label = report_labels.get(key, key)
|
|
1443
|
+
if key in results:
|
|
1444
|
+
filename = Path(results[key]).name
|
|
1445
|
+
index_lines.append(f"- [{label}]({filename})")
|
|
1446
|
+
elif key in errors:
|
|
1447
|
+
index_lines.append(f"- {label} -- **FAILED:** {errors[key]}")
|
|
1448
|
+
|
|
1449
|
+
index_lines.append("")
|
|
1450
|
+
|
|
1451
|
+
if errors:
|
|
1452
|
+
index_lines.append("## Errors")
|
|
1453
|
+
index_lines.append("")
|
|
1454
|
+
for key, err in errors.items():
|
|
1455
|
+
index_lines.append(f"- **{report_labels.get(key, key)}:** {err}")
|
|
1456
|
+
index_lines.append("")
|
|
1457
|
+
|
|
1458
|
+
index_content = "\n".join(index_lines)
|
|
1459
|
+
index_path = out_dir / "report_index.md"
|
|
1460
|
+
results["index"] = _write_report(index_path, index_content)
|
|
1461
|
+
|
|
1462
|
+
return results
|
|
1463
|
+
|
|
1464
|
+
|
|
1465
|
+
# ============================================================================
|
|
1466
|
+
# CLI entry point
|
|
1467
|
+
# ============================================================================
|
|
1468
|
+
|
|
1469
|
+
def main():
|
|
1470
|
+
"""CLI entry point for the migration report generator.
|
|
1471
|
+
|
|
1472
|
+
Supports generation of individual report types or all reports at once.
|
|
1473
|
+
Outputs file paths on success; optional --json flag for machine-readable
|
|
1474
|
+
output.
|
|
1475
|
+
"""
|
|
1476
|
+
parser = argparse.ArgumentParser(
|
|
1477
|
+
description=(
|
|
1478
|
+
"Migration Report Generator -- Produces CUI-marked reports for "
|
|
1479
|
+
"7R assessments, migration progress, ATO impact, and executive "
|
|
1480
|
+
"summaries within the ICDEV DoD modernization system."
|
|
1481
|
+
),
|
|
1482
|
+
epilog=textwrap.dedent("""\
|
|
1483
|
+
Examples:
|
|
1484
|
+
%(prog)s --app-id A-001 --type assessment
|
|
1485
|
+
%(prog)s --plan-id MP-001 --type progress --pi PI-3
|
|
1486
|
+
%(prog)s --plan-id MP-001 --type ato-impact
|
|
1487
|
+
%(prog)s --app-id A-001 --type executive
|
|
1488
|
+
%(prog)s --app-id A-001 --plan-id MP-001 --type all --output-dir ./reports
|
|
1489
|
+
|
|
1490
|
+
Classification: CUI // SP-CTI
|
|
1491
|
+
"""),
|
|
1492
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
1493
|
+
)
|
|
1494
|
+
parser.add_argument(
|
|
1495
|
+
"--app-id",
|
|
1496
|
+
default=None,
|
|
1497
|
+
help="Legacy application ID (required for assessment, executive, all).",
|
|
1498
|
+
)
|
|
1499
|
+
parser.add_argument(
|
|
1500
|
+
"--plan-id",
|
|
1501
|
+
default=None,
|
|
1502
|
+
help="Migration plan ID (required for progress, ato-impact).",
|
|
1503
|
+
)
|
|
1504
|
+
parser.add_argument(
|
|
1505
|
+
"--pi",
|
|
1506
|
+
default=None,
|
|
1507
|
+
dest="pi_number",
|
|
1508
|
+
help="Program Increment number for progress reports (optional).",
|
|
1509
|
+
)
|
|
1510
|
+
parser.add_argument(
|
|
1511
|
+
"--output-dir",
|
|
1512
|
+
default=".",
|
|
1513
|
+
help="Directory to write generated report files (default: current dir).",
|
|
1514
|
+
)
|
|
1515
|
+
parser.add_argument(
|
|
1516
|
+
"--type",
|
|
1517
|
+
choices=["assessment", "progress", "ato-impact", "executive", "all"],
|
|
1518
|
+
default="all",
|
|
1519
|
+
dest="report_type",
|
|
1520
|
+
help="Type of report to generate (default: all).",
|
|
1521
|
+
)
|
|
1522
|
+
parser.add_argument(
|
|
1523
|
+
"--json",
|
|
1524
|
+
action="store_true",
|
|
1525
|
+
dest="json_output",
|
|
1526
|
+
help="Output result as JSON (file paths and metadata).",
|
|
1527
|
+
)
|
|
1528
|
+
parser.add_argument(
|
|
1529
|
+
"--db-path",
|
|
1530
|
+
default=None,
|
|
1531
|
+
help="Override path to icdev.db database.",
|
|
1532
|
+
)
|
|
1533
|
+
|
|
1534
|
+
args = parser.parse_args()
|
|
1535
|
+
|
|
1536
|
+
# --- Validate required arguments per report type ---
|
|
1537
|
+
if args.report_type in ("assessment", "executive"):
|
|
1538
|
+
if not args.app_id:
|
|
1539
|
+
parser.error(f"--app-id is required for --type {args.report_type}")
|
|
1540
|
+
|
|
1541
|
+
if args.report_type in ("progress", "ato-impact"):
|
|
1542
|
+
if not args.plan_id:
|
|
1543
|
+
parser.error(f"--plan-id is required for --type {args.report_type}")
|
|
1544
|
+
|
|
1545
|
+
if args.report_type == "all":
|
|
1546
|
+
if not args.app_id:
|
|
1547
|
+
parser.error("--app-id is required for --type all")
|
|
1548
|
+
|
|
1549
|
+
# --- Generate requested report(s) ---
|
|
1550
|
+
try:
|
|
1551
|
+
if args.report_type == "assessment":
|
|
1552
|
+
filepath = generate_assessment_report(
|
|
1553
|
+
args.app_id, output_dir=args.output_dir, db_path=args.db_path
|
|
1554
|
+
)
|
|
1555
|
+
if args.json_output:
|
|
1556
|
+
print(json.dumps({
|
|
1557
|
+
"type": "assessment",
|
|
1558
|
+
"app_id": args.app_id,
|
|
1559
|
+
"file": filepath,
|
|
1560
|
+
"generated_at": _now_iso(),
|
|
1561
|
+
}, indent=2))
|
|
1562
|
+
else:
|
|
1563
|
+
print(f"Assessment report generated: {filepath}")
|
|
1564
|
+
|
|
1565
|
+
elif args.report_type == "progress":
|
|
1566
|
+
filepath = generate_progress_report(
|
|
1567
|
+
args.plan_id, pi_number=args.pi_number,
|
|
1568
|
+
output_dir=args.output_dir, db_path=args.db_path
|
|
1569
|
+
)
|
|
1570
|
+
if args.json_output:
|
|
1571
|
+
print(json.dumps({
|
|
1572
|
+
"type": "progress",
|
|
1573
|
+
"plan_id": args.plan_id,
|
|
1574
|
+
"pi_number": args.pi_number,
|
|
1575
|
+
"file": filepath,
|
|
1576
|
+
"generated_at": _now_iso(),
|
|
1577
|
+
}, indent=2))
|
|
1578
|
+
else:
|
|
1579
|
+
print(f"Progress report generated: {filepath}")
|
|
1580
|
+
|
|
1581
|
+
elif args.report_type == "ato-impact":
|
|
1582
|
+
filepath = generate_ato_impact_report(
|
|
1583
|
+
args.plan_id, output_dir=args.output_dir, db_path=args.db_path
|
|
1584
|
+
)
|
|
1585
|
+
if args.json_output:
|
|
1586
|
+
print(json.dumps({
|
|
1587
|
+
"type": "ato-impact",
|
|
1588
|
+
"plan_id": args.plan_id,
|
|
1589
|
+
"file": filepath,
|
|
1590
|
+
"generated_at": _now_iso(),
|
|
1591
|
+
}, indent=2))
|
|
1592
|
+
else:
|
|
1593
|
+
print(f"ATO impact report generated: {filepath}")
|
|
1594
|
+
|
|
1595
|
+
elif args.report_type == "executive":
|
|
1596
|
+
filepath = generate_executive_summary(
|
|
1597
|
+
args.app_id, output_dir=args.output_dir, db_path=args.db_path
|
|
1598
|
+
)
|
|
1599
|
+
if args.json_output:
|
|
1600
|
+
print(json.dumps({
|
|
1601
|
+
"type": "executive",
|
|
1602
|
+
"app_id": args.app_id,
|
|
1603
|
+
"file": filepath,
|
|
1604
|
+
"generated_at": _now_iso(),
|
|
1605
|
+
}, indent=2))
|
|
1606
|
+
else:
|
|
1607
|
+
print(f"Executive summary generated: {filepath}")
|
|
1608
|
+
|
|
1609
|
+
elif args.report_type == "all":
|
|
1610
|
+
results = generate_all_reports(
|
|
1611
|
+
args.app_id, plan_id=args.plan_id, pi_number=args.pi_number,
|
|
1612
|
+
output_dir=args.output_dir, db_path=args.db_path
|
|
1613
|
+
)
|
|
1614
|
+
if args.json_output:
|
|
1615
|
+
print(json.dumps({
|
|
1616
|
+
"type": "all",
|
|
1617
|
+
"app_id": args.app_id,
|
|
1618
|
+
"plan_id": args.plan_id,
|
|
1619
|
+
"pi_number": args.pi_number,
|
|
1620
|
+
"reports": results,
|
|
1621
|
+
"report_count": len(results),
|
|
1622
|
+
"generated_at": _now_iso(),
|
|
1623
|
+
}, indent=2))
|
|
1624
|
+
else:
|
|
1625
|
+
print(f"Migration reports generated for application: {args.app_id}")
|
|
1626
|
+
print(f"Output directory: {args.output_dir}")
|
|
1627
|
+
print(f"Reports generated: {len(results)}")
|
|
1628
|
+
for rtype, rpath in results.items():
|
|
1629
|
+
print(f" {rtype}: {rpath}")
|
|
1630
|
+
|
|
1631
|
+
except FileNotFoundError as exc:
|
|
1632
|
+
if args.json_output:
|
|
1633
|
+
print(json.dumps({"error": str(exc)}, indent=2))
|
|
1634
|
+
else:
|
|
1635
|
+
print(f"Error: {exc}", file=sys.stderr)
|
|
1636
|
+
sys.exit(1)
|
|
1637
|
+
except ValueError as exc:
|
|
1638
|
+
if args.json_output:
|
|
1639
|
+
print(json.dumps({"error": str(exc)}, indent=2))
|
|
1640
|
+
else:
|
|
1641
|
+
print(f"Error: {exc}", file=sys.stderr)
|
|
1642
|
+
sys.exit(1)
|
|
1643
|
+
except Exception as exc:
|
|
1644
|
+
if args.json_output:
|
|
1645
|
+
print(json.dumps({"error": str(exc)}, indent=2))
|
|
1646
|
+
else:
|
|
1647
|
+
print(f"Unexpected error: {exc}", file=sys.stderr)
|
|
1648
|
+
sys.exit(2)
|
|
1649
|
+
|
|
1650
|
+
|
|
1651
|
+
if __name__ == "__main__":
|
|
1652
|
+
main()
|
|
1653
|
+
# [TEMPLATE: CUI // SP-CTI]
|