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.
- checksums.yaml +4 -4
- data/agentilda.gemspec +8 -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 +78 -0
- data/lib/agentilda/cli/agents/subcommands/describe.rb +8 -4
- data/lib/agentilda/cli/base.rb +22 -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 +61 -15
- 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.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:
|
|
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-
|
|
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:
|
|
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:
|
|
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: '
|
|
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.
|
|
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
|