agentilda 1.0.3 → 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.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/agentilda.gemspec +10 -6
  3. data/agents/hansolo-reviewer.md +42 -13
  4. data/agents/lando-broker.md +40 -46
  5. data/agents/leah-researcher.md +36 -58
  6. data/agents/luke-backend.md +49 -61
  7. data/agents/palpatine-planner.md +39 -21
  8. data/agents/rey-frontend.md +44 -86
  9. data/agents/yoda-writer.md +38 -36
  10. data/bin/setup +26 -0
  11. data/exe/agentilda +13 -92
  12. data/exe/tilda-rs +0 -0
  13. data/lib/agentilda/adoption.rb +7 -2
  14. data/lib/agentilda/agent.rb +40 -99
  15. data/lib/agentilda/agents.rb +122 -0
  16. data/lib/agentilda/board.rb +91 -0
  17. data/lib/agentilda/brief.rb +54 -5
  18. data/lib/agentilda/child.rb +92 -0
  19. data/lib/agentilda/cli/agents/subcommands/describe.rb +8 -4
  20. data/lib/agentilda/cli/base.rb +46 -6
  21. data/lib/agentilda/cli/create/create.rb +46 -19
  22. data/lib/agentilda/cli/docs/docs.rb +6 -2
  23. data/lib/agentilda/cli/index/index.rb +6 -4
  24. data/lib/agentilda/cli/linear/linear.rb +3 -2
  25. data/lib/agentilda/cli/linear/subcommands/import.rb +26 -15
  26. data/lib/agentilda/cli/mail/mail.rb +31 -0
  27. data/lib/agentilda/cli/mail/subcommands/read.rb +43 -0
  28. data/lib/agentilda/cli/mail/subcommands/send.rb +43 -0
  29. data/lib/agentilda/cli/resync/subcommands/dirs.rb +6 -4
  30. data/lib/agentilda/cli/resync/subcommands/prs.rb +21 -13
  31. data/lib/agentilda/cli/run/run.rb +207 -99
  32. data/lib/agentilda/cli/unblock/unblock.rb +24 -13
  33. data/lib/agentilda/cli/worktree/worktree.rb +85 -0
  34. data/lib/agentilda/cli.rb +43 -0
  35. data/lib/agentilda/clock.rb +114 -0
  36. data/lib/agentilda/console.rb +157 -0
  37. data/lib/agentilda/control.rb +63 -0
  38. data/lib/agentilda/creator.rb +7 -2
  39. data/lib/agentilda/dashboard.rb +219 -0
  40. data/lib/agentilda/dev_work.rb +2 -0
  41. data/lib/agentilda/diagram.rb +12 -7
  42. data/lib/agentilda/dispatcher.rb +646 -0
  43. data/lib/agentilda/documentation.rb +14 -6
  44. data/lib/agentilda/executor.rb +362 -204
  45. data/lib/agentilda/feature.rb +14 -135
  46. data/lib/agentilda/frontmatter.rb +4 -2
  47. data/lib/agentilda/github.rb +19 -11
  48. data/lib/agentilda/index.rb +11 -11
  49. data/lib/agentilda/keyboard.rb +76 -8
  50. data/lib/agentilda/launcher.rb +69 -0
  51. data/lib/agentilda/ledger.rb +233 -0
  52. data/lib/agentilda/linear/api.rb +14 -10
  53. data/lib/agentilda/linear/attribution.rb +5 -5
  54. data/lib/agentilda/linear/import.rb +30 -14
  55. data/lib/agentilda/linear/issue.rb +6 -3
  56. data/lib/agentilda/linear/mapping.rb +18 -17
  57. data/lib/agentilda/linear/push.rb +19 -12
  58. data/lib/agentilda/linear/survey.rb +3 -2
  59. data/lib/agentilda/linear/unit.rb +12 -12
  60. data/lib/agentilda/linear.rb +5 -6
  61. data/lib/agentilda/mailbox.rb +141 -0
  62. data/lib/agentilda/markdown.rb +1 -1
  63. data/lib/agentilda/progress_log.rb +5 -1
  64. data/lib/agentilda/publisher.rb +6 -3
  65. data/lib/agentilda/pull_request.rb +0 -186
  66. data/lib/agentilda/pull_requests.rb +230 -0
  67. data/lib/agentilda/reporter.rb +9 -3
  68. data/lib/agentilda/resync.rb +120 -52
  69. data/lib/agentilda/roster.rb +31 -48
  70. data/lib/agentilda/runner.rb +72 -389
  71. data/lib/agentilda/screen/ratatui/bar.rb +57 -0
  72. data/lib/agentilda/screen/ratatui/key_translator.rb +29 -0
  73. data/lib/agentilda/screen/ratatui.rb +318 -0
  74. data/lib/agentilda/state_file.rb +174 -0
  75. data/lib/agentilda/state_machine.rb +60 -32
  76. data/lib/agentilda/status.rb +120 -37
  77. data/lib/agentilda/subject.rb +133 -0
  78. data/lib/agentilda/tally.rb +17 -11
  79. data/lib/agentilda/transcript.rb +47 -16
  80. data/lib/agentilda/tree.rb +10 -6
  81. data/lib/agentilda/ui.rb +204 -190
  82. data/lib/agentilda/unblocker.rb +25 -11
  83. data/lib/agentilda/version.rb +1 -1
  84. data/lib/agentilda/worktree.rb +14 -18
  85. data/lib/agentilda.rb +57 -70
  86. metadata +65 -13
  87. data/Gemfile +0 -26
  88. data/Gemfile.lock +0 -261
  89. data/bin/create-plan-folder +0 -125
  90. data/lib/dry/cli/banner.rb +0 -293
@@ -147,9 +147,18 @@ module Agentilda
147
147
  return [] if subjects.empty?
148
148
 
149
149
  before = subjects.map { |subject| [subject.feature.ordinal.to_s, self.class.questions(subject)] }.to_h
150
- results = UI.concurrently(subjects, headline(subjects), jobs: 1, label: method(:label),
151
- fields: method(:log_fields)) do |subject, progress|
152
- invoke(subject, &progress)
150
+ results = UI.concurrently(subjects,
151
+ headline(subjects),
152
+ jobs: 1,
153
+ label: method(:label),
154
+ fields: method(:log_fields),
155
+ file: ->(_) { "blocked.md" },
156
+ root:) do |subject, progress|
157
+ # After ctrl-c the plans not yet started stay as they are, blocked.md
158
+ # untouched, so the next run picks them up from the beginning.
159
+ next [false, "not started: interrupted by ctrl-c"] if Control.interrupted?
160
+
161
+ invoke(subject, progress)
153
162
  end
154
163
 
155
164
  settle
@@ -159,11 +168,13 @@ module Agentilda
159
168
  private
160
169
 
161
170
  # @param subject [Agentilda::Subject]
162
- # @yieldparam phrase [String] what the agent is doing, as it changes
171
+ # @param progress [Agentilda::UI::Line] a dashboard row carries the
172
+ # executor handle its kill and extend keys act on; a plain line does not
163
173
  # @return [Array(Boolean, String)]
164
- def invoke(subject, &on_activity)
165
- @executor.call(agent, subject, root:, &on_activity)
166
- rescue => e
174
+ def invoke(subject, progress)
175
+ handle = progress.handle if progress.is_a?(Dashboard::Tracker)
176
+ @executor.call(agent, subject, root:, handle:, &progress)
177
+ rescue StandardError => e
167
178
  [false, "#{e.class}: #{e.message.lines.first.to_s.strip}"]
168
179
  end
169
180
 
@@ -185,15 +196,18 @@ module Agentilda
185
196
  ok, note = result.is_a?(Exception) ? [false, result.message.lines.first.to_s.strip] : result
186
197
  current = tree.find(subject.feature.ordinal) || subject
187
198
 
188
- Outcome.new(subject: current, ok: !!ok, note: note.to_s,
189
- before: before.fetch(subject.feature.ordinal.to_s, []), after: self.class.questions(current))
199
+ Outcome.new(subject: current,
200
+ ok: !!ok,
201
+ note: note.to_s,
202
+ before: before.fetch(subject.feature.ordinal.to_s, []),
203
+ after: self.class.questions(current))
190
204
  end
191
205
 
192
206
  # @param subjects [Array<Agentilda::Subject>]
193
207
  # @return [String]
194
208
  def headline(subjects)
195
209
  "#{commit? ? "handing" : "would hand"} #{subjects.size} plan#{"s" unless subjects.size == 1} " \
196
- "to #{agent.name} in #{root}"
210
+ "to #{agent.name} in #{root}"
197
211
  end
198
212
 
199
213
  # @param subject [Agentilda::Subject]
@@ -202,6 +216,6 @@ module Agentilda
202
216
 
203
217
  # @param subject [Agentilda::Subject]
204
218
  # @return [Hash] the columns this plan's log lines carry
205
- def log_fields(subject) = {plan: subject.feature.ordinal.to_s, status: subject.status.to_s, agent: agent.name}
219
+ def log_fields(subject) = { plan: subject.feature.ordinal.to_s, status: subject.status.to_s, agent: agent.name }
206
220
  end
207
221
  end
@@ -6,5 +6,5 @@
6
6
  #
7
7
  # © 2026 Konstantin Gredeskoul
8
8
  module Agentilda
9
- VERSION = "1.0.3"
9
+ VERSION = "2.0.1"
10
10
  end
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "fileutils"
4
+ require "shellwords"
5
+
3
6
  module Agentilda
4
7
  # A git worktree per plan, so agents working on different plans cannot
5
8
  # collide at all.
@@ -103,36 +106,29 @@ module Agentilda
103
106
  # and friends, and credential keys.
104
107
  #
105
108
  # Never fatal. A repository with no ignored files is perfectly normal, and
106
- # a plan is not worth abandoning over a seeding step, so this reports and
107
- # carries on. It runs `--quiet`, which prints nothing on success and leaves
108
- # a real failure on STDERR where the loop's other progress goes.
109
+ # a plan is not worth abandoning over a seeding step, so this notes it and
110
+ # carries on.
111
+ #
112
+ # The note goes to the progress log, never the terminal: this runs while
113
+ # the ratatui dashboard owns the screen, and a line written to STDERR
114
+ # lands on top of an agent's row. The seeder's own output is silenced for
115
+ # the same reason. A suite that later dies on a missing key is explained
116
+ # by the log line.
109
117
  #
110
118
  # @param path [String] the worktree to seed
111
119
  # @return [Boolean] whether the seeder ran and succeeded
112
- # `$stderr` rather than `Kernel#warn`, matching {Agentilda::UI}, which
113
- # writes its progress to `$stderr` too. Style/StderrPuts prefers warn so the
114
- # output can be silenced, but warn reaches file descriptor 2 through
115
- # `Warning.warn` and ignores a reassigned `$stderr` entirely:
116
- #
117
- # $stderr = StringIO.new; warn "x"; $stderr.string # => ""
118
- #
119
- # So anything capturing this loop's output, the suite included, would never
120
- # see a seeding failure. Being silenceable is worth less than being seen.
121
- # rubocop: disable Style/StderrPuts
122
120
  def seed(path)
123
121
  unless File.executable?(SEEDER)
124
- $stderr.puts "worktree: #{SEEDER} is missing, so #{path} has no .env or credential keys"
122
+ UI.log("worktree: #{SEEDER} is missing, so #{path} has no .env or credential keys")
125
123
  return false
126
124
  end
127
125
 
128
- return true if system(SEEDER, "--quiet", path, out: File::NULL)
126
+ return true if system(SEEDER, "--quiet", path, out: File::NULL, err: File::NULL)
129
127
 
130
- $stderr.puts "worktree: could not seed #{path}; its suite may fail on a missing key"
128
+ UI.log("worktree: could not seed #{path}; its suite may fail on a missing key")
131
129
  false
132
130
  end
133
131
 
134
- # rubocop: enable Style/StderrPuts
135
-
136
132
  # @param feature [Agentilda::Feature]
137
133
  # @return [String] e.g. "kig/002.00-tenancy-households"
138
134
  def branch_for(feature) = "#{@user}/#{feature.ordinal}-#{feature.slug}"
data/lib/agentilda.rb CHANGED
@@ -1,25 +1,41 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # Help screens come from dry-cli-help, which prepends itself to Dry::CLI the
4
+ # moment it loads, so it has to load before the registry's `help` block runs.
3
5
  require "dry/cli"
4
- require_relative "dry/cli/banner"
5
- require "dry/monads"
6
+ require "dry/cli/help"
7
+
6
8
  require "dry/inflector"
7
- require "pastel"
8
- require "unicode/display_width"
9
- require "strings"
10
- require "tty/box"
11
- require "tty/command"
12
- require "tty/screen"
13
- require "tty/progressbar"
14
- require "tty/spinner"
15
- require "concurrent/array"
16
- require "concurrent/hash"
17
- require "etc"
18
9
  require "fileutils"
19
- require "tempfile"
20
- require "tmpdir"
21
10
  require "shellwords"
22
- require "parallel"
11
+ require "zeitwerk"
12
+ loader = Zeitwerk::Loader.for_gem
13
+ loader.inflector.inflect(
14
+ "api" => "API",
15
+ "cli" => "CLI",
16
+ "github" => "GitHub",
17
+ "issue" => "Issues",
18
+ "list_plans" => "ListPlans",
19
+ "unit" => "Units",
20
+ "ui" => "UI"
21
+ )
22
+ loader.collapse("#{__dir__}/agentilda/cli/create")
23
+ loader.collapse("#{__dir__}/agentilda/cli/docs")
24
+ loader.collapse("#{__dir__}/agentilda/cli/index")
25
+ loader.collapse("#{__dir__}/agentilda/cli/list_plans")
26
+ loader.collapse("#{__dir__}/agentilda/cli/run")
27
+ loader.collapse("#{__dir__}/agentilda/cli/states")
28
+ loader.collapse("#{__dir__}/agentilda/cli/unblock")
29
+ loader.collapse("#{__dir__}/agentilda/cli/version")
30
+ loader.collapse("#{__dir__}/agentilda/cli/worktree")
31
+ loader.collapse("#{__dir__}/agentilda/cli/agents/subcommands")
32
+ loader.collapse("#{__dir__}/agentilda/cli/linear/subcommands")
33
+ loader.collapse("#{__dir__}/agentilda/cli/mail/subcommands")
34
+ loader.collapse("#{__dir__}/agentilda/cli/resync/subcommands")
35
+ loader.ignore("#{__dir__}/agentilda/cli/linear/linear.rb")
36
+ loader.ignore("#{__dir__}/agentilda/cli/mail/mail.rb")
37
+ loader.ignore("#{__dir__}/agentilda/linear/mapping.rb")
38
+ loader.setup
23
39
 
24
40
  # Spec → Plan → Build.
25
41
  #
@@ -34,13 +50,11 @@ require "parallel"
34
50
  # vocabulary, the numbering rules and the transition table live here and are
35
51
  # emitted by `agentilda docs`. Three hand-maintained copies of that table
36
52
  # have already drifted apart, which is why there is now exactly one.
37
- #
38
- require_relative "agentilda/version"
39
53
 
40
54
  # © 2026 Konstantin Gredeskoul
41
55
  module Agentilda
42
56
  # The folder every project keeps its plans in.
43
- PLANS_DIR = ".plans"
57
+ PLANS_DIR = ENV.fetch("PLANS_DIR", ".plans")
44
58
 
45
59
  # Prefix for a pull request that deliberately implements no plan —
46
60
  # dependency bumps, CI work, hotfixes, developer tooling.
@@ -57,8 +71,8 @@ module Agentilda
57
71
  # Unlike `dev` this asserts nothing; it marks a question left open.
58
72
  NONE_PREFIX = "none"
59
73
 
60
- # @return [Dry::Inflector] shared inflector
61
- def self.inflector = @inflector ||= Dry::Inflector.new
74
+ # @return [Dry::Inflector] shared Inflector
75
+ def self.inflector = @inflector ||= ::Dry::Inflector.new
62
76
 
63
77
  # Move a directory, preferring `git mv` so its history follows it.
64
78
  #
@@ -73,10 +87,22 @@ module Agentilda
73
87
  return false if File.exist?(target)
74
88
 
75
89
  parent = File.dirname(source)
76
- tracked = system("git", "-C", parent, "ls-files", "--error-unmatch", source,
77
- out: File::NULL, err: File::NULL)
78
- moved = tracked && system("git", "-C", parent, "mv", source, target,
79
- out: File::NULL, err: File::NULL)
90
+ tracked = system("git",
91
+ "-C",
92
+ parent,
93
+ "ls-files",
94
+ "--error-unmatch",
95
+ source,
96
+ out: File::NULL,
97
+ err: File::NULL)
98
+ moved = tracked && system("git",
99
+ "-C",
100
+ parent,
101
+ "mv",
102
+ source,
103
+ target,
104
+ out: File::NULL,
105
+ err: File::NULL)
80
106
  FileUtils.mv(source, target) unless moved
81
107
  true
82
108
  end
@@ -108,48 +134,9 @@ module Agentilda
108
134
  class Error < StandardError; end
109
135
  end
110
136
 
111
- # Each component is required only once it exists, so the suite loads — and
112
- # stays a useful red/green signal while the rest is being built. Drop the
113
- # `File.exist?` guard once every file below is in place.
114
- %w[
115
- ui
116
- config
117
- ordinal
118
- status
119
- progress_log
120
- state_machine
121
- dev_work
122
- frontmatter
123
- markdown
124
- pull_request
125
- description
126
- feature
127
- github
128
- tree
129
- creator
130
- brief
131
- adoption
132
- resolver
133
- resync
134
- reporter
135
- tally
136
- index
137
- linear
138
- agent
139
- transcript
140
- roster
141
- viewer
142
- worktree
143
- publisher
144
- control
145
- keyboard
146
- executor
147
- runner
148
- unblocker
149
- documentation
150
- diagram
151
- cli
152
- ].each do |component|
153
- path = File.join(__dir__, "agentilda", "#{component}.rb")
154
- require path if File.exist?(path)
155
- end
137
+ # status.rb and feature.rb define methods on Agentilda itself (`status`,
138
+ # `plan_dirname`, `titleize` and friends) beside the class each is named for.
139
+ # Zeitwerk loads a file when its constant is first named, and a caller of
140
+ # `Agentilda.status` names no constant, so without this those methods exist
141
+ # or not depending on what happened to load first.
142
+ %w[status feature].each { |name| loader.load_file("#{__dir__}/agentilda/#{name}.rb") }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: agentilda
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Konstantin Gredeskoul
@@ -53,18 +53,52 @@ dependencies:
53
53
  version: '0'
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: dry-cli-autocomplete
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.5'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.5'
68
+ - !ruby/object:Gem::Dependency
69
+ name: dry-cli-help
56
70
  requirement: !ruby/object:Gem::Requirement
57
71
  requirements:
58
72
  - - ">="
59
73
  - !ruby/object:Gem::Version
60
- version: '0'
74
+ version: 0.5.1
75
+ - - "<"
76
+ - !ruby/object:Gem::Version
77
+ version: '0.6'
61
78
  type: :runtime
62
79
  prerelease: false
63
80
  version_requirements: !ruby/object:Gem::Requirement
64
81
  requirements:
65
82
  - - ">="
66
83
  - !ruby/object:Gem::Version
67
- version: '0'
84
+ version: 0.5.1
85
+ - - "<"
86
+ - !ruby/object:Gem::Version
87
+ version: '0.6'
88
+ - !ruby/object:Gem::Dependency
89
+ name: dry-cli-ui
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '0.5'
95
+ type: :runtime
96
+ prerelease: false
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '0.5'
68
102
  - !ruby/object:Gem::Dependency
69
103
  name: dry-inflector
70
104
  requirement: !ruby/object:Gem::Requirement
@@ -136,7 +170,7 @@ dependencies:
136
170
  - !ruby/object:Gem::Version
137
171
  version: '0'
138
172
  - !ruby/object:Gem::Dependency
139
- name: strings
173
+ name: ratatui_ruby
140
174
  requirement: !ruby/object:Gem::Requirement
141
175
  requirements:
142
176
  - - ">="
@@ -178,7 +212,7 @@ dependencies:
178
212
  - !ruby/object:Gem::Version
179
213
  version: '0'
180
214
  - !ruby/object:Gem::Dependency
181
- name: tty-progressbar
215
+ name: tty-cursor
182
216
  requirement: !ruby/object:Gem::Requirement
183
217
  requirements:
184
218
  - - ">="
@@ -206,7 +240,7 @@ dependencies:
206
240
  - !ruby/object:Gem::Version
207
241
  version: '0'
208
242
  - !ruby/object:Gem::Dependency
209
- name: tty-spinner
243
+ name: unicode-display_width
210
244
  requirement: !ruby/object:Gem::Requirement
211
245
  requirements:
212
246
  - - ">="
@@ -220,7 +254,7 @@ dependencies:
220
254
  - !ruby/object:Gem::Version
221
255
  version: '0'
222
256
  - !ruby/object:Gem::Dependency
223
- name: unicode-display_width
257
+ name: zeitwerk
224
258
  requirement: !ruby/object:Gem::Requirement
225
259
  requirements:
226
260
  - - ">="
@@ -246,8 +280,6 @@ executables:
246
280
  extensions: []
247
281
  extra_rdoc_files: []
248
282
  files:
249
- - Gemfile
250
- - Gemfile.lock
251
283
  - agentilda.gemspec
252
284
  - agents/hansolo-reviewer.md
253
285
  - agents/lando-broker.md
@@ -256,14 +288,18 @@ files:
256
288
  - agents/palpatine-planner.md
257
289
  - agents/rey-frontend.md
258
290
  - agents/yoda-writer.md
259
- - bin/create-plan-folder
260
291
  - bin/plan-number
292
+ - bin/setup
261
293
  - exe/agentilda
262
294
  - exe/tilda
295
+ - exe/tilda-rs
263
296
  - lib/agentilda.rb
264
297
  - lib/agentilda/adoption.rb
265
298
  - lib/agentilda/agent.rb
299
+ - lib/agentilda/agents.rb
300
+ - lib/agentilda/board.rb
266
301
  - lib/agentilda/brief.rb
302
+ - lib/agentilda/child.rb
267
303
  - lib/agentilda/cli.rb
268
304
  - lib/agentilda/cli/agents/subcommands/describe.rb
269
305
  - lib/agentilda/cli/agents/subcommands/list.rb
@@ -275,17 +311,25 @@ files:
275
311
  - lib/agentilda/cli/linear/subcommands/import.rb
276
312
  - lib/agentilda/cli/linear/subcommands/projects.rb
277
313
  - lib/agentilda/cli/list_plans/list_plans.rb
314
+ - lib/agentilda/cli/mail/mail.rb
315
+ - lib/agentilda/cli/mail/subcommands/read.rb
316
+ - lib/agentilda/cli/mail/subcommands/send.rb
278
317
  - lib/agentilda/cli/resync/subcommands/dirs.rb
279
318
  - lib/agentilda/cli/resync/subcommands/prs.rb
280
319
  - lib/agentilda/cli/run/run.rb
281
320
  - lib/agentilda/cli/states/states.rb
282
321
  - lib/agentilda/cli/unblock/unblock.rb
283
322
  - lib/agentilda/cli/version/version.rb
323
+ - lib/agentilda/cli/worktree/worktree.rb
324
+ - lib/agentilda/clock.rb
284
325
  - lib/agentilda/config.rb
326
+ - lib/agentilda/console.rb
285
327
  - lib/agentilda/control.rb
286
328
  - lib/agentilda/creator.rb
329
+ - lib/agentilda/dashboard.rb
287
330
  - lib/agentilda/dev_work.rb
288
331
  - lib/agentilda/diagram.rb
332
+ - lib/agentilda/dispatcher.rb
289
333
  - lib/agentilda/documentation.rb
290
334
  - lib/agentilda/executor.rb
291
335
  - lib/agentilda/feature.rb
@@ -293,6 +337,8 @@ files:
293
337
  - lib/agentilda/github.rb
294
338
  - lib/agentilda/index.rb
295
339
  - lib/agentilda/keyboard.rb
340
+ - lib/agentilda/launcher.rb
341
+ - lib/agentilda/ledger.rb
296
342
  - lib/agentilda/linear.rb
297
343
  - lib/agentilda/linear/api.rb
298
344
  - lib/agentilda/linear/attribution.rb
@@ -303,17 +349,24 @@ files:
303
349
  - lib/agentilda/linear/push.rb
304
350
  - lib/agentilda/linear/survey.rb
305
351
  - lib/agentilda/linear/unit.rb
352
+ - lib/agentilda/mailbox.rb
306
353
  - lib/agentilda/markdown.rb
307
354
  - lib/agentilda/ordinal.rb
308
355
  - lib/agentilda/progress_log.rb
309
356
  - lib/agentilda/publisher.rb
310
357
  - lib/agentilda/pull_request.rb
358
+ - lib/agentilda/pull_requests.rb
311
359
  - lib/agentilda/reporter.rb
312
360
  - lib/agentilda/resync.rb
313
361
  - lib/agentilda/roster.rb
314
362
  - lib/agentilda/runner.rb
363
+ - lib/agentilda/screen/ratatui.rb
364
+ - lib/agentilda/screen/ratatui/bar.rb
365
+ - lib/agentilda/screen/ratatui/key_translator.rb
366
+ - lib/agentilda/state_file.rb
315
367
  - lib/agentilda/state_machine.rb
316
368
  - lib/agentilda/status.rb
369
+ - lib/agentilda/subject.rb
317
370
  - lib/agentilda/tally.rb
318
371
  - lib/agentilda/transcript.rb
319
372
  - lib/agentilda/tree.rb
@@ -322,7 +375,6 @@ files:
322
375
  - lib/agentilda/version.rb
323
376
  - lib/agentilda/viewer.rb
324
377
  - lib/agentilda/worktree.rb
325
- - lib/dry/cli/banner.rb
326
378
  homepage: https://github.com/kigster/agentilda
327
379
  licenses: []
328
380
  metadata:
@@ -336,14 +388,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
336
388
  requirements:
337
389
  - - ">="
338
390
  - !ruby/object:Gem::Version
339
- version: '4.0'
391
+ version: '3'
340
392
  required_rubygems_version: !ruby/object:Gem::Requirement
341
393
  requirements:
342
394
  - - ">="
343
395
  - !ruby/object:Gem::Version
344
396
  version: '0'
345
397
  requirements: []
346
- rubygems_version: 4.0.19
398
+ rubygems_version: 4.0.20
347
399
  specification_version: 4
348
400
  summary: 'Agentic specification-driven development: spec, plan, build, review'
349
401
  test_files: []
data/Gemfile DELETED
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source "https://rubygems.org"
4
-
5
- # What agentilda needs in order to run is declared in the gemspec beside this
6
- # file, so there is one list rather than two that drift. What is left here is
7
- # only what you need in order to work on it.
8
- gemspec
9
-
10
- gem "rake"
11
- gem "yard"
12
-
13
- group :development do
14
- gem "colored2"
15
- gem "irb"
16
- gem "standard"
17
- end
18
-
19
- group :test do
20
- gem "coverage-badge"
21
- gem "json_schemer" # validates configuration.example.yml against configuration.schema.json
22
- gem "rspec"
23
- gem "rspec-its"
24
- gem "rspec_junit_formatter" # JUnit XML for CircleCI store_test_results
25
- gem "simplecov"
26
- end