From 46e0bd40d0cdbd378004f24a25134b189cf70bf8 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 20 Jan 2026 12:21:44 +0530 Subject: [PATCH 1/5] feat: implement pytest suite and github actions CI (#19) --- .github/workflows/run-tests.yml | 30 +++++ .../__pycache__/repo_cloner.cpython-313.pyc | Bin 0 -> 3770 bytes Repo Clone Automation/repo_cloner.py | 117 ++++++++++-------- .../__pycache__/pii_remocval.cpython-313.pyc | Bin 0 -> 3272 bytes .../__pycache__/summarizer.cpython-313.pyc | Bin 0 -> 9290 bytes Slack_scraper_bot/scripts/pii_remocval.py | 6 +- tests/__init__.py | 0 tests/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 141 bytes ...t_pii_removal.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 5475 bytes ...t_repo_cloner.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 3297 bytes ...st_summarizer.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 5155 bytes tests/requirements.txt | 8 ++ tests/test_pii_removal.py | 36 ++++++ tests/test_repo_cloner.py | 38 ++++++ tests/test_summarizer.py | 51 ++++++++ 15 files changed, 228 insertions(+), 58 deletions(-) create mode 100644 .github/workflows/run-tests.yml create mode 100644 Repo Clone Automation/__pycache__/repo_cloner.cpython-313.pyc create mode 100644 Slack_scraper_bot/scripts/__pycache__/pii_remocval.cpython-313.pyc create mode 100644 Slack_scraper_bot/scripts/__pycache__/summarizer.cpython-313.pyc create mode 100644 tests/__init__.py create mode 100644 tests/__pycache__/__init__.cpython-313.pyc create mode 100644 tests/__pycache__/test_pii_removal.cpython-313-pytest-9.0.2.pyc create mode 100644 tests/__pycache__/test_repo_cloner.cpython-313-pytest-9.0.2.pyc create mode 100644 tests/__pycache__/test_summarizer.cpython-313-pytest-9.0.2.pyc create mode 100644 tests/requirements.txt create mode 100644 tests/test_pii_removal.py create mode 100644 tests/test_repo_cloner.py create mode 100644 tests/test_summarizer.py diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml new file mode 100644 index 00000000..be22b9da --- /dev/null +++ b/.github/workflows/run-tests.yml @@ -0,0 +1,30 @@ +name: Run Python Tests + +on: [push, pull_request] + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.9"] + + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r tests/requirements.txt + # Install other requirements files if they exist + if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + if [ -f community-chatbot/requirements.txt ]; then pip install -r community-chatbot/requirements.txt; fi + if [ -f slack_pipeline/requirements.txt ]; then pip install -r slack_pipeline/requirements.txt; fi + if [ -f Voice-Driven_banking-Lam/Backend/requirements.txt ]; then pip install -r Voice-Driven_banking-Lam/Backend/requirements.txt; fi + python -m spacy download en_core_web_lg + - name: Run tests + run: | + pytest tests/ diff --git a/Repo Clone Automation/__pycache__/repo_cloner.cpython-313.pyc b/Repo Clone Automation/__pycache__/repo_cloner.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..794d9c341bf1e8c81c53c599ca4a8f867cd17484 GIT binary patch literal 3770 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 vJCnOHdorEl9jpN}HOXPNgu#PGwS literal 0 HcmV?d00001 diff --git a/Slack_scraper_bot/scripts/__pycache__/summarizer.cpython-313.pyc b/Slack_scraper_bot/scripts/__pycache__/summarizer.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..908e0f604bc3a46d455f947749fcef566d5981b1 GIT binary patch literal 9290 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 literal 0 HcmV?d00001 diff --git a/Slack_scraper_bot/scripts/pii_remocval.py b/Slack_scraper_bot/scripts/pii_remocval.py index ce0083e4..3b114251 100644 --- a/Slack_scraper_bot/scripts/pii_remocval.py +++ b/Slack_scraper_bot/scripts/pii_remocval.py @@ -1,9 +1,9 @@ -import scrubadub -import scrubadub_spacy import re import sys def create_scrubber(): + import scrubadub + import scrubadub_spacy scrubber = scrubadub.Scrubber() spacy_detector = scrubadub_spacy.detectors.SpacyEntityDetector(model='en_core_web_lg') scrubber.add_detector(spacy_detector) @@ -19,7 +19,7 @@ def remove_user_tags(text): return re.sub(timestamp_user_pattern, lambda m: m.group(0).split('] User:')[0] + ']', text) def remove_name_lines(text): - name_pattern = r'^.*(?:my name is|I am|I\'m)\s+(?:{{NAME}}|[A-Z][a-z]+(?:\s+[A-Z][a-z]+)*).*$\n?' + name_pattern = r'^.*(?:my name is|I am|I\'m).*\n' return re.sub(name_pattern, '', text, flags=re.MULTILINE | re.IGNORECASE) def process_file(input_path, output_path): diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/__pycache__/__init__.cpython-313.pyc b/tests/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d31c1c344cbdff69b67c3ef8c3c398c3a5d0fd4 GIT binary patch literal 141 zcmey&%ge<81eZnfGePuY5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~i3vsH|Hu)lMR zZ)RG4aZGZ4Zf+%OniJMP#`{Dub}c4hfQvNN@-52T@fo#Gsy5_ P5aS~=BO_xGGmr%UAjcp> literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_pii_removal.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_pii_removal.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a407ea185e2abc804d373aa28457a078bf69d75a GIT binary patch literal 5475 zcmeHLO>7&-6`m!R|Dr58ktN%$y_THV>za(Hza(-cN2U_Vv?Zb1&~PCYixs()wkCIp z*`*!QHK3qHlVgG+wF(qSawvk_?2~Ur&`WcaOt}))1ze!H^inuc4}nj8Gy6-GsAZtX zF2vb4Z{FX$-TmGh?In|O1lQNcG$j*8=k)B_yK zu{gw8D`6a_D-j%ld*Dhm7sIh!9LG6yf=C3fByt_NBbUU3I#nZN^@3wfxH?hg(?zWQr zfhB)*V98V)$zFGN>}bGRcR0?S?(RSGbP~<~wuB~vCsB#vWB(wk^L)UJ%}J|DVNNUD zFhfeY`;)WTrJ2+Vfx3kaJv?682aS%bWOmPluKosZv1(@n(hoCTVjuKcp#{^W&1o34BJ>;K^_$OmlNS0V;uw~Yw^@g=%`OJ*8%*J$r&76CgBiZrg8DSy2 zJg1a2eHnINsi}%lPf5x$$&OA(v8pJrWvFgaIbE%rJv4Fq%N-`4JK2yPg^IO~{?GjV2<&F&;pTZt49n~792@fr{hCht$e?cQW_I7|4$*{wu&2PElV zlSsbiPA%dQo83+vcbQwQQ;Yu>HoKAYi#Rh--b|daR;cxqkKXTT8v=X7Z^fB`m3xz( z;;?ZoZ<#{#6 zCmU(6DAJCYQ;M=`D5bihu5tuQt?FojOEKMemDaF$rA`+)Mdxzbn#xUUa(q_1MJs7t zt6gkF9X8KA3#*#JDJm4ZBX+IgEDo&+P?gLumi1cM-~*VnT$sE>&pLf|1Ih*_Z_#|C z!|#P>%mB4}*s-gqj!iy>$$N}@$qnSLn{?2Zq zXOkV+xVDuT*kSFzhwQ+Irpke;%p9q^+N9(APKpO)Z^#Zm|# z@E{z3*@f4|wkHKA_6uOVNPyY%(jF4sNS)XyFne0Tz=6vjqiW{{_(E_VW86JlpvOwjF0Rk*u)SMs?>2jS_w494`^q=T z-p#)A&14F2st20I)MgLq8h2Rx?;)G|aLk=q#G@A8mN$b1P~RsFQxMr@yDiT=pT_bntQgSvyDT$e^XP*y!b=7cdhho>IC=l%SAES)?(6C1>7O)TUfgB{aNA@{Ph-T?Go3)(r}0Vj$Ek~16#Uag H2F8B_j-)6^ literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_repo_cloner.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_repo_cloner.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bacf3652e3d9ccc22f34f4a97a535547686fac39 GIT binary patch literal 3297 zcmbVNL2Mhx6`fr!$>lC7QIf6Lj%=-D*$SO%CCgG3DWz0LwI$e)gm9}!s03`6lT$NMWuc%y=VvE#$Bg zy2jzKBuf=ezp%<{=tq`%eDP~Rto43Zy^DP{pP2ou9>0rJ!eh0I^ z#R$-MFb9J9*0|X<2{)!q2~Dy-3N*pkxLr5y-sA_7!UcLIdS%_skEG8 zNw}!Fxg8Q)(zcDKaPM9BW@3k^d46NEN; z1NKo*08%ZnDoij+$NKLl*h$C*+LX?XQ$9i{(-)xDIM__dmqD3_2iJDWnHDcV;PGZc z2exToSKBHn;I_v0RVxhG)Vj&h>}F1VFOv_v{JqR(Jd~u&jX>sEqSB>wuZm-gC&f3; z1{SyNH5BMtBitq)oEnTeqljt7io%aiGsWAGC+Ax$0+dMws5J(!R6^V00QwOMyqbp> zy9I@`AKsvZ7MSJN(xHB|#r#jsFMj~%^&h}-eNL*U^2%#EHnz%=yQ524Z0|ZcmJCNS zEWKIk%*lW?8a}P`0dX$uCxN<;5cknNunjZS2Y=LtfLfKl7^F znr65a!FFWRaNN9sE3tg3P$2!*zES-CySe{5Z!mk@ZN=p=t2Pyy!)mX}r zbEc8IA-pB$z(;D%E?KVdmX!9FOr;#sTY$n3mH|u4nz{GvNsOq+9XEjr`w1Q4zs-tb`bO+LL*}EPD>Q-9qD~38-oA!Br$Jh7t)M$H=zo~xtf*JG5wN~B=toj zK~$PyL~PR#k>1Ha@nXAhsa^PSyD;eszWp!xPVt3{V-EdbN$rhH%+G8tC@b@uOU9P% zY=SQfC3tM*5zW}7zIMFci&(=-xmYHBUKsv6m=NXM4Ly%#I7Nh?<3dq+8+{W&J$-+8 z@$Ksm`!5`Dec$j%OjeWW17Y@`sYgQRJMq2id+B{)8gMl!?YaBHga-%i3xkg%=*)2a z^rhPAOI7~Vqk#(_JYVI{JRG}P=cO7i9q=Q-=$otZCm!|o*Lz1k?H#Ggv-`bszZ1XU zd+Pj9jUTF>o3CD3JK)!!Jcq=yPeMqXq}>ed<{l5CaPrp5&6PTLzQ&!e4qrLou09k8 z>f&%s9IkRxb#c5Vjsy5u^SYWiRR^v2|0y?B6~~*R5AIXtKvP+36TPWne`>#NE#Qx} z=87f&`a`a>&K;|9$Lic*jT^kr4LuovOFR$;pL!R0AWV2*=7BKnfw>35>{I7e@cy6U zi^oHI;$kTLxA?-v=szxZE%e9kBzeGhPVk_Fm9b zu-F~Dm!O<`$A!hAXzCc@gXe`$!U^Q0>OV-?&rrYK?P9})$JJDkDAqk4evYn*_)AEF zrWs8mnP!bwKfH26SR2ZVQ+5dFJ%@-^g!-N*Q7!9u3hs5=ut*dNw)cv8Ri$-URdEuw z_j2zxIs}OD2tAMgiC=qW@f?VdkjS|K-Qy6$FrOpzTlAa6=jg&`DE1i=AeR{K7Jrk! z)p@h?9rnHGyV3VL-|hSh`(gC`=!fz5<9nHp)^4wTq~2ElzP>+l^&Yn`E$t_l575e2 dDETE5sYVC)nX~_9Pci2XLx>&n5T1qe{sRlV;m`m8 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_summarizer.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_summarizer.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85b78d3f5cc029b68d13362f493ee4ecd4d9e6f2 GIT binary patch literal 5155 zcmeGgOKcm*b(S1{q!lTWk|qCSuI1P@9gvbD$#LSysqMs)CEIGXCSX7+7AtZkZAI=9 zvrAiIVL(O$#D^SW1VN1Uq8!?|x1^WkSQIGGBPq(2x@q77&BZqb%Av@qZ+3T9q@uu5 z(O!x!mNW0YdB1t@&1bnCiL@ek51H+(;K4S1F8g@WL4$X5X z(M($i$x8^i`XVG^TZ)qCOl0bW%i7RQooql{a3;DZ=c#>jp58a-kM`i~^k#>Lea<+e zu-=}X7n3Bq_1+vB@h8z7mkK?nBDYdLD^QZn+=A6|Q=V6IH}%|NinCgba2mP{k#F_KJCUQ{Hxq)IutP{_HVw;c;X>xbX=l@^-Z zX>W`rMdL&+%T2k{uw~q);L-Mw@@2U`F6%2$-S%@wC}0MQKFvSPGc4<8LD8_t>9@0i z*T)dj=gzte`QIQk-Nv}5q72&Up`iTP;1DO`J8uv9hFv>iU^>QlrV3hAxy9mVm zu_h~>JA4f4MOn-|WxmN>O;UjEej24FIq+#`CVO)?ERBpW4U16=i6JqZ4fS(27M?!B zY&7UP%4j=1SPnCPS+8(n%LrFevS_Mjhm%1p=K_N9J(gM-GG6*swnc0WfQZIVdrL3N zGYeWkIZzgpO;+~I;VN{HX@odzs z%Ju_PWjoWwdZ#M2095ARvb>m})g^Y=H5L;)wRkp`jobBgk0ujWMrY$QfsxVwby86Job`IGb=|5rB;RT425t583kZ%zP=1zD22w_<^**z6 zp6VzlniVk=&6J9YVaW4}k-`M-qll^>AoK%-Lg$;TUvR8nAk?mfiC$2wps{S2N|DV6 zOffq{VAV(HeUNGzYSIKgkT{G~j*IMWEnJ0grHN9IO$hllwV)VQD5q;CI0=_IROT`Jjv05Q_@`TGz z-e#5N3;L{FkTkidSS^wv&nZ-c6}@by7mD<4LUdwvNOL+V%BG|&l?t*Z)AF?vP7Tsl$Na%b}~JhL<0kXWgl$h0vLnqGcx`P zwZ4MBjiHX?AH2LWvDtfZWnu$&*KqebPJZ2${9tiqax;1EadBmG9UuGqnc;POYAc8m zBP-+IhEcTp{YpL3yK-$SjJo=&I8!~8sqvW&?7nL_^YFZfIl$8BNV3`9MBpnEm$F?j%xH+gWb#vglpt;V0K z;=a`-XsZ0F)ukHWw}IVv&80bnbsKZwIu-HwJOEfW`BW8;J^9%e1GV(X7iuj%251$C z>9HC=wt?MujS(Hnx{W$;9pLm1rzZkDyWCE%-mT&^b^C6OPj6uNU2|y;Vco_YxQ;=@ zA?-Nw8@kND)AN2}qX2FxQr#Y5Xr;V9K* zh1u3c;A0M1McOkj#qb+NJzp*;m&gR5^Z+&9fo99kaojV6-a)^NJVWQUf;{{^4+aVEoT-)nEE)y>n_Ei_h?- btrk%8ok5SuUkCfqr Date: Tue, 20 Jan 2026 20:10:15 +0530 Subject: [PATCH 2/5] feat: unify Jira/GitHub agents under FastMCP with hybrid RAG support (#62) --- .env | 4 + MCP_Enhancement/agent_start.py | 127 ++++++++++++++++++ MCP_Enhancement/src/__init__.py | 0 .../__pycache__/repo_cloner.cpython-313.pyc | Bin 3770 -> 0 bytes .../__pycache__/pii_remocval.cpython-313.pyc | Bin 3272 -> 0 bytes .../__pycache__/summarizer.cpython-313.pyc | Bin 9290 -> 0 bytes .../Backend/__pycache__/main.cpython-311.pyc | Bin 15861 -> 0 bytes .../Backend/__pycache__/main.cpython-313.pyc | Bin 2095 -> 0 bytes .../__pycache__/api_models.cpython-311.pyc | Bin 889 -> 0 bytes .../__pycache__/audio_models.cpython-311.pyc | Bin 1430 -> 0 bytes .../banking_models.cpython-311.pyc | Bin 1615 -> 0 bytes .../eamil_services.cpython-311.pyc | Bin 3705 -> 0 bytes .../__pycache__/email_service.cpython-311.pyc | Bin 1185 -> 0 bytes .../__pycache__/firestore_db.cpython-311.pyc | Bin 10813 -> 0 bytes .../__pycache__/firestore_db.cpython-313.pyc | Bin 7457 -> 0 bytes .../__pycache__/firestore_db.cpython-37.pyc | Bin 253 -> 0 bytes .../firestore_session.cpython-311.pyc | Bin 4567 -> 0 bytes .../__pycache__/intent_nlu.cpython-311.pyc | Bin 5661 -> 0 bytes .../__pycache__/llm_gemini.cpython-311.pyc | Bin 10616 -> 0 bytes .../__pycache__/llm_gemini.cpython-313.pyc | Bin 2061 -> 0 bytes .../__pycache__/llm_local_hf.cpython-313.pyc | Bin 2849 -> 0 bytes .../__pycache__/stt_whisper.cpython-311.pyc | Bin 5601 -> 0 bytes .../__pycache__/tts_hf.cpython-311.pyc | Bin 5187 -> 0 bytes tests/__pycache__/__init__.cpython-313.pyc | Bin 141 -> 0 bytes ...t_pii_removal.cpython-313-pytest-9.0.2.pyc | Bin 5475 -> 0 bytes ...t_repo_cloner.cpython-313-pytest-9.0.2.pyc | Bin 3297 -> 0 bytes ...st_summarizer.cpython-313-pytest-9.0.2.pyc | Bin 5155 -> 0 bytes 27 files changed, 131 insertions(+) create mode 100644 .env create mode 100644 MCP_Enhancement/agent_start.py create mode 100644 MCP_Enhancement/src/__init__.py delete mode 100644 Repo Clone Automation/__pycache__/repo_cloner.cpython-313.pyc delete mode 100644 Slack_scraper_bot/scripts/__pycache__/pii_remocval.cpython-313.pyc delete mode 100644 Slack_scraper_bot/scripts/__pycache__/summarizer.cpython-313.pyc delete mode 100644 Voice-Driven_banking-Lam/Backend/__pycache__/main.cpython-311.pyc delete mode 100644 Voice-Driven_banking-Lam/Backend/__pycache__/main.cpython-313.pyc delete mode 100644 Voice-Driven_banking-Lam/Backend/models/__pycache__/api_models.cpython-311.pyc delete mode 100644 Voice-Driven_banking-Lam/Backend/models/__pycache__/audio_models.cpython-311.pyc delete mode 100644 Voice-Driven_banking-Lam/Backend/models/__pycache__/banking_models.cpython-311.pyc delete mode 100644 Voice-Driven_banking-Lam/Backend/services/__pycache__/eamil_services.cpython-311.pyc delete mode 100644 Voice-Driven_banking-Lam/Backend/services/__pycache__/email_service.cpython-311.pyc delete mode 100644 Voice-Driven_banking-Lam/Backend/services/__pycache__/firestore_db.cpython-311.pyc delete mode 100644 Voice-Driven_banking-Lam/Backend/services/__pycache__/firestore_db.cpython-313.pyc delete mode 100644 Voice-Driven_banking-Lam/Backend/services/__pycache__/firestore_db.cpython-37.pyc delete mode 100644 Voice-Driven_banking-Lam/Backend/services/__pycache__/firestore_session.cpython-311.pyc delete mode 100644 Voice-Driven_banking-Lam/Backend/services/__pycache__/intent_nlu.cpython-311.pyc delete mode 100644 Voice-Driven_banking-Lam/Backend/services/__pycache__/llm_gemini.cpython-311.pyc delete mode 100644 Voice-Driven_banking-Lam/Backend/services/__pycache__/llm_gemini.cpython-313.pyc delete mode 100644 Voice-Driven_banking-Lam/Backend/services/__pycache__/llm_local_hf.cpython-313.pyc delete mode 100644 Voice-Driven_banking-Lam/Backend/services/__pycache__/stt_whisper.cpython-311.pyc delete mode 100644 Voice-Driven_banking-Lam/Backend/services/__pycache__/tts_hf.cpython-311.pyc delete mode 100644 tests/__pycache__/__init__.cpython-313.pyc delete mode 100644 tests/__pycache__/test_pii_removal.cpython-313-pytest-9.0.2.pyc delete mode 100644 tests/__pycache__/test_repo_cloner.cpython-313-pytest-9.0.2.pyc delete mode 100644 tests/__pycache__/test_summarizer.cpython-313-pytest-9.0.2.pyc diff --git a/.env b/.env new file mode 100644 index 00000000..17027388 --- /dev/null +++ b/.env @@ -0,0 +1,4 @@ +JIRA_INSTANCE_URL=https://mifosforge.jira.com +JIRA_USERNAME=your_email +JIRA_API_TOKEN=your_token +GITHUB_TOKEN=your_github_pat \ No newline at end of file diff --git a/MCP_Enhancement/agent_start.py b/MCP_Enhancement/agent_start.py new file mode 100644 index 00000000..b7695f89 --- /dev/null +++ b/MCP_Enhancement/agent_start.py @@ -0,0 +1,127 @@ +from fastmcp import FastMCP +import os +from dotenv import load_dotenv +from atlassian import Jira +from github import Github + +# Initialize FastMCP Server +mcp = FastMCP("Mifos Knowledge Librarian") + +# Load credentials +load_dotenv() + +# Initialize clients +jira_client = Jira( + url=os.environ["JIRA_INSTANCE_URL"], + username=os.environ["JIRA_USERNAME"], + password=os.environ["JIRA_API_TOKEN"] +) +github_client = Github(os.environ["GITHUB_TOKEN"]) + +@mcp.tool() +def search_jira_tickets(query: str): + """ + Search for Jira tickets using JQL. + Used for tracking feature progress and identifying developer consensus. + """ + try: + issues = jira_client.jql(query, limit=5) + results = [] + for issue_data in issues['issues']: + # The jql result gives us the key and summary, let's get comments + comments_data = jira_client.get_issue_comments(issue_data['key']) + comments = [ + f"{c['author']['displayName']}: {c['body']}" + for c in comments_data['comments'][-3:] + ] + results.append({ + "key": issue_data['key'], + "summary": issue_data['fields']['summary'], + "comments": comments, + }) + return results + except Exception as e: + return f"Error searching Jira: {e}" + +@mcp.tool() +def get_github_pr_details(pr_number: int, repo_name: str): + """ + Fetch description and changed files from a specific GitHub Pull Request. + Used for synthesizing release notes. + """ + try: + repo = github_client.get_repo(repo_name) + pr = repo.get_pull(pr_number) + files = [f.filename for f in pr.get_files()] + return { + "title": pr.title, + "description": pr.body, + "changed_files": files, + } + except Exception as e: + return f"Error fetching GitHub PR: {e}" + +@mcp.tool() +def generate_knowledge_summary(jira_key: str, repo_name: str = "apache/fineract"): + """ + Takes a Jira Key, searches for a corresponding GitHub PR in a specified repo, + and returns a combined summary of the ticket and the PR. + Defaults to the 'apache/fineract' repository. + """ + try: + # 1. Get Jira ticket info + jira_info_list = search_jira_tickets(f'key = {jira_key}') + if not jira_info_list or isinstance(jira_info_list, str): + return f"Could not retrieve Jira ticket {jira_key}." + jira_info = jira_info_list[0] + + # 2. Find corresponding GitHub PR + query = f'repo:{repo_name} is:pr "{jira_key}"' + prs = github_client.search_issues(query) + if prs.totalCount == 0: + return { + "jira_summary": jira_info['summary'], + "jira_comments": jira_info['comments'], + "github_pr": "No corresponding GitHub PR found." + } + + # 3. Get PR details from the first match + pr_number = prs[0].number + pr_details = get_github_pr_details(pr_number, repo_name) + + # 4. Combine and return + return { + "jira_key": jira_key, + "jira_summary": jira_info['summary'], + "jira_comments": jira_info['comments'], + "github_pr_title": pr_details.get('title'), + "github_pr_description": pr_details.get('description'), + "github_pr_changed_files": pr_details.get('changed_files'), + } + except Exception as e: + return f"Error generating knowledge summary: {e}" + +@mcp.tool() +def search_project_docs(query: str): + """ + Search through static Mifos documentation and READMEs. + Use this for architectural questions or project setup guides. + """ + # Simple implementation: search for keywords in .md files + docs_path = "./docs" # Or root if docs/ doesn't exist + results = [] + if not os.path.exists(docs_path): + docs_path = "." # Fallback to root + + for root, dirs, files in os.walk(docs_path): + for file in files: + if file.endswith(".md"): + with open(os.path.join(root, file), 'r', encoding='utf-8') as f: + content = f.read() + if query.lower() in content.lower(): + results.append(f"--- {file} ---\n{content[:500]}...") + + return "\n".join(results) if results else "No matching documentation found." + +if __name__ == "__main__": + mcp.run() \ No newline at end of file diff --git a/MCP_Enhancement/src/__init__.py b/MCP_Enhancement/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Repo Clone Automation/__pycache__/repo_cloner.cpython-313.pyc b/Repo Clone Automation/__pycache__/repo_cloner.cpython-313.pyc deleted file mode 100644 index 794d9c341bf1e8c81c53c599ca4a8f867cd17484..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3770 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 vJCnOHdorEl9jpN}HOXPNgu#PGwS diff --git a/Slack_scraper_bot/scripts/__pycache__/summarizer.cpython-313.pyc b/Slack_scraper_bot/scripts/__pycache__/summarizer.cpython-313.pyc deleted file mode 100644 index 908e0f604bc3a46d455f947749fcef566d5981b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9290 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 diff --git a/Voice-Driven_banking-Lam/Backend/__pycache__/main.cpython-311.pyc b/Voice-Driven_banking-Lam/Backend/__pycache__/main.cpython-311.pyc deleted file mode 100644 index e0f84447d1769f0aded5a6434efd3b891f00d134..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15861 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%0A@^!g~?} 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 C4dJ^0 diff --git a/Voice-Driven_banking-Lam/Backend/models/__pycache__/audio_models.cpython-311.pyc b/Voice-Driven_banking-Lam/Backend/models/__pycache__/audio_models.cpython-311.pyc deleted file mode 100644 index 741b804b96cb1dd34e113eede6a24c19d5fc8b2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1430 zcmah|%}*0S6rcU*cDs}>Lt-_NETV@d1TTI>LX0AbR;7(mE=`lkurrhm+ugde1V$X-2pD}fUy-^{im7Gyf}>zntR_ukBVZ@-O>S_nqt^{0(B6``ME zGZ>k^aI_A>9-@dU9%?96ML{ZhhN$`hQH?2IHH3b^N=H?doDN)Oh|?rz0GA!&bZWjq z#oRC9rl=&jCBoTCK$++CJ285dZb- zscOdTApr)OoQf-PWw&xLRfwN|bh>&0=DuDyxG@vI=x81K+3M;uF!v>b5Ka!fpI_N& zp#N7{sGFWxZ`u2((uzdg?hVzAHv^xF!fm_Jh8=~(=T7LZL46`H>sLn?a=B=P;tL2z z1mp#b3K$bGE?`1{yz&(xO$|U8@Y?_vredba^G4~~ckfu#|Dio*s6S^|iL&G3Wg7)~7%4d{Y RJv0oR;-SzUpF_z9{|0S(PgVc` diff --git a/Voice-Driven_banking-Lam/Backend/models/__pycache__/banking_models.cpython-311.pyc b/Voice-Driven_banking-Lam/Backend/models/__pycache__/banking_models.cpython-311.pyc deleted file mode 100644 index 5fc9a30bcdb16cd63944251ae5d75b13fdb172e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1615 zcmah}zi-<{6h8ivXf=xM#7&SQaEJnJ!=Uigp(%_MaRsD@HWluasqdYrrjlXgc=z!g-@A9b@8jdo-EN0K z`|S_@I4}wM3n%mDG{)%>7_SH;%t%OT1crgOnV6{+Sg9S@sS`K`G08o`tmlN;-1x~N zqtUNNW=_LqnEs)FBB3W9bjYW})9H`(&_ZyXF(`A{?=tD*EluM5a24m;}xn%?r za^^9rXd_%#@>x2q-Ck{@&+o|h;PvDMgf7BGgjIw!gsTX6c!^acTL|k2nx@NWy*~%c zRNMnNm+_6OWBUs96Z^{KBfsjsxcTz4ku`cSa(}qn(o0SEKaxUEUQ%hFhQa#k*$%DlW;;iXx0s0sBRWk9yB zmWEpw3jsg!*Z3Ez*F>3yN`fpj(jWJp@4kcQ>$uK}g<578zZ{8xgcqL!oXhU&rK(@` zkNcDBn`3+9Wi+$>O|w=i-UMz=BY Y7DhHMh`fQ3%kbkhjJ$!7%P!5*zjjQAfB*mh diff --git a/Voice-Driven_banking-Lam/Backend/services/__pycache__/eamil_services.cpython-311.pyc b/Voice-Driven_banking-Lam/Backend/services/__pycache__/eamil_services.cpython-311.pyc deleted file mode 100644 index 7cd451faa9bd1695f19256aa444e4e4ebd1e1cdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3705 zcmaJEU2GG{dDdRrYkTed5EB9%nU>^8Ao!pp2m(dT<%hqJq)AGP71i2!$Id3}UEl0F zAy!hE(^Z!uRH%e>NOwqiIZ6c&Jn~qbxYufpd^&3-B-EdWdvisR&^`5=bsXCv?Ra+P zoB4j`oB4ib{O3?8fS{Z{@^oPwpntGIwRpFHH_thQzCbdPITgh!Js0Dgu`A|+-le+J ze2nK9&aHaVo|q@?jd`6hulmwLOyH0U5#bStd{UK7OWkboRqaxs}y2Y%OLYgInLd#dnLu~8O> zNN}^QimmVE&`wG@9E-?JvArO@g+$2SN3hxxXGO*rYbWjW!2guiOd?+*x#gkzJ*nIb z(_vrz+ErL?-HloXj@~^#FrtZG&K5`0lA>NCh9RX$ugex>$t0$dCbploGEq$l$bzaa z$#GdXiMDKuGouqDqto%xYeSdE?N+CY4^2(Qr-o)`emyxoVmDEeP%;Y9%s654ZMSY_ zY%e8dmTHOZU4stHpWN`h`6tYNflL6ah5F1oO5>o(S1|}}GM@K}%)Pf`*9pO zPnD_B>&#Gf9)Y($RIsP?|95@do_2&e0K{mIB01_GGM`olZXE9iX<&Ye1^t%DH?ln8A zc-VVWz2rt(4y}1N>&~ghRnJpzvt9VZHLe=8wj+jNr_JoQlV1xSMkkTMueffyZ=e;9 zLpLB_aHzpEnrd=ukleC{zC;gQjdq1~T4&HdT5uWIQ=L z1!x%?M3W7yn9+d4IqigzG3X4Ks9BmNSV=m}Te2jBahcf2CK3?b$*iib_Te!}H3-&W z5xSxnB`iVRXHJ~@E5l<31* zSWd;cPqq$nM0a*!EJ&2Cx-A0iAZe?*Mxyv~60ho6EGx2h#KdW7X^W7OPqM@?`y6Zn zY-mVHqOM{krRh~+jw!azxa)?VrTDt8BnbXk(w5lHt`n*x+4dD(!^65vY~M_Fevu?h zn;)Zk+IG$Axv-HoGtm^wqS1t&Rtj(v=0f%68Jx&k{ynQ>Q^&Kp{bL{i%mf4G zP0m?441*ZVB#@hlxS}QX-WJMo92KCky{eu{5o&t~r8=c7{n~C#U!g3C+Ja%yB)cOh ziw`?!5Hk+`05^nb`nY zEIL^E@xt)n+^+y<%q=U4C9*mx%cw4k03k5+b3W_BtrKYxx z>{~C|bKrj8pQ87pU!Q$8Z5=*SIDDoEZR?r*)lvk1AL)G=>3w{(5E&>&2J#bSudh{j z?Gefz=*x&T0y;IsmHpdeHkrTjwhaZ_{}80Vpmb@vc#^k5BMD+ zPV;Xj?mw)l&Fu!gd-ra)>9+yoZ@L@29kkjmKGUIrS`aQ3g-e!jsnoP*!+iHD*yfyj zt=YD~z_XuNkpZZGOze&qhv(>Z$7{q0c?z_t*NL%?eBIK-AmCCfz3 z{q*?p<9Ir&X)N+bSvcdFio4-iNF*50x#sJRZ~h|1+>b@O?LGOkQ~d*{vt6Ll-@p2O zh4lXfdTxIdPgOE$Vu2)bq-{X=7xV^NM7yE+Q8=I0<*Z6B&_Nio{~3k`ZQ0FnTnUBq&aZ_0dFNL*^Pz#oLxrZE zVpC6EEJY68o4$X;>O575^cN%j7HTc?$GFJma2Y}OIN@~9WT)HN%yEbpH*zoC9hSSJ z#JA@!7WwuEsjpOvKUUz675QTTl=#5sS3kXKHTM_zfg(R(@dKd8-k$tKsi{4G>2>(v zhW6mMkAG7LpDu<^=P$nYg&|Ts39bZ*&WTL&{DRd+DzzXai$c<>*4Nc!C>4bHqA+h& QYxw};_k&jSES&p)0TTYIzW@LL diff --git a/Voice-Driven_banking-Lam/Backend/services/__pycache__/email_service.cpython-311.pyc b/Voice-Driven_banking-Lam/Backend/services/__pycache__/email_service.cpython-311.pyc deleted file mode 100644 index 2e90e931cb3d943a8f6b2f91d28438824eabbf79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1185 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 Gn*RlNsBXjn diff --git a/Voice-Driven_banking-Lam/Backend/services/__pycache__/firestore_db.cpython-37.pyc b/Voice-Driven_banking-Lam/Backend/services/__pycache__/firestore_db.cpython-37.pyc deleted file mode 100644 index e10af5f0667767774b68ce4b8a26fce5632bbe07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253 zcmZ?b<>g`k0@E8w89RaWV-N=hn1BoiATH(s5-AKRj4cdN3@J>(44TZzKoK}#1hSlg zxR?bWHa^HWN5Qtd#xJ_9iW00M(H6#xJL diff --git a/Voice-Driven_banking-Lam/Backend/services/__pycache__/firestore_session.cpython-311.pyc b/Voice-Driven_banking-Lam/Backend/services/__pycache__/firestore_session.cpython-311.pyc deleted file mode 100644 index ca03e22484d0803b96136209d12cfc075c408c82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4567 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 Gz5f>qRXHdC diff --git a/Voice-Driven_banking-Lam/Backend/services/__pycache__/llm_gemini.cpython-311.pyc b/Voice-Driven_banking-Lam/Backend/services/__pycache__/llm_gemini.cpython-311.pyc deleted file mode 100644 index 40e6a88ec821ded0b2038d49b8d9d7956fbcc51c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10616 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 diff --git a/Voice-Driven_banking-Lam/Backend/services/__pycache__/stt_whisper.cpython-311.pyc b/Voice-Driven_banking-Lam/Backend/services/__pycache__/stt_whisper.cpython-311.pyc deleted file mode 100644 index 9012f4327e2ca30145f1724228fb5c2c36129d31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5601 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 diff --git a/Voice-Driven_banking-Lam/Backend/services/__pycache__/tts_hf.cpython-311.pyc b/Voice-Driven_banking-Lam/Backend/services/__pycache__/tts_hf.cpython-311.pyc deleted file mode 100644 index 0146cd8e26dca1ceaf8c20f88cfeac6339fbf3b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5187 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 P5aS~=BO_xGGmr%UAjcp> diff --git a/tests/__pycache__/test_pii_removal.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_pii_removal.cpython-313-pytest-9.0.2.pyc deleted file mode 100644 index a407ea185e2abc804d373aa28457a078bf69d75a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5475 zcmeHLO>7&-6`m!R|Dr58ktN%$y_THV>za(Hza(-cN2U_Vv?Zb1&~PCYixs()wkCIp z*`*!QHK3qHlVgG+wF(qSawvk_?2~Ur&`WcaOt}))1ze!H^inuc4}nj8Gy6-GsAZtX zF2vb4Z{FX$-TmGh?In|O1lQNcG$j*8=k)B_yK zu{gw8D`6a_D-j%ld*Dhm7sIh!9LG6yf=C3fByt_NBbUU3I#nZN^@3wfxH?hg(?zWQr zfhB)*V98V)$zFGN>}bGRcR0?S?(RSGbP~<~wuB~vCsB#vWB(wk^L)UJ%}J|DVNNUD zFhfeY`;)WTrJ2+Vfx3kaJv?682aS%bWOmPluKosZv1(@n(hoCTVjuKcp#{^W&1o34BJ>;K^_$OmlNS0V;uw~Yw^@g=%`OJ*8%*J$r&76CgBiZrg8DSy2 zJg1a2eHnINsi}%lPf5x$$&OA(v8pJrWvFgaIbE%rJv4Fq%N-`4JK2yPg^IO~{?GjV2<&F&;pTZt49n~792@fr{hCht$e?cQW_I7|4$*{wu&2PElV zlSsbiPA%dQo83+vcbQwQQ;Yu>HoKAYi#Rh--b|daR;cxqkKXTT8v=X7Z^fB`m3xz( z;;?ZoZ<#{#6 zCmU(6DAJCYQ;M=`D5bihu5tuQt?FojOEKMemDaF$rA`+)Mdxzbn#xUUa(q_1MJs7t zt6gkF9X8KA3#*#JDJm4ZBX+IgEDo&+P?gLumi1cM-~*VnT$sE>&pLf|1Ih*_Z_#|C z!|#P>%mB4}*s-gqj!iy>$$N}@$qnSLn{?2Zq zXOkV+xVDuT*kSFzhwQ+Irpke;%p9q^+N9(APKpO)Z^#Zm|# z@E{z3*@f4|wkHKA_6uOVNPyY%(jF4sNS)XyFne0Tz=6vjqiW{{_(E_VW86JlpvOwjF0Rk*u)SMs?>2jS_w494`^q=T z-p#)A&14F2st20I)MgLq8h2Rx?;)G|aLk=q#G@A8mN$b1P~RsFQxMr@yDiT=pT_bntQgSvyDT$e^XP*y!b=7cdhho>IC=l%SAES)?(6C1>7O)TUfgB{aNA@{Ph-T?Go3)(r}0Vj$Ek~16#Uag H2F8B_j-)6^ diff --git a/tests/__pycache__/test_repo_cloner.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_repo_cloner.cpython-313-pytest-9.0.2.pyc deleted file mode 100644 index bacf3652e3d9ccc22f34f4a97a535547686fac39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3297 zcmbVNL2Mhx6`fr!$>lC7QIf6Lj%=-D*$SO%CCgG3DWz0LwI$e)gm9}!s03`6lT$NMWuc%y=VvE#$Bg zy2jzKBuf=ezp%<{=tq`%eDP~Rto43Zy^DP{pP2ou9>0rJ!eh0I^ z#R$-MFb9J9*0|X<2{)!q2~Dy-3N*pkxLr5y-sA_7!UcLIdS%_skEG8 zNw}!Fxg8Q)(zcDKaPM9BW@3k^d46NEN; z1NKo*08%ZnDoij+$NKLl*h$C*+LX?XQ$9i{(-)xDIM__dmqD3_2iJDWnHDcV;PGZc z2exToSKBHn;I_v0RVxhG)Vj&h>}F1VFOv_v{JqR(Jd~u&jX>sEqSB>wuZm-gC&f3; z1{SyNH5BMtBitq)oEnTeqljt7io%aiGsWAGC+Ax$0+dMws5J(!R6^V00QwOMyqbp> zy9I@`AKsvZ7MSJN(xHB|#r#jsFMj~%^&h}-eNL*U^2%#EHnz%=yQ524Z0|ZcmJCNS zEWKIk%*lW?8a}P`0dX$uCxN<;5cknNunjZS2Y=LtfLfKl7^F znr65a!FFWRaNN9sE3tg3P$2!*zES-CySe{5Z!mk@ZN=p=t2Pyy!)mX}r zbEc8IA-pB$z(;D%E?KVdmX!9FOr;#sTY$n3mH|u4nz{GvNsOq+9XEjr`w1Q4zs-tb`bO+LL*}EPD>Q-9qD~38-oA!Br$Jh7t)M$H=zo~xtf*JG5wN~B=toj zK~$PyL~PR#k>1Ha@nXAhsa^PSyD;eszWp!xPVt3{V-EdbN$rhH%+G8tC@b@uOU9P% zY=SQfC3tM*5zW}7zIMFci&(=-xmYHBUKsv6m=NXM4Ly%#I7Nh?<3dq+8+{W&J$-+8 z@$Ksm`!5`Dec$j%OjeWW17Y@`sYgQRJMq2id+B{)8gMl!?YaBHga-%i3xkg%=*)2a z^rhPAOI7~Vqk#(_JYVI{JRG}P=cO7i9q=Q-=$otZCm!|o*Lz1k?H#Ggv-`bszZ1XU zd+Pj9jUTF>o3CD3JK)!!Jcq=yPeMqXq}>ed<{l5CaPrp5&6PTLzQ&!e4qrLou09k8 z>f&%s9IkRxb#c5Vjsy5u^SYWiRR^v2|0y?B6~~*R5AIXtKvP+36TPWne`>#NE#Qx} z=87f&`a`a>&K;|9$Lic*jT^kr4LuovOFR$;pL!R0AWV2*=7BKnfw>35>{I7e@cy6U zi^oHI;$kTLxA?-v=szxZE%e9kBzeGhPVk_Fm9b zu-F~Dm!O<`$A!hAXzCc@gXe`$!U^Q0>OV-?&rrYK?P9})$JJDkDAqk4evYn*_)AEF zrWs8mnP!bwKfH26SR2ZVQ+5dFJ%@-^g!-N*Q7!9u3hs5=ut*dNw)cv8Ri$-URdEuw z_j2zxIs}OD2tAMgiC=qW@f?VdkjS|K-Qy6$FrOpzTlAa6=jg&`DE1i=AeR{K7Jrk! z)p@h?9rnHGyV3VL-|hSh`(gC`=!fz5<9nHp)^4wTq~2ElzP>+l^&Yn`E$t_l575e2 dDETE5sYVC)nX~_9Pci2XLx>&n5T1qe{sRlV;m`m8 diff --git a/tests/__pycache__/test_summarizer.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_summarizer.cpython-313-pytest-9.0.2.pyc deleted file mode 100644 index 85b78d3f5cc029b68d13362f493ee4ecd4d9e6f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5155 zcmeGgOKcm*b(S1{q!lTWk|qCSuI1P@9gvbD$#LSysqMs)CEIGXCSX7+7AtZkZAI=9 zvrAiIVL(O$#D^SW1VN1Uq8!?|x1^WkSQIGGBPq(2x@q77&BZqb%Av@qZ+3T9q@uu5 z(O!x!mNW0YdB1t@&1bnCiL@ek51H+(;K4S1F8g@WL4$X5X z(M($i$x8^i`XVG^TZ)qCOl0bW%i7RQooql{a3;DZ=c#>jp58a-kM`i~^k#>Lea<+e zu-=}X7n3Bq_1+vB@h8z7mkK?nBDYdLD^QZn+=A6|Q=V6IH}%|NinCgba2mP{k#F_KJCUQ{Hxq)IutP{_HVw;c;X>xbX=l@^-Z zX>W`rMdL&+%T2k{uw~q);L-Mw@@2U`F6%2$-S%@wC}0MQKFvSPGc4<8LD8_t>9@0i z*T)dj=gzte`QIQk-Nv}5q72&Up`iTP;1DO`J8uv9hFv>iU^>QlrV3hAxy9mVm zu_h~>JA4f4MOn-|WxmN>O;UjEej24FIq+#`CVO)?ERBpW4U16=i6JqZ4fS(27M?!B zY&7UP%4j=1SPnCPS+8(n%LrFevS_Mjhm%1p=K_N9J(gM-GG6*swnc0WfQZIVdrL3N zGYeWkIZzgpO;+~I;VN{HX@odzs z%Ju_PWjoWwdZ#M2095ARvb>m})g^Y=H5L;)wRkp`jobBgk0ujWMrY$QfsxVwby86Job`IGb=|5rB;RT425t583kZ%zP=1zD22w_<^**z6 zp6VzlniVk=&6J9YVaW4}k-`M-qll^>AoK%-Lg$;TUvR8nAk?mfiC$2wps{S2N|DV6 zOffq{VAV(HeUNGzYSIKgkT{G~j*IMWEnJ0grHN9IO$hllwV)VQD5q;CI0=_IROT`Jjv05Q_@`TGz z-e#5N3;L{FkTkidSS^wv&nZ-c6}@by7mD<4LUdwvNOL+V%BG|&l?t*Z)AF?vP7Tsl$Na%b}~JhL<0kXWgl$h0vLnqGcx`P zwZ4MBjiHX?AH2LWvDtfZWnu$&*KqebPJZ2${9tiqax;1EadBmG9UuGqnc;POYAc8m zBP-+IhEcTp{YpL3yK-$SjJo=&I8!~8sqvW&?7nL_^YFZfIl$8BNV3`9MBpnEm$F?j%xH+gWb#vglpt;V0K z;=a`-XsZ0F)ukHWw}IVv&80bnbsKZwIu-HwJOEfW`BW8;J^9%e1GV(X7iuj%251$C z>9HC=wt?MujS(Hnx{W$;9pLm1rzZkDyWCE%-mT&^b^C6OPj6uNU2|y;Vco_YxQ;=@ zA?-Nw8@kND)AN2}qX2FxQr#Y5Xr;V9K* zh1u3c;A0M1McOkj#qb+NJzp*;m&gR5^Z+&9fo99kaojV6-a)^NJVWQUf;{{^4+aVEoT-)nEE)y>n_Ei_h?- btrk%8ok5SuUkCfqr Date: Tue, 20 Jan 2026 20:18:24 +0530 Subject: [PATCH 3/5] chore: remove .env from tracking for security --- .env | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 .env diff --git a/.env b/.env deleted file mode 100644 index 17027388..00000000 --- a/.env +++ /dev/null @@ -1,4 +0,0 @@ -JIRA_INSTANCE_URL=https://mifosforge.jira.com -JIRA_USERNAME=your_email -JIRA_API_TOKEN=your_token -GITHUB_TOKEN=your_github_pat \ No newline at end of file From 40a8ea3363c8fbd70df428f14a091fa503623304 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 21 Jan 2026 20:53:38 +0530 Subject: [PATCH 4/5] refactor: address maintainer feedback by removing tests/ci and pycache --- .../workflows/community-chatbot-backend.yml | 36 ------------- .../workflows/community-chatbot-frontend.yml | 46 ---------------- .github/workflows/run-tests.yml | 30 ----------- .gitignore | Bin 64 -> 78 bytes tests/__init__.py | 0 tests/requirements.txt | 8 --- tests/test_pii_removal.py | 36 ------------- tests/test_repo_cloner.py | 38 ------------- tests/test_summarizer.py | 51 ------------------ 9 files changed, 245 deletions(-) delete mode 100644 .github/workflows/community-chatbot-backend.yml delete mode 100644 .github/workflows/community-chatbot-frontend.yml delete mode 100644 .github/workflows/run-tests.yml delete mode 100644 tests/__init__.py delete mode 100644 tests/requirements.txt delete mode 100644 tests/test_pii_removal.py delete mode 100644 tests/test_repo_cloner.py delete mode 100644 tests/test_summarizer.py diff --git a/.github/workflows/community-chatbot-backend.yml b/.github/workflows/community-chatbot-backend.yml deleted file mode 100644 index 281709b4..00000000 --- a/.github/workflows/community-chatbot-backend.yml +++ /dev/null @@ -1,36 +0,0 @@ -# .github/workflows/backend.yml -name: Backend CI - -on: - push: - paths: - - 'community-chatbot/scripts/**' - - 'community-chatbot/requirements.txt' - pull_request: - paths: - - 'community-chatbot/scripts/**' - - 'community-chatbot/requirements.txt' - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.10' - - - name: Install dependencies - run: | - cd community-chatbot - python -m pip install --upgrade pip - pip install -r requirements.txt - - - name: Run backend script - run: | - cd community-chatbot/scripts - bash run_backend.sh || echo "No backend service started" diff --git a/.github/workflows/community-chatbot-frontend.yml b/.github/workflows/community-chatbot-frontend.yml deleted file mode 100644 index dc4c0c47..00000000 --- a/.github/workflows/community-chatbot-frontend.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: Community Chatbot Frontend CI - -on: - push: - paths: - - 'community-chatbot/**' - pull_request: - paths: - - 'community-chatbot/**' - -jobs: - frontend-build-and-test: - runs-on: ubuntu-latest - defaults: - run: - working-directory: community-chatbot - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Set up Node.js - uses: actions/setup-node@v3 - with: - node-version: 18 - - - name: Install pnpm - run: npm install -g pnpm - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Create .env.local from secrets - run: | - echo "NEXT_PUBLIC_FIREBASE_API_KEY=${{ secrets.NEXT_PUBLIC_FIREBASE_API_KEY }}" >> .env.local - echo "NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=${{ secrets.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN }}" >> .env.local - echo "NEXT_PUBLIC_FIREBASE_PROJECT_ID=${{ secrets.NEXT_PUBLIC_FIREBASE_PROJECT_ID }}" >> .env.local - echo "NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=${{ secrets.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET }}" >> .env.local - echo "NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=${{ secrets.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID }}" >> .env.local - echo "NEXT_PUBLIC_FIREBASE_APP_ID=${{ secrets.NEXT_PUBLIC_FIREBASE_APP_ID }}" >> .env.local - - - name: Run tests - run: pnpm test - - - name: Build frontend - run: pnpm run build \ No newline at end of file diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml deleted file mode 100644 index be22b9da..00000000 --- a/.github/workflows/run-tests.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Run Python Tests - -on: [push, pull_request] - -jobs: - test: - runs-on: ubuntu-latest - strategy: - matrix: - python-version: ["3.9"] - - steps: - - uses: actions/checkout@v3 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v3 - with: - python-version: ${{ matrix.python-version }} - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -r tests/requirements.txt - # Install other requirements files if they exist - if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - if [ -f community-chatbot/requirements.txt ]; then pip install -r community-chatbot/requirements.txt; fi - if [ -f slack_pipeline/requirements.txt ]; then pip install -r slack_pipeline/requirements.txt; fi - if [ -f Voice-Driven_banking-Lam/Backend/requirements.txt ]; then pip install -r Voice-Driven_banking-Lam/Backend/requirements.txt; fi - python -m spacy download en_core_web_lg - - name: Run tests - run: | - pytest tests/ diff --git a/.gitignore b/.gitignore index 7b12f1a7f27fee92d30ddc0714e929f2a8a1c51f..ec86ba77be619c873f44c0a360f258e682de82c3 100644 GIT binary patch delta 19 acmZ?po8Z95#h}NK%8$(*p$n delta 4 LcmeZsnBV{a16%=L diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/requirements.txt b/tests/requirements.txt deleted file mode 100644 index b88a790c..00000000 --- a/tests/requirements.txt +++ /dev/null @@ -1,8 +0,0 @@ -pytest -pytest-mock -openai -tenacity -selenium -scrubadub -scrubadub_spacy -spacy diff --git a/tests/test_pii_removal.py b/tests/test_pii_removal.py deleted file mode 100644 index 4d60e9c6..00000000 --- a/tests/test_pii_removal.py +++ /dev/null @@ -1,36 +0,0 @@ -import pytest -import re -from unittest.mock import MagicMock, patch -# We need to handle the import carefully in case dependencies aren't installed -try: - from Slack_scraper_bot.scripts.pii_remocval import remove_user_tags, remove_name_lines, clean_text -except ImportError: - import sys - import os - sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) - from Slack_scraper_bot.scripts.pii_remocval import remove_user_tags, remove_name_lines, clean_text -def test_remove_user_tags(): - """Test that Slack user IDs are stripped from timestamps.""" - input_text = "[2024-01-20 12:34:56] User: U123ABCDE Hello world" - expected = "[2024-01-20 12:34:56] Hello world" - assert remove_user_tags(input_text).strip() == expected.strip() - -def test_remove_name_lines(): - """Test that lines identifying names are removed.""" - input_text = "Hello\nmy name is John Doe\nHow are you?" - # Assuming the script removes the whole line - result = remove_name_lines(input_text) - assert "John Doe" not in result - assert "How are you?" in result - -@patch('Slack_scraper_bot.scripts.pii_remocval.create_scrubber') -def test_clean_text_mocked(mock_create_scrubber): - """Test clean_text by mocking the heavy scrubadub engine.""" - # Setup the mock scrubber - mock_scrubber = MagicMock() - mock_scrubber.clean.return_value = "I live in {{LOCATION}}" - mock_create_scrubber.return_value = mock_scrubber - - result = clean_text("I live in New York") - assert result == "I live in {{LOCATION}}" - mock_scrubber.clean.assert_called_once() diff --git a/tests/test_repo_cloner.py b/tests/test_repo_cloner.py deleted file mode 100644 index 74ec9cad..00000000 --- a/tests/test_repo_cloner.py +++ /dev/null @@ -1,38 +0,0 @@ -import pytest -from unittest.mock import patch, MagicMock -import os -import sys - -# Ensure the project root is in path -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) - -import importlib - -@patch('selenium.webdriver.Chrome') -def test_clone_repository_mocked(mock_chrome): - """Verify the browser is initialized without actually opening Chrome.""" - mock_driver = MagicMock() - mock_chrome.return_value = mock_driver - - # Use a dummy path and URL - # We need to mock the rest of the selenium and os calls to avoid errors - with (patch('selenium.webdriver.support.ui.WebDriverWait') as mock_wait, - patch('os.listdir', return_value=['dummy.zip']), - patch('os.path.exists', return_value=True), - patch('zipfile.ZipFile')): - - # Configure the mock for WebDriverWait's .until() method - mock_wait_instance = mock_wait.return_value - mock_clickable_element = MagicMock() - mock_wait_instance.until.return_value = mock_clickable_element - - # Import the module here, after patches are active - repo_cloner_path = "Repo Clone Automation.repo_cloner" - repo_cloner = importlib.import_module(repo_cloner_path) - - repo_cloner.clone_repository("https://github.com/test/repo", "./test_downloads") - - # Verify interaction - mock_driver.get.assert_called_with("https://github.com/test/repo") - assert mock_clickable_element.click.call_count == 2 - mock_driver.quit.assert_called() diff --git a/tests/test_summarizer.py b/tests/test_summarizer.py deleted file mode 100644 index 83212219..00000000 --- a/tests/test_summarizer.py +++ /dev/null @@ -1,51 +0,0 @@ -import pytest -from unittest.mock import patch, MagicMock - -# It's important to get the path right for the import -try: - from Slack_scraper_bot.scripts.summarizer import summarize -except ImportError: - import sys - import os - sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) - from Slack_scraper_bot.scripts.summarizer import summarize - -@patch('Slack_scraper_bot.scripts.summarizer.make_api_call') -def test_summarize_mocked_api_call(mock_make_api_call): - """ - Test that the summarize function calls the API with the correct prompt - and returns the mocked summary. - """ - # Arrange: - # 1. Configure the mock to return a fake summary - mock_choice = MagicMock() - mock_choice.message.content = "This is a mock summary." - - mock_completion = MagicMock() - mock_completion.choices = [mock_choice] - - mock_make_api_call.return_value = mock_completion - - # 2. Define the input text - input_text = "This is the source code to be summarized." - - # Act: - # Call the function under test - result = summarize(input_text) - - # Assert: - # 1. Check that the function returned the mocked summary - assert result == "This is a mock summary." - - # 2. Verify that the API call was made once - mock_make_api_call.assert_called_once() - - # 3. Check the content of the prompt sent to the API - args, kwargs = mock_make_api_call.call_args - sent_messages = args[1] - - assert len(sent_messages) == 2 - assert sent_messages[0]['role'] == 'system' - assert "Summarize Code-related Files" in sent_messages[0]['content'] - assert sent_messages[1]['role'] == 'user' - assert sent_messages[1]['content'] == input_text From dafc55e3270b95f848eb325bd7d12936662421ce Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 21 Jan 2026 21:52:37 +0530 Subject: [PATCH 5/5] refactor: move imports to top-level and revert legacy cloner changes --- Slack_scraper_bot/scripts/pii_remocval.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Slack_scraper_bot/scripts/pii_remocval.py b/Slack_scraper_bot/scripts/pii_remocval.py index 3b114251..e509813e 100644 --- a/Slack_scraper_bot/scripts/pii_remocval.py +++ b/Slack_scraper_bot/scripts/pii_remocval.py @@ -1,9 +1,9 @@ import re import sys +import scrubadub +import scrubadub_spacy def create_scrubber(): - import scrubadub - import scrubadub_spacy scrubber = scrubadub.Scrubber() spacy_detector = scrubadub_spacy.detectors.SpacyEntityDetector(model='en_core_web_lg') scrubber.add_detector(spacy_detector)