{"id":648,"date":"2026-09-06T11:53:13","date_gmt":"2026-09-06T14:53:13","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/2026\/09\/vibe-coding-linux-skills-ia-cli\/"},"modified":"2026-09-08T19:05:27","modified_gmt":"2026-09-08T22:05:27","slug":"vibe-coding-linux-skills-ia-cli","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/en\/2026\/09\/vibe-coding-linux-skills-ia-cli\/","title":{"rendered":"Vibe coding on Linux: four AI skills in the CLI"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" alt=\"Mascote LinuxPro instalando um m\u00f3dulo de mem\u00f3ria em um rack, com especifica\u00e7\u00e3o, terminal e browser no laborat\u00f3rio\" src=\"\/wp-content\/uploads\/2026\/09\/skills-ia-cli-ai-vibe-cli-v1.webp\" width=\"1486\" height=\"856\" \/><\/p>\n<p>Vibe coding in the CLI is fast until the agent forgets what you agreed on yesterday, rereads the entire repository with <code data-no-translation=\"\">grep<\/code> and clicks the cookie banner instead of the Save button. Four open-source tools \u2014 <a href=\"https:\/\/github.com\/vercel-labs\/agent-browser\">agent-browser<\/a>, <a href=\"https:\/\/github.com\/Fission-AI\/OpenSpec\">OpenSpec<\/a>, <a href=\"https:\/\/github.com\/DeusData\/codebase-memory-mcp\">codebase-memory-mcp<\/a> and <a href=\"https:\/\/github.com\/akitaonrails\/ai-memory\">ai-memory<\/a> \u2014 fill exactly those gaps: the browser, agreement before code, the repo map and memory across sessions and agents.<\/p>\n<p><!-- more --><\/p>\n<h2>What a skill is, in practice<\/h2>\n<p>In Grok, Claude Code, Codex and other terminal agents, a <em>skill<\/em> is a <code data-no-translation=\"\">SKILL.md<\/code> with instructions on when to use it, plus a CLI or an MCP server. The model does not \u201cknow\u201d your project: it reads the file, calls the tool and returns the result. Without a skill, vibe coding becomes chat. With a skill, it becomes a procedure.<\/p>\n<p>The four below complement each other. None replaces another. Together, the agent plans, finds the right code, remembers the previous session and checks the interface like a user. This blog\u2019s broader map of terminal assistants: <a href=\"\/en\/2026\/09\/assistentes-de-ia-no-terminal-linux\/\">AI assistants on the Linux terminal<\/a>. Local AI: <a href=\"\/en\/2026\/09\/rodando-ia-local-no-linux-com-ollama\/\">Ollama<\/a>.<\/p>\n<h2>OpenSpec: agree before generating code<\/h2>\n<p><a href=\"https:\/\/github.com\/Fission-AI\/OpenSpec\">OpenSpec<\/a> (Fission-AI, MIT, v1.12.0 in September 2026) is spec-driven development for agents. The philosophy fits on a card: fluid, iterative, built for brownfield. Each change gets a folder <code data-no-translation=\"\">openspec\/changes\/&lt;nome&gt;\/<\/code> with <code data-no-translation=\"\">proposal.md<\/code>, <code data-no-translation=\"\">specs\/<\/code>, <code data-no-translation=\"\">design.md<\/code> and <code data-no-translation=\"\">tasks.md<\/code> \u2014 plain Markdown, WHEN\/THEN scenarios, no DSL.<\/p>\n<p>The new workflow is <code data-no-translation=\"\">\/opsx:<\/code>:<\/p>\n<ul>\n<li><code data-no-translation=\"\">\/opsx:explore<\/code> \u2014 think with the agent, without committing to an artifact<\/li>\n<li><code data-no-translation=\"\">\/opsx:propose add-dark-mode<\/code> \u2014 create the change<\/li>\n<li><code data-no-translation=\"\">\/opsx:apply<\/code> \u2014 implement the checklist<\/li>\n<li><code data-no-translation=\"\">\/opsx:archive<\/code> \u2014 archive and update living specs<\/li>\n<\/ul>\n<p>Installation (Node.js 20.19+):<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">npm install -g @fission-ai\/openspec@latest\ncd seu-projeto\nopenspec init\nopenspec update   # depois de um upgrade, regenera as instru\u00e7\u00f5es do agente\n<\/code><\/pre>\n<p>What changes at work: the agent stops \u201cguessing the scope\u201d in the middle of the diff. You review the plan <em>before<\/em> the code. On a team, the same <code data-no-translation=\"\">openspec\/<\/code> goes into git; the Stores beta allows a specs-only repo shared across multiple codebases. Anonymous telemetry (command name and version) is disabled with <code data-no-translation=\"\">OPENSPEC_TELEMETRY=0<\/code>.<\/p>\n<p>This very site uses OpenSpec for blog changes. Without the change folder, the agent would rewrite old posts, alter slugs and break indexed URLs. With the spec, the rule stays in the repo, not in chat.<\/p>\n<h2>agent-browser: the agent actually clicks<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"Mascote LinuxPro testando uma interface de navegador em uma bancada Linux\" src=\"\/wp-content\/uploads\/2026\/09\/skills-ia-cli-browser-v2.webp\" width=\"1200\" height=\"675\" \/><\/p>\n<p><a href=\"https:\/\/github.com\/vercel-labs\/agent-browser\">agent-browser<\/a> is a browser automation CLI from Vercel Labs, a native binary in <a href=\"\/en\/2026\/09\/a-historia-da-linguagem-rust\/\">Rust<\/a>, Apache-2.0, v0.36.0 (1\u00ba September 2026). It is not Playwright in Node: the daemon speaks CDP with Chrome for Testing. The trick for the model is <code data-no-translation=\"\">snapshot<\/code> \u2014 an accessibility tree with refs <code data-no-translation=\"\">@e2<\/code>, <code data-no-translation=\"\">@e3<\/code>. The agent clicks the ref, not the selector that broke last sprint.<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">npm install -g agent-browser\nagent-browser install --with-deps   # Linux: Chrome + libs do sistema\n\nagent-browser open https:\/\/www.linuxpro.com.br\nagent-browser snapshot -i           # s\u00f3 elementos interativos\nagent-browser click @e2\nagent-browser screenshot \/tmp\/home.png\nagent-browser close\n<\/code><\/pre>\n<p>In vibe coding this closes the loop: the agent starts the app, opens the page, fills out the form, takes a screenshot and compares. <code data-no-translation=\"\">screenshot --annotate<\/code> numbers the buttons; the same number works for clicking. It has MCP (<code data-no-translation=\"\">agent-browser mcp<\/code>), isolated sessions, an encrypted password vault (the LLM does not see the password), a domain allowlist and, on Linux, <code data-no-translation=\"\">doctor<\/code> to diagnose zombie daemons.<\/p>\n<p>Do not use this against third-party sites without permission. For <em>your<\/em> localhost, staging and theme smoke test, it is the Selenium the agent finally understands.<\/p>\n<h2>codebase-memory-mcp: the repo map, not grep<\/h2>\n<p><a href=\"https:\/\/github.com\/DeusData\/codebase-memory-mcp\">codebase-memory-mcp<\/a> (DeusData, MIT) indexes code into a persistent graph \u2014 functions, classes, HTTP routes, who calls whom. Tree-sitter in 162 languages, hybrid LSP in a handful of them, 15 MCP tools, a single binary, zero API keys. Code does not leave the machine. The preprint is on arXiv <a href=\"https:\/\/arxiv.org\/abs\/2603.27277\">2603.27277<\/a>.<\/p>\n<p>The number that matters in vibe coding: five structural queries ~3.400 tokens versus ~412.000 in the back-and-forth of <code data-no-translation=\"\">grep<\/code>\/<code data-no-translation=\"\">read<\/code> (99%). Linux kernel (28M LOC) indexes in about 3 minutes on the M3; an average repo, in milliseconds. 3D UI at <code data-no-translation=\"\">http:\/\/localhost:9749<\/code>.<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">curl -fsSL https:\/\/raw.githubusercontent.com\/DeusData\/codebase-memory-mcp\/main\/install.sh | bash\n# reinicie o agente; pe\u00e7a \"index this project\"\n<\/code><\/pre>\n<p>The installer detects Claude Code, Codex, Grok, Cursor, Gemini CLI and dozens of others. Three agent tiers (Scout, Verify, Auditor) prevent the model from claiming \u201cthere is no caller\u201d without looking at the graph. For everyday use: \u201cwhat calls <code data-no-translation=\"\">ProcessOrder<\/code>?\u201d, \u201cwhat is the impact of this diff?\u201d, \u201cwhere is the dead code?\u201d. Without this, vibe coding hallucinates a helper that already exists three folders away.<\/p>\n<h2>ai-memory: the next session starts at the right point<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"Mascote LinuxPro transportando uma caixa de mem\u00f3ria persistente entre esta\u00e7\u00f5es de agentes em uma sala de servidores\" src=\"\/wp-content\/uploads\/2026\/09\/skills-ia-cli-ai-memory.webp\" width=\"1200\" height=\"675\" \/><\/p>\n<p><a href=\"https:\/\/github.com\/akitaonrails\/ai-memory\">ai-memory<\/a>, created by F\u00e1bio Akita and distributed under MIT, is long-term memory for coding agents. It connects Claude Code, Codex, OpenCode, Cursor, Gemini CLI, Grok and other clients to the same knowledge base: you can stop an agent mid-task and continue with another on the same project without reexplaining the architecture, failed attempts and pending work.<\/p>\n<p>The design is simple and auditable: lifecycle hooks capture sanitized observations; at the end of the session they can become Markdown pages in a wiki; search, briefing and handoff retrieve context in the next session. The wiki is the source of truth and the index is derived from it. Capture, text search and handoffs work without an API key or mandatory LLM calls; a provider is optional for summaries and semantic search.<\/p>\n<p>To install the local service and configure privacy, MCP and hooks on Linux, follow the complete guide: <a href=\"\/en\/2026\/09\/ai-memory-instalar-configurar-agentes-linux\/\">ai-memory: install persistent memory for agents on Linux<\/a>. After initializing the service, integrating a client is brief:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\"># OpenAI Codex\nai-memory install-mcp --client codex --apply\nai-memory install-hooks --agent codex --apply\n\n# reinicie o cliente e continue a tarefa normalmente\n<\/code><\/pre>\n<p>In everyday use, hooks handle capture; to resume, just ask \u201cwhere did we leave off?\u201d or search for a project decision. Handoff is explicit: one session leaves the baton and the next picks it up exactly once. On teams or across multiple machines, the same instance can share knowledge by project while keeping personal handoffs separate.<\/p>\n<p>Do not confuse it with codebase-memory: that answers questions about structures and relationships in <em>source code<\/em>; ai-memory preserves the context of <em>work<\/em> \u2014 decisions, tools used, attempts and next steps. Together they prevent both endless <code data-no-translation=\"\">grep<\/code> and endless reexplanation.<\/p>\n<h2>How to fit all four into the workflow<\/h2>\n<p>A typical feature cycle on Linux:<\/p>\n<ol>\n<li><strong>OpenSpec<\/strong> \u2014 <code data-no-translation=\"\">\/opsx:explore<\/code> and <code data-no-translation=\"\">\/opsx:propose<\/code>. You read the <code data-no-translation=\"\">proposal.md<\/code> and only then ask for implementation.<\/li>\n<li><strong>codebase-memory<\/strong> \u2014 the agent asks the graph who touches the route, instead of opening 40 files.<\/li>\n<li><strong>ai-memory<\/strong> \u2014 the next session already knows the change is in <code data-no-translation=\"\">openspec\/changes\/\u2026<\/code>, what broke in yesterday\u2019s test and who left the handoff.<\/li>\n<li><strong>agent-browser<\/strong> \u2014 start the app, <code data-no-translation=\"\">open<\/code>, <code data-no-translation=\"\">snapshot<\/code>, click, take screenshots, compare desktop and mobile.<\/li>\n<\/ol>\n<p>Install according to what hurts today. If the agent loses decisions across sessions or clients, start with ai-memory. If it invents an API that already exists, use codebase-memory. If the PR passes unit tests but breaks the button in Chrome, use agent-browser. If scope expands mid-chat, use OpenSpec.<\/p>\n<p>Ground-level requirements: Node 20.19+ (OpenSpec), Chrome for Testing (agent-browser), C binary (codebase-memory). Everything runs on Linux amd64\/arm64. The terminal agent \u2014 Grok, Claude Code, Codex, Gemini CLI \u2014 is the orchestrator; skills are the hands.<\/p>\n<h2>Wrap-up<\/h2>\n<p>Vibe coding without a spec is improvisation. Without a graph it is expensive grep. Without memory it is amnesia. Without a browser it is \u201cworks in my headless\u201d. The four skills do not make the model smarter; they make the <em>work<\/em> verifiable. Git remains the source of truth \u2014 the history: <a href=\"\/en\/2026\/09\/a-historia-do-git\/\">The history of Git<\/a>.<\/p>\n<p>Repositories: <a href=\"https:\/\/github.com\/Fission-AI\/OpenSpec\">OpenSpec<\/a> \u00b7 <a href=\"https:\/\/github.com\/vercel-labs\/agent-browser\">agent-browser<\/a> \u00b7 <a href=\"https:\/\/github.com\/DeusData\/codebase-memory-mcp\">codebase-memory-mcp<\/a> \u00b7 <a href=\"https:\/\/github.com\/akitaonrails\/ai-memory\">ai-memory<\/a>. To get memory running on Linux, see the <a href=\"\/en\/2026\/09\/ai-memory-instalar-configurar-agentes-linux\/\">ai-memory installation and configuration guide<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Vibe coding in the CLI is fast until the agent forgets what you agreed on yesterday, rereads the entire repository with grep, and clicks the cookie banner instead of Save. Four open source tools \u2014 agent-browser, OpenSpec, codebase-memory-mcp, and ai-memory \u2014 fill precisely those gaps: the browser, the agreement before the code, \u2026 <a title=\"Vibe coding on Linux: four AI skills in the CLI\" class=\"read-more\" href=\"https:\/\/www.linuxpro.com.br\/en\/2026\/09\/vibe-coding-linux-skills-ia-cli\/\" aria-label=\"Read more about Vibe coding no Linux: quatro skills de IA no CLI\">Read more<\/a><\/p>","protected":false},"author":0,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[45,115,2],"tags":[8,116,311,313,312],"class_list":["post-648","post","type-post","status-publish","format-standard","hentry","category-desenv","category-ia","category-linux","tag-cli","tag-ia","tag-mcp","tag-openspec","tag-skills"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/648","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/comments?post=648"}],"version-history":[{"count":4,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/648\/revisions"}],"predecessor-version":[{"id":1472,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/648\/revisions\/1472"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/media?parent=648"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/categories?post=648"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/tags?post=648"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}