# Exercise generic construct replacements through MCP semantic_batch. stdin input.json exec semedit mcp --enable-batching stdout '"status":"ok"' cmp api/settings.go want/api/settings.go cmp api/messages_test.go want/api/messages_test.go exec go test ./api -- input.json -- {"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"semantic_batch","arguments":{"edits":[{"tool":"semantic_replace_construct","params":{"file":"api/messages_test.go","in_function":"TestMessages","kind":"loop","discriminator":"want","source":"for _, want := range []string{\"alpha\", \"beta\"} { if want == \"\" { t.Fatal(want) } }"}},{"tool":"semantic_replace_construct","params":{"file":"api/settings.go","kind":"const","symbol":"DefaultLimit","source":"const DefaultLimit = 10"}},{"tool":"semantic_replace_construct","params":{"file":"api/settings.go","kind":"var","symbol":"Revision","source":"var Revision = 2"}}]}}} -- go.mod -- module example.com/construct go 1.23 -- api/settings.go -- package api const DefaultLimit = 5 var Revision = 1 -- want/api/settings.go -- package api const DefaultLimit = 10 var Revision = 2 -- api/messages_test.go -- package api import "testing" func TestMessages(t *testing.T) { original := []string{"old"} if len(original) == 0 { t.Fatal("missing originals") } for _, want := range original { if want == "" { t.Fatal(want) } } } -- want/api/messages_test.go -- package api import "testing" func TestMessages(t *testing.T) { original := []string{"old"} if len(original) == 0 { t.Fatal("missing originals") } for _, want := range []string{"alpha", "beta"} { if want == "" { t.Fatal(want) } } }