Trong hướng dẫn này, chúng ta khám phá cách sử dụng Repowise để xây dựng trí thông minh cấp kho lưu trữ cho dự án Python nguy hiểm của nó theo cách thực tế và có thể tái tạo. Chúng tôi bắt đầu với một kho lưu trữ đã được sao chép, định cấu hình Repowise bằng thông tin xác thực LLM có sẵn và khởi tạo quy trình lập chỉ mục của nó. Sau đó, chúng tôi kiểm tra các tạo phẩm .repowise được tạo, phân tích biểu đồ kho lưu trữ bằng tính năng phát hiện PageRank và cộng đồng, kiểm tra thông tin Git, chạy tính năng phát hiện mã chết, nắm bắt các quyết định kiến trúc, tạo tệp CLAUDE.md và tương tác với các công cụ kiểu MCP của Repowise thông qua CLI. Cuối cùng, chúng tôi
Trong hướng dẫn này, chúng ta khám phá cách sử dụng Repowise để xây dựng trí thông minh cấp kho lưu trữ cho dự án Python nguy hiểm của nó theo cách thực tế và có thể tái tạo. Chúng tôi bắt đầu với một kho lưu trữ đã được sao chép, định cấu hình Repowise bằng thông tin xác thực LLM có sẵn và khởi tạo quy trình lập chỉ mục của nó. Sau đó, chúng tôi kiểm tra các tạo phẩm .repowise được tạo, phân tích biểu đồ kho lưu trữ bằng tính năng phát hiện PageRank và cộng đồng, kiểm tra thông tin Git, chạy tính năng phát hiện mã chết, nắm bắt các quyết định kiến trúc, tạo tệp CLAUDE.md và tương tác với các công cụ kiểu MCP của Repowise thông qua CLI. Cuối cùng, chúng tôi trực quan hóa các nút quan trọng nhất trong biểu đồ kho lưu trữ để hiểu rõ hơn về cấu trúc, mức độ ảnh hưởng, sự phụ thuộc và mức độ ưu tiên bảo trì của các tệp hoặc mô-đun khác nhau.
Sao chép mãĐã sao chépSử dụng trình duyệt khác
nhập os, sys, json, quy trình con, textwrap, Shutil, re
từ đường dẫn nhập pathlib
MỤC TIÊU = Đường dẫn ("/ nội dung/itsnguy hiểm")
khẳng định TARGET.exists(), "Trước tiên hãy chạy §1–§2 để sao chép kho lưu trữ đích."
os.chdir(MỤC TIÊU)
def sh(cmd, check=False, cwd=None, timeout=None, env=None):
print(f"\n$ {cmd}")
proc = subprocess.run(
cmd, shell=Đúng,
env={**os.environ, **(env hoặc {})},
cwd=cwd, text=True, timeout=hết thời gian,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
)
nếu proc.stdout:
print(proc.stdout.rstrip())
print(f" ↳ exit {proc.returncode}")
nếu kiểm tra và proc.returncode != 0:
raise RuntimeError(f"lệnh không thành công (thoát {proc.returncode}): {cmd}")
quá trình trả lại
biểu ngữ def (t):
print(f"\n{'═'*(len(t)+4)}\n {t}\n{'═'*(len(t)+4)}")
Chúng tôi bắt đầu bằng cách nhập các thư viện cần thiết, thiết lập đường dẫn kho lưu trữ đích và chuyển vào thư mục dự án nguy hiểm của nó. Chúng tôi xác định hàm trợ giúp sh() có thể tái sử dụng để chạy các lệnh shell, nắm bắt đầu ra của chúng và hiển thị mã thoát một cách rõ ràng. Chúng tôi cũng tạo một hàm banner() để mỗi phần hướng dẫn in ra một tiêu đề dễ đọc.
Sao chép mãĐã sao chépSử dụng trình duyệt khác
banner("§5 Xây dựng các lớp thông minh (đã sửa)")
sh("repowise --version")
sh("repowise init --help")
HAS_ANTHROPIC = bool(os.environ.get("ANTHROPIC_API_KEY"))
HAS_OPENAI = bool(os.environ.get("OPENAI_API_KEY"))
HAS_LLM = HAS_ANTHROPIC hoặc HAS_OPENAI
nếu HAS_ANTHROPIC:
nhà cung cấp, model = "nhân loại", "claude-sonnet-4-5"
Elif HAS_OPENAI:
nhà cung cấp, model = "openai", "gpt-4o-mini"
khác:
nhà cung cấp, model = "giả", "giả"
(MỤC TIÊU / ".repowise").mkdir(exist_ok=True)
(MỤC TIÊU / ".repowise" / "config.yaml").write_text(textwrap.dedent(f"""
nhà cung cấp: {nhà cung cấp}
mô hình: {mô hình}
embedding_model: hành trình-3
lý do: tự động
git:
co_change_commit_limit: 200
đổ lỗi_kích hoạt: đúng
mã chết:
đã bật: đúng
ngưỡng an toàn_to_delete_threshold: 0,7
bảo trì:
tầng_ngân sách: 10
""").lstrip())
print(f"Nhà cung cấp đã chọn: {provider} | LLM có sẵn: {HAS_LLM}")
init_cmd = "repowise init . --index-only" nếu không HAS_LLM khác "repowise init ."
res = sh(init_cmd, timeout=20*60)
nếu res.returncode != 0:
print("\n init vẫn thất bại. Những điều cần thử:")
print(" • pip install -U repowise (các phiên bản cũ hơn thiếu --chỉ-chỉ mục)")
print(" • đặt ANTHOPIC_API_KEY và chạy lại mà không có --index-only")
print(" • sao chép dòng lỗi ĐẦU TIÊN ở trên - nó kể câu chuyện có thật")
tăng SystemExit(1)
Chúng tôi bắt đầu giai đoạn khởi tạo Repowise bằng cách kiểm tra phiên bản đã cài đặt và xem các tùy chọn init được hỗ trợ. Chúng tôi xác định xem có khóa API Anthropic hoặc OpenAI hay không, sau đó tự động chọn cấu hình mô hình và nhà cung cấp chính xác. Chúng tôi viết tệp .repowise/config.yaml và chạy khởi tạo Repowise, sử dụng chế độ chỉ chỉ mục khi không có khóa LLM.
Sao chép mãĐã sao chépSử dụng trình duyệt khác
banner("§6 .repowise/ cây tạo tác")
cho p trong được sắp xếp((TARGET / ".repowise").rglob("*")):
nếu p.is_file():
print(f" {str(p.relative_to(TARGET)):60s} {p.stat().st_size:>9,d} B")
banner("§7 Đồ thị thông minh")
nhập mạngx dưới dạng nx
G = Không có
cho gp trong (TARGET / ".repowise").rglob("*"):
nếu gp.is_file() và gp.suffix trong {".json", ".gml", ".graphml"} và "graph" trong gp.name.low():
thử:
nếu gp.suffix == ".json":
dữ liệu = json.loads(gp.read_text())
if isinstance(data, dict) và "nút" trong dữ liệu:
G = nx.node_link_graph(dữ liệu)
Elif gp.suffix == ".gml":
G = nx.read_gml(gp)
Elif gp.suffix == ".graphml":
G = nx.read_graphml(gp)
nếu G không phải là Không:
print(f"Đã tải {gp.name}: nút {G.number_of_nodes()}, cạnh {G.number_of_edges()}")
phá vỡ
ngoại trừ Ngoại lệ là e:
print(f" ({gp.name}: {e})")
pr = {}
nếu G không phải là Không:
pr = nx.pagerank(G)
print("\n10 nút hàng đầu theo PageRank:")
với n, s trong được sắp xếp(pr.items(), key=lambda x: -x[1])[:10]:
print(f" {s:.4f} {n}")
thử:
từ networkx.algorithms.community nhập tham lam_modularity_communities
comms = list(greedy_modularity_communities(G.to_undirected()))
Đã phát hiện cộng đồng print(f"\n{len(comms)}; kích thước:",
[len(c) for c in comms[:8]])
ngoại trừ Ngoại lệ là e:
cộng đồng print(f" bị bỏ qua: {e}")
khác:
print("(không tìm thấy thành phần đồ thị nào - phiên bản của bạn có thể đặt tên khác;"
" chạy `ls -R .repowise/` để kiểm tra.)")
Chúng tôi kiểm tra cây tạo tác .repowise được tạo để hiểu những tệp Repowise tạo sau khi lập chỉ mục kho lưu trữ. Sau đó, chúng tôi tìm kiếm các tạo phẩm biểu đồ, tải biểu đồ kho lưu trữ bằng NetworkX và in số lượng nút và cạnh. Chúng tôi tính toán điểm PageRank, hiển thị các nút quan trọng nhất và phát hiện các cộng đồng để hiểu cách cơ sở mã được nhóm theo cấu trúc.
Sao chép mãĐã sao chépSử dụng trình duyệt khác
banner("§8 Git Intelligence")
sh("trạng thái cấp lại")
banner("§9 Doc Intelligence")
nếu HAS_LLM:
sh('repowise tìm kiếm "Ký mã thông báo an toàn URL"')
sh('repowise query "Người ký phát hiện các tải trọng giả mạo như thế nào?"')
khác:
print("(bỏ qua — không có bộ khóa LLM; nhà cung cấp=mock không thể trả lời các câu hỏi thực sự)")
banner("§10 Phát hiện mã chết")
sh("repowise mã chết")
sh("repowise mã chết --chỉ an toàn")
banner("§11 Quyết định kiến trúc")
src = MỤC TIÊU / "src" / "itsnguy hiểm" / "signer.py"
nếu src.exists() và "DECISION:" không có trong src.read_text():
src.write_text(
"# QUYẾT ĐỊNH: Người ký là
Nguồn tin: MarkTechPost — Tác giả: Sana Hassan. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.