icdev 0.0.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1214) hide show
  1. args/agent_config.yaml +113 -0
  2. args/audit_regimes/cisa_sbd.json +381 -0
  3. args/audit_regimes/cmmc_l2.json +906 -0
  4. args/audit_regimes/dod_cssp.json +393 -0
  5. args/audit_regimes/dodi_5000_87.json +297 -0
  6. args/audit_regimes/fedramp_moderate.json +650 -0
  7. args/audit_regimes/ieee_1012.json +373 -0
  8. args/audit_regimes/nist_800_171.json +624 -0
  9. args/audit_regimes/nist_800_53.json +907 -0
  10. args/cloudforge_blueprints/aws_commercial.yaml +29 -0
  11. args/cloudforge_blueprints/aws_govcloud_il4.yaml +34 -0
  12. args/cloudforge_blueprints/aws_govcloud_il5.yaml +38 -0
  13. args/cloudforge_blueprints/azure_commercial.yaml +28 -0
  14. args/cloudforge_blueprints/azure_gov_il4.yaml +32 -0
  15. args/cloudforge_blueprints/azure_gov_il5.yaml +36 -0
  16. args/cloudforge_blueprints/gcp_commercial.yaml +28 -0
  17. args/cloudforge_blueprints/oci_commercial.yaml +28 -0
  18. args/cloudforge_config.yaml +231 -0
  19. args/cloudforge_runbook_templates/backup_verify.yaml +98 -0
  20. args/cloudforge_runbook_templates/dr_failover.yaml +107 -0
  21. args/cloudforge_runbook_templates/health_check.yaml +97 -0
  22. args/cloudforge_runbook_templates/incident_response.yaml +101 -0
  23. args/cloudforge_runbook_templates/migration_cutover.yaml +105 -0
  24. args/cloudforge_runbook_templates/patch_rollout.yaml +92 -0
  25. args/cloudforge_runbook_templates/zone_provision.yaml +93 -0
  26. args/code_pattern_config.yaml +151 -0
  27. args/code_quality_config.yaml +47 -0
  28. args/compliance_config.yaml +17 -0
  29. args/control_inheritance.yaml +177 -0
  30. args/csp_mcp_config.yaml +41 -0
  31. args/cui_markings.yaml +35 -0
  32. args/databridge_config.yaml +232 -0
  33. args/db_config.yaml +116 -0
  34. args/decision_tables/agent_trust_decision.yaml +143 -0
  35. args/decision_tables/ato_boundary_impact.yaml +132 -0
  36. args/decision_tables/deployment_approval.yaml +152 -0
  37. args/degradation_matrix.yaml +163 -0
  38. args/devsecops_config.yaml +286 -0
  39. args/endpoint_security_config.yaml +207 -0
  40. args/exit_criteria.yaml +102 -0
  41. args/feature_flags.yaml +235 -0
  42. args/file_access_tiers.yaml +88 -0
  43. args/forge_studio/blueprint_config.yaml +27 -0
  44. args/forge_studio/component_catalog.json +411 -0
  45. args/forge_studio/workflow_templates.yaml +103 -0
  46. args/govcon_config.yaml +41 -0
  47. args/harness_config.yaml +67 -0
  48. args/innovation_config.yaml +321 -0
  49. args/knowledge_graph_config.yaml +113 -0
  50. args/llm_config.yaml +222 -0
  51. args/marketplace_config.yaml +260 -0
  52. args/monitoring_config.yaml +127 -0
  53. args/mosa_config.yaml +190 -0
  54. args/observability_tracing_config.yaml +170 -0
  55. args/owasp_agentic_config.yaml +171 -0
  56. args/pipeline_gates.yaml +197 -0
  57. args/project_defaults.yaml +235 -0
  58. args/prompt_chains.yaml +163 -0
  59. args/rag_config.yaml +167 -0
  60. args/research_config.yaml +89 -0
  61. args/resilience_config.yaml +197 -0
  62. args/ricoas_config.yaml +191 -0
  63. args/security_gates.yaml +763 -0
  64. args/storage_config.yaml +63 -0
  65. args/writeguard_config.yaml +131 -0
  66. args/zta_config.yaml +247 -0
  67. context/__init__.py +6 -0
  68. context/agent/__init__.py +6 -0
  69. context/agent/response_schemas/__init__.py +6 -0
  70. context/agent/response_schemas/debate_position.json +46 -0
  71. context/agent/response_schemas/fitness_scorecard.json +74 -0
  72. context/agent/response_schemas/review_decision.json +39 -0
  73. context/agent/response_schemas/task_decomposition.json +82 -0
  74. context/agent/response_schemas/veto_decision.json +40 -0
  75. context/agentic/__init__.py +6 -0
  76. context/agentic/architecture_patterns.md +269 -0
  77. context/agentic/capability_registry.yaml +223 -0
  78. context/agentic/csp_integration.md +30 -0
  79. context/agentic/csp_mcp_registry.yaml +280 -0
  80. context/agentic/fitness_rubric.md +56 -0
  81. context/agentic/governance_baseline.md +205 -0
  82. context/ci/__init__.py +6 -0
  83. context/ci/worktree_templates.json +44 -0
  84. context/cloud/__init__.py +6 -0
  85. context/cloud/csp_service_registry.json +739 -0
  86. context/compliance/__init__.py +6 -0
  87. context/compliance/ai_rmf_crosswalk.yaml +226 -0
  88. context/compliance/atlas_mitigations.json +293 -0
  89. context/compliance/atlas_techniques.json +833 -0
  90. context/compliance/cisa_sbd_requirements.json +477 -0
  91. context/compliance/cjis_security_policy.json +522 -0
  92. context/compliance/cmmc_practices.json +2494 -0
  93. context/compliance/cmmc_report_template.md +142 -0
  94. context/compliance/cnssi_1253_overlay.json +109 -0
  95. context/compliance/control_crosswalk.json +1914 -0
  96. context/compliance/control_families/__init__.py +6 -0
  97. context/compliance/csp_certifications.json +251 -0
  98. context/compliance/cssp_report_template.md +193 -0
  99. context/compliance/cui_templates/__init__.py +6 -0
  100. context/compliance/cui_templates/banner_block.txt +4 -0
  101. context/compliance/cui_templates/code_header.txt +8 -0
  102. context/compliance/cui_templates/document_template.md +35 -0
  103. context/compliance/data_type_framework_map.json +321 -0
  104. context/compliance/data_type_registry.json +147 -0
  105. context/compliance/dod_cssp_8530.json +463 -0
  106. context/compliance/eu_ai_act_annex_iii.json +108 -0
  107. context/compliance/export_templates/__init__.py +6 -0
  108. context/compliance/export_templates/emass_controls.csv.j2 +4 -0
  109. context/compliance/export_templates/evidence_package.md.j2 +39 -0
  110. context/compliance/export_templates/executive_summary.md.j2 +55 -0
  111. context/compliance/export_templates/poam_tracking.csv.j2 +4 -0
  112. context/compliance/fedramp_20x_ksi_schemas.json +133 -0
  113. context/compliance/fedramp_high_baseline.json +4370 -0
  114. context/compliance/fedramp_moderate_baseline.json +2183 -0
  115. context/compliance/fedramp_report_template.md +181 -0
  116. context/compliance/fips_200_areas.json +362 -0
  117. context/compliance/gao_ai_accountability.json +262 -0
  118. context/compliance/hipaa_security_rule.json +720 -0
  119. context/compliance/hitrust_csf_v11.json +930 -0
  120. context/compliance/impact_level_profiles.json +251 -0
  121. context/compliance/incident_response_template.md +1110 -0
  122. context/compliance/iso27001_2022_controls.json +750 -0
  123. context/compliance/iso27001_nist_bridge.json +382 -0
  124. context/compliance/iso42001_controls.json +254 -0
  125. context/compliance/ivv_checklist_template.md +80 -0
  126. context/compliance/ivv_report_template.md +116 -0
  127. context/compliance/ivv_requirements.json +372 -0
  128. context/compliance/mosa_crosswalk.json +327 -0
  129. context/compliance/mosa_framework.json +250 -0
  130. context/compliance/narrative_templates/AC.md.j2 +101 -0
  131. context/compliance/narrative_templates/AU.md.j2 +106 -0
  132. context/compliance/narrative_templates/IA.md.j2 +104 -0
  133. context/compliance/narrative_templates/SC.md.j2 +102 -0
  134. context/compliance/narrative_templates/SI.md.j2 +111 -0
  135. context/compliance/narrative_templates/__init__.py +6 -0
  136. context/compliance/narrative_templates/default.md.j2 +50 -0
  137. context/compliance/narrative_templates/executive_summary.j2 +27 -0
  138. context/compliance/narrative_templates/poam_milestone.j2 +19 -0
  139. context/compliance/narrative_templates/ssp_section.j2 +11 -0
  140. context/compliance/nist_800_171_controls.json +1552 -0
  141. context/compliance/nist_800_207_crosswalk.json +399 -0
  142. context/compliance/nist_800_207_zta.json +258 -0
  143. context/compliance/nist_800_53.json +324 -0
  144. context/compliance/nist_ai_600_1_genai.json +326 -0
  145. context/compliance/nist_ai_rmf.json +206 -0
  146. context/compliance/nist_sp_800_60_types.json +1667 -0
  147. context/compliance/omb_m25_21_high_impact_ai.json +248 -0
  148. context/compliance/omb_m26_04_unbiased_ai.json +262 -0
  149. context/compliance/owasp_agentic_asi.json +133 -0
  150. context/compliance/owasp_agentic_threats.json +285 -0
  151. context/compliance/owasp_llm_top10.json +274 -0
  152. context/compliance/pci_dss_v4.json +510 -0
  153. context/compliance/poam_template.md +117 -0
  154. context/compliance/safeai_controls.json +512 -0
  155. context/compliance/sbd_report_template.md +77 -0
  156. context/compliance/siem_config_templates/__init__.py +6 -0
  157. context/compliance/siem_config_templates/filebeat.yml +213 -0
  158. context/compliance/siem_config_templates/log_sources.json +208 -0
  159. context/compliance/soc2_trust_criteria.json +661 -0
  160. context/compliance/ssp_template.md +432 -0
  161. context/compliance/stig_templates/__init__.py +6 -0
  162. context/compliance/stig_templates/webapp_stig.json +139 -0
  163. context/compliance/xai_requirements.json +108 -0
  164. context/dashboard/__init__.py +6 -0
  165. context/dashboard/nlq_examples.json +50 -0
  166. context/dashboard/schema_descriptions.json +23 -0
  167. context/icdev_methodology.md +100 -0
  168. context/integration/__init__.py +6 -0
  169. context/integration/approval_workflows.json +32 -0
  170. context/integration/gitlab_field_mappings.json +33 -0
  171. context/integration/jira_field_mappings.json +32 -0
  172. context/integration/reqif_export_schema.json +23 -0
  173. context/integration/servicenow_field_mappings.json +22 -0
  174. context/languages/__init__.py +6 -0
  175. context/languages/framework_patterns.json +205 -0
  176. context/languages/language_registry.json +279 -0
  177. context/llm/__init__.py +6 -0
  178. context/llm/example_provider.py +89 -0
  179. context/marketplace/assets/writeguard-core.yaml +100 -0
  180. context/marketplace/assets/writeguard-govcon.yaml +45 -0
  181. context/marketplace/assets/writeguard-style-guides.yaml +44 -0
  182. context/mbse/__init__.py +6 -0
  183. context/mbse/des_report_template.md +162 -0
  184. context/mbse/des_requirements.json +411 -0
  185. context/mbse/digital_thread_patterns.json +403 -0
  186. context/mbse/reqif_schema.json +280 -0
  187. context/mbse/sysml_element_types.json +432 -0
  188. context/oscal/NIST_SP-800-53_rev5_catalog.json +254987 -0
  189. context/oscal/README.md +43 -0
  190. context/patterns/__init__.py +6 -0
  191. context/profiles/__init__.py +6 -0
  192. context/profiles/dod_baseline_v1.yaml +145 -0
  193. context/profiles/fedramp_baseline_v1.yaml +143 -0
  194. context/profiles/financial_baseline_v1.yaml +142 -0
  195. context/profiles/healthcare_baseline_v1.yaml +135 -0
  196. context/profiles/law_enforcement_v1.yaml +129 -0
  197. context/profiles/startup_v1.yaml +134 -0
  198. context/rag/source_mappings.json +42 -0
  199. context/requirements/__init__.py +6 -0
  200. context/requirements/ambiguity_patterns.json +97 -0
  201. context/requirements/boundary_impact_rules.json +123 -0
  202. context/requirements/default_constitutions.json +67 -0
  203. context/requirements/document_extraction_rules.json +58 -0
  204. context/requirements/gap_patterns.json +108 -0
  205. context/requirements/readiness_rubric.json +78 -0
  206. context/requirements/red_alternative_patterns.json +210 -0
  207. context/requirements/safe_templates.json +72 -0
  208. context/requirements/spec_quality_checklist.json +122 -0
  209. context/research/regulatory_registry.json +114 -0
  210. context/research/verticals/cybersecurity.json +127 -0
  211. context/research/verticals/defense.json +104 -0
  212. context/research/verticals/fintech.json +125 -0
  213. context/research/verticals/healthcare.json +118 -0
  214. context/research/verticals/logistics.json +117 -0
  215. context/research/verticals/trading.json +145 -0
  216. context/simulation/__init__.py +6 -0
  217. context/simulation/architecture_patterns.json +36 -0
  218. context/simulation/coa_templates.json +38 -0
  219. context/simulation/cost_models.json +23 -0
  220. context/simulation/risk_categories.json +46 -0
  221. context/supply_chain/__init__.py +6 -0
  222. context/supply_chain/isa_templates.json +129 -0
  223. context/supply_chain/nist_800_161_controls.json +247 -0
  224. context/supply_chain/scrm_risk_matrix.json +147 -0
  225. context/templates/__init__.py +6 -0
  226. context/templates/ansible/__init__.py +6 -0
  227. context/templates/ansible/playbooks/__init__.py +6 -0
  228. context/templates/ansible/roles/__init__.py +6 -0
  229. context/templates/gitlab_ci/__init__.py +6 -0
  230. context/templates/grafana/__init__.py +6 -0
  231. context/templates/kubernetes/__init__.py +6 -0
  232. context/templates/project/__init__.py +6 -0
  233. context/templates/project/api/__init__.py +6 -0
  234. context/templates/project/cli/__init__.py +6 -0
  235. context/templates/project/data_pipeline/__init__.py +6 -0
  236. context/templates/project/iac/__init__.py +6 -0
  237. context/templates/project/javascript_frontend/__init__.py +6 -0
  238. context/templates/project/javascript_frontend/src/__init__.py +6 -0
  239. context/templates/project/javascript_frontend/tests/__init__.py +6 -0
  240. context/templates/project/microservice/__init__.py +6 -0
  241. context/templates/project/python_backend/__init__.py +6 -0
  242. context/templates/project/python_backend/src/__init__.py +6 -0
  243. context/templates/project/python_backend/tests/__init__.py +6 -0
  244. context/templates/project/python_backend/tests/features/__init__.py +6 -0
  245. context/templates/project/python_backend/tests/steps/__init__.py +6 -0
  246. context/templates/terraform/__init__.py +6 -0
  247. context/templates/terraform/govcloud_base/__init__.py +6 -0
  248. context/templates/terraform/modules/__init__.py +6 -0
  249. context/tone/__init__.py +6 -0
  250. context/writing/grammar_rules/common_errors.json +306 -0
  251. context/writing/grammar_rules/govcon_vocabulary.json +113 -0
  252. context/writing/style_guides/academic.yaml +43 -0
  253. context/writing/style_guides/business.yaml +42 -0
  254. context/writing/style_guides/government.yaml +59 -0
  255. context/writing/style_guides/proposal.yaml +58 -0
  256. context/writing/style_guides/technical.yaml +43 -0
  257. docs/adr/README.md +66 -0
  258. docs/adr/connector-forge-decisions.md +318 -0
  259. docs/adr/core-decisions.md +289 -0
  260. docs/adr/db-decisions.md +94 -0
  261. docs/adr/harness-decisions.md +122 -0
  262. docs/adr/innovation-decisions.md +262 -0
  263. docs/adr/marketplace-decisions.md +109 -0
  264. docs/adr/sbd-decisions.md +109 -0
  265. docs/adr/scale-engine-decisions.md +108 -0
  266. docs/adr/writeguard-decisions.md +136 -0
  267. docs/architecture/bounded-contexts.md +1032 -0
  268. docs/features/phase-65-writeguard.md +139 -0
  269. docs/features/phase-66-marketplace-commerce.md +79 -0
  270. docs/features/phase-67-knowledge-ingestion-rag-autodraft.md +97 -0
  271. docs/features/phase-68-enhanced-autodraft-pipeline.md +109 -0
  272. docs/features/phase-69-proposalai-marketplace-module.md +131 -0
  273. docs/features/phase-70-databridge.md +214 -0
  274. docs/features/phase-71-databridge-messaging.md +102 -0
  275. docs/implementation-plan-architecture-evolution.md +614 -0
  276. docs/marketplace/CONTRIBUTING.md +124 -0
  277. docs/marketplace/module_manifest_schema.yaml +83 -0
  278. docs/research/ai-architecture-patterns-2024-2026.md +1236 -0
  279. docs/research/app-builder-platform-analysis.md +582 -0
  280. docs/research/architecture-patterns-c4-ddd-agentic.md +871 -0
  281. docs/research/flowable-boat-competitive-analysis.md +426 -0
  282. docs/research/modern-dev-practices-2024-2026.md +1615 -0
  283. docs/research/secure-by-design-cloudyrion-adaptation.md +270 -0
  284. goals/agent_management.md +144 -0
  285. goals/ai_accountability.md +90 -0
  286. goals/ai_narratives.md +79 -0
  287. goals/ai_transparency.md +76 -0
  288. goals/ato_simulator.md +78 -0
  289. goals/audit_engine.md +177 -0
  290. goals/bite_sized_plans.md +225 -0
  291. goals/boundary_supply_chain.md +206 -0
  292. goals/brainstorming_gate.md +186 -0
  293. goals/build_app.md +604 -0
  294. goals/cato_live_evidence.md +77 -0
  295. goals/cloudforge.md +106 -0
  296. goals/code_intelligence.md +197 -0
  297. goals/compliance_workflow.md +858 -0
  298. goals/connector_forge.md +133 -0
  299. goals/databridge.md +128 -0
  300. goals/deploy_workflow.md +390 -0
  301. goals/developer_scorecard.md +78 -0
  302. goals/devsecops_workflow.md +408 -0
  303. goals/firmware_sbom.md +79 -0
  304. goals/forge_hub.md +78 -0
  305. goals/golden_path.md +77 -0
  306. goals/harness_engineering.md +91 -0
  307. goals/integration_testing.md +189 -0
  308. goals/knowledge_graph.md +128 -0
  309. goals/maintenance_audit.md +196 -0
  310. goals/manifest.md +50 -0
  311. goals/monitoring.md +126 -0
  312. goals/mosa_workflow.md +463 -0
  313. goals/multi_agent_orchestration.md +68 -0
  314. goals/observability_traceability_xai.md +154 -0
  315. goals/owasp_agentic_security.md +395 -0
  316. goals/pr_intelligence.md +78 -0
  317. goals/requirements_intake.md +213 -0
  318. goals/secure_by_design.md +135 -0
  319. goals/security_scan.md +381 -0
  320. goals/self_healing.md +120 -0
  321. goals/simulation_engine.md +111 -0
  322. goals/subagent_review.md +205 -0
  323. goals/systematic_debugging.md +257 -0
  324. goals/tdd_workflow.md +403 -0
  325. goals/template_exchange.md +77 -0
  326. goals/thread_heatmap.md +77 -0
  327. goals/threat_modeler.md +77 -0
  328. goals/verification_iron_law.md +192 -0
  329. goals/vsm_dashboard.md +76 -0
  330. goals/writeguard.md +89 -0
  331. goals/zero_trust_architecture.md +403 -0
  332. hardprompts/__init__.py +6 -0
  333. hardprompts/agent/__init__.py +6 -0
  334. hardprompts/agent/agentic_architect.md +100 -0
  335. hardprompts/agent/debate_prompt.md +32 -0
  336. hardprompts/agent/fitness_evaluation.md +48 -0
  337. hardprompts/agent/governance_review.md +214 -0
  338. hardprompts/agent/reviewer_prompt.md +34 -0
  339. hardprompts/agent/skill_design.md +172 -0
  340. hardprompts/agent/task_decomposition.md +275 -0
  341. hardprompts/agent/veto_check_prompt.md +33 -0
  342. hardprompts/architect/__init__.py +6 -0
  343. hardprompts/architect/api_design.md +283 -0
  344. hardprompts/architect/data_model.md +277 -0
  345. hardprompts/architect/system_design.md +180 -0
  346. hardprompts/builder/__init__.py +6 -0
  347. hardprompts/builder/code_generation.md +59 -0
  348. hardprompts/builder/refactor.md +58 -0
  349. hardprompts/builder/scaffold_project.md +69 -0
  350. hardprompts/builder/test_generation.md +87 -0
  351. hardprompts/ci/__init__.py +6 -0
  352. hardprompts/ci/worktree_setup.md +35 -0
  353. hardprompts/compliance/__init__.py +6 -0
  354. hardprompts/compliance/cmmc_assessment.md +63 -0
  355. hardprompts/compliance/cssp_assessment.md +75 -0
  356. hardprompts/compliance/cui_marking.md +86 -0
  357. hardprompts/compliance/fedramp_assessment.md +55 -0
  358. hardprompts/compliance/ivv_assessment.md +96 -0
  359. hardprompts/compliance/poam_generation.md +57 -0
  360. hardprompts/compliance/sbd_assessment.md +101 -0
  361. hardprompts/compliance/security_categorization.md +74 -0
  362. hardprompts/compliance/ssp_generation.md +56 -0
  363. hardprompts/compliance/stig_evaluation.md +63 -0
  364. hardprompts/dashboard/__init__.py +6 -0
  365. hardprompts/dashboard/nlq_system_prompt.md +26 -0
  366. hardprompts/infra/__init__.py +6 -0
  367. hardprompts/infra/k8s_manifests.md +118 -0
  368. hardprompts/infra/pipeline_generation.md +160 -0
  369. hardprompts/infra/terraform_generation.md +92 -0
  370. hardprompts/integration/__init__.py +6 -0
  371. hardprompts/integration/approval_review.md +17 -0
  372. hardprompts/integration/jira_mapping.md +25 -0
  373. hardprompts/integration/servicenow_mapping.md +14 -0
  374. hardprompts/knowledge/__init__.py +6 -0
  375. hardprompts/knowledge/pattern_detection.md +73 -0
  376. hardprompts/knowledge/recommendation_engine.md +90 -0
  377. hardprompts/knowledge/root_cause_analysis.md +91 -0
  378. hardprompts/maintenance/__init__.py +6 -0
  379. hardprompts/maintenance/maintenance_assessment.md +82 -0
  380. hardprompts/mbse/__init__.py +6 -0
  381. hardprompts/mbse/digital_thread.md +67 -0
  382. hardprompts/mbse/model_import.md +62 -0
  383. hardprompts/mbse/model_to_code.md +65 -0
  384. hardprompts/modernization/__init__.py +6 -0
  385. hardprompts/modernization/legacy_analysis.md +93 -0
  386. hardprompts/modernization/migration_planning.md +150 -0
  387. hardprompts/modernization/seven_r_assessment.md +107 -0
  388. hardprompts/proposal_draft.md +53 -0
  389. hardprompts/rag_citation.md +12 -0
  390. hardprompts/rag_rerank.md +31 -0
  391. hardprompts/requirements/__init__.py +6 -0
  392. hardprompts/requirements/bdd_generation.md +35 -0
  393. hardprompts/requirements/clarification_prioritization.md +29 -0
  394. hardprompts/requirements/decomposition.md +60 -0
  395. hardprompts/requirements/document_extraction.md +45 -0
  396. hardprompts/requirements/gap_detection.md +70 -0
  397. hardprompts/requirements/intake_conversation.md +101 -0
  398. hardprompts/requirements/readiness_assessment.md +39 -0
  399. hardprompts/requirements/spec_quality.md +33 -0
  400. hardprompts/requirements/traceability_analysis.md +23 -0
  401. hardprompts/security/__init__.py +6 -0
  402. hardprompts/security/endpoint_security.md +78 -0
  403. hardprompts/security/threat_model.md +70 -0
  404. hardprompts/security/vulnerability_assessment.md +81 -0
  405. hardprompts/simulation/__init__.py +6 -0
  406. hardprompts/simulation/architecture_impact.md +27 -0
  407. hardprompts/simulation/coa_alternative.md +27 -0
  408. hardprompts/simulation/coa_generation.md +25 -0
  409. hardprompts/simulation/compliance_impact.md +28 -0
  410. hardprompts/simulation/cost_estimation.md +33 -0
  411. hardprompts/simulation/risk_assessment.md +28 -0
  412. hardprompts/translation/code_translation.md +68 -0
  413. hardprompts/translation/dependency_suggestion.md +44 -0
  414. hardprompts/translation/test_translation.md +64 -0
  415. hardprompts/translation/translation_repair.md +59 -0
  416. icdev-0.0.3.dist-info/METADATA +909 -0
  417. icdev-0.0.3.dist-info/RECORD +1214 -0
  418. icdev-0.0.3.dist-info/WHEEL +5 -0
  419. icdev-0.0.3.dist-info/entry_points.txt +9 -0
  420. icdev-0.0.3.dist-info/licenses/LICENSE +201 -0
  421. icdev-0.0.3.dist-info/licenses/NOTICE +11 -0
  422. icdev-0.0.3.dist-info/top_level.txt +7 -0
  423. memory/MEMORY.md +52 -0
  424. memory/logs/2026-02-14.md +17 -0
  425. memory/logs/2026-03-03.md +2 -0
  426. memory/logs/__init__.py +1 -0
  427. tools/a2a/icdev_callback_client.py +210 -0
  428. tools/agent/cards/architect_card.json +29 -0
  429. tools/agent/cards/builder_card.json +34 -0
  430. tools/agent/cards/compliance_card.json +29 -0
  431. tools/agent/cards/connector_forge_card.json +49 -0
  432. tools/agent/cards/devsecops_zta_card.json +24 -0
  433. tools/agent/cards/knowledge_card.json +29 -0
  434. tools/agent/cards/monitor_card.json +29 -0
  435. tools/agent/cards/orchestrator_card.json +29 -0
  436. tools/agent/cards/requirements_analyst_card.json +24 -0
  437. tools/agent/cards/security_card.json +29 -0
  438. tools/agent/cards/simulation_card.json +24 -0
  439. tools/agent/cards/supply_chain_card.json +24 -0
  440. tools/analysis/__init__.py +1 -0
  441. tools/analysis/code_analyzer.py +770 -0
  442. tools/analysis/runtime_feedback.py +379 -0
  443. tools/analytics/__init__.py +2 -0
  444. tools/analytics/scorecard.py +538 -0
  445. tools/analytics/vsm_engine.py +612 -0
  446. tools/architecture/__init__.py +2 -0
  447. tools/architecture/adr_extractor.py +393 -0
  448. tools/audit/__init__.py +1 -0
  449. tools/audit/audit_logger.py +199 -0
  450. tools/audit/audit_query.py +153 -0
  451. tools/audit/decision_recorder.py +73 -0
  452. tools/audit_engine/__init__.py +12 -0
  453. tools/audit_engine/ai_advisor.py +906 -0
  454. tools/audit_engine/cli.py +286 -0
  455. tools/audit_engine/comparator.py +305 -0
  456. tools/audit_engine/eject_scaffolder.py +399 -0
  457. tools/audit_engine/engine.py +614 -0
  458. tools/audit_engine/git_fetcher.py +341 -0
  459. tools/audit_engine/regime_loader.py +200 -0
  460. tools/audit_engine/regime_updater.py +325 -0
  461. tools/audit_engine/report_card.py +289 -0
  462. tools/audit_engine/scanner.py +684 -0
  463. tools/audit_engine/self_heal.py +1042 -0
  464. tools/ci/__init__.py +2 -0
  465. tools/ci/connectors/__init__.py +2 -0
  466. tools/ci/connectors/base_connector.py +80 -0
  467. tools/ci/connectors/connector_registry.py +188 -0
  468. tools/ci/connectors/mattermost_connector.py +159 -0
  469. tools/ci/connectors/slack_connector.py +197 -0
  470. tools/ci/core/__init__.py +2 -0
  471. tools/ci/core/air_gap_detector.py +115 -0
  472. tools/ci/core/comment_handler.py +192 -0
  473. tools/ci/core/conversation_manager.py +480 -0
  474. tools/ci/core/event_envelope.py +500 -0
  475. tools/ci/core/event_router.py +444 -0
  476. tools/ci/core/failure_parser.py +397 -0
  477. tools/ci/core/recovery_engine.py +527 -0
  478. tools/ci/gate_enforcer.py +361 -0
  479. tools/ci/modules/__init__.py +2 -0
  480. tools/ci/modules/agent.py +271 -0
  481. tools/ci/modules/git_ops.py +175 -0
  482. tools/ci/modules/state.py +117 -0
  483. tools/ci/modules/vcs.py +303 -0
  484. tools/ci/modules/workflow_ops.py +295 -0
  485. tools/ci/modules/worktree.py +337 -0
  486. tools/ci/pipeline_config_generator.py +558 -0
  487. tools/ci/pr_intelligence.py +485 -0
  488. tools/ci/triggers/__init__.py +2 -0
  489. tools/ci/triggers/gitlab_task_monitor.py +327 -0
  490. tools/ci/triggers/poll_trigger.py +237 -0
  491. tools/ci/triggers/webhook_server.py +356 -0
  492. tools/ci/workflows/__init__.py +2 -0
  493. tools/ci/workflows/icdev_build.py +140 -0
  494. tools/ci/workflows/icdev_comply.py +284 -0
  495. tools/ci/workflows/icdev_document.py +152 -0
  496. tools/ci/workflows/icdev_e2e.py +188 -0
  497. tools/ci/workflows/icdev_patch.py +186 -0
  498. tools/ci/workflows/icdev_plan.py +202 -0
  499. tools/ci/workflows/icdev_plan_build.py +41 -0
  500. tools/ci/workflows/icdev_plan_build_test.py +46 -0
  501. tools/ci/workflows/icdev_plan_build_test_review.py +47 -0
  502. tools/ci/workflows/icdev_review.py +126 -0
  503. tools/ci/workflows/icdev_sdlc.py +261 -0
  504. tools/ci/workflows/icdev_test.py +240 -0
  505. tools/cli/__init__.py +1 -0
  506. tools/cli/output_formatter.py +756 -0
  507. tools/cloudforge/__init__.py +12 -0
  508. tools/cloudforge/airgap/__init__.py +2 -0
  509. tools/cloudforge/airgap/il_classifier.py +70 -0
  510. tools/cloudforge/airgap/offline_validator.py +42 -0
  511. tools/cloudforge/airgap/shift_emulator.py +155 -0
  512. tools/cloudforge/airgap/sneakernet.py +91 -0
  513. tools/cloudforge/cd_hub/__init__.py +2 -0
  514. tools/cloudforge/cd_hub/canary_deployer.py +88 -0
  515. tools/cloudforge/cd_hub/gitops_renderer.py +123 -0
  516. tools/cloudforge/cd_hub/hub_controller.py +143 -0
  517. tools/cloudforge/cd_hub/pipeline_bridge.py +30 -0
  518. tools/cloudforge/cd_hub/rollback_engine.py +29 -0
  519. tools/cloudforge/cd_hub/spoke_agent.py +51 -0
  520. tools/cloudforge/compliance/__init__.py +2 -0
  521. tools/cloudforge/compliance/ato_accelerator.py +272 -0
  522. tools/cloudforge/compliance/control_inheritor.py +127 -0
  523. tools/cloudforge/compliance/evidence_generator.py +129 -0
  524. tools/cloudforge/compliance/poam_bridge.py +41 -0
  525. tools/cloudforge/compliance/ssp_bridge.py +52 -0
  526. tools/cloudforge/compliance/stig_bridge.py +41 -0
  527. tools/cloudforge/container_forge/__init__.py +2 -0
  528. tools/cloudforge/container_forge/bigbang_renderer.py +85 -0
  529. tools/cloudforge/container_forge/hardener.py +169 -0
  530. tools/cloudforge/container_forge/image_scanner_bridge.py +33 -0
  531. tools/cloudforge/container_forge/runtime_policy.py +87 -0
  532. tools/cloudforge/container_forge/sbom_bridge.py +42 -0
  533. tools/cloudforge/finops/__init__.py +2 -0
  534. tools/cloudforge/finops/anomaly_detector.py +78 -0
  535. tools/cloudforge/finops/budget_tracker.py +96 -0
  536. tools/cloudforge/finops/chargeback.py +69 -0
  537. tools/cloudforge/finops/cost_collector.py +141 -0
  538. tools/cloudforge/finops/optimizer.py +55 -0
  539. tools/cloudforge/hybrid/__init__.py +2 -0
  540. tools/cloudforge/hybrid/connection_manager.py +141 -0
  541. tools/cloudforge/hybrid/dns_federator.py +56 -0
  542. tools/cloudforge/hybrid/health_monitor.py +108 -0
  543. tools/cloudforge/hybrid/identity_federator.py +53 -0
  544. tools/cloudforge/hybrid/network_bridge.py +68 -0
  545. tools/cloudforge/hybrid/topology_manager.py +147 -0
  546. tools/cloudforge/hybrid/workload_abstractor.py +92 -0
  547. tools/cloudforge/iac/__init__.py +2 -0
  548. tools/cloudforge/iac/drift_detector.py +154 -0
  549. tools/cloudforge/iac/module_library.py +265 -0
  550. tools/cloudforge/iac/opentofu_adapter.py +89 -0
  551. tools/cloudforge/iac/pulumi_renderer.py +292 -0
  552. tools/cloudforge/iac/state_backend.py +146 -0
  553. tools/cloudforge/iac/terraform_renderer.py +626 -0
  554. tools/cloudforge/landing_zone/__init__.py +2 -0
  555. tools/cloudforge/landing_zone/blueprint_loader.py +98 -0
  556. tools/cloudforge/landing_zone/blueprint_validator.py +113 -0
  557. tools/cloudforge/landing_zone/zone_provisioner.py +306 -0
  558. tools/cloudforge/landing_zone/zone_state.py +143 -0
  559. tools/cloudforge/mbse_thread/__init__.py +2 -0
  560. tools/cloudforge/mbse_thread/ato_thread_weaver.py +111 -0
  561. tools/cloudforge/mbse_thread/control_tracer.py +68 -0
  562. tools/cloudforge/mbse_thread/system_boundary.py +83 -0
  563. tools/cloudforge/metastore/__init__.py +2 -0
  564. tools/cloudforge/metastore/dependency_graph.py +202 -0
  565. tools/cloudforge/metastore/discovery.py +192 -0
  566. tools/cloudforge/metastore/registry.py +185 -0
  567. tools/cloudforge/metastore/rto_tracker.py +92 -0
  568. tools/cloudforge/metastore/runbook_linker.py +82 -0
  569. tools/cloudforge/migration/__init__.py +2 -0
  570. tools/cloudforge/migration/assessor.py +187 -0
  571. tools/cloudforge/migration/cutover_orchestrator.py +117 -0
  572. tools/cloudforge/migration/databridge_bridge.py +92 -0
  573. tools/cloudforge/migration/planner.py +98 -0
  574. tools/cloudforge/migration/risk_scorer.py +97 -0
  575. tools/cloudforge/migration/validation_runner.py +45 -0
  576. tools/cloudforge/migration/workload_inventory.py +107 -0
  577. tools/cloudforge/provider.py +319 -0
  578. tools/cloudforge/providers/__init__.py +2 -0
  579. tools/cloudforge/providers/aws_commercial.py +92 -0
  580. tools/cloudforge/providers/aws_govcloud.py +229 -0
  581. tools/cloudforge/providers/aws_secret.py +83 -0
  582. tools/cloudforge/providers/azure_commercial.py +80 -0
  583. tools/cloudforge/providers/azure_gov.py +91 -0
  584. tools/cloudforge/providers/azure_secret.py +71 -0
  585. tools/cloudforge/providers/gcp.py +102 -0
  586. tools/cloudforge/providers/oci.py +102 -0
  587. tools/cloudforge/registry.py +140 -0
  588. tools/cloudforge/runbooks/__init__.py +2 -0
  589. tools/cloudforge/runbooks/ai_generator.py +119 -0
  590. tools/cloudforge/runbooks/dag_validator.py +219 -0
  591. tools/cloudforge/runbooks/engine.py +470 -0
  592. tools/cloudforge/runbooks/models.py +99 -0
  593. tools/cloudforge/runbooks/snippet_library.py +158 -0
  594. tools/cloudforge/runbooks/template_loader.py +122 -0
  595. tools/cloudforge/runbooks/visualization.py +108 -0
  596. tools/cloudforge/siem/__init__.py +2 -0
  597. tools/cloudforge/siem/alert_rules.py +86 -0
  598. tools/cloudforge/siem/correlation_engine.py +61 -0
  599. tools/cloudforge/siem/log_aggregator.py +113 -0
  600. tools/cloudforge/siem/siem_dashboard_data.py +28 -0
  601. tools/cloudforge/supply_chain/__init__.py +2 -0
  602. tools/cloudforge/supply_chain/bridge.py +33 -0
  603. tools/cloudforge/supply_chain/iac_dependency_scanner.py +36 -0
  604. tools/cloudforge/supply_chain/provider_trust_scorer.py +54 -0
  605. tools/compat/__init__.py +21 -0
  606. tools/compat/cli_harmonizer.py +251 -0
  607. tools/compat/datetime_utils.py +18 -0
  608. tools/compat/db_utils.py +190 -0
  609. tools/compat/platform_utils.py +123 -0
  610. tools/compliance/__init__.py +1 -0
  611. tools/compliance/accountability_manager.py +391 -0
  612. tools/compliance/ai_accountability_audit.py +287 -0
  613. tools/compliance/ai_impact_assessor.py +267 -0
  614. tools/compliance/ai_incident_response.py +295 -0
  615. tools/compliance/ai_inventory_manager.py +233 -0
  616. tools/compliance/ai_reassessment_scheduler.py +250 -0
  617. tools/compliance/ai_transparency_audit.py +247 -0
  618. tools/compliance/atlas_assessor.py +276 -0
  619. tools/compliance/atlas_report_generator.py +1199 -0
  620. tools/compliance/base_assessor.py +591 -0
  621. tools/compliance/cato_live_engine.py +607 -0
  622. tools/compliance/cato_monitor.py +1371 -0
  623. tools/compliance/cato_scheduler.py +698 -0
  624. tools/compliance/cjis_assessor.py +76 -0
  625. tools/compliance/classification_manager.py +1340 -0
  626. tools/compliance/cmmc_assessor.py +1478 -0
  627. tools/compliance/cmmc_report_generator.py +1087 -0
  628. tools/compliance/compliance_detector.py +452 -0
  629. tools/compliance/compliance_exporter.py +418 -0
  630. tools/compliance/compliance_status.py +810 -0
  631. tools/compliance/control_mapper.py +488 -0
  632. tools/compliance/crosswalk_engine.py +1208 -0
  633. tools/compliance/cssp_assessor.py +1032 -0
  634. tools/compliance/cssp_evidence_collector.py +716 -0
  635. tools/compliance/cssp_report_generator.py +1103 -0
  636. tools/compliance/cui_marker.py +387 -0
  637. tools/compliance/diagram_validator.py +599 -0
  638. tools/compliance/emass/__init__.py +2 -0
  639. tools/compliance/emass/emass_client.py +822 -0
  640. tools/compliance/emass/emass_export.py +758 -0
  641. tools/compliance/emass/emass_sync.py +807 -0
  642. tools/compliance/eu_ai_act_classifier.py +193 -0
  643. tools/compliance/evidence_collector.py +459 -0
  644. tools/compliance/fairness_assessor.py +310 -0
  645. tools/compliance/fedramp_20x_ksi_emitter.py +692 -0
  646. tools/compliance/fedramp_assessor.py +1795 -0
  647. tools/compliance/fedramp_authorization_packager.py +137 -0
  648. tools/compliance/fedramp_ksi_generator.py +349 -0
  649. tools/compliance/fedramp_report_generator.py +1115 -0
  650. tools/compliance/fips199_categorizer.py +869 -0
  651. tools/compliance/fips200_validator.py +304 -0
  652. tools/compliance/firmware_sbom.py +646 -0
  653. tools/compliance/gao_ai_assessor.py +228 -0
  654. tools/compliance/gao_evidence_builder.py +302 -0
  655. tools/compliance/hipaa_assessor.py +78 -0
  656. tools/compliance/hitrust_assessor.py +49 -0
  657. tools/compliance/incident_response_plan.py +705 -0
  658. tools/compliance/inheritance_engine.py +693 -0
  659. tools/compliance/iso27001_assessor.py +92 -0
  660. tools/compliance/iso42001_assessor.py +114 -0
  661. tools/compliance/ivv_assessor.py +2314 -0
  662. tools/compliance/ivv_report_generator.py +1649 -0
  663. tools/compliance/model_card_generator.py +291 -0
  664. tools/compliance/mosa_assessor.py +117 -0
  665. tools/compliance/multi_regime_assessor.py +441 -0
  666. tools/compliance/narrative_generator.py +1012 -0
  667. tools/compliance/narrative_quality_gate.py +701 -0
  668. tools/compliance/narrative_workflow.py +814 -0
  669. tools/compliance/nist_800_207_assessor.py +191 -0
  670. tools/compliance/nist_ai_600_1_assessor.py +185 -0
  671. tools/compliance/nist_ai_rmf_assessor.py +110 -0
  672. tools/compliance/nist_lookup.py +244 -0
  673. tools/compliance/omb_m25_21_assessor.py +225 -0
  674. tools/compliance/omb_m26_04_assessor.py +185 -0
  675. tools/compliance/oscal_catalog_adapter.py +395 -0
  676. tools/compliance/oscal_generator.py +2157 -0
  677. tools/compliance/oscal_tools.py +1182 -0
  678. tools/compliance/oscal_validator.py +692 -0
  679. tools/compliance/owasp_agentic_assessor.py +227 -0
  680. tools/compliance/owasp_asi_assessor.py +197 -0
  681. tools/compliance/owasp_llm_assessor.py +245 -0
  682. tools/compliance/pci_dss_assessor.py +80 -0
  683. tools/compliance/pi_compliance_tracker.py +1447 -0
  684. tools/compliance/poam_generator.py +388 -0
  685. tools/compliance/resolve_marking.py +272 -0
  686. tools/compliance/sbd_assessor.py +2070 -0
  687. tools/compliance/sbd_report_generator.py +1223 -0
  688. tools/compliance/sbom_generator.py +993 -0
  689. tools/compliance/siem_config_generator.py +661 -0
  690. tools/compliance/slsa_attestation_generator.py +479 -0
  691. tools/compliance/soc2_assessor.py +77 -0
  692. tools/compliance/ssp_generator.py +556 -0
  693. tools/compliance/stig_checker.py +712 -0
  694. tools/compliance/swft_evidence_bundler.py +326 -0
  695. tools/compliance/system_card_generator.py +303 -0
  696. tools/compliance/template_exchange.py +513 -0
  697. tools/compliance/traceability_matrix.py +1268 -0
  698. tools/compliance/universal_classification_manager.py +1159 -0
  699. tools/compliance/xacta/__init__.py +2 -0
  700. tools/compliance/xacta/xacta_client.py +438 -0
  701. tools/compliance/xacta/xacta_export.py +546 -0
  702. tools/compliance/xacta/xacta_sync.py +322 -0
  703. tools/compliance/xai_assessor.py +231 -0
  704. tools/core/__init__.py +2 -0
  705. tools/core/circuit_breaker.py +353 -0
  706. tools/core/compliance_sidecar.py +344 -0
  707. tools/core/container.py +110 -0
  708. tools/core/errors.py +256 -0
  709. tools/core/feature_flags.py +311 -0
  710. tools/core/task_dlq.py +350 -0
  711. tools/dashboard/__init__.py +2 -0
  712. tools/dashboard/app.py +6288 -0
  713. tools/dashboard/templates/agent_evolution.html +287 -0
  714. tools/dashboard/templates/agents/list.html +71 -0
  715. tools/dashboard/templates/agents.html +132 -0
  716. tools/dashboard/templates/architecture.html +289 -0
  717. tools/dashboard/templates/ato_simulator.html +170 -0
  718. tools/dashboard/templates/audit_engine.html +844 -0
  719. tools/dashboard/templates/base.html +236 -0
  720. tools/dashboard/templates/cato_live.html +116 -0
  721. tools/dashboard/templates/cloudforge.html +195 -0
  722. tools/dashboard/templates/cloudforge_finops.html +111 -0
  723. tools/dashboard/templates/cloudforge_hybrid.html +122 -0
  724. tools/dashboard/templates/cloudforge_metastore.html +234 -0
  725. tools/dashboard/templates/cloudforge_migration.html +87 -0
  726. tools/dashboard/templates/cloudforge_runbooks.html +201 -0
  727. tools/dashboard/templates/cloudforge_siem.html +94 -0
  728. tools/dashboard/templates/compliance_accel.html +292 -0
  729. tools/dashboard/templates/crashes.html +122 -0
  730. tools/dashboard/templates/databridge.html +305 -0
  731. tools/dashboard/templates/databridge_analytics.html +195 -0
  732. tools/dashboard/templates/databridge_mapping.html +345 -0
  733. tools/dashboard/templates/databridge_messaging.html +321 -0
  734. tools/dashboard/templates/decisions.html +258 -0
  735. tools/dashboard/templates/devices.html +151 -0
  736. tools/dashboard/templates/devsecops_maturity.html +278 -0
  737. tools/dashboard/templates/edge_ai.html +128 -0
  738. tools/dashboard/templates/firmware.html +120 -0
  739. tools/dashboard/templates/firmware_sbom.html +193 -0
  740. tools/dashboard/templates/forge_hub.html +196 -0
  741. tools/dashboard/templates/forge_studio.html +379 -0
  742. tools/dashboard/templates/forge_studio_analytics.html +360 -0
  743. tools/dashboard/templates/forge_studio_builder.html +1637 -0
  744. tools/dashboard/templates/forge_studio_compliance.html +310 -0
  745. tools/dashboard/templates/forge_studio_deploy.html +573 -0
  746. tools/dashboard/templates/forge_studio_enterprise.html +888 -0
  747. tools/dashboard/templates/forge_studio_marketplace.html +502 -0
  748. tools/dashboard/templates/forge_studio_workflow.html +696 -0
  749. tools/dashboard/templates/golden_path.html +175 -0
  750. tools/dashboard/templates/govcon.html +280 -0
  751. tools/dashboard/templates/harness.html +148 -0
  752. tools/dashboard/templates/index.html +207 -0
  753. tools/dashboard/templates/intelligence.html +336 -0
  754. tools/dashboard/templates/knowledge/index.html +190 -0
  755. tools/dashboard/templates/knowledge_graph.html +739 -0
  756. tools/dashboard/templates/login.html +51 -0
  757. tools/dashboard/templates/marketplace.html +336 -0
  758. tools/dashboard/templates/marketplace_admin.html +247 -0
  759. tools/dashboard/templates/missions.html +403 -0
  760. tools/dashboard/templates/narratives.html +154 -0
  761. tools/dashboard/templates/pr_intelligence.html +151 -0
  762. tools/dashboard/templates/proposals/detail.html +300 -0
  763. tools/dashboard/templates/proposals/list.html +52 -0
  764. tools/dashboard/templates/proposals/sam_detail.html +132 -0
  765. tools/dashboard/templates/proposals/section_detail.html +375 -0
  766. tools/dashboard/templates/research.html +222 -0
  767. tools/dashboard/templates/resilience.html +300 -0
  768. tools/dashboard/templates/scorecard.html +162 -0
  769. tools/dashboard/templates/simulator.html +131 -0
  770. tools/dashboard/templates/template_exchange.html +147 -0
  771. tools/dashboard/templates/thread_heatmap.html +151 -0
  772. tools/dashboard/templates/threat_model.html +195 -0
  773. tools/dashboard/templates/vsm.html +141 -0
  774. tools/dashboard/templates/writeguard.html +277 -0
  775. tools/databridge/__init__.py +5 -0
  776. tools/databridge/agent/__init__.py +2 -0
  777. tools/databridge/agent/daemon.py +227 -0
  778. tools/databridge/agent/tunnel.py +101 -0
  779. tools/databridge/agent/ws_relay.py +91 -0
  780. tools/databridge/analytics.py +167 -0
  781. tools/databridge/arrow_pipeline.py +327 -0
  782. tools/databridge/connection_manager.py +424 -0
  783. tools/databridge/connector.py +331 -0
  784. tools/databridge/connectors/__init__.py +2 -0
  785. tools/databridge/connectors/argocd_connector.py +160 -0
  786. tools/databridge/connectors/avro_connector.py +203 -0
  787. tools/databridge/connectors/azure_blob.py +63 -0
  788. tools/databridge/connectors/cdc_connector.py +205 -0
  789. tools/databridge/connectors/csv_connector.py +172 -0
  790. tools/databridge/connectors/datadog_connector.py +153 -0
  791. tools/databridge/connectors/discord_messaging.py +215 -0
  792. tools/databridge/connectors/dynamics365.py +151 -0
  793. tools/databridge/connectors/elasticsearch_connector.py +145 -0
  794. tools/databridge/connectors/email_base.py +114 -0
  795. tools/databridge/connectors/excel_connector.py +175 -0
  796. tools/databridge/connectors/fsspec_base.py +300 -0
  797. tools/databridge/connectors/gcs.py +53 -0
  798. tools/databridge/connectors/github_connector.py +138 -0
  799. tools/databridge/connectors/gitlab_connector.py +132 -0
  800. tools/databridge/connectors/gmail_connector.py +182 -0
  801. tools/databridge/connectors/hdfs.py +57 -0
  802. tools/databridge/connectors/health_base.py +401 -0
  803. tools/databridge/connectors/hubspot.py +124 -0
  804. tools/databridge/connectors/imap_connector.py +171 -0
  805. tools/databridge/connectors/jenkins_connector.py +138 -0
  806. tools/databridge/connectors/jira_connector.py +86 -0
  807. tools/databridge/connectors/json_connector.py +184 -0
  808. tools/databridge/connectors/kafka_connector.py +246 -0
  809. tools/databridge/connectors/kinesis_connector.py +238 -0
  810. tools/databridge/connectors/local_fs.py +30 -0
  811. tools/databridge/connectors/matrix.py +197 -0
  812. tools/databridge/connectors/mattermost_messaging.py +184 -0
  813. tools/databridge/connectors/messaging_base.py +172 -0
  814. tools/databridge/connectors/mssql.py +63 -0
  815. tools/databridge/connectors/mysql.py +57 -0
  816. tools/databridge/connectors/netsuite.py +170 -0
  817. tools/databridge/connectors/o365_mail.py +196 -0
  818. tools/databridge/connectors/oracle.py +65 -0
  819. tools/databridge/connectors/pagerduty_connector.py +162 -0
  820. tools/databridge/connectors/parquet_connector.py +131 -0
  821. tools/databridge/connectors/postgresql.py +58 -0
  822. tools/databridge/connectors/s3.py +65 -0
  823. tools/databridge/connectors/saas_base.py +198 -0
  824. tools/databridge/connectors/salesforce.py +126 -0
  825. tools/databridge/connectors/sap.py +89 -0
  826. tools/databridge/connectors/servicenow.py +60 -0
  827. tools/databridge/connectors/signal_messaging.py +150 -0
  828. tools/databridge/connectors/slack_messaging.py +203 -0
  829. tools/databridge/connectors/smtp_connector.py +126 -0
  830. tools/databridge/connectors/soap_base.py +258 -0
  831. tools/databridge/connectors/splunk_connector.py +171 -0
  832. tools/databridge/connectors/sql_base.py +310 -0
  833. tools/databridge/connectors/sqlite_connector.py +76 -0
  834. tools/databridge/connectors/teams.py +148 -0
  835. tools/databridge/connectors/telegram.py +192 -0
  836. tools/databridge/connectors/whatsapp.py +137 -0
  837. tools/databridge/data_profiler.py +99 -0
  838. tools/databridge/forge/__init__.py +6 -0
  839. tools/databridge/forge/base_selector.py +150 -0
  840. tools/databridge/forge/code_generator.py +206 -0
  841. tools/databridge/forge/community_hub.py +539 -0
  842. tools/databridge/forge/forge_agent.py +306 -0
  843. tools/databridge/forge/import_handler.py +133 -0
  844. tools/databridge/forge/integration_tester.py +127 -0
  845. tools/databridge/forge/marketplace_publisher.py +164 -0
  846. tools/databridge/forge/promoter.py +159 -0
  847. tools/databridge/forge/sandbox_manager.py +257 -0
  848. tools/databridge/forge/spec_parser.py +358 -0
  849. tools/databridge/forge/static_validator.py +363 -0
  850. tools/databridge/forge/templates/__init__.py +591 -0
  851. tools/databridge/format_converter.py +188 -0
  852. tools/databridge/mapping_engine.py +348 -0
  853. tools/databridge/messaging/__init__.py +5 -0
  854. tools/databridge/messaging/agent_bridge.py +254 -0
  855. tools/databridge/messaging/message_envelope.py +111 -0
  856. tools/databridge/messaging/message_logger.py +204 -0
  857. tools/databridge/messaging/messaging_daemon.py +326 -0
  858. tools/databridge/messaging/oauth2_manager.py +411 -0
  859. tools/databridge/pii_detector.py +221 -0
  860. tools/databridge/registry.py +352 -0
  861. tools/databridge/relay_server.py +105 -0
  862. tools/databridge/scale/__init__.py +16 -0
  863. tools/databridge/scale/backpressure.py +134 -0
  864. tools/databridge/scale/chunked_pipeline.py +169 -0
  865. tools/databridge/scale/connection_pool.py +293 -0
  866. tools/databridge/scale/engine.py +492 -0
  867. tools/databridge/scale/worker_pool.py +140 -0
  868. tools/databridge/scale/write_batcher.py +250 -0
  869. tools/databridge/schema_engine.py +324 -0
  870. tools/databridge/stream_manager.py +225 -0
  871. tools/databridge/sync_engine.py +411 -0
  872. tools/databridge/transforms.py +302 -0
  873. tools/db/__init__.py +1 -0
  874. tools/db/backup.py +312 -0
  875. tools/db/backup_manager.py +832 -0
  876. tools/db/init_icdev_db.py +7753 -0
  877. tools/db/init_sparkpilot_db.py +431 -0
  878. tools/db/migrate.py +177 -0
  879. tools/db/migrate_innovation_audit.py +165 -0
  880. tools/db/migration_runner.py +548 -0
  881. tools/db/migrations/001_baseline/meta.json +9 -0
  882. tools/db/migrations/001_baseline/up.py +67 -0
  883. tools/db/migrations/002_memory_enhancements/down.sql +8 -0
  884. tools/db/migrations/002_memory_enhancements/meta.json +9 -0
  885. tools/db/migrations/002_memory_enhancements/up.py +119 -0
  886. tools/db/migrations/003_dev_profiles/meta.json +8 -0
  887. tools/db/migrations/003_dev_profiles/up.py +93 -0
  888. tools/db/migrations/004_innovation_engine/down.py +19 -0
  889. tools/db/migrations/004_innovation_engine/up.py +227 -0
  890. tools/db/migrations/005_phase_37_ai_security/down.py +19 -0
  891. tools/db/migrations/005_phase_37_ai_security/up.py +257 -0
  892. tools/db/migrations/006_phase_36_evolution/down.py +21 -0
  893. tools/db/migrations/006_phase_36_evolution/up.py +323 -0
  894. tools/db/migrations/007_phase_38_cloud/down.py +14 -0
  895. tools/db/migrations/007_phase_38_cloud/up.py +110 -0
  896. tools/db/migrations/008_phase36_37_integration/up.py +55 -0
  897. tools/db/migrations/__init__.py +2 -0
  898. tools/db/pg_migrate.py +642 -0
  899. tools/db/storage.py +1080 -0
  900. tools/decisions/__init__.py +2 -0
  901. tools/decisions/dmn_engine.py +695 -0
  902. tools/devsecops/__init__.py +2 -0
  903. tools/devsecops/attestation_manager.py +449 -0
  904. tools/devsecops/network_segmentation_generator.py +604 -0
  905. tools/devsecops/pdp_config_generator.py +1246 -0
  906. tools/devsecops/pipeline_security_generator.py +475 -0
  907. tools/devsecops/policy_generator.py +644 -0
  908. tools/devsecops/profile_manager.py +374 -0
  909. tools/devsecops/service_mesh_generator.py +1063 -0
  910. tools/devsecops/zta_maturity_scorer.py +355 -0
  911. tools/devsecops/zta_terraform_generator.py +1301 -0
  912. tools/edge_ai/__init__.py +2 -0
  913. tools/edge_ai/model_manager.py +200 -0
  914. tools/embedded/__init__.py +2 -0
  915. tools/embedded/cmake_generator.py +318 -0
  916. tools/embedded/crash_analyzer.py +191 -0
  917. tools/embedded/nl_to_firmware.py +277 -0
  918. tools/events/__init__.py +1 -0
  919. tools/events/event_bus.py +199 -0
  920. tools/finetune/pair_generator.py +832 -0
  921. tools/fleet/__init__.py +2 -0
  922. tools/fleet/device_registry.py +148 -0
  923. tools/fleet/ota_manager.py +153 -0
  924. tools/forge_studio/__init__.py +13 -0
  925. tools/forge_studio/analytics/__init__.py +0 -0
  926. tools/forge_studio/analytics/process_miner.py +383 -0
  927. tools/forge_studio/audit.py +183 -0
  928. tools/forge_studio/blueprint/__init__.py +2 -0
  929. tools/forge_studio/blueprint/build_tracker.py +317 -0
  930. tools/forge_studio/blueprint/export_engine.py +441 -0
  931. tools/forge_studio/blueprint/parent_client.py +335 -0
  932. tools/forge_studio/catalog/__init__.py +2 -0
  933. tools/forge_studio/catalog/component_registry.py +176 -0
  934. tools/forge_studio/catalog/schema_validator.py +193 -0
  935. tools/forge_studio/compliance/__init__.py +1 -0
  936. tools/forge_studio/compliance/compliance_wiring.py +554 -0
  937. tools/forge_studio/deploy/__init__.py +1 -0
  938. tools/forge_studio/deploy/airgap_packager.py +466 -0
  939. tools/forge_studio/deploy/deploy_engine.py +1792 -0
  940. tools/forge_studio/deploy/env_manager.py +431 -0
  941. tools/forge_studio/eject/__init__.py +2 -0
  942. tools/forge_studio/eject/docker_compose_generator.py +237 -0
  943. tools/forge_studio/eject/eject_engine.py +230 -0
  944. tools/forge_studio/eject/expo_scaffolder.py +303 -0
  945. tools/forge_studio/eject/nextjs_scaffolder.py +338 -0
  946. tools/forge_studio/enterprise/__init__.py +0 -0
  947. tools/forge_studio/enterprise/custom_frameworks.py +826 -0
  948. tools/forge_studio/enterprise/hardening_engine.py +1530 -0
  949. tools/forge_studio/enterprise/sso_manager.py +718 -0
  950. tools/forge_studio/enterprise/whitelabel_engine.py +887 -0
  951. tools/forge_studio/formula/__init__.py +0 -0
  952. tools/forge_studio/formula/expression_engine.py +562 -0
  953. tools/forge_studio/formula/formula_registry.py +265 -0
  954. tools/forge_studio/generator/__init__.py +2 -0
  955. tools/forge_studio/generator/app_generator.py +584 -0
  956. tools/forge_studio/generator/complexity_detector.py +368 -0
  957. tools/forge_studio/generator/prompt_templates.py +104 -0
  958. tools/forge_studio/generator/spec_builder.py +192 -0
  959. tools/forge_studio/intake_bridge.py +898 -0
  960. tools/forge_studio/marketplace/__init__.py +0 -0
  961. tools/forge_studio/marketplace/component_hub.py +428 -0
  962. tools/forge_studio/models.py +369 -0
  963. tools/forge_studio/renderer/__init__.py +2 -0
  964. tools/forge_studio/renderer/json_render_engine.py +623 -0
  965. tools/forge_studio/renderer/layout_engine.py +214 -0
  966. tools/forge_studio/renderer/rn_component_map.py +182 -0
  967. tools/forge_studio/supabase/__init__.py +2 -0
  968. tools/forge_studio/supabase/auth_generator.py +283 -0
  969. tools/forge_studio/supabase/migration_generator.py +93 -0
  970. tools/forge_studio/supabase/schema_generator.py +281 -0
  971. tools/forge_studio/tenant_manager.py +387 -0
  972. tools/forge_studio/workflow/__init__.py +2 -0
  973. tools/forge_studio/workflow/bpmn_adapter.py +489 -0
  974. tools/govcon/draft_orchestrator.py +1151 -0
  975. tools/govcon/engine_enrichment.py +373 -0
  976. tools/govcon/knowledge_base.py +487 -0
  977. tools/govcon/knowledge_ingestion.py +510 -0
  978. tools/govcon/sam_scanner.py +754 -0
  979. tools/harness/__init__.py +6 -0
  980. tools/harness/exit_criteria_evaluator.py +231 -0
  981. tools/harness/maturity_assessor.py +347 -0
  982. tools/harness/scaffold_harness.py +416 -0
  983. tools/harness/trace_analyzer.py +281 -0
  984. tools/infra/__init__.py +1 -0
  985. tools/infra/ansible_generator.py +867 -0
  986. tools/infra/dockerfile_generator.py +359 -0
  987. tools/infra/infra_status.py +384 -0
  988. tools/infra/ironbank_metadata_generator.py +403 -0
  989. tools/infra/k8s_generator.py +1000 -0
  990. tools/infra/pipeline_generator.py +830 -0
  991. tools/infra/rollback.py +389 -0
  992. tools/infra/terraform_generator.py +1140 -0
  993. tools/infra/terraform_generator_azure.py +1252 -0
  994. tools/infra/terraform_generator_gcp.py +951 -0
  995. tools/infra/terraform_generator_ibm.py +359 -0
  996. tools/infra/terraform_generator_oci.py +918 -0
  997. tools/infra/terraform_generator_onprem.py +318 -0
  998. tools/knowledge/__init__.py +1 -0
  999. tools/knowledge/knowledge_ingest.py +281 -0
  1000. tools/knowledge/pattern_detector.py +681 -0
  1001. tools/knowledge/recommendation_engine.py +449 -0
  1002. tools/knowledge/self_heal_analyzer.py +492 -0
  1003. tools/knowledge_graph/__init__.py +2 -0
  1004. tools/knowledge_graph/graph_rag.py +498 -0
  1005. tools/knowledge_graph/ingester.py +406 -0
  1006. tools/knowledge_graph/insight_generator.py +369 -0
  1007. tools/knowledge_graph/text_network.py +832 -0
  1008. tools/llm/__init__.py +72 -0
  1009. tools/llm/anthropic_provider.py +170 -0
  1010. tools/llm/azure_openai_provider.py +338 -0
  1011. tools/llm/bedrock_provider.py +315 -0
  1012. tools/llm/embedding_provider.py +438 -0
  1013. tools/llm/gemini_provider.py +381 -0
  1014. tools/llm/ibm_watsonx_provider.py +231 -0
  1015. tools/llm/oci_genai_provider.py +462 -0
  1016. tools/llm/ollama_provider.py +350 -0
  1017. tools/llm/openai_provider.py +225 -0
  1018. tools/llm/prompt_registry.py +447 -0
  1019. tools/llm/provider.py +355 -0
  1020. tools/llm/provider_sdk.py +175 -0
  1021. tools/llm/router.py +1124 -0
  1022. tools/llm/semantic_cache.py +394 -0
  1023. tools/llm/vertex_ai_provider.py +374 -0
  1024. tools/maintenance/__init__.py +2 -0
  1025. tools/maintenance/dependency_scanner.py +1016 -0
  1026. tools/maintenance/maintenance_auditor.py +804 -0
  1027. tools/maintenance/remediation_engine.py +957 -0
  1028. tools/maintenance/vulnerability_checker.py +978 -0
  1029. tools/manifest.md +1066 -0
  1030. tools/marketplace/asset_installer.py +639 -0
  1031. tools/marketplace/feedback_validator.py +359 -0
  1032. tools/marketplace/license_client.py +458 -0
  1033. tools/marketplace/module_crypto.py +544 -0
  1034. tools/marketplace/module_runtime.py +236 -0
  1035. tools/marketplace/token_store.py +264 -0
  1036. tools/mbse/__init__.py +3 -0
  1037. tools/mbse/des_assessor.py +1173 -0
  1038. tools/mbse/des_report_generator.py +787 -0
  1039. tools/mbse/diagram_extractor.py +792 -0
  1040. tools/mbse/digital_thread.py +1650 -0
  1041. tools/mbse/model_code_generator.py +1115 -0
  1042. tools/mbse/model_control_mapper.py +410 -0
  1043. tools/mbse/pi_model_tracker.py +1079 -0
  1044. tools/mbse/reqif_parser.py +1468 -0
  1045. tools/mbse/sync_engine.py +1789 -0
  1046. tools/mbse/thread_heatmap.py +445 -0
  1047. tools/mbse/xmi_parser.py +1558 -0
  1048. tools/mcp/builder_server.py +64 -0
  1049. tools/mcp/compliance_server.py +64 -0
  1050. tools/mcp/connector_forge_server.py +155 -0
  1051. tools/mcp/core_server.py +64 -0
  1052. tools/mcp/devsecops_server.py +11 -0
  1053. tools/mcp/devsecops_zta_server.py +64 -0
  1054. tools/mcp/knowledge_server.py +64 -0
  1055. tools/mcp/monitor_server.py +64 -0
  1056. tools/mcp/ops_server.py +300 -0
  1057. tools/mcp/requirements_analyst_server.py +64 -0
  1058. tools/mcp/requirements_server.py +11 -0
  1059. tools/mcp/security_server.py +64 -0
  1060. tools/mcp/simulation_server.py +64 -0
  1061. tools/mcp/supply_chain_server.py +64 -0
  1062. tools/mcp/tool_registry.py +299 -0
  1063. tools/memory/__init__.py +2 -0
  1064. tools/memory/auto_capture.py +346 -0
  1065. tools/memory/embed_memory.py +157 -0
  1066. tools/memory/history_compressor.py +334 -0
  1067. tools/memory/hybrid_search.py +235 -0
  1068. tools/memory/maintenance_cron.py +288 -0
  1069. tools/memory/memory_consolidation.py +439 -0
  1070. tools/memory/memory_db.py +132 -0
  1071. tools/memory/memory_read.py +101 -0
  1072. tools/memory/memory_write.py +221 -0
  1073. tools/memory/semantic_search.py +138 -0
  1074. tools/memory/time_decay.py +434 -0
  1075. tools/missions/__init__.py +2 -0
  1076. tools/missions/mission_engine.py +459 -0
  1077. tools/monitor/__init__.py +1 -0
  1078. tools/monitor/alert_correlator.py +486 -0
  1079. tools/monitor/auto_resolver.py +603 -0
  1080. tools/monitor/health_checker.py +507 -0
  1081. tools/monitor/heartbeat_daemon.py +779 -0
  1082. tools/monitor/log_analyzer.py +507 -0
  1083. tools/monitor/metric_collector.py +484 -0
  1084. tools/mosa/__init__.py +10 -0
  1085. tools/mosa/icd_generator.py +358 -0
  1086. tools/mosa/modular_design_analyzer.py +682 -0
  1087. tools/mosa/mosa_code_enforcer.py +348 -0
  1088. tools/mosa/tsp_generator.py +265 -0
  1089. tools/observability/__init__.py +100 -0
  1090. tools/observability/genai_attributes.py +88 -0
  1091. tools/observability/instrumentation.py +140 -0
  1092. tools/observability/mlflow_exporter.py +193 -0
  1093. tools/observability/otel_tracer.py +168 -0
  1094. tools/observability/provenance/__init__.py +3 -0
  1095. tools/observability/provenance/prov_recorder.py +322 -0
  1096. tools/observability/shap/__init__.py +3 -0
  1097. tools/observability/shap/agent_shap.py +274 -0
  1098. tools/observability/sqlite_tracer.py +360 -0
  1099. tools/observability/trace_context.py +205 -0
  1100. tools/observability/tracer.py +230 -0
  1101. tools/orchestration/__init__.py +1 -0
  1102. tools/orchestration/peer_channels.py +254 -0
  1103. tools/orchestration/saga_coordinator.py +390 -0
  1104. tools/project/__init__.py +1 -0
  1105. tools/project/manifest_loader.py +418 -0
  1106. tools/project/project_create.py +350 -0
  1107. tools/project/project_list.py +171 -0
  1108. tools/project/project_scaffold.py +1715 -0
  1109. tools/project/project_status.py +478 -0
  1110. tools/project/session_context_builder.py +752 -0
  1111. tools/project/validate_manifest.py +54 -0
  1112. tools/rag/corrective_rag.py +582 -0
  1113. tools/rag/source_registry.py +482 -0
  1114. tools/requirements/__init__.py +1 -0
  1115. tools/requirements/ai_governance_scorer.py +207 -0
  1116. tools/requirements/boundary_analyzer.py +1281 -0
  1117. tools/requirements/clarification_engine.py +605 -0
  1118. tools/requirements/complexity_scorer.py +369 -0
  1119. tools/requirements/consistency_analyzer.py +789 -0
  1120. tools/requirements/constitution_manager.py +592 -0
  1121. tools/requirements/decomposition_engine.py +764 -0
  1122. tools/requirements/document_extractor.py +1002 -0
  1123. tools/requirements/elicitation_techniques.py +508 -0
  1124. tools/requirements/gap_detector.py +260 -0
  1125. tools/requirements/intake_engine.py +2175 -0
  1126. tools/requirements/prd_generator.py +839 -0
  1127. tools/requirements/prd_validator.py +584 -0
  1128. tools/requirements/readiness_scorer.py +302 -0
  1129. tools/requirements/spec_organizer.py +1015 -0
  1130. tools/requirements/spec_quality_checker.py +1083 -0
  1131. tools/requirements/traceability_builder.py +566 -0
  1132. tools/research/__init__.py +3 -0
  1133. tools/research/academic_scanner.py +130 -0
  1134. tools/research/build_buy_analyzer.py +229 -0
  1135. tools/research/challenge_scorer.py +280 -0
  1136. tools/research/community_scanner.py +174 -0
  1137. tools/research/cross_engine_bridge.py +124 -0
  1138. tools/research/dossier_generator.py +305 -0
  1139. tools/research/landscape_scanner.py +315 -0
  1140. tools/research/regulatory_scanner.py +248 -0
  1141. tools/research/research_manager.py +469 -0
  1142. tools/research/source_scanner.py +150 -0
  1143. tools/research/vertical_loader.py +118 -0
  1144. tools/saas/__init__.py +0 -0
  1145. tools/saas/licensing/__init__.py +0 -0
  1146. tools/saas/licensing/license_validator.py +345 -0
  1147. tools/scaffold/__init__.py +2 -0
  1148. tools/scaffold/golden_path.py +504 -0
  1149. tools/security/__init__.py +1 -0
  1150. tools/security/agent_output_validator.py +330 -0
  1151. tools/security/agent_trust_scorer.py +652 -0
  1152. tools/security/ai_bom_generator.py +718 -0
  1153. tools/security/ai_telemetry_logger.py +469 -0
  1154. tools/security/atlas_red_team.py +541 -0
  1155. tools/security/code_pattern_scanner.py +382 -0
  1156. tools/security/confabulation_detector.py +265 -0
  1157. tools/security/container_scanner.py +489 -0
  1158. tools/security/dependency_auditor.py +942 -0
  1159. tools/security/endpoint_security_scanner.py +626 -0
  1160. tools/security/mcp_tool_authorizer.py +242 -0
  1161. tools/security/output_verifier.py +427 -0
  1162. tools/security/prompt_injection_detector.py +737 -0
  1163. tools/security/sast_runner.py +946 -0
  1164. tools/security/secret_detector.py +376 -0
  1165. tools/security/threat_modeler.py +678 -0
  1166. tools/security/tool_chain_validator.py +357 -0
  1167. tools/security/vuln_scanner.py +536 -0
  1168. tools/simulation/__init__.py +2 -0
  1169. tools/simulation/ato_simulator.py +517 -0
  1170. tools/simulation/coa_generator.py +1539 -0
  1171. tools/simulation/monte_carlo.py +745 -0
  1172. tools/simulation/scenario_manager.py +1060 -0
  1173. tools/simulation/simulation_engine.py +1091 -0
  1174. tools/simulator/__init__.py +2 -0
  1175. tools/simulator/sim_runner.py +272 -0
  1176. tools/supply_chain/__init__.py +2 -0
  1177. tools/supply_chain/cve_triager.py +690 -0
  1178. tools/supply_chain/dependency_graph.py +630 -0
  1179. tools/supply_chain/isa_manager.py +526 -0
  1180. tools/supply_chain/scrm_assessor.py +531 -0
  1181. tools/supply_chain/slsa_verifier.py +473 -0
  1182. tools/testing/__init__.py +2 -0
  1183. tools/testing/acceptance_validator.py +411 -0
  1184. tools/testing/api_surface_extractor.py +749 -0
  1185. tools/testing/claude_dir_validator.py +831 -0
  1186. tools/testing/data_types.py +199 -0
  1187. tools/testing/e2e_runner.py +715 -0
  1188. tools/testing/fuzz_cli.py +306 -0
  1189. tools/testing/health_check.py +483 -0
  1190. tools/testing/platform_check.py +143 -0
  1191. tools/testing/production_audit.py +1836 -0
  1192. tools/testing/production_remediate.py +803 -0
  1193. tools/testing/screenshot_validator.py +538 -0
  1194. tools/testing/smoke_test.py +283 -0
  1195. tools/testing/test_agent_models.py +117 -0
  1196. tools/testing/test_orchestrator.py +957 -0
  1197. tools/testing/utils.py +229 -0
  1198. tools/writeguard/__init__.py +1 -0
  1199. tools/writeguard/main.py +1 -0
  1200. tools/writing/__init__.py +7 -0
  1201. tools/writing/ai_content_detector.py +316 -0
  1202. tools/writing/analysis_engine.py +454 -0
  1203. tools/writing/batch_analyzer.py +276 -0
  1204. tools/writing/coherence_analyzer.py +221 -0
  1205. tools/writing/govcon_bridge.py +509 -0
  1206. tools/writing/grammar_checker.py +270 -0
  1207. tools/writing/plagiarism_detector.py +106 -0
  1208. tools/writing/readability_scorer.py +201 -0
  1209. tools/writing/rewriter.py +96 -0
  1210. tools/writing/signal_registrar.py +167 -0
  1211. tools/writing/snippet_manager.py +276 -0
  1212. tools/writing/style_enforcer.py +220 -0
  1213. tools/writing/style_guide_manager.py +438 -0
  1214. tools/writing/tone_profiler.py +168 -0
@@ -0,0 +1,1159 @@
1
+ #!/usr/bin/env python3
2
+ # CUI // SP-CTI
3
+ # Controlled by: Department of Defense
4
+ # CUI Category: CTI
5
+ # Distribution: D
6
+ # POC: ICDEV System Administrator
7
+ """Universal Data Classification and Marking Manager for ICDEV.
8
+
9
+ Extends classification_manager.py to support multi-regime data categories
10
+ (CUI, PHI, PCI, CJIS, PII, FTI, ITAR, SECRET) with composable markings.
11
+ A single artifact can carry multiple category markings simultaneously
12
+ (ADR D109).
13
+
14
+ Loads configuration from args/classification_config.yaml and data type
15
+ definitions from context/compliance/data_type_registry.json.
16
+
17
+ Backward-compatible: all existing classification_manager.py functions
18
+ continue to work. This module adds multi-category support on top.
19
+
20
+ CLI:
21
+ # List all data categories
22
+ python tools/compliance/universal_classification_manager.py --list-categories
23
+
24
+ # Show marking for a single category
25
+ python tools/compliance/universal_classification_manager.py --category PHI --banner
26
+
27
+ # Composite marking for multiple categories
28
+ python tools/compliance/universal_classification_manager.py --categories CUI,PHI,PCI --banner
29
+
30
+ # Code header with composite markings
31
+ python tools/compliance/universal_classification_manager.py --categories CUI,PHI --code-header python
32
+
33
+ # Detect data categories from project metadata
34
+ python tools/compliance/universal_classification_manager.py --detect --project-id proj-123
35
+
36
+ # Validate project data markings
37
+ python tools/compliance/universal_classification_manager.py --validate --project-id proj-123
38
+
39
+ # JSON output
40
+ python tools/compliance/universal_classification_manager.py --categories CUI,PHI --banner --json
41
+ """
42
+
43
+ import argparse
44
+ import json
45
+ import sqlite3
46
+ import sys
47
+ from datetime import datetime, timezone
48
+ from pathlib import Path
49
+ from typing import Dict, List, Optional
50
+ from tools.db.storage import get_connection
51
+
52
+ # ---------------------------------------------------------------------------
53
+ # Paths
54
+ # ---------------------------------------------------------------------------
55
+
56
+ BASE_DIR = Path(__file__).resolve().parent.parent.parent
57
+ CONFIG_PATH = BASE_DIR / "args" / "classification_config.yaml"
58
+ REGISTRY_PATH = BASE_DIR / "context" / "compliance" / "data_type_registry.json"
59
+ FRAMEWORK_MAP_PATH = BASE_DIR / "context" / "compliance" / "data_type_framework_map.json"
60
+
61
+ # Module-level caches
62
+ _CONFIG_CACHE: Optional[Dict] = None
63
+ _REGISTRY_CACHE: Optional[Dict] = None
64
+ _FRAMEWORK_MAP_CACHE: Optional[Dict] = None
65
+
66
+ # ---------------------------------------------------------------------------
67
+ # Sensitivity ordering (highest to lowest)
68
+ # ---------------------------------------------------------------------------
69
+
70
+ SENSITIVITY_ORDER = [
71
+ "TOP_SECRET", "SECRET", "CUI", "ITAR", "FTI",
72
+ "CJIS", "PHI", "PCI", "PII", "PUBLIC",
73
+ ]
74
+
75
+ # Backward-compatible aliases
76
+ _CATEGORY_ALIASES = {
77
+ "TOP SECRET": "TOP_SECRET",
78
+ "TOP SECRET//SCI": "TOP_SECRET",
79
+ "TS": "TOP_SECRET",
80
+ "S": "SECRET",
81
+ "HIPAA": "PHI",
82
+ "PCI DSS": "PCI",
83
+ "PCI-DSS": "PCI",
84
+ "FBI CJIS": "CJIS",
85
+ "IRS 1075": "FTI",
86
+ "NIST 800-122": "PII",
87
+ }
88
+
89
+ # Comment style mapping
90
+ _COMMENT_STYLES = {
91
+ "python": "hash", "ruby": "hash", "yaml": "hash",
92
+ "terraform": "hash", "dockerfile": "hash",
93
+ "java": "c_style", "go": "c_style", "rust": "c_style",
94
+ "csharp": "c_style", "c#": "c_style",
95
+ "typescript": "c_style", "javascript": "c_style",
96
+ "xml": "xml_style", "html": "xml_style",
97
+ "sql": "sql_style",
98
+ }
99
+
100
+
101
+ # ---------------------------------------------------------------------------
102
+ # Config / registry loaders
103
+ # ---------------------------------------------------------------------------
104
+
105
+ def _load_yaml(path: Path) -> Dict:
106
+ """Load YAML file with fallback to simple parsing if PyYAML unavailable."""
107
+ if not path.exists():
108
+ return {}
109
+ try:
110
+ import yaml
111
+ with open(path, "r", encoding="utf-8") as f:
112
+ return yaml.safe_load(f) or {}
113
+ except ImportError:
114
+ return {}
115
+
116
+
117
+ def load_config() -> Dict:
118
+ """Load and cache classification configuration from YAML."""
119
+ global _CONFIG_CACHE
120
+ if _CONFIG_CACHE is not None:
121
+ return _CONFIG_CACHE
122
+ _CONFIG_CACHE = _load_yaml(CONFIG_PATH)
123
+ return _CONFIG_CACHE
124
+
125
+
126
+ def load_registry() -> List[Dict]:
127
+ """Load and cache data type registry from JSON."""
128
+ global _REGISTRY_CACHE
129
+ if _REGISTRY_CACHE is not None:
130
+ return _REGISTRY_CACHE
131
+ if not REGISTRY_PATH.exists():
132
+ _REGISTRY_CACHE = []
133
+ return _REGISTRY_CACHE
134
+ with open(REGISTRY_PATH, "r", encoding="utf-8") as f:
135
+ data = json.load(f)
136
+ _REGISTRY_CACHE = data.get("data_types", [])
137
+ return _REGISTRY_CACHE
138
+
139
+
140
+ def load_framework_map() -> Dict:
141
+ """Load and cache data-type-to-framework mapping from JSON."""
142
+ global _FRAMEWORK_MAP_CACHE
143
+ if _FRAMEWORK_MAP_CACHE is not None:
144
+ return _FRAMEWORK_MAP_CACHE
145
+ if not FRAMEWORK_MAP_PATH.exists():
146
+ _FRAMEWORK_MAP_CACHE = {}
147
+ return _FRAMEWORK_MAP_CACHE
148
+ with open(FRAMEWORK_MAP_PATH, "r", encoding="utf-8") as f:
149
+ _FRAMEWORK_MAP_CACHE = json.load(f)
150
+ return _FRAMEWORK_MAP_CACHE
151
+
152
+
153
+ def _normalize_category(category: str) -> str:
154
+ """Normalize a category string to its canonical form."""
155
+ upper = category.upper().strip()
156
+ return _CATEGORY_ALIASES.get(upper, upper)
157
+
158
+
159
+ def get_category_config(category: str) -> Dict:
160
+ """Return the configuration dict for a single data category.
161
+
162
+ Args:
163
+ category: Data category identifier (e.g., CUI, PHI, PCI, CJIS).
164
+
165
+ Returns:
166
+ Dict with full_name, governing_framework, marking_prefix,
167
+ banner_template, portion_marking, distribution, controlled_by,
168
+ handling_requirements, etc.
169
+ """
170
+ norm = _normalize_category(category)
171
+ config = load_config()
172
+ categories = config.get("data_categories", {})
173
+ cat_config = categories.get(norm)
174
+ if cat_config is None:
175
+ return {
176
+ "full_name": norm,
177
+ "governing_framework": "Unknown",
178
+ "marking_prefix": norm,
179
+ "banner_template": f"{norm} // Custom",
180
+ "portion_marking": f"({norm})",
181
+ "distribution": "Restricted",
182
+ "controlled_by": "Data Owner",
183
+ "handling_requirements": [],
184
+ }
185
+ return cat_config
186
+
187
+
188
+ def list_categories() -> List[Dict]:
189
+ """Return a list of all supported data categories with summary info."""
190
+ config = load_config()
191
+ categories = config.get("data_categories", {})
192
+ result = []
193
+ for cat_id, cat_config in categories.items():
194
+ result.append({
195
+ "id": cat_id,
196
+ "full_name": cat_config.get("full_name", cat_id),
197
+ "governing_framework": cat_config.get("governing_framework", ""),
198
+ "marking_prefix": cat_config.get("marking_prefix", cat_id),
199
+ "portion_marking": cat_config.get("portion_marking", ""),
200
+ "sensitivity_rank": SENSITIVITY_ORDER.index(cat_id)
201
+ if cat_id in SENSITIVITY_ORDER else 99,
202
+ })
203
+ result.sort(key=lambda x: x["sensitivity_rank"])
204
+ return result
205
+
206
+
207
+ # ---------------------------------------------------------------------------
208
+ # Composite marking functions (ADR D109)
209
+ # ---------------------------------------------------------------------------
210
+
211
+ def get_composite_banner(
212
+ categories: List[str],
213
+ subcategories: Optional[Dict[str, str]] = None,
214
+ ) -> str:
215
+ """Generate a composite document banner for multiple data categories.
216
+
217
+ Args:
218
+ categories: List of data category IDs (e.g., ["CUI", "PHI", "PCI"]).
219
+ subcategories: Optional dict mapping category to subcategory
220
+ (e.g., {"CUI": "CTI"}).
221
+
222
+ Returns:
223
+ Multi-line banner string with all applicable markings.
224
+ """
225
+ if not categories:
226
+ return ""
227
+
228
+ subcategories = subcategories or {}
229
+ normalized = [_normalize_category(c) for c in categories]
230
+
231
+ # Sort by sensitivity (highest first)
232
+ normalized.sort(
233
+ key=lambda c: SENSITIVITY_ORDER.index(c)
234
+ if c in SENSITIVITY_ORDER else 99
235
+ )
236
+
237
+ # Build banner lines for each category
238
+ banner_parts = []
239
+ distributions = []
240
+ controllers = []
241
+
242
+ for cat in normalized:
243
+ cat_config = get_category_config(cat)
244
+ template = cat_config.get("banner_template", f"{cat} // Custom")
245
+
246
+ # Substitute subcategory/dissemination if present
247
+ subcat = subcategories.get(cat, "")
248
+ banner_line = template.format(
249
+ subcategory=subcat or cat_config.get("marking_prefix", cat),
250
+ dissemination=subcat or "NOFORN",
251
+ )
252
+ banner_parts.append(banner_line)
253
+
254
+ dist = cat_config.get("distribution", "")
255
+ if dist and dist not in distributions:
256
+ distributions.append(dist)
257
+
258
+ ctrl = cat_config.get("controlled_by", "")
259
+ if ctrl and ctrl not in controllers:
260
+ controllers.append(ctrl)
261
+
262
+ # Compose the banner
263
+ separator = " | "
264
+ combined_marking = separator.join(banner_parts)
265
+ combined_dist = "; ".join(distributions) if distributions else "Restricted"
266
+ combined_ctrl = "; ".join(controllers) if controllers else "Data Owner"
267
+
268
+ return (
269
+ f"////////////////////////////////////////////////////////////////////\n"
270
+ f"{combined_marking}\n"
271
+ f"Distribution: {combined_dist}\n"
272
+ f"Controlled by: {combined_ctrl}\n"
273
+ f"////////////////////////////////////////////////////////////////////"
274
+ )
275
+
276
+
277
+ def get_composite_footer(categories: List[str]) -> str:
278
+ """Generate a composite document footer for multiple data categories."""
279
+ if not categories:
280
+ return ""
281
+
282
+ normalized = [_normalize_category(c) for c in categories]
283
+ normalized.sort(
284
+ key=lambda c: SENSITIVITY_ORDER.index(c)
285
+ if c in SENSITIVITY_ORDER else 99
286
+ )
287
+
288
+ parts = []
289
+ controllers = []
290
+ for cat in normalized:
291
+ cat_config = get_category_config(cat)
292
+ parts.append(cat_config.get("marking_prefix", cat))
293
+ ctrl = cat_config.get("controlled_by", "")
294
+ if ctrl and ctrl not in controllers:
295
+ controllers.append(ctrl)
296
+
297
+ marking_line = " | ".join(parts)
298
+ ctrl_line = "; ".join(controllers) if controllers else "Data Owner"
299
+
300
+ return (
301
+ f"////////////////////////////////////////////////////////////////////\n"
302
+ f"{marking_line} | {ctrl_line}\n"
303
+ f"////////////////////////////////////////////////////////////////////"
304
+ )
305
+
306
+
307
+ def get_composite_portion_marking(categories: List[str]) -> str:
308
+ """Generate an inline composite portion marking.
309
+
310
+ Returns something like "(CUI/PHI/PCI)".
311
+ """
312
+ if not categories:
313
+ return ""
314
+
315
+ normalized = [_normalize_category(c) for c in categories]
316
+ normalized.sort(
317
+ key=lambda c: SENSITIVITY_ORDER.index(c)
318
+ if c in SENSITIVITY_ORDER else 99
319
+ )
320
+
321
+ short_marks = []
322
+ for cat in normalized:
323
+ cat_config = get_category_config(cat)
324
+ portion = cat_config.get("portion_marking", f"({cat})")
325
+ # Strip parens for composition
326
+ inner = portion.strip("()")
327
+ if inner:
328
+ short_marks.append(inner)
329
+
330
+ return f"({'|'.join(short_marks)})" if short_marks else ""
331
+
332
+
333
+ def get_composite_code_header(
334
+ categories: List[str],
335
+ language: str = "python",
336
+ subcategories: Optional[Dict[str, str]] = None,
337
+ ) -> str:
338
+ """Generate a code file header with composite markings.
339
+
340
+ Args:
341
+ categories: Data category list.
342
+ language: Programming language key.
343
+ subcategories: Optional subcategory overrides.
344
+
345
+ Returns:
346
+ Multi-line comment block for the top of a source file.
347
+ """
348
+ subcategories = subcategories or {}
349
+ normalized = [_normalize_category(c) for c in categories]
350
+ normalized.sort(
351
+ key=lambda c: SENSITIVITY_ORDER.index(c)
352
+ if c in SENSITIVITY_ORDER else 99
353
+ )
354
+
355
+ # Build header lines
356
+ header_lines = []
357
+
358
+ # First line: combined marking
359
+ parts = []
360
+ for cat in normalized:
361
+ cat_config = get_category_config(cat)
362
+ template = cat_config.get("banner_template", f"{cat} // Custom")
363
+ subcat = subcategories.get(cat, "")
364
+ line = template.format(
365
+ subcategory=subcat or cat_config.get("marking_prefix", cat),
366
+ dissemination=subcat or "NOFORN",
367
+ )
368
+ parts.append(line)
369
+ header_lines.append(" | ".join(parts))
370
+
371
+ # Controller lines
372
+ controllers = []
373
+ for cat in normalized:
374
+ cat_config = get_category_config(cat)
375
+ ctrl = cat_config.get("controlled_by", "")
376
+ if ctrl and ctrl not in controllers:
377
+ controllers.append(ctrl)
378
+ if controllers:
379
+ header_lines.append(f"Controlled by: {'; '.join(controllers)}")
380
+
381
+ # Category-specific lines
382
+ for cat in normalized:
383
+ cat_config = get_category_config(cat)
384
+ fw = cat_config.get("governing_framework", "")
385
+ if fw:
386
+ header_lines.append(f"{cat} Framework: {fw}")
387
+
388
+ header_lines.append("Distribution: Restricted -- See applicable framework policies")
389
+ header_lines.append("POC: ICDEV System Administrator")
390
+
391
+ # Apply comment style
392
+ lang_lower = language.lower()
393
+ style = _COMMENT_STYLES.get(lang_lower, "hash")
394
+
395
+ result_lines: List[str] = []
396
+ if style == "hash":
397
+ for line in header_lines:
398
+ result_lines.append(f"# {line}")
399
+ elif style == "c_style":
400
+ for line in header_lines:
401
+ result_lines.append(f"// {line}")
402
+ elif style == "xml_style":
403
+ result_lines.append("<!--")
404
+ for line in header_lines:
405
+ result_lines.append(f" {line}")
406
+ result_lines.append("-->")
407
+ elif style == "sql_style":
408
+ for line in header_lines:
409
+ result_lines.append(f"-- {line}")
410
+ else:
411
+ for line in header_lines:
412
+ result_lines.append(f"# {line}")
413
+
414
+ return "\n".join(result_lines) + "\n"
415
+
416
+
417
+ def get_composite_handling_requirements(categories: List[str]) -> List[str]:
418
+ """Return the union of all handling requirements for the given categories.
419
+
420
+ This is the set of ALL requirements from ALL categories -- the artifact
421
+ must satisfy every one.
422
+ """
423
+ requirements = []
424
+ seen = set()
425
+ for cat in categories:
426
+ cat_config = get_category_config(_normalize_category(cat))
427
+ for req in cat_config.get("handling_requirements", []):
428
+ if req not in seen:
429
+ requirements.append(req)
430
+ seen.add(req)
431
+ return requirements
432
+
433
+
434
+ def get_highest_sensitivity(categories: List[str]) -> str:
435
+ """Return the highest-sensitivity category from the list."""
436
+ if not categories:
437
+ return "PUBLIC"
438
+ normalized = [_normalize_category(c) for c in categories]
439
+ best = "PUBLIC"
440
+ best_rank = len(SENSITIVITY_ORDER)
441
+ for cat in normalized:
442
+ rank = SENSITIVITY_ORDER.index(cat) if cat in SENSITIVITY_ORDER else 99
443
+ if rank < best_rank:
444
+ best = cat
445
+ best_rank = rank
446
+ return best
447
+
448
+
449
+ # ---------------------------------------------------------------------------
450
+ # Upgrade markings across categories
451
+ # ---------------------------------------------------------------------------
452
+
453
+ def upgrade_composite_markings(
454
+ content: str,
455
+ old_categories: List[str],
456
+ new_categories: List[str],
457
+ ) -> str:
458
+ """Replace composite markings in content when categories change.
459
+
460
+ Generates old and new banners/footers/portion markings and replaces
461
+ them in the content string.
462
+
463
+ Args:
464
+ content: Document or code content.
465
+ old_categories: Previous set of categories.
466
+ new_categories: New set of categories.
467
+
468
+ Returns:
469
+ Updated content with new markings.
470
+ """
471
+ if set(old_categories) == set(new_categories):
472
+ return content
473
+
474
+ result = content
475
+
476
+ # Replace banner
477
+ old_banner = get_composite_banner(old_categories)
478
+ new_banner = get_composite_banner(new_categories)
479
+ if old_banner:
480
+ result = result.replace(old_banner, new_banner)
481
+
482
+ # Replace footer
483
+ old_footer = get_composite_footer(old_categories)
484
+ new_footer = get_composite_footer(new_categories)
485
+ if old_footer:
486
+ result = result.replace(old_footer, new_footer)
487
+
488
+ # Replace portion markings
489
+ old_portion = get_composite_portion_marking(old_categories)
490
+ new_portion = get_composite_portion_marking(new_categories)
491
+ if old_portion and new_portion:
492
+ result = result.replace(old_portion, new_portion)
493
+
494
+ return result
495
+
496
+
497
+ # ---------------------------------------------------------------------------
498
+ # Database helpers
499
+ # ---------------------------------------------------------------------------
500
+
501
+
502
+ def _ensure_tables(conn: sqlite3.Connection) -> None:
503
+ """Ensure data_classifications table exists."""
504
+ conn.executescript("""
505
+ CREATE TABLE IF NOT EXISTS data_classifications (
506
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
507
+ project_id TEXT NOT NULL,
508
+ data_category TEXT NOT NULL,
509
+ subcategory TEXT,
510
+ source TEXT DEFAULT 'manual',
511
+ confidence REAL DEFAULT 1.0,
512
+ added_by TEXT DEFAULT 'icdev-compliance-engine',
513
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
514
+ UNIQUE(project_id, data_category)
515
+ );
516
+
517
+ CREATE TABLE IF NOT EXISTS framework_applicability (
518
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
519
+ project_id TEXT NOT NULL,
520
+ framework_id TEXT NOT NULL,
521
+ source TEXT DEFAULT 'auto_detected'
522
+ CHECK(source IN ('auto_detected', 'manual', 'inherited')),
523
+ confirmed INTEGER DEFAULT 0,
524
+ confirmed_by TEXT,
525
+ confirmed_at TIMESTAMP,
526
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
527
+ UNIQUE(project_id, framework_id)
528
+ );
529
+
530
+ CREATE INDEX IF NOT EXISTS idx_dc_project
531
+ ON data_classifications(project_id);
532
+ CREATE INDEX IF NOT EXISTS idx_fa_project
533
+ ON framework_applicability(project_id);
534
+ """)
535
+ conn.commit()
536
+
537
+
538
+ def _log_audit_event(
539
+ conn: sqlite3.Connection,
540
+ project_id: str,
541
+ action: str,
542
+ details: Dict,
543
+ ) -> None:
544
+ """Log an append-only audit event."""
545
+ try:
546
+ conn.execute(
547
+ """INSERT INTO audit_trail
548
+ (project_id, event_type, actor, action, details,
549
+ affected_files, classification)
550
+ VALUES (?, ?, ?, ?, ?, ?, ?)""",
551
+ (
552
+ project_id,
553
+ "classification.validation",
554
+ "icdev-compliance-engine",
555
+ action,
556
+ json.dumps(details),
557
+ json.dumps([]),
558
+ "CUI",
559
+ ),
560
+ )
561
+ conn.commit()
562
+ except Exception as exc:
563
+ print(f"Warning: Could not log audit event: {exc}", file=sys.stderr)
564
+
565
+
566
+ # ---------------------------------------------------------------------------
567
+ # Project data category management
568
+ # ---------------------------------------------------------------------------
569
+
570
+ def add_project_data_category(
571
+ project_id: str,
572
+ data_category: str,
573
+ subcategory: Optional[str] = None,
574
+ source: str = "manual",
575
+ confidence: float = 1.0,
576
+ db_path: Optional[Path] = None,
577
+ ) -> Dict:
578
+ """Add a data category to a project.
579
+
580
+ Args:
581
+ project_id: Project identifier.
582
+ data_category: Category ID (CUI, PHI, PCI, CJIS, etc.).
583
+ subcategory: Optional subcategory (e.g., CTI for CUI).
584
+ source: How this was determined (manual, auto_detected).
585
+ confidence: Confidence score for auto-detected categories.
586
+ db_path: Optional database path override.
587
+
588
+ Returns:
589
+ Dict with status and the category record.
590
+ """
591
+ norm = _normalize_category(data_category)
592
+ conn = get_connection(db_path=db_path)
593
+ try:
594
+ _ensure_tables(conn)
595
+ conn.execute(
596
+ """INSERT OR REPLACE INTO data_classifications
597
+ (project_id, data_category, subcategory, source, confidence)
598
+ VALUES (?, ?, ?, ?, ?)""",
599
+ (project_id, norm, subcategory, source, confidence),
600
+ )
601
+ conn.commit()
602
+
603
+ _log_audit_event(conn, project_id, "Data category added", {
604
+ "data_category": norm,
605
+ "subcategory": subcategory,
606
+ "source": source,
607
+ "confidence": confidence,
608
+ "timestamp": datetime.now(timezone.utc).isoformat(),
609
+ })
610
+
611
+ return {
612
+ "status": "added",
613
+ "project_id": project_id,
614
+ "data_category": norm,
615
+ "subcategory": subcategory,
616
+ "source": source,
617
+ }
618
+ finally:
619
+ conn.close()
620
+
621
+
622
+ def get_project_data_categories(
623
+ project_id: str,
624
+ db_path: Optional[Path] = None,
625
+ ) -> List[Dict]:
626
+ """Return all data categories assigned to a project."""
627
+ conn = get_connection(db_path=db_path)
628
+ try:
629
+ _ensure_tables(conn)
630
+ rows = conn.execute(
631
+ """SELECT data_category, subcategory, source, confidence, created_at
632
+ FROM data_classifications
633
+ WHERE project_id = ?
634
+ ORDER BY created_at""",
635
+ (project_id,),
636
+ ).fetchall()
637
+ return [dict(row) for row in rows]
638
+ finally:
639
+ conn.close()
640
+
641
+
642
+ def _resolve_default_categories(
643
+ project_id: str,
644
+ db_path: Optional[Path] = None,
645
+ ) -> list:
646
+ """Resolve default data categories from project metadata (ADR D132).
647
+
648
+ Called when no explicit data_classifications exist for a project.
649
+ Resolution:
650
+ - Public / IL4 -> empty (no marking required)
651
+ - SECRET / IL4 -> SECRET
652
+ - IL4/IL4 or CUI -> CUI (backward compat per ADR D54)
653
+ - Unknown -> CUI (conservative default)
654
+ """
655
+ try:
656
+ conn = get_connection(db_path=db_path)
657
+ row = conn.execute(
658
+ "SELECT classification, impact_level FROM projects WHERE id = ?",
659
+ (project_id,),
660
+ ).fetchone()
661
+ conn.close()
662
+ if row:
663
+ proj = dict(row)
664
+ cls = (proj.get("classification") or "").upper()
665
+ il = (proj.get("impact_level") or "").upper()
666
+ if cls == "PUBLIC" or il == "IL4":
667
+ return [] # No marking required
668
+ if cls in ("SECRET", "TOP SECRET", "TOP_SECRET") or il == "IL4":
669
+ return [{"data_category": "SECRET", "subcategory": "NSI"}]
670
+ # IL4/IL4 or CUI/FOUO -> CUI
671
+ return [{"data_category": "CUI", "subcategory": "CTI"}]
672
+ except Exception:
673
+ pass
674
+ # Ultimate fallback: CUI (backward compat)
675
+ return [{"data_category": "CUI", "subcategory": "CTI"}]
676
+
677
+
678
+ def get_project_marking(
679
+ project_id: str,
680
+ db_path: Optional[Path] = None,
681
+ ) -> Dict:
682
+ """Generate the full composite marking for a project.
683
+
684
+ Reads all data categories from the database and generates
685
+ banner, footer, portion marking, and handling requirements.
686
+
687
+ Returns:
688
+ Dict with banner, footer, portion_marking, categories,
689
+ highest_sensitivity, and handling_requirements.
690
+ """
691
+ categories_data = get_project_data_categories(project_id, db_path)
692
+ if not categories_data:
693
+ # Resolve default from project metadata (ADR D132)
694
+ categories_data = _resolve_default_categories(project_id, db_path)
695
+
696
+ categories = [c["data_category"] for c in categories_data]
697
+ subcats = {
698
+ c["data_category"]: c.get("subcategory", "")
699
+ for c in categories_data
700
+ if c.get("subcategory")
701
+ }
702
+
703
+ marking_required = bool(categories) and categories != ["PUBLIC"]
704
+ return {
705
+ "marking_required": marking_required,
706
+ "categories": categories,
707
+ "highest_sensitivity": get_highest_sensitivity(categories) if categories else "PUBLIC",
708
+ "banner": get_composite_banner(categories, subcats),
709
+ "footer": get_composite_footer(categories),
710
+ "portion_marking": get_composite_portion_marking(categories),
711
+ "handling_requirements": get_composite_handling_requirements(categories),
712
+ }
713
+
714
+
715
+ # ---------------------------------------------------------------------------
716
+ # Auto-detection (ADR D110 -- advisory, not enforced)
717
+ # ---------------------------------------------------------------------------
718
+
719
+ def detect_data_categories(
720
+ project_id: str,
721
+ db_path: Optional[Path] = None,
722
+ ) -> Dict:
723
+ """Analyze project metadata and recommend applicable data categories.
724
+
725
+ Reads the project's description, type, impact_level, classification,
726
+ and target_frameworks to infer which data categories likely apply.
727
+
728
+ ADR D110: Results are advisory only -- the customer makes the final
729
+ selection.
730
+
731
+ Returns:
732
+ Dict with detected categories, confidence scores, and reasoning.
733
+ """
734
+ conn = get_connection(db_path=db_path)
735
+ try:
736
+ _ensure_tables(conn)
737
+ row = conn.execute(
738
+ """SELECT id, name, description, type, classification,
739
+ impact_level, target_frameworks
740
+ FROM projects WHERE id = ?""",
741
+ (project_id,),
742
+ ).fetchone()
743
+
744
+ if not row:
745
+ raise ValueError(f"Project '{project_id}' not found.")
746
+
747
+ project = dict(row)
748
+ desc = (project.get("description") or "").lower()
749
+ name = (project.get("name") or "").lower()
750
+ cls = (project.get("classification") or "").upper()
751
+ il = (project.get("impact_level") or "").upper()
752
+ frameworks = (project.get("target_frameworks") or "").lower()
753
+ combined_text = f"{name} {desc} {frameworks}"
754
+
755
+ detected = []
756
+ registry = load_registry()
757
+
758
+ for data_type in registry:
759
+ indicators = data_type.get("indicators", [])
760
+ matches = [ind for ind in indicators if ind.lower() in combined_text]
761
+
762
+ if matches:
763
+ confidence = min(0.5 + (len(matches) * 0.15), 0.95)
764
+ detected.append({
765
+ "data_type_id": data_type["id"],
766
+ "category": data_type["category"],
767
+ "subcategory": data_type.get("subcategory", ""),
768
+ "name": data_type["name"],
769
+ "confidence": round(confidence, 2),
770
+ "matched_indicators": matches,
771
+ "required_frameworks": data_type.get("required_frameworks", []),
772
+ "recommended_frameworks": data_type.get("recommended_frameworks", []),
773
+ })
774
+
775
+ # Always detect classification-based categories
776
+ if cls in ("CUI",) and not any(d["category"] == "CUI" for d in detected):
777
+ detected.append({
778
+ "data_type_id": "CUI_CTI",
779
+ "category": "CUI",
780
+ "subcategory": "CTI",
781
+ "name": "Controlled Technical Information",
782
+ "confidence": 0.9,
783
+ "matched_indicators": [f"classification={cls}"],
784
+ "required_frameworks": ["nist_800_171", "cmmc_level_2"],
785
+ "recommended_frameworks": ["fedramp_moderate"],
786
+ })
787
+
788
+ if cls == "SECRET" and not any(d["category"] == "SECRET" for d in detected):
789
+ detected.append({
790
+ "data_type_id": "SECRET_NSI",
791
+ "category": "SECRET",
792
+ "subcategory": "NSI",
793
+ "name": "Classified National Security Information",
794
+ "confidence": 0.95,
795
+ "matched_indicators": [f"classification={cls}"],
796
+ "required_frameworks": ["cnssi_1253"],
797
+ "recommended_frameworks": [],
798
+ })
799
+
800
+ # Impact level implications
801
+ if il in ("IL4", "IL4") and not any(d["category"] == "CUI" for d in detected):
802
+ detected.append({
803
+ "data_type_id": "CUI_CTI",
804
+ "category": "CUI",
805
+ "subcategory": "CTI",
806
+ "name": "Controlled Technical Information",
807
+ "confidence": 0.8,
808
+ "matched_indicators": [f"impact_level={il}"],
809
+ "required_frameworks": ["nist_800_171", "cmmc_level_2"],
810
+ "recommended_frameworks": ["fedramp_moderate"],
811
+ })
812
+
813
+ # Sort by confidence descending
814
+ detected.sort(key=lambda x: x["confidence"], reverse=True)
815
+
816
+ # Collect all required and recommended frameworks
817
+ all_required = set()
818
+ all_recommended = set()
819
+ for d in detected:
820
+ all_required.update(d.get("required_frameworks", []))
821
+ all_recommended.update(d.get("recommended_frameworks", []))
822
+
823
+ result = {
824
+ "project_id": project_id,
825
+ "detected_categories": detected,
826
+ "all_required_frameworks": sorted(all_required),
827
+ "all_recommended_frameworks": sorted(all_recommended - all_required),
828
+ "advisory_note": "Detection is advisory (ADR D110). "
829
+ "Confirm categories before applying markings.",
830
+ "timestamp": datetime.now(timezone.utc).isoformat(),
831
+ }
832
+
833
+ _log_audit_event(conn, project_id, "Data category auto-detection", {
834
+ "detected_count": len(detected),
835
+ "categories": [d["category"] for d in detected],
836
+ "required_frameworks": sorted(all_required),
837
+ })
838
+
839
+ return result
840
+ finally:
841
+ conn.close()
842
+
843
+
844
+ # ---------------------------------------------------------------------------
845
+ # Validation
846
+ # ---------------------------------------------------------------------------
847
+
848
+ def validate_project_markings(
849
+ project_id: str,
850
+ db_path: Optional[Path] = None,
851
+ ) -> Dict:
852
+ """Validate that project markings are consistent with data categories.
853
+
854
+ Checks:
855
+ 1. At least one data category is assigned.
856
+ 2. All required frameworks for each category are tracked.
857
+ 3. Marking banner matches assigned categories.
858
+ 4. Handling requirements are documented.
859
+
860
+ Returns:
861
+ Dict with valid (bool), issues list, and recommendations.
862
+ """
863
+ conn = get_connection(db_path=db_path)
864
+ try:
865
+ _ensure_tables(conn)
866
+ issues: List[str] = []
867
+ recommendations: List[str] = []
868
+
869
+ # Get project info
870
+ row = conn.execute(
871
+ "SELECT * FROM projects WHERE id = ?", (project_id,)
872
+ ).fetchone()
873
+ if not row:
874
+ raise ValueError(f"Project '{project_id}' not found.")
875
+ project = dict(row)
876
+
877
+ # Get assigned categories
878
+ cat_rows = conn.execute(
879
+ """SELECT data_category, subcategory, source, confidence
880
+ FROM data_classifications WHERE project_id = ?""",
881
+ (project_id,),
882
+ ).fetchall()
883
+
884
+ categories = [dict(r) for r in cat_rows]
885
+
886
+ if not categories:
887
+ issues.append(
888
+ "No data categories assigned. Run --detect to identify "
889
+ "applicable categories."
890
+ )
891
+ recommendations.append(
892
+ "Add at least one data category with --add-category."
893
+ )
894
+
895
+ # Check each category's required frameworks
896
+ for cat in categories:
897
+ registry = load_registry()
898
+ for dt in registry:
899
+ if dt["category"] == cat["data_category"]:
900
+ required_fws = dt.get("required_frameworks", [])
901
+ for fw in required_fws:
902
+ # Check if framework is tracked in project_framework_status
903
+ try:
904
+ fw_row = conn.execute(
905
+ """SELECT framework_id FROM project_framework_status
906
+ WHERE project_id = ? AND framework_id = ?""",
907
+ (project_id, fw),
908
+ ).fetchone()
909
+ if not fw_row:
910
+ issues.append(
911
+ f"Data category {cat['data_category']} requires "
912
+ f"framework '{fw}' but it is not tracked."
913
+ )
914
+ except Exception:
915
+ pass # Table may not exist
916
+
917
+ # Validate classification consistency
918
+ proj_cls = (project.get("classification") or "").upper()
919
+ cat_names = [c["data_category"] for c in categories]
920
+ highest = get_highest_sensitivity(cat_names) if cat_names else "PUBLIC"
921
+
922
+ if highest in ("SECRET", "TOP_SECRET") and proj_cls not in ("SECRET", "TOP SECRET", "TOP SECRET//SCI"):
923
+ issues.append(
924
+ f"Data categories include {highest} but project classification "
925
+ f"is '{proj_cls}'. Classification must be upgraded."
926
+ )
927
+
928
+ result = {
929
+ "valid": len(issues) == 0,
930
+ "project_id": project_id,
931
+ "assigned_categories": [c["data_category"] for c in categories],
932
+ "highest_sensitivity": highest,
933
+ "issues": issues,
934
+ "recommendations": recommendations,
935
+ "timestamp": datetime.now(timezone.utc).isoformat(),
936
+ }
937
+
938
+ _log_audit_event(conn, project_id, "Marking validation", {
939
+ "valid": result["valid"],
940
+ "issues_count": len(issues),
941
+ "categories": result["assigned_categories"],
942
+ })
943
+
944
+ return result
945
+ finally:
946
+ conn.close()
947
+
948
+
949
+ # ---------------------------------------------------------------------------
950
+ # CLI
951
+ # ---------------------------------------------------------------------------
952
+
953
+ def main() -> None:
954
+ parser = argparse.ArgumentParser(
955
+ description="Universal Data Classification & Marking Manager"
956
+ )
957
+ parser.add_argument(
958
+ "--list-categories", action="store_true",
959
+ help="List all supported data categories",
960
+ )
961
+ parser.add_argument(
962
+ "--category",
963
+ help="Single data category to display (e.g., PHI, PCI, CJIS)",
964
+ )
965
+ parser.add_argument(
966
+ "--categories",
967
+ help="Comma-separated data categories for composite marking (e.g., CUI,PHI,PCI)",
968
+ )
969
+ parser.add_argument(
970
+ "--banner", action="store_true",
971
+ help="Show document banner for the specified categories",
972
+ )
973
+ parser.add_argument(
974
+ "--code-header", metavar="LANGUAGE",
975
+ help="Show code header for a language (python, java, go, etc.)",
976
+ )
977
+ parser.add_argument(
978
+ "--handling", action="store_true",
979
+ help="Show handling requirements for the specified categories",
980
+ )
981
+ parser.add_argument(
982
+ "--detect", action="store_true",
983
+ help="Auto-detect data categories for a project (requires --project-id)",
984
+ )
985
+ parser.add_argument(
986
+ "--validate", action="store_true",
987
+ help="Validate project data markings (requires --project-id)",
988
+ )
989
+ parser.add_argument(
990
+ "--add-category",
991
+ help="Add a data category to a project (requires --project-id)",
992
+ )
993
+ parser.add_argument(
994
+ "--project-id",
995
+ help="Project ID for detection/validation/add operations",
996
+ )
997
+ parser.add_argument("--json", action="store_true", help="JSON output")
998
+ parser.add_argument(
999
+ "--db-path", type=Path, default=None,
1000
+ help="Database path override",
1001
+ )
1002
+
1003
+ args = parser.parse_args()
1004
+
1005
+ try:
1006
+ # Parse categories
1007
+ cats = []
1008
+ if args.category:
1009
+ cats = [args.category]
1010
+ elif args.categories:
1011
+ cats = [c.strip() for c in args.categories.split(",")]
1012
+
1013
+ # --list-categories
1014
+ if args.list_categories:
1015
+ result = list_categories()
1016
+ if args.json:
1017
+ print(json.dumps(result, indent=2))
1018
+ else:
1019
+ print(f"{'ID':<15} {'Name':<40} {'Framework':<20} {'Marking'}")
1020
+ print("-" * 90)
1021
+ for cat in result:
1022
+ print(
1023
+ f"{cat['id']:<15} {cat['full_name']:<40} "
1024
+ f"{cat['governing_framework']:<20} {cat['portion_marking']}"
1025
+ )
1026
+ return
1027
+
1028
+ # --banner
1029
+ if args.banner and cats:
1030
+ banner = get_composite_banner(cats)
1031
+ footer = get_composite_footer(cats)
1032
+ portion = get_composite_portion_marking(cats)
1033
+ if args.json:
1034
+ print(json.dumps({
1035
+ "categories": cats,
1036
+ "banner": banner,
1037
+ "footer": footer,
1038
+ "portion_marking": portion,
1039
+ "highest_sensitivity": get_highest_sensitivity(cats),
1040
+ }, indent=2))
1041
+ else:
1042
+ print(f"Banner for {', '.join(cats)}:\n")
1043
+ print(banner)
1044
+ print(f"\nFooter:\n{footer}")
1045
+ print(f"\nPortion marking: {portion}")
1046
+ return
1047
+
1048
+ # --code-header
1049
+ if args.code_header and cats:
1050
+ header = get_composite_code_header(cats, args.code_header)
1051
+ if args.json:
1052
+ print(json.dumps({
1053
+ "categories": cats,
1054
+ "language": args.code_header,
1055
+ "code_header": header,
1056
+ }, indent=2))
1057
+ else:
1058
+ print(f"Code header for {', '.join(cats)} ({args.code_header}):\n")
1059
+ print(header)
1060
+ return
1061
+
1062
+ # --handling
1063
+ if args.handling and cats:
1064
+ reqs = get_composite_handling_requirements(cats)
1065
+ if args.json:
1066
+ print(json.dumps({
1067
+ "categories": cats,
1068
+ "handling_requirements": reqs,
1069
+ }, indent=2))
1070
+ else:
1071
+ print(f"Handling requirements for {', '.join(cats)}:")
1072
+ for i, req in enumerate(reqs, 1):
1073
+ print(f" {i}. {req}")
1074
+ return
1075
+
1076
+ # --detect
1077
+ if args.detect:
1078
+ if not args.project_id:
1079
+ print("Error: --detect requires --project-id", file=sys.stderr)
1080
+ sys.exit(1)
1081
+ result = detect_data_categories(args.project_id, args.db_path)
1082
+ if args.json:
1083
+ print(json.dumps(result, indent=2))
1084
+ else:
1085
+ print(f"Data Category Detection: {args.project_id}")
1086
+ print(f"{'=' * 60}")
1087
+ for d in result["detected_categories"]:
1088
+ print(
1089
+ f" [{d['confidence']:.0%}] {d['category']}/{d['subcategory']} "
1090
+ f"-- {d['name']}"
1091
+ )
1092
+ print(f" Matched: {', '.join(d['matched_indicators'])}")
1093
+ print(f"\nRequired frameworks: {', '.join(result['all_required_frameworks'])}")
1094
+ print(f"Recommended: {', '.join(result['all_recommended_frameworks'])}")
1095
+ print(f"\nNote: {result['advisory_note']}")
1096
+ return
1097
+
1098
+ # --validate
1099
+ if args.validate:
1100
+ if not args.project_id:
1101
+ print("Error: --validate requires --project-id", file=sys.stderr)
1102
+ sys.exit(1)
1103
+ result = validate_project_markings(args.project_id, args.db_path)
1104
+ if args.json:
1105
+ print(json.dumps(result, indent=2))
1106
+ else:
1107
+ status = "VALID" if result["valid"] else "INVALID"
1108
+ print(f"Marking Validation: {status}")
1109
+ print(f" Categories: {', '.join(result['assigned_categories']) or 'none'}")
1110
+ print(f" Highest: {result['highest_sensitivity']}")
1111
+ if result["issues"]:
1112
+ print(f" Issues ({len(result['issues'])}):")
1113
+ for issue in result["issues"]:
1114
+ print(f" - {issue}")
1115
+ if result["recommendations"]:
1116
+ print(" Recommendations:")
1117
+ for rec in result["recommendations"]:
1118
+ print(f" - {rec}")
1119
+ return
1120
+
1121
+ # --add-category
1122
+ if args.add_category:
1123
+ if not args.project_id:
1124
+ print("Error: --add-category requires --project-id", file=sys.stderr)
1125
+ sys.exit(1)
1126
+ result = add_project_data_category(
1127
+ args.project_id, args.add_category, db_path=args.db_path,
1128
+ )
1129
+ if args.json:
1130
+ print(json.dumps(result, indent=2))
1131
+ else:
1132
+ print(f"Added data category: {result['data_category']} to {result['project_id']}")
1133
+ return
1134
+
1135
+ # Single category info
1136
+ if cats and len(cats) == 1 and not (args.banner or args.code_header or args.handling):
1137
+ cat_config = get_category_config(cats[0])
1138
+ if args.json:
1139
+ print(json.dumps({"category": cats[0], "config": cat_config}, indent=2))
1140
+ else:
1141
+ print(f"Data Category: {cats[0]}")
1142
+ for k, v in cat_config.items():
1143
+ if isinstance(v, list):
1144
+ print(f" {k}:")
1145
+ for item in v:
1146
+ print(f" - {item}")
1147
+ else:
1148
+ print(f" {k}: {v}")
1149
+ return
1150
+
1151
+ parser.print_help()
1152
+
1153
+ except (ValueError, FileNotFoundError) as exc:
1154
+ print(f"ERROR: {exc}", file=sys.stderr)
1155
+ sys.exit(1)
1156
+
1157
+
1158
+ if __name__ == "__main__":
1159
+ main()