ace-overseer 0.14.12 → 0.15.3
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 +36 -0
- data/lib/ace/overseer/atoms/status_formatter.rb +7 -2
- data/lib/ace/overseer/molecules/tmux_window_opener.rb +3 -1
- data/lib/ace/overseer/molecules/worktree_context_collector.rb +5 -3
- data/lib/ace/overseer/organisms/work_on_orchestrator.rb +19 -4
- data/lib/ace/overseer/version.rb +1 -1
- metadata +8 -8
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3ad5c1cd73b433965d9e8ac955ca8230dd677c6c5067bcdee1a2ff6427603deb
|
|
4
|
+
data.tar.gz: efa22f74cc5af23a2e686c924558ca276d539369646f89825739b5255c3d307d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 819bcbfad49d1edacfb604f39727573b83524c8fd49370ca35f8ff342f0a24850e7f25e8de59f1097f3c1d644fac2721a05bd0cae92df34231d0d4dfe6511f1e
|
|
7
|
+
data.tar.gz: 4cc5095cf8a5189e1b000234eda8fda11f8d841a7e8f3c294ca0756477e6f0e4b90aa84b9854c3648c6a783128c08bf4472fb5fd15b3501a09dec8b0f0bdc60a
|
data/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,42 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
|
+
### Fixed
|
|
10
|
+
- Updated the `ace-tmux` runtime dependency constraint to `~> 0.17` so overseer stays compatible with the current tmux runtime control release line.
|
|
11
|
+
|
|
12
|
+
## [0.15.3] - 2026-04-23
|
|
13
|
+
|
|
14
|
+
### Technical
|
|
15
|
+
- Tightened retained `status --watch` E2E coverage to use a controlled bounded-session shutdown with explicit command captures, keeping refresh verification aligned with the documented watch contract.
|
|
16
|
+
|
|
17
|
+
## [0.15.2] - 2026-04-23
|
|
18
|
+
|
|
19
|
+
### Technical
|
|
20
|
+
- Aligned retained `work-on` E2E verification with the current prepared-assignment contract so post-launch status accepts `paused` plus `next_step` until `/ace-assign-drive` actually starts work.
|
|
21
|
+
|
|
22
|
+
## [0.15.1] - 2026-04-23
|
|
23
|
+
|
|
24
|
+
### Technical
|
|
25
|
+
- Updated the `ace-git-worktree` runtime dependency constraint to `~> 0.21` so overseer stays aligned with the current worktree minor release line.
|
|
26
|
+
|
|
27
|
+
## [0.15.0] - 2026-04-23
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
- Updated overseer status collection, formatting, and work-on orchestration to consume `ace-assign`'s `active_steps`/`next_step` lifecycle contract instead of the old singular `current_step`/`in_progress` model.
|
|
31
|
+
- Revised overseer test fixtures and resume behavior so existing assignments now prefer the focused active step and otherwise fall back to the next pending step in scope.
|
|
32
|
+
|
|
33
|
+
## [0.14.14] - 2026-04-23
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
### Changed
|
|
37
|
+
- Reworked tmux window-open behavior to align with shared session targeting and reduce ambiguity when launching and reusing worktree windows.
|
|
38
|
+
- Updated overseer tmux-window coverage to verify the current session/window lifecycle against the improved launcher behavior.
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
## [0.14.13] - 2026-04-22
|
|
42
|
+
|
|
43
|
+
### Fixed
|
|
44
|
+
- Matched existing tmux windows through the shared `ace-tmux` sanitized window-name policy so worktrees with punctuation are not reopened under duplicate names.
|
|
9
45
|
|
|
10
46
|
## [0.14.12] - 2026-04-19
|
|
11
47
|
|
|
@@ -128,9 +128,14 @@ module Ace
|
|
|
128
128
|
bar = progress_bar(done.to_i, total.to_i)
|
|
129
129
|
counts = "#{done}/#{total}"
|
|
130
130
|
counts = "#{counts} (#{failed} failed)" if failed.positive?
|
|
131
|
-
|
|
131
|
+
active_steps = assignment["active_steps"] || assignment[:active_steps]
|
|
132
|
+
next_step = assignment["next_step"] || assignment[:next_step]
|
|
132
133
|
parts = "#{bar} #{counts}"
|
|
133
|
-
|
|
134
|
+
if active_steps.is_a?(Array) && !active_steps.empty?
|
|
135
|
+
parts = "#{parts} #{colorize(active_steps.join(", "), :dim)}"
|
|
136
|
+
elsif next_step
|
|
137
|
+
parts = "#{parts} #{colorize("next: #{next_step}", :dim)}"
|
|
138
|
+
end
|
|
134
139
|
parts
|
|
135
140
|
end
|
|
136
141
|
private_class_method :format_progress
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "ace/tmux"
|
|
4
|
+
|
|
3
5
|
module Ace
|
|
4
6
|
module Overseer
|
|
5
7
|
module Molecules
|
|
@@ -36,7 +38,7 @@ module Ace
|
|
|
36
38
|
session = ENV["ACE_TMUX_SESSION"]
|
|
37
39
|
return false unless session
|
|
38
40
|
|
|
39
|
-
name = File.basename(worktree_path.to_s)
|
|
41
|
+
name = Ace::Tmux::Atoms::WindowNameSanitizer.call(File.basename(worktree_path.to_s))
|
|
40
42
|
result = @tmux_executor.capture(["tmux", "list-windows", "-t", session, "-F", '#{window_name}'])
|
|
41
43
|
return false unless result.success?
|
|
42
44
|
|
|
@@ -54,7 +54,8 @@ module Ace
|
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
def assignment_info_to_h(info)
|
|
57
|
-
|
|
57
|
+
active_steps = info.queue_state.active_steps
|
|
58
|
+
next_step = active_steps.empty? ? info.queue_state.next_workable : nil
|
|
58
59
|
{
|
|
59
60
|
"assignment" => {
|
|
60
61
|
"id" => info.id,
|
|
@@ -65,10 +66,11 @@ module Ace
|
|
|
65
66
|
"total" => info.queue_state.summary[:total],
|
|
66
67
|
"done" => info.queue_state.summary[:done],
|
|
67
68
|
"failed" => info.queue_state.summary[:failed],
|
|
68
|
-
"
|
|
69
|
+
"active" => info.queue_state.summary[:active],
|
|
69
70
|
"pending" => info.queue_state.summary[:pending]
|
|
70
71
|
},
|
|
71
|
-
"
|
|
72
|
+
"active_steps" => active_steps.map(&:name),
|
|
73
|
+
"next_step" => next_step&.name
|
|
72
74
|
}
|
|
73
75
|
end
|
|
74
76
|
|
|
@@ -70,9 +70,10 @@ module Ace
|
|
|
70
70
|
end
|
|
71
71
|
assignment_result = if existing
|
|
72
72
|
progress.call("Assignment already active: #{existing.dig("assignment", "id")}")
|
|
73
|
+
focused_step = existing.dig("focus_step", "number") || existing.dig("next_step", "number")
|
|
73
74
|
{
|
|
74
75
|
assignment_id: existing.dig("assignment", "id"),
|
|
75
|
-
first_step:
|
|
76
|
+
first_step: focused_step,
|
|
76
77
|
created: false
|
|
77
78
|
}
|
|
78
79
|
else
|
|
@@ -185,15 +186,29 @@ module Ace
|
|
|
185
186
|
Ace::Assign.reset_config!
|
|
186
187
|
executor = Ace::Assign::Organisms::AssignmentExecutor.new
|
|
187
188
|
result = executor.status
|
|
189
|
+
focus_step = result[:current]
|
|
190
|
+
next_step = result[:state].active_steps.empty? ? result[:state].next_workable : nil
|
|
188
191
|
{
|
|
189
192
|
"assignment" => {
|
|
190
193
|
"id" => result[:assignment].id,
|
|
191
194
|
"name" => result[:assignment].name,
|
|
192
195
|
"state" => result[:state].assignment_state.to_s
|
|
193
196
|
},
|
|
194
|
-
"
|
|
195
|
-
|
|
196
|
-
|
|
197
|
+
"active_steps" => result[:state].active_steps.map do |step|
|
|
198
|
+
{
|
|
199
|
+
"number" => step.number,
|
|
200
|
+
"name" => step.name
|
|
201
|
+
}
|
|
202
|
+
end,
|
|
203
|
+
"next_step" => if result[:state].active_steps.empty? && result[:state].next_workable
|
|
204
|
+
{
|
|
205
|
+
"number" => next_step.number,
|
|
206
|
+
"name" => next_step.name
|
|
207
|
+
}
|
|
208
|
+
end,
|
|
209
|
+
"focus_step" => focus_step && {
|
|
210
|
+
"number" => focus_step.number,
|
|
211
|
+
"name" => focus_step.name
|
|
197
212
|
}
|
|
198
213
|
}
|
|
199
214
|
rescue Ace::Assign::AssignmentErrors::NoActive
|
data/lib/ace/overseer/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ace-overseer
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.15.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Michal Czyz
|
|
8
8
|
bindir: exe
|
|
9
9
|
cert_chain: []
|
|
10
|
-
date: 2026-04-
|
|
10
|
+
date: 2026-04-26 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
12
|
- !ruby/object:Gem::Dependency
|
|
13
13
|
name: ace-support-cli
|
|
@@ -71,14 +71,14 @@ dependencies:
|
|
|
71
71
|
requirements:
|
|
72
72
|
- - "~>"
|
|
73
73
|
- !ruby/object:Gem::Version
|
|
74
|
-
version: '0.
|
|
74
|
+
version: '0.54'
|
|
75
75
|
type: :runtime
|
|
76
76
|
prerelease: false
|
|
77
77
|
version_requirements: !ruby/object:Gem::Requirement
|
|
78
78
|
requirements:
|
|
79
79
|
- - "~>"
|
|
80
80
|
- !ruby/object:Gem::Version
|
|
81
|
-
version: '0.
|
|
81
|
+
version: '0.54'
|
|
82
82
|
- !ruby/object:Gem::Dependency
|
|
83
83
|
name: ace-git
|
|
84
84
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -99,14 +99,14 @@ dependencies:
|
|
|
99
99
|
requirements:
|
|
100
100
|
- - "~>"
|
|
101
101
|
- !ruby/object:Gem::Version
|
|
102
|
-
version: '0.
|
|
102
|
+
version: '0.21'
|
|
103
103
|
type: :runtime
|
|
104
104
|
prerelease: false
|
|
105
105
|
version_requirements: !ruby/object:Gem::Requirement
|
|
106
106
|
requirements:
|
|
107
107
|
- - "~>"
|
|
108
108
|
- !ruby/object:Gem::Version
|
|
109
|
-
version: '0.
|
|
109
|
+
version: '0.21'
|
|
110
110
|
- !ruby/object:Gem::Dependency
|
|
111
111
|
name: ace-task
|
|
112
112
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -127,14 +127,14 @@ dependencies:
|
|
|
127
127
|
requirements:
|
|
128
128
|
- - "~>"
|
|
129
129
|
- !ruby/object:Gem::Version
|
|
130
|
-
version: '0.
|
|
130
|
+
version: '0.17'
|
|
131
131
|
type: :runtime
|
|
132
132
|
prerelease: false
|
|
133
133
|
version_requirements: !ruby/object:Gem::Requirement
|
|
134
134
|
requirements:
|
|
135
135
|
- - "~>"
|
|
136
136
|
- !ruby/object:Gem::Version
|
|
137
|
-
version: '0.
|
|
137
|
+
version: '0.17'
|
|
138
138
|
- !ruby/object:Gem::Dependency
|
|
139
139
|
name: ace-support-test-helpers
|
|
140
140
|
requirement: !ruby/object:Gem::Requirement
|