Agents and Go KO - teamswyg/laya-tools GitHub Wiki

์—์ด์ „ํŠธ์™€ Go ํ”„๋กœ๊ทธ๋žจ ์—ฐ๋™

English ยท ํ™ˆ

ํ•„์š”ํ•œ ๊ฐ€์žฅ ์ž‘์€ ์ธํ„ฐํŽ˜์ด์Šค๋ถ€ํ„ฐ ์„ ํƒํ•˜์„ธ์š”. CLI ์‚ฌ์šฉ์—๋Š” ๋“ฑ๋ก์ด๋‚˜ ๋ฐฐ๊ฒฝ ์„œ๋น„์Šค๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

ํ•œ ๋ฒˆ ์š”์ฒญ: JSON

riidolaya repo-preview --catalog examples/repositories/catalog.json --json 'refund invoices'

์‚ฌ๋žŒ์šฉ ๋ฌธ์žฅ ๋Œ€์‹  JSON์„ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค. ์ข…๋ฃŒ ์ฝ”๋“œ๋ฟ ์•„๋‹ˆ๋ผ preview/status/reason์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. stderr์™€ stdout์„ ์„ž์ง€ ๋งˆ์„ธ์š”. ์‹ค์ œ ์นดํƒˆ๋กœ๊ทธ์™€ ์งˆ๋ฌธ์—๋Š” ๋น„๊ณต๊ฐœ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋กœ๊ทธ๋„ ๋น„๊ณต๊ฐœ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ๋ฒˆ ์š”์ฒญ: ์ƒ์ฃผ JSONL

๊ฒ€์ƒ‰ยท๋ชจ๋ธ ์ถ”์ฒœ:

riidolaya serve --root /path/to/repository
{"id":1,"op":"search","query":"redirect authorization","lexical":true}
{"id":2,"op":"route","query":"Fix a typo"}

์ €์žฅ์†Œ preview๋Š” ๋ณ„๋„ ํ”„๋กœ์„ธ์Šคยท์นดํƒˆ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

riidolaya repo-serve --catalog examples/repositories/catalog.json --laya
{"id":1,"query":"Fix login sessions"}
{"id":2,"query":"refund invoices"}

ํ•œ ์ค„์— JSON ํ•˜๋‚˜๋ฅผ ๋ณด๋‚ด๋ฉด ์š”์ฒญ ID๊ฐ€ ํฌํ•จ๋œ ์‘๋‹ต ํ•˜๋‚˜๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ €์žฅ์†Œ ์‘๋‹ต์€ result ์•ˆ์— preview๋ฅผ ๋‹ด๊ณ , ์˜ค๋ฅ˜๋Š” error๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ ์—†์ด ์‚ฌ์šฉํ•˜๋ ค๋ฉด --laya๋ฅผ ๋บ๋‹ˆ๋‹ค. ์ €์žฅ์†Œ ํ”„๋กœ์„ธ์Šค๋Š” ์ธ๋ฑ์Šค๋ฅผ ์œ ์ง€ํ•˜๊ณ  ํ•„์š”ํ•œ ์š”์ฒญ์—์„œ ๋ชจ๋ธ์„ ์ฒ˜์Œ ๋กœ๋”ฉํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ตฌํ˜„์—์„œ๋Š” ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ ๋ชจ๋ธ์„ ๊ณต์œ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋„์šฐ๋ฉด RAM๋„ ์ค‘๋ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋๋‚˜๋ฉด stdin์„ ๋‹ซ๊ฑฐ๋‚˜ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜์„ธ์š”.

serve๋Š” plan์ด๋‚˜ repo-preview ์š”์ฒญ์„ ๋ฐ›์ง€ ์•Š์œผ๋ฏ€๋กœ ํ”„๋กœํ† ์ฝœ์„ ์„ž์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ๊ฒ€์ƒ‰์€ ๋ชจ๋ธ์ด ์ƒ์ฃผํ•ด๋„ ์š”์ฒญ๋งˆ๋‹ค ์ฝ”๋“œ ํ›„๋ณด๋ฅผ ๋‹ค์‹œ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์„ ํƒ ์‚ฌํ•ญ: MCP

riidolaya mcp --root /path/to/repository

๋„๊ตฌ๋Š” search_code, route_model์ž…๋‹ˆ๋‹ค. ์ €์žฅ์†Œ preview์™€ planner๋Š” ํ˜„์žฌ MCP ๋„๊ตฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. Codex์— ์„ ํƒ์ ์œผ๋กœ ๋“ฑ๋กํ•˜๋ ค๋ฉด:

codex mcp add riidolaya -- /absolute/path/to/riidolaya mcp --root /absolute/path/to/repository

ํ˜„์žฌ Codex ๋ชจ๋ธ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ๊ถŒํ•œ ์„ค์ •์„ ์™„ํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„๊ตฌ์˜ ์ถ”์ฒœ์ด ์ž‘์—… ์‹คํ–‰ ํ—ˆ๊ฐ€๋ฅผ ๋œปํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ณต๊ฐœ Go ํŒจํ‚ค์ง€ import

์ €์žฅ์†Œ์—๋Š” Go ๋ชจ๋“ˆ ํ•˜๋‚˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด Go ๋ชจ๋“ˆ์—์„œ:

go get github.com/teamswyg/[email protected]

๋ชจ๋ธ ์—†๋Š” ์ €์žฅ์†Œ preview ์˜ˆ์ œ:

package main

import (
    "fmt"
    "log"
    "github.com/teamswyg/laya-tools/pkg/reporouter"
)

func main() {
    idx, err := reporouter.New([]reporouter.Repository{
        {Name: "example/billing", Summary: "Invoices and refunds"},
    })
    if err != nil { log.Fatal(err) }
    result, err := idx.Preview("refund invoices", reporouter.DefaultConfig(), nil)
    if err != nil { log.Fatal(err) }
    fmt.Println(result.Status, result.Suggested)
}

์˜ˆ์ƒ ์ถœ๋ ฅ์€ candidate example/billing์ด๋ฉฐ ์ž‘์—… ๋ฐฐ์ •์ด ์•„๋‹™๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ์—ฐ๊ฒฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ œ๊ณตํ•  ์ •๋ณด
pkg/reporouter ์ ‘๊ทผ ๊ถŒํ•œ์— ๋”ฐ๋ผ ๊ฑฐ๋ฅธ ์นดํƒˆ๋กœ๊ทธ, ์„ ํƒ์  ํŒ๋‹จ ์–ด๋Œ‘ํ„ฐ
pkg/catalog ๋Šฅ๋ ฅยทํ’ˆ์งˆยท๊ฐ€๊ฒฉ, ์˜ˆ์‚ฐ ์‚ฌ์šฉ์•ก ์Šค๋ƒ…์ƒท
pkg/switchpolicy ํ˜„์žฌ/๋Œ€์ƒ ํ”„๋กœํ•„, ํ™•์‹ ๋„, ์ปจํ…์ŠคํŠธ, ์ „ํ™˜ ์ด๋ ฅ
pkg/planner ์นดํƒˆ๋กœ๊ทธยท์ •์ฑ…ยท์š”์ฒญ. recommend/hold/blocked ๊ฒฐ๊ณผ ํ™•์ธ

์ด ํŒจํ‚ค์ง€๋Š” CGOยทPythonยท๋ชจ๋ธ ํŒŒ์ผ์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ์ถ”๋ก ์€ ๋‚ด๋ถ€ ํŒจํ‚ค์ง€์— ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ถŒํ•œยท์ƒํƒœ ์ €์žฅยท์›์ž์  ์˜ˆ์‚ฐ ์˜ˆ์•ฝยท์‹คํ–‰ยท๊ฒฐ๊ณผ ํ‰๊ฐ€๋Š” ์—ฐ๊ฒฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค. riido-daemon์— ์ด๋ฏธ ์—ฐ๊ฒฐ๋œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ •์ฑ… ์ƒ์„ธ ยท ์ €์žฅ์†Œ ์„ ํƒ ์ƒ์„ธ