Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
[4.1.6] - 2026-05-03¶
Changed¶
- Git fetches now use sparse checkout —
ai-rulezno longer downloads entire repository archives to resolve installed skills or remote includes. All git operations now rungit clone --depth 1 --filter=blob:none --sparseand materialise only the required subtree (e.g.skills/<name>/or.ai-rulez/). This fixes the"response body too large"error that occurred when installing skills from large repositories, and dramatically reduces network and disk usage for all remote sources. Requires git ≥ 2.25 (released January 2020). - BLAKE3-based cache invalidation — the time-based TTL (
.fetch_timemarker, 1-hour for includes) is replaced with a content-driven approach. On everyai-rulez generate, a fastgit ls-remotecall checks whether the remote HEAD SHA has changed; cached content is reused when the SHA matches and re-fetched only when it differs. Cached file content is hashed with BLAKE3 and stored in.cache_meta.jsonalongside each cached source. Skills always check the remote (no grace period);--no-fetchbypasses all network calls as before.
Removed¶
- HTTP archive download path (
downloadAndExtract,buildArchiveURL,extractTarGz,extractZip): replaced by sparse git clone. - Duplicate SSH clone helpers (
cloneViaGit,cloneViaGitForSkill): replaced by the sharedsparseCloneprimitive in the newinternal/includes/gitops.go.
[4.1.5] - 2026-05-02¶
Changed¶
- Skill resources are no longer concatenated into
SKILL.md. A skill'sreferences/,scripts/, andassets/subdirectories are now emitted as separate files under the rendered skill directory, matching the canonical Agent Skills layout used by Claude Code and OpenAI Codex.SKILL.mdcarries a## Resourcesindex with relative-path links so the agent can read references on demand (progressive disclosure) instead of paying the full reference cost on every invocation. Reference descriptions are pulled from each file'sdescriptionfrontmatter or the first heading. - Loader:
internal/includes/skill_source.go::ScanInstalledSkillDirno longer inlinesreferences/*.md(the deletedreadReferenceshelper). Local skills under.ai-rulez/skills/<name>/now also pick up bundled resources viainternal/config/loader.go::scanSkills— previously these subdirectories were ignored. - Renderer: shared helpers
RenderSkillResourcesIndex,SkillResourceOutputs,InlineSkillResourcesininternal/generator/presets/skill_resources.go. Applied across every preset that emits a skill directory (Claude, Codex, Cursor, Cline, Amp, Antigravity, Copilot, Gemini, Junie, Opencode, Windsurf). The single-filecontinue.devpreset keeps the inline-concat behaviour since it has no skill directory to read from. - File mode (executable bit on
scripts/*.sh) is preserved through generation.
Added¶
OutputFile.RawContent []byteandOutputFile.Mode os.FileModeininternal/config/presets.go— non-nilRawContentroutes the file through a verbatim-write path that skips the AI-RULEZ banner, content/source-hash injection, and trailing-newline normalisation. Used for skill resource files where any added marker would corrupt the payload (Python scripts, binary assets) or break tooling that hashes the file.- Idempotency on the raw-write path:
internal/generator/generator.go::writeOutputnow compares existing bytes plus mode and skips the write/chmod when both match, so unchanged bundled assets don't dirty the working tree on every regeneration. SkillResourcetype andContentFile.Resourcesininternal/config/types.gocarryKind(references/scripts/assets), forward-slash-normalisedRelPath, rawContentbytes, fileMode, and an optionalDescription.- Stale-file cleanup for resource subdirectories:
SkillResourceOutputsemits each parent directory (including nested ones) as anIsDiroutput socleanManagedDirswalks them on regeneration. Without this, a deletedreferences/old-api.mdwould persist forever in the rendered skill tree. - Resource content is included in the source hash (
writeContentFiles), length-prefixed (|res=<kind>:<relpath>:len=<n>:<bytes>) so a reference body cannot spoof the inter-record delimiter to fake a second resource.
Security¶
- Symlink guard in
internal/config/skill_resources.go: the resource loader usesos.Lstaton each kind directory and checksd.Type()&os.ModeSymlinkon every walked entry. A malicious installed skill cannot exfiltrate host files (e.g.references/evil.md → /etc/passwd) or replace a kind directory with a symlink to an attacker-controlled tree. Symlinks are skipped with aWARNlog. - Defensive walk-up guard in
SkillResourceOutputs: an absoluteRelPath(whichLoadSkillResourcescannot produce, but a future caller might) used to put the parent-directory walk into an infinite loop onfilepath.Dir. Nowfilepath.IsAbsis checked before the walk.
Tests¶
internal/config/skill_resources_test.go—LoadSkillResourcescovering canonical layout, nested paths, frontmatter description extraction, scripts/assets handling, symlink-to-file rejection, symlinked-kind-directory rejection, symlinked subdirectory rejection, dangling symlinks, executable-bit preservation.internal/generator/presets/skill_resources_test.go—RenderSkillResourcesIndex,SkillResourceOutputs,InlineSkillResources,referenceDisplayName, plus the absolute-path infinite-loop guard with a 2 s timeout sentinel.internal/generator/presets/claude_test.go::TestClaudePresetGenerator_PreservesSkillResourcesLayout— end-to-end assertion that references stay separate fromSKILL.md, scripts/assets round-trip via raw bytes, and the resource index is rendered.internal/generator/generator_test.go— raw-write happy path (text, binary, parent-dir creation, mode preservation, mode fallback), raw-write idempotency usingos.Chtimessentinel mtime, mode-only changes still rewrite, content-only changes still rewrite.TestGenerator_CleansStaleSkillResourceverifies a deleted reference is swept on regeneration.TestComputeSourceHash_IncludesSkillResourcesandTestComputeSourceHash_ResistsResourceDelimiterCollisionlock down the source-hash format.- Updated
internal/includes/skill_source_test.goandinternal/includes/skill_resolver_test.goto assert onResourcesrather than the deprecated inline-concat behaviour.
Migration¶
No config or schema change. Existing skills regenerate on next ai-rulez generate. Generated SKILL.md files become smaller (reference bodies move out); new sibling files appear under each skill directory.
[4.1.4] - 2026-05-01¶
Fixed¶
- Flaky MCP e2e test client: the per-test
MCPClientwas a single-line-per-request stdio reader with no JSON-RPC id matching, no notification handling, a fresh reader goroutine per call, and the default 64 KiBbufio.Scannerbuffer. Thetools/listresponse is already ~18 KiB on a single line and grows with the tool surface; any server-emitted notification interleaved with a response would be misparsed as the response and orphan the real one. After bumpingmodelcontextprotocol/go-sdk v1.5.0 → v1.6.0in v4.1.3, this manifested asMCP request timed outflakes on cold runs (tests/e2e/testutil/mcp_client.go).
Changed¶
- MCP e2e test client rewritten for correctness:
- One persistent reader goroutine demuxes stdout into per-request response channels keyed by JSON-RPC id, so notifications cannot be misparsed as responses.
- Notifications (frames without an
id) are silently discarded. - JSON-RPC id key normalized via re-marshal so request and response sides format the same way (encoding/json's float64 round-trip for large nanosecond ids was the latent gotcha).
bufio.Scannerbuffer raised to 1 MiB.- Per-RPC timeout standardized at 30 s with explicit
t.Fatalfshowing the method name and reader error on server-side exit. Close()now waits for the reader to drain so its goroutine doesn't outlive the test.- Reverted v4.1.3's blind 5 s → 30 s timeout bump as the cure: that bump only masked the underlying client fragility. With the rewrite the timeout is no longer the load-bearing fix.
[4.1.3] - 2026-04-30¶
Fixed¶
generate --recursiveperformance and robustness: a recursive run on a polyglot monorepo could take ~2 minutes and abort on a single broken symlink (e.g. a stale Rusttarget/debug/deps/lib*.rlib). Two underlying defects incmd/commands/generate.go:- The walker had no skip list — it descended into
target/,node_modules/,.venv/,vendor/,dist/,.git/, etc. - The walk callback re-returned every
lstaterror fatally, so one bad symlink killed the entire run. - Recursive discovery now ignores v2 flat configs: only
.ai-rulez/config.{toml,yaml,yml,json}is discovered by--recursive. The legacy v2ai-rulez.yamldiscovery path is removed (single-configgenerate <file>is unaffected).
Added¶
- Shared skip helper at
internal/walkutilcovering VCS metadata, build outputs (target,node_modules,vendor,dist,build,out,obj,bin), language toolchain caches (.venv,__pycache__,.tox,.gradle,.mvn, …), editor caches, and any hidden directory other than.ai-rulez/.github. Reused fromcmd/commands/generate.go,internal/mcp/handlers/project.go, andinternal/agents/context.goso the same pruning applies to every recursive walk. - Shared rule library detection: a directory named
ai-rulez/(no leading dot) that itself containsconfig.{toml,yaml,yml,json}at its root is treated as a shared library. Its entire subtree is pruned during recursive discovery, so nested.ai-rulez/module configs that exist only for inclusion by consumers are no longer (re-)generated for. - Parallel multi-config processing:
generate --recursivenow processes discovered configs concurrently with aruntime.NumCPU()-bounded worker pool. Each config has its own working directory and produces independent output. - Concurrency-safe include cache:
internal/includesnow serializes refresh of any one cache directory with a per-cacheDir mutex (double-checked, lock-free fast path) so parallel callers targeting the same shared include never race onRemoveAll/extract. Applies to bothGitSource.FetchandSkillGitSource.Fetch. - Process-level scanned-tree memoization:
ScanContentTreeresults for a given cached.ai-rulez/directory are reused across consumers within the same process. In a monorepo where 18 configs each include the same 5 shared libraries, this cuts 90 redundant tree scans down to 5. Per-consumer include filters still apply viafilterContent, which returns a new tree without mutating the cached one.
Performance¶
kreuzberg-dev(24.ai-rulez/dirs, 18 actual consumer configs, 5 shared library modules):generate --recursive --update-gitignorewent from ~2 minutes (failing on a stale.rlibsymlink) to ~1 second steady-state. Cold full-tree generation completes in ~12 s.
Tests¶
internal/walkutil/skip_test.go— covers the shared skip predicate.cmd/commands/generate_recursive_test.go— fixture-driven test covering pruned dirs, broken-symlink resilience, library-skip, and config-format priority (TOML over YAML over JSON).internal/includes/fetch_concurrency_test.go— fetch-lock identity, concurrent access, scanned-tree cache round-trip / invalidation, race-detector stress.tests/e2e/cli/recursive_test.go— end-to-end suite asserting (a) walker pruning ofnode_modules/target/.venv/vendor/.cache/build, (b) shared rule library subtree is skipped, (c) parallel andGOMAXPROCS=1runs produce byte-identical outputs.
README¶
- New collapsible Installation section covering Homebrew, npx, npm -g, uvx, uv tool, pip/pipx, pre-commit hook, and lefthook setup.
[4.1.2] - 2026-04-30¶
Added¶
- Per-subagent reasoning effort for Codex: Codex subagent TOML files (
.codex/agents/<id>.toml) now emitmodel_reasoning_effortwhen an effort is resolved for that agent. Per-agent metadata wins over.codex/config.toml, which still carries the global default. Tracks the schema documented at https://developers.openai.com/codex/subagents. - Per-subagent reasoning effort for Opencode: Opencode agent files (
.opencode/agents/<id>.md) now emit areasoningEffortfrontmatter field. Resolution: per-agent metadata →defaults.effort_by_preset["opencode"]→defaults.effort.xhighandmaxmap tohigh(Opencode tops athigh);inheritis dropped.
Changed¶
- Updated the per-preset effort support matrix in
docs/configuration.mdto reflect Codex per-agent support and Opencode per-agent support.
[4.1.1] - 2026-04-30¶
Added¶
- Reasoning effort across multiple providers: extends the v4.1.0 Claude-only effort support to Codex, Amp, and Windsurf.
- Codex: emits
.codex/config.tomlwithmodel_reasoning_effortwhen an effort resolves. Global setting (Codex doesn't accept per-agent effort). - Amp: emits
.amp/settings.jsonwithamp.anthropic.effort. Global setting;xhighmaps tohigh(Amp tops athigh/max). - Windsurf: emits
reasoning_effortper-agent in.windsurf/agents/<id>.mdfrontmatter.maxmaps tohigh. - Claude: refactored to share the same resolver path; behavior unchanged.
defaults.effort_by_preset: per-preset overrides that beatdefaults.effort. Per-agent metadata still wins where the preset supports it. YAML/TOML key validated against the registered preset list.- MCP
update_configdefault_effort_by_presetparameter: object-typed argument that lets MCP clients set or clear per-preset overrides.read_configalways returns the field (possibly empty) for stable read-modify-write loops.
Notes¶
- Cursor, Copilot, Gemini, Junie, Opencode, Antigravity, Cline, and Continue.dev expose effort behind UI toggles or in user-managed config files we don't generate. ai-rulez deliberately skips emission for them — guard tests lock that in. Configure effort in those tools' own settings instead.
- See
docs/configuration.mdfor the full per-preset mapping table.
[4.1.0] - 2026-04-29¶
Added¶
- Reasoning effort on Claude Code subagents: agent frontmatter now accepts an
effortfield (low|medium|high|xhigh|max|inherit) that ai-rulez emits into.claude/agents/<name>.md. Maps directly to Claude Code's adaptive thinking spec — available levels depend on the model. defaults.effortinconfig.yaml/config.toml: top-level project default that propagates to every generated subagent which doesn't declare its owneffort. Resolution order: per-agent →defaults.effort→ omit.- MCP
update_configdefault_effortparameter: lets MCP clients set or clear the project-wide default.read_confignow always returnsdefault_effort(possibly empty) so read-modify-write loops have a stable contract. - Validation for the new value set across config load, MCP
update_config, andai-rulez validate— invalid values fail with an actionable message naming the field and the offending value.
Notes¶
- Other presets (Cursor, Windsurf, Copilot, Gemini, Antigravity, etc.) silently skip the
effortfield — they have no native equivalent yet. No-leak tests lock that in. - Claude Code's session-level effort remains a runtime setting (
/effortslash command) — there is no static surface to render it into, so this release covers subagents only.
[4.0.8] - 2026-04-27¶
Fixed¶
- Generation was non-deterministic across runs:
content.Domainsis a Go map, and every preset that flattened domain rules/context/skills/agents/commands iterated it in randomized order. Two consecutivegenerateruns with identical sources produced different rule orderings inCLAUDE.md,.github/copilot-instructions.md, and every other multi-rule output, breaking pre-commit hook idempotency. Domain iteration is now sorted by name (internal/generator/presets/helpers.go). toolsfield corrupted into a Go slice string:Metadata.Extra map[string]stringcould not hold YAML sequences —tools: [Read, Grep, Glob]was stringified viafmt %vto"[Read Grep Glob]"and emitted astools: '[Read Grep Glob]'. Added typedTools,Skills,Keywordsfields onMetadata; YAML now round-trips as proper sequences in agent frontmatter across all presets (claude, amp, antigravity, cline, copilot, gemini, junie, windsurf).mcppreset rejected by validation:internal/generator/presets/mcp.goregistered anmcppreset generator, butinternal/config/types.gobuiltInPresetsdidn't list it — configs that includedmcpin their preset array failed withunknown built-in preset: "mcp". Added to the map.- Skip-on-content-hash never fired for files with both frontmatter and a banner: windsurf rule files have YAML trigger frontmatter prepended to the standard generated-file banner.
stripHeaderonly stripped one layer, so the banner's per-run timestamp leaked into the body hash and caused unnecessary rewrites every run. Now strips both layers.
Added¶
Source-Hashheader line: alongside the existingContent-Hash, every generated file now embeds a blake3 hash covering all profile-relevant inputs (config metadata, content tree, MCP servers, plus a generator schema version constant). The skip decision inwriteOutputrequires both hashes to match the values stored in the existing file — never re-hashes the on-disk body, so it's robust to formatters that may modify generated files post-write.- Hash injection for YAML-frontmatter files: skill and agent files (
.claude/skills/*/SKILL.md,.opencode/agents/*.md, etc.) had no header to inject hashes into and were rewritten every run. Hashes now go in as YAML comment lines (# Content-Hash:/# Source-Hash:) inside the frontmatter, where YAML parsers ignore them.
Changed¶
- Sort everything alphabetically by name: scanner's
sortByPriorityreplaced withsortByName; merged content slices re-sorted incombineContentFiles; typed list metadata (Tools/Skills/Keywords) sorted on load. Priority is preserved as metadata in the rule body and rendered next to the rule name. This is a behavior change — projects with mixed-priority rules will see one round of reordered output. - Output normalized to a single trailing newline at write time, so
end-of-file-fixerand similar formatters don't modify files post-generation.
[4.0.7] - 2026-04-27¶
Fixed¶
.mcp.jsonnot asserted in managed gitignore fence:cursor,copilot, and the auto-mcppreset all emit.mcp.jsonwhen MCP servers are configured, but no regression test confirmed the path actually landed in the# BEGIN ai-rulezblock. Coverage added; behavior verified end-to-end across all preset combinations.- Cross-fence gitignore duplication: when a user already had a pattern (e.g.
.cursor/,CLAUDE.md) listed manually outside the managed block, regenerate added the same line inside the fence too. The writer now skips any pattern already present outside the fence. --debugflag did nothing: registered onRootCmdbut never propagated to the logger singleton. Addedlogger.SetLeveland aPersistentPreRunthat lowers the level toDEBUGwhen--debugis set (and toERRORfor--quiet).--update-gitignoreflag did nothing: declared ongeneratebut never read. Now forcescfg.Gitignore = trueregardless of the config file value, matching the help text.
Changed¶
- Demoted intentional-behavior warnings to debug: scanner's
domain X file overrides root fileandmultiple domains have same filewereWARN-level on every legitimate domain override (documented design, not user error). Generator'sOutput path conflictlikewise fired any timecursor+copilot+auto-mcpshared.mcp.json(also expected). All three are nowDEBUG. - Quieter generation output:
Processing commands for Claude preset, per-commandChecking command/Including command, andScanned commands directoryare nowDEBUG. Run with--debugto see them again.
[4.0.6] - 2026-04-25¶
Fixed¶
- MCP schema rejected V4 configs:
ai-rules-mcp.schema.jsononly allowed version"3.0"— V4 configs failed validation. Now accepts both"3.0"and"4.0". - Generated file headers hardcoded
config.yaml: preset generators always wroteSource: .ai-rulez/config.yamlin output headers, even for TOML or JSON configs. Headers now reflect the actual config filename.
Changed¶
- Removed stale V3 naming across codebase:
ValidateV3()renamed toValidate(),isV3ConfigFile()toisConfigFile(),DetectConfigVersionreturns"dir"instead of"v3", test fixtures and helpers renamed to version-neutral names. - Added
IsV4()method toConfigfor symmetry withIsV3().
[4.0.5] - 2026-04-25¶
Fixed¶
- Config discovery missing TOML:
FindConfigFile(used by MCP handlers) only searched for YAML/YML configs, ignoringconfig.toml(the V4 default) andconfig.json. TOML is now checked first. - Recursive generate missed TOML configs:
isV3ConfigFile(used bygenerate --recursiveand pre-commit hooks) did not matchconfig.tomlorconfig.json, so projects using the V4 default were silently skipped.
[4.0.4] - 2026-04-25¶
Fixed¶
- Pre-commit hooks broken for V3/V4 users: file trigger patterns in
.pre-commit-hooks.yamlonly matched V2-style filenames — hooks never fired when.ai-rulez/directory content changed. Updated to^\.ai-rulez/. - Stale versions across packages: default download version in
run-ai-rulez.shwasv3.0.0,officialPreCommitRevinsetup.gowasv2.4.3, lefthook glob was V2-only. All updated. - Init templates generated old config version: YAML and JSON templates used
version: "3.0"while TOML correctly used"4.0". All formats now default to"4.0". - PyPI wrapper version drift:
release/pypi__version__was stuck at3.14.2, causing binary download mismatches. - Stale
ErrInvalidVersionsentinel: error message only mentioned3.0, now includes4.0.
Added¶
- Taskfile: added
Taskfile.ymlwithsetup,update,upgrade,set-version,build,test,lint,check, andcleantasks.set-versionupdates all 8 version locations in one command. - Hook unit tests: added
internal/hooks/hooks_test.goandsetup_test.gocovering detection, all three hook systems (lefthook, pre-commit, husky), idempotency, legacy pruning, and error paths.
[4.0.3] - 2026-04-24¶
Fixed¶
- Gitignore cleanup: shared directories (e.g.
.github/) now use subdirectory patterns (.github/agents/,.github/skills/) instead of listing every individual file. Nested paths deduplicated automatically. - Stale binary: builtin agents were generated by
GeneratePresetsbut not written to disk when using a stale binary. Confirmed working with fresh build.
[4.0.2] - 2026-04-24¶
Added¶
- Builtin agents: code-reviewer, test-writer, security-auditor, docs-writer, devops-engineer, release-engineer — specialized agents shipped with the tool, ready to use as subagents.
- New rules (adapted from superpowers patterns): verification-before-completion, systematic-debugging, testing-anti-patterns.
- Strengthened TDD rule: iron law enforcement — wrote code before the test? Delete it, start over, no exceptions.
Changed¶
- README redesigned: value-first structure showing builtin capabilities, agents, and full development workflow.
- Package descriptions updated across npm, PyPI, and GitHub to reflect complete workflow capabilities.
[4.0.1] - 2026-04-24¶
Added¶
- New builtins:
cicd(pipeline standards, GitHub workflow),docker(container best practices),observability(logging, metrics, health checks). - New ai-governance rules:
no-ai-signatures(no AI attribution in commits/PRs/code),agent-workflow(subagent delegation with mandatory critical review),communication-style(concise, no fluff/emojis/checklists). - New testing rule:
tdd-workflow(TDD red-green-refactor, test type taxonomy). - New code-quality rule:
anti-patterns(magic numbers, global state, composition over inheritance). - Auto-include expanded:
code-quality,testing,git-workflow,security,token-efficiencyare now auto-included by default alongsideai-governanceandagent-delegation.
Fixed¶
migrate v4preserves MCP servers from legacymcp.yamlfiles — previously lost during migration.
Changed¶
token-efficiency/task-runnerenriched with standard task naming conventions and lock file requirements.
[4.0.0] - 2026-04-23¶
Breaking Changes¶
- TOML is the default config format:
ai-rulez initnow generatesconfig.tomlinstead ofconfig.yaml. Existing YAML configs continue to work. - MCP servers are inline: MCP servers are now configured in your main config file under
[[mcp_servers]]instead of a separatemcp.yaml. Legacymcp.yamlfiles are still loaded with a deprecation warning. - V2 compatibility removed: All V2 config types, migration code, validator, and generators have been removed. V3 YAML configs remain fully supported.
- Deprecated features removed:
CompressionConfig,--skip-mcpflag,--auto-migrateflag,migrate v3command.
Added¶
- Agent generation for all presets: Amp, Windsurf, Cline, and Continue.dev now generate agent files with YAML frontmatter.
- Context rendering for per-file presets: Cursor, Windsurf, and Cline now render context as rule-like files.
- Claude MCP & plugins output:
.claude/settings.json(MCP servers) and.claude/plugins.json(plugin declarations). - Cursor/Copilot MCP output:
.mcp.jsongenerated when MCP servers are configured. - Codex plugins & commands:
.codex/plugins.jsonand.codex/commands/output. - Copilot command generation:
.github/commands/output for Copilot. - Gemini/Antigravity user MCP servers: Settings.json now includes user-configured servers alongside the hardcoded ai-rulez server.
- TOML config support: Config loader tries TOML first, then YAML, then JSON.
- Plugins and marketplaces: New
[[plugins]]and[[marketplaces]]config sections for declaring tool extensions. migrate v4command: Convertsconfig.yamltoconfig.toml, inlines MCP servers, removes old files.- Backward-compatible
mcp.yamlloading: Legacy separate MCP files are loaded with a deprecation warning.
Changed¶
- All V3 types renamed:
ConfigV3→Config,ContentTreeV3→ContentTree,OutputFileV3→OutputFile, etc. - Schema files renamed:
ai-rules-v3.schema.json→ai-rules.schema.json,ai-rules-v3-mcp.schema.json→ai-rules-mcp.schema.json. - Schema updated: Accepts version
"3.0"or"4.0", addspluginsandmarketplacesfields, removes deprecatedcompression. - Documentation migrated to Zensical: Replaces MkDocs with Zensical for documentation site generation.
- All documentation updated for V4: TOML examples, inline MCP, plugins/marketplaces, updated CLI reference.
Removed¶
- V2 config types, loader, migration tool, validator, and generators (~3000 lines).
- V1 and V2 JSON schemas.
- V2 template rendering engine and builtin templates.
CompressionConfig(deprecated no-op).- Separate MCP file loading functions (replaced by inline config).
- MkDocs configuration (
mkdocs.yaml). - Generated documentation site (
site/).
[3.14.2] - 2026-04-20¶
Fixed¶
- Critical: generator deleting non-generated files in
.github/:cleanManagedDirswas treating.github/as a fully managed directory, deleting workflows, CODEOWNERS, issue templates and other user content duringgenerate. Now skips shared directories that contain both generated and non-generated content.
[3.14.1] - 2026-04-20¶
Fixed¶
- CI: missing Taskfile tasks: Added
test:e2e,test:e2e:cli,test:e2e:mcp,test:e2e:integration,test:platform, andtest:alltasks that the CI/E2E workflows referenced but didn't exist. - CI: golangci-lint-action: Pinned to
@v7(resolves@latestlookup failure), useversion: latestfor the binary. - CI: stale test expectations: Fixed
TestInitExistingConfig(unset CI env to test non-interactive mode) andTestValidateFailsWhenSkillDescriptionMissing(updated to match 3.13.1 behavior change where missing description is a warning, not error). - Windows test failures: Fixed path separator issues in
TestAmpPresetGenerator_Generate_WithSkillsandTestClinePresetGenerator_Generate_WithSkillsusingfilepath.ToSlash. - Stale comment: Fixed
git.gocache directory comment (was.ai-rulez/.remote-cache/, actual is~/.cache/ai-rulez/includes/).
[3.14.0] - 2026-04-20¶
Added¶
- Antigravity preset: New
antigravitybuilt-in preset generatingGEMINI.md,.agents/settings.json, and skills/agents to.agents/skills/and.agents/agents/. - Gemini skills and agents: Gemini preset now generates skill files to
.agents/skills/{id}/SKILL.mdand agent files to.agents/agents/{name}.mdwith YAML frontmatter. - Cursor agents: Cursor preset now generates agent files to
.agents/agents/{name}.mdwith YAML frontmatter (name, description, model, readonly, is_background). - Cursor skills moved to
.agents/: Cursor skills output moved from.cursor/skills/to.agents/skills/following the cross-agent standard. - Codex subagents: Codex preset now generates agent files to
.codex/agents/{name}.tomlin TOML format (name, description, developer_instructions). - AMP skills: AMP preset now generates skill files to
.agents/skills/{id}/SKILL.md. - Windsurf skills: Windsurf preset now generates skill files to
.windsurf/skills/{id}/SKILL.md. - Copilot skills and agents: Copilot preset now generates skill files to
.github/skills/{id}/SKILL.mdand agent files to.github/agents/{name}.agent.mdwith YAML frontmatter. - Cline skills: Cline preset now generates skill files to
.cline/skills/{id}/SKILL.md. - Junie skills and agents: Junie preset now generates skill files to
.junie/skills/{id}/SKILL.mdand agent files to.junie/agents/{name}.mdwith YAML frontmatter. - OpenCode skills and agents: OpenCode preset now generates skill files to
.opencode/skills/{id}/SKILL.mdand agent files to.opencode/agents/{name}.mdwith YAML frontmatter. - Output conflict detection: Generator now warns when multiple presets write to the same file path, deduplicates directory entries, and uses last-write-wins for file conflicts.
- Vite+ builtin: New
vite-plusbuiltin for the unified TypeScript toolchain (oxlint, oxfmt, vitest, rolldown/tsdown, task caching). - MCP read tools: New
read_rule,read_context,read_skillMCP tools for reading file content without filesystem fallback. - MCP
working_directoryparameter: All MCP CRUD and project tools now accept an optionalworking_directoryparameter for polyrepo support. - MCP enum constraints:
priorityandmerge_strategyfields now use JSON Schemaenumconstraints for better LLM tool use. - MCP
read_config/update_config: New tools for reading and updatingconfig.yamlfields (name, description, builtins, gitignore) via MCP. - MCP
dry_run/recursive:generate_outputsnow acceptsdry_run(preview mode) andrecursive(walk subdirectories) parameters. - MCP annotations: All tools now have
readOnlyHint/destructiveHintannotations so clients can implement appropriate confirmation UX. builtins showcommand: Newai-rulez builtins show <name>CLI command andshow_builtinMCP tool to inspect builtin domain contents (rules, context, skills with priorities).- Content hash: Generated files include a
Content-Hash: blake3:<hex>in the header. Files are skipped when the hash matches, eliminating timestamp-only diffs. - Include cache TTL: Git-based includes are cached for 1 hour instead of re-fetched every run. New
--no-fetchflag for offline generation.
Changed¶
- Rust builtin: Added Rust API Guidelines (naming conventions, trait implementations, type safety, builder pattern, sealed traits, rustdoc standards) and Rust Design Patterns reference.
- MCP atomic updates:
update_rule,update_context,update_skillnow use atomic overwrite (temp+rename) instead of delete-then-create, preventing data loss on write failure. - MCP
with_agentsparameter:init_projectnow creates.ai-rulez/agents/directory whenwith_agentsis true (previously silently ignored). - MCP
list_contextunified: Mergedlist_contextandlist_contextsinto a single enriched endpoint returning summaries. - MCP list metadata:
list_rules,list_context, andlist_skillsnow populatepriorityandtargetsfields from YAML frontmatter. - CLAUDE.md inlines all content: Local project rules and contexts are now inlined in CLAUDE.md instead of using
@pathreferences, matching all other presets. - Gitignore idempotent updates:
.gitignorenow uses fenced# BEGIN ai-rulez/# END ai-rulezmarkers. Repeatedgenerateruns replace the block instead of appending duplicates. Old-style# AI Rules generated filesheaders are auto-migrated.
[3.13.1] - 2026-04-19¶
Fixed¶
- Frontmatter parsing: Fall back to raw map parsing when direct YAML unmarshal fails (e.g., SKILL.md files with nested
metadata:objects). Nested values are stringified for the Extra map. - Skill description validation: Downgraded missing description from a fatal error to a warning. Uses skill name as fallback description instead of failing generation.
- Cache directory consistency: Unified all cache locations to
~/.cache/ai-rulez/(XDG convention) instead of mixingos.UserCacheDir()(~/Library/Cacheson macOS) with~/.cache/.
Changed¶
- Module structure: Restructured shared modules to use
.ai-rulez/subdirectories, enabling remote includes via GitHub URLs withoutlocal_override. - mdformat exclusion: Excluded
.ai-rulez/directories from mdformat pre-commit hook to prevent YAML frontmatter destruction. - Enriched agents: Improved devops-engineer, docs-writer, polyglot-architect, and code-reviewer agents with more detailed guidance.
[3.13.0] - 2026-04-19¶
Added¶
- Agent delegation builtin: New
agent-delegationauto-included builtin that renders an "## Agents" section in generated outputs (CLAUDE.md, AGENTS.md, GEMINI.md) listing all available subagents with their descriptions and delegation/parallelization instructions. Disable withbuiltins: ["!agent-delegation"]. - New binding builtins:
jni-rs(Rust-Java/JVM),extendr(Rust-R),cgo(Go-C/Rust FFI). - Token-efficiency rules: Three new rules —
batch-operations,incremental-approach,context-preservation— expanding the builtin from 2 to 5 rules.
Deprecated¶
- Compression: The
compressionconfig option is now a no-op and will be removed in a future version. Existing configs withcompressionwill still parse without error but emit a deprecation warning. The compression feature's stopword removal at moderate+ levels stripped meaning-critical words (negations, verbs, prepositions), making generated output ungrammatical and sometimes inverting meaning. Condense content at the source level instead.
Removed¶
- Compression package: Deleted
internal/compression/— all compression logic, stopword lists, semantic scoring, and hypernym replacement.
Changed¶
- Language builtins improved: All 10 language convention files (Rust, Python, TypeScript, Go, Java, Ruby, PHP, Elixir, C#, R) restored to 11-14 bullets each with security scanning tools, benchmarking frameworks, build system guidance, and key language patterns.
- Binding builtins improved: Fixed accuracy issues in PyO3 (
Py<T>deprecation wording), Magnus (build tools), and ext-php-rs (error mapping, GC, async guidance). - Universal builtins improved: Rewrote
output-awarenesswith concrete limits, restoreddependency-awarenessper-language tool list, rewrote OWASP context verb-first, sharpenedread-before-writevsverify-before-actingdistinction, improvedavoid-duplicationwith concrete "three similar lines" guidance.
[3.12.0] - 2026-04-17¶
Added¶
- Installed skills: New
ai-rulez skill install/remove/listcommands for installing named skills from external git repos or local paths. Skills are fetched dynamically at generate time and included in outputs. Config field:installed_skillsin config.yaml. - MCP tools for installed skills:
install_skill,uninstall_skill,list_installed_skillsMCP operations. - Distributable ai-rulez skill:
skills/ai-rulez/folder at repo root with comprehensive SKILL.md and reference docs, installable by other projects. installed_skillsJSON schema: Schema validation for the new config section.- llms.txt: Added LLM-friendly documentation index at
docs/llms.txt.
Fixed¶
- YAML config preservation:
SaveConfigV3now usesyaml.Noderound-tripping to preserve field ordering, comments, and formatting when modifying config (e.g.,skill install,include add). Previously, saving re-marshaled the entire config, losing comments and reordering fields. - Stale cache invalidation: Include and skill caches are now cleared before each fetch, preventing stale data from previous downloads from contaminating results.
- golangci-lint clean: Extracted
sourceTypeGit/sourceTypeLocalconstants, fixedgocriticshadow and named result warnings.
Changed¶
- golangci-lint pinned in CI:
golangci-lint-action@latestwithversion: v2.11.4in CI workflow.
[3.11.5] - 2026-04-15¶
Fixed¶
- Claude preset: no headers in skills/agents/commands: Generated header comments (
<!-- AI-RULEZ ... -->) are no longer emitted in skill, agent, or command files. These files serve as prompts for Claude Code — header comments wasted tokens and injected confusing "DO NOT EDIT" instructions into the agent's system prompt. Headers are now only emitted in CLAUDE.md and equivalent top-level files.
[3.11.4] - 2026-04-15¶
Fixed¶
- Claude preset: frontmatter placement: Skill, agent, and command files now emit YAML frontmatter (
---) as the first line, before the generated header comment. Previously the HTML comment header was placed before frontmatter, preventing Claude Code from parsing it. - Claude preset: skill frontmatter fields: Skills now include
user_invocable(false for domain skills, true for commands) anddescriptionin frontmatter. Removed ai-rulez internal fields (priority,targets) from Claude output. - Include domain profiles (#97):
GetContentForProfilenow addsFromIncludeand builtin domains before profile-specific domains, ensuring included domains are always available regardless of profile configuration.mergeDomainInstallnow correctly setsFromInclude=trueon new domains. - Non-deterministic output:
mergeContentFileswithbaseWins=falsenow iterates the include slice instead of a map, producing deterministic file ordering across regenerations. - Lint: Fixed
rangeValCopywarnings in include CRUD operations andgofmtformatting inIncludeConfigstruct.
Added¶
local_overridefor includes: Newlocal_overridefield on include configs allows using a local directory instead of fetching from git. If the local path exists, it is used; if not, the include falls back to the configured git source. Supports thepathsubdir field. Useful for developing shared rules locally before pushing.- Minimal headers for skills/agents:
StyleOverridefield onTemplateDataallows preset generators to force a specific header style. Claude preset now uses "minimal" headers for skills and agents to reduce token waste.
Changed¶
- Profile domain warnings:
warnMissingDomainReferencesnow emits debug-level (not warn-level) messages when includes are configured and a referenced domain is missing, since the domain may exist in an include that failed to resolve.
[3.11.3] - 2026-03-29¶
Fixed¶
- Includes: fail fast when includes are configured but the includes resolver isn't registered, preventing silent drops of included domains referenced by profiles.
Added¶
- Integration coverage for profiles resolving domains delivered via includes, ensuring included domains stay visible to profile selection.
Changed¶
- GolangCI-Lint now tracks the
latestrelease in CI and pre-commit instead of a pinned version.
[3.11.2] - 2026-03-25¶
Fixed¶
- Gitignore:
.github/directory no longer ignored: The gitignore updater was adding.github/as a directory-level pattern because the copilot preset creates.github/copilot-instructions.md. This caused CI workflows and other.github/content to be ignored. Shared directories like.githubare now excluded from directory-level patterns — only individual generated files inside them are gitignored. - Gitignore: no more individual file paths: Files inside fully-managed directories (e.g.
.claude/skills/foo/SKILL.md) are no longer added individually to.gitignore— the parent directory pattern covers them.
[3.11.1] - 2026-03-25¶
Added¶
- R language builtin: R conventions covering tidyverse style, testthat, roxygen2, CRAN compliance, and extendr/rextendr Rust FFI bindings
[3.11.0] - 2026-03-25¶
Fixed¶
- Include domain duplication (issue #97): Include sources now use
ScanContentTreeinstead ofscanner.ScanProfile, preventing domain content from appearing twice in generated output - Claude preset output bloat: Skill, agent, and command-as-skill files no longer embed all rules and context; only explicitly targeted content is included (reduces
.claude/from ~13MB to ~440KB on large projects) - Stale file cleanup: Generator now removes orphaned files from managed output directories (
.claude/skills/,.claude/agents/) before writing new output
Changed¶
- Rules rendered as
@references: Local project rules in CLAUDE.md now use@pathlazy-loading references instead of full inlining, matching the existing context rendering pattern. Builtin and included rules remain inlined. - Exported
ScanContentTree:config.ScanContentTree()is now public for use by include sources and external consumers - Context and rules rendering consolidated into shared
renderContentRefhelper
[3.10.0] - 2026-03-18¶
Fixed¶
- Included skills validation: Frontmatter parser now captures
descriptionand other extra fields from included skill files via YAML inline tag (issue #96) - Included domains in profiles: Include sources (git and local) now discover and scan domain directories, so consuming projects can reference included domains in profiles (issue #97)
Changed¶
- Include domain discovery skips hidden directories (e.g.
.git) in thedomains/tree
[3.9.0] - 2026-03-11¶
Added¶
- Root
.ai-rulez/commands/documentation files forbuild,fix,lint,review, andtest - Repository-managed
.pre-commit-config.yamlwith commit-message linting andprek-driven checks
Changed¶
- Replaced
lefthook.yamlwith theprek/pre-commit toolchain across local workflows, CI wiring, and helper scripts - Refreshed command-generation, docs-site output, and test fixtures to match the new command docs and hook setup
- Aligned Go/tooling dependencies and CI lint configuration with the current Go
1.26toolchain
Fixed¶
- Codex skill generation now always emits
descriptionin.codex/skills/*/SKILL.md, falling back to the skill ID when needed - V3 validation now rejects source
SKILL.mdfiles that omit a non-emptydescription - Skill import, CRUD creation, and V2 section migration now synthesize valid skill descriptions so generated Codex skills always load
- E2E test binary setup now uses a stable temp path, preventing later suites from inheriting deleted binaries
[3.8.3] - 2026-03-08¶
Fixed¶
- GetContentForProfile: Domain content from includes no longer duplicated into root-level slices; domains are now placed only in the Domains map for proper preset generation
- Includes resolver: Added
FromIncludefield toDomainV3to track domains originating from external includes
[3.8.2] - 2026-03-08¶
Fixed¶
- Claude preset: Domain skills, agents, and commands are now properly collected and generated (previously only root-level content was processed)
- Builtins:
default-commandsbuiltin (/iterate,/parallelize) now generates Claude skill files correctly
Changed¶
- Builtin language conventions: All 9 language builtins expanded with explicit linting toolchain, SAST tools, coverage tools, benchmark tools, and package manager recommendations
- Rust: added
cargo-llvm-cov,cargo deny,cargo-machete,criterion,cargo-flamegraph,Cow/Arc/memchr/SIMD guidance - Python: added
bandit,hypothesis,uvlockfile,hatchling/maturin,pytest-benchmark,py-spy/scalene - TypeScript: added
oxlint,pnpmpreferred,tsup/esbuild,socket.dev/snyksupply chain - Go: added
govulncheck,gosec, specificgolangci-lintlinters,benchstat - Java: added Gradle preference,
google-java-format,Error Prone,Checkstyle,SpotBugs,JaCoCo,JMH - Ruby: added
rubocopplugins,bundler-audit,brakeman,factory_bot,simplecov - PHP: added
PHP-CS-Fixer,Psalm,roave/security-advisories, PSR-4 autoloading - Elixir: added
excoveralls,sobelow,mix_audit,dialyxir,ExDoc - C#: added
StyleCop.Analyzers,Roslynator,coverlet,BenchmarkDotNet,ValueTask - Security builtin:
dependency-awarenessrule expanded with per-language audit tool recommendations - Token efficiency builtin: Description updated from "RTK awareness" to "Output efficiency and task automation"
[3.8.1] - 2026-03-07¶
Changed¶
- Token reduction: Replaced simple compression system with kreuzberg-ported token reduction engine
- 5 reduction levels:
off,light,moderate,aggressive,maximum - Markdown-aware processing preserves headers, lists, tables, and code blocks
- Stopword removal with language support (English)
- Sentence scoring and selection for aggressive/maximum levels
- Semantic token scoring and hypernym compression for maximum level
- Backward-compatible: old level names (
none/minimal/standard) auto-mapped - Compression config: New fields
preserve_markdown,preserve_code,language; removedremove_duplicates,use_abbreviations,preserve_formatting
Fixed¶
- Includes: Flat ai-rulez structure (rules/, context/ directly) now detected at sub-paths, not just at repository root
- Includes:
findAIRulezDir()andfindSourceDir()both support flat structure at sub-paths for git sources
[3.8.0] - 2026-03-07¶
Added¶
- Built-in domains system: 23 embedded content domains shipped with the binary via
//go:embed - 8 universal domains:
ai-governance(auto-included),security,git-workflow,code-quality,testing,token-efficiency,documentation,default-commands - 9 language domains:
rust,python,typescript,go,java,ruby,php,elixir,csharp - 6 binding domains:
pyo3,napi-rs,magnus,ext-php-rs,rustler,wasm builtinsconfig field with flexible syntax:builtins: true— enable all built-in domainsbuiltins: false— disable all (including auto-includes)builtins: [rust, python, security]— enable specific domainsbuiltins: ["!ai-governance"]— exclude auto-included domainsai-rulez builtins listCLI command to show available built-in domains (supports--json)/iterateslash command (viadefault-commandsbuiltin): instructs LLM to work in implementation/review/adjustment cycles/parallelizeslash command (viadefault-commandsbuiltin): instructs LLM to split tasks among subagentsBuiltinsConfigtype with custom YAML/JSON marshaling supporting boolean and array formats- Builtins merge at lowest priority — local content and includes always override builtin content
Changed¶
- Schema updated:
builtinsfield added, preset enum updated withcodex,amp,junie,opencode
[3.7.3] - 2026-02-19¶
Fixed¶
- Publish workflow now resolves Go from
go.modfor GoReleaser (go-version-file: "go.mod"), preventing asset build failures when the module Go version advances
Changed¶
- Contribution guide now requires Go
1.26+and references the correct release workflow file (.github/workflows/publish.yaml)
[3.7.2] - 2026-02-16¶
Fixed¶
- Claude preset skill rendering now respects frontmatter
targetswhen embedding rules/context in.claude/skills/*/SKILL.md, preventing unrelated content leakage - npm installer now supports offline/private-registry bundled binaries (
bin/ai-rulez-{os}-{arch}), using packaged binaries before attempting GitHub release downloads
[3.7.1] - 2026-02-16¶
Fixed¶
- Windsurf trigger frontmatter now safely YAML-quotes
descriptionandglobvalues, preventing malformed output when values include special characters - Windsurf invalid trigger warning now reflects the original unsupported trigger value before fallback
[3.7.0] - 2026-02-16¶
Added¶
Fixed¶
- Includes system now correctly includes agents in merged include content (PR #83)
- Codex skill generation now always writes
descriptionin.codex/skills/*/SKILL.mdfrontmatter
Changed¶
- Bumped Go toolchain target to
1.26and aligned CI workflows - Bumped
golangci-linttov2.9.0across Taskfile, hooks, and CI - Updated Go, Node, and Python/docs dependencies to latest available versions
[3.6.1] - 2026-01-07¶
Fixed¶
- Windows binary packaging - now uses
.zipformat instead of.tar.gzfor Windows releases
[3.6.0] - 2026-01-05¶
Fixed¶
Preset Generator Skills/Commands Inlining Bug¶
- Claude: Removed skills and commands from CLAUDE.md (77% size reduction - 14K lines to 3.2K lines)
- Skills now only generate to
.claude/skills/{skill-id}/SKILL.md - Commands now only generate to
.claude/skills/{command-id}/SKILL.md - Cursor: Added missing skills and commands directory support
- Skills now generate to
.cursor/skills/{skill-id}/SKILL.md - Commands now generate to
.cursor/commands/{command}.md(was.cursor/rules/cmd-*.mdc) - Codex: Removed skills inlining from AGENTS.md
- Skills now generate to
.codex/skills/{skill-id}/SKILL.md - AGENTS.md only contains Rules and Context
- Gemini: Removed skills inlining from GEMINI.md
- Copilot: Removed skills inlining from
.github/copilot-instructions.md - AMP: Removed skills inlining from AGENTS.md
- OpenCode: Removed skills inlining from AGENTS.md
- Junie: Removed skills inlining from
.junie/guidelines.md
Changed¶
- All preset generators now correctly separate skills into dedicated directories
- Main preset files (CLAUDE.md, GEMINI.md, etc.) only contain Rules and Context
- Skills are lazily loaded from separate files, reducing prompt token usage
[3.5.0] - 2026-01-04¶
Added¶
V3-Native Command System¶
- File-based slash commands in
.ai-rulez/commands/directory with YAML frontmatter - Profile-aware commands (root + domain-specific commands)
- Commands generate to preset-specific formats:
- Claude:
.claude/skills/{command-name}/SKILL.md - Cursor:
.cursor/rules/cmd-{name}.mdc - Continue.dev: Entries in
.continue/prompts/ai_rulez_prompts.yaml - Support for all 18 presets
- Command metadata: name, aliases, description, usage, shortcut, priority, category, targets
- V2 command migration support via
ai-rulez migrate v3
Prompt Compression¶
- Configurable compression levels: none, minimal, standard, aggressive
- Simple optimizations without external dependencies:
- Whitespace removal (trailing spaces, excessive blank lines)
- Priority label compaction
- Abbreviations (aggressive mode)
- Context optimization: summaries with @ links instead of full content (34% size reduction)
- Compression stats logging during generation
Context File Optimization¶
- Required
summaryfield in context frontmatter for concise descriptions - Context rendered as summaries with @ links to full files
- MCP
list_contextstool added to list context files with names and summaries - Enables agents to fetch full context only when needed
Changed¶
- Remote includes cache moved from
.remote-cache/to system cache directory - macOS:
~/Library/Caches/ai-rulez/includes/ - Linux:
~/.cache/ai-rulez/includes/ - Windows:
%LocalAppData%/ai-rulez/includes/ - Context files now require
summaryfield in frontmatter - CLAUDE.md and other presets significantly smaller (9.5K vs 14K, 34% reduction)
Fixed¶
- Include system now properly merges commands from remote sources
- Scanner properly scans commands in root and domain directories
- Default profile now includes commands in content tree
3.4.1 - 2026-01-03¶
Added¶
- SSH git clone support for private repositories - automatically uses
git clonefor SSH URLs (git@...,ssh://...) - Support for self-hosted GitLab instances and other GitLab-compatible git servers
- Support for repositories where root IS the ai-rulez structure (no nested
.ai-rulez/directory) - Automatic detection of repository structure (standard vs root-level)
Changed¶
- Git includes now use native SSH cloning when SSH URLs are detected, leveraging existing SSH key configuration
- Improved git include fetching to skip
.gitdirectory when copying repository content
Documentation¶
- Added comprehensive SSH cloning documentation in docs/includes.md
- Added repository structure support documentation
- Added self-hosted GitLab examples and requirements
3.4.0 - 2026-01-03¶
Added¶
- Configurable header styles for generated files (detailed, compact, minimal)
- CLAUDE.md generation to claude preset
- Enhanced headers with AI-RULEZ explanation, folder structure, and MCP server usage instructions
- Markdown formatting support using goldmark and goldmark-markdown
- Markdown processor utilities to normalize embedded content (strip duplicate H1 headings, normalize blank lines)
- Markdownlint configuration for generated files
- Comprehensive documentation for header configuration in docs/configuration.md
Changed¶
- All 11 presets now include enhanced headers with AI agent instructions
- Generated markdown files now pass markdownlint validation
- Headers now explain what ai-rulez is, the .ai-rulez folder structure, and how to use the MCP server
- Embedded content processing removes duplicate headings and normalizes formatting
Dependencies¶
- Added github.com/yuin/goldmark v1.7.13
- Added github.com/teekennedy/goldmark-markdown v0.5.1
3.3.2 - 2026-01-02¶
Fixed¶
- SSH git URL conversion in includes system - now properly converts SSH URLs to HTTPS for archive downloads
- Added support for multiple SSH URL formats:
git@host:owner/repo.git,ssh://git@host/owner/repo.git - Updated validation to accept SSH URLs alongside HTTP/HTTPS URLs
Documentation¶
- Added comprehensive examples for Git includes with SSH and HTTPS URLs in README
- Updated includes documentation with supported Git URL formats and include options
3.3.1 - 2025-12-31¶
Fixed¶
- SSH git URL detection in includes system - now properly detects
git@host:pathformat URLs - Previously only HTTP/HTTPS URLs were recognized, causing SSH git URLs to be treated as local paths
3.3.0 - 2025-12-31¶
Fixed¶
- Complete agents support in includes system
- Add agents scanning support to includes and scanner
Changed¶
- Bump actions/cache from 4 to 5
- Bump actions/upload-artifact from 4 to 6
3.2.2 - 2025-12-28¶
Added¶
- Init now creates root and domain agent directories by default
- Generated MCP config now includes the ai-rulez MCP server
Fixed¶
- MCP tool configs now render with structured MCP output for supported tools
Changed¶
- Bumped golangci-lint to v2.7.2 in Taskfile and CI
3.2.1 - 2025-12-28¶
Fixed¶
- Gitignore updates now use relative paths instead of absolute machine-specific paths
- .ai-rulez directory is no longer added to .gitignore (source of truth should be tracked)
- Added tests to verify gitignore path handling
3.2.0 - 2025-12-28¶
Added¶
- Full agent/subagent support in V3 configuration with
.ai-rulez/agents/directory - Auto-migration feature in generate command (detects V2 configs and migrates automatically)
- Interactive prompting for migration in terminal environments
- Silent auto-migration in CI environments
--auto-migrateflag for explicit migration control- Agent metadata support (name, description, model, tools, permission_mode, skills)
- Claude Code subagent format generation to
.claude/agents/
Fixed¶
- Migration mapping corrected: V2 sections → V3 skills, V2 agents → V3 agents
- Agent model field now preserved in YAML frontmatter during migration
- Backup directories automatically deleted on successful migration
- V3→V2 conversion now uses correct agent source
- Default profile now includes agents in generated content
- Code quality improvements (removed unused functions, reduced cyclomatic complexity)
Changed¶
- Dependencies updated to latest minor versions (19 packages upgraded)
- Migration now creates proper directory structure for skills (skills/{id}/SKILL.md)
3.1.0 - 2025-12-27¶
Added¶
- Migrate command for V2 to V3 configuration migration
- Comprehensive test suite for migrate command (27 tests covering command structure, flags, and utility functions)
- Integration test placeholder to prevent test runner errors
Fixed¶
- Windows path separator issues in tests (content_test.go, validation_test.go, local_test.go)
- Windows absolute path generation for cross-platform test compatibility
- Test coverage for migrate command utilities (CopyDir, CreateBackup, detectV2Config)
3.0.0 - 2025-12-27¶
Added¶
- Directory-based configuration system (
.ai-rulez/directory structure) - CRUD operations via CLI commands (domain, add, remove, list, include, profile)
- 22 MCP tools for AI assistant integration
- Domain separation for organizing rules by team/area
- Profile system for generating different configs for different teams
- Includes system for composing from local packages or Git repositories
Changed¶
- BREAKING: Configuration format changed from single YAML to directory structure
- BREAKING: Init command no longer uses AI agents for dynamic initialization
- Documentation simplified and focused on V3 only
Removed¶
- BREAKING: Enforce command removed
- BREAKING: V2 dynamic init with AI agents removed
- V2 single-file YAML configuration support
2.4.0 - 2025-10-22¶
Fixed¶
- CLI MCP interference with template-generated files
- Output type values in AI-generated configurations
2.3.0 - 2025-10-05¶
Added¶
- AI-powered rule enforcement system
- Automatic gitignore management
- Junie preset with lefthook configuration
2.2.0 - 2025-09-20¶
Added¶
- MCP file-based configuration system for Claude and other tools
2.1.0 - 2025-08-20¶
Added¶
- CLI MCP integration for Claude
- Improved init phase system
Fixed¶
- Cross-platform binary extensions for Windows support
- Homebrew formula structure
2.0.0 - 2025-07-30¶
Added¶
- Schema v2 with priority enum system
- Named target resolution for filter functions
Changed¶
- BREAKING: Updated schema to v2 with priority enum system
- Unified section field naming to use 'name' instead of 'title'
1.6.0 - 2025-07-10¶
Added¶
- Target filtering and named targets support
1.5.0 - 2025-06-25¶
Added¶
- Initial release with core configuration generation
- Rule definition system
- Template-based generator