<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aleksandar Panic</title>
    <description>The latest articles on DEV Community by Aleksandar Panic (@aleksandar-panic-2am).</description>
    <link>https://dev.to/aleksandar-panic-2am</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4019785%2Fbad3a078-0689-46bd-bc3b-844454c0974d.png</url>
      <title>DEV Community: Aleksandar Panic</title>
      <link>https://dev.to/aleksandar-panic-2am</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aleksandar-panic-2am"/>
    <language>en</language>
    <item>
      <title>HAI: How to Get Your Team to Work Best with AI</title>
      <dc:creator>Aleksandar Panic</dc:creator>
      <pubDate>Wed, 05 Aug 2026 14:17:05 +0000</pubDate>
      <link>https://dev.to/2amtech/hai-how-to-get-your-team-to-work-best-with-ai-1231</link>
      <guid>https://dev.to/2amtech/hai-how-to-get-your-team-to-work-best-with-ai-1231</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3crcfvbdxtagl5v753pt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3crcfvbdxtagl5v753pt.png" alt="HAI" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your team is already using AI to write code. The problem is that everyone is doing it differently. One developer is in Claude Code, another in Copilot, someone on the new team swears by Cursor, and there is always one person on Codex. Each of them has set up their assistant by hand, with their own prompts, their own half-remembered configuration, and no shared idea of how the AI should approach a ticket.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So the result is inconsistent, the knowledge lives in people's heads, and none of the assistants can actually see the Jira ticket or the Confluence spec the work is based on. You end up pasting context into a chat window, over and over, for every assistant on the team.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hai.2am.tech" rel="noopener noreferrer"&gt;Helper AI (HAI)&lt;/a&gt; is a free, open-source npm CLI that gives your whole team one shared AI workflow, whatever editor each member happens to use. It sets up Claude Code, Copilot, Cursor, and Codex the same way, with the same subagents and the same slash-commands, then pulls your Jira tickets and Confluence specs into plain Markdown the AI can actually read.&lt;/p&gt;

&lt;p&gt;Everyone keeps their editor. Everyone gets the same setup. And every assistant on the team can finally reach the tickets and specs the work depends on.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Same Setup, Wherever Your Developers Work
&lt;/h2&gt;

&lt;p&gt;Four developers on four different editors should not mean four different AI workflows, four different sets of prompts, and four different results on the same kind of task.&lt;/p&gt;

&lt;p&gt;HAI installs into each environment where that environment expects to find things. Claude Code gets its config in &lt;code&gt;.mcp.json&lt;/code&gt;, Copilot in &lt;code&gt;.vscode/mcp.json&lt;/code&gt;, Cursor in &lt;code&gt;.cursor/mcp.json&lt;/code&gt;, and Codex in &lt;code&gt;.codex/config.toml&lt;/code&gt;. There is an "Any editor" mode too, which lays everything out under .ai/ for manual wiring. Whichever one a developer runs, they get the same MCP server, the same seven subagents, and the same six commands. The team matches without anyone agreeing on an editor first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Tickets and Specs, as Readable Markdown
&lt;/h2&gt;

&lt;p&gt;A lot of the context an AI needs to do a task well does not live in the codebase. The reasoning is in a ticket. The acceptance criteria are in a spec. The screenshot showing the bug is an authenticated attachment nobody can fetch without credentials.&lt;/p&gt;

&lt;p&gt;HAI closes that gap. Jira issues and Confluence pages land in a local .ai/ directory as plain Markdown, with comments, links, custom fields, and the page tree kept intact. Because it is Markdown on disk, your assistant reads it the same way it reads your source. It is all git-ignored by default, with no database and nothing proprietary, so switching ticket providers later does not change how anyone works. &lt;/p&gt;

&lt;p&gt;Since files are pulled directly from the developer's environment, AI doesn't need to use long and costly searches using standard MCP plugins, everything it needs is already there.&lt;/p&gt;

&lt;p&gt;Attachments get handled too. Since they sit behind auth, an AI cannot fetch them directly, so the &lt;code&gt;image_download&lt;/code&gt; tool pulls them with the right credentials and caches them locally. Your assistant just reads the file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hand It a Ticket, Get Code Back
&lt;/h2&gt;

&lt;p&gt;Setup is a one-time thing. After hai init wires up an editor and runs the first sync, the day-to-day is a single command: hand your AI a Jira key with /implement JIRA-123 and it runs the whole job.&lt;/p&gt;

&lt;p&gt;It pulls the ticket over MCP, grabbing every issue that ticket links to in a single pass so the AI has the full picture. It researches the specs and the surrounding code. It drafts a plan. Then, once you approve, it implements the work, running the domain agents in parallel and checking each one.&lt;/p&gt;

&lt;p&gt;That last part leans on the seven subagents HAI installs, each with a clear job. A researcher and an architect that read and plan but never touch code. Backend, frontend, and refactoring agents that write it. A security reviewer and a verifier that checks it. The implement command splits work across them by domain and runs them at the same time rather than one after another.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free, Open Source, and Two Commands to Set Up
&lt;/h2&gt;

&lt;p&gt;HAI is released under Apache 2.0 and runs on Node 16 or newer. It is one npm package, and each teammate sets themselves up with two commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @2amtech/hai
hai init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;hai init walks through picking an AI provider, a ticket source, and a spec source, then runs the initial sync for you, so the .ai/ folder is ready right away. There is no separate pull to run on day one. Reach for hai pull later, mainly when specs change and you want the latest copy locally.&lt;/p&gt;

&lt;p&gt;On the source side you can point it at Atlassian for Jira and Confluence, at a Local provider that reads tickets and specs from folders on disk, or at None when you only want the subagents and commands with no ticket system attached.&lt;/p&gt;

&lt;p&gt;Everything stays in the repository and out of git. The tickets, the specs, and the credentials are all local. Nothing about your project leaves for anywhere it was not already going.&lt;/p&gt;

&lt;p&gt;Check it out at: &lt;a href="https://hai.2am.tech" rel="noopener noreferrer"&gt;https://hai.2am.tech&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cli</category>
    </item>
    <item>
      <title>2am.tech Releases SQL Migration Tool to Streamline Database Changes</title>
      <dc:creator>Aleksandar Panic</dc:creator>
      <pubDate>Tue, 07 Jul 2026 14:44:27 +0000</pubDate>
      <link>https://dev.to/2amtech/2amtech-releases-sql-migration-tool-to-streamline-database-changes-1hab</link>
      <guid>https://dev.to/2amtech/2amtech-releases-sql-migration-tool-to-streamline-database-changes-1hab</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Database migrations have a reputation for going wrong at the worst possible moment. Omitted rollback scripts, schema changes applied to production but not staging, credentials hardcoded in a config file that someone committed by accident… These are the kind of incidents that haunt database administrators and backend engineers, and they are far more common than most teams would like to admit.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The SQL Migration Tool (SMT)&lt;/strong&gt; is a free desktop app and an open-source CLI utility that empowers backend developers and engineering teams with consistency, traceability, and control over database schema management. &lt;/p&gt;

&lt;h1&gt;
  
  
  Plain SQL By Design
&lt;/h1&gt;

&lt;p&gt;Most migration tools require developers to describe schema changes through a framework-specific syntax or an ORM layer. SMT takes the opposite approach. Migrations are standard .sql files. What gets executed is exactly what was written. The files can be run directly in any database client, independently of the tool, and they live in version control alongside the rest of the codebase. &lt;/p&gt;

&lt;p&gt;Scripts are supported which are also SQL files with dynamic replacements which can be run to perform common database maintenance tasks.&lt;/p&gt;

&lt;p&gt;SQL files do not have any special annotations so they can still be used in existing Database Administrator's tool of choice.&lt;/p&gt;

&lt;h1&gt;
  
  
  What It Does
&lt;/h1&gt;

&lt;p&gt;SMT supports MySQL/MariaDB, PostgreSQL, and Microsoft SQL Server. Teams can manage multiple environments from a single project configuration, with each environment tracking its own database changes, so rollouts can be granular. Rollback scripts are plain SQL files as well, with nothing inferred and nothing hidden.&lt;/p&gt;

&lt;p&gt;No need for hardcoded credentials. SMT can read credentials from different sources for each environment to connect to the database. For teams working in AWS environments, SMT integrates with AWS Secrets Manager out of the box. Local development setups can use .env files instead. For local or sandbox testing where security is not needed, directly entered credentials can still be provided.&lt;/p&gt;

&lt;p&gt;Environment specific database differences like different table prefixes, columns and schemas are not a problem. With Dynamic Replacement support, rather than maintaining separate SQL files for each environment, teams can define environment specific search and replace placeholders so that different environments run a SQL targeting the proper tables at runtime. This means the same migration file can target a different schema name in a test environment versus production one, use different table prefixes per tenant in a multi-tenant setup, or insert different seed data depending on where it is being deployed. One file, cleanly adapted to wherever it runs.&lt;/p&gt;

&lt;h1&gt;
  
  
  Friendly for both Database Administrators and DevOps
&lt;/h1&gt;

&lt;p&gt;SMT is available both as a desktop application and a CLI package. Both are released under the MIT license and are free for personal and commercial use.&lt;/p&gt;

&lt;p&gt;Desktop application allows Database Administrators to add and manage the migrations across many projects with a simple and intuitive user interface. Available for all major operating systems: macOS, Windows, and Linux. Migrations can also be run directly from the GUI app. &lt;/p&gt;

&lt;p&gt;For DevOps CI/CD workflows, the CLI can be used to automatically apply these migrations during a deployment. It installs via npm in a single command and can run with zero user interaction needed. It integrates nicely with any environment which can run Node, Bun or Deno runtime.&lt;/p&gt;

&lt;p&gt;The SQL Migration Tool is available at: &lt;a href="http://smt.2am.tech" rel="noopener noreferrer"&gt;http://smt.2am.tech&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sql</category>
      <category>migration</category>
      <category>database</category>
    </item>
  </channel>
</rss>
