คุณกำลังตามล่าทุกการเรียก .unwrap() ในโค้ดเบส Rust เพราะในที่สุดคุณก็ย้ายมาใช้การจัดการ error ที่เหมาะสม คุณ grep ดู ได้ผลลัพธ์ 47 รายการ

สิบสองอยู่ในคอมเมนต์ (// don't unwrap here) แปดอยู่ในสตริง ("call unwrap() to extract") สามเป็นชื่อตัวแปร (let unwrap_result = ...) แล้วการเรียกเมธอดจริง ๆ ที่คุณต้องการล่ะ? ฝังอยู่ในเสียงรบกวน

การค้นหาแบบข้อความค้นหาตัวอักษร ไม่ใช่ความหมาย มันบอกไม่ได้ว่าอันไหนเป็นการเรียกเมธอดและอันไหนเป็นคอมเมนต์ ตัวแปรหรือสตริงลิเทอรัล Rust หรือ Ruby มันแค่จับคู่ไบต์

Octocode 0.14.0 แก้ปัญหานี้ การค้นหาเชิงโครงสร้าง — การจับคู่รูปแบบที่ขับเคลื่อนด้วย AST ซึ่งเข้าใจโค้ดของคุณจริง ๆ คิดว่าเป็น grep ที่รู้ว่ามันกำลังดูอะไรอยู่ ไม่ต้องติดตั้งเครื่องมือเพิ่ม ไม่ต้องสู้กับไฟล์คอนฟิก แค่ octocode grep แล้วคุณก็จับคู่โครงสร้าง ไม่ใช่สตริง


ทำไมการค้นหาแบบข้อความถึงไม่เพียงพอ

การค้นหาแบบข้อความปฏิบัติต่อโค้ดเหมือนไฟล์ข้อความอื่น ๆ มันไม่เข้าใจว่า $VAR.unwrap() ควรจับคู่กับการเรียกเมธอดจริงบน Result หรือ Option — ไม่ใช่ซับสตริงที่ซ่อนอยู่ในคอมเมนต์เอกสาร

การค้นหาเชิงโครงสร้างรู้ความแตกต่าง มันทำงานบน Abstract Syntax Tree — การแสดงตัวเดียวกับที่คอมไพเลอร์ของคุณใช้ — ดังนั้นรูปแบบจึงจับคู่กับโครงสร้างโค้ดจริง ไม่ใช่ลำดับของตัวอักษร

คุณพบสิ่งที่คุณกำลังมองหา ไม่ใช่ false positive ไม่ใช่เสียงรบกวน แค่โค้ดที่สำคัญ


พบกับ octocode grep

# ค้นหาการเรียก unwrap() ทั้งหมดใน Rust
octocode grep '$VAR.unwrap()' --lang rust

# ค้นหารูปแบบ constructor ใน JavaScript
octocode grep 'new $CLASS($$$ARGS)' --lang javascript

# ค้นหารูปแบบการจัดการ error ใน Go
octocode grep 'if err != nil { $$$ }' --lang go

ไวยากรณ์ของรูปแบบนั้นง่าย:

  • $VAR — โหนด AST เดี่ยวใด ๆ (expression, identifier, อะไรก็ได้)
  • $$$ARGS — โหนดศูนย์ตัวขึ้นไป (function arguments, statement blocks)
  • โค้ดลิเทอรัล — จับคู่โครงสร้างแบบเป๊ะ ๆ

รองรับ 13 ภาษา: Rust, JavaScript, TypeScript, Python, Go, Java, C/C++, PHP, Ruby, Lua, Bash, CSS, JSON


ความสามารถในการเขียนใหม่

นี่คือจุดที่น่าสนใจ การค้นหาเชิงโครงสร้างไม่ใช่แค่สำหรับค้นหา — มันสำหรับรีแฟกเตอร์

# พรีวิว: แทนที่ unwrap() ด้วย expect() ทั่วทั้งโค้ดเบส
octocode grep '$FUNC.unwrap()' \
  --lang rust \
  --rewrite '$FUNC.expect("reason")'

# นำการเปลี่ยนแปลงไปใช้ในที่
octocode grep '$FUNC.unwrap()' \
  --lang rust \
  --rewrite '$FUNC.expect("reason")' \
  --update-all

เทมเพลต --rewrite ใช้ metavariable จากรูปแบบการค้นหาของคุณ $FUNC ในการเขียนใหม่จะถูกแทนที่ด้วยอะไรก็ตามที่ตรงกับ $FUNC ในการค้นหา รีแฟกเตอร์แบบศัลยกรรม — แม่นยำ อัตโนมัติ และปลอดภัย

ทำไมเรื่องนี้สำคัญสำหรับ AI: เมื่อ Claude หรือ Cursor แนะนำว่า "เราควรแทนที่การเรียก unwrap ทั้งหมดเหล่านี้ด้วยการจัดการ error ที่เหมาะสม" ตอนนี้มัน ทำได้จริง ๆ — ไม่ใช่แค่อธิบายการเปลี่ยนแปลง แต่สร้างคำสั่งที่แน่นอนเพื่อทำให้มันเกิดขึ้น


สร้างมาสำหรับ AI Agent (ไม่ต้องตั้งค่าเพิ่ม)

การค้นหาเชิงโครงสร้างเปิดเผยเป็นเครื่องมือ MCP ชื่อ structural_search ผู้ช่วย AI ของคุณสามารถใช้มันได้โดยตรง:

{
	"name": "structural_search",
	"description": "AST-based structural code search using ast-grep patterns"
}

เครื่องมือค้นหา AST อื่น ๆ ต้องการการติดตั้งและการคอนฟิกแยกต่างหาก การค้นหาเชิงโครงสร้างของ Octocode ทำงานได้ทันที ไม่ต้องติดตั้ง CLI sg ไม่มีไฟล์กฎ ไม่มี YAML รูปแบบใส่ลงไปในคิวรีโดยตรง

AI Agent ทำงานได้ดีที่สุดด้วยชิ้นส่วนที่เคลื่อนไหวน้อยลง การพึ่งพาภายนอกทุกตัวคือจุดที่อาจล้มเหลว ไฟล์คอนฟิกทุกไฟล์คือความฝืด การค้นหาเชิงโครงสร้างใน Octocode แค่... อยู่ตรงนั้น พร้อมใช้งาน


มีอะไรใหม่อีกใน 0.14.0

สถาปัตยกรรมการค้นหาแบบรวม

เราเขียนระบบค้นหาใหม่ตั้งแต่ต้น Delta indexing ที่รู้จัก branch หมายความว่าการค้นหาใน feature branch ตอนนี้รวมผลลัพธ์เข้ากับ index หลักได้อย่างถูกต้อง — คุณเห็นสิ่งที่อยู่ใน branch ปัจจุบัน บวก บริบทที่เกี่ยวข้องจาก main สถาปัตยกรรมแบบรวมยังนำการครอบคลุมเทสต์มาในที่ที่ไม่เคยมีมาก่อน

โมเดล embedding มากขึ้น

เพิ่มการรองรับ embeddings MPNet และ JinaBERT QK — โมเดลประสิทธิภาพสูงที่ตีได้แรงกว่าคลาสน้ำหนัก สำหรับทีมที่จับตาดูค่าใช้จ่าย API โมเดลเหล่านี้ให้ผลการค้นหาคุณภาพดีด้วยโมเดลที่เล็กกว่าและเร็วกว่า

การปรับปรุง MCP Server

  • Schema เครื่องมือที่ดีขึ้น — Output ที่มีโครงสร้างดีขึ้นสำหรับการบริโภคโดย AI
  • การ index repository อัตโนมัติ — MCP server ตอนนี้สามารถ trigger การ index อัตโนมัติเมื่อตรวจพบ repository ที่ยังไม่ได้ index
  • Transport layer ที่ดีขึ้น — ย้ายไปยัง SDK rmcp อย่างเป็นทางการเพื่อความเสถียรที่ดีขึ้น

ความน่าเชื่อถือในระดับสเกล

  • Output LLM แบบมีโครงสร้างที่เข้มงวด — โหมด JSON พร้อมการตรวจสอบทำให้แน่ใจว่าการตอบสนองของ AI ถูก parse อย่างถูกต้อง
  • การลองใหม่อัตโนมัติ — การดำเนินการแบบ batch ลองใหม่เมื่อเกิดความล้มเหลวชั่วคราว
  • การประมวลผล batch ที่ดีขึ้น — ประสิทธิภาพหน่วยความจำที่ดีขึ้นสำหรับโค้ดเบสขนาดใหญ่

คำสั่ง Clear ได้พลังมากขึ้น

คำสั่ง clear ตอนนี้รองรับการล้างแบบเจาะจง:

# ล้างเฉพาะ commit index
octocode clear --mode commits

# ล้างเฉพาะข้อมูล GraphRAG
octocode clear --mode graphrag

ลองตอนนี้

อัปเดตเป็น 0.14.0:

# Homebrew
brew upgrade octocode

# หรือติดตั้งใหม่ด้วย universal installer
curl -fsSL https://raw.githubusercontent.com/Muvon/octocode/master/install.sh | sh

จากนั้นลองการค้นหาเชิงโครงสร้างบนโค้ดเบสของคุณ:

# ค้นหารูปแบบที่ควรรีแฟกเตอร์
octocode grep 'console.log($ARG)' --lang javascript

# ตรวจสอบช่องว่างการจัดการ error
octocode grep '$VAR.unwrap()' --lang rust

# ค้นหารูปแบบการ inject แบบ constructor
octocode grep 'new $CLASS($$$)' --lang typescript

คำถามที่พบบ่อย

อะไรทำให้การค้นหาเชิงโครงสร้างต่างจาก regex?

Regex จับคู่ตัวอักษร การค้นหาเชิงโครงสร้างจับคู่โหนด AST $VAR.unwrap() ค้นหาการเรียกเมธอดจริง ไม่ใช่คอมเมนต์ที่มีสตริงนั้น ไม่ใช่ชื่อตัวแปรที่บังเอิญมี "unwrap" ไม่ใช่ตัวอย่างจากเอกสาร มันเข้าใจโครงสร้างโค้ดเพราะมัน parse โค้ดในแบบเดียวกับที่คอมไพเลอร์ของคุณทำ

ฉันต้องติดตั้งอะไรเพิ่มไหม?

ไม่ การค้นหาเชิงโครงสร้างสร้างมาในตัว Octocode 0.14.0 ไม่มี CLI tool แยก ไม่มีไฟล์คอนฟิก ไม่มีการกำหนดกฎ YAML คำสั่ง octocode grep ทำงานได้ทันทีหลังอัปเกรด

ฉันใช้สิ่งนี้กับ Claude, Cursor หรือผู้ช่วย AI อื่น ๆ ได้ไหม?

ได้ การค้นหาเชิงโครงสร้างเปิดเผยเป็นเครื่องมือ MCP ผู้ช่วยที่เข้ากันได้กับ MCP ใด ๆ สามารถเรียกใช้ได้โดยตรง Schema ของเครื่องมือรวมภาษาของรูปแบบ ดังนั้นผู้ช่วย AI จึงเข้าใจวิธีสร้างคิวรีที่ถูกต้อง

รองรับภาษาอะไรบ้าง?

Rust, JavaScript, TypeScript, Python, Go, Java, C/C++, PHP, Ruby, Lua, Bash, CSS และ JSON เอนจินเบื้องล่างใช้ไวยากรณ์ Tree-sitter ดังนั้นการเพิ่มภาษาใหม่จึงตรงไปตรงมาหากคุณต้องการภาษาที่ไม่อยู่ในรายการ

--rewrite ทำงานอย่างไร?

เทมเพลตการเขียนใหม่ใช้ metavariable จากรูปแบบการค้นหาของคุณ หากการค้นหาของคุณคือ $FUNC.unwrap() และตรงกับ result.unwrap() แล้ว $FUNC จะ capture result การเขียนใหม่ $FUNC.expect("reason") กลายเป็น result.expect("reason") รันด้วย --update-all เพื่อนำการเปลี่ยนแปลงไปใช้ในที่ หรือไม่มีมันเพื่อพรีวิวก่อน

ปลอดภัยที่จะรันบนโค้ดโปรดักชันไหม?

พรีวิวการเปลี่ยนแปลงก่อนนำไปใช้เสมอ การค้นหาเชิงโครงสร้างแม่นยำ แต่ความแม่นยำไม่ได้หมายความว่าการเปลี่ยนแปลงนั้นถูกต้องในเชิงความหมายสำหรับ use case ของคุณ ตรวจสอบ output ของ --rewrite รันเทสต์ของคุณ commit ลง git ก่อน เครื่องมือนี้เป็นเหมือนศัลยกรรม — คุณยังคงรับผิดชอบในการรู้ว่าการผ่าตัดควรบรรลุอะไร

ประสิทธิภาพเป็นอย่างไร?

เร็ว การ parse AST เกิดขึ้นผ่าน Tree-sitter ซึ่งออกแบบมาเพื่อการตอบสนองของ editor การค้นหาโค้ดเบส 100,000 บรรทัดใช้เวลาเป็นวินาที ไม่ใช่นาที การค้นหาทำงานแบบขนานข้ามไฟล์และการ index แบบ incremental หมายความว่าการค้นหาครั้งต่อ ๆ ไปจะเร็วขึ้น

สิ่งนี้เข้ากับฟีเจอร์อื่น ๆ ของ Octocode อย่างไร?

การค้นหาเชิงโครงสร้างเสริมการค้นหาเชิงความหมายและ GraphRAG ใช้การค้นหาเชิงความหมายเมื่อคุณรู้ว่าคุณกำลังมองหาอะไรแต่ไม่รู้ว่าที่ไหน ("how does authentication work?") ใช้การค้นหาเชิงโครงสร้างเมื่อคุณรู้รูปแบบ ($USER.auth($TOKEN)) ใช้ GraphRAG เมื่อคุณต้องการเข้าใจความสัมพันธ์ระหว่างไฟล์ ทั้งหมดร่วมกันครอบคลุมสเปกตรัมเต็มของการสำรวจโค้ด


ต่อไปคืออะไร

เรากำลังสร้างไปสู่สิ่งเดียว: ทำให้ AI เข้าใจโค้ดเบสได้อย่างสมบูรณ์ การค้นหาเชิงโครงสร้างเป็นชิ้นส่วนล่าสุด แต่ยังมีอีกมากที่จะมา

รูปแบบการรีแฟกเตอร์หลายไฟล์ การติดตามสัญลักษณ์ข้ามภาษา การผสานรวม MCP ที่ลึกขึ้นเพื่อให้ผู้ช่วย AI ไม่เพียงแค่ ค้นหา โค้ด แต่ แปลง มันด้วยความมั่นใจ

หากคุณใช้ Octocode อยู่ อัปเกรดเป็น 0.14.0 และลอง octocode grep บนโค้ดเบสของคุณ หากคุณยังไม่ได้ใช้ — รับได้ที่นี่ มันเป็นโอเพนซอร์ส ทำงานในเครื่อง และเป็นสิ่งที่เราใช้ทุกวันในการสร้าง Octomind


Octocode เป็นโอเพนซอร์ส (Apache 2.0) และมีอยู่ที่ github.com/Muvon/octocode สร้างโดย Muvon