igel-qe-core 1.0.3 → 1.0.7

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 (628) hide show
  1. package/dist/cli/index.js +638 -54
  2. package/dist/cli/platform.js +115 -72
  3. package/dist/mcp/server.js +258 -17
  4. package/package.json +4 -4
  5. package/src/__pycache__/__init__.cpython-311.pyc +0 -0
  6. package/src/__pycache__/__init__.cpython-313.pyc +0 -0
  7. package/src/__pycache__/__init__.cpython-314.pyc +0 -0
  8. package/src/agents/__init__.py +3 -0
  9. package/src/agents/__pycache__/__init__.cpython-311.pyc +0 -0
  10. package/src/agents/__pycache__/__init__.cpython-313.pyc +0 -0
  11. package/src/agents/__pycache__/__init__.cpython-314.pyc +0 -0
  12. package/src/agents/__pycache__/automation_design_agent.cpython-311.pyc +0 -0
  13. package/src/agents/__pycache__/automation_design_agent.cpython-313.pyc +0 -0
  14. package/src/agents/__pycache__/automation_design_agent.cpython-314.pyc +0 -0
  15. package/src/agents/__pycache__/code_intelligence_agent.cpython-311.pyc +0 -0
  16. package/src/agents/__pycache__/code_intelligence_agent.cpython-313.pyc +0 -0
  17. package/src/agents/__pycache__/confidence_agent.cpython-311.pyc +0 -0
  18. package/src/agents/__pycache__/confidence_agent.cpython-313.pyc +0 -0
  19. package/src/agents/__pycache__/confidence_agent.cpython-314.pyc +0 -0
  20. package/src/agents/__pycache__/execution_validation_agent.cpython-311.pyc +0 -0
  21. package/src/agents/__pycache__/execution_validation_agent.cpython-313.pyc +0 -0
  22. package/src/agents/__pycache__/execution_validation_agent.cpython-314.pyc +0 -0
  23. package/src/agents/__pycache__/framework_analyzer_agent.cpython-311.pyc +0 -0
  24. package/src/agents/__pycache__/framework_analyzer_agent.cpython-313.pyc +0 -0
  25. package/src/agents/__pycache__/fusion_agent.cpython-314.pyc +0 -0
  26. package/src/agents/__pycache__/graph.cpython-314.pyc +0 -0
  27. package/src/agents/__pycache__/intent_agent.cpython-313.pyc +0 -0
  28. package/src/agents/__pycache__/intent_agent.cpython-314.pyc +0 -0
  29. package/src/agents/__pycache__/kg_agent.cpython-314.pyc +0 -0
  30. package/src/agents/__pycache__/memory_agent.cpython-314.pyc +0 -0
  31. package/src/agents/__pycache__/reflection_agent.cpython-314.pyc +0 -0
  32. package/src/agents/__pycache__/regression_agent.cpython-311.pyc +0 -0
  33. package/src/agents/__pycache__/regression_agent.cpython-313.pyc +0 -0
  34. package/src/agents/__pycache__/requirement_agent.cpython-311.pyc +0 -0
  35. package/src/agents/__pycache__/requirement_agent.cpython-313.pyc +0 -0
  36. package/src/agents/__pycache__/requirement_agent.cpython-314.pyc +0 -0
  37. package/src/agents/__pycache__/retrieval_agent.cpython-314.pyc +0 -0
  38. package/src/agents/__pycache__/scenario_agent.cpython-311.pyc +0 -0
  39. package/src/agents/__pycache__/scenario_agent.cpython-313.pyc +0 -0
  40. package/src/agents/__pycache__/scenario_agent.cpython-314.pyc +0 -0
  41. package/src/agents/__pycache__/script_agent.cpython-314.pyc +0 -0
  42. package/src/agents/__pycache__/script_generator_agent.cpython-311.pyc +0 -0
  43. package/src/agents/__pycache__/script_generator_agent.cpython-313.pyc +0 -0
  44. package/src/agents/__pycache__/script_generator_agent.cpython-314.pyc +0 -0
  45. package/src/agents/__pycache__/state.cpython-314.pyc +0 -0
  46. package/src/agents/__pycache__/temporal_agent.cpython-314.pyc +0 -0
  47. package/src/agents/__pycache__/testcase_agent.cpython-311.pyc +0 -0
  48. package/src/agents/__pycache__/testcase_agent.cpython-313.pyc +0 -0
  49. package/src/agents/__pycache__/testcase_agent.cpython-314.pyc +0 -0
  50. package/src/agents/__pycache__/validation_agent.cpython-311.pyc +0 -0
  51. package/src/agents/__pycache__/validation_agent.cpython-313.pyc +0 -0
  52. package/src/agents/__pycache__/validation_agent.cpython-314.pyc +0 -0
  53. package/src/agents/__pycache__/workflow_engine.cpython-311.pyc +0 -0
  54. package/src/agents/__pycache__/workflow_engine.cpython-313.pyc +0 -0
  55. package/src/agents/__pycache__/workflow_engine.cpython-314.pyc +0 -0
  56. package/{knowledge_base → src}/agents/automation_design_agent.py +14 -17
  57. package/{knowledge_base → src}/agents/code_intelligence_agent.py +2 -2
  58. package/src/agents/confidence_agent.py +114 -0
  59. package/{knowledge_base → src}/agents/execution_validation_agent.py +1 -1
  60. package/src/agents/feedback_agent.py +89 -0
  61. package/src/agents/framework_analyzer_agent.py +43 -0
  62. package/{knowledge_base → src}/agents/fusion_agent.py +3 -3
  63. package/{knowledge_base → src}/agents/graph.py +10 -10
  64. package/{knowledge_base → src}/agents/healing_agent.py +4 -4
  65. package/src/agents/intent_agent.py +30 -0
  66. package/src/agents/internal/__init__.py +3 -0
  67. package/src/agents/internal/__pycache__/__init__.cpython-313.pyc +0 -0
  68. package/src/agents/internal/__pycache__/approval_manager.cpython-313.pyc +0 -0
  69. package/src/agents/internal/__pycache__/question_engine.cpython-313.pyc +0 -0
  70. package/src/agents/internal/approval_manager.py +111 -0
  71. package/src/agents/internal/question_engine.py +111 -0
  72. package/src/agents/internal/workflow_engine.py +28 -0
  73. package/{knowledge_base → src}/agents/kg_agent.py +3 -3
  74. package/{knowledge_base → src}/agents/memory_agent.py +4 -4
  75. package/src/agents/orchestrator/__init__.py +3 -0
  76. package/src/agents/orchestrator/__pycache__/__init__.cpython-313.pyc +0 -0
  77. package/src/agents/orchestrator/__pycache__/orchestrator.cpython-313.pyc +0 -0
  78. package/src/agents/orchestrator/orchestrator.py +63 -0
  79. package/{knowledge_base → src}/agents/rca_agent.py +4 -4
  80. package/{knowledge_base → src}/agents/reflection_agent.py +1 -1
  81. package/{knowledge_base → src}/agents/regression_agent.py +2 -2
  82. package/src/agents/requirement_agent.py +97 -0
  83. package/{knowledge_base → src}/agents/retrieval_agent.py +2 -2
  84. package/{knowledge_base → src}/agents/scenario_agent.py +11 -17
  85. package/{knowledge_base → src}/agents/script_agent.py +6 -6
  86. package/{knowledge_base → src}/agents/script_generator_agent.py +12 -10
  87. package/{knowledge_base → src}/agents/temporal_agent.py +3 -3
  88. package/src/agents/testcase_agent.py +163 -0
  89. package/{knowledge_base → src}/agents/validation_agent.py +1 -1
  90. package/src/agents/workflow_engine.py +109 -0
  91. package/{knowledge_base → src}/alembic/README.md +4 -4
  92. package/{knowledge_base → src}/alembic/env.py +1 -1
  93. package/{knowledge_base → src}/alembic/script.py.mako +1 -1
  94. package/{knowledge_base → src}/api/middleware.py +3 -3
  95. package/{knowledge_base → src}/api/server.py +28 -28
  96. package/{knowledge_base → src}/chunking/chunker.py +3 -3
  97. package/src/cli/__pycache__/__init__.cpython-311.pyc +0 -0
  98. package/src/cli/__pycache__/__init__.cpython-313.pyc +0 -0
  99. package/src/cli/__pycache__/__init__.cpython-314.pyc +0 -0
  100. package/src/cli/__pycache__/workflow_cli.cpython-311.pyc +0 -0
  101. package/src/cli/__pycache__/workflow_cli.cpython-313.pyc +0 -0
  102. package/src/cli/__pycache__/workflow_cli.cpython-314.pyc +0 -0
  103. package/{knowledge_base → src}/cli/feedback_cli.py +10 -10
  104. package/{knowledge_base → src}/cli/generate.py +11 -11
  105. package/src/cli/index.ts +704 -0
  106. package/src/cli/platform.ts +147 -0
  107. package/src/cli/workflow_cli.py +930 -0
  108. package/{knowledge_base → src}/config/__init__.py +1 -1
  109. package/src/config/__pycache__/__init__.cpython-311.pyc +0 -0
  110. package/src/config/__pycache__/__init__.cpython-313.pyc +0 -0
  111. package/src/config/__pycache__/__init__.cpython-314.pyc +0 -0
  112. package/src/config/__pycache__/policy_config.cpython-311.pyc +0 -0
  113. package/src/config/__pycache__/policy_config.cpython-313.pyc +0 -0
  114. package/src/config/__pycache__/settings.cpython-311.pyc +0 -0
  115. package/src/config/__pycache__/settings.cpython-313.pyc +0 -0
  116. package/src/config/__pycache__/settings.cpython-314.pyc +0 -0
  117. package/src/config/policy_config.py +85 -0
  118. package/src/config/policy_rules.yaml +50 -0
  119. package/{knowledge_base → src}/config/settings.py +51 -6
  120. package/{knowledge_base → src}/connectors/__init__.py +1 -1
  121. package/src/connectors/__pycache__/__init__.cpython-311.pyc +0 -0
  122. package/src/connectors/__pycache__/__init__.cpython-313.pyc +0 -0
  123. package/src/connectors/__pycache__/__init__.cpython-314.pyc +0 -0
  124. package/src/connectors/__pycache__/base.cpython-311.pyc +0 -0
  125. package/src/connectors/__pycache__/base.cpython-313.pyc +0 -0
  126. package/src/connectors/__pycache__/base.cpython-314.pyc +0 -0
  127. package/src/connectors/__pycache__/jira_connector.cpython-311.pyc +0 -0
  128. package/src/connectors/__pycache__/jira_connector.cpython-313.pyc +0 -0
  129. package/src/connectors/__pycache__/jira_connector.cpython-314.pyc +0 -0
  130. package/src/connectors/__pycache__/query_bridge.cpython-313.pyc +0 -0
  131. package/src/connectors/__pycache__/query_bridge.cpython-314.pyc +0 -0
  132. package/src/connectors/bitbucket_connector.py +334 -0
  133. package/{knowledge_base → src}/connectors/community_connector.py +6 -6
  134. package/{knowledge_base → src}/connectors/confluence_connector.py +4 -4
  135. package/{knowledge_base → src}/connectors/jira_connector.py +7 -11
  136. package/{knowledge_base → src}/connectors/kb_igel_connector.py +6 -6
  137. package/{knowledge_base → src}/connectors/query_bridge.py +11 -11
  138. package/{knowledge_base → src}/connectors/search_backends.py +1 -1
  139. package/{knowledge_base → src}/connectors/serviceNow_connector.py +2 -2
  140. package/{knowledge_base → src}/connectors/sync_scheduler.py +12 -10
  141. package/{knowledge_base → src}/connectors/teamcity_connector.py +2 -2
  142. package/{knowledge_base → src}/connectors/testRail_connector.py +2 -2
  143. package/{knowledge_base → src}/connectors/web_fetcher.py +1 -1
  144. package/src/connectors/xray_connector.py +337 -0
  145. package/{knowledge_base → src}/core/__init__.py +1 -1
  146. package/src/core/__pycache__/__init__.cpython-311.pyc +0 -0
  147. package/src/core/__pycache__/__init__.cpython-313.pyc +0 -0
  148. package/src/core/__pycache__/__init__.cpython-314.pyc +0 -0
  149. package/src/core/__pycache__/circuit_breaker.cpython-313.pyc +0 -0
  150. package/src/core/__pycache__/circuit_breaker.cpython-314.pyc +0 -0
  151. package/src/core/__pycache__/confidence.cpython-311.pyc +0 -0
  152. package/src/core/__pycache__/confidence.cpython-313.pyc +0 -0
  153. package/src/core/__pycache__/confidence.cpython-314.pyc +0 -0
  154. package/src/core/__pycache__/context_engine.cpython-311.pyc +0 -0
  155. package/src/core/__pycache__/context_engine.cpython-313.pyc +0 -0
  156. package/src/core/__pycache__/evidence_resolver.cpython-311.pyc +0 -0
  157. package/src/core/__pycache__/evidence_resolver.cpython-313.pyc +0 -0
  158. package/src/core/__pycache__/guardrails.cpython-311.pyc +0 -0
  159. package/src/core/__pycache__/guardrails.cpython-313.pyc +0 -0
  160. package/src/core/__pycache__/hooks.cpython-311.pyc +0 -0
  161. package/src/core/__pycache__/hooks.cpython-313.pyc +0 -0
  162. package/src/core/__pycache__/intent_service.cpython-313.pyc +0 -0
  163. package/src/core/__pycache__/llm_executor.cpython-311.pyc +0 -0
  164. package/src/core/__pycache__/llm_executor.cpython-313.pyc +0 -0
  165. package/src/core/__pycache__/model_router.cpython-311.pyc +0 -0
  166. package/src/core/__pycache__/model_router.cpython-313.pyc +0 -0
  167. package/src/core/__pycache__/orchestration_contracts.cpython-311.pyc +0 -0
  168. package/src/core/__pycache__/orchestration_contracts.cpython-313.pyc +0 -0
  169. package/src/core/__pycache__/precedence.cpython-311.pyc +0 -0
  170. package/src/core/__pycache__/precedence.cpython-313.pyc +0 -0
  171. package/src/core/__pycache__/prompt_builder.cpython-311.pyc +0 -0
  172. package/src/core/__pycache__/prompt_builder.cpython-313.pyc +0 -0
  173. package/src/core/__pycache__/prompt_policy_engine.cpython-311.pyc +0 -0
  174. package/src/core/__pycache__/prompt_policy_engine.cpython-313.pyc +0 -0
  175. package/{knowledge_base → src}/core/cache.py +2 -2
  176. package/{knowledge_base → src}/core/confidence.py +2 -2
  177. package/src/core/context_engine.py +138 -0
  178. package/src/core/evidence_resolver.py +72 -0
  179. package/src/core/guardrails.py +22 -0
  180. package/src/core/hooks.py +57 -0
  181. package/src/core/intent_service.py +74 -0
  182. package/src/core/llm_executor.py +138 -0
  183. package/{knowledge_base → src}/core/logging_setup.py +1 -1
  184. package/src/core/model_router.py +246 -0
  185. package/src/core/orchestration_contracts.py +66 -0
  186. package/src/core/persistence_engine.py +159 -0
  187. package/src/core/prompt_builder.py +49 -0
  188. package/src/core/prompt_policy_engine.py +35 -0
  189. package/src/core/traceability_engine.py +56 -0
  190. package/src/db/__pycache__/__init__.cpython-311.pyc +0 -0
  191. package/src/db/__pycache__/__init__.cpython-313.pyc +0 -0
  192. package/src/db/__pycache__/__init__.cpython-314.pyc +0 -0
  193. package/src/db/__pycache__/client.cpython-311.pyc +0 -0
  194. package/src/db/__pycache__/client.cpython-313.pyc +0 -0
  195. package/src/db/__pycache__/client.cpython-314.pyc +0 -0
  196. package/src/db/__pycache__/igel_schema.cpython-311.pyc +0 -0
  197. package/src/db/__pycache__/igel_schema.cpython-313.pyc +0 -0
  198. package/src/db/__pycache__/igel_schema.cpython-314.pyc +0 -0
  199. package/src/db/__pycache__/kg_introspect.cpython-311.pyc +0 -0
  200. package/src/db/__pycache__/kg_introspect.cpython-313.pyc +0 -0
  201. package/{knowledge_base → src}/db/__pycache__/kg_introspect.cpython-314.pyc +0 -0
  202. package/{knowledge_base → src}/db/client.py +1 -1
  203. package/{knowledge_base → src}/db/connector_sync.py +1 -1
  204. package/{knowledge_base → src}/db/feedback_schema.py +2 -2
  205. package/{knowledge_base → src}/db/igel_schema.py +29 -4
  206. package/{knowledge_base → src}/db/kg_introspect.py +1 -1
  207. package/src/db/migrations.py +237 -0
  208. package/{knowledge_base → src}/db/schema.py +6 -6
  209. package/{knowledge_base → src}/deploy/Dockerfile +3 -3
  210. package/{knowledge_base → src}/deploy/feedback_automation.sh +3 -3
  211. package/{knowledge_base → src}/deploy/firecrawl-docker.sh +4 -4
  212. package/{knowledge_base → src}/deploy/igel-testgen.service +2 -2
  213. package/{knowledge_base → src}/deploy/install_reranker.sh +1 -1
  214. package/{knowledge_base → src}/deploy/requirements.txt +1 -2
  215. package/{knowledge_base → src}/deploy/run_server.sh +1 -1
  216. package/{knowledge_base → src}/docs/TEST_GENERATION_GUIDE.md +15 -15
  217. package/src/embeddings/__pycache__/__init__.cpython-311.pyc +0 -0
  218. package/src/embeddings/__pycache__/__init__.cpython-313.pyc +0 -0
  219. package/src/embeddings/__pycache__/__init__.cpython-314.pyc +0 -0
  220. package/src/embeddings/__pycache__/azure_embedder.cpython-311.pyc +0 -0
  221. package/src/embeddings/__pycache__/azure_embedder.cpython-313.pyc +0 -0
  222. package/{knowledge_base → src}/embeddings/__pycache__/azure_embedder.cpython-314.pyc +0 -0
  223. package/{knowledge_base → src}/embeddings/azure_embedder.py +10 -1
  224. package/{knowledge_base → src}/eval/__init__.py +3 -3
  225. package/{knowledge_base → src}/eval/__main__.py +7 -7
  226. package/src/eval/__pycache__/__init__.cpython-311.pyc +0 -0
  227. package/src/eval/__pycache__/__init__.cpython-313.pyc +0 -0
  228. package/src/eval/__pycache__/__init__.cpython-314.pyc +0 -0
  229. package/src/eval/__pycache__/baseline.cpython-311.pyc +0 -0
  230. package/src/eval/__pycache__/baseline.cpython-313.pyc +0 -0
  231. package/src/eval/__pycache__/baseline.cpython-314.pyc +0 -0
  232. package/src/eval/__pycache__/harness.cpython-311.pyc +0 -0
  233. package/src/eval/__pycache__/harness.cpython-313.pyc +0 -0
  234. package/src/eval/__pycache__/harness.cpython-314.pyc +0 -0
  235. package/src/eval/__pycache__/scorers.cpython-311.pyc +0 -0
  236. package/src/eval/__pycache__/scorers.cpython-313.pyc +0 -0
  237. package/src/eval/__pycache__/scorers.cpython-314.pyc +0 -0
  238. package/{knowledge_base → src}/eval/harness.py +6 -6
  239. package/{knowledge_base → src}/feedback/__init__.py +1 -1
  240. package/{knowledge_base → src}/feedback/analytics.py +1 -1
  241. package/{knowledge_base → src}/feedback/applier.py +4 -4
  242. package/{knowledge_base → src}/feedback/curator.py +2 -2
  243. package/{knowledge_base → src}/feedback/handler.py +1 -1
  244. package/src/generation/__pycache__/__init__.cpython-313.pyc +0 -0
  245. package/src/generation/__pycache__/__init__.cpython-314.pyc +0 -0
  246. package/src/generation/__pycache__/input_classifier.cpython-313.pyc +0 -0
  247. package/src/generation/__pycache__/manual_tc_parser.cpython-313.pyc +0 -0
  248. package/src/generation/__pycache__/prompts.cpython-313.pyc +0 -0
  249. package/src/generation/__pycache__/prompts.cpython-314.pyc +0 -0
  250. package/src/generation/__pycache__/test_generator.cpython-313.pyc +0 -0
  251. package/src/generation/__pycache__/test_generator.cpython-314.pyc +0 -0
  252. package/{knowledge_base → src}/generation/input_classifier.py +1 -1
  253. package/{knowledge_base → src}/generation/prompts.py +1 -1
  254. package/{knowledge_base → src}/generation/tc_transformer.py +10 -10
  255. package/{knowledge_base → src}/generation/test_generator.py +56 -10
  256. package/{knowledge_base → src}/graph_db/__init__.py +1 -1
  257. package/{knowledge_base → src}/graph_db/graphiti_client.py +2 -2
  258. package/{knowledge_base → src}/graph_db/kg_traversal.py +3 -3
  259. package/{knowledge_base → src}/graph_db/migrate_kg.py +4 -4
  260. package/{knowledge_base → src}/graph_db/neo4j_client.py +1 -1
  261. package/{knowledge_base → src}/graph_db/temporal_ingest.py +1 -1
  262. package/{knowledge_base → src}/ingestion/kg_extractor.py +6 -6
  263. package/{knowledge_base → src}/ingestion/web_ingest.py +6 -6
  264. package/src/intelligence/__pycache__/__init__.cpython-311.pyc +0 -0
  265. package/src/intelligence/__pycache__/__init__.cpython-313.pyc +0 -0
  266. package/src/intelligence/__pycache__/diff_analyzer.cpython-311.pyc +0 -0
  267. package/src/intelligence/__pycache__/diff_analyzer.cpython-313.pyc +0 -0
  268. package/src/intelligence/__pycache__/routing_engine.cpython-311.pyc +0 -0
  269. package/src/intelligence/__pycache__/routing_engine.cpython-313.pyc +0 -0
  270. package/src/intelligence/diff_analyzer.py +109 -0
  271. package/{knowledge_base → src}/intelligence/execution_ingest.py +3 -3
  272. package/src/intelligence/routing_engine.py +74 -0
  273. package/src/mcp/server.ts +384 -0
  274. package/src/memory/__init__.py +6 -0
  275. package/src/memory/__pycache__/__init__.cpython-314.pyc +0 -0
  276. package/src/memory/__pycache__/cognee_client.cpython-314.pyc +0 -0
  277. package/src/memory/__pycache__/memory_types.cpython-314.pyc +0 -0
  278. package/{knowledge_base → src}/memory/cognee_client.py +3 -3
  279. package/src/models/__pycache__/test_requirement.cpython-311.pyc +0 -0
  280. package/src/models/__pycache__/test_requirement.cpython-313.pyc +0 -0
  281. package/src/models/__pycache__/test_requirement.cpython-314.pyc +0 -0
  282. package/{knowledge_base → src}/models/test_requirement.py +12 -7
  283. package/{knowledge_base → src}/parsers/csv_parser.py +1 -1
  284. package/{knowledge_base → src}/parsers/doc_parser.py +1 -1
  285. package/{knowledge_base → src}/parsers/html_parser.py +1 -1
  286. package/{knowledge_base → src}/parsers/pdf_parser.py +1 -1
  287. package/src/project/__pycache__/__init__.cpython-311.pyc +0 -0
  288. package/src/project/__pycache__/__init__.cpython-313.pyc +0 -0
  289. package/src/project/__pycache__/ai_folder.cpython-311.pyc +0 -0
  290. package/src/project/__pycache__/ai_folder.cpython-313.pyc +0 -0
  291. package/src/project/__pycache__/context_enricher.cpython-313.pyc +0 -0
  292. package/src/project/__pycache__/context_projection_builder.cpython-311.pyc +0 -0
  293. package/src/project/__pycache__/context_projection_builder.cpython-313.pyc +0 -0
  294. package/src/project/__pycache__/context_requirement_sync.cpython-311.pyc +0 -0
  295. package/src/project/__pycache__/context_requirement_sync.cpython-313.pyc +0 -0
  296. package/src/project/ai_folder.py +602 -0
  297. package/src/project/context_enricher.py +333 -0
  298. package/src/project/context_projection_builder.py +167 -0
  299. package/src/project/context_requirement_sync.py +205 -0
  300. package/src/project/init_check.py +214 -0
  301. package/src/prompts/__pycache__/prompt_loader.cpython-313.pyc +0 -0
  302. package/src/prompts/automation_design.md +12 -0
  303. package/src/prompts/policies/automation_generation_policy.md +11 -0
  304. package/src/prompts/policies/generation_instructions.md +24 -0
  305. package/src/prompts/policies/guardrails.md +6 -0
  306. package/src/prompts/policies/traceability_policy.md +9 -0
  307. package/src/prompts/prompt_loader.py +56 -0
  308. package/src/prompts/requirement_understanding.md +17 -0
  309. package/src/prompts/scenario_generator.md +17 -0
  310. package/src/prompts/script_generator.md +13 -0
  311. package/src/prompts/test_case_generator.md +23 -0
  312. package/src/retrieval/__pycache__/__init__.cpython-311.pyc +0 -0
  313. package/src/retrieval/__pycache__/__init__.cpython-313.pyc +0 -0
  314. package/src/retrieval/__pycache__/__init__.cpython-314.pyc +0 -0
  315. package/src/retrieval/__pycache__/knowledge_graph.cpython-311.pyc +0 -0
  316. package/src/retrieval/__pycache__/knowledge_graph.cpython-313.pyc +0 -0
  317. package/src/retrieval/__pycache__/knowledge_graph.cpython-314.pyc +0 -0
  318. package/src/retrieval/__pycache__/retriever.cpython-311.pyc +0 -0
  319. package/src/retrieval/__pycache__/retriever.cpython-313.pyc +0 -0
  320. package/src/retrieval/__pycache__/retriever.cpython-314.pyc +0 -0
  321. package/src/retrieval/__pycache__/unified_query.cpython-313.pyc +0 -0
  322. package/src/retrieval/__pycache__/unified_query.cpython-314.pyc +0 -0
  323. package/{knowledge_base → src}/retrieval/context_fusion.py +3 -3
  324. package/{knowledge_base → src}/retrieval/knowledge_graph.py +4 -4
  325. package/{knowledge_base → src}/retrieval/reranker.py +2 -2
  326. package/{knowledge_base → src}/retrieval/retriever.py +11 -11
  327. package/{knowledge_base → src}/retrieval/unified_query.py +7 -7
  328. package/{knowledge_base → src}/retrieval/web_retriever.py +6 -6
  329. package/{knowledge_base → src}/validators/step_fidelity.py +1 -1
  330. package/src/vision/__init__.py +0 -0
  331. package/{knowledge_base → src}/vision/image_describer.py +1 -1
  332. package/knowledge_base/__pycache__/__init__.cpython-314.pyc +0 -0
  333. package/knowledge_base/agents/__init__.py +0 -6
  334. package/knowledge_base/agents/confidence_agent.py +0 -94
  335. package/knowledge_base/agents/feedback_agent.py +0 -56
  336. package/knowledge_base/agents/intent_agent.py +0 -76
  337. package/knowledge_base/agents/requirement_agent.py +0 -71
  338. package/knowledge_base/agents/testcase_agent.py +0 -111
  339. package/knowledge_base/agents/workflow_engine.py +0 -87
  340. package/knowledge_base/cli/generate_qcapps134.py +0 -391
  341. package/knowledge_base/cli/workflow_cli.py +0 -93
  342. package/knowledge_base/config/.env +0 -100
  343. package/knowledge_base/config/.env.example +0 -75
  344. package/knowledge_base/connectors/bitbucket_connector.py +0 -25
  345. package/knowledge_base/db/__pycache__/__init__.cpython-314.pyc +0 -0
  346. package/knowledge_base/db/__pycache__/client.cpython-314.pyc +0 -0
  347. package/knowledge_base/db/migrations.py +0 -22
  348. package/knowledge_base/embeddings/__pycache__/__init__.cpython-314.pyc +0 -0
  349. package/knowledge_base/ingestion/ingest.py +0 -346
  350. package/knowledge_base/ingestion/ingest_images.py +0 -330
  351. package/knowledge_base/memory/__init__.py +0 -6
  352. package/knowledge_base/memory/ingest_memory.py +0 -60
  353. /package/{knowledge_base → src}/__init__.py +0 -0
  354. /package/{knowledge_base → src}/__pycache__/__init__.cpython-37.pyc +0 -0
  355. /package/{knowledge_base → src}/__pycache__/__init__.cpython-38.pyc +0 -0
  356. /package/{knowledge_base → src}/__pycache__/confidence.cpython-37.pyc +0 -0
  357. /package/{knowledge_base → src}/__pycache__/config.cpython-314.pyc +0 -0
  358. /package/{knowledge_base → src}/__pycache__/config.cpython-37.pyc +0 -0
  359. /package/{knowledge_base → src}/__pycache__/config.cpython-38.pyc +0 -0
  360. /package/{knowledge_base → src}/__pycache__/context_fusion.cpython-314.pyc +0 -0
  361. /package/{knowledge_base → src}/__pycache__/context_fusion.cpython-37.pyc +0 -0
  362. /package/{knowledge_base → src}/__pycache__/feedback_analytics.cpython-37.pyc +0 -0
  363. /package/{knowledge_base → src}/__pycache__/feedback_applier.cpython-37.pyc +0 -0
  364. /package/{knowledge_base → src}/__pycache__/feedback_cli.cpython-37.pyc +0 -0
  365. /package/{knowledge_base → src}/__pycache__/feedback_curator.cpython-37.pyc +0 -0
  366. /package/{knowledge_base → src}/__pycache__/feedback_handler.cpython-37.pyc +0 -0
  367. /package/{knowledge_base → src}/__pycache__/generate.cpython-37.pyc +0 -0
  368. /package/{knowledge_base → src}/__pycache__/generate_qcapps134.cpython-37.pyc +0 -0
  369. /package/{knowledge_base → src}/__pycache__/input_classifier.cpython-314.pyc +0 -0
  370. /package/{knowledge_base → src}/__pycache__/input_classifier.cpython-37.pyc +0 -0
  371. /package/{knowledge_base → src}/__pycache__/kg_extractor.cpython-37.pyc +0 -0
  372. /package/{knowledge_base → src}/__pycache__/knowledge_graph.cpython-314.pyc +0 -0
  373. /package/{knowledge_base → src}/__pycache__/knowledge_graph.cpython-37.pyc +0 -0
  374. /package/{knowledge_base → src}/__pycache__/manual_tc_parser.cpython-314.pyc +0 -0
  375. /package/{knowledge_base → src}/__pycache__/manual_tc_parser.cpython-37.pyc +0 -0
  376. /package/{knowledge_base → src}/__pycache__/precedence.cpython-37.pyc +0 -0
  377. /package/{knowledge_base → src}/__pycache__/prompts.cpython-314.pyc +0 -0
  378. /package/{knowledge_base → src}/__pycache__/prompts.cpython-37.pyc +0 -0
  379. /package/{knowledge_base → src}/__pycache__/reranker.cpython-314.pyc +0 -0
  380. /package/{knowledge_base → src}/__pycache__/reranker.cpython-37.pyc +0 -0
  381. /package/{knowledge_base → src}/__pycache__/retrieval_debug.cpython-314.pyc +0 -0
  382. /package/{knowledge_base → src}/__pycache__/retrieval_debug.cpython-37.pyc +0 -0
  383. /package/{knowledge_base → src}/__pycache__/retriever.cpython-314.pyc +0 -0
  384. /package/{knowledge_base → src}/__pycache__/retriever.cpython-37.pyc +0 -0
  385. /package/{knowledge_base → src}/__pycache__/server.cpython-37.pyc +0 -0
  386. /package/{knowledge_base → src}/__pycache__/tc_transformer.cpython-314.pyc +0 -0
  387. /package/{knowledge_base → src}/__pycache__/tc_transformer.cpython-37.pyc +0 -0
  388. /package/{knowledge_base → src}/__pycache__/test_generator.cpython-314.pyc +0 -0
  389. /package/{knowledge_base → src}/__pycache__/test_generator.cpython-37.pyc +0 -0
  390. /package/{knowledge_base → src}/agents/__pycache__/__init__.cpython-37.pyc +0 -0
  391. /package/{knowledge_base → src}/agents/__pycache__/__init__.cpython-38.pyc +0 -0
  392. /package/{knowledge_base → src}/agents/__pycache__/fusion_agent.cpython-37.pyc +0 -0
  393. /package/{knowledge_base → src}/agents/__pycache__/fusion_agent.cpython-38.pyc +0 -0
  394. /package/{knowledge_base → src}/agents/__pycache__/graph.cpython-37.pyc +0 -0
  395. /package/{knowledge_base → src}/agents/__pycache__/graph.cpython-38.pyc +0 -0
  396. /package/{knowledge_base → src}/agents/__pycache__/healing_agent.cpython-37.pyc +0 -0
  397. /package/{knowledge_base → src}/agents/__pycache__/intent_agent.cpython-37.pyc +0 -0
  398. /package/{knowledge_base → src}/agents/__pycache__/intent_agent.cpython-38.pyc +0 -0
  399. /package/{knowledge_base → src}/agents/__pycache__/kg_agent.cpython-37.pyc +0 -0
  400. /package/{knowledge_base → src}/agents/__pycache__/kg_agent.cpython-38.pyc +0 -0
  401. /package/{knowledge_base → src}/agents/__pycache__/memory_agent.cpython-37.pyc +0 -0
  402. /package/{knowledge_base → src}/agents/__pycache__/memory_agent.cpython-38.pyc +0 -0
  403. /package/{knowledge_base → src}/agents/__pycache__/rca_agent.cpython-37.pyc +0 -0
  404. /package/{knowledge_base → src}/agents/__pycache__/reflection_agent.cpython-37.pyc +0 -0
  405. /package/{knowledge_base → src}/agents/__pycache__/reflection_agent.cpython-38.pyc +0 -0
  406. /package/{knowledge_base → src}/agents/__pycache__/regression_agent.cpython-37.pyc +0 -0
  407. /package/{knowledge_base → src}/agents/__pycache__/retrieval_agent.cpython-37.pyc +0 -0
  408. /package/{knowledge_base → src}/agents/__pycache__/retrieval_agent.cpython-38.pyc +0 -0
  409. /package/{knowledge_base → src}/agents/__pycache__/script_agent.cpython-37.pyc +0 -0
  410. /package/{knowledge_base → src}/agents/__pycache__/script_agent.cpython-38.pyc +0 -0
  411. /package/{knowledge_base → src}/agents/__pycache__/state.cpython-37.pyc +0 -0
  412. /package/{knowledge_base → src}/agents/__pycache__/state.cpython-38.pyc +0 -0
  413. /package/{knowledge_base → src}/agents/__pycache__/temporal_agent.cpython-37.pyc +0 -0
  414. /package/{knowledge_base → src}/agents/__pycache__/temporal_agent.cpython-38.pyc +0 -0
  415. /package/{knowledge_base → src}/agents/__pycache__/validation_agent.cpython-37.pyc +0 -0
  416. /package/{knowledge_base → src}/agents/__pycache__/validation_agent.cpython-38.pyc +0 -0
  417. /package/{knowledge_base → src}/agents/state.py +0 -0
  418. /package/{knowledge_base → src}/alembic/__pycache__/env.cpython-37.pyc +0 -0
  419. /package/{knowledge_base → src}/alembic/__pycache__/env.cpython-38.pyc +0 -0
  420. /package/{knowledge_base → src}/alembic/versions/.gitkeep +0 -0
  421. /package/{knowledge_base → src}/alembic/versions/001_phase0_feedback.py +0 -0
  422. /package/{knowledge_base → src}/alembic/versions/002_feedback_promotions.py +0 -0
  423. /package/{knowledge_base → src}/alembic/versions/003_enterprise_hardening.py +0 -0
  424. /package/{knowledge_base → src}/alembic/versions/__pycache__/001_phase0_feedback.cpython-37.pyc +0 -0
  425. /package/{knowledge_base → src}/alembic/versions/__pycache__/001_phase0_feedback.cpython-38.pyc +0 -0
  426. /package/{knowledge_base → src}/alembic/versions/__pycache__/002_feedback_promotions.cpython-37.pyc +0 -0
  427. /package/{knowledge_base → src}/alembic/versions/__pycache__/002_feedback_promotions.cpython-38.pyc +0 -0
  428. /package/{knowledge_base → src}/api/__init__.py +0 -0
  429. /package/{knowledge_base → src}/api/__pycache__/__init__.cpython-37.pyc +0 -0
  430. /package/{knowledge_base → src}/api/__pycache__/__init__.cpython-38.pyc +0 -0
  431. /package/{knowledge_base → src}/api/__pycache__/middleware.cpython-38.pyc +0 -0
  432. /package/{knowledge_base → src}/api/__pycache__/server.cpython-37.pyc +0 -0
  433. /package/{knowledge_base → src}/api/__pycache__/server.cpython-38.pyc +0 -0
  434. /package/{knowledge_base → src}/chunking/__init__.py +0 -0
  435. /package/{knowledge_base → src}/chunking/__pycache__/__init__.cpython-37.pyc +0 -0
  436. /package/{knowledge_base → src}/chunking/__pycache__/__init__.cpython-38.pyc +0 -0
  437. /package/{knowledge_base → src}/chunking/__pycache__/chunker.cpython-37.pyc +0 -0
  438. /package/{knowledge_base → src}/chunking/__pycache__/chunker.cpython-38.pyc +0 -0
  439. /package/{knowledge_base → src}/chunking/__pycache__/validators.cpython-37.pyc +0 -0
  440. /package/{knowledge_base → src}/chunking/__pycache__/validators.cpython-38.pyc +0 -0
  441. /package/{knowledge_base → src}/chunking/validators.py +0 -0
  442. /package/{knowledge_base → src}/cli/__init__.py +0 -0
  443. /package/{knowledge_base → src}/cli/__pycache__/__init__.cpython-37.pyc +0 -0
  444. /package/{knowledge_base → src}/cli/__pycache__/__init__.cpython-38.pyc +0 -0
  445. /package/{knowledge_base → src}/cli/__pycache__/feedback_cli.cpython-37.pyc +0 -0
  446. /package/{knowledge_base → src}/cli/__pycache__/feedback_cli.cpython-38.pyc +0 -0
  447. /package/{knowledge_base → src}/cli/__pycache__/generate.cpython-37.pyc +0 -0
  448. /package/{knowledge_base → src}/cli/__pycache__/generate.cpython-38.pyc +0 -0
  449. /package/{knowledge_base → src}/cli/__pycache__/generate_qcapps134.cpython-37.pyc +0 -0
  450. /package/{knowledge_base → src}/config/__pycache__/__init__.cpython-37.pyc +0 -0
  451. /package/{knowledge_base → src}/config/__pycache__/__init__.cpython-38.pyc +0 -0
  452. /package/{knowledge_base → src}/config/__pycache__/settings.cpython-37.pyc +0 -0
  453. /package/{knowledge_base → src}/config/__pycache__/settings.cpython-38.pyc +0 -0
  454. /package/{knowledge_base → src}/connectors/__pycache__/__init__.cpython-37.pyc +0 -0
  455. /package/{knowledge_base → src}/connectors/__pycache__/__init__.cpython-38.pyc +0 -0
  456. /package/{knowledge_base → src}/connectors/__pycache__/base.cpython-37.pyc +0 -0
  457. /package/{knowledge_base → src}/connectors/__pycache__/base.cpython-38.pyc +0 -0
  458. /package/{knowledge_base → src}/connectors/__pycache__/bitbucket_connector.cpython-37.pyc +0 -0
  459. /package/{knowledge_base → src}/connectors/__pycache__/bitbucket_connector.cpython-38.pyc +0 -0
  460. /package/{knowledge_base → src}/connectors/__pycache__/community_connector.cpython-38.pyc +0 -0
  461. /package/{knowledge_base → src}/connectors/__pycache__/confluence_connector.cpython-37.pyc +0 -0
  462. /package/{knowledge_base → src}/connectors/__pycache__/confluence_connector.cpython-38.pyc +0 -0
  463. /package/{knowledge_base → src}/connectors/__pycache__/jira_connector.cpython-37.pyc +0 -0
  464. /package/{knowledge_base → src}/connectors/__pycache__/jira_connector.cpython-38.pyc +0 -0
  465. /package/{knowledge_base → src}/connectors/__pycache__/kb_igel_connector.cpython-38.pyc +0 -0
  466. /package/{knowledge_base → src}/connectors/__pycache__/playwright_fetcher.cpython-38.pyc +0 -0
  467. /package/{knowledge_base → src}/connectors/__pycache__/query_bridge.cpython-38.pyc +0 -0
  468. /package/{knowledge_base → src}/connectors/__pycache__/search_backends.cpython-38.pyc +0 -0
  469. /package/{knowledge_base → src}/connectors/__pycache__/serviceNow_connector.cpython-37.pyc +0 -0
  470. /package/{knowledge_base → src}/connectors/__pycache__/serviceNow_connector.cpython-38.pyc +0 -0
  471. /package/{knowledge_base → src}/connectors/__pycache__/sync_scheduler.cpython-37.pyc +0 -0
  472. /package/{knowledge_base → src}/connectors/__pycache__/sync_scheduler.cpython-38.pyc +0 -0
  473. /package/{knowledge_base → src}/connectors/__pycache__/teamcity_connector.cpython-37.pyc +0 -0
  474. /package/{knowledge_base → src}/connectors/__pycache__/teamcity_connector.cpython-38.pyc +0 -0
  475. /package/{knowledge_base → src}/connectors/__pycache__/testRail_connector.cpython-37.pyc +0 -0
  476. /package/{knowledge_base → src}/connectors/__pycache__/testRail_connector.cpython-38.pyc +0 -0
  477. /package/{knowledge_base → src}/connectors/__pycache__/web_fetcher.cpython-38.pyc +0 -0
  478. /package/{knowledge_base → src}/connectors/base.py +0 -0
  479. /package/{knowledge_base → src}/connectors/playwright_fetcher.py +0 -0
  480. /package/{knowledge_base → src}/core/__pycache__/__init__.cpython-37.pyc +0 -0
  481. /package/{knowledge_base → src}/core/__pycache__/__init__.cpython-38.pyc +0 -0
  482. /package/{knowledge_base → src}/core/__pycache__/cache.cpython-38.pyc +0 -0
  483. /package/{knowledge_base → src}/core/__pycache__/circuit_breaker.cpython-38.pyc +0 -0
  484. /package/{knowledge_base → src}/core/__pycache__/confidence.cpython-37.pyc +0 -0
  485. /package/{knowledge_base → src}/core/__pycache__/confidence.cpython-38.pyc +0 -0
  486. /package/{knowledge_base → src}/core/__pycache__/logging_setup.cpython-38.pyc +0 -0
  487. /package/{knowledge_base → src}/core/__pycache__/metrics.cpython-38.pyc +0 -0
  488. /package/{knowledge_base → src}/core/__pycache__/precedence.cpython-37.pyc +0 -0
  489. /package/{knowledge_base → src}/core/__pycache__/precedence.cpython-38.pyc +0 -0
  490. /package/{knowledge_base → src}/core/__pycache__/request_context.cpython-38.pyc +0 -0
  491. /package/{knowledge_base → src}/core/circuit_breaker.py +0 -0
  492. /package/{knowledge_base → src}/core/metrics.py +0 -0
  493. /package/{knowledge_base → src}/core/precedence.py +0 -0
  494. /package/{knowledge_base → src}/core/request_context.py +0 -0
  495. /package/{knowledge_base → src}/db/__init__.py +0 -0
  496. /package/{knowledge_base → src}/db/__pycache__/__init__.cpython-37.pyc +0 -0
  497. /package/{knowledge_base → src}/db/__pycache__/__init__.cpython-38.pyc +0 -0
  498. /package/{knowledge_base → src}/db/__pycache__/client.cpython-37.pyc +0 -0
  499. /package/{knowledge_base → src}/db/__pycache__/client.cpython-38.pyc +0 -0
  500. /package/{knowledge_base → src}/db/__pycache__/connector_sync.cpython-38.pyc +0 -0
  501. /package/{knowledge_base → src}/db/__pycache__/feedback_schema.cpython-37.pyc +0 -0
  502. /package/{knowledge_base → src}/db/__pycache__/feedback_schema.cpython-38.pyc +0 -0
  503. /package/{knowledge_base → src}/db/__pycache__/kg_introspect.cpython-37.pyc +0 -0
  504. /package/{knowledge_base → src}/db/__pycache__/kg_introspect.cpython-38.pyc +0 -0
  505. /package/{knowledge_base → src}/db/__pycache__/schema.cpython-37.pyc +0 -0
  506. /package/{knowledge_base → src}/db/__pycache__/schema.cpython-38.pyc +0 -0
  507. /package/{knowledge_base → src}/embeddings/__init__.py +0 -0
  508. /package/{knowledge_base → src}/embeddings/__pycache__/__init__.cpython-37.pyc +0 -0
  509. /package/{knowledge_base → src}/embeddings/__pycache__/__init__.cpython-38.pyc +0 -0
  510. /package/{knowledge_base → src}/embeddings/__pycache__/azure_embedder.cpython-37.pyc +0 -0
  511. /package/{knowledge_base → src}/embeddings/__pycache__/azure_embedder.cpython-38.pyc +0 -0
  512. /package/{knowledge_base → src}/eval/__pycache__/__init__.cpython-37.pyc +0 -0
  513. /package/{knowledge_base → src}/eval/__pycache__/__init__.cpython-38.pyc +0 -0
  514. /package/{knowledge_base → src}/eval/__pycache__/__main__.cpython-37.pyc +0 -0
  515. /package/{knowledge_base → src}/eval/__pycache__/baseline.cpython-37.pyc +0 -0
  516. /package/{knowledge_base → src}/eval/__pycache__/baseline.cpython-38.pyc +0 -0
  517. /package/{knowledge_base → src}/eval/__pycache__/harness.cpython-37.pyc +0 -0
  518. /package/{knowledge_base → src}/eval/__pycache__/harness.cpython-38.pyc +0 -0
  519. /package/{knowledge_base → src}/eval/__pycache__/scorers.cpython-37.pyc +0 -0
  520. /package/{knowledge_base → src}/eval/__pycache__/scorers.cpython-38.pyc +0 -0
  521. /package/{knowledge_base → src}/eval/baseline.py +0 -0
  522. /package/{knowledge_base → src}/eval/queries_50.json +0 -0
  523. /package/{knowledge_base → src}/eval/scorers.py +0 -0
  524. /package/{knowledge_base → src}/exemplars/README.md +0 -0
  525. /package/{knowledge_base → src}/exemplars/__pycache__/pytest_reference_snippet.cpython-37.pyc +0 -0
  526. /package/{knowledge_base → src}/exemplars/gold_manual_concise_snippet.md +0 -0
  527. /package/{knowledge_base → src}/exemplars/gold_manual_detailed_snippet.md +0 -0
  528. /package/{knowledge_base → src}/exemplars/pytest_reference_snippet.py +0 -0
  529. /package/{knowledge_base → src}/feedback/__pycache__/__init__.cpython-37.pyc +0 -0
  530. /package/{knowledge_base → src}/feedback/__pycache__/__init__.cpython-38.pyc +0 -0
  531. /package/{knowledge_base → src}/feedback/__pycache__/analytics.cpython-37.pyc +0 -0
  532. /package/{knowledge_base → src}/feedback/__pycache__/analytics.cpython-38.pyc +0 -0
  533. /package/{knowledge_base → src}/feedback/__pycache__/applier.cpython-37.pyc +0 -0
  534. /package/{knowledge_base → src}/feedback/__pycache__/applier.cpython-38.pyc +0 -0
  535. /package/{knowledge_base → src}/feedback/__pycache__/curator.cpython-37.pyc +0 -0
  536. /package/{knowledge_base → src}/feedback/__pycache__/curator.cpython-38.pyc +0 -0
  537. /package/{knowledge_base → src}/feedback/__pycache__/handler.cpython-37.pyc +0 -0
  538. /package/{knowledge_base → src}/feedback/__pycache__/handler.cpython-38.pyc +0 -0
  539. /package/{knowledge_base → src}/generation/__init__.py +0 -0
  540. /package/{knowledge_base → src}/generation/__pycache__/__init__.cpython-37.pyc +0 -0
  541. /package/{knowledge_base → src}/generation/__pycache__/__init__.cpython-38.pyc +0 -0
  542. /package/{knowledge_base → src}/generation/__pycache__/input_classifier.cpython-37.pyc +0 -0
  543. /package/{knowledge_base → src}/generation/__pycache__/input_classifier.cpython-38.pyc +0 -0
  544. /package/{knowledge_base → src}/generation/__pycache__/manual_tc_parser.cpython-37.pyc +0 -0
  545. /package/{knowledge_base → src}/generation/__pycache__/manual_tc_parser.cpython-38.pyc +0 -0
  546. /package/{knowledge_base → src}/generation/__pycache__/prompts.cpython-37.pyc +0 -0
  547. /package/{knowledge_base → src}/generation/__pycache__/prompts.cpython-38.pyc +0 -0
  548. /package/{knowledge_base → src}/generation/__pycache__/tc_transformer.cpython-37.pyc +0 -0
  549. /package/{knowledge_base → src}/generation/__pycache__/test_generator.cpython-37.pyc +0 -0
  550. /package/{knowledge_base → src}/generation/__pycache__/test_generator.cpython-38.pyc +0 -0
  551. /package/{knowledge_base → src}/generation/manual_tc_parser.py +0 -0
  552. /package/{knowledge_base → src}/graph_db/__pycache__/__init__.cpython-37.pyc +0 -0
  553. /package/{knowledge_base → src}/graph_db/__pycache__/__init__.cpython-38.pyc +0 -0
  554. /package/{knowledge_base → src}/graph_db/__pycache__/graphiti_client.cpython-37.pyc +0 -0
  555. /package/{knowledge_base → src}/graph_db/__pycache__/kg_traversal.cpython-37.pyc +0 -0
  556. /package/{knowledge_base → src}/graph_db/__pycache__/migrate_kg.cpython-37.pyc +0 -0
  557. /package/{knowledge_base → src}/graph_db/__pycache__/neo4j_client.cpython-37.pyc +0 -0
  558. /package/{knowledge_base → src}/graph_db/__pycache__/neo4j_client.cpython-38.pyc +0 -0
  559. /package/{knowledge_base → src}/graph_db/__pycache__/schema.cpython-37.pyc +0 -0
  560. /package/{knowledge_base → src}/graph_db/__pycache__/temporal_ingest.cpython-37.pyc +0 -0
  561. /package/{knowledge_base → src}/graph_db/schema.py +0 -0
  562. /package/{knowledge_base → src}/ingestion/__init__.py +0 -0
  563. /package/{knowledge_base → src}/ingestion/__pycache__/__init__.cpython-37.pyc +0 -0
  564. /package/{knowledge_base → src}/ingestion/__pycache__/__init__.cpython-38.pyc +0 -0
  565. /package/{knowledge_base → src}/ingestion/__pycache__/ingest.cpython-37.pyc +0 -0
  566. /package/{knowledge_base → src}/ingestion/__pycache__/ingest.cpython-38.pyc +0 -0
  567. /package/{knowledge_base → src}/ingestion/__pycache__/ingest_images.cpython-37.pyc +0 -0
  568. /package/{knowledge_base → src}/ingestion/__pycache__/ingest_images.cpython-38.pyc +0 -0
  569. /package/{knowledge_base → src}/ingestion/__pycache__/kg_extractor.cpython-37.pyc +0 -0
  570. /package/{knowledge_base → src}/ingestion/__pycache__/kg_extractor.cpython-38.pyc +0 -0
  571. /package/{knowledge_base → src}/ingestion/__pycache__/web_ingest.cpython-38.pyc +0 -0
  572. /package/{knowledge_base → src}/intelligence/__init__.py +0 -0
  573. /package/{knowledge_base → src}/intelligence/__pycache__/__init__.cpython-37.pyc +0 -0
  574. /package/{knowledge_base → src}/intelligence/__pycache__/execution_ingest.cpython-37.pyc +0 -0
  575. /package/{knowledge_base → src}/intelligence/__pycache__/predictive_engine.cpython-37.pyc +0 -0
  576. /package/{knowledge_base → src}/intelligence/__pycache__/risk_scorer.cpython-37.pyc +0 -0
  577. /package/{knowledge_base → src}/intelligence/predictive_engine.py +0 -0
  578. /package/{knowledge_base → src}/intelligence/risk_scorer.py +0 -0
  579. /package/{knowledge_base → src}/memory/__pycache__/__init__.cpython-37.pyc +0 -0
  580. /package/{knowledge_base → src}/memory/__pycache__/__init__.cpython-38.pyc +0 -0
  581. /package/{knowledge_base → src}/memory/__pycache__/cognee_client.cpython-37.pyc +0 -0
  582. /package/{knowledge_base → src}/memory/__pycache__/cognee_client.cpython-38.pyc +0 -0
  583. /package/{knowledge_base → src}/memory/__pycache__/ingest_memory.cpython-37.pyc +0 -0
  584. /package/{knowledge_base → src}/memory/__pycache__/memory_types.cpython-37.pyc +0 -0
  585. /package/{knowledge_base → src}/memory/__pycache__/memory_types.cpython-38.pyc +0 -0
  586. /package/{knowledge_base → src}/memory/memory_types.py +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-37.pyc +0 -0
  606. /package/{knowledge_base → src}/retrieval/__pycache__/__init__.cpython-38.pyc +0 -0
  607. /package/{knowledge_base → src}/retrieval/__pycache__/context_fusion.cpython-37.pyc +0 -0
  608. /package/{knowledge_base → src}/retrieval/__pycache__/context_fusion.cpython-38.pyc +0 -0
  609. /package/{knowledge_base → src}/retrieval/__pycache__/knowledge_graph.cpython-37.pyc +0 -0
  610. /package/{knowledge_base → src}/retrieval/__pycache__/knowledge_graph.cpython-38.pyc +0 -0
  611. /package/{knowledge_base → src}/retrieval/__pycache__/reranker.cpython-37.pyc +0 -0
  612. /package/{knowledge_base → src}/retrieval/__pycache__/reranker.cpython-38.pyc +0 -0
  613. /package/{knowledge_base → src}/retrieval/__pycache__/retrieval_debug.cpython-37.pyc +0 -0
  614. /package/{knowledge_base → src}/retrieval/__pycache__/retrieval_debug.cpython-38.pyc +0 -0
  615. /package/{knowledge_base → src}/retrieval/__pycache__/retriever.cpython-37.pyc +0 -0
  616. /package/{knowledge_base → src}/retrieval/__pycache__/retriever.cpython-38.pyc +0 -0
  617. /package/{knowledge_base → src}/retrieval/__pycache__/unified_query.cpython-38.pyc +0 -0
  618. /package/{knowledge_base → src}/retrieval/__pycache__/web_retriever.cpython-38.pyc +0 -0
  619. /package/{knowledge_base → src}/retrieval/retrieval_debug.py +0 -0
  620. /package/{knowledge_base → src}/validators/__init__.py +0 -0
  621. /package/{knowledge_base → src}/validators/__pycache__/__init__.cpython-314.pyc +0 -0
  622. /package/{knowledge_base → src}/validators/__pycache__/__init__.cpython-37.pyc +0 -0
  623. /package/{knowledge_base → src}/validators/__pycache__/step_fidelity.cpython-314.pyc +0 -0
  624. /package/{knowledge_base → src}/validators/__pycache__/step_fidelity.cpython-37.pyc +0 -0
  625. /package/{knowledge_base → src}/vision/__pycache__/__init__.cpython-37.pyc +0 -0
  626. /package/{knowledge_base → src}/vision/__pycache__/__init__.cpython-38.pyc +0 -0
  627. /package/{knowledge_base → src}/vision/__pycache__/image_describer.cpython-37.pyc +0 -0
  628. /package/{knowledge_base → src}/vision/__pycache__/image_describer.cpython-38.pyc +0 -0
@@ -2,89 +2,132 @@ import * as fs from 'fs';
2
2
  import * as path from 'path';
3
3
  import * as os from 'os';
4
4
  import chalk from 'chalk';
5
+ import { fileURLToPath } from 'url';
6
+ // ── Helpers ────────────────────────────────────────────────────────────────
7
+ /** Detect the user-level settings.json for the running VS Code variant. */
8
+ function detectVscodeSettingsPath() {
9
+ const home = os.homedir();
10
+ if (process.platform === 'win32') {
11
+ // Windows native install
12
+ return path.join(home, 'AppData', 'Roaming', 'Code', 'User', 'settings.json');
13
+ }
14
+ // Linux / macOS – try VS Code Server (remote-SSH / code-server) first
15
+ const vscodeServerUserSettings = path.join(home, '.vscode-server', 'data', 'User', 'settings.json');
16
+ if (fs.existsSync(path.dirname(vscodeServerUserSettings)) || process.env.VSCODE_SERVER_DATA_DIR) {
17
+ return vscodeServerUserSettings;
18
+ }
19
+ // Standard desktop VS Code on Linux
20
+ const xdgConfig = process.env.XDG_CONFIG_HOME || path.join(home, '.config');
21
+ return path.join(xdgConfig, 'Code', 'User', 'settings.json');
22
+ }
23
+ /** Read JSON safely; return defaultValue on any error. */
24
+ function readJson(filePath, defaultValue = {}) {
25
+ if (!fs.existsSync(filePath))
26
+ return defaultValue;
27
+ try {
28
+ return JSON.parse(fs.readFileSync(filePath, 'utf8'));
29
+ }
30
+ catch {
31
+ return defaultValue;
32
+ }
33
+ }
34
+ /** Write JSON and ensure the parent directory exists. */
35
+ function writeJson(filePath, data) {
36
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
37
+ fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\n');
38
+ }
39
+ // ── Main export ────────────────────────────────────────────────────────────
5
40
  export async function setupPlatform(platform) {
6
- const homeDir = os.homedir();
7
- // The command we want to inject
41
+ const currentDir = path.dirname(fileURLToPath(import.meta.url));
42
+ const serverJsPath = path.resolve(currentDir, '..', 'mcp', 'server.js');
43
+ const nodeExecutable = process.execPath || 'node';
44
+ // Standard MCP server entry used by most tools
8
45
  const mcpServerConfig = {
9
- command: process.platform === 'win32' ? 'igel-qe-mcp.cmd' : 'igel-qe-mcp',
10
- args: []
46
+ command: nodeExecutable,
47
+ args: [serverJsPath],
48
+ };
49
+ // For tools that expect { type, command, args } (e.g. VS Code .vscode/mcp.json)
50
+ const vscMcpServerConfig = {
51
+ type: 'stdio',
52
+ command: nodeExecutable,
53
+ args: [serverJsPath],
11
54
  };
12
55
  try {
13
- if (platform === 'copilot') {
14
- // Setup for GitHub Copilot in VS Code
15
- // VS Code user settings on Windows usually live in AppData/Roaming/Code/User
16
- let vscodeSettingsPath = path.join(homeDir, 'AppData', 'Roaming', 'Code', 'User', 'settings.json');
17
- if (process.platform !== 'win32') {
18
- vscodeSettingsPath = path.join(homeDir, '.config', 'Code', 'User', 'settings.json');
19
- }
20
- let settings = {};
21
- if (fs.existsSync(vscodeSettingsPath)) {
22
- const raw = fs.readFileSync(vscodeSettingsPath, 'utf8');
23
- try {
24
- settings = JSON.parse(raw);
56
+ switch (platform) {
57
+ case 'copilot': {
58
+ const settingsPath = detectVscodeSettingsPath();
59
+ // 1. VS Code global user mcp.json (Standard for VS Code Copilot MCP)
60
+ const globalMcpPath = path.join(path.dirname(settingsPath), 'mcp.json');
61
+ const globalMcp = readJson(globalMcpPath, {});
62
+ if (!globalMcp.mcpServers)
63
+ globalMcp.mcpServers = {};
64
+ if (!globalMcp.servers)
65
+ globalMcp.servers = {};
66
+ globalMcp.mcpServers['igel-qe'] = mcpServerConfig;
67
+ globalMcp.servers['igel-qe'] = mcpServerConfig;
68
+ writeJson(globalMcpPath, globalMcp);
69
+ console.log(chalk.green(`✓ GitHub Copilot MCP (Global) → ${globalMcpPath}`));
70
+ // 2. Workspace .vscode/mcp.json (works in any VS Code ≥ 1.99)
71
+ const workspaceMcpPath = path.join(process.cwd(), '.vscode', 'mcp.json');
72
+ const workspaceMcp = readJson(workspaceMcpPath, {});
73
+ if (!workspaceMcp.mcpServers)
74
+ workspaceMcp.mcpServers = {};
75
+ if (!workspaceMcp.servers)
76
+ workspaceMcp.servers = {};
77
+ workspaceMcp.mcpServers['igel-qe'] = vscMcpServerConfig;
78
+ workspaceMcp.servers['igel-qe'] = vscMcpServerConfig;
79
+ writeJson(workspaceMcpPath, workspaceMcp);
80
+ console.log(chalk.green(`✓ Workspace MCP config → ${workspaceMcpPath}`));
81
+ // 3. Fallback: VS Code user settings.json (Legacy Copilot setting)
82
+ const settings = readJson(settingsPath);
83
+ if (!settings['github.copilot.chat.mcp.servers']) {
84
+ settings['github.copilot.chat.mcp.servers'] = {};
25
85
  }
26
- catch (e) { /* ignore parse error for now */ }
27
- }
28
- else {
29
- fs.mkdirSync(path.dirname(vscodeSettingsPath), { recursive: true });
86
+ settings['github.copilot.chat.mcp.servers']['igel-qe'] = mcpServerConfig;
87
+ writeJson(settingsPath, settings);
88
+ console.log(chalk.green(`✓ GitHub Copilot legacy MCP config → ${settingsPath}`));
89
+ break;
30
90
  }
31
- if (!settings['github.copilot.chat.mcp.servers']) {
32
- settings['github.copilot.chat.mcp.servers'] = {};
91
+ // ── Cline (Claude Dev) ─────────────────────────────────────────
92
+ case 'cline': {
93
+ const home = os.homedir();
94
+ const clineConfigPath = process.platform === 'win32'
95
+ ? path.join(home, 'AppData', 'Roaming', 'Code', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json')
96
+ : path.join(home, '.vscode-server', 'data', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json');
97
+ const settings = readJson(clineConfigPath, { mcpServers: {} });
98
+ if (!settings.mcpServers)
99
+ settings.mcpServers = {};
100
+ settings.mcpServers['igel-qe'] = mcpServerConfig;
101
+ writeJson(clineConfigPath, settings);
102
+ console.log(chalk.green(`✓ Cline MCP → ${clineConfigPath}`));
103
+ break;
33
104
  }
34
- settings['github.copilot.chat.mcp.servers']['igel-qe'] = mcpServerConfig;
35
- fs.writeFileSync(vscodeSettingsPath, JSON.stringify(settings, null, 2));
36
- console.log(chalk.green(`✓ Successfully configured GitHub Copilot MCP in ${vscodeSettingsPath}`));
37
- }
38
- else if (platform === 'cline') {
39
- // Setup for Cline (Claude Dev)
40
- let clineConfigPath = path.join(homeDir, 'AppData', 'Roaming', 'Code', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json');
41
- if (process.platform !== 'win32') {
42
- clineConfigPath = path.join(homeDir, '.config', 'Code', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json');
43
- }
44
- let settings = { mcpServers: {} };
45
- if (fs.existsSync(clineConfigPath)) {
46
- const raw = fs.readFileSync(clineConfigPath, 'utf8');
47
- try {
48
- settings = JSON.parse(raw);
49
- }
50
- catch (e) { /* ignore parse error */ }
51
- }
52
- else {
53
- fs.mkdirSync(path.dirname(clineConfigPath), { recursive: true });
54
- }
55
- settings.mcpServers['igel-qe'] = mcpServerConfig;
56
- fs.writeFileSync(clineConfigPath, JSON.stringify(settings, null, 2));
57
- console.log(chalk.green(`✓ Successfully configured Cline MCP in ${clineConfigPath}`));
58
- }
59
- else if (platform === 'antigravity') {
60
- // Setup for Antigravity (Gemini Code Assist / AI)
61
- let vscodeSettingsPath = path.join(homeDir, 'AppData', 'Roaming', 'Code', 'User', 'settings.json');
62
- if (process.platform !== 'win32') {
63
- vscodeSettingsPath = path.join(homeDir, '.config', 'Code', 'User', 'settings.json');
64
- }
65
- let settings = {};
66
- if (fs.existsSync(vscodeSettingsPath)) {
67
- const raw = fs.readFileSync(vscodeSettingsPath, 'utf8');
68
- try {
69
- settings = JSON.parse(raw);
105
+ // ── Antigravity (Gemini Code Assist in VS Code) ────────────────
106
+ case 'antigravity': {
107
+ // 1. VS Code user settings (gemini.mcp.servers key)
108
+ const settingsPath = detectVscodeSettingsPath();
109
+ const settings = readJson(settingsPath);
110
+ if (!settings['gemini.mcp.servers']) {
111
+ settings['gemini.mcp.servers'] = {};
70
112
  }
71
- catch (e) { /* ignore */ }
72
- }
73
- else {
74
- fs.mkdirSync(path.dirname(vscodeSettingsPath), { recursive: true });
113
+ settings['gemini.mcp.servers']['igel-qe'] = mcpServerConfig;
114
+ writeJson(settingsPath, settings);
115
+ console.log(chalk.green(`✓ Antigravity MCP (settings.json) → ${settingsPath}`));
116
+ // 2. Workspace .mcp.json (the format Antigravity reads from the project root)
117
+ const workspaceMcpPath = path.join(process.cwd(), '.mcp.json');
118
+ const workspaceMcp = readJson(workspaceMcpPath, { mcpServers: {} });
119
+ if (!workspaceMcp.mcpServers)
120
+ workspaceMcp.mcpServers = {};
121
+ workspaceMcp.mcpServers['igel-qe'] = mcpServerConfig;
122
+ writeJson(workspaceMcpPath, workspaceMcp);
123
+ console.log(chalk.green(`✓ Antigravity workspace MCP (.mcp.json) → ${workspaceMcpPath}`));
124
+ break;
75
125
  }
76
- if (!settings['gemini.mcp.servers']) {
77
- settings['gemini.mcp.servers'] = {};
78
- }
79
- settings['gemini.mcp.servers']['igel-qe'] = mcpServerConfig;
80
- fs.writeFileSync(vscodeSettingsPath, JSON.stringify(settings, null, 2));
81
- console.log(chalk.green(`✓ Successfully configured Antigravity MCP in ${vscodeSettingsPath}`));
82
- }
83
- else {
84
- console.log(chalk.yellow(`Platform '${platform}' is not currently supported for auto-setup.`));
126
+ default:
127
+ console.log(chalk.yellow(`Platform '${platform}' is not currently supported. Supported: copilot, cline, antigravity.`));
85
128
  }
86
129
  }
87
130
  catch (err) {
88
- console.error(chalk.red(`Failed to setup ${platform}: ${err.message}`));
131
+ console.error(chalk.red(`✗ Failed to setup ${platform}: ${err.message}`));
89
132
  }
90
133
  }
@@ -1,10 +1,30 @@
1
+ #!/usr/bin/env node
2
+ /// <reference types="node" />
1
3
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
4
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
5
  import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
4
6
  import { spawn } from "child_process";
5
7
  import path from "path";
6
8
  import { fileURLToPath } from "url";
9
+ import fs from "fs";
7
10
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
11
+ // Project root: dist/mcp/server.js -> ../../ = project root
12
+ const PROJECT_ROOT = path.resolve(__dirname, '..', '..');
13
+ // Resolve the correct Python executable:
14
+ // 1. Check for a local .venv with a Linux bin/ (created by python3 -m venv)
15
+ // 2. Fall back to system python3 / python
16
+ function resolvePythonExecutable() {
17
+ const candidates = [
18
+ path.join(PROJECT_ROOT, '.venv', 'bin', 'python'),
19
+ path.join(PROJECT_ROOT, '.venv', 'bin', 'python3'),
20
+ ];
21
+ for (const c of candidates) {
22
+ if (fs.existsSync(c))
23
+ return c;
24
+ }
25
+ // Check system python3 / python
26
+ return 'python3';
27
+ }
8
28
  const server = new Server({
9
29
  name: "igel-qe-mcp",
10
30
  version: "1.0.0",
@@ -13,19 +33,49 @@ const server = new Server({
13
33
  tools: {}
14
34
  }
15
35
  });
36
+ // Map MCP tool names to workflow_cli action names
37
+ const TOOL_TO_ACTION = {
38
+ plan_test_cases: 'plan_test_cases',
39
+ generate_test_cases: 'generate_test_cases',
40
+ plan_automation: 'plan_automation',
41
+ generate_automation: 'generate_automation',
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',
49
+ impact_analysis: 'impact_analysis',
50
+ submit_feedback: 'submit_feedback',
51
+ init_project: 'init_project',
52
+ sync_push_event: 'sync_push_event',
53
+ get_project_status: 'get_project_status',
54
+ };
16
55
  async function callPythonEngine(workflowName, args) {
17
- return new Promise((resolve, reject) => {
18
- // Run the Python CLI in the project root
19
- // We assume the environment is set up and `python` refers to the venv
20
- const projectRoot = path.join(__dirname, '..', '..', '..');
21
- const pythonProcess = spawn("python", [
22
- "-m", "knowledge_base.cli.workflow_cli",
23
- "--action", workflowName,
56
+ return new Promise((resolve, _reject) => {
57
+ const action = TOOL_TO_ACTION[workflowName];
58
+ if (!action) {
59
+ resolve(JSON.stringify({ status: 'error', message: `Unknown tool: ${workflowName}` }));
60
+ return;
61
+ }
62
+ const pythonExe = resolvePythonExecutable();
63
+ const pythonProcess = spawn(pythonExe, [
64
+ "-m", "src.cli.workflow_cli",
65
+ "--action", action,
24
66
  "--args", JSON.stringify(args)
25
67
  ], {
26
- cwd: projectRoot,
27
- env: process.env // Inherit the environment (.env vars)
68
+ cwd: PROJECT_ROOT,
69
+ env: { ...process.env, PYTHONPATH: PROJECT_ROOT }
28
70
  });
71
+ // Add 5-minute timeout
72
+ const timeout = setTimeout(() => {
73
+ pythonProcess.kill();
74
+ resolve(JSON.stringify({
75
+ status: "error",
76
+ message: "Timeout: Python process took longer than 5 minutes."
77
+ }));
78
+ }, 5 * 60 * 1000);
29
79
  let stdoutData = "";
30
80
  let stderrData = "";
31
81
  pythonProcess.stdout.on("data", (data) => {
@@ -36,6 +86,7 @@ async function callPythonEngine(workflowName, args) {
36
86
  console.error(`Python stderr: ${data}`); // MCP servers use stderr for logging
37
87
  });
38
88
  pythonProcess.on("close", (code) => {
89
+ clearTimeout(timeout);
39
90
  if (code !== 0) {
40
91
  // If it crashed entirely, return the stderr as a JSON error
41
92
  resolve(JSON.stringify({
@@ -46,46 +97,210 @@ async function callPythonEngine(workflowName, args) {
46
97
  }
47
98
  else {
48
99
  // Return the exact JSON stdout printed by workflow_cli.py
49
- resolve(stdoutData.trim());
100
+ const output = stdoutData.trim();
101
+ resolve(output || JSON.stringify({ status: "error", message: "Empty output from Python engine" }));
50
102
  }
51
103
  });
52
104
  });
53
105
  }
54
106
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
55
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
+ },
56
121
  {
57
122
  name: "generate_test_cases",
58
- 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.",
124
+ inputSchema: {
125
+ type: "object",
126
+ properties: {
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.",
59
137
  inputSchema: {
60
138
  type: "object",
61
139
  properties: {
62
- jira_key: { type: "string", description: "The Jira issue key (e.g., IGEL-1234)" }
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." }
63
143
  },
64
144
  required: ["jira_key"]
65
145
  }
66
146
  },
67
147
  {
68
148
  name: "generate_automation",
69
- 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.",
70
150
  inputSchema: {
71
151
  type: "object",
72
152
  properties: {
73
- 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." }
74
156
  },
75
157
  required: ["jira_key"]
76
158
  }
77
159
  },
78
160
  {
79
161
  name: "sync_bitbucket",
80
- 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.",
81
163
  inputSchema: {
82
164
  type: "object",
83
165
  properties: {
84
- 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)." }
85
167
  },
86
168
  required: ["commit_hash"]
87
169
  }
88
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
+ },
89
304
  {
90
305
  name: "impact_analysis",
91
306
  description: "Analyze the regression impact of changed code assets on existing test requirements and scripts.",
@@ -119,8 +334,34 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
119
334
  }));
120
335
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
121
336
  const result = await callPythonEngine(request.params.name, request.params.arguments);
337
+ // Format JSON result into nice markdown for the IDE
338
+ let formattedResult = result;
339
+ try {
340
+ const parsed = JSON.parse(result);
341
+ if (parsed.status === 'success') {
342
+ formattedResult = `✅ **Success**\n\n`;
343
+ for (const [k, v] of Object.entries(parsed)) {
344
+ if (k !== 'status') {
345
+ if (typeof v === 'object') {
346
+ formattedResult += `**${k}**:\n\`\`\`json\n${JSON.stringify(v, null, 2)}\n\`\`\`\n\n`;
347
+ }
348
+ else {
349
+ formattedResult += `**${k}**: ${v}\n`;
350
+ }
351
+ }
352
+ }
353
+ }
354
+ else {
355
+ formattedResult = `❌ **Error**\n\n${parsed.message || 'Unknown error'}\n`;
356
+ if (parsed.stderr)
357
+ formattedResult += `\n\`\`\`\n${parsed.stderr}\n\`\`\``;
358
+ }
359
+ }
360
+ catch (e) {
361
+ // If it's not JSON, just return it directly (fallback)
362
+ }
122
363
  return {
123
- content: [{ type: "text", text: result }]
364
+ content: [{ type: "text", text: formattedResult }]
124
365
  };
125
366
  });
126
367
  async function main() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "igel-qe-core",
3
- "version": "1.0.3",
3
+ "version": "1.0.7",
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
  }
@@ -0,0 +1,3 @@
1
+ """Agent orchestration package for IGEL QE."""
2
+
3
+ __all__ = []