x_aeon_agents 1.3.0 → 2.0.1
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 +4 -4
- data/CHANGELOG.md +12 -0
- data/README.md +1 -1
- data/TODO.md +0 -7
- data/lib/x_aeon_agents/agents/developer_agent.rb +8 -6
- data/lib/x_aeon_agents/agents/issue_implementer_agent.rb +5 -4
- data/lib/x_aeon_agents/agents/pull_request_creator_agent.rb +5 -5
- data/lib/x_aeon_agents/agents/review_resolver_agent.rb +8 -1
- data/lib/x_aeon_agents/cli.rb +13 -6
- data/lib/x_aeon_agents/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d77d17ba04574e6333764ed8b79b7a6849eab364906e9abe133f5a572dc5b744
|
|
4
|
+
data.tar.gz: c1c2a6b72b2665e3731ea1b046e038bf22abd05d3d2a6ab42906f1d589836bf9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9d1c0802bfea9ba76f6c43cdf788fdff2416b24bd1aff6bd4542122b27f2be234a2f45bac2f31d66c0b6db4e34c4d437674e6093627175f2d020b834edf766b1
|
|
7
|
+
data.tar.gz: 7cc7ea9f8bbe8629436f7ed2c5c701cac4383b70c9c7d972ede756c28cac8d93ae145b0b9ae4876e95691afb18890c4455e5ac08231e860899da499ba9822c47
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
# [v2.0.1](https://github.com/Muriel-Salvan/x_aeon_agents/compare/v2.0.0...v2.0.1) (2026-10-19 17:15:42)
|
|
2
|
+
|
|
3
|
+
### Patches
|
|
4
|
+
|
|
5
|
+
* [Isolate tests to make sure local Dir.home does not affect them](https://github.com/Muriel-Salvan/x_aeon_agents/commit/b6d2f6a7d4368052b2cd73486e61c22ec29de205)
|
|
6
|
+
|
|
7
|
+
# [v2.0.0](https://github.com/Muriel-Salvan/x_aeon_agents/compare/v1.3.0...v2.0.0) (2026-10-15 22:46:39)
|
|
8
|
+
|
|
9
|
+
### Breaking changes
|
|
10
|
+
|
|
11
|
+
* [Make PR base ref configurable for requirement and issue implementation](https://github.com/Muriel-Salvan/x_aeon_agents/commit/8a16c8f4c3c7705239a763248a4e2fb0e2150c01)
|
|
12
|
+
|
|
1
13
|
# [v1.3.0](https://github.com/Muriel-Salvan/x_aeon_agents/compare/v1.2.0...v1.3.0) (2026-10-13 14:54:19)
|
|
2
14
|
|
|
3
15
|
### Features
|
data/README.md
CHANGED
|
@@ -195,7 +195,7 @@ Each of these secrets can alternatively be retrieved by custom code declared in
|
|
|
195
195
|
- 📝 **AI commit messages** — analyze staged changes and generate a meaningful message, with flexible staging strategies (`all`, `if_empty`, `none`)
|
|
196
196
|
- 🚀 **Automated Pull Request creation** — push the branch to GitHub and open a PR against a configurable base ref with an AI-written description
|
|
197
197
|
- 🐛 **GitHub issue implementation** — turn an issue (and its comments) into working code, committing changes and opening a PR automatically
|
|
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
|
|
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 against a configurable base ref
|
|
199
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
200
|
- 🔍 **Git diff interpretation** — summarize the working-tree changes and the intent behind them relative to any base ref
|
|
201
201
|
- 💬 **One-shot prompts** — send a single prompt to the AI agent and print the response
|
data/TODO.md
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
* Don't put .x_aeon_agents dir in the project dir: it confuses the LLMs.
|
|
2
1
|
* Don't use project skills and rules: it adds noise to the LLMs that scan the files and code base. Use only global objects from dedicated config dirs.
|
|
3
2
|
* Add desktop notification when user input is needed.
|
|
4
3
|
* Test with other models.
|
|
5
|
-
* Provide a unified CLI with Thor and actions to not pollute the user CLI environment too much.
|
|
6
4
|
* Implement non-debug logs with progress bars (one char per message received).
|
|
7
5
|
* Cache the cli auth call for performace between several agents of the same run.
|
|
8
6
|
* Make the WSL CLI tool a Ruby script to avoid paths and slashes issues.
|
|
@@ -20,7 +18,6 @@
|
|
|
20
18
|
* 1 task for creating PR
|
|
21
19
|
Goal would be to reduce the amount of skills or rules each task needs, so that it gets focused on what it needs to do given previous context.
|
|
22
20
|
Each task could even be performed by different models, and in parallel
|
|
23
|
-
* Write a proper README file.
|
|
24
21
|
* Use templates to better guide the format of commit comments and PR descriptions.
|
|
25
22
|
* Extract the generate_skills executable into a generic Rubygem that generates skills following agents best practices
|
|
26
23
|
* Add a conventions skill that explains conventions used:
|
|
@@ -40,9 +37,5 @@
|
|
|
40
37
|
* Models are good at performing small tasks, not huge workflows. We need workflows orchestrators handling context and memory.
|
|
41
38
|
* Check anthropic's skill-creator skill: https://github.com/anthropics/skills/blob/main/skills/skill-creator/SKILL.md
|
|
42
39
|
* Check security warnings that we got from installation and fix them.
|
|
43
|
-
* Move the Cline Ruby connector into a Rubygem.
|
|
44
40
|
* Split helpers in Utils / Git/Github/Generators/Skills...
|
|
45
|
-
* Rename in x_aeon_agents because it's not about skills only anymore.
|
|
46
|
-
* Yank old Rubygems.
|
|
47
41
|
* Migrate comments to YARD.
|
|
48
|
-
* Check useless methods, require and gems after separating the code properly.
|
|
@@ -16,12 +16,13 @@ module XAeonAgents
|
|
|
16
16
|
# Constructor
|
|
17
17
|
#
|
|
18
18
|
# @param commit [Boolean] Should we commit files at every step?
|
|
19
|
-
# @param
|
|
19
|
+
# @param pr_base_ref [String, nil] The git ref (branch name) of the base of the Github Pull Request to
|
|
20
|
+
# create with this implementation, or nil to not create any Pull Request
|
|
20
21
|
# @param agent_params [Hash{Symbol => Object}] Extra agent parameters
|
|
21
|
-
def initialize(commit: false,
|
|
22
|
+
def initialize(commit: false, pr_base_ref: nil, **agent_params)
|
|
22
23
|
super(name: 'Developer', **agent_params)
|
|
23
24
|
@commit = commit
|
|
24
|
-
@
|
|
25
|
+
@pr_base_ref = pr_base_ref
|
|
25
26
|
end
|
|
26
27
|
|
|
27
28
|
# Execute the agent to generate some output artifacts based on some input artifacts.
|
|
@@ -34,7 +35,8 @@ module XAeonAgents
|
|
|
34
35
|
task(:setup_requirements, name: 'Setup requirements', intent: 'Initialize requirements from the current commit') do
|
|
35
36
|
@artifacts.merge!(
|
|
36
37
|
requirements:,
|
|
37
|
-
base_sha: Helpers.git.gcommit('HEAD').sha
|
|
38
|
+
base_sha: Helpers.git.gcommit('HEAD').sha,
|
|
39
|
+
pr_base_ref: @pr_base_ref
|
|
38
40
|
)
|
|
39
41
|
end
|
|
40
42
|
|
|
@@ -208,7 +210,7 @@ module XAeonAgents
|
|
|
208
210
|
)
|
|
209
211
|
logger.info "Documenter changes: #{Helpers.git.status_info.changed.keys.join(', ')}"
|
|
210
212
|
|
|
211
|
-
if @commit || @
|
|
213
|
+
if @commit || @pr_base_ref
|
|
212
214
|
task(
|
|
213
215
|
new_agent(
|
|
214
216
|
CommitterAgent,
|
|
@@ -220,7 +222,7 @@ module XAeonAgents
|
|
|
220
222
|
)
|
|
221
223
|
end
|
|
222
224
|
|
|
223
|
-
if @
|
|
225
|
+
if @pr_base_ref
|
|
224
226
|
task(
|
|
225
227
|
new_agent(
|
|
226
228
|
PullRequestCreatorAgent,
|
|
@@ -14,12 +14,13 @@ module XAeonAgents
|
|
|
14
14
|
# Constructor
|
|
15
15
|
#
|
|
16
16
|
# @param commit [Boolean] Whether to commit changes automatically
|
|
17
|
-
# @param
|
|
17
|
+
# @param pr_base_ref [String, nil] The git ref (branch name) of the base of the Pull Request to create,
|
|
18
|
+
# or nil to not create any Pull Request
|
|
18
19
|
# @param agent_params [Hash{Symbol => Object}] Extra agent parameters
|
|
19
|
-
def initialize(commit: false,
|
|
20
|
+
def initialize(commit: false, pr_base_ref: nil, **agent_params)
|
|
20
21
|
super(name: 'Issue implementer', **agent_params)
|
|
21
22
|
@commit = commit
|
|
22
|
-
@
|
|
23
|
+
@pr_base_ref = pr_base_ref
|
|
23
24
|
end
|
|
24
25
|
|
|
25
26
|
# Execute the agent to implement a GitHub issue.
|
|
@@ -35,7 +36,7 @@ module XAeonAgents
|
|
|
35
36
|
issue = Helpers.github.issue(Helpers.github_repo, github_issue_number)
|
|
36
37
|
issue_comments = Helpers.github.issue_comments(Helpers.github_repo, github_issue_number)
|
|
37
38
|
task(
|
|
38
|
-
new_agent(DeveloperAgent, commit: @commit,
|
|
39
|
+
new_agent(DeveloperAgent, commit: @commit, pr_base_ref: @pr_base_ref),
|
|
39
40
|
requirements: build_requirements(issue, issue_comments),
|
|
40
41
|
intent: 'Develop the gathered requirements'
|
|
41
42
|
)
|
|
@@ -9,7 +9,7 @@ module XAeonAgents
|
|
|
9
9
|
# @return [Hash{Symbol => Object}] Set of input artifacts description, per artifact name
|
|
10
10
|
def input_artifacts_contracts
|
|
11
11
|
{
|
|
12
|
-
|
|
12
|
+
pr_base_ref: 'The git ref (branch name) of the base to create the Pull Request against',
|
|
13
13
|
requirements: {
|
|
14
14
|
description: 'The initial requirements',
|
|
15
15
|
optional: true
|
|
@@ -28,10 +28,10 @@ module XAeonAgents
|
|
|
28
28
|
|
|
29
29
|
# Execute the agent to generate some output artifacts based on some input artifacts.
|
|
30
30
|
#
|
|
31
|
-
# @param
|
|
31
|
+
# @param pr_base_ref [String] The git ref (branch name) used as base of the Pull Request.
|
|
32
32
|
# @param requirements [String, nil] The initial requirements, or nil if none.
|
|
33
33
|
# @return [Hash{Symbol => Object}] Output artifacts content
|
|
34
|
-
def run(
|
|
34
|
+
def run(pr_base_ref:, requirements: nil)
|
|
35
35
|
super
|
|
36
36
|
raise 'Unable to find the Github repository' unless Helpers.github_repo
|
|
37
37
|
|
|
@@ -56,7 +56,7 @@ module XAeonAgents
|
|
|
56
56
|
if @artifacts[:existing_pr_url].nil?
|
|
57
57
|
# Create new PR
|
|
58
58
|
git_diff_interpreter_agent = new_agent(GitDiffInterpreterAgent)
|
|
59
|
-
task(git_diff_interpreter_agent, intent: 'Analyze changes in the whole branch', git_ref_base:
|
|
59
|
+
task(git_diff_interpreter_agent, intent: 'Analyze changes in the whole branch', git_ref_base: pr_base_ref)
|
|
60
60
|
task(:create_pr, name: 'Create Pull Request', intent: "Create a Pull Request for the branch #{head_branch} on repo #{repo_name}") do
|
|
61
61
|
sections = [@artifacts[:change_intent].strip]
|
|
62
62
|
sections << <<~EO_SECTION if requirements
|
|
@@ -135,7 +135,7 @@ module XAeonAgents
|
|
|
135
135
|
EO_SECTION
|
|
136
136
|
new_pr = Helpers.github.create_pull_request(
|
|
137
137
|
repo_name,
|
|
138
|
-
|
|
138
|
+
pr_base_ref,
|
|
139
139
|
head_branch,
|
|
140
140
|
@artifacts[:one_line_summary].strip,
|
|
141
141
|
sections.map(&:strip).join("\n\n")
|
|
@@ -100,7 +100,14 @@ module XAeonAgents
|
|
|
100
100
|
@artifacts[:plan] = 'No implementation plan'
|
|
101
101
|
@artifacts[:files_diffs] = 'No changes'
|
|
102
102
|
else
|
|
103
|
-
task(
|
|
103
|
+
task(
|
|
104
|
+
new_agent(
|
|
105
|
+
DeveloperAgent,
|
|
106
|
+
commit: true,
|
|
107
|
+
pr_base_ref: Helpers.github.pull_request(Helpers.github_repo, @artifacts[:pr_number]).base.ref
|
|
108
|
+
),
|
|
109
|
+
intent: 'Develop new requirements devise from review comments'
|
|
110
|
+
)
|
|
104
111
|
end
|
|
105
112
|
|
|
106
113
|
@artifacts[:open_comments_to_agents].each.with_index do |comment, comment_idx|
|
data/lib/x_aeon_agents/cli.rb
CHANGED
|
@@ -103,7 +103,7 @@ module XAeonAgents
|
|
|
103
103
|
# Push changes on Github and create a Pull Request.
|
|
104
104
|
def create_pr
|
|
105
105
|
agent_kwargs = {
|
|
106
|
-
|
|
106
|
+
pr_base_ref: options[:base]
|
|
107
107
|
}
|
|
108
108
|
agent_kwargs[:requirements] = options[:requirements] if options[:requirements]
|
|
109
109
|
Agents::PullRequestCreatorAgent.new(session_id: options[:session_id]).run(**agent_kwargs)
|
|
@@ -210,21 +210,25 @@ module XAeonAgents
|
|
|
210
210
|
long_desc <<~LONGDESC
|
|
211
211
|
Reads the content (and comments) of a GitHub issue and delegates the
|
|
212
212
|
implementation to the Developer agent. The agent commits changes and
|
|
213
|
-
opens a Pull Request
|
|
213
|
+
opens a Pull Request against the base given with the --pr-base option
|
|
214
|
+
(defaults to main).
|
|
214
215
|
|
|
215
216
|
Examples:
|
|
216
217
|
|
|
217
218
|
$ xaa implement-issue 15
|
|
218
219
|
|
|
220
|
+
$ xaa implement-issue 15 --pr-base master
|
|
221
|
+
|
|
219
222
|
$ xaa implement-issue 15 --session-id my-session
|
|
220
223
|
LONGDESC
|
|
224
|
+
option :pr_base, type: :string, default: 'main', desc: 'Base git ref of the GitHub Pull Request to create'
|
|
221
225
|
# Implements a GitHub issue using AI.
|
|
222
226
|
#
|
|
223
227
|
# @param github_issue_number [Integer] The GitHub issue number to implement
|
|
224
228
|
def implement_issue(github_issue_number)
|
|
225
229
|
Agents::IssueImplementerAgent.new(
|
|
226
230
|
commit: true,
|
|
227
|
-
|
|
231
|
+
pr_base_ref: options[:pr_base],
|
|
228
232
|
session_id: options[:session_id]
|
|
229
233
|
).run(github_issue_number: Integer(github_issue_number))
|
|
230
234
|
end
|
|
@@ -238,21 +242,24 @@ module XAeonAgents
|
|
|
238
242
|
Pass free-form requirements to the Developer agent, which will analyze
|
|
239
243
|
the codebase and produce the requested changes.
|
|
240
244
|
|
|
245
|
+
The --pr-base option gives the base ref of the Pull Request to create:
|
|
246
|
+
omit the option to not create any Pull Request.
|
|
247
|
+
|
|
241
248
|
Examples:
|
|
242
249
|
|
|
243
250
|
$ xaa implement "Add authentication middleware"
|
|
244
251
|
|
|
245
|
-
$ xaa implement "Refactor the database layer" --commit --pr --session-id my-session
|
|
252
|
+
$ xaa implement "Refactor the database layer" --commit --pr-base main --session-id my-session
|
|
246
253
|
LONGDESC
|
|
247
254
|
option :commit, type: :boolean, default: false, desc: 'Commit files at every step'
|
|
248
|
-
option :
|
|
255
|
+
option :pr_base, type: :string, default: nil, desc: 'Base git ref of the GitHub Pull Request to create (omit for no Pull Request)'
|
|
249
256
|
# Implements arbitrary requirements using AI.
|
|
250
257
|
#
|
|
251
258
|
# @param requirements [String] Free-form requirements describing the desired changes
|
|
252
259
|
def implement(requirements)
|
|
253
260
|
Agents::DeveloperAgent.new(
|
|
254
261
|
commit: options[:commit],
|
|
255
|
-
|
|
262
|
+
pr_base_ref: options[:pr_base],
|
|
256
263
|
session_id: options[:session_id]
|
|
257
264
|
).run(requirements:)
|
|
258
265
|
end
|