{"slug": "why-i-use-4-my-own-tools-from-finding-a-project-to-shipping-its-readme", "title": "Why I Use #4: My Own Tools, From Finding a Project to Shipping Its README", "summary": "Software developer Michael Wright detailed five Rust command-line tools he built for his own workflow in the fourth post of his \"Why I Use\" series: pjmai-rs for locating and navigating git repositories, agentrail for tracking numbered \"saga\" work steps committed alongside code, reg-rs for golden-output regression testing, sw-checklist for enforcing project standards, and markdown-checker for verifying README rendering. Wright said agentrail was built to keep AI agents on track across fresh contexts and now records work done in parallel or elsewhere when several agents work the same family of repositories at once.", "body_md": "# Why I Use #4: My Own Tools, From Finding a Project to Shipping Its README\n\n*1046 words • 6 min read* • Abstract\n\nThe first three posts in this series were about languages. This one is about tools I wrote for myself, and I use them at different levels of the same working day: where is the project, what is the next step, did I break anything, is the code still well built, and will its README display. Each is a small command-line program written in Rust.\n\n| Resource | Link | \n|---|---|\n| **pjmai-rs** | [sw-cli-tools/pjmai-rs](https://github.com/sw-cli-tools/pjmai-rs) ;[TBT #6](https://blog.softwarewrighter.com/2026/03/05/tbt-pjmai-rs-project-manager/) ,[history and fuzzy completion](https://blog.softwarewrighter.com/2026/03/07/pjmai-rs-navigation-history-and-fuzzy-completion/) | \n| **agentrail** | [sw-vibe-coding/agentrail-rs](https://github.com/sw-vibe-coding/agentrail-rs) ;[AI Tools #2](https://blog.softwarewrighter.com/2026/04/23/ai-tools-agentrail-rs-mid-saga-flexibility/) ,[Saw #15](https://blog.softwarewrighter.com/2026/10/18/saw-agentrail-correcting-the-record/) | \n| **reg-rs** | [sw-cli-tools/reg-rs](https://github.com/sw-cli-tools/reg-rs) ;[TBT #7](https://blog.softwarewrighter.com/2026/03/19/tbt-reg-rs-regression-testing/) | \n| **sw-checklist** | [softwarewrighter/sw-checklist](https://github.com/softwarewrighter/sw-checklist) ;[AI Tools #3](https://blog.softwarewrighter.com/2026/04/27/sw-checklist-ratchet-ai-coding-agents/) | \n| **markdown-checker** | [softwarewrighter/markdown-checker](https://github.com/softwarewrighter/markdown-checker) | \n| **The series** | [Why I Use: every post](https://blog.softwarewrighter.com/series/#why-i-use) | \n| **Comments** | [Discord](https://discord.com/invite/Ctzk5uHggZ) | \n\n## pjmai-rs: where is the project?\n\nI develop on several machines, and each has its own set of repositories in its own places. [pjmai-rs](https://github.com/sw-cli-tools/pjmai-rs) keeps a registry of them and hooks into the shell, so I can find where any project sits on the machine I am on and go there:\n\n```\nscpj              # scan for git repositories and add the new ones\nlspj              # list every project on this system\nchpj myproject    # switch to one\n```\n\nIt also keeps a navigation history (`hypj`) and completes project names fuzzily. [TBT #6](https://blog.softwarewrighter.com/2026/03/05/tbt-pjmai-rs-project-manager/) tells where the idea came from.\n\n## agentrail: what is the next step?\n\nOnce I am in a project, [agentrail](https://github.com/sw-vibe-coding/agentrail-rs) holds the plan. Work is a *saga* of numbered steps, committed with the code, so the plan, its progress and the record of what each step did live in the repository rather than in a chat that a new context will not remember. It was built to keep AI agents on track across fresh contexts, and it does the same for me.\n\nPlans change, so it has to handle more than a straight line: inserting and reordering steps, reopening one, and taking a detour without losing the thread ([AI Tools #2](https://blog.softwarewrighter.com/2026/04/23/ai-tools-agentrail-rs-mid-saga-flexibility/)), and, now that several agents often work the same family of repositories at once, recording work done in parallel or somewhere else ([Saw #15](https://blog.softwarewrighter.com/2026/10/18/saw-agentrail-correcting-the-record/)).\n\n## reg-rs: did I break anything?\n\n[reg-rs](https://github.com/sw-cli-tools/reg-rs) creates, discovers, runs and reports on regression tests: run a command, keep its output as the golden result, and fail when the output changes. That is what lets me change code with confidence, whether a refactoring, a fix or a new feature. For the compilers, interpreters and emulators I build, the output is the specification, and a golden test notices what no unit test thought to ask. It has run under most of what this blog has shown lately, from X_eTaL’s hundreds of goldens to the Forth kernel that rebuilds itself. [TBT #7](https://blog.softwarewrighter.com/2026/03/19/tbt-reg-rs-regression-testing/) traces it from C++ to Java to Rust.\n\n## sw-checklist: is it still well built?\n\n[sw-checklist](https://github.com/softwarewrighter/sw-checklist) reins in bad practice. It checks a project against my standards, including size limits that warn first and then fail:\n\n| Measure | Warns over | Fails over | \n|---|---|---|\n| Lines in a function | 25 | 50 | \n| Lines in a file | 350 | 500 | \n| Functions in a module | 4 | 7 | \n| Modules in a crate | 4 | 7 | \n| Crates in a project | 4 | 7 | \n\nThe limits are a forcing function. Code that stays under them tends to be readable, maintainable, extensible, modular and loosely coupled, because the only way to grow is to split things along their seams. [AI Tools #3](https://blog.softwarewrighter.com/2026/04/27/sw-checklist-ratchet-ai-coding-agents/) covers how it works as a ratchet on AI coding agents, which otherwise grow functions and files without limit.\n\n## markdown-checker: will the README display?\n\nThe smallest of them. [markdown-checker](https://github.com/softwarewrighter/markdown-checker) makes sure a project’s main README.md contains only plain, printable characters, so that nothing in it keeps GitHub from rendering the page as intended. The usual offenders are the tree-drawing symbols people paste in to show a directory layout; `markdown-checker --fix` replaces them with ASCII equivalents.\n\n## Five levels, one day\n\nRead in order, they follow a working session: find the project, pick up the plan, change the code without breaking it, keep the code in shape, and publish a README that displays.\n\n*Part 4 of the Why I Use series. [View all parts](https://blog.softwarewrighter.com/series/#why-i-use)*\n\n*Comments or questions? [SW Lab Discord](https://discord.com/invite/Ctzk5uHggZ) or [YouTube @SoftwareWrighter](https://www.youtube.com/@SoftwareWrighter).*", "url": "https://wpnews.pro/news/why-i-use-4-my-own-tools-from-finding-a-project-to-shipping-its-readme", "canonical_source": "https://blog.softwarewrighter.com/2026/10/31/why-i-use-my-tools/", "published_at": "2026-10-31 07:15:00+00:00", "updated_at": "2026-10-31 14:51:53.209569+00:00", "lang": "en", "topics": ["ai-agents", "developer-tools", "ai-tools"], "entities": ["pjmai-rs", "agentrail", "reg-rs", "sw-checklist", "markdown-checker", "Rust", "Michael Wright"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/why-i-use-4-my-own-tools-from-finding-a-project-to-shipping-its-readme", "markdown": "https://wpnews.pro/news/why-i-use-4-my-own-tools-from-finding-a-project-to-shipping-its-readme.md", "text": "https://wpnews.pro/news/why-i-use-4-my-own-tools-from-finding-a-project-to-shipping-its-readme.txt", "jsonld": "https://wpnews.pro/news/why-i-use-4-my-own-tools-from-finding-a-project-to-shipping-its-readme.jsonld"}}