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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fb292ef843ffd5c7253b24cefe7e30f214be59f9e5b7dc1f4bd7ad263fc7bf4f
4
- data.tar.gz: 21bbfe1148509df32512f1bbbf2aa2b001531c29e7da92407c7083e6dc822a5b
3
+ metadata.gz: 3ad5c1cd73b433965d9e8ac955ca8230dd677c6c5067bcdee1a2ff6427603deb
4
+ data.tar.gz: efa22f74cc5af23a2e686c924558ca276d539369646f89825739b5255c3d307d
5
5
  SHA512:
6
- metadata.gz: 52acbe53a83d98c940feb512bde7059b8f0bc60343d9ad1e1b83fe841691afc5177f550743fe444177b00952e2ed66df34037c2214095ddc4d397b4715e69b4d
7
- data.tar.gz: d479e4f2444a12c12687f7b8cf4f329bb2c43e74ea855017d79299e89354fa1cd2bd81bafb7302dd34853059d5c07bc9a8ed9d645f3f94fac3b6dc5716bf4c57
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
- 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.3'
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.3
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-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.53'
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.53'
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.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
@@ -127,14 +127,14 @@ dependencies:
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