{"id":31715344,"url":"https://github.com/noheltcj/loadout","last_synced_at":"2026-04-23T07:01:52.934Z","repository":{"id":316130569,"uuid":"1050888293","full_name":"noheltcj/loadout","owner":"noheltcj","description":"Composable system prompts for AI coding agents.","archived":false,"fork":false,"pushed_at":"2026-04-20T08:04:27.000Z","size":239,"stargazers_count":1,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-20T09:37:25.887Z","etag":null,"topics":["agentic-ai","agentic-workflow","ai-context-management","ai-tools","antigravity-tools","claude-code","codex"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/noheltcj.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-05T05:24:55.000Z","updated_at":"2026-04-20T08:04:32.000Z","dependencies_parsed_at":"2025-09-22T22:11:30.159Z","dependency_job_id":"5610baf3-8a63-484f-a5ac-5e116946eace","html_url":"https://github.com/noheltcj/loadout","commit_stats":null,"previous_names":["noheltcj/loadout"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/noheltcj/loadout","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noheltcj%2Floadout","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noheltcj%2Floadout/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noheltcj%2Floadout/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noheltcj%2Floadout/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/noheltcj","download_url":"https://codeload.github.com/noheltcj/loadout/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noheltcj%2Floadout/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32169657,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-23T02:19:40.750Z","status":"ssl_error","status_checked_at":"2026-04-23T02:17:55.737Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agentic-ai","agentic-workflow","ai-context-management","ai-tools","antigravity-tools","claude-code","codex"],"created_at":"2025-10-09T01:56:56.926Z","updated_at":"2026-04-23T07:01:52.919Z","avatar_url":"https://github.com/noheltcj.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🎒 Loadout\n\n[![GitHub Release](https://img.shields.io/github/v/release/noheltcj/loadout)](https://github.com/noheltcj/loadout/releases)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![Lint](https://github.com/noheltcj/loadout/actions/workflows/lint.yml/badge.svg)](https://github.com/noheltcj/loadout/actions/workflows/lint.yml)\n[![macOS](https://img.shields.io/badge/macOS-arm64%20%7C%20x64-blue)](https://github.com/noheltcj/loadout/releases)\n[![Linux](https://img.shields.io/badge/Linux-arm64%20%7C%20x64-blue)](https://github.com/noheltcj/loadout/releases)\n[![Kotlin](https://img.shields.io/badge/Kotlin-Multiplatform-7F52FF?logo=kotlin)](https://kotlinlang.org/docs/multiplatform.html)\n\n**Composable system prompts for AI coding agents.**\n\nYour `AGENTS.md` shouldn't be a 500-line wall of text that you copy between repos and pray stays consistent. Loadout treats agent guidance the way package managers treat dependencies: small, focused fragments that you compose into purpose-built profiles.\n\n---\n\n## The Problem\n\nMost teams manage their AI agent prompts by hand as one monolithic `CLAUDE.md` or `AGENTS.md` per repo, maintained through copy-paste. This breaks down fast:\n\n- **Drift.** The same coding conventions exist in twelve repos, worded twelve different ways.\n- **Bloat.** Every agent sees every instruction, whether it's relevant to its task or not.\n- **No specialization.** A code-review agent and a feature-development agent have fundamentally different jobs, but they read the same prompt.\n\n## The Fix\n\nLoadout lets you write prompt guidance once as markdown fragments, then compose them into loadouts. Loadouts are named profiles that produce the final `AGENTS.md`, `CLAUDE.md`, and `GEMINI.md` files your tools already read.\n\n```\nfragments/\n├── universal/\n│   ├── naming-conventions.md\n│   └── code-review-ideology.md\n├── kotlin/\n│   └── kmp-project-structure.md\n└── testing/\n    └── behavior-first-testing.md\n```\n\n```bash\n# One loadout for day-to-day development\nloadout create engineer --desc \"Kotlin-Multiplatform Engineer\" \\\n  --fragment fragments/universal/naming-conventions.md \\\n  --fragment fragments/kotlin/kmp-project-structure.md \\\n  --fragment fragments/testing/behavior-first-testing.md\n\n# Another for code review, with different priorities\nloadout create code-reviewer \\\n  --clone engineer \\\n  --desc \"Ideology-Aware Code Reviewer\" \\\n  --fragment fragments/universal/code-review-ideology.md\n\n# Switch contexts in one command\nloadout use code-reviewer\n```\n\nEach `loadout use` or `loadout sync` regenerates the output files. Your agent reads the right guidance for the right job.\n\n---\n\n## Install\n\n### Homebrew (macOS / Linux)\n\n```bash\nbrew tap noheltcj/loadout\nbrew install loadout\n```\n\n### GitHub Releases\n\nPrebuilt binaries for macOS (arm64/x64), Linux (arm64/x64), and Windows (x64) are available on the [releases page](https://github.com/noheltcj/loadout/releases).\n\n### Build from Source\n\n```bash\ngit clone https://github.com/noheltcj/loadout.git\ncd loadout\n\n# Supported targets: LinuxArm64, LinuxX64, MacosArm64, MacosX64, MingwX64\n./gradlew linkReleaseExecutableMacosArm64\n\n./build/bin/macosArm64/releaseExecutable/loadout.kexe --help\n```\n\n---\n\n## Quick Start\n\n```bash\n# Initialize Loadout in your project\nloadout init\n\n# In shared mode (the default), that gives you:\n#   - A starter fragment at fragments/loadout-architect.md\n#   - A \"default\" loadout that includes it\n#   - Generated AGENTS.md, CLAUDE.md, and GEMINI.md\n#   - .githooks/ with post-checkout and post-merge scripts (committed)\n#   - git configured to use .githooks/ as the hooks path\n```\n\nFrom here, the workflow is: **write fragments → compose loadouts → sync outputs.**\n\n```bash\n# See what's active\nloadout\n\n# List all loadouts\nloadout list\n\n# Create a new loadout\nloadout create \u003cname\u003e --desc \"Usually the purpose of the loadout / profile\"\n\n# Compose fragments\nloadout link path/to/fragment.md --to \u003cloadout\u003e\nloadout unlink path/to/fragment.md --from \u003cloadout\u003e\n\n# Switch to a different loadout\nloadout use \u003cname\u003e\n\n# Regenerate outputs after editing fragment content\nloadout sync\n\n# Preview output without writing files\nloadout use \u003cname\u003e --std-out\n\n# Delete a loadout\nloadout remove \u003cname\u003e\n\n# View or set the repository default loadout (used by auto-sync hooks)\nloadout config\nloadout config --default-loadout \u003cname\u003e\n```\n\n---\n\n## How It Works\n\nLoadout manages three things:\n\n| Concept       | What it is                                                                 |\n|---------------|---------------------------------------------------------------------------|\n| **Fragment**  | A markdown file containing focused guidance on one concern.                |\n| **Loadout**   | A named profile that references a set of fragments.                        |\n| **Output**    | The generated `AGENTS.md` / `CLAUDE.md` / `GEMINI.md` your agent reads.   |\n\nFragments live wherever makes sense:\n- Simple projects or project-specialized fragments may keep them in-repo under `fragments/`.\n- For teams or multi-repository projects, it's recommended to keep fragments in a shared, version-controlled fragment library. This enables sharing of common conventions across projects.\n\n### Shared vs. Local Mode\n\n```bash\nloadout init              # shared mode (default) - loadout definitions are committed\nloadout init --mode local # local mode - everything stays gitignored\n```\n\nShared mode lets a team standardize on the same set of agent profiles. Local mode is for personal workflows where each developer curates their own.\n\n- `.loadout.json` stores tracked repository settings such as the default loadout for hook-driven sync.\n- `.loadout.local.json` stores local-only runtime state such as the active loadout and last composed content hash.\n\n### Auto-Sync with Git Hooks\n\nIn shared mode, `loadout init` commits `.githooks/` hooks alongside your loadout definitions. On every branch checkout and merge, those hooks run `loadout sync --auto` to regenerate the output files from whichever loadout is set as the repository default.\n\nThe reason this matters: `AGENTS.md`, `CLAUDE.md`, and `GEMINI.md` are gitignored. A fresh clone or a new worktree won't have them. Without the hooks, every developer (and every agent session) would need to run `loadout sync` manually before getting the right context.\n\nThis is especially relevant when using agentic tools like Codex or Antigravity that spin up isolated git worktrees. Each worktree gets the correct guidance files on first checkout — no manual setup, no missing context.\n\nSet the default loadout the hooks will use with:\n\n```bash\nloadout config --default-loadout \u003cname\u003e\n```\n\nIf no default is configured, `--auto` is a no-op and the hooks exit cleanly.\n\n---\n\n## Why Fragments?\n\nThe value compounds as the fragment library grows:\n\n- **Reuse across projects.** Write your naming conventions, architecture rules, or review ideology once. Reference them from any repo.\n- **Specialize per task.** A loadout for feature work includes testing guidance. A loadout for code review includes review ideology. Neither carries the other's baggage.\n- **Evolve independently.** Update a fragment or checkout a new fragment library commit and `loadout sync` will propagate the change.\n- **Keep it readable.** Each fragment is a short, self-contained markdown file focused on a single concern. They should be easy to review and refine.\n\n---\n\n## Development\n\nThe CLI is built with Kotlin Multiplatform targeting native executables. The codebase follows a clean-architecture layout:\n\n- `src/commonMain/kotlin/cli/` - Command definitions and output rendering\n- `src/commonMain/kotlin/domain/` - Entities, services, and use cases\n- `src/commonMain/kotlin/data/` - Repository implementations and serialization\n- `src/nativeMain/kotlin/` - Native entrypoints and platform wiring\n\n```bash\n# Run the test suite\n./gradlew check\n```\n\n---\n\n## Contributing\n\nContributions are welcome.\n\n1. Fork the repo.\n2. Create a feature branch: `git checkout -b feature/your-feature`.\n3. Run tests: `./gradlew check`.\n4. Open a PR with a clear description and small, focused commits.\n\n---\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnoheltcj%2Floadout","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnoheltcj%2Floadout","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnoheltcj%2Floadout/lists"}