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,1002 @@
1
+ #!/usr/bin/env python3
2
+ # CUI // SP-CTI
3
+ # Controlled by: Department of Defense
4
+ # CUI Category: CTI
5
+ # Distribution: D
6
+ # POC: SPARKPILOT System Administrator
7
+ """Document upload and requirements extraction tool.
8
+
9
+ Uploads DoD documents (SOW, CDD, CONOPS, SRD, SRS, etc.) and images
10
+ (whiteboard photos, wireframe screenshots, architecture diagrams), extracts
11
+ text content using regex or vision LLM fallback, and identifies requirement
12
+ statements using shall/must/should/will patterns.
13
+
14
+ Supports PDF (with page-by-page vision fallback for scanned docs), DOCX,
15
+ TXT, MD, and image formats (PNG, JPG, GIF, WebP) with graceful fallback
16
+ for optional dependencies.
17
+
18
+ Usage:
19
+ # Upload a document
20
+ python tools/requirements/document_extractor.py --session-id sess-abc \\
21
+ --upload --file-path /path/to/sow.pdf --document-type sow --json
22
+
23
+ # Upload an image (whiteboard photo, wireframe, etc.)
24
+ python tools/requirements/document_extractor.py --session-id sess-abc \\
25
+ --upload --file-path /path/to/whiteboard.png --document-type other --json
26
+
27
+ # Extract requirements from an uploaded document
28
+ python tools/requirements/document_extractor.py --document-id doc-abc \\
29
+ --extract --json
30
+
31
+ # Classify an uploaded image document
32
+ python tools/requirements/document_extractor.py --document-id doc-abc \\
33
+ --classify --json
34
+
35
+ # List all documents for a session
36
+ python tools/requirements/document_extractor.py --session-id sess-abc \\
37
+ --list --json
38
+ """
39
+
40
+ import argparse
41
+ import base64
42
+ import hashlib
43
+ import json
44
+ import logging
45
+ import os
46
+ import re
47
+ import sys
48
+ import uuid
49
+ from datetime import datetime
50
+ from pathlib import Path
51
+ from tools.db.storage import get_connection
52
+
53
+ BASE_DIR = Path(__file__).resolve().parent.parent.parent
54
+ if str(BASE_DIR) not in sys.path:
55
+ sys.path.insert(0, str(BASE_DIR))
56
+
57
+
58
+ logger = logging.getLogger("sparkpilot.requirements.document_extractor")
59
+
60
+ # Image extensions supported for direct upload
61
+ IMAGE_EXTENSIONS = {".png", ".jpg", ".jpeg", ".gif", ".webp", ".tiff", ".bmp"}
62
+
63
+ try:
64
+ from tools.audit.audit_logger import log_event
65
+ _HAS_AUDIT = True
66
+ except ImportError:
67
+ _HAS_AUDIT = False
68
+ def log_event(**kwargs): return -1
69
+
70
+
71
+ def _generate_id(prefix="doc"):
72
+ """Generate a unique ID with prefix."""
73
+ return f"{prefix}-{uuid.uuid4().hex[:12]}"
74
+
75
+
76
+ # ---------------------------------------------------------------------------
77
+ # File reading helpers
78
+ # ---------------------------------------------------------------------------
79
+
80
+ def _compute_file_hash(file_path):
81
+ """Compute SHA-256 hash of file content."""
82
+ h = hashlib.sha256()
83
+ with open(file_path, "rb") as f:
84
+ for chunk in iter(lambda: f.read(8192), b""):
85
+ h.update(chunk)
86
+ return h.hexdigest()
87
+
88
+
89
+ # ---------------------------------------------------------------------------
90
+ # Vision-based extraction helpers
91
+ # ---------------------------------------------------------------------------
92
+
93
+ def _check_vision_available():
94
+ """Check if a vision-capable LLM is available for document extraction."""
95
+ try:
96
+ from tools.llm import get_router
97
+ router = get_router()
98
+ provider, model_id, model_cfg = router.get_provider_for_function("document_vision")
99
+ if provider is None:
100
+ return False, ""
101
+ return model_cfg.get("supports_vision", False), model_id
102
+ except Exception:
103
+ return False, ""
104
+
105
+
106
+ def _extract_text_from_image_via_vision(file_path):
107
+ """Extract text content from an image using a vision LLM.
108
+
109
+ Sends the image to a vision-capable model with a prompt to extract
110
+ all visible text, preserving structure and formatting.
111
+
112
+ Args:
113
+ file_path: Path to the image file.
114
+
115
+ Returns:
116
+ Extracted text string, or placeholder if vision unavailable.
117
+ """
118
+ p = Path(file_path)
119
+ available, model_id = _check_vision_available()
120
+ if not available:
121
+ return f"[Image file: {p.name} -- vision model not available for text extraction]"
122
+
123
+ try:
124
+ from tools.testing.screenshot_validator import encode_image
125
+ from tools.llm import get_router
126
+ from tools.llm.provider import LLMRequest
127
+
128
+ b64_data, media_type = encode_image(str(p))
129
+
130
+ user_content = [
131
+ {
132
+ "type": "image",
133
+ "source": {
134
+ "type": "base64",
135
+ "media_type": media_type,
136
+ "data": b64_data,
137
+ },
138
+ },
139
+ {
140
+ "type": "text",
141
+ "text": (
142
+ "Extract ALL text content from this document image. "
143
+ "Preserve structure, headings, bullet points, and numbered lists. "
144
+ "If this contains requirement statements (shall/must/should/will), "
145
+ "preserve them exactly. Output only the extracted text."
146
+ ),
147
+ },
148
+ ]
149
+
150
+ router = get_router()
151
+ request = LLMRequest(
152
+ messages=[{"role": "user", "content": user_content}],
153
+ system_prompt=(
154
+ "You are a document text extraction assistant for a DoD requirements "
155
+ "intake system. Extract all visible text from the provided image accurately. "
156
+ "Preserve document structure, headings, and formatting."
157
+ ),
158
+ max_tokens=4096,
159
+ temperature=0.1,
160
+ )
161
+
162
+ response = router.invoke("document_vision", request)
163
+ text = response.content.strip()
164
+ if text:
165
+ logger.info("Vision extracted %d chars from image %s", len(text), p.name)
166
+ return text
167
+ return f"[Image file: {p.name} -- vision model returned no text]"
168
+
169
+ except Exception as exc:
170
+ logger.warning("Vision text extraction failed for %s: %s", p.name, exc)
171
+ return f"[Image file: {p.name} -- vision extraction error: {exc}]"
172
+
173
+
174
+ def _extract_pdf_pages_via_vision(file_path):
175
+ """Extract text from PDF pages using vision LLM for pages with no text.
176
+
177
+ Iterates pages via pypdf. For each page, attempts text extraction first.
178
+ If a page yields no text (scanned/image-heavy), renders it and sends to
179
+ the vision model for OCR-like extraction.
180
+
181
+ Args:
182
+ file_path: Path to the PDF file.
183
+
184
+ Returns:
185
+ Concatenated text from all pages with page markers.
186
+ """
187
+ p = Path(file_path)
188
+ available, model_id = _check_vision_available()
189
+ if not available:
190
+ return f"[PDF file: {p.name} -- vision model not available for page extraction]"
191
+
192
+ try:
193
+ from pypdf import PdfReader
194
+ except ImportError:
195
+ return f"[PDF file: {p.name} -- requires pypdf for page-by-page extraction]"
196
+
197
+ try:
198
+ from tools.llm import get_router
199
+ from tools.llm.provider import LLMRequest
200
+ except ImportError as exc:
201
+ return f"[PDF file: {p.name} -- vision dependencies not available: {exc}]"
202
+
203
+ reader = PdfReader(str(p))
204
+ all_pages = []
205
+ vision_pages_used = 0
206
+
207
+ for i, page in enumerate(reader.pages):
208
+ page_num = i + 1
209
+ text = page.extract_text() or ""
210
+
211
+ if len(text.strip()) >= 50:
212
+ # Sufficient text extracted directly
213
+ all_pages.append(f"--- Page {page_num} ---\n{text.strip()}")
214
+ continue
215
+
216
+ # Page has no/little text — try vision extraction via page rendering
217
+ # Attempt to render page to image using pdf2image or fitz
218
+ page_image_b64 = None
219
+ media_type = "image/png"
220
+
221
+ try:
222
+ # Try pdf2image (poppler-based)
223
+ from pdf2image import convert_from_path
224
+ images = convert_from_path(
225
+ str(p), first_page=page_num, last_page=page_num, dpi=200,
226
+ )
227
+ if images:
228
+ import io
229
+ buf = io.BytesIO()
230
+ images[0].save(buf, format="PNG")
231
+ page_image_b64 = base64.b64encode(buf.getvalue()).decode("utf-8")
232
+ except ImportError:
233
+ pass
234
+ except Exception as exc:
235
+ logger.debug("pdf2image failed for page %d: %s", page_num, exc)
236
+
237
+ if page_image_b64 is None:
238
+ # No rendering library available — use whatever text we got
239
+ if text.strip():
240
+ all_pages.append(f"--- Page {page_num} ---\n{text.strip()}")
241
+ else:
242
+ all_pages.append(
243
+ f"--- Page {page_num} ---\n"
244
+ f"[No text extractable; pdf2image required for vision fallback]"
245
+ )
246
+ continue
247
+
248
+ # Send rendered page image to vision model
249
+ try:
250
+ user_content = [
251
+ {
252
+ "type": "image",
253
+ "source": {
254
+ "type": "base64",
255
+ "media_type": media_type,
256
+ "data": page_image_b64,
257
+ },
258
+ },
259
+ {
260
+ "type": "text",
261
+ "text": (
262
+ f"Extract ALL text from this PDF page (page {page_num}). "
263
+ "Preserve structure, headings, tables, and bullet points. "
264
+ "Output only the extracted text."
265
+ ),
266
+ },
267
+ ]
268
+
269
+ router = get_router()
270
+ request = LLMRequest(
271
+ messages=[{"role": "user", "content": user_content}],
272
+ system_prompt=(
273
+ "You are a document OCR assistant. Extract all text from "
274
+ "the provided page image accurately."
275
+ ),
276
+ max_tokens=4096,
277
+ temperature=0.1,
278
+ )
279
+
280
+ response = router.invoke("document_vision", request)
281
+ page_text = response.content.strip()
282
+ if page_text:
283
+ all_pages.append(f"--- Page {page_num} (vision) ---\n{page_text}")
284
+ vision_pages_used += 1
285
+ else:
286
+ all_pages.append(f"--- Page {page_num} ---\n[Vision returned no text]")
287
+ except Exception as exc:
288
+ logger.warning("Vision extraction failed for page %d: %s", page_num, exc)
289
+ all_pages.append(
290
+ f"--- Page {page_num} ---\n[Vision extraction error: {exc}]"
291
+ )
292
+
293
+ if vision_pages_used > 0:
294
+ logger.info(
295
+ "PDF %s: %d pages, %d required vision extraction",
296
+ p.name, len(reader.pages), vision_pages_used,
297
+ )
298
+
299
+ if all_pages:
300
+ return "\n\n".join(all_pages)
301
+ return f"[PDF file: {p.name} -- no content extracted from any page]"
302
+
303
+
304
+ def _classify_image(file_path):
305
+ """Classify an uploaded image using a vision LLM.
306
+
307
+ Determines if the image is a whiteboard, diagram, wireframe, screenshot,
308
+ form, table, flowchart, network diagram, architecture diagram, or other.
309
+
310
+ Args:
311
+ file_path: Path to the image file.
312
+
313
+ Returns:
314
+ dict with {category, confidence, description} or None if unavailable.
315
+ """
316
+ available, model_id = _check_vision_available()
317
+ if not available:
318
+ return None
319
+
320
+ try:
321
+ from tools.testing.screenshot_validator import encode_image
322
+ from tools.llm import get_router
323
+ from tools.llm.provider import LLMRequest
324
+
325
+ b64_data, media_type = encode_image(str(file_path))
326
+
327
+ user_content = [
328
+ {
329
+ "type": "image",
330
+ "source": {
331
+ "type": "base64",
332
+ "media_type": media_type,
333
+ "data": b64_data,
334
+ },
335
+ },
336
+ {
337
+ "type": "text",
338
+ "text": (
339
+ "Classify this image into exactly ONE category from the list: "
340
+ "whiteboard, diagram, wireframe, screenshot, form, table, "
341
+ "flowchart, network_diagram, architecture_diagram, "
342
+ "handwritten_notes, other. "
343
+ "Respond with EXACTLY this JSON (no markdown, no extra text): "
344
+ '{"category": "string", "confidence": 0.0-1.0, '
345
+ '"description": "brief description of what the image shows"}'
346
+ ),
347
+ },
348
+ ]
349
+
350
+ router = get_router()
351
+ request = LLMRequest(
352
+ messages=[{"role": "user", "content": user_content}],
353
+ system_prompt=(
354
+ "You are an image classifier for a DoD document intake system. "
355
+ "Classify images accurately into the requested categories."
356
+ ),
357
+ max_tokens=256,
358
+ temperature=0.1,
359
+ )
360
+
361
+ response = router.invoke("document_vision", request)
362
+ text = response.content.strip()
363
+
364
+ # Strip markdown fences
365
+ if text.startswith("```"):
366
+ lines = text.splitlines()
367
+ if lines[0].startswith("```"):
368
+ lines = lines[1:]
369
+ if lines and lines[-1].strip() == "```":
370
+ lines = lines[:-1]
371
+ text = "\n".join(lines).strip()
372
+
373
+ result = json.loads(text)
374
+ return {
375
+ "category": str(result.get("category", "other")),
376
+ "confidence": float(result.get("confidence", 0.0)),
377
+ "description": str(result.get("description", "")),
378
+ }
379
+
380
+ except (json.JSONDecodeError, ValueError) as exc:
381
+ logger.debug("Image classification JSON parse failed: %s", exc)
382
+ return {"category": "other", "confidence": 0.3, "description": "Classification uncertain"}
383
+ except Exception as exc:
384
+ logger.warning("Image classification failed: %s", exc)
385
+ return None
386
+
387
+
388
+ def classify_document(document_id, db_path=None):
389
+ """Classify an uploaded image document using vision LLM.
390
+
391
+ Args:
392
+ document_id: ID of the uploaded document.
393
+ db_path: Optional DB path override.
394
+
395
+ Returns:
396
+ dict with classification result.
397
+ """
398
+ conn = get_connection(db_path=db_path)
399
+ doc = conn.execute(
400
+ "SELECT * FROM intake_documents WHERE id = ?", (document_id,)
401
+ ).fetchone()
402
+ if not doc:
403
+ conn.close()
404
+ raise ValueError(f"Document '{document_id}' not found.")
405
+
406
+ doc_data = dict(doc)
407
+ file_path = doc_data["file_path"]
408
+ p = Path(file_path)
409
+
410
+ if p.suffix.lower() not in IMAGE_EXTENSIONS:
411
+ conn.close()
412
+ return {
413
+ "status": "skipped",
414
+ "document_id": document_id,
415
+ "reason": f"Not an image file: {p.suffix}",
416
+ }
417
+
418
+ classification = _classify_image(file_path)
419
+ if classification is None:
420
+ conn.close()
421
+ return {
422
+ "status": "skipped",
423
+ "document_id": document_id,
424
+ "reason": "Vision model not available for classification",
425
+ }
426
+
427
+ # Store classification in extracted_sections column
428
+ conn.execute(
429
+ "UPDATE intake_documents SET extracted_sections = ? WHERE id = ?",
430
+ (json.dumps(classification), document_id),
431
+ )
432
+ conn.commit()
433
+ conn.close()
434
+
435
+ return {
436
+ "status": "ok",
437
+ "document_id": document_id,
438
+ "classification": classification,
439
+ }
440
+
441
+
442
+ # ---------------------------------------------------------------------------
443
+ # File reading helpers
444
+ # ---------------------------------------------------------------------------
445
+
446
+ def _read_file_content(file_path):
447
+ """Read text content from a file.
448
+
449
+ Supports .txt, .md (direct read), .pdf (pypdf with vision fallback),
450
+ .docx (python-docx with fallback), image files (vision extraction),
451
+ and other text files.
452
+ """
453
+ p = Path(file_path)
454
+ suffix = p.suffix.lower()
455
+
456
+ if suffix in (".txt", ".md"):
457
+ return p.read_text(encoding="utf-8")
458
+
459
+ elif suffix == ".pdf":
460
+ # Try pypdf (PyPDF2 successor)
461
+ try:
462
+ from pypdf import PdfReader
463
+ reader = PdfReader(str(p))
464
+ pages = []
465
+ for page in reader.pages:
466
+ text = page.extract_text()
467
+ if text:
468
+ pages.append(text)
469
+ if pages:
470
+ return "\n\n".join(pages)
471
+ # No text found — try vision-based page extraction
472
+ logger.info("PDF %s has no extractable text, trying vision fallback", p.name)
473
+ vision_result = _extract_pdf_pages_via_vision(str(p))
474
+ if not vision_result.startswith("[PDF file:"):
475
+ return vision_result
476
+ return f"[PDF file: {p.name} -- no extractable text found]"
477
+ except ImportError:
478
+ return (
479
+ f"[PDF file: {p.name} -- requires pypdf library. "
480
+ f"Install with: pip install pypdf]"
481
+ )
482
+ except Exception as exc:
483
+ return f"[PDF file: {p.name} -- extraction error: {exc}]"
484
+
485
+ elif suffix == ".docx":
486
+ # Try python-docx
487
+ try:
488
+ from docx import Document
489
+ doc = Document(str(p))
490
+ paragraphs = [para.text for para in doc.paragraphs if para.text.strip()]
491
+ if paragraphs:
492
+ return "\n\n".join(paragraphs)
493
+ return f"[DOCX file: {p.name} -- no extractable text found]"
494
+ except ImportError:
495
+ return (
496
+ f"[DOCX file: {p.name} -- requires python-docx library. "
497
+ f"Install with: pip install python-docx]"
498
+ )
499
+ except Exception as exc:
500
+ return f"[DOCX file: {p.name} -- extraction error: {exc}]"
501
+
502
+ elif suffix in IMAGE_EXTENSIONS:
503
+ # Image file — use vision LLM for text extraction
504
+ return _extract_text_from_image_via_vision(str(p))
505
+
506
+ else:
507
+ # Attempt generic text read
508
+ try:
509
+ return p.read_text(encoding="utf-8")
510
+ except UnicodeDecodeError:
511
+ return f"[Binary file: {p.name} -- unable to read as text]"
512
+
513
+
514
+ # ---------------------------------------------------------------------------
515
+ # Requirement extraction logic
516
+ # ---------------------------------------------------------------------------
517
+
518
+ # Requirement type detection keywords
519
+ _REQ_TYPE_KEYWORDS = {
520
+ "security": [
521
+ "authenticate", "authorize", "encrypt", "cac", "piv", "mfa",
522
+ "fips", "stig", "access control", "audit log", "credential",
523
+ "certificate", "pki", "rbac", "permission", "classification",
524
+ "clearance", "password", "token", "session timeout",
525
+ ],
526
+ "performance": [
527
+ "response time", "latency", "throughput", "concurrent",
528
+ "availability", "uptime", "sla", "load", "capacity",
529
+ "transactions per second", "bandwidth", "millisecond",
530
+ ],
531
+ "interface": [
532
+ "integrate", "interface", "api", "rest", "soap", "feed",
533
+ "import", "export", "connect", "external system", "third-party",
534
+ "web service", "message queue", "protocol",
535
+ ],
536
+ "data": [
537
+ "database", "data store", "retention", "backup", "archive",
538
+ "migrate data", "data format", "schema", "cui data",
539
+ "record", "table", "storage", "replication",
540
+ ],
541
+ "operational": [
542
+ "deployment", "install", "configure", "maintain", "monitor",
543
+ "support", "train", "operate", "documentation", "helpdesk",
544
+ "disaster recovery", "failover", "continuity",
545
+ ],
546
+ }
547
+
548
+
549
+ def _detect_requirement_type(text):
550
+ """Determine requirement type from keywords in text."""
551
+ lower = text.lower()
552
+ for rtype, keywords in _REQ_TYPE_KEYWORDS.items():
553
+ if any(kw in lower for kw in keywords):
554
+ return rtype
555
+ return "functional"
556
+
557
+
558
+ def _detect_priority(text):
559
+ """Determine priority based on modal verbs.
560
+
561
+ shall/must -> P1 (critical)
562
+ should -> P2 (high)
563
+ will/may -> P3 (medium)
564
+ """
565
+ lower = text.lower()
566
+ if any(kw in lower for kw in ["shall", "must", "is required to"]):
567
+ return "critical"
568
+ elif "should" in lower:
569
+ return "high"
570
+ elif any(kw in lower for kw in ["will", "may", "can"]):
571
+ return "medium"
572
+ return "medium"
573
+
574
+
575
+ def _extract_requirement_sentences(text):
576
+ """Extract sentences that contain requirement indicator keywords.
577
+
578
+ Matches:
579
+ - "shall" statements (mandatory)
580
+ - "must" statements (mandatory)
581
+ - "should" statements (desired)
582
+ - "will" statements (intent)
583
+ """
584
+ # Split into sentences
585
+ sentences = re.split(r'(?<=[.!?])\s+', text.replace("\n", " "))
586
+ requirements = []
587
+
588
+ requirement_patterns = [
589
+ re.compile(r'\bshall\b', re.IGNORECASE),
590
+ re.compile(r'\bmust\b', re.IGNORECASE),
591
+ re.compile(r'\bshould\b', re.IGNORECASE),
592
+ re.compile(r'\bwill\b', re.IGNORECASE),
593
+ ]
594
+
595
+ for sentence in sentences:
596
+ sentence = sentence.strip()
597
+ if len(sentence) < 10:
598
+ continue
599
+
600
+ for pattern in requirement_patterns:
601
+ if pattern.search(sentence):
602
+ req_type = _detect_requirement_type(sentence)
603
+ priority = _detect_priority(sentence)
604
+ requirements.append({
605
+ "raw_text": sentence,
606
+ "requirement_type": req_type,
607
+ "priority": priority,
608
+ })
609
+ break # Only match once per sentence
610
+
611
+ return requirements
612
+
613
+
614
+ # ---------------------------------------------------------------------------
615
+ # Core functions
616
+ # ---------------------------------------------------------------------------
617
+
618
+ def upload_document(session_id, file_path, document_type, db_path=None):
619
+ """Upload a document for requirement extraction.
620
+
621
+ Args:
622
+ session_id: Intake session ID.
623
+ file_path: Path to the document file.
624
+ document_type: One of sow, cdd, conops, srd, srs, other.
625
+ db_path: Optional DB path override.
626
+
627
+ Returns:
628
+ dict with document_id, session_id, file metadata, and status.
629
+ """
630
+ p = Path(file_path)
631
+ if not p.exists():
632
+ raise FileNotFoundError(f"File not found: {file_path}")
633
+
634
+ conn = get_connection(db_path=db_path)
635
+
636
+ # Verify session exists
637
+ session = conn.execute(
638
+ "SELECT * FROM intake_sessions WHERE id = ?", (session_id,)
639
+ ).fetchone()
640
+ if not session:
641
+ conn.close()
642
+ raise ValueError(f"Session '{session_id}' not found.")
643
+
644
+ session_data = dict(session)
645
+
646
+ # Compute file metadata
647
+ doc_id = _generate_id("doc")
648
+ file_hash = _compute_file_hash(file_path)
649
+ file_size = p.stat().st_size
650
+ file_name = p.name
651
+
652
+ # MIME type mapping
653
+ mime_map = {
654
+ ".pdf": "application/pdf",
655
+ ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
656
+ ".doc": "application/msword",
657
+ ".txt": "text/plain",
658
+ ".md": "text/markdown",
659
+ ".png": "image/png",
660
+ ".jpg": "image/jpeg",
661
+ ".jpeg": "image/jpeg",
662
+ ".gif": "image/gif",
663
+ ".webp": "image/webp",
664
+ ".tiff": "image/tiff",
665
+ ".bmp": "image/bmp",
666
+ }
667
+ mime_type = mime_map.get(p.suffix.lower(), "application/octet-stream")
668
+
669
+ # Read raw text for storage
670
+ _read_file_content(file_path)
671
+
672
+ # Auto-classify images at upload time
673
+ image_classification = None
674
+ if p.suffix.lower() in IMAGE_EXTENSIONS:
675
+ image_classification = _classify_image(file_path)
676
+
677
+ # Map document_type for DB constraint compatibility
678
+ # DB allows: sow, cdd, conops, srd, icd, ssp, use_case, brd, urd, rfp, rfi, other
679
+ # Spec allows: sow, cdd, conops, srd, srs, other
680
+ # Map srs -> other if not in DB constraint
681
+ db_doc_type = document_type if document_type != "srs" else "other"
682
+
683
+ extracted_sections = None
684
+ if image_classification:
685
+ extracted_sections = json.dumps(image_classification)
686
+
687
+ conn.execute(
688
+ """INSERT INTO intake_documents
689
+ (id, session_id, document_type, file_name, file_path, file_hash,
690
+ file_size_bytes, mime_type, extraction_status, extracted_sections,
691
+ extracted_requirements_count, classification, uploaded_at)
692
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'pending', ?, 0, 'CUI', ?)""",
693
+ (
694
+ doc_id, session_id, db_doc_type, file_name, str(p.resolve()),
695
+ file_hash, file_size, mime_type, extracted_sections,
696
+ datetime.now().isoformat(),
697
+ ),
698
+ )
699
+ conn.commit()
700
+ conn.close()
701
+
702
+ if _HAS_AUDIT:
703
+ log_event(
704
+ event_type="document_uploaded",
705
+ actor="sparkpilot-requirements-analyst",
706
+ action=f"Uploaded {document_type.upper()} document: {file_name}",
707
+ project_id=session_data.get("project_id"),
708
+ details={
709
+ "session_id": session_id,
710
+ "document_id": doc_id,
711
+ "file_name": file_name,
712
+ "file_hash": file_hash,
713
+ },
714
+ )
715
+
716
+ result = {
717
+ "document_id": doc_id,
718
+ "session_id": session_id,
719
+ "file_path": str(p.resolve()),
720
+ "file_hash": file_hash,
721
+ "file_size": file_size,
722
+ "status": "uploaded",
723
+ }
724
+ if image_classification:
725
+ result["image_classification"] = image_classification
726
+ return result
727
+
728
+
729
+ def extract_requirements(document_id, db_path=None):
730
+ """Extract requirement statements from an uploaded document.
731
+
732
+ Reads the document text from intake_documents, identifies requirement
733
+ sentences using shall/must/should/will patterns, classifies each by
734
+ type and priority, and inserts into intake_requirements.
735
+
736
+ Args:
737
+ document_id: ID of the uploaded document.
738
+ db_path: Optional DB path override.
739
+
740
+ Returns:
741
+ dict with document_id, count of requirements extracted, requirement
742
+ list, and breakdowns by type and priority.
743
+ """
744
+ conn = get_connection(db_path=db_path)
745
+
746
+ # Load document
747
+ doc = conn.execute(
748
+ "SELECT * FROM intake_documents WHERE id = ?", (document_id,)
749
+ ).fetchone()
750
+ if not doc:
751
+ conn.close()
752
+ raise ValueError(f"Document '{document_id}' not found.")
753
+
754
+ doc_data = dict(doc)
755
+ session_id = doc_data["session_id"]
756
+ file_path = doc_data["file_path"]
757
+
758
+ # Update status to extracting
759
+ conn.execute(
760
+ "UPDATE intake_documents SET extraction_status = 'extracting' WHERE id = ?",
761
+ (document_id,),
762
+ )
763
+ conn.commit()
764
+
765
+ # Read file content
766
+ raw_text = _read_file_content(file_path)
767
+
768
+ # Extract requirement sentences
769
+ extracted_stmts = _extract_requirement_sentences(raw_text)
770
+
771
+ # Insert each requirement into intake_requirements
772
+ inserted_reqs = []
773
+ by_type = {}
774
+ by_priority = {}
775
+
776
+ for stmt in extracted_stmts:
777
+ req_id = f"req-{uuid.uuid4().hex[:12]}"
778
+ raw = stmt["raw_text"]
779
+ req_type = stmt["requirement_type"]
780
+ priority = stmt["priority"]
781
+
782
+ conn.execute(
783
+ """INSERT INTO intake_requirements
784
+ (id, session_id, raw_text, refined_text, requirement_type,
785
+ priority, source_document, clarity_score,
786
+ gaps, acceptance_criteria, status, classification, created_at)
787
+ VALUES (?, ?, ?, ?, ?, ?, ?, 0.5, NULL, NULL, 'draft', 'CUI', ?)""",
788
+ (
789
+ req_id, session_id, raw, raw, req_type,
790
+ priority, document_id, datetime.now().isoformat(),
791
+ ),
792
+ )
793
+
794
+ inserted_reqs.append({
795
+ "id": req_id,
796
+ "raw_text": raw,
797
+ "requirement_type": req_type,
798
+ "priority": priority,
799
+ "source": "document",
800
+ "source_reference": document_id,
801
+ })
802
+
803
+ # Count by type
804
+ by_type[req_type] = by_type.get(req_type, 0) + 1
805
+ # Count by priority
806
+ by_priority[priority] = by_priority.get(priority, 0) + 1
807
+
808
+ # Update document: extraction complete
809
+ conn.execute(
810
+ """UPDATE intake_documents
811
+ SET extraction_status = 'extracted', extracted_requirements_count = ?
812
+ WHERE id = ?""",
813
+ (len(inserted_reqs), document_id),
814
+ )
815
+
816
+ # Update session total requirement count
817
+ total_count = conn.execute(
818
+ "SELECT COUNT(*) as cnt FROM intake_requirements WHERE session_id = ?",
819
+ (session_id,),
820
+ ).fetchone()["cnt"]
821
+ conn.execute(
822
+ "UPDATE intake_sessions SET total_requirements = ?, updated_at = ? WHERE id = ?",
823
+ (total_count, datetime.now().isoformat(), session_id),
824
+ )
825
+
826
+ conn.commit()
827
+ conn.close()
828
+
829
+ if _HAS_AUDIT:
830
+ log_event(
831
+ event_type="document_extracted",
832
+ actor="sparkpilot-requirements-analyst",
833
+ action=f"Extracted {len(inserted_reqs)} requirements from document {document_id}",
834
+ details={
835
+ "document_id": document_id,
836
+ "session_id": session_id,
837
+ "count": len(inserted_reqs),
838
+ "by_type": by_type,
839
+ },
840
+ )
841
+
842
+ return {
843
+ "status": "ok",
844
+ "document_id": document_id,
845
+ "requirements_extracted": len(inserted_reqs),
846
+ "requirements": inserted_reqs,
847
+ "by_type": by_type,
848
+ "by_priority": by_priority,
849
+ }
850
+
851
+
852
+ def list_documents(session_id, db_path=None):
853
+ """List all documents uploaded to a session.
854
+
855
+ Args:
856
+ session_id: Intake session ID.
857
+ db_path: Optional DB path override.
858
+
859
+ Returns:
860
+ dict with session_id and list of document records.
861
+ """
862
+ conn = get_connection(db_path=db_path)
863
+
864
+ session = conn.execute(
865
+ "SELECT * FROM intake_sessions WHERE id = ?", (session_id,)
866
+ ).fetchone()
867
+ if not session:
868
+ conn.close()
869
+ raise ValueError(f"Session '{session_id}' not found.")
870
+
871
+ rows = conn.execute(
872
+ "SELECT * FROM intake_documents WHERE session_id = ? ORDER BY uploaded_at",
873
+ (session_id,),
874
+ ).fetchall()
875
+ documents = [dict(r) for r in rows]
876
+ conn.close()
877
+
878
+ return {
879
+ "status": "ok",
880
+ "session_id": session_id,
881
+ "total_documents": len(documents),
882
+ "documents": documents,
883
+ }
884
+
885
+
886
+ # ---------------------------------------------------------------------------
887
+ # CLI
888
+ # ---------------------------------------------------------------------------
889
+
890
+ def main():
891
+ parser = argparse.ArgumentParser(
892
+ description="SPARKPILOT Document Requirements Extractor"
893
+ )
894
+ parser.add_argument("--session-id", help="Intake session ID")
895
+ parser.add_argument("--document-id", help="Document ID (for extraction)")
896
+ parser.add_argument(
897
+ "--upload", action="store_true",
898
+ help="Upload a document",
899
+ )
900
+ parser.add_argument("--file-path", help="Path to the document file")
901
+ parser.add_argument(
902
+ "--document-type",
903
+ choices=["sow", "cdd", "conops", "srd", "srs", "other"],
904
+ default="other",
905
+ help="Type of the document",
906
+ )
907
+ parser.add_argument(
908
+ "--extract", action="store_true",
909
+ help="Extract requirements from an uploaded document",
910
+ )
911
+ parser.add_argument(
912
+ "--list", action="store_true",
913
+ help="List all documents for a session",
914
+ )
915
+ parser.add_argument(
916
+ "--classify", action="store_true",
917
+ help="Classify an uploaded image document using vision LLM",
918
+ )
919
+ parser.add_argument("--json", action="store_true", help="JSON output")
920
+ args = parser.parse_args()
921
+
922
+ try:
923
+ result = None
924
+
925
+ if args.upload and args.session_id and args.file_path:
926
+ # Upload document
927
+ result = upload_document(
928
+ args.session_id, args.file_path, args.document_type,
929
+ )
930
+
931
+ elif args.extract and args.document_id:
932
+ # Extract requirements from document
933
+ result = extract_requirements(args.document_id)
934
+
935
+ elif args.classify and args.document_id:
936
+ # Classify image document
937
+ result = classify_document(args.document_id)
938
+
939
+ elif args.list and args.session_id:
940
+ # List documents
941
+ result = list_documents(args.session_id)
942
+
943
+ else:
944
+ parser.print_help()
945
+ return
946
+
947
+ if args.json:
948
+ print(json.dumps(result, indent=2, default=str))
949
+ else:
950
+ if args.upload:
951
+ print(
952
+ f"Document uploaded: {result.get('document_id')} "
953
+ f"({result.get('file_size', 0)} bytes, "
954
+ f"hash: {result.get('file_hash', '?')[:12]}...)"
955
+ )
956
+ elif args.extract:
957
+ print(
958
+ f"Extracted {result.get('requirements_extracted', 0)} "
959
+ f"requirements from document {result.get('document_id')}"
960
+ )
961
+ by_type = result.get("by_type", {})
962
+ if by_type:
963
+ print(" By type: " + ", ".join(
964
+ f"{k}={v}" for k, v in sorted(by_type.items())
965
+ ))
966
+ by_priority = result.get("by_priority", {})
967
+ if by_priority:
968
+ print(" By priority: " + ", ".join(
969
+ f"{k}={v}" for k, v in sorted(by_priority.items())
970
+ ))
971
+ elif args.classify:
972
+ cls = result.get("classification", {})
973
+ if cls:
974
+ print(f"Image classification for {result.get('document_id')}:")
975
+ print(f" Category: {cls.get('category', '?')}")
976
+ print(f" Confidence: {cls.get('confidence', 0):.2f}")
977
+ print(f" Description: {cls.get('description', '')}")
978
+ else:
979
+ print(f"Classification: {result.get('reason', result.get('status', '?'))}")
980
+ elif args.list:
981
+ docs = result.get("documents", [])
982
+ print(f"Documents for session {args.session_id}: {len(docs)}")
983
+ for doc in docs:
984
+ print(
985
+ f" [{doc.get('document_type', '?').upper()}] "
986
+ f"{doc.get('file_name', '?')} "
987
+ f"({doc.get('extraction_status', '?')})"
988
+ )
989
+ else:
990
+ print(json.dumps(result, indent=2, default=str))
991
+
992
+ except (ValueError, FileNotFoundError) as e:
993
+ if args.json:
994
+ print(json.dumps({"error": str(e)}, indent=2))
995
+ else:
996
+ print(f"Error: {e}")
997
+ raise SystemExit(1)
998
+
999
+
1000
+ if __name__ == "__main__":
1001
+ main()
1002
+ # [TEMPLATE: CUI // SP-CTI]