igel-qe-core 1.0.5 → 1.0.8

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 (632) hide show
  1. package/dist/cli/index.js +638 -54
  2. package/dist/cli/platform.js +0 -12
  3. package/dist/mcp/server.js +183 -8
  4. package/package.json +4 -4
  5. package/src/__pycache__/__init__.cpython-311.pyc +0 -0
  6. package/src/agents/__pycache__/__init__.cpython-311.pyc +0 -0
  7. package/src/agents/__pycache__/automation_design_agent.cpython-311.pyc +0 -0
  8. package/src/agents/__pycache__/automation_design_agent.cpython-313.pyc +0 -0
  9. package/src/agents/__pycache__/code_intelligence_agent.cpython-311.pyc +0 -0
  10. package/src/agents/__pycache__/code_intelligence_agent.cpython-313.pyc +0 -0
  11. package/src/agents/__pycache__/confidence_agent.cpython-311.pyc +0 -0
  12. package/src/agents/__pycache__/confidence_agent.cpython-313.pyc +0 -0
  13. package/src/agents/__pycache__/execution_validation_agent.cpython-311.pyc +0 -0
  14. package/src/agents/__pycache__/execution_validation_agent.cpython-313.pyc +0 -0
  15. package/src/agents/__pycache__/framework_analyzer_agent.cpython-311.pyc +0 -0
  16. package/src/agents/__pycache__/framework_analyzer_agent.cpython-313.pyc +0 -0
  17. package/src/agents/__pycache__/intent_agent.cpython-313.pyc +0 -0
  18. package/src/agents/__pycache__/regression_agent.cpython-311.pyc +0 -0
  19. package/src/agents/__pycache__/regression_agent.cpython-313.pyc +0 -0
  20. package/src/agents/__pycache__/requirement_agent.cpython-311.pyc +0 -0
  21. package/src/agents/__pycache__/requirement_agent.cpython-313.pyc +0 -0
  22. package/src/agents/__pycache__/scenario_agent.cpython-311.pyc +0 -0
  23. package/{knowledge_base → src}/agents/__pycache__/scenario_agent.cpython-313.pyc +0 -0
  24. package/src/agents/__pycache__/script_generator_agent.cpython-311.pyc +0 -0
  25. package/{knowledge_base → src}/agents/__pycache__/script_generator_agent.cpython-313.pyc +0 -0
  26. package/src/agents/__pycache__/testcase_agent.cpython-311.pyc +0 -0
  27. package/src/agents/__pycache__/testcase_agent.cpython-313.pyc +0 -0
  28. package/src/agents/__pycache__/validation_agent.cpython-311.pyc +0 -0
  29. package/{knowledge_base → src}/agents/__pycache__/validation_agent.cpython-313.pyc +0 -0
  30. package/src/agents/__pycache__/workflow_engine.cpython-311.pyc +0 -0
  31. package/src/agents/__pycache__/workflow_engine.cpython-313.pyc +0 -0
  32. package/{knowledge_base → src}/agents/automation_design_agent.py +52 -22
  33. package/{knowledge_base → src}/agents/code_intelligence_agent.py +2 -2
  34. package/src/agents/confidence_agent.py +220 -0
  35. package/src/agents/execution_validation_agent.py +247 -0
  36. package/{knowledge_base → src}/agents/feedback_agent.py +36 -7
  37. package/src/agents/framework_analyzer_agent.py +43 -0
  38. package/{knowledge_base → src}/agents/fusion_agent.py +3 -3
  39. package/{knowledge_base → src}/agents/graph.py +10 -10
  40. package/{knowledge_base → src}/agents/healing_agent.py +4 -4
  41. package/src/agents/intent_agent.py +30 -0
  42. package/src/agents/internal/__init__.py +3 -0
  43. package/src/agents/internal/__pycache__/__init__.cpython-313.pyc +0 -0
  44. package/src/agents/internal/__pycache__/approval_manager.cpython-313.pyc +0 -0
  45. package/src/agents/internal/__pycache__/question_engine.cpython-313.pyc +0 -0
  46. package/src/agents/internal/approval_manager.py +111 -0
  47. package/src/agents/internal/question_engine.py +111 -0
  48. package/src/agents/internal/workflow_engine.py +28 -0
  49. package/{knowledge_base → src}/agents/kg_agent.py +3 -3
  50. package/{knowledge_base → src}/agents/memory_agent.py +4 -4
  51. package/src/agents/orchestrator/__init__.py +3 -0
  52. package/src/agents/orchestrator/__pycache__/__init__.cpython-313.pyc +0 -0
  53. package/src/agents/orchestrator/__pycache__/orchestrator.cpython-313.pyc +0 -0
  54. package/src/agents/orchestrator/orchestrator.py +63 -0
  55. package/{knowledge_base → src}/agents/rca_agent.py +4 -4
  56. package/{knowledge_base → src}/agents/reflection_agent.py +1 -1
  57. package/{knowledge_base → src}/agents/regression_agent.py +2 -2
  58. package/src/agents/requirement_agent.py +97 -0
  59. package/{knowledge_base → src}/agents/retrieval_agent.py +2 -2
  60. package/{knowledge_base → src}/agents/scenario_agent.py +11 -17
  61. package/{knowledge_base → src}/agents/script_agent.py +6 -6
  62. package/{knowledge_base → src}/agents/script_generator_agent.py +12 -10
  63. package/{knowledge_base → src}/agents/temporal_agent.py +3 -3
  64. package/src/agents/testcase_agent.py +163 -0
  65. package/{knowledge_base → src}/agents/validation_agent.py +1 -1
  66. package/src/agents/workflow_engine.py +114 -0
  67. package/{knowledge_base → src}/alembic/README.md +4 -4
  68. package/{knowledge_base → src}/alembic/env.py +1 -1
  69. package/{knowledge_base → src}/alembic/script.py.mako +1 -1
  70. package/{knowledge_base → src}/api/middleware.py +3 -3
  71. package/{knowledge_base → src}/api/server.py +28 -28
  72. package/{knowledge_base → src}/chunking/chunker.py +3 -3
  73. package/src/cli/__pycache__/__init__.cpython-311.pyc +0 -0
  74. package/src/cli/__pycache__/workflow_cli.cpython-311.pyc +0 -0
  75. package/src/cli/__pycache__/workflow_cli.cpython-313.pyc +0 -0
  76. package/{knowledge_base → src}/cli/feedback_cli.py +10 -10
  77. package/{knowledge_base → src}/cli/generate.py +11 -11
  78. package/src/cli/index.ts +704 -0
  79. package/src/cli/platform.ts +147 -0
  80. package/src/cli/workflow_cli.py +940 -0
  81. package/{knowledge_base → src}/config/__init__.py +1 -1
  82. package/src/config/__pycache__/__init__.cpython-311.pyc +0 -0
  83. package/src/config/__pycache__/__init__.cpython-313.pyc +0 -0
  84. package/src/config/__pycache__/policy_config.cpython-311.pyc +0 -0
  85. package/src/config/__pycache__/policy_config.cpython-313.pyc +0 -0
  86. package/src/config/__pycache__/settings.cpython-311.pyc +0 -0
  87. package/{knowledge_base → src}/config/__pycache__/settings.cpython-313.pyc +0 -0
  88. package/src/config/policy_config.py +85 -0
  89. package/src/config/policy_rules.yaml +50 -0
  90. package/{knowledge_base → src}/config/settings.py +51 -6
  91. package/{knowledge_base → src}/connectors/__init__.py +1 -1
  92. package/src/connectors/__pycache__/__init__.cpython-311.pyc +0 -0
  93. package/src/connectors/__pycache__/__init__.cpython-313.pyc +0 -0
  94. package/src/connectors/__pycache__/base.cpython-311.pyc +0 -0
  95. package/src/connectors/__pycache__/jira_connector.cpython-311.pyc +0 -0
  96. package/{knowledge_base → src}/connectors/__pycache__/jira_connector.cpython-313.pyc +0 -0
  97. package/src/connectors/__pycache__/query_bridge.cpython-313.pyc +0 -0
  98. package/src/connectors/bitbucket_connector.py +334 -0
  99. package/{knowledge_base → src}/connectors/community_connector.py +6 -6
  100. package/{knowledge_base → src}/connectors/confluence_connector.py +4 -4
  101. package/{knowledge_base → src}/connectors/jira_connector.py +6 -6
  102. package/{knowledge_base → src}/connectors/kb_igel_connector.py +6 -6
  103. package/{knowledge_base → src}/connectors/query_bridge.py +11 -11
  104. package/{knowledge_base → src}/connectors/search_backends.py +1 -1
  105. package/{knowledge_base → src}/connectors/serviceNow_connector.py +2 -2
  106. package/{knowledge_base → src}/connectors/sync_scheduler.py +12 -10
  107. package/{knowledge_base → src}/connectors/teamcity_connector.py +2 -2
  108. package/{knowledge_base → src}/connectors/testRail_connector.py +2 -2
  109. package/{knowledge_base → src}/connectors/web_fetcher.py +1 -1
  110. package/src/connectors/xray_connector.py +337 -0
  111. package/{knowledge_base → src}/core/__init__.py +1 -1
  112. package/src/core/__pycache__/__init__.cpython-311.pyc +0 -0
  113. package/src/core/__pycache__/__init__.cpython-313.pyc +0 -0
  114. package/src/core/__pycache__/circuit_breaker.cpython-313.pyc +0 -0
  115. package/src/core/__pycache__/confidence.cpython-311.pyc +0 -0
  116. package/src/core/__pycache__/confidence.cpython-313.pyc +0 -0
  117. package/src/core/__pycache__/context_engine.cpython-311.pyc +0 -0
  118. package/src/core/__pycache__/context_engine.cpython-313.pyc +0 -0
  119. package/src/core/__pycache__/evidence_resolver.cpython-311.pyc +0 -0
  120. package/src/core/__pycache__/evidence_resolver.cpython-313.pyc +0 -0
  121. package/src/core/__pycache__/guardrails.cpython-311.pyc +0 -0
  122. package/src/core/__pycache__/guardrails.cpython-313.pyc +0 -0
  123. package/src/core/__pycache__/hooks.cpython-311.pyc +0 -0
  124. package/src/core/__pycache__/hooks.cpython-313.pyc +0 -0
  125. package/src/core/__pycache__/intent_service.cpython-313.pyc +0 -0
  126. package/src/core/__pycache__/llm_executor.cpython-311.pyc +0 -0
  127. package/src/core/__pycache__/llm_executor.cpython-313.pyc +0 -0
  128. package/src/core/__pycache__/model_router.cpython-311.pyc +0 -0
  129. package/src/core/__pycache__/model_router.cpython-313.pyc +0 -0
  130. package/src/core/__pycache__/orchestration_contracts.cpython-311.pyc +0 -0
  131. package/src/core/__pycache__/orchestration_contracts.cpython-313.pyc +0 -0
  132. package/src/core/__pycache__/precedence.cpython-311.pyc +0 -0
  133. package/src/core/__pycache__/precedence.cpython-313.pyc +0 -0
  134. package/src/core/__pycache__/prompt_builder.cpython-311.pyc +0 -0
  135. package/src/core/__pycache__/prompt_builder.cpython-313.pyc +0 -0
  136. package/src/core/__pycache__/prompt_policy_engine.cpython-311.pyc +0 -0
  137. package/src/core/__pycache__/prompt_policy_engine.cpython-313.pyc +0 -0
  138. package/{knowledge_base → src}/core/cache.py +2 -2
  139. package/{knowledge_base → src}/core/confidence.py +2 -2
  140. package/src/core/context_engine.py +138 -0
  141. package/src/core/evidence_resolver.py +72 -0
  142. package/src/core/guardrails.py +22 -0
  143. package/src/core/hooks.py +57 -0
  144. package/src/core/intent_service.py +74 -0
  145. package/src/core/llm_executor.py +138 -0
  146. package/{knowledge_base → src}/core/logging_setup.py +1 -1
  147. package/src/core/model_router.py +246 -0
  148. package/src/core/orchestration_contracts.py +66 -0
  149. package/src/core/persistence_engine.py +159 -0
  150. package/src/core/prompt_builder.py +49 -0
  151. package/src/core/prompt_policy_engine.py +35 -0
  152. package/src/core/traceability_engine.py +56 -0
  153. package/src/db/__pycache__/__init__.cpython-311.pyc +0 -0
  154. package/src/db/__pycache__/client.cpython-311.pyc +0 -0
  155. package/{knowledge_base → src}/db/__pycache__/client.cpython-313.pyc +0 -0
  156. package/src/db/__pycache__/igel_schema.cpython-311.pyc +0 -0
  157. package/{knowledge_base → src}/db/__pycache__/igel_schema.cpython-313.pyc +0 -0
  158. package/src/db/__pycache__/kg_introspect.cpython-311.pyc +0 -0
  159. package/src/db/__pycache__/kg_introspect.cpython-313.pyc +0 -0
  160. package/{knowledge_base → src}/db/client.py +1 -1
  161. package/{knowledge_base → src}/db/connector_sync.py +1 -1
  162. package/{knowledge_base → src}/db/feedback_schema.py +2 -2
  163. package/{knowledge_base → src}/db/igel_schema.py +28 -3
  164. package/{knowledge_base → src}/db/kg_introspect.py +1 -1
  165. package/src/db/migrations.py +237 -0
  166. package/{knowledge_base → src}/db/schema.py +6 -6
  167. package/{knowledge_base → src}/deploy/Dockerfile +3 -3
  168. package/{knowledge_base → src}/deploy/feedback_automation.sh +3 -3
  169. package/{knowledge_base → src}/deploy/firecrawl-docker.sh +4 -4
  170. package/{knowledge_base → src}/deploy/igel-testgen.service +2 -2
  171. package/{knowledge_base → src}/deploy/install_reranker.sh +1 -1
  172. package/{knowledge_base → src}/deploy/requirements.txt +1 -2
  173. package/{knowledge_base → src}/deploy/run_server.sh +1 -1
  174. package/{knowledge_base → src}/docs/TEST_GENERATION_GUIDE.md +15 -15
  175. package/src/embeddings/__pycache__/__init__.cpython-311.pyc +0 -0
  176. package/src/embeddings/__pycache__/azure_embedder.cpython-311.pyc +0 -0
  177. package/{knowledge_base → src}/embeddings/__pycache__/azure_embedder.cpython-313.pyc +0 -0
  178. package/{knowledge_base → src}/embeddings/azure_embedder.py +10 -1
  179. package/{knowledge_base → src}/eval/__init__.py +3 -3
  180. package/{knowledge_base → src}/eval/__main__.py +7 -7
  181. package/src/eval/__pycache__/__init__.cpython-311.pyc +0 -0
  182. package/src/eval/__pycache__/__init__.cpython-313.pyc +0 -0
  183. package/src/eval/__pycache__/baseline.cpython-311.pyc +0 -0
  184. package/src/eval/__pycache__/baseline.cpython-313.pyc +0 -0
  185. package/src/eval/__pycache__/harness.cpython-311.pyc +0 -0
  186. package/src/eval/__pycache__/harness.cpython-313.pyc +0 -0
  187. package/src/eval/__pycache__/scorers.cpython-311.pyc +0 -0
  188. package/src/eval/__pycache__/scorers.cpython-313.pyc +0 -0
  189. package/{knowledge_base → src}/eval/harness.py +6 -6
  190. package/{knowledge_base → src}/feedback/__init__.py +1 -1
  191. package/{knowledge_base → src}/feedback/analytics.py +1 -1
  192. package/{knowledge_base → src}/feedback/applier.py +4 -4
  193. package/{knowledge_base → src}/feedback/curator.py +2 -2
  194. package/{knowledge_base → src}/feedback/handler.py +1 -1
  195. package/src/generation/__pycache__/__init__.cpython-313.pyc +0 -0
  196. package/src/generation/__pycache__/input_classifier.cpython-313.pyc +0 -0
  197. package/src/generation/__pycache__/manual_tc_parser.cpython-313.pyc +0 -0
  198. package/src/generation/__pycache__/prompts.cpython-313.pyc +0 -0
  199. package/src/generation/__pycache__/test_generator.cpython-313.pyc +0 -0
  200. package/{knowledge_base → src}/generation/input_classifier.py +1 -1
  201. package/{knowledge_base → src}/generation/prompts.py +1 -1
  202. package/{knowledge_base → src}/generation/tc_transformer.py +10 -10
  203. package/{knowledge_base → src}/generation/test_generator.py +56 -10
  204. package/{knowledge_base → src}/graph_db/__init__.py +1 -1
  205. package/{knowledge_base → src}/graph_db/graphiti_client.py +2 -2
  206. package/{knowledge_base → src}/graph_db/kg_traversal.py +3 -3
  207. package/{knowledge_base → src}/graph_db/migrate_kg.py +4 -4
  208. package/{knowledge_base → src}/graph_db/neo4j_client.py +1 -1
  209. package/{knowledge_base → src}/graph_db/temporal_ingest.py +1 -1
  210. package/{knowledge_base → src}/ingestion/kg_extractor.py +6 -6
  211. package/{knowledge_base → src}/ingestion/web_ingest.py +6 -6
  212. package/src/intelligence/__pycache__/__init__.cpython-311.pyc +0 -0
  213. package/src/intelligence/__pycache__/__init__.cpython-313.pyc +0 -0
  214. package/src/intelligence/__pycache__/diff_analyzer.cpython-311.pyc +0 -0
  215. package/src/intelligence/__pycache__/diff_analyzer.cpython-313.pyc +0 -0
  216. package/src/intelligence/__pycache__/routing_engine.cpython-311.pyc +0 -0
  217. package/src/intelligence/__pycache__/routing_engine.cpython-313.pyc +0 -0
  218. package/src/intelligence/diff_analyzer.py +109 -0
  219. package/{knowledge_base → src}/intelligence/execution_ingest.py +3 -3
  220. package/src/intelligence/routing_engine.py +74 -0
  221. package/src/mcp/server.ts +384 -0
  222. package/src/memory/__init__.py +6 -0
  223. package/{knowledge_base → src}/memory/cognee_client.py +3 -3
  224. package/src/models/__pycache__/test_requirement.cpython-311.pyc +0 -0
  225. package/{knowledge_base → src}/models/__pycache__/test_requirement.cpython-313.pyc +0 -0
  226. package/{knowledge_base → src}/models/test_requirement.py +19 -7
  227. package/{knowledge_base → src}/parsers/csv_parser.py +1 -1
  228. package/{knowledge_base → src}/parsers/doc_parser.py +1 -1
  229. package/{knowledge_base → src}/parsers/html_parser.py +1 -1
  230. package/{knowledge_base → src}/parsers/pdf_parser.py +1 -1
  231. package/src/project/__pycache__/__init__.cpython-311.pyc +0 -0
  232. package/src/project/__pycache__/__init__.cpython-313.pyc +0 -0
  233. package/src/project/__pycache__/ai_folder.cpython-311.pyc +0 -0
  234. package/src/project/__pycache__/ai_folder.cpython-313.pyc +0 -0
  235. package/src/project/__pycache__/context_enricher.cpython-313.pyc +0 -0
  236. package/src/project/__pycache__/context_projection_builder.cpython-311.pyc +0 -0
  237. package/src/project/__pycache__/context_projection_builder.cpython-313.pyc +0 -0
  238. package/src/project/__pycache__/context_requirement_sync.cpython-311.pyc +0 -0
  239. package/src/project/__pycache__/context_requirement_sync.cpython-313.pyc +0 -0
  240. package/src/project/ai_folder.py +602 -0
  241. package/src/project/context_enricher.py +333 -0
  242. package/src/project/context_projection_builder.py +167 -0
  243. package/src/project/context_requirement_sync.py +205 -0
  244. package/src/project/init_check.py +214 -0
  245. package/src/prompts/__pycache__/prompt_loader.cpython-313.pyc +0 -0
  246. package/src/prompts/automation_design.md +12 -0
  247. package/src/prompts/policies/automation_generation_policy.md +11 -0
  248. package/src/prompts/policies/generation_instructions.md +24 -0
  249. package/src/prompts/policies/guardrails.md +6 -0
  250. package/src/prompts/policies/traceability_policy.md +9 -0
  251. package/src/prompts/prompt_loader.py +56 -0
  252. package/src/prompts/requirement_understanding.md +17 -0
  253. package/src/prompts/scenario_generator.md +17 -0
  254. package/src/prompts/script_generator.md +13 -0
  255. package/src/prompts/test_case_generator.md +23 -0
  256. package/src/retrieval/__pycache__/__init__.cpython-311.pyc +0 -0
  257. package/src/retrieval/__pycache__/__init__.cpython-313.pyc +0 -0
  258. package/src/retrieval/__pycache__/knowledge_graph.cpython-311.pyc +0 -0
  259. package/src/retrieval/__pycache__/knowledge_graph.cpython-313.pyc +0 -0
  260. package/src/retrieval/__pycache__/retriever.cpython-311.pyc +0 -0
  261. package/src/retrieval/__pycache__/retriever.cpython-313.pyc +0 -0
  262. package/src/retrieval/__pycache__/unified_query.cpython-313.pyc +0 -0
  263. package/{knowledge_base → src}/retrieval/context_fusion.py +3 -3
  264. package/{knowledge_base → src}/retrieval/knowledge_graph.py +4 -4
  265. package/{knowledge_base → src}/retrieval/reranker.py +2 -2
  266. package/{knowledge_base → src}/retrieval/retriever.py +11 -11
  267. package/{knowledge_base → src}/retrieval/unified_query.py +7 -7
  268. package/{knowledge_base → src}/retrieval/web_retriever.py +6 -6
  269. package/{knowledge_base → src}/validators/step_fidelity.py +1 -1
  270. package/src/vision/__init__.py +0 -0
  271. package/{knowledge_base → src}/vision/image_describer.py +1 -1
  272. package/knowledge_base/agents/__pycache__/automation_design_agent.cpython-313.pyc +0 -0
  273. package/knowledge_base/agents/__pycache__/confidence_agent.cpython-313.pyc +0 -0
  274. package/knowledge_base/agents/__pycache__/execution_validation_agent.cpython-313.pyc +0 -0
  275. package/knowledge_base/agents/__pycache__/requirement_agent.cpython-313.pyc +0 -0
  276. package/knowledge_base/agents/__pycache__/testcase_agent.cpython-313.pyc +0 -0
  277. package/knowledge_base/agents/__pycache__/workflow_engine.cpython-313.pyc +0 -0
  278. package/knowledge_base/agents/confidence_agent.py +0 -95
  279. package/knowledge_base/agents/execution_validation_agent.py +0 -129
  280. package/knowledge_base/agents/intent_agent.py +0 -76
  281. package/knowledge_base/agents/requirement_agent.py +0 -71
  282. package/knowledge_base/agents/testcase_agent.py +0 -111
  283. package/knowledge_base/agents/workflow_engine.py +0 -87
  284. package/knowledge_base/cli/__pycache__/workflow_cli.cpython-313.pyc +0 -0
  285. package/knowledge_base/cli/generate_qcapps134.py +0 -391
  286. package/knowledge_base/cli/workflow_cli.py +0 -189
  287. package/knowledge_base/config/.env +0 -100
  288. package/knowledge_base/config/.env.example +0 -75
  289. package/knowledge_base/config/__pycache__/__init__.cpython-313.pyc +0 -0
  290. package/knowledge_base/connectors/__pycache__/__init__.cpython-313.pyc +0 -0
  291. package/knowledge_base/connectors/bitbucket_connector.py +0 -25
  292. package/knowledge_base/db/migrations.py +0 -22
  293. package/knowledge_base/ingestion/ingest.py +0 -346
  294. package/knowledge_base/ingestion/ingest_images.py +0 -330
  295. package/knowledge_base/memory/__init__.py +0 -6
  296. package/knowledge_base/memory/ingest_memory.py +0 -60
  297. /package/{knowledge_base → src}/__init__.py +0 -0
  298. /package/{knowledge_base → src}/__pycache__/__init__.cpython-313.pyc +0 -0
  299. /package/{knowledge_base → src}/__pycache__/__init__.cpython-314.pyc +0 -0
  300. /package/{knowledge_base → src}/__pycache__/__init__.cpython-37.pyc +0 -0
  301. /package/{knowledge_base → src}/__pycache__/__init__.cpython-38.pyc +0 -0
  302. /package/{knowledge_base → src}/__pycache__/confidence.cpython-37.pyc +0 -0
  303. /package/{knowledge_base → src}/__pycache__/config.cpython-314.pyc +0 -0
  304. /package/{knowledge_base → src}/__pycache__/config.cpython-37.pyc +0 -0
  305. /package/{knowledge_base → src}/__pycache__/config.cpython-38.pyc +0 -0
  306. /package/{knowledge_base → src}/__pycache__/context_fusion.cpython-314.pyc +0 -0
  307. /package/{knowledge_base → src}/__pycache__/context_fusion.cpython-37.pyc +0 -0
  308. /package/{knowledge_base → src}/__pycache__/feedback_analytics.cpython-37.pyc +0 -0
  309. /package/{knowledge_base → src}/__pycache__/feedback_applier.cpython-37.pyc +0 -0
  310. /package/{knowledge_base → src}/__pycache__/feedback_cli.cpython-37.pyc +0 -0
  311. /package/{knowledge_base → src}/__pycache__/feedback_curator.cpython-37.pyc +0 -0
  312. /package/{knowledge_base → src}/__pycache__/feedback_handler.cpython-37.pyc +0 -0
  313. /package/{knowledge_base → src}/__pycache__/generate.cpython-37.pyc +0 -0
  314. /package/{knowledge_base → src}/__pycache__/generate_qcapps134.cpython-37.pyc +0 -0
  315. /package/{knowledge_base → src}/__pycache__/input_classifier.cpython-314.pyc +0 -0
  316. /package/{knowledge_base → src}/__pycache__/input_classifier.cpython-37.pyc +0 -0
  317. /package/{knowledge_base → src}/__pycache__/kg_extractor.cpython-37.pyc +0 -0
  318. /package/{knowledge_base → src}/__pycache__/knowledge_graph.cpython-314.pyc +0 -0
  319. /package/{knowledge_base → src}/__pycache__/knowledge_graph.cpython-37.pyc +0 -0
  320. /package/{knowledge_base → src}/__pycache__/manual_tc_parser.cpython-314.pyc +0 -0
  321. /package/{knowledge_base → src}/__pycache__/manual_tc_parser.cpython-37.pyc +0 -0
  322. /package/{knowledge_base → src}/__pycache__/precedence.cpython-37.pyc +0 -0
  323. /package/{knowledge_base → src}/__pycache__/prompts.cpython-314.pyc +0 -0
  324. /package/{knowledge_base → src}/__pycache__/prompts.cpython-37.pyc +0 -0
  325. /package/{knowledge_base → src}/__pycache__/reranker.cpython-314.pyc +0 -0
  326. /package/{knowledge_base → src}/__pycache__/reranker.cpython-37.pyc +0 -0
  327. /package/{knowledge_base → src}/__pycache__/retrieval_debug.cpython-314.pyc +0 -0
  328. /package/{knowledge_base → src}/__pycache__/retrieval_debug.cpython-37.pyc +0 -0
  329. /package/{knowledge_base → src}/__pycache__/retriever.cpython-314.pyc +0 -0
  330. /package/{knowledge_base → src}/__pycache__/retriever.cpython-37.pyc +0 -0
  331. /package/{knowledge_base → src}/__pycache__/server.cpython-37.pyc +0 -0
  332. /package/{knowledge_base → src}/__pycache__/tc_transformer.cpython-314.pyc +0 -0
  333. /package/{knowledge_base → src}/__pycache__/tc_transformer.cpython-37.pyc +0 -0
  334. /package/{knowledge_base → src}/__pycache__/test_generator.cpython-314.pyc +0 -0
  335. /package/{knowledge_base → src}/__pycache__/test_generator.cpython-37.pyc +0 -0
  336. /package/{knowledge_base → src}/agents/__init__.py +0 -0
  337. /package/{knowledge_base → src}/agents/__pycache__/__init__.cpython-313.pyc +0 -0
  338. /package/{knowledge_base → src}/agents/__pycache__/__init__.cpython-314.pyc +0 -0
  339. /package/{knowledge_base → src}/agents/__pycache__/__init__.cpython-37.pyc +0 -0
  340. /package/{knowledge_base → src}/agents/__pycache__/__init__.cpython-38.pyc +0 -0
  341. /package/{knowledge_base → src}/agents/__pycache__/automation_design_agent.cpython-314.pyc +0 -0
  342. /package/{knowledge_base → src}/agents/__pycache__/confidence_agent.cpython-314.pyc +0 -0
  343. /package/{knowledge_base → src}/agents/__pycache__/execution_validation_agent.cpython-314.pyc +0 -0
  344. /package/{knowledge_base → src}/agents/__pycache__/fusion_agent.cpython-314.pyc +0 -0
  345. /package/{knowledge_base → src}/agents/__pycache__/fusion_agent.cpython-37.pyc +0 -0
  346. /package/{knowledge_base → src}/agents/__pycache__/fusion_agent.cpython-38.pyc +0 -0
  347. /package/{knowledge_base → src}/agents/__pycache__/graph.cpython-314.pyc +0 -0
  348. /package/{knowledge_base → src}/agents/__pycache__/graph.cpython-37.pyc +0 -0
  349. /package/{knowledge_base → src}/agents/__pycache__/graph.cpython-38.pyc +0 -0
  350. /package/{knowledge_base → src}/agents/__pycache__/healing_agent.cpython-37.pyc +0 -0
  351. /package/{knowledge_base → src}/agents/__pycache__/intent_agent.cpython-314.pyc +0 -0
  352. /package/{knowledge_base → src}/agents/__pycache__/intent_agent.cpython-37.pyc +0 -0
  353. /package/{knowledge_base → src}/agents/__pycache__/intent_agent.cpython-38.pyc +0 -0
  354. /package/{knowledge_base → src}/agents/__pycache__/kg_agent.cpython-314.pyc +0 -0
  355. /package/{knowledge_base → src}/agents/__pycache__/kg_agent.cpython-37.pyc +0 -0
  356. /package/{knowledge_base → src}/agents/__pycache__/kg_agent.cpython-38.pyc +0 -0
  357. /package/{knowledge_base → src}/agents/__pycache__/memory_agent.cpython-314.pyc +0 -0
  358. /package/{knowledge_base → src}/agents/__pycache__/memory_agent.cpython-37.pyc +0 -0
  359. /package/{knowledge_base → src}/agents/__pycache__/memory_agent.cpython-38.pyc +0 -0
  360. /package/{knowledge_base → src}/agents/__pycache__/rca_agent.cpython-37.pyc +0 -0
  361. /package/{knowledge_base → src}/agents/__pycache__/reflection_agent.cpython-314.pyc +0 -0
  362. /package/{knowledge_base → src}/agents/__pycache__/reflection_agent.cpython-37.pyc +0 -0
  363. /package/{knowledge_base → src}/agents/__pycache__/reflection_agent.cpython-38.pyc +0 -0
  364. /package/{knowledge_base → src}/agents/__pycache__/regression_agent.cpython-37.pyc +0 -0
  365. /package/{knowledge_base → src}/agents/__pycache__/requirement_agent.cpython-314.pyc +0 -0
  366. /package/{knowledge_base → src}/agents/__pycache__/retrieval_agent.cpython-314.pyc +0 -0
  367. /package/{knowledge_base → src}/agents/__pycache__/retrieval_agent.cpython-37.pyc +0 -0
  368. /package/{knowledge_base → src}/agents/__pycache__/retrieval_agent.cpython-38.pyc +0 -0
  369. /package/{knowledge_base → src}/agents/__pycache__/scenario_agent.cpython-314.pyc +0 -0
  370. /package/{knowledge_base → src}/agents/__pycache__/script_agent.cpython-314.pyc +0 -0
  371. /package/{knowledge_base → src}/agents/__pycache__/script_agent.cpython-37.pyc +0 -0
  372. /package/{knowledge_base → src}/agents/__pycache__/script_agent.cpython-38.pyc +0 -0
  373. /package/{knowledge_base → src}/agents/__pycache__/script_generator_agent.cpython-314.pyc +0 -0
  374. /package/{knowledge_base → src}/agents/__pycache__/state.cpython-314.pyc +0 -0
  375. /package/{knowledge_base → src}/agents/__pycache__/state.cpython-37.pyc +0 -0
  376. /package/{knowledge_base → src}/agents/__pycache__/state.cpython-38.pyc +0 -0
  377. /package/{knowledge_base → src}/agents/__pycache__/temporal_agent.cpython-314.pyc +0 -0
  378. /package/{knowledge_base → src}/agents/__pycache__/temporal_agent.cpython-37.pyc +0 -0
  379. /package/{knowledge_base → src}/agents/__pycache__/temporal_agent.cpython-38.pyc +0 -0
  380. /package/{knowledge_base → src}/agents/__pycache__/testcase_agent.cpython-314.pyc +0 -0
  381. /package/{knowledge_base → src}/agents/__pycache__/validation_agent.cpython-314.pyc +0 -0
  382. /package/{knowledge_base → src}/agents/__pycache__/validation_agent.cpython-37.pyc +0 -0
  383. /package/{knowledge_base → src}/agents/__pycache__/validation_agent.cpython-38.pyc +0 -0
  384. /package/{knowledge_base → src}/agents/__pycache__/workflow_engine.cpython-314.pyc +0 -0
  385. /package/{knowledge_base → src}/agents/state.py +0 -0
  386. /package/{knowledge_base → src}/alembic/__pycache__/env.cpython-37.pyc +0 -0
  387. /package/{knowledge_base → src}/alembic/__pycache__/env.cpython-38.pyc +0 -0
  388. /package/{knowledge_base → src}/alembic/versions/.gitkeep +0 -0
  389. /package/{knowledge_base → src}/alembic/versions/001_phase0_feedback.py +0 -0
  390. /package/{knowledge_base → src}/alembic/versions/002_feedback_promotions.py +0 -0
  391. /package/{knowledge_base → src}/alembic/versions/003_enterprise_hardening.py +0 -0
  392. /package/{knowledge_base → src}/alembic/versions/__pycache__/001_phase0_feedback.cpython-37.pyc +0 -0
  393. /package/{knowledge_base → src}/alembic/versions/__pycache__/001_phase0_feedback.cpython-38.pyc +0 -0
  394. /package/{knowledge_base → src}/alembic/versions/__pycache__/002_feedback_promotions.cpython-37.pyc +0 -0
  395. /package/{knowledge_base → src}/alembic/versions/__pycache__/002_feedback_promotions.cpython-38.pyc +0 -0
  396. /package/{knowledge_base → src}/api/__init__.py +0 -0
  397. /package/{knowledge_base → src}/api/__pycache__/__init__.cpython-37.pyc +0 -0
  398. /package/{knowledge_base → src}/api/__pycache__/__init__.cpython-38.pyc +0 -0
  399. /package/{knowledge_base → src}/api/__pycache__/middleware.cpython-38.pyc +0 -0
  400. /package/{knowledge_base → src}/api/__pycache__/server.cpython-37.pyc +0 -0
  401. /package/{knowledge_base → src}/api/__pycache__/server.cpython-38.pyc +0 -0
  402. /package/{knowledge_base → src}/chunking/__init__.py +0 -0
  403. /package/{knowledge_base → src}/chunking/__pycache__/__init__.cpython-37.pyc +0 -0
  404. /package/{knowledge_base → src}/chunking/__pycache__/__init__.cpython-38.pyc +0 -0
  405. /package/{knowledge_base → src}/chunking/__pycache__/chunker.cpython-37.pyc +0 -0
  406. /package/{knowledge_base → src}/chunking/__pycache__/chunker.cpython-38.pyc +0 -0
  407. /package/{knowledge_base → src}/chunking/__pycache__/validators.cpython-37.pyc +0 -0
  408. /package/{knowledge_base → src}/chunking/__pycache__/validators.cpython-38.pyc +0 -0
  409. /package/{knowledge_base → src}/chunking/validators.py +0 -0
  410. /package/{knowledge_base → src}/cli/__init__.py +0 -0
  411. /package/{knowledge_base → src}/cli/__pycache__/__init__.cpython-313.pyc +0 -0
  412. /package/{knowledge_base → src}/cli/__pycache__/__init__.cpython-314.pyc +0 -0
  413. /package/{knowledge_base → src}/cli/__pycache__/__init__.cpython-37.pyc +0 -0
  414. /package/{knowledge_base → src}/cli/__pycache__/__init__.cpython-38.pyc +0 -0
  415. /package/{knowledge_base → src}/cli/__pycache__/feedback_cli.cpython-37.pyc +0 -0
  416. /package/{knowledge_base → src}/cli/__pycache__/feedback_cli.cpython-38.pyc +0 -0
  417. /package/{knowledge_base → src}/cli/__pycache__/generate.cpython-37.pyc +0 -0
  418. /package/{knowledge_base → src}/cli/__pycache__/generate.cpython-38.pyc +0 -0
  419. /package/{knowledge_base → src}/cli/__pycache__/generate_qcapps134.cpython-37.pyc +0 -0
  420. /package/{knowledge_base → src}/cli/__pycache__/workflow_cli.cpython-314.pyc +0 -0
  421. /package/{knowledge_base → src}/config/__pycache__/__init__.cpython-314.pyc +0 -0
  422. /package/{knowledge_base → src}/config/__pycache__/__init__.cpython-37.pyc +0 -0
  423. /package/{knowledge_base → src}/config/__pycache__/__init__.cpython-38.pyc +0 -0
  424. /package/{knowledge_base → src}/config/__pycache__/settings.cpython-314.pyc +0 -0
  425. /package/{knowledge_base → src}/config/__pycache__/settings.cpython-37.pyc +0 -0
  426. /package/{knowledge_base → src}/config/__pycache__/settings.cpython-38.pyc +0 -0
  427. /package/{knowledge_base → src}/connectors/__pycache__/__init__.cpython-314.pyc +0 -0
  428. /package/{knowledge_base → src}/connectors/__pycache__/__init__.cpython-37.pyc +0 -0
  429. /package/{knowledge_base → src}/connectors/__pycache__/__init__.cpython-38.pyc +0 -0
  430. /package/{knowledge_base → src}/connectors/__pycache__/base.cpython-313.pyc +0 -0
  431. /package/{knowledge_base → src}/connectors/__pycache__/base.cpython-314.pyc +0 -0
  432. /package/{knowledge_base → src}/connectors/__pycache__/base.cpython-37.pyc +0 -0
  433. /package/{knowledge_base → src}/connectors/__pycache__/base.cpython-38.pyc +0 -0
  434. /package/{knowledge_base → src}/connectors/__pycache__/bitbucket_connector.cpython-37.pyc +0 -0
  435. /package/{knowledge_base → src}/connectors/__pycache__/bitbucket_connector.cpython-38.pyc +0 -0
  436. /package/{knowledge_base → src}/connectors/__pycache__/community_connector.cpython-38.pyc +0 -0
  437. /package/{knowledge_base → src}/connectors/__pycache__/confluence_connector.cpython-37.pyc +0 -0
  438. /package/{knowledge_base → src}/connectors/__pycache__/confluence_connector.cpython-38.pyc +0 -0
  439. /package/{knowledge_base → src}/connectors/__pycache__/jira_connector.cpython-314.pyc +0 -0
  440. /package/{knowledge_base → src}/connectors/__pycache__/jira_connector.cpython-37.pyc +0 -0
  441. /package/{knowledge_base → src}/connectors/__pycache__/jira_connector.cpython-38.pyc +0 -0
  442. /package/{knowledge_base → src}/connectors/__pycache__/kb_igel_connector.cpython-38.pyc +0 -0
  443. /package/{knowledge_base → src}/connectors/__pycache__/playwright_fetcher.cpython-38.pyc +0 -0
  444. /package/{knowledge_base → src}/connectors/__pycache__/query_bridge.cpython-314.pyc +0 -0
  445. /package/{knowledge_base → src}/connectors/__pycache__/query_bridge.cpython-38.pyc +0 -0
  446. /package/{knowledge_base → src}/connectors/__pycache__/search_backends.cpython-38.pyc +0 -0
  447. /package/{knowledge_base → src}/connectors/__pycache__/serviceNow_connector.cpython-37.pyc +0 -0
  448. /package/{knowledge_base → src}/connectors/__pycache__/serviceNow_connector.cpython-38.pyc +0 -0
  449. /package/{knowledge_base → src}/connectors/__pycache__/sync_scheduler.cpython-37.pyc +0 -0
  450. /package/{knowledge_base → src}/connectors/__pycache__/sync_scheduler.cpython-38.pyc +0 -0
  451. /package/{knowledge_base → src}/connectors/__pycache__/teamcity_connector.cpython-37.pyc +0 -0
  452. /package/{knowledge_base → src}/connectors/__pycache__/teamcity_connector.cpython-38.pyc +0 -0
  453. /package/{knowledge_base → src}/connectors/__pycache__/testRail_connector.cpython-37.pyc +0 -0
  454. /package/{knowledge_base → src}/connectors/__pycache__/testRail_connector.cpython-38.pyc +0 -0
  455. /package/{knowledge_base → src}/connectors/__pycache__/web_fetcher.cpython-38.pyc +0 -0
  456. /package/{knowledge_base → src}/connectors/base.py +0 -0
  457. /package/{knowledge_base → src}/connectors/playwright_fetcher.py +0 -0
  458. /package/{knowledge_base → src}/core/__pycache__/__init__.cpython-314.pyc +0 -0
  459. /package/{knowledge_base → src}/core/__pycache__/__init__.cpython-37.pyc +0 -0
  460. /package/{knowledge_base → src}/core/__pycache__/__init__.cpython-38.pyc +0 -0
  461. /package/{knowledge_base → src}/core/__pycache__/cache.cpython-38.pyc +0 -0
  462. /package/{knowledge_base → src}/core/__pycache__/circuit_breaker.cpython-314.pyc +0 -0
  463. /package/{knowledge_base → src}/core/__pycache__/circuit_breaker.cpython-38.pyc +0 -0
  464. /package/{knowledge_base → src}/core/__pycache__/confidence.cpython-314.pyc +0 -0
  465. /package/{knowledge_base → src}/core/__pycache__/confidence.cpython-37.pyc +0 -0
  466. /package/{knowledge_base → src}/core/__pycache__/confidence.cpython-38.pyc +0 -0
  467. /package/{knowledge_base → src}/core/__pycache__/logging_setup.cpython-38.pyc +0 -0
  468. /package/{knowledge_base → src}/core/__pycache__/metrics.cpython-38.pyc +0 -0
  469. /package/{knowledge_base → src}/core/__pycache__/precedence.cpython-37.pyc +0 -0
  470. /package/{knowledge_base → src}/core/__pycache__/precedence.cpython-38.pyc +0 -0
  471. /package/{knowledge_base → src}/core/__pycache__/request_context.cpython-38.pyc +0 -0
  472. /package/{knowledge_base → src}/core/circuit_breaker.py +0 -0
  473. /package/{knowledge_base → src}/core/metrics.py +0 -0
  474. /package/{knowledge_base → src}/core/precedence.py +0 -0
  475. /package/{knowledge_base → src}/core/request_context.py +0 -0
  476. /package/{knowledge_base → src}/db/__init__.py +0 -0
  477. /package/{knowledge_base → src}/db/__pycache__/__init__.cpython-313.pyc +0 -0
  478. /package/{knowledge_base → src}/db/__pycache__/__init__.cpython-314.pyc +0 -0
  479. /package/{knowledge_base → src}/db/__pycache__/__init__.cpython-37.pyc +0 -0
  480. /package/{knowledge_base → src}/db/__pycache__/__init__.cpython-38.pyc +0 -0
  481. /package/{knowledge_base → src}/db/__pycache__/client.cpython-314.pyc +0 -0
  482. /package/{knowledge_base → src}/db/__pycache__/client.cpython-37.pyc +0 -0
  483. /package/{knowledge_base → src}/db/__pycache__/client.cpython-38.pyc +0 -0
  484. /package/{knowledge_base → src}/db/__pycache__/connector_sync.cpython-38.pyc +0 -0
  485. /package/{knowledge_base → src}/db/__pycache__/feedback_schema.cpython-37.pyc +0 -0
  486. /package/{knowledge_base → src}/db/__pycache__/feedback_schema.cpython-38.pyc +0 -0
  487. /package/{knowledge_base → src}/db/__pycache__/igel_schema.cpython-314.pyc +0 -0
  488. /package/{knowledge_base → src}/db/__pycache__/kg_introspect.cpython-314.pyc +0 -0
  489. /package/{knowledge_base → src}/db/__pycache__/kg_introspect.cpython-37.pyc +0 -0
  490. /package/{knowledge_base → src}/db/__pycache__/kg_introspect.cpython-38.pyc +0 -0
  491. /package/{knowledge_base → src}/db/__pycache__/schema.cpython-37.pyc +0 -0
  492. /package/{knowledge_base → src}/db/__pycache__/schema.cpython-38.pyc +0 -0
  493. /package/{knowledge_base → src}/embeddings/__init__.py +0 -0
  494. /package/{knowledge_base → src}/embeddings/__pycache__/__init__.cpython-313.pyc +0 -0
  495. /package/{knowledge_base → src}/embeddings/__pycache__/__init__.cpython-314.pyc +0 -0
  496. /package/{knowledge_base → src}/embeddings/__pycache__/__init__.cpython-37.pyc +0 -0
  497. /package/{knowledge_base → src}/embeddings/__pycache__/__init__.cpython-38.pyc +0 -0
  498. /package/{knowledge_base → src}/embeddings/__pycache__/azure_embedder.cpython-314.pyc +0 -0
  499. /package/{knowledge_base → src}/embeddings/__pycache__/azure_embedder.cpython-37.pyc +0 -0
  500. /package/{knowledge_base → src}/embeddings/__pycache__/azure_embedder.cpython-38.pyc +0 -0
  501. /package/{knowledge_base → src}/eval/__pycache__/__init__.cpython-314.pyc +0 -0
  502. /package/{knowledge_base → src}/eval/__pycache__/__init__.cpython-37.pyc +0 -0
  503. /package/{knowledge_base → src}/eval/__pycache__/__init__.cpython-38.pyc +0 -0
  504. /package/{knowledge_base → src}/eval/__pycache__/__main__.cpython-37.pyc +0 -0
  505. /package/{knowledge_base → src}/eval/__pycache__/baseline.cpython-314.pyc +0 -0
  506. /package/{knowledge_base → src}/eval/__pycache__/baseline.cpython-37.pyc +0 -0
  507. /package/{knowledge_base → src}/eval/__pycache__/baseline.cpython-38.pyc +0 -0
  508. /package/{knowledge_base → src}/eval/__pycache__/harness.cpython-314.pyc +0 -0
  509. /package/{knowledge_base → src}/eval/__pycache__/harness.cpython-37.pyc +0 -0
  510. /package/{knowledge_base → src}/eval/__pycache__/harness.cpython-38.pyc +0 -0
  511. /package/{knowledge_base → src}/eval/__pycache__/scorers.cpython-314.pyc +0 -0
  512. /package/{knowledge_base → src}/eval/__pycache__/scorers.cpython-37.pyc +0 -0
  513. /package/{knowledge_base → src}/eval/__pycache__/scorers.cpython-38.pyc +0 -0
  514. /package/{knowledge_base → src}/eval/baseline.py +0 -0
  515. /package/{knowledge_base → src}/eval/queries_50.json +0 -0
  516. /package/{knowledge_base → src}/eval/scorers.py +0 -0
  517. /package/{knowledge_base → src}/exemplars/README.md +0 -0
  518. /package/{knowledge_base → src}/exemplars/__pycache__/pytest_reference_snippet.cpython-37.pyc +0 -0
  519. /package/{knowledge_base → src}/exemplars/gold_manual_concise_snippet.md +0 -0
  520. /package/{knowledge_base → src}/exemplars/gold_manual_detailed_snippet.md +0 -0
  521. /package/{knowledge_base → src}/exemplars/pytest_reference_snippet.py +0 -0
  522. /package/{knowledge_base → src}/feedback/__pycache__/__init__.cpython-37.pyc +0 -0
  523. /package/{knowledge_base → src}/feedback/__pycache__/__init__.cpython-38.pyc +0 -0
  524. /package/{knowledge_base → src}/feedback/__pycache__/analytics.cpython-37.pyc +0 -0
  525. /package/{knowledge_base → src}/feedback/__pycache__/analytics.cpython-38.pyc +0 -0
  526. /package/{knowledge_base → src}/feedback/__pycache__/applier.cpython-37.pyc +0 -0
  527. /package/{knowledge_base → src}/feedback/__pycache__/applier.cpython-38.pyc +0 -0
  528. /package/{knowledge_base → src}/feedback/__pycache__/curator.cpython-37.pyc +0 -0
  529. /package/{knowledge_base → src}/feedback/__pycache__/curator.cpython-38.pyc +0 -0
  530. /package/{knowledge_base → src}/feedback/__pycache__/handler.cpython-37.pyc +0 -0
  531. /package/{knowledge_base → src}/feedback/__pycache__/handler.cpython-38.pyc +0 -0
  532. /package/{knowledge_base → src}/generation/__init__.py +0 -0
  533. /package/{knowledge_base → src}/generation/__pycache__/__init__.cpython-314.pyc +0 -0
  534. /package/{knowledge_base → src}/generation/__pycache__/__init__.cpython-37.pyc +0 -0
  535. /package/{knowledge_base → src}/generation/__pycache__/__init__.cpython-38.pyc +0 -0
  536. /package/{knowledge_base → src}/generation/__pycache__/input_classifier.cpython-37.pyc +0 -0
  537. /package/{knowledge_base → src}/generation/__pycache__/input_classifier.cpython-38.pyc +0 -0
  538. /package/{knowledge_base → src}/generation/__pycache__/manual_tc_parser.cpython-37.pyc +0 -0
  539. /package/{knowledge_base → src}/generation/__pycache__/manual_tc_parser.cpython-38.pyc +0 -0
  540. /package/{knowledge_base → src}/generation/__pycache__/prompts.cpython-314.pyc +0 -0
  541. /package/{knowledge_base → src}/generation/__pycache__/prompts.cpython-37.pyc +0 -0
  542. /package/{knowledge_base → src}/generation/__pycache__/prompts.cpython-38.pyc +0 -0
  543. /package/{knowledge_base → src}/generation/__pycache__/tc_transformer.cpython-37.pyc +0 -0
  544. /package/{knowledge_base → src}/generation/__pycache__/test_generator.cpython-314.pyc +0 -0
  545. /package/{knowledge_base → src}/generation/__pycache__/test_generator.cpython-37.pyc +0 -0
  546. /package/{knowledge_base → src}/generation/__pycache__/test_generator.cpython-38.pyc +0 -0
  547. /package/{knowledge_base → src}/generation/manual_tc_parser.py +0 -0
  548. /package/{knowledge_base → src}/graph_db/__pycache__/__init__.cpython-37.pyc +0 -0
  549. /package/{knowledge_base → src}/graph_db/__pycache__/__init__.cpython-38.pyc +0 -0
  550. /package/{knowledge_base → src}/graph_db/__pycache__/graphiti_client.cpython-37.pyc +0 -0
  551. /package/{knowledge_base → src}/graph_db/__pycache__/kg_traversal.cpython-37.pyc +0 -0
  552. /package/{knowledge_base → src}/graph_db/__pycache__/migrate_kg.cpython-37.pyc +0 -0
  553. /package/{knowledge_base → src}/graph_db/__pycache__/neo4j_client.cpython-37.pyc +0 -0
  554. /package/{knowledge_base → src}/graph_db/__pycache__/neo4j_client.cpython-38.pyc +0 -0
  555. /package/{knowledge_base → src}/graph_db/__pycache__/schema.cpython-37.pyc +0 -0
  556. /package/{knowledge_base → src}/graph_db/__pycache__/temporal_ingest.cpython-37.pyc +0 -0
  557. /package/{knowledge_base → src}/graph_db/schema.py +0 -0
  558. /package/{knowledge_base → src}/ingestion/__init__.py +0 -0
  559. /package/{knowledge_base → src}/ingestion/__pycache__/__init__.cpython-37.pyc +0 -0
  560. /package/{knowledge_base → src}/ingestion/__pycache__/__init__.cpython-38.pyc +0 -0
  561. /package/{knowledge_base → src}/ingestion/__pycache__/ingest.cpython-37.pyc +0 -0
  562. /package/{knowledge_base → src}/ingestion/__pycache__/ingest.cpython-38.pyc +0 -0
  563. /package/{knowledge_base → src}/ingestion/__pycache__/ingest_images.cpython-37.pyc +0 -0
  564. /package/{knowledge_base → src}/ingestion/__pycache__/ingest_images.cpython-38.pyc +0 -0
  565. /package/{knowledge_base → src}/ingestion/__pycache__/kg_extractor.cpython-37.pyc +0 -0
  566. /package/{knowledge_base → src}/ingestion/__pycache__/kg_extractor.cpython-38.pyc +0 -0
  567. /package/{knowledge_base → src}/ingestion/__pycache__/web_ingest.cpython-38.pyc +0 -0
  568. /package/{knowledge_base → src}/intelligence/__init__.py +0 -0
  569. /package/{knowledge_base → src}/intelligence/__pycache__/__init__.cpython-37.pyc +0 -0
  570. /package/{knowledge_base → src}/intelligence/__pycache__/execution_ingest.cpython-37.pyc +0 -0
  571. /package/{knowledge_base → src}/intelligence/__pycache__/predictive_engine.cpython-37.pyc +0 -0
  572. /package/{knowledge_base → src}/intelligence/__pycache__/risk_scorer.cpython-37.pyc +0 -0
  573. /package/{knowledge_base → src}/intelligence/predictive_engine.py +0 -0
  574. /package/{knowledge_base → src}/intelligence/risk_scorer.py +0 -0
  575. /package/{knowledge_base → src}/memory/__pycache__/__init__.cpython-314.pyc +0 -0
  576. /package/{knowledge_base → src}/memory/__pycache__/__init__.cpython-37.pyc +0 -0
  577. /package/{knowledge_base → src}/memory/__pycache__/__init__.cpython-38.pyc +0 -0
  578. /package/{knowledge_base → src}/memory/__pycache__/cognee_client.cpython-314.pyc +0 -0
  579. /package/{knowledge_base → src}/memory/__pycache__/cognee_client.cpython-37.pyc +0 -0
  580. /package/{knowledge_base → src}/memory/__pycache__/cognee_client.cpython-38.pyc +0 -0
  581. /package/{knowledge_base → src}/memory/__pycache__/ingest_memory.cpython-37.pyc +0 -0
  582. /package/{knowledge_base → src}/memory/__pycache__/memory_types.cpython-314.pyc +0 -0
  583. /package/{knowledge_base → src}/memory/__pycache__/memory_types.cpython-37.pyc +0 -0
  584. /package/{knowledge_base → src}/memory/__pycache__/memory_types.cpython-38.pyc +0 -0
  585. /package/{knowledge_base → src}/memory/memory_types.py +0 -0
  586. /package/{knowledge_base → src}/models/__pycache__/test_requirement.cpython-314.pyc +0 -0
  587. /package/{knowledge_base → src}/parsers/__init__.py +0 -0
  588. /package/{knowledge_base → src}/parsers/__pycache__/__init__.cpython-37.pyc +0 -0
  589. /package/{knowledge_base → src}/parsers/__pycache__/__init__.cpython-38.pyc +0 -0
  590. /package/{knowledge_base → src}/parsers/__pycache__/csv_parser.cpython-37.pyc +0 -0
  591. /package/{knowledge_base → src}/parsers/__pycache__/csv_parser.cpython-38.pyc +0 -0
  592. /package/{knowledge_base → src}/parsers/__pycache__/doc_parser.cpython-37.pyc +0 -0
  593. /package/{knowledge_base → src}/parsers/__pycache__/doc_parser.cpython-38.pyc +0 -0
  594. /package/{knowledge_base → src}/parsers/__pycache__/html_parser.cpython-38.pyc +0 -0
  595. /package/{knowledge_base → src}/parsers/__pycache__/image_extractor.cpython-37.pyc +0 -0
  596. /package/{knowledge_base → src}/parsers/__pycache__/image_extractor.cpython-38.pyc +0 -0
  597. /package/{knowledge_base → src}/parsers/__pycache__/markdown_parser.cpython-37.pyc +0 -0
  598. /package/{knowledge_base → src}/parsers/__pycache__/markdown_parser.cpython-38.pyc +0 -0
  599. /package/{knowledge_base → src}/parsers/__pycache__/pdf_parser.cpython-37.pyc +0 -0
  600. /package/{knowledge_base → src}/parsers/__pycache__/pdf_parser.cpython-38.pyc +0 -0
  601. /package/{knowledge_base → src}/parsers/image_extractor.py +0 -0
  602. /package/{knowledge_base → src}/parsers/markdown_parser.py +0 -0
  603. /package/{knowledge_base/vision → src/project}/__init__.py +0 -0
  604. /package/{knowledge_base → src}/retrieval/__init__.py +0 -0
  605. /package/{knowledge_base → src}/retrieval/__pycache__/__init__.cpython-314.pyc +0 -0
  606. /package/{knowledge_base → src}/retrieval/__pycache__/__init__.cpython-37.pyc +0 -0
  607. /package/{knowledge_base → src}/retrieval/__pycache__/__init__.cpython-38.pyc +0 -0
  608. /package/{knowledge_base → src}/retrieval/__pycache__/context_fusion.cpython-37.pyc +0 -0
  609. /package/{knowledge_base → src}/retrieval/__pycache__/context_fusion.cpython-38.pyc +0 -0
  610. /package/{knowledge_base → src}/retrieval/__pycache__/knowledge_graph.cpython-314.pyc +0 -0
  611. /package/{knowledge_base → src}/retrieval/__pycache__/knowledge_graph.cpython-37.pyc +0 -0
  612. /package/{knowledge_base → src}/retrieval/__pycache__/knowledge_graph.cpython-38.pyc +0 -0
  613. /package/{knowledge_base → src}/retrieval/__pycache__/reranker.cpython-37.pyc +0 -0
  614. /package/{knowledge_base → src}/retrieval/__pycache__/reranker.cpython-38.pyc +0 -0
  615. /package/{knowledge_base → src}/retrieval/__pycache__/retrieval_debug.cpython-37.pyc +0 -0
  616. /package/{knowledge_base → src}/retrieval/__pycache__/retrieval_debug.cpython-38.pyc +0 -0
  617. /package/{knowledge_base → src}/retrieval/__pycache__/retriever.cpython-314.pyc +0 -0
  618. /package/{knowledge_base → src}/retrieval/__pycache__/retriever.cpython-37.pyc +0 -0
  619. /package/{knowledge_base → src}/retrieval/__pycache__/retriever.cpython-38.pyc +0 -0
  620. /package/{knowledge_base → src}/retrieval/__pycache__/unified_query.cpython-314.pyc +0 -0
  621. /package/{knowledge_base → src}/retrieval/__pycache__/unified_query.cpython-38.pyc +0 -0
  622. /package/{knowledge_base → src}/retrieval/__pycache__/web_retriever.cpython-38.pyc +0 -0
  623. /package/{knowledge_base → src}/retrieval/retrieval_debug.py +0 -0
  624. /package/{knowledge_base → src}/validators/__init__.py +0 -0
  625. /package/{knowledge_base → src}/validators/__pycache__/__init__.cpython-314.pyc +0 -0
  626. /package/{knowledge_base → src}/validators/__pycache__/__init__.cpython-37.pyc +0 -0
  627. /package/{knowledge_base → src}/validators/__pycache__/step_fidelity.cpython-314.pyc +0 -0
  628. /package/{knowledge_base → src}/validators/__pycache__/step_fidelity.cpython-37.pyc +0 -0
  629. /package/{knowledge_base → src}/vision/__pycache__/__init__.cpython-37.pyc +0 -0
  630. /package/{knowledge_base → src}/vision/__pycache__/__init__.cpython-38.pyc +0 -0
  631. /package/{knowledge_base → src}/vision/__pycache__/image_describer.cpython-37.pyc +0 -0
  632. /package/{knowledge_base → src}/vision/__pycache__/image_describer.cpython-38.pyc +0 -0
@@ -1,21 +1,9 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
3
  import * as os from 'os';
4
- import { execSync } from 'child_process';
5
4
  import chalk from 'chalk';
6
5
  import { fileURLToPath } from 'url';
7
6
  // ── Helpers ────────────────────────────────────────────────────────────────
8
- /** Resolve the full absolute path to the igel-qe-mcp binary. */
9
- function resolveIgelMcpBin() {
10
- try {
11
- // Works on Linux/macOS; on Windows use 'where igel-qe-mcp'
12
- const cmd = process.platform === 'win32' ? 'where igel-qe-mcp' : 'which igel-qe-mcp';
13
- return execSync(cmd, { encoding: 'utf8' }).trim().split('\n')[0];
14
- }
15
- catch {
16
- return process.platform === 'win32' ? 'igel-qe-mcp.cmd' : 'igel-qe-mcp';
17
- }
18
- }
19
7
  /** Detect the user-level settings.json for the running VS Code variant. */
20
8
  function detectVscodeSettingsPath() {
21
9
  const home = os.homedir();
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+ /// <reference types="node" />
2
3
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
4
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
5
  import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
@@ -34,11 +35,22 @@ const server = new Server({
34
35
  });
35
36
  // Map MCP tool names to workflow_cli action names
36
37
  const TOOL_TO_ACTION = {
38
+ plan_test_cases: 'plan_test_cases',
37
39
  generate_test_cases: 'generate_test_cases',
40
+ plan_automation: 'plan_automation',
38
41
  generate_automation: 'generate_automation',
39
- sync_bitbucket: 'sync_bitbucket',
42
+ analyze_framework_scope: 'analyze_framework_scope',
43
+ project_context_cache: 'project_context_cache',
44
+ enrich_requirement_context: 'enrich_requirement_context',
45
+ enrich_framework_context: 'enrich_framework_context',
46
+ update_context_file: 'update_context_file',
47
+ sync_bitbucket: 'sync_from_commit',
48
+ sync_from_files: 'sync_from_files',
40
49
  impact_analysis: 'impact_analysis',
41
50
  submit_feedback: 'submit_feedback',
51
+ init_project: 'init_project',
52
+ sync_push_event: 'sync_push_event',
53
+ get_project_status: 'get_project_status',
42
54
  };
43
55
  async function callPythonEngine(workflowName, args) {
44
56
  return new Promise((resolve, _reject) => {
@@ -49,7 +61,7 @@ async function callPythonEngine(workflowName, args) {
49
61
  }
50
62
  const pythonExe = resolvePythonExecutable();
51
63
  const pythonProcess = spawn(pythonExe, [
52
- "-m", "knowledge_base.cli.workflow_cli",
64
+ "-m", "src.cli.workflow_cli",
53
65
  "--action", action,
54
66
  "--args", JSON.stringify(args)
55
67
  ], {
@@ -93,39 +105,202 @@ async function callPythonEngine(workflowName, args) {
93
105
  }
94
106
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
95
107
  tools: [
108
+ {
109
+ name: "plan_test_cases",
110
+ description: "Research a Jira/Xray requirement and produce a test design plan (extracted scenarios, business rules, source corroboration) without generating manual test cases. Persists the plan so generate_test_cases can reuse it.",
111
+ inputSchema: {
112
+ type: "object",
113
+ properties: {
114
+ jira_key: { type: "string", description: "The Jira issue key (e.g., IGEL-1234)" },
115
+ test_reqid: { type: "string", description: "Optional sub-requirement id to scope the plan under the Jira key." },
116
+ repo_path: { type: "string", description: "Optional absolute path to the local repo root." }
117
+ },
118
+ required: ["jira_key"]
119
+ }
120
+ },
96
121
  {
97
122
  name: "generate_test_cases",
98
- description: "Extract requirement understanding, generate business rules, and create manual test cases for a Jira/Xray issue.",
123
+ description: "Extract requirement understanding, generate business rules, and create manual test cases for a Jira/Xray issue. Reuses a plan_test_cases artifact automatically if one exists.",
99
124
  inputSchema: {
100
125
  type: "object",
101
126
  properties: {
102
- jira_key: { type: "string", description: "The Jira issue key (e.g., IGEL-1234)" }
127
+ jira_key: { type: "string", description: "The Jira issue key (e.g., IGEL-1234)" },
128
+ test_reqid: { type: "string", description: "Optional sub-requirement id to scope generation under the Jira key." },
129
+ repo_path: { type: "string", description: "Optional absolute path to the local repo root." }
130
+ },
131
+ required: ["jira_key"]
132
+ }
133
+ },
134
+ {
135
+ name: "plan_automation",
136
+ description: "Read the approved test cases for a Jira/Xray issue and design a reusable automation plan (page objects, fixtures, utilities from the Asset Registry) without generating or validating any script. Persists the plan so generate_automation can reuse it.",
137
+ inputSchema: {
138
+ type: "object",
139
+ properties: {
140
+ jira_key: { type: "string", description: "The Jira issue key whose approved test cases should be planned for automation." },
141
+ test_reqid: { type: "string", description: "Optional sub-requirement id." },
142
+ repo_path: { type: "string", description: "Optional absolute path to the local repo root." }
103
143
  },
104
144
  required: ["jira_key"]
105
145
  }
106
146
  },
107
147
  {
108
148
  name: "generate_automation",
109
- description: "Design an automation plan from the Asset Registry and generate pytest automation scripts for approved test cases.",
149
+ description: "Design an automation plan from the Asset Registry and generate pytest automation scripts for approved test cases. Reuses a plan_automation artifact automatically if one exists.",
110
150
  inputSchema: {
111
151
  type: "object",
112
152
  properties: {
113
- jira_key: { type: "string", description: "The Jira issue key whose approved test cases should be automated." }
153
+ jira_key: { type: "string", description: "The Jira issue key whose approved test cases should be automated." },
154
+ test_reqid: { type: "string", description: "Optional sub-requirement id." },
155
+ repo_path: { type: "string", description: "Optional absolute path to the local repo root." }
114
156
  },
115
157
  required: ["jira_key"]
116
158
  }
117
159
  },
118
160
  {
119
161
  name: "sync_bitbucket",
120
- description: "Trigger a Delta Sync to parse changed Python files and update the Asset Registry and Code Intelligence graphs.",
162
+ description: "Trigger a Delta Sync from a Bitbucket commit hash — parses changed Python files and updates the Asset Registry and Code Intelligence graphs.",
121
163
  inputSchema: {
122
164
  type: "object",
123
165
  properties: {
124
- commit_hash: { type: "string", description: "The new Bitbucket commit hash to sync." }
166
+ commit_hash: { type: "string", description: "The Bitbucket commit hash to sync (maps to sync_from_commit action)." }
125
167
  },
126
168
  required: ["commit_hash"]
127
169
  }
128
170
  },
171
+ {
172
+ name: "sync_from_files",
173
+ description: "Trigger a Delta Sync from an explicit list of changed file paths (e.g. from a local git diff).",
174
+ inputSchema: {
175
+ type: "object",
176
+ properties: {
177
+ changed_files: {
178
+ type: "array",
179
+ items: { type: "string" },
180
+ description: "List of changed file paths relative to the repo root."
181
+ },
182
+ repo_path: { type: "string", description: "Optional absolute path to the local repo root." }
183
+ },
184
+ required: ["changed_files"]
185
+ }
186
+ },
187
+ {
188
+ name: "analyze_framework_scope",
189
+ description: "Run Diff Analyzer and scoped Framework Analyzer on changed files. Updates only impacted framework assets and dependency intelligence.",
190
+ inputSchema: {
191
+ type: "object",
192
+ properties: {
193
+ changed_files: {
194
+ type: "array",
195
+ items: { type: "string" },
196
+ description: "List of changed file paths relative to the repo root."
197
+ },
198
+ repo_path: { type: "string", description: "Optional absolute path to the local repo root." }
199
+ },
200
+ required: ["changed_files"]
201
+ }
202
+ },
203
+ {
204
+ name: "project_context_cache",
205
+ description: "Generate .ai/context.md as a projection from DB registries and execution outcomes (context cache, not source of truth).",
206
+ inputSchema: {
207
+ type: "object",
208
+ properties: {
209
+ repo_path: { type: "string", description: "Optional absolute path to the local repo root." }
210
+ }
211
+ }
212
+ },
213
+ {
214
+ name: "enrich_requirement_context",
215
+ description: "Update requirement context markdown and synchronize PostgreSQL requirement/asset mappings in one orchestrated call.",
216
+ inputSchema: {
217
+ type: "object",
218
+ properties: {
219
+ jira_key: { type: "string", description: "Requirement key (e.g., QCL-1762)." },
220
+ context_text: { type: "string", description: "Updated context text for this requirement." },
221
+ changed_files: {
222
+ type: "array",
223
+ items: { type: "string" },
224
+ description: "Optional list of changed files to seed impact mapping."
225
+ },
226
+ repo_path: { type: "string", description: "Optional absolute path to the local repo root." }
227
+ },
228
+ required: ["jira_key", "context_text"]
229
+ }
230
+ },
231
+ {
232
+ name: "enrich_framework_context",
233
+ description: "Enrich framework context.md files using AST parsing + dependency graph extraction and persist context metadata into PostgreSQL.",
234
+ inputSchema: {
235
+ type: "object",
236
+ properties: {
237
+ context_paths: {
238
+ type: "array",
239
+ items: { type: "string" },
240
+ description: "Optional subset of context.md paths to enrich. If omitted, enriches all discovered context.md files."
241
+ },
242
+ changed_files: {
243
+ type: "array",
244
+ items: { type: "string" },
245
+ description: "Optional changed file paths to trigger scoped framework analyzer sync before enrichment."
246
+ },
247
+ persist_only: {
248
+ type: "boolean",
249
+ description: "When true, persists metadata/content snapshots to DB without rewriting context.md files."
250
+ },
251
+ repo_path: { type: "string", description: "Optional absolute path to the local repo root." }
252
+ }
253
+ }
254
+ },
255
+ {
256
+ name: "update_context_file",
257
+ description: "Update one context.md file, regenerate AST/dependency-aware content, and write changes to PostgreSQL context registry.",
258
+ inputSchema: {
259
+ type: "object",
260
+ properties: {
261
+ context_path: { type: "string", description: "Path to the target context.md file (relative to repo root or absolute)." },
262
+ changed_files: {
263
+ type: "array",
264
+ items: { type: "string" },
265
+ description: "Optional changed file paths to re-index before regenerating context."
266
+ },
267
+ repo_path: { type: "string", description: "Optional absolute path to the local repo root." }
268
+ },
269
+ required: ["context_path"]
270
+ }
271
+ },
272
+ {
273
+ name: "init_project",
274
+ description: "Run pre-flight connectivity checks (PostgreSQL, Azure OpenAI, optional connectors) and scaffold the .ai/ project folder. Returns a readiness summary.",
275
+ inputSchema: {
276
+ type: "object",
277
+ properties: {
278
+ repo_path: { type: "string", description: "Optional absolute path to the project root. Defaults to the server's working directory." }
279
+ }
280
+ }
281
+ },
282
+ {
283
+ name: "sync_push_event",
284
+ description: "Accept a raw Bitbucket webhook push payload, validate its HMAC signature, extract changed files, and trigger a delta sync + impact analysis.",
285
+ inputSchema: {
286
+ type: "object",
287
+ properties: {
288
+ payload: { type: "object", description: "Raw Bitbucket push webhook payload JSON." },
289
+ signature: { type: "string", description: "Optional X-Hub-Signature-256 header value for HMAC validation." }
290
+ },
291
+ required: ["payload"]
292
+ }
293
+ },
294
+ {
295
+ name: "get_project_status",
296
+ description: "Rebuild .ai/system/ state from the database and return a project readiness summary (asset counts, connector sync status, generation history stats).",
297
+ inputSchema: {
298
+ type: "object",
299
+ properties: {
300
+ repo_path: { type: "string", description: "Optional absolute path to the project root." }
301
+ }
302
+ }
303
+ },
129
304
  {
130
305
  name: "impact_analysis",
131
306
  description: "Analyze the regression impact of changed code assets on existing test requirements and scripts.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "igel-qe-core",
3
- "version": "1.0.5",
3
+ "version": "1.0.8",
4
4
  "description": "IGEL QE Developer Experience Layer (CLI & MCP)",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -8,7 +8,7 @@
8
8
  },
9
9
  "files": [
10
10
  "dist/",
11
- "knowledge_base/"
11
+ "src/"
12
12
  ],
13
13
  "bin": {
14
14
  "igel-qe": "dist/cli/index.js",
@@ -20,12 +20,12 @@
20
20
  },
21
21
  "dependencies": {
22
22
  "@modelcontextprotocol/sdk": "^0.6.0",
23
- "commander": "^11.1.0",
24
23
  "chalk": "^5.3.0",
24
+ "commander": "^11.1.0",
25
25
  "zod": "^3.22.4"
26
26
  },
27
27
  "devDependencies": {
28
- "@types/node": "^20.10.0",
28
+ "@types/node": "^20.19.43",
29
29
  "typescript": "^5.3.2"
30
30
  }
31
31
  }
@@ -2,11 +2,12 @@ import json
2
2
  import logging
3
3
  from typing import List, Dict, Any
4
4
  from pydantic import BaseModel, Field
5
- from knowledge_base.config import cfg
6
- from knowledge_base.agents.requirement_agent import _get_llm_client
7
- from knowledge_base.db.client import get_conn
8
- from knowledge_base.embeddings.azure_embedder import embed_single
9
- from knowledge_base.models.test_requirement import TestCaseWithConfidence
5
+ from src.config import cfg
6
+ from src.agents.requirement_agent import _get_llm_client
7
+ from src.db.client import get_conn
8
+ from src.embeddings.azure_embedder import embed_single
9
+ from src.models.test_requirement import TestCaseWithConfidence
10
+ from src.prompts.prompt_loader import load_prompt
10
11
 
11
12
  logger = logging.getLogger(__name__)
12
13
 
@@ -14,18 +15,19 @@ class AutomationPlan(BaseModel):
14
15
  page_objects: List[str] = Field(default_factory=list)
15
16
  fixtures: List[str] = Field(default_factory=list)
16
17
  utilities: List[str] = Field(default_factory=list)
18
+ # Reusability Metric:
19
+ # (No. of reusable components generated / Total components generated) × 100 → normalised 0-1
20
+ reusability_score: float = 0.0
21
+ registry_sourced_count: int = 0
22
+ total_components_count: int = 0
17
23
 
18
- _SYSTEM_PROMPT = """You are an expert IGEL Quality Engineering Automation Architect.
19
- Your task is to design an Automation Plan for a given set of approved test cases.
20
- You will be provided with a list of available Page Objects, Fixtures, and Utilities from the Asset Registry.
21
- You must ONLY select items from the provided available lists. Do NOT invent new page objects or fixtures.
22
- Output MUST be valid JSON matching this schema:
23
- {
24
- "page_objects": ["string"],
25
- "fixtures": ["string"],
26
- "utilities": ["string"]
27
- }
28
- """
24
+ _SYSTEM_PROMPT = load_prompt(
25
+ "automation_design.md",
26
+ fallback=(
27
+ "Design automation plan from approved test cases and available assets. "
28
+ "Select only from provided lists and return JSON with page_objects, fixtures, utilities."
29
+ ),
30
+ )
29
31
 
30
32
  def _semantic_search_assets(query: str, limit: int = 20) -> Dict[str, List[str]]:
31
33
  """Retrieve relevant assets from the Asset Registry based on semantic similarity to the query."""
@@ -109,15 +111,43 @@ def design_automation_plan(test_cases: List[TestCaseWithConfidence]) -> Automati
109
111
 
110
112
  content = response.choices[0].message.content or "{}"
111
113
  data = json.loads(content)
112
-
114
+
115
+ pos = data.get("page_objects", [])
116
+ fixtures_list = data.get("fixtures", [])
117
+ utils_list = data.get("utilities", [])
118
+
119
+ # ── Reusability Metric ────────────────────────────────────────────────
120
+ # Formula: (No. of reusable components / Total components) × 100 → 0-1
121
+ # A component is 'reusable' if it was drawn from the Asset Registry (available_assets).
122
+ all_registry_names: set[str] = set()
123
+ for asset_list in available_assets.values():
124
+ for entry in asset_list:
125
+ # Entry format: "name (description...)"
126
+ name_part = entry.split("(")[0].strip()
127
+ all_registry_names.add(name_part.lower())
128
+
129
+ all_generated = pos + fixtures_list + utils_list
130
+ registry_sourced = sum(
131
+ 1 for c in all_generated
132
+ if c.split("(")[0].strip().lower() in all_registry_names
133
+ )
134
+ total_components = len(all_generated)
135
+ reusability = (registry_sourced / total_components) if total_components > 0 else 0.0
136
+
113
137
  plan = AutomationPlan(
114
- page_objects=data.get("page_objects", []),
115
- fixtures=data.get("fixtures", []),
116
- utilities=data.get("utilities", [])
138
+ page_objects=pos,
139
+ fixtures=fixtures_list,
140
+ utilities=utils_list,
141
+ reusability_score=round(reusability, 4),
142
+ registry_sourced_count=registry_sourced,
143
+ total_components_count=total_components,
144
+ )
145
+ logger.info(
146
+ "Designed Automation Plan with %d POs, %d fixtures | reusability=%.2f",
147
+ len(plan.page_objects), len(plan.fixtures), reusability,
117
148
  )
118
- logger.info(f"Designed Automation Plan with {len(plan.page_objects)} POs, {len(plan.fixtures)} fixtures")
119
149
  return plan
120
-
150
+
121
151
  except Exception as e:
122
152
  logger.error(f"Failed to design automation plan: {e}")
123
153
  return AutomationPlan()
@@ -4,8 +4,8 @@ import logging
4
4
  from pathlib import Path
5
5
  from typing import List, Dict, Any, Optional
6
6
 
7
- from knowledge_base.db.client import get_conn
8
- from knowledge_base.embeddings.azure_embedder import get_embedding
7
+ from src.db.client import get_conn
8
+ from src.embeddings.azure_embedder import get_embedding
9
9
 
10
10
  logger = logging.getLogger(__name__)
11
11