ace-overseer 0.14.12 → 0.15.5

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: fb292ef843ffd5c7253b24cefe7e30f214be59f9e5b7dc1f4bd7ad263fc7bf4f
4
- data.tar.gz: 21bbfe1148509df32512f1bbbf2aa2b001531c29e7da92407c7083e6dc822a5b
3
+ metadata.gz: 94c89137756a33173502e2c4fd33bccd546544e9f9f6b407a98a7e50b471145e
4
+ data.tar.gz: 905b9f9838c3de93b5713ac9981c6c8bacc3b45aeb5bcaab6158af1c87ccc042
5
5
  SHA512:
6
- metadata.gz: 52acbe53a83d98c940feb512bde7059b8f0bc60343d9ad1e1b83fe841691afc5177f550743fe444177b00952e2ed66df34037c2214095ddc4d397b4715e69b4d
7
- data.tar.gz: d479e4f2444a12c12687f7b8cf4f329bb2c43e74ea855017d79299e89354fa1cd2bd81bafb7302dd34853059d5c07bc9a8ed9d645f3f94fac3b6dc5716bf4c57
6
+ metadata.gz: a0f8a6c0eb6ed7c5073b14abb8c89e927056cb6a350a9145a88f851ae364397cc86d3a886906b16efbfbc1be98b7e67da9570ef09348a3af72fbc6919a23da2e
7
+ data.tar.gz: 641a1c96465712f92cd307ee430381ffe54fe7051571c04e5350d6df27fd83d8b887cddf4749b2043500df0a21ee8a3fe6d7c1a59905697973cede81fcd7c84b
data/CHANGELOG.md CHANGED
@@ -7,6 +7,52 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.15.5] - 2026-08-12
11
+
12
+ ### Technical
13
+ - Raised the `ace-support-core` dependency floor to `~> 0.31` after the principles-first bootstrap guidance release.
14
+ ## [0.15.4] - 2026-08-12
15
+
16
+ ### Fixed
17
+ - Updated the `ace-tmux` runtime dependency constraint to `~> 0.17` so overseer stays compatible with the current tmux runtime control release line.
18
+
19
+ ### Technical
20
+ - Aligned gemspec dependency floors with current ACE package minor release lines and safe external minor dependency bumps (no major version jumps).
21
+
22
+ ## [0.15.3] - 2026-04-23
23
+
24
+ ### Technical
25
+ - 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.
26
+
27
+ ## [0.15.2] - 2026-04-23
28
+
29
+ ### Technical
30
+ - 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.
31
+
32
+ ## [0.15.1] - 2026-04-23
33
+
34
+ ### Technical
35
+ - Updated the `ace-git-worktree` runtime dependency constraint to `~> 0.21` so overseer stays aligned with the current worktree minor release line.
36
+
37
+ ## [0.15.0] - 2026-04-23
38
+
39
+ ### Changed
40
+ - 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.
41
+ - 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.
42
+
43
+ ## [0.14.14] - 2026-04-23
44
+
45
+
46
+ ### Changed
47
+ - Reworked tmux window-open behavior to align with shared session targeting and reduce ambiguity when launching and reusing worktree windows.
48
+ - Updated overseer tmux-window coverage to verify the current session/window lifecycle against the improved launcher behavior.
49
+
50
+
51
+ ## [0.14.13] - 2026-04-22
52
+
53
+ ### Fixed
54
+ - Matched existing tmux windows through the shared `ace-tmux` sanitized window-name policy so worktrees with punctuation are not reopened under duplicate names.
55
+
10
56
  ## [0.14.12] - 2026-04-19
11
57
 
12
58
  ### Technical
@@ -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
- current = assignment["current_step"] || assignment[:current_step]
131
+ active_steps = assignment["active_steps"] || assignment[:active_steps]
132
+ next_step = assignment["next_step"] || assignment[:next_step]
132
133
  parts = "#{bar} #{counts}"
133
- parts = "#{parts} #{colorize(current, :dim)}" if current
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
- current = info.queue_state.current
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
- "in_progress" => info.queue_state.summary[:in_progress],
69
+ "active" => info.queue_state.summary[:active],
69
70
  "pending" => info.queue_state.summary[:pending]
70
71
  },
71
- "current_step" => current ? current.name : nil
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: existing.dig("current_step", "number"),
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
- "current_step" => result[:current] && {
195
- "number" => result[:current].number,
196
- "name" => result[:current].name
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
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Ace
4
4
  module Overseer
5
- VERSION = '0.14.12'
5
+ VERSION = "0.15.5"
6
6
  end
7
7
  end
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.14.12
4
+ version: 0.15.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michal Czyz
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2026-04-20 00:00:00.000000000 Z
10
+ date: 2026-08-12 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: ace-support-cli
@@ -29,28 +29,28 @@ dependencies:
29
29
  requirements:
30
30
  - - "~>"
31
31
  - !ruby/object:Gem::Version
32
- version: '0.29'
32
+ version: '0.31'
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '0.29'
39
+ version: '0.31'
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: ace-support-config
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '0.9'
46
+ version: '0.17'
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '0.9'
53
+ version: '0.17'
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: ace-support-fs
56
56
  requirement: !ruby/object:Gem::Requirement
@@ -71,84 +71,84 @@ dependencies:
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: '0.53'
74
+ version: '0.55'
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.53'
81
+ version: '0.55'
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: ace-git
84
84
  requirement: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - "~>"
87
87
  - !ruby/object:Gem::Version
88
- version: '0.19'
88
+ version: '0.22'
89
89
  type: :runtime
90
90
  prerelease: false
91
91
  version_requirements: !ruby/object:Gem::Requirement
92
92
  requirements:
93
93
  - - "~>"
94
94
  - !ruby/object:Gem::Version
95
- version: '0.19'
95
+ version: '0.22'
96
96
  - !ruby/object:Gem::Dependency
97
97
  name: ace-git-worktree
98
98
  requirement: !ruby/object:Gem::Requirement
99
99
  requirements:
100
100
  - - "~>"
101
101
  - !ruby/object:Gem::Version
102
- version: '0.20'
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.20'
109
+ version: '0.21'
110
110
  - !ruby/object:Gem::Dependency
111
111
  name: ace-task
112
112
  requirement: !ruby/object:Gem::Requirement
113
113
  requirements:
114
114
  - - "~>"
115
115
  - !ruby/object:Gem::Version
116
- version: '0.31'
116
+ version: '0.37'
117
117
  type: :runtime
118
118
  prerelease: false
119
119
  version_requirements: !ruby/object:Gem::Requirement
120
120
  requirements:
121
121
  - - "~>"
122
122
  - !ruby/object:Gem::Version
123
- version: '0.31'
123
+ version: '0.37'
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: ace-tmux
126
126
  requirement: !ruby/object:Gem::Requirement
127
127
  requirements:
128
128
  - - "~>"
129
129
  - !ruby/object:Gem::Version
130
- version: '0.11'
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.11'
137
+ version: '0.17'
138
138
  - !ruby/object:Gem::Dependency
139
139
  name: ace-support-test-helpers
140
140
  requirement: !ruby/object:Gem::Requirement
141
141
  requirements:
142
142
  - - "~>"
143
143
  - !ruby/object:Gem::Version
144
- version: '0.13'
144
+ version: '0.14'
145
145
  type: :development
146
146
  prerelease: false
147
147
  version_requirements: !ruby/object:Gem::Requirement
148
148
  requirements:
149
149
  - - "~>"
150
150
  - !ruby/object:Gem::Version
151
- version: '0.13'
151
+ version: '0.14'
152
152
  - !ruby/object:Gem::Dependency
153
153
  name: bundler
154
154
  requirement: !ruby/object:Gem::Requirement