agentilda 1.0.3 → 2.0.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.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/agentilda.gemspec +8 -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 +78 -0
  19. data/lib/agentilda/cli/agents/subcommands/describe.rb +8 -4
  20. data/lib/agentilda/cli/base.rb +22 -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 +61 -15
  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.0"
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.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Konstantin Gredeskoul
@@ -55,16 +55,44 @@ dependencies:
55
55
  name: dry-cli-autocomplete
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - ">="
58
+ - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '0'
60
+ version: '0.5'
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - ">="
65
+ - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '0'
67
+ version: '0.5'
68
+ - !ruby/object:Gem::Dependency
69
+ name: dry-cli-help
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0.5'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.5'
82
+ - !ruby/object:Gem::Dependency
83
+ name: dry-cli-ui
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0.5'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '0.5'
68
96
  - !ruby/object:Gem::Dependency
69
97
  name: dry-inflector
70
98
  requirement: !ruby/object:Gem::Requirement
@@ -136,7 +164,7 @@ dependencies:
136
164
  - !ruby/object:Gem::Version
137
165
  version: '0'
138
166
  - !ruby/object:Gem::Dependency
139
- name: strings
167
+ name: ratatui_ruby
140
168
  requirement: !ruby/object:Gem::Requirement
141
169
  requirements:
142
170
  - - ">="
@@ -178,7 +206,7 @@ dependencies:
178
206
  - !ruby/object:Gem::Version
179
207
  version: '0'
180
208
  - !ruby/object:Gem::Dependency
181
- name: tty-progressbar
209
+ name: tty-cursor
182
210
  requirement: !ruby/object:Gem::Requirement
183
211
  requirements:
184
212
  - - ">="
@@ -206,7 +234,7 @@ dependencies:
206
234
  - !ruby/object:Gem::Version
207
235
  version: '0'
208
236
  - !ruby/object:Gem::Dependency
209
- name: tty-spinner
237
+ name: unicode-display_width
210
238
  requirement: !ruby/object:Gem::Requirement
211
239
  requirements:
212
240
  - - ">="
@@ -220,7 +248,7 @@ dependencies:
220
248
  - !ruby/object:Gem::Version
221
249
  version: '0'
222
250
  - !ruby/object:Gem::Dependency
223
- name: unicode-display_width
251
+ name: zeitwerk
224
252
  requirement: !ruby/object:Gem::Requirement
225
253
  requirements:
226
254
  - - ">="
@@ -246,8 +274,6 @@ executables:
246
274
  extensions: []
247
275
  extra_rdoc_files: []
248
276
  files:
249
- - Gemfile
250
- - Gemfile.lock
251
277
  - agentilda.gemspec
252
278
  - agents/hansolo-reviewer.md
253
279
  - agents/lando-broker.md
@@ -256,14 +282,18 @@ files:
256
282
  - agents/palpatine-planner.md
257
283
  - agents/rey-frontend.md
258
284
  - agents/yoda-writer.md
259
- - bin/create-plan-folder
260
285
  - bin/plan-number
286
+ - bin/setup
261
287
  - exe/agentilda
262
288
  - exe/tilda
289
+ - exe/tilda-rs
263
290
  - lib/agentilda.rb
264
291
  - lib/agentilda/adoption.rb
265
292
  - lib/agentilda/agent.rb
293
+ - lib/agentilda/agents.rb
294
+ - lib/agentilda/board.rb
266
295
  - lib/agentilda/brief.rb
296
+ - lib/agentilda/child.rb
267
297
  - lib/agentilda/cli.rb
268
298
  - lib/agentilda/cli/agents/subcommands/describe.rb
269
299
  - lib/agentilda/cli/agents/subcommands/list.rb
@@ -275,17 +305,25 @@ files:
275
305
  - lib/agentilda/cli/linear/subcommands/import.rb
276
306
  - lib/agentilda/cli/linear/subcommands/projects.rb
277
307
  - lib/agentilda/cli/list_plans/list_plans.rb
308
+ - lib/agentilda/cli/mail/mail.rb
309
+ - lib/agentilda/cli/mail/subcommands/read.rb
310
+ - lib/agentilda/cli/mail/subcommands/send.rb
278
311
  - lib/agentilda/cli/resync/subcommands/dirs.rb
279
312
  - lib/agentilda/cli/resync/subcommands/prs.rb
280
313
  - lib/agentilda/cli/run/run.rb
281
314
  - lib/agentilda/cli/states/states.rb
282
315
  - lib/agentilda/cli/unblock/unblock.rb
283
316
  - lib/agentilda/cli/version/version.rb
317
+ - lib/agentilda/cli/worktree/worktree.rb
318
+ - lib/agentilda/clock.rb
284
319
  - lib/agentilda/config.rb
320
+ - lib/agentilda/console.rb
285
321
  - lib/agentilda/control.rb
286
322
  - lib/agentilda/creator.rb
323
+ - lib/agentilda/dashboard.rb
287
324
  - lib/agentilda/dev_work.rb
288
325
  - lib/agentilda/diagram.rb
326
+ - lib/agentilda/dispatcher.rb
289
327
  - lib/agentilda/documentation.rb
290
328
  - lib/agentilda/executor.rb
291
329
  - lib/agentilda/feature.rb
@@ -293,6 +331,8 @@ files:
293
331
  - lib/agentilda/github.rb
294
332
  - lib/agentilda/index.rb
295
333
  - lib/agentilda/keyboard.rb
334
+ - lib/agentilda/launcher.rb
335
+ - lib/agentilda/ledger.rb
296
336
  - lib/agentilda/linear.rb
297
337
  - lib/agentilda/linear/api.rb
298
338
  - lib/agentilda/linear/attribution.rb
@@ -303,17 +343,24 @@ files:
303
343
  - lib/agentilda/linear/push.rb
304
344
  - lib/agentilda/linear/survey.rb
305
345
  - lib/agentilda/linear/unit.rb
346
+ - lib/agentilda/mailbox.rb
306
347
  - lib/agentilda/markdown.rb
307
348
  - lib/agentilda/ordinal.rb
308
349
  - lib/agentilda/progress_log.rb
309
350
  - lib/agentilda/publisher.rb
310
351
  - lib/agentilda/pull_request.rb
352
+ - lib/agentilda/pull_requests.rb
311
353
  - lib/agentilda/reporter.rb
312
354
  - lib/agentilda/resync.rb
313
355
  - lib/agentilda/roster.rb
314
356
  - lib/agentilda/runner.rb
357
+ - lib/agentilda/screen/ratatui.rb
358
+ - lib/agentilda/screen/ratatui/bar.rb
359
+ - lib/agentilda/screen/ratatui/key_translator.rb
360
+ - lib/agentilda/state_file.rb
315
361
  - lib/agentilda/state_machine.rb
316
362
  - lib/agentilda/status.rb
363
+ - lib/agentilda/subject.rb
317
364
  - lib/agentilda/tally.rb
318
365
  - lib/agentilda/transcript.rb
319
366
  - lib/agentilda/tree.rb
@@ -322,7 +369,6 @@ files:
322
369
  - lib/agentilda/version.rb
323
370
  - lib/agentilda/viewer.rb
324
371
  - lib/agentilda/worktree.rb
325
- - lib/dry/cli/banner.rb
326
372
  homepage: https://github.com/kigster/agentilda
327
373
  licenses: []
328
374
  metadata:
@@ -336,14 +382,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
336
382
  requirements:
337
383
  - - ">="
338
384
  - !ruby/object:Gem::Version
339
- version: '4.0'
385
+ version: '3'
340
386
  required_rubygems_version: !ruby/object:Gem::Requirement
341
387
  requirements:
342
388
  - - ">="
343
389
  - !ruby/object:Gem::Version
344
390
  version: '0'
345
391
  requirements: []
346
- rubygems_version: 4.0.19
392
+ rubygems_version: 4.0.20
347
393
  specification_version: 4
348
394
  summary: 'Agentic specification-driven development: spec, plan, build, review'
349
395
  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