agentilda 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +26 -0
  3. data/Gemfile.lock +261 -0
  4. data/agentilda.gemspec +57 -0
  5. data/agents/hansolo-reviewer.md +29 -0
  6. data/agents/lando-broker.md +74 -0
  7. data/agents/leah-researcher.md +80 -0
  8. data/agents/luke-backend.md +81 -0
  9. data/agents/palpatine-planner.md +40 -0
  10. data/agents/rey-frontend.md +106 -0
  11. data/agents/yoda-writer.md +54 -0
  12. data/bin/create-plan-folder +125 -0
  13. data/bin/plan-number +164 -0
  14. data/exe/agentilda +111 -0
  15. data/exe/tilda +1 -0
  16. data/lib/agentilda/adoption.rb +192 -0
  17. data/lib/agentilda/agent.rb +136 -0
  18. data/lib/agentilda/brief.rb +234 -0
  19. data/lib/agentilda/cli/agents/subcommands/describe.rb +62 -0
  20. data/lib/agentilda/cli/agents/subcommands/list.rb +20 -0
  21. data/lib/agentilda/cli/base.rb +88 -0
  22. data/lib/agentilda/cli/create/create.rb +309 -0
  23. data/lib/agentilda/cli/docs/docs.rb +30 -0
  24. data/lib/agentilda/cli/index/index.rb +38 -0
  25. data/lib/agentilda/cli/linear/linear.rb +35 -0
  26. data/lib/agentilda/cli/linear/subcommands/import.rb +160 -0
  27. data/lib/agentilda/cli/linear/subcommands/projects.rb +55 -0
  28. data/lib/agentilda/cli/list_plans/list_plans.rb +21 -0
  29. data/lib/agentilda/cli/resync/subcommands/dirs.rb +49 -0
  30. data/lib/agentilda/cli/resync/subcommands/prs.rb +106 -0
  31. data/lib/agentilda/cli/run/run.rb +289 -0
  32. data/lib/agentilda/cli/states/states.rb +15 -0
  33. data/lib/agentilda/cli/unblock/unblock.rb +227 -0
  34. data/lib/agentilda/cli/version/version.rb +13 -0
  35. data/lib/agentilda/cli.rb +74 -0
  36. data/lib/agentilda/config.rb +44 -0
  37. data/lib/agentilda/control.rb +115 -0
  38. data/lib/agentilda/creator.rb +120 -0
  39. data/lib/agentilda/dev_work.rb +54 -0
  40. data/lib/agentilda/diagram.rb +144 -0
  41. data/lib/agentilda/documentation.rb +429 -0
  42. data/lib/agentilda/executor.rb +539 -0
  43. data/lib/agentilda/feature.rb +253 -0
  44. data/lib/agentilda/frontmatter.rb +36 -0
  45. data/lib/agentilda/github.rb +160 -0
  46. data/lib/agentilda/index.rb +206 -0
  47. data/lib/agentilda/keyboard.rb +88 -0
  48. data/lib/agentilda/linear/api.rb +220 -0
  49. data/lib/agentilda/linear/attribution.rb +185 -0
  50. data/lib/agentilda/linear/fuzzy.rb +68 -0
  51. data/lib/agentilda/linear/import.rb +298 -0
  52. data/lib/agentilda/linear/issue.rb +184 -0
  53. data/lib/agentilda/linear/mapping.rb +115 -0
  54. data/lib/agentilda/linear/push.rb +190 -0
  55. data/lib/agentilda/linear/survey.rb +173 -0
  56. data/lib/agentilda/linear/unit.rb +274 -0
  57. data/lib/agentilda/linear.rb +42 -0
  58. data/lib/agentilda/markdown.rb +56 -0
  59. data/lib/agentilda/ordinal.rb +90 -0
  60. data/lib/agentilda/progress_log.rb +122 -0
  61. data/lib/agentilda/publisher.rb +172 -0
  62. data/lib/agentilda/pull_request.rb +213 -0
  63. data/lib/agentilda/reporter.rb +175 -0
  64. data/lib/agentilda/resync.rb +358 -0
  65. data/lib/agentilda/roster.rb +110 -0
  66. data/lib/agentilda/runner.rb +456 -0
  67. data/lib/agentilda/state_machine.rb +355 -0
  68. data/lib/agentilda/status.rb +280 -0
  69. data/lib/agentilda/tally.rb +169 -0
  70. data/lib/agentilda/transcript.rb +435 -0
  71. data/lib/agentilda/tree.rb +77 -0
  72. data/lib/agentilda/ui.rb +681 -0
  73. data/lib/agentilda/unblocker.rb +207 -0
  74. data/lib/agentilda/version.rb +10 -0
  75. data/lib/agentilda/viewer.rb +60 -0
  76. data/lib/agentilda/worktree.rb +211 -0
  77. data/lib/agentilda.rb +155 -0
  78. data/lib/dry/cli/banner.rb +293 -0
  79. metadata +349 -0
@@ -0,0 +1,293 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/cli/program_name"
4
+ require "pastel"
5
+
6
+ module Dry
7
+ class CLI
8
+ # Utility module for wrapping text to a given width
9
+ module WordWrap
10
+ def wrap_description(text, width: 55, prefix: " ")
11
+ text.split("\n", -1).map { |para|
12
+ para.scan(/\S.{0,#{width - 1}}(?=\s|\z)|\S{#{width},}/).join("\n#{prefix}")
13
+ }.join("\n")
14
+ end
15
+
16
+ alias_method :wrap, :wrap_description
17
+ end
18
+
19
+ # The command list `agentilda -h` prints.
20
+ #
21
+ # Upstream renders a description on one line however long it is, so a
22
+ # long `desc` runs off the terminal and a two-line one drops its second
23
+ # line to column zero. Descriptions are wrapped here instead, hung under
24
+ # the `#` the way {Banner} already hangs an option's.
25
+ module Usage
26
+ extend WordWrap
27
+
28
+ # Narrowest description column worth wrapping to. Below this the
29
+ # hanging indent leaves no room for words.
30
+ MIN_DESCRIPTION_WIDTH = 24
31
+
32
+ # @param result [Dry::CLI::CommandRegistry::LookupResult]
33
+ # @return [String]
34
+ def self.call(result)
35
+ max_length, commands = commands_and_arguments(result)
36
+ column = max_length + max_length / 2
37
+
38
+ by_depth(commands).filter_map { |banner, node|
39
+ next if node.hidden
40
+
41
+ usage = description(node.command, column) if node.leaf?
42
+ "#{justify(banner, max_length, usage)}#{usage}"
43
+ }.unshift("Commands:").join("\n")
44
+ end
45
+
46
+ # A command that owns subcommands is the heading for a whole area of the
47
+ # tool, so it belongs above the flat commands rather than filed
48
+ # alphabetically among them. Alphabetical order is kept inside each group.
49
+ #
50
+ # `children?` is the direct question, `children.any?`. `leaf?` asks
51
+ # something else — whether the node carries a runnable command — and the
52
+ # two are independent: a command that also takes subcommands is both, and
53
+ # sorting on `leaf?` would file it with the flat commands.
54
+ #
55
+ # @param commands [Hash{String => Dry::CLI::CommandRegistry::Node}]
56
+ # @return [Array<Array(String, Dry::CLI::CommandRegistry::Node)>]
57
+ def self.by_depth(commands)
58
+ commands.sort_by { |banner, node| [node.children? ? 0 : 1, banner] }
59
+ end
60
+
61
+ # @param command [Dry::CLI::Command]
62
+ # @param column [Integer] the width the banner is padded to; the `#`
63
+ # sits one past it, so continuation lines do too
64
+ # @return [String, nil]
65
+ def self.description(command, column = 0)
66
+ return unless CLI.command?(command)
67
+ return if command.description.nil?
68
+
69
+ prefix = "#{" " * (column + 1)}# "
70
+ width = [86 - prefix.length, MIN_DESCRIPTION_WIDTH].max
71
+ text = command.description.gsub(/\s+/, " ").strip
72
+
73
+ " # #{wrap_description(text, width: width, prefix: prefix)}"
74
+ end
75
+ end
76
+
77
+ # Command banner
78
+ #
79
+ # @since 0.1.0
80
+ # @api private
81
+ module Banner
82
+ extend WordWrap
83
+
84
+ @color_enabled = true
85
+
86
+ module ColorMethods
87
+ @pastel = nil
88
+
89
+ COLOR_METHODS = %i[
90
+ yellow
91
+ green
92
+ red
93
+ blue
94
+ magenta
95
+ cyan
96
+ white
97
+ black
98
+ gray
99
+ bright_white
100
+ bright_black
101
+ bright_red
102
+ bright_green
103
+ bright_blue
104
+ bright_magenta
105
+ bright_cyan
106
+ bright_gray
107
+ ].freeze
108
+
109
+ # Pastel answers a colour two ways: `yellow("text")` decorates in one
110
+ # call, `yellow.bold("text")` returns a chain to decorate further. The
111
+ # colourless stand-in has to answer both shapes, so given text it hands
112
+ # the text straight back and given nothing it hands back itself.
113
+ DECORATIONS = %i[bold dim italic underline inverse strikethrough blink].freeze
114
+
115
+ class NoColorPastel
116
+ (COLOR_METHODS + DECORATIONS).each do |name|
117
+ define_method(name) { |*args| args.empty? ? self : args.join }
118
+ end
119
+ end
120
+
121
+ def pastel
122
+ @pastel ||= if Banner.color_enabled?
123
+ Pastel.new
124
+ else
125
+ NoColorPastel.new
126
+ end
127
+ end
128
+
129
+ extend Forwardable
130
+
131
+ def_delegators :pastel, *COLOR_METHODS
132
+ end
133
+
134
+ extend ColorMethods
135
+
136
+ def self.color_enabled?
137
+ @color_enabled
138
+ end
139
+
140
+ def self.enable_color!
141
+ @pastel = nil
142
+ @color_enabled = true
143
+ end
144
+
145
+ def self.disable_color!
146
+ @pastel = nil
147
+ @color_enabled = false
148
+ end
149
+
150
+ def self.color_header(string)
151
+ color_enabled? ? bright_blue.bold(string.upcase) : string.upcase
152
+ end
153
+
154
+ def self.color_command(string)
155
+ color_enabled? ? green.bold(string) : string
156
+ end
157
+
158
+ def self.color_arguments(string)
159
+ color_enabled? ? yellow.italic(string) : string
160
+ end
161
+
162
+ # Prints command banner
163
+ #
164
+ # @param command [Dry::CLI::Command] the command
165
+ # @param out [IO] standard output
166
+ #
167
+ # @since 0.1.0
168
+ # @api private
169
+ def self.call(command, name)
170
+ [
171
+ command_name(name),
172
+ command_name_and_arguments(command, name),
173
+ command_description(command),
174
+ command_subcommands(command),
175
+ command_arguments(command),
176
+ command_options(command),
177
+ command_examples(command, name)
178
+ ].compact.join("\n")
179
+ end
180
+
181
+ # @since 0.1.0
182
+ # @api private
183
+ def self.command_name(name)
184
+ color_header("Command:\n") + " #{yellow(name)}"
185
+ end
186
+
187
+ # @since 0.1.0
188
+ # @api private
189
+ def self.command_name_and_arguments(command, name)
190
+ usage = "\n#{color_header("Usage")}:\n #{color_command(name)}#{color_arguments(arguments(command))}"
191
+
192
+ return usage + " | #{name} SUBCOMMAND" if command.subcommands.any?
193
+
194
+ usage
195
+ end
196
+
197
+ # @since 0.1.0
198
+ # @api private
199
+ def self.command_examples(command, name)
200
+ return if command.examples.empty?
201
+
202
+ "\n#{color_header("Examples")}:\n" + command.examples.map do |example|
203
+ args, desc = example.split("#")
204
+ comment_line = (desc.nil? || desc.empty?) ? "" : " #{bright_black("##{desc}")}\n"
205
+ comment_line + " #{color_command(name)} #{color_arguments(args)}"
206
+ end.join("\n\n")
207
+ end
208
+
209
+ # @since 0.1.0
210
+ # @api private
211
+ def self.command_description(command)
212
+ return if command.description.nil?
213
+
214
+ "\n#{color_header("Description")}:\n #{command.description}"
215
+ end
216
+
217
+ def self.command_subcommands(command)
218
+ return if command.subcommands.empty?
219
+
220
+ "\n#{color_header("Subcommands")}:\n#{build_subcommands_list(command.subcommands)}"
221
+ end
222
+
223
+ # @since 0.1.0
224
+ # @api private
225
+ def self.command_arguments(command)
226
+ return if command.arguments.empty?
227
+
228
+ "\n#{color_header("Arguments")}:\n#{extended_command_arguments(command)}"
229
+ end
230
+
231
+ # @since 0.1.0
232
+ # @api private
233
+ def self.command_options(command)
234
+ "\n#{color_header("Options")}:\n#{extended_command_options(command)}"
235
+ end
236
+
237
+ # @since 0.1.0
238
+ # @api private
239
+ def self.arguments(command)
240
+ required_arguments = command.required_arguments
241
+ optional_arguments = command.optional_arguments
242
+
243
+ required = required_arguments.map { |arg| arg.name.upcase }.join(" ") if required_arguments.any?
244
+ optional = optional_arguments.map { |arg| "[#{arg.name.upcase}]" }.join(" ") if optional_arguments.any?
245
+ result = [required, optional].compact
246
+
247
+ " #{result.join(" ")}" unless result.empty?
248
+ end
249
+
250
+ DESCRIPTION_START = 25
251
+
252
+ # @since 0.1.0
253
+ # @api private
254
+ def self.extended_command_arguments(command)
255
+ command.arguments.map do |argument|
256
+ " #{argument.name.to_s.upcase.ljust(DESCRIPTION_START)} # #{"REQUIRED " if argument.required?}#{wrap_description(argument.desc, prefix: " " * 31 + "# ")}"
257
+ end.join("\n")
258
+ end
259
+
260
+ # @since 0.1.0
261
+ # @api private
262
+ #
263
+ def self.extended_command_options(command)
264
+ result = command.options.map do |option|
265
+ name = Inflector.dasherize(option.name)
266
+ name = if option.boolean?
267
+ "[no-]#{name}"
268
+ elsif option.flag?
269
+ name
270
+ elsif option.array?
271
+ "#{name}=VALUE1,VALUE2,.."
272
+ else
273
+ "#{name}=VALUE"
274
+ end
275
+ name = "#{name}, #{option.alias_names.join(", ")}" if option.aliases.any?
276
+ name = " --#{name.ljust(DESCRIPTION_START)}"
277
+ name = "#{name} # #{wrap_description(option.desc, prefix: " " * 31 + "# ")}"
278
+ name = "#{name}, default: #{option.default.inspect}" unless option.default.nil?
279
+ name
280
+ end
281
+
282
+ result << " --#{"help, -h".ljust(DESCRIPTION_START)} # Print this help"
283
+ result.join("\n")
284
+ end
285
+
286
+ def self.build_subcommands_list(subcommands)
287
+ subcommands.map do |subcommand_name, subcommand|
288
+ " #{yellow(subcommand_name.ljust(12))} # #{red(wrap_description(subcommand.command.description))}`"
289
+ end.join("\n")
290
+ end
291
+ end
292
+ end
293
+ end
metadata ADDED
@@ -0,0 +1,349 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: agentilda
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Konstantin Gredeskoul
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: aasm
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: concurrent-ruby
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: dry-cli
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: dry-cli-autocomplete
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: dry-inflector
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: dry-monads
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: fuzzy-string-match
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: parallel
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ type: :runtime
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ - !ruby/object:Gem::Dependency
125
+ name: pastel
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ type: :runtime
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ - !ruby/object:Gem::Dependency
139
+ name: strings
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ type: :runtime
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ - !ruby/object:Gem::Dependency
153
+ name: tty-box
154
+ requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ type: :runtime
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ - !ruby/object:Gem::Dependency
167
+ name: tty-command
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ type: :runtime
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ - !ruby/object:Gem::Dependency
181
+ name: tty-progressbar
182
+ requirement: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ type: :runtime
188
+ prerelease: false
189
+ version_requirements: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ - !ruby/object:Gem::Dependency
195
+ name: tty-screen
196
+ requirement: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ type: :runtime
202
+ prerelease: false
203
+ version_requirements: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: '0'
208
+ - !ruby/object:Gem::Dependency
209
+ name: tty-spinner
210
+ requirement: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - ">="
213
+ - !ruby/object:Gem::Version
214
+ version: '0'
215
+ type: :runtime
216
+ prerelease: false
217
+ version_requirements: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - ">="
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
222
+ - !ruby/object:Gem::Dependency
223
+ name: unicode-display_width
224
+ requirement: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - ">="
227
+ - !ruby/object:Gem::Version
228
+ version: '0'
229
+ type: :runtime
230
+ prerelease: false
231
+ version_requirements: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - ">="
234
+ - !ruby/object:Gem::Version
235
+ version: '0'
236
+ description: |
237
+ Keeps a project's specifications, plans and pull requests joined up, and
238
+ drives specialist agents over them in parallel. A feature's state is its
239
+ folder name under .plans, so a transition renames a directory rather than
240
+ updating a row, and nothing can claim a phase whose document is missing.
241
+ email:
242
+ - kigster@gmail.com
243
+ executables:
244
+ - agentilda
245
+ - tilda
246
+ extensions: []
247
+ extra_rdoc_files: []
248
+ files:
249
+ - Gemfile
250
+ - Gemfile.lock
251
+ - agentilda.gemspec
252
+ - agents/hansolo-reviewer.md
253
+ - agents/lando-broker.md
254
+ - agents/leah-researcher.md
255
+ - agents/luke-backend.md
256
+ - agents/palpatine-planner.md
257
+ - agents/rey-frontend.md
258
+ - agents/yoda-writer.md
259
+ - bin/create-plan-folder
260
+ - bin/plan-number
261
+ - exe/agentilda
262
+ - exe/tilda
263
+ - lib/agentilda.rb
264
+ - lib/agentilda/adoption.rb
265
+ - lib/agentilda/agent.rb
266
+ - lib/agentilda/brief.rb
267
+ - lib/agentilda/cli.rb
268
+ - lib/agentilda/cli/agents/subcommands/describe.rb
269
+ - lib/agentilda/cli/agents/subcommands/list.rb
270
+ - lib/agentilda/cli/base.rb
271
+ - lib/agentilda/cli/create/create.rb
272
+ - lib/agentilda/cli/docs/docs.rb
273
+ - lib/agentilda/cli/index/index.rb
274
+ - lib/agentilda/cli/linear/linear.rb
275
+ - lib/agentilda/cli/linear/subcommands/import.rb
276
+ - lib/agentilda/cli/linear/subcommands/projects.rb
277
+ - lib/agentilda/cli/list_plans/list_plans.rb
278
+ - lib/agentilda/cli/resync/subcommands/dirs.rb
279
+ - lib/agentilda/cli/resync/subcommands/prs.rb
280
+ - lib/agentilda/cli/run/run.rb
281
+ - lib/agentilda/cli/states/states.rb
282
+ - lib/agentilda/cli/unblock/unblock.rb
283
+ - lib/agentilda/cli/version/version.rb
284
+ - lib/agentilda/config.rb
285
+ - lib/agentilda/control.rb
286
+ - lib/agentilda/creator.rb
287
+ - lib/agentilda/dev_work.rb
288
+ - lib/agentilda/diagram.rb
289
+ - lib/agentilda/documentation.rb
290
+ - lib/agentilda/executor.rb
291
+ - lib/agentilda/feature.rb
292
+ - lib/agentilda/frontmatter.rb
293
+ - lib/agentilda/github.rb
294
+ - lib/agentilda/index.rb
295
+ - lib/agentilda/keyboard.rb
296
+ - lib/agentilda/linear.rb
297
+ - lib/agentilda/linear/api.rb
298
+ - lib/agentilda/linear/attribution.rb
299
+ - lib/agentilda/linear/fuzzy.rb
300
+ - lib/agentilda/linear/import.rb
301
+ - lib/agentilda/linear/issue.rb
302
+ - lib/agentilda/linear/mapping.rb
303
+ - lib/agentilda/linear/push.rb
304
+ - lib/agentilda/linear/survey.rb
305
+ - lib/agentilda/linear/unit.rb
306
+ - lib/agentilda/markdown.rb
307
+ - lib/agentilda/ordinal.rb
308
+ - lib/agentilda/progress_log.rb
309
+ - lib/agentilda/publisher.rb
310
+ - lib/agentilda/pull_request.rb
311
+ - lib/agentilda/reporter.rb
312
+ - lib/agentilda/resync.rb
313
+ - lib/agentilda/roster.rb
314
+ - lib/agentilda/runner.rb
315
+ - lib/agentilda/state_machine.rb
316
+ - lib/agentilda/status.rb
317
+ - lib/agentilda/tally.rb
318
+ - lib/agentilda/transcript.rb
319
+ - lib/agentilda/tree.rb
320
+ - lib/agentilda/ui.rb
321
+ - lib/agentilda/unblocker.rb
322
+ - lib/agentilda/version.rb
323
+ - lib/agentilda/viewer.rb
324
+ - lib/agentilda/worktree.rb
325
+ - lib/dry/cli/banner.rb
326
+ homepage: https://github.com/kigster/agentilda
327
+ licenses: []
328
+ metadata:
329
+ homepage_uri: https://github.com/kigster/agentilda
330
+ source_code_uri: https://github.com/kigster/agentilda
331
+ rubygems_mfa_required: 'true'
332
+ rdoc_options: []
333
+ require_paths:
334
+ - lib
335
+ required_ruby_version: !ruby/object:Gem::Requirement
336
+ requirements:
337
+ - - ">="
338
+ - !ruby/object:Gem::Version
339
+ version: '4.0'
340
+ required_rubygems_version: !ruby/object:Gem::Requirement
341
+ requirements:
342
+ - - ">="
343
+ - !ruby/object:Gem::Version
344
+ version: '0'
345
+ requirements: []
346
+ rubygems_version: 4.0.19
347
+ specification_version: 4
348
+ summary: 'Agentic specification-driven development: spec, plan, build, review'
349
+ test_files: []