x_aeon_agents 1.0.31 โ†’ 1.0.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a3ff43b4352a549cc20bf1b286d89aa551f549c6109811c7456c3393e39f3184
4
- data.tar.gz: 5671b1fe28a848307a12316ce54e962db5a67c3a6b0872c6f3034ca0c7c2478e
3
+ metadata.gz: 59c6b413059e9d1c9736beb7b8c254f9e8c16fc704c95fa45e9485d3e8d887e6
4
+ data.tar.gz: 933c880d6d65f72d20e519cab4003f7dd626447d8cde056fddf6bb21391f5ef3
5
5
  SHA512:
6
- metadata.gz: 184273cc4819f1aaa01dc74f51a6319b8a5d30e5e7dddf83a85fadb52d14246c9a3b136a46ab39eccc43e99ee38d1a9ed7bbb36a52a698e5a32cd73fe554239e
7
- data.tar.gz: 0b5e05209e2e5a03d3de7c411e2686a9ee5672a343f27b81ba202ef5821ca97f40e0fd5a4003d19c81a3c7aaa7863d2ac3ee2f9d03fce4a6da0e17cd731a988d
6
+ metadata.gz: 8a68a25a261b073291db1e465a46fe99b1c9ec6338a09935c47160fd4fd3bca7802c8be801b59299d368c43102db64f6248779a7eee7976d2dd879f12d4e389a
7
+ data.tar.gz: 1e86923809fcc90787957de6b3ad5b982f4500df5733d48ddb5d8dad5efc0dc2dd1102ee5ca7ad2f7725d47d448d3eda4ede8a2fa2238f5749f5aa1a56c4f25e
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ # [v1.0.32](https://github.com/Muriel-Salvan/x_aeon_agents/compare/v1.0.31...v1.0.32) (2026-09-10 16:56:38)
2
+
3
+ ### Patches
4
+
5
+ * [docs: restructure README and ship example config template](https://github.com/Muriel-Salvan/x_aeon_agents/commit/681d705042f160b1504b222570467775aeed188a)
6
+
1
7
  # [v1.0.31](https://github.com/Muriel-Salvan/x_aeon_agents/compare/v1.0.30...v1.0.31) (2026-09-10 15:11:18)
2
8
 
3
9
  ### Patches
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  # x_aeon_agents
4
4
 
5
- **x_aeon_agents** is a Ruby gem and CLI that arms AI assistants with ready-to-use skills to automate everyday development workflows for X-Aeon projects.
5
+ **Executable software-engineering workflows for coding agents** โ€” a Ruby gem that packages composable AI agents behind an `xaa` CLI and a reusable library to automate everyday development workflows.
6
6
 
7
7
  [![Build](https://github.com/Muriel-Salvan/x_aeon_agents/actions/workflows/continuous_integration.yml/badge.svg)](https://github.com/Muriel-Salvan/x_aeon_agents/actions/workflows/continuous_integration.yml)
8
8
  [![Test Coverage](https://img.shields.io/codecov/c/gh/Muriel-Salvan/x_aeon_agents)](https://codecov.io/gh/Muriel-Salvan/x_aeon_agents)
@@ -13,16 +13,16 @@
13
13
 
14
14
  </div>
15
15
 
16
- **x_aeon_agents** is a ๐Ÿ’Ž Ruby gem that gives AI assistants a **ready-to-use skill set** so they can automate everyday development workflows for X-Aeon projects. ๐Ÿค–
16
+ **x_aeon_agents** turns coding agents into participants in *explicit, repeatable and quality software-engineering processes* โ€” instead of letting the agent invent its own workflow on the fly.
17
17
 
18
- Powered by the `xaa` command-line interface (and usable as a library too), it takes care of:
18
+ Powered by the `xaa` command-line interface (and usable as a **Ruby library** too), it packages a suite of composable AI agents that automate everyday development tasks:
19
19
 
20
20
  - ๐Ÿ“ฌ **Pull Request reviews** โ€” automatically read, address and reply to GitHub review comments
21
21
  - ๐Ÿ“ **Commit messages** โ€” generate meaningful descriptions for your staged changes
22
+ - ๐Ÿš€ **Issue implementation** โ€” turn GitHub issues into working code and open Pull Requests
22
23
  - ๐Ÿ“š **README generation** โ€” build documentation sections straight from your codebase
23
24
  - ๐Ÿ” **Git diff interpretation** โ€” summarize what changed and why
24
- - ๐Ÿš€ **Issue implementation** โ€” turn GitHub issues into working code
25
- - ๐Ÿ› ๏ธ **Task bootstrapping** โ€” create git worktrees and feature branches in seconds
25
+ - ๐ŸŒฟ **Task bootstrapping** โ€” create git worktrees and feature branches in seconds
26
26
  - ๐Ÿ”ง **Skill templating** โ€” generate reusable agent workflows from ERB templates
27
27
 
28
28
  Use it as a **โšก CLI** in your terminal or as a **๐Ÿ“ฆ library** inside your Ruby projects.
@@ -33,16 +33,16 @@ Use it as a **โšก CLI** in your terminal or as a **๐Ÿ“ฆ library** inside your Ru
33
33
  - [Prerequisites](#prerequisites)
34
34
  - [Install](#install)
35
35
  - [Configure](#configure)
36
- - [Optional configuration file](#optional-configuration-file)
37
36
  - [Use the CLI](#use-the-cli)
38
37
  - [Use as a library](#use-as-a-library)
39
38
  - [Requirements](#requirements)
40
39
  - [Features](#features)
41
40
  - [Public API](#public-api)
42
41
  - [Executable: `xaa`](#executable-xaa)
42
+ - [Config DSL file (`.x_aeon_agents.rb`)](#config-dsl-file-x_aeon_agentsrb)
43
43
  - [`XAeonAgents::Config`](#xaeonagentsconfig)
44
- - [`XAeonAgents::AgentOptions`](#xaeonagentsagentoptions)
45
44
  - [`XAeonAgents::GenHelpers`](#xaeonagentsgenhelpers)
45
+ - [`XAeonAgents::Logger`](#xaeonagentslogger)
46
46
  - [Documentation](#documentation)
47
47
  - [Library public API](#library-public-api)
48
48
  - [How it works](#how-it-works)
@@ -78,10 +78,12 @@ Use it as a **โšก CLI** in your terminal or as a **๐Ÿ“ฆ library** inside your Ru
78
78
 
79
79
  ### Prerequisites
80
80
 
81
- - Ruby `>= 3.1`
82
- - An OpenRouter API key (`OPENROUTER_API_KEY`) so the built-in agents can call an LLM
83
- - A GitHub token (`GITHUB_TOKEN`) for features that talk to GitHub (Pull Requests, issues, comments)
84
- - Optionally a Cline API key (`CLINE_API_KEY`) when driving the Cline agent
81
+ - **Ruby** `>= 3.1` (RubyGems/Bundler required to install the gem)
82
+ - **Git** command-line client available in `PATH`
83
+ - **GitHub CLI (`gh`)** installed and authenticated for Pull Request / issue features
84
+ - An **OpenRouter API key** (`OPENROUTER_API_KEY`) to power the AI agents
85
+ - A **GitHub token** (`GITHUB_TOKEN`) for features that talk to GitHub
86
+ - Optionally a **Cline API key** (`CLINE_API_KEY`) when driving the Cline agent
85
87
 
86
88
  ### Install
87
89
 
@@ -103,79 +105,24 @@ bundle install
103
105
 
104
106
  ### Configure
105
107
 
106
- Export the required credentials as environment variables (the CLI reads them automatically):
108
+ Export the required credentials as environment variables (the CLI and library read them automatically):
107
109
 
108
110
  ```bash
109
111
  export OPENROUTER_API_KEY="sk-or-..."
110
112
  export GITHUB_TOKEN="ghp_..."
111
113
  ```
112
114
 
113
- ### Optional configuration file
114
-
115
- You can fine-tune behaviour with an optional `.x_aeon_agents.rb` configuration file, read at the start of every `xaa` command:
116
-
117
- - `~/.x_aeon_agents.rb` โ€” in your **home directory**, for *global / user-level* settings;
118
- - `.x_aeon_agents.rb` โ€” in the **current project directory**, for *project-level* settings;
119
- - any path stored in the **`X_AEON_AGENTS_CONFIG`** environment variable, for *explicitly designated* settings.
120
-
121
- When several exist, they are evaluated in that order and the last one wins: the project file overrides the global one, and the `X_AEON_AGENTS_CONFIG` file overrides them both. Exposed directives:
122
-
123
- - `debug true` / `debug false` โ€” enable or disable debug logging. An explicit `--debug` / `--no-debug` command-line flag always overrides it, and when neither the file nor a flag sets a value, the `X_AEON_AGENTS_DEBUG` environment variable is still honoured.
124
- - `cline_api_key`, `openrouter_api_key` and `github_token` โ€” declare, using a block, custom Ruby code to retrieve the corresponding secret when it is needed, instead of relying on the `CLINE_API_KEY` / `OPENROUTER_API_KEY` / `GITHUB_TOKEN` environment variables:
115
+ For fine-tuning, you can create an optional `.x_aeon_agents.rb` configuration file in your home directory (`~/.x_aeon_agents.rb` for global settings) or in the current project directory (for project-level settings). It is evaluated at the start of every `xaa` command. See the [Config DSL file](#config-dsl-file-x_aeon_agentsrb) section for the full DSL reference. For example, to enable debug logging and declare a secret retrieval block:
125
116
 
126
117
  ```ruby
127
- cline_api_key do
118
+ debug true
119
+
120
+ openrouter_api_key do
128
121
  # Any Ruby code that returns the key
129
122
  File.read('/path/to/my/key').strip
130
123
  end
131
124
  ```
132
125
 
133
- The block is evaluated lazily, only the first time the secret is actually needed, and its result is then cached for the whole session.
134
- - `setup_project` โ€” declare, using a block, the steps to execute in a freshly created git worktree to install the project's dependencies (used by the `start-task` command):
135
-
136
- ```ruby
137
- setup_project do
138
- system 'bundle install'
139
- end
140
- ```
141
-
142
- The block is evaluated right after the worktree has been created, with the current directory set to the worktree. If it is not defined, no setup step is executed.
143
- - `test_project_cmd` โ€” declare the command line used to run the project's tests suite, executed by the `implement` command after each code change and after each fix made by the Tester agent:
144
-
145
- ```ruby
146
- test_project_cmd 'bundle exec rspec'
147
- ```
148
-
149
- If it is not defined, the `implement` command does not run any tests.
150
- - `on_open_worktree` โ€” declare, using a block, a callback to execute every time the `start-task` command opens a worktree (freshly created or already existing), after the branch has been pushed to the remote. The block is given the worktree's directory as parameter:
151
-
152
- ```ruby
153
- on_open_worktree do |dir|
154
- system "VSCodium.exe \"#{dir}\""
155
- end
156
- ```
157
-
158
- If it is not defined, nothing is executed when a worktree is opened.
159
-
160
- - `configure_agent` โ€” declare, using a block, the default kwargs to be used when initializing agents of a given class. The block is evaluated every time an agent of this class is instantiated: it is given the currently merged configuration of the agent (a Hash of kwargs, that can be modified in place), and can return a Hash of additional kwargs to be merged into this configuration:
161
-
162
- ```ruby
163
- configure_agent(:PlanGeneratorAgent) do
164
- {
165
- model: 'deepseek/deepseek-v4-flash',
166
- cli_options: { plan: true }
167
- }
168
- end
169
-
170
- configure_agent(:PlanGeneratorAgent) do |agent_config|
171
- agent_config[:skills].push('applying-ruby-conventions')
172
- agent_config
173
- end
174
- ```
175
-
176
- This method is re-entrant: it can be called several times for the same agent class, from the same config file or from different ones (global, project, env-var designated): each call sees the configuration accumulated by the previous ones, in the order the config files are evaluated. This lets a global config define base settings, and a project config read and adapt them.
177
- For example, to always run in debug mode inside a given project, create a `.x_aeon_agents.rb` file in that project directory containing `debug true`.
178
-
179
126
  ### Use the CLI
180
127
 
181
128
  The `xaa` command is installed alongside the gem. Run it from inside any Git repository.
@@ -204,18 +151,12 @@ Generate or update the project README from the codebase:
204
151
  xaa generate-readme
205
152
  ```
206
153
 
207
- Ask a quick one-off question to the agent:
154
+ Ask a quick one-off question to the AI agent:
208
155
 
209
156
  ```bash
210
157
  xaa prompt "What is the capital of France?"
211
158
  ```
212
159
 
213
- Bootstrap a new task in a git worktree:
214
-
215
- ```bash
216
- xaa start-task --branch feature/my-task
217
- ```
218
-
219
160
  ### Use as a library
220
161
 
221
162
  Require the gem and configure it in your Ruby code:
@@ -234,53 +175,160 @@ XAeonAgents::Agents::CommitterAgent.new.run
234
175
 
235
176
  ## Requirements
236
177
 
237
- - **Ruby** `>= 3.1` โ€” the `xaa` CLI and library are Ruby-based (RubyGems/Bundler needed to install the gem)
178
+ - **Operating system** โ€” any platform supported by Ruby (Linux, macOS, Windows)
179
+ - **Ruby** `>= 3.1` (with RubyGems/Bundler) โ€” the `xaa` CLI and the library are Ruby-based
238
180
  - **Git** command-line client in `PATH` โ€” the agents operate on repositories, branches, worktrees and commits
239
181
  - **GitHub CLI (`gh`)** installed and authenticated โ€” used by the Pull Request and comment skills to query and reply via `gh api`
182
+ - **A Git repository** โ€” the `xaa` commands must be run from inside a Git repository
183
+ - **Network access** โ€” to reach the OpenRouter and GitHub APIs
240
184
  - **`GITHUB_TOKEN`** environment variable โ€” a GitHub personal access token used by Octokit for API access
241
185
  - **`OPENROUTER_API_KEY`** environment variable โ€” an OpenRouter API key that powers the AI agents through RubyLLM
242
186
  - **`CLINE_API_KEY`** environment variable (optional) โ€” only required when driving the Cline agent integration
243
187
 
244
- Each of these secrets can alternatively be retrieved by custom code declared in the [optional configuration file](#optional-configuration-file).
188
+ Each of these secrets can alternatively be retrieved by custom code declared in the [Config DSL file](#config-dsl-file-x_aeon_agentsrb).
245
189
 
246
190
  ## Features
247
191
 
248
- **x_aeon_agents** provides a *`xaa`* command-line interface and a reusable Ruby library that package a suite of AI agents to automate everyday development workflows.
192
+ **x_aeon_agents** provides a *`xaa`* command-line interface and a reusable Ruby library that package a suite of composable AI agents to automate everyday development workflows.
249
193
 
250
194
  - ๐Ÿ“ฌ **Pull Request review handling** โ€” auto-detect the PR for the current branch, read agent-addressed comments, fix the code and reply to each thread
251
195
  - ๐Ÿ“ **AI commit messages** โ€” analyze staged changes and generate a meaningful message, with flexible staging strategies (`all`, `if_empty`, `none`)
252
196
  - ๐Ÿš€ **Automated Pull Request creation** โ€” push the branch to GitHub and open a PR against a configurable base ref with an AI-written description
253
- - ๐Ÿ“š **README generation** โ€” build a full README from the codebase with toggleable sections (about, quick start, requirements, features, public API, documentation, how-it-works, development, contributing, license)
254
197
  - ๐Ÿ› **GitHub issue implementation** โ€” turn an issue (and its comments) into working code, committing changes and opening a PR automatically
255
- - ๐Ÿ› ๏ธ **Arbitrary requirement implementation** โ€” pass free-form requirements to a Developer agent that edits the codebase, optionally committing and opening a PR
256
- - ๐Ÿ” **Git diff interpretation** โ€” summarize the working tree changes and the intent behind them relative to any base ref
198
+ - ๐Ÿ› ๏ธ **Arbitrary requirement implementation** โ€” pass free-form requirements to a Developer agent that plans, codes and tests the changes, optionally committing and opening a PR
199
+ - ๐Ÿ“š **README generation** โ€” build a full README from the codebase with 10 toggleable sections (about, quick start, requirements, features, public API, documentation, how-it-works, development, contributing, license)
200
+ - ๐Ÿ” **Git diff interpretation** โ€” summarize the working-tree changes and the intent behind them relative to any base ref
257
201
  - ๐Ÿ’ฌ **One-shot prompts** โ€” send a single prompt to the AI agent and print the response
258
- - ๐Ÿ”ง **Skill templating** โ€” generate skill files from ERB templates, evaluating templates and copying assets to the output directory
202
+ - ๐Ÿ”ง **Skill templating** โ€” generate skill files from ERB templates in `skills.src/`, evaluating templates and copying assets to the output directory
259
203
  - ๐Ÿ“ฅ **Skill installation** โ€” install skills and their recursively-resolved dependencies from a manifest for a chosen agent
260
- - ๐ŸŒฟ **Task bootstrapping** โ€” create a feature branch, set up a git worktree, push it upstream and open it in the editor
204
+ - ๐ŸŒฟ **Task bootstrapping** โ€” create a feature branch, set up a git worktree, push it upstream and open it in the editor, with `setup_project` and `on_open_worktree` hooks
205
+ - ๐Ÿงฉ **Composable agent framework** โ€” orchestrating agents (planner โžœ coder โžœ tester โžœ committer โžœ documenter โžœ PR creator) built on `ai-agents`/`composable_agents`, backed by a Cline/OpenRouter provider via RubyLLM
206
+ - โš™๏ธ **Extensible config DSL** โ€” optional `.x_aeon_agents.rb` file with secrets handling, per-agent model tuning (`configure_agent`) and a project test command
207
+ - ๐Ÿ’พ **Session persistence & debugging** โ€” global `--session-id` to resume AI conversations and a `--debug` flag for verbose logging
261
208
  - ๐Ÿ“ฆ **Reusable Ruby library** โ€” require the gem and trigger agents programmatically (e.g. `Agents::CommitterAgent.new.run`)
262
- - ๐Ÿงฉ **Agent framework & provider integration** โ€” composable agents built on `ai-agents`/`composable_agents`, a Cline/OpenRouter provider, central `Config`, helpers and `GenHelpers`
263
- - ๐Ÿ’พ **Session persistence & debugging** โ€” global `--session-id` for conversation persistence and a `--debug` flag for verbose logging
264
209
 
265
210
  ## Public API
266
211
 
267
- x_aeon_agents exposes a command-line executable and a set of Ruby library entry points. Only the components below are part of the public API (methods tagged in the `Public API` YARD group).
212
+ `x_aeon_agents` exposes one command-line executable (`xaa`) and a small Ruby library surface. Only the entry points below are part of the public API (the executable in `bin/` and the Ruby methods tagged with YARD's `Public API` group).
268
213
 
269
214
  ### Executable: `xaa`
270
215
 
271
- The `bin/xaa` script is the entry point of the CLI. It boots the gem and dispatches `ARGV` to `XAeonAgents::Cli`.
216
+ The `bin/xaa` script is the CLI entry point: it boots the gem and dispatches the arguments to `XAeonAgents::Cli`. Run it from inside any Git repository.
272
217
 
273
- **Usecase** โ€” commit staged changes with an AI-generated message:
218
+ **Usecase** โ€” commit your staged changes with an AI-generated message:
274
219
 
275
220
  ```bash
276
221
  xaa commit
277
222
  ```
278
223
 
279
- More details: [GitHub โ€” bin/xaa](https://github.com/Muriel-Salvan/x_aeon_agents/blob/main/bin/xaa)
224
+ Available commands:
225
+
226
+ | Command | Description |
227
+ | --- | --- |
228
+ | `xaa review-comments [PR_NUMBER]` | Read, address and reply to GitHub Pull Request review comments |
229
+ | `xaa commit` | Commit staged changes with an AI-generated message |
230
+ | `xaa create-pr` | Push the branch and create a GitHub Pull Request |
231
+ | `xaa implement-issue ISSUE_NUMBER` | Implement a GitHub issue with AI |
232
+ | `xaa implement REQUIREMENTS` | Implement free-form requirements with AI |
233
+ | `xaa interpret-diffs [BASE]` | Summarize git diffs relative to a base ref |
234
+ | `xaa generate-readme` | Generate or update the project README from the codebase |
235
+ | `xaa generate-skills` | Generate skill files from ERB templates in `skills.src/` |
236
+ | `xaa install-skills` | Install skills from the `.skills` manifest |
237
+ | `xaa start-task` | Create a feature branch, git worktree, and push it upstream |
238
+ | `xaa prompt PROMPT` | Send a one-shot prompt to the AI agent |
239
+
240
+ More details: [GitHub โ€” bin/xaa](https://github.com/Muriel-Salvan/x_aeon_agents/blob/main/bin/xaa) ยท [RubyDoc โ€” XAeonAgents::Cli](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/Cli)
241
+
242
+ ### Config DSL file (`.x_aeon_agents.rb`)
243
+
244
+ The optional `.x_aeon_agents.rb` configuration file exposes a small Ruby DSL used to fine-tune X-Aeon Agents: retrieve secrets from custom sources, define project setup and testing commands, hook into the worktree lifecycle and tune the default settings of any agent class. It is evaluated at the start of every `xaa` command (and can be loaded manually with `XAeonAgents::Config.load`).
245
+
246
+ **Usecase** โ€” retrieve a secret from a custom source, define the test suite command and tune the coding agent:
247
+
248
+ ```ruby
249
+ openrouter_api_key { File.read('/path/to/my/key').strip }
250
+
251
+ test_project_cmd 'bundle exec rspec --format=documentation'
252
+
253
+ configure_agent(:CoderAgent) do
254
+ { model: 'deepseek/deepseek-v4-flash' }
255
+ end
256
+ ```
257
+
258
+ More details: [GitHub โ€” .x_aeon_agents.example.rb](https://github.com/Muriel-Salvan/x_aeon_agents/blob/main/.x_aeon_agents.example.rb)
259
+
260
+ #### Where the file is loaded from
261
+
262
+ Files are looked up in the following locations and evaluated from the lowest priority (first) to the highest one โ€” so higher-priority settings override lower-priority ones:
263
+
264
+ 1. `~/.x_aeon_agents.rb` โ€” global, per-user settings
265
+ 2. `./.x_aeon_agents.rb` โ€” project-level settings (current directory)
266
+ 3. The path given by the `X_AEON_AGENTS_CONFIG` environment variable, if set โ€” overrides both
267
+
268
+ > [!NOTE]
269
+ > All existing files are evaluated in this order (not just the first one found), and explicit CLI flags (`--debug`) still override everything. The file is evaluated in a cleanroom: only the DSL methods below are exposed at its top level, but regular Ruby code works inside the blocks given to those methods.
270
+
271
+ #### Possible methods
272
+
273
+ | Method | Description |
274
+ | --- | --- |
275
+ | `debug(value)` | Enable debug logging |
276
+ | `cline_api_key { ... }` / `openrouter_api_key { ... }` / `github_token { ... }` | Define the code retrieving a secret |
277
+ | `setup_project { ... }` | Steps to install the project's dependencies in a fresh worktree |
278
+ | `test_project_cmd 'cmd'` | Command line running the project's test suite |
279
+ | `on_open_worktree { \|dir\| ... }` | Callback executed when a worktree is opened |
280
+ | `configure_agent(:AgentClass) { \|cfg\| ... }` | Default kwargs for agents of a given class |
281
+
282
+ - **`debug(value)`** โ€” set the debug mode:
283
+
284
+ ```ruby
285
+ debug true
286
+ ```
287
+
288
+ - **Secret retrieval blocks** โ€” `cline_api_key`, `openrouter_api_key` and `github_token` take a block returning the secret value. Each block is evaluated lazily, only when the secret is needed, and its result is memoized. Secrets are resolved with the precedence *explicit setter โžœ `ENV` variable โžœ config DSL block* (see [`XAeonAgents::Config`](#xaeonagentsconfig)):
289
+
290
+ ```ruby
291
+ github_token { File.read("#{Dir.home}/.github_token").strip }
292
+ ```
293
+
294
+ - **`setup_project { ... }`** โ€” define the steps to execute in a fresh git worktree to install the project's dependencies (used by `xaa start-task`). The block is evaluated only when a fresh worktree is created, with the current directory set to the worktree:
295
+
296
+ ```ruby
297
+ setup_project { system 'bundle install' }
298
+ ```
299
+
300
+ - **`test_project_cmd(command_line)`** โ€” define the command line running the project's test suite, used by `xaa implement` to validate code changes. If not set, no tests are run by the implement command:
301
+
302
+ ```ruby
303
+ test_project_cmd 'bundle exec rspec --format=documentation'
304
+ ```
305
+
306
+ - **`on_open_worktree { |dir| ... }`** โ€” define a callback executed every time a worktree is opened by `xaa start-task` (freshly created or already existing), after the branch has been pushed to the remote. It is given the worktree's directory as parameter:
307
+
308
+ ```ruby
309
+ on_open_worktree { |dir| system "code \"#{dir}\"" }
310
+ ```
311
+
312
+ - **`configure_agent(agent_class_name) { |agent_config| ... }`** โ€” define the default kwargs to be merged when initializing agents of a given class (e.g. `:CoderAgent`). The block is evaluated every time an agent of this class is instantiated: it is given the currently merged configuration (a Hash of kwargs, that can be modified in place), and returns a Hash of additional kwargs merged on top. It is re-entrant: it can be called several times for the same class, from the same file or from different ones (global, project, env-var designated), each call seeing the configuration accumulated by the previous ones. Typical kwargs keys (as used by the agent frameworks):
313
+ - `skills` โ€” Array of skill names the agent should follow
314
+ - `model` โ€” LLM model to use (e.g. `'deepseek/deepseek-v4-flash'`)
315
+ - `cli_options` โ€” Hash of options merged into the Cline CLI invocation (e.g. `plan: true`)
316
+ - `configure_global` โ€” Proc given the Cline global settings to tweak
317
+
318
+ ```ruby
319
+ configure_agent(:PlanGeneratorAgent) do |agent_config|
320
+ {
321
+ skills: %w[applying-ruby-conventions enforcing-project-rules],
322
+ model: 'deepseek/deepseek-v4-flash',
323
+ cli_options: (agent_config[:cli_options] || {}).merge(plan: true),
324
+ configure_global: proc { |global_settings| global_settings.disabled_tools = %w[editor run_commands] }
325
+ }
326
+ end
327
+ ```
280
328
 
281
329
  ### `XAeonAgents::Config`
282
330
 
283
- Singleton holding all configuration of X-Aeon Agents (secrets, data directory, CLI defaults, debug flag). All methods below are part of the public API.
331
+ Singleton module holding all X-Aeon Agents configuration (secrets, data directory, default Cline CLI arguments, debug flag). All methods listed below are part of the `Public API` YARD group.
284
332
 
285
333
  **Usecase** โ€” configure credentials and options at once:
286
334
 
@@ -298,11 +346,12 @@ More details: [RubyDoc โ€” XAeonAgents::Config](https://www.rubydoc.info/gems/x-
298
346
 
299
347
  Public methods:
300
348
  - `configure(**kwargs)` โ€” set any configuration property. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/Config#configure-class_method)
301
- - `cline_api_key` / `cline_api_key=` โ€” Cline API key (also `openrouter_api_key`, `github_token`). [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/Config)
302
- - `data_dir` / `data_dir=` โ€” X-Aeon Agents data directory. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/Config#data_dir-class_method)
349
+ - `cline_api_key` / `cline_api_key=`, `openrouter_api_key` / `openrouter_api_key=`, `github_token` / `github_token=` โ€” lazily-resolved secrets (ENV or config DSL). [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/Config#cline_api_key-class_method)
350
+ - `data_dir` / `data_dir=` โ€” data directory (`.x_aeon_agents` by default). [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/Config#data_dir-class_method)
303
351
  - `default_cline_cli_args` / `default_cline_cli_args=` โ€” default Cline CLI arguments. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/Config#default_cline_cli_args-class_method)
304
- - `debug` / `debug=` โ€” debug mode. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/Config#debug-class_method)
305
- - `config_paths` โ€” locate the optional `.x_aeon_agents.rb` config file(s) (home dir, then project dir). [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/Config)
352
+ - `debug` / `debug=` โ€” enable debug logging. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/Config#debug-class_method)
353
+ - `config_paths` โ€” candidate paths of the optional `.x_aeon_agents.rb` config file. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/Config#config_paths-class_method)
354
+ - `logger` โ€” the shared logger instance. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/Config#logger-class_method)
306
355
 
307
356
  ### `XAeonAgents::GenHelpers`
308
357
 
@@ -320,80 +369,99 @@ Public methods:
320
369
  - `skill(description:, dependencies:, plan:, metadata:)` โ€” define skill metadata / YAML frontmatter. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#skill-instance_method)
321
370
  - `goal(goal_desc = nil)` โ€” define or get the skill goal. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#goal-instance_method)
322
371
  - `goal_sentence` โ€” the skill goal as a sentence. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#goal_sentence-instance_method)
323
- - `announce` โ€” prompt announcing the agent is working on the skill. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#announce-instance_method)
372
+ - `announce` โ€” the prompt announcing the agent is working on the skill. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#announce-instance_method)
324
373
  - `tmp_path` โ€” default temporary folder for agents. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#tmp_path-instance_method)
325
- - `rule(title, description:, type:, bad:, good:, rationale:)` โ€” generate a documented rule block. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#rule-instance_method)
374
+ - `rule(title, ...)` โ€” generate a documented rule block. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#rule-instance_method)
326
375
  - `ordered_todo_list(&erb_block)` โ€” generate a numbered todo list section. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#ordered_todo_list-instance_method)
327
- - `when_to_use(&erb_block)` โ€” generate the "When to use it" section. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#when_to_use-instance_method)
376
+ - `when_to_use(&erb_block)` โ€” generate the โ€œWhen to use itโ€ section. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#when_to_use-instance_method)
328
377
  - `name` โ€” the skill name being generated. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#name-instance_method)
329
378
  - `self.config(skill_name)` โ€” read a skill's `.skill_config.yml`. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#config-class_method)
330
379
 
331
- It also exposes `XAeonAgents::GenHelpers::ErbEvaluator`, a small public helper class that evaluates ERB skill templates with this DSL (`ErbEvaluator#new(erb_file)` and `ErbEvaluator#result`). [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers/ErbEvaluator)
380
+ ### `XAeonAgents::Logger`
381
+
382
+ The shared status-aware logger used by all X-Aeon Agents components (accessible through `XAeonAgents::Config.logger`). It inherits from the standard Ruby `Logger`; the methods below are part of the public API, on top of the standard `::Logger` interface.
383
+
384
+ **Usecase** โ€” write a log line, then dump a raw message:
385
+
386
+ ```ruby
387
+ XAeonAgents::Config.logger.info 'Fetching repository metadata'
388
+ XAeonAgents::Config.logger << 'machine-readable output'
389
+ ```
390
+
391
+ More details: [RubyDoc โ€” XAeonAgents::Logger](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/Logger)
392
+
393
+ Public methods:
394
+ - `add(severity, message = nil, progname = nil, &block)` โ€” log a message with a given severity. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/Logger#add-instance_method)
395
+ - `log(severity, message = nil, progname = nil, &block)` โ€” alias of `add`. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/Logger#log-instance_method)
396
+ - `<<(message)` โ€” output a raw, unformatted message. [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/Logger#%3C%3C-instance_method)
332
397
 
333
398
  ## Documentation
334
399
 
335
- - **GitHub repository** โ€” main project page with source code, issues and CI: [github.com/Muriel-Salvan/x_aeon_agents](https://github.com/Muriel-Salvan/x_aeon_agents)
336
- - **Project README** โ€” overview, CLI usage and skill-authoring guidelines: [github.com/Muriel-Salvan/x_aeon_agents/blob/main/README.md](https://github.com/Muriel-Salvan/x_aeon_agents/blob/main/README.md)
337
- - **RubyDoc.info** โ€” full API reference generated from the source (YARD): [rubydoc.info/gems/x_aeon_agents](https://www.rubydoc.info/gems/x_aeon_agents)
338
- - **RubyGems** โ€” published gem page and release history: [rubygems.org/gems/x_aeon_agents](https://rubygems.org/gems/x_aeon_agents)
400
+ - **GitHub repository** โ€” main project page with source code, issues and CI: [github.com/Muriel-Salvan/x\_aeon\_agents](https://github.com/Muriel-Salvan/x_aeon_agents)
401
+ - **Project README** โ€” overview, CLI usage and skill-authoring guidelines: [github.com/Muriel-Salvan/x\_aeon\_agents/blob/main/README.md](https://github.com/Muriel-Salvan/x_aeon_agents/blob/main/README.md)
402
+ - **RubyDoc.info** โ€” full API reference generated from the source (YARD): [rubydoc.info/gems/x\_aeon\_agents](https://www.rubydoc.info/gems/x_aeon_agents)
403
+ - **RubyGems** โ€” published gem page and release history: [rubygems.org/gems/x\_aeon\_agents](https://rubygems.org/gems/x_aeon_agents)
339
404
 
340
405
  ### Library public API
341
406
 
342
407
  The documented public methods (browseable on RubyDoc.info):
343
408
 
344
409
  - `XAeonAgents` module:
345
- - `agent_name` โ€” [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents#agent_name-class_method)
346
- - `agent_signature` โ€” [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents#agent_signature-class_method)
347
- - `VERSION` โ€” [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents#VERSION-constant)
410
+ - `agent_name` โ€” [doc](https://www.rubydoc.info/gems/x_aeon_agents/XAeonAgents#agent_name-class_method)
411
+ - `agent_signature` โ€” [doc](https://www.rubydoc.info/gems/x_aeon_agents/XAeonAgents#agent_signature-class_method)
412
+ - `VERSION` โ€” [doc](https://www.rubydoc.info/gems/x_aeon_agents/XAeonAgents#VERSION-constant)
348
413
  - `XAeonAgents::GenHelpers` โ€” DSL helpers for generating skill content from ERB templates:
349
- - `skill` โ€” [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#skill-instance_method)
350
- - `goal` โ€” [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#goal-instance_method)
351
- - `goal_sentence` โ€” [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#goal_sentence-instance_method)
352
- - `announce` โ€” [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#announce-instance_method)
353
- - `tmp_path` โ€” [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#tmp_path-instance_method)
354
- - `rule` โ€” [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#rule-instance_method)
355
- - `ordered_todo_list` โ€” [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#ordered_todo_list-instance_method)
356
- - `when_to_use` โ€” [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#when_to_use-instance_method)
357
- - `name` โ€” [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#name-instance_method)
358
- - `config` (class method) โ€” [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers#config-class_method)
414
+ - `skill` โ€” [doc](https://www.rubydoc.info/gems/x_aeon_agents/XAeonAgents/GenHelpers#skill-instance_method)
415
+ - `goal` โ€” [doc](https://www.rubydoc.info/gems/x_aeon_agents/XAeonAgents/GenHelpers#goal-instance_method)
416
+ - `goal_sentence` โ€” [doc](https://www.rubydoc.info/gems/x_aeon_agents/XAeonAgents/GenHelpers#goal_sentence-instance_method)
417
+ - `announce` โ€” [doc](https://www.rubydoc.info/gems/x_aeon_agents/XAeonAgents/GenHelpers#announce-instance_method)
418
+ - `tmp_path` โ€” [doc](https://www.rubydoc.info/gems/x_aeon_agents/XAeonAgents/GenHelpers#tmp_path-instance_method)
419
+ - `rule` โ€” [doc](https://www.rubydoc.info/gems/x_aeon_agents/XAeonAgents/GenHelpers#rule-instance_method)
420
+ - `ordered_todo_list` โ€” [doc](https://www.rubydoc.info/gems/x_aeon_agents/XAeonAgents/GenHelpers#ordered_todo_list-instance_method)
421
+ - `when_to_use` โ€” [doc](https://www.rubydoc.info/gems/x_aeon_agents/XAeonAgents/GenHelpers#when_to_use-instance_method)
422
+ - `name` โ€” [doc](https://www.rubydoc.info/gems/x_aeon_agents/XAeonAgents/GenHelpers#name-instance_method)
423
+ - `config` (class method) โ€” [doc](https://www.rubydoc.info/gems/x_aeon_agents/XAeonAgents/GenHelpers#config-class_method)
359
424
  - `XAeonAgents::GenHelpers::ErbEvaluator` โ€” helper class to evaluate ERB skill templates:
360
- - `new` โ€” [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers/ErbEvaluator#new-instance_method)
361
- - `result` โ€” [doc](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/GenHelpers/ErbEvaluator#result-instance_method)
425
+ - `new` โ€” [doc](https://www.rubydoc.info/gems/x_aeon_agents/XAeonAgents/GenHelpers/ErbEvaluator#new-instance_method)
426
+ - `result` โ€” [doc](https://www.rubydoc.info/gems/x_aeon_agents/XAeonAgents/GenHelpers/ErbEvaluator#result-instance_method)
362
427
 
363
428
  ## How it works
364
429
 
365
- `x_aeon_agents` is a ๐Ÿ’Ž Ruby gem organized around three layers: a **CLI**, a set of **orchestrating agents**, and a shared **configuration / helper** core.
430
+ `x_aeon_agents` is a ๐Ÿ’Ž **Ruby gem** organized into three layers: a **CLI**, a set of **orchestrating agents**, and a shared **configuration / helper** core that glues them together.
366
431
 
367
432
  ### Entry point ๐Ÿšช
368
433
 
369
- The `xaa` executable ([`bin/xaa`](https://github.com/Muriel-Salvan/x_aeon_agents/blob/main/bin/xaa)) boots Zeitwerk auto-loading and calls `XAeonAgents::Cli.start(ARGV)`. The CLI ([`lib/x_aeon_agents/cli.rb`](https://github.com/Muriel-Salvan/x_aeon_agents/blob/main/lib/x_aeon_agents/cli.rb)) is a [Thor](https://github.com/rails/thor) application: each sub-command maps **1:1** to an agent and forwards global options (`--session-id`, `--debug`). On startup, it also reads the optional `.x_aeon_agents.rb` configuration file (home directory, then project directory) so project-level settings can override global ones, and explicit command-line flags override both.
434
+ - The [`xaa`](https://github.com/Muriel-Salvan/x_aeon_agents/blob/main/bin/xaa) executable boots [Zeitwerk](https://github.com/fxn/zeitwerk) auto-loading and calls `XAeonAgents::Cli.start(ARGV)`.
435
+ - The CLI ([`lib/x_aeon_agents/cli.rb`](https://github.com/Muriel-Salvan/x_aeon_agents/blob/main/lib/x_aeon_agents/cli.rb)) is a [Thor](https://github.com/rails/thor) application: every sub-command (`commit`, `create-pr`, `review-comments`, `implement-issue`, `generate-readme`โ€ฆ) maps **1:1** to an agent class.
436
+ - On startup it loads the optional `.x_aeon_agents.rb` config (home directory, then project directory) so project-level settings override global ones, and explicit CLI flags (`--session-id`, `--debug`) override both.
370
437
 
371
438
  ### Agents as composable workflows ๐Ÿงฉ
372
439
 
373
- Every capability (`commit`, `create-pr`, `review-comments`, `implement-issue`, `generate-readme`โ€ฆ) is implemented by an `Agents::*Agent` class. They inherit from `composable_agents` base classes:
440
+ Each capability is implemented by an `Agents::*Agent` class built on `composable_agents`:
374
441
 
375
- - `ComposableAgents::Agent` โ€” pure orchestrators that run shell commands and coordinate children.
376
- - `ComposableAgents::AiAgents::Agent` / `ComposableAgents::Cline::Agent` โ€” LLM-driven agents that execute prompts.
442
+ - `ComposableAgents::Agent` โ€” pure orchestrators that run shell commands and coordinate child agents.
443
+ - `ComposableAgents::AiAgents::Agent` / `ComposableAgents::Cline::Agent` โ€” LLM-driven agents that execute prompts against an AI backend.
377
444
 
378
- Each agent is enriched by the `AgentDefaults` mixin ([`lib/x_aeon_agents/agent_defaults.rb`](https://github.com/Muriel-Salvan/x_aeon_agents/blob/main/lib/x_aeon_agents/agent_defaults.rb)), which:
445
+ Every agent is enriched by the [`AgentDefaults`](https://github.com/Muriel-Salvan/x_aeon_agents/blob/main/lib/x_aeon_agents/agent_defaults.rb) mixin, which:
379
446
 
380
- - injects `new_agent(...)`, `step(...)` and `step_agent(...)` to build multi-step pipelines;
381
- - auto-configures the underlying frameworks (`setup_composable_agents`, `setup_ai_agents`, `setup_cline`);
382
- - sets default constructor kwargs for the underlying AI framework (`strategy` for AI agents, `api_key` + `cli_options` for Cline agents), which can be overwritten per agent class with the `configure_agent` config DSL;
383
- - manages a per-session directory under `Config.data_dir/sessions/<id>`;
384
- - prepends `ArtifactContract` + `Resumable` mixins for input/output validation and pause/resume.
447
+ - injects `new_agent`, `task`, `step` and `step_agent` to build multi-step pipelines;
448
+ - auto-configures the frameworks (`setup_composable_agents`, `setup_ai_agents`, `setup_cline`) and injects per-class defaults (overridable with the `configure_agent` config DSL);
449
+ - enforces **input/output artifact contracts** and adds **resume** support (via the `ArtifactContract` + `Resumable` mixins);
450
+ - gives each agent a per-session directory under `Config.data_dir/sessions/<id>`.
385
451
 
386
452
  ### Orchestration ๐Ÿ”—
387
453
 
388
- A top-level agent decomposes its task into **steps** that delegate to child agents, passing state through a shared `@artifacts` hash referenced via `artifact_ref`. For example, `DeveloperAgent` chains `PlannerAgent` โžœ `CoderAgent` โžœ `TesterAgent` โžœ (optional) `CommitterAgent` / `DocumenterAgent` โžœ (optional) `PullRequestCreatorAgent`.
454
+ A top-level agent decomposes its job into **steps**, delegating each one to child agents. State flows through a shared `@artifacts` hash referenced via `artifact_ref` โ€” e.g. `DeveloperAgent` chains `PlannerAgent` โžœ `CoderAgent` โžœ `TesterAgent` โžœ `CommitterAgent` / `DocumenterAgent` โžœ `PullRequestCreatorAgent`:
389
455
 
390
456
  ```mermaid
391
457
  flowchart TD
392
458
  CLI[XAeonAgents::Cli / xaa] -->|instantiates + run| A[Top-level Agent]
393
- A -->|step_agent| P[PlannerAgent]
394
- A -->|step_agent| C[CoderAgent]
395
- A -->|step_agent| T[TesterAgent]
396
- A -->|step_agent| K[CommitterAgent]
459
+ A -->|task / step_agent| P[PlannerAgent]
460
+ A -->|task / step_agent| C[CoderAgent]
461
+ A -->|task / step_agent| T[TesterAgent]
462
+ A -->|task / step_agent| K[CommitterAgent]
463
+ A -->|task / step_agent| D[DocumenterAgent]
464
+ A -->|task / step_agent| PR[PullRequestCreatorAgent]
397
465
  C -.->|artifacts hash| T
398
466
  T -.->|artifacts hash| K
399
467
  subgraph LLM[AI backends]
@@ -405,23 +473,30 @@ flowchart TD
405
473
 
406
474
  ### Configuration & providers ๐Ÿ”
407
475
 
408
- [`XAeonAgents::Config`](https://www.rubydoc.info/gems/x-aeon_agents/XAeonAgents/Config) is a singleton holding secrets (`cline_api_key`, `openrouter_api_key`, `github_token`), the data directory and debug flag. Agents' options (model, strategy, ...) can be customized per agent class with the `configure_agent` config DSL. LLM access flows through `Providers::Cline` ([`lib/x_aeon_agents/providers/cline.rb`](https://github.com/Muriel-Salvan/x_aeon_agents/blob/main/lib/x_aeon_agents/providers/cline.rb)), an OpenAI-compatible [RubyLLM](https://github.com/crmne/ruby_llm) provider targeting the Cline API.
476
+ - [`XAeonAgents::Config`](https://www.rubydoc.info/gems/x_aeon_agents/XAeonAgents/Config) is a singleton holding secrets (`cline_api_key`, `openrouter_api_key`, `github_token`), the data directory and the debug flag. Secrets are resolved with the precedence *explicit setter โžœ `ENV` variable โžœ lazy Proc from the config DSL*.
477
+ - LLM calls flow through [`Providers::Cline`](https://github.com/Muriel-Salvan/x_aeon_agents/blob/main/lib/x_aeon_agents/providers/cline.rb), an OpenAI-compatible [RubyLLM](https://github.com/crmne/ruby_llm) provider targeting the Cline API (`https://api.cline.bot/api/v1`) and parsing responses including thinking blocks, tool calls and token usage.
409
478
 
410
479
  ### Skills & ERB templating ๐Ÿ“š
411
480
 
412
- Reusable agent instructions live as Markdown **skills** under `skills/`. Some are generated from ERB templates in `skills.src/` via the `generate-skills` command, evaluated by `XAeonAgents::GenHelpers` ([`lib/x_aeon_agents/gen_helpers.rb`](https://github.com/Muriel-Salvan/x_aeon_agents/blob/main/lib/x_aeon_agents/gen_helpers.rb)) โ€” a DSL that emits YAML front-matter, goals, rules and checklists.
481
+ - Reusable agent instructions live as Markdown **skills** in `skills/`, some generated from ERB templates in `skills.src/`.
482
+ - `xaa generate-skills` evaluates those templates with the [`GenHelpers`](https://github.com/Muriel-Salvan/x_aeon_agents/blob/main/lib/x_aeon_agents/gen_helpers.rb) DSL (via `GenHelpers::ErbEvaluator`) to emit YAML front-matter, goals, rules and checklists.
483
+ - `xaa install-skills` reads the `.skills` manifest and installs each skill together with its recursively-resolved dependencies.
413
484
 
414
485
  ### Helpers ๐Ÿ› ๏ธ
415
486
 
416
- `XAeonAgents::Helpers` ([`lib/x_aeon_agents/helpers.rb`](https://github.com/Muriel-Salvan/x_aeon_agents/blob/main/lib/x_aeon_agents/helpers.rb)) centralizes **Git**, **GitHub (Octokit)**, real-time command execution, diff extraction and interactive content review used across all agents.
487
+ [`XAeonAgents::Helpers`](https://github.com/Muriel-Salvan/x_aeon_agents/blob/main/lib/x_aeon_agents/helpers.rb) centralizes the plumbing used by every agent:
488
+
489
+ - real-time command execution (`run_cmd`) with expected exit status;
490
+ - cached Git / GitHub (Octokit) clients and diff extraction (`git_diff_cached`, `artifact_files_diffs`);
491
+ - interactive content review (opens a temp file via Launchy for human approval).
417
492
 
418
493
  ## Development
419
494
 
420
- This section explains how to set up a local environment to develop **x_aeon_agents**, run its test suite, lint the code and build the gem.
495
+ This section explains how to set up a local environment to develop **x_aeon_agents**, run its test suite, lint the code, build the gem and regenerate the packaged skills.
421
496
 
422
497
  ### Prerequisites
423
498
 
424
- - **Ruby** `>= 3.1` (the CI runs on Ruby `3.4`) and a matching **Bundler**.
499
+ - **Ruby** `>= 3.1` (the CI pipeline runs on Ruby `3.4`) and a matching **Bundler**.
425
500
  - **Git** command-line client.
426
501
  - *(Maintainer only)* **Node.js** and **npm**, required for `skillkit` and `semantic-release` used during packaging and release.
427
502
 
@@ -440,12 +515,12 @@ bundle install
440
515
 
441
516
  ### Project layout
442
517
 
443
- ```
518
+ ```text
444
519
  lib/ # Library source, auto-loaded with Zeitwerk (entry: lib/x_aeon_agents.rb)
445
520
  x_aeon_agents/
446
521
  cli.rb # The `xaa` Thor CLI definition
447
522
  config.rb # Global configuration
448
- agents/ # AI agents (commit, PR, README generation, โ€ฆ)
523
+ agents/ # AI agents (commit, PR, README generation, ...)
449
524
  providers/ # LLM provider integrations
450
525
  gen_helpers.rb # ERB skill template helpers
451
526
  version.rb # Gem version (bumped automatically on release)
@@ -462,7 +537,7 @@ spec/ # RSpec test suite
462
537
 
463
538
  ### Running the test suite
464
539
 
465
- Tests use **RSpec 3** with **SimpleCov** coverage (minimum 97%).
540
+ Tests use **RSpec 3** with **SimpleCov** coverage (minimum 98%).
466
541
 
467
542
  ```bash
468
543
  # Run the whole suite, exactly like the CI does
@@ -475,7 +550,7 @@ bundle exec rspec spec/scenarios/code_quality_spec.rb
475
550
  TEST_DEBUG=1 bundle exec rspec
476
551
  ```
477
552
 
478
- The coverage report is written to `coverage/` (Cobertura format for Codecov). Each example runs with a cleaned, temporary `.x_aeon_agents_test/` data directory (git-ignored), and the application configuration is populated with dummy API keys by `spec_helper.rb`.
553
+ The coverage report is written to `coverage/` (HTML plus Cobertura format for Codecov). Each example runs with a cleaned, temporary `.x_aeon_agents_test/` data directory (git-ignored), and the application configuration is populated with dummy API keys by `spec_helper.rb`.
479
554
 
480
555
  ### Linting
481
556
 
@@ -508,6 +583,8 @@ bundle exec ruby bin/xaa --help
508
583
  bundle exec ruby bin/xaa <command> [options]
509
584
  ```
510
585
 
586
+ Common commands while developing: `xaa start-task --branch feature/my-change` opens a git worktree for a feature branch, `xaa generate-readme` regenerates this README, and `xaa commit` / `xaa create-pr` drive the commit and Pull Request workflow.
587
+
511
588
  Build the gem package locally:
512
589
 
513
590
  ```bash
@@ -534,34 +611,55 @@ Contributors do not need to run these release steps locally โ€” just make sure t
534
611
 
535
612
  ## Contributing
536
613
 
537
- Contributions to **x_aeon_agents** are welcome! This ๐Ÿ’Ž Ruby gem lives on [GitHub](https://github.com/Muriel-Salvan/x_aeon_agents) and is released automatically via `semantic-release`, so a clean, linear history and passing CI keep the project healthy. ๐ŸŒฑ
614
+ Contributions to **x_aeon_agents** are welcome! ๐ŸŒฑ This ๐Ÿ’Ž Ruby gem lives on [GitHub](https://github.com/Muriel-Salvan/x_aeon_agents) and is released automatically via `semantic-release`, so a clean, linear history and passing CI keep the project healthy.
538
615
 
539
616
  ### ๐Ÿ› Reporting issues
617
+
540
618
  - Open a new issue on the [issue tracker](https://github.com/Muriel-Salvan/x_aeon_agents/issues) and describe the *expected* vs *actual* behavior, your Ruby version, and clear steps to reproduce.
541
619
  - For a bug in a specific skill, mention the skill name (e.g. `addressing-pull-request-comments`) and the command you ran.
542
620
 
543
621
  ### ๐Ÿด Forking & branching
622
+
544
623
  - ๐Ÿ“Œ *Fork* the repo and add upstream as a remote named `github`: `git remote add github https://github.com/Muriel-Salvan/x_aeon_agents.git`.
545
624
  - Create a *feature branch* from `main`; the project favors git worktrees, so you can run `xaa start-task --branch feature/my-change`.
546
625
  - Keep your branch current by *rebasing* on `github/main` (`git fetch --all && git rebase github/main`) โ€” never merge.
547
626
 
548
627
  ### ๐Ÿงช Running the tests
549
- To run the suite locally, install the test dependencies with `bundle install` (the `Gemfile` pulls in RSpec 3, RuboCop, SimpleCov and its Cobertura formatter), then launch the full suite exactly like CI via `bundle exec rspec --format documentation`, or scope it to a single file such as `bundle exec rspec spec/scenarios/code_quality_spec.rb`; each example runs against a temporary, auto-cleaned `.x_aeon_agents_test/` directory with dummy API keys injected by `spec/spec_helper.rb`, and SimpleCov enforces a *minimum 97% coverage* before the run is considered green.
628
+
629
+ To run the suite locally, first install the test dependencies with `bundle install` (the `Gemfile` pulls in RSpec 3, RuboCop, SimpleCov and its Cobertura formatter), then launch the full suite exactly like CI with `bundle exec rspec --format documentation`, or scope it to a single file such as `bundle exec rspec spec/scenarios/code_quality_spec.rb`; each example runs against a temporary, auto-cleaned `.x_aeon_agents_test/` directory with dummy API keys injected by `spec/spec_helper.rb`, and SimpleCov enforces a *minimum 97% coverage* before the run is considered green.
630
+
631
+ ```bash
632
+ # Install test dependencies
633
+ bundle install
634
+
635
+ # Run the whole suite, exactly like the CI does
636
+ bundle exec rspec --format documentation
637
+
638
+ # Run a single file or directory
639
+ bundle exec rspec spec/scenarios/code_quality_spec.rb
640
+
641
+ # Enable verbose test logging
642
+ TEST_DEBUG=1 bundle exec rspec
643
+ ```
550
644
 
551
645
  ### ๐Ÿ”€ Opening a Pull Request
646
+
552
647
  - Push your branch to your fork and open a PR *against* `main` on the upstream repo.
553
648
  - Describe *what* changed and *why*, and link the related issue when relevant.
554
649
  - Rebase on the latest `github/main` and push with `git push github --force-with-lease` if you rebased.
555
650
 
556
651
  ### ๐Ÿค– CI & coverage
652
+
557
653
  - Every push triggers the [continuous integration workflow](https://github.com/Muriel-Salvan/x_aeon_agents/actions/workflows/continuous_integration.yml), which runs on Ruby `3.4`, installs `skillkit`, executes the tests and uploads coverage to Codecov.
558
654
  - The `package` job regenerates skills (`bundle exec ruby bin/xaa generate-skills`) and runs `npx semantic-release` โ€” you don't need to run these locally, but your changes must not break them.
559
655
 
560
656
  ### ๐Ÿงน Code style
657
+
561
658
  - Lint with `bundle exec rubocop` (config in `.rubocop.yml`, using `rubocop`, `rubocop-rspec` and `rubocop-yard`); auto-fix with `bundle exec rubocop -A`.
562
659
  - If you edit a skill written as an ERB template under `skills.src/`, *always* regenerate the committed `skills/` files with `bundle exec ruby bin/xaa generate-skills` before committing.
563
660
 
564
661
  ### โœ… Before you submit
662
+
565
663
  - ๐ŸŸข All RSpec examples pass and coverage stays โ‰ฅ 97%.
566
664
  - ๐Ÿช„ `rubocop` reports no offenses.
567
665
  - ๐Ÿ“ Generated skills are in sync (`skills/` matches `skills.src/`).
@@ -569,7 +667,7 @@ To run the suite locally, install the test dependencies with `bundle install` (t
569
667
 
570
668
  ## License
571
669
 
572
- This project is licensed under the BSD License (modified). See the [LICENSE](LICENSE) file for the full text and terms.
670
+ This project is distributed under a modified BSD License (modified July 1999). See the [LICENSE](LICENSE) file for the full license terms and copyright information.
573
671
 
574
672
  ## Ways skills are written
575
673
 
@@ -2,5 +2,5 @@ module XAeonAgents
2
2
  # @!group Global API
3
3
 
4
4
  # Gem version
5
- VERSION = '1.0.31'
5
+ VERSION = '1.0.32'
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: x_aeon_agents
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.31
4
+ version: 1.0.32
5
5
  platform: ruby
6
6
  authors:
7
7
  - Muriel Salvan
@@ -376,5 +376,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
376
376
  requirements: []
377
377
  rubygems_version: 3.6.9
378
378
  specification_version: 4
379
- summary: AI agents skills to be used for X-Aeon projects
379
+ summary: Executable software-engineering workflows for coding agents. x_aeon_agents
380
+ turns coding agents into participants in explicit, repeatable software-engineering
381
+ processes rather than leaving the agent to invent the process itself.
380
382
  test_files: []