Repopack: یک ابزار Node.js برای کدنویسی بدون درز با هوش مصنوعی Claude

Repopack یک ابزار Node.js است که فایل های یک پروژه را در یک فایل واحد ترکیب می کند، ابتدا برای کمک به کار با دستیاران کدنویسی هوش مصنوعی مانند Claude ایجاد شد، اما می تواند برای مقاصد دیگر نیز مفید باشد. این ابزار کدگذاری فایل را کنترل می کند، فایل های باینری را نادیده می گیرد و به الگوهای .gitignore احترام می گذارد.
هدف اصلی Repopack سادهسازی فرآیند کار با هوش مصنوعی در پروژههای کد بزرگتر است. با اجرای دستور npx repopack
می توانید فایلی به نام repopack-output.txt بسازید که تمام فایلهای پروژه شما را شامل می شود. این فایل را میتوانید به دستیار هوش مصنوعی ارسال کرده و از آن برای انجام وظایفی مانند refactoring استفاده کنید.
هنگامی که تغییرات خاصی پیشنهاد میکنید، هوش مصنوعی میتواند بر اساس آن کد تولید کند، ویژگیهایی مانند Claude’s Artifacts امکان تولید چندین قطعه کد وابسته به هم را فراهم میکند.
در صورتی که تغییرات و پیشنهادات خاصی دارید، می توانید از امکان پیکربندی در فایل برای نادیده گرفتن اهداف خاص استفاده کنید. Repopack می تواند به صورت کلی تغییرات در فایلهای شما را درک کرده و به طور بالقوه در کارهایی مانند بازنویسی و تولید کد کمک کند.
این ابزار امکان ترکیب فایلهای یک پوشه مشخص را در یک فایل واحد فراهم می کند و به جزئیاتی مانند نادیده گرفتن فایلهای باینری و احترام به الگوهای .gitignore توجه می کند. اگر به ابزاری برای سادهسازی فرآیند کار با هوش مصنوعی و تولید کد احتمالی علاقهمندید، Repopack می تواند گزینه مناسبی باشد.
TL; DR
من Repopack را ایجاد کردم، ابزار Node.js که فایل های پروژه شما را در یک سند واحد ترکیب می کند. در ابتدا برای کمک به من در کار با دستیاران کدنویسی هوش مصنوعی مانند کلود ساخته شد، اما ممکن است برای مقاصد دیگر نیز مفید باشد. کدگذاری فایل را کنترل می کند، فایل های باینری را نادیده می گیرد و به الگوهای .gitignore احترام می گذارد.
من تجربه مثبتی از کدنویسی با کلود داشتم که الهام بخش من برای ایجاد این دستور Node.js بود. هدف آن سادهسازی فرآیند کار با هوش مصنوعی در پایگاههای کد بزرگتر است. در اینجا نحوه کار آن آمده است:
با اجرای دستور زیر در ریشه مخزن فایلی به نام ایجاد می شود repopack-output.txt
:
$ npx repopack
سپس می توانید این فایل را با اعلانی مانند زیر به دستیار هوش مصنوعی ارسال کنید:
This file contains all the files in the repository combined into one. I want to refactor the code, so please review it first.
سپس هوش مصنوعی میتواند محتوای کلی را درک کند و به طور بالقوه در کارهایی مانند refactoring کمک کند.
هنگامی که تغییرات خاصی را پیشنهاد می کنید، هوش مصنوعی ممکن است بتواند بر این اساس کد تولید کند. با ویژگیهایی مانند Claude's Artifacts، میتوانید به طور بالقوه چندین فایل را خروجی بگیرید، که امکان تولید چند قطعه کد وابسته به هم را فراهم میکند.
امکانات
این ابزار فایل های زیر یک پوشه مشخص را در یک فایل واحد ترکیب می کند.
https://github.com/yamadashy/repopack
در حالی که به جزئیاتی مانند نادیده گرفتن رسیدگی می کند .gitignore
فایلهای باینری را هدف قرار میدهد و شامل عباراتی است که به هوش مصنوعی کمک میکند تا بفهمد کاری که انجام میدهد ساده است: فایلی مانند این را خروجی میدهد:
================================================================
REPOPACK OUTPUT FILE
================================================================
// Phrases to help AI understand
================
File: src/index.js
================
// File contents
================
File: src/utils.js
================
// File contents
Claude 3.5 Sonnet می تواند این ساختار ساده را به خوبی درک کند، بنابراین می تواند به راحتی از پس بازآفرینی چندین فایل برآید.
در حالی که طول زمینه ای که خدمات هوش مصنوعی می توانند پردازش کنند محدود است، این باید برای پروژه های در مقیاس کوچک کافی باشد. (لطفا از آن برای کد کار استفاده نکنید!)
می توانید اهداف نادیده گرفته شده را در فایل پیکربندی تنظیم کنید. لطفاً برای جزئیات بیشتر مخزن GitHub را بررسی کنید.
زمینه
من اخیراً با Claude Pro آزمایش کرده ام و از ویژگی Projects برای بارگذاری چندین فایل و تغییر کد آن استفاده کرده ام. کدهایی را با دقت 60 تا 95 درصد تولید می کند، که وقتی به عنوان مرجع برای بازنویسی کد استفاده می شود، بسیار کارآمد می دانم.
با این حال، ویژگی Projects اجازه آپلود مستقیم پوشه ها یا فایل های فشرده را نمی دهد. من در نظر گرفتم از مکان نما استفاده کنم، اما به دلیل پرداخت به موقع API آن تردید داشتم.
سپس این مقاله را دیدم و متوجه شدم که کلود می تواند حتی زمانی که همه چیز در یک فایل واحد باشد، درک کند، که باعث شد این ابزار را ایجاد و منتشر کنم.
https://qiita.com/kunishou/items/ed097b46cd78030e0b29
درباره توسعه
در حالی که کار خیلی پیچیده ای انجام نمی دهد، امیدوارم بتواند مفید واقع شود 🙏
محتوای فایل خروجی
فایل خروجی با متنی شروع می شود که نحوه مدیریت فایل را توضیح می دهد.
در ابتدا، من از یک ساختار ساده با مسیرهای فایل و محتویات استفاده میکردم، اما کلود گاهی اوقات در درک آن مشکل داشت. با افزودن «هدف فایل»، «فرمت»، «روش مدیریت» و «یادداشتهای دیگر» در ابتدا، کلود توانست با دقت بیشتری متوجه شود.
بهینه سازی توکن
برای جداکننده فایل ها به Tokenizer ChatGPT مراجعه کردم و از 16 و 64 استفاده کردم. =
کاراکترهایی که به عنوان 1 نشانه به حساب می آیند.
https://platform.openai.com/tokenizer
تعداد توکن ممکن است برای ChatGPT-4 یا Claude متفاوت باشد، اما من چیزی مشابه را هدف قرار دادم.
پیاده سازی CLI
من استفاده کردم commander
کتابخانه برای ایجاد ابزار خط فرمان. من میتوانستم از یارگ استفاده کنم، اما نحو ساده فرمانده و تولید خودکار کمک را دوست دارم.
برای دریافت نسخه ابزار، از package.json مطالعه کردم. برای اطمینان از سازگاری با نسخه های قدیمی Node.js، من از fs برای خواندن مستقیم آن به جای import استفاده می کنم. همچنین، از آنجا که __dirname
در ماژول های ES موجود نیست و import.meta.dirname
در برخی نسخه ها پشتیبانی نمی شود، من از یک روش کمی مشکل استفاده می کنم:
import * as url from "url";
const dirName = url.fileURLToPath(new URL(".", import.meta.url));
انتشار به عنوان بسته npm
برای انتشار آسان نسخه های جدید به npm، این اسکریپت ها را به package.json اضافه کردم:
"npm-publish": "npm run lint && npm run test-coverage && npm run build && npm publish",
"npm-release-patch": "npm version patch && npm run npm-publish",
"npm-release-minor": "npm version minor && npm run npm-publish",
"npm-release-prerelease": "npm version prerelease && npm run npm-publish"
این npm version
دستور به طرز شگفت آوری مفید است.
رمزگذاری فایل
از آنجایی که این ابزار نباید فایل های باینری را بخواند، من از مسیر is-binary برای نادیده گرفتن باینری ها و jschardet و iconv-lite برای مدیریت صحیح کدگذاری استفاده می کنم.
نادیده گرفتن فایل
برای نادیده گرفتن فایل های خاص، بسته ignore مفید است. اجرای فیلتر الگوی .gitignore مانند را آسان می کند:
function createIgnoreFilter(patterns: string[]): (path: string) => boolean {
const ig = ignore.add(patterns);
return (filePath: string) => !ig.ignores(filePath);
}
نتیجه
این یک ابزار ساده است که من ایجاد کردم زیرا به آن نیاز داشتم. در حالی که اگر منتظر باشیم، کلود احتمالاً ویژگیهای آپلود پوشه و فشرده را اجرا خواهد کرد، من معتقدم که این ابزار میتواند به طور جهانی با تعداد رو به رشد خدمات تولید هوش مصنوعی مورد استفاده قرار گیرد.
اگر آن را امتحان کنید خوشحال می شوم که بازخورد شما را دریافت کنم!