{"id":23683,"date":"2026-05-08T21:16:16","date_gmt":"2026-05-08T21:16:16","guid":{"rendered":"https:\/\/umang.pk\/2026\/05\/08\/%da%88%d8%a7%d8%b1%d9%b9-%da%a9%db%92-%d8%b3%d8%a7%d8%aa%da%be-%da%a9%d9%85%d8%a7%d9%86%da%88-%d9%84%d8%a7%d8%a6%d9%86-%d8%a7%d9%86%d9%b9%d8%b1%d9%81%db%8c%d8%b3-cli-%da%a9%db%8c-%d8%aa%d8%b1%d9%82\/"},"modified":"2026-05-08T21:16:16","modified_gmt":"2026-05-08T21:16:16","slug":"%da%88%d8%a7%d8%b1%d9%b9-%da%a9%db%92-%d8%b3%d8%a7%d8%aa%da%be-%da%a9%d9%85%d8%a7%d9%86%da%88-%d9%84%d8%a7%d8%a6%d9%86-%d8%a7%d9%86%d9%b9%d8%b1%d9%81%db%8c%d8%b3-cli-%da%a9%db%8c-%d8%aa%d8%b1%d9%82","status":"publish","type":"post","link":"https:\/\/umang.pk\/en_us\/2026\/05\/08\/%da%88%d8%a7%d8%b1%d9%b9-%da%a9%db%92-%d8%b3%d8%a7%d8%aa%da%be-%da%a9%d9%85%d8%a7%d9%86%da%88-%d9%84%d8%a7%d8%a6%d9%86-%d8%a7%d9%86%d9%b9%d8%b1%d9%81%db%8c%d8%b3-cli-%da%a9%db%8c-%d8%aa%d8%b1%d9%82\/","title":{"rendered":"\u0688\u0627\u0631\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u0645\u0627\u0646\u0688 \u0644\u0627\u0626\u0646 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 (CLI) \u06a9\u06cc \u062a\u0631\u0642\u06cc \u06a9\u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631\u06cc\u06ba: \u0635\u0641\u0631 \u0633\u06d2 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u06be\u0644\u06d2 \u0688\u0648\u06cc\u0644\u067e\u0631 \u0679\u0648\u0644\u0632 \u062a\u06a9\u06d4"},"content":{"rendered":"\n<div id=\"\">\n<p>\u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0688\u0648\u06cc\u0644\u067e\u0631 \u0627\u067e\u0646\u06d2 \u062f\u0646 \u06a9\u0627 \u0627\u06cc\u06a9 \u0627\u06c1\u0645 \u062d\u0635\u06c1 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0645\u06cc\u06ba \u06af\u0632\u0627\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0648\u06c1 \u0686\u0644\u0627\u062a\u06d2 \u06c1\u06cc\u06ba <code>flutter build<\/code>\u062f\u06be\u06a9\u0627 <code>git<\/code>\u067e\u06cc\u06a9\u06cc\u062c \u0645\u06cc\u0646\u062c\u0645\u0646\u0679 <code>dart pub<\/code>\u06a9\u0645\u0627\u0646\u0688 \u0644\u0627\u0626\u0646 \u0633\u06d2 \u0627\u067e\u0646\u06cc \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u06a9\u0648 \u0679\u06cc\u0648\u0646 \u06a9\u0631\u06cc\u06ba\u06d4 \u06cc\u06c1 \u062a\u0645\u0627\u0645 \u0679\u0648\u0644\u0632 CLI \u06cc\u0627 \u06a9\u0645\u0627\u0646\u0688 \u0644\u0627\u0626\u0646 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u0627 \u067e\u0631\u0648\u06af\u0631\u0627\u0645 \u06c1\u06d2 \u062c\u0648 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0645\u06cc\u06ba \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2 \u0627\u0648\u0631 \u0679\u06cc\u06a9\u0633\u0679 \u06a9\u0645\u0627\u0646\u0688\u0632 \u06a9\u0627 \u062c\u0648\u0627\u0628 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0644\u06cc\u06a9\u0646 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u0646\u06d2 \u06a9\u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u0628\u0646\u0627\u06cc\u0627\u06d4<\/p>\n<p>\u06cc\u06c1 \u0627\u06cc\u06a9 \u0636\u0627\u0626\u0639 \u06c1\u0648\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0645\u0648\u0642\u0639 \u06c1\u06d2\u06d4 CLI \u0679\u0648\u0644\u0632 \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0639\u0645\u0644\u06cc \u0679\u0648\u0644\u0632 \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u06c1\u06cc\u06ba \u062c\u0648 \u0627\u06cc\u06a9 \u0688\u0648\u06cc\u0644\u067e\u0631 \u067e\u06cc\u0634 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062f\u06c1\u0631\u0627\u0626\u06d2 \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u0648 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0679\u06cc\u0645\u0648\u06ba \u0645\u06cc\u06ba \u0639\u0645\u0644 \u06a9\u0648 \u0645\u0639\u06cc\u0627\u0631\u06cc \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0634\u0627\u0626\u0639 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0627\u06cc\u06a9 \u0679\u06be\u0648\u0633 \u0646\u0645\u0648\u0646\u06c1 \u0628\u0646 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0633\u06d2 \u0688\u0648\u06cc\u0644\u067e\u0631 \u06a9\u0645\u06cc\u0648\u0646\u0679\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a\u060c \u0627\u0646\u0633\u0679\u0627\u0644 \u0627\u0648\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u06c1\u06cc\u0646\u0688 \u0628\u06a9 \u0645\u06cc\u06ba\u060c \u06c1\u0645 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u062a\u0642\u0633\u06cc\u0645 \u0634\u062f\u06c1 \u0688\u0627\u0631\u0679 CLI \u0679\u0648\u0644 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u0627 \u0639\u0645\u0644 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0622\u0626\u06cc\u06d2 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0628\u0627\u062a\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba: CLI \u06a9\u06cc\u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0688\u0627\u0631\u0679 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0627\u0646 \u067e\u0679 \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u062d\u0627\u0635\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u06a9\u0644\u06cc\u062f\u06cc \u0646\u062d\u0648 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u062c\u0648 \u0622\u067e \u06a9\u0648 \u062c\u0627\u0646\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f \u06c1\u0645 \u062a\u06cc\u0646 \u0628\u062a\u062f\u0631\u06cc\u062c \u0632\u06cc\u0627\u062f\u06c1 \u067e\u06cc\u0686\u06cc\u062f\u06c1 CLIs \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062c\u0648 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0628\u0627\u062a\u0648\u06ba \u0633\u06d2 \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0635\u0644 API \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0627\u06cc\u06af\u0632\u06cc\u06a9\u06cc\u0648\u0679\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062e\u062a\u0645 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0622\u062e\u0631 \u0645\u06cc\u06ba\u060c \u06c1\u0645 \u062a\u0642\u0633\u06cc\u0645 \u06a9\u06d2 \u062a\u0645\u0627\u0645 \u062f\u0633\u062a\u06cc\u0627\u0628 \u0631\u0627\u0633\u062a\u0648\u06ba \u06a9\u0627 \u0627\u062d\u0627\u0637\u06c1 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4 <code>pub.dev<\/code> \u0645\u0631\u062a\u0628 \u0634\u062f\u06c1 \u0628\u0627\u0626\u0646\u0631\u06cc\u0632\u060c \u06c1\u0648\u0645\u0628\u0631\u06cc\u0648 \u0679\u06cc\u0628\u0632\u060c \u0688\u0648\u06a9\u0631\u060c \u0627\u0648\u0631 \u0645\u0642\u0627\u0645\u06cc \u0679\u06cc\u0645 \u0627\u06cc\u06a9\u0679\u06cc\u0648\u06cc\u0634\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06af\u0627\u0626\u06cc\u0688 \u06a9\u06d2 \u0627\u062e\u062a\u062a\u0627\u0645 \u062a\u06a9\u060c \u0622\u067e \u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0633\u0645\u062c\u06be \u062c\u0627\u0626\u06cc\u06ba \u06af\u06d2 \u06a9\u06c1 \u0688\u0627\u0631\u0679 \u0645\u06cc\u06ba CLI \u0679\u0648\u0644\u0632 \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u0627\u0626\u06d2 \u062c\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0646\u06c1\u06cc\u06ba \u062f\u0648\u0633\u0631\u06d2 \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u0648 \u0639\u0645\u0644\u06cc \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u06cc\u0633\u06d2 \u062f\u0633\u062a\u06cc\u0627\u0628 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<h2 id=\"heading-table-of-contents\">\u0627\u0646\u0688\u06cc\u06a9\u0633<\/h2>\n<h2 id=\"heading-prerequisites\">\u0634\u0631\u0637\u06cc\u06ba<\/h2>\n<p>\u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u06c1\u0648\u0646\u0627 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2:<\/p>\n<ul>\n<li>\n<p>\u0688\u0627\u0631\u0679 SDK \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba (<code>dart --version<\/code> \u0679\u0631\u0645\u06cc\u0646\u0644 \u0645\u06cc\u06ba \u06a9\u0627\u0645 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2)<\/p>\n<\/li>\n<li>\n<p>\u0688\u0627\u0631\u0679 \u0646\u062d\u0648 \u06a9\u0627 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0639\u0644\u0645<\/p>\n<\/li>\n<li>\n<p>\u0679\u0631\u0645\u06cc\u0646\u0644 \u0627\u0648\u0631 \u0686\u0644\u0627\u0646\u06d2 \u06a9\u06d2 \u0627\u062d\u06a9\u0627\u0645\u0627\u062a \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0622\u0631\u0627\u0645<\/p>\n<\/li>\n<li>\n<p>pub.dev \u0627\u06a9\u0627\u0624\u0646\u0679 (\u067e\u0628\u0644\u0634\u0646\u06af \u0633\u06cc\u06a9\u0634\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2)<\/p>\n<\/li>\n<li>\n<p>GitHub \u0627\u06a9\u0627\u0624\u0646\u0679 (\u0628\u0627\u0626\u0646\u0631\u06cc \u0688\u0633\u0679\u0631\u06cc \u0628\u06cc\u0648\u0634\u0646 \u0633\u06cc\u06a9\u0634\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2)<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"heading-what-is-a-cli-and-why-should-you-build-one\">CLI \u06a9\u06cc\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0645\u06cc\u06ba \u0627\u0633\u06d2 \u06a9\u06cc\u0648\u06ba \u0628\u0646\u0627\u0624\u06ba\u061f<\/h2>\n<p>CLI (\u06cc\u0627 <strong>\u06a9\u0645\u0627\u0646\u0688 \u0644\u0627\u0626\u0646 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633<\/strong>) \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u0627 \u067e\u0631\u0648\u06af\u0631\u0627\u0645 \u06c1\u06d2 \u062c\u0648 \u06af\u0631\u0627\u0641\u06cc\u06a9\u0644 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u0645\u06cc\u06ba \u0628\u0679\u0646\u0648\u06ba \u0627\u0648\u0631 \u0627\u0633\u06a9\u0631\u06cc\u0646\u0648\u06ba \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0645\u06cc\u06ba \u0679\u06cc\u06a9\u0633\u0679 \u06a9\u0645\u0627\u0646\u0688\u0632 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0646\u0679\u0631\u0627\u06cc\u06a9\u0679\u0648 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0688\u0648\u06cc\u0644\u067e\u0631 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u060c \u0628\u06c1\u062a \u0633\u06d2 \u0679\u0648\u0644\u0632 \u062c\u0648 \u0622\u067e \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0648\u06c1 CLI \u0679\u0648\u0644\u0632 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-yaml\">flutter build apk\ngit commit -m \"fix: auth flow\"\ndart pub get\nnpm install\n<\/code><\/pre>\n<p>\u067e\u06be\u0691\u067e\u06be\u0691\u0627\u0646\u0627\u060c \u06af\u0679\u060c \u0688\u0627\u0631\u0679\u060c \u0627\u06cc\u0646 \u067e\u06cc \u0627\u06cc\u0645 \u2013 \u062a\u0645\u0627\u0645 CLIs\u06d4 \u0622\u067e \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06c1\u06cc \u0631\u0648\u0632\u0627\u0646\u06c1 CLI \u0635\u0627\u0631\u0641 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0645\u0636\u0645\u0648\u0646 CLI \u0628\u0644\u0688\u0631 \u0628\u0646\u0646\u06d2 \u06a9\u06d2 \u0637\u0631\u06cc\u0642\u06c1 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0688\u0648\u06cc\u0644\u067e\u0631 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u060c CLI \u0679\u0648\u0644 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06cc \u062a\u06cc\u0646 \u0632\u0628\u0631\u062f\u0633\u062a \u0648\u062c\u0648\u06c1\u0627\u062a \u06c1\u06cc\u06ba\u06d4<\/p>\n<ol>\n<li>\n<p><strong>\u062f\u06c1\u0631\u0627\u0626\u06d2 \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u0648 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0628\u0646\u0627\u0626\u06cc\u06ba:<\/strong> \u062c\u0648 \u0628\u06be\u06cc \u0686\u06cc\u0632 \u0622\u067e \u06c1\u0641\u062a\u06d2 \u0645\u06cc\u06ba \u062f\u0648 \u0628\u0627\u0631 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062f\u0627\u062e\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0648\u06c1 \u0622\u0679\u0648\u0645\u06cc\u0634\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06c1\u0644 \u06c1\u06d2\u06d4 \u0633\u06cc \u0627\u06cc\u0644 \u0622\u0626\u06cc \u0633\u0627\u062a \u0642\u062f\u0645\u06cc \u062f\u0633\u062a\u06cc \u0639\u0645\u0644 \u06a9\u0648 \u0627\u06cc\u06a9 \u0648\u0627\u062d\u062f \u06a9\u0645\u0627\u0646\u0688 \u0645\u06cc\u06ba \u0628\u062f\u0644 \u062f\u06cc\u062a\u0627 \u06c1\u06d2: \u0628\u0648\u0627\u0626\u0644\u0631 \u067e\u0644\u06cc\u0679 \u0641\u0648\u0644\u0688\u0631 \u06a9\u0627 \u0688\u06be\u0627\u0646\u0686\u06c1 \u0628\u0646\u0627\u0646\u0627\u060c \u062d\u06a9\u0645\u0648\u06ba \u06a9\u06cc \u062a\u0631\u062a\u06cc\u0628 \u06a9\u0648 \u0686\u0644\u0627\u0646\u0627\u060c \u0641\u0627\u0626\u0644\u0648\u06ba \u06a9\u0648 \u0633\u06c1\u0627\u0631\u0648\u06ba \u0645\u06cc\u06ba \u0688\u06be\u0627\u0644\u0646\u0627\u060c \u0627\u0648\u0631 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u062a\u0639\u0645\u06cc\u0631 \u0634\u062f\u06c1 \u0645\u0627\u062d\u0648\u0644 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u0646\u0627\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0679\u06cc\u0645 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u0648 \u0645\u0639\u06cc\u0627\u0631\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba:<\/strong> README \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u062c\u0648 \u06a9\u06c1\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 &quot;\u0627\u0646 \u06a9\u0645\u0627\u0646\u0688\u0632 \u06a9\u0648 \u0627\u0633 \u062a\u0631\u062a\u06cc\u0628 \u0633\u06d2 \u0686\u0644\u0627\u0626\u06cc\u06ba&#8221;\u060c \u0627\u06cc\u06a9 \u06a9\u0645\u0627\u0646\u0688 \u062f\u06cc\u06ba \u062c\u0648 \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0648 \u0645\u0633\u062a\u0642\u0644 \u0637\u0648\u0631 \u067e\u0631\u060c \u06c1\u0631 \u0628\u0627\u0631\u060c \u0627\u0646\u0633\u0627\u0646\u06cc \u063a\u0644\u0637\u06cc \u06cc\u0627 \u06af\u0645\u0634\u062f\u06c1 \u0627\u0642\u062f\u0627\u0645\u0627\u062a \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u06a9\u0631\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0679\u0648\u0644\u0632 \u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0634\u0627\u0626\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/strong> \u0634\u0627\u0626\u0639 \u0634\u062f\u06c1 \u0688\u0627\u0631\u0679 \u0633\u06cc \u0627\u06cc\u0644 \u0622\u0626\u06cc \u067e\u06cc\u06a9\u062c\u0632 \u0679\u06be\u0648\u0633 \u0646\u0645\u0648\u0646\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 pub.dev \u067e\u0631 \u0646\u0638\u0631 \u0622\u062a\u0627 \u06c1\u06d2\u060c \u062f\u0648\u0633\u0631\u06d2 \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u0627\u0646\u0633\u0679\u0627\u0644 \u0627\u0648\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0646\u06af \u06a9\u06cc \u062d\u0642\u06cc\u0642\u06cc \u06af\u06c1\u0631\u0627\u0626\u06cc \u06a9\u0648 \u0627\u0633 \u0637\u0631\u062d \u0628\u062a\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u0637\u0631\u062d \u067e\u0648\u0631\u0679 \u0641\u0648\u0644\u06cc\u0648 \u06cc\u0627 \u0631\u06cc\u0632\u06cc\u0648\u0645 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u0627\u06d4<\/p>\n<\/li>\n<\/ol>\n<h2 id=\"heading-cli-syntax-anatomy\">CLI \u062a\u062c\u0632\u06cc\u06c1<\/h2>\n<p>\u06a9\u0648\u0688 \u06a9\u06cc \u0627\u06cc\u06a9 \u0644\u0627\u0626\u0646 \u0644\u06a9\u06be\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 CLI \u06a9\u0645\u0627\u0646\u0688\u0632 \u06a9\u06cc \u0633\u0627\u062e\u062a \u06a9\u0648 \u0633\u0645\u062c\u06be\u0646\u0627 \u0645\u0641\u06cc\u062f \u06c1\u06d2\u06d4 \u062a\u0645\u0627\u0645 \u0627\u062d\u06a9\u0627\u0645\u0627\u062a \u0627\u06cc\u06a9 \u0645\u0633\u062a\u0642\u0644 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u06cc \u067e\u06cc\u0631\u0648\u06cc \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">tool [subcommand] [arguments] [options\/flags]\n<\/code><\/pre>\n<p>\u0627\u06af\u0631 \u06c1\u0645 \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc \u0645\u062b\u0627\u0644 \u06a9\u0627 \u062a\u062c\u0632\u06cc\u06c1 \u06a9\u0631\u06cc\u06ba \u062a\u0648 \u0648\u06c1 \u0627\u0633 \u0637\u0631\u062d \u06c1\u06d2:<\/p>\n<pre><code class=\"language-bash\">flutter build apk --release --obfuscate\n\u2502       \u2502     \u2502   \u2502\ntool    sub   arg  flags\n<\/code><\/pre>\n<ul>\n<li>\n<p><strong>\u0633\u0627\u0645\u0627\u0646<\/strong> &#8211; \u067e\u0631\u0648\u06af\u0631\u0627\u0645 \u062e\u0648\u062f (<code>flutter<\/code>\u060c <code>dart<\/code>\u060c <code>git<\/code>)<\/p>\n<\/li>\n<li>\n<p><strong>\u0630\u06cc\u0644\u06cc \u06a9\u0645\u0627\u0646\u0688<\/strong> &#8211; \u062a\u0645 \u06a9\u06cc\u0627 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u0648 (<code>build<\/code>\u060c <code>run<\/code>\u060c <code>pub<\/code>)<\/p>\n<\/li>\n<li>\n<p><strong>\u0639\u0646\u0635\u0631<\/strong> &#8211; \u0648\u06c1 \u0627\u0639\u062a\u0631\u0627\u0636 \u062c\u0633 \u067e\u0631 \u0639\u0645\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 (<code>apk<\/code>\u060c <code>main.dart<\/code>\u0641\u0627\u0626\u0644 \u06a9\u0627 \u0646\u0627\u0645)<\/p>\n<\/li>\n<li>\n<p><strong>\u062c\u06be\u0646\u0688\u06d2 \u0627\u0648\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631\u0627\u062a<\/strong> &#8211; \u062a\u0631\u0645\u06cc\u0645 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u062c\u0648 \u0631\u0648\u06cc\u06d2 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u0627\u062e\u062a\u06cc\u0627\u0631\u0627\u062a \u06a9\u06cc \u062f\u0648 \u0642\u0633\u0645\u06cc\u06ba \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-plaintext\">--release              # Boolean flag \u2014 either present or absent\n\n--output=build\/app     # Key-value option \u2014 name and a value\n-v                     # Short flag \u2014 single hyphen, single character\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0648\u06c1 \u0688\u06be\u0627\u0646\u0686\u06c1 \u06c1\u06d2 \u062c\u0633 \u06a9\u06cc CLI \u06a9\u0648 \u067e\u06cc\u0631\u0648\u06cc \u06a9\u0631\u0646\u06cc \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u06a9\u0648\u0688 \u0644\u06a9\u06be\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0633 \u06a9\u0648 \u0633\u0645\u062c\u06be\u0646\u06d2 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u063a\u0644\u0637\u06cc \u0633\u06d2 \u0633\u0627\u062e\u062a \u06a9\u0648 \u067e\u06cc\u0686\u06cc\u062f\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u06c1\u062f\u0627\u06cc\u0627\u062a \u062a\u06cc\u0627\u0631 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-how-dart-receives-terminal-input\">\u0688\u0627\u0631\u0679 \u06a9\u0648 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0627\u0646 \u067e\u0679 \u06a9\u06cc\u0633\u06d2 \u0645\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/h2>\n<p>\u0688\u0627\u0631\u0679 \u0645\u06cc\u06ba\u060c \u0679\u0648\u0644 \u06a9\u06d2 \u0646\u0627\u0645 \u06a9\u06d2 \u0628\u0639\u062f \u0635\u0627\u0631\u0641 \u062c\u0648 \u06a9\u0686\u06be \u0628\u06be\u06cc \u0679\u0627\u0626\u067e \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0633 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u067e\u0631\u0648\u06af\u0631\u0627\u0645 \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2: <code>main<\/code> \u0641\u0646\u06a9\u0634\u0646:<\/p>\n<pre><code class=\"language-dart\">void main(List<string> args) {\n  print(args);\n}\n<\/string><\/code><\/pre>\n<p>\u0686\u0644\u0627\u0626\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\">dart run bin\/mytool.dart hello world --name=Seyi\n# [hello, world, --name=Seyi]\n<\/code><\/pre>\n<p>\u06a9\u06c1 <code>List<string> args<\/string><\/code> \u06cc\u06c1 \u0635\u0631\u0641 \u062a\u0627\u0631\u0648\u06ba \u06a9\u06cc \u0641\u06c1\u0631\u0633\u062a \u06c1\u06d2\u06d4 \u0635\u0627\u0631\u0641 \u06a9\u06cc \u0637\u0631\u0641 \u0633\u06d2 \u062f\u0631\u062c \u06a9\u0631\u062f\u06c1 \u06c1\u0631 \u0644\u0641\u0638 \u06cc\u0627 \u062c\u06be\u0646\u0688\u0627 \u0627\u0633 \u0641\u06c1\u0631\u0633\u062a \u06a9\u0627 \u0627\u06cc\u06a9 \u0639\u0646\u0635\u0631 \u0628\u0646 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0628\u0627\u0642\u06cc \u0633\u0628 \u06a9\u0686\u06be \u062c\u0648 \u0622\u067e CLI \u0630\u06cc\u0644\u06cc \u06a9\u0645\u0627\u0646\u0688\u0632\u060c \u062c\u06be\u0646\u0688\u0648\u06ba \u0627\u0648\u0631 \u062a\u0648\u062b\u06cc\u0642 \u06a9\u06d2 \u0627\u0648\u067e\u0631 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u0628\u0627\u0644\u0622\u062e\u0631 \u0627\u0633 \u0641\u06c1\u0631\u0633\u062a \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631\u06d2 \u06af\u06cc\u06d4<\/p>\n<h2 id=\"heading-core-cli-concepts-in-dart\">\u0688\u0627\u0631\u0679 \u06a9\u06d2 \u0628\u0646\u06cc\u0627\u062f\u06cc CLI \u062a\u0635\u0648\u0631\u0627\u062a<\/h2>\n<p>\u062a\u0635\u0648\u0631\u0627\u062a \u06a9\u0627 \u0627\u06cc\u06a9 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0645\u062c\u0645\u0648\u0639\u06c1 \u06c1\u06d2 \u062c\u0633\u06d2 \u06c1\u0631 CLI \u0688\u0648\u06cc\u0644\u067e\u0631 \u06a9\u0648 \u06a9\u0686\u06be \u0628\u06be\u06cc \u0628\u0646\u0627\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0633\u0645\u062c\u06be\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u06cc\u06c1 \u0639\u0645\u0627\u0631\u062a \u06a9\u06d2 \u0628\u0644\u0627\u06a9\u0633 \u06c1\u06cc\u06ba \u062c\u0646 \u067e\u0631 \u0628\u0627\u0642\u06cc \u0633\u0628 \u06a9\u0686\u06be \u0679\u06a9\u06cc \u06c1\u0648\u0626\u06cc \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-stdout-stderr-and-stdin\">stdout\u060c stderr\u060c \u0627\u0648\u0631 stdin<\/h3>\n<p>\u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0688\u0648\u06cc\u0644\u067e\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>print()<\/code> CLI \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a \u062a\u0645\u0627\u0645 \u0622\u0624\u0679 \u067e\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2\u06d4 \u06cc\u06c1 \u062a\u0631\u0628\u06cc\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u0645\u06cc\u06ba \u063a\u0644\u0637 \u06c1\u06d2\u06d4<\/p>\n<p>\u0679\u0631\u0645\u06cc\u0646\u0644 \u067e\u0631\u0648\u06af\u0631\u0627\u0645 \u0645\u06cc\u06ba \u062f\u0648 \u0627\u0644\u06af \u0622\u0624\u0679 \u067e\u0679 \u0627\u0633\u0679\u0631\u06cc\u0645\u0632 \u06c1\u06cc\u06ba:<\/p>\n<ul>\n<li>\n<p><code>stdout<\/code>    &#8211; \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0639\u0645\u0648\u0645\u06cc \u067e\u06cc\u062f\u0627\u0648\u0627\u0631<\/p>\n<\/li>\n<li>\n<p><code>stderr<\/code>    &#8211; \u062a\u0634\u062e\u06cc\u0635\u06cc \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u0627\u0648\u0631 \u062e\u0631\u0627\u0628\u06cc \u06a9\u06cc \u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u06cc \u0646\u0634\u0627\u0646\u062f\u06c1\u06cc \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"language-dart\">import 'dart:io';\n\nvoid main(List<string> args) {\n  if (args.isEmpty) {\n    stderr.writeln('Error: no arguments provided');\n    exit(1);\n  }\n\n  stdout.writeln('Processing: ${args[0]}');\n}\n<\/string><\/code><\/pre>\n<p>\u0627\u0646 \u06a9\u0648 \u0627\u0644\u06af \u0631\u06a9\u06be\u06cc\u06ba \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0635\u0627\u0631\u0641 \u0641\u0627\u0626\u0644 \u06a9\u0648 \u0622\u0644\u0648\u062f\u06c1 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06cc \u063a\u0644\u0637\u06cc\u0648\u06ba \u06a9\u06d2 \u0628\u063a\u06cc\u0631 stdout \u06a9\u0648 \u0641\u0627\u0626\u0644 \u0645\u06cc\u06ba \u0628\u06be\u06cc\u062c \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">dart run bin\/tool.dart > output.txt\n# Errors still appear in the terminal\n# Normal output goes cleanly to the file\n<\/code><\/pre>\n<p>\u0627\u0648\u0632\u0627\u0631 \u062c\u06cc\u0633\u06d2 <code>git<\/code>\u060c <code>flutter<\/code>\u0627\u0648\u0631 <code>curl<\/code> \u0633\u0628 \u06a9\u0686\u06be \u0679\u06be\u06cc\u06a9 \u06a9\u0631\u0648\u06d4 \u0622\u067e \u06a9\u06d2 CLI \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06be\u06cc \u06cc\u06c1\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><code>stdin<\/code>    \u06cc\u06c1 \u062a\u06cc\u0633\u0631\u0627 \u0633\u0644\u0633\u0644\u06c1 \u06c1\u06d2\u06d4 \u0631\u0646 \u0679\u0627\u0626\u0645 \u067e\u0631 \u0627\u0646\u0679\u0631\u0627\u06cc\u06a9\u0679\u0648 \u0637\u0648\u0631 \u067e\u0631 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0627\u0646 \u067e\u0679 \u06a9\u0648 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-dart\">import 'dart:io';\n\nvoid main() {\n  stdout.write('Enter your name: ');\n  final name = stdin.readLineSync();\n\n  if (name == null || name.trim().isEmpty) {\n    stderr.writeln('Error: no name provided');\n    exit(1);\n  }\n\n  stdout.writeln('Hello, $name!');\n}\n<\/code><\/pre>\n<p><code>stdout.write<\/code>    (\u0628\u063a\u06cc\u0631 <code>ln<\/code>) \u06a9\u0631\u0633\u0631 \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u0644\u0627\u0626\u0646 \u067e\u0631 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u060c \u0635\u0627\u0631\u0641 \u06a9\u0648 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u067e\u0631\u0627\u0645\u067e\u0679 \u06a9\u06d2 \u0628\u0639\u062f \u0679\u0627\u0626\u067e \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 <code>stdin.readLineSync()<\/code> \u06cc\u06c1 \u0627\u0633 \u0648\u0642\u062a \u062a\u06a9 \u0628\u0644\u0627\u06a9 \u06c1\u0648\u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u062a\u06a9 \u06a9\u06c1 \u0635\u0627\u0631\u0641 Enter \u06a9\u0648 \u062f\u0628\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062f\u0627\u062e\u0644 \u06a9\u0631\u062f\u06c1 \u0627\u0633\u0679\u0631\u0646\u06af \u06a9\u0648 \u0648\u0627\u067e\u0633 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>null<\/code> \u062c\u0628 \u06a9\u0648\u0626\u06cc \u0633\u0644\u0633\u0644\u06c1 \u063a\u06cc\u0631 \u0645\u062a\u0648\u0642\u0639 \u0637\u0648\u0631 \u067e\u0631 \u0628\u0646\u062f \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06c1\u0645\u06cc\u0634\u06c1 \u06a9\u0627\u0644\u0639\u062f\u0645 \u06a9\u06cc\u0633\u0632 \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-exit-codes\">\u0628\u0627\u06c1\u0631 \u0646\u06a9\u0644\u0646\u06d2 \u06a9\u0627 \u06a9\u0648\u0688<\/h3>\n<p>\u062a\u0645\u0627\u0645 \u067e\u0631\u0648\u06af\u0631\u0627\u0645 \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u0627\u06cc\u06af\u0632\u0679 \u06a9\u0648\u0688 \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u0637\u0631\u062d \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0627\u0633\u06a9\u0631\u067e\u0679 \u06cc\u0627 \u0633\u06cc \u0622\u0626\u06cc \u0633\u0633\u0679\u0645 \u062c\u0648 \u0634\u06cc\u0644\u0632 \u0627\u0648\u0631 \u0679\u0648\u0644\u0632 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0627\u0646\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0622\u06cc\u0627 \u06cc\u06c1 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u06c1\u0648\u0627 \u06cc\u0627 \u0646\u0627\u06a9\u0627\u0645\u06d4<\/p>\n<pre><code class=\"language-dart\">import 'dart:io';\n\nvoid main(List<string> args) {\n  if (args.isEmpty) {\n    stderr.writeln('Error: please provide an argument');\n    exit(1); \/\/ failure\n  }\n\n  stdout.writeln('Done');\n  exit(0); \/\/ success \u2014 also the default if you don't call exit()\n}\n<\/string><\/code><\/pre>\n<p>\u0642\u0648\u0627\u0639\u062f \u062f\u0631\u062c \u0630\u06cc\u0644 \u06c1\u06cc\u06ba:<\/p>\n<p>\u0627\u06cc\u06af\u0632\u0679 \u06a9\u0648\u0688 \u0627\u06c1\u0645 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062c\u0628 CLI \u06a9\u0648 \u0634\u06cc\u0644 \u0627\u0633\u06a9\u0631\u067e\u0679 \u06cc\u0627 GitHub \u0627\u06cc\u06a9\u0634\u0646 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0633\u06d2 \u0628\u0644\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u063a\u06cc\u0631 \u0635\u0641\u0631 \u0627\u06cc\u06af\u0632\u0679 \u06a9\u0648\u0688 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u06a9\u0648 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0631\u0648\u06a9 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0628\u0627\u0644\u06a9\u0644 \u0648\u06c1\u06cc \u0637\u0631\u0632 \u0639\u0645\u0644 \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u0627\u067e\u0646\u06d2 \u06a9\u0648\u0627\u0644\u0679\u06cc \u06af\u06cc\u0679 \u06cc\u0627 \u062a\u0635\u062f\u06cc\u0642\u06cc \u0645\u0631\u062d\u0644\u06d2 \u0645\u06cc\u06ba \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-environment-variables\">\u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0645\u062a\u063a\u06cc\u0631\u0627\u062a<\/h3>\n<p>CLI \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0634\u06cc\u0644 \u0645\u06cc\u06ba \u0633\u06cc\u0679 \u06a9\u0631\u062f\u06c1 \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0645\u062a\u063a\u06cc\u0631\u0627\u062a \u06a9\u0648 \u067e\u0691\u06be \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-dart\">import 'dart:io';\n\nvoid main() {\n  final token = Platform.environment['API_TOKEN'];\n\n  if (token == null) {\n    stderr.writeln('Error: API_TOKEN environment variable is not set');\n    exit(1);\n  }\n\n  stdout.writeln('Token found \u2014 proceeding...');\n}\n<\/code><\/pre>\n<p>\u0627\u0633\u06d2 \u0627\u067e\u0646\u06d2 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0645\u06cc\u06ba \u0633\u06cc\u0679 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0686\u0644\u0627\u0626\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\">export API_TOKEN=mytoken123\ndart run bin\/tool.dart\n# Token found \u2014 proceeding...\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u067e\u06cc\u0679\u0631\u0646 CLI \u0679\u0648\u0644\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2 \u062c\u0648 APIs\u060c \u06a9\u0644\u0627\u0624\u0688 \u0633\u0631\u0648\u0633\u0632\u060c \u06cc\u0627 CI \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u0639\u0627\u0645\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u06c1\u0627\u06ba \u0627\u0633\u0646\u0627\u062f \u06a9\u0648 \u06c1\u0627\u0631\u0688 \u06a9\u0648\u0688 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<h3 id=\"heading-file-and-directory-operations\">\u0641\u0627\u0626\u0644 \u0627\u0648\u0631 \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679\u0631\u06cc \u0622\u067e\u0631\u06cc\u0634\u0646\u0632<\/h3>\n<p>\u0628\u06c1\u062a \u0633\u06d2 CLI \u0679\u0648\u0644\u0632 \u0641\u0627\u0626\u0644 \u0633\u0633\u0679\u0645 \u0633\u06d2 \u067e\u0691\u06be\u062a\u06d2 \u06cc\u0627 \u0644\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0688\u0627\u0631\u0679 <code>dart:io<\/code> \u0644\u0627\u0626\u0628\u0631\u06cc\u0631\u06cc \u0622\u067e \u06a9\u0648 \u062f\u0631\u06a9\u0627\u0631 \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0627 \u0627\u062d\u0627\u0637\u06c1 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-dart\">import 'dart:io';\n\nvoid main(List<string> args) {\n  if (args.isEmpty) {\n    stderr.writeln('Usage: tool <filename>');\n    exit(2);\n  }\n\n  final file = File(args[0]);\n\n  if (!file.existsSync()) {\n    stderr.writeln('Error: \"${args[0]}\" not found');\n    exit(1);\n  }\n\n  final contents = file.readAsStringSync();\n  stdout.writeln(contents);\n\n  final output = File('output.txt');\n  output.writeAsStringSync('Processed:\\n$contents');\n  stdout.writeln('Written to output.txt');\n}\n<\/filename><\/string><\/code><\/pre>\n<p>\u0688\u0627\u0626\u0631\u06cc\u06a9\u0679\u0631\u06cc \u0622\u067e\u0631\u06cc\u0634\u0646\u0632:<\/p>\n<pre><code class=\"language-dart\">import 'dart:io';\n\nvoid main() {\n  \/\/ Where the command was run from\n  final cwd = Directory.current.path;\n  stdout.writeln('Working directory: $cwd');\n\n  \/\/ Create a directory relative to current location\n  final dir = Directory('$cwd\/generated');\n\n  if (!dir.existsSync()) {\n    dir.createSync(recursive: true);\n    stdout.writeln('Created: ${dir.path}');\n  } else {\n    stdout.writeln('Already exists: ${dir.path}');\n  }\n}\n<\/code><\/pre>\n<p>\u06a9\u06c1 <code>recursive: true<\/code> \u0627\u06cc\u06a9 \u062c\u06be\u0646\u0688\u0627 \u0644\u06af\u0627\u0626\u06cc\u06ba <code>createSync<\/code> \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u062a\u0645\u0627\u0645 \u0627\u0646\u0679\u0631\u0645\u06cc\u0688\u06cc\u0679 \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679\u0631\u06cc\u0632 \u0628\u0646\u0627\u0646\u0627\u06d4 <code>mkdir -p<\/code> \u0628\u0627\u0634 \u0645\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-running-external-processes\">\u0628\u06cc\u0631\u0648\u0646\u06cc \u0639\u0645\u0644 \u06a9\u0648 \u0627\u0646\u062c\u0627\u0645 \u062f\u06cc\u06ba\u06d4<\/h3>\n<p>\u0633\u0628 \u0633\u06d2 \u0637\u0627\u0642\u062a\u0648\u0631 \u0686\u06cc\u0632\u0648\u06ba \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u062c\u0648 CLI \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u062f\u0648\u0633\u0631\u06d2 \u067e\u0631\u0648\u06af\u0631\u0627\u0645\u0648\u06ba \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4 \u0622\u067e \u0688\u0627\u0631\u0679 \u0633\u06cc \u0627\u06cc\u0644 \u0622\u0626\u06cc \u0686\u0644\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>git<\/code>\u060c <code>flutter<\/code>\u060c <code>dart<\/code>\u06cc\u0627 \u067e\u0631\u0648\u06af\u0631\u0627\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0648\u0626\u06cc \u0634\u06cc\u0644 \u06a9\u0645\u0627\u0646\u0688:<\/p>\n<pre><code class=\"language-dart\">import 'dart:io';\n\nvoid main() async {\n  \/\/ Run a command and wait for it to finish\n  final result = await Process.run('dart', ['pub', 'get']);\n\n  stdout.write(result.stdout);\n\n  if (result.exitCode != 0) {\n    stderr.write(result.stderr);\n    exit(result.exitCode);\n  }\n\n  stdout.writeln('Dependencies installed successfully');\n}\n<\/code><\/pre>\n<p>\u0637\u0648\u06cc\u0644 \u0639\u0631\u0635\u06d2 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06cc \u06a9\u0645\u0627\u0646\u0688\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062c\u06c1\u0627\u06ba \u0622\u067e \u062d\u0642\u06cc\u0642\u06cc \u0648\u0642\u062a \u0645\u06cc\u06ba \u0622\u0624\u0679 \u067e\u0679 \u06a9\u0648 \u0627\u0633\u0679\u0631\u06cc\u0645 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-dart\">import 'dart:io';\n\nvoid main() async {\n  final process = await Process.start('flutter', ['build', 'apk']);\n\n  \/\/ Pipe output directly to the terminal in real time\n  process.stdout.pipe(stdout);\n  process.stderr.pipe(stderr);\n\n  final exitCode = await process.exitCode;\n  exit(exitCode);\n}\n<\/code><\/pre>\n<p><code>Process.run<\/code>    &#8211; \u062a\u06a9\u0645\u06cc\u0644 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u062a\u0645\u0627\u0645 \u0622\u0624\u0679 \u067e\u0679 \u0648\u0627\u067e\u0633 \u06a9\u0631\u06cc\u06ba\u06d4 \u0645\u062e\u062a\u0635\u0631 \u0627\u062d\u06a9\u0627\u0645\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p><code>Process.start<\/code>    &#8211; \u0622\u067e \u06a9\u06d2 \u0622\u0624\u0679 \u067e\u0679 \u06a9\u0648 \u0622\u062a\u06d2 \u06c1\u06cc \u0644\u0627\u0626\u06cc\u0648 \u0646\u0634\u0631 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u0637\u0648\u06cc\u0644 \u0639\u0631\u0635\u06d2 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06cc \u06a9\u0645\u0627\u0646\u0688\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u062c\u06c1\u0627\u06ba \u0635\u0627\u0631\u0641 \u06a9\u0648 \u067e\u06cc\u0634 \u0631\u0641\u062a \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-platform-detection\">\u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u0646\u0627<\/h3>\n<p>CLI \u06a9\u0648 \u0645\u062e\u062a\u0644\u0641 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0628\u0631\u062a\u0627\u0624 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648 \u0633\u06a9\u062a\u06cc \u06c1\u06d2 \u0627\u0633 \u067e\u0631 \u0645\u0646\u062d\u0635\u0631 \u06c1\u06d2 \u06a9\u06c1 \u0648\u06c1 \u062c\u0633 \u0622\u067e\u0631\u06cc\u0679\u0646\u06af \u0633\u0633\u0679\u0645 \u067e\u0631 \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-dart\">import 'dart:io';\n\nvoid main() {\n  if (Platform.isWindows) {\n    stdout.writeln('Running on Windows');\n  } else if (Platform.isMacOS) {\n    stdout.writeln('Running on macOS');\n  } else if (Platform.isLinux) {\n    stdout.writeln('Running on Linux');\n  }\n\n  \/\/ Useful for path handling across operating systems\n  stdout.writeln(Platform.pathSeparator); \/\/ \\ on Windows, \/ elsewhere\n  stdout.writeln(Platform.operatingSystem); \/\/ 'macos', 'linux', 'windows'\n}\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0627\u06c1\u0645 \u06c1\u06d2 \u062c\u0628 CLI \u0641\u0627\u0626\u0644\u06cc\u06ba \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0631\u0627\u0633\u062a\u06d2 \u062d\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u06cc\u0627 \u0634\u06cc\u0644 \u06a9\u0645\u0627\u0646\u0688\u0632 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0622\u067e\u0631\u06cc\u0679\u0646\u06af \u0633\u0633\u0679\u0645 \u0633\u06d2 \u0622\u067e\u0631\u06cc\u0679\u0646\u06af \u0633\u0633\u0679\u0645 \u062a\u06a9 \u0645\u062e\u062a\u0644\u0641 \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-async-in-cli\">CLI \u0645\u06cc\u06ba \u063a\u06cc\u0631 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631<\/h3>\n<p>\u0688\u0627\u0631\u0679 \u0633\u06cc \u0627\u06cc\u0644 \u0622\u0626\u06cc \u0633\u067e\u0648\u0631\u0679 <code>async\/await<\/code> \u0628\u0646\u06cc\u0627\u062f\u06cc \u0637\u0648\u0631 \u067e\u0631\u06d4 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc <code>main<\/code> \u0622\u067e \u0641\u0646\u06a9\u0634\u0646\u0632 \u06a9\u0648 \u063a\u06cc\u0631 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631 \u0628\u0646\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-dart\">import 'dart:io';\n\nvoid main() async {\n  stdout.writeln('Starting...');\n\n  await Future.delayed(const Duration(seconds: 1)); \/\/ simulating async work\n\n  stdout.writeln('Done');\n}\n<\/code><\/pre>\n<p>\u0641\u0627\u0626\u0644 I\/O\u060c HTTP \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba\u060c \u06cc\u0627 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u06d2 \u0639\u0645\u0644 \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u062a\u0645\u0627\u0645 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u063a\u06cc\u0631 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631 \u06c1\u06cc\u06ba\u06d4 \u063a\u06cc\u0631 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631 \u0633\u06d2 \u0648\u0627\u0642\u0641 \u06c1\u0648\u0646\u0627 <code>main<\/code> \u0627\u0628\u062a\u062f\u0627\u0626\u06cc \u062e\u0635\u0648\u0635\u06cc\u0627\u062a\u2014\u0622\u067e \u0627\u0646 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<h2 id=\"heading-setting-up-your-dart-cli-project\">\u0688\u0627\u0631\u0679 \u0633\u06cc \u0627\u06cc\u0644 \u0622\u0626\u06cc \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0633\u06cc\u0679 \u0627\u067e<\/h2>\n<p>\u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u0688\u0627\u0631\u0679 \u06a9\u0646\u0633\u0648\u0644 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">dart create -t console my_cli_tool\ncd my_cli_tool\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0627\u06cc\u06a9 \u0635\u0627\u0641 \u0688\u06be\u0627\u0646\u0686\u06c1 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-plaintext\">my_cli_tool\/\n  bin\/\n    my_cli_tool.dart    \u2190 entry point\n  lib\/                  \u2190 shared library code\n  test\/                 \u2190 tests\n  pubspec.yaml\n  README.md\n<\/code><\/pre>\n<p>\u06a9\u06c1 <code>bin\/<\/code> \u0627\u06cc\u06a9 \u0688\u0627\u0626\u0631\u06a9\u0679\u0631\u06cc \u0648\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u0642\u0627\u0628\u0644 \u0639\u0645\u0644 \u0627\u0646\u0679\u0631\u06cc \u067e\u0648\u0627\u0626\u0646\u0679 \u0648\u0627\u0642\u0639 \u06c1\u06d2\u06d4 \u06a9\u06c1 <code>lib\/<\/code> \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679\u0631\u06cc \u0648\u06c1 \u062c\u06af\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u0622\u067e \u0633\u0628 \u06a9\u0686\u06be \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba: \u06a9\u0645\u0627\u0646\u0688\u0632\u060c \u06cc\u0648\u0679\u06cc\u0644\u06cc\u0679\u06cc\u0632\u060c \u0645\u0627\u0688\u0644\u0632 \u0648\u063a\u06cc\u0631\u06c1\u06d4 <code>bin\/<\/code> \u06c1\u0645 \u0627\u0633\u06d2 \u062f\u0631\u0622\u0645\u062f \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06a9\u06be\u0644\u0627 <code>pubspec.yaml<\/code>. \u0622\u067e \u06a9\u0648 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2: <code>executables<\/code> \u067e\u0648\u0633\u0679 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0628\u0644\u0627\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-yaml\">name: my_cli_tool\ndescription: A sample CLI tool built with Dart\nversion: 1.0.0\n\nenvironment:\n  sdk: '>=3.0.0 <4.0.0'\n\nexecutables:\n  my_cli_tool: my_cli_tool  # executable name: bin file name\n\ndependencies:\n  args: ^2.4.2\n\ndev_dependencies:\n  lints: ^3.0.0\n  test: ^1.24.0\n<\/code><\/pre>\n<p>\u06a9\u06c1 <code>executables<\/code> \u0628\u0644\u0627\u06a9\u0633 \u0628\u0646\u0627\u0626\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba <code>dart pub global activate my_cli_tool<\/code> \u06a9\u0627\u0645 \u06cc\u06c1 \u0688\u0627\u0631\u0679 \u06a9\u0648 \u0628\u062a\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0648\u0646 \u0633\u06cc \u0627\u0633\u06a9\u0631\u067e\u0679 \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba\u06d4 <code>bin\/<\/code> \u062a\u0646\u0635\u06cc\u0628 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u06cc\u06c1 \u0627\u06cc\u06a9 \u0642\u0627\u0628\u0644 \u0639\u0645\u0644 \u06a9\u0645\u0627\u0646\u0688 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0633\u0627\u0645\u0646\u06d2 \u0622\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-cli-1-hello-cli-the-fundamentals\">CLI 1 - \u06c1\u06cc\u0644\u0648 CLI: \u0628\u0646\u06cc\u0627\u062f\u06cc \u0628\u0627\u062a\u06cc\u06ba<\/h2>\n<p>\u06cc\u06c1 \u067e\u06c1\u0644\u0627 CLI \u0628\u063a\u06cc\u0631 \u06a9\u0633\u06cc \u067e\u06cc\u06a9\u062c \u06a9\u06d2 \u062e\u0627\u0644\u0635 \u0688\u0627\u0631\u0679 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0645\u0642\u0635\u062f \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0628\u06cc\u0631\u0648\u0646\u06cc \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0648 \u0645\u062a\u0639\u0627\u0631\u0641 \u06a9\u0631\u0627\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u062f\u0644\u0627\u0626\u0644\u060c \u0630\u06cc\u0644\u06cc \u06a9\u0645\u0627\u0646\u0688\u060c \u0627\u0646 \u067e\u0679 \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642\u060c \u0627\u0648\u0631 \u0627\u06cc\u06af\u0632\u0679 \u06a9\u0648\u0688\u0632 \u0633\u06d2 \u0648\u0627\u0642\u0641 \u06c1\u0648 \u062c\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<p>\u062f\u0631\u062c \u0630\u06cc\u0644 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba: <code>bin\/my_cli_tool.dart<\/code>:<\/p>\n<pre><code class=\"language-dart\">import 'dart:io';\n\nvoid main(List<string> args) {\n  if (args.isEmpty) {\n    printHelp();\n    exit(0);\n  }\n\n  final command = args[0];\n\n  switch (command) {\n    case 'greet':\n      handleGreet(args.sublist(1));\n    case 'time':\n      handleTime();\n    case 'echo':\n      handleEcho(args.sublist(1));\n    case 'help':\n      printHelp();\n    default:\n      stderr.writeln('Unknown command: \"$command\"');\n      stderr.writeln('Run \"mytool help\" to see available commands.');\n      exit(1);\n  }\n}\n\nvoid handleGreet(List<string> args) {\n  if (args.isEmpty) {\n    stderr.writeln('Usage: mytool greet <name>');\n    exit(2);\n  }\n\n  final name = args[0];\n  stdout.writeln('Hello, $name! Welcome to your first Dart CLI.');\n}\n\nvoid handleTime() {\n  final now = DateTime.now();\n  stdout.writeln(\n    'Current time: ${now.hour.toString().padLeft(2, '0')}:'\n    '${now.minute.toString().padLeft(2, '0')}:'\n    '${now.second.toString().padLeft(2, '0')}',\n  );\n}\n\nvoid handleEcho(List<string> args) {\n  if (args.isEmpty) {\n    stderr.writeln('Usage: mytool echo <message>');\n    exit(2);\n  }\n\n  stdout.writeln(args.join(' '));\n}\n\nvoid printHelp() {\n  stdout.writeln('''\nmytool \u2014 a simple Dart CLI\n\nUsage:\n  mytool <command> [arguments]\n\nCommands:\n  greet <name>      Greet someone by name\n  time              Show the current time\n  echo <message>    Echo a message back to the terminal\n  help              Show this help message\n\nExamples:\n  mytool greet Seyi\n  mytool echo \"Hello from the terminal\"\n  mytool time\n  ''');\n}\n<\/message><\/name><\/command><\/message><\/string><\/name><\/string><\/string><\/code><\/pre>\n<p>\u0686\u0644\u0627\u0626\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\">dart run bin\/my_cli_tool.dart help\n\ndart run bin\/my_cli_tool.dart greet Seyi\n# Hello, Seyi! Welcome to your first Dart CLI.\n\ndart run bin\/my_cli_tool.dart time\n# Current time: 14:32:10\n\ndart run bin\/my_cli_tool.dart echo \"Dart CLIs are powerful\"\n# Dart CLIs are powerful\n\ndart run bin\/my_cli_tool.dart unknown\n# Unknown command: \"unknown\"\n# Run \"mytool help\" to see available commands.\n<\/code><\/pre>\n<p>\u06cc\u06c1 CLI \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u062a\u06cc\u0646 \u0686\u06cc\u0632\u06cc\u06ba \u06c1\u06cc\u06ba \u062c\u0648 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u06cc\u06ba\u06d4<\/p>\n<ol>\n<li>\n<p><strong>\u0627\u06cc\u06a9 \u0630\u06cc\u0644\u06cc \u06a9\u0645\u0627\u0646\u0688 \u0622\u0633\u0627\u0646\u06cc \u0633\u06d2 \u0627\u06cc\u06a9 \u0633\u0648\u0626\u0686 \u0622\u0646 \u06a9\u0631 \u062f\u06cc\u062a\u06cc \u06c1\u06d2\u06d4<\/strong> <code>args[0]<\/code><strong>.<\/strong> \u067e\u06cc\u0679\u0631\u0646 \u0633\u0627\u062f\u06c1 \u0627\u0648\u0631 \u0642\u0627\u0628\u0644 \u062a\u0648\u0633\u06cc\u0639 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u067e\u06cc\u0679\u0631\u0646 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>case<\/code> \u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u06a9\u0645\u0627\u0646\u0688 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2<\/p>\n<\/li>\n<li>\n<p><code>args.sublist(1)<\/code> <strong>\u0628\u0642\u06cc\u06c1 \u062f\u0644\u0627\u0626\u0644 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u06a9\u0648 \u062f\u06cc\u06ba\u06d4<\/strong> \u062c\u0628 <code>greet<\/code> \u0627\u0633\u062a\u0642\u0628\u0627\u0644\u06cc\u06c1 <code>['greet', 'Seyi']<\/code>\u06cc\u06c1 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 <code>handleGreet(['Seyi'])<\/code> - \u0635\u0627\u0641 \u0627\u0648\u0631 \u0627\u0644\u06af \u062a\u06be\u0644\u06af\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u06c1\u0631 \u0627\u06cc\u0631\u0631 \u067e\u0627\u062a\u06be \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u067e\u06cc\u063a\u0627\u0645 \u0627\u0648\u0631 \u063a\u06cc\u0631 \u0635\u0641\u0631 \u0627\u06cc\u06af\u0632\u0679 \u06a9\u0648\u0688 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/strong> \u0635\u0627\u0631\u0641\u06cc\u0646 \u06c1\u0645\u06cc\u0634\u06c1 \u062c\u0627\u0646\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u06a9\u06cc\u0627 \u063a\u0644\u0637 \u06c1\u0648\u0627 \u0627\u0648\u0631 \u0622\u06af\u06d2 \u06a9\u06cc\u0627 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ol>\n<h2 id=\"heading-cli-2-darttodo-a-terminal-task-manager\">CLI 2 \u2014 \u0688\u0627\u0631\u0679_\u0679\u0648\u0688\u0648: \u0679\u0631\u0645\u06cc\u0646\u0644 \u0679\u0627\u0633\u06a9 \u0645\u06cc\u0646\u06cc\u062c\u0631<\/h2>\n<p>\u06cc\u06c1 CLI \u06c1\u06d2\u06d4 <code>args<\/code> \u067e\u06cc\u06a9\u06cc\u062c\u0632\u060c JSON \u0641\u0627\u0626\u0644 \u0627\u0633\u062a\u0642\u0627\u0645\u062a\u060c \u0627\u0648\u0631 \u0633\u0627\u062e\u062a\u06cc \u0679\u0631\u0645\u06cc\u0646\u0644 \u0622\u0624\u0679 \u067e\u0679\u06d4 \u06cc\u06c1 CLI 1 \u0633\u06d2 \u06a9\u06c1\u06cc\u06ba \u0632\u06cc\u0627\u062f\u06c1 \u067e\u06cc\u0686\u06cc\u062f\u06c1 \u06c1\u06d2 \u0627\u0648\u0631 \u062d\u0642\u06cc\u0642\u06cc \u062f\u0646\u06cc\u0627 \u06a9\u06d2 \u0646\u0645\u0648\u0646\u0648\u06ba \u06a9\u06cc \u0639\u06a9\u0627\u0633\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0633\u06d2 \u0622\u067e \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u0679\u0648\u0644\u0632 \u0645\u06cc\u06ba \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<h3 id=\"heading-introducing-the-args-package\">\u0622\u0631\u06af\u0633 \u067e\u06cc\u06a9\u062c \u06a9\u0627 \u062a\u0639\u0627\u0631\u0641<\/h3>\n<p>\u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062a\u062c\u0632\u06cc\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4 <code>List<string> args<\/string><\/code> \u06cc\u06c1 \u0633\u0627\u062f\u06c1 \u0645\u0639\u0627\u0645\u0644\u0627\u062a \u0645\u06cc\u06ba \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u062c\u0628 \u0622\u067e \u0627\u0633 \u0637\u0631\u062d \u06a9\u06d2 \u062c\u06be\u0646\u0688\u06d2 \u0634\u0627\u0645\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u062a\u06cc\u0632\u06cc \u0633\u06d2 \u0679\u0648\u0679 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>--priority=high<\/code>\u0628\u0648\u0644\u06cc\u0646 \u0627\u062e\u062a\u06cc\u0627\u0631\u0627\u062a \u062c\u06cc\u0633\u06d2 <code>--done<\/code>\u06cc\u0627 \u0627\u06cc\u06a9 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc \u062f\u0644\u0627\u0626\u0644 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u06a9\u0645\u0627\u0646\u0688\u06d4<\/p>\n<p>\u06a9\u06c1 <code>args<\/code> \u067e\u06cc\u06a9\u06cc\u062c \u0627\u0646 \u0633\u0628 \u06a9\u0648 \u0635\u0627\u0641 \u0633\u062a\u06be\u0631\u0627 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u067e \u06a9\u0627 <code>pubspec.yaml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">dependencies:\n  args: ^2.4.2\n<\/code><\/pre>\n<p>\u0686\u0644\u0627\u0626\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\">dart pub get\n<\/code><\/pre>\n<p>\u06a9\u0627 \u0628\u0646\u06cc\u0627\u062f\u06cc \u062a\u0635\u0648\u0631 <code>args<\/code> \u0686\u0627\u0646\u062f\u06cc <code>ArgParser<\/code>. \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 CLI \u06a9\u06cc\u0627 \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 <code>args<\/code> \u062e\u0648\u062f\u06a9\u0627\u0631 \u0637\u0648\u0631 \u067e\u0631 \u062a\u062c\u0632\u06cc\u06c1\u060c \u062a\u0648\u062b\u06cc\u0642\u060c \u0627\u0648\u0631 \u0679\u06cc\u06a9\u0633\u0679 \u062c\u0646\u0631\u06cc\u0634\u0646 \u0645\u06cc\u06ba \u0645\u062f\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-dart\">import 'package:args\/args.dart';\n\nvoid main(List<string> arguments) {\n  final parser = ArgParser()\n    ..addCommand('add')\n    ..addCommand('list')\n    ..addFlag('help', abbr: 'h', negatable: false);\n\n  final results = parser.parse(arguments);\n\n  if (results['help'] as bool) {\n    print(parser.usage);\n    return;\n  }\n}\n<\/string><\/code><\/pre>\n<p>\u0630\u06cc\u0644\u06cc \u06a9\u0645\u0627\u0646\u0688 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0632\u06cc\u0627\u062f\u06c1 \u067e\u06cc\u0686\u06cc\u062f\u06c1 CLI \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u0631 \u0627\u06cc\u06a9 \u0627\u067e\u0646\u06d2 \u0627\u067e\u0646\u06d2 \u062c\u06be\u0646\u0688\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be\u060c \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba: <code>ArgParser<\/code> \u0641\u06cc \u062d\u06a9\u0645:<\/p>\n<pre><code class=\"language-dart\">final parser = ArgParser();\n\nfinal addCommand = ArgParser()\n  ..addOption('priority', abbr: 'p', defaultsTo: 'normal');\n\nparser.addCommand('add', addCommand);\n<\/code><\/pre>\n<h3 id=\"heading-building-darttodo\">\u0688\u0627\u0631\u0679_\u0679\u0648\u0688\u0648 \u0628\u0644\u0688<\/h3>\n<p>\u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0628\u0646\u0627\u0626\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\">dart create -t console dart_todo\ncd dart_todo\n<\/code><\/pre>\n<p>\u0627\u067e \u0688\u06cc\u0679 <code>pubspec.yaml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">name: dart_todo\ndescription: A terminal task manager built with Dart\nversion: 1.0.0\n\nenvironment:\n  sdk: '>=3.0.0 <4.0.0'\n\nexecutables:\n  dart_todo: dart_todo\n\ndependencies:\n  args: ^2.4.2\n\ndev_dependencies:\n  lints: ^3.0.0\n  test: ^1.24.0\n<\/code><\/pre>\n<p>\u0686\u0644\u0627\u0626\u06cc\u06ba <code>dart pub get<\/code>.<\/p>\n<p>\u0641\u0648\u0644\u0688\u0631 \u06a9\u0627 \u0688\u06be\u0627\u0646\u0686\u06c1 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-plaintext\">dart_todo\/\n  bin\/\n    dart_todo.dart\n  lib\/\n    models\/\n      task.dart\n    storage\/\n      task_storage.dart\n    commands\/\n      add_command.dart\n      list_command.dart\n      complete_command.dart\n      delete_command.dart\n      clear_command.dart\n  pubspec.yaml\n<\/code><\/pre>\n<h4 id=\"heading-step-1-the-task-model-libmodelstaskdart\">\u0645\u0631\u062d\u0644\u06c1 1 - \u0648\u0631\u06a9\u0646\u06af \u0645\u0627\u0688\u0644 (<code>lib\/models\/task.dart<\/code>)<\/h4>\n<pre><code class=\"language-dart\">class Task {\n  final int id;\n  final String title;\n  final String priority;\n  final bool isComplete;\n  final DateTime createdAt;\n\n  Task({\n    required this.id,\n    required this.title,\n    required this.priority,\n    this.isComplete = false,\n    required this.createdAt,\n  });\n\n  Task copyWith({bool? isComplete}) {\n    return Task(\n      id: id,\n      title: title,\n      priority: priority,\n      isComplete: isComplete ?? this.isComplete,\n      createdAt: createdAt,\n    );\n  }\n\n  Map<string dynamic=\"\"> toJson() => {\n        'id': id,\n        'title': title,\n        'priority': priority,\n        'isComplete': isComplete,\n        'createdAt': createdAt.toIso8601String(),\n      };\n\n  factory Task.fromJson(Map<string dynamic=\"\"> json) => Task(\n        id: json['id'] as int,\n        title: json['title'] as String,\n        priority: json['priority'] as String,\n        isComplete: json['isComplete'] as bool,\n        createdAt: DateTime.parse(json['createdAt'] as String),\n      );\n}\n<\/string><\/string><\/code><\/pre>\n<h4 id=\"heading-step-2-storage-libstoragetaskstoragedart\">\u0645\u0631\u062d\u0644\u06c1 2 - \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u06cc\u06ba (<code>lib\/storage\/task_storage.dart<\/code>)<\/h4>\n<p>\u06cc\u06c1 \u06a9\u0644\u0627\u0633 \u0645\u0642\u0627\u0645\u06cc JSON \u0641\u0627\u0626\u0644\u0648\u06ba \u06a9\u0648 \u067e\u0691\u06be\u0646\u06d2 \u0627\u0648\u0631 \u0644\u06a9\u06be\u0646\u06d2 \u06a9\u06cc \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc\u0648\u06ba \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u06cc\u06c1 CLI \u0639\u0645\u0644\u062f\u0631\u0622\u0645\u062f \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06c1\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-dart\">import 'dart:convert';\nimport 'dart:io';\n\nimport '..\/models\/task.dart';\n\nclass TaskStorage {\n  static final _file = File(\n    '${Platform.environment['HOME'] ?? Directory.current.path}\/.dart_todo.json',\n  );\n\n  static List<task> loadAll() {\n    if (!_file.existsSync()) return [];\n\n    try {\n      final content = _file.readAsStringSync();\n      final List<dynamic> json = jsonDecode(content) as List<dynamic>;\n      return json\n          .map((e) => Task.fromJson(e as Map<string dynamic=\"\">))\n          .toList();\n    } catch (_) {\n      return [];\n    }\n  }\n\n  static void saveAll(List<task> tasks) {\n    final json = jsonEncode(tasks.map(\n    _file.writeAsStringSync(json);\n  }\n}\n<\/task><\/string><\/dynamic><\/dynamic><\/task><\/code><\/pre>\n<p>\u06a9\u0627\u0645\u0648\u06ba \u06a9\u0648 \u0635\u0627\u0631\u0641 \u06a9\u06cc \u06c1\u0648\u0645 \u0688\u0627\u0626\u0631\u06a9\u0679\u0631\u06cc \u0645\u06cc\u06ba \u0686\u06be\u067e\u06cc \u06c1\u0648\u0626\u06cc JSON \u0641\u0627\u0626\u0644 \u0645\u06cc\u06ba \u0645\u062d\u0641\u0648\u0638 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 CLI \u0679\u0648\u0644\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0639\u0627\u0645 \u0646\u0645\u0648\u0646\u06c1 \u06c1\u06d2 \u062c\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u0644\u06a9\u06d2 \u0648\u0632\u0646 \u06a9\u06cc \u0645\u0642\u0627\u0645\u06cc \u0627\u0633\u062a\u0642\u0627\u0645\u062a \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-step-3-commands\">\u0645\u0631\u062d\u0644\u06c1 3 - \u06a9\u0645\u0627\u0646\u0688\u0632<\/h4>\n<p><code>lib\/commands\/add_command.dart<\/code>:<\/p>\n<pre><code class=\"language-dart\">import 'dart:io';\n\nimport '..\/models\/task.dart';\nimport '..\/storage\/task_storage.dart';\n\nvoid runAdd(List<string> args, String priority) {\n  if (args.isEmpty) {\n    stderr.writeln('Usage: dart_todo add <title> [--priority=high|normal|low]');\n    exit(2);\n  }\n\n  final title = args.join(' ');\n  final tasks = TaskStorage.loadAll();\n\n  final newTask = Task(\n    id: tasks.isEmpty ? 1 : tasks.last.id + 1,\n    title: title,\n    priority: priority,\n    createdAt: DateTime.now(),\n  );\n\n  tasks.add(newTask);\n  TaskStorage.saveAll(tasks);\n\n  stdout.writeln('Added task #\\({newTask.id}: \"\\)title\" [$priority]');\n}\n<\/title><\/string><\/code><\/pre>\n<p><code>lib\/commands\/list_command.dart<\/code>:<\/p>\n<pre><code class=\"language-cpp\">import 'dart:io';\n\nimport '..\/storage\/task_storage.dart';\n\nvoid runList() {\n  final tasks = TaskStorage.loadAll();\n\n  if (tasks.isEmpty) {\n    stdout.writeln('No tasks yet. Add one with: dart_todo add <title>');\n    return;\n  }\n\n  stdout.writeln('');\n  stdout.writeln('  ID   Status      Priority   Title');\n  stdout.writeln('  \u2500\u2500\u2500  \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500  \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500  \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500');\n\n  for (final task in tasks) {\n    final status = task.isComplete ? 'done  ' : 'pending';\n    final id = task.id.toString().padRight(4);\n    final priority = task.priority.padRight(9);\n    stdout.writeln('  \\(id \\)status  \\(priority  \\){task.title}');\n  }\n\n  stdout.writeln('');\n}\n<\/title><\/code><\/pre>\n<p><code>lib\/commands\/complete_command.dart<\/code>:<\/p>\n<pre><code class=\"language-dart\">import 'dart:io';\n\nimport '..\/storage\/task_storage.dart';\n\nvoid runComplete(List<string> args) {\n  if (args.isEmpty) {\n    stderr.writeln('Usage: dart_todo complete <id>');\n    exit(2);\n  }\n\n  final id = int.tryParse(args[0]);\n  if (id == null) {\n    stderr.writeln('Error: \"${args[0]}\" is not a valid task ID');\n    exit(1);\n  }\n\n  final tasks = TaskStorage.loadAll();\n  final index = tasks.indexWhere(\n\n  if (index == -1) {\n    stderr.writeln('Error: No task found with ID $id');\n    exit(1);\n  }\n\n  if (tasks[index].isComplete) {\n    stdout.writeln('Task #$id is already complete.');\n    return;\n  }\n\n  tasks[index] = tasks[index].copyWith(isComplete: true);\n  TaskStorage.saveAll(tasks);\n\n  stdout.writeln('Task #\\(id marked as complete: \"\\){tasks[index].title}\"');\n}\n<\/id><\/string><\/code><\/pre>\n<p><code>lib\/commands\/delete_command.dart<\/code>:<\/p>\n<pre><code class=\"language-dart\">import 'dart:io';\n\nimport '..\/storage\/task_storage.dart';\n\nvoid runDelete(List<string> args) {\n  if (args.isEmpty) {\n    stderr.writeln('Usage: dart_todo delete <id>');\n    exit(2);\n  }\n\n  final id = int.tryParse(args[0]);\n  if (id == null) {\n    stderr.writeln('Error: \"${args[0]}\" is not a valid task ID');\n    exit(1);\n  }\n\n  final tasks = TaskStorage.loadAll();\n  final index = tasks.indexWhere(\n\n  if (index == -1) {\n    stderr.writeln('Error: No task found with ID $id');\n    exit(1);\n  }\n\n  final title = tasks[index].title;\n  tasks.removeAt(index);\n  TaskStorage.saveAll(tasks);\n\n  stdout.writeln('Deleted task #\\(id: \"\\)title\"');\n}\n<\/id><\/string><\/code><\/pre>\n<p><code>lib\/commands\/clear_command.dart<\/code>:<\/p>\n<pre><code class=\"language-dart\">import 'dart:io';\n\nimport '..\/storage\/task_storage.dart';\n\nvoid runClear() {\n  stdout.write('Are you sure you want to delete all tasks? (y\/N): ');\n  final input = stdin.readLineSync()?.trim().toLowerCase();\n\n  if (input != 'y') {\n    stdout.writeln('Cancelled.');\n    return;\n  }\n\n  TaskStorage.saveAll([]);\n  stdout.writeln('All tasks cleared.');\n}\n<\/code><\/pre>\n<h4 id=\"heading-step-4-entry-point-bindarttododart\">\u0645\u0631\u062d\u0644\u06c1 4 - \u0627\u0646\u0679\u0631\u06cc \u067e\u0648\u0627\u0626\u0646\u0679 (<code>bin\/dart_todo.dart<\/code>)<\/h4>\n<pre><code class=\"language-dart\">import 'dart:io';\n\nimport 'package:args\/args.dart';\n\nimport '..\/lib\/commands\/add_command.dart';\nimport '..\/lib\/commands\/clear_command.dart';\nimport '..\/lib\/commands\/complete_command.dart';\nimport '..\/lib\/commands\/delete_command.dart';\nimport '..\/lib\/commands\/list_command.dart';\n\nvoid main(List<string> arguments) {\n  final parser = ArgParser();\n\n  \/\/ Add subcommand parsers\n  final addParser = ArgParser()\n    ..addOption(\n      'priority',\n      abbr: 'p',\n      defaultsTo: 'normal',\n      allowed: ['high', 'normal', 'low'],\n      help: 'Task priority level',\n    );\n\n  parser\n    ..addCommand('add', addParser)\n    ..addCommand('list')\n    ..addCommand('complete')\n    ..addCommand('delete')\n    ..addCommand('clear')\n    ..addFlag('help', abbr: 'h', negatable: false, help: 'Show help');\n\n  ArgResults results;\n\n  try {\n    results = parser.parse(arguments);\n  } catch (e) {\n    stderr.writeln('Error: $e');\n    stderr.writeln(parser.usage);\n    exit(2);\n  }\n\n  if (results['help'] as bool || results.command == null) {\n    printHelp(parser);\n    exit(0);\n  }\n\n  final command = results.command!;\n\n  switch (command.name) {\n    case 'add':\n      runAdd(command.rest, command['priority'] as String);\n    case 'list':\n      runList();\n    case 'complete':\n      runComplete(command.rest);\n    case 'delete':\n      runDelete(command.rest);\n    case 'clear':\n      runClear();\n    default:\n      stderr.writeln('Unknown command: \"${command.name}\"');\n      exit(1);\n  }\n}\n\nvoid printHelp(ArgParser parser) {\n  stdout.writeln('''\ndart_todo \u2014 a terminal task manager\n\nUsage:\n  dart_todo <command> [arguments]\n\nCommands:\n  add <title>        Add a new task\n    -p, --priority   Priority: high, normal, low (default: normal)\n  list               List all tasks\n  complete <id>      Mark a task as complete\n  delete <id>        Delete a task\n  clear              Delete all tasks\n\nExamples:\n  dart_todo add \"Write the CLI article\" --priority=high\n  dart_todo list\n  dart_todo complete 1\n  dart_todo delete 2\n  dart_todo clear\n  ''');\n}\n<\/id><\/id><\/title><\/command><\/string><\/code><\/pre>\n<p>\u0686\u0644\u0627\u0626\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\">dart run bin\/dart_todo.dart add \"Write the CLI article\" --priority=high\n# Added task #1: \"Write the CLI article\" [high]\n\ndart run bin\/dart_todo.dart add \"Review PR comments\"\n# Added task #2: \"Review PR comments\" [normal]\n\ndart run bin\/dart_todo.dart list\n#   ID   Status      Priority   Title\n#   \u2500\u2500\u2500  \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500  \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500  \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n#   1    &#x2b1c; pending  high       Write the CLI article\n#   2    &#x2b1c; pending  normal     Review PR comments\n\ndart run bin\/dart_todo.dart complete 1\n# Task #1 marked as complete: \"Write the CLI article\"\n\ndart run bin\/dart_todo.dart delete 2\n# Deleted task #2: \"Review PR comments\"\n<\/code><\/pre>\n<p><code>dart_todo<\/code>    \u06cc\u06c1 \u0627\u0646 \u0646\u0645\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u062a\u0645\u0627\u0645 \u0639\u0645\u0644\u06cc CLI \u0679\u0648\u0644\u0632 \u06a9\u06cc \u0631\u06cc\u0691\u06be \u06a9\u06cc \u06c1\u0688\u06cc \u06a9\u06cc \u062a\u0634\u06a9\u06cc\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>args<\/code>JSON \u0627\u0633\u062a\u0642\u0627\u0645\u062a\u060c \u0627\u0646\u0679\u0631\u0627\u06cc\u06a9\u0679\u0648 \u067e\u0631\u0627\u0645\u067e\u0679\u0633\u060c \u0633\u0679\u0631\u06a9\u0686\u0631\u0688 \u0622\u0624\u0679 \u067e\u0679\u060c \u0627\u0648\u0631 \u062a\u0645\u0627\u0645 \u06a9\u0645\u0627\u0646\u0688\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0648\u0627\u0636\u062d \u0627\u06cc\u0631\u0631 \u06c1\u06cc\u0646\u0688\u0644\u0646\u06af\u06d4<\/p>\n<h2 id=\"heading-cli-3-darthttp-a-lightweight-api-request-runner\">CLI 3 - \u0688\u0627\u0631\u0679_http: \u06c1\u0644\u06a9\u0627 \u067e\u06be\u0644\u06a9\u0627 API \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u06cc\u06af\u0632\u06cc\u06a9\u06cc\u0648\u0679\u0631<\/h2>\n<p>\u06cc\u06c1 \u0627\u0633 \u0645\u0636\u0645\u0648\u0646 \u0645\u06cc\u06ba \u0633\u0628 \u0633\u06d2 \u067e\u06cc\u0686\u06cc\u062f\u06c1 CLI \u06c1\u06d2 \u0627\u0648\u0631 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0645\u0641\u06cc\u062f \u06c1\u06d2\u06d4 <code>dart_http<\/code> \u0688\u06cc\u0648\u0644\u067e\u0631\u0632 \u062e\u0648\u0628\u0635\u0648\u0631\u062a \u067e\u0631\u0646\u0679 \u0634\u062f\u06c1 JSON \u062c\u0648\u0627\u0628\u0627\u062a\u060c \u0631\u0633\u067e\u0627\u0646\u0633 \u0645\u06cc\u0679\u0627 \u0688\u06cc\u0679\u0627\u060c \u06c1\u06cc\u0688\u0631 \u0633\u067e\u0648\u0631\u0679\u060c \u0627\u0648\u0631 \u0641\u0627\u0626\u0644\u0648\u06ba \u06a9\u06d2 \u062c\u0648\u0627\u0628\u0627\u062a \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0635\u0644\u0627\u062d\u06cc\u062a \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0679\u0631\u0645\u06cc\u0646\u0644 \u0633\u06d2 HTTP \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">dart_http get https:\/\/jsonplaceholder.typicode.com\/users\/1\ndart_http post https:\/\/jsonplaceholder.typicode.com\/posts --body='{\"title\":\"Hello\"}'\ndart_http get https:\/\/jsonplaceholder.typicode.com\/users --save=users.json\ndart_http get https:\/\/api.example.com\/me --header=\"Authorization: Bearer mytoken\"\n<\/code><\/pre>\n<h3 id=\"heading-building-darthttp\">\u0688\u0627\u0631\u0679\u0633 \u0628\u0646\u0627\u0646\u0627_http<\/h3>\n<p>\u0627\u06cc\u06a9 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0628\u0646\u0627\u0626\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\">dart create -t console dart_http\ncd dart_http\n<\/code><\/pre>\n<p>\u0627\u067e \u0688\u06cc\u0679 <code>pubspec.yaml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">name: dart_http\ndescription: A lightweight API request runner for the terminal\nversion: 1.0.0\n\nenvironment:\n  sdk: '>=3.0.0 <4.0.0'\n\nexecutables:\n  dart_http: dart_http\n\ndependencies:\n  args: ^2.4.2\n  http: ^1.2.1\n\ndev_dependencies:\n  lints: ^3.0.0\n  test: ^1.24.0\n<\/code><\/pre>\n<p>\u0686\u0644\u0627\u0626\u06cc\u06ba <code>dart pub get<\/code>.<\/p>\n<p>\u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06cc \u0633\u0627\u062e\u062a:<\/p>\n<pre><code class=\"language-plaintext\">dart_http\/\n  bin\/\n    dart_http.dart\n  lib\/\n    runner\/\n      request_runner.dart\n    printer\/\n      response_printer.dart\n    utils\/\n      headers_parser.dart\n  pubspec.yaml\n<\/code><\/pre>\n<pre><code class=\"language-dart\">Map<string string=\"\"> parseHeaders(List<string> rawHeaders) {\n  final headers = <string string=\"\">{};\n\n  for (final header in rawHeaders) {\n    final index = header.indexOf(':');\n    if (index == -1) continue;\n\n    final key = header.substring(0, index).trim();\n    final value = header.substring(index + 1).trim();\n    headers[key] = value;\n  }\n\n  return headers;\n}\n<\/string><\/string><\/string><\/code><\/pre>\n<h4 id=\"heading-step-2-response-printer-libprinterresponseprinterdart\">\u0645\u0631\u062d\u0644\u06c1 2 - \u0631\u0633\u067e\u0627\u0646\u0633 \u067e\u0631\u0646\u0679\u0631 (<code>lib\/printer\/response_printer.dart<\/code>)<\/h4>\n<pre><code class=\"language-dart\">import 'dart:convert';\nimport 'dart:io';\n\nvoid printResponse({\n  required int statusCode,\n  required String body,\n  required int durationMs,\n  required int bodyBytes,\n}) {\n  final statusLabel = _statusLabel(statusCode);\n  final size = _formatSize(bodyBytes);\n\n  stdout.writeln('');\n  stdout.writeln('\\(statusLabel | \\){durationMs}ms | $size');\n  stdout.writeln('\u2500' * 50);\n\n  try {\n    final decoded = jsonDecode(body);\n    const encoder = JsonEncoder.withIndent('  ');\n    stdout.writeln(encoder.convert(decoded));\n  } catch (_) {\n    \/\/ Not JSON \u2014 print as plain text\n    stdout.writeln(body);\n  }\n\n  stdout.writeln('');\n}\n\nString _statusLabel(int code) {\n  if (code >= 200 && code < 300) return '&#x2705; $code';\n  if (code >= 300 && code < 400) return '&#x21aa;  $code';\n  if (code >= 400 && code < 500) return '&#x274c; $code';\n  return '$code';\n}\n\nString _formatSize(int bytes) {\n  if (bytes < 1024) return '${bytes}b';\n  if (bytes < 1024 * 1024) return '${(bytes \/ 1024).toStringAsFixed(1)}kb';\n  return '${(bytes \/ (1024 * 1024)).toStringAsFixed(1)}mb';\n}\n<\/code><\/pre>\n<h4 id=\"heading-step-3-request-runner-librunnerrequestrunnerdart\">\u0645\u0631\u062d\u0644\u06c1 3 - \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2<code>lib\/runner\/request_runner.dart<\/code>)<\/h4>\n<pre><code class=\"language-dart\">import 'dart:io';\n\nimport 'package:http\/http.dart' as http;\n\nimport '..\/printer\/response_printer.dart';\n\nFuture<void> runRequest({\n  required String method,\n  required String url,\n  required Map<string string=\"\"> headers,\n  String? body,\n  String? saveToFile,\n}) async {\n  final uri = Uri.tryParse(url);\n\n  if (uri == null) {\n    stderr.writeln('Error: \"$url\" is not a valid URL');\n    exit(1);\n  }\n\n  stdout.writeln('\u2192 \\({method.toUpperCase()} \\)url');\n\n  http.Response response;\n  final stopwatch = Stopwatch()..start();\n\n  try {\n    switch (method.toLowerCase()) {\n      case 'get':\n        response = await http.get(uri, headers: headers);\n      case 'post':\n        response = await http.post(uri, headers: headers, body: body);\n      case 'put':\n        response = await http.put(uri, headers: headers, body: body);\n      case 'patch':\n        response = await http.patch(uri, headers: headers, body: body);\n      case 'delete':\n        response = await http.delete(uri, headers: headers);\n      default:\n        stderr.writeln('Error: unsupported method \"$method\"');\n        exit(2);\n    }\n  } catch (e) {\n    stderr.writeln('Error: request failed \u2014 $e');\n    exit(1);\n  }\n\n  stopwatch.stop();\n\n  printResponse(\n    statusCode: response.statusCode,\n    body: response.body,\n    durationMs: stopwatch.elapsedMilliseconds,\n    bodyBytes: response.bodyBytes.length,\n  );\n\n  if (saveToFile != null) {\n    final file = File(saveToFile);\n    file.writeAsStringSync(response.body);\n    stdout.writeln('Response saved to $saveToFile');\n  }\n}\n<\/string><\/void><\/code><\/pre>\n<h4 id=\"heading-step-4-entry-point-bindarthttpdart\">\u0645\u0631\u062d\u0644\u06c1 4 - \u0627\u0646\u0679\u0631\u06cc \u067e\u0648\u0627\u0626\u0646\u0679 (<code>bin\/dart_http.dart<\/code>)<\/h4>\n<pre><code class=\"language-dart\">import 'dart:io';\n\nimport 'package:args\/args.dart';\n\nimport '..\/lib\/runner\/request_runner.dart';\nimport '..\/lib\/utils\/headers_parser.dart';\n\nvoid main(List<string> arguments) async {\n  final parser = ArgParser();\n\n  for (final method in ['get', 'post', 'put', 'patch', 'delete']) {\n    final commandParser = ArgParser()\n      ..addMultiOption('header', abbr: 'H', help: 'Request header (repeatable)')\n      ..addOption('body', abbr: 'b', help: 'Request body (for POST\/PUT\/PATCH)')\n      ..addOption('save', abbr: 's', help: 'Save response body to a file');\n\n    parser.addCommand(method, commandParser);\n  }\n\n  parser.addFlag('help', abbr: 'h', negatable: false, help: 'Show help');\n\n  ArgResults results;\n\n  try {\n    results = parser.parse(arguments);\n  } catch (e) {\n    stderr.writeln('Error: $e');\n    printHelp();\n    exit(2);\n  }\n\n  if (results['help'] as bool || results.command == null) {\n    printHelp();\n    exit(0);\n  }\n\n  final command = results.command!;\n  final method = command.name!;\n  final rest = command.rest;\n\n  if (rest.isEmpty) {\n    stderr.writeln('Error: please provide a URL');\n    stderr.writeln('Usage: dart_http $method <url>');\n    exit(2);\n  }\n\n  final url = rest[0];\n  final rawHeaders = command['header'] as List<string>;\n  final body = command['body'] as String?;\n  final saveToFile = command['save'] as String?;\n\n  final headers = parseHeaders(rawHeaders);\n\n  \/\/ Default Content-Type for requests with a body\n  if (body != null && !headers.containsKey('Content-Type')) {\n    headers['Content-Type'] = 'application\/json';\n  }\n\n  await runRequest(\n    method: method,\n    url: url,\n    headers: headers,\n    body: body,\n    saveToFile: saveToFile,\n  );\n}\n\nvoid printHelp() {\n  stdout.writeln('''\ndart_http \u2014 a lightweight API request runner\n\nUsage:\n  dart_http <method> <url> [options]\n\nMethods:\n  get       Send a GET request\n  post      Send a POST request\n  put       Send a PUT request\n  patch     Send a PATCH request\n  delete    Send a DELETE request\n\nOptions:\n  -H, --header    Add a request header (repeatable)\n  -b, --body      Request body (JSON string)\n  -s, --save      Save response body to a file\n  -h, --help      Show this help message\n\nExamples:\n  dart_http get https:\/\/jsonplaceholder.typicode.com\/users\n  dart_http get https:\/\/api.example.com\/me --header=\"Authorization: Bearer token\"\n  dart_http post https:\/\/api.example.com\/posts --body=\\'{\"title\":\"Hello\"}\\'\n  dart_http get https:\/\/api.example.com\/users --save=users.json\n  ''');\n}\n<\/url><\/method><\/string><\/url><\/string><\/code><\/pre>\n<p>\u0686\u0644\u0627\u0626\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\">dart run bin\/dart_http.dart get https:\/\/jsonplaceholder.typicode.com\/users\/1\n\n# \u2192 GET https:\/\/jsonplaceholder.typicode.com\/users\/1\n# 200 | 87ms | 510b\n# \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n# {\n#   \"id\": 1,\n#   \"name\": \"Leanne Graham\",\n#   \"username\": \"Bret\",\n#   \"email\": \"Sincere@april.biz\"\n# }\n\ndart run bin\/dart_http.dart get https:\/\/jsonplaceholder.typicode.com\/users --save=users.json\n# \u2192 GET https:\/\/jsonplaceholder.typicode.com\/users\n# 200 | 143ms | 5.3kb\n# \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n# [ ... ]\n# Response saved to users.json\n\ndart run bin\/dart_http.dart post https:\/\/jsonplaceholder.typicode.com\/posts \\\n  --body='{\"title\":\"Hello from dart_http\",\"userId\":1}'\n# \u2192 POST https:\/\/jsonplaceholder.typicode.com\/posts\n# 201 | 312ms | 72b\n<\/code><\/pre>\n<h2 id=\"heading-adding-color-and-polish-to-your-cli\">CLI \u0645\u06cc\u06ba \u0631\u0646\u06af \u0627\u0648\u0631 \u0686\u0645\u06a9 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0645\u0646\u062f\u0631\u062c\u06c1 \u0628\u0627\u0644\u0627 CLI \u0641\u0639\u0627\u0644 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0631\u0646\u06af\u0648\u06ba \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0622\u0624\u0679 \u067e\u0679 \u06a9\u0648 \u0632\u06cc\u0627\u062f\u06c1 \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0628\u0646\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u06c1 <code>ansi_styles<\/code> \u067e\u06cc\u06a9\u06cc\u062c \u0679\u0631\u0645\u06cc\u0646\u0644\u0632 \u0645\u06cc\u06ba \u0645\u062a\u0646 \u06a9\u0648 \u0631\u0646\u06af\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 ANSI \u0641\u0631\u0627\u0631 \u06a9\u0648\u0688 \u0633\u067e\u0648\u0631\u0679 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633\u06d2 \u0627\u06af\u0644\u06cc \u0628\u0627\u0631 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>pubspec.yaml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">dependencies:\n  ansi_styles: ^0.3.0\n<\/code><\/pre>\n<p>\u0627\u0633 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644:<\/p>\n<pre><code class=\"language-dart\">import 'package:ansi_styles\/ansi_styles.dart';\n\nstdout.writeln(AnsiStyles.green('&#x2705; Success'));\nstdout.writeln(AnsiStyles.red('&#x274c; Error: something went wrong'));\nstdout.writeln(AnsiStyles.yellow('&#x26a0;  Warning: check your config'));\nstdout.writeln(AnsiStyles.bold('dart_http \u2014 API request runner'));\nstdout.writeln(AnsiStyles.cyan('\u2192 GET https:\/\/api.example.com\/users'));\n<\/code><\/pre>\n<p>\u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u0627\u0648\u0631 \u0645\u0633\u062a\u0642\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0631\u0646\u06af \u0644\u06af\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<ul>\n<li>\n<p><strong>\u0633\u0628\u0632<\/strong> - \u06a9\u0627\u0645\u06cc\u0627\u0628\u06cc \u06a9\u06cc \u062d\u06cc\u062b\u06cc\u062a\u060c \u06a9\u0627\u0645 \u0645\u06a9\u0645\u0644<\/p>\n<\/li>\n<li>\n<p><strong>\u0633\u0631\u062e<\/strong> - \u063a\u0644\u0637\u06cc\u0627\u06ba \u0627\u0648\u0631 \u0646\u0627\u06a9\u0627\u0645\u06cc\u0627\u06ba<\/p>\n<\/li>\n<li>\n<p><strong>\u067e\u06cc\u0644\u0627<\/strong> - \u0627\u0646\u062a\u0628\u0627\u06c1 \u0627\u0648\u0631 \u063a\u06cc\u0631 \u0645\u0633\u062f\u0648\u062f \u0645\u0633\u0627\u0626\u0644<\/p>\n<\/li>\n<li>\n<p><strong>\u0641\u06cc\u0631\u0648\u0632\u06cc<\/strong> - \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u06a9\u06cc \u067e\u06cc\u062f\u0627\u0648\u0627\u0631\u060c URL\u060c \u0631\u0627\u0633\u062a\u06c1<\/p>\n<\/li>\n<li>\n<p><strong>\u0628\u06c1\u0627\u062f\u0631<\/strong> - \u06c1\u06cc\u0688\u0631\u060c \u0679\u0648\u0644 \u06a9\u0627 \u0646\u0627\u0645\u060c \u0627\u06c1\u0645 \u0627\u0642\u062f\u0627\u0631<\/p>\n<\/li>\n<\/ul>\n<p>\u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0648 \u0631\u0646\u06af \u0646\u06c1 \u062f\u06cc\u06ba\u06d4 \u0631\u0646\u06af \u062c\u0628 \u06c1\u0631 \u062c\u06af\u06c1 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0627\u067e\u0646\u0627 \u0645\u0639\u0646\u06cc \u06a9\u06be\u0648 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0622\u067e \u0627\u0633\u06d2 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u06cc \u062a\u0648\u062c\u06c1 \u0627\u0633 \u0637\u0631\u0641 \u0645\u0628\u0630\u0648\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0627\u0635\u0644 \u0645\u06cc\u06ba \u06a9\u06cc\u0627 \u0627\u06c1\u0645 \u06c1\u06d2\u06d4<\/p>\n<p>CLI \u0679\u0648\u0644\u0632 \u0642\u0627\u0628\u0644 \u0622\u0632\u0645\u0627\u0626\u0634 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0646 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06c1\u0648\u0646\u06cc \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u0633\u0628 \u0633\u06d2 \u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f \u0646\u0642\u0637\u06c1 \u0646\u0638\u0631 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0622\u0624\u0679 \u067e\u0679 \u0641\u0627\u0631\u0645\u06cc\u0679 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0637\u0631\u0632 \u0639\u0645\u0644 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba <code>test<\/code> \u0627\u06af\u0631 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0688\u0648\u06cc\u0644\u067e\u0631 \u0627\u0646\u062d\u0635\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2:<\/p>\n<pre><code class=\"language-yaml\">dev_dependencies:\n  test: ^1.24.0\n<\/code><\/pre>\n<p><strong>\u0679\u06cc\u0633\u0679 \u06a9\u0645\u0627\u0646\u0688 \u0645\u0646\u0637\u0642:<\/strong><\/p>\n<pre><code class=\"language-dart\">import 'package:test\/test.dart';\n\nimport '..\/lib\/models\/task.dart';\n\nvoid main() {\n  group('Task model', () {\n    test('copyWith updates isComplete correctly', () {\n      final task = Task(\n        id: 1,\n        title: 'Write tests',\n        priority: 'high',\n        createdAt: DateTime.now(),\n      );\n\n      final completed = task.copyWith(isComplete: true);\n\n      expect(completed.isComplete, isTrue);\n      expect(completed.title, equals('Write tests'));\n      expect(completed.id, equals(1));\n    });\n\n    test('toJson and fromJson round-trips correctly', () {\n      final task = Task(\n        id: 2,\n        title: 'Ship the tool',\n        priority: 'normal',\n        createdAt: DateTime.parse('2025-01-01T00:00:00.000'),\n      );\n\n      final json = task.toJson();\n      final restored = Task.fromJson(json);\n\n      expect(restored.id, equals(task.id));\n      expect(restored.title, equals(task.title));\n      expect(restored.priority, equals(task.priority));\n    });\n  });\n}\n<\/code><\/pre>\n<p><strong>\u06c1\u06cc\u0688\u0631 \u067e\u0627\u0631\u0633\u0631 \u0679\u06cc\u0633\u0679:<\/strong><\/p>\n<pre><code class=\"language-dart\">import 'package:test\/test.dart';\n\nimport '..\/lib\/utils\/headers_parser.dart';\n\nvoid main() {\n  group('parseHeaders', () {\n    test('parses a single header correctly', () {\n      final result = parseHeaders(['Authorization: Bearer mytoken']);\n      expect(result['Authorization'], equals('Bearer mytoken'));\n    });\n\n    test('parses multiple headers', () {\n      final result = parseHeaders([\n        'Authorization: Bearer token',\n        'Accept: application\/json',\n      ]);\n      expect(result.length, equals(2));\n      expect(result['Accept'], equals('application\/json'));\n    });\n\n    test('ignores malformed headers without a colon', () {\n      final result = parseHeaders(['malformed-header']);\n      expect(result.isEmpty, isTrue);\n    });\n  });\n}\n<\/code><\/pre>\n<p>\u0679\u06cc\u0633\u0679 \u0686\u0644\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">dart test\n<\/code><\/pre>\n<h2 id=\"heading-deploying-and-distributing-your-cli\">CLI \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u0627\u0648\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc\u06d4<\/h2>\n<p>CLI \u0679\u0648\u0644 \u0628\u0646\u0627\u0646\u0627 \u0622\u062f\u06be\u0627 \u06a9\u0627\u0645 \u06c1\u06d2\u06d4 \u0627\u0633\u06d2 \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u06d2 \u06c1\u0627\u062a\u06be\u0648\u06ba \u0645\u06cc\u06ba \u0688\u0627\u0644\u0646\u0627 \u062f\u0648\u0633\u0631\u0627 \u0646\u0635\u0641 \u06c1\u06d2\u06d4 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u06a9\u06d2 \u067e\u0627\u0646\u0686 \u0631\u0627\u0633\u062a\u06d2 \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u06cc\u06ba\u060c \u06c1\u0631 \u0627\u06cc\u06a9 \u0645\u062e\u062a\u0644\u0641 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0645\u0639\u0627\u0645\u0644\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0648\u0632\u0648\u06ba \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-mode-1-pubdev-public-package-distribution\">\u0645\u0648\u0688 1: pub.dev \u2014 \u0639\u0648\u0627\u0645\u06cc \u067e\u06cc\u06a9\u06cc\u062c \u06a9\u06cc \u062a\u0642\u0633\u06cc\u0645<\/h3>\n<p>pub.dev \u067e\u0631 \u0634\u0627\u0626\u0639 \u06a9\u0631 \u06a9\u06d2\u060c Dart \u0627\u0648\u0631 Flutter \u06a9\u0645\u06cc\u0648\u0646\u0679\u06cc \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0634\u062e\u0635 \u0622\u067e \u06a9\u06d2 \u0679\u0648\u0644\u0632 \u06a9\u0648 \u0627\u06cc\u06a9 \u06a9\u0645\u0627\u0646\u0688 \u0633\u06d2 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-prepare-your-package\">\u0627\u067e\u0646\u0627 \u067e\u06cc\u06a9\u062c \u062a\u06cc\u0627\u0631 \u06a9\u0631\u06cc\u06ba:<\/h4>\n<p>\u0622\u067e \u06a9\u0627 <code>pubspec.yaml<\/code> \u0622\u067e \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u06a9\u0631\u0646\u0627 \u06c1\u0648\u06af\u0627:<\/p>\n<pre><code class=\"language-yaml\">name: dart_http\ndescription: A lightweight API request runner for Dart developers.\nversion: 1.0.0\nhomepage: https:\/\/github.com\/yourname\/dart_http\n\nenvironment:\n  sdk: '>=3.0.0 <4.0.0'\n\nexecutables:\n  dart_http: dart_http\n<\/code><\/pre>\n<p>\u06a9\u06c1 <code>executables<\/code> \u0628\u0644\u0627\u06a9\u0633 \u0627\u06c1\u0645 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0622\u067e \u06a9\u0648 \u0628\u062a\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 pub.dev \u0645\u06cc\u06ba \u06a9\u0648\u0646 \u0633\u06cc \u0627\u0633\u06a9\u0631\u067e\u0679 \u06c1\u06cc\u06ba\u06d4 <code>bin\/<\/code> \u06cc\u06c1 \u0627\u06cc\u06a9 \u0642\u0627\u0628\u0644 \u0639\u0645\u0644 \u06a9\u0645\u0627\u0646\u0688 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0633\u0627\u0645\u0646\u06d2 \u0622\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u067e \u06a9\u0648 \u0628\u06be\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648 \u06af\u06cc:<\/p>\n<ul>\n<li>\n<p><code>README.md<\/code>    - \u0679\u0648\u0644 \u06a9\u06cc\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633\u06d2 \u06a9\u06cc\u0633\u06d2 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2\u060c \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc \u0645\u062b\u0627\u0644\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p><code>CHANGELOG.md<\/code>    - \u0648\u0631\u0698\u0646 \u06a9\u06cc \u062a\u0627\u0631\u06cc\u062e<\/p>\n<\/li>\n<li>\n<p><code>LICENSE<\/code>    - \u0627\u0648\u067e\u0646 \u0633\u0648\u0631\u0633 \u0644\u0627\u0626\u0633\u0646\u0633 (MIT \u0645\u0639\u06cc\u0627\u0631\u06cc \u06c1\u06d2)<\/p>\n<\/li>\n<\/ul>\n<h4 id=\"heading-validate-before-publishing\">\u067e\u0648\u0633\u0679 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4<\/h4>\n<pre><code class=\"language-bash\">dart pub publish --dry-run\n<\/code><\/pre>\n<p>\u0627\u0635\u0644 \u0645\u06cc\u06ba \u0634\u0627\u0626\u0639 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u062a\u0645\u0627\u0645 \u062a\u0648\u062b\u06cc\u0642 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0628\u0631\u0627\u06c1 \u06a9\u0631\u0645 \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0648\u0627\u0631\u0646\u0646\u06af \u06a9\u0648 \u062f\u0631\u0633\u062a \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h4 id=\"heading-publish\">\u0645\u06cc\u06ba \u067e\u0648\u0633\u0679 \u06a9\u06cc\u0627 \u06af\u06cc\u0627:<\/h4>\n<pre><code class=\"language-bash\">dart pub publish\n<\/code><\/pre>\n<p>\u0622\u067e \u06a9\u0648 \u0627\u067e\u0646\u06d2 pub.dev \u0627\u06a9\u0627\u0624\u0646\u0679 \u0633\u06d2 \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u06c1\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0634\u0627\u0626\u0639 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0679\u0648\u0644 \u0639\u0627\u0644\u0645\u06cc \u0633\u0637\u062d \u067e\u0631 \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u0648\u06af\u0627\u06d4<\/p>\n<pre><code class=\"language-bash\">dart pub global activate dart_http\ndart_http get https:\/\/api.example.com\/users\n<\/code><\/pre>\n<h3 id=\"heading-mode-2-local-path-activation\">\u0645\u0648\u0688 2: \u0644\u0648\u06a9\u0644 \u067e\u0627\u062a\u06be \u06a9\u0648 \u0641\u0639\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0679\u06cc\u0645 \u06a9\u06d2 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0679\u0648\u0644\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062c\u0646\u06c1\u06cc\u06ba \u0622\u067e \u0639\u0648\u0627\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0634\u0627\u0626\u0639 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u062a\u06d2\u060c \u0627\u0646\u06c1\u06cc\u06ba \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0645\u0642\u0627\u0645\u06cc \u06cc\u0627 \u06a9\u0644\u0648\u0646 \u0634\u062f\u06c1 \u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc \u067e\u0631 \u0641\u0639\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">dart pub global activate --source path \/path\/to\/dart_http\n<\/code><\/pre>\n<p>\u0679\u06cc\u0645 \u06a9\u0627 \u06c1\u0631 \u0688\u0648\u06cc\u0644\u067e\u0631 \u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc \u06a9\u0648 \u06a9\u0644\u0648\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u06a9\u0645\u0627\u0646\u0688 \u06a9\u0648 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f \u06cc\u06c1 \u0679\u0648\u0644 \u0622\u067e \u06a9\u06d2 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0645\u06cc\u06ba pub.dev \u06a9\u06cc \u0627\u0634\u0627\u0639\u062a \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0639\u0627\u0644\u0645\u06cc \u0633\u0637\u062d \u067e\u0631 \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u0648\u06af\u0627\u06d4<\/p>\n<p>\u06cc\u06c1 \u0627\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0648\u0632\u0648\u06ba \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u0645\u0648\u0688 \u06c1\u06d2:<\/p>\n<h3 id=\"heading-mode-3-compiled-binary-via-github-releases\">\u0645\u0648\u0688 3: GitHub \u0631\u06cc\u0644\u06cc\u0632 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0645\u0631\u062a\u0628 \u06a9\u0631\u062f\u06c1 \u0628\u0627\u0626\u0646\u0631\u06cc\u0632<\/h3>\n<p>\u0688\u0627\u0631\u0679 \u06a9\u0648 \u062e\u0648\u062f \u0633\u0627\u062e\u062a\u06c1 \u0645\u0642\u0627\u0645\u06cc \u0627\u06cc\u06af\u0632\u06cc\u06a9\u06cc\u0648\u0679\u06cc\u0628\u0644 \u0645\u06cc\u06ba \u0645\u0631\u062a\u0628 \u06a9\u06cc\u0627 \u062c\u0627\u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0679\u0627\u0631\u06af\u0679 \u0633\u0633\u0679\u0645 \u067e\u0631 Dart SDK \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0679\u0648\u0644\u0632 \u06a9\u0648 \u0688\u0627\u0631\u0679 \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0646\u0638\u0627\u0645 \u0633\u06d2 \u0628\u0627\u06c1\u0631 \u06a9\u06d2 \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0642\u0627\u0628\u0644 \u0631\u0633\u0627\u0626\u06cc \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-compile\">plait:<\/h4>\n<pre><code class=\"language-bash\"># macOS\ndart compile exe bin\/dart_http.dart -o dist\/dart_http-macos\n\n# Linux\ndart compile exe bin\/dart_http.dart -o dist\/dart_http-linux\n\n# Windows\ndart compile exe bin\/dart_http.dart -o dist\/dart_http-windows.exe\n<\/code><\/pre>\n<p>\u0645\u0631\u062a\u0628 \u0634\u062f\u06c1 \u0628\u0627\u0626\u0646\u0631\u06cc\u0632 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u062e\u0648\u062f \u0633\u0627\u062e\u062a\u06c1 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633\u06d2 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u06a9\u0645\u067e\u06cc\u0648\u0679\u0631 \u067e\u0631 \u06a9\u0627\u067e\u06cc \u06a9\u0631 \u06a9\u06d2 \u0686\u0644\u0627\u0626\u06cc\u06ba\u06d4 \u0622\u067e \u06a9\u0648 \u0688\u0627\u0631\u0679 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-automate-with-github-actions\">GitHub \u0627\u06cc\u06a9\u0634\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062e\u0648\u062f\u06a9\u0627\u0631:<\/h4>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>.github\/workflows\/release.yml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">name: Release\n\non:\n  push:\n    tags:\n      - 'v*'\n\njobs:\n  build:\n    strategy:\n      matrix:\n        os: [ubuntu-latest, macos-latest, windows-latest]\n    runs-on: ${{ matrix.os }}\n\n    steps:\n      - uses: actions\/checkout@v3\n\n      - uses: dart-lang\/setup-dart@v1\n        with:\n          sdk: stable\n\n      - name: Install dependencies\n        run: dart pub get\n\n      - name: Compile binary\n        run: |\n          mkdir -p dist\n          dart compile exe bin\/dart_http.dart -o dist\/dart_http-${{ runner.os }}\n\n      - name: Upload binary to release\n        uses: softprops\/action-gh-release@v1\n        with:\n          files: dist\/dart_http-${{ runner.os }}\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n<\/code><\/pre>\n<p>\u0648\u0631\u0698\u0646 \u0679\u06cc\u06af (<code>v1.0.0<\/code>)\u060c GitHub \u0627\u06cc\u06a9\u0634\u0646 \u062a\u06cc\u0646\u0648\u06ba \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u0627\u0626\u0646\u0631\u06cc\u0632 \u06a9\u0648 \u0645\u0631\u062a\u0628 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0627\u0646\u06c1\u06cc\u06ba GitHub \u0631\u06cc\u0644\u06cc\u0632 \u0633\u06d2 \u062c\u0648\u0691 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-write-an-install-script\">\u0627\u0646\u0633\u0679\u0627\u0644\u06cc\u0634\u0646 \u0627\u0633\u06a9\u0631\u067e\u0679 \u0644\u06a9\u06be\u06cc\u06ba:<\/h4>\n<pre><code class=\"language-bash\">#!\/usr\/bin\/env bash\nset -euo pipefail\n\nVERSION=\"1.0.0\"\nOS=$(uname -s | tr '[:upper:]' '[:lower:]')\nBINARY=\"dart_http-$OS\"\nINSTALL_DIR=\"\/usr\/local\/bin\"\n\ncurl -L \"https:\/\/github.com\/yourname\/dart_http\/releases\/download\/v\\(VERSION\/\\)BINARY\" \\\n  -o \"$INSTALL_DIR\/dart_http\"\n\nchmod +x \"$INSTALL_DIR\/dart_http\"\necho \"dart_http installed successfully\"\n<\/code><\/pre>\n<p>\u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\">curl -fsSL https:\/\/raw.githubusercontent.com\/yourname\/dart_http\/main\/install.sh | bash\n<\/code><\/pre>\n<h3 id=\"heading-mode-4-homebrew-tap\">\u0645\u0648\u0688 4: \u06c1\u0648\u0645\u0628\u0631\u06cc\u0648 \u0679\u06cc\u0628<\/h3>\n<p>\u06c1\u0648\u0645\u0628\u0631\u06cc\u0648 \u0645\u06cc\u06a9 \u0627\u0648 \u0627\u06cc\u0633 \u067e\u0631 \u0645\u0639\u06cc\u0627\u0631\u06cc \u067e\u06cc\u06a9\u06cc\u062c \u0645\u06cc\u0646\u06cc\u062c\u0631 \u06c1\u06d2 \u0627\u0648\u0631 \u0644\u06cc\u0646\u06a9\u0633 \u067e\u0631 \u0648\u0633\u06cc\u0639 \u067e\u06cc\u0645\u0627\u0646\u06d2 \u067e\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u06c1\u0648\u0645\u0628\u0631\u06cc\u0648 \u0679\u06cc\u0628 \u0622\u067e \u06a9\u0648 \u0679\u0648\u0644\u0632 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 <code>brew install<\/code> - \u06cc\u06c1 \u0645\u06cc\u06a9\u0648\u0633 \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0627\u0646\u0648\u0633 \u0627\u0646\u0633\u0679\u0627\u0644\u06cc\u0634\u0646 \u067e\u06cc\u0679\u0631\u0646 \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-create-your-tap-repository\">\u0627\u06cc\u06a9 \u0679\u06cc\u0628 \u0627\u0633\u0679\u0648\u0631 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4<\/h4>\n<p>\u0646\u0627\u0645 \u06a9\u0627 \u0627\u06cc\u06a9 \u0646\u06cc\u0627 GitHub \u0630\u062e\u06cc\u0631\u06c1 \u0628\u0646\u0627\u0626\u06cc\u06ba: <code>homebrew-tools<\/code> (\u0648\u06c1 <code>homebrew-<\/code> \u06c1\u0648\u0645\u0628\u0631\u06cc\u0648 \u06a9\u06d2 \u0646\u0627\u0645 \u0633\u0627\u0632\u06cc \u06a9\u0646\u0648\u0646\u0634\u0646 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u0633\u0627\u0628\u0642\u06c1 \u200b\u200b\u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2)\u06d4<\/p>\n<h4 id=\"heading-write-the-formula\">\u0641\u0627\u0631\u0645\u0648\u0644\u0627 \u0644\u06a9\u06be\u06cc\u06ba:<\/h4>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>Formula\/dart_http.rb<\/code> \u0627\u0633 \u0630\u062e\u06cc\u0631\u06c1 \u0633\u06d2:<\/p>\n<pre><code class=\"language-ruby\">class DartHttp < Formula\n  desc \"A lightweight API request runner for the terminal\"\n  homepage \"https:\/\/github.com\/yourname\/dart_http\"\n  version \"1.0.0\"\n\n  on_macos do\n    url \"https:\/\/github.com\/yourname\/dart_http\/releases\/download\/v1.0.0\/dart_http-macOS\"\n    sha256 \"YOUR_SHA256_HASH_HERE\"\n  end\n\n  on_linux do\n    url \"https:\/\/github.com\/yourname\/dart_http\/releases\/download\/v1.0.0\/dart_http-Linux\"\n    sha256 \"YOUR_SHA256_HASH_HERE\"\n  end\n\n  def install\n    bin.install \"dart_http-#{OS.mac? ? 'macOS' : 'Linux'}\" => \"dart_http\"\n  end\n\n  test do\n    system \"#{bin}\/dart_http\", \"--help\"\n  end\nend\n<\/code><\/pre>\n<p>\u06c1\u0631 \u0628\u0627\u0626\u0646\u0631\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 SHA256 \u06c1\u06cc\u0634 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">shasum -a 256 dist\/dart_http-macOS\n<\/code><\/pre>\n<h4 id=\"heading-install-from-the-tap\">\u0679\u06cc\u0628 \u0633\u06d2 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba:<\/h4>\n<pre><code class=\"language-bash\">brew tap yourname\/tools\nbrew install dart_http\n<\/code><\/pre>\n<p>\u0646\u06cc\u0627 \u0648\u0631\u0698\u0646 \u062c\u0627\u0631\u06cc \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u0628\u0631\u0627\u06c1 \u06a9\u0631\u0645 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u06cc\u06ba\u06d4 <code>url<\/code> \u0627\u0648\u0631 <code>sha256<\/code> \u0641\u0627\u0631\u0645\u0648\u0644\u06d2 \u06a9\u06cc \u0642\u062f\u0631\u06cc\u06ba \u062f\u0631\u062c \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u067e\u0646\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0648 \u0622\u06af\u06d2 \u0628\u0691\u06be\u0627\u0626\u06cc\u06ba\u06d4 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u0686\u0644\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>brew upgrade dart_http<\/code> \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-mode-5-docker\">\u0645\u0648\u0688 5: \u0688\u0648\u06a9\u0631<\/h3>\n<p>\u0688\u0648\u06a9\u0631 \u06a9\u06cc \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc\u0627\u06ba CI \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u060c \u06a9\u0646\u0679\u06cc\u0646\u0631\u0632 \u06a9\u0648 \u0645\u0639\u06cc\u0627\u0631\u06cc \u0628\u0646\u0627\u0646\u06d2 \u0648\u0627\u0644\u06cc \u0679\u06cc\u0645\u0648\u06ba\u060c \u06cc\u0627 \u067e\u06cc\u0686\u06cc\u062f\u06c1 \u0627\u0646\u062d\u0635\u0627\u0631 \u0648\u0627\u0644\u06d2 \u0679\u0648\u0644\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h4 id=\"heading-write-a-dockerfile\">\u0627\u06cc\u06a9 \u0688\u0627\u06a9\u0631 \u0641\u0627\u0626\u0644 \u0644\u06a9\u06be\u06cc\u06ba\u06d4<\/h4>\n<pre><code class=\"language-dockerfile\">FROM dart:stable AS build\n\nWORKDIR \/app\nCOPY pubspec.* .\/\nRUN dart pub get\n\nCOPY . .\nRUN dart compile exe bin\/dart_http.dart -o \/app\/dart_http\n\nFROM debian:stable-slim\nCOPY --from=build \/app\/dart_http \/usr\/local\/bin\/dart_http\n\nENTRYPOINT [\"dart_http\"]\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0627\u06cc\u06a9 \u06a9\u062b\u06cc\u0631 \u0645\u0631\u062d\u0644\u06d2 \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2. \u067e\u06c1\u0644\u0627 \u0645\u0631\u062d\u0644\u06c1 \u0688\u0627\u0631\u0679 SDK \u0627\u0645\u06cc\u062c \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0628\u0627\u0626\u0646\u0631\u06cc\u0632 \u06a9\u0648 \u0645\u0631\u062a\u0628 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062f\u0648\u0633\u0631\u0627 \u0645\u0631\u062d\u0644\u06c1 \u0635\u0631\u0641 \u0628\u0627\u0626\u0646\u0631\u06cc\u0632 \u06a9\u0648 \u06a9\u0645 \u0633\u06d2 \u06a9\u0645 \u0688\u06cc\u0628\u06cc\u0646 \u0627\u0645\u06cc\u062c \u067e\u0631 \u06a9\u0627\u067e\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062d\u062a\u0645\u06cc \u062a\u0635\u0648\u06cc\u0631 \u0645\u06cc\u06ba Dart SDK \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u0635\u0631\u0641 \u0645\u0631\u062a\u0628 \u0634\u062f\u06c1 \u0628\u0627\u0626\u0646\u0631\u06cc \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-build-and-run\">\u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0686\u0644\u0627\u0626\u06cc\u06ba:<\/h4>\n<pre><code class=\"language-bash\">docker build -t dart_http .\ndocker run dart_http get https:\/\/jsonplaceholder.typicode.com\/users\/1\n<\/code><\/pre>\n<h4 id=\"heading-publish-to-docker-hub\">Docker Hub \u067e\u0631 \u0634\u0627\u0626\u0639 \u06a9\u0631\u06cc\u06ba:<\/h4>\n<pre><code class=\"language-bash\">docker tag dart_http yourname\/dart_http:1.0.0\ndocker push yourname\/dart_http:1.0.0\n<\/code><\/pre>\n<p>\u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f \u0635\u0627\u0631\u0641 \u0645\u0642\u0627\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0686\u06be \u0628\u06be\u06cc \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u0633 \u0679\u0648\u0644 \u06a9\u0648 \u0686\u0644\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">docker run yourname\/dart_http get https:\/\/api.example.com\/users\n<\/code><\/pre>\n<h2 id=\"heading-choosing-the-right-distribution-mode\">\u0635\u062d\u06cc\u062d \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u0645\u0648\u0688 \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<table>\n<thead>\n<tr>\n<th>\u0637\u0631\u06cc\u0642\u06c1<\/th>\n<th>\u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u0645\u0648\u0632\u0648\u06ba \u06c1\u06d2\u06d4<\/th>\n<th>Dart SDK \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>pub.dev<\/td>\n<td>\u067e\u0628\u0644\u06a9 \u0688\u0627\u0631\u0679\/\u0641\u0644\u0679\u0631 \u0688\u0648\u06cc\u0644\u067e\u0631 \u0679\u0648\u0644\u0632<\/td>\n<td>\u06c1\u0627\u06ba<\/td>\n<\/tr>\n<tr>\n<td>\u0645\u0642\u0627\u0645\u06cc \u0631\u0627\u0633\u062a\u06d2 \u06a9\u0648 \u0641\u0639\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/td>\n<td>\u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0679\u06cc\u0645 \u0679\u0648\u0644\u0632\u060c \u067e\u0631\u06cc \u0631\u06cc\u0644\u06cc\u0632 \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631<\/td>\n<td>\u06c1\u0627\u06ba<\/td>\n<\/tr>\n<tr>\n<td>\u0645\u0631\u062a\u0628 \u0634\u062f\u06c1 \u0628\u0627\u0626\u0646\u0631\u06cc<\/td>\n<td>\u0632\u0628\u0627\u0646-\u0627\u06cc\u06af\u0646\u0648\u0633\u0679\u06a9 \u0679\u0648\u0644\u0632\u060c \u0648\u0633\u06cc\u0639 \u067e\u06cc\u0645\u0627\u0646\u06d2 \u067e\u0631 \u0627\u067e\u0646\u0627\u0646\u06d2<\/td>\n<td>\u0646\u06c1\u06cc\u06ba<\/td>\n<\/tr>\n<tr>\n<td>\u06c1\u0648\u0645\u0628\u0631\u06cc\u0648 \u0679\u06cc\u0628<\/td>\n<td>macOS\/Linux \u0688\u0648\u06cc\u0644\u067e\u0631 \u0679\u0648\u0644\u0632<\/td>\n<td>\u0646\u06c1\u06cc\u06ba<\/td>\n<\/tr>\n<tr>\n<td>\u0688\u0627\u06a9\u0631<\/td>\n<td>CI \u0645\u0627\u062d\u0648\u0644\u060c \u067e\u06cc\u0686\u06cc\u062f\u06c1 \u0627\u0646\u062d\u0635\u0627\u0631<\/td>\n<td>\u0646\u06c1\u06cc\u06ba<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0679\u0648\u0644\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u06cc\u0631\u06cc \u0627\u0635\u0644 \u0633\u0641\u0627\u0631\u0634\u0627\u062a \u06cc\u06c1 \u06c1\u06cc\u06ba:<\/p>\n<ul>\n<li>\n<p>\u0633\u06d2 \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4 <strong>pub.dev<\/strong> \u0627\u06af\u0631 \u0622\u067e \u06a9\u06d2 \u0633\u0627\u0645\u0639\u06cc\u0646 \u0688\u0627\u0631\u0679 \u0688\u0648\u06cc\u0644\u067e\u0631 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba <strong>\u0645\u0631\u062a\u0628 \u0634\u062f\u06c1 \u0628\u0627\u0626\u0646\u0631\u06cc\u0632 + GitHub \u0631\u06cc\u0644\u06cc\u0632<\/strong> \u0627\u06af\u0631 \u0622\u067e \u0648\u0633\u06cc\u0639 \u062a\u0631 \u0627\u067e\u0646\u0627\u0646\u0627 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u0636\u0627\u0641\u06c1 <strong>\u06c1\u0648\u0645\u0628\u0631\u06cc\u0648 \u0679\u06cc\u0628<\/strong> \u062c\u0628 macOS \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u0645\u0637\u0627\u0644\u0628\u06c1 \u06a9\u0631\u0646\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba <strong>\u0688\u0627\u06a9\u0631<\/strong> \u0635\u0631\u0641 \u0627\u0633 \u0635\u0648\u0631\u062a \u0645\u06cc\u06ba \u062c\u0628 \u06cc\u06c1 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06c1\u06cc \u0622\u067e \u06a9\u06cc \u0679\u06cc\u0645 \u06a9\u06d2 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u0627 \u062d\u0635\u06c1 \u06c1\u0648\u06d4<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"heading-conclusion\">\u0646\u062a\u06cc\u062c\u06c1<\/h2>\n<p>\u06c1\u0645 \u06cc\u06c1 \u0633\u0645\u062c\u06be\u0646\u06d2 \u0633\u06d2 \u0622\u06af\u06d2 \u0646\u06a9\u0644 \u06af\u0626\u06d2 \u06a9\u06c1 CLI \u06a9\u06cc\u0627 \u06c1\u06d2 \u062a\u06cc\u0646 \u0628\u062a\u062f\u0631\u06cc\u062c \u067e\u06cc\u0686\u06cc\u062f\u06c1 \u0679\u0648\u0644\u0632 \u0628\u0646\u0627\u0646\u0627 \u0627\u0648\u0631 \u0627\u0646\u06c1\u06cc\u06ba \u067e\u0627\u0646\u0686 \u0645\u062e\u062a\u0644\u0641 \u0686\u06cc\u0646\u0644\u0632 \u067e\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u0646\u0627\u06d4<\/p>\n<p>\u0628\u0646\u06cc\u0627\u062f\u06cc \u0645\u06c1\u0627\u0631\u062a\u06cc\u06ba - <code>args<\/code>\u060c <code>stdin<\/code>\u060c <code>stdout<\/code>\u060c <code>stderr<\/code>\u0627\u06cc\u06af\u0632\u0679 \u06a9\u0648\u0688\u060c \u0641\u0627\u0626\u0644 I\/O\u060c \u0627\u0648\u0631 \u067e\u0631\u0648\u0633\u06cc\u0633 \u062a\u062e\u0644\u06cc\u0642 \u0648\u06c1\u06cc \u0627\u062c\u0632\u0627\u0621 \u06c1\u06cc\u06ba \u062c\u06cc\u0633\u06d2 \u0679\u0648\u0644\u0632: <code>flutter<\/code>\u060c <code>git<\/code>\u0627\u0648\u0631 <code>dart<\/code> \u0627\u067e\u0646\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0628\u0646\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0628\u0627\u0642\u06cc \u0633\u0628 \u06a9\u0686\u06be \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u06c1\u06d2\u06d4<\/p>\n<p>\u062a\u06cc\u0646 CLIs \u062c\u0648 \u06c1\u0645 \u0646\u06d2 \u0628\u0646\u0627\u0626\u06d2 \u06c1\u06cc\u06ba (\u06c1\u06cc\u0644\u0648 CLI\u060c <code>dart_todo<\/code>\u0627\u0648\u0631 <code>dart_http<\/code>) \u06c1\u0631 \u0627\u06cc\u06a9 \u0627\u06cc\u06a9 \u0646\u0626\u06cc \u067e\u0631\u062a \u0645\u062a\u0639\u0627\u0631\u0641 \u06a9\u0631\u0627\u062a\u0627 \u06c1\u06d2: \u062e\u0627\u0645 \u0688\u0627\u0631\u0679 \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f\u06cc \u0628\u0627\u062a\u06cc\u06ba\u06d4 <code>args<\/code> JSON \u0627\u0633\u062a\u0642\u0627\u0645\u062a \u0627\u0648\u0631 \u062d\u0642\u06cc\u0642\u06cc HTTP \u062a\u0639\u0627\u0645\u0644 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u067e\u06cc\u06a9\u06cc\u062c\u06d4 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u0633\u06cc\u06a9\u0634\u0646 \u0622\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u0648\u0627\u0636\u062d \u0631\u0627\u0633\u062a\u06c1 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u0627\u0633\u06d2 \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u06d2 \u0633\u0627\u0645\u0646\u06d2 \u0622\u0634\u06a9\u0627\u0631 \u06a9\u0631\u06cc\u06ba \u062c\u0648 \u0622\u067e \u062c\u0648 \u0628\u06be\u06cc \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0631\u06cc\u06ba \u06af\u06d2 \u0627\u0633\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<p>\u0688\u0627\u0631\u0679 CLI \u06a9\u06cc \u062a\u0631\u0642\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0637\u0627\u0642\u062a\u0648\u0631 \u0632\u0628\u0627\u0646 \u06c1\u06d2\u06d4 \u0645\u0636\u0628\u0648\u0637 \u0679\u0627\u0626\u067e\u0646\u06af\u060c \u063a\u06cc\u0631 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631 \u0633\u067e\u0648\u0631\u0679\u060c \u0645\u0642\u0627\u0645\u06cc \u062a\u0627\u0644\u06cc\u0641\u060c \u0627\u0648\u0631 pub.dev \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0646\u0638\u0627\u0645 \u0627\u0633\u06d2 \u0645\u0648\u0628\u0627\u0626\u0644 \u0627\u06cc\u067e\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0633\u0627\u062a\u06be \u0688\u0648\u06cc\u0644\u067e\u0631 \u0679\u0648\u0644\u0632 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u0627\u0646\u062a\u062e\u0627\u0628 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0644\u0627 \u0645\u0631\u062d\u0644\u06c1 \u06a9\u0686\u06be \u0627\u06cc\u0633\u0627 \u0628\u0646\u0627\u0646\u0627 \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u06cc\u0627 \u0622\u067e \u06a9\u06cc \u0679\u06cc\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc \u0645\u0633\u0626\u0644\u06c1 \u062d\u0644 \u06a9\u0631\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u062c\u0627\u0631\u06cc \u06a9\u0631\u06d2\u06d4<\/p>\n<p>\u06a9\u0648\u0688\u0646\u06af \u06a9\u0627 \u0645\u0632\u06c1 \u0644\u06cc\u06ba !!<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0688\u0648\u06cc\u0644\u067e\u0631 \u0627\u067e\u0646\u06d2 \u062f\u0646 \u06a9\u0627 \u0627\u06cc\u06a9 \u0627\u06c1\u0645 \u062d\u0635\u06c1 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0645\u06cc\u06ba \u06af\u0632\u0627\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0648\u06c1 \u0686\u0644\u0627\u062a\u06d2 \u06c1\u06cc\u06ba flutter build\u062f\u06be\u06a9\u0627 git\u067e\u06cc\u06a9\u06cc\u062c \u0645\u06cc\u0646\u062c\u0645\u0646\u0679 dart pub\u06a9\u0645\u0627\u0646\u0688 \u0644\u0627\u0626\u0646 \u0633\u06d2 \u0627\u067e\u0646\u06cc \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u06a9\u0648 \u0679\u06cc\u0648\u0646 \u06a9\u0631\u06cc\u06ba\u06d4 \u06cc\u06c1 \u062a\u0645\u0627\u0645 \u0679\u0648\u0644\u0632 CLI \u06cc\u0627 \u06a9\u0645\u0627\u0646\u0688 \u0644\u0627\u0626\u0646 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u0627 \u067e\u0631\u0648\u06af\u0631\u0627\u0645 \u06c1\u06d2 \u062c\u0648 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0645\u06cc\u06ba \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2 \u0627\u0648\u0631 \u0679\u06cc\u06a9\u0633\u0679 \u06a9\u0645\u0627\u0646\u0688\u0632 \u06a9\u0627 \u062c\u0648\u0627\u0628 \u062f\u06cc\u062a\u0627 [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-23683","post","type-post","status-publish","format-standard","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/23683","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/comments?post=23683"}],"version-history":[{"count":0,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/23683\/revisions"}],"wp:attachment":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/media?parent=23683"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/categories?post=23683"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/tags?post=23683"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}