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.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/lib/agentilda/agents/agent.rb +79 -0
  3. data/lib/agentilda/agents/registry.rb +121 -0
  4. data/lib/agentilda/agents/roster.rb +92 -0
  5. data/lib/agentilda/agents.rb +11 -113
  6. data/lib/agentilda/cli/agents/subcommands/describe.rb +3 -3
  7. data/lib/agentilda/cli/agents/subcommands/list.rb +1 -1
  8. data/lib/agentilda/cli/base.rb +3 -3
  9. data/lib/agentilda/cli/create/create.rb +17 -18
  10. data/lib/agentilda/cli/docs/docs.rb +1 -1
  11. data/lib/agentilda/cli/index/index.rb +1 -1
  12. data/lib/agentilda/cli/linear/subcommands/import.rb +1 -1
  13. data/lib/agentilda/cli/list_plans/list_plans.rb +1 -1
  14. data/lib/agentilda/cli/mail/mail.rb +4 -4
  15. data/lib/agentilda/cli/mail/subcommands/send.rb +1 -1
  16. data/lib/agentilda/cli/resync/subcommands/dirs.rb +2 -2
  17. data/lib/agentilda/cli/resync/subcommands/prs.rb +3 -3
  18. data/lib/agentilda/cli/run/run.rb +40 -40
  19. data/lib/agentilda/cli/states/states.rb +1 -1
  20. data/lib/agentilda/cli/unblock/unblock.rb +17 -17
  21. data/lib/agentilda/cli/worktree/worktree.rb +4 -4
  22. data/lib/agentilda/cli.rb +1 -1
  23. data/lib/agentilda/engine/board.rb +93 -0
  24. data/lib/agentilda/engine/dispatcher.rb +646 -0
  25. data/lib/agentilda/engine/progress_log.rb +125 -0
  26. data/lib/agentilda/engine/runner.rb +141 -0
  27. data/lib/agentilda/engine/state_file.rb +176 -0
  28. data/lib/agentilda/engine/tally.rb +177 -0
  29. data/lib/agentilda/engine.rb +19 -0
  30. data/lib/agentilda/execution/child.rb +94 -0
  31. data/lib/agentilda/execution/clock.rb +116 -0
  32. data/lib/agentilda/execution/control.rb +180 -0
  33. data/lib/agentilda/execution/executor.rb +699 -0
  34. data/lib/agentilda/execution/transcript.rb +468 -0
  35. data/lib/agentilda/execution.rb +18 -0
  36. data/lib/agentilda/lifecycle/adoption.rb +197 -0
  37. data/lib/agentilda/lifecycle/brief.rb +285 -0
  38. data/lib/agentilda/lifecycle/creator.rb +125 -0
  39. data/lib/agentilda/lifecycle/resync.rb +428 -0
  40. data/lib/agentilda/lifecycle/unblocker.rb +223 -0
  41. data/lib/agentilda/lifecycle.rb +28 -0
  42. data/lib/agentilda/linear/api.rb +1 -1
  43. data/lib/agentilda/linear/attribution.rb +7 -7
  44. data/lib/agentilda/linear/import.rb +18 -18
  45. data/lib/agentilda/linear/mapping.rb +6 -6
  46. data/lib/agentilda/linear/push.rb +5 -5
  47. data/lib/agentilda/linear/survey.rb +7 -7
  48. data/lib/agentilda/linear/unit.rb +5 -5
  49. data/lib/agentilda/plans/dev_work.rb +56 -0
  50. data/lib/agentilda/plans/feature.rb +131 -0
  51. data/lib/agentilda/plans/index.rb +208 -0
  52. data/lib/agentilda/plans/ledger.rb +235 -0
  53. data/lib/agentilda/plans/mailbox.rb +143 -0
  54. data/lib/agentilda/plans/ordinal.rb +92 -0
  55. data/lib/agentilda/plans/pull_request.rb +29 -0
  56. data/lib/agentilda/plans/pull_requests.rb +229 -0
  57. data/lib/agentilda/plans/state_machine.rb +383 -0
  58. data/lib/agentilda/plans/status.rb +365 -0
  59. data/lib/agentilda/plans/subject.rb +131 -0
  60. data/lib/agentilda/plans/tree.rb +79 -0
  61. data/lib/agentilda/plans.rb +39 -0
  62. data/lib/agentilda/presentation/console.rb +159 -0
  63. data/lib/agentilda/presentation/dashboard.rb +221 -0
  64. data/lib/agentilda/presentation/diagram.rb +149 -0
  65. data/lib/agentilda/presentation/documentation.rb +439 -0
  66. data/lib/agentilda/presentation/keyboard.rb +158 -0
  67. data/lib/agentilda/presentation/reporter.rb +181 -0
  68. data/lib/agentilda/presentation/screen/ratatui/bar.rb +59 -0
  69. data/lib/agentilda/presentation/screen/ratatui/key_translator.rb +31 -0
  70. data/lib/agentilda/presentation/screen/ratatui.rb +320 -0
  71. data/lib/agentilda/presentation/viewer.rb +62 -0
  72. data/lib/agentilda/presentation.rb +23 -0
  73. data/lib/agentilda/{ui.rb → support/ui.rb} +5 -5
  74. data/lib/agentilda/vcs/github.rb +170 -0
  75. data/lib/agentilda/vcs/publisher.rb +177 -0
  76. data/lib/agentilda/vcs/worktree.rb +209 -0
  77. data/lib/agentilda/vcs.rb +19 -0
  78. data/lib/agentilda/version.rb +1 -1
  79. data/lib/agentilda.rb +6 -5
  80. metadata +56 -49
  81. data/lib/agentilda/adoption.rb +0 -197
  82. data/lib/agentilda/agent.rb +0 -77
  83. data/lib/agentilda/board.rb +0 -91
  84. data/lib/agentilda/brief.rb +0 -283
  85. data/lib/agentilda/child.rb +0 -92
  86. data/lib/agentilda/clock.rb +0 -114
  87. data/lib/agentilda/console.rb +0 -157
  88. data/lib/agentilda/control.rb +0 -178
  89. data/lib/agentilda/creator.rb +0 -125
  90. data/lib/agentilda/dashboard.rb +0 -219
  91. data/lib/agentilda/dev_work.rb +0 -56
  92. data/lib/agentilda/diagram.rb +0 -149
  93. data/lib/agentilda/dispatcher.rb +0 -646
  94. data/lib/agentilda/documentation.rb +0 -437
  95. data/lib/agentilda/executor.rb +0 -697
  96. data/lib/agentilda/feature.rb +0 -132
  97. data/lib/agentilda/github.rb +0 -168
  98. data/lib/agentilda/index.rb +0 -206
  99. data/lib/agentilda/keyboard.rb +0 -156
  100. data/lib/agentilda/ledger.rb +0 -233
  101. data/lib/agentilda/mailbox.rb +0 -141
  102. data/lib/agentilda/ordinal.rb +0 -90
  103. data/lib/agentilda/progress_log.rb +0 -126
  104. data/lib/agentilda/publisher.rb +0 -175
  105. data/lib/agentilda/pull_request.rb +0 -27
  106. data/lib/agentilda/pull_requests.rb +0 -230
  107. data/lib/agentilda/reporter.rb +0 -181
  108. data/lib/agentilda/resync.rb +0 -426
  109. data/lib/agentilda/roster.rb +0 -93
  110. data/lib/agentilda/runner.rb +0 -139
  111. data/lib/agentilda/screen/ratatui/bar.rb +0 -57
  112. data/lib/agentilda/screen/ratatui/key_translator.rb +0 -29
  113. data/lib/agentilda/screen/ratatui.rb +0 -318
  114. data/lib/agentilda/state_file.rb +0 -174
  115. data/lib/agentilda/state_machine.rb +0 -383
  116. data/lib/agentilda/status.rb +0 -363
  117. data/lib/agentilda/subject.rb +0 -133
  118. data/lib/agentilda/tally.rb +0 -175
  119. data/lib/agentilda/transcript.rb +0 -466
  120. data/lib/agentilda/tree.rb +0 -81
  121. data/lib/agentilda/unblocker.rb +0 -221
  122. data/lib/agentilda/viewer.rb +0 -60
  123. data/lib/agentilda/worktree.rb +0 -207
  124. /data/lib/agentilda/{config.rb → support/config.rb} +0 -0
  125. /data/lib/agentilda/{frontmatter.rb → support/frontmatter.rb} +0 -0
  126. /data/lib/agentilda/{markdown.rb → support/markdown.rb} +0 -0
@@ -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