প্রকল্প সম্পর্কে
jarvis, যা PyPI-তে jarvis-mcp হিসেবে প্রকাশিত, এটি কোডিং এজেন্টদের জন্য একটি লোকাল-ফার্স্ট কোড ইন্টেলিজেন্স লেয়ার। এটি একটি Model Context Protocol (MCP) সার্ভার হিসেবে কাজ করে যা stdio-র মাধ্যমে যোগাযোগ করে, ফলে Claude Code, Cursor, Claude Desktop বা অন্য যেকোনো MCP ক্লায়েন্ট আগে থেকে ইনডেক্স করা রিপোজিটরি কোয়েরি করতে পারে। এখানে কোনো হোস্ট করা পরিষেবা, কোনো অথেন্টিকেশন এবং কোনো নেটওয়ার্ক ডিপেন্ডেন্সি নেই: কোনো কিছুই মেশিন থেকে বাইরে যায় না।
দুইটি অংশ যেভাবে একসাথে কাজ করে
প্রজেক্টটি ইচ্ছাকৃতভাবে একটি রাইটার (writer) এবং একটি রিডার (reader)-এ বিভক্ত, যাদের মধ্যে একমাত্র সাধারণ চুক্তি হলো একটি লোকাল ডেটা ডিরেক্টরি (ডিফল্টভাবে ~/.jarvis)।
- Indexing CLI: jarvis index একটি রিপোজিটরি পাথ গ্রহণ করে, প্রতিটি সমর্থিত ফাইলের জন্য একটি Tree-sitter সিনট্যাক্স বেসলাইন তৈরি করে, ঐচ্ছিক ভাবে ল্যাঙ্গুয়েজের SCIP ইনডেক্সার চালায় এবং আউটপুটকে SQLite-এ রূপান্তর করে, Zoekt শার্ডস এবং ঐচ্ছিক এমবেডিং তৈরি করে, তারপর সবকিছুকে একটি ইমিউটেবল স্ন্যাপশট হিসেবে পাবলিশ করে যা একটি ছোট কারেন্ট পয়েন্টার দ্বারা নির্ধারিত হয়।
- Runtime: jarvis-server stdio-র মাধ্যমে টুলগুলো এক্সপোজ করে, যা লেজি সিঙ্গেলটন দ্বারা সমর্থিত। প্রথম সার্চের সময় একটি zoekt-webserver স্পন করা হয় এবং একটি pidfile-এর মাধ্যমে প্রসেসগুলোর মধ্যে শেয়ার করা হয়।
কোয়েরিগুলো পাবলিশ করা ডেটাবেসটিকে রিড-অনলি মোডে ওপেন করে, তাই সার্ভিং পাথ কখনোই রাইট করে না। পাবলিশিং প্রক্রিয়াটি অ্যাটমিক; পুরনো ফাইল পড়ছে এমন একটি কোয়েরি কাজ করতে থাকে যখন একটি রি-ইনডেক্স পয়ন্টারটি পরিবর্তন করে, এবং যেকোনো ঐচ্ছিক ধাপে ব্যর্থতা হলে আগের স্ন্যাপশটটি সক্রিয় থাকে। প্রতিটি রি-ইনডেক্স রিপোজিটরির আউটগোয়িং প্যাকেজ এজগুলো জমা করার পরিবর্তে পুনরায় তৈরি করে।
নয়টি MCP টুল
goToDefinition একটি সিম্বলকে তার সংজ্ঞায়িত ফাইল এবং রেঞ্জে রেজলভ করে, যা SCIP কভারেজ থাকলে SCIP দ্বারা এবং অন্যথায় সিনট্যাক্স বেসলাইন ডিক্লারেশন দ্বারা পরিবেশন করা হয়, যেখানে প্রতিটি লোকেশন প্রোভাইডার দ্বারা ট্যাগ করা থাকে। findReferences একটি সিম্বলের উপস্থিতি তালিকাভুক্ত করে এবং এটি শুধুমাত্র SCIP-নির্ভর। callHierarchy ইনকামিং এবং আউটগোয়িং কল রিটার্ন করে, এটিও SCIP-নির্ভর। typeHierarchy সুপারটাইপ এবং সাবটাইপ রিটার্ন করে, যা SCIP-নির্ভর। documentSymbols একটি ফাইলে সংজ্ঞায়িত সিম্বলগুলোর আউটলাইন প্রদান করে, যা ফাইল অনুযায়ী SCIP আউটলাইন এবং Tree-sitter ডিক্লারেশনের মধ্যে রাউট করা হয়। searchCode Zoekt লেক্সিক্যাল বা রেগুলার-এক্সপ্রেশন সার্চ সম্পাদন করে যাতে একটি ঐচ্ছিক রিপোজিটরি ফিল্টার থাকে। semanticSearch হলো ন্যাচারাল-ল্যাঙ্গুয়েজ সার্চ যা রিসিপ্রোকাল র্যাঙ্ক ফিউশন ব্যবহার করে ভেক্টর হিট, Zoekt হিট এবং SCIP সিম্বল-ডেফিনিশন ম্যাচগুলোকে একত্রিত করে। blastRadius দেখায় যে অন্য কোন ইনডেক্স করা রিপোজিটরি একটি প্যাকেজের ওপর নির্ভর করে, সর্বোচ্চ দুই হপ পর্যন্ত। getIndexStatus পাবলিশ করা কমিট, ফ্রেশনেস, ওয়ার্কিং ট্রির বিপরীতে স্টেলনেস এবং প্রতি-টুল প্রোভাইডার ক্যাপাবিলিটি রিপোর্ট করে।
SCIP-নির্ভর টুলগুলো ডেটা না থাকলে নিঃশব্দে খালি রেজাল্ট রিটার্ন করে না; তারা প্রয়োজনীয় ক্যাপাবিলিটি, কারণ এবং একটি রিকভারি হিন্ট রিপোর্ট করে। টুলের ব্যর্থতাগুলো ট্রান্সপোর্ট এরর-এর পরিবর্তে পেলোড অবজেক্ট হিসেবে রিটার্ন করা হয়, যাতে একটি ভুল কোয়েরি stdio সার্ভারটিকে বন্ধ না করে দেয়।
ইনডেক্সিং এবং ওয়াচিং
কমান্ডগুলোর মধ্যে রয়েছে jarvis index, list, status, reindex এবং forget, সাথে ঐচ্ছিক watchdog এক্সট্রা ব্যবহার করে ডিবাউন্স (ডিফল্ট পাঁচ সেকেন্ড) সহ অটো-রি-ইনডেক্সিংয়ের জন্য jarvis watch। গিট-ট্র্যাকড ফাইলগুলোর এক্সটেনশন প্লুরালিটি থেকে ল্যাঙ্গুয়েজ ডিটেক্ট করা হয় এবং এটি --language দিয়ে ওভাররাইড করা যায়। স্ট্যাটাস ভ্যালুগুলো হলো indexing, indexed, partial, degraded এবং failed; একটি ডিগ্রেডেড রান তবুও সিনট্যাক্স বেসলাইন পাবলিশ করে এবং কারণ রেকর্ড করে জিরো এক্সিট করে।
প্রয়োজনীয়তা এবং সীমাবদ্ধতা
প্রজেক্টটি স্পষ্টভাবে এর সীমাবদ্ধতাগুলো উল্লেখ করেছে।
- শুধুমাত্র macOS এবং Linux; Windows সমর্থিত নয়।
- প্রতি রিপোজিটরিতে একটি ল্যাঙ্গুয়েজ; পলিগ্লট মনোরেপোসে যে ল্যাঙ্গুয়েজের ট্র্যাকড ফাইল সবচেয়ে বেশি সেটি ইনডেক্স করা হয়।
- বিল্ড-ফ্রি Tree-sitter বেসলাইন ১৭টি ল্যাঙ্গুয়েজ কভার করে (Python, JavaScript, TypeScript/TSX, Java, Kotlin, Swift, Go, Ruby, Rust, C, C++, C#, PHP, Scala, Bash, SQL) এবং এটি প্যাকেজের একটি pip ডিপেন্ডেন্সি হিসেবে ইনস্টল করা হয়।
- প্রিসাইজ SCIP নেভিগেশন চারটি ল্যাঙ্গুয়েজ ফ্যামিলি কভার করে: TypeScript/TSX, Python, Java/Kotlin এবং Swift।
- ঐচ্ছিক SCIP এবং Zoekt এনরিচমেন্টের জন্য একটি সেটআপ স্ক্রিপ্ট দ্বারা এক্সটারনাল বাইনারি ইনস্টল করা প্রয়োজন: scip (নূন্যতম v0.9.0), zoekt-git-index এবং zoekt-webserver, universal-ctags, scip-typescript, scip-python, scip-swift (শুধুমাত্র macOS arm64) এবং scip-java (ডিটেক্ট-অনলি, ডকার ইমেজ পুল করার আগে অনুমতি চায়)।
- ইনডেক্সিং একটি এক্সপ্লিসিট ধাপ; লাইভ কোনো বিশ্লেষণ করা হয় না।
- jarvis রিড-অনলি এবং এটি কখনোই কোড এডিট করে না। README-তে এটিকে Serena-র পরিপূরক হিসেবে রাখা হয়েছে, যা সেমান্টিক রিনেম এবং রিফ্যাক্টর হ্যান্ডেল করে।
সার্চ এবং কনফিগারেশন
semanticSearch-এর জন্য ঐচ্ছিক সেমান্টিক এক্সট্রা (lancedb এবং sentence-transformers) প্রয়োজন এবং এটি Tree-sitter-চাঙ্কড কোডের ওপর ভেক্টর সার্চের সাথে লেক্সিক্যাল রেজাল্ট ফিউজ করে। সেমান্টিক ইনডেক্সিং .gitignore মেনে চলে, ১ এমবি-র বেশি ফাইল এবং জেনারেটেড-ফাইল হিউরিস্টিকস স্কিপ করে, যা একটি include ফ্ল্যাগ দিয়ে ওভাররাইড করা সম্ভব। এনভায়রনমেন্ট ভেরিয়েবলগুলো ডেটা ডিরেক্টরি এবং এমবেডিং কোয়েরি/ডকুমেন্ট ইন্সট্রাকশন প্রিফিক্স কভার করে, যেখানে bge-m3, e5 এবং nomic-embed মডেলের জন্য অটো-ডিটেকশন রয়েছে।
README-তে আপস্ট্রিম SCIP-এর পরিচিত সীমাবদ্ধতাগুলোও নথিভুক্ত করা হয়েছে (টাইপ হায়ারার্কির জন্য ডিক্লেয়ারড কিন্তু আনরিটেন রিলেশনশিপ ডেটা, ব্যাকফিলড ডিসপ্লে নেম এবং কাইন্ড, scip-java-র Android/Gradle রিপোজিটরি ইনডেক্স করতে অক্ষমতা, Kotlin-এর জন্য সঠিক কম্পাইলার ভার্সন ম্যাচিংয়ের প্রয়োজনীয়তা এবং Maven-ভিত্তিক Java বিল্ডের জন্য bash ভার্সন রিকয়ারমেন্ট) এবং সেগুলোকে jarvis-এর বাগ হিসেবে নয় বরং আন্ডারলাইং টুলিংয়ের আচরণ হিসেবে গণ্য করা হয়েছে। প্লাগইনটির সাথে তিনটি Claude Code এজেন্ট স্কিল আসে: jarvis-setup, jarvis-use এবং jarvis-issues। প্রজেক্টটি MIT লাইসেন্সপ্রাপ্ত এবং এর টেস্ট স্যুট pytest দিয়ে চালানো হয়, যেখানে রিয়েল ইনডেক্সার বাইনারি ব্যবহার করে করা ইন্টিগ্রেশন টেস্টগুলো আলাদাভাবে চিহ্নিত করা হয়েছে।
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.