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,915 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# CUI // SP-CTI
|
|
3
|
+
"""Dashboard API: Contract Performance Management Portal (Phase 60).
|
|
4
|
+
|
|
5
|
+
Post-award contract lifecycle — EVM, CDRL, CPARS, subcontractors, COR portal.
|
|
6
|
+
Bridges tools/govcon/ CPMP tools into the Flask dashboard.
|
|
7
|
+
|
|
8
|
+
Integration points:
|
|
9
|
+
contract_manager.py → Contracts, CLINs, WBS, Deliverables CRUD
|
|
10
|
+
portfolio_manager.py → Portfolio summary, health scoring, transition bridge
|
|
11
|
+
evm_engine.py → ANSI/EIA-748 calculations, Monte Carlo
|
|
12
|
+
cpars_predictor.py → Deterministic weighted CPARS scoring
|
|
13
|
+
subcontractor_tracker.py → FAR 52.219-9, ISR/SSR
|
|
14
|
+
negative_event_tracker.py → NDAA event-based tracking
|
|
15
|
+
cdrl_generator.py → CDRL auto-generation via ICDEV tools
|
|
16
|
+
sam_contract_sync.py → SAM.gov Contract Awards API
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import json
|
|
20
|
+
import os
|
|
21
|
+
import sqlite3
|
|
22
|
+
import sys
|
|
23
|
+
import uuid
|
|
24
|
+
from datetime import datetime, timezone
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
|
|
27
|
+
from flask import Blueprint, g, jsonify, request
|
|
28
|
+
|
|
29
|
+
from icdev.tools.dashboard.auth import require_role
|
|
30
|
+
from icdev._paths import get_project_root
|
|
31
|
+
|
|
32
|
+
BASE_DIR = get_project_root()
|
|
33
|
+
if str(BASE_DIR) not in sys.path:
|
|
34
|
+
sys.path.insert(0, str(BASE_DIR))
|
|
35
|
+
|
|
36
|
+
DB_PATH = Path(os.environ.get("ICDEV_DB_PATH", str(BASE_DIR / "data" / "icdev.db")))
|
|
37
|
+
|
|
38
|
+
cpmp_api = Blueprint("cpmp_api", __name__, url_prefix="/api/cpmp")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _get_db():
|
|
42
|
+
conn = sqlite3.connect(str(DB_PATH))
|
|
43
|
+
conn.row_factory = sqlite3.Row
|
|
44
|
+
conn.execute("PRAGMA journal_mode=WAL")
|
|
45
|
+
conn.execute("PRAGMA foreign_keys=ON")
|
|
46
|
+
return conn
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _now():
|
|
50
|
+
return datetime.now(timezone.utc).isoformat()
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _uuid():
|
|
54
|
+
return str(uuid.uuid4())
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _audit(conn, action, details="", actor="cpmp_api"):
|
|
58
|
+
try:
|
|
59
|
+
conn.execute(
|
|
60
|
+
"INSERT INTO audit_trail (id, timestamp, event_type, actor, action, details, session_id) "
|
|
61
|
+
"VALUES (?, ?, ?, ?, ?, ?, ?)",
|
|
62
|
+
(_uuid(), _now(), "cpmp.api", actor, action, details, "cpmp"),
|
|
63
|
+
)
|
|
64
|
+
except Exception:
|
|
65
|
+
pass
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _cor_access_log(conn, user_id, contract_id, action):
|
|
69
|
+
try:
|
|
70
|
+
conn.execute(
|
|
71
|
+
"INSERT INTO cpmp_cor_access_log (id, user_id, contract_id, action, accessed_at, classification) "
|
|
72
|
+
"VALUES (?, ?, ?, ?, ?, ?)",
|
|
73
|
+
(_uuid(), user_id, contract_id, action, _now(), "CUI // SP-CTI"),
|
|
74
|
+
)
|
|
75
|
+
except Exception:
|
|
76
|
+
pass
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# =====================================================================
|
|
80
|
+
# Phase A — Contracts CRUD
|
|
81
|
+
# =====================================================================
|
|
82
|
+
|
|
83
|
+
@cpmp_api.route("/contracts", methods=["GET"])
|
|
84
|
+
def list_contracts():
|
|
85
|
+
"""GET /api/cpmp/contracts — List contracts with optional filters."""
|
|
86
|
+
try:
|
|
87
|
+
from icdev.tools.govcon.contract_manager import list_contracts as _list
|
|
88
|
+
status = request.args.get("status")
|
|
89
|
+
agency = request.args.get("agency")
|
|
90
|
+
limit = int(request.args.get("limit", 50))
|
|
91
|
+
result = _list(status=status, limit=limit)
|
|
92
|
+
return jsonify(result)
|
|
93
|
+
except Exception as e:
|
|
94
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
@cpmp_api.route("/contracts", methods=["POST"])
|
|
98
|
+
def create_contract():
|
|
99
|
+
"""POST /api/cpmp/contracts — Create a new contract."""
|
|
100
|
+
try:
|
|
101
|
+
from icdev.tools.govcon.contract_manager import create_contract as _create
|
|
102
|
+
data = request.get_json(silent=True) or {}
|
|
103
|
+
result = _create(data)
|
|
104
|
+
return jsonify(result), 201 if result.get("status") == "ok" else 400
|
|
105
|
+
except Exception as e:
|
|
106
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@cpmp_api.route("/contracts/<contract_id>", methods=["GET"])
|
|
110
|
+
def get_contract(contract_id):
|
|
111
|
+
"""GET /api/cpmp/contracts/<id> — Get contract details."""
|
|
112
|
+
try:
|
|
113
|
+
from icdev.tools.govcon.contract_manager import get_contract as _get
|
|
114
|
+
result = _get(contract_id)
|
|
115
|
+
if result.get("status") == "error":
|
|
116
|
+
return jsonify(result), 404
|
|
117
|
+
return jsonify(result)
|
|
118
|
+
except Exception as e:
|
|
119
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
@cpmp_api.route("/contracts/<contract_id>", methods=["PUT"])
|
|
123
|
+
def update_contract(contract_id):
|
|
124
|
+
"""PUT /api/cpmp/contracts/<id> — Update contract fields."""
|
|
125
|
+
try:
|
|
126
|
+
from icdev.tools.govcon.contract_manager import update_contract as _update
|
|
127
|
+
data = request.get_json(silent=True) or {}
|
|
128
|
+
result = _update(contract_id, data)
|
|
129
|
+
if result.get("status") == "error":
|
|
130
|
+
return jsonify(result), 404
|
|
131
|
+
return jsonify(result)
|
|
132
|
+
except Exception as e:
|
|
133
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
@cpmp_api.route("/contracts/<contract_id>/status", methods=["PUT"])
|
|
137
|
+
def transition_contract(contract_id):
|
|
138
|
+
"""PUT /api/cpmp/contracts/<id>/status — Transition contract status."""
|
|
139
|
+
try:
|
|
140
|
+
from icdev.tools.govcon.contract_manager import transition_contract as _transition
|
|
141
|
+
data = request.get_json(silent=True) or {}
|
|
142
|
+
new_status = data.get("status")
|
|
143
|
+
changed_by = data.get("changed_by")
|
|
144
|
+
reason = data.get("reason")
|
|
145
|
+
if not new_status:
|
|
146
|
+
return jsonify({"status": "error", "message": "status required"}), 400
|
|
147
|
+
result = _transition(contract_id, new_status, changed_by, reason)
|
|
148
|
+
if result.get("status") == "error":
|
|
149
|
+
return jsonify(result), 400
|
|
150
|
+
return jsonify(result)
|
|
151
|
+
except Exception as e:
|
|
152
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
# =====================================================================
|
|
156
|
+
# Phase A — CLINs
|
|
157
|
+
# =====================================================================
|
|
158
|
+
|
|
159
|
+
@cpmp_api.route("/contracts/<contract_id>/clins", methods=["GET"])
|
|
160
|
+
def list_clins(contract_id):
|
|
161
|
+
"""GET /api/cpmp/contracts/<id>/clins — List CLINs for a contract."""
|
|
162
|
+
try:
|
|
163
|
+
from icdev.tools.govcon.contract_manager import list_clins as _list
|
|
164
|
+
result = _list(contract_id)
|
|
165
|
+
return jsonify(result)
|
|
166
|
+
except Exception as e:
|
|
167
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
@cpmp_api.route("/contracts/<contract_id>/clins", methods=["POST"])
|
|
171
|
+
def create_clin(contract_id):
|
|
172
|
+
"""POST /api/cpmp/contracts/<id>/clins — Create a CLIN."""
|
|
173
|
+
try:
|
|
174
|
+
from icdev.tools.govcon.contract_manager import create_clin as _create
|
|
175
|
+
data = request.get_json(silent=True) or {}
|
|
176
|
+
result = _create(contract_id, data)
|
|
177
|
+
return jsonify(result), 201 if result.get("status") == "ok" else 400
|
|
178
|
+
except Exception as e:
|
|
179
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
@cpmp_api.route("/clins/<clin_id>", methods=["PUT"])
|
|
183
|
+
def update_clin(clin_id):
|
|
184
|
+
"""PUT /api/cpmp/clins/<id> — Update a CLIN."""
|
|
185
|
+
try:
|
|
186
|
+
from icdev.tools.govcon.contract_manager import update_clin as _update
|
|
187
|
+
data = request.get_json(silent=True) or {}
|
|
188
|
+
result = _update(clin_id, data)
|
|
189
|
+
if result.get("status") == "error":
|
|
190
|
+
return jsonify(result), 404
|
|
191
|
+
return jsonify(result)
|
|
192
|
+
except Exception as e:
|
|
193
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
# =====================================================================
|
|
197
|
+
# Phase A — WBS
|
|
198
|
+
# =====================================================================
|
|
199
|
+
|
|
200
|
+
@cpmp_api.route("/contracts/<contract_id>/wbs", methods=["GET"])
|
|
201
|
+
def list_wbs(contract_id):
|
|
202
|
+
"""GET /api/cpmp/contracts/<id>/wbs — List WBS elements (flat or tree)."""
|
|
203
|
+
try:
|
|
204
|
+
from icdev.tools.govcon.contract_manager import list_wbs as _list, build_wbs_tree as _tree
|
|
205
|
+
tree = request.args.get("tree", "").lower() == "true"
|
|
206
|
+
if tree:
|
|
207
|
+
result = _tree(contract_id)
|
|
208
|
+
else:
|
|
209
|
+
result = _list(contract_id)
|
|
210
|
+
return jsonify(result)
|
|
211
|
+
except Exception as e:
|
|
212
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
@cpmp_api.route("/contracts/<contract_id>/wbs", methods=["POST"])
|
|
216
|
+
def create_wbs(contract_id):
|
|
217
|
+
"""POST /api/cpmp/contracts/<id>/wbs — Create a WBS element."""
|
|
218
|
+
try:
|
|
219
|
+
from icdev.tools.govcon.contract_manager import create_wbs as _create
|
|
220
|
+
data = request.get_json(silent=True) or {}
|
|
221
|
+
result = _create(contract_id, data)
|
|
222
|
+
return jsonify(result), 201 if result.get("status") == "ok" else 400
|
|
223
|
+
except Exception as e:
|
|
224
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
@cpmp_api.route("/wbs/<wbs_id>", methods=["PUT"])
|
|
228
|
+
def update_wbs(wbs_id):
|
|
229
|
+
"""PUT /api/cpmp/wbs/<id> — Update a WBS element."""
|
|
230
|
+
try:
|
|
231
|
+
from icdev.tools.govcon.contract_manager import update_wbs as _update
|
|
232
|
+
data = request.get_json(silent=True) or {}
|
|
233
|
+
result = _update(wbs_id, data)
|
|
234
|
+
if result.get("status") == "error":
|
|
235
|
+
return jsonify(result), 404
|
|
236
|
+
return jsonify(result)
|
|
237
|
+
except Exception as e:
|
|
238
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
# =====================================================================
|
|
242
|
+
# Phase A — Deliverables
|
|
243
|
+
# =====================================================================
|
|
244
|
+
|
|
245
|
+
@cpmp_api.route("/contracts/<contract_id>/deliverables", methods=["GET"])
|
|
246
|
+
def list_deliverables(contract_id):
|
|
247
|
+
"""GET /api/cpmp/contracts/<id>/deliverables — List deliverables."""
|
|
248
|
+
try:
|
|
249
|
+
from icdev.tools.govcon.contract_manager import list_deliverables as _list
|
|
250
|
+
status = request.args.get("status")
|
|
251
|
+
result = _list(contract_id, status=status)
|
|
252
|
+
return jsonify(result)
|
|
253
|
+
except Exception as e:
|
|
254
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
@cpmp_api.route("/contracts/<contract_id>/deliverables", methods=["POST"])
|
|
258
|
+
def create_deliverable(contract_id):
|
|
259
|
+
"""POST /api/cpmp/contracts/<id>/deliverables — Create a deliverable."""
|
|
260
|
+
try:
|
|
261
|
+
from icdev.tools.govcon.contract_manager import create_deliverable as _create
|
|
262
|
+
data = request.get_json(silent=True) or {}
|
|
263
|
+
result = _create(contract_id, data)
|
|
264
|
+
return jsonify(result), 201 if result.get("status") == "ok" else 400
|
|
265
|
+
except Exception as e:
|
|
266
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
@cpmp_api.route("/deliverables/<deliverable_id>", methods=["GET"])
|
|
270
|
+
def get_deliverable(deliverable_id):
|
|
271
|
+
"""GET /api/cpmp/deliverables/<id> — Get deliverable with generations/history."""
|
|
272
|
+
try:
|
|
273
|
+
from icdev.tools.govcon.contract_manager import get_deliverable as _get
|
|
274
|
+
result = _get(deliverable_id)
|
|
275
|
+
if result.get("status") == "error":
|
|
276
|
+
return jsonify(result), 404
|
|
277
|
+
return jsonify(result)
|
|
278
|
+
except Exception as e:
|
|
279
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
@cpmp_api.route("/deliverables/<deliverable_id>", methods=["PUT"])
|
|
283
|
+
def update_deliverable(deliverable_id):
|
|
284
|
+
"""PUT /api/cpmp/deliverables/<id> — Update deliverable fields."""
|
|
285
|
+
try:
|
|
286
|
+
from icdev.tools.govcon.contract_manager import update_deliverable as _update
|
|
287
|
+
data = request.get_json(silent=True) or {}
|
|
288
|
+
result = _update(deliverable_id, data)
|
|
289
|
+
if result.get("status") == "error":
|
|
290
|
+
return jsonify(result), 404
|
|
291
|
+
return jsonify(result)
|
|
292
|
+
except Exception as e:
|
|
293
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
@cpmp_api.route("/deliverables/<deliverable_id>/status", methods=["PUT"])
|
|
297
|
+
def transition_deliverable(deliverable_id):
|
|
298
|
+
"""PUT /api/cpmp/deliverables/<id>/status — Transition deliverable status."""
|
|
299
|
+
try:
|
|
300
|
+
from icdev.tools.govcon.contract_manager import transition_deliverable as _transition
|
|
301
|
+
data = request.get_json(silent=True) or {}
|
|
302
|
+
new_status = data.get("status")
|
|
303
|
+
changed_by = data.get("changed_by")
|
|
304
|
+
reason = data.get("reason")
|
|
305
|
+
if not new_status:
|
|
306
|
+
return jsonify({"status": "error", "message": "status required"}), 400
|
|
307
|
+
result = _transition(deliverable_id, new_status, changed_by, reason)
|
|
308
|
+
if result.get("status") == "error":
|
|
309
|
+
return jsonify(result), 400
|
|
310
|
+
return jsonify(result)
|
|
311
|
+
except Exception as e:
|
|
312
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
# =====================================================================
|
|
316
|
+
# Phase A — Portfolio + Transition
|
|
317
|
+
# =====================================================================
|
|
318
|
+
|
|
319
|
+
@cpmp_api.route("/portfolio", methods=["GET"])
|
|
320
|
+
def get_portfolio():
|
|
321
|
+
"""GET /api/cpmp/portfolio — Portfolio dashboard summary."""
|
|
322
|
+
try:
|
|
323
|
+
from icdev.tools.govcon.portfolio_manager import get_portfolio_summary
|
|
324
|
+
result = get_portfolio_summary()
|
|
325
|
+
return jsonify(result)
|
|
326
|
+
except Exception as e:
|
|
327
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
@cpmp_api.route("/from-opportunity/<opp_id>", methods=["POST"])
|
|
331
|
+
def transition_from_opportunity(opp_id):
|
|
332
|
+
"""POST /api/cpmp/from-opportunity/<opp_id> — Create contract from won proposal."""
|
|
333
|
+
try:
|
|
334
|
+
from icdev.tools.govcon.portfolio_manager import transition_from_opportunity
|
|
335
|
+
data = request.get_json(silent=True) or {}
|
|
336
|
+
result = transition_from_opportunity(opp_id, created_by=data.get("created_by"))
|
|
337
|
+
if result.get("status") == "error":
|
|
338
|
+
return jsonify(result), 400
|
|
339
|
+
return jsonify(result), 201
|
|
340
|
+
except Exception as e:
|
|
341
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
# =====================================================================
|
|
345
|
+
# Phase B — EVM
|
|
346
|
+
# =====================================================================
|
|
347
|
+
|
|
348
|
+
@cpmp_api.route("/contracts/<contract_id>/evm", methods=["GET"])
|
|
349
|
+
def get_evm(contract_id):
|
|
350
|
+
"""GET /api/cpmp/contracts/<id>/evm — Aggregated contract-level EVM."""
|
|
351
|
+
try:
|
|
352
|
+
from icdev.tools.govcon.evm_engine import aggregate_contract_evm
|
|
353
|
+
result = aggregate_contract_evm(contract_id)
|
|
354
|
+
return jsonify(result)
|
|
355
|
+
except Exception as e:
|
|
356
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
@cpmp_api.route("/contracts/<contract_id>/evm", methods=["POST"])
|
|
360
|
+
def record_evm_period(contract_id):
|
|
361
|
+
"""POST /api/cpmp/contracts/<id>/evm — Record an EVM period snapshot."""
|
|
362
|
+
try:
|
|
363
|
+
from icdev.tools.govcon.evm_engine import record_period
|
|
364
|
+
data = request.get_json(silent=True) or {}
|
|
365
|
+
wbs_id = data.get("wbs_id")
|
|
366
|
+
period_date = data.get("period_date")
|
|
367
|
+
pv = data.get("pv", 0)
|
|
368
|
+
ev = data.get("ev", 0)
|
|
369
|
+
ac = data.get("ac", 0)
|
|
370
|
+
source = data.get("source", "manual")
|
|
371
|
+
if not wbs_id or not period_date:
|
|
372
|
+
return jsonify({"status": "error", "message": "wbs_id and period_date required"}), 400
|
|
373
|
+
result = record_period(contract_id, wbs_id, period_date, pv, ev, ac, source)
|
|
374
|
+
if result.get("status") == "error":
|
|
375
|
+
return jsonify(result), 400
|
|
376
|
+
return jsonify(result), 201
|
|
377
|
+
except Exception as e:
|
|
378
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
@cpmp_api.route("/contracts/<contract_id>/evm/forecast", methods=["GET"])
|
|
382
|
+
def evm_forecast(contract_id):
|
|
383
|
+
"""GET /api/cpmp/contracts/<id>/evm/forecast — Monte Carlo EAC forecast."""
|
|
384
|
+
try:
|
|
385
|
+
from icdev.tools.govcon.evm_engine import forecast_monte_carlo
|
|
386
|
+
iterations = int(request.args.get("iterations", 10000))
|
|
387
|
+
result = forecast_monte_carlo(contract_id, iterations)
|
|
388
|
+
return jsonify(result)
|
|
389
|
+
except Exception as e:
|
|
390
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
@cpmp_api.route("/contracts/<contract_id>/evm/scurve", methods=["GET"])
|
|
394
|
+
def evm_scurve(contract_id):
|
|
395
|
+
"""GET /api/cpmp/contracts/<id>/evm/scurve — S-curve chart data."""
|
|
396
|
+
try:
|
|
397
|
+
from icdev.tools.govcon.evm_engine import generate_scurve_data
|
|
398
|
+
result = generate_scurve_data(contract_id)
|
|
399
|
+
return jsonify(result)
|
|
400
|
+
except Exception as e:
|
|
401
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
@cpmp_api.route("/contracts/<contract_id>/evm/ipmdar", methods=["GET"])
|
|
405
|
+
def evm_ipmdar(contract_id):
|
|
406
|
+
"""GET /api/cpmp/contracts/<id>/evm/ipmdar — IPMDAR-compatible data."""
|
|
407
|
+
try:
|
|
408
|
+
from icdev.tools.govcon.evm_engine import generate_ipmdar_data
|
|
409
|
+
result = generate_ipmdar_data(contract_id)
|
|
410
|
+
return jsonify(result)
|
|
411
|
+
except Exception as e:
|
|
412
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
@cpmp_api.route("/contracts/<contract_id>/evm/periods", methods=["GET"])
|
|
416
|
+
def evm_periods(contract_id):
|
|
417
|
+
"""GET /api/cpmp/contracts/<id>/evm/periods — List EVM period records."""
|
|
418
|
+
try:
|
|
419
|
+
from icdev.tools.govcon.evm_engine import get_evm_periods
|
|
420
|
+
wbs_id = request.args.get("wbs_id")
|
|
421
|
+
result = get_evm_periods(contract_id, wbs_id)
|
|
422
|
+
return jsonify(result)
|
|
423
|
+
except Exception as e:
|
|
424
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
# =====================================================================
|
|
428
|
+
# Phase B — Subcontractors
|
|
429
|
+
# =====================================================================
|
|
430
|
+
|
|
431
|
+
@cpmp_api.route("/contracts/<contract_id>/subcontractors", methods=["GET"])
|
|
432
|
+
def list_subcontractors(contract_id):
|
|
433
|
+
"""GET /api/cpmp/contracts/<id>/subcontractors — List subcontractors."""
|
|
434
|
+
try:
|
|
435
|
+
from icdev.tools.govcon.subcontractor_tracker import list_subcontractors as _list
|
|
436
|
+
business_size = request.args.get("business_size")
|
|
437
|
+
result = _list(contract_id, business_size=business_size)
|
|
438
|
+
return jsonify(result)
|
|
439
|
+
except Exception as e:
|
|
440
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
@cpmp_api.route("/contracts/<contract_id>/subcontractors", methods=["POST"])
|
|
444
|
+
def create_subcontractor(contract_id):
|
|
445
|
+
"""POST /api/cpmp/contracts/<id>/subcontractors — Add a subcontractor."""
|
|
446
|
+
try:
|
|
447
|
+
from icdev.tools.govcon.subcontractor_tracker import create_subcontractor as _create
|
|
448
|
+
data = request.get_json(silent=True) or {}
|
|
449
|
+
result = _create(contract_id, data)
|
|
450
|
+
return jsonify(result), 201 if result.get("status") == "ok" else 400
|
|
451
|
+
except Exception as e:
|
|
452
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
@cpmp_api.route("/subcontractors/<sub_id>", methods=["PUT"])
|
|
456
|
+
def update_subcontractor(sub_id):
|
|
457
|
+
"""PUT /api/cpmp/subcontractors/<id> — Update subcontractor."""
|
|
458
|
+
try:
|
|
459
|
+
from icdev.tools.govcon.subcontractor_tracker import update_subcontractor as _update
|
|
460
|
+
data = request.get_json(silent=True) or {}
|
|
461
|
+
result = _update(sub_id, data)
|
|
462
|
+
if result.get("status") == "error":
|
|
463
|
+
return jsonify(result), 404
|
|
464
|
+
return jsonify(result)
|
|
465
|
+
except Exception as e:
|
|
466
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
467
|
+
|
|
468
|
+
|
|
469
|
+
@cpmp_api.route("/contracts/<contract_id>/subcontractors/noncompliance", methods=["GET"])
|
|
470
|
+
def subcontractor_noncompliance(contract_id):
|
|
471
|
+
"""GET /api/cpmp/contracts/<id>/subcontractors/noncompliance — Detect noncompliance."""
|
|
472
|
+
try:
|
|
473
|
+
from icdev.tools.govcon.subcontractor_tracker import detect_noncompliance
|
|
474
|
+
result = detect_noncompliance(contract_id)
|
|
475
|
+
return jsonify(result)
|
|
476
|
+
except Exception as e:
|
|
477
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
@cpmp_api.route("/contracts/<contract_id>/sb-compliance", methods=["GET"])
|
|
481
|
+
def sb_compliance(contract_id):
|
|
482
|
+
"""GET /api/cpmp/contracts/<id>/sb-compliance — Small business compliance."""
|
|
483
|
+
try:
|
|
484
|
+
from icdev.tools.govcon.subcontractor_tracker import compute_sb_compliance
|
|
485
|
+
result = compute_sb_compliance(contract_id)
|
|
486
|
+
return jsonify(result)
|
|
487
|
+
except Exception as e:
|
|
488
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
# =====================================================================
|
|
492
|
+
# Phase B — Small Business Plans (ISR/SSR)
|
|
493
|
+
# =====================================================================
|
|
494
|
+
|
|
495
|
+
@cpmp_api.route("/contracts/<contract_id>/small-business", methods=["GET"])
|
|
496
|
+
def list_sb_reports(contract_id):
|
|
497
|
+
"""GET /api/cpmp/contracts/<id>/small-business — List ISR/SSR reports."""
|
|
498
|
+
try:
|
|
499
|
+
from icdev.tools.govcon.subcontractor_tracker import list_sb_reports as _list
|
|
500
|
+
result = _list(contract_id)
|
|
501
|
+
return jsonify(result)
|
|
502
|
+
except Exception as e:
|
|
503
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
@cpmp_api.route("/contracts/<contract_id>/small-business", methods=["POST"])
|
|
507
|
+
def create_sb_report(contract_id):
|
|
508
|
+
"""POST /api/cpmp/contracts/<id>/small-business — Create ISR/SSR report."""
|
|
509
|
+
try:
|
|
510
|
+
from icdev.tools.govcon.subcontractor_tracker import create_sb_report as _create
|
|
511
|
+
data = request.get_json(silent=True) or {}
|
|
512
|
+
period = data.get("period")
|
|
513
|
+
report_type = data.get("type", "isr")
|
|
514
|
+
if not period:
|
|
515
|
+
return jsonify({"status": "error", "message": "period required"}), 400
|
|
516
|
+
result = _create(contract_id, period, report_type)
|
|
517
|
+
return jsonify(result), 201 if result.get("status") == "ok" else 400
|
|
518
|
+
except Exception as e:
|
|
519
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
520
|
+
|
|
521
|
+
|
|
522
|
+
# =====================================================================
|
|
523
|
+
# Phase B — CPARS
|
|
524
|
+
# =====================================================================
|
|
525
|
+
|
|
526
|
+
@cpmp_api.route("/contracts/<contract_id>/cpars", methods=["GET"])
|
|
527
|
+
def list_cpars(contract_id):
|
|
528
|
+
"""GET /api/cpmp/contracts/<id>/cpars — List CPARS assessments."""
|
|
529
|
+
try:
|
|
530
|
+
from icdev.tools.govcon.cpars_predictor import list_assessments as _list
|
|
531
|
+
result = _list(contract_id)
|
|
532
|
+
return jsonify(result)
|
|
533
|
+
except Exception as e:
|
|
534
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
535
|
+
|
|
536
|
+
|
|
537
|
+
@cpmp_api.route("/contracts/<contract_id>/cpars", methods=["POST"])
|
|
538
|
+
def create_cpars(contract_id):
|
|
539
|
+
"""POST /api/cpmp/contracts/<id>/cpars — Create CPARS assessment."""
|
|
540
|
+
try:
|
|
541
|
+
from icdev.tools.govcon.cpars_predictor import create_assessment as _create
|
|
542
|
+
data = request.get_json(silent=True) or {}
|
|
543
|
+
period_start = data.get("period_start")
|
|
544
|
+
period_end = data.get("period_end")
|
|
545
|
+
if not period_start or not period_end:
|
|
546
|
+
return jsonify({"status": "error", "message": "period_start and period_end required"}), 400
|
|
547
|
+
result = _create(contract_id, period_start, period_end, data)
|
|
548
|
+
return jsonify(result), 201 if result.get("status") == "ok" else 400
|
|
549
|
+
except Exception as e:
|
|
550
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
@cpmp_api.route("/cpars/<assessment_id>", methods=["PUT"])
|
|
554
|
+
def update_cpars(assessment_id):
|
|
555
|
+
"""PUT /api/cpmp/cpars/<id> — Update CPARS assessment."""
|
|
556
|
+
try:
|
|
557
|
+
from icdev.tools.govcon.cpars_predictor import update_assessment as _update
|
|
558
|
+
data = request.get_json(silent=True) or {}
|
|
559
|
+
result = _update(assessment_id, data)
|
|
560
|
+
if result.get("status") == "error":
|
|
561
|
+
return jsonify(result), 404
|
|
562
|
+
return jsonify(result)
|
|
563
|
+
except Exception as e:
|
|
564
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
565
|
+
|
|
566
|
+
|
|
567
|
+
@cpmp_api.route("/contracts/<contract_id>/cpars/predict", methods=["GET"])
|
|
568
|
+
def predict_cpars(contract_id):
|
|
569
|
+
"""GET /api/cpmp/contracts/<id>/cpars/predict — Predictive CPARS score."""
|
|
570
|
+
try:
|
|
571
|
+
from icdev.tools.govcon.cpars_predictor import predict_cpars as _predict
|
|
572
|
+
result = _predict(contract_id)
|
|
573
|
+
return jsonify(result)
|
|
574
|
+
except Exception as e:
|
|
575
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
576
|
+
|
|
577
|
+
|
|
578
|
+
@cpmp_api.route("/contracts/<contract_id>/cpars/trend", methods=["GET"])
|
|
579
|
+
def cpars_trend(contract_id):
|
|
580
|
+
"""GET /api/cpmp/contracts/<id>/cpars/trend — CPARS score trend."""
|
|
581
|
+
try:
|
|
582
|
+
from icdev.tools.govcon.cpars_predictor import get_cpars_trend as _trend
|
|
583
|
+
result = _trend(contract_id)
|
|
584
|
+
return jsonify(result)
|
|
585
|
+
except Exception as e:
|
|
586
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
587
|
+
|
|
588
|
+
|
|
589
|
+
# =====================================================================
|
|
590
|
+
# Phase B — Negative Events
|
|
591
|
+
# =====================================================================
|
|
592
|
+
|
|
593
|
+
@cpmp_api.route("/contracts/<contract_id>/negative-events", methods=["GET"])
|
|
594
|
+
def list_negative_events(contract_id):
|
|
595
|
+
"""GET /api/cpmp/contracts/<id>/negative-events — List negative events."""
|
|
596
|
+
try:
|
|
597
|
+
from icdev.tools.govcon.negative_event_tracker import list_events as _list
|
|
598
|
+
severity = request.args.get("severity")
|
|
599
|
+
status = request.args.get("status")
|
|
600
|
+
result = _list(contract_id, severity=severity, status=status)
|
|
601
|
+
return jsonify(result)
|
|
602
|
+
except Exception as e:
|
|
603
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
604
|
+
|
|
605
|
+
|
|
606
|
+
@cpmp_api.route("/contracts/<contract_id>/negative-events", methods=["POST"])
|
|
607
|
+
def record_negative_event(contract_id):
|
|
608
|
+
"""POST /api/cpmp/contracts/<id>/negative-events — Record a negative event."""
|
|
609
|
+
try:
|
|
610
|
+
from icdev.tools.govcon.negative_event_tracker import record_event as _record
|
|
611
|
+
data = request.get_json(silent=True) or {}
|
|
612
|
+
data["contract_id"] = contract_id
|
|
613
|
+
result = _record(contract_id, data)
|
|
614
|
+
return jsonify(result), 201 if result.get("status") == "ok" else 400
|
|
615
|
+
except Exception as e:
|
|
616
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
617
|
+
|
|
618
|
+
|
|
619
|
+
@cpmp_api.route("/negative-events/<event_id>", methods=["PUT"])
|
|
620
|
+
def update_negative_event(event_id):
|
|
621
|
+
"""PUT /api/cpmp/negative-events/<id> — Update corrective action status."""
|
|
622
|
+
try:
|
|
623
|
+
from icdev.tools.govcon.negative_event_tracker import update_corrective_action as _update
|
|
624
|
+
data = request.get_json(silent=True) or {}
|
|
625
|
+
ca_status = data.get("corrective_action_status")
|
|
626
|
+
if not ca_status:
|
|
627
|
+
return jsonify({"status": "error", "message": "corrective_action_status required"}), 400
|
|
628
|
+
result = _update(event_id, ca_status)
|
|
629
|
+
if result.get("status") == "error":
|
|
630
|
+
return jsonify(result), 404
|
|
631
|
+
return jsonify(result)
|
|
632
|
+
except Exception as e:
|
|
633
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
634
|
+
|
|
635
|
+
|
|
636
|
+
@cpmp_api.route("/contracts/<contract_id>/negative-events/auto-detect", methods=["POST"])
|
|
637
|
+
def auto_detect_events(contract_id):
|
|
638
|
+
"""POST /api/cpmp/contracts/<id>/negative-events/auto-detect — Run auto-detection."""
|
|
639
|
+
try:
|
|
640
|
+
from icdev.tools.govcon.negative_event_tracker import auto_detect_all as _detect
|
|
641
|
+
result = _detect(contract_id)
|
|
642
|
+
return jsonify(result)
|
|
643
|
+
except Exception as e:
|
|
644
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
645
|
+
|
|
646
|
+
|
|
647
|
+
@cpmp_api.route("/contracts/<contract_id>/negative-events/ndaa-thresholds", methods=["GET"])
|
|
648
|
+
def ndaa_thresholds(contract_id):
|
|
649
|
+
"""GET /api/cpmp/contracts/<id>/negative-events/ndaa-thresholds — Check NDAA thresholds."""
|
|
650
|
+
try:
|
|
651
|
+
from icdev.tools.govcon.negative_event_tracker import check_ndaa_thresholds
|
|
652
|
+
result = check_ndaa_thresholds(contract_id)
|
|
653
|
+
return jsonify(result)
|
|
654
|
+
except Exception as e:
|
|
655
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
656
|
+
|
|
657
|
+
|
|
658
|
+
# =====================================================================
|
|
659
|
+
# Phase B — Health
|
|
660
|
+
# =====================================================================
|
|
661
|
+
|
|
662
|
+
@cpmp_api.route("/contracts/<contract_id>/health", methods=["GET"])
|
|
663
|
+
def contract_health(contract_id):
|
|
664
|
+
"""GET /api/cpmp/contracts/<id>/health — Compute contract health score."""
|
|
665
|
+
try:
|
|
666
|
+
from icdev.tools.govcon.portfolio_manager import compute_contract_health
|
|
667
|
+
result = compute_contract_health(contract_id)
|
|
668
|
+
return jsonify(result)
|
|
669
|
+
except Exception as e:
|
|
670
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
671
|
+
|
|
672
|
+
|
|
673
|
+
# =====================================================================
|
|
674
|
+
# Phase C — CDRL Generation
|
|
675
|
+
# =====================================================================
|
|
676
|
+
|
|
677
|
+
@cpmp_api.route("/contracts/<contract_id>/generate-cdrl/<deliverable_id>", methods=["POST"])
|
|
678
|
+
def generate_cdrl(contract_id, deliverable_id):
|
|
679
|
+
"""POST /api/cpmp/contracts/<id>/generate-cdrl/<did> — Generate CDRL."""
|
|
680
|
+
try:
|
|
681
|
+
from icdev.tools.govcon.cdrl_generator import generate_cdrl as _generate
|
|
682
|
+
data = request.get_json(silent=True) or {}
|
|
683
|
+
project_id = data.get("project_id")
|
|
684
|
+
result = _generate(deliverable_id, project_id)
|
|
685
|
+
return jsonify(result)
|
|
686
|
+
except Exception as e:
|
|
687
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
688
|
+
|
|
689
|
+
|
|
690
|
+
@cpmp_api.route("/contracts/<contract_id>/generate-due", methods=["POST"])
|
|
691
|
+
def generate_due_cdrls(contract_id):
|
|
692
|
+
"""POST /api/cpmp/contracts/<id>/generate-due — Generate all due CDRLs."""
|
|
693
|
+
try:
|
|
694
|
+
from icdev.tools.govcon.cdrl_generator import generate_all_due as _generate
|
|
695
|
+
data = request.get_json(silent=True) or {}
|
|
696
|
+
days_ahead = data.get("days_ahead")
|
|
697
|
+
result = _generate(contract_id, days_ahead)
|
|
698
|
+
return jsonify(result)
|
|
699
|
+
except Exception as e:
|
|
700
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
701
|
+
|
|
702
|
+
|
|
703
|
+
@cpmp_api.route("/cdrl-generations", methods=["GET"])
|
|
704
|
+
def list_cdrl_generations():
|
|
705
|
+
"""GET /api/cpmp/cdrl-generations — List CDRL generation records."""
|
|
706
|
+
try:
|
|
707
|
+
from icdev.tools.govcon.cdrl_generator import list_generations as _list
|
|
708
|
+
contract_id = request.args.get("contract_id")
|
|
709
|
+
deliverable_id = request.args.get("deliverable_id")
|
|
710
|
+
status = request.args.get("status")
|
|
711
|
+
result = _list(contract_id, deliverable_id, status)
|
|
712
|
+
return jsonify(result)
|
|
713
|
+
except Exception as e:
|
|
714
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
715
|
+
|
|
716
|
+
|
|
717
|
+
# =====================================================================
|
|
718
|
+
# Phase C — SAM.gov Contract Awards
|
|
719
|
+
# =====================================================================
|
|
720
|
+
|
|
721
|
+
@cpmp_api.route("/sam/sync-awards", methods=["POST"])
|
|
722
|
+
def sync_sam_awards():
|
|
723
|
+
"""POST /api/cpmp/sam/sync-awards — Sync awards from SAM.gov."""
|
|
724
|
+
try:
|
|
725
|
+
from icdev.tools.govcon.sam_contract_sync import sync_awards
|
|
726
|
+
data = request.get_json(silent=True) or {}
|
|
727
|
+
lookback_days = data.get("lookback_days")
|
|
728
|
+
result = sync_awards(lookback_days)
|
|
729
|
+
return jsonify(result)
|
|
730
|
+
except Exception as e:
|
|
731
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
732
|
+
|
|
733
|
+
|
|
734
|
+
@cpmp_api.route("/sam/awards", methods=["GET"])
|
|
735
|
+
def list_sam_awards():
|
|
736
|
+
"""GET /api/cpmp/sam/awards — List cached SAM.gov awards."""
|
|
737
|
+
try:
|
|
738
|
+
from icdev.tools.govcon.sam_contract_sync import list_awards
|
|
739
|
+
linked_only = request.args.get("linked_only", "").lower() == "true"
|
|
740
|
+
limit = int(request.args.get("limit", 50))
|
|
741
|
+
result = list_awards(linked_only, limit)
|
|
742
|
+
return jsonify(result)
|
|
743
|
+
except Exception as e:
|
|
744
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
745
|
+
|
|
746
|
+
|
|
747
|
+
@cpmp_api.route("/sam/awards/search", methods=["GET"])
|
|
748
|
+
def search_sam_awards():
|
|
749
|
+
"""GET /api/cpmp/sam/awards/search?q=keyword — Search awards."""
|
|
750
|
+
try:
|
|
751
|
+
from icdev.tools.govcon.sam_contract_sync import search_awards
|
|
752
|
+
query = request.args.get("q", "")
|
|
753
|
+
if not query:
|
|
754
|
+
return jsonify({"status": "error", "message": "q parameter required"}), 400
|
|
755
|
+
result = search_awards(query)
|
|
756
|
+
return jsonify(result)
|
|
757
|
+
except Exception as e:
|
|
758
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
759
|
+
|
|
760
|
+
|
|
761
|
+
@cpmp_api.route("/sam/link/<sam_award_id>", methods=["POST"])
|
|
762
|
+
def link_sam_award(sam_award_id):
|
|
763
|
+
"""POST /api/cpmp/sam/link/<sam_award_id> — Link SAM award to contract."""
|
|
764
|
+
try:
|
|
765
|
+
from icdev.tools.govcon.sam_contract_sync import link_award_to_contract
|
|
766
|
+
data = request.get_json(silent=True) or {}
|
|
767
|
+
contract_id = data.get("contract_id")
|
|
768
|
+
if not contract_id:
|
|
769
|
+
return jsonify({"status": "error", "message": "contract_id required"}), 400
|
|
770
|
+
result = link_award_to_contract(sam_award_id, contract_id)
|
|
771
|
+
if result.get("status") == "error":
|
|
772
|
+
return jsonify(result), 404
|
|
773
|
+
return jsonify(result)
|
|
774
|
+
except Exception as e:
|
|
775
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
776
|
+
|
|
777
|
+
|
|
778
|
+
# =====================================================================
|
|
779
|
+
# Phase C — COR Portal (Read-Only)
|
|
780
|
+
# =====================================================================
|
|
781
|
+
|
|
782
|
+
def _get_cor_contracts(cor_email):
|
|
783
|
+
"""Get contracts where the COR email matches."""
|
|
784
|
+
conn = _get_db()
|
|
785
|
+
rows = conn.execute(
|
|
786
|
+
"SELECT * FROM cpmp_contracts WHERE cor_email = ? ORDER BY created_at DESC",
|
|
787
|
+
(cor_email,),
|
|
788
|
+
).fetchall()
|
|
789
|
+
conn.close()
|
|
790
|
+
return [dict(r) for r in rows]
|
|
791
|
+
|
|
792
|
+
|
|
793
|
+
# Hidden fields for COR view (from config)
|
|
794
|
+
COR_HIDDEN_FIELDS = {
|
|
795
|
+
"subcontractor_pricing", "internal_cost_details", "internal_notes",
|
|
796
|
+
"corrective_action_details", "billed_value", "ac_cumulative",
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
|
|
800
|
+
def _sanitize_for_cor(data):
|
|
801
|
+
"""Remove internal-only fields from data for COR view."""
|
|
802
|
+
if isinstance(data, dict):
|
|
803
|
+
return {k: _sanitize_for_cor(v) for k, v in data.items() if k not in COR_HIDDEN_FIELDS}
|
|
804
|
+
if isinstance(data, list):
|
|
805
|
+
return [_sanitize_for_cor(item) for item in data]
|
|
806
|
+
return data
|
|
807
|
+
|
|
808
|
+
|
|
809
|
+
@cpmp_api.route("/cor/contracts", methods=["GET"])
|
|
810
|
+
@require_role("admin", "pm", "isso", "co", "cor")
|
|
811
|
+
def cor_list_contracts():
|
|
812
|
+
"""GET /api/cpmp/cor/contracts — COR: list assigned contracts."""
|
|
813
|
+
try:
|
|
814
|
+
cor_email = g.current_user.get("email", "")
|
|
815
|
+
if not cor_email:
|
|
816
|
+
return jsonify({"status": "error", "message": "Authenticated user has no email"}), 400
|
|
817
|
+
conn = _get_db()
|
|
818
|
+
_cor_access_log(conn, cor_email, "all", "view_contracts")
|
|
819
|
+
conn.commit()
|
|
820
|
+
conn.close()
|
|
821
|
+
contracts = _get_cor_contracts(cor_email)
|
|
822
|
+
return jsonify({"status": "ok", "total": len(contracts), "contracts": _sanitize_for_cor(contracts)})
|
|
823
|
+
except Exception as e:
|
|
824
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
825
|
+
|
|
826
|
+
|
|
827
|
+
@cpmp_api.route("/cor/contracts/<contract_id>", methods=["GET"])
|
|
828
|
+
@require_role("admin", "pm", "isso", "co", "cor")
|
|
829
|
+
def cor_get_contract(contract_id):
|
|
830
|
+
"""GET /api/cpmp/cor/contracts/<id> — COR: view contract detail."""
|
|
831
|
+
try:
|
|
832
|
+
cor_email = g.current_user.get("email", "")
|
|
833
|
+
if not cor_email:
|
|
834
|
+
return jsonify({"status": "error", "message": "Authenticated user has no email"}), 400
|
|
835
|
+
# Verify COR is assigned to this contract
|
|
836
|
+
cor_contracts = _get_cor_contracts(cor_email)
|
|
837
|
+
if not any(c.get("id") == contract_id for c in cor_contracts):
|
|
838
|
+
return jsonify({"status": "error", "message": "Access denied: not assigned COR for this contract"}), 403
|
|
839
|
+
from icdev.tools.govcon.contract_manager import get_contract as _get
|
|
840
|
+
result = _get(contract_id)
|
|
841
|
+
if result.get("status") == "error":
|
|
842
|
+
return jsonify(result), 404
|
|
843
|
+
conn = _get_db()
|
|
844
|
+
_cor_access_log(conn, cor_email, contract_id, "view_contract")
|
|
845
|
+
conn.commit()
|
|
846
|
+
conn.close()
|
|
847
|
+
return jsonify(_sanitize_for_cor(result))
|
|
848
|
+
except Exception as e:
|
|
849
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
850
|
+
|
|
851
|
+
|
|
852
|
+
@cpmp_api.route("/cor/contracts/<contract_id>/deliverables", methods=["GET"])
|
|
853
|
+
@require_role("admin", "pm", "isso", "co", "cor")
|
|
854
|
+
def cor_list_deliverables(contract_id):
|
|
855
|
+
"""GET /api/cpmp/cor/contracts/<id>/deliverables — COR: view deliverables."""
|
|
856
|
+
try:
|
|
857
|
+
cor_email = g.current_user.get("email", "")
|
|
858
|
+
if not cor_email:
|
|
859
|
+
return jsonify({"status": "error", "message": "Authenticated user has no email"}), 400
|
|
860
|
+
cor_contracts = _get_cor_contracts(cor_email)
|
|
861
|
+
if not any(c.get("id") == contract_id for c in cor_contracts):
|
|
862
|
+
return jsonify({"status": "error", "message": "Access denied: not assigned COR for this contract"}), 403
|
|
863
|
+
from icdev.tools.govcon.contract_manager import list_deliverables as _list
|
|
864
|
+
result = _list(contract_id)
|
|
865
|
+
conn = _get_db()
|
|
866
|
+
_cor_access_log(conn, cor_email, contract_id, "view_deliverables")
|
|
867
|
+
conn.commit()
|
|
868
|
+
conn.close()
|
|
869
|
+
return jsonify(_sanitize_for_cor(result))
|
|
870
|
+
except Exception as e:
|
|
871
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
872
|
+
|
|
873
|
+
|
|
874
|
+
@cpmp_api.route("/cor/contracts/<contract_id>/evm", methods=["GET"])
|
|
875
|
+
@require_role("admin", "pm", "isso", "co", "cor")
|
|
876
|
+
def cor_get_evm(contract_id):
|
|
877
|
+
"""GET /api/cpmp/cor/contracts/<id>/evm — COR: view EVM data."""
|
|
878
|
+
try:
|
|
879
|
+
cor_email = g.current_user.get("email", "")
|
|
880
|
+
if not cor_email:
|
|
881
|
+
return jsonify({"status": "error", "message": "Authenticated user has no email"}), 400
|
|
882
|
+
cor_contracts = _get_cor_contracts(cor_email)
|
|
883
|
+
if not any(c.get("id") == contract_id for c in cor_contracts):
|
|
884
|
+
return jsonify({"status": "error", "message": "Access denied: not assigned COR for this contract"}), 403
|
|
885
|
+
from icdev.tools.govcon.evm_engine import aggregate_contract_evm
|
|
886
|
+
result = aggregate_contract_evm(contract_id)
|
|
887
|
+
conn = _get_db()
|
|
888
|
+
_cor_access_log(conn, cor_email, contract_id, "view_evm")
|
|
889
|
+
conn.commit()
|
|
890
|
+
conn.close()
|
|
891
|
+
return jsonify(_sanitize_for_cor(result))
|
|
892
|
+
except Exception as e:
|
|
893
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|
|
894
|
+
|
|
895
|
+
|
|
896
|
+
@cpmp_api.route("/cor/contracts/<contract_id>/cpars", methods=["GET"])
|
|
897
|
+
@require_role("admin", "pm", "isso", "co", "cor")
|
|
898
|
+
def cor_get_cpars(contract_id):
|
|
899
|
+
"""GET /api/cpmp/cor/contracts/<id>/cpars — COR: view CPARS ratings."""
|
|
900
|
+
try:
|
|
901
|
+
cor_email = g.current_user.get("email", "")
|
|
902
|
+
if not cor_email:
|
|
903
|
+
return jsonify({"status": "error", "message": "Authenticated user has no email"}), 400
|
|
904
|
+
cor_contracts = _get_cor_contracts(cor_email)
|
|
905
|
+
if not any(c.get("id") == contract_id for c in cor_contracts):
|
|
906
|
+
return jsonify({"status": "error", "message": "Access denied: not assigned COR for this contract"}), 403
|
|
907
|
+
from icdev.tools.govcon.cpars_predictor import list_assessments as _list
|
|
908
|
+
result = _list(contract_id)
|
|
909
|
+
conn = _get_db()
|
|
910
|
+
_cor_access_log(conn, cor_email, contract_id, "view_cpars")
|
|
911
|
+
conn.commit()
|
|
912
|
+
conn.close()
|
|
913
|
+
return jsonify(_sanitize_for_cor(result))
|
|
914
|
+
except Exception as e:
|
|
915
|
+
return jsonify({"status": "error", "message": str(e)}), 500
|