{"id":487187,"date":"2026-07-14T07:01:27","date_gmt":"2026-07-14T07:01:27","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=487187"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=487187","title":{"rendered":"\u041f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 Claude Code \u043d\u0430 Python: LLM, \u0446\u0438\u043a\u043b \u0438 \u0441\u0435\u043c\u044c \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u043b\u0447\u0430\u0442 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u044b"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d6e\/c04\/151\/d6ec04151bfa8a440aff62133e8cc1b5.jpg\" width=\"6048\" height=\"4032\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d6e\/c04\/151\/d6ec04151bfa8a440aff62133e8cc1b5.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d6e\/c04\/151\/d6ec04151bfa8a440aff62133e8cc1b5.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0421\u0430\u043c\u044b\u0439 \u0446\u0438\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u043e \u043a\u043e\u0434\u0438\u043d\u0433-\u0430\u0433\u0435\u043d\u0442\u043e\u0432, \u00abHow to Build an Agent\u00bb \u0422\u043e\u0440\u0441\u0442\u0435\u043d\u0430 \u0411\u0430\u043b\u043b\u0430, \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u0435\u043d \u0438 \u0432\u0440\u0435\u0434\u0435\u043d \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. \u041f\u0440\u0435\u043a\u0440\u0430\u0441\u0435\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u0438\u0441\u0442\u0438\u043a\u0443: \u0430\u0433\u0435\u043d\u0442 \u044d\u0442\u043e LLM, \u0446\u0438\u043a\u043b \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u043e\u043a\u0435\u043d\u043e\u0432, 400 \u0441\u0442\u0440\u043e\u043a, \u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0436\u0435 \u043f\u0440\u0430\u0432\u0438\u0442 \u0432\u0430\u0448\u0438 \u0444\u0430\u0439\u043b\u044b. \u0412\u0440\u0435\u0434\u0435\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e. \u0410 \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043e\u0434\u043d\u0430 \u0434\u0435\u0441\u044f\u0442\u0430\u044f \u043f\u0443\u0442\u0438.<\/p>\n<p>\u042f \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b \u043d\u0430 \u0441\u0435\u0431\u0435. \u041f\u0440\u043e\u0448\u0451\u043b \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u0437\u0430 \u0432\u0435\u0447\u0435\u0440, \u043f\u043e\u0440\u0430\u0434\u043e\u0432\u0430\u043b\u0441\u044f \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 fizzbuzz.js, \u0430 \u0447\u0435\u0440\u0435\u0437 \u0434\u0432\u0430 \u0434\u043d\u044f \u0432\u044b\u043a\u0438\u043d\u0443\u043b \u0430\u0433\u0435\u043d\u0442\u0430 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043a \u043d\u0435\u043c\u0443 \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0441\u044f. \u0418\u0433\u0440\u0443\u0448\u043a\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0430 \u0444\u0430\u0439\u043b\u044b \u0431\u0435\u0437 \u043f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430, \u043d\u0435 \u0443\u043c\u0435\u043b\u0430 \u0438\u0441\u043a\u0430\u0442\u044c \u043f\u043e \u043a\u043e\u0434\u0443 \u0438 \u0437\u0430\u0445\u043b\u0451\u0431\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c \u043d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435. \u041e\u0434\u043d\u0430\u0436\u0434\u044b \u043e\u043d\u0430 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b \u0431\u044d\u043a\u0430\u043f\u044b. \u0414\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0442\u0430\u043a\u043e\u043c\u0443 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u043d\u0438\u043a\u0442\u043e \u0432 \u0437\u0434\u0440\u0430\u0432\u043e\u043c \u0443\u043c\u0435, \u0438 \u0432 \u044d\u0442\u043e\u043c \u0447\u0435\u0441\u0442\u043d\u043e\u043c \u043f\u0440\u0438\u0437\u043d\u0430\u043d\u0438\u0438 \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0431\u0438\u0434\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0411\u0430\u043b\u043b\u0430: \u043e\u043d \u0438 \u043d\u0435 \u043e\u0431\u0435\u0449\u0430\u043b \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043e\u043d \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043f\u0440\u0438\u043d\u0446\u0438\u043f.<\/p>\n<p>\u041c\u0435\u043d\u044f \u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0434\u0435\u0432\u044f\u0442\u044c \u0434\u0435\u0441\u044f\u0442\u044b\u0445: \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442 \u0434\u0435\u043c\u043e \u043e\u0442 Claude Code, Aider \u0438 Amp. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u0430\u0433\u0435\u043d\u0442\u0430 \u043d\u0430 Python \u0441 \u043d\u0443\u043b\u044f \u0438 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0438\u0445: \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043a\u043e\u0434\u0443, \u0434\u0438\u0444\u0444\u044b \u0441 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c, \u043c\u043e\u0434\u0435\u043b\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0434\u043b\u044f shell, \u0447\u0435\u043a\u043f\u043e\u0438\u043d\u0442\u044b \u0447\u0435\u0440\u0435\u0437 git, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 400 \u0441\u0442\u0440\u043e\u043a, \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0440\u0430\u0431\u043e\u0447\u0438\u0439, \u043f\u043e\u043b\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043b\u0435\u0436\u0438\u0442 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 (\u0441\u0441\u044b\u043b\u043a\u0430 \u0432 \u043a\u043e\u043d\u0446\u0435).<\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0430. \u042d\u0442\u043e \u043d\u0435 \u00ab\u0443\u0431\u0438\u0439\u0446\u0430 Claude Code\u00bb \u0438 \u043d\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442. \u042d\u0442\u043e \u0443\u0447\u0435\u0431\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0447\u0435\u0441\u0442\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0438\u0437 \u043a\u0430\u043a\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0430\u0433\u0435\u043d\u0442. \u041a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437 \u043d\u0438\u0445 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u043a\u0443\u0447\u043d\u043e\u0435. \u0412\u043c\u0435\u0441\u0442\u0435 \u043e\u043d\u0438 \u043c\u0435\u043d\u044f\u044e\u0442 \u0432\u0441\u0451.<\/p>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 \u0432\u0441\u0435 \u0430\u0433\u0435\u043d\u0442\u044b \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0441\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043f\u0443\u0441 \u0441 \u043b\u044e\u0431\u043e\u0433\u043e \u043a\u043e\u0434\u0438\u043d\u0433-\u0430\u0433\u0435\u043d\u0442\u0430, \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435. \u041c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 JSON-\u0441\u0445\u0435\u043c\u0430\u043c\u0438. \u041e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043b\u0438\u0431\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u043b\u0438\u0431\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u00ab\u0432\u044b\u0437\u043e\u0432\u0438 \u043c\u043d\u0435 \u0432\u043e\u0442 \u044d\u0442\u043e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0441 \u0432\u043e\u0442 \u044d\u0442\u0438\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438\u00bb. \u0412\u0430\u0448 \u043a\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u044b\u0437\u043e\u0432, \u043a\u043b\u0430\u0434\u0451\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0438 \u0441\u043d\u043e\u0432\u0430 \u0434\u0451\u0440\u0433\u0430\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c. \u0418 \u0442\u0430\u043a \u043f\u043e \u043a\u0440\u0443\u0433\u0443, \u043f\u043e\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435 \u0440\u0435\u0448\u0438\u0442, \u0447\u0442\u043e \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0430.<\/p>\n<p>\u0412\u0441\u0451. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0443 \u043d\u0435\u0451 \u043f\u0440\u043e\u0441\u0442\u044b\u0435: \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0444\u0430\u0439\u043b, \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0444\u0430\u0439\u043b, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443. \u0421\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u00ab\u0432\u044b\u043f\u0443\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u043e\u0448\u0438\u0431\u043e\u043a\u00bb \u0438 \u00ab\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438\u00bb, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0430\u043a \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u0435\u0442 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0436\u0438\u0432\u0451\u0442 \u043d\u0435 \u0432 \u0432\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435, \u0430 \u0432 \u0432\u0435\u0441\u0430\u0445 \u043c\u043e\u0434\u0435\u043b\u0438. \u0412\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043a\u0440\u043e\u043c\u043d\u0435\u0435: \u043d\u0435 \u043c\u0435\u0448\u0430\u0442\u044c \u0435\u0439 \u0438 \u0432\u043e\u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u0430\u0445\u043e\u0432\u044b\u0432\u0430\u0442\u044c.<\/p>\n<p>\u041e\u0442\u0441\u044e\u0434\u0430 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u0430\u0436\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0445\u043e\u0447\u0443 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u0447\u043a\u0443. \u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u0433\u0435\u043d\u0442\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0445\u0438\u0442\u0440\u043e\u0441\u0442\u044c\u044e \u0446\u0438\u043a\u043b\u0430, \u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c. \u041f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u0447\u0442\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430\u0443\u0433\u0430\u0434. \u0414\u0438\u0444\u0444 \u0432\u043c\u0435\u0441\u0442\u043e \u00ab\u0444\u0430\u0439\u043b \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d\u00bb. \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0441\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043a \u043e\u0434\u043d\u043e\u043c\u0443: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0440\u0435\u0434\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443 \u043d\u0435 \u0441\u0442\u0440\u0430\u0448\u043d\u043e.<\/p>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h3>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u044b\u0440\u044f\u0442\u044c \u0432 \u043a\u043e\u0434, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0446\u0435\u043b\u0438\u043a\u043e\u043c.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2d9\/5f3\/7ff\/2d95f37ffe56ecc2cd33ee06cb45a916.png\" alt=\"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u0434\u0438\u043d\u0433 \u0430\u0433\u0435\u043d\u0442\u0430\" title=\"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u0434\u0438\u043d\u0433 \u0430\u0433\u0435\u043d\u0442\u0430\" width=\"1886\" height=\"1210\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/2d9\/5f3\/7ff\/2d95f37ffe56ecc2cd33ee06cb45a916.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2d9\/5f3\/7ff\/2d95f37ffe56ecc2cd33ee06cb45a916.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u0434\u0438\u043d\u0433 \u0430\u0433\u0435\u043d\u0442\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u043b\u0435\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 REPL. \u0412 \u0446\u0435\u043d\u0442\u0440\u0435 \u0430\u0433\u0435\u043d\u0442\u043d\u044b\u0439 \u0446\u0438\u043a\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u0438 \u0433\u043e\u043d\u044f\u0435\u0442 \u0435\u0451 \u0432 Claude API. \u041a \u0446\u0438\u043a\u043b\u0443 \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0435\u043d\u044b \u0434\u0432\u0430 \u043a\u043e\u043d\u0442\u0443\u0440\u0430: Context Manager \u0441\u043b\u0435\u0434\u0438\u0442, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043d\u0435 \u0440\u0430\u0437\u0440\u043e\u0441\u043b\u0430\u0441\u044c \u0434\u043e \u043e\u0442\u043a\u0430\u0437\u0430, \u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u043f\u0442 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0432\u043f\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 <a href=\"http:\/\/AGENT.md\" rel=\"noopener noreferrer nofollow\">AGENT.md<\/a>.<\/p>\n<p>\u0412\u043d\u0438\u0437\u0443 \u0440\u0435\u0435\u0441\u0442\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0418\u0445 \u0448\u0435\u0441\u0442\u044c: grep \u0438 glob_files \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430, read_file \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f, edit_file \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u043e\u043a, run_command \u0434\u043b\u044f shell \u0438 update_plan \u0434\u043b\u044f \u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u0447. \u0414\u0432\u0430 \u0438\u0437 \u043d\u0438\u0445, edit_file \u0438 run_command, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0447\u0435\u0440\u0435\u0437 Permission Gate: \u043b\u044e\u0431\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0438\u0444\u0444\u043e\u043c \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f, \u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432\u043d\u0435 \u0431\u0435\u043b\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u0421\u043f\u0440\u0430\u0432\u0430 \u0447\u0435\u043a\u043f\u043e\u0438\u043d\u0442\u044b: \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0430\u0433\u0435\u043d\u0442 \u0434\u0435\u043b\u0430\u0435\u0442 git-\u043a\u043e\u043c\u043c\u0438\u0442, \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \/undo \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0451 \u043e\u0434\u043d\u0438\u043c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435\u043c.<\/p>\n<h3>\u0420\u0435\u0435\u0441\u0442\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432: \u0441\u0445\u0435\u043c\u0430 \u0438\u0437 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439, \u0430 \u043d\u0435 JSON \u0440\u0443\u043a\u0430\u043c\u0438<\/h3>\n<p>\u0412 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0435 \u0411\u0430\u043b\u043b\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e: \u0438\u043c\u044f, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, JSON-\u0441\u0445\u0435\u043c\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0414\u043b\u044f \u0442\u0440\u0451\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0442\u0435\u0440\u043f\u0438\u043c\u043e. \u0414\u043b\u044f \u0448\u0435\u0441\u0442\u0438 \u0443\u0436\u0435 \u0431\u043e\u043b\u044c\u043d\u043e, \u0430 \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043d\u0430\u0447\u043d\u0451\u0442\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c (\u0430 \u0432\u044b \u043d\u0430\u0447\u043d\u0451\u0442\u0435), \u0440\u0443\u0447\u043d\u044b\u0435 \u0441\u0445\u0435\u043c\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u044f\u0442\u0441\u044f \u0432 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0433\u043b\u0443\u043f\u044b\u0445 \u0431\u0430\u0433\u043e\u0432: \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043b\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0437\u0430\u0431\u044b\u043b\u0438 \u0432 \u0441\u0445\u0435\u043c\u0435, \u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0447\u0430\u0441 \u0437\u043e\u0432\u0451\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0441\u043e \u0441\u0442\u0430\u0440\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430.<\/p>\n<p>Python \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e. \u0423 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0451 \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430: \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438 \u0442\u0438\u043f\u043e\u0432 \u0438 docstring. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c Pydantic \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e JSON-\u0441\u0445\u0435\u043c\u0443:<\/p>\n<pre><code class=\"python\">import inspectfrom dataclasses import dataclassfrom typing import Callablefrom pydantic import create_model@dataclassclass Tool:    name: str    description: str    input_schema: dict    handler: CallableREGISTRY: dict[str, Tool] = {}def tool(fn: Callable) -&gt; Callable:    \"\"\"\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440: \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0430\u0433\u0435\u043d\u0442\u0430.\"\"\"    sig = inspect.signature(fn)    fields = {}    for pname, param in sig.parameters.items():        annotation = param.annotation        if annotation is inspect.Parameter.empty:            annotation = str        default = param.default        if default is inspect.Parameter.empty:            default = ...        fields[pname] = (annotation, default)    schema = create_model(f\"{fn.__name__}_input\", **fields).model_json_schema()    schema.pop(\"title\", None)    REGISTRY[fn.__name__] = Tool(        name=fn.__name__,        description=inspect.getdoc(fn) or \"\",        input_schema=schema,        handler=fn,    )    return fn<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u043e\u043c:<\/p>\n<pre><code class=\"python\">@tooldef glob_files(pattern: str) -&gt; str:    \"\"\"\u041d\u0430\u0439\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u043f\u043e glob-\u0448\u0430\u0431\u043b\u043e\u043d\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 '**\/*.py'.    \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e \u0434\u0430\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0441\u0432\u0435\u0436\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443.\"\"\"    hits = [        p for p in WORKDIR.glob(pattern)        if p.is_file() and \".git\" not in p.parts    ]    hits.sort(key=lambda p: p.stat().st_mtime, reverse=True)    listing = \"\\n\".join(str(p.relative_to(WORKDIR)) for p in hits[:200])    return listing or \"\u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0434\u0432\u0435 \u043c\u0435\u043b\u043e\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u043c\u0435\u043b\u043e\u0447\u0438.<\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f: docstring \u0437\u0434\u0435\u0441\u044c \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043d\u0435 \u0434\u043b\u044f \u043a\u043e\u043b\u043b\u0435\u0433, \u0430 \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438. \u042d\u0442\u043e \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u043c\u043f\u0442\u0430. \u00ab\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e \u0434\u0430\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0441\u0432\u0435\u0436\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443\u00bb \u044d\u0442\u043e \u043d\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f, \u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430: \u0435\u0441\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u0449\u0435\u0442 \u00ab\u0442\u043e\u0442 \u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0438\u00bb, \u043e\u043d\u0430 \u043f\u043e\u0439\u043c\u0451\u0442, \u0447\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0432\u0435\u0440\u0445 \u0441\u043f\u0438\u0441\u043a\u0430.<\/p>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f: \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e mtime. \u042f \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u0451\u043c \u0432 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 Claude Code \u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435 \u043f\u043e\u043d\u044f\u043b, \u0437\u0430\u0447\u0435\u043c \u043e\u043d. \u0410 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043c\u0435\u0442\u0438\u043b \u043d\u0430 \u0441\u0432\u043e\u0438\u0445 \u0441\u0435\u0441\u0441\u0438\u044f\u0445: \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u00ab\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u043b\u0438\u00bb, \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438 \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0434\u0430\u0447\u0438. \u041e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u0441 sort, \u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u0439 \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435.<\/p>\n<h3>\u041f\u043e\u0438\u0441\u043a: \u0430\u0433\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0432 grep, \u0447\u0438\u0442\u0430\u0435\u0442 \u0432\u0441\u043b\u0435\u043f\u0443\u044e<\/h3>\n<p>\u042d\u0442\u043e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0430\u0433\u0435\u043d\u0442\u0430 \u0438\u0437 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0430. \u0422\u0430\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0433\u043b\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0445 \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u041d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438\u0437 \u043f\u044f\u0442\u0438 \u0444\u0430\u0439\u043b\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438\u0437 \u043f\u044f\u0442\u0438 \u0441\u043e\u0442\u0435\u043d \u0444\u0430\u0439\u043b\u043e\u0432 \u0430\u0433\u0435\u043d\u0442 \u043b\u0438\u0431\u043e \u0441\u0434\u0430\u0451\u0442\u0441\u044f, \u043b\u0438\u0431\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0441\u0451 \u043f\u043e\u0434\u0440\u044f\u0434, \u0441\u0436\u0438\u0433\u0430\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0431\u0430\u043a\u0430 \u043d\u0430 \u0441\u0432\u0435\u0442\u043e\u0444\u043e\u0440\u0430\u0445.<\/p>\n<p>\u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0430\u0433\u0435\u043d\u0442\u044b \u0442\u0440\u0430\u0442\u044f\u0442 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u043f\u043e\u0438\u0441\u043a. \u0414\u0430\u0434\u0438\u043c \u043d\u0430\u0448\u0435\u043c\u0443 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435:<\/p>\n<pre><code class=\"python\">import re@tooldef grep(pattern: str, glob: str = \"**\/*\") -&gt; str:    \"\"\"\u041f\u043e\u0438\u0441\u043a \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0444\u0430\u0439\u043b:\u043d\u043e\u043c\u0435\u0440:\u0442\u0435\u043a\u0441\u0442.\"\"\"    rx = re.compile(pattern)    out: list[str] = []    for p in WORKDIR.glob(glob):        if not p.is_file() or \".git\" in p.parts:            continue        try:            text = p.read_text(encoding=\"utf-8\", errors=\"ignore\")        except OSError:            continue        for n, line in enumerate(text.splitlines(), 1):            if rx.search(line):                out.append(f\"{p.relative_to(WORKDIR)}:{n}: {line.strip()}\")                if len(out) &gt;= 100:                    return \"\\n\".join(out) + \"\\n... \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439, \u0443\u0442\u043e\u0447\u043d\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\"    return \"\\n\".join(out) or \"\u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u043d\u0435\u0442\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430\u0440\u043e\u0447\u0438\u0442\u043e \u043d\u0430\u0438\u0432\u043d\u0430\u044f: \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c Python. \u0412 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d\u0435 \u0432\u044b \u043f\u043e\u0437\u043e\u0432\u0451\u0442\u0435 ripgrep \u0447\u0435\u0440\u0435\u0437 subprocess, \u043e\u043d \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0438. \u041d\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u0430\u0436\u043d\u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u044b \u0442\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0424\u043e\u0440\u043c\u0430\u0442 \u00ab\u0444\u0430\u0439\u043b:\u043d\u043e\u043c\u0435\u0440:\u0442\u0435\u043a\u0441\u0442\u00bb \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u043d\u0430\u0435\u0442 \u043d\u0430\u0438\u0437\u0443\u0441\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0438\u0434\u0435\u043b\u0430 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0432\u044b\u0432\u043e\u0434\u043e\u0432 grep \u0432 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0435 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0439\u0442\u0435 \u0441\u0432\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0442\u043e\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u044b\u0440\u043e\u0441\u043b\u0430.<\/p>\n<p>\u041b\u0438\u043c\u0438\u0442 \u0432 100 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u0441 \u0447\u0435\u0441\u0442\u043d\u044b\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u00ab\u0443\u0442\u043e\u0447\u043d\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u00bb \u044d\u0442\u043e \u0437\u0430\u0449\u0438\u0442\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430 \u0432\u0438\u0434\u0430 <code>def<\/code> \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0432\u0435\u0440\u043d\u0451\u0442 \u0442\u044b\u0441\u044f\u0447\u0438 \u0441\u0442\u0440\u043e\u043a, \u0438 \u0431\u0435\u0437 \u043b\u0438\u043c\u0438\u0442\u0430 \u043e\u0434\u0438\u043d \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u044a\u0435\u0441\u0442 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0442\u044b\u0441\u044f\u0447 \u0442\u043e\u043a\u0435\u043d\u043e\u0432. \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435: \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0431\u0440\u0435\u0437\u043a\u0435 \u0430\u0434\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043e \u043c\u043e\u0434\u0435\u043b\u0438, \u0438 \u043e\u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442, \u0441\u0443\u0436\u0430\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d.<\/p>\n<p>\u0418 \u0442\u0440\u0435\u0442\u044c\u0435: <code>errors=\"ignore\"<\/code> \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438. \u0411\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 \u0438 \u0444\u0430\u0439\u043b\u044b \u0432 \u044d\u043a\u0437\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430\u0445 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u043e\u043d\u044f\u0442\u044c \u043f\u043e\u0438\u0441\u043a. \u041e\u0448\u0438\u0431\u043a\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u0430\u043b\u0438\u0442 \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u044d\u0442\u043e \u0445\u0443\u0434\u0448\u0435\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0441 \u0430\u0433\u0435\u043d\u0442\u043e\u043c \u043f\u043e\u0441\u0440\u0435\u0434\u0438 \u0434\u043b\u0438\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<p>\u0422\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438 \u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b \u0438 \u043a read_file: \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b offset \u0438 limit \u043f\u043b\u044e\u0441 \u043f\u0440\u0438\u043f\u0438\u0441\u043a\u0430 \u00ab\u0432 \u0444\u0430\u0439\u043b\u0435 N \u0441\u0442\u0440\u043e\u043a, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0435 \u0432\u0441\u0451\u00bb. \u041c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0443\u043c\u0435\u0435\u0442 \u043b\u0438\u0441\u0442\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0435\u0439 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0442\u043e \u043b\u0438\u0441\u0442\u0430\u0442\u044c.<\/p>\n<h3>\u041f\u0440\u0430\u0432\u043a\u0438: \u0434\u0438\u0444\u0444, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f<\/h3>\n<p>\u041c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0443 \u043d\u0430\u0441 \u0442\u0430 \u0436\u0435, \u0447\u0442\u043e \u0443 \u0411\u0430\u043b\u043b\u0430 \u0438 \u0443 \u0441\u0430\u043c\u043e\u0433\u043e Claude Code: \u0437\u0430\u043c\u0435\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 old_str \u043d\u0430 new_str. \u041c\u043e\u0434\u0435\u043b\u0438 \u043b\u044e\u0431\u044f\u0442 \u044d\u0442\u043e\u0442 \u0444\u043e\u0440\u043c\u0430\u0442, \u043e\u043d \u043d\u0430\u0434\u0451\u0436\u043d\u0435\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0430\u0442\u0447\u0435\u0439 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 unified diff (\u0441 \u043d\u0438\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0443\u0442\u0430\u044e\u0442\u0441\u044f \u0432 \u043d\u043e\u043c\u0435\u0440\u0430\u0445 \u0441\u0442\u0440\u043e\u043a) \u0438 \u044d\u043a\u043e\u043d\u043e\u043c\u043d\u0435\u0435 \u043f\u043e\u043b\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438 \u0444\u0430\u0439\u043b\u0430.<\/p>\n<p>\u041d\u043e \u0432\u043e\u043a\u0440\u0443\u0433 \u044d\u0442\u043e\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0438 \u043c\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u0442\u043e, \u0447\u0435\u0433\u043e \u0432 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e: \u043f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0438 \u044f\u0432\u043d\u043e\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430.<\/p>\n<pre><code class=\"python\">import difflibdef show_diff(old: str, new: str, path: str) -&gt; str:    diff = difflib.unified_diff(        old.splitlines(keepends=True),        new.splitlines(keepends=True),        fromfile=f\"a\/{path}\", tofile=f\"b\/{path}\",    )    return \"\".join(diff)def approve(question: str) -&gt; bool:    answer = input(f\"\\n\\033[91m{question}\\033[0m [y\/N] \").strip().lower()    return answer in (\"y\", \"yes\", \"\u0434\", \"\u0434\u0430\")@tooldef edit_file(path: str, old_str: str, new_str: str) -&gt; str:    \"\"\"\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 old_str \u043d\u0430 new_str \u0432 \u0444\u0430\u0439\u043b\u0435.    old_str \u043e\u0431\u044f\u0437\u0430\u043d \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043e\u0442\u0441\u0442\u0443\u043f\u044b.    \u041f\u0443\u0441\u0442\u043e\u0439 old_str \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c new_str.\"\"\"    target = resolve(path)    if old_str == \"\":        if target.exists():            return \"\u043e\u0448\u0438\u0431\u043a\u0430: \u0444\u0430\u0439\u043b \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u043f\u0435\u0440\u0435\u0434\u0430\u0439 \u043d\u0435\u043f\u0443\u0441\u0442\u043e\u0439 old_str\"        print(show_diff(\"\", new_str, path))        if not approve(f\"\u0421\u043e\u0437\u0434\u0430\u0442\u044c {path}?\"):            return \"\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u043a\u043b\u043e\u043d\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430\"        checkpoint(f\"\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 {path}\")        target.parent.mkdir(parents=True, exist_ok=True)        target.write_text(new_str, encoding=\"utf-8\")        return \"\u0444\u0430\u0439\u043b \u0441\u043e\u0437\u0434\u0430\u043d\"    text = target.read_text(encoding=\"utf-8\")    count = text.count(old_str)    if count != 1:        return (f\"\u043e\u0448\u0438\u0431\u043a\u0430: old_str \u043d\u0430\u0439\u0434\u0435\u043d {count} \u0440\u0430\u0437(\u0430), \u043d\u0443\u0436\u0435\u043d \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d. \"                \"\u0412\u043e\u0437\u044c\u043c\u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0441\u0442\u0430\u043b \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c\")    new_text = text.replace(old_str, new_str, 1)    print(show_diff(text, new_text, path))    if not approve(f\"\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043a\u0443 \u043a {path}?\"):        return \"\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u043a\u043b\u043e\u043d\u0438\u043b \u043f\u0440\u0430\u0432\u043a\u0443, \u0441\u043f\u0440\u043e\u0441\u0438 \u0435\u0433\u043e, \u0447\u0442\u043e \u043d\u0435 \u0442\u0430\u043a\"    checkpoint(f\"\u043f\u0440\u0430\u0432\u043a\u0430 {path}\")    target.write_text(new_text, encoding=\"utf-8\")    return \"\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0430\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0434\u0435\u0441\u044c \u0437\u0430\u0448\u0438\u0442\u044b.<\/p>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u043e \u00ab\u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u043e \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u00bb \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043e\u0442 \u0441\u0430\u043c\u043e\u0439 \u043a\u043e\u0432\u0430\u0440\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 string replacement: old_str \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 \u0434\u0432\u0430\u0436\u0434\u044b, \u0438 \u0437\u0430\u043c\u0435\u043d\u0430 \u0443\u0445\u043e\u0434\u0438\u0442 \u043d\u0435 \u0442\u0443\u0434\u0430. \u041f\u0440\u0438\u0447\u0451\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043d\u0441\u0442\u0430\u0442\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u043a\u0442, \u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u044b\u0445\u043e\u0434: \u0432\u043e\u0437\u044c\u043c\u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435. \u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0435\u0437\u043e\u0442\u043a\u0430\u0437\u043d\u043e, \u043c\u043e\u0434\u0435\u043b\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 old_str \u043d\u0430 \u043f\u0430\u0440\u0443 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u0441\u0442\u0440\u043e\u043a \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0432\u044b\u0437\u043e\u0432.<\/p>\n<p>\u0422\u0435\u043a\u0441\u0442 \u00ab\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u043a\u043b\u043e\u043d\u0438\u043b \u043f\u0440\u0430\u0432\u043a\u0443, \u0441\u043f\u0440\u043e\u0441\u0438 \u0435\u0433\u043e, \u0447\u0442\u043e \u043d\u0435 \u0442\u0430\u043a\u00bb \u0442\u043e\u0436\u0435 \u043f\u0440\u043e\u043c\u043f\u0442-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u044f, \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u043d\u0430\u044f \u0432 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438. \u0411\u0435\u0437 \u044d\u0442\u043e\u0439 \u0444\u0440\u0430\u0437\u044b \u043c\u043e\u0434\u0435\u043b\u044c, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u043e\u0442\u043a\u0430\u0437, \u0447\u0430\u0441\u0442\u043e \u043f\u044b\u0442\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0443 \u0436\u0435 \u043f\u0440\u0430\u0432\u043a\u0443 \u0435\u0449\u0451 \u0440\u0430\u0437, \u0441\u043b\u0435\u0433\u043a\u0430 \u043f\u0435\u0440\u0435\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0432. \u0421 \u0444\u0440\u0430\u0437\u043e\u0439 \u043e\u043d\u0430 \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0438 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u044d\u0442\u043e \u043a\u0430\u043d\u0430\u043b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u0438, \u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u0438\u043c.<\/p>\n<p>\u0418 \u0444\u0443\u043d\u043a\u0446\u0438\u044f resolve, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u043f\u043e\u043a\u0430 \u043d\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b:<\/p>\n<pre><code class=\"python\">def resolve(path: str) -&gt; Path:    \"\"\"\u041d\u0435 \u0434\u0430\u0451\u043c \u0430\u0433\u0435\u043d\u0442\u0443 \u0432\u044b\u0439\u0442\u0438 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\"\"\"    p = (WORKDIR \/ path).resolve()    if not p.is_relative_to(WORKDIR):        raise ValueError(f\"\u043f\u0443\u0442\u044c {path!r} \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430\")    return p<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0440\u0438 \u0441\u0442\u0440\u043e\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e\u0442, \u0447\u0442\u043e \u043d\u0438 <code>..\/..\/etc\/hosts<\/code>, \u043d\u0438 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0432 \u0434\u043e\u043c\u0430\u0448\u043d\u044e\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0447\u0435\u0440\u0435\u0437 \u0430\u0433\u0435\u043d\u0442\u0430 \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0443\u0442. \u041c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u00ab\u043f\u043e\u0447\u0442\u0438\u00bb \u0432 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u0445 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430 \u0434\u0438\u0441\u043a \u043c\u0435\u043d\u044f \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442.<\/p>\n<h3>\u0427\u0435\u043a\u043f\u043e\u0438\u043d\u0442\u044b: git \u043a\u0430\u043a \u043c\u0430\u0448\u0438\u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430 \u0434\u0435\u0441\u044f\u0442\u044c \u0441\u0442\u0440\u043e\u043a<\/h3>\n<p>\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0434\u0438\u0444\u0444\u0430 \u0441\u043f\u0430\u0441\u0430\u0435\u0442 \u043e\u0442 \u043f\u043b\u043e\u0445\u0438\u0445 \u043f\u0440\u0430\u0432\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438. \u0410 \u043e\u0442 \u043f\u043b\u043e\u0445\u0438\u0445 \u043f\u0440\u0430\u0432\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044c \u043c\u0438\u043d\u0443\u0442? \u0421\u043e\u0433\u043b\u0430\u0441\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u0441\u0435\u0440\u0438\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0442\u0435\u0441\u0442\u044b, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0435 \u0438 \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u0430\u0433\u0435\u043d\u0442 \u0443\u0432\u0451\u043b \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 \u043d\u0435 \u0442\u0443\u0434\u0430. \u0420\u0443\u043a\u0430\u043c\u0438 \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u043e\u0441\u0435\u043c\u044c \u043f\u0440\u0430\u0432\u043e\u043a \u0432 \u043f\u044f\u0442\u0438 \u0444\u0430\u0439\u043b\u0430\u0445 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435 \u043d\u0438\u0436\u0435 \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e.<\/p>\n<p>\u0420\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0441\u043c\u0435\u0448\u043d\u043e \u0434\u0451\u0448\u0435\u0432\u043e, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u0442\u0430\u043a \u0436\u0438\u0432\u0451\u0442 \u0432 git:<\/p>\n<pre><code class=\"python\">import subprocessdef git(*args: str) -&gt; str:    res = subprocess.run(        [\"git\", *args], capture_output=True, text=True, cwd=WORKDIR    )    return (res.stdout + res.stderr).strip()def checkpoint(label: str) -&gt; None:    \"\"\"\u0421\u043d\u0438\u043c\u043e\u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c.\"\"\"    if not (WORKDIR \/ \".git\").exists():        return    git(\"add\", \"-A\")    git(\"commit\", \"--no-verify\", \"--allow-empty\",        \"-m\", f\"kodo: \u0447\u0435\u043a\u043f\u043e\u0438\u043d\u0442 \u043f\u0435\u0440\u0435\u0434 '{label}'\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0430\u0433\u0435\u043d\u0442 \u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0412 REPL \u0436\u0438\u0432\u0451\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \/undo, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0435\u043b\u0430\u0435\u0442 <code>git reset --hard HEAD<\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c\u0443 \u0447\u0435\u043a\u043f\u043e\u0438\u043d\u0442\u0443. \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u0441\u0435\u0441\u0441\u0438\u0438 \u0437\u0430\u043e\u0434\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0430\u0433\u0435\u043d\u0442\u0430, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c, \u0447\u0442\u043e \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043e\u043d \u0434\u0435\u043b\u0430\u043b.<\/p>\n<p>\u0414\u0430, \u044d\u0442\u043e \u0437\u0430\u0433\u0440\u044f\u0437\u043d\u044f\u0435\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0432\u0435\u0442\u043a\u0438. \u0414\u043b\u044f \u0443\u0447\u0435\u0431\u043d\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430 \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441. \u0412 Claude Code, \u043a \u0441\u043b\u043e\u0432\u0443, \u0447\u0435\u043a\u043f\u043e\u0438\u043d\u0442\u044b \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u0435\u0435 \u0438 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u044e\u0442 \u0432\u0430\u0448\u0443 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432, \u043d\u043e \u0438\u0434\u0435\u044f \u0440\u043e\u0432\u043d\u043e \u0442\u0430 \u0436\u0435: \u0434\u0451\u0448\u0435\u0432\u043e \u0441\u043d\u0438\u043c\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u043d\u0435\u043e\u0431\u0440\u0430\u0442\u0438\u043c\u044b\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c. \u0415\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0447\u0438\u0441\u0442\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 <code>git stash create<\/code> (\u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u043e\u043c\u043c\u0438\u0442-\u0441\u043d\u0438\u043c\u043e\u043a, \u043d\u0435 \u0434\u0432\u0438\u0433\u0430\u044f \u0432\u0435\u0442\u043a\u0443) \u0438\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0435\u043d\u0435\u0432\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.<\/p>\n<p>\u041f\u0441\u0438\u0445\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u043e\u0442 \/undo \u044f \u043d\u0435\u0434\u043e\u043e\u0446\u0435\u043d\u0438\u0432\u0430\u043b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u0436\u0438\u043b \u0441 \u043d\u0438\u043c \u043d\u0435\u0434\u0435\u043b\u044e. \u041a\u043e\u0433\u0434\u0430 \u043e\u0442\u043a\u0430\u0442 \u0441\u0442\u043e\u0438\u0442 \u043e\u0434\u043d\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0448\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442\u044c \u0430\u0433\u0435\u043d\u0442\u0443 \u0431\u043e\u043b\u044c\u0448\u0435: \u043f\u0443\u0441\u0442\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u0441\u043c\u0435\u043b\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c \u043d\u0435\u0434\u043e\u043b\u0433\u043e. \u0414\u043e\u0432\u0435\u0440\u0438\u0435 \u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043d\u0435 \u043d\u0430 \u0435\u0433\u043e \u0431\u0435\u0437\u043e\u0448\u0438\u0431\u043e\u0447\u043d\u043e\u0441\u0442\u0438, \u0430 \u043d\u0430 \u0446\u0435\u043d\u0435 \u0435\u0433\u043e \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<h3>Shell: \u0441\u0430\u043c\u044b\u0439 \u043c\u043e\u0449\u043d\u044b\u0439 \u0438 \u0441\u0430\u043c\u044b\u0439 \u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442<\/h3>\n<p>\u0411\u0435\u0437 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434 \u0430\u0433\u0435\u043d\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u044b, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443. \u0410\u0433\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u044d\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0434\u0438\u0444\u0444\u043e\u0432, \u043d\u0435 \u0431\u043e\u043b\u0435\u0435. \u0422\u0430\u043a \u0447\u0442\u043e run_command \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u0435\u043d. \u0418 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0433\u0435\u043d\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u043d\u0430\u0442\u0432\u043e\u0440\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0431\u0435\u0434.<\/p>\n<p>\u041c\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434: \u0442\u0440\u0438 \u0443\u0440\u043e\u0432\u043d\u044f \u0437\u0430\u0449\u0438\u0442\u044b.<\/p>\n<pre><code class=\"python\">SAFE_PREFIXES = (    \"ls\", \"cat\", \"head\", \"tail\", \"wc\", \"file\", \"du\",    \"git status\", \"git diff\", \"git log\", \"git show\",    \"python\", \"pytest\", \"pip list\", \"pip show\",    \"node\", \"npm test\", \"npm run\",)BLOCKED_MARKERS = (\"sudo\", \"rm -rf \/\", \"mkfs\", \"shutdown\", \"reboot\", \":(){\")@tooldef run_command(command: str, timeout: int = 60) -&gt; str:    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c shell-\u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.    \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0439 \u0442\u0435\u0441\u0442\u044b \u0438 \u043b\u0438\u043d\u0442\u0435\u0440\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0430\u0432\u043e\u043a. \u041d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0439 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435    \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u0434\u043e\u043b\u0433\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0432\u0440\u043e\u0434\u0435 dev-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432.\"\"\"    if any(marker in command for marker in BLOCKED_MARKERS):        return \"\u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438\"    if not command.strip().startswith(SAFE_PREFIXES):        if not approve(f\"\u0410\u0433\u0435\u043d\u0442 \u0445\u043e\u0447\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c: {command}\\n\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c?\"):            return \"\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b\"    try:        res = subprocess.run(            command, shell=True, capture_output=True,            text=True, timeout=timeout, cwd=WORKDIR,        )    except subprocess.TimeoutExpired:        return f\"\u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u0443\u043b\u043e\u0436\u0438\u043b\u0430\u0441\u044c \u0432 {timeout} \u0441\u0435\u043a\u0443\u043d\u0434 \u0438 \u0431\u044b\u043b\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430\"    out = (res.stdout + res.stderr).strip()    if len(out) &gt; OUTPUT_LIMIT:        half = OUTPUT_LIMIT \/\/ 2        out = out[:half] + \"\\n... \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0430 \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0431\u0440\u0435\u0437\u0430\u043d\u0430 ...\\n\" + out[-half:]    return f\"\u043a\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430: {res.returncode}\\n{out or '(\u043f\u0443\u0441\u0442\u043e\u0439 \u0432\u044b\u0432\u043e\u0434)'}\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0451\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043b\u043e\u0432\u0438\u0442 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0440\u0430\u0437\u0440\u0443\u0448\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435. \u0411\u0435\u043b\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u0432 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0431\u0435\u0437 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0442\u043e, \u0447\u0442\u043e \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u0435\u0442 \u0438\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u044b, \u0438\u043d\u0430\u0447\u0435 \u0432\u044b \u0437\u0430\u0434\u043e\u043b\u0431\u0430\u0435\u0442\u0435\u0441\u044c \u0436\u0430\u0442\u044c y \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 <code>git status<\/code>. \u0412\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c. \u042d\u0442\u043e \u0440\u043e\u0432\u043d\u043e \u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435 \u0432 Claude Code: \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043c\u043e\u043b\u0447\u0430, \u0447\u0430\u0441\u0442\u044c \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0438 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c allowlist \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u043f\u043e\u0434 \u0441\u0432\u043e\u0438 \u043f\u0440\u0438\u0432\u044b\u0447\u043a\u0438.<\/p>\n<p>\u0411\u0443\u0434\u0443 \u0447\u0435\u0441\u0442\u0435\u043d: \u0431\u0435\u043b\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430\u043c \u044d\u0442\u043e \u0437\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u0434\u043e\u0431\u0440\u043e\u0441\u043e\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u0430 \u043d\u0435 \u043e\u0442 \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0435\u0433\u043e. <code>python -c \"import shutil; ...\"<\/code> \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0443 python \u0438 \u043c\u043e\u0436\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e. \u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044f \u044d\u0442\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0430, \u0438 \u0434\u043b\u044f \u0430\u0433\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e \u0431\u0435\u0437 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u0443 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u043e\u043d\u0430 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430. \u0414\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430, \u0433\u0434\u0435 \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435 \u043a\u0430\u0436\u0434\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441 \u00aballowlist \u043f\u043b\u044e\u0441 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u00bb \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u043d. \u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u043e\u0442 \u0447\u0435\u0433\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u044b \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442\u0435\u0441\u044c.<\/p>\n<p>\u0415\u0449\u0451 \u0434\u0432\u0435 \u0434\u0435\u0442\u0430\u043b\u0438, \u043e\u0431\u0435 \u0432\u044b\u0441\u0442\u0440\u0430\u0434\u0430\u043d\u044b. \u0422\u0430\u0439\u043c\u0430\u0443\u0442: \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0436\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 <code>npm run dev<\/code> \u043f\u043e\u0432\u0435\u0441\u0438\u0442 \u0430\u0433\u0435\u043d\u0442\u0430 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e dev-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f. \u0418 \u043e\u0431\u0440\u0435\u0437\u043a\u0430 \u0432\u044b\u0432\u043e\u0434\u0430 \u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b, \u0430 \u043d\u0435 \u0441 \u043a\u043e\u043d\u0446\u0430: \u0432 \u0432\u044b\u0432\u043e\u0434\u0435 \u0443\u043f\u0430\u0432\u0448\u0438\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0441\u0430\u043c\u043e\u0435 \u0446\u0435\u043d\u043d\u043e\u0435 \u0436\u0438\u0432\u0451\u0442 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 (\u043a\u0430\u043a\u0438\u0435 \u0442\u0435\u0441\u0442\u044b \u0443\u043f\u0430\u043b\u0438) \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 (\u0438\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0441\u0432\u043e\u0434\u043a\u0430), \u0430 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 \u0441 \u0442\u0440\u0435\u0439\u0441\u0431\u0435\u043a\u0430\u043c\u0438 \u0447\u0430\u0441\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u0442\u044c. \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u043a\u043e\u0434\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0442\u043e\u0436\u0435 \u0432\u0430\u0436\u0435\u043d: \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e \u043d\u0435\u043c\u0443 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0443\u0441\u043f\u0435\u0445 \u044d\u0442\u043e \u0431\u044b\u043b \u0438\u043b\u0438 \u043f\u0440\u043e\u0432\u0430\u043b, \u043d\u0435 \u0432\u0447\u0438\u0442\u044b\u0432\u0430\u044f\u0441\u044c \u0432 \u0432\u044b\u0432\u043e\u0434.<\/p>\n<h3>\u041f\u043b\u0430\u043d: \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442, \u043d\u043e \u0432\u0441\u0451 \u043c\u0435\u043d\u044f\u0435\u0442<\/h3>\n<p>\u0410 \u0432\u043e\u0442 \u043c\u043e\u0451 \u043b\u044e\u0431\u0438\u043c\u043e\u0435. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430, \u043a\u0440\u043e\u043c\u0435 \u043f\u0435\u0447\u0430\u0442\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d:<\/p>\n<pre><code class=\"python\">@tooldef update_plan(steps: list[str], done: list[int] = []) -&gt; str:    \"\"\"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043b\u0430\u043d \u0440\u0430\u0431\u043e\u0442\u044b. steps: \u0441\u043f\u0438\u0441\u043e\u043a \u0448\u0430\u0433\u043e\u0432, done: \u0438\u043d\u0434\u0435\u043a\u0441\u044b    \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0448\u0430\u0433\u043e\u0432, \u0441\u0447\u0438\u0442\u0430\u044f \u0441 \u043d\u0443\u043b\u044f. \u0412\u044b\u0437\u044b\u0432\u0430\u0439 \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u043e\u0439    \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u043e\u0433\u043e \u0448\u0430\u0433\u0430.\"\"\"    lines = [        (\"[x] \" if i in done else \"[ ] \") + step        for i, step in enumerate(steps)    ]    print(\"\\n\\033[95m\u043f\u043b\u0430\u043d\\033[0m:\\n\" + \"\\n\".join(lines))    return \"\u043f\u043b\u0430\u043d \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0439\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d, \u0435\u0441\u043b\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f? \u0417\u0430\u0442\u0435\u043c, \u0447\u0442\u043e \u0441\u0430\u043c \u0430\u043a\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u043d \u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u0438 \u044d\u0442\u043e\u0442 \u0442\u0435\u043a\u0441\u0442 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0434\u0438\u0430\u043b\u043e\u0433\u0430. \u041d\u0430 \u043c\u043d\u043e\u0433\u043e\u0448\u0430\u0433\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u044d\u0442\u043e \u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0434\u0438\u043a\u0430\u043b\u044c\u043d\u043e. \u0411\u0435\u0437 \u043f\u043b\u0430\u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0430 \u0448\u0430\u0433\u0430, \u0443\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0438\u043d\u043a\u043e\u0439 \u043f\u043e\u043f\u0443\u0442\u043d\u043e\u0433\u043e \u0431\u0430\u0433\u0430 \u0438 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u0442, \u0437\u0430\u0447\u0435\u043c \u0432\u0441\u0451 \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u043e\u0441\u044c. \u0421 \u043f\u043b\u0430\u043d\u043e\u043c \u043e\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u043f\u0438\u0441\u043a\u0443, \u0432\u0438\u0434\u0438\u0442 \u043d\u0435\u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0435 \u043f\u0443\u043d\u043a\u0442\u044b \u0438 \u0434\u043e\u0432\u043e\u0434\u0438\u0442 \u0434\u0435\u043b\u043e \u0434\u043e \u043a\u043e\u043d\u0446\u0430. \u041f\u043e \u0441\u0443\u0442\u0438 \u043c\u044b \u0434\u0430\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u0434\u043b\u044f \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u0438\u0439, \u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440 \u0432 \u043f\u043e\u0434\u0430\u0440\u043e\u043a.<\/p>\n<p>\u042d\u0442\u043e \u0442\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u0451\u043c, \u0447\u0442\u043e todo-\u0441\u043f\u0438\u0441\u043e\u043a \u0432 Claude Code. \u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0443\u0432\u0438\u0434\u0435\u043b \u0435\u0433\u043e \u0442\u0430\u043c, \u043f\u043e\u0434\u0443\u043c\u0430\u043b: \u0443\u043a\u0440\u0430\u0448\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0434\u043b\u044f UI. \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0447\u0438\u0442\u0430\u044e \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043d\u0435\u0434\u043e\u043e\u0446\u0435\u043d\u0451\u043d\u043d\u044b\u0445 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u0438 \u0430\u0433\u0435\u043d\u0442\u043e\u0432.<\/p>\n<h3>\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u043f\u0442 \u0438 \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h3>\n<p>\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u043f\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439, \u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u0432 \u043d\u0451\u043c \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0444\u0435\u0439\u043b\u0430:<\/p>\n<pre><code class=\"python\">def build_system_prompt() -&gt; str:    base = (        \"\u0422\u044b \u043a\u043e\u0434\u0438\u043d\u0433-\u0430\u0433\u0435\u043d\u0442 kodo, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0448\u044c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.\\n\"        \"\u041f\u0440\u0430\u0432\u0438\u043b\u0430:\\n\"        \"1. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0437\u0443\u0447\u0438 \u043a\u043e\u0434: \u0438\u0449\u0438 \u0447\u0435\u0440\u0435\u0437 grep \u0438 glob_files, \u0447\u0438\u0442\u0430\u0439 \u0447\u0435\u0440\u0435\u0437 \"        \"read_file. \u041d\u0435 \u043f\u0440\u0430\u0432\u044c \u0442\u043e, \u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u0438\u0434\u0435\u043b.\\n\"        \"2. \u0414\u043b\u044f \u0437\u0430\u0434\u0430\u0447 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0448\u0430\u0433\u043e\u0432 \u0441\u0440\u0430\u0437\u0443 \u0441\u043e\u0441\u0442\u0430\u0432\u044c \u043f\u043b\u0430\u043d \u0447\u0435\u0440\u0435\u0437 \"        \"update_plan \u0438 \u043e\u0442\u043c\u0435\u0447\u0430\u0439 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0448\u0430\u0433\u0430.\\n\"        \"3. \u041f\u0440\u0430\u0432\u043a\u0438 \u0434\u0435\u043b\u0430\u0439 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438. \u0421\u0442\u0438\u043b\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u0430\u0436\u043d\u0435\u0435 \u0442\u0432\u043e\u0438\u0445 \u043f\u0440\u0438\u0432\u044b\u0447\u0435\u043a.\\n\"        \"4. \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0430\u0432\u043e\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0439 \u0442\u0435\u0441\u0442\u044b, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435.\\n\"        \"5. \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u043a\u043b\u043e\u043d\u0438\u043b \u043f\u0440\u0430\u0432\u043a\u0443, \u0443\u0442\u043e\u0447\u043d\u0438 \u0443 \u043d\u0435\u0433\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0443, \"        \"\u0430 \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0439 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435.\\n\"        \"6. \u041e\u0442\u0432\u0435\u0447\u0430\u0439 \u043a\u0440\u0430\u0442\u043a\u043e \u0438 \u043f\u043e \u0434\u0435\u043b\u0443, \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u0437\u0430 \u0441\u0432\u043e\u0438\u0445 \u0436\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439.\"    )    memory = WORKDIR \/ \"AGENT.md\"    if memory.exists():        base += (\"\\n\\n\u041f\u0430\u043c\u044f\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438\u0437 AGENT.md, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0439 \u0435\u0451:\\n\"                 + memory.read_text(encoding=\"utf-8\"))    return base<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u00ab\u041d\u0435 \u043f\u0440\u0430\u0432\u044c \u0442\u043e, \u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u0438\u0434\u0435\u043b\u00bb \u043b\u0435\u0447\u0438\u0442 \u043b\u044e\u0431\u0438\u043c\u0443\u044e \u0431\u043e\u043b\u0435\u0437\u043d\u044c \u043c\u043e\u0434\u0435\u043b\u0435\u0439: \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u0437 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0445\u043e\u0442\u044f \u0432 \u0432\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043e\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0438\u043d\u0430\u0447\u0435. \u00ab\u0421\u0442\u0438\u043b\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u0430\u0436\u043d\u0435\u0435 \u0442\u0432\u043e\u0438\u0445 \u043f\u0440\u0438\u0432\u044b\u0447\u0435\u043a\u00bb \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0430\u0433\u0435\u043d\u0442 \u0432 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u0435 \u0441 snake_case \u0441\u0442\u0430\u0440\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043d\u043e\u0432\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0432 camelCase, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u00ab\u0442\u0430\u043a \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0432 JavaScript\u00bb.<\/p>\n<p>\u0424\u0430\u0439\u043b <a href=\"http:\/\/AGENT.md\" rel=\"noopener noreferrer nofollow\">AGENT.md<\/a> \u044d\u0442\u043e \u043f\u0440\u044f\u043c\u043e\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 <a href=\"http:\/\/CLAUDE.md\" rel=\"noopener noreferrer nofollow\">CLAUDE.md<\/a>: \u043c\u0435\u0441\u0442\u043e, \u043a\u0443\u0434\u0430 \u0432\u044b \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u0433\u0435\u043d\u0442 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0435\u0441\u0441\u0438\u044e. \u041a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b, \u043a\u0430\u043a\u0438\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u043e\u0434\u0443\u043b\u044c legacy_billing \u043d\u0435\u043b\u044c\u0437\u044f \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u043a\u0432\u0430\u0440\u0442\u0430\u043b\u0430. \u041f\u044f\u0442\u044c \u043c\u0438\u043d\u0443\u0442 \u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u043e\u043a\u0443\u043f\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0436\u0435 \u0441\u0435\u0441\u0441\u0438\u0438. \u042d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u0434\u0435\u0448\u0451\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u00ab\u0434\u043e\u043e\u0431\u0443\u0447\u0438\u0442\u044c\u00bb \u0430\u0433\u0435\u043d\u0442\u0430 \u043f\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442: \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0444\u0430\u0439\u043d\u0442\u044e\u043d\u0438\u043d\u0433\u0430, \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0432 \u043a\u043e\u0440\u043d\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.<\/p>\n<h3>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c: \u0432\u043e\u043f\u0440\u043e\u0441 \u0432\u044b\u0436\u0438\u0432\u0430\u043d\u0438\u044f, \u0430 \u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e \u0442\u043e\u043c, \u043e\u0431\u043e \u0447\u0442\u043e \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0433\u0435\u043d\u0442\u044b \u0431\u0435\u0437 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u0440\u0430\u0441\u0442\u0451\u0442 \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u0445\u043e\u0434\u043e\u043c, \u0438 \u0440\u0430\u0441\u0442\u0451\u0442 \u0431\u044b\u0441\u0442\u0440\u043e: \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u044d\u0442\u043e \u0442\u044b\u0441\u044f\u0447\u0438 \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u043e\u0434\u0438\u043d \u0432\u044b\u0432\u043e\u0434 pytest \u0435\u0449\u0451 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0435. \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0443 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0435, \u043d\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435, \u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u0437\u0430\u0434\u043e\u043b\u0433\u043e \u0434\u043e \u0436\u0451\u0441\u0442\u043a\u043e\u0433\u043e \u043b\u0438\u043c\u0438\u0442\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e: \u043c\u043e\u0434\u0435\u043b\u0438 \u0445\u0443\u0436\u0435 \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0440\u0430\u0441\u043f\u0443\u0445\u0448\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435, \u0438 \u044d\u0442\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\u043c\u0438, \u0442\u0430\u043a \u0438 \u043c\u043e\u0438\u043c \u043b\u0438\u0447\u043d\u044b\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f \u0437\u0430 \u0430\u0433\u0435\u043d\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 150-\u0439 \u0442\u044b\u0441\u044f\u0447\u0435 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0441\u0430\u043c \u0432\u044b\u044f\u0441\u043d\u0438\u043b \u0447\u0430\u0441 \u043d\u0430\u0437\u0430\u0434.<\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u043b\u0438\u043d\u0438\u044f \u043e\u0431\u043e\u0440\u043e\u043d\u044b \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430, \u0438 \u0432\u044b \u0435\u0451 \u0432\u0438\u0434\u0435\u043b\u0438: \u043b\u0438\u043c\u0438\u0442\u044b \u0432\u0435\u0437\u0434\u0435. \u041e\u0431\u0440\u0435\u0437\u043a\u0430 \u0432\u044b\u0432\u043e\u0434\u0430 \u043a\u043e\u043c\u0430\u043d\u0434, \u043f\u043e\u0442\u043e\u043b\u043e\u043a \u0432 100 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u0443 grep, \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f \u0432 read_file. \u0414\u0435\u0448\u0435\u0432\u043b\u0435 \u043d\u0435 \u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043c\u0443\u0441\u043e\u0440 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u0447\u0435\u043c \u043f\u043e\u0442\u043e\u043c \u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0449\u0430\u0442\u044c.<\/p>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u043b\u0438\u043d\u0438\u044f \u044d\u0442\u043e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f: \u043a\u043e\u0433\u0434\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0440\u0430\u0441\u043f\u0443\u0445\u043b\u0430, \u0441\u0436\u0438\u043c\u0430\u0435\u043c \u0435\u0451 \u0441\u0442\u0430\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u0441\u0438\u043b\u0430\u043c\u0438 \u0441\u0430\u043c\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<pre><code class=\"python\">def compact(self) -&gt; None:    \"\"\"\u0421\u0436\u0438\u043c\u0430\u0435\u0442 \u0441\u0442\u0430\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0432 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442.\"\"\"    if len(self.history) &lt; 8:        return    head, tail = self.history[:-4], self.history[-4:]    digest = self.client.messages.create(        model=MODEL,        max_tokens=2000,        messages=head + [{            \"role\": \"user\",            \"content\": (                \"\u0421\u043e\u0436\u043c\u0438 \u043d\u0430\u0448 \u0434\u0438\u0430\u043b\u043e\u0433 \u0432 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b: \"                \"\u0446\u0435\u043b\u044c, \u0447\u0442\u043e \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e, \u043a\u0430\u043a\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u043a\u0430\u043a \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044b, \"                \"\u0447\u0442\u043e \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c, \u043a\u0430\u043a\u0438\u0435 \u0431\u044b\u043b\u0438 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0451\u043d\u043d\u043e\u0441\u0442\u0438. \u0422\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u043a\u0442\u044b.\"            ),        }],    )    summary = \"\".join(b.text for b in digest.content if b.type == \"text\")    self.history = [        {\"role\": \"user\",         \"content\": f\"[\u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0435\u0441\u0441\u0438\u0438]\\n{summary}\"},        {\"role\": \"assistant\",         \"content\": \"\u041f\u0440\u0438\u043d\u044f\u043b \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e \u0441 \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430.\"},    ] + tail    print(\"\\033[90m[\u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u0436\u0430\u0442\u0430 \u0432 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442]\\033[0m\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0425\u0432\u043e\u0441\u0442 \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043a\u0430\u043a \u0435\u0441\u0442\u044c: \u0441\u0432\u0435\u0436\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0442\u0435\u0440\u044f\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f, \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0441 \u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0412\u0441\u0451, \u0447\u0442\u043e \u0441\u0442\u0430\u0440\u0448\u0435, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d autocompact \u0432 Claude Code, \u0438 \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435 \u0442\u0430\u043c \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u043f\u0440\u043e \u0441\u0436\u0430\u0442\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0440\u043e\u0432\u043d\u043e \u044d\u0442\u043e.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0437\u0430\u043a\u043e\u043f\u0430\u043d\u044b \u0433\u0440\u0430\u0431\u043b\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b \u0441\u043e \u0432\u0441\u0435\u0439 \u0434\u0443\u0440\u0438, \u0438 \u0445\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u0447\u0435\u0440\u0435\u0437 \u043d\u0438\u0445 \u043f\u0435\u0440\u0435\u0448\u0430\u0433\u043d\u0443\u043b\u0438. \u0420\u0435\u0437\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043e\u0442\u0432\u0435\u0442 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d. \u0415\u0441\u043b\u0438 \u043e\u0431\u0440\u0435\u0437\u0430\u0442\u044c \u043f\u043e\u0441\u0440\u0435\u0434\u0438 \u0446\u0438\u043a\u043b\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0431\u043b\u043e\u043a tool_use \u0431\u0435\u0437 \u043f\u0430\u0440\u043d\u043e\u0433\u043e tool_result, \u0438 API \u043e\u0442\u0432\u0435\u0440\u0433\u043d\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441. \u0417\u0432\u0443\u0447\u0438\u0442 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0437\u043d\u0430\u0435\u0448\u044c, \u043d\u043e \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u0431\u0430\u0433\u0430 \u0441\u0442\u043e\u0438\u043b\u0430 \u043c\u043d\u0435 \u0432\u0435\u0447\u0435\u0440\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u043b\u0441\u044f \u043e\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u044f\u0445. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043d\u0430\u0448\u0435\u043c \u0430\u0433\u0435\u043d\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0441\u0442\u043e\u0438\u0442 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 turn, \u0430 \u043d\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0446\u0438\u043a\u043b\u0430:<\/p>\n<pre><code class=\"python\">def turn(self, user_input: str) -&gt; None:    if self.last_input_tokens &gt; CONTEXT_BUDGET:        self.compact()    self.history.append({\"role\": \"user\", \"content\": user_input})    ...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0440\u043e\u0433 \u043c\u044b \u0443\u0437\u043d\u0430\u0451\u043c \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e: \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 API \u043d\u0435\u0441\u0451\u0442 usage.input_tokens, \u0442\u043e\u0447\u043d\u044b\u0439 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0438. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u043a \u0441 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u043e\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.<\/p>\n<h3>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u044f\u0434\u0440\u043e<\/h3>\n<p>\u0421\u0430\u043c \u0430\u0433\u0435\u043d\u0442\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u043e\u0447\u0442\u0438 \u0441\u043a\u0443\u0447\u043d\u043e, \u0438 \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e. \u0412\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u0430 \u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u043a\u043e\u043d\u0442\u0443\u0440\u044b \u0432\u043e\u043a\u0440\u0443\u0433:<\/p>\n<pre><code class=\"python\">class Agent:    def __init__(self, client: anthropic.Anthropic):        self.client = client        self.system = build_system_prompt()        self.history: list[dict] = []        self.last_input_tokens = 0    def call_model(self):        reply = self.client.messages.create(            model=MODEL,            max_tokens=MAX_TOKENS,            system=self.system,            messages=self.history,            tools=self.tool_specs(),        )        self.last_input_tokens = reply.usage.input_tokens        return reply    def run_tool(self, name: str, args: dict) -&gt; str:        spec = REGISTRY.get(name)        if spec is None:            return f\"\u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442: {name}\"        print(f\"\\033[92m\u2192 {name}\\033[0m \"              f\"{json.dumps(args, ensure_ascii=False)[:200]}\")        try:            return str(spec.handler(**args))        except Exception as exc:            return f\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 {name}: {exc}\"    def turn(self, user_input: str) -&gt; None:        if self.last_input_tokens &gt; CONTEXT_BUDGET:            self.compact()        self.history.append({\"role\": \"user\", \"content\": user_input})        while True:            reply = self.call_model()            self.history.append(                {\"role\": \"assistant\", \"content\": reply.content}            )            results = []            for block in reply.content:                if block.type == \"text\" and block.text.strip():                    print(f\"\\n\\033[93mkodo\\033[0m: {block.text}\")                elif block.type == \"tool_use\":                    results.append({                        \"type\": \"tool_result\",                        \"tool_use_id\": block.id,                        \"content\": self.run_tool(block.name, block.input),                    })            if not results:                return            self.history.append({\"role\": \"user\", \"content\": results})<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 try\/except \u0432 run_tool. \u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043d\u0435 \u0440\u043e\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0430 \u0443\u0445\u043e\u0434\u0438\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u043c. \u042d\u0442\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e: \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0438 \u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e. \u0424\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d? \u041f\u043e\u0438\u0449\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 glob_files. \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430 \u043d\u0435 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c? \u041f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u0442. \u0423\u043f\u0430\u0432\u0448\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0430\u0433\u0435\u043d\u0442\u0430, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e. \u0417\u0430 \u0432\u0440\u0435\u043c\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u044f \u043d\u0435 \u0440\u0430\u0437 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b, \u043a\u0430\u043a \u0430\u0433\u0435\u043d\u0442, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u00ab\u043e\u0448\u0438\u0431\u043a\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430: [Errno 2] No such file or directory\u00bb, \u0441\u0430\u043c \u0434\u043e\u0433\u0430\u0434\u044b\u0432\u0430\u043b\u0441\u044f, \u0447\u0442\u043e \u043f\u0443\u0442\u044c \u0443\u0441\u0442\u0430\u0440\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u0430\u0445\u043e\u0434\u0438\u043b \u043d\u043e\u0432\u044b\u0439 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u043b \u043a\u0430\u043a \u043d\u0438 \u0432 \u0447\u0451\u043c \u043d\u0435 \u0431\u044b\u0432\u0430\u043b\u043e.<\/p>\n<p>\u0418 \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0434\u0435\u0442\u0430\u043b\u044c, \u043b\u0435\u0433\u043a\u043e \u0443\u0441\u043a\u043e\u043b\u044c\u0437\u0430\u044e\u0449\u0430\u044f: \u0446\u0438\u043a\u043b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0435 tool_use \u0431\u043b\u043e\u043a\u0438 \u0438\u0437 \u043e\u0442\u0432\u0435\u0442\u0430, \u0430 \u043d\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u043f\u0430\u0432\u0448\u0438\u0439\u0441\u044f. \u041c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430 \u043e\u0434\u0438\u043d \u0445\u043e\u0434, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0432\u0430 grep \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u043c, \u0438 \u0432\u0441\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u0441 \u043f\u0430\u0440\u043d\u044b\u043c\u0438 tool_use_id. \u041f\u0435\u0440\u0435\u043f\u0443\u0442\u0430\u0435\u0442\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0443 API. \u0417\u0430\u0431\u0443\u0434\u0435\u0442\u0435 \u043e\u0434\u0438\u043d \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0442\u043e\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435.<\/p>\n<p>REPL \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u043c\u0438\u043d\u0443\u0442\u0443, \u043e\u043d \u0435\u0441\u0442\u044c \u0432 \u043f\u043e\u043b\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043a\u043e\u0434\u0430 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \/undo.<\/p>\n<h3>\u041f\u043e\u043b\u0435\u0432\u044b\u0435 \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u044f<\/h3>\n<p>\u0421\u0438\u043d\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 fizzbuzz \u043d\u0430\u0448\u0435\u043c\u0443 \u0430\u0433\u0435\u043d\u0442\u0443 \u043d\u0435\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0443\u0441\u0442\u0440\u043e\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0436\u0451\u0441\u0442\u0447\u0435. \u0412\u0437\u044f\u043b \u0441\u0432\u043e\u0439 pet-\u043f\u0440\u043e\u0435\u043a\u0442, \u043f\u0430\u0440\u0441\u0435\u0440 \u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u0438\u0445 \u0432\u044b\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 2500 \u0441\u0442\u0440\u043e\u043a, \u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u0432\u043d\u0451\u0441 \u0442\u0443\u0434\u0430 \u0431\u0430\u0433: \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0434\u0430\u0442 \u0441\u043b\u043e\u043c\u0430\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0434\u0435\u043a\u0430\u0431\u0440\u044f (\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u043c\u0435\u0441\u044f\u0446\u0430). \u0417\u0430\u0434\u0430\u0447\u0430 \u0430\u0433\u0435\u043d\u0442\u0443 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439: \u00ab\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0433\u0434\u0435-\u0442\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u0430\u0440\u0441\u044f\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0430\u0442\u044b, \u043d\u0430\u0439\u0434\u0438 \u043f\u0440\u0438\u0447\u0438\u043d\u0443, \u043f\u043e\u0447\u0438\u043d\u0438 \u0438 \u043f\u043e\u043a\u0440\u043e\u0439 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c\u00bb.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u0438\u0432\u043e\u0436\u0443 \u0441\u043e\u043a\u0440\u0430\u0449\u0451\u043d\u043d\u044b\u0439 \u043b\u043e\u0433 \u0441\u0435\u0441\u0441\u0438\u0438, \u043f\u043e\u043b\u043d\u044b\u0439 \u043b\u0435\u0436\u0438\u0442 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438:<\/p>\n<pre><code>\u0432\u044b: \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0433\u0434\u0435-\u0442\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u0430\u0440\u0441\u044f\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0430\u0442\u044b,\u043d\u0430\u0439\u0434\u0438 \u043f\u0440\u0438\u0447\u0438\u043d\u0443, \u043f\u043e\u0447\u0438\u043d\u0438 \u0438 \u043f\u043e\u043a\u0440\u043e\u0439 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c\u043f\u043b\u0430\u043d:[ ] \u043d\u0430\u0439\u0442\u0438 \u043a\u043e\u0434, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0434\u0430\u0442[ ] \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0442\u0435\u0441\u0442\u044b, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043f\u0430\u0434\u0435\u043d\u0438\u044f[ ] \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443[ ] \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0439 \u0442\u0435\u0441\u0442 \u0438 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043e\u043d \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u2192 grep {\"pattern\": \"date|Date\", \"glob\": \"**\/*.py\"}\u2192 read_file {\"path\": \"parser\/dates.py\"}\u2192 run_command {\"command\": \"pytest tests\/ -x -q\"}kodo: \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442, \u0437\u043d\u0430\u0447\u0438\u0442 \u043a\u0435\u0439\u0441 \u0441 \u0431\u0430\u0433\u043e\u043c \u0438\u043c\u0438\u043d\u0435 \u043f\u043e\u043a\u0440\u044b\u0442. \u0412 parse_stmt_date \u0432\u0438\u0436\u0443 \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435: \u0438\u043d\u0434\u0435\u043a\u0441\u043c\u0435\u0441\u044f\u0446\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a MONTHS.index(token) + 1, \u043d\u043e \u0441\u043f\u0438\u0441\u043e\u043aMONTHS \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 11 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \"dec\" \u0432 \u043d\u0451\u043c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\u0414\u0435\u043a\u0430\u0431\u0440\u044c\u0441\u043a\u0438\u0435 \u0434\u0430\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0430\u0434\u0430\u0442\u044c \u0432 ValueError \u0438 \u0443\u0445\u043e\u0434\u0438\u0442\u044c\u0432 \u0432\u0435\u0442\u043a\u0443 fallback \u0441 \u043c\u043e\u043b\u0447\u0430\u043b\u0438\u0432\u043e\u0439 \u043f\u043e\u0434\u043c\u0435\u043d\u043e\u0439 \u043d\u0430 None.\u2192 edit_file {\"path\": \"parser\/dates.py\", \"old_str\": \"MONTHS = [...--- a\/parser\/dates.py+++ b\/parser\/dates.py@@ -14,7 +14,7 @@-MONTHS = [\"jan\", \"feb\", \"mar\", \"apr\", \"may\", \"jun\",-          \"jul\", \"aug\", \"sep\", \"oct\", \"nov\"]+MONTHS = [\"jan\", \"feb\", \"mar\", \"apr\", \"may\", \"jun\",+          \"jul\", \"aug\", \"sep\", \"oct\", \"nov\", \"dec\"]\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043a\u0443 \u043a parser\/dates.py? [y\/N] y\u2192 edit_file {\"path\": \"tests\/test_dates.py\", \"old_str\": \"\", ...}\u0421\u043e\u0437\u0434\u0430\u0442\u044c tests\/test_dates.py? [y\/N] y\u2192 run_command {\"command\": \"pytest tests\/test_dates.py -q\"}\u043f\u043b\u0430\u043d:[x] \u043d\u0430\u0439\u0442\u0438 \u043a\u043e\u0434, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0434\u0430\u0442[x] \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0442\u0435\u0441\u0442\u044b, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043f\u0430\u0434\u0435\u043d\u0438\u044f[x] \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443[x] \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0439 \u0442\u0435\u0441\u0442 \u0438 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043e\u043d \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442kodo: \u041f\u0440\u0438\u0447\u0438\u043d\u043e\u0439 \u0431\u044b\u043b \u043d\u0435\u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a MONTHS \u0431\u0435\u0437 \u0434\u0435\u043a\u0430\u0431\u0440\u044f, \u0438\u0437-\u0437\u0430\u0447\u0435\u0433\u043e \u0434\u0435\u043a\u0430\u0431\u0440\u044c\u0441\u043a\u0438\u0435 \u0434\u0430\u0442\u044b \u043c\u043e\u043b\u0447\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0438\u0441\u044c \u0432 None. \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u043f\u0438\u0441\u043e\u043a \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0442\u0435\u0441\u0442 \u043d\u0430 \u0432\u0441\u0435 12 \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u043f\u043b\u044e\u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u0435\u0439\u0441\u043d\u0430 \u0434\u0435\u043a\u0430\u0431\u0440\u044c. \u0412\u0441\u0435 \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e, \u043f\u043e\u043c\u0438\u043c\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u0430\u0433 \u043d\u0430\u0439\u0434\u0435\u043d \u0438 \u043f\u043e\u0447\u0438\u043d\u0435\u043d. \u0410\u0433\u0435\u043d\u0442 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0441\u043a\u0430\u043b, \u043f\u043e\u0442\u043e\u043c \u0447\u0438\u0442\u0430\u043b, \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b \u0442\u0435\u0441\u0442\u044b, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b, \u0440\u043e\u0432\u043d\u043e \u0432 \u0442\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043b\u043e\u0436\u0435\u043d \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c \u043f\u0440\u043e\u043c\u043f\u0442\u0435. \u041e\u043d \u0441\u0430\u043c \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0442\u0435\u0441\u0442\u044b \u0431\u0430\u0433 \u043d\u0435 \u043b\u043e\u0432\u044f\u0442, \u0438 \u0441\u0434\u0435\u043b\u0430\u043b \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434. \u041a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0448\u043b\u043e \u0447\u0435\u0440\u0435\u0437 \u0434\u0438\u0444\u0444 \u0443 \u043c\u0435\u043d\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u0418 \u043a\u043e\u0433\u0434\u0430 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u044f \u043e\u0442\u043a\u043b\u043e\u043d\u0438\u043b \u0435\u0433\u043e \u0442\u0435\u0441\u0442 (\u043e\u043d \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0430 \u044f \u0445\u043e\u0442\u0435\u043b \u0442\u0435\u0441\u0442 \u0447\u0435\u0440\u0435\u0437 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 API), \u0430\u0433\u0435\u043d\u0442 \u043d\u0435 \u0441\u0442\u0430\u043b \u0443\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u0430 \u0441\u043f\u0440\u043e\u0441\u0438\u043b, \u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e. \u0422\u0430 \u0441\u0430\u043c\u0430\u044f \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u0438\u0437 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f edit_file \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430.<\/p>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0443 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0438\u0434\u0438\u043b\u043b\u0438\u044e: \u0430\u0433\u0435\u043d\u0442 \u043d\u0435 \u0431\u0435\u0437\u0433\u0440\u0435\u0448\u0435\u043d. \u041d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e\u043d \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u0437\u0430\u0446\u0438\u043a\u043b\u0438\u043b\u0441\u044f \u043d\u0430 \u043f\u0430\u0440\u0435 \u00ab\u043f\u0440\u0430\u0432\u043a\u0430, \u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0442\u0435\u0441\u0442, \u043f\u0440\u0430\u0432\u043a\u0430\u00bb, \u043f\u043e\u043a\u0430 \u044f \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b \u0435\u0433\u043e \u0438 \u043d\u0435 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u0435, \u0430 \u043d\u0435 \u0432 \u043a\u043e\u0434\u0435. \u041b\u0438\u043c\u0438\u0442 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0446\u0438\u043a\u043b\u0430 \u0441 \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435\u0439 \u0441\u043b\u043e\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u044d\u0442\u043e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u0435\u0440\u0445 \u043d\u0430\u0448\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<h3>\u0427\u0442\u043e \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u043e \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u0430 \u043a\u0430\u0434\u0440\u043e\u043c<\/h3>\n<p>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0449\u0435\u0439, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u0431\u044b\u043b\u0430 \u0431\u044b \u0447\u0435\u0441\u0442\u043d\u043e\u0439, \u043d\u043e \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043e\u043d\u0430 \u0440\u0430\u0441\u043f\u0443\u0445\u043b\u0430 \u0431\u044b \u0432\u0434\u0432\u043e\u0435.<\/p>\n<p>\u0421\u0443\u0431\u0430\u0433\u0435\u043d\u0442\u044b. \u041a\u043e\u0433\u0434\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0432\u044b\u0433\u043e\u0434\u043d\u0435\u0435 \u043f\u043e\u0440\u043e\u0434\u0438\u0442\u044c \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430 \u0441 \u0447\u0438\u0441\u0442\u044b\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u0434\u0430\u0442\u044c \u0435\u043c\u0443 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0443\u044e \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430\u0437\u0430\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0436\u0438\u043c\u043a\u0443. \u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0447\u0438\u0441\u0442\u044b\u043c. \u0412 \u043d\u0430\u0448\u0435\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e: \u0441\u0443\u0431\u0430\u0433\u0435\u043d\u0442 \u044d\u0442\u043e \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0436\u0438\u0432\u0451\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 Agent \u0441 \u0443\u0440\u0435\u0437\u0430\u043d\u043d\u044b\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 (\u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0438\u0441\u043a, \u0431\u0435\u0437 \u043f\u0440\u0430\u0432\u043e\u043a).<\/p>\n<p>MCP, Model Context Protocol. \u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432: \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u044b, \u0442\u0440\u0435\u043a\u0435\u0440\u044b \u0437\u0430\u0434\u0430\u0447. \u041d\u0430\u0448 REGISTRY \u043f\u043e \u0434\u0443\u0445\u0443 \u0438 \u0435\u0441\u0442\u044c \u043a\u0440\u043e\u0448\u0435\u0447\u043d\u044b\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 MCP, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043f\u043e\u0447\u0442\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f.<\/p>\n<p>\u041a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u043c\u043f\u0442\u043e\u0432. \u0412 \u0430\u0433\u0435\u043d\u0442\u043d\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u044f\u0445 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0432\u0441\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e, \u0438 \u0431\u0435\u0437 prompt caching \u0432\u044b \u043f\u043b\u0430\u0442\u0438\u0442\u0435 \u0437\u0430 \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0442\u043e\u043a\u0435\u043d\u044b \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0440\u0430\u0437. \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u0435\u0448\u0430 \u0432 Anthropic API \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u0439 \u0432 \u0440\u0430\u0437\u044b, \u0438 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e \u043d\u0435 \u043e\u043f\u0446\u0438\u044f, \u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c.<\/p>\n<p>\u0421\u0442\u0440\u0438\u043c\u0438\u043d\u0433. \u041d\u0430\u0448 \u0430\u0433\u0435\u043d\u0442 \u043c\u043e\u043b\u0447\u0438\u0442, \u043f\u043e\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0443\u043c\u0430\u0435\u0442, \u0438 \u043d\u0430 \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0442\u0430\u0445 \u044d\u0442\u043e \u0440\u0430\u0437\u0434\u0440\u0430\u0436\u0430\u0435\u0442. \u0421\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u044b\u0439 API \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043d\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u0440\u0430\u0437\u0431\u043e\u0440 tool_use \u0431\u043b\u043e\u043a\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0443\u0447\u0435\u0431\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u044f \u0435\u0433\u043e \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u043a\u0438\u043d\u0443\u043b.<\/p>\n<h3>\u0412\u044b\u0432\u043e\u0434\u044b<\/h3>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0441\u044c \u043a \u0442\u0435\u0437\u0438\u0441\u0443 \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u0430. \u0411\u0430\u043b\u043b \u0431\u044b\u043b \u043f\u0440\u0430\u0432: \u0441\u0435\u043a\u0440\u0435\u0442\u0430 \u043d\u0435\u0442, \u0430\u0433\u0435\u043d\u0442 \u044d\u0442\u043e LLM, \u0446\u0438\u043a\u043b \u0438 \u0442\u043e\u043a\u0435\u043d\u044b. \u0412\u0440\u0435\u0434\u043d\u0430 \u043d\u0435 \u0441\u0430\u043c\u0430 \u044d\u0442\u0430 \u043f\u0440\u0430\u0432\u0434\u0430, \u0430 \u0442\u043e\u0447\u043a\u0430, \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0451. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443 \u043f\u0440\u0430\u0432\u0434\u044b \u0435\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430, \u0438 \u043e\u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435 \u043f\u0435\u0440\u0432\u043e\u0439: \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0434\u0435\u043c\u043e \u043d\u0430 400 \u0441\u0442\u0440\u043e\u043a \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0448\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0435\u0441\u044f\u0442\u043a\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043a\u0443\u0447\u043d\u043e\u0439 \u0441\u0430\u043d\u0438\u0442\u0430\u0440\u0438\u0435\u0439. \u041b\u0438\u043c\u0438\u0442 \u043d\u0430 \u0432\u044b\u0432\u043e\u0434 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f, \u043a\u043e\u043c\u043c\u0438\u0442 \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u0430\u0432\u043a\u043e\u0439, \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0430\u0441\u043f\u0443\u0445\u0448\u0435\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438, \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<p>\u041d\u0438 \u043e\u0434\u043d\u043e \u0438\u0437 \u043d\u0438\u0445 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0433\u0435\u043d\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0412\u0441\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u043e\u043d\u0438 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0442\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e elbow grease, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0438\u0441\u0430\u043b \u0411\u0430\u043b\u043b, \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0435\u0449\u0438: \u0432\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u0442\u0435 \u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u0430 \u0441\u0440\u0435\u0434\u0443 \u043e\u0431\u0438\u0442\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438. \u0427\u0435\u043c \u0447\u0435\u0441\u0442\u043d\u0435\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u0432 \u044d\u0442\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0442\u0435\u043c \u0443\u043c\u043d\u0435\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0435\u0451 \u043e\u0431\u0438\u0442\u0430\u0442\u0435\u043b\u044c.<\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 (412 \u0441\u0442\u0440\u043e\u043a, Python 3.11+, \u0438\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0442\u043e\u043b\u044c\u043a\u043e anthropic \u0438 pydantic) \u043b\u0435\u0436\u0438\u0442 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438: <a href=\"https:\/\/github.com\/olegshevt\/article-code-agent\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/olegshevt\/article-code-agent<\/a>. \u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0439\u0442\u0435, \u043b\u043e\u043c\u0430\u0439\u0442\u0435, \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0439\u0442\u0435 \u0441\u0432\u043e\u0451. \u0418 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u043a\u0430\u043a\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0432\u044b \u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c: \u0443 \u043c\u0435\u043d\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 lint_on_save \u0438 \u0441\u0443\u0431\u0430\u0433\u0435\u043d\u0442-\u0440\u0435\u0432\u044c\u044e\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0434\u0438\u0444\u0444\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430 \u043f\u0435\u0440\u0435\u0434 \u043f\u043e\u043a\u0430\u0437\u043e\u043c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1058794\/\">https:\/\/habr.com\/ru\/articles\/1058794\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0421\u0430\u043c\u044b\u0439 \u0446\u0438\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u043e \u043a\u043e\u0434\u0438\u043d\u0433-\u0430\u0433\u0435\u043d\u0442\u043e\u0432, \u00abHow to Build an Agent\u00bb \u0422\u043e\u0440\u0441\u0442\u0435\u043d\u0430 \u0411\u0430\u043b\u043b\u0430, \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u0435\u043d \u0438 \u0432\u0440\u0435\u0434\u0435\u043d \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. \u041f\u0440\u0435\u043a\u0440\u0430\u0441\u0435\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u0438\u0441\u0442\u0438\u043a\u0443: \u0430\u0433\u0435\u043d\u0442 \u044d\u0442\u043e LLM, \u0446\u0438\u043a\u043b \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u043e\u043a\u0435\u043d\u043e\u0432, 400 \u0441\u0442\u0440\u043e\u043a, \u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0436\u0435 \u043f\u0440\u0430\u0432\u0438\u0442 \u0432\u0430\u0448\u0438 \u0444\u0430\u0439\u043b\u044b. \u0412\u0440\u0435\u0434\u0435\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e. \u0410 \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043e\u0434\u043d\u0430 \u0434\u0435\u0441\u044f\u0442\u0430\u044f \u043f\u0443\u0442\u0438.\u042f \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b \u043d\u0430 \u0441\u0435\u0431\u0435. \u041f\u0440\u043e\u0448\u0451\u043b \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u0437\u0430 \u0432\u0435\u0447\u0435\u0440, \u043f\u043e\u0440\u0430\u0434\u043e\u0432\u0430\u043b\u0441\u044f \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 fizzbuzz.js, \u0430 \u0447\u0435\u0440\u0435\u0437 \u0434\u0432\u0430 \u0434\u043d\u044f \u0432\u044b\u043a\u0438\u043d\u0443\u043b \u0430\u0433\u0435\u043d\u0442\u0430 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043a \u043d\u0435\u043c\u0443 \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0441\u044f. \u0418\u0433\u0440\u0443\u0448\u043a\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0430 \u0444\u0430\u0439\u043b\u044b \u0431\u0435\u0437 \u043f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430, \u043d\u0435 \u0443\u043c\u0435\u043b\u0430 \u0438\u0441\u043a\u0430\u0442\u044c \u043f\u043e \u043a\u043e\u0434\u0443 \u0438 \u0437\u0430\u0445\u043b\u0451\u0431\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c \u043d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435. \u041e\u0434\u043d\u0430\u0436\u0434\u044b \u043e\u043d\u0430 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b \u0431\u044d\u043a\u0430\u043f\u044b. \u0414\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0442\u0430\u043a\u043e\u043c\u0443 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u043d\u0438\u043a\u0442\u043e \u0432 \u0437\u0434\u0440\u0430\u0432\u043e\u043c \u0443\u043c\u0435, \u0438 \u0432 \u044d\u0442\u043e\u043c \u0447\u0435\u0441\u0442\u043d\u043e\u043c \u043f\u0440\u0438\u0437\u043d\u0430\u043d\u0438\u0438 \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0431\u0438\u0434\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0411\u0430\u043b\u043b\u0430: \u043e\u043d \u0438 \u043d\u0435 \u043e\u0431\u0435\u0449\u0430\u043b \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043e\u043d \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043f\u0440\u0438\u043d\u0446\u0438\u043f.\u041c\u0435\u043d\u044f \u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0434\u0435\u0432\u044f\u0442\u044c \u0434\u0435\u0441\u044f\u0442\u044b\u0445: \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442 \u0434\u0435\u043c\u043e \u043e\u0442 Claude Code, Aider \u0438 Amp. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u0430\u0433\u0435\u043d\u0442\u0430 \u043d\u0430 Python \u0441 \u043d\u0443\u043b\u044f \u0438 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0438\u0445: \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043a\u043e\u0434\u0443, \u0434\u0438\u0444\u0444\u044b \u0441 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c, \u043c\u043e\u0434\u0435\u043b\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0434\u043b\u044f shell, \u0447\u0435\u043a\u043f\u043e\u0438\u043d\u0442\u044b \u0447\u0435\u0440\u0435\u0437 git, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 400 \u0441\u0442\u0440\u043e\u043a, \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0440\u0430\u0431\u043e\u0447\u0438\u0439, \u043f\u043e\u043b\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043b\u0435\u0436\u0438\u0442 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 (\u0441\u0441\u044b\u043b\u043a\u0430 \u0432 \u043a\u043e\u043d\u0446\u0435).\u0421\u0440\u0430\u0437\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0430. \u042d\u0442\u043e \u043d\u0435 \u00ab\u0443\u0431\u0438\u0439\u0446\u0430 Claude Code\u00bb \u0438 \u043d\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442. \u042d\u0442\u043e \u0443\u0447\u0435\u0431\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0447\u0435\u0441\u0442\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0438\u0437 \u043a\u0430\u043a\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0430\u0433\u0435\u043d\u0442. \u041a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437 \u043d\u0438\u0445 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u043a\u0443\u0447\u043d\u043e\u0435. \u0412\u043c\u0435\u0441\u0442\u0435 \u043e\u043d\u0438 \u043c\u0435\u043d\u044f\u044e\u0442 \u0432\u0441\u0451.\u041f\u043e\u0447\u0435\u043c\u0443 \u0432\u0441\u0435 \u0430\u0433\u0435\u043d\u0442\u044b \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0415\u0441\u043b\u0438 \u0441\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043f\u0443\u0441 \u0441 \u043b\u044e\u0431\u043e\u0433\u043e \u043a\u043e\u0434\u0438\u043d\u0433-\u0430\u0433\u0435\u043d\u0442\u0430, \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435. \u041c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 JSON-\u0441\u0445\u0435\u043c\u0430\u043c\u0438. \u041e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043b\u0438\u0431\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u043b\u0438\u0431\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u00ab\u0432\u044b\u0437\u043e\u0432\u0438 \u043c\u043d\u0435 \u0432\u043e\u0442 \u044d\u0442\u043e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0441 \u0432\u043e\u0442 \u044d\u0442\u0438\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438\u00bb. \u0412\u0430\u0448 \u043a\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u044b\u0437\u043e\u0432, \u043a\u043b\u0430\u0434\u0451\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0438 \u0441\u043d\u043e\u0432\u0430 \u0434\u0451\u0440\u0433\u0430\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c. \u0418 \u0442\u0430\u043a \u043f\u043e \u043a\u0440\u0443\u0433\u0443, \u043f\u043e\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435 \u0440\u0435\u0448\u0438\u0442, \u0447\u0442\u043e \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0430.\u0412\u0441\u0451. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0443 \u043d\u0435\u0451 \u043f\u0440\u043e\u0441\u0442\u044b\u0435: \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0444\u0430\u0439\u043b, \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0444\u0430\u0439\u043b, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443. \u0421\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u00ab\u0432\u044b\u043f\u0443\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u043e\u0448\u0438\u0431\u043e\u043a\u00bb \u0438 \u00ab\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438\u00bb, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0430\u043a \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u0435\u0442 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0436\u0438\u0432\u0451\u0442 \u043d\u0435 \u0432 \u0432\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435, \u0430 \u0432 \u0432\u0435\u0441\u0430\u0445 \u043c\u043e\u0434\u0435\u043b\u0438. \u0412\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043a\u0440\u043e\u043c\u043d\u0435\u0435: \u043d\u0435 \u043c\u0435\u0448\u0430\u0442\u044c \u0435\u0439 \u0438 \u0432\u043e\u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u0430\u0445\u043e\u0432\u044b\u0432\u0430\u0442\u044c.\u041e\u0442\u0441\u044e\u0434\u0430 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u0430\u0436\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0445\u043e\u0447\u0443 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u0447\u043a\u0443. \u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u0433\u0435\u043d\u0442\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0445\u0438\u0442\u0440\u043e\u0441\u0442\u044c\u044e \u0446\u0438\u043a\u043b\u0430, \u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c. \u041f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u0447\u0442\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430\u0443\u0433\u0430\u0434. \u0414\u0438\u0444\u0444 \u0432\u043c\u0435\u0441\u0442\u043e \u00ab\u0444\u0430\u0439\u043b \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d\u00bb. \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0441\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043a \u043e\u0434\u043d\u043e\u043c\u0443: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0440\u0435\u0434\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443 \u043d\u0435 \u0441\u0442\u0440\u0430\u0448\u043d\u043e.\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u044b\u0440\u044f\u0442\u044c \u0432 \u043a\u043e\u0434, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0446\u0435\u043b\u0438\u043a\u043e\u043c.\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u0434\u0438\u043d\u0433 \u0430\u0433\u0435\u043d\u0442\u0430\u0421\u043b\u0435\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 REPL. \u0412 \u0446\u0435\u043d\u0442\u0440\u0435 \u0430\u0433\u0435\u043d\u0442\u043d\u044b\u0439 \u0446\u0438\u043a\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u0438 \u0433\u043e\u043d\u044f\u0435\u0442 \u0435\u0451 \u0432 Claude API. \u041a \u0446\u0438\u043a\u043b\u0443 \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0435\u043d\u044b \u0434\u0432\u0430 \u043a\u043e\u043d\u0442\u0443\u0440\u0430: Context Manager \u0441\u043b\u0435\u0434\u0438\u0442, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043d\u0435 \u0440\u0430\u0437\u0440\u043e\u0441\u043b\u0430\u0441\u044c \u0434\u043e \u043e\u0442\u043a\u0430\u0437\u0430, \u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u043f\u0442 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0432\u043f\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 AGENT.md.\u0412\u043d\u0438\u0437\u0443 \u0440\u0435\u0435\u0441\u0442\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0418\u0445 \u0448\u0435\u0441\u0442\u044c: grep \u0438 glob_files \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430, read_file \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f, edit_file \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u043e\u043a, run_command \u0434\u043b\u044f shell \u0438 update_plan \u0434\u043b\u044f \u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u0447. \u0414\u0432\u0430 \u0438\u0437 \u043d\u0438\u0445, edit_file \u0438 run_command, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0447\u0435\u0440\u0435\u0437 Permission Gate: \u043b\u044e\u0431\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0438\u0444\u0444\u043e\u043c \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f, \u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432\u043d\u0435 \u0431\u0435\u043b\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u0421\u043f\u0440\u0430\u0432\u0430 \u0447\u0435\u043a\u043f\u043e\u0438\u043d\u0442\u044b: \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0430\u0433\u0435\u043d\u0442 \u0434\u0435\u043b\u0430\u0435\u0442 git-\u043a\u043e\u043c\u043c\u0438\u0442, \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \/undo \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0451 \u043e\u0434\u043d\u0438\u043c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435\u043c.\u0420\u0435\u0435\u0441\u0442\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432: \u0441\u0445\u0435\u043c\u0430 \u0438\u0437 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439, \u0430 \u043d\u0435 JSON \u0440\u0443\u043a\u0430\u043c\u0438\u0412 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0435 \u0411\u0430\u043b\u043b\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e: \u0438\u043c\u044f, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, JSON-\u0441\u0445\u0435\u043c\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0414\u043b\u044f \u0442\u0440\u0451\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0442\u0435\u0440\u043f\u0438\u043c\u043e. \u0414\u043b\u044f \u0448\u0435\u0441\u0442\u0438 \u0443\u0436\u0435 \u0431\u043e\u043b\u044c\u043d\u043e, \u0430 \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043d\u0430\u0447\u043d\u0451\u0442\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c (\u0430 \u0432\u044b \u043d\u0430\u0447\u043d\u0451\u0442\u0435), \u0440\u0443\u0447\u043d\u044b\u0435 \u0441\u0445\u0435\u043c\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u044f\u0442\u0441\u044f \u0432 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0433\u043b\u0443\u043f\u044b\u0445 \u0431\u0430\u0433\u043e\u0432: \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043b\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0437\u0430\u0431\u044b\u043b\u0438 \u0432 \u0441\u0445\u0435\u043c\u0435, \u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0447\u0430\u0441 \u0437\u043e\u0432\u0451\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0441\u043e \u0441\u0442\u0430\u0440\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430.Python \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e. \u0423 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0451 \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430: \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438 \u0442\u0438\u043f\u043e\u0432 \u0438 docstring. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c Pydantic \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e JSON-\u0441\u0445\u0435\u043c\u0443:import inspectfrom dataclasses import dataclassfrom typing import Callablefrom pydantic import create_model@dataclassclass Tool:    name: str    description: str    input_schema: dict    handler: CallableREGISTRY: dict[str, Tool] = {}def tool(fn: Callable) -&gt; Callable:    &#171;&#187;&#187;\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440: \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0430\u0433\u0435\u043d\u0442\u0430.&#187;&#187;&#187;    sig = inspect.signature(fn)    fields = {}    for pname, param in sig.parameters.items():        annotation = param.annotation        if annotation is inspect.Parameter.empty:            annotation = str        default = param.default        if default is inspect.Parameter.empty:            default = &#8230;        fields[pname] = (annotation, default)    schema = create_model(f&#187;{fn.__name__}_input&#187;, **fields).model_json_schema()    schema.pop(&#171;title&#187;, None)    REGISTRY[fn.__name__] = Tool(        name=fn.__name__,        description=inspect.getdoc(fn) or &#171;&#187;,        input_schema=schema,        handler=fn,    )    return fn\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u043e\u043c:@tooldef glob_files(pattern: str) -&gt; str:    &#171;&#187;&#187;\u041d\u0430\u0439\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u043f\u043e glob-\u0448\u0430\u0431\u043b\u043e\u043d\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 &#8216;**\/*.py&#8217;.    \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e \u0434\u0430\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0441\u0432\u0435\u0436\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443.&#187;&#187;&#187;    hits = [        p for p in WORKDIR.glob(pattern)        if p.is_file() and &#171;.git&#187; not in p.parts    ]    hits.sort(key=lambda p: p.stat().st_mtime, reverse=True)    listing = &#171;\\n&#187;.join(str(p.relative_to(WORKDIR)) for p in hits[:200])    return listing or &#171;\u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e&#187;\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0434\u0432\u0435 \u043c\u0435\u043b\u043e\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u043c\u0435\u043b\u043e\u0447\u0438.\u041f\u0435\u0440\u0432\u0430\u044f: docstring \u0437\u0434\u0435\u0441\u044c \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043d\u0435 \u0434\u043b\u044f \u043a\u043e\u043b\u043b\u0435\u0433, \u0430 \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438. \u042d\u0442\u043e \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u043c\u043f\u0442\u0430. \u00ab\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e \u0434\u0430\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0441\u0432\u0435\u0436\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443\u00bb \u044d\u0442\u043e \u043d\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f, \u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430: \u0435\u0441\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u0449\u0435\u0442 \u00ab\u0442\u043e\u0442 \u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0438\u00bb, \u043e\u043d\u0430 \u043f\u043e\u0439\u043c\u0451\u0442, \u0447\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0432\u0435\u0440\u0445 \u0441\u043f\u0438\u0441\u043a\u0430.\u0412\u0442\u043e\u0440\u0430\u044f: \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e mtime. \u042f \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u0451\u043c \u0432 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 Claude Code \u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435 \u043f\u043e\u043d\u044f\u043b, \u0437\u0430\u0447\u0435\u043c \u043e\u043d. \u0410 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043c\u0435\u0442\u0438\u043b \u043d\u0430 \u0441\u0432\u043e\u0438\u0445 \u0441\u0435\u0441\u0441\u0438\u044f\u0445: \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u00ab\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u043b\u0438\u00bb, \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438 \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0434\u0430\u0447\u0438. \u041e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u0441 sort, \u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u0439 \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435.\u041f\u043e\u0438\u0441\u043a: \u0430\u0433\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0432 grep, \u0447\u0438\u0442\u0430\u0435\u0442 \u0432\u0441\u043b\u0435\u043f\u0443\u044e\u042d\u0442\u043e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0430\u0433\u0435\u043d\u0442\u0430 \u0438\u0437 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0430. \u0422\u0430\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0433\u043b\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0445 \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u041d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438\u0437 \u043f\u044f\u0442\u0438 \u0444\u0430\u0439\u043b\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438\u0437 \u043f\u044f\u0442\u0438 \u0441\u043e\u0442\u0435\u043d \u0444\u0430\u0439\u043b\u043e\u0432 \u0430\u0433\u0435\u043d\u0442 \u043b\u0438\u0431\u043e \u0441\u0434\u0430\u0451\u0442\u0441\u044f, \u043b\u0438\u0431\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0441\u0451 \u043f\u043e\u0434\u0440\u044f\u0434, \u0441\u0436\u0438\u0433\u0430\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0431\u0430\u043a\u0430 \u043d\u0430 \u0441\u0432\u0435\u0442\u043e\u0444\u043e\u0440\u0430\u0445.\u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0430\u0433\u0435\u043d\u0442\u044b \u0442\u0440\u0430\u0442\u044f\u0442 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u043f\u043e\u0438\u0441\u043a. \u0414\u0430\u0434\u0438\u043c \u043d\u0430\u0448\u0435\u043c\u0443 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435:import re@tooldef grep(pattern: str, glob: str = &#171;**\/*&#187;) -&gt; str:    &#171;&#187;&#187;\u041f\u043e\u0438\u0441\u043a \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0444\u0430\u0439\u043b:\u043d\u043e\u043c\u0435\u0440:\u0442\u0435\u043a\u0441\u0442.&#187;&#187;&#187;    rx = re.compile(pattern)    out: list[str] = []    for p in WORKDIR.glob(glob):        if not p.is_file() or &#171;.git&#187; in p.parts:            continue        try:            text = p.read_text(encoding=&#187;utf-8&#8243;, errors=&#187;ignore&#187;)        except OSError:            continue        for n, line in enumerate(text.splitlines(), 1):            if rx.search(line):                out.append(f&#187;{p.relative_to(WORKDIR)}:{n}: {line.strip()}&#187;)                if len(out) &gt;= 100:                    return &#171;\\n&#187;.join(out) + &#171;\\n&#8230; \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439, \u0443\u0442\u043e\u0447\u043d\u0438 \u0437\u0430\u043f\u0440\u043e\u0441&#187;    return &#171;\\n&#187;.join(out) or &#171;\u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u043d\u0435\u0442&#187;\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430\u0440\u043e\u0447\u0438\u0442\u043e \u043d\u0430\u0438\u0432\u043d\u0430\u044f: \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c Python. \u0412 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d\u0435 \u0432\u044b \u043f\u043e\u0437\u043e\u0432\u0451\u0442\u0435 ripgrep \u0447\u0435\u0440\u0435\u0437 subprocess, \u043e\u043d \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0438. \u041d\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u0430\u0436\u043d\u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u044b \u0442\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.\u0424\u043e\u0440\u043c\u0430\u0442 \u00ab\u0444\u0430\u0439\u043b:\u043d\u043e\u043c\u0435\u0440:\u0442\u0435\u043a\u0441\u0442\u00bb \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u043d\u0430\u0435\u0442 \u043d\u0430\u0438\u0437\u0443\u0441\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0438\u0434\u0435\u043b\u0430 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0432\u044b\u0432\u043e\u0434\u043e\u0432 grep \u0432 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0435 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0439\u0442\u0435 \u0441\u0432\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0442\u043e\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u044b\u0440\u043e\u0441\u043b\u0430.\u041b\u0438\u043c\u0438\u0442 \u0432 100 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u0441 \u0447\u0435\u0441\u0442\u043d\u044b\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u00ab\u0443\u0442\u043e\u0447\u043d\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u00bb \u044d\u0442\u043e \u0437\u0430\u0449\u0438\u0442\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430 \u0432\u0438\u0434\u0430 def \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0432\u0435\u0440\u043d\u0451\u0442 \u0442\u044b\u0441\u044f\u0447\u0438 \u0441\u0442\u0440\u043e\u043a, \u0438 \u0431\u0435\u0437 \u043b\u0438\u043c\u0438\u0442\u0430 \u043e\u0434\u0438\u043d \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u044a\u0435\u0441\u0442 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0442\u044b\u0441\u044f\u0447 \u0442\u043e\u043a\u0435\u043d\u043e\u0432. \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435: \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0431\u0440\u0435\u0437\u043a\u0435 \u0430\u0434\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043e \u043c\u043e\u0434\u0435\u043b\u0438, \u0438 \u043e\u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442, \u0441\u0443\u0436\u0430\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d.\u0418 \u0442\u0440\u0435\u0442\u044c\u0435: errors=&#187;ignore&#187; \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438. \u0411\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 \u0438 \u0444\u0430\u0439\u043b\u044b \u0432 \u044d\u043a\u0437\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430\u0445 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u043e\u043d\u044f\u0442\u044c \u043f\u043e\u0438\u0441\u043a. \u041e\u0448\u0438\u0431\u043a\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u0430\u043b\u0438\u0442 \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u044d\u0442\u043e \u0445\u0443\u0434\u0448\u0435\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0441 \u0430\u0433\u0435\u043d\u0442\u043e\u043c \u043f\u043e\u0441\u0440\u0435\u0434\u0438 \u0434\u043b\u0438\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.\u0422\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438 \u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b \u0438 \u043a read_file: \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b offset \u0438 limit \u043f\u043b\u044e\u0441 \u043f\u0440\u0438\u043f\u0438\u0441\u043a\u0430 \u00ab\u0432 \u0444\u0430\u0439\u043b\u0435 N \u0441\u0442\u0440\u043e\u043a, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0435 \u0432\u0441\u0451\u00bb. \u041c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0443\u043c\u0435\u0435\u0442 \u043b\u0438\u0441\u0442\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0435\u0439 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0442\u043e \u043b\u0438\u0441\u0442\u0430\u0442\u044c.\u041f\u0440\u0430\u0432\u043a\u0438: \u0434\u0438\u0444\u0444, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f\u041c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0443 \u043d\u0430\u0441 \u0442\u0430 \u0436\u0435, \u0447\u0442\u043e \u0443 \u0411\u0430\u043b\u043b\u0430 \u0438 \u0443 \u0441\u0430\u043c\u043e\u0433\u043e Claude Code: \u0437\u0430\u043c\u0435\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 old_str \u043d\u0430 new_str. \u041c\u043e\u0434\u0435\u043b\u0438 \u043b\u044e\u0431\u044f\u0442 \u044d\u0442\u043e\u0442 \u0444\u043e\u0440\u043c\u0430\u0442, \u043e\u043d \u043d\u0430\u0434\u0451\u0436\u043d\u0435\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0430\u0442\u0447\u0435\u0439 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 unified diff (\u0441 \u043d\u0438\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0443\u0442\u0430\u044e\u0442\u0441\u044f \u0432 \u043d\u043e\u043c\u0435\u0440\u0430\u0445 \u0441\u0442\u0440\u043e\u043a) \u0438 \u044d\u043a\u043e\u043d\u043e\u043c\u043d\u0435\u0435 \u043f\u043e\u043b\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438 \u0444\u0430\u0439\u043b\u0430.\u041d\u043e \u0432\u043e\u043a\u0440\u0443\u0433 \u044d\u0442\u043e\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0438 \u043c\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u0442\u043e, \u0447\u0435\u0433\u043e \u0432 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e: \u043f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0438 \u044f\u0432\u043d\u043e\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430.import difflibdef show_diff(old: str, new: str, path: str) -&gt; str:    diff = difflib.unified_diff(        old.splitlines(keepends=True),        new.splitlines(keepends=True),        fromfile=f&#187;a\/{path}&#187;, tofile=f&#187;b\/{path}&#187;,    )    return &#171;&#187;.join(diff)def approve(question: str) -&gt; bool:    answer = input(f&#187;\\n\\033[91m{question}\\033[0m [y\/N] &#171;).strip().lower()    return answer in (&#171;y&#187;, &#171;yes&#187;, &#171;\u0434&#187;, &#171;\u0434\u0430&#187;)@tooldef edit_file(path: str, old_str: str, new_str: str) -&gt; str:    &#171;&#187;&#187;\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 old_str \u043d\u0430 new_str \u0432 \u0444\u0430\u0439\u043b\u0435.    old_str \u043e\u0431\u044f\u0437\u0430\u043d \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043e\u0442\u0441\u0442\u0443\u043f\u044b.    \u041f\u0443\u0441\u0442\u043e\u0439 old_str \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c new_str.&#187;&#187;&#187;    target = resolve(path)    if old_str == &#171;&#187;:        if target.exists():            return &#171;\u043e\u0448\u0438\u0431\u043a\u0430: \u0444\u0430\u0439\u043b \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u043f\u0435\u0440\u0435\u0434\u0430\u0439 \u043d\u0435\u043f\u0443\u0441\u0442\u043e\u0439 old_str&#187;        print(show_diff(&#171;&#187;, new_str, path))        if not approve(f&#187;\u0421\u043e\u0437\u0434\u0430\u0442\u044c {path}?&#187;):            return &#171;\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u043a\u043b\u043e\u043d\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430&#187;&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-487187","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/487187","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=487187"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/487187\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=487187"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=487187"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=487187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}