agentilda 2.0.1 → 2.0.4
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/lib/agentilda/agents/agent.rb +79 -0
- data/lib/agentilda/agents/registry.rb +121 -0
- data/lib/agentilda/agents/roster.rb +92 -0
- data/lib/agentilda/agents.rb +11 -113
- data/lib/agentilda/cli/agents/subcommands/describe.rb +3 -3
- data/lib/agentilda/cli/agents/subcommands/list.rb +1 -1
- data/lib/agentilda/cli/base.rb +3 -3
- data/lib/agentilda/cli/create/create.rb +17 -18
- data/lib/agentilda/cli/docs/docs.rb +1 -1
- data/lib/agentilda/cli/index/index.rb +1 -1
- data/lib/agentilda/cli/linear/subcommands/import.rb +1 -1
- data/lib/agentilda/cli/list_plans/list_plans.rb +1 -1
- data/lib/agentilda/cli/mail/mail.rb +4 -4
- data/lib/agentilda/cli/mail/subcommands/send.rb +1 -1
- data/lib/agentilda/cli/resync/subcommands/dirs.rb +2 -2
- data/lib/agentilda/cli/resync/subcommands/prs.rb +3 -3
- data/lib/agentilda/cli/run/run.rb +40 -40
- data/lib/agentilda/cli/states/states.rb +1 -1
- data/lib/agentilda/cli/unblock/unblock.rb +17 -17
- data/lib/agentilda/cli/worktree/worktree.rb +4 -4
- data/lib/agentilda/cli.rb +1 -1
- data/lib/agentilda/engine/board.rb +93 -0
- data/lib/agentilda/engine/dispatcher.rb +646 -0
- data/lib/agentilda/engine/progress_log.rb +125 -0
- data/lib/agentilda/engine/runner.rb +141 -0
- data/lib/agentilda/engine/state_file.rb +176 -0
- data/lib/agentilda/engine/tally.rb +177 -0
- data/lib/agentilda/engine.rb +19 -0
- data/lib/agentilda/execution/child.rb +94 -0
- data/lib/agentilda/execution/clock.rb +116 -0
- data/lib/agentilda/execution/control.rb +180 -0
- data/lib/agentilda/execution/executor.rb +699 -0
- data/lib/agentilda/execution/transcript.rb +468 -0
- data/lib/agentilda/execution.rb +18 -0
- data/lib/agentilda/lifecycle/adoption.rb +197 -0
- data/lib/agentilda/lifecycle/brief.rb +285 -0
- data/lib/agentilda/lifecycle/creator.rb +125 -0
- data/lib/agentilda/lifecycle/resync.rb +428 -0
- data/lib/agentilda/lifecycle/unblocker.rb +223 -0
- data/lib/agentilda/lifecycle.rb +28 -0
- data/lib/agentilda/linear/api.rb +1 -1
- data/lib/agentilda/linear/attribution.rb +7 -7
- data/lib/agentilda/linear/import.rb +18 -18
- data/lib/agentilda/linear/mapping.rb +6 -6
- data/lib/agentilda/linear/push.rb +5 -5
- data/lib/agentilda/linear/survey.rb +7 -7
- data/lib/agentilda/linear/unit.rb +5 -5
- data/lib/agentilda/plans/dev_work.rb +56 -0
- data/lib/agentilda/plans/feature.rb +131 -0
- data/lib/agentilda/plans/index.rb +208 -0
- data/lib/agentilda/plans/ledger.rb +235 -0
- data/lib/agentilda/plans/mailbox.rb +143 -0
- data/lib/agentilda/plans/ordinal.rb +92 -0
- data/lib/agentilda/plans/pull_request.rb +29 -0
- data/lib/agentilda/plans/pull_requests.rb +229 -0
- data/lib/agentilda/plans/state_machine.rb +383 -0
- data/lib/agentilda/plans/status.rb +365 -0
- data/lib/agentilda/plans/subject.rb +131 -0
- data/lib/agentilda/plans/tree.rb +79 -0
- data/lib/agentilda/plans.rb +39 -0
- data/lib/agentilda/presentation/console.rb +159 -0
- data/lib/agentilda/presentation/dashboard.rb +221 -0
- data/lib/agentilda/presentation/diagram.rb +149 -0
- data/lib/agentilda/presentation/documentation.rb +439 -0
- data/lib/agentilda/presentation/keyboard.rb +158 -0
- data/lib/agentilda/presentation/reporter.rb +181 -0
- data/lib/agentilda/presentation/screen/ratatui/bar.rb +59 -0
- data/lib/agentilda/presentation/screen/ratatui/key_translator.rb +31 -0
- data/lib/agentilda/presentation/screen/ratatui.rb +320 -0
- data/lib/agentilda/presentation/viewer.rb +62 -0
- data/lib/agentilda/presentation.rb +23 -0
- data/lib/agentilda/{ui.rb → support/ui.rb} +5 -5
- data/lib/agentilda/vcs/github.rb +170 -0
- data/lib/agentilda/vcs/publisher.rb +177 -0
- data/lib/agentilda/vcs/worktree.rb +209 -0
- data/lib/agentilda/vcs.rb +19 -0
- data/lib/agentilda/version.rb +1 -1
- data/lib/agentilda.rb +6 -5
- metadata +56 -49
- data/lib/agentilda/adoption.rb +0 -197
- data/lib/agentilda/agent.rb +0 -77
- data/lib/agentilda/board.rb +0 -91
- data/lib/agentilda/brief.rb +0 -283
- data/lib/agentilda/child.rb +0 -92
- data/lib/agentilda/clock.rb +0 -114
- data/lib/agentilda/console.rb +0 -157
- data/lib/agentilda/control.rb +0 -178
- data/lib/agentilda/creator.rb +0 -125
- data/lib/agentilda/dashboard.rb +0 -219
- data/lib/agentilda/dev_work.rb +0 -56
- data/lib/agentilda/diagram.rb +0 -149
- data/lib/agentilda/dispatcher.rb +0 -646
- data/lib/agentilda/documentation.rb +0 -437
- data/lib/agentilda/executor.rb +0 -697
- data/lib/agentilda/feature.rb +0 -132
- data/lib/agentilda/github.rb +0 -168
- data/lib/agentilda/index.rb +0 -206
- data/lib/agentilda/keyboard.rb +0 -156
- data/lib/agentilda/ledger.rb +0 -233
- data/lib/agentilda/mailbox.rb +0 -141
- data/lib/agentilda/ordinal.rb +0 -90
- data/lib/agentilda/progress_log.rb +0 -126
- data/lib/agentilda/publisher.rb +0 -175
- data/lib/agentilda/pull_request.rb +0 -27
- data/lib/agentilda/pull_requests.rb +0 -230
- data/lib/agentilda/reporter.rb +0 -181
- data/lib/agentilda/resync.rb +0 -426
- data/lib/agentilda/roster.rb +0 -93
- data/lib/agentilda/runner.rb +0 -139
- data/lib/agentilda/screen/ratatui/bar.rb +0 -57
- data/lib/agentilda/screen/ratatui/key_translator.rb +0 -29
- data/lib/agentilda/screen/ratatui.rb +0 -318
- data/lib/agentilda/state_file.rb +0 -174
- data/lib/agentilda/state_machine.rb +0 -383
- data/lib/agentilda/status.rb +0 -363
- data/lib/agentilda/subject.rb +0 -133
- data/lib/agentilda/tally.rb +0 -175
- data/lib/agentilda/transcript.rb +0 -466
- data/lib/agentilda/tree.rb +0 -81
- data/lib/agentilda/unblocker.rb +0 -221
- data/lib/agentilda/viewer.rb +0 -60
- data/lib/agentilda/worktree.rb +0 -207
- /data/lib/agentilda/{config.rb → support/config.rb} +0 -0
- /data/lib/agentilda/{frontmatter.rb → support/frontmatter.rb} +0 -0
- /data/lib/agentilda/{markdown.rb → support/markdown.rb} +0 -0
data/lib/agentilda/diagram.rb
DELETED
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "agentilda/status"
|
|
4
|
-
|
|
5
|
-
module Agentilda
|
|
6
|
-
# `agentilda states` — the state machine as a terminal picture.
|
|
7
|
-
#
|
|
8
|
-
# {Documentation} already renders this machine as a Markdown table and a
|
|
9
|
-
# mermaid block, for a browser. This is the same machine, walked the same
|
|
10
|
-
# way, shaped for a terminal instead: unicode arrows, no browser required.
|
|
11
|
-
#
|
|
12
|
-
# Every section below is read off {StateMachine} and {STATUSES} rather than
|
|
13
|
-
# drawn by hand, for the reason {Documentation} gives for doing the same
|
|
14
|
-
# thing: three hand-maintained pictures of this machine have already
|
|
15
|
-
# drifted apart once, and a fourth is not the fix.
|
|
16
|
-
class Diagram
|
|
17
|
-
include UI
|
|
18
|
-
|
|
19
|
-
# Drawn between two states on the same line.
|
|
20
|
-
ARROW = "──▶"
|
|
21
|
-
|
|
22
|
-
# @return [String] the whole diagram, newline-terminated
|
|
23
|
-
def render
|
|
24
|
-
[
|
|
25
|
-
heading,
|
|
26
|
-
spine_section,
|
|
27
|
-
rejoin_section,
|
|
28
|
-
other_section,
|
|
29
|
-
terminal_section,
|
|
30
|
-
family_section
|
|
31
|
-
].compact.join("\n\n") + "\n"
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
private
|
|
35
|
-
|
|
36
|
-
# @return [String]
|
|
37
|
-
def heading
|
|
38
|
-
paint("Spec → Plan → Build — the state machine", :bold) + "\n" +
|
|
39
|
-
paint("(derived from lib/agentilda/state_machine.rb — `agentilda docs` for the Markdown form)",
|
|
40
|
-
:bright_black)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# The path a bare `promote!` walks: {StateMachine::SPINE}, followed from
|
|
44
|
-
# `:new` until a state has no entry left to follow.
|
|
45
|
-
#
|
|
46
|
-
# @return [String]
|
|
47
|
-
def spine_section
|
|
48
|
-
section("MAIN SPINE",
|
|
49
|
-
"a bare `promote` walks this path",
|
|
50
|
-
[" " + spine_chain.map { |key| node(key) }.join(" #{ARROW} ")])
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
# {StateMachine::SPINE} entries whose source never appears on the walk
|
|
54
|
-
# above — states that sit off the spine but whose default `promote!`
|
|
55
|
-
# rejoins it, e.g. a rejected pull request resubmitted for review.
|
|
56
|
-
#
|
|
57
|
-
# @return [String, nil]
|
|
58
|
-
def rejoin_section
|
|
59
|
-
rows = StateMachine::SPINE
|
|
60
|
-
.except(*spine_chain)
|
|
61
|
-
.map { |from, to| " #{node(from)} #{ARROW} #{node(to)}" }
|
|
62
|
-
|
|
63
|
-
section("REJOINING THE SPINE", "off-spine states whose default promotion lands back on it", rows)
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
# Everything {StateMachine} allows that the two sections above do not
|
|
67
|
-
# already draw: blocking, deferring, discarding, review outcomes,
|
|
68
|
-
# rollback — read off {StateMachine.outbound} state by state, in
|
|
69
|
-
# {STATUSES} order, so nothing the machine permits is left undrawn.
|
|
70
|
-
#
|
|
71
|
-
# @return [String, nil]
|
|
72
|
-
def other_section
|
|
73
|
-
drawn = StateMachine::SPINE.to_a
|
|
74
|
-
|
|
75
|
-
groups = STATUSES.filter_map { |s|
|
|
76
|
-
targets = StateMachine.outbound(s.key).reject { |to| drawn.include?([s.key, to]) }
|
|
77
|
-
[s.key, targets] unless targets.empty?
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
section("OTHER TRANSITIONS",
|
|
81
|
-
"everything else the machine permits",
|
|
82
|
-
groups.flat_map { |key, targets|
|
|
83
|
-
fan_out(key, targets)
|
|
84
|
-
})
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
# @return [String, nil]
|
|
88
|
-
def terminal_section
|
|
89
|
-
rows = STATUSES.select(&:terminal?).map { |s| " #{node(s.key)}" }
|
|
90
|
-
section("TERMINAL", "nothing follows these", rows)
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
# {StateMachine::FAMILIES} share an invariant on purpose, and a folder's
|
|
94
|
-
# contents alone cannot tell their members apart — worth saying next to a
|
|
95
|
-
# diagram, or the members read like an oversight rather than a rule.
|
|
96
|
-
#
|
|
97
|
-
# @return [String, nil]
|
|
98
|
-
def family_section
|
|
99
|
-
rows = StateMachine::FAMILIES.map { |members| " #{members.map { |key| node(key) }.join(" / ")}" }
|
|
100
|
-
|
|
101
|
-
section("LOOK-ALIKE FAMILIES", "same contents on disk; only the folder name tells them apart", rows)
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
# `:new`, followed through {StateMachine::SPINE} until nothing follows.
|
|
105
|
-
#
|
|
106
|
-
# @return [Array<Symbol>]
|
|
107
|
-
def spine_chain
|
|
108
|
-
@spine_chain ||= [].tap { |chain|
|
|
109
|
-
key = :new
|
|
110
|
-
while key
|
|
111
|
-
chain << key
|
|
112
|
-
key = StateMachine::SPINE[key]
|
|
113
|
-
end
|
|
114
|
-
}
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
# One state and its outbound arrows, drawn as a small tree so several
|
|
118
|
-
# targets from one source read as a fan-out rather than as unrelated
|
|
119
|
-
# lines that happen to repeat the source.
|
|
120
|
-
#
|
|
121
|
-
# @param key [Symbol]
|
|
122
|
-
# @param targets [Array<Symbol>]
|
|
123
|
-
# @return [Array<String>]
|
|
124
|
-
def fan_out(key, targets)
|
|
125
|
-
lines = targets.each_with_index.map { |to, i|
|
|
126
|
-
connector = i == targets.size - 1 ? "└─▶" : "├─▶"
|
|
127
|
-
" #{connector} #{node(to)}"
|
|
128
|
-
}
|
|
129
|
-
[" #{node(key)}", *lines]
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
# @param key [Symbol]
|
|
133
|
-
# @return [String]
|
|
134
|
-
def node(key)
|
|
135
|
-
status = STATUS_BY_KEY.fetch(key)
|
|
136
|
-
paint("#{status.emoji} #{status.label}", :bold)
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
# @param title [String]
|
|
140
|
-
# @param subtitle [String]
|
|
141
|
-
# @param rows [Array<String>]
|
|
142
|
-
# @return [String, nil] nil when there is nothing to show, so {#render} can drop it
|
|
143
|
-
def section(title, subtitle, rows)
|
|
144
|
-
return nil if rows.empty?
|
|
145
|
-
|
|
146
|
-
"#{paint(title, :bold)} #{paint("(#{subtitle})", :bright_black)}\n\n#{rows.join("\n")}"
|
|
147
|
-
end
|
|
148
|
-
end
|
|
149
|
-
end
|