{"id":468745,"date":"2025-07-26T15:00:11","date_gmt":"2025-07-26T15:00:11","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=468745"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=468745","title":{"rendered":"<span>Githab CLI \u0438 Github Actions \u043d\u0430 \u0441\u0442\u0440\u0430\u0436\u0435 \u0432\u0430\u0439\u0431 \u043a\u043e\u0434\u0438\u043d\u0433\u0430 \u0441 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u043c\u0438 \u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438 Cursor<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u0432\u0435\u043d\u0438\u0440 \u0412\u043e\u0440\u043e\u043d\u043e\u0432 \u0438 \u044f \u043e\u0442\u0432\u0435\u0447\u0430\u044e \u0437\u0430 \u041b\u0430\u0431\u043e\u0440\u0430\u0442\u043e\u0440\u0438\u044e \u0438\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u0439 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 &#171;\u0414\u0410\u0420&#187;. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0438 \u0432\u0435\u043b\u0438\u043a\u043e\u043b\u0435\u043f\u043d\u044b\u0439 Github Cli, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043b \u043a\u0443\u0447\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<h3>\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041b\u0435\u0442\u043e. \u0412\u0440\u0435\u043c\u044f \u043e\u0442\u043f\u0443\u0441\u043a\u043e\u0432. \u0414\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0447\u0435\u0433\u043e.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043b\u0438\u043f\u0430\u0442\u044c \u0432 \u0440\u0438\u043b\u0441\u0430\u0445 \u0438\u043b\u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u044c\u0447\u0438\u043a\u0430\u0445 \u043d\u0430 \u043f\u043b\u044f\u0436\u0435, \u043d\u043e \u0437\u0430\u0447\u0435\u043c, \u0435\u0441\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u0438\u043a\u043e\u043b\u044c\u043d\u043e\u0435 \u0441 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0435\u0440\u0435\u0437 \u0430\u0433\u0435\u043d\u0442\u043e\u0432. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 <a href=\"https:\/\/cursor.com\/agents\" rel=\"noopener noreferrer nofollow\">\u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e<\/a> (\u0441\u0442\u043e\u0438\u0442 20 USD \u0432 \u043c\u0435\u0441\u044f\u0446 \u0438\u043b\u0438 3 \u0442\u044b\u0441 \u0440\u0443\u0431 \u0432 \u0433\u043e\u0434, \u0435\u0441\u043b\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430\u0442\u044c).<\/p>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/164\/b3a\/12e\/164b3a12e4afddc2884a9e502d1b066e.png\" alt=\"\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u043c\u043f\u0442\" title=\"\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u043c\u043f\u0442\" width=\"576\" height=\"1280\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/164\/b3a\/12e\/164b3a12e4afddc2884a9e502d1b066e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/164\/b3a\/12e\/164b3a12e4afddc2884a9e502d1b066e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u043c\u043f\u0442<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u0442\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 (\u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <a href=\"https:\/\/github.com\/RobotAvi\/MoneyGame\" rel=\"noopener noreferrer nofollow\">\u0442\u0430\u043a\u043e\u0439<\/a>) \u0438\u043b\u0438 \u0431\u0435\u0440\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u044b\u0439. \u0414\u0430\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u0430\u0433\u0435\u043d\u0442\u0443 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u0433\u0440\u0443. <\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8bc\/ca0\/370\/8bcca03708ad8546af31737ff2dc3a02.png\" alt=\"\u0412\u044b\u0431\u043e\u0440 \u043c\u043e\u0434\u0435\u043b\u0435\u0439\" title=\"\u0412\u044b\u0431\u043e\u0440 \u043c\u043e\u0434\u0435\u043b\u0435\u0439\" width=\"458\" height=\"418\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/8bc\/ca0\/370\/8bcca03708ad8546af31737ff2dc3a02.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8bc\/ca0\/370\/8bcca03708ad8546af31737ff2dc3a02.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0412\u044b\u0431\u043e\u0440 \u043c\u043e\u0434\u0435\u043b\u0435\u0439<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u043a\u0430 \u0430\u0433\u0435\u043d\u0442 \u0434\u0435\u043b\u0430\u0435\u0442 \u0438\u0433\u0440\u0443 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u0440\u043e UI. \u0410\u0433\u0435\u043d\u0442 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 Claude Sonnet. \u041a\u043e\u0433\u0434\u0430 \u0442\u043e\u043a\u0435\u043d\u044b \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 Auto \u0440\u0435\u0436\u0438\u043c. <\/p>\n<\/div>\n<p>\u0410\u0433\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e. \u042f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0432\u0435\u0441\u0442\u0438 \u0434\u0440\u0435\u0432\u043e\u0432\u0438\u0434\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0437\u0430\u0434\u0430\u0447 \u0434\u043b\u044f \u0430\u0433\u0435\u043d\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0441\u0430\u043c\u043e\u043c\u0443 \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c\u0441\u044f. \u0418\u043d\u0430\u0447\u0435 \u0443\u0436\u0435 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 3-4 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0431\u044b\u0442\u044c \u0441 \u043a\u0435\u043c \u0438 \u043e \u0447\u0435\u043c \u0434\u043e\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u043b\u0441\u044f. \u0410\u0433\u0435\u043d\u0442\u044b \u043b\u044e\u0431\u044f\u0442:<\/p>\n<ol>\n<li>\n<p>\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u0434\u043e\u0434\u0435\u043b\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u043e \u043a\u043e\u043d\u0446\u0430<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u0434 \u0443 \u0441\u0435\u0431\u044f \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u0434 \u0443 \u0441\u0435\u0431\u044f, \u043d\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u044f\u0432\u043b\u044f\u0442\u044c \u0438\u0437\u043b\u0438\u0448\u043d\u044e\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u0438\u0432\u0443<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0442\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u0438\u0432\u0443 \u0438 \u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0443 \u0432\u0430\u0441 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u044e<\/p>\n<\/li>\n<\/ol>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/973\/696\/ec7\/973696ec74ce9983a234d47b1af57b64.png\" width=\"654\" height=\"304\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/973\/696\/ec7\/973696ec74ce9983a234d47b1af57b64.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/973\/696\/ec7\/973696ec74ce9983a234d47b1af57b64.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0434\u043e \u0447\u0435\u0442\u043a\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0432\u0430\u0448\u0438\u0445 \u0432\u0437\u0430\u0438\u043c\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0439 \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u0430\u0433\u0435\u043d\u0442\u043e\u043c. \u0418\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u0432 Obsidian \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c.<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/875\/89b\/dbf\/87589bdbfbc6e8dbc1e4baf682f79c0a.png\" alt=\"\u0427\u0430\u0442\" title=\"\u0427\u0430\u0442\" width=\"576\" height=\"1280\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/875\/89b\/dbf\/87589bdbfbc6e8dbc1e4baf682f79c0a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/875\/89b\/dbf\/87589bdbfbc6e8dbc1e4baf682f79c0a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0427\u0430\u0442<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u00a0\u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438 \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438. \u041f\u0435\u0440\u0432\u043e\u0435\u00a0\u2014 \u0447\u0430\u0442, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u00a0\u0445\u043e\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u00ab\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f\u00a0\u043b\u0438?\u00bb<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f1f\/34b\/608\/f1f34b608485518595edb1cd4ef79558.png\" width=\"576\" height=\"1280\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f1f\/34b\/608\/f1f34b608485518595edb1cd4ef79558.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f1f\/34b\/608\/f1f34b608485518595edb1cd4ef79558.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0430, Diff, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0438\u0434\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0430\u0433\u0435\u043d\u0442\u0430.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c Pull Request \u0438 Merge \u043f\u0440\u044f\u043c\u043e \u0432 \u0430\u0433\u0435\u043d\u0442\u0435.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u0435\u0449\u0438:<\/p>\n<p>1. \u0410\u0433\u0435\u043d\u0442\u044b \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0442 \u0432\u0435\u0442\u043a\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a. \u0415\u0441\u043b\u0438 \u0437\u0430 \u044d\u0442\u0438\u043c \u043d\u0435 \u0441\u043b\u0435\u0434\u0438\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0432\u0435\u0442\u043e\u043a \u0441 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u043c\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c\u0438.<\/p>\n<p>2. \u0410\u0433\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0442\u0435\u0440\u044f\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u0441 Git, \u043d\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0438\u043c \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b. \u0418\u043d\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043d\u043e\u043f\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Pull Request \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0435\u0437 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u044b. \u0422\u043e\u0433\u0434\u0430 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0430\u0433\u0435\u043d\u0442\u0443, \u0433\u0434\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0434\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u0430, \u0442\u043e\u043a\u0435\u043d\u044b. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0430\u043d\u0430\u0440\u0445\u0438\u0438 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043b\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u043f\u0440\u0430\u0432\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0434\u0430\u0435\u0442\u0435 \u0430\u0433\u0435\u043d\u0442\u0430\u043c.<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1ab\/d82\/457\/1abd8245747e267c8439079316fea469.png\" width=\"576\" height=\"1280\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/1ab\/d82\/457\/1abd8245747e267c8439079316fea469.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1ab\/d82\/457\/1abd8245747e267c8439079316fea469.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412 \u043e\u043f\u0446\u0438\u044f\u0445 \u043a \u0430\u0433\u0435\u043d\u0442\u0430\u043c \u0435\u0441\u0442\u044c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f BugBot, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0432 \u0432\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435 \u0431\u0430\u0433\u0438. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0445\u043e\u0440\u043e\u0448\u0430\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0430, \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0432\u0430\u043b\u0438\u0432\u0448\u0438\u0435\u0441\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0435. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u043d\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u0435 Dashboard.<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c13\/44e\/3b7\/c1344e3b72c8c56d1ea25a79232188eb.png\" width=\"479\" height=\"932\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c13\/44e\/3b7\/c1344e3b72c8c56d1ea25a79232188eb.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c13\/44e\/3b7\/c1344e3b72c8c56d1ea25a79232188eb.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u043e\u043a\u0430 \u043c\u044b \u0438\u0437\u0443\u0447\u0430\u043b\u0438 \u0430\u0433\u0435\u043d\u0442\u0430, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0434\u043e\u0431\u0438\u0435 \u0438\u0433\u0440\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u0430\u0436\u0435 \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u043e \u0438\u0433\u0440\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443.<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fde\/63f\/a6c\/fde63fa6c59a02f78241b03bda121beb.png\" width=\"655\" height=\"324\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/fde\/63f\/a6c\/fde63fa6c59a02f78241b03bda121beb.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fde\/63f\/a6c\/fde63fa6c59a02f78241b03bda121beb.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c, \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0432\u044f\u0437\u044c \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438. <\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0e9\/afe\/ae2\/0e9afeae2c1290ab9ebf6b7a5d78e028.png\" width=\"1582\" height=\"912\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/0e9\/afe\/ae2\/0e9afeae2c1290ab9ebf6b7a5d78e028.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0e9\/afe\/ae2\/0e9afeae2c1290ab9ebf6b7a5d78e028.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0434\u0438\u0437\u0430\u0439\u043d\u0443 \u0438 \u043f\u0440\u043e\u0441\u0438\u043c \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u043c\u043f\u0442\u044b \u0434\u043b\u044f Midjourney \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432. \u0413\u043e\u0442\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u043c\u043f\u0442\u044b \u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0441\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0432 md \u0444\u0430\u0439\u043b.<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f92\/782\/3bf\/f927823bf6bf9b12f2055db53bc3ee0c.png\" alt=\"\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \u043f\u043e\u0445\u043e\u0440\u043e\u0448\u0435\u043b\u043e, \u043a\u0430\u043a \u041c\u043e\u0441\u043a\u0432\u0430\" title=\"\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \u043f\u043e\u0445\u043e\u0440\u043e\u0448\u0435\u043b\u043e, \u043a\u0430\u043a \u041c\u043e\u0441\u043a\u0432\u0430\" width=\"576\" height=\"1280\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f92\/782\/3bf\/f927823bf6bf9b12f2055db53bc3ee0c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f92\/782\/3bf\/f927823bf6bf9b12f2055db53bc3ee0c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \u043f\u043e\u0445\u043e\u0440\u043e\u0448\u0435\u043b\u043e, \u043a\u0430\u043a \u041c\u043e\u0441\u043a\u0432\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u043c\u043f\u0442\u044b \u0432 \u0441\u0432\u043e\u0439  \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432 \u0438\u0433\u0440\u0443. <\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/11e\/0f0\/104\/11e0f0104f761708917ff906c76750fe.png\" alt=\"\u0414\u043e\u0431\u0430\u0432\u0438\u043b\u0441\u044f \u043a\u0430\u0441\u0442\u043e\u043c\" title=\"\u0414\u043e\u0431\u0430\u0432\u0438\u043b\u0441\u044f \u043a\u0430\u0441\u0442\u043e\u043c\" width=\"576\" height=\"1280\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/11e\/0f0\/104\/11e0f0104f761708917ff906c76750fe.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/11e\/0f0\/104\/11e0f0104f761708917ff906c76750fe.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u043e\u0431\u0430\u0432\u0438\u043b\u0441\u044f \u043a\u0430\u0441\u0442\u043e\u043c<\/figcaption><\/div>\n<\/figure>\n<p>\u0410\u0433\u0435\u043d\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u00ab\u043e\u0431\u043e\u0448\u0435\u043b\u0441\u044f\u00bb \u0441\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0430\u043c\u0438. \u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043d\u0430\u00a0\u0432\u0441\u0435 \u043c\u0435\u043d\u044e, \u0430\u00a0\u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u00a0\u043f\u043e\u0434\u043c\u0435\u043d\u044e (\u0432\u044b\u0431\u043e\u0440 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u0438, \u043c\u0435\u0447\u0442\u044b, \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u0438\u00a0\u0442.\u00a0\u0434.)<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/41a\/971\/4e0\/41a9714e02c5322c1e1cb94f02c7973c.png\" alt=\"\u0412\u044b\u044f\u0441\u043d\u0438\u043b\u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0430\u0440\u0434 \u0438 \u0441\u043e\u0444\u0442 \u0441\u043a\u0438\u043b\u043b\u043e\u0432\" title=\"\u0412\u044b\u044f\u0441\u043d\u0438\u043b\u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0430\u0440\u0434 \u0438 \u0441\u043e\u0444\u0442 \u0441\u043a\u0438\u043b\u043b\u043e\u0432\" width=\"576\" height=\"1280\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/41a\/971\/4e0\/41a9714e02c5322c1e1cb94f02c7973c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/41a\/971\/4e0\/41a9714e02c5322c1e1cb94f02c7973c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0412\u044b\u044f\u0441\u043d\u0438\u043b\u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0430\u0440\u0434 \u0438 \u0441\u043e\u0444\u0442 \u0441\u043a\u0438\u043b\u043b\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u0438\u0434\u0435\u0438 \u043f\u043e \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0441\u0445\u043e\u0434\u0438\u043b\u0438 \u043e\u0442 \u0430\u0433\u0435\u043d\u0442\u0430.<\/p>\n<p>\u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043e\u0446\u0435\u043d\u043a\u0430 \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u0432 \u0440\u0443\u0431\u043b\u044f\u0445 \u0438 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0436\u0438\u0437\u043d\u0438 \u0431\u044b\u043b\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0432 \u0441\u0435\u0442\u0438.<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/75c\/aad\/f1c\/75caadf1c8fda429f2ec5cf42712cddc.png\" alt=\"\u041f\u043e\u0441\u043c\u0435\u044f\u043b\u0438\u0441\u044c \u043d\u0430\u0434 \u0446\u0435\u043d\u0430\u043c\u0438\" title=\"\u041f\u043e\u0441\u043c\u0435\u044f\u043b\u0438\u0441\u044c \u043d\u0430\u0434 \u0446\u0435\u043d\u0430\u043c\u0438\" width=\"576\" height=\"1280\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/75c\/aad\/f1c\/75caadf1c8fda429f2ec5cf42712cddc.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/75c\/aad\/f1c\/75caadf1c8fda429f2ec5cf42712cddc.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u043e\u0441\u043c\u0435\u044f\u043b\u0438\u0441\u044c \u043d\u0430\u0434 \u0446\u0435\u043d\u0430\u043c\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0435\u043a\u0441\u0442 \u043d\u0430 \u043f\u043b\u0430\u0448\u043a\u0430\u0445 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u0445\u043e\u0434\u0438\u043b \u0437\u0430 \u043a\u0440\u0430\u044f. \u041d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u043b\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430 \u044d\u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e\u0431\u044b \u0430\u0433\u0435\u043d\u0442 \u0432\u0441\u0451 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043b.<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bf0\/c0d\/8b0\/bf0c0d8b01f10f3edeb70462dbea9e8e.png\" alt=\"\u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u044d\u043a\u0440\u0430\u043d\" title=\"\u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u044d\u043a\u0440\u0430\u043d\" width=\"576\" height=\"1280\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bf0\/c0d\/8b0\/bf0c0d8b01f10f3edeb70462dbea9e8e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bf0\/c0d\/8b0\/bf0c0d8b01f10f3edeb70462dbea9e8e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u044d\u043a\u0440\u0430\u043d<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0430. \u0412\u0441\u0435 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u043b \u0441\u0430\u043c \u0430\u0433\u0435\u043d\u0442 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0442\u043a\u0443.<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a39\/70a\/d58\/a3970ad589c840a727ce1b200f376e02.png\" alt=\"\u0422\u0430\u043a \u0432\u0438\u0434\u0438\u0442 \u043a\u0443\u0431\u0438\u043a Midjourney\" title=\"\u0422\u0430\u043a \u0432\u0438\u0434\u0438\u0442 \u043a\u0443\u0431\u0438\u043a Midjourney\" width=\"2048\" height=\"2048\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/a39\/70a\/d58\/a3970ad589c840a727ce1b200f376e02.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a39\/70a\/d58\/a3970ad589c840a727ce1b200f376e02.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0422\u0430\u043a \u0432\u0438\u0434\u0438\u0442 \u043a\u0443\u0431\u0438\u043a Midjourney<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0441\u0430\u043c\u044b\u043c \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0431\u044b\u043b\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0430\u0433\u0435\u043d\u0442\u0430\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043a\u0443\u0431\u0438\u043a. \u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043b\u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u0435\u043a.<\/p>\n<\/div>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u044b\u0445 \u043a\u0443\u0431\u0438\u043a\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 mesh.ai \u0442\u043e\u0436\u0435 \u043d\u0435 \u0443\u0432\u0435\u043d\u0447\u0430\u043b\u0441\u044f \u0443\u0441\u043f\u0435\u0445\u043e\u043c. \u041a\u0443\u0431\u0438\u043a\u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u043b\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c\u0438, \u0442\u043e\u0447\u043a\u0438 \u043f\u043b\u044b\u043b\u0438 \u043f\u043e \u0433\u0440\u0430\u043d\u044f\u043c.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dd2\/e9b\/6c1\/dd2e9b6c17c51218eb2e1f1f920d63d7.png\" alt=\"\u0422\u0430\u043a \u0432\u0438\u0434\u0438\u0442 Meshy.ai\" title=\"\u0422\u0430\u043a \u0432\u0438\u0434\u0438\u0442 Meshy.ai\" width=\"1280\" height=\"597\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/dd2\/e9b\/6c1\/dd2e9b6c17c51218eb2e1f1f920d63d7.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dd2\/e9b\/6c1\/dd2e9b6c17c51218eb2e1f1f920d63d7.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0422\u0430\u043a \u0432\u0438\u0434\u0438\u0442 Meshy.ai<\/figcaption><\/div>\n<\/figure>\n<p>\u041c\u044b \u0441 \u0430\u0433\u0435\u043d\u0442\u043e\u043c \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u043b\u044f\u00a0\u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u0443\u0431\u0430 \u0438 \u043d\u0430\u0442\u044f\u043d\u0443\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0447\u0435\u0440\u0435\u0437 \u043f\u0438\u0442\u043e\u043d, \u043d\u043e\u00a0\u0432\u00a0\u0438\u0442\u043e\u0433\u0435 \u00ab\u0441\u043e\u0448\u043b\u0438\u0441\u044c\u00bb \u043d\u0430\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0434\u043b\u044f\u00a0\u0431\u043b\u0435\u043d\u0434\u0435\u0440\u0430. Cursor \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u0440\u0430\u0437\u0443 \u0445\u043e\u0440\u043e\u0448\u043e. <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/126\/23d\/db3\/12623ddb31e5739faa022816fb15fb59.png\" alt=\"\u0421\u043a\u0440\u0438\u043f\u0442 \u0430\u0433\u0435\u043d\u0442\u0430 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432 \u0431\u043b\u0435\u043d\u0434\u0435\u0440\u0435 \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0430. \u0422\u043e\u0447\u043a\u0438 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0448\u0430\u0440\u0438\u043a\u0430\u043c\u0438. \u0411\u0440\u0430\u0432\u043e, \u0430\u0433\u0435\u043d\u0442!\" title=\"\u0421\u043a\u0440\u0438\u043f\u0442 \u0430\u0433\u0435\u043d\u0442\u0430 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432 \u0431\u043b\u0435\u043d\u0434\u0435\u0440\u0435 \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0430. \u0422\u043e\u0447\u043a\u0438 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0448\u0430\u0440\u0438\u043a\u0430\u043c\u0438. \u0411\u0440\u0430\u0432\u043e, \u0430\u0433\u0435\u043d\u0442!\" width=\"1280\" height=\"679\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/126\/23d\/db3\/12623ddb31e5739faa022816fb15fb59.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/126\/23d\/db3\/12623ddb31e5739faa022816fb15fb59.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u043a\u0440\u0438\u043f\u0442 \u0430\u0433\u0435\u043d\u0442\u0430 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432 \u0431\u043b\u0435\u043d\u0434\u0435\u0440\u0435 \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0430. \u0422\u043e\u0447\u043a\u0438 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0448\u0430\u0440\u0438\u043a\u0430\u043c\u0438. \u0411\u0440\u0430\u0432\u043e, \u0430\u0433\u0435\u043d\u0442!<\/figcaption><\/div>\n<\/figure>\n<p>\u041a \u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u043f\u0440\u043e\u0435\u043a\u0442 \u0443\u0436\u0435 \u0440\u0430\u0437\u0440\u043e\u0441\u0441\u044f, \u0438 \u044f \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u0420\u0430\u0441\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b \u043f\u043e <a href=\"https:\/\/c4model.com\/\" rel=\"noopener noreferrer nofollow\">C4<\/a>. \u0418 \u0432\u043e\u0442 \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043b\u043e\u0439 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430. <\/p>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/480\/f48\/11b\/480f4811b16edd2b5e6dbf0488a53278.png\" alt=\"\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\" title=\"\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\" width=\"810\" height=\"720\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/480\/f48\/11b\/480f4811b16edd2b5e6dbf0488a53278.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/480\/f48\/11b\/480f4811b16edd2b5e6dbf0488a53278.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c<\/strong> \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/p>\n<\/div>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u043b\u043e\u0439 \u0430\u0433\u0435\u043d\u0442 \u043e\u043f\u0438\u0441\u0430\u043b \u043e\u0434\u043d\u0438\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u0441 4 \u0441\u043b\u043e\u044f\u043c\u0438. \u0412\u043f\u043e\u043b\u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ca1\/1f6\/727\/ca11f6727de65f7d3370956e18fa823a.png\" alt=\"\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432\" title=\"\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432\" width=\"593\" height=\"698\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ca1\/1f6\/727\/ca11f6727de65f7d3370956e18fa823a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ca1\/1f6\/727\/ca11f6727de65f7d3370956e18fa823a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p><strong>UI \u0441\u043b\u043e\u0439:<\/strong>\u00a0\u0410\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 (MainActivity, GameActivity, CharacterCreationActivity, ProfessionSelectionActivity, RulesActivity) \u0438 layout-\u0444\u0430\u0439\u043b\u044b.<\/p>\n<p><strong>\u041b\u043e\u0433\u0438\u043a\u0430 \u0438\u0433\u0440\u044b<\/strong>:\u00a0GameManager, \u043c\u043e\u0434\u0435\u043b\u0438 (Player, GameState, Card, Asset \u0438 \u0434\u0440.), \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0440\u0430\u0441\u0447\u0451\u0442\u044b.<\/p>\n<p><strong>\u0414\u0430\u043d\u043d\u044b\u0435<\/strong>:\u00a0GameDataManager (\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u0438, \u043c\u0435\u0447\u0442\u044b \u0438 \u0434\u0440.), \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 (Parcelable)<\/p>\n<p><strong>\u0420\u0435\u0441\u0443\u0440\u0441\u044b<\/strong>:\u00a0\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0438\u043a\u043e\u043d\u043a\u0438, \u0441\u0442\u0438\u043b\u0438, \u0441\u0442\u0440\u043e\u043a\u0438, layout-\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f<\/p>\n<\/div>\n<p>\u041d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u0441\u043b\u043e\u0435 \u0430\u0433\u0435\u043d\u0442 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043b 4 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.<\/p>\n<h4>1. UI-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b (\u044d\u043a\u0440\u0430\u043d\u044b, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441)<\/h4>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/355\/019\/e1f\/355019e1fc934dedd76d4d82c195e663.png\" alt=\"UI-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b\" title=\"UI-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b\" width=\"1054\" height=\"184\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/355\/019\/e1f\/355019e1fc934dedd76d4d82c195e663.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/355\/019\/e1f\/355019e1fc934dedd76d4d82c195e663.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>UI-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b<\/figcaption><\/div>\n<\/figure>\n<ul>\n<li>\n<p>MainActivity \u2014 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d<\/p>\n<\/li>\n<li>\n<p>GameActivity \u2014 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441<\/p>\n<\/li>\n<li>\n<p>CharacterCreationActivity \u2014 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430<\/p>\n<\/li>\n<li>\n<p>ProfessionSelectionActivity \u2014 \u0432\u044b\u0431\u043e\u0440 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u0438 \u0438 \u043c\u0435\u0447\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>RulesActivity \u2014 \u044d\u043a\u0440\u0430\u043d \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438<\/p>\n<\/li>\n<li>\n<p><strong>Adapters<\/strong>\u00a0(\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u043e\u0432):<\/p>\n<ul>\n<li>\n<p>adapters\/AssetAdapter.kt<\/p>\n<\/li>\n<li>\n<p>adapters\/ProfessionAdapter.kt<\/p>\n<\/li>\n<li>\n<p>adapters\/DreamAdapter.kt<\/p>\n<\/li>\n<li>\n<p>(\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432 adapters\/)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><strong>2. \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438<\/strong><\/p>\n<div class=\"floating-image\">\n<figure class=\"float\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/221\/641\/cfb\/221641cfb58754550845fc655b2f4ae4.png\" width=\"503\" height=\"557\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/221\/641\/cfb\/221641cfb58754550845fc655b2f4ae4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/221\/641\/cfb\/221641cfb58754550845fc655b2f4ae4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>GameManager \u2014 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0438\u0433\u0440\u044b<\/p>\n<\/div>\n<h4>3. \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 (\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445)<\/h4>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/641\/206\/757\/6412067576ece237c7840ca480b92f41.png\" width=\"1050\" height=\"171\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/641\/206\/757\/6412067576ece237c7840ca480b92f41.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/641\/206\/757\/6412067576ece237c7840ca480b92f41.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<ul>\n<li>\n<p>models\/Player.kt \u2014 \u0438\u0433\u0440\u043e\u043a<\/p>\n<\/li>\n<li>\n<p>models\/GameState.kt \u2014 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u0433\u0440\u044b<\/p>\n<\/li>\n<li>\n<p>models\/Card.kt \u2014 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438, \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u0438, \u043c\u0435\u0447\u0442\u044b, \u0430\u043a\u0442\u0438\u0432\u044b, \u043f\u0430\u0441\u0441\u0438\u0432\u044b, \u0438\u043d\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>models\/Asset.kt, models\/Liability.kt, models\/Investment.kt \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438<\/p>\n<\/li>\n<li>\n<p>models\/FinancialEntry.kt \u2014 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b<\/p>\n<\/li>\n<li>\n<p>models\/ProfessionalRisk.kt \u2014 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0438\u0441\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>(\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432 models\/)<\/p>\n<\/li>\n<\/ul>\n<h4>4. \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u0430\u043d\u043d\u044b\u0445<\/h4>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e43\/32b\/5f5\/e4332b5f5ef85ce84f132e15d565d44a.png\" width=\"1053\" height=\"425\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/e43\/32b\/5f5\/e4332b5f5ef85ce84f132e15d565d44a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e43\/32b\/5f5\/e4332b5f5ef85ce84f132e15d565d44a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<ul>\n<li>\n<p>data\/GameDataManager.kt \u2014 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438\u0433\u0440\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/p>\n<\/li>\n<li>\n<p>data\/FinancialTemplates.kt \u2014 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u0439<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0438 \u0431\u0435\u0437 \u0430\u0433\u0435\u043d\u0442\u0430. \u041d\u043e \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0431\u043e\u0442\u044b. <\/p>\n<p><strong>\u041f\u0440\u043e CICD \u0438 Github<\/strong><\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0439 \u043c\u044b\u0441\u043b\u044c\u044e \u0431\u044b\u043b\u043e &#8212; \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0430\u0439\u043f\u044b CICD, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u0438 \u0431\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c apk \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u0427\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c CICD \u0432 GitHub \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f Github Actions.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/39a\/0ed\/6b7\/39a0ed6b7d20f45bc83850a1f77400af.png\" width=\"1017\" height=\"184\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/39a\/0ed\/6b7\/39a0ed6b7d20f45bc83850a1f77400af.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/39a\/0ed\/6b7\/39a0ed6b7d20f45bc83850a1f77400af.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u042d\u0442\u043e Yaml, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u0435\u0436\u0438\u0442 \u0432 .github\/workflows <\/p>\n<ul>\n<li>\n<p><strong>Workflow (\u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441)<\/strong>\u00a0\u2014 \u0444\u0430\u0439\u043b YAML.<\/p>\n<\/li>\n<li>\n<p><strong>Event (\u0441\u043e\u0431\u044b\u0442\u0438\u0435)<\/strong>\u00a0\u2014 \u0442\u0440\u0438\u0433\u0433\u0435\u0440, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 workflow (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, push, pull_request, issue). \u0417\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c \u0436\u0435 yaml \u043f\u043e \u0441\u043b\u043e\u0432\u0443 on:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"yaml\">on:   push:     branches: [ main ]   pull_request:     branches: [ main ]   workflow_dispatch:<\/code><\/pre>\n<ul>\n<li>\n<p><strong>Job (\u0437\u0430\u0434\u0430\u0447\u0430)<\/strong>\u00a0\u2014 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043e\u0441\u043e\u0431\u043b\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0448\u0430\u0433\u043e\u0432 (steps), \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"yaml\">jobs:   # \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435   build-and-test: ...   # \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432 \u0434\u043b\u044f \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430   screenshots-phone: ...<\/code><\/pre>\n<ul>\n<li>\n<p><strong>Step (\u0448\u0430\u0433)<\/strong>\u00a0\u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f: \u0441\u043a\u0440\u0438\u043f\u0442 shell, \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 actions, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"yaml\">    - name: \ud83d\udd27 Grant execute permission for gradlew       run: chmod +x gradlew<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 Workflow:<\/p>\n<pre><code class=\"yaml\">name: \ud83d\ude80 Stable Build &amp; Release  on:   push:     branches: [ main ]   pull_request:     branches: [ main ]   workflow_dispatch:  env:   GRADLE_OPTS: -Dorg.gradle.daemon=false -Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true   MAESTRO_CLI_ANALYSIS_NOTIFICATION_DISABLED: \"true\"  jobs:   # \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435   build-and-test:     runs-on: ubuntu-latest     permissions:       contents: write     outputs:       version: ${{ steps.version.outputs.version }}       version_code: ${{ steps.version.outputs.version_code }}       date: ${{ steps.date.outputs.date }}       apk_path: ${{ steps.apk_path.outputs.path }}     # should_release \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d      steps:     - name: \ud83d\udce5 Checkout code       uses: actions\/checkout@v4       with:         fetch-depth: 0  # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u043b\u043d\u0443\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0434\u043b\u044f changelog      - name: \ud83d\udd0d Determine if this is a release build       id: should_release       run: |         if [[ \"${{ github.event_name }}\" == \"push\" &amp;&amp; \"${{ github.ref }}\" == \"refs\/heads\/main\" ]]; then           echo \"value=true\" &gt;&gt; $GITHUB_OUTPUT         else           echo \"value=false\" &gt;&gt; $GITHUB_OUTPUT         fi      - name: \ud83d\udd16 Bump version (only for releases)       id: bump_version       if: steps.should_release.outputs.value == 'true'       run: |         # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e         CURR_VERSION=$(grep -oP 'versionName\\s+\"\\K[^\"]+' app\/build.gradle)         CURR_CODE=$(grep -oP 'versionCode\\s+\\K[0-9]+' app\/build.gradle)                  # \u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c minor \u0432\u0435\u0440\u0441\u0438\u044e (x.y -&gt; x.(y+1))         MAJOR=$(echo $CURR_VERSION | cut -d. -f1)         MINOR=$(echo $CURR_VERSION | cut -d. -f2)         if [ -z \"$MINOR\" ]; then MINOR=0; fi         NEW_MINOR=$((MINOR+1))         NEW_VERSION=\"$MAJOR.$NEW_MINOR\"         NEW_CODE=$((CURR_CODE+1))                  # \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c build.gradle         sed -i \"s\/versionName \\\"$CURR_VERSION\\\"\/versionName \\\"$NEW_VERSION\\\"\/\" app\/build.gradle         sed -i \"s\/versionCode $CURR_CODE\/versionCode $NEW_CODE\/\" app\/build.gradle                  echo \"new_version=$NEW_VERSION\" &gt;&gt; $GITHUB_OUTPUT         echo \"new_code=$NEW_CODE\" &gt;&gt; $GITHUB_OUTPUT         echo \"Version bumped: $CURR_VERSION \u2192 $NEW_VERSION ($CURR_CODE \u2192 $NEW_CODE)\"                  # \u041a\u043e\u043c\u043c\u0438\u0442\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f         git config --local user.email \"action@github.com\"         git config --local user.name \"GitHub Action\"         git add app\/build.gradle         git commit -m \"\ud83d\udd16 Bump version to $NEW_VERSION ($NEW_CODE) [auto]\" || echo \"No version change to commit\"         git push || echo \"No changes to push\"      - name: \ud83d\udcdd Generate release notes (only for releases)       id: release_notes       if: steps.should_release.outputs.value == 'true'       run: |         echo \"## \ud83c\udfae Financial Success v${{ steps.bump_version.outputs.new_version }}\" &gt; RELEASE_NOTES.md         echo \"\" &gt;&gt; RELEASE_NOTES.md         echo \"### \ud83d\udcc5 \u0414\u0430\u0442\u0430 \u0440\u0435\u043b\u0438\u0437\u0430: $(date '+%Y-%m-%d %H:%M UTC')\" &gt;&gt; RELEASE_NOTES.md         echo \"\" &gt;&gt; RELEASE_NOTES.md         echo \"### \ud83d\udd04 \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:\" &gt;&gt; RELEASE_NOTES.md         git log --oneline -10 &gt;&gt; RELEASE_NOTES.md         echo \"\" &gt;&gt; RELEASE_NOTES.md         echo \"### \ud83d\udccb \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0437 CHANGELOG.md:\" &gt;&gt; RELEASE_NOTES.md         if [ -f \"docs\/CHANGELOG.md\" ]; then           tail -n 20 docs\/CHANGELOG.md &gt;&gt; RELEASE_NOTES.md         fi         cat RELEASE_NOTES.md      - name: \ud83d\udcdd Commit release notes (only for releases)       if: steps.should_release.outputs.value == 'true'       run: |         git add RELEASE_NOTES.md         git commit -m \"\ud83d\udcdd Update release notes [auto]\" || echo \"No release notes change to commit\"         git push || echo \"No changes to push\"      - name: \u2615 Setup JDK 21       uses: actions\/setup-java@v4       with:         java-version: '21'         distribution: 'temurin'      - name: \ud83d\udd0d Check dependencies       run: |         echo \"\ud83d\udd0d Checking dependencies...\"                  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 Java         java_version=$(java -version 2&gt;&amp;1 | head -n 1 | cut -d'\"' -f2 | cut -d'.' -f1)         echo \"\u2615 Java version: $java_version\"         if [ \"$java_version\" != \"21\" ]; then           echo \"\u26a0\ufe0f Warning: Recommended Java 21, found: $java_version\"         fi                  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 gradlew         if [ ! -f \"gradlew\" ]; then           echo \"\u274c Error: gradlew not found\"           exit 1         fi                  echo \"\u2705 Dependencies checked\"      - name: \ud83e\udd16 Setup Android SDK       uses: android-actions\/setup-android@v3      - name: \ud83d\udce6 Cache Gradle packages       uses: actions\/cache@v3       with:         path: |           ~\/.gradle\/caches           ~\/.gradle\/wrapper           ~\/.android\/build-cache         key: ${{ runner.os }}-gradle-${{ hashFiles('**\/*.gradle*', '**\/gradle-wrapper.properties') }}         restore-keys: |           ${{ runner.os }}-gradle-      - name: \ud83d\udd27 Grant execute permission for gradlew       run: chmod +x gradlew      - name: \ufffd Clean project       run: |         echo \"\ud83e\uddf9 Cleaning project...\"         .\/gradlew clean --no-daemon         if [ $? -eq 0 ]; then           echo \"\u2705 Project cleaned successfully\"         else           echo \"\u274c Project clean failed\"           exit 1         fi      - name: \ufffd\ufffd Run Unit Tests       run: |         echo \"\ud83e\uddea Running unit tests...\"         .\/gradlew test --no-daemon         if [ $? -eq 0 ]; then           echo \"\u2705 Unit tests passed\"         else           echo \"\u274c Unit tests failed\"           exit 1         fi      - name: \ud83d\udd28 Build Debug APK       run: |         echo \"\ud83d\udd28 Building debug APK...\"         .\/gradlew assembleDebug --no-daemon         if [ $? -eq 0 ]; then           echo \"\u2705 Debug APK built successfully\"         else           echo \"\u274c Debug APK build failed\"           exit 1         fi      - name: \ud83d\udcca Get version info       id: version       run: |         VERSION=$(grep -oP 'versionName\\s+\"\\K[^\"]+' app\/build.gradle)         VERSION_CODE=$(grep -oP 'versionCode\\s+\\K[0-9]+' app\/build.gradle)         echo \"version=$VERSION\" &gt;&gt; $GITHUB_OUTPUT         echo \"version_code=$VERSION_CODE\" &gt;&gt; $GITHUB_OUTPUT         echo \"Version: $VERSION ($VERSION_CODE)\"      - name: \ud83d\udcc5 Get current date       id: date       run: echo \"date=$(date +'%Y-%m-%d_%H-%M')\" &gt;&gt; $GITHUB_OUTPUT      - name: \ud83d\udcf1 Prepare APK for distribution       id: apk_path       run: |         echo \"\ud83d\udcf1 Preparing APK for distribution...\"                  # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e APK \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442         if [ ! -f \"app\/build\/outputs\/apk\/debug\/app-debug.apk\" ]; then           echo \"\u274c Error: Debug APK not found\"           ls -la app\/build\/outputs\/apk\/debug\/ || echo \"Debug directory not found\"           exit 1         fi                  mkdir -p releases\/debug         cp app\/build\/outputs\/apk\/debug\/app-debug.apk releases\/debug\/         cd releases\/debug                  # \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0441 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u0438 \u0434\u0430\u0442\u043e\u0439         newname=\"FinancialSuccess-v${{ steps.version.outputs.version }}-${{ steps.date.outputs.date }}-debug.apk\"         mv -f app-debug.apk \"$newname\"         echo \"path=releases\/debug\/$newname\" &gt;&gt; $GITHUB_OUTPUT                  # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 latest         ln -sf \"$newname\" \"latest-debug.apk\"                  # \u041e\u0447\u0438\u0449\u0430\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0435 APK (\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e 5 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445)         ls -tp FinancialSuccess-v*-debug.apk | grep -v '\/$' | tail -n +6 | xargs -r rm -- 2&gt;\/dev\/null || true                  echo \"\u2705 APK prepared: $newname\"         echo \"\ud83d\udcca APK files:\"         ls -la      - name: \ud83d\udce4 Upload APK Artifact       uses: actions\/upload-artifact@v4       with:         name: FinancialSuccess-v${{ steps.version.outputs.version }}-${{ steps.date.outputs.date }}         path: releases\/debug\/*.apk         retention-days: 30      - name: \ud83d\udcbe Commit APK files (only for releases)       if: steps.should_release.outputs.value == 'true'       run: |         git config --local user.email \"action@github.com\"         git config --local user.name \"GitHub Action\"         git add releases\/         if git diff --staged --quiet; then           echo \"No changes to commit\"         else           git commit -m \"\ud83d\udcf1 Auto-commit APK v${{ steps.version.outputs.version }} - ${{ steps.date.outputs.date }}                      \ud83d\udd27 Build info:           - Version: ${{ steps.version.outputs.version }}           - Version Code: ${{ steps.version.outputs.version_code }}           - Date: ${{ steps.date.outputs.date }}           - Branch: ${{ github.ref_name }}           - Commit: ${{ github.sha }}\"           git push         fi    # \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432 \u0434\u043b\u044f \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430   screenshots-phone:     runs-on: ubuntu-latest     needs: build-and-test     # \u0423\u0431\u0440\u0430\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0435 should_release          steps:     - name: \ud83d\udce5 Checkout code       uses: actions\/checkout@v4      - name: \ud83d\udce5 Download APK       uses: actions\/download-artifact@v4       with:         name: FinancialSuccess-v${{ needs.build-and-test.outputs.version }}-${{ needs.build-and-test.outputs.date }}      - name: \ud83d\udd27 Install Android SDK and platform-tools       env:         ANDROID_SDK_ROOT: ${{ runner.home }}\/android-sdk         ANDROID_HOME: ${{ runner.home }}\/android-sdk         PATH: ${{ runner.home }}\/android-sdk\/emulator:${{ runner.home }}\/android-sdk\/platform-tools:${{ runner.home }}\/android-sdk\/cmdline-tools\/latest\/bin:${{ env.PATH }}       run: |         wget https:\/\/dl.google.com\/android\/repository\/commandlinetools-linux-9477386_latest.zip -O cmdline-tools.zip         unzip cmdline-tools.zip -d $HOME         mkdir -p $HOME\/android-sdk\/cmdline-tools         mv $HOME\/cmdline-tools $HOME\/android-sdk\/cmdline-tools\/latest          export ANDROID_SDK_ROOT=$HOME\/android-sdk         export ANDROID_HOME=$HOME\/android-sdk         export PATH=$PATH:$HOME\/android-sdk\/emulator:$HOME\/android-sdk\/platform-tools:$HOME\/android-sdk\/cmdline-tools\/latest\/bin         yes | sdkmanager --licenses         sdkmanager \"platform-tools\" \"emulator\" \"system-images;android-34;default;x86_64\"          # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e system-image \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u043d         ls -la $ANDROID_SDK_ROOT\/system-images\/android-34\/default\/x86_64\/          # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c platform-tools \u0432 PATH \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0448\u0430\u0433\u043e\u0432         echo \"$HOME\/android-sdk\/platform-tools\" &gt;&gt; $GITHUB_PATH      - name: \ud83d\udd0d \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f adb \u0432 PATH (phone)       run: |         echo \"PATH: $PATH\"         which adb         adb version      - name: \ud83c\udfad Install Maestro       run: |         curl -Ls \"https:\/\/get.maestro.mobile.dev\" | bash         export PATH=\"$PATH\":\"$HOME\/.maestro\/bin\"         echo \"n\" | maestro --version      - name: \ud83d\udcf1 Start Android Emulator and Install APK (Phone)       shell: bash       env:         ANDROID_SDK_ROOT: ${{ runner.home }}\/android-sdk         ANDROID_HOME: ${{ runner.home }}\/android-sdk         PATH: ${{ runner.home }}\/android-sdk\/emulator:${{ runner.home }}\/android-sdk\/platform-tools:${{ runner.home }}\/android-sdk\/cmdline-tools\/latest\/bin:${{ env.PATH }}       run: |         set -e         echo \"SDK root: $ANDROID_SDK_ROOT\"         echo \"PATH: $PATH\"         ls -la $ANDROID_SDK_ROOT\/system-images\/android-34\/default\/x86_64\/         rm -rf ~\/.android\/avd\/*          # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 AVD, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442         if ! avdmanager list avd | grep -q \"ci_nexus5\"; then           echo \"no\" | avdmanager create avd --name \"ci_nexus5\" --package \"system-images;android-34;default;x86_64\" --device \"Nexus 5\"         fi          # \u0417\u0430\u043f\u0443\u0441\u043a \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0432 \u0444\u043e\u043d\u0435         emulator -avd \"ci_nexus5\" -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -accel off -no-snapshot -no-metrics &amp;         EMULATOR_PID=$!          # \u041f\u0430\u0443\u0437\u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 (\u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f CI)         sleep 30          # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 adb (\u0442\u0430\u0439\u043c\u0430\u0443\u0442 120\u0441)         emulator_timeout=120         emulator_elapsed=0         for i in {1..60}; do           if adb devices | grep -q \"emulator\"; then             echo \"\u2705 \u042d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 adb\"             break           fi           if [ $i -eq 60 ]; then             echo \"\u274c \u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u0437\u0430 $emulator_timeout \u0441\u0435\u043a\u0443\u043d\u0434\"             kill $EMULATOR_PID 2&gt;\/dev\/null || true             exit 1           fi           sleep 2           emulator_elapsed=$((emulator_elapsed + 2))           if [ $((emulator_elapsed % 30)) -eq 0 ]; then             echo \"\u23f3 \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430: $emulator_elapsed \u0441\u0435\u043a\u0443\u043d\u0434 \u0438\u0437 $emulator_timeout...\"           fi         done          # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 Android (sys.boot_completed, \u0442\u0430\u0439\u043c\u0430\u0443\u0442 180\u0441)         boot_timeout=180         boot_elapsed=0         for i in {1..90}; do           if adb shell getprop sys.boot_completed 2&gt;\/dev\/null | grep -q \"1\"; then             echo \"\u2705 Android \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\"             break           fi           if [ $i -eq 90 ]; then             echo \"\u274c Android \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0441\u044f \u0437\u0430 $boot_timeout \u0441\u0435\u043a\u0443\u043d\u0434\"             kill $EMULATOR_PID 2&gt;\/dev\/null || true             exit 1           fi           sleep 2           boot_elapsed=$((boot_elapsed + 2))           if [ $((boot_elapsed % 30)) -eq 0 ]; then             echo \"\u23f3 \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 Android: $boot_elapsed \u0441\u0435\u043a\u0443\u043d\u0434 \u0438\u0437 $boot_timeout...\"           fi         done          # \u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u044d\u043a\u0440\u0430\u043d\u0430         adb shell input keyevent 82         adb shell input keyevent 82         sleep 2          # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 APK         if [ ! -f \"releases\/debug\/latest-debug.apk\" ]; then           echo \"\u274c Error: latest-debug.apk not found in releases\/debug\/\"           ls -la releases\/debug\/           kill $EMULATOR_PID 2&gt;\/dev\/null || true           exit 1         fi         adb install releases\/debug\/latest-debug.apk         if adb shell pm list packages | grep -q financialsuccess; then           echo \"\u2705 APK \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\"         else           echo \"\u274c Error: APK installation failed\"           kill $EMULATOR_PID 2&gt;\/dev\/null || true           exit 1         fi          # ... \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0441\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c ...          # \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430         kill $EMULATOR_PID 2&gt;\/dev\/null || true         pkill -f emulator 2&gt;\/dev\/null || true      - name: \ud83d\udcf8 Run Maestro Screenshots (Phone)       run: |         export PATH=\"$PATH\":\"$HOME\/.maestro\/bin\"         mkdir -p screenshots\/phone                  # \u041f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430         local config_file=\"maestro\/screenshots-stable.yaml\"         if [ ! -f \"$config_file\" ]; then           config_file=\"maestro\/screenshots.yaml\"         fi                  if [ -f \"$config_file\" ]; then           echo \"Using phone screenshots configuration: $config_file\"           maestro test \"$config_file\" --format junit --output screenshots\/phone\/           echo \"\ud83d\udcf1 Phone screenshots completed!\"         else           echo \"\u26a0\ufe0f Warning: Maestro configuration file not found: $config_file\"           echo \"\ud83d\udcf1 Phone screenshots skipped!\"         fi      - name: \ud83d\udce4 Upload Phone Screenshots       uses: actions\/upload-artifact@v4       with:         name: phone-screenshots-v${{ needs.build-and-test.outputs.version }}         path: screenshots\/phone\/         retention-days: 30    # \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u043b\u0430\u043d\u0448\u0435\u0442\u0430   screenshots-tablet:     runs-on: ubuntu-latest     needs: build-and-test     # \u0423\u0431\u0440\u0430\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0435 should_release          steps:     - name: \ud83d\udce5 Checkout code       uses: actions\/checkout@v4      - name: \ud83d\udce5 Download APK       uses: actions\/download-artifact@v4       with:         name: FinancialSuccess-v${{ needs.build-and-test.outputs.version }}-${{ needs.build-and-test.outputs.date }}      - name: \ud83d\udd27 Install Android SDK and platform-tools       env:         ANDROID_SDK_ROOT: ${{ runner.home }}\/android-sdk         ANDROID_HOME: ${{ runner.home }}\/android-sdk         PATH: ${{ runner.home }}\/android-sdk\/emulator:${{ runner.home }}\/android-sdk\/platform-tools:${{ runner.home }}\/android-sdk\/cmdline-tools\/latest\/bin:${{ env.PATH }}       run: |         wget https:\/\/dl.google.com\/android\/repository\/commandlinetools-linux-9477386_latest.zip -O cmdline-tools.zip         unzip cmdline-tools.zip -d $HOME         mkdir -p $HOME\/android-sdk\/cmdline-tools         mv $HOME\/cmdline-tools $HOME\/android-sdk\/cmdline-tools\/latest          export ANDROID_SDK_ROOT=$HOME\/android-sdk         export ANDROID_HOME=$HOME\/android-sdk         export PATH=$PATH:$HOME\/android-sdk\/emulator:$HOME\/android-sdk\/platform-tools:$HOME\/android-sdk\/cmdline-tools\/latest\/bin         yes | sdkmanager --licenses         sdkmanager \"platform-tools\" \"emulator\" \"system-images;android-34;default;x86_64\"          # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e system-image \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u043d         ls -la $ANDROID_SDK_ROOT\/system-images\/android-34\/default\/x86_64\/          # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c platform-tools \u0432 PATH \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0448\u0430\u0433\u043e\u0432         echo \"$HOME\/android-sdk\/platform-tools\" &gt;&gt; $GITHUB_PATH      - name: \ud83d\udd0d \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f adb \u0432 PATH (tablet)       run: |         echo \"PATH: $PATH\"         which adb         adb version      - name: \ud83c\udfad Install Maestro       run: |         curl -Ls \"https:\/\/get.maestro.mobile.dev\" | bash         export PATH=\"$PATH\":\"$HOME\/.maestro\/bin\"         echo \"n\" | maestro --version      - name: \ud83d\udcf1 Start Android Emulator and Install APK (Tablet)       shell: bash       env:         ANDROID_SDK_ROOT: ${{ runner.home }}\/android-sdk         ANDROID_HOME: ${{ runner.home }}\/android-sdk         PATH: ${{ runner.home }}\/android-sdk\/emulator:${{ runner.home }}\/android-sdk\/platform-tools:${{ runner.home }}\/android-sdk\/cmdline-tools\/latest\/bin:${{ env.PATH }}       run: |         set -e         echo \"SDK root: $ANDROID_SDK_ROOT\"         echo \"PATH: $PATH\"         ls -la $ANDROID_SDK_ROOT\/system-images\/android-34\/default\/x86_64\/         rm -rf ~\/.android\/avd\/*          # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 AVD, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442         if ! avdmanager list avd | grep -q \"ci_nexus10\"; then           echo \"no\" | avdmanager create avd --name \"ci_nexus10\" --package \"system-images;android-34;default;x86_64\" --device \"Nexus 10\"         fi          # \u0417\u0430\u043f\u0443\u0441\u043a \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0432 \u0444\u043e\u043d\u0435         emulator -avd \"ci_nexus10\" -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -accel off -no-snapshot -no-metrics &amp;         EMULATOR_PID=$!          # \u041f\u0430\u0443\u0437\u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 (\u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f CI)         sleep 30          # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 adb (\u0442\u0430\u0439\u043c\u0430\u0443\u0442 120\u0441)         emulator_timeout=120         emulator_elapsed=0         for i in {1..60}; do           if adb devices | grep -q \"emulator\"; then             echo \"\u2705 \u042d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 adb\"             break           fi           if [ $i -eq 60 ]; then             echo \"\u274c \u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u0437\u0430 $emulator_timeout \u0441\u0435\u043a\u0443\u043d\u0434\"             kill $EMULATOR_PID 2&gt;\/dev\/null || true             exit 1           fi           sleep 2           emulator_elapsed=$((emulator_elapsed + 2))           if [ $((emulator_elapsed % 30)) -eq 0 ]; then             echo \"\u23f3 \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430: $emulator_elapsed \u0441\u0435\u043a\u0443\u043d\u0434 \u0438\u0437 $emulator_timeout...\"           fi         done          # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 Android (sys.boot_completed, \u0442\u0430\u0439\u043c\u0430\u0443\u0442 180\u0441)         boot_timeout=180         boot_elapsed=0         for i in {1..90}; do           if adb shell getprop sys.boot_completed 2&gt;\/dev\/null | grep -q \"1\"; then             echo \"\u2705 Android \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\"             break           fi           if [ $i -eq 90 ]; then             echo \"\u274c Android \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0441\u044f \u0437\u0430 $boot_timeout \u0441\u0435\u043a\u0443\u043d\u0434\"             kill $EMULATOR_PID 2&gt;\/dev\/null || true             exit 1           fi           sleep 2           boot_elapsed=$((boot_elapsed + 2))           if [ $((boot_elapsed % 30)) -eq 0 ]; then             echo \"\u23f3 \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 Android: $boot_elapsed \u0441\u0435\u043a\u0443\u043d\u0434 \u0438\u0437 $boot_timeout...\"           fi         done          # \u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u044d\u043a\u0440\u0430\u043d\u0430         adb shell input keyevent 82         adb shell input keyevent 82         sleep 2          # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 APK         if [ ! -f \"releases\/debug\/latest-debug.apk\" ]; then           echo \"\u274c Error: latest-debug.apk not found in releases\/debug\/\"           ls -la releases\/debug\/           kill $EMULATOR_PID 2&gt;\/dev\/null || true           exit 1         fi         adb install releases\/debug\/latest-debug.apk         if adb shell pm list packages | grep -q financialsuccess; then           echo \"\u2705 APK \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\"         else           echo \"\u274c Error: APK installation failed\"           kill $EMULATOR_PID 2&gt;\/dev\/null || true           exit 1         fi          # ... \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0441\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c ...          # \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430         kill $EMULATOR_PID 2&gt;\/dev\/null || true         pkill -f emulator 2&gt;\/dev\/null || true      - name: \ud83d\udcf8 Run Maestro Screenshots (Tablet)       run: |         export PATH=\"$PATH\":\"$HOME\/.maestro\/bin\"         mkdir -p screenshots\/tablet                  # \u041f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u043f\u043b\u0430\u043d\u0448\u0435\u0442\u0430         local config_file=\"maestro\/screenshots-tablet.yaml\"         if [ ! -f \"$config_file\" ]; then           config_file=\"maestro\/screenshots.yaml\"         fi                  if [ -f \"$config_file\" ]; then           echo \"Using tablet screenshots configuration: $config_file\"           maestro test \"$config_file\" --format junit --output screenshots\/tablet\/           echo \"\ud83d\udcf1 Tablet screenshots completed!\"         else           echo \"\u26a0\ufe0f Warning: Maestro configuration file not found: $config_file\"           echo \"\ud83d\udcf1 Tablet screenshots skipped!\"         fi      - name: \ud83d\udce4 Upload Tablet Screenshots       uses: actions\/upload-artifact@v4       with:         name: tablet-screenshots-v${{ needs.build-and-test.outputs.version }}         path: screenshots\/tablet\/         retention-days: 30    # \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u0440\u0435\u043b\u0438\u0437\u0430   create-release:     runs-on: ubuntu-latest     needs: [build-and-test, screenshots-phone, screenshots-tablet]     # \u0423\u0431\u0440\u0430\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0435 should_release     permissions:       contents: write      steps:     - name: \ud83d\udce5 Checkout code       uses: actions\/checkout@v4      - name: \ud83d\udce5 Download APK       uses: actions\/download-artifact@v4       with:         name: FinancialSuccess-v${{ needs.build-and-test.outputs.version }}-${{ needs.build-and-test.outputs.date }}      - name: \ud83d\udce5 Download Phone Screenshots       uses: actions\/download-artifact@v4       with:         name: phone-screenshots-v${{ needs.build-and-test.outputs.version }}      - name: \ud83d\udce5 Download Tablet Screenshots       uses: actions\/download-artifact@v4       with:         name: tablet-screenshots-v${{ needs.build-and-test.outputs.version }}      - name: \ud83d\udcf8 Prepare screenshots for repository       run: |         mkdir -p screenshots\/phone screenshots\/tablet                  # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u043f\u043a\u0438         if [ -d \"screenshots\/phone\" ]; then           cp -r screenshots\/phone\/* screenshots\/phone\/ 2&gt;\/dev\/null || true         fi         if [ -d \"screenshots\/tablet\" ]; then           cp -r screenshots\/tablet\/* screenshots\/tablet\/ 2&gt;\/dev\/null || true         fi                  echo \"\ud83d\udcf1 Phone screenshots:\"         ls -la screenshots\/phone\/ 2&gt;\/dev\/null || echo \"No phone screenshots\"         echo \"\"         echo \"\ud83d\udcf1 Tablet screenshots:\"         ls -la screenshots\/tablet\/ 2&gt;\/dev\/null || echo \"No tablet screenshots\"      - name: \ud83d\udcdd Commit Screenshots to Repository       run: |         git config --local user.email \"action@github.com\"         git config --local user.name \"GitHub Action\"         git add screenshots\/         if git diff --staged --quiet; then           echo \"No screenshots to commit\"         else           git commit -m \"\ud83d\udcf8 Auto-generated screenshots v${{ needs.build-and-test.outputs.version }} - ${{ needs.build-and-test.outputs.date }}                      \ud83d\udcf1 Screenshots:           - Phone: $(ls screenshots\/phone\/*.png 2&gt;\/dev\/null | wc -l) files           - Tablet: $(ls screenshots\/tablet\/*.png 2&gt;\/dev\/null | wc -l) files           - Total: $(find screenshots\/ -name \"*.png\" 2&gt;\/dev\/null | wc -l) files\"           git push         fi      - name: \ud83c\udff7\ufe0f Create GitHub Release       uses: softprops\/action-gh-release@v1       with:         tag_name: v${{ needs.build-and-test.outputs.version }}-${{ needs.build-and-test.outputs.date }}         name: \"\ud83c\udfae Financial Success v${{ needs.build-and-test.outputs.version }}\"         body_path: RELEASE_NOTES.md         files: |           releases\/debug\/*.apk           screenshots\/phone\/*.png           screenshots\/tablet\/*.png         draft: false         prerelease: false         generate_release_notes: false      - name: \ud83d\udcca Build Summary       run: |         echo \"\ud83c\udf89 Release completed successfully!\"         echo \"\"         echo \"\ufffd Results:\"         echo \"\ufffd\ufffd Version: ${{ needs.build-and-test.outputs.version }}\"         echo \"\ud83d\udd22 Version Code: ${{ needs.build-and-test.outputs.version_code }}\"         echo \"\ud83d\udcc5 Date: ${{ needs.build-and-test.outputs.date }}\"         echo \"\ufffd APK: releases\/debug\/FinancialSuccess-v${{ needs.build-and-test.outputs.version }}-${{ needs.build-and-test.outputs.date }}-debug.apk\"         echo \"\ud83d\udcf8 Phone screenshots: screenshots\/phone\/\"         echo \"\ud83d\udcf8 Tablet screenshots: screenshots\/tablet\/\"         echo \"\"         echo \"\ufffd Files:\"         ls -la releases\/debug\/ || echo \"No APK files found\"         echo \"\"         echo \"\ud83d\udcf8 Phone screenshots:\"         ls -la screenshots\/phone\/ 2&gt;\/dev\/null || echo \"No phone screenshots\"         echo \"\"         echo \"\ud83d\udcf8 Tablet screenshots:\"         ls -la screenshots\/tablet\/ 2&gt;\/dev\/null || echo \"No tablet screenshots\"<\/code><\/pre>\n<p>\u0418\u0437\u0432\u0438\u043d\u0438\u0442\u0435, \u0437\u0430 \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442, \u043d\u043e \u043e\u043d \u0442\u0430\u043a \u0445\u043e\u0440\u043e\u0448!<\/p>\n<p>\u0423 Actions \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0430\u0433\u0435\u043d\u0442\u044b, \u0434\u0430 \u0438 \u043b\u044e\u0431\u043e\u0439 LLM, \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0438\u0445 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 \u0438 \u0443\u043c\u0435\u044e\u0442 \u043f\u0438\u0441\u0430\u0442\u044c. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0435\u0441\u0442\u044c \u0446\u0435\u043b\u044b\u0439 \u043c\u0430\u0433\u0430\u0437\u0438\u043d \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 <a href=\"https:\/\/github.com\/marketplace?type=actions\" rel=\"noopener noreferrer nofollow\">Actions<\/a> \u0418, \u043a\u0441\u0442\u0430\u0442\u0438, \u0442\u0430\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e Actions. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043d\u0435\u043c \u0435\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u0442\u0440\u0435\u043a\u0435\u0440\u043e\u043c Jira, \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430\u043c\u0438 \u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0418\u0418.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/31b\/df7\/379\/31bdf7379f26b608b13090183459bd56.png\" width=\"1919\" height=\"912\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/31b\/df7\/379\/31bdf7379f26b608b13090183459bd56.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/31b\/df7\/379\/31bdf7379f26b608b13090183459bd56.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043c\u043e\u0435\u043c \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f step checkout@v4, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0437\u044f\u0442 <a href=\"https:\/\/github.com\/marketplace\/actions\/checkout\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u0441\u044e\u0434\u0430<\/a>.<\/p>\n<pre><code class=\"yaml\">steps: - name: \ud83d\udce5 Checkout code   uses: actions\/checkout@v4<\/code><\/pre>\n<p>\u041e\u043d \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0434 \u0432 \u043e\u0431\u043b\u0430\u043a\u043e github workspaces \u0438 \u0434\u0430\u043b\u0435\u0435 wokflow \u043c\u043e\u0436\u0435\u0442 \u0435\u0433\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c, \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c, \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0451, \u043d\u0430 \u0447\u0442\u043e \u0445\u0432\u0430\u0442\u0438\u0442 \u0432\u0430\u0448\u0435\u0439 \u0431\u0435\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0439 \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u0438.<\/p>\n<p>\u0412-\u0442\u0440\u0435\u0442\u044c\u0438\u0445, \u0443 Actions \u0435\u0441\u0442\u044c \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0434\u0430\u0448\u0431\u043e\u0430\u0440\u0434 \u0441 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/18d\/b84\/043\/18db84043cd29b2a1312befa7505b5d2.png\" alt=\"\u0411\u043e\u043b\u044c\u0448\u043e\u0439 UI\" title=\"\u0411\u043e\u043b\u044c\u0448\u043e\u0439 UI\" width=\"1918\" height=\"837\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/18d\/b84\/043\/18db84043cd29b2a1312befa7505b5d2.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/18d\/b84\/043\/18db84043cd29b2a1312befa7505b5d2.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0411\u043e\u043b\u044c\u0448\u043e\u0439 UI<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/161\/473\/e6c\/161473e6ce0b9c6597dd416ef1167f7a.png\" alt=\"\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0439 UI\" title=\"\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0439 UI\" width=\"576\" height=\"1280\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/161\/473\/e6c\/161473e6ce0b9c6597dd416ef1167f7a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/161\/473\/e6c\/161473e6ce0b9c6597dd416ef1167f7a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0439 UI<\/figcaption><\/div>\n<\/figure>\n<p><strong>Github CLI<\/strong><\/p>\n<p>\u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443, \u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u0442\u043e\u0447\u043a\u0443 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0431\u043e\u044f. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u0442 \u043b\u043e\u043c\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0430\u0433\u0435\u043d\u0442\u044b, \u043d\u043e \u0438 CI\/CD. \u0418 \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f \u0430\u0433\u0435\u043d\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0432\u0430\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u0430\u043f\u0439\u043f\u043b\u0430\u0439\u043d \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u043a\u0430\u043c\u0438, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b \u0438\u0445 \u043d\u0435 \u043f\u0440\u043e\u0441\u0438\u043b\u0438.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0438\u0434\u0435\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0430\u0433\u0435\u043d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u043a\u0430 \u0441\u0431\u043e\u0440\u043a\u0430 \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u0437\u0435\u043b\u0435\u043d\u043e\u0439. \u041d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0434\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c Gothub actions. \u0418 \u0442\u0430\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0435\u0441\u0442\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 gothub CLI. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0430\u0433\u0435\u043d\u0442\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0441\u0435\u0431\u0435 \u0438 \u0434\u0430\u043b\u0435\u0435 \u043e\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u0443\u044e \u0432\u043b\u0430\u0441\u0442\u044c.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u0432\u043e\u0438 &#171;\u0445\u043e\u0442\u0435\u043b\u043a\u0438&#187; \u0438 \u0431\u0430\u0433\u0438 \u0447\u0435\u0440\u0435\u0437 WebUI (<a href=\"https:\/\/github.com\/RobotAvi\/MoneyGame\/issues\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438\u043c\u0435\u0440<\/a>)<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/932\/302\/4c6\/9323024c6d46c90c3a8ba261445150b5.png\" width=\"1910\" height=\"531\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/932\/302\/4c6\/9323024c6d46c90c3a8ba261445150b5.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/932\/302\/4c6\/9323024c6d46c90c3a8ba261445150b5.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0410 \u0430\u0433\u0435\u043d\u0442 \u0441\u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u0447\u0435\u0440\u0435\u0437 github cli.<\/p>\n<pre><code class=\"powershell\">gh issue list  Showing 4 of 4 open issues in RobotAvi\/MoneyGame  ID   TITLE                                                                                     LABELS  UPDATED #35  \u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u0410\u043a\u0442\u0438\u0432\u044b(\u0432\u0442\u043e\u0440\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0441\u043d\u0438\u0437\u0443) \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0433\u0440\u044b, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442                    about 4 days ago #33  \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u044e \u0434\u0430\u0442\u0443 \u043d\u0430\u0447\u0430\u043b\u0430, \u043d\u043e \u0438\u0433\u0440\u0430 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 1 \u044f\u043d\u0432\u0430\u0440\u044f 2024          about 4 days ago #31  \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0430 \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0446\u0435\u043b\u044c\"                                         about 4 days ago<\/code><\/pre>\n<p>\u041e\u043d \u0441\u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0432\u0441\u0435 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 workflow.<\/p>\n<pre><code class=\"powershell\">gh run list STATUS  TITLE                     WORKFLOW              BRANCH                EVENT              ID           ELAPSED  AGE X       Merge branch 'main' o...  \ud83d\ude80 Stable Build &amp;...  main                  push               16317785712  1m53s    about 44 minutes agoX       Merge branch 'main' o...  \ud83d\ude80 Stable Build &amp;...  main                  push               16316849391  2m6s     about 1 hour ago     X       Merge branch 'main' o...  \ud83d\ude80 Stable Build &amp;...  main                  push               16316340343  5m17s    about 1 hour ago     X       Merge branch 'main' o...  \ud83d\ude80 Stable Build &amp;...  main                  push               16315742627  2m37s    about 2 hours ago    X       Merge branch 'main' o...  \ud83d\ude80 Stable Build &amp;...  main                  push               16315344190  10m11s   about 2 hours ago    X       \ud83d\udd27 Update Android emu...  \ud83d\ude80 Stable Build &amp;...  main                  push               16315013756  10m42s   about 2 hours ago    X       \ud83d\udd27 Update APK install...  \ud83d\ude80 Stable Build &amp;...  main                  push               16314726566  4m5s     about 3 hours ago    X       \ud83d\ude80 Stable Build &amp; Rel...  \ud83d\ude80 Stable Build &amp;...  main                  workflow_dispatch  16314541927  6m33s    about 3 hours ago    X       \ud83d\ude80 Stable Build &amp; Rel...  \ud83d\ude80 Stable Build &amp;...  main                  workflow_dispatch  16314338809  4m39s    about 3 hours ago    X       Merge pull request #5...  \ud83d\ude80 Stable Build &amp;...  main                  push               16313315708  5m15s    about 4 hours ago    X       Merge pull request #6...  \ud83d\ude80 Stable Build &amp;...  main                  push               16313305267  2m8s     about 4 hours ago    X       \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0442...  \ud83d\ude80 Stable Build &amp;...  cursor\/bc-74e564d...  pull_request       16313302064  6m30s    about 4 hours ago    X       \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u0440\u043f\u043b\u0430\u0442\u0443, \u0434\u043e...  \ud83d\ude80 Stable Build &amp;...  cursor\/bc-20aef14...  pull_request       16313293278  4m58s    about 4 hours ago    X       Update merge and rele...  \ud83d\ude80 Stable Build &amp;...  main                  push               16313285574  1m44s    about 4 hours ago    X       Merge pull request #5...  \ud83d\ude80 Stable Build &amp;...  main                  push               16278741446  5m32s    about 1 day ago      X       Merge pull request #5...  \ud83d\ude80 Stable Build &amp;...  main                  push               16278735173  2m19s    about 1 day ago      X       Fix game start date d...  \ud83d\ude80 Stable Build &amp;...  cursor\/fix-game-s...  pull_request       16278689493  4m36s    about 1 day ago      X       Fix skill selection n...  \ud83d\ude80 Stable Build &amp;...  cursor\/fix-skill-...  pull_request       16278669631  5m31s    about 1 day ago      X       Merge pull request #5...  \ud83d\ude80 Stable Build &amp;...  main                  push               16278054384  8m13s    about 1 day ago      X       Fix ignored game star...  \ud83d\ude80 Stable Build &amp;...  cursor\/fix-ignore...  pull_request       16277568754  5m14s    about 1 day ago <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e Workflow.<\/p>\n<pre><code class=\"powershell\">gh run view 16317785712    X main \ud83d\ude80 Stable Build &amp; Release \u00b7 16317785712 Triggered via push about 46 minutes ago  JOBS \u2713 build-and-test in 1m30s (ID 46087758362) X screenshots-tablet in 9s (ID 46087864204)   \u2713 Set up job   \u2713 \ud83d\udce5 Checkout code   \u2713 \ud83d\udce5 Download APK   X \ud83d\udd27 Install Android SDK and platform-tools   - \ud83d\udd0d \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f adb \u0432 PATH (tablet)   - \ud83c\udfad Install Maestro   - \ud83d\udcf1 Start Android Emulator and Install APK (Tablet)   - \ud83d\udcf8 Run Maestro Screenshots (Tablet)   - \ud83d\udce4 Upload Tablet Screenshots   \u2713 Post \ud83d\udce5 Checkout code   \u2713 Complete job X screenshots-phone in 17s (ID 46087864215)   \u2713 Set up job   \u2713 \ud83d\udce5 Checkout code   \u2713 \ud83d\udce5 Download APK   X \ud83d\udd27 Install Android SDK and platform-tools   - \ud83d\udd0d \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f adb \u0432 PATH (phone)   - \ud83c\udfad Install Maestro   - \ud83d\udcf1 Start Android Emulator and Install APK (Phone)   - \ud83d\udcf8 Run Maestro Screenshots (Phone)   - \ud83d\udce4 Upload Phone Screenshots   \u2713 Post \ud83d\udce5 Checkout code   \u2713 Complete job - create-release in 0s (ID 46087884918)  ANNOTATIONS X Process completed with exit code 127. screenshots-tablet: .github#29  X Process completed with exit code 127. screenshots-phone: .github#29   ARTIFACTS FinancialSuccess-v1.67-2025-07-16_11-07  To see what failed, try: gh run view 16317785712 --log-failed View this run on GitHub: https:\/\/github.com\/RobotAvi\/MoneyGame\/actions\/runs\/16317785712<\/code><\/pre>\n<p>\u0417\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e Job&#8217;\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 workflow.<\/p>\n<pre><code class=\"powershell\">gh run view 16317785712 --job 46087864204 ! both run and job IDs specified; ignoring run ID    X main \ud83d\ude80 Stable Build &amp; Release \u00b7 16317785712 Triggered via push about 48 minutes ago  X screenshots-tablet in 9s (ID 46087864204)   \u2713 Set up job   \u2713 \ud83d\udce5 Checkout code   \u2713 \ud83d\udce5 Download APK   X \ud83d\udd27 Install Android SDK and platform-tools   - \ud83d\udd0d \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f adb \u0432 PATH (tablet)   - \ud83c\udfad Install Maestro   - \ud83d\udcf1 Start Android Emulator and Install APK (Tablet)   - \ud83d\udcf8 Run Maestro Screenshots (Tablet)   - \ud83d\udce4 Upload Tablet Screenshots   \u2713 Post \ud83d\udce5 Checkout code   \u2713 Complete job  ANNOTATIONS X Process completed with exit code 127. screenshots-tablet: .github#29   To see the logs for the failed steps, try: gh run view --log-failed --job=46087864204 View this run on GitHub: https:\/\/github.com\/RobotAvi\/MoneyGame\/actions\/runs\/16317785712<\/code><\/pre>\n<p>\u0418 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043b\u043e\u0433\u0438.<\/p>\n<pre><code class=\"powershell\">gh run view 16317785712 --job 46087864204 --log  ! both run and job IDs specified; ignoring run ID screenshots-tablet      Set up job      2025-07-16T11:07:56.9908742Z Current runner version: '2.326.0' screenshots-tablet      Set up job      2025-07-16T11:07:56.9941910Z ##[group]Runner Image Provisioner screenshots-tablet      Set up job      2025-07-16T11:07:56.9943260Z Hosted Compute Agent screenshots-tablet      Set up job      2025-07-16T11:07:56.9944128Z Version: 20250711.363 screenshots-tablet      Set up job      2025-07-16T11:07:56.9945088Z Commit: 6785254374ce925a23743850c1cb91912ce5c14c screenshots-tablet      Set up job      2025-07-16T11:07:56.9946593Z Build Date: 2025-07-11T20:04:25Z screenshots-tablet      Set up job      2025-07-16T11:07:56.9947630Z ##[endgroup] screenshots-tablet      Set up job      2025-07-16T11:07:56.9948542Z ##[group]Operating System screenshots-tablet      Set up job      2025-07-16T11:07:56.9949596Z Ubuntu ... screenshots-tablet      \ud83d\udd27 Install Android SDK and platform-tools       2025-07-16T11:08:03.4199712Z ##[error]Process completed with exit code 127. screenshots-tablet      Post \ud83d\udce5 Checkout code   2025-07-16T11:08:03.4377242Z Post job cleanup. screenshots-tablet      Post \ud83d\udce5 Checkout code   2025-07-16T11:08:03.5297561Z [command]\/usr\/bin\/git version screenshots-tablet      Post \ud83d\udce5 Checkout code   2025-07-16T11:08:03.5332105Z git version 2.50.1 screenshots-tablet      Post \ud83d\udce5 Checkout code   2025-07-16T11:08:03.5375287Z Temporarily overriding HOME='\/home\/runner\/work\/_temp\/e0586d2a-154f-42d8-8f82-3c3463313645' before making global git config changes screenshots-tablet      Post \ud83d\udce5 Checkout code   2025-07-16T11:08:03.5376830Z Adding repository directory to the temporary git global config as a safe directory screenshots-tablet      Post \ud83d\udce5 Checkout code   2025-07-16T11:08:03.5381847Z [command]\/usr\/bin\/git config --global --add safe.directory \/home\/runner\/work\/MoneyGame\/MoneyGame screenshots-tablet      Post \ud83d\udce5 Checkout code   2025-07-16T11:08:03.5416858Z [command]\/usr\/bin\/git config --local --name-only --get-regexp  core\\.sshCommand screenshots-tablet      Post \ud83d\udce5 Checkout code   2025-07-16T11:08:03.5448838Z [command]\/usr\/bin\/git submodule foreach --recursive sh -c \"git config --local --name-only --get-regexp 'core\\.sshCommand' &amp;&amp; git config --local --unset-all 'core.sshCommand' || :\" screenshots-tablet      Post \ud83d\udce5 Checkout code   2025-07-16T11:08:03.5672398Z [command]\/usr\/bin\/git config --local --name-only --get-regexp  http\\.https\\:\\\/\\\/github\\.com\\\/\\.extraheader screenshots-tablet      Post \ud83d\udce5 Checkout code   2025-07-16T11:08:03.5693891Z http.https:\/\/github.com\/.extraheader screenshots-tablet      Post \ud83d\udce5 Checkout code   2025-07-16T11:08:03.5705901Z [command]\/usr\/bin\/git config --local --unset-all http.https:\/\/github.com\/.extraheader screenshots-tablet      Post \ud83d\udce5 Checkout code   2025-07-16T11:08:03.5735076Z [command]\/usr\/bin\/git submodule foreach --recursive sh -c \"git config --local --name-only --get-regexp 'http\\.https\\:\\\/\\\/github\\.com\\\/\\.extraheader' &amp;&amp; git config --local --unset-all 'http.https:\/\/github.com\/.extraheader' || :\" screenshots-tablet      Complete job    2025-07-16T11:08:03.6053273Z Cleaning up orphan processes<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0430\u0433\u0435\u043d\u0442\u0443 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u043a\u0430 \u0441\u0431\u043e\u0440\u043a\u0430 \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u0437\u0435\u043b\u0435\u043d\u043e\u0439. \u0418 \u044d\u0442\u043e \u0434\u0430\u0436\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 8 \u0438\u0437 10 \u0441\u043b\u0443\u0447\u0430\u0435\u0432. \u041d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0436\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u0430\u043c\u0438\u043c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f IDE, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 Github.<\/p>\n<p><strong>Github CodeSpaces<\/strong><\/p>\n<p>\u041c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 Cursor \u0438 \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u043d\u0430 \u043d\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 CI\/CD \u043d\u0430 actions \u0438 \u0434\u0430\u043b\u0438 \u0430\u0433\u0435\u043d\u0442\u0430\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 github cli. \u0418 \u0432\u0441\u0451 \u044d\u0442\u043e \u0441 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430, \u0432 \u043f\u0435\u0440\u0435\u0440\u044b\u0432\u0430\u0445 \u043d\u0430 \u043a\u043e\u0444\u0435.<\/p>\n<p>\u041d\u043e \u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0438\u043d\u0433 \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0430\u0433\u0435\u043d\u0442\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u043f\u043b\u043e\u0445\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043d\u044b\u0440\u044f\u0442\u044c \u0432 \u043a\u043e\u0434 \u0438 \u0437\u0432\u0430\u0442\u044c \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c CodeSpaces.<\/p>\n<div class=\"floating-image\">\n<figure class=\"float\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/685\/852\/492\/685852492135f030b628b8257960ab72.png\" width=\"409\" height=\"344\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/685\/852\/492\/685852492135f030b628b8257960ab72.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/685\/852\/492\/685852492135f030b628b8257960ab72.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>CodeSpaces \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u043f\u0430\u0434\u0430\u0435\u0442 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 Code.<\/p>\n<\/div>\n<p>CodeSpaces &#8212; \u044d\u0442\u043e IDE \u0441 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u043c \u0438 Github Copilot (\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 Copilot \u0431\u044b\u0441\u0442\u0440\u043e \u043a\u043e\u043d\u0447\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u0432 \u043c\u0430\u0440\u043a\u0435\u0442\u0435 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432).<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/12a\/2d6\/c99\/12a2d6c99820699c6b4e018c8893c88c.png\" width=\"1916\" height=\"921\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/12a\/2d6\/c99\/12a2d6c99820699c6b4e018c8893c88c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/12a\/2d6\/c99\/12a2d6c99820699c6b4e018c8893c88c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d14\/bdb\/708\/d14bdb70893fc66950b3ea2b8b340375.png\" width=\"576\" height=\"1280\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d14\/bdb\/708\/d14bdb70893fc66950b3ea2b8b340375.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d14\/bdb\/708\/d14bdb70893fc66950b3ea2b8b340375.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0423\u0432\u044b, \u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f CodeSpace \u0441 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.<\/p>\n<\/div>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e  \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0438 \u043d\u0430\u043c \u0435\u0449\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f. \u041b\u0435\u0433\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0438\u043d\u0433\u0430!<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/931296\/\"> https:\/\/habr.com\/ru\/articles\/931296\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u0432\u0435\u043d\u0438\u0440 \u0412\u043e\u0440\u043e\u043d\u043e\u0432 \u0438 \u044f \u043e\u0442\u0432\u0435\u0447\u0430\u044e \u0437\u0430 \u041b\u0430\u0431\u043e\u0440\u0430\u0442\u043e\u0440\u0438\u044e \u0438\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u0439 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 &#171;\u0414\u0410\u0420&#187;. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0438 \u0432\u0435\u043b\u0438\u043a\u043e\u043b\u0435\u043f\u043d\u044b\u0439 Github Cli, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043b \u043a\u0443\u0447\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<h3>\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041b\u0435\u0442\u043e. \u0412\u0440\u0435\u043c\u044f \u043e\u0442\u043f\u0443\u0441\u043a\u043e\u0432. \u0414\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0447\u0435\u0433\u043e.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043b\u0438\u043f\u0430\u0442\u044c \u0432 \u0440\u0438\u043b\u0441\u0430\u0445 \u0438\u043b\u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u044c\u0447\u0438\u043a\u0430\u0445 \u043d\u0430 \u043f\u043b\u044f\u0436\u0435, \u043d\u043e \u0437\u0430\u0447\u0435\u043c, \u0435\u0441\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u0438\u043a\u043e\u043b\u044c\u043d\u043e\u0435 \u0441 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0435\u0440\u0435\u0437 \u0430\u0433\u0435\u043d\u0442\u043e\u0432. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 <a href=\"https:\/\/cursor.com\/agents\" rel=\"noopener noreferrer nofollow\">\u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e<\/a> (\u0441\u0442\u043e\u0438\u0442 20 USD \u0432 \u043c\u0435\u0441\u044f\u0446 \u0438\u043b\u0438 3 \u0442\u044b\u0441 \u0440\u0443\u0431 \u0432 \u0433\u043e\u0434, \u0435\u0441\u043b\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430\u0442\u044c).<\/p>\n<div class=\"floating-image\">\n<figure class=\"float full-width\">\n<div><figcaption>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u043c\u043f\u0442<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u0442\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 (\u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <a href=\"https:\/\/github.com\/RobotAvi\/MoneyGame\" rel=\"noopener noreferrer nofollow\">\u0442\u0430\u043a\u043e\u0439<\/a>) \u0438\u043b\u0438 \u0431\u0435\u0440\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u044b\u0439. \u0414\u0430\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u0430\u0433\u0435\u043d\u0442\u0443 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u0433\u0440\u0443. <\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float\">\n<div><figcaption>\u0412\u044b\u0431\u043e\u0440 \u043c\u043e\u0434\u0435\u043b\u0435\u0439<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u043a\u0430 \u0430\u0433\u0435\u043d\u0442 \u0434\u0435\u043b\u0430\u0435\u0442 \u0438\u0433\u0440\u0443 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u0440\u043e UI. \u0410\u0433\u0435\u043d\u0442 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 Claude Sonnet. \u041a\u043e\u0433\u0434\u0430 \u0442\u043e\u043a\u0435\u043d\u044b \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 Auto \u0440\u0435\u0436\u0438\u043c. <\/p>\n<\/div>\n<p>\u0410\u0433\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e. \u042f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0432\u0435\u0441\u0442\u0438 \u0434\u0440\u0435\u0432\u043e\u0432\u0438\u0434\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0437\u0430\u0434\u0430\u0447 \u0434\u043b\u044f \u0430\u0433\u0435\u043d\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0441\u0430\u043c\u043e\u043c\u0443 \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c\u0441\u044f. \u0418\u043d\u0430\u0447\u0435 \u0443\u0436\u0435 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 3-4 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0431\u044b\u0442\u044c \u0441 \u043a\u0435\u043c \u0438 \u043e \u0447\u0435\u043c \u0434\u043e\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u043b\u0441\u044f. \u0410\u0433\u0435\u043d\u0442\u044b \u043b\u044e\u0431\u044f\u0442:<\/p>\n<ol>\n<li>\n<p>\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u0434\u043e\u0434\u0435\u043b\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u043e \u043a\u043e\u043d\u0446\u0430<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u0434 \u0443 \u0441\u0435\u0431\u044f \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u0434 \u0443 \u0441\u0435\u0431\u044f, \u043d\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u044f\u0432\u043b\u044f\u0442\u044c \u0438\u0437\u043b\u0438\u0448\u043d\u044e\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u0438\u0432\u0443<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0442\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u0438\u0432\u0443 \u0438 \u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0443 \u0432\u0430\u0441 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u044e<\/p>\n<\/li>\n<\/ol>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><\/figure>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0434\u043e \u0447\u0435\u0442\u043a\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0432\u0430\u0448\u0438\u0445 \u0432\u0437\u0430\u0438\u043c\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0439 \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u0430\u0433\u0435\u043d\u0442\u043e\u043c. \u0418\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u0432 Obsidian \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c.<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\">\n<div><figcaption>\u0427\u0430\u0442<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u00a0\u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438 \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438. \u041f\u0435\u0440\u0432\u043e\u0435\u00a0\u2014 \u0447\u0430\u0442, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u00a0\u0445\u043e\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u00ab\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f\u00a0\u043b\u0438?\u00bb<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><\/figure>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0430, Diff, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0438\u0434\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0430\u0433\u0435\u043d\u0442\u0430.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c Pull Request \u0438 Merge \u043f\u0440\u044f\u043c\u043e \u0432 \u0430\u0433\u0435\u043d\u0442\u0435.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u0435\u0449\u0438:<\/p>\n<p>1. \u0410\u0433\u0435\u043d\u0442\u044b \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0442 \u0432\u0435\u0442\u043a\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a. \u0415\u0441\u043b\u0438 \u0437\u0430 \u044d\u0442\u0438\u043c \u043d\u0435 \u0441\u043b\u0435\u0434\u0438\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0432\u0435\u0442\u043e\u043a \u0441 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u043c\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c\u0438.<\/p>\n<p>2. \u0410\u0433\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0442\u0435\u0440\u044f\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u0441 Git, \u043d\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0438\u043c \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b. \u0418\u043d\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043d\u043e\u043f\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Pull Request \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0435\u0437 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u044b. \u0422\u043e\u0433\u0434\u0430 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0430\u0433\u0435\u043d\u0442\u0443, \u0433\u0434\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0434\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u0430, \u0442\u043e\u043a\u0435\u043d\u044b. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0430\u043d\u0430\u0440\u0445\u0438\u0438 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043b\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u043f\u0440\u0430\u0432\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0434\u0430\u0435\u0442\u0435 \u0430\u0433\u0435\u043d\u0442\u0430\u043c.<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><\/figure>\n<p>\u0412 \u043e\u043f\u0446\u0438\u044f\u0445 \u043a \u0430\u0433\u0435\u043d\u0442\u0430\u043c \u0435\u0441\u0442\u044c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f BugBot, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0432 \u0432\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435 \u0431\u0430\u0433\u0438. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0445\u043e\u0440\u043e\u0448\u0430\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0430, \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0432\u0430\u043b\u0438\u0432\u0448\u0438\u0435\u0441\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0435. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u043d\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u0435 Dashboard.<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float\"><\/figure>\n<p>\u041f\u043e\u043a\u0430 \u043c\u044b \u0438\u0437\u0443\u0447\u0430\u043b\u0438 \u0430\u0433\u0435\u043d\u0442\u0430, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0434\u043e\u0431\u0438\u0435 \u0438\u0433\u0440\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u0430\u0436\u0435 \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u043e \u0438\u0433\u0440\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443.<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><\/figure>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c, \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0432\u044f\u0437\u044c \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438. <\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><\/figure>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0434\u0438\u0437\u0430\u0439\u043d\u0443 \u0438 \u043f\u0440\u043e\u0441\u0438\u043c \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u043c\u043f\u0442\u044b \u0434\u043b\u044f Midjourney \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432. \u0413\u043e\u0442\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u043c\u043f\u0442\u044b \u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0441\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0432 md \u0444\u0430\u0439\u043b.<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\">\n<div><figcaption>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \u043f\u043e\u0445\u043e\u0440\u043e\u0448\u0435\u043b\u043e, \u043a\u0430\u043a \u041c\u043e\u0441\u043a\u0432\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u043c\u043f\u0442\u044b \u0432 \u0441\u0432\u043e\u0439  \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432 \u0438\u0433\u0440\u0443. <\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\">\n<div><figcaption>\u0414\u043e\u0431\u0430\u0432\u0438\u043b\u0441\u044f \u043a\u0430\u0441\u0442\u043e\u043c<\/figcaption><\/div>\n<\/figure>\n<p>\u0410\u0433\u0435\u043d\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u00ab\u043e\u0431\u043e\u0448\u0435\u043b\u0441\u044f\u00bb \u0441\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0430\u043c\u0438. \u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043d\u0430\u00a0\u0432\u0441\u0435 \u043c\u0435\u043d\u044e, \u0430\u00a0\u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u00a0\u043f\u043e\u0434\u043c\u0435\u043d\u044e (\u0432\u044b\u0431\u043e\u0440 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u0438, \u043c\u0435\u0447\u0442\u044b, \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u0438\u00a0\u0442.\u00a0\u0434.)<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\">\n<div><figcaption>\u0412\u044b\u044f\u0441\u043d\u0438\u043b\u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0430\u0440\u0434 \u0438 \u0441\u043e\u0444\u0442 \u0441\u043a\u0438\u043b\u043b\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u0438\u0434\u0435\u0438 \u043f\u043e \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0441\u0445\u043e\u0434\u0438\u043b\u0438 \u043e\u0442 \u0430\u0433\u0435\u043d\u0442\u0430.<\/p>\n<p>\u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043e\u0446\u0435\u043d\u043a\u0430 \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u0432 \u0440\u0443\u0431\u043b\u044f\u0445 \u0438 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0436\u0438\u0437\u043d\u0438 \u0431\u044b\u043b\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0432 \u0441\u0435\u0442\u0438.<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\">\n<div><figcaption>\u041f\u043e\u0441\u043c\u0435\u044f\u043b\u0438\u0441\u044c \u043d\u0430\u0434 \u0446\u0435\u043d\u0430\u043c\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0435\u043a\u0441\u0442 \u043d\u0430 \u043f\u043b\u0430\u0448\u043a\u0430\u0445 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u0445\u043e\u0434\u0438\u043b \u0437\u0430 \u043a\u0440\u0430\u044f. \u041d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u043b\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430 \u044d\u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e\u0431\u044b \u0430\u0433\u0435\u043d\u0442 \u0432\u0441\u0451 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043b.<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\">\n<div><figcaption>\u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u044d\u043a\u0440\u0430\u043d<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0430. \u0412\u0441\u0435 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u043b \u0441\u0430\u043c \u0430\u0433\u0435\u043d\u0442 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0442\u043a\u0443.<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\">\n<div><figcaption>\u0422\u0430\u043a \u0432\u0438\u0434\u0438\u0442 \u043a\u0443\u0431\u0438\u043a Midjourney<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0441\u0430\u043c\u044b\u043c \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0431\u044b\u043b\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0430\u0433\u0435\u043d\u0442\u0430\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043a\u0443\u0431\u0438\u043a. \u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043b\u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u0435\u043a.<\/p>\n<\/div>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u044b\u0445 \u043a\u0443\u0431\u0438\u043a\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 mesh.ai \u0442\u043e\u0436\u0435 \u043d\u0435 \u0443\u0432\u0435\u043d\u0447\u0430\u043b\u0441\u044f \u0443\u0441\u043f\u0435\u0445\u043e\u043c. \u041a\u0443\u0431\u0438\u043a\u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u043b\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c\u0438, \u0442\u043e\u0447\u043a\u0438 \u043f\u043b\u044b\u043b\u0438 \u043f\u043e \u0433\u0440\u0430\u043d\u044f\u043c.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0422\u0430\u043a \u0432\u0438\u0434\u0438\u0442 Meshy.ai<\/figcaption><\/div>\n<\/figure>\n<p>\u041c\u044b \u0441 \u0430\u0433\u0435\u043d\u0442\u043e\u043c \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u043b\u044f\u00a0\u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u0443\u0431\u0430 \u0438 \u043d\u0430\u0442\u044f\u043d\u0443\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0447\u0435\u0440\u0435\u0437 \u043f\u0438\u0442\u043e\u043d, \u043d\u043e\u00a0\u0432\u00a0\u0438\u0442\u043e\u0433\u0435 \u00ab\u0441\u043e\u0448\u043b\u0438\u0441\u044c\u00bb \u043d\u0430\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0434\u043b\u044f\u00a0\u0431\u043b\u0435\u043d\u0434\u0435\u0440\u0430. Cursor \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u0440\u0430\u0437\u0443 \u0445\u043e\u0440\u043e\u0448\u043e. <\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0421\u043a\u0440\u0438\u043f\u0442 \u0430\u0433\u0435\u043d\u0442\u0430 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432 \u0431\u043b\u0435\u043d\u0434\u0435\u0440\u0435 \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0430. \u0422\u043e\u0447\u043a\u0438 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0448\u0430\u0440\u0438\u043a\u0430\u043c\u0438. \u0411\u0440\u0430\u0432\u043e, \u0430\u0433\u0435\u043d\u0442!<\/figcaption><\/div>\n<\/figure>\n<p>\u041a \u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u043f\u0440\u043e\u0435\u043a\u0442 \u0443\u0436\u0435 \u0440\u0430\u0437\u0440\u043e\u0441\u0441\u044f, \u0438 \u044f \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u0420\u0430\u0441\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b \u043f\u043e <a href=\"https:\/\/c4model.com\/\" rel=\"noopener noreferrer nofollow\">C4<\/a>. \u0418 \u0432\u043e\u0442 \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043b\u043e\u0439 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430. <\/p>\n<div class=\"floating-image\">\n<figure class=\"float full-width\">\n<div><figcaption>\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c<\/strong> \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/p>\n<\/div>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u043b\u043e\u0439 \u0430\u0433\u0435\u043d\u0442 \u043e\u043f\u0438\u0441\u0430\u043b \u043e\u0434\u043d\u0438\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u0441 4 \u0441\u043b\u043e\u044f\u043c\u0438. \u0412\u043f\u043e\u043b\u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<div class=\"floating-image\">\n<figure class=\"float full-width\">\n<div><figcaption>\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p><strong>UI \u0441\u043b\u043e\u0439:<\/strong>\u00a0\u0410\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 (MainActivity, GameActivity, CharacterCreationActivity, ProfessionSelectionActivity, RulesActivity) \u0438 layout-\u0444\u0430\u0439\u043b\u044b.<\/p>\n<p><strong>\u041b\u043e\u0433\u0438\u043a\u0430 \u0438\u0433\u0440\u044b<\/strong>:\u00a0GameManager, \u043c\u043e\u0434\u0435\u043b\u0438 (Player, GameState, Card, Asset \u0438 \u0434\u0440.), \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0440\u0430\u0441\u0447\u0451\u0442\u044b.<\/p>\n<p><strong>\u0414\u0430\u043d\u043d\u044b\u0435<\/strong>:\u00a0GameDataManager (\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u0438, \u043c\u0435\u0447\u0442\u044b \u0438 \u0434\u0440.), \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 (Parcelable)<\/p>\n<p><strong>\u0420\u0435\u0441\u0443\u0440\u0441\u044b<\/strong>:\u00a0\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0438\u043a\u043e\u043d\u043a\u0438, \u0441\u0442\u0438\u043b\u0438, \u0441\u0442\u0440\u043e\u043a\u0438, layout-\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f<\/p>\n<\/div>\n<p>\u041d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u0441\u043b\u043e\u0435 \u0430\u0433\u0435\u043d\u0442 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043b 4 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.<\/p>\n<h4>1. UI-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b (\u044d\u043a\u0440\u0430\u043d\u044b, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441)<\/h4>\n<figure class=\"full-width\">\n<div><figcaption>UI-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b<\/figcaption><\/div>\n<\/figure>\n<ul>\n<li>\n<p>MainActivity \u2014 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d<\/p>\n<\/li>\n<li>\n<p>GameActivity \u2014 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441<\/p>\n<\/li>\n<li>\n<p>CharacterCreationActivity \u2014 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430<\/p>\n<\/li>\n<li>\n<p>ProfessionSelectionActivity \u2014 \u0432\u044b\u0431\u043e\u0440 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u0438 \u0438 \u043c\u0435\u0447\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>RulesActivity \u2014 \u044d\u043a\u0440\u0430\u043d \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438<\/p>\n<\/li>\n<li>\n<p><strong>Adapters<\/strong>\u00a0(\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u043e\u0432):<\/p>\n<ul>\n<li>\n<p>adapters\/AssetAdapter.kt<\/p>\n<\/li>\n<li>\n<p>adapters\/ProfessionAdapter.kt<\/p>\n<\/li>\n<li>\n<p>adapters\/DreamAdapter.kt<\/p>\n<\/li>\n<li>\n<p>(\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432 adapters\/)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><strong>2. \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438<\/strong><\/p>\n<div class=\"floating-image\">\n<figure class=\"float\"><\/figure>\n<p>GameManager \u2014 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0438\u0433\u0440\u044b<\/p>\n<\/div>\n<h4>3. \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 (\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445)<\/h4>\n<figure class=\"full-width\"><\/figure>\n<ul>\n<li>\n<p>models\/Player.kt \u2014 \u0438\u0433\u0440\u043e\u043a<\/p>\n<\/li>\n<li>\n<p>models\/GameState.kt \u2014 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u0433\u0440\u044b<\/p>\n<\/li>\n<li>\n<p>models\/Card.kt \u2014 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438, \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u0438, \u043c\u0435\u0447\u0442\u044b, \u0430\u043a\u0442\u0438\u0432\u044b, \u043f\u0430\u0441\u0441\u0438\u0432\u044b, \u0438\u043d\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>models\/Asset.kt, models\/Liability.kt, models\/Investment.kt \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438<\/p>\n<\/li>\n<li>\n<p>models\/FinancialEntry.kt \u2014 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b<\/p>\n<\/li>\n<li>\n<p>models\/ProfessionalRisk.kt \u2014 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0438\u0441\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>(\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432 models\/)<\/p>\n<\/li>\n<\/ul>\n<h4>4. \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u0430\u043d\u043d\u044b\u0445<\/h4>\n<figure class=\"full-width\"><\/figure>\n<ul>\n<li>\n<p>data\/GameDataManager.kt \u2014 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438\u0433\u0440\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/p>\n<\/li>\n<li>\n<p>data\/FinancialTemplates.kt \u2014 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u0439<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0438 \u0431\u0435\u0437 \u0430\u0433\u0435\u043d\u0442\u0430. \u041d\u043e \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0431\u043e\u0442\u044b. <\/p>\n<p><strong>\u041f\u0440\u043e CICD \u0438 Github<\/strong><\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0439 \u043c\u044b\u0441\u043b\u044c\u044e \u0431\u044b\u043b\u043e &#8212; \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0430\u0439\u043f\u044b CICD, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u0438 \u0431\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c apk \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u0427\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c CICD \u0432 GitHub \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f Github Actions.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u042d\u0442\u043e Yaml, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u0435\u0436\u0438\u0442 \u0432 .github\/workflows <\/p>\n<ul>\n<li>\n<p><strong>Workflow (\u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441)<\/strong>\u00a0\u2014 \u0444\u0430\u0439\u043b YAML.<\/p>\n<\/li>\n<li>\n<p><strong>Event (\u0441\u043e\u0431\u044b\u0442\u0438\u0435)<\/strong>\u00a0\u2014 \u0442\u0440\u0438\u0433\u0433\u0435\u0440, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 workflow (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, push, pull_request, issue). \u0417\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c \u0436\u0435 yaml \u043f\u043e \u0441\u043b\u043e\u0432\u0443 on:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"yaml\">on:   push:     branches: [ main ]   pull_request:     branches: [ main ]   workflow_dispatch:<\/code><\/pre>\n<ul>\n<li>\n<p><strong>Job (\u0437\u0430\u0434\u0430\u0447\u0430)<\/strong>\u00a0\u2014 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043e\u0441\u043e\u0431\u043b\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0448\u0430\u0433\u043e\u0432 (steps), \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"yaml\">jobs:   # \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435   build-and-test: ...   # \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432 \u0434\u043b\u044f \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430   screenshots-phone: ...<\/code><\/pre>\n<ul>\n<li>\n<p><strong>Step (\u0448\u0430\u0433)<\/strong>\u00a0\u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f: \u0441\u043a\u0440\u0438\u043f\u0442 shell, \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 actions, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"yaml\">    - name: \ud83d\udd27 Grant execute permission for gradlew       run: chmod +x gradlew<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 Workflow:<\/p>\n<pre><code class=\"yaml\">name: \ud83d\ude80 Stable Build &amp; Release  on:   push:     branches: [ main ]   pull_request:     branches: [ main ]   workflow_dispatch:  env:   GRADLE_OPTS: -Dorg.gradle.daemon=false -Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true   MAESTRO_CLI_ANALYSIS_NOTIFICATION_DISABLED: \"true\"  jobs:   # \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435   build-and-test:     runs-on: ubuntu-latest     permissions:       contents: write     outputs:       version: ${{ steps.version.outputs.version }}       version_code: ${{ steps.version.outputs.version_code }}       date: ${{ steps.date.outputs.date }}       apk_path: ${{ steps.apk_path.outputs.path }}     # should_release \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d      steps:     - name: \ud83d\udce5 Checkout code       uses: actions\/checkout@v4       with:         fetch-depth: 0  # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u043b\u043d\u0443\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0434\u043b\u044f changelog      - name: \ud83d\udd0d Determine if this is a release build       id: should_release       run: |         if [[ \"${{ github.event_name }}\" == \"push\" &amp;&amp; \"${{ github.ref }}\" == \"refs\/heads\/main\" ]]; then           echo \"value=true\" &gt;&gt; $GITHUB_OUTPUT         else           echo \"value=false\" &gt;&gt; $GITHUB_OUTPUT         fi      - name: \ud83d\udd16 Bump version (only for releases)       id: bump_version       if: steps.should_release.outputs.value == 'true'       run: |         # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e         CURR_VERSION=$(grep -oP 'versionName\\s+\"\\K[^\"]+' app\/build.gradle)         CURR_CODE=$(grep -oP 'versionCode\\s+\\K[0-9]+' app\/build.gradle)                  # \u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c minor \u0432\u0435\u0440\u0441\u0438\u044e (x.y -&gt; x.(y+1))         MAJOR=$(echo $CURR_VERSION | cut -d. -f1)         MINOR=$(echo $CURR_VERSION | cut -d. -f2)         if [ -z \"$MINOR\" ]; then MINOR=0; fi         NEW_MINOR=$((MINOR+1))         NEW_VERSION=\"$MAJOR.$NEW_MINOR\"         NEW_CODE=$((CURR_CODE+1))                  # \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c build.gradle         sed -i \"s\/versionName \\\"$CURR_VERSION\\\"\/versionName \\\"$NEW_VERSION\\\"\/\" app\/build.gradle         sed -i \"s\/versionCode $CURR_CODE\/versionCode $NEW_CODE\/\" app\/build.gradle                  echo \"new_version=$NEW_VERSION\" &gt;&gt; $GITHUB_OUTPUT         echo \"new_code=$NEW_CODE\" &gt;&gt; $GITHUB_OUTPUT         echo \"Version bumped: $CURR_VERSION \u2192 $NEW_VERSION ($CURR_CODE \u2192 $NEW_CODE)\"                  # \u041a\u043e\u043c\u043c\u0438\u0442\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f         git config --local user.email \"action@github.com\"         git config --local user.name \"GitHub Action\"         git add app\/build.gradle         git commit -m \"\ud83d\udd16 Bump version to $NEW_VERSION ($NEW_CODE) [auto]\" || echo \"No version change to commit\"         git push || echo \"No changes to push\"      - name: \ud83d\udcdd Generate release notes (only for releases)       id: release_notes       if: steps.should_release.outputs.value == 'true'       run: |         echo \"## \ud83c\udfae Financial Success v${{ steps.bump_version.outputs.new_version }}\" &gt; RELEASE_NOTES.md         echo \"\" &gt;&gt; RELEASE_NOTES.md         echo \"### \ud83d\udcc5 \u0414\u0430\u0442\u0430 \u0440\u0435\u043b\u0438\u0437\u0430: $(date '+%Y-%m-%d %H:%M UTC')\" &gt;&gt; RELEASE_NOTES.md         echo \"\" &gt;&gt; RELEASE_NOTES.md         echo \"### \ud83d\udd04 \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:\" &gt;&gt;<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-468745","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/468745","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=468745"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/468745\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=468745"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=468745"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=468745"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}