x_aeon_agents 2.8.1 → 2.9.0

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: 4c95fbf7ea4fb512819b0462de5b1fd7345421fb33f7e4d016d4cd6897b66415
4
- data.tar.gz: 92d92a27cf1aaec21544b282c41b14b42deea2d5e0389685f3c2d9303a681c4b
3
+ metadata.gz: 65a34b357014c65f6925fabe32e192a1070f0e87840967910921aa0e6aa89bc9
4
+ data.tar.gz: 5966f1f1c4d5bf986c2287b5bc07783f8d58f95a6abf2163ba8fb933bc5e609c
5
5
  SHA512:
6
- metadata.gz: f1957d9fa88264eb0db84d5f99e46e75275d49bbe91dbf386b1b7fecd020a75ad87faf376c361f9c8a96b090f0d9724dec85e18345ab5ada403cd8096fde2a3a
7
- data.tar.gz: 7966f5edbc3a73ccda0986b2703f392c9eae7842292504c6c958c315e7026a7362631665bb599969ae59496493c280161ad933fc317e222e3aad88c1d76bef3a
6
+ metadata.gz: c83f42f410a60e3aa2b7ff70b2e951fa43a7609b776261fff6e607c36630d65a8d2f6dc3f88c304313f251c975e7135fa6f6d256b3fad8d6ea60b98d3449ae3f
7
+ data.tar.gz: b116642387232b0467145d20327be1650afe717d8e4c0b5e3f8c210dbf91fd1b1069e291d23f31e8708f706f4fba83885e52e85f1e28a0496b522aa8fe6861d1
data/CHANGELOG.md CHANGED
@@ -1,3 +1,25 @@
1
+ # [v2.9.0](https://github.com/Muriel-Salvan/x_aeon_agents/compare/v2.8.1...v2.9.0) (2026-11-13 11:26:58)
2
+
3
+ ## Global changes
4
+ ### Patches
5
+
6
+ * [feat(cline): constrain agent prompts, filter unused tools and bound runs with default timeout/retries](https://github.com/Muriel-Salvan/x_aeon_agents/commit/cae5e014c5f8c00212b74aa68609a5f0e94aadd3)
7
+
8
+ ## Changes for agent_defaults
9
+ ### Features
10
+
11
+ * [feat(cline): constrain agent prompts, filter unused tools and bound runs with default timeout/retries](https://github.com/Muriel-Salvan/x_aeon_agents/commit/cae5e014c5f8c00212b74aa68609a5f0e94aadd3)
12
+
13
+ ## Changes for agents
14
+ ### Features
15
+
16
+ * [feat(cline): constrain agent prompts, filter unused tools and bound runs with default timeout/retries](https://github.com/Muriel-Salvan/x_aeon_agents/commit/cae5e014c5f8c00212b74aa68609a5f0e94aadd3)
17
+
18
+ ## Changes for cline
19
+ ### Features
20
+
21
+ * [feat(cline): constrain agent prompts, filter unused tools and bound runs with default timeout/retries](https://github.com/Muriel-Salvan/x_aeon_agents/commit/cae5e014c5f8c00212b74aa68609a5f0e94aadd3)
22
+
1
23
  # [v2.8.1](https://github.com/Muriel-Salvan/x_aeon_agents/compare/v2.8.0...v2.8.1) (2026-11-12 17:54:34)
2
24
 
3
25
  ### Patches
data/README.md CHANGED
@@ -327,8 +327,8 @@ Files are looked up in the following locations and evaluated from the lowest pri
327
327
  - **`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):
328
328
  - `skills` — Array of skill names the agent should follow
329
329
  - `model` — LLM model to use (e.g. `'deepseek/deepseek-v4-flash'`)
330
- - `cli_options` — Hash of options merged into the Cline CLI invocation (e.g. `plan: true`)
331
- - `configure_global` — Proc given the Cline global settings to tweak
330
+ - `cli_options` — Hash of options merged into the Cline CLI invocation (e.g. `plan: true`). Cline agents always get `timeout: 600` (10 minutes) and `retries: 5` by default; options given here supersede them option by option (`nil` disables one)
331
+ - `configure_global` — Proc given the Cline global settings to tweak. Whatever it configures, the Cline tools that X-Aeon agents don't use (agent spawning and team management tools) are always disabled, as is `ask_question` when `interactive` is off; lists are merged without duplicates
332
332
 
333
333
  ```ruby
334
334
  configure_agent(:PlanGeneratorAgent) do |agent_config|
@@ -461,7 +461,8 @@ Each capability is implemented by an `Agents::*Agent` class built on `composable
461
461
  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:
462
462
 
463
463
  - injects `new_agent`, `task`, `step` and `step_agent` to build multi-step pipelines;
464
- - auto-configures the frameworks (`setup_composable_agents`, `setup_ai_agents`, `setup_cline`) and injects per-class defaults (overridable with the `configure_agent` config DSL);
464
+ - auto-configures the frameworks (`setup_composable_agents`, `setup_ai_agents`, `setup_cline`) and injects per-class defaults (overridable with the `configure_agent` config DSL); for Cline agents, it also injects `timeout: 600` and `retries: 5` CLI options to bound every run (configured options supersede them);
465
+ - disables the Cline tools that X-Aeon agents don't use (agent spawning, team management, and `ask_question` in non-interactive mode) in the Cline global settings, merging them without duplicates with the ones configured by `configure_global`;
465
466
  - enforces **input/output artifact contracts** and adds **resume** support (via the `ArtifactContract` + `Resumable` mixins);
466
467
  - gives each agent a per-session directory under `Config.data_dir/sessions/<id>`.
467
468
 
data/TODO.md CHANGED
@@ -1,3 +1,4 @@
1
+ * Fix the tokens metrics that seem to be wrong with Cline.
1
2
  * Consider remove the checklists from MarkdownHeavy (maybe having MarkdownFiles?).
2
3
  * Embed TaskStarter as an option to implement-issue CLI.
3
4
  * Add a --tdd option to implement-issue and use a TddAgent in place of DeveloperAgent.
@@ -63,6 +63,9 @@ module XAeonAgents
63
63
  AgentDefaults.root_agents << self if parent_agent.nil?
64
64
  # If we inherit from some frameworks initialize them now.
65
65
  Config.setup_composable_agents
66
+ # Possible transformation applied to the agent's kwargs once the framework defaults,
67
+ # the config DSL procs and the explicitly given kwargs are merged.
68
+ kwargs_processor = proc { |agent_kwarg_hash| agent_kwarg_hash }
66
69
  kwargs_from_agent_defaults =
67
70
  case self
68
71
  when ComposableAgents::AiAgents::Agent
@@ -72,9 +75,51 @@ module XAeonAgents
72
75
  }
73
76
  when ComposableAgents::Cline::Agent
74
77
  Config.setup_cline
78
+ # Default Cline CLI options bounding every agent run: no run can stall forever,
79
+ # and consecutive mistakes are limited. Configured options supersede them.
80
+ default_cline_cli_options = { timeout: 600, retries: 5 }
81
+ # Whatever Cline global settings are configured (through the config DSL or explicitly),
82
+ # always disable the Cline tools that are not used by X-Aeon agents: agents are
83
+ # orchestrated by ComposableAgents (letting an LLM spawn agents or manage teams would
84
+ # bypass this orchestration), and no human user answers questions in non-interactive mode.
85
+ # Merge these tools with the configured ones, without duplicates.
86
+ kwargs_processor = proc do |cline_agent_kwargs|
87
+ configured_global_settings = cline_agent_kwargs[:configure_global]
88
+ cline_agent_kwargs[:configure_global] = proc do |global_settings|
89
+ configured_global_settings&.call(global_settings)
90
+ disabled_tools = %w[
91
+ spawn_agent
92
+ team_attach_outcome_fragment
93
+ team_await_runs
94
+ team_broadcast
95
+ team_cancel_run
96
+ team_cleanup
97
+ team_create_outcome
98
+ team_finalize_outcome
99
+ team_list_outcomes
100
+ team_list_runs
101
+ team_mission_log
102
+ team_read_mailbox
103
+ team_review_outcome_fragment
104
+ team_run_task
105
+ team_send_message
106
+ team_shutdown_teammate
107
+ team_spawn_teammate
108
+ team_status
109
+ team_task
110
+ teams
111
+ ]
112
+ disabled_tools << 'ask_question' unless Config.interactive
113
+ global_settings.disabled_tools = disabled_tools | Array(global_settings.disabled_tools)
114
+ end
115
+ # Always bound Cline runs, while letting the configured CLI options supersede the
116
+ # defaults option by option (a nil value disables a default, as cline-rb skips nil options).
117
+ cline_agent_kwargs[:cli_options] = default_cline_cli_options.merge(cline_agent_kwargs[:cli_options] || {})
118
+ cline_agent_kwargs
119
+ end
75
120
  {
76
121
  api_key: Config.cline_api_key,
77
- cli_options: Config.default_cline_cli_args,
122
+ cli_options: Config.default_cline_cli_args.merge(default_cline_cli_options),
78
123
  strategy: ComposableAgents::PromptRenderingStrategy::MarkdownHeavyFiles
79
124
  }
80
125
  else
@@ -87,7 +132,7 @@ module XAeonAgents
87
132
  @session_id = session_id || AgentDefaults.singleton_session_id
88
133
  @session_dir = "#{Config.data_dir}/sessions/#{@session_id}"
89
134
  run_id = "#{@session_id}-#{kwargs[:name] || self.class.name.split('::').last}"
90
- agent_kwargs = kwargs_from_config.merge(kwargs)
135
+ agent_kwargs = kwargs_processor.call(kwargs_from_config.merge(kwargs))
91
136
  # TODO: Redesign how prompt rendering strategies are initialized with regard to the constructors and remove
92
137
  # this code smell.
93
138
  # The prompt rendering strategy is included in the agent's singleton class by PromptDrivenAgent's
@@ -73,6 +73,7 @@ module XAeonAgents
73
73
  EO_CONSTRAINT
74
74
  '- Always verify the files you have edited or created at the end of the task to ensure they are completed and working as expected.',
75
75
  Helpers.repository_access_constraint(writable: true),
76
+ Helpers.cline_tools_constraint,
76
77
  Helpers.non_interactive_constraint,
77
78
  '',
78
79
  'REMEMBER, be helpful and proactive!',
@@ -56,6 +56,7 @@ module XAeonAgents
56
56
  '- Documentation describes the CURRENT STATE only.',
57
57
  '- Documentation is NOT a changelog.',
58
58
  Helpers.repository_access_constraint(writable: true),
59
+ Helpers.cline_tools_constraint,
59
60
  Helpers.non_interactive_constraint
60
61
  ].compact.join("\n"),
61
62
  **agent_params
@@ -66,6 +66,7 @@ module XAeonAgents
66
66
  '- Write the extracted requirements to the output artifact file given in this prompt.',
67
67
  '- If no implementation is required, write exactly `No requirements` in this file.',
68
68
  Helpers.repository_access_constraint,
69
+ Helpers.cline_tools_constraint,
69
70
  Helpers.artifacts_access_constraint(artifact_ref(:requirements)),
70
71
  Helpers.non_interactive_constraint
71
72
  ].compact.join("\n")
@@ -53,6 +53,7 @@ module XAeonAgents
53
53
  '- You may only analyze and propose plans.',
54
54
  '- Do NOT execute the plan yourself.',
55
55
  Helpers.repository_access_constraint,
56
+ Helpers.cline_tools_constraint,
56
57
  Helpers.artifacts_access_constraint(artifact_ref(:plan)),
57
58
  Helpers.non_interactive_constraint
58
59
  ].compact.join("\n")
@@ -57,6 +57,7 @@ module XAeonAgents
57
57
  Do not try to document other parts.
58
58
  EO_CONSTRAINT
59
59
  Helpers.repository_access_constraint,
60
+ Helpers.cline_tools_constraint,
60
61
  Helpers.artifacts_access_constraint(artifact_ref(:about), artifact_ref(:name), artifact_ref(:description)),
61
62
  Helpers.non_interactive_constraint
62
63
  ].compact.join("\n")
@@ -49,6 +49,7 @@ module XAeonAgents
49
49
  '- Do not describe the technical setup or prequisites, as they are already covered by other sections.',
50
50
  '- Do not cover how to develop in this project: it is already covered in other sections.',
51
51
  Helpers.repository_access_constraint,
52
+ Helpers.cline_tools_constraint,
52
53
  Helpers.artifacts_access_constraint(artifact_ref(:contributing)),
53
54
  Helpers.non_interactive_constraint
54
55
  ].compact.join("\n")
@@ -56,6 +56,7 @@ module XAeonAgents
56
56
  '- Do not cover the end-user main requirements and prerequisites: they are already covered in other sections.',
57
57
  '- Do not cover the contribution workflow (pull requests, CI, issues...): this is already covered in other sections.',
58
58
  Helpers.repository_access_constraint,
59
+ Helpers.cline_tools_constraint,
59
60
  Helpers.artifacts_access_constraint(artifact_ref(:development)),
60
61
  Helpers.non_interactive_constraint
61
62
  ].compact.join("\n")
@@ -45,6 +45,7 @@ module XAeonAgents
45
45
  Do not try to document other parts.
46
46
  EO_CONSTRAINT
47
47
  Helpers.repository_access_constraint,
48
+ Helpers.cline_tools_constraint,
48
49
  Helpers.artifacts_access_constraint(artifact_ref(:documentation)),
49
50
  Helpers.non_interactive_constraint
50
51
  ].compact.join("\n")
@@ -47,6 +47,7 @@ module XAeonAgents
47
47
  Do not try to document other parts.
48
48
  EO_CONSTRAINT
49
49
  Helpers.repository_access_constraint,
50
+ Helpers.cline_tools_constraint,
50
51
  Helpers.artifacts_access_constraint(artifact_ref(:features)),
51
52
  Helpers.non_interactive_constraint
52
53
  ].compact.join("\n")
@@ -49,6 +49,7 @@ module XAeonAgents
49
49
  EO_CONSTRAINT
50
50
  '- Do not provide long paragraphs: focus on readability by splitting long paragraphs into several short ones.',
51
51
  Helpers.repository_access_constraint,
52
+ Helpers.cline_tools_constraint,
52
53
  Helpers.artifacts_access_constraint(artifact_ref(:how_it_works)),
53
54
  Helpers.non_interactive_constraint
54
55
  ].compact.join("\n")
@@ -45,6 +45,7 @@ module XAeonAgents
45
45
  Do not try to document other parts.
46
46
  EO_CONSTRAINT
47
47
  Helpers.repository_access_constraint,
48
+ Helpers.cline_tools_constraint,
48
49
  Helpers.artifacts_access_constraint(artifact_ref(:license)),
49
50
  Helpers.non_interactive_constraint
50
51
  ].compact.join("\n")
@@ -46,6 +46,7 @@ module XAeonAgents
46
46
  EO_CONSTRAINT
47
47
  '- Only document public API entry points: executables and library public methods belonging to yarn `Public API` group.',
48
48
  Helpers.repository_access_constraint,
49
+ Helpers.cline_tools_constraint,
49
50
  Helpers.artifacts_access_constraint(artifact_ref(:public_api)),
50
51
  Helpers.non_interactive_constraint
51
52
  ].compact.join("\n")
@@ -52,6 +52,7 @@ module XAeonAgents
52
52
  EO_CONSTRAINT
53
53
  "- This section is not meant for developers: don't describe how to develop, test, document, package or contribute to this project.",
54
54
  Helpers.repository_access_constraint,
55
+ Helpers.cline_tools_constraint,
55
56
  Helpers.artifacts_access_constraint(artifact_ref(:quick_start)),
56
57
  Helpers.non_interactive_constraint
57
58
  ].compact.join("\n")
@@ -45,6 +45,7 @@ module XAeonAgents
45
45
  Do not try to document other parts.
46
46
  EO_CONSTRAINT
47
47
  Helpers.repository_access_constraint,
48
+ Helpers.cline_tools_constraint,
48
49
  Helpers.artifacts_access_constraint(artifact_ref(:requirements)),
49
50
  Helpers.non_interactive_constraint
50
51
  ].compact.join("\n")
@@ -73,6 +73,7 @@ module XAeonAgents
73
73
  '- You MUST NOT ask for user confirmation.',
74
74
  "- Write the reply text to the output artifact file `#{artifact_ref(:reply)}`.",
75
75
  Helpers.repository_access_constraint,
76
+ Helpers.cline_tools_constraint,
76
77
  Helpers.artifacts_access_constraint(artifact_ref(:reply)),
77
78
  Helpers.non_interactive_constraint
78
79
  ].compact.join("\n")
@@ -61,6 +61,7 @@ module XAeonAgents
61
61
  )
62
62
  self.constraints = [
63
63
  Helpers.repository_access_constraint(writable: true),
64
+ Helpers.cline_tools_constraint,
64
65
  Helpers.artifacts_access_constraint(artifact_ref(:plan_modifications)),
65
66
  Helpers.non_interactive_constraint
66
67
  ].compact.join("\n")
@@ -197,6 +197,21 @@ module XAeonAgents
197
197
  'so proceed using your best judgment without asking'
198
198
  end
199
199
 
200
+ # Get the constraint explaining how to use the tools that are available to agents of the Cline kind.
201
+ # Constraints are rendered as Markdown bullet lists: the returned sentences include their own bullet prefixes.
202
+ #
203
+ # @return [String] The constraint about using the tools available to Cline agents
204
+ def cline_tools_constraint
205
+ <<~EO_CONSTRAINT.rstrip
206
+ - The `run_commands` tool takes ONE shell script as a plain string.
207
+ - NEVER wrap it in `[ ]` or JSON.
208
+ - One command per call; chain commands with `&&` only on one line.
209
+ - Never use multi-line heredocs.
210
+ - Always use the `editor` tool to write files.
211
+ - You are a single agent: there is no team. NEVER call `team_*` tools: they will fail and count as mistakes.
212
+ EO_CONSTRAINT
213
+ end
214
+
200
215
  # Allow user to review and edit content before using it
201
216
  #
202
217
  # When the interactive mode is disabled (Config.interactive), no review file
@@ -2,5 +2,5 @@ module XAeonAgents
2
2
  # @!group Global API
3
3
 
4
4
  # Gem version
5
- VERSION = '2.8.1'
5
+ VERSION = '2.9.0'
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: 2.8.1
4
+ version: 2.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Muriel Salvan