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.
- checksums.yaml +4 -4
- data/agentilda.gemspec +10 -6
- data/agents/hansolo-reviewer.md +42 -13
- data/agents/lando-broker.md +40 -46
- data/agents/leah-researcher.md +36 -58
- data/agents/luke-backend.md +49 -61
- data/agents/palpatine-planner.md +39 -21
- data/agents/rey-frontend.md +44 -86
- data/agents/yoda-writer.md +38 -36
- data/bin/setup +26 -0
- data/exe/agentilda +13 -92
- data/exe/tilda-rs +0 -0
- data/lib/agentilda/adoption.rb +7 -2
- data/lib/agentilda/agent.rb +40 -99
- data/lib/agentilda/agents.rb +122 -0
- data/lib/agentilda/board.rb +91 -0
- data/lib/agentilda/brief.rb +54 -5
- data/lib/agentilda/child.rb +92 -0
- data/lib/agentilda/cli/agents/subcommands/describe.rb +8 -4
- data/lib/agentilda/cli/base.rb +46 -6
- data/lib/agentilda/cli/create/create.rb +46 -19
- data/lib/agentilda/cli/docs/docs.rb +6 -2
- data/lib/agentilda/cli/index/index.rb +6 -4
- data/lib/agentilda/cli/linear/linear.rb +3 -2
- data/lib/agentilda/cli/linear/subcommands/import.rb +26 -15
- data/lib/agentilda/cli/mail/mail.rb +31 -0
- data/lib/agentilda/cli/mail/subcommands/read.rb +43 -0
- data/lib/agentilda/cli/mail/subcommands/send.rb +43 -0
- data/lib/agentilda/cli/resync/subcommands/dirs.rb +6 -4
- data/lib/agentilda/cli/resync/subcommands/prs.rb +21 -13
- data/lib/agentilda/cli/run/run.rb +207 -99
- data/lib/agentilda/cli/unblock/unblock.rb +24 -13
- data/lib/agentilda/cli/worktree/worktree.rb +85 -0
- data/lib/agentilda/cli.rb +43 -0
- data/lib/agentilda/clock.rb +114 -0
- data/lib/agentilda/console.rb +157 -0
- data/lib/agentilda/control.rb +63 -0
- data/lib/agentilda/creator.rb +7 -2
- data/lib/agentilda/dashboard.rb +219 -0
- data/lib/agentilda/dev_work.rb +2 -0
- data/lib/agentilda/diagram.rb +12 -7
- data/lib/agentilda/dispatcher.rb +646 -0
- data/lib/agentilda/documentation.rb +14 -6
- data/lib/agentilda/executor.rb +362 -204
- data/lib/agentilda/feature.rb +14 -135
- data/lib/agentilda/frontmatter.rb +4 -2
- data/lib/agentilda/github.rb +19 -11
- data/lib/agentilda/index.rb +11 -11
- data/lib/agentilda/keyboard.rb +76 -8
- data/lib/agentilda/launcher.rb +69 -0
- data/lib/agentilda/ledger.rb +233 -0
- data/lib/agentilda/linear/api.rb +14 -10
- data/lib/agentilda/linear/attribution.rb +5 -5
- data/lib/agentilda/linear/import.rb +30 -14
- data/lib/agentilda/linear/issue.rb +6 -3
- data/lib/agentilda/linear/mapping.rb +18 -17
- data/lib/agentilda/linear/push.rb +19 -12
- data/lib/agentilda/linear/survey.rb +3 -2
- data/lib/agentilda/linear/unit.rb +12 -12
- data/lib/agentilda/linear.rb +5 -6
- data/lib/agentilda/mailbox.rb +141 -0
- data/lib/agentilda/markdown.rb +1 -1
- data/lib/agentilda/progress_log.rb +5 -1
- data/lib/agentilda/publisher.rb +6 -3
- data/lib/agentilda/pull_request.rb +0 -186
- data/lib/agentilda/pull_requests.rb +230 -0
- data/lib/agentilda/reporter.rb +9 -3
- data/lib/agentilda/resync.rb +120 -52
- data/lib/agentilda/roster.rb +31 -48
- data/lib/agentilda/runner.rb +72 -389
- data/lib/agentilda/screen/ratatui/bar.rb +57 -0
- data/lib/agentilda/screen/ratatui/key_translator.rb +29 -0
- data/lib/agentilda/screen/ratatui.rb +318 -0
- data/lib/agentilda/state_file.rb +174 -0
- data/lib/agentilda/state_machine.rb +60 -32
- data/lib/agentilda/status.rb +120 -37
- data/lib/agentilda/subject.rb +133 -0
- data/lib/agentilda/tally.rb +17 -11
- data/lib/agentilda/transcript.rb +47 -16
- data/lib/agentilda/tree.rb +10 -6
- data/lib/agentilda/ui.rb +204 -190
- data/lib/agentilda/unblocker.rb +25 -11
- data/lib/agentilda/version.rb +1 -1
- data/lib/agentilda/worktree.rb +14 -18
- data/lib/agentilda.rb +57 -70
- metadata +65 -13
- data/Gemfile +0 -26
- data/Gemfile.lock +0 -261
- data/bin/create-plan-folder +0 -125
- data/lib/dry/cli/banner.rb +0 -293
data/lib/agentilda/unblocker.rb
CHANGED
|
@@ -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,
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
# @
|
|
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,
|
|
165
|
-
|
|
166
|
-
|
|
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,
|
|
189
|
-
|
|
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
|
-
|
|
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
|
data/lib/agentilda/version.rb
CHANGED
data/lib/agentilda/worktree.rb
CHANGED
|
@@ -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
|
|
107
|
-
# carries on.
|
|
108
|
-
#
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
5
|
-
|
|
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 "
|
|
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
|
|
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",
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
#
|
|
112
|
-
#
|
|
113
|
-
#
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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-
|
|
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:
|
|
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:
|
|
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: '
|
|
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.
|
|
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
|