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,1083 @@
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
+ """Spec quality checker -- 'unit tests for English'.
8
+
9
+ Validates spec markdown files against quality criteria: required sections,
10
+ ambiguity patterns, acceptance criteria testability, ATO coverage, task
11
+ completeness, and project constitution compliance.
12
+
13
+ Usage:
14
+ python tools/requirements/spec_quality_checker.py --spec-file specs/feat.md --json
15
+ python tools/requirements/spec_quality_checker.py --spec-dir specs/ --json
16
+ python tools/requirements/spec_quality_checker.py --spec-file specs/feat.md --annotate --output annotated.md
17
+ python tools/requirements/spec_quality_checker.py --spec-file specs/feat.md --strip-markers
18
+ python tools/requirements/spec_quality_checker.py --spec-file specs/feat.md --count-markers
19
+ """
20
+
21
+ import argparse
22
+ import dataclasses
23
+ import json
24
+ import re
25
+ import uuid
26
+ from datetime import datetime, timezone
27
+ from pathlib import Path
28
+ from tools.db.storage import get_connection
29
+
30
+ BASE_DIR = Path(__file__).resolve().parent.parent.parent
31
+
32
+ # Graceful audit import (air-gap safe)
33
+ try:
34
+ from tools.audit.audit_logger import log_event
35
+ _HAS_AUDIT = True
36
+ except ImportError:
37
+ _HAS_AUDIT = False
38
+
39
+ def log_event(**kwargs):
40
+ return -1
41
+
42
+
43
+ def _generate_id(prefix="sqc"):
44
+ """Generate a unique ID with prefix."""
45
+ return f"{prefix}-{uuid.uuid4().hex[:12]}"
46
+
47
+
48
+ # ---------------------------------------------------------------------------
49
+ # Data structures
50
+ # ---------------------------------------------------------------------------
51
+
52
+ @dataclasses.dataclass
53
+ class CheckResult:
54
+ """Result of a single quality check."""
55
+ check_id: str
56
+ name: str
57
+ status: str # "pass", "fail", "warn"
58
+ severity: str # "critical", "high", "medium", "low"
59
+ message: str
60
+ suggestion: str = ""
61
+ section: str = ""
62
+
63
+ def to_dict(self):
64
+ return dataclasses.asdict(self)
65
+
66
+
67
+ # ---------------------------------------------------------------------------
68
+ # Markdown parsing
69
+ # ---------------------------------------------------------------------------
70
+
71
+ def parse_spec_sections(spec_path: Path) -> dict:
72
+ """Parse markdown by ``## Header`` into a dict.
73
+
74
+ ``### Subheader`` content is nested within the parent ``## `` section.
75
+ Returns ``{section_name_lower: content_string}``.
76
+ """
77
+ content = spec_path.read_text(encoding="utf-8")
78
+ sections: dict = {}
79
+ current_key = "_preamble"
80
+ buffer = []
81
+
82
+ for line in content.splitlines():
83
+ h2 = re.match(r"^##\s+(.+)$", line)
84
+ h3 = re.match(r"^###\s+(.+)$", line)
85
+ if h2 and not h3:
86
+ # Flush previous section
87
+ sections[current_key] = "\n".join(buffer)
88
+ current_key = h2.group(1).strip().lower()
89
+ buffer = []
90
+ else:
91
+ buffer.append(line)
92
+
93
+ # Flush final section
94
+ sections[current_key] = "\n".join(buffer)
95
+ return sections
96
+
97
+
98
+ # ---------------------------------------------------------------------------
99
+ # Loaders (context files with hardcoded fallbacks)
100
+ # ---------------------------------------------------------------------------
101
+
102
+ _DEFAULT_CHECKLIST = {
103
+ "required_sections": [
104
+ {"name": "Feature Description", "severity": "critical", "min_words": 20},
105
+ {"name": "User Story", "severity": "critical",
106
+ "pattern": r"(?i)as a .+ i want .+ so that .+"},
107
+ {"name": "Solution Statement", "severity": "critical", "min_words": 30},
108
+ {"name": "ATO Impact Assessment", "severity": "critical"},
109
+ {"name": "Acceptance Criteria", "severity": "critical", "min_items": 3},
110
+ {"name": "Implementation Plan", "severity": "high"},
111
+ {"name": "Step by Step Tasks", "severity": "high", "min_items": 3},
112
+ {"name": "Testing Strategy", "severity": "high"},
113
+ {"name": "Validation Commands", "severity": "medium"},
114
+ {"name": "NIST 800-53 Controls", "severity": "medium"},
115
+ ]
116
+ }
117
+
118
+ _DEFAULT_AMBIGUITY_PATTERNS = [
119
+ {"phrase": "as needed", "severity": "high",
120
+ "clarification": "Define the specific conditions that trigger this action."},
121
+ {"phrase": "appropriate", "severity": "high",
122
+ "clarification": "Define measurable criteria for 'appropriate'."},
123
+ {"phrase": "timely", "severity": "high",
124
+ "clarification": "Specify an exact time threshold."},
125
+ {"phrase": "user-friendly", "severity": "medium",
126
+ "clarification": "Define specific usability criteria."},
127
+ {"phrase": "fast", "severity": "high",
128
+ "clarification": "Specify a measurable target (e.g., <2s response time)."},
129
+ {"phrase": "secure", "severity": "critical",
130
+ "clarification": "Specify security requirements: FIPS, CAC, STIG, NIST controls."},
131
+ {"phrase": "scalable", "severity": "medium",
132
+ "clarification": "Define target scale: concurrent users, data volume."},
133
+ {"phrase": "efficient", "severity": "medium",
134
+ "clarification": "Define efficiency metric: CPU, memory, cost."},
135
+ {"phrase": "reasonable", "severity": "high",
136
+ "clarification": "Define the quantitative threshold."},
137
+ {"phrase": "adequate", "severity": "high",
138
+ "clarification": "Define the minimum acceptable criteria."},
139
+ {"phrase": "flexible", "severity": "medium",
140
+ "clarification": "Define what specifically needs to be configurable."},
141
+ {"phrase": "robust", "severity": "medium",
142
+ "clarification": "Define failure scenarios and recovery time objectives."},
143
+ {"phrase": "etc.", "severity": "high",
144
+ "clarification": "Enumerate all items explicitly."},
145
+ {"phrase": "and/or", "severity": "medium",
146
+ "clarification": "Clarify inclusive OR vs exclusive OR."},
147
+ {"phrase": "should", "severity": "medium",
148
+ "clarification": "Is this MUST (mandatory) or SHOULD (recommended)? Use RFC 2119."},
149
+ ]
150
+
151
+
152
+ def _load_checklist() -> dict:
153
+ """Load spec quality checklist from context file, fallback to defaults."""
154
+ path = BASE_DIR / "context" / "requirements" / "spec_quality_checklist.json"
155
+ if path.exists():
156
+ try:
157
+ with open(path, "r", encoding="utf-8") as f:
158
+ return json.load(f)
159
+ except (json.JSONDecodeError, OSError):
160
+ pass
161
+ return _DEFAULT_CHECKLIST
162
+
163
+
164
+ def _load_ambiguity_patterns() -> list:
165
+ """Load ambiguity patterns from context file, fallback to defaults."""
166
+ path = BASE_DIR / "context" / "requirements" / "ambiguity_patterns.json"
167
+ if path.exists():
168
+ try:
169
+ with open(path, "r", encoding="utf-8") as f:
170
+ data = json.load(f)
171
+ return data.get("ambiguity_patterns", _DEFAULT_AMBIGUITY_PATTERNS)
172
+ except (json.JSONDecodeError, OSError):
173
+ pass
174
+ return _DEFAULT_AMBIGUITY_PATTERNS
175
+
176
+
177
+ def _load_constitutions(project_id: str = None, db_path=None) -> list:
178
+ """Load constitution principles.
179
+
180
+ If *project_id* is given and the DB is available, attempt to load
181
+ project-specific constitutions. Otherwise fall back to the default
182
+ constitutions context file.
183
+ """
184
+ # Try DB first when project_id available
185
+ if project_id:
186
+ try:
187
+ conn = get_connection(db_path=db_path)
188
+ rows = conn.execute(
189
+ "SELECT principles FROM project_constitutions WHERE project_id = ?",
190
+ (project_id,),
191
+ ).fetchone()
192
+ conn.close()
193
+ if rows:
194
+ return json.loads(rows["principles"])
195
+ except Exception:
196
+ pass
197
+
198
+ # Fallback to context file
199
+ path = BASE_DIR / "context" / "requirements" / "default_constitutions.json"
200
+ if path.exists():
201
+ try:
202
+ with open(path, "r", encoding="utf-8") as f:
203
+ data = json.load(f)
204
+ return data.get("default_principles", [])
205
+ except (json.JSONDecodeError, OSError):
206
+ pass
207
+ return []
208
+
209
+
210
+ # ---------------------------------------------------------------------------
211
+ # Individual check functions
212
+ # ---------------------------------------------------------------------------
213
+
214
+ def _count_list_items(text: str) -> int:
215
+ """Count markdown list items (``- `` or ``N. ``)."""
216
+ count = 0
217
+ for line in text.splitlines():
218
+ stripped = line.strip()
219
+ if re.match(r"^[-*]\s+", stripped) or re.match(r"^\d+\.\s+", stripped):
220
+ count += 1
221
+ return count
222
+
223
+
224
+ def check_required_sections(sections: dict, checklist: dict) -> list:
225
+ """Check that all required sections exist and meet criteria."""
226
+ results = []
227
+ for req in checklist.get("required_sections", []):
228
+ name = req["name"]
229
+ key = name.lower()
230
+ severity = req.get("severity", "high")
231
+
232
+ # Case-insensitive section lookup
233
+ content = sections.get(key, "")
234
+ if not content:
235
+ # Try partial match
236
+ for sec_key, sec_val in sections.items():
237
+ if key in sec_key or sec_key in key:
238
+ content = sec_val
239
+ break
240
+
241
+ if not content or not content.strip():
242
+ results.append(CheckResult(
243
+ check_id=_generate_id("sec"),
244
+ name=f"Section: {name}",
245
+ status="fail",
246
+ severity=severity,
247
+ message=f"Required section '{name}' is missing.",
248
+ suggestion=f"Add a '## {name}' section to the spec.",
249
+ section=name,
250
+ ))
251
+ continue
252
+
253
+ # Min words check
254
+ min_words = req.get("min_words")
255
+ if min_words:
256
+ word_count = len(content.split())
257
+ if word_count < min_words:
258
+ results.append(CheckResult(
259
+ check_id=_generate_id("sec"),
260
+ name=f"Section: {name} (word count)",
261
+ status="fail",
262
+ severity=severity,
263
+ message=f"Section '{name}' has {word_count} words, minimum is {min_words}.",
264
+ suggestion=f"Expand '{name}' to at least {min_words} words.",
265
+ section=name,
266
+ ))
267
+ continue
268
+
269
+ # Pattern check
270
+ pattern = req.get("pattern")
271
+ if pattern:
272
+ if not re.search(pattern, content):
273
+ results.append(CheckResult(
274
+ check_id=_generate_id("sec"),
275
+ name=f"Section: {name} (pattern)",
276
+ status="fail",
277
+ severity=severity,
278
+ message=f"Section '{name}' does not match required pattern.",
279
+ suggestion=f"Ensure '{name}' follows the expected format.",
280
+ section=name,
281
+ ))
282
+ continue
283
+
284
+ # Min items check
285
+ min_items = req.get("min_items")
286
+ if min_items:
287
+ item_count = _count_list_items(content)
288
+ if item_count < min_items:
289
+ results.append(CheckResult(
290
+ check_id=_generate_id("sec"),
291
+ name=f"Section: {name} (items)",
292
+ status="fail",
293
+ severity=severity,
294
+ message=f"Section '{name}' has {item_count} list items, minimum is {min_items}.",
295
+ suggestion=f"Add at least {min_items} list items to '{name}'.",
296
+ section=name,
297
+ ))
298
+ continue
299
+
300
+ # All checks passed for this section
301
+ results.append(CheckResult(
302
+ check_id=_generate_id("sec"),
303
+ name=f"Section: {name}",
304
+ status="pass",
305
+ severity=severity,
306
+ message=f"Section '{name}' present and meets criteria.",
307
+ section=name,
308
+ ))
309
+
310
+ return results
311
+
312
+
313
+ def check_ambiguity(sections: dict, patterns: list) -> list:
314
+ """Scan all sections for ambiguity patterns."""
315
+ results = []
316
+ all_content = "\n".join(sections.values()).lower()
317
+
318
+ for pat in patterns:
319
+ phrase = pat.get("phrase", "")
320
+ if not phrase:
321
+ continue
322
+ # Use word boundary matching to avoid false positives inside words
323
+ escaped = re.escape(phrase)
324
+ regex = rf"\b{escaped}\b" if not phrase.endswith(".") else re.escape(phrase)
325
+ matches = list(re.finditer(regex, all_content, re.IGNORECASE))
326
+ if matches:
327
+ # Find which section(s) contain the match
328
+ match_sections = []
329
+ for sec_name, sec_content in sections.items():
330
+ if re.search(regex, sec_content, re.IGNORECASE):
331
+ match_sections.append(sec_name)
332
+
333
+ results.append(CheckResult(
334
+ check_id=_generate_id("amb"),
335
+ name=f"Ambiguity: '{phrase}'",
336
+ status="fail",
337
+ severity=pat.get("severity", "medium"),
338
+ message=(
339
+ f"Ambiguous phrase '{phrase}' found {len(matches)} time(s) "
340
+ f"in section(s): {', '.join(match_sections)}."
341
+ ),
342
+ suggestion=pat.get("clarification", "Replace with specific, measurable language."),
343
+ section=", ".join(match_sections),
344
+ ))
345
+
346
+ return results
347
+
348
+
349
+ # Verbs that indicate testable/observable assertions in acceptance criteria
350
+ _TESTABLE_VERBS = re.compile(
351
+ r"\b(shows?|returns?|displays?|links?\s+to|loads?\s+without|"
352
+ r"renders?|navigates?\s+to|redirects?|creates?|updates?|deletes?|"
353
+ r"validates?|rejects?|accepts?|sends?|receives?|stores?|"
354
+ r"contains?|includes?|excludes?|matches?|equals?|is\s+visible|"
355
+ r"appears?|disappears?|enables?|disables?|triggers?|"
356
+ r"given|when|then|must|shall)\b",
357
+ re.IGNORECASE,
358
+ )
359
+
360
+
361
+ def check_acceptance_criteria(sections: dict) -> list:
362
+ """Validate acceptance criteria for testability."""
363
+ results = []
364
+
365
+ # Find acceptance criteria section
366
+ ac_content = ""
367
+ for key, content in sections.items():
368
+ if "acceptance" in key and "criteria" in key:
369
+ ac_content = content
370
+ break
371
+ if "acceptance criteria" in key:
372
+ ac_content = content
373
+ break
374
+
375
+ if not ac_content.strip():
376
+ results.append(CheckResult(
377
+ check_id=_generate_id("acc"),
378
+ name="Acceptance Criteria: presence",
379
+ status="fail",
380
+ severity="critical",
381
+ message="No acceptance criteria section found.",
382
+ suggestion="Add '## Acceptance Criteria' with at least 3 testable items.",
383
+ section="acceptance criteria",
384
+ ))
385
+ return results
386
+
387
+ # Count items
388
+ items = []
389
+ for line in ac_content.splitlines():
390
+ stripped = line.strip()
391
+ if re.match(r"^[-*]\s+", stripped) or re.match(r"^\d+\.\s+", stripped):
392
+ items.append(stripped)
393
+
394
+ if len(items) < 3:
395
+ results.append(CheckResult(
396
+ check_id=_generate_id("acc"),
397
+ name="Acceptance Criteria: count",
398
+ status="fail",
399
+ severity="critical",
400
+ message=f"Only {len(items)} acceptance criteria found, minimum is 3.",
401
+ suggestion="Add at least 3 specific, testable acceptance criteria.",
402
+ section="acceptance criteria",
403
+ ))
404
+ else:
405
+ results.append(CheckResult(
406
+ check_id=_generate_id("acc"),
407
+ name="Acceptance Criteria: count",
408
+ status="pass",
409
+ severity="critical",
410
+ message=f"{len(items)} acceptance criteria found.",
411
+ section="acceptance criteria",
412
+ ))
413
+
414
+ # Check each item for testable assertion
415
+ untestable = []
416
+ for item in items:
417
+ if not _TESTABLE_VERBS.search(item):
418
+ untestable.append(item[:80])
419
+
420
+ if untestable:
421
+ results.append(CheckResult(
422
+ check_id=_generate_id("acc"),
423
+ name="Acceptance Criteria: testability",
424
+ status="fail",
425
+ severity="high",
426
+ message=(
427
+ f"{len(untestable)} of {len(items)} criteria lack testable verbs: "
428
+ f"{untestable[0]}..."
429
+ ),
430
+ suggestion=(
431
+ "Each criterion should contain a measurable verb "
432
+ "(shows, returns, displays, loads without, etc.)."
433
+ ),
434
+ section="acceptance criteria",
435
+ ))
436
+ else:
437
+ results.append(CheckResult(
438
+ check_id=_generate_id("acc"),
439
+ name="Acceptance Criteria: testability",
440
+ status="pass",
441
+ severity="high",
442
+ message="All acceptance criteria contain testable assertions.",
443
+ section="acceptance criteria",
444
+ ))
445
+
446
+ # Check for Given/When/Then format
447
+ has_gwt = bool(re.search(r"\b(given|when|then)\b", ac_content, re.IGNORECASE))
448
+ results.append(CheckResult(
449
+ check_id=_generate_id("acc"),
450
+ name="Acceptance Criteria: BDD format",
451
+ status="pass" if has_gwt else "warn",
452
+ severity="low",
453
+ message=(
454
+ "BDD Given/When/Then format detected."
455
+ if has_gwt else
456
+ "No Given/When/Then BDD format found. Consider using BDD for clearer test mapping."
457
+ ),
458
+ suggestion="" if has_gwt else "Rewrite criteria in Given/When/Then format for BDD.",
459
+ section="acceptance criteria",
460
+ ))
461
+
462
+ return results
463
+
464
+
465
+ def check_ato_coverage(sections: dict) -> list:
466
+ """Check ATO impact assessment completeness."""
467
+ results = []
468
+
469
+ # Find ATO section
470
+ ato_content = ""
471
+ for key, content in sections.items():
472
+ if "ato" in key and "impact" in key:
473
+ ato_content = content
474
+ break
475
+ if "ato impact" in key:
476
+ ato_content = content
477
+ break
478
+
479
+ if not ato_content.strip():
480
+ results.append(CheckResult(
481
+ check_id=_generate_id("ato"),
482
+ name="ATO: section presence",
483
+ status="fail",
484
+ severity="critical",
485
+ message="ATO Impact Assessment section is missing.",
486
+ suggestion="Add '## ATO Impact Assessment' with boundary tier, NIST controls, SSP impact.",
487
+ section="ato impact assessment",
488
+ ))
489
+ return results
490
+
491
+ # Boundary impact tier
492
+ tier_pattern = re.compile(r"\b(GREEN|YELLOW|ORANGE|RED)\b")
493
+ tier_match = tier_pattern.search(ato_content)
494
+ if tier_match:
495
+ results.append(CheckResult(
496
+ check_id=_generate_id("ato"),
497
+ name="ATO: boundary tier",
498
+ status="pass",
499
+ severity="critical",
500
+ message=f"Boundary impact tier specified: {tier_match.group(1)}.",
501
+ section="ato impact assessment",
502
+ ))
503
+ else:
504
+ results.append(CheckResult(
505
+ check_id=_generate_id("ato"),
506
+ name="ATO: boundary tier",
507
+ status="fail",
508
+ severity="critical",
509
+ message="No boundary impact tier (GREEN/YELLOW/ORANGE/RED) found.",
510
+ suggestion="Specify one of: GREEN (no impact), YELLOW (minor), ORANGE (significant), RED (ATO-invalidating).",
511
+ section="ato impact assessment",
512
+ ))
513
+
514
+ # NIST controls
515
+ nist_pattern = re.compile(r"\b[A-Z]{2}-\d+(?:\(\d+\))?\b")
516
+ nist_matches = nist_pattern.findall(ato_content)
517
+ if nist_matches:
518
+ results.append(CheckResult(
519
+ check_id=_generate_id("ato"),
520
+ name="ATO: NIST controls",
521
+ status="pass",
522
+ severity="high",
523
+ message=f"NIST controls referenced: {', '.join(nist_matches[:5])}.",
524
+ section="ato impact assessment",
525
+ ))
526
+ else:
527
+ results.append(CheckResult(
528
+ check_id=_generate_id("ato"),
529
+ name="ATO: NIST controls",
530
+ status="fail",
531
+ severity="high",
532
+ message="No NIST 800-53 control IDs found in ATO section.",
533
+ suggestion="Reference applicable controls (e.g., AC-2, AU-2, IA-2, SC-8).",
534
+ section="ato impact assessment",
535
+ ))
536
+
537
+ # SSP impact
538
+ ssp_mentioned = bool(re.search(r"\bSSP\b", ato_content, re.IGNORECASE))
539
+ results.append(CheckResult(
540
+ check_id=_generate_id("ato"),
541
+ name="ATO: SSP impact",
542
+ status="pass" if ssp_mentioned else "warn",
543
+ severity="medium",
544
+ message=(
545
+ "SSP impact noted." if ssp_mentioned
546
+ else "No mention of SSP impact. Consider documenting whether SSP requires update."
547
+ ),
548
+ suggestion="" if ssp_mentioned else "Add SSP impact statement (e.g., 'SSP addendum required').",
549
+ section="ato impact assessment",
550
+ ))
551
+
552
+ return results
553
+
554
+
555
+ def check_testability(sections: dict) -> list:
556
+ """Check that testing strategy and validation commands exist with content."""
557
+ results = []
558
+
559
+ # Testing strategy
560
+ ts_content = ""
561
+ for key, content in sections.items():
562
+ if "testing" in key and "strategy" in key:
563
+ ts_content = content
564
+ break
565
+ if "testing strategy" in key:
566
+ ts_content = content
567
+ break
568
+
569
+ if ts_content.strip():
570
+ results.append(CheckResult(
571
+ check_id=_generate_id("tst"),
572
+ name="Testability: testing strategy",
573
+ status="pass",
574
+ severity="high",
575
+ message="Testing strategy section present with content.",
576
+ section="testing strategy",
577
+ ))
578
+ else:
579
+ results.append(CheckResult(
580
+ check_id=_generate_id("tst"),
581
+ name="Testability: testing strategy",
582
+ status="fail",
583
+ severity="high",
584
+ message="Testing strategy section is missing or empty.",
585
+ suggestion="Add '## Testing Strategy' describing unit, BDD, edge case, and E2E approaches.",
586
+ section="testing strategy",
587
+ ))
588
+
589
+ # Validation commands
590
+ vc_content = ""
591
+ for key, content in sections.items():
592
+ if "validation" in key and "command" in key:
593
+ vc_content = content
594
+ break
595
+ if "validation commands" in key:
596
+ vc_content = content
597
+ break
598
+
599
+ if vc_content.strip():
600
+ # Check for actual command-like content (backticks or bash patterns)
601
+ has_commands = bool(
602
+ re.search(r"(```|python |pytest |behave |curl |bash |npm |go |cargo )", vc_content)
603
+ )
604
+ results.append(CheckResult(
605
+ check_id=_generate_id("tst"),
606
+ name="Testability: validation commands",
607
+ status="pass" if has_commands else "warn",
608
+ severity="medium",
609
+ message=(
610
+ "Validation commands section has executable commands."
611
+ if has_commands else
612
+ "Validation commands section exists but may lack executable commands."
613
+ ),
614
+ suggestion="" if has_commands else "Include runnable bash/python commands to verify implementation.",
615
+ section="validation commands",
616
+ ))
617
+ else:
618
+ results.append(CheckResult(
619
+ check_id=_generate_id("tst"),
620
+ name="Testability: validation commands",
621
+ status="fail",
622
+ severity="medium",
623
+ message="Validation commands section is missing or empty.",
624
+ suggestion="Add '## Validation Commands' with bash commands to verify the implementation.",
625
+ section="validation commands",
626
+ ))
627
+
628
+ return results
629
+
630
+
631
+ def check_task_completeness(sections: dict) -> list:
632
+ """Verify implementation plan phases are covered in step-by-step tasks."""
633
+ results = []
634
+
635
+ # Find implementation plan
636
+ plan_content = ""
637
+ for key, content in sections.items():
638
+ if "implementation" in key and "plan" in key:
639
+ plan_content = content
640
+ break
641
+ if "implementation plan" in key:
642
+ plan_content = content
643
+ break
644
+
645
+ if not plan_content.strip():
646
+ return results # Cannot check without plan
647
+
648
+ # Find tasks section
649
+ tasks_content = ""
650
+ for key, content in sections.items():
651
+ if "step" in key and "task" in key:
652
+ tasks_content = content
653
+ break
654
+ if "step by step tasks" in key:
655
+ tasks_content = content
656
+ break
657
+
658
+ if not tasks_content.strip():
659
+ return results # Already caught by required section check
660
+
661
+ # Extract phase names/numbers from plan
662
+ phase_pattern = re.compile(r"###?\s*Phase\s+(\d+)[:\s]*(.+)", re.IGNORECASE)
663
+ phases = phase_pattern.findall(plan_content)
664
+
665
+ if not phases:
666
+ # Try simpler pattern: numbered list with "Phase" or keywords
667
+ numbered = re.compile(r"^\s*\d+\.\s*(.+)", re.MULTILINE)
668
+ phase_items = numbered.findall(plan_content)
669
+ for idx, item in enumerate(phase_items, 1):
670
+ phases.append((str(idx), item.strip()))
671
+
672
+ if not phases:
673
+ results.append(CheckResult(
674
+ check_id=_generate_id("task"),
675
+ name="Task Completeness: phase extraction",
676
+ status="warn",
677
+ severity="medium",
678
+ message="Could not extract phases from implementation plan.",
679
+ suggestion="Use '### Phase N: Name' format in the Implementation Plan.",
680
+ section="implementation plan",
681
+ ))
682
+ return results
683
+
684
+ tasks_lower = tasks_content.lower()
685
+ uncovered = []
686
+ for num, name in phases:
687
+ # Check if phase number or key words appear in tasks
688
+ name_words = [w for w in name.lower().split() if len(w) > 3]
689
+ phase_ref = f"phase {num}"
690
+ found = phase_ref in tasks_lower
691
+ if not found and name_words:
692
+ found = any(w in tasks_lower for w in name_words[:3])
693
+ if not found:
694
+ uncovered.append(f"Phase {num}: {name.strip()}")
695
+
696
+ if uncovered:
697
+ results.append(CheckResult(
698
+ check_id=_generate_id("task"),
699
+ name="Task Completeness: phase coverage",
700
+ status="fail",
701
+ severity="high",
702
+ message=f"{len(uncovered)} phase(s) have no corresponding tasks: {'; '.join(uncovered[:3])}.",
703
+ suggestion="Ensure each implementation phase has detailed tasks in 'Step by Step Tasks'.",
704
+ section="step by step tasks",
705
+ ))
706
+ else:
707
+ results.append(CheckResult(
708
+ check_id=_generate_id("task"),
709
+ name="Task Completeness: phase coverage",
710
+ status="pass",
711
+ severity="high",
712
+ message=f"All {len(phases)} implementation phases are covered in tasks.",
713
+ section="step by step tasks",
714
+ ))
715
+
716
+ return results
717
+
718
+
719
+ def check_constitution_compliance(sections: dict, principles: list) -> list:
720
+ """Check spec against project constitution principles."""
721
+ results = []
722
+ if not principles:
723
+ return results
724
+
725
+ all_content = "\n".join(sections.values()).lower()
726
+
727
+ for principle in principles:
728
+ p_text = principle.get("text", "")
729
+ keywords = principle.get("keywords", [])
730
+ priority = principle.get("priority", 3)
731
+ category = principle.get("category", "general")
732
+
733
+ if not keywords:
734
+ continue
735
+
736
+ # Check if any keyword appears in the spec
737
+ found_keywords = [kw for kw in keywords if kw.lower() in all_content]
738
+
739
+ if found_keywords:
740
+ results.append(CheckResult(
741
+ check_id=_generate_id("con"),
742
+ name=f"Constitution: {category}",
743
+ status="pass",
744
+ severity="critical" if priority == 1 else "high" if priority == 2 else "medium",
745
+ message=f"Principle addressed: '{p_text[:60]}...' (keywords: {', '.join(found_keywords[:3])}).",
746
+ section="constitution",
747
+ ))
748
+ else:
749
+ severity = "critical" if priority == 1 else "high" if priority == 2 else "medium"
750
+ status = "fail" if priority == 1 else "warn"
751
+ results.append(CheckResult(
752
+ check_id=_generate_id("con"),
753
+ name=f"Constitution: {category}",
754
+ status=status,
755
+ severity=severity,
756
+ message=f"Principle not addressed: '{p_text[:80]}'.",
757
+ suggestion=f"Ensure the spec addresses: {', '.join(keywords[:4])}.",
758
+ section="constitution",
759
+ ))
760
+
761
+ return results
762
+
763
+
764
+ # ---------------------------------------------------------------------------
765
+ # Orchestrator
766
+ # ---------------------------------------------------------------------------
767
+
768
+ def run_all_checks(spec_path: Path, project_id: str = None, db_path=None) -> dict:
769
+ """Run all quality checks on a spec file.
770
+
771
+ Returns a summary dict with quality score, check results, and suggestions.
772
+ """
773
+ spec_path = Path(spec_path)
774
+ if not spec_path.exists():
775
+ return {"status": "error", "error": f"Spec file not found: {spec_path}"}
776
+
777
+ sections = parse_spec_sections(spec_path)
778
+ checklist = _load_checklist()
779
+ patterns = _load_ambiguity_patterns()
780
+ principles = _load_constitutions(project_id, db_path)
781
+
782
+ all_checks = []
783
+ all_checks.extend(check_required_sections(sections, checklist))
784
+ all_checks.extend(check_ambiguity(sections, patterns))
785
+ all_checks.extend(check_acceptance_criteria(sections))
786
+ all_checks.extend(check_ato_coverage(sections))
787
+ all_checks.extend(check_testability(sections))
788
+ all_checks.extend(check_task_completeness(sections))
789
+ all_checks.extend(check_constitution_compliance(sections, principles))
790
+
791
+ passed = sum(1 for c in all_checks if c.status == "pass")
792
+ failed = sum(1 for c in all_checks if c.status == "fail")
793
+ warnings = sum(1 for c in all_checks if c.status == "warn")
794
+ total = len(all_checks)
795
+
796
+ # Quality score: pass_count / total * 100, cap at 50 if any critical failure
797
+ quality_score = (passed / max(total, 1)) * 100.0
798
+ critical_failures = [
799
+ c.to_dict() for c in all_checks
800
+ if c.status == "fail" and c.severity == "critical"
801
+ ]
802
+ if critical_failures:
803
+ quality_score = min(quality_score, 50.0)
804
+
805
+ quality_score = round(quality_score, 1)
806
+
807
+ suggestions = [
808
+ c.suggestion for c in all_checks
809
+ if c.suggestion and c.status in ("fail", "warn")
810
+ ]
811
+
812
+ if _HAS_AUDIT:
813
+ log_event(
814
+ event_type="spec_quality_check",
815
+ actor="sparkpilot-requirements-analyst",
816
+ action=f"Quality check on {spec_path.name}: {quality_score}%",
817
+ project_id=project_id or "",
818
+ details={
819
+ "spec_file": str(spec_path),
820
+ "quality_score": quality_score,
821
+ "passed": passed,
822
+ "failed": failed,
823
+ },
824
+ )
825
+
826
+ return {
827
+ "status": "ok",
828
+ "spec_file": str(spec_path),
829
+ "quality_score": quality_score,
830
+ "total_checks": total,
831
+ "passed": passed,
832
+ "failed": failed,
833
+ "warnings": warnings,
834
+ "checks": [c.to_dict() for c in all_checks],
835
+ "critical_failures": critical_failures,
836
+ "suggestions": suggestions,
837
+ }
838
+
839
+
840
+ # ---------------------------------------------------------------------------
841
+ # Annotation helpers (inline markers)
842
+ # ---------------------------------------------------------------------------
843
+
844
+ _MARKER_PATTERN = re.compile(r"\[NEEDS CLARIFICATION:\s*[^\]]+\]")
845
+
846
+
847
+ def annotate_spec(spec_path: Path, check_results: list, max_markers: int = 3) -> str:
848
+ """Insert ``[NEEDS CLARIFICATION: ...]`` markers inline for critical/high failures.
849
+
850
+ Only inserts up to *max_markers* markers. Returns the annotated content string.
851
+ """
852
+ content = Path(spec_path).read_text(encoding="utf-8")
853
+
854
+ # Filter to critical/high failures only
855
+ failures = [
856
+ c for c in check_results
857
+ if c.get("status") == "fail" and c.get("severity") in ("critical", "high")
858
+ ]
859
+
860
+ inserted = 0
861
+ for fail in failures:
862
+ if inserted >= max_markers:
863
+ break
864
+
865
+ section = fail.get("section", "").lower()
866
+ message = fail.get("message", "")
867
+ check_id = fail.get("check_id", "unknown")
868
+ marker = f"[NEEDS CLARIFICATION: {check_id} -- {message[:80]}]"
869
+
870
+ # Try to insert after the section heading
871
+ if section:
872
+ # Look for ## Section heading (case-insensitive)
873
+ heading_re = re.compile(
874
+ rf"^(##\s+.*{re.escape(section.split(',')[0].strip())}.*$)",
875
+ re.IGNORECASE | re.MULTILINE,
876
+ )
877
+ match = heading_re.search(content)
878
+ if match:
879
+ insert_pos = match.end()
880
+ content = content[:insert_pos] + f"\n{marker}" + content[insert_pos:]
881
+ inserted += 1
882
+ continue
883
+
884
+ # Fallback: insert at end of file
885
+ content = content.rstrip() + f"\n\n{marker}\n"
886
+ inserted += 1
887
+
888
+ return content
889
+
890
+
891
+ def strip_markers(spec_path: Path) -> str:
892
+ """Remove all ``[NEEDS CLARIFICATION: ...]`` markers from spec content."""
893
+ content = Path(spec_path).read_text(encoding="utf-8")
894
+ cleaned = _MARKER_PATTERN.sub("", content)
895
+ # Clean up any leftover blank lines from removed markers
896
+ cleaned = re.sub(r"\n{3,}", "\n\n", cleaned)
897
+ return cleaned
898
+
899
+
900
+ def count_markers(spec_path: Path) -> int:
901
+ """Count existing ``[NEEDS CLARIFICATION: ...]`` markers."""
902
+ content = Path(spec_path).read_text(encoding="utf-8")
903
+ return len(_MARKER_PATTERN.findall(content))
904
+
905
+
906
+ # ---------------------------------------------------------------------------
907
+ # Human-readable output
908
+ # ---------------------------------------------------------------------------
909
+
910
+ def _format_human(result: dict) -> str:
911
+ """Format check results for terminal display."""
912
+ lines = []
913
+ score = result.get("quality_score", 0)
914
+ spec = result.get("spec_file", "unknown")
915
+
916
+ # Score color indicator
917
+ if score >= 80:
918
+ indicator = "[PASS]"
919
+ elif score >= 50:
920
+ indicator = "[WARN]"
921
+ else:
922
+ indicator = "[FAIL]"
923
+
924
+ lines.append(f"{'=' * 60}")
925
+ lines.append(f"Spec Quality Report: {spec}")
926
+ lines.append(f"{'=' * 60}")
927
+ lines.append(f" Score: {score:.1f}% {indicator}")
928
+ lines.append(f" Passed: {result.get('passed', 0)} | Failed: {result.get('failed', 0)} | Warnings: {result.get('warnings', 0)}")
929
+ lines.append("")
930
+
931
+ # Group by status
932
+ for check in result.get("checks", []):
933
+ status = check.get("status", "?").upper()
934
+ sev = check.get("severity", "?")
935
+ name = check.get("name", "")
936
+ msg = check.get("message", "")
937
+ tag = f"[{status}:{sev}]"
938
+ lines.append(f" {tag:20s} {name}")
939
+ if status in ("FAIL", "WARN"):
940
+ lines.append(f" {'':20s} {msg}")
941
+ if check.get("suggestion"):
942
+ lines.append(f" {'':20s} -> {check['suggestion']}")
943
+
944
+ if result.get("critical_failures"):
945
+ lines.append("")
946
+ lines.append(f"CRITICAL FAILURES ({len(result['critical_failures'])}):")
947
+ for cf in result["critical_failures"]:
948
+ lines.append(f" * {cf.get('name', '')}: {cf.get('message', '')}")
949
+
950
+ lines.append(f"{'=' * 60}")
951
+ return "\n".join(lines)
952
+
953
+
954
+ # ---------------------------------------------------------------------------
955
+ # CLI
956
+ # ---------------------------------------------------------------------------
957
+
958
+ def main():
959
+ parser = argparse.ArgumentParser(
960
+ description="SPARKPILOT Spec Quality Checker -- 'unit tests for English'"
961
+ )
962
+ parser.add_argument("--spec-file", type=str, help="Check a single spec markdown file")
963
+ parser.add_argument("--spec-dir", type=str, help="Check all .md files in directory (recursive)")
964
+ parser.add_argument("--annotate", action="store_true", help="Output annotated spec with inline markers")
965
+ parser.add_argument("--output", type=str, help="Write annotated output to file instead of stdout")
966
+ parser.add_argument("--strip-markers", action="store_true", help="Remove markers from spec")
967
+ parser.add_argument("--count-markers", action="store_true", help="Count markers in spec")
968
+ parser.add_argument("--project-id", type=str, help="Project ID for constitution validation")
969
+ parser.add_argument("--json", action="store_true", help="JSON output")
970
+ parser.add_argument("--human", action="store_true", help="Colored terminal output")
971
+ args = parser.parse_args()
972
+
973
+ try:
974
+ # --- Strip markers mode ---
975
+ if args.strip_markers:
976
+ if not args.spec_file:
977
+ raise ValueError("--strip-markers requires --spec-file")
978
+ cleaned = strip_markers(Path(args.spec_file))
979
+ if args.output:
980
+ Path(args.output).write_text(cleaned, encoding="utf-8")
981
+ result = {"status": "ok", "message": f"Markers stripped, written to {args.output}"}
982
+ else:
983
+ result = {"status": "ok", "content": cleaned}
984
+ if args.json:
985
+ print(json.dumps(result, indent=2))
986
+ else:
987
+ print(cleaned if not args.output else result["message"])
988
+ return
989
+
990
+ # --- Count markers mode ---
991
+ if args.count_markers:
992
+ if not args.spec_file:
993
+ raise ValueError("--count-markers requires --spec-file")
994
+ count = count_markers(Path(args.spec_file))
995
+ result = {"status": "ok", "spec_file": args.spec_file, "marker_count": count}
996
+ if args.json:
997
+ print(json.dumps(result, indent=2))
998
+ else:
999
+ print(f"Markers found: {count}")
1000
+ return
1001
+
1002
+ # --- Single file mode ---
1003
+ if args.spec_file:
1004
+ result = run_all_checks(
1005
+ Path(args.spec_file),
1006
+ project_id=args.project_id,
1007
+ )
1008
+
1009
+ # Annotate mode
1010
+ if args.annotate and result.get("status") == "ok":
1011
+ annotated = annotate_spec(Path(args.spec_file), result.get("checks", []))
1012
+ if args.output:
1013
+ Path(args.output).write_text(annotated, encoding="utf-8")
1014
+ result["annotated_output"] = args.output
1015
+ result["message"] = f"Annotated spec written to {args.output}"
1016
+ else:
1017
+ if args.json:
1018
+ result["annotated_content"] = annotated
1019
+ else:
1020
+ print(annotated)
1021
+ return
1022
+
1023
+ if args.json:
1024
+ print(json.dumps(result, indent=2, default=str))
1025
+ elif args.human:
1026
+ print(_format_human(result))
1027
+ else:
1028
+ print(json.dumps(result, indent=2, default=str))
1029
+ return
1030
+
1031
+ # --- Batch mode ---
1032
+ if args.spec_dir:
1033
+ spec_dir = Path(args.spec_dir)
1034
+ if not spec_dir.is_dir():
1035
+ raise ValueError(f"Not a directory: {spec_dir}")
1036
+
1037
+ all_results = []
1038
+ for md_file in sorted(spec_dir.rglob("*.md")):
1039
+ r = run_all_checks(md_file, project_id=args.project_id)
1040
+ all_results.append(r)
1041
+
1042
+ batch_result = {
1043
+ "status": "ok",
1044
+ "spec_dir": str(spec_dir),
1045
+ "total_specs": len(all_results),
1046
+ "average_score": round(
1047
+ sum(r.get("quality_score", 0) for r in all_results) / max(len(all_results), 1),
1048
+ 1,
1049
+ ),
1050
+ "specs_passing": sum(1 for r in all_results if r.get("quality_score", 0) >= 70),
1051
+ "specs_failing": sum(1 for r in all_results if r.get("quality_score", 0) < 70),
1052
+ "results": all_results,
1053
+ }
1054
+
1055
+ if args.json:
1056
+ print(json.dumps(batch_result, indent=2, default=str))
1057
+ elif args.human:
1058
+ print(f"Batch Quality Report: {spec_dir}")
1059
+ print(f" Specs: {batch_result['total_specs']} | "
1060
+ f"Avg Score: {batch_result['average_score']}% | "
1061
+ f"Passing: {batch_result['specs_passing']} | "
1062
+ f"Failing: {batch_result['specs_failing']}")
1063
+ print()
1064
+ for r in all_results:
1065
+ print(_format_human(r))
1066
+ print()
1067
+ else:
1068
+ print(json.dumps(batch_result, indent=2, default=str))
1069
+ return
1070
+
1071
+ # No action specified
1072
+ parser.print_help()
1073
+
1074
+ except (ValueError, FileNotFoundError) as exc:
1075
+ if args.json:
1076
+ print(json.dumps({"status": "error", "error": str(exc)}, indent=2))
1077
+ else:
1078
+ print(f"Error: {exc}")
1079
+ raise SystemExit(1)
1080
+
1081
+
1082
+ if __name__ == "__main__":
1083
+ main()