{"id":1924,"date":"2025-12-18T15:09:57","date_gmt":"2025-12-18T22:09:57","guid":{"rendered":"http:\/\/10kdev.net\/?p=1924"},"modified":"2025-12-18T15:26:38","modified_gmt":"2025-12-18T22:26:38","slug":"creating-a-cli-language-choices","status":"publish","type":"post","link":"http:\/\/10kdev.net\/?p=1924","title":{"rendered":"Creating a CLI: Language Choices"},"content":{"rendered":"<p>After a lot of my work with gathering JIRA data, I&#8217;ve had to go an use the API from PostMan or execute a script more often than now, as opposed to using AI.\u00a0 Even with Claude, Amazon, Rovo, and Gemini &#8212; many times will be given a script to execute because the AI&#8217;s cannot use my credentials or cannot do a two-step process like gather info, then iterate through that info&#8211;&gt; needed arest + code solution.<\/p>\n<p>Decided to give a shot at creating a simple JIRA CLI (apart from Atlassian&#8217;s, which requires special permissions) based on these APIs and scripts I&#8217;ve been creating.<\/p>\n<p>The first thing I am curious about is what language is best to develop a CLI with.\u00a0 Considerations are easy cross-platform deployability, and less set-up (like needing a special version or a code platform).\u00a0 Also, I intend to vide-code mosst of this and do some conversions so would not like any crazy languages as suggestions.<\/p>\n<p>I asked AI.<\/p>\n<hr \/>\n<h1>&#8220;Best&#8221; Language to Write a CLI?<\/h1>\n<p>Here is a summary that Gemini in GDocs created from Q, Claude, and Gemini results when asked about the &#8220;best&#8221; code platform to write a CLI:<\/p>\n<div class=\"appsElementsSidekickAgentMessageRoot\" role=\"listitem\" data-generation-index=\"1\" data-session-id=\"goog_-102166434\">\n<div class=\"appsElementsSidekickAgentMessageBubbleContent \" dir=\"auto\">\n<div>\n<blockquote>\n<div>\n<p><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"2\">Best Language for CLI Development<\/span><\/strong><\/p>\n<div class=\"appsElementsGenerativeaiAstNewlineWrapper appsElementsGenerativeaiAstAnimated\"><\/div>\n<p><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"3\">The document recommends\u00a0<\/span><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"4\">Go (Golang)<\/span><\/strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"5\">\u00a0as the top choice for professional, cross-platform CLIs.<\/span><\/p>\n<ul class=\"appsElementsGenerativeaiAstList\">\n<li class=\"appsElementsGenerativeaiAstAnimated\"><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"6\">Go (Recommended):<\/span><\/strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"7\">\u00a0The &#8220;industry standard&#8221; due to its ability to compile to a\u00a0<\/span><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"8\">single static binary<\/span><\/strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"9\">, which makes distribution incredibly simple, as the end-user does not need to install a runtime environment (like Python or Node.js).<\/span><\/li>\n<li class=\"appsElementsGenerativeaiAstAnimated\"><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"10\">Rust:<\/span><\/strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"11\">\u00a0The &#8220;performance powerhouse,&#8221; ideal for system tools and high-performance applications, also offering excellent distribution via static binaries but with a steeper learning curve.<\/span><\/li>\n<li class=\"appsElementsGenerativeaiAstAnimated\"><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"12\">Python:<\/span><\/strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"13\">\u00a0The &#8220;king of prototyping,&#8221; favored for rapid development and automation, despite distribution being more difficult due to the requirement of a Python runtime and managing dependencies.<\/span><\/li>\n<\/ul>\n<p><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"14\">Languages for Specific CLIs<\/span><\/strong><\/p>\n<div class=\"appsElementsGenerativeaiAstNewlineWrapper appsElementsGenerativeaiAstAnimated\"><\/div>\n<p><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"15\">The document details the languages used by several major CLI tools, which often reflects a balance between the speed of development and ease of distribution:<\/span><\/p>\n<div class=\"appsElementsGenerativeaiAstTableContainer\">\n<table class=\"appsElementsGenerativeaiAstTable\">\n<thead>\n<tr>\n<th>CLI Tool<\/th>\n<th>Primary Language(s)<\/th>\n<th>Key Distribution Factor<\/th>\n<th>Note on Amazon Q CLI<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong><span data-ast-node-id=\"16\">AWS CLI<\/span><\/strong><span data-ast-node-id=\"17\">\u00a0(Amazon&#8217;s primary tool)<\/span><\/td>\n<td><strong><span data-ast-node-id=\"18\">Python<\/span><\/strong><\/td>\n<td><span data-ast-node-id=\"19\">V2 is distributed as a self-contained installer that\u00a0<\/span><strong><span data-ast-node-id=\"20\">bundles its own Python runtime<\/span><\/strong><span data-ast-node-id=\"21\">, giving it a single-file-like feel.<\/span><\/td>\n<td><span data-ast-node-id=\"22\">The document does not specify\u00a0<\/span><strong><span data-ast-node-id=\"23\">Amazon Q CLI<\/span><\/strong><span data-ast-node-id=\"24\">, but the highly relevant AWS CLI is Python-based.<\/span><\/td>\n<\/tr>\n<tr>\n<td><strong><span data-ast-node-id=\"25\">Claude Code (CLI)<\/span><\/strong><\/td>\n<td><strong><span data-ast-node-id=\"26\">TypeScript\/Node.js<\/span><\/strong><\/td>\n<td><span data-ast-node-id=\"27\">Distributed via NPM or self-contained installers that can bundle Node.js.<\/span><\/td>\n<td><span data-ast-node-id=\"28\">The latest version of Anthropic&#8217;s open-source tool is primarily written this way.<\/span><\/td>\n<\/tr>\n<tr>\n<td><strong><span data-ast-node-id=\"29\">Gemini CLI<\/span><\/strong><\/td>\n<td><strong><span data-ast-node-id=\"30\">TypeScript\/Node.js<\/span><\/strong><\/td>\n<td><span data-ast-node-id=\"31\">Distributed via NPM, Homebrew, or\u00a0<\/span><code class=\"appsElementsGenerativeaiAstInlineCode\">npx<\/code><span data-ast-node-id=\"33\">, requiring Node.js 20+ for installation via NPM.<\/span><\/td>\n<td><span data-ast-node-id=\"34\">This is based on the open-source\u00a0<\/span><code class=\"appsElementsGenerativeaiAstInlineCode\">google-gemini\/gemini-cli<\/code><span data-ast-node-id=\"36\">\u00a0repository.<\/span><\/td>\n<\/tr>\n<tr>\n<td><strong><span data-ast-node-id=\"37\">KIRO CLI<\/span><\/strong><\/td>\n<td><strong><span data-ast-node-id=\"38\">TypeScript\/Node.js<\/span><\/strong><\/td>\n<td><span data-ast-node-id=\"39\">Leverages the NPM ecosystem for development.<\/span><\/td>\n<td><span data-ast-node-id=\"40\">This is a third-party AI CLI tool.<\/span><\/td>\n<\/tr>\n<tr>\n<td><strong><span data-ast-node-id=\"41\">GitHub CLI<\/span><\/strong><\/td>\n<td><strong><span data-ast-node-id=\"42\">Go<\/span><\/strong><\/td>\n<td><span data-ast-node-id=\"43\">Follows the industry standard for easy distribution via a single binary.<\/span><\/td>\n<td><span data-ast-node-id=\"44\">Mentioned as an example of a popular modern CLI written in Go.<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/blockquote>\n<\/div>\n<\/div>\n<div class=\"appsElementsSidekickResponseOptionsContainer\" data-animate-render-final=\"true\" data-response-buttons-sizing-container=\"true\">\n<div>I found it curious that Gemini didn&#8217;t add TypeScript\/Node.js to the list of best choices, being that Claude, Gemini, and KIRO are all writting in that.<\/div>\n<\/div>\n<\/div>\n<div><\/div>\n<div>Here is what Gemini had to say:<\/div>\n<div>\n<div class=\"appsElementsSidekickUserMessageRoot\" role=\"listitem\">\n<div>\n<div class=\"appsElementsSidekickUserMessageContainer\" role=\"heading\" aria-level=\"3\" data-unused-id=\"ucc-76\">\n<blockquote>\n<div class=\"appsElementsSidekickUserMessageBubble\"><em><strong><span class=\"appsElementsSidekickUserMessageBubbleContent appsElementsSidekickUserMessageBubbleCollapsed\" dir=\"auto\">Why isn&#8217;t TypeScript\/Node.js a top choice?<\/span><\/strong><\/em><\/div>\n<\/blockquote>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"appsElementsSidekickAgentMessageRoot\" role=\"listitem\" data-generation-index=\"3\" data-session-id=\"goog_-102166434\">\n<div class=\"appsElementsSidekickAgentMessageBubbleContent \" dir=\"auto\">\n<div>\n<blockquote>\n<div>\n<p><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"0\">TypeScript\/Node.js is not generally considered the\u00a0<\/span><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"1\">top<\/span><\/strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"2\">\u00a0choice for all CLIs (compared to Go or Rust) primarily due to\u00a0<\/span><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"3\">distribution and runtime requirements<\/span><\/strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"4\">.<\/span><\/p>\n<p><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"5\">The document highlights the following downsides:<\/span><\/p>\n<ul class=\"appsElementsGenerativeaiAstList\">\n<li class=\"appsElementsGenerativeaiAstAnimated\"><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"6\">Requires a Runtime:<\/span><\/strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"7\">\u00a0An end-user must have the\u00a0<\/span><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"8\">Node.js runtime<\/span><\/strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"9\">\u00a0installed on their system to run a standard Node.js\/TypeScript CLI, which adds a dependency for the user. Go and Rust, in contrast, compile to a\u00a0<\/span><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"10\">single static binary<\/span><\/strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"11\">\u00a0that runs directly without needing an interpreter or runtime.<\/span><\/li>\n<li class=\"appsElementsGenerativeaiAstAnimated\"><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"12\">Perceived &#8220;Heaviness&#8221;:<\/span><\/strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"13\">\u00a0The necessary Node.js dependencies, often contained in a large\u00a0<\/span><code class=\"appsElementsGenerativeaiAstInlineCode\">node_modules<\/code><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"15\">\u00a0folder, can make the tool feel &#8220;heavy&#8221; compared to a self-contained Go or Rust binary.<\/span><\/li>\n<li class=\"appsElementsGenerativeaiAstAnimated\"><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"16\">Larger Memory Footprint:<\/span><\/strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"17\">\u00a0The Node.js runtime environment generally has a larger memory footprint than a native executable.<\/span><\/li>\n<\/ul>\n<p><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"18\">Despite these drawbacks, the language is still an\u00a0<\/span><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"19\">excellent choice<\/span><\/strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"20\">\u00a0for specific use cases, such as:<\/span><\/p>\n<ul class=\"appsElementsGenerativeaiAstList\">\n<li class=\"appsElementsGenerativeaiAstAnimated\"><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"21\">Tools for the web development ecosystem.<\/span><\/li>\n<li class=\"appsElementsGenerativeaiAstAnimated\"><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"22\">Projects that need to leverage the massive\u00a0<\/span><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"23\">NPM ecosystem<\/span><\/strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"24\">\u00a0and existing JavaScript\/TypeScript tooling.<\/span><\/li>\n<li class=\"appsElementsGenerativeaiAstAnimated\"><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"25\">Tools where the development team is already familiar with JavaScript\/TypeScript.<\/span><\/li>\n<\/ul>\n<p><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"26\">In modern distributions (like AWS CLI v2 or the Claude Code CLI), this downside is sometimes mitigated by shipping the CLI with an\u00a0<\/span><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"27\">embedded runtime<\/span><\/strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"28\"> so the end-user doesn&#8217;t have to install Node.js separately.<\/span><\/p>\n<\/div>\n<\/blockquote>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"appsElementsSidekickAgentMessageRoot\" role=\"listitem\" data-generation-index=\"1\" data-session-id=\"goog_-102166434\">\n<div class=\"appsElementsSidekickResponseOptionsContainer\" data-animate-render-final=\"true\" data-response-buttons-sizing-container=\"true\">\n<hr \/>\n<h1>DevOps vs Developer CLI:<\/h1>\n<p>&nbsp;<\/p>\n<h1>Language Platforms Differ<\/h1>\n<div>Finally, I was seeing a bit of a pattern &#8211; Go is used (as mentioned by one AI) for <span style=\"font-weight: 400;\">Docker, Kubernetes, and Hugo.\u00a0 These are explicitely DevOps-oriented platforms, whereas the coding CLI&#8217;s would seem to be mostly used by developers. I asked Gemini about it:<\/span><\/div>\n<div><span style=\"font-weight: 400;\">\u00a0<\/span><\/div>\n<div class=\"appsElementsSidekickResponseOptionsFeedbackOptionContainer\" data-feedback-good-tooltip-id=\"ucc-62\" data-feedback-bad-tooltip-id=\"ucc-63\">\n<div class=\"user-query-container\">\n<div id=\"user-query-content-2\" class=\"query-content ng-star-inserted\">\n<div class=\"query-text gds-body-l\" dir=\"ltr\" role=\"heading\" aria-level=\"2\">\n<blockquote>\n<p class=\"query-text-line ng-star-inserted\"><em><strong>So do devops CLIs tend to be written in GO, and application developer CLIs tend to be not written with Go?<\/strong><\/em><\/p>\n<\/blockquote>\n<\/div>\n<\/div>\n<\/div>\n<div>\n<div class=\"response-container ng-tns-c1991648948-25 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses\">\n<div class=\"presented-response-container ng-tns-c1991648948-25\">\n<div class=\"response-container-content ng-tns-c1991648948-25\">\n<div class=\"response-content ng-tns-c1991648948-25\">\n<div class=\"container\">\n<div id=\"model-response-message-contentr_b66584c9ceb9f7e8\" class=\"markdown markdown-main-panel tutor-markdown-rendering enable-updated-hr-color\" dir=\"ltr\" aria-live=\"polite\" aria-busy=\"false\">\n<blockquote>\n<p data-path-to-node=\"0\">That is a very accurate observation of the current landscape. There is a strong &#8220;language divide&#8221; between tools built to manage infrastructure (DevOps) and tools built for application developers.<\/p>\n<p data-path-to-node=\"1\">The primary reason for this split isn&#8217;t just aesthetic; it&#8217;s about\u00a0<b data-path-to-node=\"1\" data-index-in-node=\"67\">distribution constraints<\/b>\u00a0versus\u00a0<b data-path-to-node=\"1\" data-index-in-node=\"99\">ecosystem integration<\/b>.<\/p>\n<h2 data-path-to-node=\"3\">1. DevOps CLIs: The Reign of Go<\/h2>\n<p data-path-to-node=\"4\"><span class=\"citation-15\">If you look at the heavy hitters in DevOps\u2014<\/span><b data-path-to-node=\"4\" data-index-in-node=\"43\"><span class=\"citation-15\">Docker, Kubernetes, Terraform, Helm, and the GitHub CLI<\/span><\/b><span class=\"citation-15 citation-end-15\">\u2014they are almost all written in Go.<\/span><\/p>\n<ul data-path-to-node=\"5\">\n<li>\n<p data-path-to-node=\"5,0,0\"><b data-path-to-node=\"5,0,0\" data-index-in-node=\"0\">The Problem:<\/b>\u00a0DevOps tools often need to run on &#8220;clean&#8221; servers, inside bare-bones Docker containers, or on a colleague&#8217;s machine that doesn&#8217;t have any specific software installed.<\/p>\n<\/li>\n<li>\n<p data-path-to-node=\"5,1,0\"><b data-path-to-node=\"5,1,0\" data-index-in-node=\"0\"><span class=\"citation-14\">The Go Solution:<\/span><\/b><span class=\"citation-14\">\u00a0Go compiles to a\u00a0<\/span><b data-path-to-node=\"5,1,0\" data-index-in-node=\"34\"><span class=\"citation-14\">statically linked binary<\/span><\/b><span class=\"citation-14 citation-end-14\">.<\/span>\u00a0<span class=\"citation-13 citation-end-13\">This means the executable contains every single piece of code it needs to run.<\/span><\/p>\n<\/li>\n<li>\n<p data-path-to-node=\"5,2,0\"><b data-path-to-node=\"5,2,0\" data-index-in-node=\"0\">The Result:<\/b><span class=\"citation-12\">\u00a0You can just\u00a0<\/span><code data-path-to-node=\"5,2,0\" data-index-in-node=\"25\"><span class=\"citation-12\">curl<\/span><\/code><span class=\"citation-12 citation-end-12\">\u00a0a binary and run it.<\/span>\u00a0No &#8220;You need Python 3.9,&#8221; no &#8220;Your Node version is too old,&#8221; and no\u00a0<code data-path-to-node=\"5,2,0\" data-index-in-node=\"119\">pip install<\/code>\u00a0errors. For someone managing a server, this reliability is non-negotiable.<\/p>\n<\/li>\n<\/ul>\n<h3 data-path-to-node=\"6\">Core DevOps Stack (Go-Dominant)<\/h3>\n<ul data-path-to-node=\"7\">\n<li>\n<p data-path-to-node=\"7,0,0\"><b data-path-to-node=\"7,0,0\" data-index-in-node=\"0\"><span class=\"citation-11\">Docker:<\/span><\/b><span class=\"citation-11 citation-end-11\">\u00a0(Go)<\/span><\/p>\n<\/li>\n<li>\n<p data-path-to-node=\"7,1,0\"><b data-path-to-node=\"7,1,0\" data-index-in-node=\"0\"><span class=\"citation-10\">Kubernetes (kubectl):<\/span><\/b><span class=\"citation-10 citation-end-10\">\u00a0(Go)<\/span><\/p>\n<\/li>\n<li>\n<p data-path-to-node=\"7,2,0\"><b data-path-to-node=\"7,2,0\" data-index-in-node=\"0\"><span class=\"citation-9\">Terraform:<\/span><\/b><span class=\"citation-9 citation-end-9\">\u00a0(Go)<\/span><\/p>\n<\/li>\n<li>\n<p data-path-to-node=\"7,3,0\"><b data-path-to-node=\"7,3,0\" data-index-in-node=\"0\"><span class=\"citation-8\">Prometheus:<\/span><\/b><span class=\"citation-8 citation-end-8\">\u00a0(Go)<\/span><\/p>\n<\/li>\n<li>\n<p data-path-to-node=\"7,4,0\"><b data-path-to-node=\"7,4,0\" data-index-in-node=\"0\">GitHub CLI (<code data-path-to-node=\"7,4,0\" data-index-in-node=\"12\">gh<\/code>):<\/b>\u00a0(Go)<\/p>\n<\/li>\n<\/ul>\n<h2 data-path-to-node=\"9\">2. Developer CLIs: The NPM &amp; Python World<\/h2>\n<p data-path-to-node=\"10\">When a CLI is meant for\u00a0<b data-path-to-node=\"10\" data-index-in-node=\"24\">Application Developers<\/b>\u00a0(especially Web or AI developers), the language choice usually shifts to\u00a0<b data-path-to-node=\"10\" data-index-in-node=\"120\">TypeScript (Node.js)<\/b>\u00a0or\u00a0<b data-path-to-node=\"10\" data-index-in-node=\"144\">Python<\/b>.<\/p>\n<ul data-path-to-node=\"11\">\n<li>\n<p data-path-to-node=\"11,0,0\"><b data-path-to-node=\"11,0,0\" data-index-in-node=\"0\">The Reason:<\/b>\u00a0These tools live where the developers already spend their time.<\/p>\n<\/li>\n<li>\n<p data-path-to-node=\"11,1,0\"><b data-path-to-node=\"11,1,0\" data-index-in-node=\"0\">Ecosystem Symbiosis:<\/b>\u00a0If you are a frontend dev, you already have Node installed. If you are an AI researcher, you already have Python. Forcing these users to learn Go just to contribute to a CLI&#8217;s codebase would create a &#8220;contribution tax.&#8221;<\/p>\n<\/li>\n<li>\n<p data-path-to-node=\"11,2,0\"><b data-path-to-node=\"11,2,0\" data-index-in-node=\"0\">Rich UI Libraries:<\/b>\u00a0TypeScript has libraries like\u00a0<b data-path-to-node=\"11,2,0\" data-index-in-node=\"49\">Ink<\/b>\u00a0(which lets you build CLI layouts using React components), making it much easier to build the highly interactive, colorful UIs that modern app devs expect (like the Gemini or Claude CLIs).<\/p>\n<\/li>\n<\/ul>\n<h3 data-path-to-node=\"12\">Developer Tooling Stack (Node\/Python Dominant)<\/h3>\n<ul data-path-to-node=\"13\">\n<li>\n<p data-path-to-node=\"13,0,0\"><b data-path-to-node=\"13,0,0\" data-index-in-node=\"0\">Vercel \/ Netlify CLIs:<\/b>\u00a0(TypeScript\/Node)<\/p>\n<\/li>\n<li>\n<p data-path-to-node=\"13,1,0\"><b data-path-to-node=\"13,1,0\" data-index-in-node=\"0\">Claude Code:<\/b>\u00a0(TypeScript\/Node)<\/p>\n<\/li>\n<li>\n<p data-path-to-node=\"13,2,0\"><b data-path-to-node=\"13,2,0\" data-index-in-node=\"0\">AWS CLI:<\/b>\u00a0(Python)<\/p>\n<\/li>\n<li>\n<p data-path-to-node=\"13,3,0\"><b data-path-to-node=\"13,3,0\" data-index-in-node=\"0\">Gemini CLI:<\/b>\u00a0(TypeScript)<\/p>\n<\/li>\n<li>\n<p data-path-to-node=\"13,4,0\"><b data-path-to-node=\"13,4,0\" data-index-in-node=\"0\">Firebase CLI:<\/b>\u00a0(TypeScript\/Node)<\/p>\n<\/li>\n<\/ul>\n<h2 data-path-to-node=\"15\">Summary: Go vs. The Rest<\/h2>\n<div class=\"horizontal-scroll-wrapper\">\n<div class=\"table-block-component\">\n<div class=\"table-block has-export-button\">\n<div class=\"table-content not-end-of-paragraph\">\n<table data-path-to-node=\"16\">\n<thead>\n<tr>\n<td><span data-path-to-node=\"16,0,0,0\">Feature<\/span><\/td>\n<td><span data-path-to-node=\"16,0,1,0\">DevOps (Go)<\/span><\/td>\n<td><span data-path-to-node=\"16,0,2,0\">App Dev (TS \/ Python)<\/span><\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><span data-path-to-node=\"16,1,0,0\"><b data-path-to-node=\"16,1,0,0\" data-index-in-node=\"0\">Main Priority<\/b><\/span><\/td>\n<td><span data-path-to-node=\"16,1,1,0\">&#8220;Just work&#8221; on any server<\/span><\/td>\n<td><span data-path-to-node=\"16,1,2,0\">Integration with dev workflow<\/span><\/td>\n<\/tr>\n<tr>\n<td><span data-path-to-node=\"16,2,0,0\"><b data-path-to-node=\"16,2,0,0\" data-index-in-node=\"0\">Install Method<\/b><\/span><\/td>\n<td><span data-path-to-node=\"16,2,1,0\">Download a single file<\/span><\/td>\n<td><span data-path-to-node=\"16,2,2,0\"><code data-path-to-node=\"16,2,2,0\" data-index-in-node=\"0\">npm install<\/code>\u00a0or\u00a0<code data-path-to-node=\"16,2,2,0\" data-index-in-node=\"15\">pip install<\/code><\/span><\/td>\n<\/tr>\n<tr>\n<td><span data-path-to-node=\"16,3,0,0\"><b data-path-to-node=\"16,3,0,0\" data-index-in-node=\"0\">Runtime<\/b><\/span><\/td>\n<td><span data-path-to-node=\"16,3,1,0\">None required (Built-in)<\/span><\/td>\n<td><span data-path-to-node=\"16,3,2,0\">Needs Node or Python installed<\/span><\/td>\n<\/tr>\n<tr>\n<td><span data-path-to-node=\"16,4,0,0\"><b data-path-to-node=\"16,4,0,0\" data-index-in-node=\"0\">Startup Time<\/b><\/span><\/td>\n<td><span data-path-to-node=\"16,4,1,0\">Near-instant<\/span><\/td>\n<td><span data-path-to-node=\"16,4,2,0\">Small delay (Interpreter boot)<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div class=\"table-footer hide-from-message-actions ng-star-inserted\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<h3 data-path-to-node=\"18\">The &#8220;Hybrid&#8221; Exception<\/h3>\n<p data-path-to-node=\"19\">You will occasionally see a shift toward\u00a0<b data-path-to-node=\"19\" data-index-in-node=\"41\">Rust<\/b>\u00a0for both groups (like the\u00a0<b data-path-to-node=\"19\" data-index-in-node=\"72\">Bun<\/b>\u00a0runtime or\u00a0<b data-path-to-node=\"19\" data-index-in-node=\"87\">Oxc<\/b>). Rust offers the &#8220;single binary&#8221; benefit of Go but with even higher performance and better safety. It is currently the &#8220;cool&#8221; choice for developers who want the portability of a DevOps tool but the high-end UX of an app-dev tool.<\/p>\n<\/blockquote>\n<\/div>\n<\/div>\n<\/div>\n<hr \/>\n<h1 data-path-to-node=\"19\">Direction<\/h1>\n<p data-path-to-node=\"19\">Finally, for my purposes &#8212; writing a quick JIRA CLI, asking Gemini for a recommendation considering my bulk-operation need:<\/p>\n<\/div>\n<p data-path-to-node=\"19\"><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"28\">Language Comparison for a Bulk JIRA CLI<\/span><\/strong><\/p>\n<div class=\"appsElementsGenerativeaiAstTableContainer\">\n<table class=\"appsElementsGenerativeaiAstTable\">\n<thead>\n<tr>\n<th>Language<\/th>\n<th>Strengths (For JIRA CLI)<\/th>\n<th>Weaknesses (For Bulk Operations\/Distribution)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong><span data-ast-node-id=\"29\">Go (Golang)<\/span><\/strong><\/td>\n<td><strong><span data-ast-node-id=\"30\">Superior for Bulk Operations<\/span><\/strong><span data-ast-node-id=\"31\">\u00a0(Goroutines for parallel API calls);\u00a0<\/span><strong><span data-ast-node-id=\"32\">Excellent Distribution<\/span><\/strong><span data-ast-node-id=\"33\">\u00a0(Single static binary).<\/span><\/td>\n<td><span data-ast-node-id=\"34\">Terminal UI\/TUI libraries may be less mature than Node.js&#8217;s; Less native JSON handling than TypeScript.<\/span><\/td>\n<\/tr>\n<tr>\n<td><strong><span data-ast-node-id=\"35\">Python<\/span><\/strong><\/td>\n<td><span data-ast-node-id=\"36\">Rapid development, familiar for data handling.<\/span><\/td>\n<td><strong><span data-ast-node-id=\"37\">Not ideal for high-speed parallel API calls<\/span><\/strong><span data-ast-node-id=\"38\">\u00a0(Global Interpreter Lock);\u00a0<\/span><strong><span data-ast-node-id=\"39\">Difficult Distribution<\/span><\/strong><span data-ast-node-id=\"40\">\u00a0(Requires Python runtime\/dependencies).<\/span><\/td>\n<\/tr>\n<tr>\n<td><strong><span data-ast-node-id=\"41\">TypeScript\/Node.js<\/span><\/strong><\/td>\n<td><span data-ast-node-id=\"42\">Excellent for\u00a0<\/span><strong><span data-ast-node-id=\"43\">highly interactive<\/span><\/strong><span data-ast-node-id=\"44\">\u00a0CLIs (TUIs); Easy to implement concurrency (<\/span><code class=\"appsElementsGenerativeaiAstInlineCode\">Promise.all<\/code><span data-ast-node-id=\"46\">).<\/span><\/td>\n<td><strong><span data-ast-node-id=\"47\">&#8220;Cold Start&#8221; overhead<\/span><\/strong><span data-ast-node-id=\"48\">;\u00a0<\/span><strong><span data-ast-node-id=\"49\">Distribution headache<\/span><\/strong><span data-ast-node-id=\"50\">\u00a0(Requires Node.js runtime), Slower for high-CPU data manipulation.<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p data-path-to-node=\"19\"><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"52\">The Verdict:<\/span><\/strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"53\">\u00a0Choose\u00a0<\/span><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"54\">Go<\/span><\/strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"55\">\u00a0if you want a fast, portable utility that feels like a native system command and can handle massive bulk operations. Choose\u00a0<\/span><strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"56\">TypeScript<\/span><\/strong><span class=\"appsElementsGenerativeaiAstAnimated\" data-ast-node-id=\"57\">\u00a0if your priority is building a highly interactive, menu-driven tool.<\/span><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"mynah-chat-items-container\" data-testid=\"chat-chat-items-container\">\n<div class=\"mynah-chat-items-conversation-container\" data-testid=\"chat-chat-items-conversation-container\">\n<div class=\"full-width mynah-chat-item-card-status-default mynah-chat-item-card-content-horizontal-align-default mynah-chat-item-card mynah-chat-item-answer reveal mynah-chat-item-collapsed\" data-testid=\"chat-item-answer-stream\">\n<div class=\"mynah-chat-item-followup-question\" data-testid=\"chat-item-followup-wrapper\">\n<div class=\"mynah-chat-item-followup-question-options-wrapper\" data-testid=\"chat-item-followup-options-wrapper\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"more-content-indicator\">I am also given the exact steps to proceed.<\/div>\n<div><\/div>\n<div>Here is the raw information from the propmting,\u00a0 if you are more curious:<\/div>\n<div><a href=\"http:\/\/10kdev.net\/wp-content\/uploads\/2025\/12\/Best-CLI-Language-AI-Prompts.pdf\" target=\"_blank\" rel=\"noopener\">Best CLI Language AI Prompts<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>After a lot of my work with gathering JIRA data, I&#8217;ve had to go an use the API from PostMan or execute a script more often than now, as opposed to using AI.\u00a0 Even with Claude, Amazon, Rovo, and Gemini &#8212; many times will be given a script to execute because the AI&#8217;s cannot use [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[97,69],"tags":[],"_links":{"self":[{"href":"http:\/\/10kdev.net\/index.php?rest_route=\/wp\/v2\/posts\/1924"}],"collection":[{"href":"http:\/\/10kdev.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/10kdev.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/10kdev.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/10kdev.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1924"}],"version-history":[{"count":7,"href":"http:\/\/10kdev.net\/index.php?rest_route=\/wp\/v2\/posts\/1924\/revisions"}],"predecessor-version":[{"id":1934,"href":"http:\/\/10kdev.net\/index.php?rest_route=\/wp\/v2\/posts\/1924\/revisions\/1934"}],"wp:attachment":[{"href":"http:\/\/10kdev.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1924"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/10kdev.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1924"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/10kdev.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1924"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}